Compare commits
2
Commits
64d792632d
...
c366f0b8c4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c366f0b8c4 | ||
|
|
c826669c7d |
No files matched your search
@@ -54,7 +54,7 @@ async function persistVideoRequest(tabId, url) {
|
|||||||
await chrome.storage.local.set({ [key]: arr });
|
await chrome.storage.local.set({ [key]: arr });
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.warn('[goon-bg] Failed to persist video request:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] Failed to persist video request:', e && e.message ? e.message : e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ async function collectAllVideoUrls() {
|
|||||||
try {
|
try {
|
||||||
all = await collectAllVideoUrls();
|
all = await collectAllVideoUrls();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[goon-bg] collectAllVideoUrls failed:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] collectAllVideoUrls failed:', e && e.message ? e.message : e);
|
||||||
all = [];
|
all = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +216,7 @@ async function injectFreshToken(url) {
|
|||||||
const fresh = await freshLiveForGroup(groupKey, false);
|
const fresh = await freshLiveForGroup(groupKey, false);
|
||||||
const token = fresh ? extractRawQuery(fresh) : '';
|
const token = fresh ? extractRawQuery(fresh) : '';
|
||||||
tokenCache.set(groupKey, token);
|
tokenCache.set(groupKey, token);
|
||||||
console.log('[goon-bg] injectFreshToken for', groupKey, (token ? token.substring(0, 40) + '…' : '(none captured)'));
|
console.log('[vidplex-bg] injectFreshToken for', groupKey, (token ? token.substring(0, 40) + '…' : '(none captured)'));
|
||||||
return token ? url + '?' + token : url;
|
return token ? url + '?' + token : url;
|
||||||
} catch {
|
} catch {
|
||||||
return url;
|
return url;
|
||||||
@@ -238,7 +238,7 @@ chrome.webRequest.onBeforeRequest.addListener(
|
|||||||
|
|
||||||
// Log video-like requests from any host (CDN-agnostic).
|
// Log video-like requests from any host (CDN-agnostic).
|
||||||
if (isVideoRequest(details.url)) {
|
if (isVideoRequest(details.url)) {
|
||||||
console.log('[goon-bg] webRequest: video request in tab', details.tabId, ':', details.url.substring(0, 180));
|
console.log('[vidplex-bg] webRequest: video request in tab', details.tabId, ':', details.url.substring(0, 180));
|
||||||
await persistVideoRequest(details.tabId, details.url);
|
await persistVideoRequest(details.tabId, details.url);
|
||||||
// Capture the provider referer for this CDN host from the source tab's
|
// Capture the provider referer for this CDN host from the source tab's
|
||||||
// URL: the browser sends the referring page's URL as the Referer for a
|
// URL: the browser sends the referring page's URL as the Referer for a
|
||||||
@@ -255,7 +255,7 @@ chrome.webRequest.onBeforeRequest.addListener(
|
|||||||
if (ref) {
|
if (ref) {
|
||||||
await persistReferer(host, ref);
|
await persistReferer(host, ref);
|
||||||
refererCapturedDomains.add(domain);
|
refererCapturedDomains.add(domain);
|
||||||
console.log('[goon-bg] captured referer for', domain, '->', ref);
|
console.log('[vidplex-bg] captured referer for', domain, '->', ref);
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
// Tab may have closed mid-stream; a later request from a live tab
|
// Tab may have closed mid-stream; a later request from a live tab
|
||||||
@@ -267,7 +267,7 @@ chrome.webRequest.onBeforeRequest.addListener(
|
|||||||
// Also capture HLS manifest URLs (original logic)
|
// Also capture HLS manifest URLs (original logic)
|
||||||
if (!isHlsManifest(details.url)) return;
|
if (!isHlsManifest(details.url)) return;
|
||||||
|
|
||||||
console.log('[goon-bg] webRequest: HLS manifest in tab', details.tabId, ':', details.url.substring(0, 120));
|
console.log('[vidplex-bg] webRequest: HLS manifest in tab', details.tabId, ':', details.url.substring(0, 120));
|
||||||
|
|
||||||
const key = 'wr_manifests_' + details.tabId;
|
const key = 'wr_manifests_' + details.tabId;
|
||||||
try {
|
try {
|
||||||
@@ -278,7 +278,7 @@ chrome.webRequest.onBeforeRequest.addListener(
|
|||||||
await chrome.storage.local.set({ [key]: arr });
|
await chrome.storage.local.set({ [key]: arr });
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.warn('[goon-bg] Failed to persist webRequest manifest:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] Failed to persist webRequest manifest:', e && e.message ? e.message : e);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ urls: ['<all_urls>'] }
|
{ urls: ['<all_urls>'] }
|
||||||
@@ -393,7 +393,7 @@ async function persistReferer(host, referer) {
|
|||||||
map[domain] = { referer, at: now };
|
map[domain] = { referer, at: now };
|
||||||
await chrome.storage.local.set({ goon_referers: map });
|
await chrome.storage.local.set({ goon_referers: map });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[goon-bg] persistReferer failed:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] persistReferer failed:', e && e.message ? e.message : e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,7 +429,7 @@ async function ensureRefererRule(host, referer) {
|
|||||||
if (!domain || !referer) return;
|
if (!domain || !referer) return;
|
||||||
const api = chrome.declarativeNetRequest;
|
const api = chrome.declarativeNetRequest;
|
||||||
if (!api || typeof api.updateSessionRules !== 'function') {
|
if (!api || typeof api.updateSessionRules !== 'function') {
|
||||||
console.warn('[goon-bg] declarativeNetRequest unavailable; skipping referer rule');
|
console.warn('[vidplex-bg] declarativeNetRequest unavailable; skipping referer rule');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,9 +462,9 @@ async function ensureRefererRule(host, referer) {
|
|||||||
}],
|
}],
|
||||||
});
|
});
|
||||||
refererRuleInstalled.set(domain, referer);
|
refererRuleInstalled.set(domain, referer);
|
||||||
console.log('[goon-bg] DNR referer rule installed for', domain, '(' + ruleId + ')');
|
console.log('[vidplex-bg] DNR referer rule installed for', domain, '(' + ruleId + ')');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[goon-bg] ensureRefererRule failed:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] ensureRefererRule failed:', e && e.message ? e.message : e);
|
||||||
}
|
}
|
||||||
})().finally(() => { refererRuleLocks.set(domain, null); });
|
})().finally(() => { refererRuleLocks.set(domain, null); });
|
||||||
refererRuleLocks.set(domain, run);
|
refererRuleLocks.set(domain, run);
|
||||||
@@ -532,7 +532,7 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
|
|||||||
const fresh = await freshLiveForGroup(groupKey, true);
|
const fresh = await freshLiveForGroup(groupKey, true);
|
||||||
sendResponse({ ok: true, fresh, groupKey, changed: !!(fresh && fresh !== url) });
|
sendResponse({ ok: true, fresh, groupKey, changed: !!(fresh && fresh !== url) });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[goon-bg] resolveFreshManifest failed:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] resolveFreshManifest failed:', e && e.message ? e.message : e);
|
||||||
sendResponse({ ok: false, error: e && e.message ? e.message : String(e), groupKey });
|
sendResponse({ ok: false, error: e && e.message ? e.message : String(e), groupKey });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -573,7 +573,7 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
|
|||||||
const proxyUrl = resolved.replace(/\+/g, '%2B');
|
const proxyUrl = resolved.replace(/\+/g, '%2B');
|
||||||
const resp = await fetch(proxyUrl);
|
const resp = await fetch(proxyUrl);
|
||||||
if (!resp.ok) {
|
if (!resp.ok) {
|
||||||
console.warn('[goon-bg] proxyFetch', resp.status, message.url.substring(0, 120));
|
console.warn('[vidplex-bg] proxyFetch', resp.status, message.url.substring(0, 120));
|
||||||
sendResponse({ ok: false, status: resp.status, error: 'HTTP ' + resp.status });
|
sendResponse({ ok: false, status: resp.status, error: 'HTTP ' + resp.status });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -589,7 +589,7 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
|
|||||||
const base64 = btoa(binary);
|
const base64 = btoa(binary);
|
||||||
sendResponse({ ok: true, data: base64, mimeType: resp.headers.get('content-type') || '' });
|
sendResponse({ ok: true, data: base64, mimeType: resp.headers.get('content-type') || '' });
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.warn('[goon-bg] proxyFetch failed:', e && e.message ? e.message : e);
|
console.warn('[vidplex-bg] proxyFetch failed:', e && e.message ? e.message : e);
|
||||||
sendResponse({ ok: false, error: e && e.message ? e.message : String(e) });
|
sendResponse({ ok: false, error: e && e.message ? e.message : String(e) });
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
@@ -615,6 +615,6 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
console.warn('[goon-plugin] Unknown message type:', message.type);
|
console.warn('[vidplex-plugin] Unknown message type:', message.type);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
+10
-10
@@ -67,8 +67,8 @@
|
|||||||
source: source,
|
source: source,
|
||||||
timestamp: event.data.timestamp
|
timestamp: event.data.timestamp
|
||||||
});
|
});
|
||||||
console.log('[goon-plugin] Intercepted HLS manifest via', source, ':', url);
|
console.log('[vidplex-plugin] Intercepted HLS manifest via', source, ':', url);
|
||||||
console.log('[goon-plugin] Total intercepted manifests so far:', interceptedManifests.length);
|
console.log('[vidplex-plugin] Total intercepted manifests so far:', interceptedManifests.length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -106,21 +106,21 @@
|
|||||||
*/
|
*/
|
||||||
function getVideoData() {
|
function getVideoData() {
|
||||||
const poster = extractPoster();
|
const poster = extractPoster();
|
||||||
console.log('[goon-content] getVideoData called. Poster:', poster);
|
console.log('[vidplex-content] getVideoData called. Poster:', poster);
|
||||||
console.log('[goon-content] Intercepted manifests count:', interceptedManifests.length);
|
console.log('[vidplex-content] Intercepted manifests count:', interceptedManifests.length);
|
||||||
if (interceptedManifests.length > 0) {
|
if (interceptedManifests.length > 0) {
|
||||||
console.log('[goon-content] Manifest details:', JSON.stringify(interceptedManifests.map(m => ({ url: m.url, source: m.source }))));
|
console.log('[vidplex-content] Manifest details:', JSON.stringify(interceptedManifests.map(m => ({ url: m.url, source: m.source }))));
|
||||||
}
|
}
|
||||||
|
|
||||||
// DOM video scan (isolated world — can access DOM but not page JS)
|
// DOM video scan (isolated world — can access DOM but not page JS)
|
||||||
const videoElements = [];
|
const videoElements = [];
|
||||||
try {
|
try {
|
||||||
const videos = document.querySelectorAll('video');
|
const videos = document.querySelectorAll('video');
|
||||||
console.log('[goon-content] Found', videos.length, '<video> elements in DOM');
|
console.log('[vidplex-content] Found', videos.length, '<video> elements in DOM');
|
||||||
for (const video of videos) {
|
for (const video of videos) {
|
||||||
const style = window.getComputedStyle(video);
|
const style = window.getComputedStyle(video);
|
||||||
const isVisible = style.display !== 'none' && video.clientWidth > 0 && video.clientHeight > 0;
|
const isVisible = style.display !== 'none' && video.clientWidth > 0 && video.clientHeight > 0;
|
||||||
console.log('[goon-content] Video:', {
|
console.log('[vidplex-content] Video:', {
|
||||||
src: (video.currentSrc || video.src || '').substring(0, 120),
|
src: (video.currentSrc || video.src || '').substring(0, 120),
|
||||||
visible: isVisible,
|
visible: isVisible,
|
||||||
dimensions: video.clientWidth + 'x' + video.clientHeight,
|
dimensions: video.clientWidth + 'x' + video.clientHeight,
|
||||||
@@ -147,10 +147,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(e) { /* ignore DOM access errors */
|
} catch(e) { /* ignore DOM access errors */
|
||||||
console.warn('[goon-content] DOM scan error:', e && e.message ? e.message : e);
|
console.warn('[vidplex-content] DOM scan error:', e && e.message ? e.message : e);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('[goon-content] Visible video elements:', videoElements.length);
|
console.log('[vidplex-content] Visible video elements:', videoElements.length);
|
||||||
// Expose interceptor data globally so the popup's deep probe can read it.
|
// Expose interceptor data globally so the popup's deep probe can read it.
|
||||||
window.__goon_plugin_data = window.__goon_plugin_data || {
|
window.__goon_plugin_data = window.__goon_plugin_data || {
|
||||||
manifests: [],
|
manifests: [],
|
||||||
@@ -183,5 +183,5 @@
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('[goon-plugin] Content script loaded. Interceptors injected at document_start.');
|
console.log('[vidplex-plugin] Content script loaded. Interceptors injected at document_start.');
|
||||||
})();
|
})();
|
||||||
+8
-8
@@ -10,8 +10,8 @@ const TAGGED_KEY = 'goon_tagged';
|
|||||||
// Set to true to enable verbose console output in the popup.
|
// Set to true to enable verbose console output in the popup.
|
||||||
const DEBUG = true; // TEMP: enabled for debugging — revert to false when done
|
const DEBUG = true; // TEMP: enabled for debugging — revert to false when done
|
||||||
|
|
||||||
function log(...args) { if (DEBUG) console.log('[goon]', ...args); }
|
function log(...args) { if (DEBUG) console.log('[vidplex]', ...args); }
|
||||||
function warn(...args) { if (DEBUG) console.warn('[goon]', ...args); }
|
function warn(...args) { if (DEBUG) console.warn('[vidplex]', ...args); }
|
||||||
|
|
||||||
/** Log a message to the active tab's page console (visible to the user in DevTools). */
|
/** Log a message to the active tab's page console (visible to the user in DevTools). */
|
||||||
async function logToPage(msg) {
|
async function logToPage(msg) {
|
||||||
@@ -21,7 +21,7 @@ async function logToPage(msg) {
|
|||||||
if (!tab) return;
|
if (!tab) return;
|
||||||
await chrome.scripting.executeScript({
|
await chrome.scripting.executeScript({
|
||||||
target: { tabId: tab.id },
|
target: { tabId: tab.id },
|
||||||
func: (m) => { console.log('[goon-page]', m); },
|
func: (m) => { console.log('[vidplex-page]', m); },
|
||||||
args: [msg],
|
args: [msg],
|
||||||
});
|
});
|
||||||
} catch { /* ignore — tab may have navigated away */ }
|
} catch { /* ignore — tab may have navigated away */ }
|
||||||
@@ -120,7 +120,7 @@ function m3u8DeepProbeFn() {
|
|||||||
|
|
||||||
// DEBUG: Log probe activity to console
|
// DEBUG: Log probe activity to console
|
||||||
function probeLog(...args) {
|
function probeLog(...args) {
|
||||||
try { console.log('[goon-probe]', ...args); } catch(e) {}
|
try { console.log('[vidplex-probe]', ...args); } catch(e) {}
|
||||||
}
|
}
|
||||||
// NOTE: the probe is injected with chrome.scripting's `world: 'MAIN'`, so it
|
// NOTE: the probe is injected with chrome.scripting's `world: 'MAIN'`, so it
|
||||||
// runs in the page's main world and can see page globals. `typeof chrome` is
|
// runs in the page's main world and can see page globals. `typeof chrome` is
|
||||||
@@ -973,14 +973,14 @@ function makeVideoEntry(video, tabTitle, posterFromContent) {
|
|||||||
if (video.hlsManifest) {
|
if (video.hlsManifest) {
|
||||||
// Reject fake/invalid manifest paths before storing
|
// Reject fake/invalid manifest paths before storing
|
||||||
if (!isValidManifestUrl(video.hlsManifest)) {
|
if (!isValidManifestUrl(video.hlsManifest)) {
|
||||||
console.warn('[goon] Rejecting fake manifest URL:', video.hlsManifest.substring(0, 120));
|
console.warn('[vidplex] Rejecting fake manifest URL:', video.hlsManifest.substring(0, 120));
|
||||||
} else {
|
} else {
|
||||||
entry.hlsManifest = video.hlsManifest;
|
entry.hlsManifest = video.hlsManifest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Also validate src when it looks like a manifest URL (no hlsManifest set but src has .m3u8)
|
// Also validate src when it looks like a manifest URL (no hlsManifest set but src has .m3u8)
|
||||||
if (!entry.hlsManifest && entry.src?.includes('.m3u8') && !isValidManifestUrl(entry.src)) {
|
if (!entry.hlsManifest && entry.src?.includes('.m3u8') && !isValidManifestUrl(entry.src)) {
|
||||||
console.warn('[goon] Rejecting fake manifest URL from src:', entry.src.substring(0, 120));
|
console.warn('[vidplex] Rejecting fake manifest URL from src:', entry.src.substring(0, 120));
|
||||||
// Don't treat it as HLS — leave mediaType as-is (likely 'video' or unset)
|
// Don't treat it as HLS — leave mediaType as-is (likely 'video' or unset)
|
||||||
}
|
}
|
||||||
return entry;
|
return entry;
|
||||||
@@ -1297,7 +1297,7 @@ findBtn.addEventListener('click', async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.group('[goon-diag] HLS diagnostics');
|
console.group('[vidplex-diag] HLS diagnostics');
|
||||||
for (const line of diag) {
|
for (const line of diag) {
|
||||||
console.log(line);
|
console.log(line);
|
||||||
}
|
}
|
||||||
@@ -1305,7 +1305,7 @@ findBtn.addEventListener('click', async () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[goon-diag] Diagnostic failed:', e.message);
|
console.warn('[vidplex-diag] Diagnostic failed:', e.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-23
@@ -149,7 +149,7 @@ const panelsEl = document.getElementById('panels');
|
|||||||
// caused "Cannot create property 'levelDetails' on number".
|
// caused "Cannot create property 'levelDetails' on number".
|
||||||
const fireSuccess = (data) => {
|
const fireSuccess = (data) => {
|
||||||
if (!onSuccess) {
|
if (!onSuccess) {
|
||||||
console.warn('[goon-viewer] no onSuccess callback for', (url || '').substring(0, 100));
|
console.warn('[vidplex-viewer] no onSuccess callback for', (url || '').substring(0, 100));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tLoad = Date.now();
|
const tLoad = Date.now();
|
||||||
@@ -161,11 +161,11 @@ const panelsEl = document.getElementById('panels');
|
|||||||
|
|
||||||
const fireError = (code, text) => {
|
const fireError = (code, text) => {
|
||||||
if (!onError) {
|
if (!onError) {
|
||||||
console.error('[goon-viewer] no onError callback; error:', text || code, (url || '').substring(0, 100));
|
console.error('[vidplex-viewer] no onError callback; error:', text || code, (url || '').substring(0, 100));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
stats.loading.end = Date.now();
|
stats.loading.end = Date.now();
|
||||||
console.warn('[goon-viewer] HlsLoader error:', code, text, (url || '').substring(0, 100));
|
console.warn('[vidplex-viewer] HlsLoader error:', code, text, (url || '').substring(0, 100));
|
||||||
onError({ code: code || 0, text: text || '', url, headers: {}, data: null }, stats, context, null);
|
onError({ code: code || 0, text: text || '', url, headers: {}, data: null }, stats, context, null);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ const panelsEl = document.getElementById('panels');
|
|||||||
if (needProxy) {
|
if (needProxy) {
|
||||||
// Route through the service worker to bypass the CDN's CORS/Referer
|
// Route through the service worker to bypass the CDN's CORS/Referer
|
||||||
// restrictions. The SW adds the required Referer and returns base64.
|
// restrictions. The SW adds the required Referer and returns base64.
|
||||||
console.log('[goon-viewer] Proxying via SW:', (url || '').substring(0, 120));
|
console.log('[vidplex-viewer] Proxying via SW:', (url || '').substring(0, 120));
|
||||||
chrome.runtime.sendMessage({ type: 'GOON_PROXY_FETCH', url, referer: refererForUrl(url) }, (resp) => {
|
chrome.runtime.sendMessage({ type: 'GOON_PROXY_FETCH', url, referer: refererForUrl(url) }, (resp) => {
|
||||||
if (self._aborted) return;
|
if (self._aborted) return;
|
||||||
const lastErr = chrome.runtime.lastError;
|
const lastErr = chrome.runtime.lastError;
|
||||||
@@ -253,7 +253,7 @@ HlsLoader.canSupportLoader = function () { return true; };
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.warn('[goon-viewer] proxyFetch failed for:', url.substring(0, 120), e && e.message ? e.message : e);
|
console.warn('[vidplex-viewer] proxyFetch failed for:', url.substring(0, 120), e && e.message ? e.message : e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -744,14 +744,14 @@ function wireHlsEvents(hls, video, panel) {
|
|||||||
state.fpsDropCount++;
|
state.fpsDropCount++;
|
||||||
state.lastEvent = 'FPS_DROP';
|
state.lastEvent = 'FPS_DROP';
|
||||||
state.lastActivity = Date.now();
|
state.lastActivity = Date.now();
|
||||||
console.warn(`[goon-viewer] FPS drop: current=${data.currentFPS}, threshold=${data.thresholdFPS}`);
|
console.warn(`[vidplex-viewer] FPS drop: current=${data.currentFPS}, threshold=${data.thresholdFPS}`);
|
||||||
renderPanelState(video, panel);
|
renderPanelState(video, panel);
|
||||||
});
|
});
|
||||||
|
|
||||||
hls.on(HlsEvents.FPS_MAX_LEVEL_DROP, (_ev, data) => {
|
hls.on(HlsEvents.FPS_MAX_LEVEL_DROP, (_ev, data) => {
|
||||||
state.lastEvent = 'FPS_MAX_LEVEL_DROP';
|
state.lastEvent = 'FPS_MAX_LEVEL_DROP';
|
||||||
state.lastActivity = Date.now();
|
state.lastActivity = Date.now();
|
||||||
console.warn(`[goon-viewer] Max level dropped due to FPS: ${data.currentLevel}`);
|
console.warn(`[vidplex-viewer] Max level dropped due to FPS: ${data.currentLevel}`);
|
||||||
renderPanelState(video, panel);
|
renderPanelState(video, panel);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -798,7 +798,7 @@ function wireHlsEvents(hls, video, panel) {
|
|||||||
// tab with no live source doesn't loop forever.
|
// tab with no live source doesn't loop forever.
|
||||||
if ((video.dataset.hlsRescans || '0') | 0 < 3) {
|
if ((video.dataset.hlsRescans || '0') | 0 < 3) {
|
||||||
video.dataset.hlsRescans = ((video.dataset.hlsRescans || '0') | 0) + 1;
|
video.dataset.hlsRescans = ((video.dataset.hlsRescans || '0') | 0) + 1;
|
||||||
console.log('[goon-viewer] fatal NETWORK_ERROR → auto-rescan attempt #' + video.dataset.hlsRescans);
|
console.log('[vidplex-viewer] fatal NETWORK_ERROR → auto-rescan attempt #' + video.dataset.hlsRescans);
|
||||||
showError(panel, 'Refreshing stream…');
|
showError(panel, 'Refreshing stream…');
|
||||||
rescanAndRetry(video, panel, video.dataset.hlsManifest || '');
|
rescanAndRetry(video, panel, video.dataset.hlsManifest || '');
|
||||||
} else {
|
} else {
|
||||||
@@ -976,7 +976,7 @@ function playHls(video, manifestUrl, panel) {
|
|||||||
// without CORS headers blocks extension-origin requests from the viewer page).
|
// without CORS headers blocks extension-origin requests from the viewer page).
|
||||||
const needProxy = needsProxy(manifestUrl);
|
const needProxy = needsProxy(manifestUrl);
|
||||||
if (needProxy) {
|
if (needProxy) {
|
||||||
console.log('[goon-viewer] Manifest needs proxying via service worker');
|
console.log('[vidplex-viewer] Manifest needs proxying via service worker');
|
||||||
}
|
}
|
||||||
|
|
||||||
destroyHls(video);
|
destroyHls(video);
|
||||||
@@ -1017,7 +1017,7 @@ function playHls(video, manifestUrl, panel) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Log the manifest URL being loaded for debugging (helps diagnose playback failures).
|
// Log the manifest URL being loaded for debugging (helps diagnose playback failures).
|
||||||
console.log(`[goon-viewer] Loading HLS manifest:`, manifestUrl.substring(0, 200));
|
console.log(`[vidplex-viewer] Loading HLS manifest:`, manifestUrl.substring(0, 200));
|
||||||
|
|
||||||
// Remember the manifest actually loaded so a later auto-rescan can retry from
|
// Remember the manifest actually loaded so a later auto-rescan can retry from
|
||||||
// the freshest token on the same video (the service worker keys off the path).
|
// the freshest token on the same video (the service worker keys off the path).
|
||||||
@@ -1039,14 +1039,14 @@ function loadHlsJs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const hldsSrc = chrome.runtime.getURL('hlds.js');
|
const hldsSrc = chrome.runtime.getURL('hlds.js');
|
||||||
console.log('[goon-viewer] Trying script src:', hldsSrc);
|
console.log('[vidplex-viewer] Trying script src:', hldsSrc);
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const script = document.createElement('script');
|
const script = document.createElement('script');
|
||||||
script.src = hldsSrc;
|
script.src = hldsSrc;
|
||||||
script.onload = () => {
|
script.onload = () => {
|
||||||
if (window.Hls && typeof window.Hls.isSupported === 'function') {
|
if (window.Hls && typeof window.Hls.isSupported === 'function') {
|
||||||
console.log('[goon-viewer] hlds.js via script src OK, Hls.isSupported:', window.Hls.isSupported());
|
console.log('[vidplex-viewer] hlds.js via script src OK, Hls.isSupported:', window.Hls.isSupported());
|
||||||
resolve();
|
resolve();
|
||||||
} else {
|
} else {
|
||||||
reject(new Error('hlds.js loaded but did not register global Hls'));
|
reject(new Error('hlds.js loaded but did not register global Hls'));
|
||||||
@@ -1076,12 +1076,12 @@ function loadHlsJs() {
|
|||||||
try {
|
try {
|
||||||
const resp = await chrome.runtime.sendMessage({ type: 'GOON_RESOLVE_MANIFEST', url: storedUrl });
|
const resp = await chrome.runtime.sendMessage({ type: 'GOON_RESOLVE_MANIFEST', url: storedUrl });
|
||||||
if (resp && resp.ok && resp.changed && resp.fresh) {
|
if (resp && resp.ok && resp.changed && resp.fresh) {
|
||||||
console.log('[goon-viewer] resolved fresh manifest for', (resp.groupKey || '?'),
|
console.log('[vidplex-viewer] resolved fresh manifest for', (resp.groupKey || '?'),
|
||||||
'→', (resp.fresh || '').substring(0, 100));
|
'→', (resp.fresh || '').substring(0, 100));
|
||||||
return resp.fresh;
|
return resp.fresh;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('[goon-viewer] resolveFreshManifest failed:', e && e.message ? e.message : e);
|
console.warn('[vidplex-viewer] resolveFreshManifest failed:', e && e.message ? e.message : e);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -1097,11 +1097,11 @@ function loadHlsJs() {
|
|||||||
const fresh = await resolveFreshManifest(originalUrl);
|
const fresh = await resolveFreshManifest(originalUrl);
|
||||||
if (!fresh) {
|
if (!fresh) {
|
||||||
showError(panel, 'Stream expired & no live source — reload the source tab, then re-open viewer.');
|
showError(panel, 'Stream expired & no live source — reload the source tab, then re-open viewer.');
|
||||||
console.warn('[goon-viewer] rescan gave up: no fresh manifest for', (originalUrl || '').substring(0, 100));
|
console.warn('[vidplex-viewer] rescan gave up: no fresh manifest for', (originalUrl || '').substring(0, 100));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (panel) removeErrorOverlay(panel);
|
if (panel) removeErrorOverlay(panel);
|
||||||
console.log('[goon-viewer] retrying with fresh manifest:', fresh.substring(0, 120));
|
console.log('[vidplex-viewer] retrying with fresh manifest:', fresh.substring(0, 120));
|
||||||
playHls(video, fresh, panel);
|
playHls(video, fresh, panel);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1147,7 +1147,7 @@ function createPanel(entry, tag) {
|
|||||||
}
|
}
|
||||||
// mediaType says HLS but we have no manifest URL — fall through to native playback.
|
// mediaType says HLS but we have no manifest URL — fall through to native playback.
|
||||||
// On Safari this may still work for .m3u8; on Chrome it will fail.
|
// On Safari this may still work for .m3u8; on Chrome it will fail.
|
||||||
console.warn('[goon-viewer] HLS entry missing manifest URL, src:', src);
|
console.warn('[vidplex-viewer] HLS entry missing manifest URL, src:', src);
|
||||||
}
|
}
|
||||||
|
|
||||||
video.src = src;
|
video.src = src;
|
||||||
@@ -1182,13 +1182,13 @@ async function init() {
|
|||||||
document.body.insertBefore(overlay, document.body.firstChild);
|
document.body.insertBefore(overlay, document.body.firstChild);
|
||||||
|
|
||||||
// === DIAGNOSTIC: Check storage + CORS ===
|
// === DIAGNOSTIC: Check storage + CORS ===
|
||||||
console.log('[goon-viewer] Viewer ID:', id, 'Grid:', gridN + 'x' + gridN);
|
console.log('[vidplex-viewer] Viewer ID:', id, 'Grid:', gridN + 'x' + gridN);
|
||||||
console.log('[goon-viewer] Raw stored data:', JSON.stringify(videoUrls));
|
console.log('[vidplex-viewer] Raw stored data:', JSON.stringify(videoUrls));
|
||||||
|
|
||||||
if (videoUrls.length > 0) {
|
if (videoUrls.length > 0) {
|
||||||
for (const entry of videoUrls) {
|
for (const entry of videoUrls) {
|
||||||
const src = (entry.src || '').substring(0, 120);
|
const src = (entry.src || '').substring(0, 120);
|
||||||
console.log('[goon-viewer] Entry:', {
|
console.log('[vidplex-viewer] Entry:', {
|
||||||
src: src,
|
src: src,
|
||||||
mediaType: entry.mediaType,
|
mediaType: entry.mediaType,
|
||||||
hlsManifest: (entry.hlsManifest || '').substring(0, 120),
|
hlsManifest: (entry.hlsManifest || '').substring(0, 120),
|
||||||
@@ -1213,7 +1213,7 @@ async function init() {
|
|||||||
for (const url of [...new Set(urlsToTest)]) {
|
for (const url of [...new Set(urlsToTest)]) {
|
||||||
const corsOk = await corsCheck(url);
|
const corsOk = await corsCheck(url);
|
||||||
if (!corsOk) blockedHosts.add(registrableDomainOf(hostOfUrl(url)));
|
if (!corsOk) blockedHosts.add(registrableDomainOf(hostOfUrl(url)));
|
||||||
console.log('[goon-viewer] CORS', corsOk ? 'OK' : 'BLOCKED:', url.substring(0, 120));
|
console.log('[vidplex-viewer] CORS', corsOk ? 'OK' : 'BLOCKED:', url.substring(0, 120));
|
||||||
}
|
}
|
||||||
if (blockedHosts.size > 0) {
|
if (blockedHosts.size > 0) {
|
||||||
for (const h of blockedHosts) if (h) proxyHosts.add(h);
|
for (const h of blockedHosts) if (h) proxyHosts.add(h);
|
||||||
@@ -1222,9 +1222,9 @@ async function init() {
|
|||||||
|
|
||||||
// Report whether any URL needs proxying (referer-protected host).
|
// Report whether any URL needs proxying (referer-protected host).
|
||||||
const anyNeedsProxy = urlsNeedProxy(urlsToTest);
|
const anyNeedsProxy = urlsNeedProxy(urlsToTest);
|
||||||
console.log('[goon-viewer] Proxy required:', anyNeedsProxy);
|
console.log('[vidplex-viewer] Proxy required:', anyNeedsProxy);
|
||||||
} else {
|
} else {
|
||||||
console.warn('[goon-viewer] No video entries in storage for ID:', id, '— data may have been cleared or never saved');
|
console.warn('[vidplex-viewer] No video entries in storage for ID:', id, '— data may have been cleared or never saved');
|
||||||
}
|
}
|
||||||
|
|
||||||
overlay.textContent = `Found ${videoUrls.length} video URL(s) in ${gridN}x${gridN} grid`;
|
overlay.textContent = `Found ${videoUrls.length} video URL(s) in ${gridN}x${gridN} grid`;
|
||||||
|
|||||||
Reference in new issue
Block a user