torrent-online 1.7.0 → 1.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/wtui.js +15 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "torrent-online",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Stream .torrent / magnet to VLC or browser — torrent streaming for macOS/Linux without a torrent client. Стрим торрентов в VLC или браузер.",
|
|
6
6
|
"keywords": [
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@inquirer/prompts": "^7.0.0",
|
|
43
|
+
"hls.js": "^1.5.17",
|
|
43
44
|
"webtorrent": "^3.0.21"
|
|
44
45
|
},
|
|
45
46
|
"engines": {
|
package/wtui.js
CHANGED
|
@@ -669,6 +669,15 @@ async function webReq(req, res, client, st, opts, cacheDir, base) {
|
|
|
669
669
|
res.end(WEB_HTML.replace('__BASE__', base));
|
|
670
670
|
return;
|
|
671
671
|
}
|
|
672
|
+
if (p === '/hls.min.js') {
|
|
673
|
+
try {
|
|
674
|
+
const b = fs.readFileSync(require.resolve('hls.js/dist/hls.min.js'));
|
|
675
|
+
res.setHeader('Content-Type', 'application/javascript; charset=utf-8');
|
|
676
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
677
|
+
res.end(b);
|
|
678
|
+
} catch { res.statusCode = 404; res.end('no hls.js'); }
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
672
681
|
if (p === '/api/search') {
|
|
673
682
|
const q = u.searchParams.get('q') || '';
|
|
674
683
|
const { items, notes } = await searchIndexers(q);
|
|
@@ -858,7 +867,8 @@ async function webReq(req, res, client, st, opts, cacheDir, base) {
|
|
|
858
867
|
const dir = path.join(HLS_ROOT, key);
|
|
859
868
|
const hit0 = hlsProcs.get(key); if (hit0) hit0.touched = Date.now();
|
|
860
869
|
const hit1 = hlsProcs.get(key + '-vtt'); if (hit1) hit1.touched = Date.now();
|
|
861
|
-
const
|
|
870
|
+
const isSeg = /^seg-\d+\.ts$/.test(name);
|
|
871
|
+
const need = !isSeg && (!hlsProcs.has(key) || Math.abs((hlsProcs.get(key).start || 0) - t) > 3);
|
|
862
872
|
if (need) {
|
|
863
873
|
for (const [k, h] of hlsProcs) if (k.startsWith(key) || k.startsWith(mH[1] + '-' + mH[2] + '-')) { try { h.proc.kill('SIGKILL'); } catch {} hlsProcs.delete(k); }
|
|
864
874
|
await fsp.rm(dir, { recursive: true, force: true });
|
|
@@ -913,10 +923,12 @@ async function webReq(req, res, client, st, opts, cacheDir, base) {
|
|
|
913
923
|
}
|
|
914
924
|
let segs = [];
|
|
915
925
|
try { segs = fs.readdirSync(dir).filter(x => /^seg-\d+\.ts$/.test(x)).sort((x, y) => (+x.slice(4)) - (+y.slice(4))); } catch {}
|
|
926
|
+
segs = segs.slice(0, -1); // последний сегмент ещё пишется
|
|
916
927
|
const durs = segs.map(() => 4);
|
|
917
928
|
const maxD = 6;
|
|
918
929
|
let pl = '#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X-TARGETDURATION:' + maxD + '\n#EXT-X-PLAYLIST-TYPE:EVENT\n#EXT-X-MEDIA-SEQUENCE:0\n';
|
|
919
|
-
|
|
930
|
+
const qs = '?a=' + encodeURIComponent(a) + (si >= 0 ? '&si=' + si : '&si=') + '&t=' + t;
|
|
931
|
+
for (let i = 0; i < segs.length; i++) pl += '#EXTINF:' + durs[i].toFixed(3) + ',\n' + segs[i] + qs + '\n';
|
|
920
932
|
res.setHeader('Content-Type', 'application/vnd.apple.mpegurl');
|
|
921
933
|
res.setHeader('Cache-Control', 'no-store');
|
|
922
934
|
res.end(pl);
|
|
@@ -939,7 +951,7 @@ video{flex:1;width:100%;min-height:0;background:#000}
|
|
|
939
951
|
<div class=bar><b>${esc(f.name)}</b><select id=a style=display:none></select><select id=s style=display:none></select><span id=n></span></div>
|
|
940
952
|
<video id=v controls autoplay playsinline></video>
|
|
941
953
|
<div id=ov>▶</div>
|
|
942
|
-
<script src="
|
|
954
|
+
<script src="${base}/hls.min.js"></script>
|
|
943
955
|
<script>
|
|
944
956
|
var B=${JSON.stringify(base)},ID=${mV[1]},I=${mV[2]};
|
|
945
957
|
var v=document.getElementById("v"),aS=document.getElementById("a"),sS=document.getElementById("s"),n=document.getElementById("n"),ov=document.getElementById("ov");
|