From 1416ef49a4bed3046e9bc21d3a4454b22a7f74cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Oct 2025 00:39:56 +0000 Subject: [PATCH 1/3] Initial plan From bcbd122c5ee66e926d87e734e85209dcb588a5cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Oct 2025 00:45:50 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20Add=20YouTube=20URL=20linking?= =?UTF-8?q?=20for=20Now=20Playing=20track=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: paulpv <1393897+paulpv@users.noreply.github.com> --- player.html | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/player.html b/player.html index 27347fa..a631bb5 100644 --- a/player.html +++ b/player.html @@ -144,6 +144,13 @@ color: var(--text); font-weight: 600; } + .now-title-link { + color: var(--accent); + text-decoration: none; + } + .now-title-link:hover { + text-decoration: underline; + } .controls { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; @@ -1601,6 +1608,12 @@ const id = extractYouTubeIdFrom(entry.trackName, entry.relativePath); return id ? `https://youtu.be/${id}` : null; }; + const resolveYouTubeUrlFromTrack = (track) => { + if (!track) return null; + const relativePath = track.path && track.path.length > 0 ? track.path.join('/') : ''; + const id = extractYouTubeIdFrom(track.displayName || track.name, relativePath); + return id ? `https://youtu.be/${id}` : null; + }; const isRewoundPercent = (percent) => typeof percent === 'number' && percent > REWIND_RATIO_THRESHOLD; const describeHistoryStatus = (entry) => { @@ -2838,7 +2851,21 @@ const tr = tracks[current]; const details = recordPendingAnnouncement(tr, { skipReason }); audio.src = tr.url; - if (nowTitleEl) nowTitleEl.textContent = tr.displayName; + if (nowTitleEl) { + const youtubeUrl = resolveYouTubeUrlFromTrack(tr); + if (youtubeUrl) { + nowTitleEl.innerHTML = ''; + const link = document.createElement('a'); + link.className = 'now-title-link'; + link.href = youtubeUrl; + link.target = '_blank'; + link.rel = 'noopener'; + link.textContent = tr.displayName; + nowTitleEl.appendChild(link); + } else { + nowTitleEl.textContent = tr.displayName; + } + } if (nowArtistEl) nowArtistEl.textContent = (details && details.artist) ? details.artist : '—'; if (nowTrackNumberEl) nowTrackNumberEl.textContent = fmtTrackNumber(current); const key = trackKey(tr); From 11aff830a4663afb3b617a12e7c7526a1e3ee021 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Oct 2025 00:49:25 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20YouTube=20U?= =?UTF-8?q?RL=20extraction=20to=20reduce=20code=20duplication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: paulpv <1393897+paulpv@users.noreply.github.com> --- player.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/player.html b/player.html index a631bb5..bcbeeeb 100644 --- a/player.html +++ b/player.html @@ -1611,8 +1611,10 @@ const resolveYouTubeUrlFromTrack = (track) => { if (!track) return null; const relativePath = track.path && track.path.length > 0 ? track.path.join('/') : ''; - const id = extractYouTubeIdFrom(track.displayName || track.name, relativePath); - return id ? `https://youtu.be/${id}` : null; + return resolveYouTubeUrl({ + trackName: track.displayName || track.name, + relativePath: relativePath + }); }; const isRewoundPercent = (percent) => typeof percent === 'number' && percent > REWIND_RATIO_THRESHOLD;