File size: 1,994 Bytes
bc3974a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
05e9a36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var headers = {
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
  'Accept': 'application/vnd.apple.mpegurl, video/*; q=0.9',
  'Accept-Encoding': 'gzip, deflate, br',
  'Accept-Language': 'en-US,en;q=0.9',
  'Connection': 'keep-alive',
  'Cache-Control': 'no-cache',
  'Upgrade-Insecure-Requests': '1',
  'Referer': 'https://huggingface.co/',
  "origin": "https://huggingface.co"
};
async function fetchM3U8(url) {
  var response = await fetch(url, { method: 'GET', headers });
  var m3u8Text = await response.text();

  // 获取 base URL,通常为 M3U8 文件的父目录
  var baseUrl = getBaseUrl(url);

  // 解析 m3u8 内容,提取所有 TS 文件的 URL
  var tsUrls = parseM3U8(m3u8Text, baseUrl);
  var errorTsUrls = []
  // 进一步处理每个 TS 文件,使用 fetch 加载
  for (var tsUrl of tsUrls) {
    try {
      await fetch(tsUrl);
    } catch (error) {
      console.log(tsUrl, '请求失败')
      errorTsUrls.push(tsUrl)
    }
  }
  while (errorTsUrls.length) {
    var tsUrl = errorTsUrls.shift()
    try {
      await fetch(tsUrl);
    } catch (error) {
      console.log(tsUrl, '请求失败')
      errorTsUrls.push(tsUrl)
    }
  }

}

// 获取 M3U8 文件的 base URL
function getBaseUrl(m3u8Url) {
  var url = new URL(m3u8Url);
  return url.origin + url.pathname.substring(0, url.pathname.lastIndexOf('/'));
}

// 解析 M3U8 内容,提取所有 TS 文件的 URL
function parseM3U8(m3u8Text, baseUrl) {
  var tsUrls = [];
  var lines = m3u8Text.split('\n');
  for (var line of lines) {
      if (line && line.endsWith('.ts')) {
          // 拼接相对路径与 base URL,构建完整的 TS 文件 URL
          var tsUrl = line.startsWith('http') ? line : new URL(line, baseUrl).href;
          tsUrls.push(tsUrl);
      }
  }
  return tsUrls;
}

var search = new URLSearchParams(location.search)
// 示例调用
fetchM3U8(location.origin + search.get('url'));