libbitsub 1.9.0 → 1.10.1

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.
Files changed (42) hide show
  1. package/README.md +192 -8
  2. package/dist/index.d.ts +2 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/ts/diagnostics.d.ts +35 -0
  7. package/dist/ts/diagnostics.d.ts.map +1 -0
  8. package/dist/ts/diagnostics.js +102 -0
  9. package/dist/ts/diagnostics.js.map +1 -0
  10. package/dist/ts/frame-export.d.ts +6 -0
  11. package/dist/ts/frame-export.d.ts.map +1 -0
  12. package/dist/ts/frame-export.js +235 -0
  13. package/dist/ts/frame-export.js.map +1 -0
  14. package/dist/ts/parsers.d.ts +44 -4
  15. package/dist/ts/parsers.d.ts.map +1 -1
  16. package/dist/ts/parsers.js +269 -56
  17. package/dist/ts/parsers.js.map +1 -1
  18. package/dist/ts/renderers.d.ts +21 -2
  19. package/dist/ts/renderers.d.ts.map +1 -1
  20. package/dist/ts/renderers.js +150 -27
  21. package/dist/ts/renderers.js.map +1 -1
  22. package/dist/ts/types.d.ts +110 -1
  23. package/dist/ts/types.d.ts.map +1 -1
  24. package/dist/ts/utils.d.ts +1 -1
  25. package/dist/ts/utils.d.ts.map +1 -1
  26. package/dist/ts/utils.js +8 -1
  27. package/dist/ts/utils.js.map +1 -1
  28. package/dist/ts/worker.d.ts.map +1 -1
  29. package/dist/ts/worker.js +6 -4
  30. package/dist/ts/worker.js.map +1 -1
  31. package/dist/wrapper.d.ts +4 -2
  32. package/dist/wrapper.d.ts.map +1 -1
  33. package/dist/wrapper.js +4 -1
  34. package/dist/wrapper.js.map +1 -1
  35. package/package.json +9 -5
  36. package/pkg/README.md +192 -8
  37. package/pkg/libbitsub.d.ts +12 -220
  38. package/pkg/libbitsub.js +65 -118
  39. package/pkg/libbitsub_bg.wasm +0 -0
  40. package/pkg/libbitsub_bg.wasm.d.ts +7 -4
  41. package/pkg/package.json +2 -2
  42. package/src/wrapper.ts +20 -1
package/README.md CHANGED
@@ -13,8 +13,10 @@ Started as a fork of Arcus92's [libpgs-js](https://github.com/Arcus92/libpgs-js)
13
13
  - Worker-backed parsing/rendering for large subtitle files
14
14
  - Rich layout controls: scale, aspect mode, horizontal/vertical offsets, alignment, bottom padding, safe area, opacity
15
15
  - Cue metadata and parser introspection APIs
16
+ - Rendered-frame export helpers for ImageData, ImageBitmap, Blob, and custom canvas targets
16
17
  - Frame prefetching and cache control for high-level renderers
17
18
  - Automatic format detection and unified loading helpers
19
+ - First-class diagnostics with structured error codes, warning hooks, and render/cache snapshots
18
20
  - TypeScript support with exported event and metadata types
19
21
 
20
22
  ## Showcase
@@ -33,6 +35,22 @@ https://a.rafasu.com/v
33
35
 
34
36
  ## Installation
35
37
 
38
+ For pure Rust parser/rendering logic:
39
+
40
+ ```toml
41
+ [dependencies]
42
+ libbitsub-core = "1.10.0"
43
+ ```
44
+
45
+ For WASM bindings from Rust:
46
+
47
+ ```toml
48
+ [dependencies]
49
+ libbitsub = "1.10.0"
50
+ ```
51
+
52
+ For JavaScript package managers:
53
+
36
54
  ```bash
37
55
  npm install libbitsub
38
56
  # or
@@ -104,6 +122,7 @@ import { PgsRenderer } from 'libbitsub'
104
122
  const renderer = new PgsRenderer({
105
123
  video: videoElement,
106
124
  subUrl: '/subtitles/movie.sup',
125
+ debug: true,
107
126
  displaySettings: {
108
127
  scale: 1.1,
109
128
  aspectMode: 'stretch',
@@ -112,6 +131,9 @@ const renderer = new PgsRenderer({
112
131
  },
113
132
  cacheLimit: 32,
114
133
  prefetchWindow: { before: 1, after: 2 },
134
+ onWarning: (warning) => {
135
+ console.warn(warning.code, warning.message, warning.details)
136
+ },
115
137
  onEvent: (event) => {
116
138
  if (event.type === 'worker-state') {
117
139
  console.log('worker', event.ready ? 'ready' : 'starting', event.sessionId)
@@ -204,12 +226,15 @@ High-level renderers expose parser and cue metadata:
204
226
  const metadata = renderer.getMetadata()
205
227
  const currentCue = renderer.getCurrentCueMetadata()
206
228
  const cue42 = renderer.getCueMetadata(42)
229
+ const stats = renderer.getStats()
230
+ const cache = renderer.getCacheStats()
231
+ const lastRender = renderer.getLastRenderInfo()
207
232
  ```
