Add single detected Suno track action
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.2
|
// @version 0.7.3
|
||||||
// @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/*
|
||||||
@@ -1053,6 +1053,12 @@
|
|||||||
setStatus(statusTarget, `큐 전송 완료: 새 곡 ${enqueued}개, WAV 보류 ${wavPending}개. 로컬 프로그램이 순서대로 처리 중.`);
|
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) {
|
async function testCompanion(statusTarget) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch("http://127.0.0.1:17873/health", {
|
const response = await fetch("http://127.0.0.1:17873/health", {
|
||||||
@@ -1088,6 +1094,12 @@
|
|||||||
<div class="cgs-row">
|
<div class="cgs-row">
|
||||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-scan-library>곡 감지</button>
|
<button class="cgs-btn cgs-wide" type="button" data-cgs-scan-library>곡 감지</button>
|
||||||
</div>
|
</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">
|
<div class="cgs-row">
|
||||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-test-companion>연결 테스트</button>
|
<button class="cgs-btn cgs-wide" type="button" data-cgs-test-companion>연결 테스트</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -1099,7 +1111,17 @@
|
|||||||
|
|
||||||
const summary = body.querySelector("[data-cgs-summary]");
|
const summary = body.querySelector("[data-cgs-summary]");
|
||||||
const slotSelect = body.querySelector("[data-cgs-slot]");
|
const slotSelect = body.querySelector("[data-cgs-slot]");
|
||||||
|
const libraryTrackSelect = body.querySelector("[data-cgs-library-track]");
|
||||||
let libraryTracks = [];
|
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 updateSummary = () => {
|
||||||
const payload = slots[Number(slotSelect.value)];
|
const payload = slots[Number(slotSelect.value)];
|
||||||
const track = findCurrentSunoTrack();
|
const track = findCurrentSunoTrack();
|
||||||
@@ -1108,6 +1130,7 @@
|
|||||||
const trackText = track.id || track.audioUrl || track.imageUrl ? ` / 곡 감지: ${track.title || track.id}` : " / 곡 미감지";
|
const trackText = track.id || track.audioUrl || track.imageUrl ? ` / 곡 감지: ${track.title || track.id}` : " / 곡 미감지";
|
||||||
summary.textContent = promptText + trackText + libraryText;
|
summary.textContent = promptText + trackText + libraryText;
|
||||||
};
|
};
|
||||||
|
renderLibraryTrackSelect();
|
||||||
updateSummary();
|
updateSummary();
|
||||||
slotSelect.addEventListener("change", updateSummary);
|
slotSelect.addEventListener("change", updateSummary);
|
||||||
|
|
||||||
@@ -1137,6 +1160,7 @@
|
|||||||
|
|
||||||
body.querySelector("[data-cgs-scan-library]").addEventListener("click", () => {
|
body.querySelector("[data-cgs-scan-library]").addEventListener("click", () => {
|
||||||
libraryTracks = scanSunoLibraryTracks();
|
libraryTracks = scanSunoLibraryTracks();
|
||||||
|
renderLibraryTrackSelect();
|
||||||
updateSummary();
|
updateSummary();
|
||||||
const sample = libraryTracks.slice(0, 3).map((track) => track.title || track.id).join(", ");
|
const sample = libraryTracks.slice(0, 3).map((track) => track.title || track.id).join(", ");
|
||||||
if (libraryTracks.length) {
|
if (libraryTracks.length) {
|
||||||
@@ -1149,8 +1173,32 @@
|
|||||||
setStatus(body, `${networkHint} 목록 새로고침이나 스크롤 후 다시 눌러봐. 화면 텍스트: ${visibleHints.join(", ")}`);
|
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 () => {
|
body.querySelector("[data-cgs-process-library]").addEventListener("click", async () => {
|
||||||
if (!libraryTracks.length) libraryTracks = scanSunoLibraryTracks();
|
if (!libraryTracks.length) {
|
||||||
|
libraryTracks = scanSunoLibraryTracks();
|
||||||
|
renderLibraryTrackSelect();
|
||||||
|
}
|
||||||
updateSummary();
|
updateSummary();
|
||||||
try {
|
try {
|
||||||
await postToCompanion(libraryTracks, body);
|
await postToCompanion(libraryTracks, body);
|
||||||
|
|||||||
Reference in New Issue
Block a user