@stremio/stremio-video 0.0.12 → 0.0.15
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stremio/stremio-video",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"description": "Abstraction layer on top of different media players",
|
|
5
5
|
"author": "Smart Code OOD",
|
|
6
6
|
"main": "src/index.js",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"deep-freeze": "0.0.1",
|
|
17
17
|
"eventemitter3": "4.0.7",
|
|
18
18
|
"hat": "0.0.3",
|
|
19
|
-
"hls.js": "https://github.com/Stremio/hls.js/releases/download/v1.0.10-
|
|
19
|
+
"hls.js": "https://github.com/Stremio/hls.js/releases/download/v1.0.10-patch2/hls.js-1.0.10-patch2.tgz",
|
|
20
20
|
"lodash.clonedeep": "4.5.0",
|
|
21
21
|
"magnet-uri": "6.2.0",
|
|
22
22
|
"url": "0.11.0",
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// from: https://github.com/silviapfeiffer/silviapfeiffer.github.io/blob/master/index.html#L150-L216
|
|
2
|
+
|
|
3
|
+
function srt2webvtt(data) {
|
|
4
|
+
// remove dos newlines
|
|
5
|
+
var srt = data.replace(/\r+/g, '');
|
|
6
|
+
// trim white space start and end
|
|
7
|
+
srt = srt.replace(/^\s+|\s+$/g, '');
|
|
8
|
+
// get cues
|
|
9
|
+
var cuelist = srt.split('\n\n');
|
|
10
|
+
var result = '';
|
|
11
|
+
if (cuelist.length > 0) {
|
|
12
|
+
result += 'WEBVTT\n\n';
|
|
13
|
+
for (var i = 0; i < cuelist.length; i=i+1) {
|
|
14
|
+
result += convertSrtCue(cuelist[i]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function convertSrtCue(caption) {
|
|
21
|
+
// remove all html tags for security reasons
|
|
22
|
+
caption = caption.replace(/<[a-zA-Z/][^>]*>/g, '');
|
|
23
|
+
|
|
24
|
+
var cue = '';
|
|
25
|
+
var s = caption.split(/\n/);
|
|
26
|
+
// concatenate muilt-line string separated in array into one
|
|
27
|
+
while (s.length > 3) {
|
|
28
|
+
for (var i = 3; i < s.length; i++) {
|
|
29
|
+
s[2] += '\n' + s[i];
|
|
30
|
+
}
|
|
31
|
+
s.splice(3, s.length - 3);
|
|
32
|
+
}
|
|
33
|
+
var line = 0;
|
|
34
|
+
// detect identifier
|
|
35
|
+
if (!s[0].match(/\d+:\d+:\d+/) && s[1].match(/\d+:\d+:\d+/)) {
|
|
36
|
+
cue += s[0].match(/\w+/) + '\n';
|
|
37
|
+
line += 1;
|
|
38
|
+
}
|
|
39
|
+
// get time strings
|
|
40
|
+
if (s[line].match(/\d+:\d+:\d+/)) {
|
|
41
|
+
// convert time string
|
|
42
|
+
var m = s[1].match(/(\d+):(\d+):(\d+)(?:,(\d+))?\s*--?>\s*(\d+):(\d+):(\d+)(?:,(\d+))?/);
|
|
43
|
+
if (m) {
|
|
44
|
+
cue += m[1]+':'+m[2]+':'+m[3]+'.'+m[4]+' --> '
|
|
45
|
+
+m[5]+':'+m[6]+':'+m[7]+'.'+m[8]+'\n';
|
|
46
|
+
line += 1;
|
|
47
|
+
} else {
|
|
48
|
+
// Unrecognized timestring
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
// file format error or comment lines
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
// get cue text
|
|
56
|
+
if (s[line]) {
|
|
57
|
+
cue += s[line] + '\n\n';
|
|
58
|
+
}
|
|
59
|
+
return cue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
convert: function(text) {
|
|
64
|
+
// presume all to be SRT if not WEBVTT
|
|
65
|
+
return text.includes('WEBVTT') ? text : srt2webvtt(text);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
@@ -4,6 +4,7 @@ var deepFreeze = require('deep-freeze');
|
|
|
4
4
|
var ERROR = require('../error');
|
|
5
5
|
var subtitlesParser = require('./subtitlesParser');
|
|
6
6
|
var subtitlesRenderer = require('./subtitlesRenderer');
|
|
7
|
+
var subtitlesConverter = require('./subtitlesConverter');
|
|
7
8
|
|
|
8
9
|
function withHTMLSubtitles(Video) {
|
|
9
10
|
function VideoWithHTMLSubtitles(options) {
|
|
@@ -214,6 +215,9 @@ function withHTMLSubtitles(Video) {
|
|
|
214
215
|
.then(function(resp) {
|
|
215
216
|
return resp.text();
|
|
216
217
|
})
|
|
218
|
+
.then(function(text) {
|
|
219
|
+
return subtitlesConverter.convert(text);
|
|
220
|
+
})
|
|
217
221
|
.then(function(text) {
|
|
218
222
|
return subtitlesParser.parse(text);
|
|
219
223
|
})
|
|
@@ -96,34 +96,47 @@ function withStreamingServer(Video) {
|
|
|
96
96
|
onPropChanged('stream');
|
|
97
97
|
convertStream(commandArgs.streamingServerURL, commandArgs.stream, commandArgs.seriesInfo)
|
|
98
98
|
.then(function(mediaURL) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
99
|
+
return (commandArgs.forceTranscoding ? Promise.resolve(false) : Video.canPlayStream({ url: mediaURL }))
|
|
100
|
+
.catch(function(error) {
|
|
101
|
+
console.warn('Media probe error', error);
|
|
102
|
+
return false;
|
|
103
|
+
})
|
|
104
|
+
.then(function(canPlay) {
|
|
105
|
+
if (canPlay) {
|
|
106
|
+
return {
|
|
107
|
+
url: mediaURL
|
|
108
|
+
};
|
|
109
|
+
}
|
|
107
110
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return Object.assign({}, track, {
|
|
113
|
-
url: typeof track.url === 'string' ?
|
|
114
|
-
url.resolve(commandArgs.streamingServerURL, '/subtitles.vtt?' + new URLSearchParams([['from', track.url]]).toString())
|
|
115
|
-
:
|
|
116
|
-
track.url
|
|
117
|
-
});
|
|
118
|
-
})
|
|
119
|
-
:
|
|
120
|
-
[],
|
|
121
|
-
behaviorHints: {
|
|
122
|
-
headers: {
|
|
123
|
-
'content-type': 'application/vnd.apple.mpegurl'
|
|
111
|
+
var id = hat();
|
|
112
|
+
var queryParams = new URLSearchParams([['mediaURL', mediaURL]]);
|
|
113
|
+
if (commandArgs.forceTranscoding) {
|
|
114
|
+
queryParams.set('forceTranscoding', '1');
|
|
124
115
|
}
|
|
125
|
-
|
|
126
|
-
|
|
116
|
+
if (commandArgs.audioChannels !== null && isFinite(commandArgs.audioChannels)) {
|
|
117
|
+
queryParams.set('audioChannels', commandArgs.audioChannels);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
url: url.resolve(commandArgs.streamingServerURL, '/hlsv2/' + id + '/master.m3u8?' + queryParams.toString()),
|
|
122
|
+
subtitles: Array.isArray(commandArgs.stream.subtitles) ?
|
|
123
|
+
commandArgs.stream.subtitles.map(function(track) {
|
|
124
|
+
return Object.assign({}, track, {
|
|
125
|
+
url: typeof track.url === 'string' ?
|
|
126
|
+
url.resolve(commandArgs.streamingServerURL, '/subtitles.vtt?' + new URLSearchParams([['from', track.url]]).toString())
|
|
127
|
+
:
|
|
128
|
+
track.url
|
|
129
|
+
});
|
|
130
|
+
})
|
|
131
|
+
:
|
|
132
|
+
[],
|
|
133
|
+
behaviorHints: {
|
|
134
|
+
headers: {
|
|
135
|
+
'content-type': 'application/vnd.apple.mpegurl'
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
});
|
|
127
140
|
})
|
|
128
141
|
.then(function(stream) {
|
|
129
142
|
if (commandArgs !== loadArgs) {
|