208
233
 
209
234
  Low-level parsers expose the same model:
210
235
 
211
236
  ```ts
212
- import { PgsParser, UnifiedSubtitleParser, VobSubParserLowLevel } from 'libbitsub'
237
+ import { PgsParser, UnifiedSubtitleParser, VobSubParserLowLevel, openSubtitles } from 'libbitsub'
213
238
 
214
239
  const vob = new VobSubParserLowLevel()
215
240
  vob.loadFromMks(new Uint8Array(mksBuffer))
@@ -217,9 +242,13 @@ vob.loadFromMks(new Uint8Array(mksBuffer))
217
242
  const parser = new UnifiedSubtitleParser()
218
243
  const detected = parser.loadAuto({ data: subtitleBytes, fileName: 'track.mks' })
219
244
 
245
+ const opened = await openSubtitles({ data: subtitleBytes, fileName: 'track.mks' })
246
+
220
247
  console.log(detected)
221
248
  console.log(parser.getMetadata())
222
249
  console.log(parser.getCueMetadata(0))
250
+ console.log(opened.format)
251
+ opened.dispose()
223
252
  ```
224
253
 
225
254
  Metadata includes:
@@ -230,6 +259,134 @@ Metadata includes:
230
259
  - PGS composition count, palette ID, composition state
231
260
  - VobSub language, track ID, IDX metadata presence, file position where available
232
261
 
