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 @@
OBS Metadata Export
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 @@ OBS Metadata Export
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 @@ OBS Metadata Export
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;