Avoid Suno WAV fallback failures
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name ChatGPT to Suno Prompt Copier
|
// @name ChatGPT to Suno Prompt Copier
|
||||||
// @namespace local.suno-helper
|
// @namespace local.suno-helper
|
||||||
// @version 0.7.0
|
// @version 0.7.1
|
||||||
// @description Copy structured ChatGPT song prompt versions into Suno fields.
|
// @description Copy structured ChatGPT song prompt versions into Suno fields.
|
||||||
// @author local
|
// @author local
|
||||||
// @match https://chatgpt.com/*
|
// @match https://chatgpt.com/*
|
||||||
@@ -604,7 +604,7 @@
|
|||||||
const audioPath = firstValue(object, ["audio_url", "audioUrl", "stream_audio_url", "streamAudioUrl", "play_url", "playUrl", "play_path", "playPath", "mp3_url", "mp3Url", "video_url", "videoUrl"]);
|
const audioPath = firstValue(object, ["audio_url", "audioUrl", "stream_audio_url", "streamAudioUrl", "play_url", "playUrl", "play_path", "playPath", "mp3_url", "mp3Url", "video_url", "videoUrl"]);
|
||||||
const audioUrl = normalizeSunoMediaUrl(audioPath);
|
const audioUrl = normalizeSunoMediaUrl(audioPath);
|
||||||
const wavPath = firstValue(object, ["wav_url", "wavUrl", "download_url", "downloadUrl"]);
|
const wavPath = firstValue(object, ["wav_url", "wavUrl", "download_url", "downloadUrl"]);
|
||||||
const wavUrl = normalizeSunoMediaUrl(wavPath) || (id ? `https://cdn1.suno.ai/${id}.wav` : "");
|
const wavUrl = normalizeSunoMediaUrl(wavPath);
|
||||||
const lyrics = firstValue(object, ["prompt", "lyrics", "lyric", "text"]);
|
const lyrics = firstValue(object, ["prompt", "lyrics", "lyric", "text"]);
|
||||||
const style = firstValue(object, ["gpt_description_prompt", "style", "tags", "description"]);
|
const style = firstValue(object, ["gpt_description_prompt", "style", "tags", "description"]);
|
||||||
const model = firstValue(object, ["model_name", "model", "major_model_version"]);
|
const model = firstValue(object, ["model_name", "model", "major_model_version"]);
|
||||||
@@ -727,7 +727,7 @@
|
|||||||
id,
|
id,
|
||||||
title: id,
|
title: id,
|
||||||
audioUrl: "",
|
audioUrl: "",
|
||||||
wavUrl: `https://cdn1.suno.ai/${id}.wav`,
|
wavUrl: "",
|
||||||
imageUrl: "",
|
imageUrl: "",
|
||||||
pageUrl: location.href,
|
pageUrl: location.href,
|
||||||
metadata: {},
|
metadata: {},
|
||||||
@@ -783,7 +783,7 @@
|
|||||||
const id = metadata.id || metadata.clip_id || metadata.clipId || ids[0] || "";
|
const id = metadata.id || metadata.clip_id || metadata.clipId || ids[0] || "";
|
||||||
const imageUrl = metadata.image_url || metadata.imageUrl || metadata.image_large_url || imageUrls[0] || "";
|
const imageUrl = metadata.image_url || metadata.imageUrl || metadata.image_large_url || imageUrls[0] || "";
|
||||||
const audioUrl = metadata.audio_url || metadata.audioUrl || audioUrls.find((url) => /\.wav(?:\?|$)/i.test(url)) || audioUrls[0] || "";
|
const audioUrl = metadata.audio_url || metadata.audioUrl || audioUrls.find((url) => /\.wav(?:\?|$)/i.test(url)) || audioUrls[0] || "";
|
||||||
const wavUrl = metadata.wav_url || metadata.wavUrl || audioUrls.find((url) => /\.wav(?:\?|$)/i.test(url)) || (id ? `https://cdn1.suno.ai/${id}.wav` : "");
|
const wavUrl = metadata.wav_url || metadata.wavUrl || audioUrls.find((url) => /\.wav(?:\?|$)/i.test(url)) || "";
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id,
|
id,
|
||||||
@@ -861,7 +861,7 @@
|
|||||||
await new Promise((resolve) => setTimeout(resolve, 1300));
|
await new Promise((resolve) => setTimeout(resolve, 1300));
|
||||||
}
|
}
|
||||||
|
|
||||||
return track.wavUrl || `https://cdn1.suno.ai/${track.id}.wav`;
|
return track.wavUrl || "";
|
||||||
}
|
}
|
||||||
|
|
||||||
function downloadTextFile(text, name) {
|
function downloadTextFile(text, name) {
|
||||||
@@ -935,6 +935,10 @@
|
|||||||
const track = { ...tracks[index] };
|
const track = { ...tracks[index] };
|
||||||
setStatus(statusTarget, `${index + 1}/${tracks.length} WAV 준비 중: ${track.title || track.id}`);
|
setStatus(statusTarget, `${index + 1}/${tracks.length} WAV 준비 중: ${track.title || track.id}`);
|
||||||
track.wavUrl = await requestSunoWavUrl(track);
|
track.wavUrl = await requestSunoWavUrl(track);
|
||||||
|
if (!track.wavUrl) {
|
||||||
|
setStatus(statusTarget, `${track.title || track.id} WAV URL을 아직 못 받아서 건너뜀`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
preparedTracks.push(track);
|
preparedTracks.push(track);
|
||||||
}
|
}
|
||||||
const manifest = {
|
const manifest = {
|
||||||
@@ -980,6 +984,10 @@
|
|||||||
const track = { ...missingTracks[index] };
|
const track = { ...missingTracks[index] };
|
||||||
setStatus(statusTarget, `${index + 1}/${missingTracks.length} 없는 곡 WAV 준비 중: ${track.title || track.id}`);
|
setStatus(statusTarget, `${index + 1}/${missingTracks.length} 없는 곡 WAV 준비 중: ${track.title || track.id}`);
|
||||||
track.wavUrl = await requestSunoWavUrl(track);
|
track.wavUrl = await requestSunoWavUrl(track);
|
||||||
|
if (!track.wavUrl) {
|
||||||
|
setStatus(statusTarget, `${track.title || track.id} WAV 변환 URL이 아직 안 나와서 큐에 넣지 않음`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const enqueueManifest = {
|
const enqueueManifest = {
|
||||||
pageUrl: location.href,
|
pageUrl: location.href,
|
||||||
capturedAt: new Date().toISOString(),
|
capturedAt: new Date().toISOString(),
|
||||||
|
|||||||
@@ -360,7 +360,6 @@ foreach ($track in $tracks) {
|
|||||||
|
|
||||||
$albumTitle = Get-AlbumTitle $title $id
|
$albumTitle = Get-AlbumTitle $title $id
|
||||||
$trackFolder = Get-TrackFolder $libraryRoot $title $id
|
$trackFolder = Get-TrackFolder $libraryRoot $title $id
|
||||||
New-Item -ItemType Directory -Force -Path $trackFolder | Out-Null
|
|
||||||
$safeTitle = ConvertTo-SafeName $title $id
|
$safeTitle = ConvertTo-SafeName $title $id
|
||||||
$shortId = Get-ShortId $id
|
$shortId = Get-ShortId $id
|
||||||
$trackNo = Get-NextTrackNumber $trackFolder
|
$trackNo = Get-NextTrackNumber $trackFolder
|
||||||
@@ -374,7 +373,6 @@ foreach ($track in $tracks) {
|
|||||||
$wavUrl = Resolve-SunoMediaUrl $(if ($track.wavUrl) { "$($track.wavUrl)" } else { Get-DeepValue $track @("wav_url", "wavUrl", "download_url", "downloadUrl") })
|
$wavUrl = Resolve-SunoMediaUrl $(if ($track.wavUrl) { "$($track.wavUrl)" } else { Get-DeepValue $track @("wav_url", "wavUrl", "download_url", "downloadUrl") })
|
||||||
$wavCandidates = @()
|
$wavCandidates = @()
|
||||||
if ($wavUrl) { $wavCandidates += $wavUrl }
|
if ($wavUrl) { $wavCandidates += $wavUrl }
|
||||||
if ($id) { $wavCandidates += "https://cdn1.suno.ai/$id.wav" }
|
|
||||||
$wavCandidates = $wavCandidates | Where-Object { $_ } | Select-Object -Unique
|
$wavCandidates = $wavCandidates | Where-Object { $_ } | Select-Object -Unique
|
||||||
$imageUrl = if ($track.imageUrl) { "$($track.imageUrl)" } else { Get-DeepValue $track @("image_url", "imageUrl", "image_large_url", "cover_url") }
|
$imageUrl = if ($track.imageUrl) { "$($track.imageUrl)" } else { Get-DeepValue $track @("image_url", "imageUrl", "image_large_url", "cover_url") }
|
||||||
|
|
||||||
@@ -389,6 +387,11 @@ foreach ($track in $tracks) {
|
|||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "[$index/$($tracks.Count)] $title"
|
Write-Host "[$index/$($tracks.Count)] $title"
|
||||||
|
|
||||||
|
if (-not $wavCandidates.Count) {
|
||||||
|
Write-Warning "WAV URL이 없어서 건너뜀: $title"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
$audioOk = $false
|
$audioOk = $false
|
||||||
foreach ($candidate in $wavCandidates) {
|
foreach ($candidate in $wavCandidates) {
|
||||||
Write-Host "WAV 후보 시도: $candidate"
|
Write-Host "WAV 후보 시도: $candidate"
|
||||||
@@ -400,6 +403,8 @@ foreach ($track in $tracks) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Force -Path $trackFolder | Out-Null
|
||||||
|
|
||||||
$coverOk = $false
|
$coverOk = $false
|
||||||
if ($imageUrl) {
|
if ($imageUrl) {
|
||||||
$coverDownloaded = Invoke-Download $imageUrl $rawCoverFile
|
$coverDownloaded = Invoke-Download $imageUrl $rawCoverFile
|
||||||
|
|||||||
Reference in New Issue
Block a user