@prose-reader/enhancer-audio 1.301.0 → 1.304.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 +530 -928
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +3 -940
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +3 -3
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","names":[],"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","//#region src/array.ts\nvar e = (e, t) => e === t ? !0 : e.length === t.length ? e.every((e, n) => e === t[n]) : !1, t = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction n(e) {\n\tlet t = [];\n\tif (e.length === 0) return \"\";\n\tif (typeof e[0] != \"string\") throw TypeError(`Url must be a string. Received ${e[0]}`);\n\te[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\tfor (let n = 0; n < e.length; n++) {\n\t\tlet r = e[n];\n\t\tif (typeof r != \"string\") throw TypeError(`Url must be a string. Received ${r}`);\n\t\tr !== \"\" && (n > 0 && (r = r.replace(/^[/]+/, \"\")), r = n < e.length - 1 ? r.replace(/[/]+$/, \"\") : r.replace(/[/]+$/, \"/\"), t.push(r));\n\t}\n\tlet n = t.join(\"/\");\n\tn = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n\tlet r = n.split(\"?\");\n\treturn n = r.shift() + (r.length > 0 ? \"?\" : \"\") + r.join(\"&\"), n;\n}\nfunction r(...e) {\n\treturn n(Array.from(Array.isArray(e[0]) ? e[0] : e));\n}\nfunction i(e) {\n\tlet t = e.split(\"/\");\n\treturn t.pop(), t.join(\"/\");\n}\n//#endregion\n//#region src/contentType.ts\nvar a = (e) => {\n\tswitch (t(e)) {\n\t\tcase \"png\": return \"image/png\";\n\t\tcase \"jpg\": return \"image/jpg\";\n\t\tcase \"jpeg\": return \"image/jpeg\";\n\t\tcase \"txt\": return \"text/plain\";\n\t\tcase \"webp\": return \"image/webp\";\n\t\tcase \"xhtml\": return \"application/xhtml+xml\";\n\t\tcase \"mp3\": return \"audio/mpeg\";\n\t\tcase \"m4a\":\n\t\tcase \"m4b\": return \"audio/mp4\";\n\t\tcase \"aac\": return \"audio/aac\";\n\t\tcase \"ogg\":\n\t\tcase \"oga\": return \"audio/ogg\";\n\t\tcase \"wav\": return \"audio/wav\";\n\t\tcase \"flac\": return \"audio/flac\";\n\t\tcase \"opus\": return \"audio/opus\";\n\t}\n}, o = ({ mimeType: e, uri: t }) => (e ?? a(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), s = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), c = (e) => {\n\tif (!e.length) return;\n\tlet t = e.indexOf(\";\");\n\treturn t >= 0 ? e.substring(0, t) : e;\n}, l = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, u = (e, t, n) => {\n\tif (Object.is(e, t)) return !0;\n\tif (typeof e != \"object\" || !e || typeof t != \"object\" || !t) return !1;\n\tlet r = Object.keys(e), i = Object.keys(t);\n\tif (r.length !== i.length) return !1;\n\tlet a = n?.customEqual ?? Object.is, o = e, s = t;\n\tfor (let e of r) if (!Object.hasOwn(s, e) || !a(o[e], s[e])) return !1;\n\treturn !0;\n}, d = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction f(e, t) {\n\tlet n = { ...e };\n\tfor (let r in t) if (Object.hasOwn(t, r)) {\n\t\tlet i = t[r];\n\t\t(i !== void 0 || !(r in e)) && (n[r] = i);\n\t}\n\treturn n;\n}\n//#endregion\n//#region src/report.ts\nvar p = () => {\n\tif (!(typeof window > \"u\")) return window;\n};\nfunction m() {\n\tlet e = p()?.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar h = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, g = (e) => e.at(-1)?.color, _ = (e) => {\n\tif (!e.length) return;\n\tif (!e.some((e) => e.color)) return [e.map((e) => e.label).join(\" \")];\n\tlet t = \"\", n = [];\n\tfor (let r of e) t += `%c${t ? ` ${r.label}` : r.label}`, n.push(r.color ? `color: ${r.color}` : \"\");\n\treturn [t, ...n];\n}, v = (e = [], t = m()) => {\n\tlet n = t, r = {\n\t\tenable: (e) => {\n\t\t\ta(e);\n\t\t},\n\t\tnamespace: (t, r, i) => {\n\t\t\tlet a = h(r, i), o = a.options?.color ?? g(e);\n\t\t\treturn v([...e, {\n\t\t\t\tlabel: `[${t}]`,\n\t\t\t\tcolor: o\n\t\t\t}], a.enabled ?? n);\n\t\t},\n\t\tisEnabled: () => n,\n\t\tdebug: () => {},\n\t\tinfo: () => {},\n\t\tlog: () => {},\n\t\tgroupCollapsed: () => {},\n\t\tgroupEnd: () => {},\n\t\tgetGroupArgs: (t) => {\n\t\t\tlet n = _(e);\n\t\t\tif (!n) return [t];\n\t\t\tlet [r, ...i] = n;\n\t\t\treturn [`${r} ${t}`, ...i];\n\t\t},\n\t\twarn: () => {},\n\t\terror: () => {}\n\t}, i = (t) => {\n\t\tif (!t) {\n\t\t\tr.debug = () => {}, r.info = () => {}, r.log = () => {}, r.groupCollapsed = () => {}, r.groupEnd = () => {}, r.warn = () => {}, r.error = () => {};\n\t\t\treturn;\n\t\t}\n\t\tlet n = _(e) ?? [];\n\t\tr.debug = Function.prototype.bind.call(console.debug, console, ...n), r.info = Function.prototype.bind.call(console.info, console, ...n), r.log = Function.prototype.bind.call(console.log, console, ...n), r.groupCollapsed = Function.prototype.bind.call(console.groupCollapsed, console), r.groupEnd = Function.prototype.bind.call(console.groupEnd, console), r.warn = Function.prototype.bind.call(console.warn, console, ...n), r.error = Function.prototype.bind.call(console.error, console, ...n);\n\t}, a = (e) => {\n\t\tn !== e && (n = e, i(n));\n\t};\n\treturn i(n), r;\n}, y = v(), b = \"prose-reader-resource-error\", x = (e) => e.replaceAll(\"&\", \"&\").replaceAll(\"\\\"\", \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n//#endregion\nexport { b as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, y as Report, e as arrayEqual, a as detectMimeTypeFromName, x as escapeXmlAttributeValue, l as getItemSpreadPosition, i as getParentPath, t as getUrlExtension, d as groupBy, s as isMediaContentMimeType, u as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, f as shallowMergeIfDefined, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","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"],"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.304.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.304.0"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"rxjs": "*"
|
|
27
27
|
},
|
|
28
|
-
"gitHead": "
|
|
28
|
+
"gitHead": "1f4e4822d4d74fc2f6025409133db0f4f7f152af"
|
|
29
29
|
}
|