Fix Suno track list rendering
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user