Skip to content

Commit 3c6fbdc

Browse files
authored
Merge pull request #93 from Stremio/feat/local-subtitles
feat(withHTMLSubtitles): handle local subtitles
2 parents be7ba4a + 436fe5a commit 3c6fbdc

File tree

3 files changed

+61
-14
lines changed

3 files changed

+61
-14
lines changed

.eslintrc

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
},
1010
"env": {
1111
"commonjs": true,
12-
"browser": true
12+
"browser": true,
13+
"es6": true
1314
},
1415
"parserOptions": {
1516
"ecmaVersion": 8

src/StremioVideo/StremioVideo.js

+3
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ function StremioVideo() {
6666
video.on('extraSubtitlesTrackLoaded', function(track) {
6767
events.emit('extraSubtitlesTrackLoaded', track);
6868
});
69+
video.on('extraSubtitlesTrackAdded', function(track) {
70+
events.emit('extraSubtitlesTrackAdded', track);
71+
});
6972
if (Video.manifest.external) {
7073
video.on('implementationChanged', function(manifest) {
7174
events.emit('implementationChanged', manifest);

src/withHTMLSubtitles/withHTMLSubtitles.js

+56-13
Original file line numberDiff line numberDiff line change
@@ -225,15 +225,34 @@ function withHTMLSubtitles(Video) {
225225
if (selectedTrack) {
226226
selectedTrackId = selectedTrack.id;
227227
delay = 0;
228-
function loadSubtitleFromUrl(url, isFallback) {
229-
fetch(url)
230-
.then(function(resp) {
231-
if (resp.ok) {
232-
return resp.text();
233-
}
234228

235-
throw new Error(resp.status + ' (' + resp.statusText + ')');
236-
})
229+
function getSubtitlesData(track) {
230+
if (typeof track.url === 'string') {
231+
return fetch(track.url)
232+
.then(function(resp) {
233+
if (resp.ok) {
234+
return resp.text();
235+
}
236+
237+
throw new Error(resp.status + ' (' + resp.statusText + ')');
238+
});
239+
}
240+
241+
if (track.buffer instanceof ArrayBuffer) {
242+
try {
243+
const uInt8Array = new Uint8Array(track.buffer);
244+
const text = new TextDecoder().decode(uInt8Array);
245+
return Promise.resolve(text);
246+
} catch(e) {
247+
return Promise.reject(e);
248+
}
249+
}
250+
251+
return Promise.reject('No `url` or `buffer` field available for this track');
252+
}
253+
254+
function loadSubtitles(track, isFallback) {
255+
getSubtitlesData(track)
237256
.then(function(text) {
238257
return subtitlesConverter.convert(text);
239258
})
@@ -255,7 +274,7 @@ function withHTMLSubtitles(Video) {
255274
}
256275

257276
if (!isFallback && typeof selectedTrack.fallbackUrl === 'string') {
258-
loadSubtitleFromUrl(selectedTrack.fallbackUrl, true);
277+
loadSubtitles(selectedTrack, true);
259278
return;
260279
}
261280

@@ -266,7 +285,7 @@ function withHTMLSubtitles(Video) {
266285
}));
267286
});
268287
}
269-
loadSubtitleFromUrl(selectedTrack.url);
288+
loadSubtitles(selectedTrack);
270289
}
271290
renderSubtitles();
272291
onPropChanged('selectedExtraSubtitlesTrackId');
@@ -374,7 +393,6 @@ function withHTMLSubtitles(Video) {
374393
.filter(function(track, index, tracks) {
375394
return track &&
376395
typeof track.id === 'string' &&
377-
typeof track.url === 'string' &&
378396
typeof track.lang === 'string' &&
379397
typeof track.label === 'string' &&
380398
typeof track.origin === 'string' &&
@@ -386,6 +404,31 @@ function withHTMLSubtitles(Video) {
386404

387405
return true;
388406
}
407+
case 'addLocalSubtitles': {
408+
if (commandArgs && typeof commandArgs.filename === 'string' && commandArgs.buffer instanceof ArrayBuffer) {
409+
var id = 'LOCAL_' + tracks
410+
.filter(function(track) { return track.local; })
411+
.length;
412+
413+
var track = {
414+
id: id,
415+
url: null,
416+
buffer: commandArgs.buffer,
417+
lang: 'local',
418+
label: commandArgs.filename,
419+
origin: 'LOCAL',
420+
local: true,
421+
embedded: false,
422+
};
423+
424+
tracks.push(track);
425+
426+
onPropChanged('extraSubtitlesTracks');
427+
events.emit('extraSubtitlesTrackAdded', track);
428+
}
429+
430+
return true;
431+
}
389432
case 'load': {
390433
command('unload');
391434
if (commandArgs.stream && Array.isArray(commandArgs.stream.subtitles)) {
@@ -485,9 +528,9 @@ function withHTMLSubtitles(Video) {
485528
external: Video.manifest.external,
486529
props: Video.manifest.props.concat(['extraSubtitlesTracks', 'selectedExtraSubtitlesTrackId', 'extraSubtitlesDelay', 'extraSubtitlesSize', 'extraSubtitlesOffset', 'extraSubtitlesTextColor', 'extraSubtitlesBackgroundColor', 'extraSubtitlesOutlineColor', 'extraSubtitlesOpacity'])
487530
.filter(function(value, index, array) { return array.indexOf(value) === index; }),
488-
commands: Video.manifest.commands.concat(['load', 'unload', 'destroy', 'addExtraSubtitlesTracks'])
531+
commands: Video.manifest.commands.concat(['load', 'unload', 'destroy', 'addExtraSubtitlesTracks', 'addLocalSubtitles'])
489532
.filter(function(value, index, array) { return array.indexOf(value) === index; }),
490-
events: Video.manifest.events.concat(['propValue', 'propChanged', 'error', 'extraSubtitlesTrackLoaded'])
533+
events: Video.manifest.events.concat(['propValue', 'propChanged', 'error', 'extraSubtitlesTrackLoaded', 'extraSubtitlesTrackAdded'])
491534
.filter(function(value, index, array) { return array.indexOf(value) === index; })
492535
};
493536

0 commit comments

Comments
 (0)