Fix Suno track list rendering

This commit is contained in:
DESKTOP-KSVGT20\shkim
2026-05-02 01:40:18 +09:00
parent 73f409a01b
commit d90b2b0329
+53 -28
View File
@@ -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 = `<div class="cgs-track-item"><div></div><div class="cgs-track-meta">감지된 곡 없음</div><div></div></div>`;
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 = `<div></div><div class="cgs-track-meta">감지된 곡 없음</div><div></div>`;
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 `
<div class="cgs-track-item ${selected ? "cgs-selected" : ""}" data-cgs-track-index="${index}" title="${escapeHtml(track.id || "")}">
<div class="cgs-track-index">${index + 1}</div>
<div>
<div class="cgs-track-title">${escapeHtml(track.title || track.id || "제목 없음")}</div>
<div class="cgs-track-meta">${escapeHtml((track.style || track.lyrics || track.id || "").slice(0, 110))}</div>
</div>
<div class="cgs-track-badge">${escapeHtml(badge || "ID")}</div>
</div>
`;
})
.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));