Add clip-id based Suno library sync

This commit is contained in:
DESKTOP-KSVGT20\shkim
2026-05-01 23:10:57 +09:00
parent cbcb37ddb5
commit 1414c38bd1
7 changed files with 254 additions and 30 deletions
+32 -5
View File
@@ -1,7 +1,7 @@
// ==UserScript==
// @name ChatGPT to Suno Prompt Copier
// @namespace local.suno-helper
// @version 0.5.2
// @version 0.6.0
// @description Copy structured ChatGPT song prompt versions into Suno fields.
// @author local
// @match https://chatgpt.com/*
@@ -952,10 +952,33 @@
setStatus(statusTarget, "보낼 곡을 못 찾았어. 곡 감지를 먼저 해줘.");
return;
}
const syncManifest = {
pageUrl: location.href,
capturedAt: new Date().toISOString(),
count: tracks.length,
tracks,
};
setStatus(statusTarget, `${tracks.length}곡 로컬 폴더와 비교 중...`);
const syncResponse = await fetch("http://127.0.0.1:17873/sync-index", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(syncManifest),
});
const syncText = await syncResponse.text();
if (!syncResponse.ok) {
throw new Error(syncText || `${syncResponse.status} ${syncResponse.statusText}`);
}
const syncData = tryParseJson(syncText) || {};
const missingTracks = Array.isArray(syncData.tracks) ? syncData.tracks : [];
if (!missingTracks.length) {
setStatus(statusTarget, `동기화 완료 상태: ${tracks.length}곡 모두 로컬에 있음`);
return;
}
const preparedTracks = [];
for (let index = 0; index < tracks.length; index += 1) {
const track = { ...tracks[index] };
setStatus(statusTarget, `${index + 1}/${tracks.length} WAV 준비 중: ${track.title || track.id}`);
for (let index = 0; index < missingTracks.length; index += 1) {
const track = { ...missingTracks[index] };
setStatus(statusTarget, `${index + 1}/${missingTracks.length} 없는 곡 WAV 준비 중: ${track.title || track.id}`);
track.wavUrl = await requestSunoWavUrl(track);
preparedTracks.push(track);
}
@@ -975,7 +998,11 @@
throw new Error(text || `${response.status} ${response.statusText}`);
}
const data = tryParseJson(text) || {};
setStatus(statusTarget, `로컬 처리 시작: ${data.jobId || "job"} / ${data.log || "companion console 확인"}`);
if (data.skipped) {
setStatus(statusTarget, "동기화 완료 상태: 처리할 새 곡 없음");
return;
}
setStatus(statusTarget, `로컬 처리 시작: ${data.jobId || "job"} / 새 곡 ${preparedTracks.length}`);
}
async function testCompanion(statusTarget) {