Add single detected Suno track action

This commit is contained in:
DESKTOP-KSVGT20\shkim
2026-05-02 00:14:29 +09:00
parent 8d577d8724
commit ddf6b96775
+50 -2
View File
@@ -1,7 +1,7 @@
// ==UserScript==
// @name ChatGPT to Suno Prompt Copier
// @namespace local.suno-helper
// @version 0.7.2
// @version 0.7.3
// @description Copy structured ChatGPT song prompt versions into Suno fields.
// @author local
// @match https://chatgpt.com/*
@@ -1053,6 +1053,12 @@
setStatus(statusTarget, `큐 전송 완료: 새 곡 ${enqueued}개, WAV 보류 ${wavPending}개. 로컬 프로그램이 순서대로 처리 중.`);
}
function trackOptionLabel(track, index) {
const title = track?.title || track?.id || "제목 없음";
const shortId = track?.id ? String(track.id).slice(0, 8) : "";
return `${index + 1}. ${title}${shortId ? ` [${shortId}]` : ""}`;
}
async function testCompanion(statusTarget) {
try {
const response = await fetch("http://127.0.0.1:17873/health", {
@@ -1088,6 +1094,12 @@
<div class="cgs-row">
<button class="cgs-btn cgs-wide" type="button" data-cgs-scan-library>곡 감지</button>
</div>
<select class="cgs-select" data-cgs-library-track>
<option value="">감지된 곡 없음</option>
</select>
<div class="cgs-row">
<button class="cgs-btn cgs-wide" type="button" data-cgs-process-one>선택 1곡만 다운</button>
</div>
<div class="cgs-row">
<button class="cgs-btn cgs-wide" type="button" data-cgs-test-companion>연결 테스트</button>
</div>
@@ -1099,7 +1111,17 @@
const summary = body.querySelector("[data-cgs-summary]");
const slotSelect = body.querySelector("[data-cgs-slot]");
const libraryTrackSelect = body.querySelector("[data-cgs-library-track]");
let libraryTracks = [];
const renderLibraryTrackSelect = () => {
if (!libraryTracks.length) {
libraryTrackSelect.innerHTML = `<option value="">감지된 곡 없음</option>`;
return;
}
libraryTrackSelect.innerHTML = libraryTracks
.map((track, index) => `<option value="${index}">${escapeHtml(trackOptionLabel(track, index))}</option>`)
.join("");
};
const updateSummary = () => {
const payload = slots[Number(slotSelect.value)];
const track = findCurrentSunoTrack();
@@ -1108,6 +1130,7 @@
const trackText = track.id || track.audioUrl || track.imageUrl ? ` / 곡 감지: ${track.title || track.id}` : " / 곡 미감지";
summary.textContent = promptText + trackText + libraryText;
};
renderLibraryTrackSelect();
updateSummary();
slotSelect.addEventListener("change", updateSummary);
@@ -1137,6 +1160,7 @@
body.querySelector("[data-cgs-scan-library]").addEventListener("click", () => {
libraryTracks = scanSunoLibraryTracks();
renderLibraryTrackSelect();
updateSummary();
const sample = libraryTracks.slice(0, 3).map((track) => track.title || track.id).join(", ");
if (libraryTracks.length) {
@@ -1149,8 +1173,32 @@
setStatus(body, `${networkHint} 목록 새로고침이나 스크롤 후 다시 눌러봐. 화면 텍스트: ${visibleHints.join(", ")}`);
});
body.querySelector("[data-cgs-process-one]").addEventListener("click", async () => {
if (!libraryTracks.length) {
libraryTracks = scanSunoLibraryTracks();
renderLibraryTrackSelect();
}
updateSummary();
const index = Number(libraryTrackSelect.value || 0);
const track = libraryTracks[index];
if (!track) {
setStatus(body, "선택할 감지 곡이 없어. 곡 감지를 먼저 눌러줘.");
return;
}
try {
setStatus(body, `선택 1곡 처리 준비: ${track.title || track.id}`);
await postToCompanion([track], body);
} catch (error) {
setStatus(body, `로컬 프로그램 연결 실패. 선택 1곡 manifest로 저장할게: ${error.message || error}`);
await exportSunoManifest([track], body);
}
});
body.querySelector("[data-cgs-process-library]").addEventListener("click", async () => {
if (!libraryTracks.length) libraryTracks = scanSunoLibraryTracks();
if (!libraryTracks.length) {
libraryTracks = scanSunoLibraryTracks();
renderLibraryTrackSelect();
}
updateSummary();
try {
await postToCompanion(libraryTracks, body);