jassub 2.2.7 → 2.3.0

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.
@@ -1,7 +1,7 @@
1
1
  import { finalizer } from 'abslink';
2
- import { WebGL2Renderer } from './webgl-renderer';
3
- import type { ASSEvent, ASSStyle } from '../jassub';
4
- import type { JASSUB } from '../wasm/types.js';
2
+ import { type ASSEvent, type ASSStyle, type WeightValue } from './util.ts';
3
+ import { WebGL2Renderer } from './webgl-renderer.ts';
4
+ import type { JASSUB } from '../wasm/types.d.ts';
5
5
  interface opts {
6
6
  wasmUrl: string;
7
7
  width: number;
@@ -10,11 +10,11 @@ interface opts {
10
10
  subContent: string | null;
11
11
  fonts: Array<string | Uint8Array>;
12
12
  availableFonts: Record<string, Uint8Array | string>;
13
- fallbackFont: string;
13
+ defaultFont: string;
14
14
  debug: boolean;
15
15
  libassMemoryLimit: number;
16
16
  libassGlyphLimit: number;
17
- useLocalFonts: boolean;
17
+ queryFonts: 'local' | 'localandremote' | false;
18
18
  }
19
19
  export declare class ASSRenderer {
20
20
  _offCanvas?: OffscreenCanvas;
@@ -24,34 +24,39 @@ export declare class ASSRenderer {
24
24
  _malloc: (size: number) => number;
25
25
  _gpurender: WebGL2Renderer;
26
26
  debug: boolean;
27
- useLocalFonts: boolean;
28
- _availableFonts: Record<string, Uint8Array | string>;
29
- _fontMap: Record<string, boolean>;
30
- _fontId: number;
31
27
  _ready: Promise<void>;
32
- _getFont: (font: string) => Promise<void>;
33
- constructor(data: opts, getFont: (font: string) => Promise<void>);
28
+ constructor(data: opts, getFont: (font: string, weight: WeightValue) => Promise<Uint8Array<ArrayBuffer> | undefined>);
34
29
  ready(): Promise<void>;
35
- addFont(fontOrURL: Uint8Array | string): void;
36
30
  createEvent(event: ASSEvent): void;
37
31
  getEvents(): Partial<ASSEvent>[];
38
32
  setEvent(event: ASSEvent, index: number): void;
39
33
  removeEvent(index: number): void;
40
- createStyle(style: ASSStyle): import("../wasm/types.js").ASS_Style;
34
+ createStyle(style: ASSStyle): import("../wasm/types.d.ts").ASS_Style;
41
35
  getStyles(): ASSStyle[];
42
36
  setStyle(style: ASSStyle, index: number): void;
43
37
  removeStyle(index: number): void;
44
38
  styleOverride(style: ASSStyle): void;
45
39
  disableStyleOverride(): void;
46
- setDefaultFont(fontName: string): void;
47
40
  setTrack(content: string): void;
48
41
  freeTrack(): void;
49
- setTrackByUrl(url: string): void;
42
+ setTrackByUrl(url: string): Promise<void>;
50
43
  _checkColorSpace(): void;
51
- _findAvailableFonts(font: string): void;
52
- _asyncWrite(font: Uint8Array | string): void;
53
- _allocFont(uint8: Uint8Array): void;
54
- _processAvailableFonts(content: string): void;
44
+ _defaultFont: string;
45
+ setDefaultFont(fontName: string): void;
46
+ _log(log: string): void;
47
+ addFonts(fontOrURLs: Array<Uint8Array | string>): Promise<void>;
48
+ _loadedInitialFonts: boolean;
49
+ _loadInitialFonts(fontOrURLs: Array<Uint8Array | string>): Promise<void>;
50
+ _getFont: (font: string, weight: WeightValue) => Promise<Uint8Array<ArrayBuffer> | undefined>;
51
+ _availableFonts: Record<string, Uint8Array | string>;
52
+ _checkedFonts: Set<string>;
53
+ _findAvailableFont(fontName: string, weight?: WeightValue): Promise<void>;
54
+ queryFonts: false | "local" | "localandremote";
55
+ _queryLocalFont(fontName: string, weight: WeightValue): Promise<Uint8Array<ArrayBuffer> | undefined>;
56
+ _queryRemoteFont(fontName: string, postscriptName: string): Promise<Uint8Array<ArrayBuffer> | undefined>;
57
+ _asyncWrite(font: string): Promise<void>;
58
+ _fontId: number;
59
+ _allocFonts(uint8s: Uint8Array[]): void;
55
60
  _resizeCanvas(width: number, height: number, videoWidth: number, videoHeight: number): void;
56
61
  [finalizer](): Promise<void>;
57
62
  _draw(time: number, repaint?: boolean): void;
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable camelcase */
2
2
  import { finalizer } from 'abslink';
3
3
  import { expose } from 'abslink/w3c';
4
+ import { queryRemoteFonts } from 'lfa-ponyfill';
4
5
  import WASM from '../wasm/jassub-worker.js';
5
- import { libassYCbCrMap, read_, readAsync, _applyKeys } from './util';
6
- import { WebGL2Renderer } from './webgl-renderer';
7
- const IS_FIREFOX = navigator.userAgent.toLowerCase().includes('firefox');
6
+ import { _applyKeys, _fetch, fetchtext, IS_FIREFOX, LIBASS_YCBCR_MAP, WEIGHT_MAP } from "./util.js";
7
+ import { WebGL2Renderer } from "./webgl-renderer.js";
8
8
  export class ASSRenderer {
9
9
  _offCanvas;
10
10
  _wasm;
@@ -13,17 +13,14 @@ export class ASSRenderer {
13
13
  _malloc;
14
14
  _gpurender = new WebGL2Renderer();
15
15
  debug = false;
16
- useLocalFonts = false;
17
- _availableFonts = {};
18
- _fontMap = {};
19
- _fontId = 0;
20
16
  _ready;
21
- _getFont;
22
17
  constructor(data, getFont) {
23
- this._availableFonts = data.availableFonts;
18
+ // remove case sensitivity
19
+ this._availableFonts = Object.fromEntries(Object.entries(data.availableFonts).map(([k, v]) => [k.trim().toLowerCase(), v]));
24
20
  this.debug = data.debug;
25
- this.useLocalFonts = data.useLocalFonts;
21
+ this.queryFonts = data.queryFonts;
26
22
  this._getFont = getFont;
23
+ this._defaultFont = data.defaultFont.trim().toLowerCase();
27
24
  // hack, we want custom WASM URLs
28
25
  const _fetch = globalThis.fetch;
29
26
  globalThis.fetch = _ => _fetch(data.wasmUrl);
@@ -40,22 +37,16 @@ export class ASSRenderer {
40
37
  // const devicePromise = navigator.gpu?.requestAdapter({
41
38
  // powerPreference: 'high-performance'
42
39
  // }).then(adapter => adapter?.requestDevice())
43
- this._ready = WASM({ __url: data.wasmUrl }).then(async (Module) => {
44
- // eslint-disable-next-line @typescript-eslint/unbound-method
45
- this._malloc = Module._malloc;
46
- const fallbackFont = data.fallbackFont.toLowerCase();
47
- this._wasm = new Module.JASSUB(data.width, data.height, fallbackFont);
40
+ // eslint-disable-next-line @typescript-eslint/unbound-method
41
+ this._ready = WASM({ __url: data.wasmUrl, __out: (log) => this._log(log) }).then(async ({ _malloc, JASSUB }) => {
42
+ this._malloc = _malloc;
43
+ this._wasm = new JASSUB(data.width, data.height, this._defaultFont);
48
44
  // Firefox seems to have issues with multithreading in workers
49
- // a worker inside a worker does not recive messages properly
45
+ // a worker inside a worker does not recieve messages properly
50
46
  this._wasm.setThreads(!IS_FIREFOX && self.crossOriginIsolated ? Math.min(Math.max(1, navigator.hardwareConcurrency - 2), 8) : 1);
51
- if (fallbackFont)
52
- this._findAvailableFonts(fallbackFont);
53
- const subContent = data.subContent ?? read_(data.subUrl);
54
- for (const font of data.fonts)
55
- this._asyncWrite(font);
56
- this._wasm.createTrackMem(subContent);
57
- this._processAvailableFonts(subContent);
58
- this._subtitleColorSpace = libassYCbCrMap[this._wasm.trackColorSpace];
47
+ this._loadInitialFonts(data.fonts);
48
+ this._wasm.createTrackMem(data.subContent ?? await fetchtext(data.subUrl));
49
+ this._subtitleColorSpace = LIBASS_YCBCR_MAP[this._wasm.trackColorSpace];
59
50
  if (data.libassMemoryLimit > 0 || data.libassGlyphLimit > 0) {
60
51
  this._wasm.setMemoryLimits(data.libassGlyphLimit || 0, data.libassMemoryLimit || 0);
61
52
  }
@@ -68,9 +59,6 @@ export class ASSRenderer {
68
59
  ready() {
69
60
  return this._ready;
70
61
  }
71
- addFont(fontOrURL) {
72
- this._asyncWrite(fontOrURL);
73
- }
74
62
  createEvent(event) {
75
63
  _applyKeys(event, this._wasm.getEvent(this._wasm.allocEvent()));
76
64
  }
@@ -114,68 +102,122 @@ export class ASSRenderer {
114
102
  disableStyleOverride() {
115
103
  this._wasm.disableStyleOverride();
116
104
  }
117
- setDefaultFont(fontName) {
118
- this._wasm.setDefaultFont(fontName);
119
- }
120
105
  setTrack(content) {
121
106
  this._wasm.createTrackMem(content);
122
- this._processAvailableFonts(content);
123
- this._subtitleColorSpace = libassYCbCrMap[this._wasm.trackColorSpace];
107
+ this._subtitleColorSpace = LIBASS_YCBCR_MAP[this._wasm.trackColorSpace];
124
108
  }
125
109
  freeTrack() {
126
110
  this._wasm.removeTrack();
127
111
  }
128
- setTrackByUrl(url) {
129
- this.setTrack(read_(url));
112
+ async setTrackByUrl(url) {
113
+ this.setTrack(await fetchtext(url));
130
114
  }
131
115
  _checkColorSpace() {
132
116
  if (!this._subtitleColorSpace || !this._videoColorSpace)
133
117
  return;
134
118
  this._gpurender.setColorMatrix(this._subtitleColorSpace, this._videoColorSpace);
135
119
  }
136
- _findAvailableFonts(font) {
137
- font = font.trim().toLowerCase();
138
- if (font[0] === '@')
139
- font = font.substring(1);
140
- if (this._fontMap[font])
141
- return;
142
- this._fontMap[font] = true;
143
- if (!this._availableFonts[font]) {
144
- if (this.useLocalFonts)
145
- this._getFont(font);
120
+ _defaultFont;
121
+ setDefaultFont(fontName) {
122
+ this._defaultFont = fontName.trim().toLowerCase();
123
+ this._wasm.setDefaultFont(this._defaultFont);
124
+ }
125
+ _log(log) {
126
+ console.debug(log);
127
+ const match = log.match(/JASSUB: fontselect: Using default font family: \(([^,]+), (\d{1,4}), \d\)/);
128
+ if (match) {
129
+ this._findAvailableFont(match[1].trim().toLowerCase(), WEIGHT_MAP[parseInt(match[2], 10) / 100 - 1]);
146
130
  }
147
- else {
148
- this._asyncWrite(this._availableFonts[font]);
131
+ else if (log.startsWith('JASSUB: fontselect: failed to find any fallback with glyph 0x0 for font:')) {
132
+ this._findAvailableFont(this._defaultFont);
149
133
  }
150
134
  }
151
- _asyncWrite(font) {
152
- if (typeof font === 'string') {
153
- readAsync(font, fontData => {
154
- this._allocFont(new Uint8Array(fontData));
155
- }, console.error);
156
- }
157
- else {
158
- this._allocFont(font);
135
+ async addFonts(fontOrURLs) {
136
+ if (!fontOrURLs.length)
137
+ return;
138
+ const strings = [];
139
+ const uint8s = [];
140
+ for (const fontOrURL of fontOrURLs) {
141
+ if (typeof fontOrURL === 'string') {
142
+ strings.push(fontOrURL);
143
+ }
144
+ else {
145
+ uint8s.push(fontOrURL);
146
+ }
159
147
  }
148
+ if (uint8s.length)
149
+ this._allocFonts(uint8s);
150
+ // this isn't batched like uint8s because software like jellyfin exists, which loads 50+ fonts over the network which takes time...
151
+ // is connection exhaustion a concern here?
152
+ await Promise.allSettled(strings.map(url => this._asyncWrite(url)));
160
153
  }
161
- // TODO: this should re-draw last frame!
162
- _allocFont(uint8) {
163
- const ptr = this._malloc(uint8.byteLength);
164
- self.HEAPU8RAW.set(uint8, ptr);
165
- this._wasm.addFont('font-' + (this._fontId++), ptr, uint8.byteLength);
166
- this._wasm.reloadFonts();
154
+ // we don't want to run _findAvailableFont before initial fonts are loaded
155
+ // because it could duplicate fonts
156
+ _loadedInitialFonts = false;
157
+ async _loadInitialFonts(fontOrURLs) {
158
+ await this.addFonts(fontOrURLs);
159
+ this._loadedInitialFonts = true;
167
160
  }
168
- _processAvailableFonts(content) {
169
- if (!this._availableFonts)
161
+ _getFont;
162
+ _availableFonts = {};
163
+ _checkedFonts = new Set();
164
+ async _findAvailableFont(fontName, weight) {
165
+ if (!this._loadedInitialFonts)
166
+ return;
167
+ // Roboto Medium, null -> Roboto, Medium
168
+ // Roboto Medium, Medium -> Roboto, Medium
169
+ // Roboto, null -> Roboto, Regular
170
+ // italic is not handled I guess
171
+ for (const _weight of WEIGHT_MAP) {
172
+ // check if fontname has this weight name in it, if yes remove it
173
+ if (fontName.includes(_weight)) {
174
+ fontName = fontName.replace(_weight, '').trim();
175
+ weight ??= _weight;
176
+ break;
177
+ }
178
+ }
179
+ weight ??= 'regular';
180
+ const key = fontName + ' ' + weight;
181
+ if (this._checkedFonts.has(key))
170
182
  return;
171
- for (const { FontName } of this.getStyles()) {
172
- this._findAvailableFonts(FontName);
183
+ this._checkedFonts.add(key);
184
+ try {
185
+ const font = this._availableFonts[key] ?? this._availableFonts[fontName] ?? await this._queryLocalFont(fontName, weight) ?? await this._queryRemoteFont(fontName, key);
186
+ if (font)
187
+ return await this.addFonts([font]);
173
188
  }
174
- const regex = /\\fn([^\\}]*?)[\\}]/g;
175
- let matches;
176
- while ((matches = regex.exec(content)) !== null) {
177
- this._findAvailableFonts(matches[1]);
189
+ catch (e) {
190
+ console.warn('Error querying font', fontName, weight, e);
191
+ }
192
+ }
193
+ queryFonts;
194
+ async _queryLocalFont(fontName, weight) {
195
+ if (!this.queryFonts)
196
+ return;
197
+ return await this._getFont(fontName, weight);
198
+ }
199
+ async _queryRemoteFont(fontName, postscriptName) {
200
+ if (this.queryFonts !== 'localandremote')
201
+ return;
202
+ const fontData = await queryRemoteFonts({ postscriptNames: [postscriptName, fontName] });
203
+ if (!fontData.length)
204
+ return;
205
+ const blob = await fontData[0].blob();
206
+ return new Uint8Array(await blob.arrayBuffer());
207
+ }
208
+ async _asyncWrite(font) {
209
+ const res = await _fetch(font);
210
+ this._allocFonts([new Uint8Array(await res.arrayBuffer())]);
211
+ }
212
+ _fontId = 0;
213
+ _allocFonts(uint8s) {
214
+ // TODO: this should re-draw last frame!
215
+ for (const uint8 of uint8s) {
216
+ const ptr = this._malloc(uint8.byteLength);
217
+ self.HEAPU8RAW.set(uint8, ptr);
218
+ this._wasm.addFont('font-' + (this._fontId++), ptr, uint8.byteLength);
178
219
  }
220
+ this._wasm.reloadFonts();
179
221
  }
180
222
  _resizeCanvas(width, height, videoWidth, videoHeight) {
181
223
  this._wasm.resizeCanvas(width, height, videoWidth, videoHeight);
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jassub",
3
- "version": "2.2.7",
3
+ "version": "2.3.0",
4
4
  "description": "The Fastest JavaScript SSA/ASS Subtitle Renderer For Browsers",
5
5
  "main": "dist/jassub.js",
6
6
  "type": "module",
@@ -9,11 +9,13 @@
9
9
  "dist/worker/*",
10
10
  "dist/jassub.*",
11
11
  "dist/debug.*",
12
+ "dist/default.woff2",
12
13
  "!dist/wasm/jassub-worker-modern.js",
13
14
  "README.md",
14
15
  "LICENSE",
15
16
  "index.d.ts",
16
- "src/**/*.ts"
17
+ "src/**/*.ts",
18
+ "!src/default.woff2"
17
19
  ],
18
20
  "repository": {
19
21
  "type": "git",
@@ -39,6 +41,7 @@
39
41
  "homepage": "https://github.com/ThaUnknown/jassub",
40
42
  "dependencies": {
41
43
  "abslink": "^1.1.6",
44
+ "lfa-ponyfill": "^1.1.0",
42
45
  "rvfc-polyfill": "^1.0.8",
43
46
  "throughput": "^1.0.2"
44
47
  },
package/src/jassub.ts CHANGED
@@ -1,14 +1,18 @@
1
- /* eslint-disable camelcase */
2
1
  import 'rvfc-polyfill'
3
2
 
4
3
  import { proxy, releaseProxy } from 'abslink'
5
4
  import { wrap } from 'abslink/w3c'
6
5
 
7
- import { Debug } from './debug'
6
+ import { Debug } from './debug.ts'
8
7
 
9
- import type { ASS_Event, ASS_Image, ASS_Style, ClassHandle } from './wasm/types'
8
+ import type { WeightValue } from './worker/util.ts'
10
9
  import type { ASSRenderer } from './worker/worker'
11
10
  import type { Remote } from 'abslink'
11
+ import type { queryRemoteFonts } from 'lfa-ponyfill'
12
+
13
+ declare const self: typeof globalThis & {
14
+ queryLocalFonts: (opts?: { postscriptNames?: string[] }) => ReturnType<typeof queryRemoteFonts>
15
+ }
12
16
 
13
17
  const webYCbCrMap = {
14
18
  rgb: 'RGB',
@@ -18,10 +22,6 @@ const webYCbCrMap = {
18
22
  smpte170m: 'BT601'// alias BT.601 NTSC... whats the difference?
19
23
  } as const
20
24
 
21
- export type ASSEvent = Omit<ASS_Event, keyof ClassHandle>
22
- export type ASSStyle = Omit<ASS_Style, keyof ClassHandle>
23
- export type ASSImage = Omit<ASS_Image, keyof ClassHandle>
24
-
25
25
  export type JASSUBOptions = {
26
26
  timeOffset?: number
27
27
  debug?: boolean
@@ -31,12 +31,10 @@ export type JASSUBOptions = {
31
31
  workerUrl?: string
32
32
  wasmUrl?: string
33
33
  modernWasmUrl?: string
34
- subUrl?: string
35
- subContent?: string
36
- fonts?: string[] | Uint8Array[]
34
+ fonts?: Array<string | Uint8Array>
37
35
  availableFonts?: Record<string, Uint8Array | string>
38
- fallbackFont?: string
39
- useLocalFonts?: boolean
36
+ defaultFont?: string
37
+ queryFonts?: 'local' | 'localandremote' | false
40
38
  libassMemoryLimit?: number
41
39
  libassGlyphLimit?: number
42
40
  } & ({
@@ -45,6 +43,12 @@ export type JASSUBOptions = {
45
43
  } | {
46
44
  video?: HTMLVideoElement
47
45
  canvas: HTMLCanvasElement
46
+ }) & ({
47
+ subUrl: string
48
+ subContent?: string
49
+ } | {
50
+ subUrl?: string
51
+ subContent: string
48
52
  })
49
53
 
50
54
  export default class JASSUB {
@@ -111,23 +115,27 @@ export default class JASSUB {
111
115
  const Renderer = wrap<typeof ASSRenderer>(this._worker)
112
116
 
113
117
  const modern = opts.modernWasmUrl ?? new URL('./wasm/jassub-worker-modern.wasm', import.meta.url).href
114
- const fallback = opts.wasmUrl ?? new URL('./wasm/jassub-worker.wasm', import.meta.url).href
118
+ const normal = opts.wasmUrl ?? new URL('./wasm/jassub-worker.wasm', import.meta.url).href
119
+
120
+ const availableFonts = opts.availableFonts ?? {}
121
+ if (!availableFonts['liberation sans'] && !opts.defaultFont) {
122
+ availableFonts['liberation sans'] = new URL('./default.woff2', import.meta.url).href
123
+ }
115
124
 
116
125
  this.ready = (async () => {
117
126
  this.renderer = await new Renderer({
118
- wasmUrl: JASSUB._supportsSIMD ? modern : fallback,
127
+ wasmUrl: JASSUB._supportsSIMD ? modern : normal,
119
128
  width: ctrl.width,
120
129
  height: ctrl.height,
121
130
  subUrl: opts.subUrl,
122
131
  subContent: opts.subContent ?? null,
123
132
  fonts: opts.fonts ?? [],
124
- availableFonts: opts.availableFonts ?? { 'liberation sans': './default.woff2' },
125
- fallbackFont: opts.fallbackFont ?? 'liberation sans',
133
+ availableFonts,
134
+ defaultFont: opts.defaultFont ?? 'liberation sans',
126
135
  debug: !!opts.debug,
127
136
  libassMemoryLimit: opts.libassMemoryLimit ?? 0,
128
137
  libassGlyphLimit: opts.libassGlyphLimit ?? 0,
129
- // @ts-expect-error TS doesn't know about queryLocalFonts
130
- useLocalFonts: typeof queryLocalFonts !== 'undefined' && (opts.useLocalFonts ?? true)
138
+ queryFonts: opts.queryFonts ?? 'local'
131
139
  }, proxy(font => this._getLocalFont(font))) as unknown as Remote<ASSRenderer>
132
140
 
133
141
  await this.renderer.ready()
@@ -174,8 +182,10 @@ export default class JASSUB {
174
182
  this._canvas.style.height = videoSize.height + 'px'
175
183
  }
176
184
 
177
- this._canvas.style.top = top + 'px'
178
- this._canvas.style.left = left + 'px'
185
+ if (this._canvasParent) {
186
+ this._canvas.style.top = top + 'px'
187
+ this._canvas.style.left = left + 'px'
188
+ }
179
189
 
180
190
  await this.renderer._resizeCanvas(
181
191
  width,
@@ -248,36 +258,21 @@ export default class JASSUB {
248
258
  }
249
259
  }
250
260
 
251
- async _sendLocalFont (name: string) {
252
- try {
253
- // @ts-expect-error ts doesnt know
254
- const fontData = await queryLocalFonts()
255
- // @ts-expect-error ts doesnt know
256
- const fonts = fontData?.filter(({ fullName, family }) => fullName.toLowerCase() === name || family.toLowerCase() === name)
257
- for (const font of fonts) {
258
- const blob: Blob = await font.blob()
259
- this.renderer.addFont(new Uint8Array(await blob.arrayBuffer()))
260
- }
261
- } catch (e) {
262
- console.warn('Local fonts API:', e)
261
+ async _getLocalFont (font: string, weight: WeightValue = 'regular') {
262
+ // electron by default has all permissions enabled, and it doesn't have perm query
263
+ // if this happens, just send it
264
+ if (navigator.permissions?.query) {
265
+ const { state } = await navigator.permissions.query({ name: 'local-fonts' as PermissionName })
266
+ if (state !== 'granted') return
263
267
  }
264
- }
265
268
 
266
- async _getLocalFont (font: string) {
267
- try {
268
- // electron by default has all permissions enabled, and it doesn't have perm query
269
- // if this happens, just send it
270
- if (navigator?.permissions?.query) {
271
- // @ts-expect-error TS doesn't know about local-fonts
272
- const permission = await navigator.permissions.query({ name: 'local-fonts' })
273
- if (permission.state === 'granted') {
274
- await this._sendLocalFont(font)
275
- }
276
- } else {
277
- await this._sendLocalFont(font)
269
+ for (const data of await self.queryLocalFonts()) {
270
+ const family = data.family.toLowerCase()
271
+ const style = data.style.toLowerCase()
272
+ if (family === font && style === weight) {
273
+ const blob = await data.blob()
274
+ return new Uint8Array(await blob.arrayBuffer())
278
275
  }
279
- } catch (e) {
280
- console.warn('Local fonts API:', e)
281
276
  }
282
277
  }
283
278
 
@@ -1,35 +1,43 @@
1
- import type { ASSEvent, ASSStyle } from '../jassub'
2
-
3
- export const read_ = (url: string, ab = false) => {
4
- const xhr = new XMLHttpRequest()
5
- xhr.open('GET', url, false)
6
- xhr.responseType = ab ? 'arraybuffer' : 'text'
7
- xhr.send(null)
8
- return xhr.response
9
- }
1
+ /* eslint-disable camelcase */
2
+ import type { ASS_Event, ASS_Image, ASS_Style, ClassHandle } from '../wasm/types.d.ts'
10
3
 
11
- export const readAsync = (url: string, load: (response: ArrayBuffer) => void, err: (error: unknown) => void) => {
12
- const xhr = new XMLHttpRequest()
13
- xhr.open('GET', url, true)
14
- xhr.responseType = 'arraybuffer'
15
- xhr.onload = () => {
16
- if ((xhr.status === 200 || xhr.status === 0) && xhr.response) {
17
- return load(xhr.response)
18
- }
19
- }
20
- xhr.onerror = err
21
- xhr.send(null)
22
- }
4
+ export type ASSEvent = Omit<ASS_Event, keyof ClassHandle>
5
+ export type ASSStyle = Omit<ASS_Style, keyof ClassHandle>
6
+ export type ASSImage = Omit<ASS_Image, keyof ClassHandle>
7
+
8
+ // offset by 1, 0 = 1, to match CSS font-weight values, but dividing by 100 gives the correct index
9
+ export const WEIGHT_MAP = [
10
+ 'thin',
11
+ 'extralight',
12
+ 'light',
13
+ 'regular', // Normal isn't used
14
+ 'medium',
15
+ 'semibold',
16
+ 'bold',
17
+ 'extrabold',
18
+ 'black',
19
+ 'ultrablack'
20
+ ] as const
21
+
22
+ export type WeightValue = typeof WEIGHT_MAP[number]
23
+
24
+ export const IS_FIREFOX = navigator.userAgent.toLowerCase().includes('firefox')
23
25
 
24
26
  const a = 'BT601'
25
27
  const b = 'BT709'
26
28
  const c = 'SMPTE240M'
27
29
  const d = 'FCC'
28
30
 
29
- export const libassYCbCrMap = [null, a, null, a, a, b, b, c, c, d, d] as const
31
+ export const LIBASS_YCBCR_MAP = [null, a, null, a, a, b, b, c, c, d, d] as const
30
32
 
31
33
  export function _applyKeys<T extends (ASSEvent | ASSStyle)> (input: T, output: T) {
32
34
  for (const v of Object.keys(input) as Array<keyof T>) {
33
35
  output[v] = input[v]
34
36
  }
35
37
  }
38
+
39
+ export const _fetch = globalThis.fetch
40
+ export async function fetchtext (url: string) {
41
+ const res = await _fetch(url)
42
+ return await res.text()
43
+ }
@@ -1,4 +1,4 @@
1
- import type { ASSImage } from '../jassub'
1
+ import { IS_FIREFOX, type ASSImage } from './util.ts'
2
2
 
3
3
  declare const self: DedicatedWorkerGlobalScope &
4
4
  typeof globalThis & {
@@ -6,8 +6,6 @@ declare const self: DedicatedWorkerGlobalScope &
6
6
  WASMMEMORY: WebAssembly.Memory
7
7
  }
8
8
 
9
- const IS_FIREFOX = navigator.userAgent.toLowerCase().includes('firefox')
10
-
11
9
  const THREAD_COUNT = !IS_FIREFOX && self.crossOriginIsolated ? Math.min(Math.max(1, navigator.hardwareConcurrency - 2), 8) : 1
12
10
 
13
11
  // @ts-expect-error new experimental API