Add manual download watch mode
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// ==UserScript==
|
||||
// @name ChatGPT to Suno Prompt Copier
|
||||
// @namespace local.suno-helper
|
||||
// @version 0.10.0
|
||||
// @version 0.10.1
|
||||
// @description Copy structured ChatGPT song prompt versions into Suno fields.
|
||||
// @author local
|
||||
// @match https://chatgpt.com/*
|
||||
@@ -30,7 +30,7 @@
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
const SCRIPT_VERSION = "0.10.0";
|
||||
const SCRIPT_VERSION = "0.10.1";
|
||||
const STORAGE_KEY = "chatgptSunoPromptSlots";
|
||||
const SLOT_COUNT = 2;
|
||||
const isChatGPT = location.hostname.includes("chatgpt.com") || location.hostname.includes("chat.openai.com");
|
||||
@@ -1760,6 +1760,30 @@
|
||||
setStatus(statusTarget, `${format.toUpperCase()} 일괄 업로드 완료: ${uploaded}곡 성공, ${failed}곡 실패. ${syncTextSummary}. 로컬에서 메타데이터 후처리 중${healthText}`);
|
||||
}
|
||||
|
||||
async function expectManualDownloads(tracks, statusTarget, format = "mp3") {
|
||||
const selected = tracks.filter((track) => track?.id);
|
||||
if (!selected.length) {
|
||||
setStatus(statusTarget, "등록할 곡이 없어. 곡 감지 후 목록에서 선택해줘.");
|
||||
return;
|
||||
}
|
||||
setStatus(statusTarget, `로컬 다운로드 감시 등록 중: ${selected.length}곡 ${format.toUpperCase()}`);
|
||||
const response = await fetch("http://127.0.0.1:17873/expect-downloads", {
|
||||
method: "POST",
|
||||
headers: { "content-type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
pageUrl: location.href,
|
||||
capturedAt: new Date().toISOString(),
|
||||
format,
|
||||
tracks: selected,
|
||||
}),
|
||||
});
|
||||
const text = await response.text();
|
||||
if (!response.ok) throw new Error(text || `${response.status} ${response.statusText}`);
|
||||
const data = tryParseJson(text) || {};
|
||||
const root = data.downloadsRoot ? ` / 감시 폴더: ${data.downloadsRoot}` : "";
|
||||
setStatus(statusTarget, `${format.toUpperCase()} 수동 다운로드 대기 등록: 새 ${data.added || 0}곡, 이미 있음 ${data.existingRequested || 0}곡, 대기 ${data.pendingDownloads || 0}곡.${root} 이제 SUNO 원래 메뉴에서 ${format.toUpperCase()}를 직접 받아줘.`);
|
||||
}
|
||||
|
||||
function trackOptionLabel(track, index) {
|
||||
const title = track?.title || track?.id || "제목 없음";
|
||||
const shortId = track?.id ? String(track.id).slice(0, 8) : "";
|
||||
@@ -1818,6 +1842,7 @@
|
||||
if (!data || typeof data !== "object") return "상태 정보 없음";
|
||||
const active = Number(data.activeCount || 0);
|
||||
const queued = Number(data.queued || 0);
|
||||
const pendingDownloads = Number(data.pendingDownloads || 0);
|
||||
const done = Number(data.done ?? ((data.completed || 0) + (data.failed || 0)));
|
||||
const total = Number(data.total || 0);
|
||||
const failed = Number(data.failed || 0);
|
||||
@@ -1825,7 +1850,7 @@
|
||||
const workerText = data.maxWorkers ? `${active}/${data.maxWorkers}` : `${active}`;
|
||||
const title = data.active || "";
|
||||
const titleText = title ? ` / 처리중: ${title}` : "";
|
||||
return `작업 ${done}/${total} (${percent}%), 실행 ${workerText}, 대기 ${queued}, 실패 ${failed}${titleText}`;
|
||||
return `작업 ${done}/${total} (${percent}%), 실행 ${workerText}, 큐 ${queued}, 다운로드대기 ${pendingDownloads}, 실패 ${failed}${titleText}`;
|
||||
}
|
||||
|
||||
async function bootSuno() {
|
||||
@@ -1853,12 +1878,12 @@
|
||||
</div>
|
||||
<div class="cgs-track-list" data-cgs-track-list></div>
|
||||
<div class="cgs-row">
|
||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-process-one-mp3>선택 1곡 MP3(UI)</button>
|
||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-process-one-wav>선택 1곡 WAV(UI)</button>
|
||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-process-one-mp3>선택 1곡 MP3 대기</button>
|
||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-process-one-wav>선택 1곡 WAV 대기</button>
|
||||
</div>
|
||||
<div class="cgs-row">
|
||||
<button class="cgs-btn cgs-primary cgs-wide" type="button" data-cgs-process-selected-mp3>선택항목 MP3(UI)</button>
|
||||
<button class="cgs-btn cgs-primary cgs-wide" type="button" data-cgs-process-selected-wav>선택항목 WAV(UI)</button>
|
||||
<button class="cgs-btn cgs-primary cgs-wide" type="button" data-cgs-process-selected-mp3>선택항목 MP3 대기</button>
|
||||
<button class="cgs-btn cgs-primary cgs-wide" type="button" data-cgs-process-selected-wav>선택항목 WAV 대기</button>
|
||||
</div>
|
||||
<div class="cgs-row">
|
||||
<button class="cgs-btn cgs-wide" type="button" data-cgs-ui-download-mp3>SUNO UI MP3 재시도</button>
|
||||
@@ -2074,21 +2099,38 @@
|
||||
};
|
||||
|
||||
body.querySelector("[data-cgs-process-one-mp3]").addEventListener("click", async () => {
|
||||
await clickSelectedSunoUiDownloads("mp3", { one: true });
|
||||
await registerSelectedManualDownloads("mp3", { one: true });
|
||||
});
|
||||
|
||||
body.querySelector("[data-cgs-process-one-wav]").addEventListener("click", async () => {
|
||||
await clickSelectedSunoUiDownloads("wav", { one: true });
|
||||
await registerSelectedManualDownloads("wav", { one: true });
|
||||
});
|
||||
|
||||
body.querySelector("[data-cgs-process-selected-mp3]").addEventListener("click", async () => {
|
||||
await clickSelectedSunoUiDownloads("mp3");
|
||||
await registerSelectedManualDownloads("mp3");
|
||||
});
|
||||
|
||||
body.querySelector("[data-cgs-process-selected-wav]").addEventListener("click", async () => {
|
||||
await clickSelectedSunoUiDownloads("wav");
|
||||
await registerSelectedManualDownloads("wav");
|
||||
});
|
||||
|
||||
const registerSelectedManualDownloads = async (format, options = {}) => {
|
||||
if (!libraryTracks.length) {
|
||||
mergeLibraryTracks(scanSunoLibraryTracks());
|
||||
renderLibraryTrackList();
|
||||
}
|
||||
const tracks = options.one ? (getSelectedTracks().slice(0, 1)) : getSelectedTracks();
|
||||
if (!tracks.length) {
|
||||
setStatus(body, "선택된 곡이 없어. 목록에서 받을 곡을 먼저 선택해줘.");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await expectManualDownloads(tracks, body, format);
|
||||
} catch (error) {
|
||||
setStatus(body, `${format.toUpperCase()} 다운로드 대기 등록 실패: ${error.message || error}`);
|
||||
}
|
||||
};
|
||||
|
||||
const clickSelectedSunoUiDownloads = async (format, options = {}) => {
|
||||
if (!libraryTracks.length) {
|
||||
mergeLibraryTracks(scanSunoLibraryTracks());
|
||||
|
||||
Reference in New Issue
Block a user