@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.12",
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-patch1/hls.js-1.0.10-patch1.tgz",
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",
@@ -2,8 +2,8 @@ module.exports = {
2
2
  debug: false,
3
3
  enableWorker: true,
4
4
  lowLatencyMode: false,
5
- backBufferLength: 0,
6
- maxBufferLength: 80,
5
+ backBufferLength: 30,
6
+ maxBufferLength: 50,
7
7
  maxMaxBufferLength: 80,
8
8
  maxFragLookUpTolerance: 0,
9
9
  maxBufferHole: 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
- var id = hat();
100
- var queryParams = new URLSearchParams([['mediaURL', mediaURL]]);
101
- if (commandArgs.forceTranscoding) {
102
- queryParams.set('forceTranscoding', '1');
103
- }
104
- if (commandArgs.audioChannels !== null && isFinite(commandArgs.audioChannels)) {
105
- queryParams.set('audioChannels', commandArgs.audioChannels);
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
- return {
109
- url: url.resolve(commandArgs.streamingServerURL, '/hlsv2/' + id + '/master.m3u8?' + queryParams.toString()),
110
- subtitles: Array.isArray(commandArgs.stream.subtitles) ?
111
- commandArgs.stream.subtitles.map(function(track) {
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) {