From 80d2c4bfb3d655bf60f3be92161502620f81adc6 Mon Sep 17 00:00:00 2001 From: Technomancer702 Date: Sat, 31 Jan 2026 11:09:39 -0800 Subject: [PATCH] fix: copy stream url bug (#69) --- package-lock.json | 4 ++-- public/js/components/VideoPlayer.js | 36 ++++++++++++++++++----------- public/js/pages/WatchPage.js | 34 +++++++++++++++++---------- 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index da6eea0..3113d49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "nodecast-tv", - "version": "2.0.0", + "version": "2.1.4", "license": "GPL-3.0-only", "dependencies": { "@ffprobe-installer/ffprobe": "^2.1.2", @@ -1866,4 +1866,4 @@ } } } -} \ No newline at end of file +} diff --git a/public/js/components/VideoPlayer.js b/public/js/components/VideoPlayer.js index a089dab..5e81fce 100644 --- a/public/js/components/VideoPlayer.js +++ b/public/js/components/VideoPlayer.js @@ -476,20 +476,30 @@ class VideoPlayer { streamUrl = window.location.origin + streamUrl; } - navigator.clipboard.writeText(streamUrl).then(() => { - // Show brief feedback - const btn = document.getElementById('btn-copy-url'); - if (btn) { - const originalText = btn.textContent; - btn.textContent = '✓ Copied!'; - setTimeout(() => { - btn.innerHTML = ` Copy Stream URL`; - }, 1500); - } - console.log('[Player] Stream URL copied:', streamUrl); - }).catch(() => { + const showPromptFallback = () => { prompt('Copy this URL:', streamUrl); - }); + }; + + // navigator.clipboard is only available in secure contexts (HTTPS/localhost) + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(streamUrl).then(() => { + // Show brief feedback + const btn = document.getElementById('btn-copy-url'); + if (btn) { + const originalText = btn.textContent; + btn.textContent = '✓ Copied!'; + setTimeout(() => { + btn.innerHTML = ` Copy Stream URL`; + }, 1500); + } + console.log('[Player] Stream URL copied:', streamUrl); + }).catch(() => { + showPromptFallback(); + }); + } else { + // Fallback for insecure contexts (HTTP) + showPromptFallback(); + } } diff --git a/public/js/pages/WatchPage.js b/public/js/pages/WatchPage.js index b85ca63..6e46bab 100644 --- a/public/js/pages/WatchPage.js +++ b/public/js/pages/WatchPage.js @@ -740,19 +740,29 @@ class WatchPage { streamUrl = window.location.origin + streamUrl; } - navigator.clipboard.writeText(streamUrl).then(() => { - // Show brief feedback - const btn = document.getElementById('watch-copy-url'); - if (btn) { - btn.textContent = '✓ Copied!'; - setTimeout(() => { - btn.innerHTML = ` Copy Stream URL`; - }, 1500); - } - console.log('[WatchPage] Stream URL copied:', streamUrl); - }).catch(() => { + const showPromptFallback = () => { prompt('Copy this URL:', streamUrl); - }); + }; + + // navigator.clipboard is only available in secure contexts (HTTPS/localhost) + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(streamUrl).then(() => { + // Show brief feedback + const btn = document.getElementById('watch-copy-url'); + if (btn) { + btn.textContent = '✓ Copied!'; + setTimeout(() => { + btn.innerHTML = ` Copy Stream URL`; + }, 1500); + } + console.log('[WatchPage] Stream URL copied:', streamUrl); + }).catch(() => { + showPromptFallback(); + }); + } else { + // Fallback for insecure contexts (HTTP) + showPromptFallback(); + } } // === UI Updates ===