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 ===