@@ -25,6 +25,18 @@ var stremioToMPVProps = {
25
25
'subtitlesOutlineColor' : 'sub-border-color' ,
26
26
} ;
27
27
28
+ function parseVersion ( version ) {
29
+ return version . split ( '.' ) . slice ( 0 , 2 ) . map ( function ( v ) { return parseInt ( v ) } ) ;
30
+ }
31
+
32
+ function versionGTE ( a , b ) {
33
+ var versionA = parseVersion ( a ) ;
34
+ var versionB = parseVersion ( b ) ;
35
+ if ( versionA [ 0 ] > versionB [ 0 ] ) return true ;
36
+ if ( versionA [ 0 ] < versionB [ 0 ] ) return false ;
37
+ return versionA [ 1 ] >= versionB [ 1 ] ;
38
+ }
39
+
28
40
function ShellVideo ( options ) {
29
41
options = options || { } ;
30
42
@@ -37,6 +49,10 @@ function ShellVideo(options) {
37
49
stremioProps [ stremioToMPVProps [ key ] ] = key ;
38
50
}
39
51
} ) ;
52
+ var resolveMPVVersion ;
53
+ var waitForMPVVersion = new Promise ( function ( resolve ) {
54
+ resolveMPVVersion = resolve ;
55
+ } ) ;
40
56
command ( 'unload' ) ;
41
57
42
58
ipc . send ( 'mpv-command' , [ 'stop' ] ) ;
@@ -92,6 +108,7 @@ function ShellVideo(options) {
92
108
ipc . on ( 'mpv-prop-change' , function ( args ) {
93
109
switch ( args . name ) {
94
110
case 'mpv-version' :
111
+ resolveMPVVersion ( args . data ) ;
95
112
case 'ffmpeg-version' : {
96
113
props [ args . name ] = logProp ( args ) ;
97
114
break ;
@@ -302,49 +319,55 @@ function ShellVideo(options) {
302
319
case 'load' : {
303
320
command ( 'unload' ) ;
304
321
if ( commandArgs && commandArgs . stream && typeof commandArgs . stream . url === 'string' ) {
305
- stream = commandArgs . stream ;
306
- onPropChanged ( 'stream' ) ;
322
+ waitForMPVVersion . then ( function ( mpvVersion ) {
323
+ stream = commandArgs . stream ;
324
+ onPropChanged ( 'stream' ) ;
307
325
308
- setBackground ( false ) ;
326
+ setBackground ( false ) ;
309
327
310
- ipc . send ( 'mpv-set-prop' , [ 'no-sub-ass' ] ) ;
328
+ ipc . send ( 'mpv-set-prop' , [ 'no-sub-ass' ] ) ;
311
329
312
- // opengl-cb is an alias for the new name "libmpv", as shown in mpv's video/out/vo.c aliases
313
- // opengl is an alias for the new name "gpu"
314
- // When on Windows we use d3d for the rendering in separate window
315
- var windowRenderer = navigator . platform === 'Win32' ? 'direct3d' : 'opengl' ;
316
- var videoOutput = options . mpvSeparateWindow ? windowRenderer : 'opengl-cb' ;
317
- var separateWindow = options . mpvSeparateWindow ? 'yes' : 'no' ;
318
- ipc . send ( 'mpv-set-prop' , [ 'vo' , videoOutput ] ) ;
319
- ipc . send ( 'mpv-set-prop' , [ 'osc' , separateWindow ] ) ;
320
- ipc . send ( 'mpv-set-prop' , [ 'input-defalt-bindings' , separateWindow ] ) ;
321
- ipc . send ( 'mpv-set-prop' , [ 'input-vo-keyboard' , separateWindow ] ) ;
330
+ // opengl-cb is an alias for the new name "libmpv", as shown in mpv's video/out/vo.c aliases
331
+ // opengl is an alias for the new name "gpu"
332
+ // When on Windows we use d3d for the rendering in separate window
333
+ var windowRenderer = navigator . platform === 'Win32' ? 'direct3d' : 'opengl' ;
334
+ var videoOutput = options . mpvSeparateWindow ? windowRenderer : 'opengl-cb' ;
335
+ var separateWindow = options . mpvSeparateWindow ? 'yes' : 'no' ;
336
+ ipc . send ( 'mpv-set-prop' , [ 'vo' , videoOutput ] ) ;
337
+ ipc . send ( 'mpv-set-prop' , [ 'osc' , separateWindow ] ) ;
338
+ ipc . send ( 'mpv-set-prop' , [ 'input-defalt-bindings' , separateWindow ] ) ;
339
+ ipc . send ( 'mpv-set-prop' , [ 'input-vo-keyboard' , separateWindow ] ) ;
322
340
323
- if ( commandArgs . time !== null && isFinite ( commandArgs . time ) ) {
324
- ipc . send ( 'mpv-command' , [ 'loadfile' , stream . url , 'replace' , '-1' , 'start=+' + Math . floor ( parseInt ( commandArgs . time , 10 ) / 1000 ) ] ) ;
325
- } else {
326
- ipc . send ( 'mpv-command' , [ 'loadfile' , stream . url ] ) ;
327
- }
328
- ipc . send ( 'mpv-set-prop' , [ 'pause' , false ] ) ;
329
- ipc . send ( 'mpv-set-prop' , [ 'speed' , props . speed ] ) ;
330
- ipc . send ( 'mpv-set-prop' , [ 'aid' , props . aid ] ) ;
331
- ipc . send ( 'mpv-set-prop' , [ 'mute' , 'no' ] ) ;
341
+ var startAt = Math . floor ( parseInt ( commandArgs . time , 10 ) / 1000 ) || 0
342
+ if ( startAt !== 0 ) {
343
+ if ( versionGTE ( mpvVersion , '0.39' ) ) {
344
+ ipc . send ( 'mpv-command' , [ 'loadfile' , stream . url , 'replace' , '-1' , 'start=+' + startAt ] ) ;
345
+ } else {
346
+ ipc . send ( 'mpv-command' , [ 'loadfile' , stream . url , 'replace' , 'start=+' + startAt ] ) ;
347
+ }
348
+ } else {
349
+ ipc . send ( 'mpv-command' , [ 'loadfile' , stream . url ] ) ;
350
+ }
351
+ ipc . send ( 'mpv-set-prop' , [ 'pause' , false ] ) ;
352
+ ipc . send ( 'mpv-set-prop' , [ 'speed' , props . speed ] ) ;
353
+ ipc . send ( 'mpv-set-prop' , [ 'aid' , props . aid ] ) ;
354
+ ipc . send ( 'mpv-set-prop' , [ 'mute' , 'no' ] ) ;
332
355
333
- onPropChanged ( 'paused' ) ;
334
- onPropChanged ( 'time' ) ;
335
- onPropChanged ( 'duration' ) ;
336
- onPropChanged ( 'buffering' ) ;
337
- onPropChanged ( 'volume' ) ;
338
- onPropChanged ( 'muted' ) ;
339
- onPropChanged ( 'subtitlesTracks' ) ;
340
- onPropChanged ( 'selectedSubtitlesTrackId' ) ;
356
+ onPropChanged ( 'paused' ) ;
357
+ onPropChanged ( 'time' ) ;
358
+ onPropChanged ( 'duration' ) ;
359
+ onPropChanged ( 'buffering' ) ;
360
+ onPropChanged ( 'volume' ) ;
361
+ onPropChanged ( 'muted' ) ;
362
+ onPropChanged ( 'subtitlesTracks' ) ;
363
+ onPropChanged ( 'selectedSubtitlesTrackId' ) ;
364
+ } ) ;
341
365
} else {
342
366
onError ( Object . assign ( { } , ERROR . UNSUPPORTED_STREAM , {
343
367
critical : true ,
344
368
stream : commandArgs ? commandArgs . stream : null
345
369
} ) ) ;
346
370
}
347
-
348
371
break ;
349
372
}
350
373
case 'unload' : {
0 commit comments