262
+ ## One-shot auto API
263
+
264
+ If you do not care whether the input is PGS or VobSub and only want one stable low-level surface, use `openSubtitles()`.
265
+
266
+ ```ts
267
+ import { openSubtitles } from 'libbitsub'
268
+
269
+ const subtitles = await openSubtitles({
270
+ data: subtitleBytes,
271
+ fileName: 'track.sup'
272
+ })
273
+
274
+ console.log(subtitles.format)
275
+ console.log(subtitles.metadata)
276
+ console.log(subtitles.timestamps)
277
+
278
+ const frame = subtitles.renderAtTimestamp(120.5)
279
+ const rendered = subtitles.renderFrameDataAtTimestamp(120.5)
280
+ const cue = subtitles.getCueMetadata(0)
281
+
282
+ subtitles.dispose()
283
+ ```
284
+
285
+ `openSubtitles()` initializes WASM for you, auto-detects the format, loads the subtitle source, and returns a normalized handle with snapshot properties plus shared low-level helpers such as `renderAtIndex()`, `renderAtTimestamp()`, `renderFrameDataAtIndex()`, `renderFrameDataAtTimestamp()`, `getCueMetadata()`, `getLastRenderIssue()`, `clearCache()`, and `dispose()`.
286
+
287
+ Like `UnifiedSubtitleParser.loadAuto()`, this is a low-level in-memory API: pass binary subtitle content via `data` or `subData`, and optionally include `fileName`, `idxContent`, `idxUrl`, or `subUrl` as format hints or companion metadata.
288
+
289
+ ## Frame export helpers
290
+
291
+ Low-level parser output can be flattened into a single exportable frame for previews, editors, snapshots, fixture generation, or visual diffing.
292
+
293
+ ```ts
294
+ import {
295
+ PgsParser,
296
+ initWasm,
297
+ renderFrameData,
298
+ toBlob,
299
+ toCanvas,
300
+ toImageBitmap
301
+ } from 'libbitsub'
302
+
303
+ await initWasm()
304
+
305
+ const parser = new PgsParser()
306
+ parser.load(new Uint8Array(arrayBuffer))
307
+
308
+ const subtitleFrame = parser.renderAtTimestamp(120.5)
309
+ const rendered = subtitleFrame ? renderFrameData(subtitleFrame, { crop: 'bounds' }) : null
310
+
311
+ if (rendered) {
312
+ const canvas = toCanvas(rendered)
313
+ const bitmap = await toImageBitmap(rendered)
314
+ const pngBlob = await toBlob(rendered)
315
+
316
+ console.log({
317
+ width: rendered.imageData.width,
318
+ height: rendered.imageData.height,
319
+ offsetX: rendered.offsetX,
320
+ offsetY: rendered.offsetY,
321
+ bounds: rendered.bounds,
322
+ canvas,
323
+ bitmap,
324
+ pngBlob
325
+ })
326
+ }
327
+ ```
328
+
329
+ Parser convenience methods avoid the extra `renderAtTimestamp()` step:
330
+
331
+ ```ts
332
+ const rendered = parser.renderFrameDataAtTimestamp(120.5)
333
+ const fullScreenFrame = parser.renderFrameDataAtIndex(42, { crop: 'screen' })
334
+ ```
335
+
336
+ Cropping modes:
337
+
338
+ - `bounds` is the default. It returns a tightly cropped composed image and records where that image belongs in the original subtitle presentation area via `offsetX` and `offsetY`.
339
+ - `screen` preserves the full subtitle presentation dimensions, which is useful when you need stable frame sizes for test fixtures or when drawing into a presentation-sized surface.
340
+
341
+ Drawing behavior:
342
+
343
+ - `toCanvas(frame)` creates a new canvas sized to the rendered export.
344
+ - Passing an existing canvas target resizes it by default before drawing.
345
+ - Passing an existing 2D context draws in place by default, which is useful when you want subtitles composited into your own pre-sized surface.
346
+
347
+ ## Diagnostics mode
348
+
349
+ Enable `debug: true` on high-level renderers when you need richer field diagnostics for malformed subtitle files. In debug mode, libbitsub records the most recent render attempt and emits structured warnings in addition to the existing lifecycle events.
350
+
351
+ ```ts
352
+ import { PgsRenderer, SubtitleDiagnosticError } from 'libbitsub'
353
+
354
+ const renderer = new PgsRenderer({
355
+ video: videoElement,
356
+ subUrl: '/subtitles/movie.sup',
357
+ debug: true,
358
+ onWarning: (warning) => {
359
+ console.warn('[warning]', warning.code, warning.message, warning.details)
360
+ },
361
+ onError: (error) => {
362
+ if (error instanceof SubtitleDiagnosticError) {
363
+ console.error('[error]', error.code, error.message, error.details)
364
+ return
365
+ }
366
+
367
+ console.error(error)
368
+ }
369
+ })
370
+
371
+ console.log(renderer.getStats())
372
+ console.log(renderer.getCacheStats())
373
+ console.log(renderer.getLastRenderInfo())
374
+ ```
375
+
376
+ Structured diagnostic error codes currently include:
377
+
378
+ - `UNSUPPORTED_FORMAT`
379
+ - `BAD_IDX`
380
+ - `MISSING_PALETTE`
381
+ - `TRACK_NOT_FOUND`
382
+ - `MISSING_INPUT`
383
+ - `FETCH_FAILED`
384
+ - `INVALID_SUBTITLE_DATA`
385
+ - `WORKER_FALLBACK`
386
+ - `UNKNOWN`
387
+
388
+ Warnings use a smaller code set focused on non-fatal conditions such as malformed bitmap buffers, worker fallback, and missing PGS palettes during render.
389
+
233
390
  ## MKS security and corruption checks
234
391
 
235
392
  The `.mks` path validates Matroska structure before handing payloads to the VobSub decoder. Embedded subtitle blocks are size-checked, compressed blocks use bounded zlib inflation, and extracted SPU packets are rejected if their declared payload lengths or control offsets are inconsistent. Malformed or oversized `.mks` payloads fail fast instead of being partially decoded.
