Add local Suno FLAC processing workflow
This commit is contained in:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user