@prose-reader/enhancer-audio 1.301.0 → 1.303.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.
- package/dist/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +28 -28
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -312,18 +312,18 @@ class ResourcesResolver {
|
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
const y = (e,
|
|
316
|
-
const
|
|
317
|
-
if (Object.is(e,
|
|
315
|
+
const y = (e, t) => e === t ? true : e.length !== t.length ? false : e.every((n, o) => n === t[o]);
|
|
316
|
+
const F = (e, t, n) => {
|
|
317
|
+
if (Object.is(e, t))
|
|
318
318
|
return true;
|
|
319
|
-
if (typeof e != "object" || e === null || typeof
|
|
319
|
+
if (typeof e != "object" || e === null || typeof t != "object" || t === null)
|
|
320
320
|
return false;
|
|
321
|
-
const o = Object.keys(e), r = Object.keys(
|
|
321
|
+
const o = Object.keys(e), r = Object.keys(t);
|
|
322
322
|
if (o.length !== r.length)
|
|
323
323
|
return false;
|
|
324
|
-
const l =
|
|
325
|
-
for (const
|
|
326
|
-
if (!Object.hasOwn(s,
|
|
324
|
+
const l = n?.customEqual ?? Object.is, c = e, s = t;
|
|
325
|
+
for (const a of o)
|
|
326
|
+
if (!Object.hasOwn(s, a) || !l(c[a], s[a]))
|
|
327
327
|
return false;
|
|
328
328
|
return true;
|
|
329
329
|
};
|
|
@@ -335,35 +335,35 @@ function b() {
|
|
|
335
335
|
const e = m()?.__PROSE_READER_DEBUG;
|
|
336
336
|
return e === true || e === "true";
|
|
337
337
|
}
|
|
338
|
-
const E = (e,
|
|
338
|
+
const E = (e, t) => typeof e == "boolean" ? {
|
|
339
339
|
enabled: e,
|
|
340
|
-
options:
|
|
340
|
+
options: t
|
|
341
341
|
} : {
|
|
342
342
|
enabled: e?.enabled,
|
|
343
|
-
options: e ??
|
|
343
|
+
options: e ?? t
|
|
344
344
|
}, w = (e) => e.at(-1)?.color, u = (e) => {
|
|
345
345
|
if (!e.length)
|
|
346
346
|
return;
|
|
347
347
|
if (!e.some((o) => o.color))
|
|
348
348
|
return [e.map((o) => o.label).join(" ")];
|
|
349
|
-
let
|
|
350
|
-
const
|
|
349
|
+
let t = "";
|
|
350
|
+
const n = [];
|
|
351
351
|
for (const o of e)
|
|
352
|
-
|
|
352
|
+
t += `%c${t ? ` ${o.label}` : o.label}`, n.push(
|
|
353
353
|
o.color ? `color: ${o.color}` : ""
|
|
354
354
|
);
|
|
355
|
-
return [
|
|
356
|
-
}, p = (e = [],
|
|
357
|
-
let
|
|
355
|
+
return [t, ...n];
|
|
356
|
+
}, p = (e = [], t = b()) => {
|
|
357
|
+
let n = t;
|
|
358
358
|
const o = {
|
|
359
359
|
enable: (c) => {
|
|
360
360
|
l(c);
|
|
361
361
|
},
|
|
362
|
-
namespace: (c, s,
|
|
363
|
-
const
|
|
362
|
+
namespace: (c, s, a) => {
|
|
363
|
+
const i = E(
|
|
364
364
|
s,
|
|
365
|
-
|
|
366
|
-
), g =
|
|
365
|
+
a
|
|
366
|
+
), g = i.options?.color ?? w(e);
|
|
367
367
|
return p(
|
|
368
368
|
[
|
|
369
369
|
...e,
|
|
@@ -372,10 +372,10 @@ const E = (e, n) => typeof e == "boolean" ? {
|
|
|
372
372
|
color: g
|
|
373
373
|
}
|
|
374
374
|
],
|
|
375
|
-
|
|
375
|
+
i.enabled ?? n
|
|
376
376
|
);
|
|
377
377
|
},
|
|
378
|
-
isEnabled: () =>
|
|
378
|
+
isEnabled: () => n,
|
|
379
379
|
debug: () => {
|
|
380
380
|
},
|
|
381
381
|
info: () => {
|
|
@@ -390,8 +390,8 @@ const E = (e, n) => typeof e == "boolean" ? {
|
|
|
390
390
|
const s = u(e);
|
|
391
391
|
if (!s)
|
|
392
392
|
return [c];
|
|
393
|
-
const [
|
|
394
|
-
return [`${
|
|
393
|
+
const [a, ...i] = s;
|
|
394
|
+
return [`${a} ${c}`, ...i];
|
|
395
395
|
},
|
|
396
396
|
warn: () => {
|
|
397
397
|
},
|
|
@@ -435,9 +435,9 @@ const E = (e, n) => typeof e == "boolean" ? {
|
|
|
435
435
|
...s
|
|
436
436
|
);
|
|
437
437
|
}, l = (c) => {
|
|
438
|
-
|
|
438
|
+
n !== c && (n = c, r(n));
|
|
439
439
|
};
|
|
440
|
-
return r(
|
|
440
|
+
return r(n), o;
|
|
441
441
|
}; p();
|
|
442
442
|
|
|
443
443
|
const AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
@@ -498,7 +498,7 @@ function createTrackStreams(reader, state$) {
|
|
|
498
498
|
);
|
|
499
499
|
const pagination$ = reader.pagination.state$.pipe(
|
|
500
500
|
mapKeysTo([`beginSpineItemIndex`, `endSpineItemIndex`]),
|
|
501
|
-
distinctUntilChanged(
|
|
501
|
+
distinctUntilChanged(F),
|
|
502
502
|
shareReplay({ bufferSize: 1, refCount: true })
|
|
503
503
|
);
|
|
504
504
|
const visibleTrackIds$ = combineLatest([tracks$, pagination$]).pipe(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/visualizer/levels.ts","../src/visualizer/VisualizerAudioGraph.ts","../src/visualizer/AudioVisualizer.ts","../src/playback/AudioElementAdapter.ts","../src/playback/ResourcesResolver.ts","../../shared/dist/index.js","../src/utils.ts","../src/playback/trackStreams.ts","../src/playback/AudioController.ts","../src/renderer/AudioRenderer.ts","../src/audioEnhancer.ts"],"sourcesContent":["const AUDIO_VISUALIZER_LEVEL_COUNT = 80\nconst AUDIO_VISUALIZER_NOISE_FLOOR = 0.035\n\nexport const getIdleVisualizerLevels = () =>\n Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, () => 0)\n\nexport const getVisualizerLevels = (data: ArrayLike<number>) => {\n if (data.length === 0) return getIdleVisualizerLevels()\n\n const bucketSize = Math.max(\n 1,\n Math.floor(data.length / AUDIO_VISUALIZER_LEVEL_COUNT),\n )\n\n return Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, (_, index) => {\n const start = index * bucketSize\n const end = Math.min(data.length, start + bucketSize)\n\n if (start >= data.length || start === end) return 0\n\n let total = 0\n\n for (let cursor = start; cursor < end; cursor += 1) {\n total += data[cursor] ?? 0\n }\n\n const average = total / (end - start)\n const normalizedAverage = average / 255\n const gatedAverage =\n (normalizedAverage - AUDIO_VISUALIZER_NOISE_FLOOR) /\n (1 - AUDIO_VISUALIZER_NOISE_FLOOR)\n\n return Math.max(0, Math.min(1, gatedAverage))\n })\n}\n","import { getIdleVisualizerLevels, getVisualizerLevels } from \"./levels\"\n\nconst AUDIO_VISUALIZER_FFT_SIZE = 256\n\nexport class VisualizerAudioGraph {\n private audioContext: AudioContext | undefined\n private audioSourceNode: MediaElementAudioSourceNode | undefined\n private analyserNode: AnalyserNode | undefined\n private frequencyData: Uint8Array<ArrayBuffer> | undefined\n\n constructor(private readonly audioElement: HTMLAudioElement) {}\n\n async resumeIfNeeded() {\n if (!this.ensure()) {\n return false\n }\n\n const audioContext = this.audioContext\n\n if (!audioContext) {\n return false\n }\n\n if (audioContext.state !== `suspended`) {\n return true\n }\n\n try {\n await audioContext.resume()\n\n return true\n } catch {\n return false\n }\n }\n\n readLevels() {\n if (!this.analyserNode || !this.frequencyData) {\n return getIdleVisualizerLevels()\n }\n\n this.analyserNode.getByteFrequencyData(this.frequencyData)\n\n return getVisualizerLevels(this.frequencyData)\n }\n\n destroy() {\n this.audioSourceNode?.disconnect()\n this.analyserNode?.disconnect()\n this.audioContext?.close().catch(() => undefined)\n this.audioContext = undefined\n this.audioSourceNode = undefined\n this.analyserNode = undefined\n this.frequencyData = undefined\n }\n\n private ensure() {\n if (this.audioContext && this.analyserNode && this.frequencyData) {\n return true\n }\n\n if (typeof window === `undefined` || !window.AudioContext) {\n return false\n }\n\n const audioContext = new window.AudioContext()\n const audioSourceNode = audioContext.createMediaElementSource(\n this.audioElement,\n )\n const analyserNode = audioContext.createAnalyser()\n analyserNode.fftSize = AUDIO_VISUALIZER_FFT_SIZE\n analyserNode.smoothingTimeConstant = 0.8\n audioSourceNode.connect(analyserNode)\n analyserNode.connect(audioContext.destination)\n\n this.audioContext = audioContext\n this.audioSourceNode = audioSourceNode\n this.analyserNode = analyserNode\n this.frequencyData = new Uint8Array(analyserNode.frequencyBinCount)\n\n return true\n }\n}\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport {\n animationFrames,\n BehaviorSubject,\n concat,\n defaultIfEmpty,\n defer,\n distinctUntilChanged,\n EMPTY,\n from,\n map,\n of,\n Subscription,\n switchMap,\n} from \"rxjs\"\nimport type { AudioTrack, AudioVisualizerState } from \"../types\"\nimport { getIdleVisualizerLevels } from \"./levels\"\nimport { VisualizerAudioGraph } from \"./VisualizerAudioGraph\"\n\ntype AudioVisualizerPlaybackState = {\n trackId: string | undefined\n isRunning: boolean\n resetLevels: boolean\n}\n\nexport class AudioVisualizer extends ReactiveEntity<AudioVisualizerState> {\n private readonly audioGraph: VisualizerAudioGraph\n private readonly playbackState$ =\n new BehaviorSubject<AudioVisualizerPlaybackState>({\n trackId: undefined,\n isRunning: false,\n resetLevels: false,\n })\n private readonly subscriptions = new Subscription()\n\n constructor(audioElement: HTMLAudioElement) {\n super({\n levels: getIdleVisualizerLevels(),\n isActive: false,\n trackId: undefined,\n })\n this.audioGraph = new VisualizerAudioGraph(audioElement)\n\n this.subscriptions.add(\n this.playbackState$\n .pipe(\n distinctUntilChanged(\n (previous, next) =>\n previous.trackId === next.trackId &&\n previous.isRunning === next.isRunning &&\n previous.resetLevels === next.resetLevels,\n ),\n switchMap(({ trackId, isRunning, resetLevels }) => {\n if (!trackId || !isRunning) {\n return of({\n trackId,\n isActive: false,\n ...(resetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n })\n }\n\n const shouldResetLevels = this.value.trackId !== trackId\n\n return concat(\n of({\n trackId,\n isActive: true,\n ...(shouldResetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n }),\n this.createLevels$().pipe(\n map((levels) => ({\n trackId,\n levels,\n isActive: true,\n })),\n defaultIfEmpty({\n trackId,\n isActive: false,\n levels: getIdleVisualizerLevels(),\n }),\n ),\n )\n }),\n )\n .subscribe((value) => {\n this.mergeCompare(value)\n }),\n )\n }\n\n start(currentTrack: AudioTrack | undefined) {\n if (!currentTrack) return\n\n this.playbackState$.next({\n trackId: currentTrack.id,\n isRunning: true,\n resetLevels: false,\n })\n }\n\n setTrack(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: false,\n })\n }\n\n reset(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: true,\n })\n }\n\n stop({ resetLevels = false }: { resetLevels?: boolean } = {}) {\n this.playbackState$.next({\n trackId: this.playbackState$.value.trackId,\n isRunning: false,\n resetLevels,\n })\n }\n\n override destroy() {\n this.stop({\n resetLevels: true,\n })\n this.subscriptions.unsubscribe()\n this.playbackState$.complete()\n this.audioGraph.destroy()\n\n super.destroy()\n }\n\n private createLevels$() {\n return defer(() => {\n return from(this.audioGraph.resumeIfNeeded()).pipe(\n switchMap((isReady) =>\n isReady\n ? animationFrames().pipe(map(() => this.audioGraph.readLevels()))\n : EMPTY,\n ),\n )\n })\n }\n}\n","import {\n defer,\n from,\n fromEvent,\n map,\n merge,\n type Observable,\n retry,\n share,\n take,\n} from \"rxjs\"\n\nexport type AudioMetrics = {\n currentTime: number\n duration: number | undefined\n}\n\nexport class AudioElementAdapter {\n readonly element: HTMLAudioElement\n readonly canPlay$: Observable<Event>\n readonly ended$: Observable<Event>\n readonly isPlaying$: Observable<boolean>\n readonly metrics$: Observable<AudioMetrics>\n\n constructor() {\n this.element = document.createElement(`audio`)\n this.element.preload = `metadata`\n\n this.canPlay$ = fromEvent(this.element, `canplay`).pipe(share())\n this.ended$ = fromEvent(this.element, `ended`).pipe(share())\n\n this.isPlaying$ = merge(\n fromEvent(this.element, `play`).pipe(map(() => true)),\n fromEvent(this.element, `pause`).pipe(map(() => false)),\n ).pipe(share())\n\n this.metrics$ = merge(\n fromEvent(this.element, `timeupdate`),\n fromEvent(this.element, `seeking`),\n fromEvent(this.element, `seeked`),\n fromEvent(this.element, `loadedmetadata`),\n fromEvent(this.element, `durationchange`),\n this.canPlay$,\n ).pipe(\n map(() => ({\n currentTime: this.element.currentTime,\n duration: Number.isFinite(this.element.duration)\n ? this.element.duration\n : undefined,\n })),\n share(),\n )\n }\n\n get paused() {\n return this.element.paused\n }\n\n get hasSource() {\n return this.element.hasAttribute(`src`)\n }\n\n play$() {\n return defer(() => from(this.element.play())).pipe(\n retry({\n count: 1,\n delay: () => this.canPlay$.pipe(take(1)),\n }),\n )\n }\n\n pause() {\n this.element.pause()\n }\n\n loadSource(src: string) {\n this.element.src = src\n this.element.load()\n }\n\n unloadSource() {\n this.element.removeAttribute(`src`)\n this.element.load()\n }\n\n setCurrentTime(value: number) {\n this.element.currentTime = value\n }\n}\n","import type { ResourceHandler } from \"@prose-reader/core\"\nimport { from, map, of, switchMap } from \"rxjs\"\nimport type { AudioTrack } from \"../types\"\n\ntype CachedTrackSource = {\n url: string\n release?: () => void\n}\n\nexport class ResourcesResolver {\n private readonly cachedSourceByTrackId = new Map<string, CachedTrackSource>()\n\n public hasCachedSource(trackId: string): boolean {\n return this.cachedSourceByTrackId.has(trackId)\n }\n\n public getTrackResourceUrl$ = (\n track: AudioTrack,\n resourcesHandler: Pick<ResourceHandler, \"getResource\">,\n ) => {\n const cachedSource = this.cachedSourceByTrackId.get(track.id)\n\n if (cachedSource) {\n return of(cachedSource.url)\n }\n\n const resource$ = from(resourcesHandler.getResource())\n\n return resource$.pipe(\n switchMap((resource) => {\n if (resource instanceof URL) {\n this.cachedSourceByTrackId.set(track.id, {\n url: resource.href,\n })\n\n return of(resource.href)\n }\n\n if (resource instanceof Response) {\n return from(resource.blob()).pipe(\n map((blob) => {\n const objectUrl = URL.createObjectURL(blob)\n\n this.cachedSourceByTrackId.set(track.id, {\n url: objectUrl,\n release: () => {\n URL.revokeObjectURL(objectUrl)\n },\n })\n\n return objectUrl\n }),\n )\n }\n\n this.cachedSourceByTrackId.set(track.id, {\n url: track.href,\n })\n\n return of(track.href)\n }),\n )\n }\n\n public releaseTrackSource(trackId: string) {\n const cachedSource = this.cachedSourceByTrackId.get(trackId)\n\n if (!cachedSource) return\n\n this.cachedSourceByTrackId.delete(trackId)\n cachedSource.release?.()\n }\n\n public releaseAll() {\n for (const trackId of this.cachedSourceByTrackId.keys()) {\n this.releaseTrackSource(trackId)\n }\n }\n\n public destroy() {\n this.releaseAll()\n }\n}\n","const y = (e, n) => e === n ? !0 : e.length !== n.length ? !1 : e.every((t, o) => t === n[o]), f = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction d(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), n.push(l));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction R(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return d(n);\n}\nfunction $(e) {\n const n = e.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst h = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, x = ({\n mimeType: e,\n uri: n\n}) => (e ?? h(n ?? \"\"))?.startsWith(\"application/xhtml+xml\"), _ = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), C = (e) => {\n if (!e.length) return;\n const n = e.indexOf(\";\");\n return n >= 0 ? e.substring(0, n) : e;\n}, v = (e, n, t) => {\n if (Object.is(e, n))\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(n);\n if (o.length !== r.length)\n return !1;\n const l = t?.customEqual ?? Object.is, c = e, s = n;\n for (const i of o)\n if (!Object.hasOwn(s, i) || !l(c[i], s[i]))\n return !1;\n return !0;\n}, F = (e, n) => e.reduce(\n (t, o) => {\n const r = n(o);\n return t[r] || (t[r] = []), t[r].push(o), t;\n },\n {}\n);\nfunction T(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.hasOwn(n, o)) {\n const r = n[o];\n (r !== void 0 || !(o in e)) && (t[o] = r);\n }\n return t;\n}\nconst m = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction b() {\n const e = m()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst E = (e, n) => typeof e == \"boolean\" ? {\n enabled: e,\n options: n\n} : {\n enabled: e?.enabled,\n options: e ?? n\n}, w = (e) => e.at(-1)?.color, u = (e) => {\n if (!e.length)\n return;\n if (!e.some((o) => o.color))\n return [e.map((o) => o.label).join(\" \")];\n let n = \"\";\n const t = [];\n for (const o of e)\n n += `%c${n ? ` ${o.label}` : o.label}`, t.push(\n o.color ? `color: ${o.color}` : \"\"\n );\n return [n, ...t];\n}, p = (e = [], n = b()) => {\n let t = n;\n const o = {\n enable: (c) => {\n l(c);\n },\n namespace: (c, s, i) => {\n const a = E(\n s,\n i\n ), g = a.options?.color ?? w(e);\n return p(\n [\n ...e,\n {\n label: `[${c}]`,\n color: g\n }\n ],\n a.enabled ?? t\n );\n },\n isEnabled: () => t,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (c) => {\n const s = u(e);\n if (!s)\n return [c];\n const [i, ...a] = s;\n return [`${i} ${c}`, ...a];\n },\n warn: () => {\n },\n error: () => {\n }\n }, r = (c) => {\n if (!c) {\n o.debug = () => {\n }, o.info = () => {\n }, o.log = () => {\n }, o.groupCollapsed = () => {\n }, o.groupEnd = () => {\n }, o.warn = () => {\n }, o.error = () => {\n };\n return;\n }\n const s = u(e) ?? [];\n o.debug = Function.prototype.bind.call(\n console.debug,\n console,\n ...s\n ), o.info = Function.prototype.bind.call(\n console.info,\n console,\n ...s\n ), o.log = Function.prototype.bind.call(\n console.log,\n console,\n ...s\n ), o.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), o.groupEnd = Function.prototype.bind.call(console.groupEnd, console), o.warn = Function.prototype.bind.call(\n console.warn,\n console,\n ...s\n ), o.error = Function.prototype.bind.call(\n console.error,\n console,\n ...s\n );\n }, l = (c) => {\n t !== c && (t = c, r(t));\n };\n return r(t), o;\n}, M = p(), O = \"prose-reader-resource-error\", k = (e) => e.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\nexport {\n O as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n M as Report,\n y as arrayEqual,\n h as detectMimeTypeFromName,\n k as escapeXmlAttributeValue,\n $ as getParentPath,\n f as getUrlExtension,\n F as groupBy,\n _ as isMediaContentMimeType,\n v as isShallowEqual,\n x as isXmlBasedMimeType,\n C as parseContentType,\n T as shallowMergeIfDefined,\n R as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import type { Manifest } from \"@prose-reader/core\"\n\nconst AUDIO_EXTENSIONS = new Set([\n `mp3`,\n `m4a`,\n `m4b`,\n `aac`,\n `ogg`,\n `oga`,\n `wav`,\n `flac`,\n `opus`,\n])\n\nconst getExtensionFromHref = (href: string) => {\n const [pathname = ``] = href.split(/[?#]/)\n const segments = pathname.split(`/`)\n const basename = segments.at(-1) ?? ``\n const extension = basename.split(`.`).at(-1)\n\n return extension?.toLowerCase()\n}\n\nexport const isAudioSpineItem = (item: Manifest[\"spineItems\"][number]) => {\n const mediaType = item.mediaType?.split(`;`).at(0)?.trim().toLowerCase()\n\n if (mediaType?.startsWith(`audio/`)) {\n return true\n }\n\n const extension = getExtensionFromHref(item.href)\n\n return extension ? AUDIO_EXTENSIONS.has(extension) : false\n}\n","import { mapKeysTo } from \"@prose-reader/core\"\nimport { arrayEqual, isShallowEqual } from \"@prose-reader/shared\"\nimport {\n combineLatest,\n distinctUntilChanged,\n map,\n type Observable,\n shareReplay,\n} from \"rxjs\"\nimport type { AudioEnhancerState, AudioTrack } from \"../types\"\nimport { isAudioSpineItem } from \"../utils\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype PaginationTrackWindow = {\n beginSpineItemIndex: number | undefined\n endSpineItemIndex: number | undefined\n}\n\nconst getTrackAtSpineItemIndex = (\n tracks: AudioTrack[],\n index: number | undefined,\n) => {\n if (index === undefined) return undefined\n\n return tracks.find((track) => track.index === index)\n}\n\nconst getVisibleTracks = (\n tracks: AudioTrack[],\n pagination: PaginationTrackWindow,\n) => {\n const beginTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.beginSpineItemIndex,\n )\n const endTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.endSpineItemIndex,\n )\n\n return [beginTrack, endTrack].filter(\n (track, i, arr): track is AudioTrack =>\n track !== undefined && arr.indexOf(track) === i,\n )\n}\n\nexport function createTrackStreams(\n reader: Pick<AudioControllerReader, \"context\" | \"pagination\">,\n state$: Observable<AudioEnhancerState>,\n) {\n const tracks$ = reader.context.manifest$.pipe(\n map((manifest) =>\n manifest.spineItems.filter(isAudioSpineItem).map((item) => ({\n id: item.id,\n href: item.href,\n index: item.index,\n mediaType: item.mediaType,\n })),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const pagination$ = reader.pagination.state$.pipe(\n mapKeysTo([`beginSpineItemIndex`, `endSpineItemIndex`]),\n distinctUntilChanged(isShallowEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const visibleTrackIds$ = combineLatest([tracks$, pagination$]).pipe(\n map(([tracks, pagination]) =>\n getVisibleTracks(tracks, pagination).map(({ id }) => id),\n ),\n distinctUntilChanged(arrayEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const currentTrack$ = state$.pipe(\n map((state) => state.currentTrack),\n distinctUntilChanged(),\n )\n\n const nextTrack$ = combineLatest([tracks$, pagination$, currentTrack$]).pipe(\n map(([tracks, { endSpineItemIndex }, currentTrack]) => {\n const nextTrackInPaginationWindow =\n currentTrack && endSpineItemIndex !== undefined\n ? tracks.find(\n ({ index }) =>\n index > currentTrack.index && index <= endSpineItemIndex,\n )\n : undefined\n\n const nextTrackAfterCurrentTrack = currentTrack\n ? tracks.find(({ index }) => index > currentTrack.index)\n : undefined\n\n return { nextTrackInPaginationWindow, nextTrackAfterCurrentTrack }\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n return {\n tracks$,\n visibleTrackIds$,\n nextTrack$,\n }\n}\n","import { isDefined, ReactiveEntity } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n catchError,\n defaultIfEmpty,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n type Observable,\n of,\n Subject,\n Subscription,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type {\n AudioEnhancerState,\n AudioTrack,\n SelectAudioTrackOptions,\n} from \"../types\"\nimport { AudioVisualizer } from \"../visualizer\"\nimport { AudioElementAdapter } from \"./AudioElementAdapter\"\nimport { ResourcesResolver } from \"./ResourcesResolver\"\nimport { createTrackStreams } from \"./trackStreams\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype SelectCommand = {\n trackId: string\n options: SelectAudioTrackOptions\n}\n\ntype DesiredPlayback = {\n shouldPlay: boolean\n trackId: string | undefined\n}\n\nconst initialDesiredPlayback: DesiredPlayback = {\n shouldPlay: false,\n trackId: undefined,\n}\n\nconst initialState: AudioEnhancerState = {\n tracks: [],\n currentTrack: undefined,\n isPlaying: false,\n isLoading: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n}\n\nexport type { AudioControllerReader }\n\nexport class AudioController extends ReactiveEntity<AudioEnhancerState> {\n private readonly reader: AudioControllerReader\n private readonly audio: AudioElementAdapter\n readonly visualizer$: AudioVisualizer\n readonly resourcesResolver = new ResourcesResolver()\n readonly visibleTrackIds$: Observable<string[]>\n\n private readonly playCommandSubject = new Subject<void>()\n private readonly pauseCommandSubject = new Subject<void>()\n private readonly selectCommandSubject = new Subject<SelectCommand>()\n private readonly desiredPlayback$ = new BehaviorSubject(\n initialDesiredPlayback,\n )\n private readonly subscriptions = new Subscription()\n\n constructor(\n reader: AudioControllerReader,\n audio = new AudioElementAdapter(),\n ) {\n super(initialState)\n\n this.reader = reader\n this.audio = audio\n this.visualizer$ = new AudioVisualizer(this.audio.element)\n\n const { tracks$, visibleTrackIds$, nextTrack$ } = createTrackStreams(\n this.reader,\n this.state$,\n )\n\n this.visibleTrackIds$ = visibleTrackIds$\n\n const firstVisibleTrackId$ = this.visibleTrackIds$.pipe(\n map((trackIds) => trackIds[0]),\n distinctUntilChanged(),\n share(),\n )\n\n const visibleTrackReset$ = firstVisibleTrackId$.pipe(\n withLatestFrom(this.state$),\n filter(\n ([trackId, state]) =>\n trackId === undefined &&\n (state.currentTrack?.id !== undefined || state.isLoading),\n ),\n map(([, state]) => state.tracks),\n )\n\n const visibleTrackSelectionIntent$ = firstVisibleTrackId$.pipe(\n filter((trackId): trackId is string => trackId !== undefined),\n withLatestFrom(this.desiredPlayback$),\n map(([trackId, { shouldPlay }]) => ({\n trackId,\n options: {\n navigate: false,\n play: shouldPlay ? true : undefined,\n },\n })),\n )\n\n const tracksChanged$ = tracks$.pipe(\n tap(() => this.resourcesResolver.releaseAll()),\n )\n\n const playbackReset$ = merge(visibleTrackReset$, tracksChanged$).pipe(\n tap((tracks) => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n this.visualizer$.stop({ resetLevels: true })\n this.unmountCurrentSource()\n\n this.mergeCompare({\n tracks,\n currentTrack: undefined,\n isLoading: false,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(undefined)\n }),\n share(),\n )\n\n const playSelectionIntent$ = this.playCommandSubject.pipe(\n filter(() => !this.audio.hasSource),\n map(() => this.state.currentTrack ?? this.state.tracks[0]),\n filter(isDefined),\n map((track) => ({\n trackId: track.id,\n options: { navigate: false, play: true },\n })),\n )\n\n const resumePlayback$ = this.playCommandSubject.pipe(\n filter(() => this.audio.hasSource),\n tap(() => {\n this.emitDesiredPlayback({\n shouldPlay: true,\n trackId: this.state.currentTrack?.id,\n })\n }),\n )\n\n const endedSelectionIntent$ = this.audio.ended$.pipe(\n withLatestFrom(nextTrack$),\n switchMap(\n ([, { nextTrackAfterCurrentTrack, nextTrackInPaginationWindow }]) => {\n this.visualizer$.stop({ resetLevels: true })\n\n if (nextTrackInPaginationWindow) {\n return of({\n trackId: nextTrackInPaginationWindow.id,\n options: { navigate: false, play: true },\n })\n }\n\n if (!nextTrackAfterCurrentTrack) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }\n\n this.reader.navigation.goToRightOrBottomSpineItem()\n\n return EMPTY\n },\n ),\n )\n\n const selection$ = merge(\n this.selectCommandSubject,\n visibleTrackSelectionIntent$,\n endedSelectionIntent$,\n playSelectionIntent$,\n ).pipe(\n withLatestFrom(this.state$),\n filter(([selectionIntent, state]) =>\n state.tracks.some(({ id }) => id === selectionIntent.trackId),\n ),\n map(([selectionIntent, state]) => ({\n selectionIntent,\n state,\n isReselectionWhileLoading:\n state.currentTrack?.id === selectionIntent.trackId && state.isLoading,\n })),\n tap(({ selectionIntent, state, isReselectionWhileLoading }) => {\n if (selectionIntent.options.navigate !== false) {\n this.reader.navigation.navigate({\n spineItem: selectionIntent.trackId,\n animation: `turn`,\n })\n }\n\n if (\n isReselectionWhileLoading &&\n selectionIntent.options.play !== undefined\n ) {\n this.emitDesiredPlayback({\n shouldPlay: selectionIntent.options.play,\n trackId: state.currentTrack?.id,\n })\n }\n }),\n filter(({ isReselectionWhileLoading }) => !isReselectionWhileLoading),\n switchMap(({ selectionIntent: { trackId, options } }) =>\n this.selectTrack$({ trackId, options, playbackReset$ }),\n ),\n )\n\n const playback$ = merge(resumePlayback$, selection$).pipe(\n withLatestFrom(this.desiredPlayback$),\n switchMap(([, { shouldPlay, trackId }]) => {\n if (\n !shouldPlay ||\n !this.audio.hasSource ||\n this.state.currentTrack?.id !== trackId\n ) {\n return EMPTY\n }\n\n this.mergeCompare({ hasError: false })\n\n return this.audio.play$().pipe(\n catchError(() => {\n this.mergeCompare({ hasError: true })\n\n return EMPTY\n }),\n )\n }),\n )\n\n this.subscriptions.add(playbackReset$.subscribe())\n this.subscriptions.add(playback$.subscribe())\n\n this.subscriptions.add(\n this.pauseCommandSubject.subscribe(() => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }),\n )\n\n this.subscriptions.add(\n this.audio.isPlaying$.subscribe((isPlaying) => {\n this.mergeCompare({ isPlaying })\n\n if (!isPlaying) {\n this.visualizer$.stop()\n return\n }\n\n if (!this.state.currentTrack) return\n\n this.visualizer$.start(this.state.currentTrack)\n }),\n )\n\n this.subscriptions.add(\n this.audio.metrics$.subscribe(({ currentTime, duration }) => {\n this.mergeCompare({ currentTime, duration })\n }),\n )\n }\n\n get state() {\n return this.value\n }\n\n get visualizer() {\n return this.visualizer$.value\n }\n\n private resetTrackSelection({\n currentTrack,\n isLoading,\n }: {\n currentTrack: AudioTrack\n isLoading: boolean\n }) {\n this.mergeCompare({\n currentTrack,\n isLoading,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(currentTrack?.id)\n }\n\n private emitDesiredPlayback({ shouldPlay, trackId }: DesiredPlayback) {\n this.desiredPlayback$.next({\n shouldPlay,\n trackId: shouldPlay ? trackId : undefined,\n })\n\n if (!shouldPlay) {\n this.audio.pause()\n }\n }\n\n private unmountCurrentSource() {\n if (!this.audio.hasSource) return\n\n const trackId = this.state.currentTrack?.id\n\n if (!this.audio.paused) {\n this.audio.pause()\n }\n\n this.audio.unloadSource()\n\n if (trackId) {\n this.resourcesResolver.releaseTrackSource(trackId)\n }\n }\n\n private mountSource(source: string) {\n this.unmountCurrentSource()\n this.audio.loadSource(source)\n }\n\n private resolveTrackSource(track: AudioTrack) {\n const spineItem = this.reader.spineItemsManager.get(track.index)\n\n if (!spineItem) return EMPTY\n\n return this.resourcesResolver.getTrackResourceUrl$(\n track,\n spineItem.resourcesHandler,\n )\n }\n\n private selectTrack$({\n trackId,\n options,\n playbackReset$,\n }: {\n trackId: string\n options: SelectAudioTrackOptions\n playbackReset$: Observable<AudioTrack[]>\n }) {\n const track = this.state.tracks.find(({ id }) => id === trackId)\n\n if (!track) return EMPTY\n\n const currentTrack = this.state.currentTrack\n const shouldPlay =\n options.play ?? (!this.audio.paused && currentTrack !== undefined)\n\n this.emitDesiredPlayback({ shouldPlay, trackId: track.id })\n\n if (currentTrack?.id === track.id && this.audio.hasSource) {\n this.visualizer$.setTrack(track.id)\n\n return shouldPlay ? of(undefined) : EMPTY\n }\n\n this.unmountCurrentSource()\n\n this.resetTrackSelection({\n currentTrack: track,\n isLoading: true,\n })\n\n return this.resolveTrackSource(track).pipe(\n map((source) => ({ source })),\n defaultIfEmpty({ source: undefined }),\n catchError(() => of({ source: undefined })),\n takeUntil(playbackReset$),\n tap(({ source }) => {\n if (!source) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n } else {\n this.mountSource(source)\n }\n\n this.mergeCompare({ isLoading: false })\n }),\n filter(({ source }) => source !== undefined),\n map(() => undefined),\n )\n }\n\n select(trackId: string, options: SelectAudioTrackOptions = {}) {\n this.selectCommandSubject.next({ trackId, options })\n }\n\n play() {\n this.playCommandSubject.next()\n }\n\n pause() {\n this.pauseCommandSubject.next()\n }\n\n toggle() {\n if (this.audio.paused) {\n this.play()\n return\n }\n\n this.pause()\n }\n\n setCurrentTime(value: number) {\n this.mergeCompare({ currentTime: value })\n this.audio.setCurrentTime(value)\n }\n\n destroy() {\n this.subscriptions.unsubscribe()\n this.playCommandSubject.complete()\n this.pauseCommandSubject.complete()\n this.selectCommandSubject.complete()\n this.desiredPlayback$.complete()\n this.visualizer$.destroy()\n this.unmountCurrentSource()\n this.resourcesResolver.destroy()\n\n super.destroy()\n }\n}\n","import { DocumentRenderer, setStylePropertyIfChanged } from \"@prose-reader/core\"\nimport { EMPTY, of } from \"rxjs\"\n\nexport class AudioRenderer extends DocumentRenderer {\n onCreateDocument() {\n const ownerDocument = this.containerElement.ownerDocument\n const rootElement = ownerDocument.createElement(`div`)\n\n rootElement.style.cssText = `\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n display: block;\n `\n rootElement.setAttribute(`data-prose-reader-audio-page`, this.item.id)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument() {\n this.attach()\n\n return EMPTY\n }\n\n onUnload() {\n this.detach()\n\n return EMPTY\n }\n\n onLayout() {\n const { width, height } = this.viewport.pageSize\n const rootElement = this.documentContainer\n\n if (rootElement) {\n setStylePropertyIfChanged(rootElement.style, `width`, `${width}px`)\n setStylePropertyIfChanged(rootElement.style, `height`, `${height}px`)\n }\n\n return of({ width, height })\n }\n\n onRenderHeadless() {\n return EMPTY\n }\n\n getDocumentFrame() {\n return undefined\n }\n\n /**\n * Audio spine items are always pre-paginated (one track per page).\n * Mixed audio/text books with reflowable audio chapters may need\n * to revisit this if that use case arises.\n */\n get renditionLayout(): `pre-paginated` {\n return `pre-paginated`\n }\n}\n","import type { CreateReaderOptions, Reader } from \"@prose-reader/core\"\nimport { AudioController } from \"./playback/AudioController\"\nimport { AudioRenderer } from \"./renderer/AudioRenderer\"\nimport type { AudioEnhancerAPI } from \"./types\"\nimport { isAudioSpineItem } from \"./utils\"\n\nexport const audioEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & AudioEnhancerAPI => {\n const readerOptions = { ...options }\n\n const reader = next({\n ...readerOptions,\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (maybeFactory) {\n return maybeFactory\n }\n\n if (isAudioSpineItem(item)) {\n return (params) => new AudioRenderer(params)\n }\n\n return undefined\n },\n })\n\n const controller = new AudioController(reader)\n\n const destroy = () => {\n controller.destroy()\n reader.destroy()\n }\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_AUDIO: true,\n destroy,\n audio: {\n state$: controller.state$,\n visualizer$: controller.visualizer$,\n visibleTrackIds$: controller.visibleTrackIds$,\n get state() {\n return controller.state\n },\n get visualizer() {\n return controller.visualizer\n },\n isAudioRenderer: (renderer) => renderer instanceof AudioRenderer,\n play: () => controller.play(),\n pause: () => controller.pause(),\n toggle: () => controller.toggle(),\n setCurrentTime: (value) => controller.setCurrentTime(value),\n select: (trackId, options) => controller.select(trackId, options),\n },\n }\n }\n"],"names":["isShallowEqual","arrayEqual","options"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/visualizer/levels.ts","../src/visualizer/VisualizerAudioGraph.ts","../src/visualizer/AudioVisualizer.ts","../src/playback/AudioElementAdapter.ts","../src/playback/ResourcesResolver.ts","../../shared/dist/index.js","../src/utils.ts","../src/playback/trackStreams.ts","../src/playback/AudioController.ts","../src/renderer/AudioRenderer.ts","../src/audioEnhancer.ts"],"sourcesContent":["const AUDIO_VISUALIZER_LEVEL_COUNT = 80\nconst AUDIO_VISUALIZER_NOISE_FLOOR = 0.035\n\nexport const getIdleVisualizerLevels = () =>\n Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, () => 0)\n\nexport const getVisualizerLevels = (data: ArrayLike<number>) => {\n if (data.length === 0) return getIdleVisualizerLevels()\n\n const bucketSize = Math.max(\n 1,\n Math.floor(data.length / AUDIO_VISUALIZER_LEVEL_COUNT),\n )\n\n return Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, (_, index) => {\n const start = index * bucketSize\n const end = Math.min(data.length, start + bucketSize)\n\n if (start >= data.length || start === end) return 0\n\n let total = 0\n\n for (let cursor = start; cursor < end; cursor += 1) {\n total += data[cursor] ?? 0\n }\n\n const average = total / (end - start)\n const normalizedAverage = average / 255\n const gatedAverage =\n (normalizedAverage - AUDIO_VISUALIZER_NOISE_FLOOR) /\n (1 - AUDIO_VISUALIZER_NOISE_FLOOR)\n\n return Math.max(0, Math.min(1, gatedAverage))\n })\n}\n","import { getIdleVisualizerLevels, getVisualizerLevels } from \"./levels\"\n\nconst AUDIO_VISUALIZER_FFT_SIZE = 256\n\nexport class VisualizerAudioGraph {\n private audioContext: AudioContext | undefined\n private audioSourceNode: MediaElementAudioSourceNode | undefined\n private analyserNode: AnalyserNode | undefined\n private frequencyData: Uint8Array<ArrayBuffer> | undefined\n\n constructor(private readonly audioElement: HTMLAudioElement) {}\n\n async resumeIfNeeded() {\n if (!this.ensure()) {\n return false\n }\n\n const audioContext = this.audioContext\n\n if (!audioContext) {\n return false\n }\n\n if (audioContext.state !== `suspended`) {\n return true\n }\n\n try {\n await audioContext.resume()\n\n return true\n } catch {\n return false\n }\n }\n\n readLevels() {\n if (!this.analyserNode || !this.frequencyData) {\n return getIdleVisualizerLevels()\n }\n\n this.analyserNode.getByteFrequencyData(this.frequencyData)\n\n return getVisualizerLevels(this.frequencyData)\n }\n\n destroy() {\n this.audioSourceNode?.disconnect()\n this.analyserNode?.disconnect()\n this.audioContext?.close().catch(() => undefined)\n this.audioContext = undefined\n this.audioSourceNode = undefined\n this.analyserNode = undefined\n this.frequencyData = undefined\n }\n\n private ensure() {\n if (this.audioContext && this.analyserNode && this.frequencyData) {\n return true\n }\n\n if (typeof window === `undefined` || !window.AudioContext) {\n return false\n }\n\n const audioContext = new window.AudioContext()\n const audioSourceNode = audioContext.createMediaElementSource(\n this.audioElement,\n )\n const analyserNode = audioContext.createAnalyser()\n analyserNode.fftSize = AUDIO_VISUALIZER_FFT_SIZE\n analyserNode.smoothingTimeConstant = 0.8\n audioSourceNode.connect(analyserNode)\n analyserNode.connect(audioContext.destination)\n\n this.audioContext = audioContext\n this.audioSourceNode = audioSourceNode\n this.analyserNode = analyserNode\n this.frequencyData = new Uint8Array(analyserNode.frequencyBinCount)\n\n return true\n }\n}\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport {\n animationFrames,\n BehaviorSubject,\n concat,\n defaultIfEmpty,\n defer,\n distinctUntilChanged,\n EMPTY,\n from,\n map,\n of,\n Subscription,\n switchMap,\n} from \"rxjs\"\nimport type { AudioTrack, AudioVisualizerState } from \"../types\"\nimport { getIdleVisualizerLevels } from \"./levels\"\nimport { VisualizerAudioGraph } from \"./VisualizerAudioGraph\"\n\ntype AudioVisualizerPlaybackState = {\n trackId: string | undefined\n isRunning: boolean\n resetLevels: boolean\n}\n\nexport class AudioVisualizer extends ReactiveEntity<AudioVisualizerState> {\n private readonly audioGraph: VisualizerAudioGraph\n private readonly playbackState$ =\n new BehaviorSubject<AudioVisualizerPlaybackState>({\n trackId: undefined,\n isRunning: false,\n resetLevels: false,\n })\n private readonly subscriptions = new Subscription()\n\n constructor(audioElement: HTMLAudioElement) {\n super({\n levels: getIdleVisualizerLevels(),\n isActive: false,\n trackId: undefined,\n })\n this.audioGraph = new VisualizerAudioGraph(audioElement)\n\n this.subscriptions.add(\n this.playbackState$\n .pipe(\n distinctUntilChanged(\n (previous, next) =>\n previous.trackId === next.trackId &&\n previous.isRunning === next.isRunning &&\n previous.resetLevels === next.resetLevels,\n ),\n switchMap(({ trackId, isRunning, resetLevels }) => {\n if (!trackId || !isRunning) {\n return of({\n trackId,\n isActive: false,\n ...(resetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n })\n }\n\n const shouldResetLevels = this.value.trackId !== trackId\n\n return concat(\n of({\n trackId,\n isActive: true,\n ...(shouldResetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n }),\n this.createLevels$().pipe(\n map((levels) => ({\n trackId,\n levels,\n isActive: true,\n })),\n defaultIfEmpty({\n trackId,\n isActive: false,\n levels: getIdleVisualizerLevels(),\n }),\n ),\n )\n }),\n )\n .subscribe((value) => {\n this.mergeCompare(value)\n }),\n )\n }\n\n start(currentTrack: AudioTrack | undefined) {\n if (!currentTrack) return\n\n this.playbackState$.next({\n trackId: currentTrack.id,\n isRunning: true,\n resetLevels: false,\n })\n }\n\n setTrack(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: false,\n })\n }\n\n reset(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: true,\n })\n }\n\n stop({ resetLevels = false }: { resetLevels?: boolean } = {}) {\n this.playbackState$.next({\n trackId: this.playbackState$.value.trackId,\n isRunning: false,\n resetLevels,\n })\n }\n\n override destroy() {\n this.stop({\n resetLevels: true,\n })\n this.subscriptions.unsubscribe()\n this.playbackState$.complete()\n this.audioGraph.destroy()\n\n super.destroy()\n }\n\n private createLevels$() {\n return defer(() => {\n return from(this.audioGraph.resumeIfNeeded()).pipe(\n switchMap((isReady) =>\n isReady\n ? animationFrames().pipe(map(() => this.audioGraph.readLevels()))\n : EMPTY,\n ),\n )\n })\n }\n}\n","import {\n defer,\n from,\n fromEvent,\n map,\n merge,\n type Observable,\n retry,\n share,\n take,\n} from \"rxjs\"\n\nexport type AudioMetrics = {\n currentTime: number\n duration: number | undefined\n}\n\nexport class AudioElementAdapter {\n readonly element: HTMLAudioElement\n readonly canPlay$: Observable<Event>\n readonly ended$: Observable<Event>\n readonly isPlaying$: Observable<boolean>\n readonly metrics$: Observable<AudioMetrics>\n\n constructor() {\n this.element = document.createElement(`audio`)\n this.element.preload = `metadata`\n\n this.canPlay$ = fromEvent(this.element, `canplay`).pipe(share())\n this.ended$ = fromEvent(this.element, `ended`).pipe(share())\n\n this.isPlaying$ = merge(\n fromEvent(this.element, `play`).pipe(map(() => true)),\n fromEvent(this.element, `pause`).pipe(map(() => false)),\n ).pipe(share())\n\n this.metrics$ = merge(\n fromEvent(this.element, `timeupdate`),\n fromEvent(this.element, `seeking`),\n fromEvent(this.element, `seeked`),\n fromEvent(this.element, `loadedmetadata`),\n fromEvent(this.element, `durationchange`),\n this.canPlay$,\n ).pipe(\n map(() => ({\n currentTime: this.element.currentTime,\n duration: Number.isFinite(this.element.duration)\n ? this.element.duration\n : undefined,\n })),\n share(),\n )\n }\n\n get paused() {\n return this.element.paused\n }\n\n get hasSource() {\n return this.element.hasAttribute(`src`)\n }\n\n play$() {\n return defer(() => from(this.element.play())).pipe(\n retry({\n count: 1,\n delay: () => this.canPlay$.pipe(take(1)),\n }),\n )\n }\n\n pause() {\n this.element.pause()\n }\n\n loadSource(src: string) {\n this.element.src = src\n this.element.load()\n }\n\n unloadSource() {\n this.element.removeAttribute(`src`)\n this.element.load()\n }\n\n setCurrentTime(value: number) {\n this.element.currentTime = value\n }\n}\n","import type { ResourceHandler } from \"@prose-reader/core\"\nimport { from, map, of, switchMap } from \"rxjs\"\nimport type { AudioTrack } from \"../types\"\n\ntype CachedTrackSource = {\n url: string\n release?: () => void\n}\n\nexport class ResourcesResolver {\n private readonly cachedSourceByTrackId = new Map<string, CachedTrackSource>()\n\n public hasCachedSource(trackId: string): boolean {\n return this.cachedSourceByTrackId.has(trackId)\n }\n\n public getTrackResourceUrl$ = (\n track: AudioTrack,\n resourcesHandler: Pick<ResourceHandler, \"getResource\">,\n ) => {\n const cachedSource = this.cachedSourceByTrackId.get(track.id)\n\n if (cachedSource) {\n return of(cachedSource.url)\n }\n\n const resource$ = from(resourcesHandler.getResource())\n\n return resource$.pipe(\n switchMap((resource) => {\n if (resource instanceof URL) {\n this.cachedSourceByTrackId.set(track.id, {\n url: resource.href,\n })\n\n return of(resource.href)\n }\n\n if (resource instanceof Response) {\n return from(resource.blob()).pipe(\n map((blob) => {\n const objectUrl = URL.createObjectURL(blob)\n\n this.cachedSourceByTrackId.set(track.id, {\n url: objectUrl,\n release: () => {\n URL.revokeObjectURL(objectUrl)\n },\n })\n\n return objectUrl\n }),\n )\n }\n\n this.cachedSourceByTrackId.set(track.id, {\n url: track.href,\n })\n\n return of(track.href)\n }),\n )\n }\n\n public releaseTrackSource(trackId: string) {\n const cachedSource = this.cachedSourceByTrackId.get(trackId)\n\n if (!cachedSource) return\n\n this.cachedSourceByTrackId.delete(trackId)\n cachedSource.release?.()\n }\n\n public releaseAll() {\n for (const trackId of this.cachedSourceByTrackId.keys()) {\n this.releaseTrackSource(trackId)\n }\n }\n\n public destroy() {\n this.releaseAll()\n }\n}\n","const y = (e, t) => e === t ? !0 : e.length !== t.length ? !1 : e.every((n, o) => n === t[o]), f = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction d(e) {\n const t = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), t.push(l));\n }\n let n = t.join(\"/\");\n n = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = n.split(\"?\");\n return n = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), n;\n}\nfunction R(...e) {\n const t = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return d(t);\n}\nfunction $(e) {\n const t = e.split(\"/\");\n return t.pop(), t.join(\"/\");\n}\nconst h = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, x = ({\n mimeType: e,\n uri: t\n}) => (e ?? h(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), _ = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), C = (e) => {\n if (!e.length) return;\n const t = e.indexOf(\";\");\n return t >= 0 ? e.substring(0, t) : e;\n}, v = (e) => {\n const t = e.pageSpreadLeft === !0, n = e.pageSpreadRight === !0;\n if (t !== n)\n return t ? \"left\" : \"right\";\n}, F = (e, t, n) => {\n if (Object.is(e, t))\n return !0;\n if (typeof e != \"object\" || e === null || typeof t != \"object\" || t === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(t);\n if (o.length !== r.length)\n return !1;\n const l = n?.customEqual ?? Object.is, c = e, s = t;\n for (const a of o)\n if (!Object.hasOwn(s, a) || !l(c[a], s[a]))\n return !1;\n return !0;\n}, T = (e, t) => e.reduce(\n (n, o) => {\n const r = t(o);\n return n[r] || (n[r] = []), n[r].push(o), n;\n },\n {}\n);\nfunction M(e, t) {\n const n = { ...e };\n for (const o in t)\n if (Object.hasOwn(t, o)) {\n const r = t[o];\n (r !== void 0 || !(o in e)) && (n[o] = r);\n }\n return n;\n}\nconst m = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction b() {\n const e = m()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst E = (e, t) => typeof e == \"boolean\" ? {\n enabled: e,\n options: t\n} : {\n enabled: e?.enabled,\n options: e ?? t\n}, w = (e) => e.at(-1)?.color, u = (e) => {\n if (!e.length)\n return;\n if (!e.some((o) => o.color))\n return [e.map((o) => o.label).join(\" \")];\n let t = \"\";\n const n = [];\n for (const o of e)\n t += `%c${t ? ` ${o.label}` : o.label}`, n.push(\n o.color ? `color: ${o.color}` : \"\"\n );\n return [t, ...n];\n}, p = (e = [], t = b()) => {\n let n = t;\n const o = {\n enable: (c) => {\n l(c);\n },\n namespace: (c, s, a) => {\n const i = E(\n s,\n a\n ), g = i.options?.color ?? w(e);\n return p(\n [\n ...e,\n {\n label: `[${c}]`,\n color: g\n }\n ],\n i.enabled ?? n\n );\n },\n isEnabled: () => n,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (c) => {\n const s = u(e);\n if (!s)\n return [c];\n const [a, ...i] = s;\n return [`${a} ${c}`, ...i];\n },\n warn: () => {\n },\n error: () => {\n }\n }, r = (c) => {\n if (!c) {\n o.debug = () => {\n }, o.info = () => {\n }, o.log = () => {\n }, o.groupCollapsed = () => {\n }, o.groupEnd = () => {\n }, o.warn = () => {\n }, o.error = () => {\n };\n return;\n }\n const s = u(e) ?? [];\n o.debug = Function.prototype.bind.call(\n console.debug,\n console,\n ...s\n ), o.info = Function.prototype.bind.call(\n console.info,\n console,\n ...s\n ), o.log = Function.prototype.bind.call(\n console.log,\n console,\n ...s\n ), o.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), o.groupEnd = Function.prototype.bind.call(console.groupEnd, console), o.warn = Function.prototype.bind.call(\n console.warn,\n console,\n ...s\n ), o.error = Function.prototype.bind.call(\n console.error,\n console,\n ...s\n );\n }, l = (c) => {\n n !== c && (n = c, r(n));\n };\n return r(n), o;\n}, O = p(), P = \"prose-reader-resource-error\", S = (e) => e.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\nexport {\n P as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n O as Report,\n y as arrayEqual,\n h as detectMimeTypeFromName,\n S as escapeXmlAttributeValue,\n v as getItemSpreadPosition,\n $ as getParentPath,\n f as getUrlExtension,\n T as groupBy,\n _ as isMediaContentMimeType,\n F as isShallowEqual,\n x as isXmlBasedMimeType,\n C as parseContentType,\n M as shallowMergeIfDefined,\n R as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import type { Manifest } from \"@prose-reader/core\"\n\nconst AUDIO_EXTENSIONS = new Set([\n `mp3`,\n `m4a`,\n `m4b`,\n `aac`,\n `ogg`,\n `oga`,\n `wav`,\n `flac`,\n `opus`,\n])\n\nconst getExtensionFromHref = (href: string) => {\n const [pathname = ``] = href.split(/[?#]/)\n const segments = pathname.split(`/`)\n const basename = segments.at(-1) ?? ``\n const extension = basename.split(`.`).at(-1)\n\n return extension?.toLowerCase()\n}\n\nexport const isAudioSpineItem = (item: Manifest[\"spineItems\"][number]) => {\n const mediaType = item.mediaType?.split(`;`).at(0)?.trim().toLowerCase()\n\n if (mediaType?.startsWith(`audio/`)) {\n return true\n }\n\n const extension = getExtensionFromHref(item.href)\n\n return extension ? AUDIO_EXTENSIONS.has(extension) : false\n}\n","import { mapKeysTo } from \"@prose-reader/core\"\nimport { arrayEqual, isShallowEqual } from \"@prose-reader/shared\"\nimport {\n combineLatest,\n distinctUntilChanged,\n map,\n type Observable,\n shareReplay,\n} from \"rxjs\"\nimport type { AudioEnhancerState, AudioTrack } from \"../types\"\nimport { isAudioSpineItem } from \"../utils\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype PaginationTrackWindow = {\n beginSpineItemIndex: number | undefined\n endSpineItemIndex: number | undefined\n}\n\nconst getTrackAtSpineItemIndex = (\n tracks: AudioTrack[],\n index: number | undefined,\n) => {\n if (index === undefined) return undefined\n\n return tracks.find((track) => track.index === index)\n}\n\nconst getVisibleTracks = (\n tracks: AudioTrack[],\n pagination: PaginationTrackWindow,\n) => {\n const beginTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.beginSpineItemIndex,\n )\n const endTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.endSpineItemIndex,\n )\n\n return [beginTrack, endTrack].filter(\n (track, i, arr): track is AudioTrack =>\n track !== undefined && arr.indexOf(track) === i,\n )\n}\n\nexport function createTrackStreams(\n reader: Pick<AudioControllerReader, \"context\" | \"pagination\">,\n state$: Observable<AudioEnhancerState>,\n) {\n const tracks$ = reader.context.manifest$.pipe(\n map((manifest) =>\n manifest.spineItems.filter(isAudioSpineItem).map((item) => ({\n id: item.id,\n href: item.href,\n index: item.index,\n mediaType: item.mediaType,\n })),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const pagination$ = reader.pagination.state$.pipe(\n mapKeysTo([`beginSpineItemIndex`, `endSpineItemIndex`]),\n distinctUntilChanged(isShallowEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const visibleTrackIds$ = combineLatest([tracks$, pagination$]).pipe(\n map(([tracks, pagination]) =>\n getVisibleTracks(tracks, pagination).map(({ id }) => id),\n ),\n distinctUntilChanged(arrayEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const currentTrack$ = state$.pipe(\n map((state) => state.currentTrack),\n distinctUntilChanged(),\n )\n\n const nextTrack$ = combineLatest([tracks$, pagination$, currentTrack$]).pipe(\n map(([tracks, { endSpineItemIndex }, currentTrack]) => {\n const nextTrackInPaginationWindow =\n currentTrack && endSpineItemIndex !== undefined\n ? tracks.find(\n ({ index }) =>\n index > currentTrack.index && index <= endSpineItemIndex,\n )\n : undefined\n\n const nextTrackAfterCurrentTrack = currentTrack\n ? tracks.find(({ index }) => index > currentTrack.index)\n : undefined\n\n return { nextTrackInPaginationWindow, nextTrackAfterCurrentTrack }\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n return {\n tracks$,\n visibleTrackIds$,\n nextTrack$,\n }\n}\n","import { isDefined, ReactiveEntity } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n catchError,\n defaultIfEmpty,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n type Observable,\n of,\n Subject,\n Subscription,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type {\n AudioEnhancerState,\n AudioTrack,\n SelectAudioTrackOptions,\n} from \"../types\"\nimport { AudioVisualizer } from \"../visualizer\"\nimport { AudioElementAdapter } from \"./AudioElementAdapter\"\nimport { ResourcesResolver } from \"./ResourcesResolver\"\nimport { createTrackStreams } from \"./trackStreams\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype SelectCommand = {\n trackId: string\n options: SelectAudioTrackOptions\n}\n\ntype DesiredPlayback = {\n shouldPlay: boolean\n trackId: string | undefined\n}\n\nconst initialDesiredPlayback: DesiredPlayback = {\n shouldPlay: false,\n trackId: undefined,\n}\n\nconst initialState: AudioEnhancerState = {\n tracks: [],\n currentTrack: undefined,\n isPlaying: false,\n isLoading: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n}\n\nexport type { AudioControllerReader }\n\nexport class AudioController extends ReactiveEntity<AudioEnhancerState> {\n private readonly reader: AudioControllerReader\n private readonly audio: AudioElementAdapter\n readonly visualizer$: AudioVisualizer\n readonly resourcesResolver = new ResourcesResolver()\n readonly visibleTrackIds$: Observable<string[]>\n\n private readonly playCommandSubject = new Subject<void>()\n private readonly pauseCommandSubject = new Subject<void>()\n private readonly selectCommandSubject = new Subject<SelectCommand>()\n private readonly desiredPlayback$ = new BehaviorSubject(\n initialDesiredPlayback,\n )\n private readonly subscriptions = new Subscription()\n\n constructor(\n reader: AudioControllerReader,\n audio = new AudioElementAdapter(),\n ) {\n super(initialState)\n\n this.reader = reader\n this.audio = audio\n this.visualizer$ = new AudioVisualizer(this.audio.element)\n\n const { tracks$, visibleTrackIds$, nextTrack$ } = createTrackStreams(\n this.reader,\n this.state$,\n )\n\n this.visibleTrackIds$ = visibleTrackIds$\n\n const firstVisibleTrackId$ = this.visibleTrackIds$.pipe(\n map((trackIds) => trackIds[0]),\n distinctUntilChanged(),\n share(),\n )\n\n const visibleTrackReset$ = firstVisibleTrackId$.pipe(\n withLatestFrom(this.state$),\n filter(\n ([trackId, state]) =>\n trackId === undefined &&\n (state.currentTrack?.id !== undefined || state.isLoading),\n ),\n map(([, state]) => state.tracks),\n )\n\n const visibleTrackSelectionIntent$ = firstVisibleTrackId$.pipe(\n filter((trackId): trackId is string => trackId !== undefined),\n withLatestFrom(this.desiredPlayback$),\n map(([trackId, { shouldPlay }]) => ({\n trackId,\n options: {\n navigate: false,\n play: shouldPlay ? true : undefined,\n },\n })),\n )\n\n const tracksChanged$ = tracks$.pipe(\n tap(() => this.resourcesResolver.releaseAll()),\n )\n\n const playbackReset$ = merge(visibleTrackReset$, tracksChanged$).pipe(\n tap((tracks) => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n this.visualizer$.stop({ resetLevels: true })\n this.unmountCurrentSource()\n\n this.mergeCompare({\n tracks,\n currentTrack: undefined,\n isLoading: false,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(undefined)\n }),\n share(),\n )\n\n const playSelectionIntent$ = this.playCommandSubject.pipe(\n filter(() => !this.audio.hasSource),\n map(() => this.state.currentTrack ?? this.state.tracks[0]),\n filter(isDefined),\n map((track) => ({\n trackId: track.id,\n options: { navigate: false, play: true },\n })),\n )\n\n const resumePlayback$ = this.playCommandSubject.pipe(\n filter(() => this.audio.hasSource),\n tap(() => {\n this.emitDesiredPlayback({\n shouldPlay: true,\n trackId: this.state.currentTrack?.id,\n })\n }),\n )\n\n const endedSelectionIntent$ = this.audio.ended$.pipe(\n withLatestFrom(nextTrack$),\n switchMap(\n ([, { nextTrackAfterCurrentTrack, nextTrackInPaginationWindow }]) => {\n this.visualizer$.stop({ resetLevels: true })\n\n if (nextTrackInPaginationWindow) {\n return of({\n trackId: nextTrackInPaginationWindow.id,\n options: { navigate: false, play: true },\n })\n }\n\n if (!nextTrackAfterCurrentTrack) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }\n\n this.reader.navigation.goToRightOrBottomSpineItem()\n\n return EMPTY\n },\n ),\n )\n\n const selection$ = merge(\n this.selectCommandSubject,\n visibleTrackSelectionIntent$,\n endedSelectionIntent$,\n playSelectionIntent$,\n ).pipe(\n withLatestFrom(this.state$),\n filter(([selectionIntent, state]) =>\n state.tracks.some(({ id }) => id === selectionIntent.trackId),\n ),\n map(([selectionIntent, state]) => ({\n selectionIntent,\n state,\n isReselectionWhileLoading:\n state.currentTrack?.id === selectionIntent.trackId && state.isLoading,\n })),\n tap(({ selectionIntent, state, isReselectionWhileLoading }) => {\n if (selectionIntent.options.navigate !== false) {\n this.reader.navigation.navigate({\n spineItem: selectionIntent.trackId,\n animation: `turn`,\n })\n }\n\n if (\n isReselectionWhileLoading &&\n selectionIntent.options.play !== undefined\n ) {\n this.emitDesiredPlayback({\n shouldPlay: selectionIntent.options.play,\n trackId: state.currentTrack?.id,\n })\n }\n }),\n filter(({ isReselectionWhileLoading }) => !isReselectionWhileLoading),\n switchMap(({ selectionIntent: { trackId, options } }) =>\n this.selectTrack$({ trackId, options, playbackReset$ }),\n ),\n )\n\n const playback$ = merge(resumePlayback$, selection$).pipe(\n withLatestFrom(this.desiredPlayback$),\n switchMap(([, { shouldPlay, trackId }]) => {\n if (\n !shouldPlay ||\n !this.audio.hasSource ||\n this.state.currentTrack?.id !== trackId\n ) {\n return EMPTY\n }\n\n this.mergeCompare({ hasError: false })\n\n return this.audio.play$().pipe(\n catchError(() => {\n this.mergeCompare({ hasError: true })\n\n return EMPTY\n }),\n )\n }),\n )\n\n this.subscriptions.add(playbackReset$.subscribe())\n this.subscriptions.add(playback$.subscribe())\n\n this.subscriptions.add(\n this.pauseCommandSubject.subscribe(() => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }),\n )\n\n this.subscriptions.add(\n this.audio.isPlaying$.subscribe((isPlaying) => {\n this.mergeCompare({ isPlaying })\n\n if (!isPlaying) {\n this.visualizer$.stop()\n return\n }\n\n if (!this.state.currentTrack) return\n\n this.visualizer$.start(this.state.currentTrack)\n }),\n )\n\n this.subscriptions.add(\n this.audio.metrics$.subscribe(({ currentTime, duration }) => {\n this.mergeCompare({ currentTime, duration })\n }),\n )\n }\n\n get state() {\n return this.value\n }\n\n get visualizer() {\n return this.visualizer$.value\n }\n\n private resetTrackSelection({\n currentTrack,\n isLoading,\n }: {\n currentTrack: AudioTrack\n isLoading: boolean\n }) {\n this.mergeCompare({\n currentTrack,\n isLoading,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(currentTrack?.id)\n }\n\n private emitDesiredPlayback({ shouldPlay, trackId }: DesiredPlayback) {\n this.desiredPlayback$.next({\n shouldPlay,\n trackId: shouldPlay ? trackId : undefined,\n })\n\n if (!shouldPlay) {\n this.audio.pause()\n }\n }\n\n private unmountCurrentSource() {\n if (!this.audio.hasSource) return\n\n const trackId = this.state.currentTrack?.id\n\n if (!this.audio.paused) {\n this.audio.pause()\n }\n\n this.audio.unloadSource()\n\n if (trackId) {\n this.resourcesResolver.releaseTrackSource(trackId)\n }\n }\n\n private mountSource(source: string) {\n this.unmountCurrentSource()\n this.audio.loadSource(source)\n }\n\n private resolveTrackSource(track: AudioTrack) {\n const spineItem = this.reader.spineItemsManager.get(track.index)\n\n if (!spineItem) return EMPTY\n\n return this.resourcesResolver.getTrackResourceUrl$(\n track,\n spineItem.resourcesHandler,\n )\n }\n\n private selectTrack$({\n trackId,\n options,\n playbackReset$,\n }: {\n trackId: string\n options: SelectAudioTrackOptions\n playbackReset$: Observable<AudioTrack[]>\n }) {\n const track = this.state.tracks.find(({ id }) => id === trackId)\n\n if (!track) return EMPTY\n\n const currentTrack = this.state.currentTrack\n const shouldPlay =\n options.play ?? (!this.audio.paused && currentTrack !== undefined)\n\n this.emitDesiredPlayback({ shouldPlay, trackId: track.id })\n\n if (currentTrack?.id === track.id && this.audio.hasSource) {\n this.visualizer$.setTrack(track.id)\n\n return shouldPlay ? of(undefined) : EMPTY\n }\n\n this.unmountCurrentSource()\n\n this.resetTrackSelection({\n currentTrack: track,\n isLoading: true,\n })\n\n return this.resolveTrackSource(track).pipe(\n map((source) => ({ source })),\n defaultIfEmpty({ source: undefined }),\n catchError(() => of({ source: undefined })),\n takeUntil(playbackReset$),\n tap(({ source }) => {\n if (!source) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n } else {\n this.mountSource(source)\n }\n\n this.mergeCompare({ isLoading: false })\n }),\n filter(({ source }) => source !== undefined),\n map(() => undefined),\n )\n }\n\n select(trackId: string, options: SelectAudioTrackOptions = {}) {\n this.selectCommandSubject.next({ trackId, options })\n }\n\n play() {\n this.playCommandSubject.next()\n }\n\n pause() {\n this.pauseCommandSubject.next()\n }\n\n toggle() {\n if (this.audio.paused) {\n this.play()\n return\n }\n\n this.pause()\n }\n\n setCurrentTime(value: number) {\n this.mergeCompare({ currentTime: value })\n this.audio.setCurrentTime(value)\n }\n\n destroy() {\n this.subscriptions.unsubscribe()\n this.playCommandSubject.complete()\n this.pauseCommandSubject.complete()\n this.selectCommandSubject.complete()\n this.desiredPlayback$.complete()\n this.visualizer$.destroy()\n this.unmountCurrentSource()\n this.resourcesResolver.destroy()\n\n super.destroy()\n }\n}\n","import { DocumentRenderer, setStylePropertyIfChanged } from \"@prose-reader/core\"\nimport { EMPTY, of } from \"rxjs\"\n\nexport class AudioRenderer extends DocumentRenderer {\n onCreateDocument() {\n const ownerDocument = this.containerElement.ownerDocument\n const rootElement = ownerDocument.createElement(`div`)\n\n rootElement.style.cssText = `\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n display: block;\n `\n rootElement.setAttribute(`data-prose-reader-audio-page`, this.item.id)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument() {\n this.attach()\n\n return EMPTY\n }\n\n onUnload() {\n this.detach()\n\n return EMPTY\n }\n\n onLayout() {\n const { width, height } = this.viewport.pageSize\n const rootElement = this.documentContainer\n\n if (rootElement) {\n setStylePropertyIfChanged(rootElement.style, `width`, `${width}px`)\n setStylePropertyIfChanged(rootElement.style, `height`, `${height}px`)\n }\n\n return of({ width, height })\n }\n\n onRenderHeadless() {\n return EMPTY\n }\n\n getDocumentFrame() {\n return undefined\n }\n\n /**\n * Audio spine items are always pre-paginated (one track per page).\n * Mixed audio/text books with reflowable audio chapters may need\n * to revisit this if that use case arises.\n */\n get renditionLayout(): `pre-paginated` {\n return `pre-paginated`\n }\n}\n","import type { CreateReaderOptions, Reader } from \"@prose-reader/core\"\nimport { AudioController } from \"./playback/AudioController\"\nimport { AudioRenderer } from \"./renderer/AudioRenderer\"\nimport type { AudioEnhancerAPI } from \"./types\"\nimport { isAudioSpineItem } from \"./utils\"\n\nexport const audioEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & AudioEnhancerAPI => {\n const readerOptions = { ...options }\n\n const reader = next({\n ...readerOptions,\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (maybeFactory) {\n return maybeFactory\n }\n\n if (isAudioSpineItem(item)) {\n return (params) => new AudioRenderer(params)\n }\n\n return undefined\n },\n })\n\n const controller = new AudioController(reader)\n\n const destroy = () => {\n controller.destroy()\n reader.destroy()\n }\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_AUDIO: true,\n destroy,\n audio: {\n state$: controller.state$,\n visualizer$: controller.visualizer$,\n visibleTrackIds$: controller.visibleTrackIds$,\n get state() {\n return controller.state\n },\n get visualizer() {\n return controller.visualizer\n },\n isAudioRenderer: (renderer) => renderer instanceof AudioRenderer,\n play: () => controller.play(),\n pause: () => controller.pause(),\n toggle: () => controller.toggle(),\n setCurrentTime: (value) => controller.setCurrentTime(value),\n select: (trackId, options) => controller.select(trackId, options),\n },\n }\n }\n"],"names":["isShallowEqual","arrayEqual","options"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -315,18 +315,18 @@
|
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
-
const y = (e,
|
|
319
|
-
const
|
|
320
|
-
if (Object.is(e,
|
|
318
|
+
const y = (e, t) => e === t ? true : e.length !== t.length ? false : e.every((n, o) => n === t[o]);
|
|
319
|
+
const F = (e, t, n) => {
|
|
320
|
+
if (Object.is(e, t))
|
|
321
321
|
return true;
|
|
322
|
-
if (typeof e != "object" || e === null || typeof
|
|
322
|
+
if (typeof e != "object" || e === null || typeof t != "object" || t === null)
|
|
323
323
|
return false;
|
|
324
|
-
const o = Object.keys(e), r = Object.keys(
|
|
324
|
+
const o = Object.keys(e), r = Object.keys(t);
|
|
325
325
|
if (o.length !== r.length)
|
|
326
326
|
return false;
|
|
327
|
-
const l =
|
|
328
|
-
for (const
|
|
329
|
-
if (!Object.hasOwn(s,
|
|
327
|
+
const l = n?.customEqual ?? Object.is, c = e, s = t;
|
|
328
|
+
for (const a of o)
|
|
329
|
+
if (!Object.hasOwn(s, a) || !l(c[a], s[a]))
|
|
330
330
|
return false;
|
|
331
331
|
return true;
|
|
332
332
|
};
|
|
@@ -338,35 +338,35 @@
|
|
|
338
338
|
const e = m()?.__PROSE_READER_DEBUG;
|
|
339
339
|
return e === true || e === "true";
|
|
340
340
|
}
|
|
341
|
-
const E = (e,
|
|
341
|
+
const E = (e, t) => typeof e == "boolean" ? {
|
|
342
342
|
enabled: e,
|
|
343
|
-
options:
|
|
343
|
+
options: t
|
|
344
344
|
} : {
|
|
345
345
|
enabled: e?.enabled,
|
|
346
|
-
options: e ??
|
|
346
|
+
options: e ?? t
|
|
347
347
|
}, w = (e) => e.at(-1)?.color, u = (e) => {
|
|
348
348
|
if (!e.length)
|
|
349
349
|
return;
|
|
350
350
|
if (!e.some((o) => o.color))
|
|
351
351
|
return [e.map((o) => o.label).join(" ")];
|
|
352
|
-
let
|
|
353
|
-
const
|
|
352
|
+
let t = "";
|
|
353
|
+
const n = [];
|
|
354
354
|
for (const o of e)
|
|
355
|
-
|
|
355
|
+
t += `%c${t ? ` ${o.label}` : o.label}`, n.push(
|
|
356
356
|
o.color ? `color: ${o.color}` : ""
|
|
357
357
|
);
|
|
358
|
-
return [
|
|
359
|
-
}, p = (e = [],
|
|
360
|
-
let
|
|
358
|
+
return [t, ...n];
|
|
359
|
+
}, p = (e = [], t = b()) => {
|
|
360
|
+
let n = t;
|
|
361
361
|
const o = {
|
|
362
362
|
enable: (c) => {
|
|
363
363
|
l(c);
|
|
364
364
|
},
|
|
365
|
-
namespace: (c, s,
|
|
366
|
-
const
|
|
365
|
+
namespace: (c, s, a) => {
|
|
366
|
+
const i = E(
|
|
367
367
|
s,
|
|
368
|
-
|
|
369
|
-
), g =
|
|
368
|
+
a
|
|
369
|
+
), g = i.options?.color ?? w(e);
|
|
370
370
|
return p(
|
|
371
371
|
[
|
|
372
372
|
...e,
|
|
@@ -375,10 +375,10 @@
|
|
|
375
375
|
color: g
|
|
376
376
|
}
|
|
377
377
|
],
|
|
378
|
-
|
|
378
|
+
i.enabled ?? n
|
|
379
379
|
);
|
|
380
380
|
},
|
|
381
|
-
isEnabled: () =>
|
|
381
|
+
isEnabled: () => n,
|
|
382
382
|
debug: () => {
|
|
383
383
|
},
|
|
384
384
|
info: () => {
|
|
@@ -393,8 +393,8 @@
|
|
|
393
393
|
const s = u(e);
|
|
394
394
|
if (!s)
|
|
395
395
|
return [c];
|
|
396
|
-
const [
|
|
397
|
-
return [`${
|
|
396
|
+
const [a, ...i] = s;
|
|
397
|
+
return [`${a} ${c}`, ...i];
|
|
398
398
|
},
|
|
399
399
|
warn: () => {
|
|
400
400
|
},
|
|
@@ -438,9 +438,9 @@
|
|
|
438
438
|
...s
|
|
439
439
|
);
|
|
440
440
|
}, l = (c) => {
|
|
441
|
-
|
|
441
|
+
n !== c && (n = c, r(n));
|
|
442
442
|
};
|
|
443
|
-
return r(
|
|
443
|
+
return r(n), o;
|
|
444
444
|
}; p();
|
|
445
445
|
|
|
446
446
|
const AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
@@ -501,7 +501,7 @@
|
|
|
501
501
|
);
|
|
502
502
|
const pagination$ = reader.pagination.state$.pipe(
|
|
503
503
|
core.mapKeysTo([`beginSpineItemIndex`, `endSpineItemIndex`]),
|
|
504
|
-
rxjs.distinctUntilChanged(
|
|
504
|
+
rxjs.distinctUntilChanged(F),
|
|
505
505
|
rxjs.shareReplay({ bufferSize: 1, refCount: true })
|
|
506
506
|
);
|
|
507
507
|
const visibleTrackIds$ = rxjs.combineLatest([tracks$, pagination$]).pipe(
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/visualizer/levels.ts","../src/visualizer/VisualizerAudioGraph.ts","../src/visualizer/AudioVisualizer.ts","../src/playback/AudioElementAdapter.ts","../src/playback/ResourcesResolver.ts","../../shared/dist/index.js","../src/utils.ts","../src/playback/trackStreams.ts","../src/playback/AudioController.ts","../src/renderer/AudioRenderer.ts","../src/audioEnhancer.ts"],"sourcesContent":["const AUDIO_VISUALIZER_LEVEL_COUNT = 80\nconst AUDIO_VISUALIZER_NOISE_FLOOR = 0.035\n\nexport const getIdleVisualizerLevels = () =>\n Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, () => 0)\n\nexport const getVisualizerLevels = (data: ArrayLike<number>) => {\n if (data.length === 0) return getIdleVisualizerLevels()\n\n const bucketSize = Math.max(\n 1,\n Math.floor(data.length / AUDIO_VISUALIZER_LEVEL_COUNT),\n )\n\n return Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, (_, index) => {\n const start = index * bucketSize\n const end = Math.min(data.length, start + bucketSize)\n\n if (start >= data.length || start === end) return 0\n\n let total = 0\n\n for (let cursor = start; cursor < end; cursor += 1) {\n total += data[cursor] ?? 0\n }\n\n const average = total / (end - start)\n const normalizedAverage = average / 255\n const gatedAverage =\n (normalizedAverage - AUDIO_VISUALIZER_NOISE_FLOOR) /\n (1 - AUDIO_VISUALIZER_NOISE_FLOOR)\n\n return Math.max(0, Math.min(1, gatedAverage))\n })\n}\n","import { getIdleVisualizerLevels, getVisualizerLevels } from \"./levels\"\n\nconst AUDIO_VISUALIZER_FFT_SIZE = 256\n\nexport class VisualizerAudioGraph {\n private audioContext: AudioContext | undefined\n private audioSourceNode: MediaElementAudioSourceNode | undefined\n private analyserNode: AnalyserNode | undefined\n private frequencyData: Uint8Array<ArrayBuffer> | undefined\n\n constructor(private readonly audioElement: HTMLAudioElement) {}\n\n async resumeIfNeeded() {\n if (!this.ensure()) {\n return false\n }\n\n const audioContext = this.audioContext\n\n if (!audioContext) {\n return false\n }\n\n if (audioContext.state !== `suspended`) {\n return true\n }\n\n try {\n await audioContext.resume()\n\n return true\n } catch {\n return false\n }\n }\n\n readLevels() {\n if (!this.analyserNode || !this.frequencyData) {\n return getIdleVisualizerLevels()\n }\n\n this.analyserNode.getByteFrequencyData(this.frequencyData)\n\n return getVisualizerLevels(this.frequencyData)\n }\n\n destroy() {\n this.audioSourceNode?.disconnect()\n this.analyserNode?.disconnect()\n this.audioContext?.close().catch(() => undefined)\n this.audioContext = undefined\n this.audioSourceNode = undefined\n this.analyserNode = undefined\n this.frequencyData = undefined\n }\n\n private ensure() {\n if (this.audioContext && this.analyserNode && this.frequencyData) {\n return true\n }\n\n if (typeof window === `undefined` || !window.AudioContext) {\n return false\n }\n\n const audioContext = new window.AudioContext()\n const audioSourceNode = audioContext.createMediaElementSource(\n this.audioElement,\n )\n const analyserNode = audioContext.createAnalyser()\n analyserNode.fftSize = AUDIO_VISUALIZER_FFT_SIZE\n analyserNode.smoothingTimeConstant = 0.8\n audioSourceNode.connect(analyserNode)\n analyserNode.connect(audioContext.destination)\n\n this.audioContext = audioContext\n this.audioSourceNode = audioSourceNode\n this.analyserNode = analyserNode\n this.frequencyData = new Uint8Array(analyserNode.frequencyBinCount)\n\n return true\n }\n}\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport {\n animationFrames,\n BehaviorSubject,\n concat,\n defaultIfEmpty,\n defer,\n distinctUntilChanged,\n EMPTY,\n from,\n map,\n of,\n Subscription,\n switchMap,\n} from \"rxjs\"\nimport type { AudioTrack, AudioVisualizerState } from \"../types\"\nimport { getIdleVisualizerLevels } from \"./levels\"\nimport { VisualizerAudioGraph } from \"./VisualizerAudioGraph\"\n\ntype AudioVisualizerPlaybackState = {\n trackId: string | undefined\n isRunning: boolean\n resetLevels: boolean\n}\n\nexport class AudioVisualizer extends ReactiveEntity<AudioVisualizerState> {\n private readonly audioGraph: VisualizerAudioGraph\n private readonly playbackState$ =\n new BehaviorSubject<AudioVisualizerPlaybackState>({\n trackId: undefined,\n isRunning: false,\n resetLevels: false,\n })\n private readonly subscriptions = new Subscription()\n\n constructor(audioElement: HTMLAudioElement) {\n super({\n levels: getIdleVisualizerLevels(),\n isActive: false,\n trackId: undefined,\n })\n this.audioGraph = new VisualizerAudioGraph(audioElement)\n\n this.subscriptions.add(\n this.playbackState$\n .pipe(\n distinctUntilChanged(\n (previous, next) =>\n previous.trackId === next.trackId &&\n previous.isRunning === next.isRunning &&\n previous.resetLevels === next.resetLevels,\n ),\n switchMap(({ trackId, isRunning, resetLevels }) => {\n if (!trackId || !isRunning) {\n return of({\n trackId,\n isActive: false,\n ...(resetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n })\n }\n\n const shouldResetLevels = this.value.trackId !== trackId\n\n return concat(\n of({\n trackId,\n isActive: true,\n ...(shouldResetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n }),\n this.createLevels$().pipe(\n map((levels) => ({\n trackId,\n levels,\n isActive: true,\n })),\n defaultIfEmpty({\n trackId,\n isActive: false,\n levels: getIdleVisualizerLevels(),\n }),\n ),\n )\n }),\n )\n .subscribe((value) => {\n this.mergeCompare(value)\n }),\n )\n }\n\n start(currentTrack: AudioTrack | undefined) {\n if (!currentTrack) return\n\n this.playbackState$.next({\n trackId: currentTrack.id,\n isRunning: true,\n resetLevels: false,\n })\n }\n\n setTrack(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: false,\n })\n }\n\n reset(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: true,\n })\n }\n\n stop({ resetLevels = false }: { resetLevels?: boolean } = {}) {\n this.playbackState$.next({\n trackId: this.playbackState$.value.trackId,\n isRunning: false,\n resetLevels,\n })\n }\n\n override destroy() {\n this.stop({\n resetLevels: true,\n })\n this.subscriptions.unsubscribe()\n this.playbackState$.complete()\n this.audioGraph.destroy()\n\n super.destroy()\n }\n\n private createLevels$() {\n return defer(() => {\n return from(this.audioGraph.resumeIfNeeded()).pipe(\n switchMap((isReady) =>\n isReady\n ? animationFrames().pipe(map(() => this.audioGraph.readLevels()))\n : EMPTY,\n ),\n )\n })\n }\n}\n","import {\n defer,\n from,\n fromEvent,\n map,\n merge,\n type Observable,\n retry,\n share,\n take,\n} from \"rxjs\"\n\nexport type AudioMetrics = {\n currentTime: number\n duration: number | undefined\n}\n\nexport class AudioElementAdapter {\n readonly element: HTMLAudioElement\n readonly canPlay$: Observable<Event>\n readonly ended$: Observable<Event>\n readonly isPlaying$: Observable<boolean>\n readonly metrics$: Observable<AudioMetrics>\n\n constructor() {\n this.element = document.createElement(`audio`)\n this.element.preload = `metadata`\n\n this.canPlay$ = fromEvent(this.element, `canplay`).pipe(share())\n this.ended$ = fromEvent(this.element, `ended`).pipe(share())\n\n this.isPlaying$ = merge(\n fromEvent(this.element, `play`).pipe(map(() => true)),\n fromEvent(this.element, `pause`).pipe(map(() => false)),\n ).pipe(share())\n\n this.metrics$ = merge(\n fromEvent(this.element, `timeupdate`),\n fromEvent(this.element, `seeking`),\n fromEvent(this.element, `seeked`),\n fromEvent(this.element, `loadedmetadata`),\n fromEvent(this.element, `durationchange`),\n this.canPlay$,\n ).pipe(\n map(() => ({\n currentTime: this.element.currentTime,\n duration: Number.isFinite(this.element.duration)\n ? this.element.duration\n : undefined,\n })),\n share(),\n )\n }\n\n get paused() {\n return this.element.paused\n }\n\n get hasSource() {\n return this.element.hasAttribute(`src`)\n }\n\n play$() {\n return defer(() => from(this.element.play())).pipe(\n retry({\n count: 1,\n delay: () => this.canPlay$.pipe(take(1)),\n }),\n )\n }\n\n pause() {\n this.element.pause()\n }\n\n loadSource(src: string) {\n this.element.src = src\n this.element.load()\n }\n\n unloadSource() {\n this.element.removeAttribute(`src`)\n this.element.load()\n }\n\n setCurrentTime(value: number) {\n this.element.currentTime = value\n }\n}\n","import type { ResourceHandler } from \"@prose-reader/core\"\nimport { from, map, of, switchMap } from \"rxjs\"\nimport type { AudioTrack } from \"../types\"\n\ntype CachedTrackSource = {\n url: string\n release?: () => void\n}\n\nexport class ResourcesResolver {\n private readonly cachedSourceByTrackId = new Map<string, CachedTrackSource>()\n\n public hasCachedSource(trackId: string): boolean {\n return this.cachedSourceByTrackId.has(trackId)\n }\n\n public getTrackResourceUrl$ = (\n track: AudioTrack,\n resourcesHandler: Pick<ResourceHandler, \"getResource\">,\n ) => {\n const cachedSource = this.cachedSourceByTrackId.get(track.id)\n\n if (cachedSource) {\n return of(cachedSource.url)\n }\n\n const resource$ = from(resourcesHandler.getResource())\n\n return resource$.pipe(\n switchMap((resource) => {\n if (resource instanceof URL) {\n this.cachedSourceByTrackId.set(track.id, {\n url: resource.href,\n })\n\n return of(resource.href)\n }\n\n if (resource instanceof Response) {\n return from(resource.blob()).pipe(\n map((blob) => {\n const objectUrl = URL.createObjectURL(blob)\n\n this.cachedSourceByTrackId.set(track.id, {\n url: objectUrl,\n release: () => {\n URL.revokeObjectURL(objectUrl)\n },\n })\n\n return objectUrl\n }),\n )\n }\n\n this.cachedSourceByTrackId.set(track.id, {\n url: track.href,\n })\n\n return of(track.href)\n }),\n )\n }\n\n public releaseTrackSource(trackId: string) {\n const cachedSource = this.cachedSourceByTrackId.get(trackId)\n\n if (!cachedSource) return\n\n this.cachedSourceByTrackId.delete(trackId)\n cachedSource.release?.()\n }\n\n public releaseAll() {\n for (const trackId of this.cachedSourceByTrackId.keys()) {\n this.releaseTrackSource(trackId)\n }\n }\n\n public destroy() {\n this.releaseAll()\n }\n}\n","const y = (e, n) => e === n ? !0 : e.length !== n.length ? !1 : e.every((t, o) => t === n[o]), f = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction d(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), n.push(l));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction R(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return d(n);\n}\nfunction $(e) {\n const n = e.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst h = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, x = ({\n mimeType: e,\n uri: n\n}) => (e ?? h(n ?? \"\"))?.startsWith(\"application/xhtml+xml\"), _ = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), C = (e) => {\n if (!e.length) return;\n const n = e.indexOf(\";\");\n return n >= 0 ? e.substring(0, n) : e;\n}, v = (e, n, t) => {\n if (Object.is(e, n))\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(n);\n if (o.length !== r.length)\n return !1;\n const l = t?.customEqual ?? Object.is, c = e, s = n;\n for (const i of o)\n if (!Object.hasOwn(s, i) || !l(c[i], s[i]))\n return !1;\n return !0;\n}, F = (e, n) => e.reduce(\n (t, o) => {\n const r = n(o);\n return t[r] || (t[r] = []), t[r].push(o), t;\n },\n {}\n);\nfunction T(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.hasOwn(n, o)) {\n const r = n[o];\n (r !== void 0 || !(o in e)) && (t[o] = r);\n }\n return t;\n}\nconst m = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction b() {\n const e = m()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst E = (e, n) => typeof e == \"boolean\" ? {\n enabled: e,\n options: n\n} : {\n enabled: e?.enabled,\n options: e ?? n\n}, w = (e) => e.at(-1)?.color, u = (e) => {\n if (!e.length)\n return;\n if (!e.some((o) => o.color))\n return [e.map((o) => o.label).join(\" \")];\n let n = \"\";\n const t = [];\n for (const o of e)\n n += `%c${n ? ` ${o.label}` : o.label}`, t.push(\n o.color ? `color: ${o.color}` : \"\"\n );\n return [n, ...t];\n}, p = (e = [], n = b()) => {\n let t = n;\n const o = {\n enable: (c) => {\n l(c);\n },\n namespace: (c, s, i) => {\n const a = E(\n s,\n i\n ), g = a.options?.color ?? w(e);\n return p(\n [\n ...e,\n {\n label: `[${c}]`,\n color: g\n }\n ],\n a.enabled ?? t\n );\n },\n isEnabled: () => t,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (c) => {\n const s = u(e);\n if (!s)\n return [c];\n const [i, ...a] = s;\n return [`${i} ${c}`, ...a];\n },\n warn: () => {\n },\n error: () => {\n }\n }, r = (c) => {\n if (!c) {\n o.debug = () => {\n }, o.info = () => {\n }, o.log = () => {\n }, o.groupCollapsed = () => {\n }, o.groupEnd = () => {\n }, o.warn = () => {\n }, o.error = () => {\n };\n return;\n }\n const s = u(e) ?? [];\n o.debug = Function.prototype.bind.call(\n console.debug,\n console,\n ...s\n ), o.info = Function.prototype.bind.call(\n console.info,\n console,\n ...s\n ), o.log = Function.prototype.bind.call(\n console.log,\n console,\n ...s\n ), o.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), o.groupEnd = Function.prototype.bind.call(console.groupEnd, console), o.warn = Function.prototype.bind.call(\n console.warn,\n console,\n ...s\n ), o.error = Function.prototype.bind.call(\n console.error,\n console,\n ...s\n );\n }, l = (c) => {\n t !== c && (t = c, r(t));\n };\n return r(t), o;\n}, M = p(), O = \"prose-reader-resource-error\", k = (e) => e.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\nexport {\n O as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n M as Report,\n y as arrayEqual,\n h as detectMimeTypeFromName,\n k as escapeXmlAttributeValue,\n $ as getParentPath,\n f as getUrlExtension,\n F as groupBy,\n _ as isMediaContentMimeType,\n v as isShallowEqual,\n x as isXmlBasedMimeType,\n C as parseContentType,\n T as shallowMergeIfDefined,\n R as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import type { Manifest } from \"@prose-reader/core\"\n\nconst AUDIO_EXTENSIONS = new Set([\n `mp3`,\n `m4a`,\n `m4b`,\n `aac`,\n `ogg`,\n `oga`,\n `wav`,\n `flac`,\n `opus`,\n])\n\nconst getExtensionFromHref = (href: string) => {\n const [pathname = ``] = href.split(/[?#]/)\n const segments = pathname.split(`/`)\n const basename = segments.at(-1) ?? ``\n const extension = basename.split(`.`).at(-1)\n\n return extension?.toLowerCase()\n}\n\nexport const isAudioSpineItem = (item: Manifest[\"spineItems\"][number]) => {\n const mediaType = item.mediaType?.split(`;`).at(0)?.trim().toLowerCase()\n\n if (mediaType?.startsWith(`audio/`)) {\n return true\n }\n\n const extension = getExtensionFromHref(item.href)\n\n return extension ? AUDIO_EXTENSIONS.has(extension) : false\n}\n","import { mapKeysTo } from \"@prose-reader/core\"\nimport { arrayEqual, isShallowEqual } from \"@prose-reader/shared\"\nimport {\n combineLatest,\n distinctUntilChanged,\n map,\n type Observable,\n shareReplay,\n} from \"rxjs\"\nimport type { AudioEnhancerState, AudioTrack } from \"../types\"\nimport { isAudioSpineItem } from \"../utils\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype PaginationTrackWindow = {\n beginSpineItemIndex: number | undefined\n endSpineItemIndex: number | undefined\n}\n\nconst getTrackAtSpineItemIndex = (\n tracks: AudioTrack[],\n index: number | undefined,\n) => {\n if (index === undefined) return undefined\n\n return tracks.find((track) => track.index === index)\n}\n\nconst getVisibleTracks = (\n tracks: AudioTrack[],\n pagination: PaginationTrackWindow,\n) => {\n const beginTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.beginSpineItemIndex,\n )\n const endTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.endSpineItemIndex,\n )\n\n return [beginTrack, endTrack].filter(\n (track, i, arr): track is AudioTrack =>\n track !== undefined && arr.indexOf(track) === i,\n )\n}\n\nexport function createTrackStreams(\n reader: Pick<AudioControllerReader, \"context\" | \"pagination\">,\n state$: Observable<AudioEnhancerState>,\n) {\n const tracks$ = reader.context.manifest$.pipe(\n map((manifest) =>\n manifest.spineItems.filter(isAudioSpineItem).map((item) => ({\n id: item.id,\n href: item.href,\n index: item.index,\n mediaType: item.mediaType,\n })),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const pagination$ = reader.pagination.state$.pipe(\n mapKeysTo([`beginSpineItemIndex`, `endSpineItemIndex`]),\n distinctUntilChanged(isShallowEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const visibleTrackIds$ = combineLatest([tracks$, pagination$]).pipe(\n map(([tracks, pagination]) =>\n getVisibleTracks(tracks, pagination).map(({ id }) => id),\n ),\n distinctUntilChanged(arrayEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const currentTrack$ = state$.pipe(\n map((state) => state.currentTrack),\n distinctUntilChanged(),\n )\n\n const nextTrack$ = combineLatest([tracks$, pagination$, currentTrack$]).pipe(\n map(([tracks, { endSpineItemIndex }, currentTrack]) => {\n const nextTrackInPaginationWindow =\n currentTrack && endSpineItemIndex !== undefined\n ? tracks.find(\n ({ index }) =>\n index > currentTrack.index && index <= endSpineItemIndex,\n )\n : undefined\n\n const nextTrackAfterCurrentTrack = currentTrack\n ? tracks.find(({ index }) => index > currentTrack.index)\n : undefined\n\n return { nextTrackInPaginationWindow, nextTrackAfterCurrentTrack }\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n return {\n tracks$,\n visibleTrackIds$,\n nextTrack$,\n }\n}\n","import { isDefined, ReactiveEntity } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n catchError,\n defaultIfEmpty,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n type Observable,\n of,\n Subject,\n Subscription,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type {\n AudioEnhancerState,\n AudioTrack,\n SelectAudioTrackOptions,\n} from \"../types\"\nimport { AudioVisualizer } from \"../visualizer\"\nimport { AudioElementAdapter } from \"./AudioElementAdapter\"\nimport { ResourcesResolver } from \"./ResourcesResolver\"\nimport { createTrackStreams } from \"./trackStreams\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype SelectCommand = {\n trackId: string\n options: SelectAudioTrackOptions\n}\n\ntype DesiredPlayback = {\n shouldPlay: boolean\n trackId: string | undefined\n}\n\nconst initialDesiredPlayback: DesiredPlayback = {\n shouldPlay: false,\n trackId: undefined,\n}\n\nconst initialState: AudioEnhancerState = {\n tracks: [],\n currentTrack: undefined,\n isPlaying: false,\n isLoading: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n}\n\nexport type { AudioControllerReader }\n\nexport class AudioController extends ReactiveEntity<AudioEnhancerState> {\n private readonly reader: AudioControllerReader\n private readonly audio: AudioElementAdapter\n readonly visualizer$: AudioVisualizer\n readonly resourcesResolver = new ResourcesResolver()\n readonly visibleTrackIds$: Observable<string[]>\n\n private readonly playCommandSubject = new Subject<void>()\n private readonly pauseCommandSubject = new Subject<void>()\n private readonly selectCommandSubject = new Subject<SelectCommand>()\n private readonly desiredPlayback$ = new BehaviorSubject(\n initialDesiredPlayback,\n )\n private readonly subscriptions = new Subscription()\n\n constructor(\n reader: AudioControllerReader,\n audio = new AudioElementAdapter(),\n ) {\n super(initialState)\n\n this.reader = reader\n this.audio = audio\n this.visualizer$ = new AudioVisualizer(this.audio.element)\n\n const { tracks$, visibleTrackIds$, nextTrack$ } = createTrackStreams(\n this.reader,\n this.state$,\n )\n\n this.visibleTrackIds$ = visibleTrackIds$\n\n const firstVisibleTrackId$ = this.visibleTrackIds$.pipe(\n map((trackIds) => trackIds[0]),\n distinctUntilChanged(),\n share(),\n )\n\n const visibleTrackReset$ = firstVisibleTrackId$.pipe(\n withLatestFrom(this.state$),\n filter(\n ([trackId, state]) =>\n trackId === undefined &&\n (state.currentTrack?.id !== undefined || state.isLoading),\n ),\n map(([, state]) => state.tracks),\n )\n\n const visibleTrackSelectionIntent$ = firstVisibleTrackId$.pipe(\n filter((trackId): trackId is string => trackId !== undefined),\n withLatestFrom(this.desiredPlayback$),\n map(([trackId, { shouldPlay }]) => ({\n trackId,\n options: {\n navigate: false,\n play: shouldPlay ? true : undefined,\n },\n })),\n )\n\n const tracksChanged$ = tracks$.pipe(\n tap(() => this.resourcesResolver.releaseAll()),\n )\n\n const playbackReset$ = merge(visibleTrackReset$, tracksChanged$).pipe(\n tap((tracks) => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n this.visualizer$.stop({ resetLevels: true })\n this.unmountCurrentSource()\n\n this.mergeCompare({\n tracks,\n currentTrack: undefined,\n isLoading: false,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(undefined)\n }),\n share(),\n )\n\n const playSelectionIntent$ = this.playCommandSubject.pipe(\n filter(() => !this.audio.hasSource),\n map(() => this.state.currentTrack ?? this.state.tracks[0]),\n filter(isDefined),\n map((track) => ({\n trackId: track.id,\n options: { navigate: false, play: true },\n })),\n )\n\n const resumePlayback$ = this.playCommandSubject.pipe(\n filter(() => this.audio.hasSource),\n tap(() => {\n this.emitDesiredPlayback({\n shouldPlay: true,\n trackId: this.state.currentTrack?.id,\n })\n }),\n )\n\n const endedSelectionIntent$ = this.audio.ended$.pipe(\n withLatestFrom(nextTrack$),\n switchMap(\n ([, { nextTrackAfterCurrentTrack, nextTrackInPaginationWindow }]) => {\n this.visualizer$.stop({ resetLevels: true })\n\n if (nextTrackInPaginationWindow) {\n return of({\n trackId: nextTrackInPaginationWindow.id,\n options: { navigate: false, play: true },\n })\n }\n\n if (!nextTrackAfterCurrentTrack) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }\n\n this.reader.navigation.goToRightOrBottomSpineItem()\n\n return EMPTY\n },\n ),\n )\n\n const selection$ = merge(\n this.selectCommandSubject,\n visibleTrackSelectionIntent$,\n endedSelectionIntent$,\n playSelectionIntent$,\n ).pipe(\n withLatestFrom(this.state$),\n filter(([selectionIntent, state]) =>\n state.tracks.some(({ id }) => id === selectionIntent.trackId),\n ),\n map(([selectionIntent, state]) => ({\n selectionIntent,\n state,\n isReselectionWhileLoading:\n state.currentTrack?.id === selectionIntent.trackId && state.isLoading,\n })),\n tap(({ selectionIntent, state, isReselectionWhileLoading }) => {\n if (selectionIntent.options.navigate !== false) {\n this.reader.navigation.navigate({\n spineItem: selectionIntent.trackId,\n animation: `turn`,\n })\n }\n\n if (\n isReselectionWhileLoading &&\n selectionIntent.options.play !== undefined\n ) {\n this.emitDesiredPlayback({\n shouldPlay: selectionIntent.options.play,\n trackId: state.currentTrack?.id,\n })\n }\n }),\n filter(({ isReselectionWhileLoading }) => !isReselectionWhileLoading),\n switchMap(({ selectionIntent: { trackId, options } }) =>\n this.selectTrack$({ trackId, options, playbackReset$ }),\n ),\n )\n\n const playback$ = merge(resumePlayback$, selection$).pipe(\n withLatestFrom(this.desiredPlayback$),\n switchMap(([, { shouldPlay, trackId }]) => {\n if (\n !shouldPlay ||\n !this.audio.hasSource ||\n this.state.currentTrack?.id !== trackId\n ) {\n return EMPTY\n }\n\n this.mergeCompare({ hasError: false })\n\n return this.audio.play$().pipe(\n catchError(() => {\n this.mergeCompare({ hasError: true })\n\n return EMPTY\n }),\n )\n }),\n )\n\n this.subscriptions.add(playbackReset$.subscribe())\n this.subscriptions.add(playback$.subscribe())\n\n this.subscriptions.add(\n this.pauseCommandSubject.subscribe(() => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }),\n )\n\n this.subscriptions.add(\n this.audio.isPlaying$.subscribe((isPlaying) => {\n this.mergeCompare({ isPlaying })\n\n if (!isPlaying) {\n this.visualizer$.stop()\n return\n }\n\n if (!this.state.currentTrack) return\n\n this.visualizer$.start(this.state.currentTrack)\n }),\n )\n\n this.subscriptions.add(\n this.audio.metrics$.subscribe(({ currentTime, duration }) => {\n this.mergeCompare({ currentTime, duration })\n }),\n )\n }\n\n get state() {\n return this.value\n }\n\n get visualizer() {\n return this.visualizer$.value\n }\n\n private resetTrackSelection({\n currentTrack,\n isLoading,\n }: {\n currentTrack: AudioTrack\n isLoading: boolean\n }) {\n this.mergeCompare({\n currentTrack,\n isLoading,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(currentTrack?.id)\n }\n\n private emitDesiredPlayback({ shouldPlay, trackId }: DesiredPlayback) {\n this.desiredPlayback$.next({\n shouldPlay,\n trackId: shouldPlay ? trackId : undefined,\n })\n\n if (!shouldPlay) {\n this.audio.pause()\n }\n }\n\n private unmountCurrentSource() {\n if (!this.audio.hasSource) return\n\n const trackId = this.state.currentTrack?.id\n\n if (!this.audio.paused) {\n this.audio.pause()\n }\n\n this.audio.unloadSource()\n\n if (trackId) {\n this.resourcesResolver.releaseTrackSource(trackId)\n }\n }\n\n private mountSource(source: string) {\n this.unmountCurrentSource()\n this.audio.loadSource(source)\n }\n\n private resolveTrackSource(track: AudioTrack) {\n const spineItem = this.reader.spineItemsManager.get(track.index)\n\n if (!spineItem) return EMPTY\n\n return this.resourcesResolver.getTrackResourceUrl$(\n track,\n spineItem.resourcesHandler,\n )\n }\n\n private selectTrack$({\n trackId,\n options,\n playbackReset$,\n }: {\n trackId: string\n options: SelectAudioTrackOptions\n playbackReset$: Observable<AudioTrack[]>\n }) {\n const track = this.state.tracks.find(({ id }) => id === trackId)\n\n if (!track) return EMPTY\n\n const currentTrack = this.state.currentTrack\n const shouldPlay =\n options.play ?? (!this.audio.paused && currentTrack !== undefined)\n\n this.emitDesiredPlayback({ shouldPlay, trackId: track.id })\n\n if (currentTrack?.id === track.id && this.audio.hasSource) {\n this.visualizer$.setTrack(track.id)\n\n return shouldPlay ? of(undefined) : EMPTY\n }\n\n this.unmountCurrentSource()\n\n this.resetTrackSelection({\n currentTrack: track,\n isLoading: true,\n })\n\n return this.resolveTrackSource(track).pipe(\n map((source) => ({ source })),\n defaultIfEmpty({ source: undefined }),\n catchError(() => of({ source: undefined })),\n takeUntil(playbackReset$),\n tap(({ source }) => {\n if (!source) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n } else {\n this.mountSource(source)\n }\n\n this.mergeCompare({ isLoading: false })\n }),\n filter(({ source }) => source !== undefined),\n map(() => undefined),\n )\n }\n\n select(trackId: string, options: SelectAudioTrackOptions = {}) {\n this.selectCommandSubject.next({ trackId, options })\n }\n\n play() {\n this.playCommandSubject.next()\n }\n\n pause() {\n this.pauseCommandSubject.next()\n }\n\n toggle() {\n if (this.audio.paused) {\n this.play()\n return\n }\n\n this.pause()\n }\n\n setCurrentTime(value: number) {\n this.mergeCompare({ currentTime: value })\n this.audio.setCurrentTime(value)\n }\n\n destroy() {\n this.subscriptions.unsubscribe()\n this.playCommandSubject.complete()\n this.pauseCommandSubject.complete()\n this.selectCommandSubject.complete()\n this.desiredPlayback$.complete()\n this.visualizer$.destroy()\n this.unmountCurrentSource()\n this.resourcesResolver.destroy()\n\n super.destroy()\n }\n}\n","import { DocumentRenderer, setStylePropertyIfChanged } from \"@prose-reader/core\"\nimport { EMPTY, of } from \"rxjs\"\n\nexport class AudioRenderer extends DocumentRenderer {\n onCreateDocument() {\n const ownerDocument = this.containerElement.ownerDocument\n const rootElement = ownerDocument.createElement(`div`)\n\n rootElement.style.cssText = `\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n display: block;\n `\n rootElement.setAttribute(`data-prose-reader-audio-page`, this.item.id)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument() {\n this.attach()\n\n return EMPTY\n }\n\n onUnload() {\n this.detach()\n\n return EMPTY\n }\n\n onLayout() {\n const { width, height } = this.viewport.pageSize\n const rootElement = this.documentContainer\n\n if (rootElement) {\n setStylePropertyIfChanged(rootElement.style, `width`, `${width}px`)\n setStylePropertyIfChanged(rootElement.style, `height`, `${height}px`)\n }\n\n return of({ width, height })\n }\n\n onRenderHeadless() {\n return EMPTY\n }\n\n getDocumentFrame() {\n return undefined\n }\n\n /**\n * Audio spine items are always pre-paginated (one track per page).\n * Mixed audio/text books with reflowable audio chapters may need\n * to revisit this if that use case arises.\n */\n get renditionLayout(): `pre-paginated` {\n return `pre-paginated`\n }\n}\n","import type { CreateReaderOptions, Reader } from \"@prose-reader/core\"\nimport { AudioController } from \"./playback/AudioController\"\nimport { AudioRenderer } from \"./renderer/AudioRenderer\"\nimport type { AudioEnhancerAPI } from \"./types\"\nimport { isAudioSpineItem } from \"./utils\"\n\nexport const audioEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & AudioEnhancerAPI => {\n const readerOptions = { ...options }\n\n const reader = next({\n ...readerOptions,\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (maybeFactory) {\n return maybeFactory\n }\n\n if (isAudioSpineItem(item)) {\n return (params) => new AudioRenderer(params)\n }\n\n return undefined\n },\n })\n\n const controller = new AudioController(reader)\n\n const destroy = () => {\n controller.destroy()\n reader.destroy()\n }\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_AUDIO: true,\n destroy,\n audio: {\n state$: controller.state$,\n visualizer$: controller.visualizer$,\n visibleTrackIds$: controller.visibleTrackIds$,\n get state() {\n return controller.state\n },\n get visualizer() {\n return controller.visualizer\n },\n isAudioRenderer: (renderer) => renderer instanceof AudioRenderer,\n play: () => controller.play(),\n pause: () => controller.pause(),\n toggle: () => controller.toggle(),\n setCurrentTime: (value) => controller.setCurrentTime(value),\n select: (trackId, options) => controller.select(trackId, options),\n },\n }\n }\n"],"names":["ReactiveEntity","BehaviorSubject","Subscription","distinctUntilChanged","switchMap","of","concat","map","defaultIfEmpty","defer","from","animationFrames","EMPTY","fromEvent","share","merge","retry","take","shareReplay","mapKeysTo","isShallowEqual","combineLatest","arrayEqual","Subject","withLatestFrom","filter","tap","isDefined","catchError","takeUntil","DocumentRenderer","setStylePropertyIfChanged","options"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/visualizer/levels.ts","../src/visualizer/VisualizerAudioGraph.ts","../src/visualizer/AudioVisualizer.ts","../src/playback/AudioElementAdapter.ts","../src/playback/ResourcesResolver.ts","../../shared/dist/index.js","../src/utils.ts","../src/playback/trackStreams.ts","../src/playback/AudioController.ts","../src/renderer/AudioRenderer.ts","../src/audioEnhancer.ts"],"sourcesContent":["const AUDIO_VISUALIZER_LEVEL_COUNT = 80\nconst AUDIO_VISUALIZER_NOISE_FLOOR = 0.035\n\nexport const getIdleVisualizerLevels = () =>\n Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, () => 0)\n\nexport const getVisualizerLevels = (data: ArrayLike<number>) => {\n if (data.length === 0) return getIdleVisualizerLevels()\n\n const bucketSize = Math.max(\n 1,\n Math.floor(data.length / AUDIO_VISUALIZER_LEVEL_COUNT),\n )\n\n return Array.from({ length: AUDIO_VISUALIZER_LEVEL_COUNT }, (_, index) => {\n const start = index * bucketSize\n const end = Math.min(data.length, start + bucketSize)\n\n if (start >= data.length || start === end) return 0\n\n let total = 0\n\n for (let cursor = start; cursor < end; cursor += 1) {\n total += data[cursor] ?? 0\n }\n\n const average = total / (end - start)\n const normalizedAverage = average / 255\n const gatedAverage =\n (normalizedAverage - AUDIO_VISUALIZER_NOISE_FLOOR) /\n (1 - AUDIO_VISUALIZER_NOISE_FLOOR)\n\n return Math.max(0, Math.min(1, gatedAverage))\n })\n}\n","import { getIdleVisualizerLevels, getVisualizerLevels } from \"./levels\"\n\nconst AUDIO_VISUALIZER_FFT_SIZE = 256\n\nexport class VisualizerAudioGraph {\n private audioContext: AudioContext | undefined\n private audioSourceNode: MediaElementAudioSourceNode | undefined\n private analyserNode: AnalyserNode | undefined\n private frequencyData: Uint8Array<ArrayBuffer> | undefined\n\n constructor(private readonly audioElement: HTMLAudioElement) {}\n\n async resumeIfNeeded() {\n if (!this.ensure()) {\n return false\n }\n\n const audioContext = this.audioContext\n\n if (!audioContext) {\n return false\n }\n\n if (audioContext.state !== `suspended`) {\n return true\n }\n\n try {\n await audioContext.resume()\n\n return true\n } catch {\n return false\n }\n }\n\n readLevels() {\n if (!this.analyserNode || !this.frequencyData) {\n return getIdleVisualizerLevels()\n }\n\n this.analyserNode.getByteFrequencyData(this.frequencyData)\n\n return getVisualizerLevels(this.frequencyData)\n }\n\n destroy() {\n this.audioSourceNode?.disconnect()\n this.analyserNode?.disconnect()\n this.audioContext?.close().catch(() => undefined)\n this.audioContext = undefined\n this.audioSourceNode = undefined\n this.analyserNode = undefined\n this.frequencyData = undefined\n }\n\n private ensure() {\n if (this.audioContext && this.analyserNode && this.frequencyData) {\n return true\n }\n\n if (typeof window === `undefined` || !window.AudioContext) {\n return false\n }\n\n const audioContext = new window.AudioContext()\n const audioSourceNode = audioContext.createMediaElementSource(\n this.audioElement,\n )\n const analyserNode = audioContext.createAnalyser()\n analyserNode.fftSize = AUDIO_VISUALIZER_FFT_SIZE\n analyserNode.smoothingTimeConstant = 0.8\n audioSourceNode.connect(analyserNode)\n analyserNode.connect(audioContext.destination)\n\n this.audioContext = audioContext\n this.audioSourceNode = audioSourceNode\n this.analyserNode = analyserNode\n this.frequencyData = new Uint8Array(analyserNode.frequencyBinCount)\n\n return true\n }\n}\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport {\n animationFrames,\n BehaviorSubject,\n concat,\n defaultIfEmpty,\n defer,\n distinctUntilChanged,\n EMPTY,\n from,\n map,\n of,\n Subscription,\n switchMap,\n} from \"rxjs\"\nimport type { AudioTrack, AudioVisualizerState } from \"../types\"\nimport { getIdleVisualizerLevels } from \"./levels\"\nimport { VisualizerAudioGraph } from \"./VisualizerAudioGraph\"\n\ntype AudioVisualizerPlaybackState = {\n trackId: string | undefined\n isRunning: boolean\n resetLevels: boolean\n}\n\nexport class AudioVisualizer extends ReactiveEntity<AudioVisualizerState> {\n private readonly audioGraph: VisualizerAudioGraph\n private readonly playbackState$ =\n new BehaviorSubject<AudioVisualizerPlaybackState>({\n trackId: undefined,\n isRunning: false,\n resetLevels: false,\n })\n private readonly subscriptions = new Subscription()\n\n constructor(audioElement: HTMLAudioElement) {\n super({\n levels: getIdleVisualizerLevels(),\n isActive: false,\n trackId: undefined,\n })\n this.audioGraph = new VisualizerAudioGraph(audioElement)\n\n this.subscriptions.add(\n this.playbackState$\n .pipe(\n distinctUntilChanged(\n (previous, next) =>\n previous.trackId === next.trackId &&\n previous.isRunning === next.isRunning &&\n previous.resetLevels === next.resetLevels,\n ),\n switchMap(({ trackId, isRunning, resetLevels }) => {\n if (!trackId || !isRunning) {\n return of({\n trackId,\n isActive: false,\n ...(resetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n })\n }\n\n const shouldResetLevels = this.value.trackId !== trackId\n\n return concat(\n of({\n trackId,\n isActive: true,\n ...(shouldResetLevels\n ? { levels: getIdleVisualizerLevels() }\n : undefined),\n }),\n this.createLevels$().pipe(\n map((levels) => ({\n trackId,\n levels,\n isActive: true,\n })),\n defaultIfEmpty({\n trackId,\n isActive: false,\n levels: getIdleVisualizerLevels(),\n }),\n ),\n )\n }),\n )\n .subscribe((value) => {\n this.mergeCompare(value)\n }),\n )\n }\n\n start(currentTrack: AudioTrack | undefined) {\n if (!currentTrack) return\n\n this.playbackState$.next({\n trackId: currentTrack.id,\n isRunning: true,\n resetLevels: false,\n })\n }\n\n setTrack(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: false,\n })\n }\n\n reset(trackId: string | undefined) {\n this.playbackState$.next({\n trackId,\n isRunning: false,\n resetLevels: true,\n })\n }\n\n stop({ resetLevels = false }: { resetLevels?: boolean } = {}) {\n this.playbackState$.next({\n trackId: this.playbackState$.value.trackId,\n isRunning: false,\n resetLevels,\n })\n }\n\n override destroy() {\n this.stop({\n resetLevels: true,\n })\n this.subscriptions.unsubscribe()\n this.playbackState$.complete()\n this.audioGraph.destroy()\n\n super.destroy()\n }\n\n private createLevels$() {\n return defer(() => {\n return from(this.audioGraph.resumeIfNeeded()).pipe(\n switchMap((isReady) =>\n isReady\n ? animationFrames().pipe(map(() => this.audioGraph.readLevels()))\n : EMPTY,\n ),\n )\n })\n }\n}\n","import {\n defer,\n from,\n fromEvent,\n map,\n merge,\n type Observable,\n retry,\n share,\n take,\n} from \"rxjs\"\n\nexport type AudioMetrics = {\n currentTime: number\n duration: number | undefined\n}\n\nexport class AudioElementAdapter {\n readonly element: HTMLAudioElement\n readonly canPlay$: Observable<Event>\n readonly ended$: Observable<Event>\n readonly isPlaying$: Observable<boolean>\n readonly metrics$: Observable<AudioMetrics>\n\n constructor() {\n this.element = document.createElement(`audio`)\n this.element.preload = `metadata`\n\n this.canPlay$ = fromEvent(this.element, `canplay`).pipe(share())\n this.ended$ = fromEvent(this.element, `ended`).pipe(share())\n\n this.isPlaying$ = merge(\n fromEvent(this.element, `play`).pipe(map(() => true)),\n fromEvent(this.element, `pause`).pipe(map(() => false)),\n ).pipe(share())\n\n this.metrics$ = merge(\n fromEvent(this.element, `timeupdate`),\n fromEvent(this.element, `seeking`),\n fromEvent(this.element, `seeked`),\n fromEvent(this.element, `loadedmetadata`),\n fromEvent(this.element, `durationchange`),\n this.canPlay$,\n ).pipe(\n map(() => ({\n currentTime: this.element.currentTime,\n duration: Number.isFinite(this.element.duration)\n ? this.element.duration\n : undefined,\n })),\n share(),\n )\n }\n\n get paused() {\n return this.element.paused\n }\n\n get hasSource() {\n return this.element.hasAttribute(`src`)\n }\n\n play$() {\n return defer(() => from(this.element.play())).pipe(\n retry({\n count: 1,\n delay: () => this.canPlay$.pipe(take(1)),\n }),\n )\n }\n\n pause() {\n this.element.pause()\n }\n\n loadSource(src: string) {\n this.element.src = src\n this.element.load()\n }\n\n unloadSource() {\n this.element.removeAttribute(`src`)\n this.element.load()\n }\n\n setCurrentTime(value: number) {\n this.element.currentTime = value\n }\n}\n","import type { ResourceHandler } from \"@prose-reader/core\"\nimport { from, map, of, switchMap } from \"rxjs\"\nimport type { AudioTrack } from \"../types\"\n\ntype CachedTrackSource = {\n url: string\n release?: () => void\n}\n\nexport class ResourcesResolver {\n private readonly cachedSourceByTrackId = new Map<string, CachedTrackSource>()\n\n public hasCachedSource(trackId: string): boolean {\n return this.cachedSourceByTrackId.has(trackId)\n }\n\n public getTrackResourceUrl$ = (\n track: AudioTrack,\n resourcesHandler: Pick<ResourceHandler, \"getResource\">,\n ) => {\n const cachedSource = this.cachedSourceByTrackId.get(track.id)\n\n if (cachedSource) {\n return of(cachedSource.url)\n }\n\n const resource$ = from(resourcesHandler.getResource())\n\n return resource$.pipe(\n switchMap((resource) => {\n if (resource instanceof URL) {\n this.cachedSourceByTrackId.set(track.id, {\n url: resource.href,\n })\n\n return of(resource.href)\n }\n\n if (resource instanceof Response) {\n return from(resource.blob()).pipe(\n map((blob) => {\n const objectUrl = URL.createObjectURL(blob)\n\n this.cachedSourceByTrackId.set(track.id, {\n url: objectUrl,\n release: () => {\n URL.revokeObjectURL(objectUrl)\n },\n })\n\n return objectUrl\n }),\n )\n }\n\n this.cachedSourceByTrackId.set(track.id, {\n url: track.href,\n })\n\n return of(track.href)\n }),\n )\n }\n\n public releaseTrackSource(trackId: string) {\n const cachedSource = this.cachedSourceByTrackId.get(trackId)\n\n if (!cachedSource) return\n\n this.cachedSourceByTrackId.delete(trackId)\n cachedSource.release?.()\n }\n\n public releaseAll() {\n for (const trackId of this.cachedSourceByTrackId.keys()) {\n this.releaseTrackSource(trackId)\n }\n }\n\n public destroy() {\n this.releaseAll()\n }\n}\n","const y = (e, t) => e === t ? !0 : e.length !== t.length ? !1 : e.every((n, o) => n === t[o]), f = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction d(e) {\n const t = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), t.push(l));\n }\n let n = t.join(\"/\");\n n = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = n.split(\"?\");\n return n = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), n;\n}\nfunction R(...e) {\n const t = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return d(t);\n}\nfunction $(e) {\n const t = e.split(\"/\");\n return t.pop(), t.join(\"/\");\n}\nconst h = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, x = ({\n mimeType: e,\n uri: t\n}) => (e ?? h(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), _ = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), C = (e) => {\n if (!e.length) return;\n const t = e.indexOf(\";\");\n return t >= 0 ? e.substring(0, t) : e;\n}, v = (e) => {\n const t = e.pageSpreadLeft === !0, n = e.pageSpreadRight === !0;\n if (t !== n)\n return t ? \"left\" : \"right\";\n}, F = (e, t, n) => {\n if (Object.is(e, t))\n return !0;\n if (typeof e != \"object\" || e === null || typeof t != \"object\" || t === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(t);\n if (o.length !== r.length)\n return !1;\n const l = n?.customEqual ?? Object.is, c = e, s = t;\n for (const a of o)\n if (!Object.hasOwn(s, a) || !l(c[a], s[a]))\n return !1;\n return !0;\n}, T = (e, t) => e.reduce(\n (n, o) => {\n const r = t(o);\n return n[r] || (n[r] = []), n[r].push(o), n;\n },\n {}\n);\nfunction M(e, t) {\n const n = { ...e };\n for (const o in t)\n if (Object.hasOwn(t, o)) {\n const r = t[o];\n (r !== void 0 || !(o in e)) && (n[o] = r);\n }\n return n;\n}\nconst m = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction b() {\n const e = m()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst E = (e, t) => typeof e == \"boolean\" ? {\n enabled: e,\n options: t\n} : {\n enabled: e?.enabled,\n options: e ?? t\n}, w = (e) => e.at(-1)?.color, u = (e) => {\n if (!e.length)\n return;\n if (!e.some((o) => o.color))\n return [e.map((o) => o.label).join(\" \")];\n let t = \"\";\n const n = [];\n for (const o of e)\n t += `%c${t ? ` ${o.label}` : o.label}`, n.push(\n o.color ? `color: ${o.color}` : \"\"\n );\n return [t, ...n];\n}, p = (e = [], t = b()) => {\n let n = t;\n const o = {\n enable: (c) => {\n l(c);\n },\n namespace: (c, s, a) => {\n const i = E(\n s,\n a\n ), g = i.options?.color ?? w(e);\n return p(\n [\n ...e,\n {\n label: `[${c}]`,\n color: g\n }\n ],\n i.enabled ?? n\n );\n },\n isEnabled: () => n,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (c) => {\n const s = u(e);\n if (!s)\n return [c];\n const [a, ...i] = s;\n return [`${a} ${c}`, ...i];\n },\n warn: () => {\n },\n error: () => {\n }\n }, r = (c) => {\n if (!c) {\n o.debug = () => {\n }, o.info = () => {\n }, o.log = () => {\n }, o.groupCollapsed = () => {\n }, o.groupEnd = () => {\n }, o.warn = () => {\n }, o.error = () => {\n };\n return;\n }\n const s = u(e) ?? [];\n o.debug = Function.prototype.bind.call(\n console.debug,\n console,\n ...s\n ), o.info = Function.prototype.bind.call(\n console.info,\n console,\n ...s\n ), o.log = Function.prototype.bind.call(\n console.log,\n console,\n ...s\n ), o.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), o.groupEnd = Function.prototype.bind.call(console.groupEnd, console), o.warn = Function.prototype.bind.call(\n console.warn,\n console,\n ...s\n ), o.error = Function.prototype.bind.call(\n console.error,\n console,\n ...s\n );\n }, l = (c) => {\n n !== c && (n = c, r(n));\n };\n return r(n), o;\n}, O = p(), P = \"prose-reader-resource-error\", S = (e) => e.replaceAll(\"&\", \"&\").replaceAll('\"', \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\nexport {\n P as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n O as Report,\n y as arrayEqual,\n h as detectMimeTypeFromName,\n S as escapeXmlAttributeValue,\n v as getItemSpreadPosition,\n $ as getParentPath,\n f as getUrlExtension,\n T as groupBy,\n _ as isMediaContentMimeType,\n F as isShallowEqual,\n x as isXmlBasedMimeType,\n C as parseContentType,\n M as shallowMergeIfDefined,\n R as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import type { Manifest } from \"@prose-reader/core\"\n\nconst AUDIO_EXTENSIONS = new Set([\n `mp3`,\n `m4a`,\n `m4b`,\n `aac`,\n `ogg`,\n `oga`,\n `wav`,\n `flac`,\n `opus`,\n])\n\nconst getExtensionFromHref = (href: string) => {\n const [pathname = ``] = href.split(/[?#]/)\n const segments = pathname.split(`/`)\n const basename = segments.at(-1) ?? ``\n const extension = basename.split(`.`).at(-1)\n\n return extension?.toLowerCase()\n}\n\nexport const isAudioSpineItem = (item: Manifest[\"spineItems\"][number]) => {\n const mediaType = item.mediaType?.split(`;`).at(0)?.trim().toLowerCase()\n\n if (mediaType?.startsWith(`audio/`)) {\n return true\n }\n\n const extension = getExtensionFromHref(item.href)\n\n return extension ? AUDIO_EXTENSIONS.has(extension) : false\n}\n","import { mapKeysTo } from \"@prose-reader/core\"\nimport { arrayEqual, isShallowEqual } from \"@prose-reader/shared\"\nimport {\n combineLatest,\n distinctUntilChanged,\n map,\n type Observable,\n shareReplay,\n} from \"rxjs\"\nimport type { AudioEnhancerState, AudioTrack } from \"../types\"\nimport { isAudioSpineItem } from \"../utils\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype PaginationTrackWindow = {\n beginSpineItemIndex: number | undefined\n endSpineItemIndex: number | undefined\n}\n\nconst getTrackAtSpineItemIndex = (\n tracks: AudioTrack[],\n index: number | undefined,\n) => {\n if (index === undefined) return undefined\n\n return tracks.find((track) => track.index === index)\n}\n\nconst getVisibleTracks = (\n tracks: AudioTrack[],\n pagination: PaginationTrackWindow,\n) => {\n const beginTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.beginSpineItemIndex,\n )\n const endTrack = getTrackAtSpineItemIndex(\n tracks,\n pagination.endSpineItemIndex,\n )\n\n return [beginTrack, endTrack].filter(\n (track, i, arr): track is AudioTrack =>\n track !== undefined && arr.indexOf(track) === i,\n )\n}\n\nexport function createTrackStreams(\n reader: Pick<AudioControllerReader, \"context\" | \"pagination\">,\n state$: Observable<AudioEnhancerState>,\n) {\n const tracks$ = reader.context.manifest$.pipe(\n map((manifest) =>\n manifest.spineItems.filter(isAudioSpineItem).map((item) => ({\n id: item.id,\n href: item.href,\n index: item.index,\n mediaType: item.mediaType,\n })),\n ),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const pagination$ = reader.pagination.state$.pipe(\n mapKeysTo([`beginSpineItemIndex`, `endSpineItemIndex`]),\n distinctUntilChanged(isShallowEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const visibleTrackIds$ = combineLatest([tracks$, pagination$]).pipe(\n map(([tracks, pagination]) =>\n getVisibleTracks(tracks, pagination).map(({ id }) => id),\n ),\n distinctUntilChanged(arrayEqual),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n const currentTrack$ = state$.pipe(\n map((state) => state.currentTrack),\n distinctUntilChanged(),\n )\n\n const nextTrack$ = combineLatest([tracks$, pagination$, currentTrack$]).pipe(\n map(([tracks, { endSpineItemIndex }, currentTrack]) => {\n const nextTrackInPaginationWindow =\n currentTrack && endSpineItemIndex !== undefined\n ? tracks.find(\n ({ index }) =>\n index > currentTrack.index && index <= endSpineItemIndex,\n )\n : undefined\n\n const nextTrackAfterCurrentTrack = currentTrack\n ? tracks.find(({ index }) => index > currentTrack.index)\n : undefined\n\n return { nextTrackInPaginationWindow, nextTrackAfterCurrentTrack }\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n )\n\n return {\n tracks$,\n visibleTrackIds$,\n nextTrack$,\n }\n}\n","import { isDefined, ReactiveEntity } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n catchError,\n defaultIfEmpty,\n distinctUntilChanged,\n EMPTY,\n filter,\n map,\n merge,\n type Observable,\n of,\n Subject,\n Subscription,\n share,\n switchMap,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type {\n AudioEnhancerState,\n AudioTrack,\n SelectAudioTrackOptions,\n} from \"../types\"\nimport { AudioVisualizer } from \"../visualizer\"\nimport { AudioElementAdapter } from \"./AudioElementAdapter\"\nimport { ResourcesResolver } from \"./ResourcesResolver\"\nimport { createTrackStreams } from \"./trackStreams\"\nimport type { AudioControllerReader } from \"./types\"\n\ntype SelectCommand = {\n trackId: string\n options: SelectAudioTrackOptions\n}\n\ntype DesiredPlayback = {\n shouldPlay: boolean\n trackId: string | undefined\n}\n\nconst initialDesiredPlayback: DesiredPlayback = {\n shouldPlay: false,\n trackId: undefined,\n}\n\nconst initialState: AudioEnhancerState = {\n tracks: [],\n currentTrack: undefined,\n isPlaying: false,\n isLoading: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n}\n\nexport type { AudioControllerReader }\n\nexport class AudioController extends ReactiveEntity<AudioEnhancerState> {\n private readonly reader: AudioControllerReader\n private readonly audio: AudioElementAdapter\n readonly visualizer$: AudioVisualizer\n readonly resourcesResolver = new ResourcesResolver()\n readonly visibleTrackIds$: Observable<string[]>\n\n private readonly playCommandSubject = new Subject<void>()\n private readonly pauseCommandSubject = new Subject<void>()\n private readonly selectCommandSubject = new Subject<SelectCommand>()\n private readonly desiredPlayback$ = new BehaviorSubject(\n initialDesiredPlayback,\n )\n private readonly subscriptions = new Subscription()\n\n constructor(\n reader: AudioControllerReader,\n audio = new AudioElementAdapter(),\n ) {\n super(initialState)\n\n this.reader = reader\n this.audio = audio\n this.visualizer$ = new AudioVisualizer(this.audio.element)\n\n const { tracks$, visibleTrackIds$, nextTrack$ } = createTrackStreams(\n this.reader,\n this.state$,\n )\n\n this.visibleTrackIds$ = visibleTrackIds$\n\n const firstVisibleTrackId$ = this.visibleTrackIds$.pipe(\n map((trackIds) => trackIds[0]),\n distinctUntilChanged(),\n share(),\n )\n\n const visibleTrackReset$ = firstVisibleTrackId$.pipe(\n withLatestFrom(this.state$),\n filter(\n ([trackId, state]) =>\n trackId === undefined &&\n (state.currentTrack?.id !== undefined || state.isLoading),\n ),\n map(([, state]) => state.tracks),\n )\n\n const visibleTrackSelectionIntent$ = firstVisibleTrackId$.pipe(\n filter((trackId): trackId is string => trackId !== undefined),\n withLatestFrom(this.desiredPlayback$),\n map(([trackId, { shouldPlay }]) => ({\n trackId,\n options: {\n navigate: false,\n play: shouldPlay ? true : undefined,\n },\n })),\n )\n\n const tracksChanged$ = tracks$.pipe(\n tap(() => this.resourcesResolver.releaseAll()),\n )\n\n const playbackReset$ = merge(visibleTrackReset$, tracksChanged$).pipe(\n tap((tracks) => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n this.visualizer$.stop({ resetLevels: true })\n this.unmountCurrentSource()\n\n this.mergeCompare({\n tracks,\n currentTrack: undefined,\n isLoading: false,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(undefined)\n }),\n share(),\n )\n\n const playSelectionIntent$ = this.playCommandSubject.pipe(\n filter(() => !this.audio.hasSource),\n map(() => this.state.currentTrack ?? this.state.tracks[0]),\n filter(isDefined),\n map((track) => ({\n trackId: track.id,\n options: { navigate: false, play: true },\n })),\n )\n\n const resumePlayback$ = this.playCommandSubject.pipe(\n filter(() => this.audio.hasSource),\n tap(() => {\n this.emitDesiredPlayback({\n shouldPlay: true,\n trackId: this.state.currentTrack?.id,\n })\n }),\n )\n\n const endedSelectionIntent$ = this.audio.ended$.pipe(\n withLatestFrom(nextTrack$),\n switchMap(\n ([, { nextTrackAfterCurrentTrack, nextTrackInPaginationWindow }]) => {\n this.visualizer$.stop({ resetLevels: true })\n\n if (nextTrackInPaginationWindow) {\n return of({\n trackId: nextTrackInPaginationWindow.id,\n options: { navigate: false, play: true },\n })\n }\n\n if (!nextTrackAfterCurrentTrack) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }\n\n this.reader.navigation.goToRightOrBottomSpineItem()\n\n return EMPTY\n },\n ),\n )\n\n const selection$ = merge(\n this.selectCommandSubject,\n visibleTrackSelectionIntent$,\n endedSelectionIntent$,\n playSelectionIntent$,\n ).pipe(\n withLatestFrom(this.state$),\n filter(([selectionIntent, state]) =>\n state.tracks.some(({ id }) => id === selectionIntent.trackId),\n ),\n map(([selectionIntent, state]) => ({\n selectionIntent,\n state,\n isReselectionWhileLoading:\n state.currentTrack?.id === selectionIntent.trackId && state.isLoading,\n })),\n tap(({ selectionIntent, state, isReselectionWhileLoading }) => {\n if (selectionIntent.options.navigate !== false) {\n this.reader.navigation.navigate({\n spineItem: selectionIntent.trackId,\n animation: `turn`,\n })\n }\n\n if (\n isReselectionWhileLoading &&\n selectionIntent.options.play !== undefined\n ) {\n this.emitDesiredPlayback({\n shouldPlay: selectionIntent.options.play,\n trackId: state.currentTrack?.id,\n })\n }\n }),\n filter(({ isReselectionWhileLoading }) => !isReselectionWhileLoading),\n switchMap(({ selectionIntent: { trackId, options } }) =>\n this.selectTrack$({ trackId, options, playbackReset$ }),\n ),\n )\n\n const playback$ = merge(resumePlayback$, selection$).pipe(\n withLatestFrom(this.desiredPlayback$),\n switchMap(([, { shouldPlay, trackId }]) => {\n if (\n !shouldPlay ||\n !this.audio.hasSource ||\n this.state.currentTrack?.id !== trackId\n ) {\n return EMPTY\n }\n\n this.mergeCompare({ hasError: false })\n\n return this.audio.play$().pipe(\n catchError(() => {\n this.mergeCompare({ hasError: true })\n\n return EMPTY\n }),\n )\n }),\n )\n\n this.subscriptions.add(playbackReset$.subscribe())\n this.subscriptions.add(playback$.subscribe())\n\n this.subscriptions.add(\n this.pauseCommandSubject.subscribe(() => {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n }),\n )\n\n this.subscriptions.add(\n this.audio.isPlaying$.subscribe((isPlaying) => {\n this.mergeCompare({ isPlaying })\n\n if (!isPlaying) {\n this.visualizer$.stop()\n return\n }\n\n if (!this.state.currentTrack) return\n\n this.visualizer$.start(this.state.currentTrack)\n }),\n )\n\n this.subscriptions.add(\n this.audio.metrics$.subscribe(({ currentTime, duration }) => {\n this.mergeCompare({ currentTime, duration })\n }),\n )\n }\n\n get state() {\n return this.value\n }\n\n get visualizer() {\n return this.visualizer$.value\n }\n\n private resetTrackSelection({\n currentTrack,\n isLoading,\n }: {\n currentTrack: AudioTrack\n isLoading: boolean\n }) {\n this.mergeCompare({\n currentTrack,\n isLoading,\n isPlaying: false,\n hasError: false,\n currentTime: 0,\n duration: undefined,\n })\n this.visualizer$.reset(currentTrack?.id)\n }\n\n private emitDesiredPlayback({ shouldPlay, trackId }: DesiredPlayback) {\n this.desiredPlayback$.next({\n shouldPlay,\n trackId: shouldPlay ? trackId : undefined,\n })\n\n if (!shouldPlay) {\n this.audio.pause()\n }\n }\n\n private unmountCurrentSource() {\n if (!this.audio.hasSource) return\n\n const trackId = this.state.currentTrack?.id\n\n if (!this.audio.paused) {\n this.audio.pause()\n }\n\n this.audio.unloadSource()\n\n if (trackId) {\n this.resourcesResolver.releaseTrackSource(trackId)\n }\n }\n\n private mountSource(source: string) {\n this.unmountCurrentSource()\n this.audio.loadSource(source)\n }\n\n private resolveTrackSource(track: AudioTrack) {\n const spineItem = this.reader.spineItemsManager.get(track.index)\n\n if (!spineItem) return EMPTY\n\n return this.resourcesResolver.getTrackResourceUrl$(\n track,\n spineItem.resourcesHandler,\n )\n }\n\n private selectTrack$({\n trackId,\n options,\n playbackReset$,\n }: {\n trackId: string\n options: SelectAudioTrackOptions\n playbackReset$: Observable<AudioTrack[]>\n }) {\n const track = this.state.tracks.find(({ id }) => id === trackId)\n\n if (!track) return EMPTY\n\n const currentTrack = this.state.currentTrack\n const shouldPlay =\n options.play ?? (!this.audio.paused && currentTrack !== undefined)\n\n this.emitDesiredPlayback({ shouldPlay, trackId: track.id })\n\n if (currentTrack?.id === track.id && this.audio.hasSource) {\n this.visualizer$.setTrack(track.id)\n\n return shouldPlay ? of(undefined) : EMPTY\n }\n\n this.unmountCurrentSource()\n\n this.resetTrackSelection({\n currentTrack: track,\n isLoading: true,\n })\n\n return this.resolveTrackSource(track).pipe(\n map((source) => ({ source })),\n defaultIfEmpty({ source: undefined }),\n catchError(() => of({ source: undefined })),\n takeUntil(playbackReset$),\n tap(({ source }) => {\n if (!source) {\n this.emitDesiredPlayback({ shouldPlay: false, trackId: undefined })\n } else {\n this.mountSource(source)\n }\n\n this.mergeCompare({ isLoading: false })\n }),\n filter(({ source }) => source !== undefined),\n map(() => undefined),\n )\n }\n\n select(trackId: string, options: SelectAudioTrackOptions = {}) {\n this.selectCommandSubject.next({ trackId, options })\n }\n\n play() {\n this.playCommandSubject.next()\n }\n\n pause() {\n this.pauseCommandSubject.next()\n }\n\n toggle() {\n if (this.audio.paused) {\n this.play()\n return\n }\n\n this.pause()\n }\n\n setCurrentTime(value: number) {\n this.mergeCompare({ currentTime: value })\n this.audio.setCurrentTime(value)\n }\n\n destroy() {\n this.subscriptions.unsubscribe()\n this.playCommandSubject.complete()\n this.pauseCommandSubject.complete()\n this.selectCommandSubject.complete()\n this.desiredPlayback$.complete()\n this.visualizer$.destroy()\n this.unmountCurrentSource()\n this.resourcesResolver.destroy()\n\n super.destroy()\n }\n}\n","import { DocumentRenderer, setStylePropertyIfChanged } from \"@prose-reader/core\"\nimport { EMPTY, of } from \"rxjs\"\n\nexport class AudioRenderer extends DocumentRenderer {\n onCreateDocument() {\n const ownerDocument = this.containerElement.ownerDocument\n const rootElement = ownerDocument.createElement(`div`)\n\n rootElement.style.cssText = `\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n display: block;\n `\n rootElement.setAttribute(`data-prose-reader-audio-page`, this.item.id)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument() {\n this.attach()\n\n return EMPTY\n }\n\n onUnload() {\n this.detach()\n\n return EMPTY\n }\n\n onLayout() {\n const { width, height } = this.viewport.pageSize\n const rootElement = this.documentContainer\n\n if (rootElement) {\n setStylePropertyIfChanged(rootElement.style, `width`, `${width}px`)\n setStylePropertyIfChanged(rootElement.style, `height`, `${height}px`)\n }\n\n return of({ width, height })\n }\n\n onRenderHeadless() {\n return EMPTY\n }\n\n getDocumentFrame() {\n return undefined\n }\n\n /**\n * Audio spine items are always pre-paginated (one track per page).\n * Mixed audio/text books with reflowable audio chapters may need\n * to revisit this if that use case arises.\n */\n get renditionLayout(): `pre-paginated` {\n return `pre-paginated`\n }\n}\n","import type { CreateReaderOptions, Reader } from \"@prose-reader/core\"\nimport { AudioController } from \"./playback/AudioController\"\nimport { AudioRenderer } from \"./renderer/AudioRenderer\"\nimport type { AudioEnhancerAPI } from \"./types\"\nimport { isAudioSpineItem } from \"./utils\"\n\nexport const audioEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & AudioEnhancerAPI => {\n const readerOptions = { ...options }\n\n const reader = next({\n ...readerOptions,\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (maybeFactory) {\n return maybeFactory\n }\n\n if (isAudioSpineItem(item)) {\n return (params) => new AudioRenderer(params)\n }\n\n return undefined\n },\n })\n\n const controller = new AudioController(reader)\n\n const destroy = () => {\n controller.destroy()\n reader.destroy()\n }\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_AUDIO: true,\n destroy,\n audio: {\n state$: controller.state$,\n visualizer$: controller.visualizer$,\n visibleTrackIds$: controller.visibleTrackIds$,\n get state() {\n return controller.state\n },\n get visualizer() {\n return controller.visualizer\n },\n isAudioRenderer: (renderer) => renderer instanceof AudioRenderer,\n play: () => controller.play(),\n pause: () => controller.pause(),\n toggle: () => controller.toggle(),\n setCurrentTime: (value) => controller.setCurrentTime(value),\n select: (trackId, options) => controller.select(trackId, options),\n },\n }\n }\n"],"names":["ReactiveEntity","BehaviorSubject","Subscription","distinctUntilChanged","switchMap","of","concat","map","defaultIfEmpty","defer","from","animationFrames","EMPTY","fromEvent","share","merge","retry","take","shareReplay","mapKeysTo","isShallowEqual","combineLatest","arrayEqual","Subject","withLatestFrom","filter","tap","isDefined","catchError","takeUntil","DocumentRenderer","setStylePropertyIfChanged","options"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/enhancer-audio",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.303.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.umd.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"test": "vitest run --coverage"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@prose-reader/core": "^1.
|
|
23
|
+
"@prose-reader/core": "^1.303.0"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"rxjs": "*"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "dddc06869ba852fa280e050c1c1929433bb91c5e"
|
|
29
29
|
}
|