@@ -260,6 +417,7 @@ const renderer = new PgsRenderer({
260
417
  case 'loading':
261
418
  case 'loaded':
262
419
  case 'error':
420
+ case 'warning':
263
421
  case 'renderer-change':
264
422
  case 'worker-state':
265
423
  case 'cache-change':
@@ -328,7 +486,8 @@ Emitted events:
328
486
  | --- | --- |
329
487
  | `loading` | subtitle format |
330
488
  | `loaded` | subtitle format and parser metadata |
331
- | `error` | subtitle format and `Error` |
489
+ | `error` | subtitle format and `SubtitleDiagnosticErrorLike` |
490
+ | `warning` | `SubtitleDiagnosticWarning` |
332
491
  | `renderer-change` | active backend: `webgpu`, `webgl2`, or `canvas2d` |
333
492
  | `worker-state` | whether worker mode is enabled, ready, fallback status, and the active session ID |
334
493
  | `cache-change` | cached frame count, pending renders, and configured cache limit |
@@ -356,6 +515,8 @@ const stats = renderer.getStats()
356
515
  - `totalEntries`
357
516
  - `currentIndex`
358
517
 
518
+ `getCacheStats()` adds worker/session state for the current renderer cache, while `getLastRenderInfo()` exposes the most recent render outcome with a status of `rendered`, `cleared`, `pending`, `empty`, or `failed`.
519
+
359
520
  ## Low-level APIs
360
521
 
361
522
  ### PGS parser
@@ -368,7 +529,9 @@ parser.load(new Uint8Array(arrayBuffer))
368
529
 
369
530
  const timestamps = parser.getTimestamps()
370
531
  const frame = parser.renderAtIndex(0)
532
+ const rendered = parser.renderFrameDataAtTimestamp(120.5)
371
533
  const metadata = parser.getMetadata()
534
+ const lastIssue = parser.getLastRenderIssue()
372
535
  ```
373
536
 
374
537
  ### VobSub parser
@@ -381,7 +544,9 @@ parser.loadFromData(idxContent, new Uint8Array(subArrayBuffer))
381
544
  parser.setDebandEnabled(true)
382
545
 
383
546
  const frame = parser.renderAtTimestamp(120.5)
547
+ const rendered = parser.renderFrameDataAtIndex(0, { crop: 'screen' })
384
548
  const cue = parser.getCueMetadata(0)
549
+ const lastIssue = parser.getLastRenderIssue()
385
550
  ```
386
551
 
387
552
  ### Unified parser
@@ -391,7 +556,10 @@ import { UnifiedSubtitleParser, detectSubtitleFormat } from 'libbitsub'
391
556
 
392
557
  const format = detectSubtitleFormat({ data: subtitleBytes, fileName: 'track.sup' })
393
558
 
394
- const parser = new UnifiedSubtitleParser()
559
+ const parser = new UnifiedSubtitleParser({
560
+ debug: true,
561
+ onWarning: (warning) => console.warn(warning.code, warning.message)
562
+ })
395
563
  parser.loadAuto({ data: subtitleBytes, fileName: 'track.sup' })
396
564
  ```
397
565
 
@@ -404,19 +572,20 @@ libbitsub prefers:
404
572
  3. Canvas2D
405
573
 
406
574
  ```ts
407
- import { isWebGL2Supported, isWebGPUSupported } from 'libbitsub'
575
+ import { isWebGPUSupported } from 'libbitsub'
408
576
 
409
577
  console.log({
410
- webgpu: isWebGPUSupported(),
411
- webgl2: isWebGL2Supported()
578
+ webgpu: isWebGPUSupported()
412
579
  })
413
580
  ```
414
581
 
582
+ WebGL2 and Canvas2D fallback remain automatic. Use `onWebGPUFallback`, `onWebGL2Fallback`, `onEvent`, or `onWarning` if you need to observe backend changes.
583
+
415
584
  ## Notes
416
585
 
417
586
  - Worker mode is shared, but subtitle parser state is isolated per renderer session.
418
587
  - Multiple subtitle renderers can coexist without reusing the same parser instance.
419
- - If worker startup fails, the high-level API falls back to main-thread parsing.
588
+ - If worker startup fails, the high-level API falls back to main-thread parsing and emits a `WORKER_FALLBACK` warning/event when diagnostics are being observed.
420
589
  - The library only handles bitmap subtitle formats. It does not parse text subtitle formats such as SRT or ASS.
421
590
 
422
591
  ## API Reference
@@ -428,6 +597,13 @@ console.log({
428
597
  - `isWebGPUSupported(): boolean` checks WebGPU support.
429
598
  - `detectSubtitleFormat(source: AutoSubtitleSource): 'pgs' | 'vobsub' | null` detects the bitmap subtitle format from file hints or binary data.
430
599
  - `createAutoSubtitleRenderer(options: AutoVideoSubtitleOptions): PgsRenderer | VobSubRenderer` creates a high-level renderer after format detection.
600
+ - `openSubtitles(source, options?): Promise<OpenedSubtitles>` initializes WASM, auto-detects the low-level format, and returns a normalized parser handle.
601
+ - `renderFrameData(frame, options?): SubtitleRenderedFrameData | null` composes a `SubtitleData` frame into exportable pixels.
602
+ - `toCanvas(frame, target?, options?): HTMLCanvasElement | OffscreenCanvas` draws a rendered frame to a new or existing canvas/context.
603
+ - `toImageBitmap(frame, options?): Promise<ImageBitmap>` creates an `ImageBitmap` from a subtitle frame export.
604
+ - `toBlob(frame, type?, quality?, options?): Promise<Blob>` encodes a subtitle frame export, defaulting to PNG.
605
+ - `SubtitleDiagnosticError` is the structured error class libbitsub uses for coded diagnostics.
606
+ - `createSubtitleDiagnosticError(...)` and `normalizeSubtitleError(...)` are exported for integrations that want to preserve libbitsub-style error codes.
431
607
  - Legacy aliases remain exported: `PGSRenderer`, `VobsubRenderer`, `UnifiedSubtitleRenderer`.
432
608
 
433
609
  ### High-level renderers
@@ -439,6 +615,8 @@ console.log({
439
615
  - `setDisplaySettings(settings: Partial<SubtitleDisplaySettings>): void` updates layout settings.
440
616
  - `resetDisplaySettings(): void` resets layout settings to defaults.
441
617
  - `getStats(): SubtitleRendererStats` returns render statistics.
618
+ - `getCacheStats(): SubtitleCacheStats` returns cache occupancy, worker readiness, and session ID details.
619
+ - `getLastRenderInfo(): SubtitleLastRenderInfo | null` returns the last render attempt recorded in debug mode.
442
620
  - `getMetadata(): SubtitleParserMetadata | null` returns track-level metadata.
443
621
  - `getCurrentCueMetadata(): SubtitleCueMetadata | null` returns the currently displayed cue metadata.
444
622
  - `getCueMetadata(index: number): SubtitleCueMetadata | null` returns metadata for a specific cue.
@@ -553,7 +731,8 @@ interface SubtitleDisplaySettings {
553
731
  type SubtitleRendererEvent =
554
732
  | { type: 'loading'; format: SubtitleFormatName }
555
733
  | { type: 'loaded'; format: SubtitleFormatName; metadata: SubtitleParserMetadata }
556
- | { type: 'error'; format: SubtitleFormatName; error: Error }
734
+ | { type: 'error'; format: SubtitleFormatName; error: SubtitleDiagnosticErrorLike }
735
+ | { type: 'warning'; warning: SubtitleDiagnosticWarning }
557
736
  | { type: 'renderer-change'; renderer: 'webgpu' | 'webgl2' | 'canvas2d' }
558
737
  | { type: 'worker-state'; enabled: boolean; ready: boolean; sessionId: string | null; fallback?: boolean }
559
738
  | { type: 'cache-change'; cachedFrames: number; pendingRenders: number; cacheLimit: number }
@@ -578,6 +757,11 @@ Both shapes expose:
578
757
  - `totalEntries`
579
758
  - `currentIndex`
580
759
 
760
+ Related diagnostics shapes:
761
+
762
+ - `SubtitleCacheStats` from `getCacheStats()`.
763
+ - `SubtitleLastRenderInfo` from `getLastRenderInfo()` when `debug` is enabled.
764
+
581
765
  #### `SubtitleParserMetadata`
582
766
 
583
767
  ```ts
package/dist/index.d.ts CHANGED
@@ -4,8 +4,8 @@
4
4
  * @packageDocumentation
5
5
  */
6
6
  export { PgsRenderer, VobSubRenderer, createAutoSubtitleRenderer, type VideoSubtitleOptions, type VideoVobSubOptions, type SubtitleRendererStats } from './wrapper';
7
- export { PgsParser, VobSubParserLowLevel, UnifiedSubtitleParser } from './wrapper';
8
- export { initWasm, isWasmInitialized, isWebGPUSupported, detectSubtitleFormat, type AutoSubtitleSource, type AutoVideoSubtitleOptions, type SubtitleAspectMode, type SubtitleCueBounds, type SubtitleCueMetadata, type SubtitleData, type SubtitleCompositionData, type SubtitleDisplaySettings, type SubtitleFormatName, type SubtitleHorizontalAlign, type SubtitleParserMetadata, type SubtitleRendererBackend, type SubtitleRendererEvent, type SubtitleRendererStatsSnapshot } from './wrapper';
7
+ export { PgsParser, VobSubParserLowLevel, UnifiedSubtitleParser, openSubtitles } from './wrapper';
8
+ export { initWasm, isWasmInitialized, isWebGPUSupported, detectSubtitleFormat, renderFrameData, toBlob, toCanvas, toImageBitmap, createSubtitleDiagnosticError, normalizeSubtitleError, SubtitleDiagnosticError, type AutoSubtitleSource, type AutoVideoSubtitleOptions, type OpenedSubtitles, type SubtitleAspectMode, type SubtitleCacheStats, type SubtitleCueBounds, type SubtitleCueMetadata, type SubtitleData, type SubtitleDiagnosticDetailValue, type SubtitleDiagnosticErrorCode, type SubtitleDiagnosticErrorLike, type SubtitleDiagnosticsOptions, type SubtitleDiagnosticWarning, type SubtitleDiagnosticWarningCode, type SubtitleCompositionData, type SubtitleDisplaySettings, type SubtitleFrameCanvasOptions, type SubtitleFrameCanvasTarget, type SubtitleFrameCropMode, type SubtitleFrameRenderOptions, type SubtitleRenderedFrameData, type SubtitleFormatName, type SubtitleHorizontalAlign, type SubtitleLastRenderInfo, type SubtitleParserMetadata, type SubtitleRendererBackend, type SubtitleRendererEvent, type SubtitleRendererStatsSnapshot } from './wrapper';
9
9
  export type { RenderResult, SubtitleFrame, VobSubFrame } from './wrapper';
10
10
  export { PGSRenderer, VobsubRenderer, UnifiedSubtitleRenderer } from './wrapper';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAA;AAGlB,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAGlF,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EACnC,MAAM,WAAW,CAAA;AAGlB,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAGzE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC3B,MAAM,WAAW,CAAA;AAGlB,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGjG,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,aAAa,EACb,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EACnC,MAAM,WAAW,CAAA;AAGlB,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAGzE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -6,9 +6,9 @@
6
6
  // High-level video-integrated renderers (compatible with old libpgs-js API)
7
7
  export { PgsRenderer, VobSubRenderer, createAutoSubtitleRenderer } from './wrapper';
8
8
  // Low-level parsers for programmatic use
9
- export { PgsParser, VobSubParserLowLevel, UnifiedSubtitleParser } from './wrapper';
9
+ export { PgsParser, VobSubParserLowLevel, UnifiedSubtitleParser, openSubtitles } from './wrapper';
10
10
  // Utility exports
11
- export { initWasm, isWasmInitialized, isWebGPUSupported, detectSubtitleFormat } from './wrapper';
11
+ export { initWasm, isWasmInitialized, isWebGPUSupported, detectSubtitleFormat, renderFrameData, toBlob, toCanvas, toImageBitmap, createSubtitleDiagnosticError, normalizeSubtitleError, SubtitleDiagnosticError } from './wrapper';
12
12
  // Legacy aliases
13
13
  export { PGSRenderer, VobsubRenderer, UnifiedSubtitleRenderer } from './wrapper';
14
14
  //# 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;;;;GAIG;AAEH,4EAA4E;AAC5E,OAAO,EACL,WAAW,EACX,cAAc,EACd,0BAA0B,EAI3B,MAAM,WAAW,CAAA;AAElB,yCAAyC;AACzC,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAElF,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EAerB,MAAM,WAAW,CAAA;AAKlB,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,4EAA4E;AAC5E,OAAO,EACL,WAAW,EACX,cAAc,EACd,0BAA0B,EAI3B,MAAM,WAAW,CAAA;AAElB,yCAAyC;AACzC,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEjG,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,aAAa,EACb,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EA6BxB,MAAM,WAAW,CAAA;AAKlB,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,35 @@
1
+ import type { SubtitleDiagnosticDetailValue, SubtitleDiagnosticErrorCode, SubtitleDiagnosticErrorLike, SubtitleDiagnosticWarning, SubtitleDiagnosticWarningCode, SubtitleFormatName } from './types';
2
+ interface SubtitleDiagnosticContext {
3
+ format?: SubtitleFormatName;
4
+ details?: Record<string, SubtitleDiagnosticDetailValue>;
5
+ fallbackCode?: SubtitleDiagnosticErrorCode;
6
+ }
7
+ export declare class SubtitleDiagnosticError extends Error implements SubtitleDiagnosticErrorLike {
8
+ readonly code: SubtitleDiagnosticErrorCode;
9
+ readonly format?: SubtitleFormatName;
10
+ readonly details?: Record<string, SubtitleDiagnosticDetailValue>;
11
+ readonly cause?: unknown;
12
+ constructor(code: SubtitleDiagnosticErrorCode, message: string, options?: {
13
+ format?: SubtitleFormatName;
14
+ details?: Record<string, SubtitleDiagnosticDetailValue>;
15
+ cause?: unknown;
16
+ });
17
+ }
18
+ export declare function createSubtitleDiagnosticError(code: SubtitleDiagnosticErrorCode, message: string, options?: {
19
+ format?: SubtitleFormatName;
20
+ details?: Record<string, SubtitleDiagnosticDetailValue>;
21
+ cause?: unknown;
22
+ }): SubtitleDiagnosticError;
23
+ export declare function normalizeSubtitleError(error: unknown, context?: SubtitleDiagnosticContext): SubtitleDiagnosticError;
24
+ export declare function createSubtitleWarning(code: SubtitleDiagnosticWarningCode, message: string, options?: {
25
+ format?: SubtitleFormatName;
26
+ cueIndex?: number;
27
+ details?: Record<string, SubtitleDiagnosticDetailValue>;
28
+ }): SubtitleDiagnosticWarning;
29
+ export declare function warningFromRenderIssue(renderIssue: string | null | undefined, options?: {
30
+ format?: SubtitleFormatName;
31
+ cueIndex?: number;
32
+ }): SubtitleDiagnosticWarning | null;
33
+ export declare function formatSubtitleWarningForConsole(warning: SubtitleDiagnosticWarning): string;
34
+ export {};
35
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/ts/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,2BAA2B,EAC3B,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAEhB,UAAU,yBAAyB;IACjC,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAA;IACvD,YAAY,CAAC,EAAE,2BAA2B,CAAA;CAC3C;AAED,qBAAa,uBAAwB,SAAQ,KAAM,YAAW,2BAA2B;IACvF,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAA;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAA;IAChE,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAA;IAEjC,YACE,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,kBAAkB,CAAA;QAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAA;QACvD,KAAK,CAAC,EAAE,OAAO,CAAA;KACX,EAQP;CACF;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAA;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;CACX,GACL,uBAAuB,CAEzB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,yBAA8B,GACtC,uBAAuB,CAazB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,6BAA6B,EACnC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAA;CACnD,GACL,yBAAyB,CAQ3B;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CACb,GACL,yBAAyB,GAAG,IAAI,CA4BlC;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM,CAE1F"}
@@ -0,0 +1,102 @@
1
+ export class SubtitleDiagnosticError extends Error {
2
+ code;
3
+ format;
4
+ details;
5
+ cause;
6
+ constructor(code, message, options = {}) {
7
+ super(message);
8
+ this.name = 'SubtitleDiagnosticError';
9
+ this.code = code;
10
+ this.format = options.format;
11
+ this.details = options.details;
12
+ this.cause = options.cause;
13
+ }
14
+ }
15
+ export function createSubtitleDiagnosticError(code, message, options = {}) {
16
+ return new SubtitleDiagnosticError(code, message, options);
17
+ }
18
+ export function normalizeSubtitleError(error, context = {}) {
19
+ if (error instanceof SubtitleDiagnosticError) {
20
+ return error;
21
+ }
22
+ const resolvedError = error instanceof Error ? error : new Error(String(error));
23
+ const code = inferSubtitleDiagnosticErrorCode(resolvedError.message, context.fallbackCode);
24
+ return new SubtitleDiagnosticError(code, resolvedError.message, {
25
+ format: context.format,
26
+ details: context.details,
27
+ cause: error
28
+ });
29
+ }
30
+ export function createSubtitleWarning(code, message, options = {}) {
31
+ return {
32
+ code,
33
+ message,
34
+ format: options.format,
35
+ cueIndex: options.cueIndex,
36
+ details: options.details
37
+ };
38
+ }
39
+ export function warningFromRenderIssue(renderIssue, options = {}) {
40
+ const normalizedIssue = renderIssue?.trim().toUpperCase();
41
+ if (!normalizedIssue)
42
+ return null;
43
+ switch (normalizedIssue) {
44
+ case 'MISSING_PALETTE':
45
+ return createSubtitleWarning('MISSING_PALETTE', 'PGS cue references a palette that was not available at render time.', {
46
+ format: options.format,
47
+ cueIndex: options.cueIndex
48
+ });
49
+ case 'INVALID_PACKET':
50
+ return createSubtitleWarning('INVALID_SUBTITLE_DATA', 'Subtitle packet could not be decoded for the requested cue.', {
51
+ format: options.format,
52
+ cueIndex: options.cueIndex
53
+ });
54
+ case 'RENDER_CONTEXT_UNAVAILABLE':
55
+ return createSubtitleWarning('INVALID_SUBTITLE_DATA', 'Subtitle render context could not be assembled for the requested cue.', {
56
+ format: options.format,
57
+ cueIndex: options.cueIndex
58
+ });
59
+ case 'EMPTY_RENDER':
60
+ return createSubtitleWarning('INVALID_SUBTITLE_DATA', 'Subtitle cue rendered without any visible bitmap data.', {
61
+ format: options.format,
62
+ cueIndex: options.cueIndex
63
+ });
64
+ default:
65
+ return null;
66
+ }
67
+ }
68
+ export function formatSubtitleWarningForConsole(warning) {
69
+ return `[libbitsub:${warning.code}] ${warning.message}`;
70
+ }
71
+ function inferSubtitleDiagnosticErrorCode(message, fallbackCode = 'UNKNOWN') {
72
+ const normalizedMessage = message.toLowerCase();
73
+ if (normalizedMessage.includes('detect subtitle format') || normalizedMessage.includes('unsupported format')) {
74
+ return 'UNSUPPORTED_FORMAT';
75
+ }
76
+ if (normalizedMessage.includes('no s_vobsub track') || normalizedMessage.includes('track not found')) {
77
+ return 'TRACK_NOT_FOUND';
78
+ }
79
+ if (normalizedMessage.includes('idx') ||
80
+ normalizedMessage.includes('codecprivate') ||
81
+ normalizedMessage.includes('filepos')) {
82
+ return 'BAD_IDX';
83
+ }
84
+ if (normalizedMessage.includes('palette')) {
85
+ return 'MISSING_PALETTE';
86
+ }
87
+ if (normalizedMessage.includes('failed to fetch')) {
88
+ return 'FETCH_FAILED';
89
+ }
90
+ if (normalizedMessage.includes('no ') && normalizedMessage.includes('provided')) {
91
+ return 'MISSING_INPUT';
92
+ }
93
+ if (normalizedMessage.includes('invalid') ||
94
+ normalizedMessage.includes('truncated') ||
95
+ normalizedMessage.includes('malformed') ||
96
+ normalizedMessage.includes('subtitle block') ||
97
+ normalizedMessage.includes('payload')) {
98
+ return 'INVALID_SUBTITLE_DATA';
99
+ }
100
+ return fallbackCode;
101
+ }
102
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/ts/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SubtitleData, SubtitleFrameCanvasOptions, SubtitleFrameCanvasTarget, SubtitleFrameRenderOptions, SubtitleRenderedFrameData } from './types';
2
+ export declare function renderFrameData(frame: SubtitleData, options?: SubtitleFrameRenderOptions): SubtitleRenderedFrameData | null;
3
+ export declare function toCanvas(frame: SubtitleData | SubtitleRenderedFrameData, target?: SubtitleFrameCanvasTarget, options?: SubtitleFrameCanvasOptions): HTMLCanvasElement | OffscreenCanvas;
4
+ export declare function toImageBitmap(frame: SubtitleData | SubtitleRenderedFrameData, options?: SubtitleFrameRenderOptions): Promise<ImageBitmap>;
5
+ export declare function toBlob(frame: SubtitleData | SubtitleRenderedFrameData, type?: string, quality?: number, options?: SubtitleFrameRenderOptions): Promise<Blob>;
6
+ //# sourceMappingURL=frame-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-export.d.ts","sourceRoot":"","sources":["../../src/ts/frame-export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAEzB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,SAAS,CAAA;AA4IhB,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,GAAG,IAAI,CAoD/H;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,YAAY,GAAG,yBAAyB,EAC/C,MAAM,CAAC,EAAE,yBAAyB,EAClC,OAAO,GAAE,0BAA+B,GACvC,iBAAiB,GAAG,eAAe,CAyCrC;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,YAAY,GAAG,yBAAyB,EAC/C,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,WAAW,CAAC,CAqBtB;AAED,wBAAsB,MAAM,CAC1B,KAAK,EAAE,YAAY,GAAG,yBAAyB,EAC/C,IAAI,GAAE,MAAoB,EAC1B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAyBf"}