Add local Suno FLAC processing workflow

This commit is contained in:
DESKTOP-KSVGT20\shkim
2026-05-01 17:49:41 +09:00
parent 513db59a53
commit d19d93db3a
4 changed files with 332 additions and 4 deletions
+35 -3
View File
@@ -1,7 +1,7 @@
// ==UserScript==
// @name ChatGPT to Suno Prompt Copier
// @namespace local.suno-helper
// @version 0.3.1
// @version 0.4.0
// @description Copy structured ChatGPT song prompt versions into Suno fields.
// @author local
// @match https://chatgpt.com/*
@@ -591,9 +591,17 @@
const imageUrl = firstValue(object, ["image_url", "imageUrl", "image_large_url", "imageLargeUrl", "cover_url", "coverUrl"]);
const audioUrl = firstValue(object, ["audio_url", "audioUrl", "play_url", "playUrl", "mp3_url", "mp3Url"]);
const wavUrl = firstValue(object, ["wav_url", "wavUrl"]) || (id ? `https://cdn1.suno.ai/${id}.wav` : "");
const lyrics = firstValue(object, ["prompt", "lyrics", "lyric", "text"]);
const style = firstValue(object, ["gpt_description_prompt", "style", "tags", "description"]);
const model = firstValue(object, ["model_name", "model", "major_model_version"]);
const createdAt = firstValue(object, ["created_at", "createdAt"]);
return {
id,
title,
lyrics,
style,
model,
createdAt,
audioUrl,
wavUrl,
imageUrl,
@@ -605,7 +613,7 @@
function mergeTrack(target, source) {
if (!target) return source;
for (const key of ["title", "audioUrl", "wavUrl", "imageUrl", "pageUrl"]) {
for (const key of ["title", "lyrics", "style", "model", "createdAt", "audioUrl", "wavUrl", "imageUrl", "pageUrl"]) {
if (!target[key] && source[key]) target[key] = source[key];
}
target.metadata = target.metadata && Object.keys(target.metadata).length ? target.metadata : source.metadata;
@@ -780,6 +788,21 @@
setStatus(statusTarget, `${tracks.length}곡 다운로드 요청 완료. 실패한 파일은 브라우저 다운로드 목록/metadata에서 확인해줘.`);
}
function exportSunoManifest(tracks, statusTarget) {
if (!tracks.length) {
setStatus(statusTarget, "내보낼 곡을 못 찾았어. 라이브러리 곡 감지를 먼저 해줘.");
return;
}
const manifest = {
pageUrl: location.href,
capturedAt: new Date().toISOString(),
count: tracks.length,
tracks,
};
downloadTextFile(JSON.stringify(manifest, null, 2), `suno-library-${new Date().toISOString().slice(0, 10)}.manifest.json`);
setStatus(statusTarget, `${tracks.length}곡 manifest 저장. 이제 run_process_suno_library.ps1 실행하면 정리/FLAC 변환돼.`);
}
async function bootSuno() {
const body = createPanel("Suno Prompt Paste");
const slots = await readSlots();
@@ -804,7 +827,10 @@
<button class="cgs-btn cgs-wide" type="button" data-cgs-scan-library>라이브러리 곡 감지</button>
</div>
<div class="cgs-row">
<button class="cgs-btn cgs-primary cgs-wide" type="button" data-cgs-download-library>감지된 라이브러리 일괄 다운로드</button>
<button class="cgs-btn cgs-primary cgs-wide" type="button" data-cgs-export-library>처리용 manifest 저장</button>
</div>
<div class="cgs-row">
<button class="cgs-btn cgs-wide" type="button" data-cgs-download-library>브라우저 일괄 다운로드</button>
</div>
<div class="cgs-status"></div>
`;
@@ -880,6 +906,12 @@
updateSummary();
await downloadSunoBatch(libraryTracks, body);
});
body.querySelector("[data-cgs-export-library]").addEventListener("click", () => {
if (!libraryTracks.length) libraryTracks = scanSunoLibraryTracks();
updateSummary();
exportSunoManifest(libraryTracks, body);
});
}
function startApp() {