playsvideo 0.0.1 → 0.0.9

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Jonathan Graehl
3
+ Copyright (c) 2026 Kyle Graehl
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,23 +1,23 @@
1
1
  <picture>
2
- <source media="(prefers-color-scheme: dark)" srcset="docs/wordmark-dark.svg">
3
- <source media="(prefers-color-scheme: light)" srcset="docs/wordmark-light.svg">
4
- <img alt="playsvideo" src="docs/wordmark-light.svg" width="340">
2
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/kzahel/playsvideo/main/docs/wordmark-dark.svg">
3
+ <source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/kzahel/playsvideo/main/docs/wordmark-light.svg">
4
+ <img alt="playsvideo" src="https://raw.githubusercontent.com/kzahel/playsvideo/main/docs/wordmark-light.svg" width="340">
5
5
  </picture>
6
6
 
7
- **You may not need VLC.** Play any video file in the browser — no install, no upload.
7
+ **You probably don't need VLC.** Play any video file in the browser — no install, no upload.
8
8
 
9
9
  [Try it at playsvideo.com](https://playsvideo.com) &nbsp;|&nbsp; Drop a file. It plays.
10
10
 
11
11
  ---
12
12
 
13
- Most video files won't play in a browser — not because the browser can't *decode* the video, but because it can't open the container or handle the audio codec. playsvideo fixes that entirely client-side: it remuxes containers and transcodes audio on the fly, so your MKV with AC-3 audio just works.
13
+ Many video files won't play in a browser — not because the browser can't *decode* the video, but because it can't open the container or handle the audio codec. playsvideo fixes that entirely client-side: it remuxes containers and transcodes audio on the fly, so your MKV with AC-3 audio just works.
14
14
 
15
15
  ### What it handles
16
16
 
17
17
  | | Formats | Notes |
18
18
  |---|---|---|
19
19
  | **Containers** | MKV, MP4, AVI, TS, WebM | Demuxed and remuxed to fMP4 |
20
- | **Video** | H.264, H.265, VP9, AV1 | Passthrough — plays ~99% of files (~90% on Firefox; HEVC transcode planned) |
20
+ | **Video** | H.264, H.265 (HEVC), VP9, AV1 | Passthrough — plays ~99% of files (~90% on Firefox; HEVC transcode planned) |
21
21
  | **Audio** | AAC, MP3, AC-3, E-AC-3, DTS, FLAC, Opus | Unsupported codecs transcoded to AAC on the fly |
22
22
  | **Subtitles** | SRT, ASS/SSA | Extracted and displayed as WebVTT |
23
23
 
@@ -31,13 +31,13 @@ Video file (MKV, MP4, AVI, …)
31
31
  → keyframe-aligned segment plan
32
32
  → per segment:
33
33
  video passed through or transcoded if needed
34
- audio transcoded only if needed (AC-3/DTS/FLAC → AAC)
34
+ audio transcoded only if needed (AC-3/DTS/MP3/FLAC/Opus → AAC)
35
35
  muxed to fMP4
36
36
  → hls.js plays segments on demand
37
37
  → subtitles extracted to WebVTT
38
38
  ```
39
39
 
40
- Video transcode is almost never needed — browsers natively decode the vast majority of video codecs in the wild. When audio transcode is needed, a lightweight 1.5 MB ffmpeg.wasm build is lazy-loaded on demanda few seconds at a time, entirely in-browser.
40
+ Video transcode is almost never needed — browsers natively decode the vast majority of video codecs. When audio transcode is needed, a lightweight 1.8 MB ffmpeg.wasm build is lazy-loaded entirely in-browser. No SharedArrayBuffer required works on any host without special CORS headers.
41
41
 
42
42
  ### Under the hood
43
43
 
@@ -51,7 +51,9 @@ Each piece existed separately. Nobody combined them.
51
51
 
52
52
  ### Use as a library
53
53
 
54
- > Not yet published to npm. The API below is the current interface.
54
+ ```bash
55
+ npm install playsvideo
56
+ ```
55
57
 
56
58
  ```ts
57
59
  import { PlaysVideoEngine } from 'playsvideo';
@@ -59,31 +61,36 @@ import { PlaysVideoEngine } from 'playsvideo';
59
61
  const video = document.querySelector('video')!;
60
62
  const engine = new PlaysVideoEngine(video);
61
63
 
62
- engine.addEventListener('ready', (e) => {
63
- console.log(`${e.detail.totalSegments} segments, ${e.detail.durationSec}s`);
64
- });
64
+ // Play a local file (drag-and-drop, <input type="file">, etc.)
65
+ engine.loadFile(file);
65
66
 
66
- engine.loadFile(file); // from drag-and-drop or <input type="file">
67
- engine.destroy(); // clean up
67
+ // Or play from a URL (requires CORS + range request support)
68
+ engine.loadUrl('https://example.com/video.mkv');
69
+
70
+ engine.destroy(); // clean up
68
71
  ```
69
72
 
73
+ See [engine API docs](docs/engine-api.md) for events, properties, and full usage.
74
+
70
75
  ### Roadmap
71
76
 
72
- - **npm publish** `npm install playsvideo`
73
- - **WebCodecs** — replace ffmpeg.wasm audio transcode with `AudioDecoder`/`AudioEncoder` (smaller bundle, lower latency)
74
- - **Video transcode** — hardware-accelerated decode via `VideoDecoder` for edge-case codecs
77
+ See [docs/roadmap.md](docs/roadmap.md) for the full list. Highlights:
78
+
79
+ - **User-imported subtitles** — load external `.srt`/`.vtt` files alongside the video
80
+ - **WebCodecs** — replace ffmpeg.wasm with hardware-accelerated `AudioDecoder`/`AudioEncoder` and `VideoDecoder`/`VideoEncoder`
75
81
 
76
82
  <details>
77
83
  <summary><strong>Development</strong></summary>
78
84
 
79
85
  ```bash
80
- npm run setup # install deps + download ffmpeg-core.wasm
81
- npm run dev # vite dev server
82
- npm run typecheck # tsc --noEmit
83
- npm run test:unit # fast unit tests
84
- npm run lint # biome lint
85
- npm run format # biome format
86
- npm run test:integration # requires test fixtures in tests/fixtures/
86
+ pnpm run setup # install deps + download ffmpeg-core.wasm
87
+ pnpm run dev # vite dev server (simple player)
88
+ pnpm run typecheck # tsc --noEmit
89
+ pnpm run test:unit # fast unit tests
90
+ pnpm run lint # biome lint
91
+ pnpm run format # biome format
92
+ pnpm run test:integration # requires test fixtures in tests/fixtures/
93
+ pnpm --filter app dev # media player dev server (React app)
87
94
  ```
88
95
 
89
96
  ```
@@ -93,7 +100,12 @@ src/adapters/ Platform adapters (ffmpeg.wasm for browser, node-ffmpeg for
93
100
  src/worker.ts Web worker — demux + on-demand segment processing
94
101
  src/engine.ts PlaysVideoEngine class (worker, hls.js, subtitles)
95
102
  src/pwa-player.ts Browser entry — file picker, drag-and-drop
103
+ app/ React media player — library management, folder picker, playlists
96
104
  tests/ Unit, integration, and e2e (Playwright) tests
97
105
  ```
98
106
 
99
107
  </details>
108
+
109
+ ### License
110
+
111
+ MIT. Dependencies include MPL-2.0 (mediabunny), Apache-2.0 (hls.js), and LGPL-2.1 (ffmpeg-core.wasm, loaded at runtime). No GPL codecs are compiled in. See [licensing details](docs/licensing.md) and [THIRD_PARTY_LICENSES](THIRD_PARTY_LICENSES).
package/dist/engine.d.ts CHANGED
@@ -1,15 +1,18 @@
1
- import type { SubtitleTrackInfo } from './pipeline/types.js';
1
+ import type { Source } from 'mediabunny';
2
+ import type { FfmpegRunner, KeyframeIndex, SubtitleTrackInfo } from './pipeline/types.js';
2
3
  export type EnginePhase = 'idle' | 'demuxing' | 'ready' | 'error';
3
4
  export interface ReadyDetail {
4
5
  totalSegments: number;
5
6
  durationSec: number;
6
7
  subtitleTracks: SubtitleTrackInfo[];
8
+ passthrough?: boolean;
7
9
  }
8
10
  export interface ErrorDetail {
9
11
  message: string;
10
12
  }
11
13
  export interface LoadingDetail {
12
- file: File;
14
+ file?: File;
15
+ url?: string;
13
16
  }
14
17
  interface EngineEventMap {
15
18
  ready: CustomEvent<ReadyDetail>;
@@ -17,7 +20,7 @@ interface EngineEventMap {
17
20
  loading: CustomEvent<LoadingDetail>;
18
21
  }
19
22
  export declare class PlaysVideoEngine extends EventTarget {
20
- private video;
23
+ readonly video: HTMLVideoElement;
21
24
  private worker;
22
25
  private hls;
23
26
  private pendingSegments;
@@ -31,18 +34,60 @@ export declare class PlaysVideoEngine extends EventTarget {
31
34
  private _phase;
32
35
  private _totalSegments;
33
36
  private _durationSec;
37
+ private _passthrough;
38
+ private _blobUrl;
39
+ private _pendingFileType;
40
+ private _keyframeIndex;
41
+ private _source;
42
+ private _sourceDemux;
43
+ private _sourcePlan;
44
+ private _sourceDoTranscode;
45
+ private _sourceAudioDecoderConfig;
46
+ private _sourceInitSegment;
47
+ private _sourceFfmpeg;
48
+ private _sourceTargetSegDuration;
49
+ private _sourceSegmentAbort;
34
50
  get phase(): EnginePhase;
35
51
  get loading(): boolean;
36
52
  get totalSegments(): number;
37
53
  get durationSec(): number;
38
54
  get subtitleTracks(): SubtitleTrackInfo[];
55
+ get passthrough(): boolean;
39
56
  constructor(video: HTMLVideoElement);
40
- loadFile(file: File): void;
57
+ loadFile(file: File, opts?: {
58
+ keyframeIndex?: KeyframeIndex;
59
+ }): void;
60
+ loadUrl(url: string, opts?: {
61
+ keyframeIndex?: KeyframeIndex;
62
+ }): void;
63
+ /**
64
+ * Load from an external Source (e.g. TorrentSource).
65
+ *
66
+ * Runs the pipeline on the main thread (no worker) because external Sources
67
+ * typically need access to objects on the main thread.
68
+ *
69
+ * If the Source implements AbortableSource, the pipeline will call
70
+ * setCurrentSignal() before each segment so the Source can abort in-flight
71
+ * reads on seek.
72
+ */
73
+ loadSource(source: Source, opts?: {
74
+ keyframeIndex?: KeyframeIndex;
75
+ ffmpeg?: FfmpegRunner;
76
+ targetSegmentDuration?: number;
77
+ }): void;
78
+ private reset;
79
+ private createWorker;
41
80
  destroy(): void;
42
81
  addEventListener<K extends keyof EngineEventMap>(type: K, listener: (ev: EngineEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
43
82
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
83
+ private checkNativePlayback;
84
+ private startPassthrough;
44
85
  private handleWorkerMessage;
45
86
  private requestSegment;
87
+ private cancelSegment;
88
+ private startSourcePipeline;
89
+ private makeSourceProcessorConfig;
90
+ private requestSourceSegment;
46
91
  private startHls;
47
92
  private addSubtitleTrack;
48
93
  private removeSubtitleTracks;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,iBAAiB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAChC,OAAO,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;CACrC;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,GAAG,CAAoB;IAG/B,OAAO,CAAC,eAAe,CAGnB;IAGJ,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,WAAW,CAGH;IAChB,OAAO,CAAC,eAAe,CAGP;IAEhB,OAAO,CAAC,mBAAmB,CAA6B;IAGxD,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAA2B;IAGlD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAK;IAEzB,IAAI,KAAK,IAAI,WAAW,CAEvB;IACD,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,aAAa,IAAI,MAAM,CAE1B;IACD,IAAI,WAAW,IAAI,MAAM,CAExB;IACD,IAAI,cAAc,IAAI,iBAAiB,EAAE,CAExC;gBAEW,KAAK,EAAE,gBAAgB;IAKnC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAkC1B,OAAO,IAAI,IAAI;IAkBf,gBAAgB,CAAC,CAAC,SAAS,MAAM,cAAc,EAC7C,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,EACzC,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI;IACP,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI;IASP,OAAO,CAAC,mBAAmB;IAiF3B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,QAAQ;IAgKhB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,oBAAoB;CAK7B"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/engine.js CHANGED
@@ -1,4 +1,10 @@
1
1
  import Hls from 'hls.js';
2
+ import { audioNeedsTranscode, createBrowserProber } from './pipeline/codec-probe.js';
3
+ import { demuxSource, getKeyframeIndex } from './pipeline/demux.js';
4
+ import { generateVodPlaylist } from './pipeline/playlist.js';
5
+ import { buildSegmentPlan } from './pipeline/segment-plan.js';
6
+ import { processSegmentWithAbort } from './pipeline/segment-processor.js';
7
+ import { isAbortableSource } from './pipeline/source-signal.js';
2
8
  export class PlaysVideoEngine extends EventTarget {
3
9
  video;
4
10
  worker = null;
@@ -18,6 +24,22 @@ export class PlaysVideoEngine extends EventTarget {
18
24
  _phase = 'idle';
19
25
  _totalSegments = 0;
20
26
  _durationSec = 0;
27
+ // Passthrough state
28
+ _passthrough = false;
29
+ _blobUrl = null;
30
+ _pendingFileType = null;
31
+ // Pre-built keyframe index (e.g. from MKV cues) to skip mediabunny scan
32
+ _keyframeIndex = null;
33
+ // Main-thread pipeline state (used by loadSource)
34
+ _source = null;
35
+ _sourceDemux = null;
36
+ _sourcePlan = [];
37
+ _sourceDoTranscode = false;
38
+ _sourceAudioDecoderConfig = null;
39
+ _sourceInitSegment = null;
40
+ _sourceFfmpeg = null;
41
+ _sourceTargetSegDuration = 4;
42
+ _sourceSegmentAbort = null;
21
43
  get phase() {
22
44
  return this._phase;
23
45
  }
@@ -33,18 +55,67 @@ export class PlaysVideoEngine extends EventTarget {
33
55
  get subtitleTracks() {
34
56
  return this._subtitleTracks;
35
57
  }
58
+ get passthrough() {
59
+ return this._passthrough;
60
+ }
36
61
  constructor(video) {
37
62
  super();
38
63
  this.video = video;
39
64
  }
40
- loadFile(file) {
41
- // Clean up previous state
65
+ loadFile(file, opts) {
66
+ this.reset({ file });
67
+ this._pendingFileType = file.type || null;
68
+ this._blobUrl = URL.createObjectURL(file);
69
+ this._keyframeIndex = opts?.keyframeIndex ?? null;
70
+ this.createWorker();
71
+ this.worker.postMessage({ type: 'open', file });
72
+ mlog(`open file=${file.name} size=${(file.size / 1024 / 1024).toFixed(1)}MB type=${file.type}`);
73
+ }
74
+ loadUrl(url, opts) {
75
+ this.reset({ url });
76
+ this._keyframeIndex = opts?.keyframeIndex ?? null;
77
+ this.createWorker();
78
+ this.worker.postMessage({ type: 'open-url', url });
79
+ mlog(`open url=${url}`);
80
+ }
81
+ /**
82
+ * Load from an external Source (e.g. TorrentSource).
83
+ *
84
+ * Runs the pipeline on the main thread (no worker) because external Sources
85
+ * typically need access to objects on the main thread.
86
+ *
87
+ * If the Source implements AbortableSource, the pipeline will call
88
+ * setCurrentSignal() before each segment so the Source can abort in-flight
89
+ * reads on seek.
90
+ */
91
+ loadSource(source, opts) {
92
+ this.reset({});
93
+ this._keyframeIndex = opts?.keyframeIndex ?? null;
94
+ this._source = source;
95
+ this._sourcePlan = [];
96
+ this._sourceDoTranscode = false;
97
+ this._sourceAudioDecoderConfig = null;
98
+ this._sourceInitSegment = null;
99
+ this._sourceFfmpeg = opts?.ffmpeg ?? null;
100
+ this._sourceTargetSegDuration = opts?.targetSegmentDuration ?? 4;
101
+ this.startSourcePipeline(source);
102
+ }
103
+ reset(detail) {
42
104
  if (this.hls) {
43
105
  this.hls.destroy();
44
106
  this.hls = null;
45
107
  }
46
108
  if (this.worker) {
47
109
  this.worker.terminate();
110
+ this.worker = null;
111
+ }
112
+ if (this._blobUrl) {
113
+ URL.revokeObjectURL(this._blobUrl);
114
+ this._blobUrl = null;
115
+ }
116
+ if (this._passthrough) {
117
+ this.video.removeAttribute('src');
118
+ this.video.load();
48
119
  }
49
120
  this.playlist = null;
50
121
  this.initData = null;
@@ -58,15 +129,34 @@ export class PlaysVideoEngine extends EventTarget {
58
129
  this._totalSegments = 0;
59
130
  this._durationSec = 0;
60
131
  this._subtitleTracks = [];
61
- this.dispatchEvent(new CustomEvent('loading', { detail: { file } }));
62
- this.worker = new Worker(new URL('./worker.ts', import.meta.url), { type: 'module' });
132
+ this._passthrough = false;
133
+ this._pendingFileType = null;
134
+ this._keyframeIndex = null;
135
+ // Source pipeline cleanup
136
+ if (this._sourceSegmentAbort) {
137
+ this._sourceSegmentAbort.abort();
138
+ this._sourceSegmentAbort = null;
139
+ }
140
+ if (this._source && isAbortableSource(this._source)) {
141
+ this._source.setCurrentSignal(null);
142
+ }
143
+ this._source = null;
144
+ this._sourceDemux?.dispose();
145
+ this._sourceDemux = null;
146
+ this._sourcePlan = [];
147
+ this._sourceDoTranscode = false;
148
+ this._sourceAudioDecoderConfig = null;
149
+ this._sourceInitSegment = null;
150
+ this._sourceFfmpeg = null;
151
+ this.dispatchEvent(new CustomEvent('loading', { detail }));
152
+ }
153
+ createWorker() {
154
+ this.worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' });
63
155
  this.worker.onmessage = (e) => this.handleWorkerMessage(e);
64
156
  this.worker.onerror = (e) => {
65
157
  this._phase = 'error';
66
158
  this.dispatchEvent(new CustomEvent('error', { detail: { message: e.message } }));
67
159
  };
68
- this.worker.postMessage({ type: 'open', file });
69
- mlog(`open file=${file.name} size=${(file.size / 1024 / 1024).toFixed(1)}MB`);
70
160
  }
71
161
  destroy() {
72
162
  if (this.hls) {
@@ -77,6 +167,14 @@ export class PlaysVideoEngine extends EventTarget {
77
167
  this.worker.terminate();
78
168
  this.worker = null;
79
169
  }
170
+ if (this._blobUrl) {
171
+ URL.revokeObjectURL(this._blobUrl);
172
+ this._blobUrl = null;
173
+ }
174
+ if (this._passthrough) {
175
+ this.video.removeAttribute('src');
176
+ this.video.load();
177
+ }
80
178
  for (const url of this.subtitleBlobUrls)
81
179
  URL.revokeObjectURL(url);
82
180
  this.subtitleBlobUrls = [];
@@ -84,13 +182,76 @@ export class PlaysVideoEngine extends EventTarget {
84
182
  this.pendingSegments.clear();
85
183
  this.segmentRequestTimes.clear();
86
184
  this._phase = 'idle';
185
+ this._passthrough = false;
87
186
  }
88
187
  addEventListener(type, listener, options) {
89
188
  super.addEventListener(type, listener, options);
90
189
  }
190
+ checkNativePlayback(videoCodec, audioCodec) {
191
+ const mime = this._pendingFileType;
192
+ if (!mime)
193
+ return false;
194
+ const codecs = audioCodec ? `${videoCodec}, ${audioCodec}` : videoCodec;
195
+ const fullMime = `${mime}; codecs="${codecs}"`;
196
+ const result = this.video.canPlayType(fullMime);
197
+ mlog(`canPlayType("${fullMime}") = "${result}"`);
198
+ return result === 'probably' || result === 'maybe';
199
+ }
200
+ startPassthrough(src) {
201
+ this._passthrough = true;
202
+ this._totalSegments = 0;
203
+ if (src.startsWith('blob:')) {
204
+ this._blobUrl = src;
205
+ }
206
+ this.video.src = src;
207
+ const fireReady = () => {
208
+ this._durationSec = this.video.duration;
209
+ this._phase = 'ready';
210
+ mlog(`passthrough ready dur=${this._durationSec.toFixed(1)}s`);
211
+ this.dispatchEvent(new CustomEvent('ready', {
212
+ detail: {
213
+ totalSegments: 0,
214
+ durationSec: this._durationSec,
215
+ subtitleTracks: [],
216
+ passthrough: true,
217
+ },
218
+ }));
219
+ };
220
+ if (this.video.readyState >= 1) {
221
+ fireReady();
222
+ }
223
+ else {
224
+ this.video.addEventListener('loadedmetadata', fireReady, { once: true });
225
+ }
226
+ }
91
227
  handleWorkerMessage(event) {
92
228
  const msg = event.data;
93
- if (msg.type === 'ready') {
229
+ if (msg.type === 'probed') {
230
+ // Worker finished demux — decide passthrough vs pipeline
231
+ const canPlay = this.checkNativePlayback(msg.videoCodec, msg.audioCodec);
232
+ this._subtitleTracks = msg.subtitleTracks ?? [];
233
+ if (canPlay && this._blobUrl) {
234
+ mlog(`passthrough: canPlayType accepted codecs=${msg.videoCodec}/${msg.audioCodec}`);
235
+ this.startPassthrough(this._blobUrl);
236
+ this.worker.postMessage({ type: 'passthrough-pipeline' });
237
+ for (const track of this._subtitleTracks) {
238
+ mlog(`requesting subtitle track=${track.index} lang=${track.language} codec=${track.codec}`);
239
+ this.worker.postMessage({ type: 'subtitle', trackIndex: track.index });
240
+ }
241
+ }
242
+ else {
243
+ if (this._blobUrl) {
244
+ URL.revokeObjectURL(this._blobUrl);
245
+ this._blobUrl = null;
246
+ }
247
+ mlog(`pipeline: canPlayType rejected, proceeding with remux pipeline`);
248
+ const remuxMsg = { type: 'remux-pipeline' };
249
+ if (this._keyframeIndex)
250
+ remuxMsg.keyframeIndex = this._keyframeIndex;
251
+ this.worker.postMessage(remuxMsg);
252
+ }
253
+ }
254
+ else if (msg.type === 'ready') {
94
255
  this.playlist = msg.playlist;
95
256
  this.initData = msg.initData;
96
257
  this._totalSegments = msg.totalSegments;
@@ -172,6 +333,125 @@ export class PlaysVideoEngine extends EventTarget {
172
333
  this.worker.postMessage({ type: 'segment', index });
173
334
  });
174
335
  }
336
+ cancelSegment(index) {
337
+ const pending = this.pendingSegments.get(index);
338
+ if (pending) {
339
+ mlog(`cancel seg ${index}`);
340
+ pending.reject(new DOMException('Segment aborted', 'AbortError'));
341
+ this.pendingSegments.delete(index);
342
+ this.segmentRequestTimes.delete(index);
343
+ this.worker?.postMessage({ type: 'cancel', index });
344
+ }
345
+ }
346
+ async startSourcePipeline(source) {
347
+ try {
348
+ mlog('source pipeline: demuxing');
349
+ this._sourceDemux = await demuxSource(source);
350
+ const demux = this._sourceDemux;
351
+ // Build keyframe index
352
+ let index;
353
+ if (this._keyframeIndex) {
354
+ index = this._keyframeIndex;
355
+ mlog(`source pipeline: pre-built keyframes=${index.keyframes.length}`);
356
+ }
357
+ else {
358
+ index = await getKeyframeIndex(demux.videoSink, demux.duration);
359
+ mlog(`source pipeline: keyframe-index keyframes=${index.keyframes.length}`);
360
+ }
361
+ // Build segment plan
362
+ this._sourcePlan = buildSegmentPlan({
363
+ keyframeTimestampsSec: index.keyframes.map((k) => k.timestamp),
364
+ durationSec: index.duration,
365
+ targetSegmentDurationSec: this._sourceTargetSegDuration,
366
+ });
367
+ // Check transcode
368
+ const codecProber = createBrowserProber();
369
+ this._sourceDoTranscode =
370
+ demux.audioCodec !== null &&
371
+ audioNeedsTranscode(codecProber, demux.audioCodec, demux.audioDecoderConfig?.codec);
372
+ this._sourceAudioDecoderConfig = demux.audioDecoderConfig;
373
+ // Pre-process segment 0
374
+ const seg0Result = await processSegmentWithAbort(this.makeSourceProcessorConfig(), 0);
375
+ if (seg0Result.initSegment) {
376
+ this._sourceInitSegment = seg0Result.initSegment;
377
+ }
378
+ if (seg0Result.audioDecoderConfig) {
379
+ this._sourceAudioDecoderConfig = seg0Result.audioDecoderConfig;
380
+ }
381
+ // Build playlist
382
+ const playlist = generateVodPlaylist({
383
+ targetDuration: Math.ceil(Math.max(...this._sourcePlan.map((s) => s.durationSec))),
384
+ mediaSequence: 0,
385
+ mapUri: 'init.mp4',
386
+ entries: this._sourcePlan.map((s) => ({
387
+ uri: `seg-${s.sequence}.m4s`,
388
+ durationSec: s.durationSec,
389
+ })),
390
+ endList: true,
391
+ });
392
+ this.playlist = playlist;
393
+ this.initData = this._sourceInitSegment.buffer.slice(this._sourceInitSegment.byteOffset, this._sourceInitSegment.byteOffset + this._sourceInitSegment.byteLength);
394
+ this._totalSegments = this._sourcePlan.length;
395
+ this._durationSec = demux.duration;
396
+ this._subtitleTracks = demux.subtitleTracks;
397
+ this._phase = 'ready';
398
+ mlog(`source pipeline: ready segments=${this._totalSegments} dur=${this._durationSec.toFixed(1)}s`);
399
+ this.dispatchEvent(new CustomEvent('ready', {
400
+ detail: {
401
+ totalSegments: this._totalSegments,
402
+ durationSec: this._durationSec,
403
+ subtitleTracks: this._subtitleTracks,
404
+ },
405
+ }));
406
+ this.startHls();
407
+ }
408
+ catch (err) {
409
+ this._phase = 'error';
410
+ this.dispatchEvent(new CustomEvent('error', { detail: { message: String(err) } }));
411
+ }
412
+ }
413
+ makeSourceProcessorConfig() {
414
+ const demux = this._sourceDemux;
415
+ return {
416
+ videoSink: demux.videoSink,
417
+ audioSink: demux.audioSink,
418
+ videoCodec: demux.videoCodec,
419
+ audioCodec: demux.audioCodec,
420
+ videoDecoderConfig: demux.videoDecoderConfig,
421
+ audioDecoderConfig: this._sourceAudioDecoderConfig,
422
+ plan: this._sourcePlan,
423
+ doTranscode: this._sourceDoTranscode,
424
+ ffmpeg: this._sourceFfmpeg ?? {
425
+ run: async () => ({ exitCode: 1, stderr: 'no ffmpeg' }),
426
+ writeInput: async () => { },
427
+ readOutput: async () => new Uint8Array(),
428
+ },
429
+ sourceCodec: demux.audioCodec ?? undefined,
430
+ log: mlog,
431
+ };
432
+ }
433
+ async requestSourceSegment(index) {
434
+ // Cancel previous in-flight segment if any
435
+ if (this._sourceSegmentAbort) {
436
+ this._sourceSegmentAbort.abort();
437
+ }
438
+ const controller = new AbortController();
439
+ this._sourceSegmentAbort = controller;
440
+ // Set signal on source for abort-aware Sources (e.g. TorrentSource)
441
+ if (this._source && isAbortableSource(this._source)) {
442
+ this._source.setCurrentSignal(controller.signal);
443
+ }
444
+ const result = await processSegmentWithAbort(this.makeSourceProcessorConfig(), index, controller.signal);
445
+ this._sourceSegmentAbort = null;
446
+ // Update mutable state
447
+ if (!this._sourceInitSegment && result.initSegment) {
448
+ this._sourceInitSegment = result.initSegment;
449
+ }
450
+ if (result.audioDecoderConfig) {
451
+ this._sourceAudioDecoderConfig = result.audioDecoderConfig;
452
+ }
453
+ return result.mediaData.buffer.slice(result.mediaData.byteOffset, result.mediaData.byteOffset + result.mediaData.byteLength);
454
+ }
175
455
  startHls() {
176
456
  if (!Hls.isSupported()) {
177
457
  this._phase = 'error';
@@ -212,6 +492,7 @@ export class PlaysVideoEngine extends EventTarget {
212
492
  class PipelineFragmentLoader {
213
493
  context = null;
214
494
  stats = makeStats();
495
+ currentSegmentIndex = null;
215
496
  load(context, _config, callbacks) {
216
497
  this.context = context;
217
498
  const url = context.url;
@@ -251,19 +532,42 @@ export class PlaysVideoEngine extends EventTarget {
251
532
  }
252
533
  }
253
534
  loadSegment(index, context, callbacks) {
254
- engine
255
- .requestSegment(index)
535
+ this.currentSegmentIndex = index;
536
+ const segmentPromise = engine._source
537
+ ? engine.requestSourceSegment(index)
538
+ : engine.requestSegment(index);
539
+ segmentPromise
256
540
  .then((data) => {
541
+ this.currentSegmentIndex = null;
257
542
  this.stats.loaded = data.byteLength;
258
543
  this.stats.loading.end = performance.now();
259
544
  callbacks.onSuccess({ url: context.url, data }, this.stats, context, null);
260
545
  })
261
546
  .catch((err) => {
547
+ this.currentSegmentIndex = null;
548
+ if (err instanceof DOMException && err.name === 'AbortError') {
549
+ this.stats.aborted = true;
550
+ return;
551
+ }
262
552
  callbacks.onError({ code: 0, text: err.message }, context, null, this.stats);
263
553
  });
264
554
  }
265
- abort() { }
266
- destroy() { }
555
+ abort() {
556
+ if (this.currentSegmentIndex !== null) {
557
+ if (engine._source) {
558
+ // Source mode: abort the in-flight main-thread processing
559
+ engine._sourceSegmentAbort?.abort();
560
+ }
561
+ else {
562
+ // Worker mode: cancel via worker message
563
+ engine.cancelSegment(this.currentSegmentIndex);
564
+ }
565
+ this.currentSegmentIndex = null;
566
+ }
567
+ }
568
+ destroy() {
569
+ this.abort();
570
+ }
267
571
  }
268
572
  this.hls = new Hls({
269
573
  pLoader: PipelinePlaylistLoader,
@@ -272,7 +576,9 @@ export class PlaysVideoEngine extends EventTarget {
272
576
  });
273
577
  this.hls.on(Hls.Events.MANIFEST_PARSED, (_evt, data) => {
274
578
  mlog(`hls MANIFEST_PARSED levels=${data.levels.length}`);
275
- this.video.play().catch(() => { });
579
+ if (this.video.autoplay) {
580
+ this.video.play().catch(() => { });
581
+ }
276
582
  });
277
583
  this.hls.on(Hls.Events.FRAG_LOADING, (_evt, data) => {
278
584
  mlog(`hls FRAG_LOADING sn=${data.frag.sn} url=${data.frag.relurl}`);
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
1
  export { PlaysVideoEngine } from './engine.js';
2
2
  export type { EnginePhase, ReadyDetail, ErrorDetail, LoadingDetail } from './engine.js';
3
+ export type { KeyframeEntry, KeyframeIndex, SubtitleTrackInfo } from './pipeline/types.js';
4
+ export type { AbortableSource } from './pipeline/source-signal.js';
5
+ export { isAbortableSource, checkAbort } from './pipeline/source-signal.js';
6
+ export { demuxSource } from './pipeline/demux.js';
7
+ export { Source } from 'mediabunny';
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC3F,YAAY,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,5 @@
1
1
  export { PlaysVideoEngine } from './engine.js';
2
+ export { isAbortableSource, checkAbort } from './pipeline/source-signal.js';
3
+ export { demuxSource } from './pipeline/demux.js';
4
+ export { Source } from 'mediabunny';
2
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
@@ -50,8 +50,8 @@ export function createBrowserProber() {
50
50
  },
51
51
  };
52
52
  }
53
- /** Conservative static whitelist for Node.js / tests. Matches prior behavior. */
54
- const NODE_SAFE_AUDIO = new Set(['aac', 'mp3']);
53
+ /** Conservative static whitelist for Node.js / tests. Only AAC is universally safe in fMP4. */
54
+ const NODE_SAFE_AUDIO = new Set(['aac']);
55
55
  const NODE_SAFE_VIDEO = new Set(['avc', 'hevc']);
56
56
  export function createNodeProber() {
57
57
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"codec-probe.js","sourceRoot":"","sources":["../../src/pipeline/codec-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,aAAa;IAClB,IAAI,EAAE,iBAAiB;IACvB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,eAAe;CACrB,CAAC;AASF;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEzC,SAAS,WAAW,CAAC,IAAY;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,YAAY,CAAC,UAAU,EAAE,eAAe;YACtC,MAAM,QAAQ,GAAG,eAAe,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,WAAW,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,YAAY,CAAC,UAAU,EAAE,eAAe;YACtC,MAAM,QAAQ,GAAG,eAAe,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,WAAW,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAChD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjD,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,YAAY,CAAC,UAAU;YACrB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,YAAY,CAAC,UAAU;YACrB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CACjC,MAAmB,EACnB,UAAkB,EAClB,eAAwB;IAExB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"codec-probe.js","sourceRoot":"","sources":["../../src/pipeline/codec-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,aAAa;IAClB,IAAI,EAAE,iBAAiB;IACvB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,eAAe;CACrB,CAAC;AASF;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEzC,SAAS,WAAW,CAAC,IAAY;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,YAAY,CAAC,UAAU,EAAE,eAAe;YACtC,MAAM,QAAQ,GAAG,eAAe,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,WAAW,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,YAAY,CAAC,UAAU,EAAE,eAAe;YACtC,MAAM,QAAQ,GAAG,eAAe,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5B,OAAO,WAAW,CAAC,sBAAsB,QAAQ,GAAG,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEjD,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,YAAY,CAAC,UAAU;YACrB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,YAAY,CAAC,UAAU;YACrB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CACjC,MAAmB,EACnB,UAAkB,EAClB,eAAwB;IAExB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type EncodedPacket, EncodedPacketSink, Input, type InputAudioTrack, type InputVideoTrack } from 'mediabunny';
1
+ import { type EncodedPacket, EncodedPacketSink, Input, type InputAudioTrack, type InputVideoTrack, type Source } from 'mediabunny';
2
2
  import type { KeyframeIndex, SubtitleTrackInfo } from './types.js';
3
3
  export interface DemuxResult {
4
4
  input: Input;
@@ -16,6 +16,8 @@ export interface DemuxResult {
16
16
  }
17
17
  export declare function demuxFile(filePath: string): Promise<DemuxResult>;
18
18
  export declare function demuxBlob(blob: Blob): Promise<DemuxResult>;
19
+ export declare function demuxUrl(url: string): Promise<DemuxResult>;
20
+ export declare function demuxSource(source: Source): Promise<DemuxResult>;
19
21
  export declare function getKeyframeIndex(videoSink: EncodedPacketSink, duration: number): Promise<KeyframeIndex>;
20
22
  export declare function collectPacketsInRange(sink: EncodedPacketSink, startSec: number, endSec: number, opts?: {
21
23
  startFromKeyframe?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"demux.d.ts","sourceRoot":"","sources":["../../src/pipeline/demux.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,iBAAiB,EAEjB,KAAK,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAiB,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAEtE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAEhE;AAqDD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAiBxB;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,aAAa,EAAE,CAAC,CA0B1B"}
1
+ {"version":3,"file":"demux.d.ts","sourceRoot":"","sources":["../../src/pipeline/demux.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,iBAAiB,EAEjB,KAAK,EACL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAiB,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAEtE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAEhE;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAEhE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAEtE;AAqDD,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAuBxB;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,aAAa,EAAE,CAAC,CA0B1B"}
@@ -1,4 +1,4 @@
1
- import { ALL_FORMATS, BlobSource, EncodedPacketSink, FilePathSource, Input, } from 'mediabunny';
1
+ import { ALL_FORMATS, BlobSource, EncodedPacketSink, FilePathSource, Input, UrlSource, } from 'mediabunny';
2
2
  import { getSubtitleTrackInfos } from './subtitle.js';
3
3
  export async function demuxFile(filePath) {
4
4
  return demuxInput(new Input({ formats: ALL_FORMATS, source: new FilePathSource(filePath) }));
@@ -6,6 +6,12 @@ export async function demuxFile(filePath) {
6
6
  export async function demuxBlob(blob) {
7
7
  return demuxInput(new Input({ formats: ALL_FORMATS, source: new BlobSource(blob) }));
8
8
  }
9
+ export async function demuxUrl(url) {
10
+ return demuxInput(new Input({ formats: ALL_FORMATS, source: new UrlSource(url) }));
11
+ }
12
+ export async function demuxSource(source) {
13
+ return demuxInput(new Input({ formats: ALL_FORMATS, source }));
14
+ }
9
15
  async function demuxInput(input) {
10
16
  const videoTrack = await input.getPrimaryVideoTrack();
11
17
  if (!videoTrack) {
@@ -51,7 +57,14 @@ async function demuxInput(input) {
51
57
  }
52
58
  export async function getKeyframeIndex(videoSink, duration) {
53
59
  const keyframes = [];
60
+ // getKeyPacket(0) returns null if the first keyframe has PTS > 0 (non-zero
61
+ // initial offset). Fall back to getFirstPacket() which always works.
54
62
  let packet = await videoSink.getKeyPacket(0, { metadataOnly: true });
63
+ if (!packet) {
64
+ const first = await videoSink.getFirstPacket();
65
+ if (first?.type === 'key')
66
+ packet = first;
67
+ }
55
68
  while (packet) {
56
69
  const ts = packet.timestamp;
57
70
  if (Number.isFinite(ts) && ts >= 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"demux.js","sourceRoot":"","sources":["../../src/pipeline/demux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"demux.js","sourceRoot":"","sources":["../../src/pipeline/demux.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mux.d.ts","sourceRoot":"","sources":["../../src/pipeline/mux.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAKnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAaD,wBAAsB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAuDnE"}
1
+ {"version":3,"file":"mux.d.ts","sourceRoot":"","sources":["../../src/pipeline/mux.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAMnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAaD,wBAAsB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAuDnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"mux.js","sourceRoot":"","sources":["../../src/pipeline/mux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mux.js","sourceRoot":"","sources":["../../src/pipeline/mux.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { EncodedPacketSink } from 'mediabunny';
2
+ import type { FfmpegRunner, PlannedSegment } from './types.js';
3
+ export interface SegmentProcessorConfig {
4
+ videoSink: EncodedPacketSink;
5
+ audioSink: EncodedPacketSink | null;
6
+ videoCodec: string;
7
+ audioCodec: string | null;
8
+ videoDecoderConfig: VideoDecoderConfig;
9
+ audioDecoderConfig: AudioDecoderConfig | null;
10
+ plan: PlannedSegment[];
11
+ doTranscode: boolean;
12
+ ffmpeg: FfmpegRunner;
13
+ sourceCodec?: string;
14
+ log?: (msg: string) => void;
15
+ }
16
+ export interface SegmentProcessorResult {
17
+ mediaData: Uint8Array;
18
+ initSegment: Uint8Array | null;
19
+ /** Updated audioDecoderConfig if transcode changed it */
20
+ audioDecoderConfig: AudioDecoderConfig | null;
21
+ }
22
+ /**
23
+ * Processes a single segment through the pipeline: collect packets → transcode → mux.
24
+ *
25
+ * Accepts an AbortSignal and checks it between stages. If aborted, throws AbortError.
26
+ * Does NOT modify any shared mutable state — returns all results.
27
+ */
28
+ export declare function processSegmentWithAbort(config: SegmentProcessorConfig, index: number, signal?: AbortSignal): Promise<SegmentProcessorResult>;
29
+ //# sourceMappingURL=segment-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-processor.d.ts","sourceRoot":"","sources":["../../src/pipeline/segment-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,yDAAyD;IACzD,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC/C;AAMD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,sBAAsB,CAAC,CA8EjC"}
@@ -0,0 +1,81 @@
1
+ import { transcodeAudioSegment } from './audio-transcode.js';
2
+ import { collectPacketsInRange } from './demux.js';
3
+ import { muxToFmp4 } from './mux.js';
4
+ import { checkAbort } from './source-signal.js';
5
+ function elapsed(start) {
6
+ return `${(performance.now() - start).toFixed(1)}ms`;
7
+ }
8
+ /**
9
+ * Processes a single segment through the pipeline: collect packets → transcode → mux.
10
+ *
11
+ * Accepts an AbortSignal and checks it between stages. If aborted, throws AbortError.
12
+ * Does NOT modify any shared mutable state — returns all results.
13
+ */
14
+ export async function processSegmentWithAbort(config, index, signal) {
15
+ const log = config.log ?? (() => { });
16
+ const seg = config.plan[index];
17
+ if (!seg)
18
+ throw new Error(`Invalid segment index: ${index}`);
19
+ const endSec = seg.startSec + seg.durationSec;
20
+ log(`seg ${index} start range=[${seg.startSec.toFixed(2)},${endSec.toFixed(2)})`);
21
+ checkAbort(signal);
22
+ // Stage 1: Collect video packets
23
+ const tVid = performance.now();
24
+ const videoPackets = await collectPacketsInRange(config.videoSink, seg.startSec, endSec, {
25
+ startFromKeyframe: true,
26
+ });
27
+ log(`seg ${index} video-collect ${elapsed(tVid)} pkts=${videoPackets.length}`);
28
+ checkAbort(signal);
29
+ // Stage 2: Collect audio packets
30
+ const tAud = performance.now();
31
+ let audioPackets = config.audioSink
32
+ ? await collectPacketsInRange(config.audioSink, seg.startSec, endSec)
33
+ : [];
34
+ log(`seg ${index} audio-collect ${elapsed(tAud)} pkts=${audioPackets.length}`);
35
+ checkAbort(signal);
36
+ // Stage 3: Transcode audio if needed (slow — ffmpeg.wasm)
37
+ let audioDecoderConfig = config.audioDecoderConfig;
38
+ if (config.doTranscode && audioPackets.length > 0) {
39
+ const sampleRate = config.audioDecoderConfig?.sampleRate ?? 48000;
40
+ const transcoded = await transcodeAudioSegment({
41
+ packets: audioPackets,
42
+ sampleRate,
43
+ audioStartSec: audioPackets[0].timestamp,
44
+ ffmpeg: config.ffmpeg,
45
+ sourceCodec: config.sourceCodec,
46
+ });
47
+ const m = transcoded.metrics;
48
+ const speed = m.ffmpegSpeed !== null ? ` speed=${m.ffmpegSpeed}x` : '';
49
+ log(`seg ${index} transcode ${m.totalMs.toFixed(1)}ms audio=${m.audioDurationSec.toFixed(2)}s ratio=${m.realtimeRatio.toFixed(4)}x ffmpeg=${m.ffmpegMs.toFixed(1)}ms${speed}`);
50
+ audioPackets = transcoded.packets;
51
+ if (!audioDecoderConfig || audioDecoderConfig.codec !== 'mp4a.40.2') {
52
+ audioDecoderConfig = transcoded.decoderConfig;
53
+ }
54
+ }
55
+ checkAbort(signal);
56
+ // Stage 4: Mux to fMP4 (fast)
57
+ const tMux = performance.now();
58
+ const muxResult = await muxToFmp4({
59
+ videoPackets,
60
+ audioPackets,
61
+ videoCodec: config.videoCodec,
62
+ audioCodec: config.doTranscode ? 'aac' : (config.audioCodec ?? 'aac'),
63
+ videoDecoderConfig: config.videoDecoderConfig,
64
+ audioDecoderConfig,
65
+ });
66
+ log(`seg ${index} mux ${elapsed(tMux)}`);
67
+ // Concatenate media fragments
68
+ const totalLen = muxResult.media.reduce((s, c) => s + c.byteLength, 0);
69
+ const mediaData = new Uint8Array(totalLen);
70
+ let offset = 0;
71
+ for (const chunk of muxResult.media) {
72
+ mediaData.set(chunk, offset);
73
+ offset += chunk.byteLength;
74
+ }
75
+ return {
76
+ mediaData,
77
+ initSegment: muxResult.init,
78
+ audioDecoderConfig,
79
+ };
80
+ }
81
+ //# sourceMappingURL=segment-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-processor.js","sourceRoot":"","sources":["../../src/pipeline/segment-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Interface for Sources that support per-segment abort signals.
3
+ *
4
+ * The pipeline sets a signal before each segment via setCurrentSignal().
5
+ * Sources that implement this can use it to cancel in-flight async reads
6
+ * (e.g., abort torrent piece downloads on seek).
7
+ *
8
+ * mediabunny's Source._read(start, end) doesn't pass AbortSignal,
9
+ * so this is the mechanism for threading abort to external Sources.
10
+ */
11
+ export interface AbortableSource {
12
+ setCurrentSignal(signal: AbortSignal | null): void;
13
+ }
14
+ export declare function isAbortableSource(source: unknown): source is AbortableSource;
15
+ /**
16
+ * Throws AbortError if the signal has been aborted.
17
+ * Call between pipeline stages to bail out early.
18
+ */
19
+ export declare function checkAbort(signal?: AbortSignal): void;
20
+ //# sourceMappingURL=source-signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-signal.d.ts","sourceRoot":"","sources":["../../src/pipeline/source-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;CACpD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,eAAe,CAM5E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAIrD"}
@@ -0,0 +1,15 @@
1
+ export function isAbortableSource(source) {
2
+ return (source !== null &&
3
+ typeof source === 'object' &&
4
+ typeof source.setCurrentSignal === 'function');
5
+ }
6
+ /**
7
+ * Throws AbortError if the signal has been aborted.
8
+ * Call between pipeline stages to bail out early.
9
+ */
10
+ export function checkAbort(signal) {
11
+ if (signal?.aborted) {
12
+ throw new DOMException('Segment processing aborted', 'AbortError');
13
+ }
14
+ }
15
+ //# sourceMappingURL=source-signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-signal.js","sourceRoot":"","sources":["../../src/pipeline/source-signal.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,OAAO,CACL,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAQ,MAA0B,CAAC,gBAAgB,KAAK,UAAU,CACnE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "playsvideo",
3
- "version": "0.0.1",
3
+ "version": "0.0.9",
4
4
  "description": "Play any video file in the browser — client-side remuxing and audio transcode, no server required.",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/kzahel/playsvideo"
9
+ },
6
10
  "type": "module",
7
11
  "main": "dist/index.js",
8
12
  "types": "dist/index.d.ts",
@@ -19,6 +23,7 @@
19
23
  "dev": "vite",
20
24
  "build": "vite build",
21
25
  "build:lib": "rm -rf dist && tsc -p tsconfig.lib.json",
26
+ "build:extension": "vite build --config vite.config.extension.ts",
22
27
  "test": "vitest run",
23
28
  "test:unit": "vitest run tests/unit",
24
29
  "test:integration": "vitest run tests/integration",
@@ -30,11 +35,11 @@
30
35
  "lint": "biome lint .",
31
36
  "check": "biome check --write .",
32
37
  "download:ffmpeg-core": "node scripts/download-ffmpeg-core.mjs",
33
- "setup": "npm install && npm run download:ffmpeg-core",
38
+ "setup": "pnpm install && pnpm run download:ffmpeg-core",
34
39
  "deploy:worker": "cd worker && npx wrangler deploy",
35
- "deploy:site": "npm run build && bash scripts/deploy.sh",
36
- "deploy": "npm run deploy:site && npm run deploy:worker",
37
- "prepublishOnly": "npm run build:lib"
40
+ "deploy:site": "pnpm run build && pnpm --filter app build && bash scripts/deploy.sh",
41
+ "deploy": "pnpm run deploy:site && pnpm run deploy:worker",
42
+ "prepublishOnly": "pnpm run build:lib"
38
43
  },
39
44
  "dependencies": {
40
45
  "@ffmpeg/ffmpeg": "^0.12.15",