diff --git a/chatgpt-suno-tampermonkey.user.js b/chatgpt-suno-tampermonkey.user.js index 580ebef..0f42027 100644 --- a/chatgpt-suno-tampermonkey.user.js +++ b/chatgpt-suno-tampermonkey.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @name ChatGPT to Suno Prompt Copier // @namespace local.suno-helper -// @version 0.8.9 +// @version 0.9.0 // @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.8.9"; + const SCRIPT_VERSION = "0.9.0"; const STORAGE_KEY = "chatgptSunoPromptSlots"; const SLOT_COUNT = 2; const isChatGPT = location.hostname.includes("chatgpt.com") || location.hostname.includes("chat.openai.com"); @@ -1619,37 +1619,62 @@ libraryTrackMap.set(track.id, track); } } - libraryTracks = [...libraryTrackMap.values()]; + libraryTracks = [...libraryTrackMap.values()].filter((track) => track?.id); }; const renderLibraryTrackList = () => { - const selectedCount = selectedTrackIds.size; - selectionSummary.textContent = libraryTracks.length - ? `누적 ${libraryTracks.length}곡 / 선택 ${selectedCount}곡` - : "누적된 곡 없음. 스크롤하면서 곡 감지를 눌러줘."; - if (!libraryTracks.length) { - trackList.innerHTML = `
감지된 곡 없음
`; - return; - } - trackList.innerHTML = libraryTracks - .map((track, index) => { - const selected = selectedTrackIds.has(track.id); - const badge = [ + try { + for (const id of [...selectedTrackIds]) { + if (!libraryTrackMap.has(id)) selectedTrackIds.delete(id); + } + const selectedCount = selectedTrackIds.size; + selectionSummary.textContent = libraryTracks.length + ? `누적 ${libraryTracks.length}곡 / 선택 ${selectedCount}곡` + : "누적된 곡 없음. 스크롤하면서 곡 감지를 눌러줘."; + + const nodes = []; + if (!libraryTracks.length) { + const empty = document.createElement("div"); + empty.className = "cgs-track-item"; + empty.innerHTML = `
감지된 곡 없음
`; + trackList.replaceChildren(empty); + return; + } + + libraryTracks.forEach((track, index) => { + const row = document.createElement("div"); + row.className = `cgs-track-item ${selectedTrackIds.has(track.id) ? "cgs-selected" : ""}`; + row.dataset.cgsTrackIndex = String(index); + row.title = track.id || ""; + + const number = document.createElement("div"); + number.className = "cgs-track-index"; + number.textContent = String(index + 1); + + const text = document.createElement("div"); + const title = document.createElement("div"); + title.className = "cgs-track-title"; + title.textContent = track.title || track.id || "제목 없음"; + const meta = document.createElement("div"); + meta.className = "cgs-track-meta"; + meta.textContent = String(track.style || track.lyrics || track.id || "").slice(0, 110); + text.append(title, meta); + + const badge = document.createElement("div"); + badge.className = "cgs-track-badge"; + badge.textContent = [ track.audioUrl ? "MP3" : "", track.wavUrl ? "WAV" : "", track.imageUrl ? "IMG" : "", - ].filter(Boolean).join(" "); - return ` -
-
${index + 1}
-
-
${escapeHtml(track.title || track.id || "제목 없음")}
-
${escapeHtml((track.style || track.lyrics || track.id || "").slice(0, 110))}
-
-
${escapeHtml(badge || "ID")}
-
- `; - }) - .join(""); + ].filter(Boolean).join(" ") || "ID"; + + row.append(number, text, badge); + nodes.push(row); + }); + trackList.replaceChildren(...nodes); + } catch (error) { + console.error("[ChatGPT to Suno] track list render failed", error); + setStatus(body, `곡 목록 표시 실패: ${error.message || error}`); + } }; const setSelectedRange = (from, to) => { const start = Math.max(0, Math.min(from, to));