@@ -3,7 +3,7 @@ import type { SubtitleResource } from '@/types/resources';
33import type { PopoverItem } from ' @aminnausin/cedar-ui' ;
44import type { Ref } from ' vue' ;
55
6- import { computed , inject , ref , useTemplateRef } from ' vue' ;
6+ import { computed , inject , nextTick , ref , useTemplateRef } from ' vue' ;
77import { useContentStore } from ' @/stores/ContentStore' ;
88import { storeToRefs } from ' pinia' ;
99import { round } from ' lodash-es' ;
@@ -34,6 +34,8 @@ const props = defineProps<PlayerSubtitlesProps>();
3434
3535// #region Local State
3636const currentSubtitleTrack = ref <SubtitleResource >();
37+ const currentSubtitleTrackUrl = computed <string >(() => buildSubtitleUrl (currentSubtitleTrack .value ));
38+
3739const isShowingSubtitles = ref (false );
3840const subtitleSizeMultiplier = ref (1 );
3941const subtitleSizeMin = 0.5 ;
@@ -88,12 +90,9 @@ const defaultSubtitleTrack = computed<SubtitleResource | undefined>(() => {
8890});
8991
9092const handleSizeChange = (_ : Event , dir : number = 0 ) => {
91- if (dir ) {
92- subtitleSizeMultiplier .value = round (
93- Math .max (Math .min (Number .parseFloat (` ${subtitleSizeMultiplier .value } ` ) + subtitleSizeDelta * dir , subtitleSizeMax ), subtitleSizeMin ),
94- 2 ,
95- );
96- }
93+ if (dir === 0 ) return ;
94+
95+ subtitleSizeMultiplier .value = round (Math .max (Math .min (Number .parseFloat (` ${subtitleSizeMultiplier .value } ` ) + subtitleSizeDelta * dir , subtitleSizeMax ), subtitleSizeMin ), 2 );
9796};
9897
9998const handleSizeWheel = (event : WheelEvent ) => {
@@ -105,11 +104,12 @@ const handleSizeWheel = (event: WheelEvent) => {
105104// #endregion
106105
107106// #region Functions
107+
108108/**
109109 * Handle Subtitles Toggle
110110 * @param track -> Defaults to first available subtitle only if not currently showing anything
111111 */
112- const handleSubtitles = (track ? : SubtitleResource ) => {
112+ const handleSubtitles = async (track ? : SubtitleResource ) => {
113113 const nextTrack = track ?? (isShowingSubtitles .value ? undefined : defaultSubtitleTrack .value );
114114
115115 isShowingSubtitles .value = !! nextTrack ;
@@ -130,11 +130,13 @@ const handleSubtitles = (track?: SubtitleResource) => {
130130 const languageTag = nextTrack .track_id === 0 ? ` .${nextTrack .language } ` : ' ' ;
131131 instantiateOctopus (` /data/subtitles/${nextTrack .metadata_uuid }/${nextTrack .track_id }${languageTag }.ass ` );
132132 hideAllTracks ();
133- } else {
134- clearOctopus ();
135- for (const textTrack of player .value .textTracks ) {
136- textTrack .mode = isShowingSubtitles .value && textTrack .language === currentSubtitleTrack .value ?.language ? ' showing' : ' hidden' ;
137- }
133+ return ;
134+ }
135+ clearOctopus ();
136+ await nextTick ();
137+ for (const textTrack of player .value .textTracks ) {
138+ textTrack .mode = isShowingSubtitles .value ? ' showing' : ' hidden' ;
139+ console .log (' enabled track' , textTrack );
138140 }
139141};
140142
@@ -155,14 +157,25 @@ const hideAllTracks = () => {
155157 textTrack .mode = ' hidden' ;
156158 }
157159};
160+
161+ const buildSubtitleUrl = (subtitle ? : SubtitleResource ): string => {
162+ if (! subtitle ) return ' ' ;
163+
164+ const { metadata_uuid, track_id, language, codec } = subtitle ;
165+ const languageSlug = track_id === 0 ? ` .${language } ` : ' ' ;
166+ const extension = codec === ' ass' ? ' .ass' : ' .vtt' ;
167+ return ` /data/subtitles/${metadata_uuid }/${track_id }${languageSlug }${extension } ` ;
168+ };
169+
158170// #endregion
159171defineExpose ({
160172 handleSubtitles ,
161173 clearSubtitles ,
162174 resizeOctopus ,
163175 isShowingSubtitles ,
164- currentSubtitleTrack ,
165176 defaultSubtitleTrack ,
177+ currentSubtitleTrack ,
178+ currentSubtitleTrackUrl ,
166179 subtitleSizeMultiplier ,
167180 subtitlesPopover ,
168181});
0 commit comments