'use strict';
// ============================================================================
//  直播延迟捕获器 - 内容脚本 (v0.3)
//  职责：在主世界拦截 fetch / XHR，发现媒体流 URL → 上报给 background
//  ★ 不再执行任何捕获操作（由 background service worker 完成）
// ============================================================================

let MY_TAB = null;
let pendingUrl = null;

const MEDIA_RE = /\.(flv|m3u8|mpd)(\?|$)/i;

function isMedia(url, ct) {
  if (!url) return false;
  // 过滤掉自己的播放页 URL，避免把延迟播放输出当成源
  if (/localhost:8090|\/hls\/cap_/i.test(url)) return false;
  if (MEDIA_RE.test(url)) return true;
  return /video|mpegurl|mpd|flv|octet-stream/i.test(ct || '');
}

function detectFormat(url) {
  if (/\.flv/i.test(url)) return 'flv';
  if (/\.mpd/i.test(url)) return 'dash';
  return 'hls';
}

function urlHash(s) {
  let h = 0;
  for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) | 0;
  return Math.abs(h).toString(36);
}

// ---------------------------------------------------------------------------
// 与 background 的长连接
// ---------------------------------------------------------------------------
let _port = null;
function getPort() {
  if (!_port) _port = chrome.runtime.connect({ name: 'capture-content' });
  return _port;
}

chrome.runtime.sendMessage({ type: 'getTabId' }, (r) => {
  if (r && r.tabId) MY_TAB = r.tabId;
});

function notifyFound(url, format) {
  // 避免重复上报同一 URL
  if (pendingUrl === url) return;
  pendingUrl = url;
  console.log('[Capture-Content] 发现媒体流:', format, url.slice(0, 80));
  getPort().postMessage({
    type: 'found',
    url,
    format,
    title: document.title,
    tabId: MY_TAB
  });
}

// ===========================================================================
//  HOOK: window.fetch（主世界，能拦截页面/第三方库的调用）
// ===========================================================================
const _origFetch = window.fetch.bind(window);
window.fetch = async function (input, init) {
  let resp;
  try { resp = await _origFetch.call(this, input, init); } catch (e) { throw e; }

  const url = (typeof input === 'string') ? input : (input && input.url) || '';
  let ct = '';
  try { ct = resp.headers && resp.headers.get ? resp.headers.get('content-type') : ''; } catch (e) {}

  if (isMedia(url, ct)) {
    notifyFound(url, detectFormat(url));
  }
  return resp;
};

// ===========================================================================
//  HOOK: XMLHttpRequest（兼容老播放器）
// ===========================================================================
const _xhrOpen = XMLHttpRequest.prototype.open;
const _xhrSend = XMLHttpRequest.prototype.send;

XMLHttpRequest.prototype.open = function (method, url, ...rest) {
  this._capUrl = url;
  return _xhrOpen.call(this, method, url, ...rest);
};

XMLHttpRequest.prototype.send = function () {
  const url = this._capUrl || '';
  if (isMedia(url, '')) {
    notifyFound(url, detectFormat(url));
  }
  return _xhrSend.call(this);
};

console.log('[Capture-Content] 主世界内容脚本已加载 v0.3 (仅发现模式)');
