11import { effect , onDispose , peek , signal , type ReadSignal } from 'maverick.js' ;
2- import { noop } from 'maverick.js/std' ;
32import type { VTTCue } from 'media-captions' ;
43
54import { useMediaContext , type MediaContext } from '../../../core/api/media-context' ;
5+ import { parseJSONCaptionsFile } from '../../../core/tracks/text/text-track' ;
66import { getRequestCredentials } from '../../../utils/network' ;
77
88const cache = new Map < string , VTTCue [ ] > ( ) ,
@@ -12,9 +12,9 @@ const cache = new Map<string, VTTCue[]>(),
1212export class ThumbnailsLoader {
1313 readonly $cues = signal < VTTCue [ ] > ( [ ] ) ;
1414
15- static create ( src : ReadSignal < string > ) {
15+ static create ( $ src : ReadSignal < string > ) {
1616 const media = useMediaContext ( ) ;
17- return new ThumbnailsLoader ( src , media ) ;
17+ return new ThumbnailsLoader ( $ src, media ) ;
1818 }
1919
2020 constructor (
@@ -52,24 +52,30 @@ export class ThumbnailsLoader {
5252 this . $cues . set ( cache . get ( src ) ! ) ;
5353 } else if ( ! pending . has ( src ) ) {
5454 pending . add ( src ) ;
55- import ( 'media-captions' ) . then ( ( { parseResponse } ) => {
56- parseResponse (
57- fetch ( src , {
58- signal : controller . signal ,
59- credentials : getRequestCredentials ( crossorigin ( ) ) ,
60- } ) ,
61- )
62- . then ( ( { cues } ) => {
63- this . $cues . set ( cues ) ;
64-
65- for ( const t of registry ) {
66- if ( peek ( t . $src ) === src ) t . $cues . set ( cues ) ;
55+ import ( 'media-captions' ) . then ( async ( { parseResponse } ) => {
56+ try {
57+ const response = await fetch ( src , {
58+ signal : controller . signal ,
59+ credentials : getRequestCredentials ( crossorigin ( ) ) ,
60+ } ) ,
61+ isJSON = response . headers . get ( 'content-type' ) === 'application/json' ;
62+
63+ if ( isJSON ) {
64+ try {
65+ const { cues } = parseJSONCaptionsFile ( await response . text ( ) , window . VTTCue ) ;
66+ this . _updateCues ( src , cues ) ;
67+ } catch ( e ) {
68+ // no-op
6769 }
6870
69- cache . set ( src , cues ) ;
70- pending . delete ( src ) ;
71- } )
72- . catch ( noop ) ;
71+ return ;
72+ }
73+
74+ const { cues } = await parseResponse ( response ) ;
75+ this . _updateCues ( src , cues ) ;
76+ } catch ( e ) {
77+ // no-op
78+ }
7379 } ) ;
7480 }
7581
@@ -78,4 +84,15 @@ export class ThumbnailsLoader {
7884 this . $cues . set ( [ ] ) ;
7985 } ;
8086 }
87+
88+ private _updateCues ( currentSrc : string , cues : VTTCue [ ] ) {
89+ this . $cues . set ( cues ) ;
90+
91+ for ( const t of registry ) {
92+ if ( peek ( t . $src ) === currentSrc ) t . $cues . set ( cues ) ;
93+ }
94+
95+ cache . set ( currentSrc , cues ) ;
96+ pending . delete ( currentSrc ) ;
97+ }
8198}
0 commit comments