@@ -2,6 +2,7 @@ var EventEmitter = require('eventemitter3');
2
2
var cloneDeep = require ( 'lodash.clonedeep' ) ;
3
3
var deepFreeze = require ( 'deep-freeze' ) ;
4
4
var ERROR = require ( '../error' ) ;
5
+ var getTracksData = require ( '../tracksData' ) ;
5
6
6
7
function luna ( params , call , fail , method ) {
7
8
if ( call ) params . onSuccess = call || function ( ) { } ;
@@ -135,6 +136,47 @@ function stremioSubSizes(size) {
135
136
return false ;
136
137
}
137
138
139
+ var device = {
140
+ unsupportedAudio : [ 'DTS' , 'TRUEHD' ] ,
141
+ unsupportedSubs : [ 'HDMV/PGS' , 'VOBSUB' ]
142
+ } ;
143
+
144
+ var fetchedDeviceInfo = false ;
145
+
146
+ function retrieveDeviceInfo ( ) {
147
+ if ( fetchedDeviceInfo ) {
148
+ return ;
149
+ }
150
+ window . webOS . service . request ( 'luna://com.webos.service.config' , {
151
+ method : 'getConfigs' ,
152
+ parameters : {
153
+ 'configNames' : [
154
+ 'tv.model.edidType'
155
+ ]
156
+ } ,
157
+ onSuccess : function ( result ) {
158
+ if ( ( ( result || { } ) . configs || { } ) [ 'tv.model.edidType' ] ) {
159
+ fetchedDeviceInfo = true ;
160
+ var edidType = result . configs [ 'tv.model.edidType' ] . toLowerCase ( ) ;
161
+ if ( edidType . includes ( 'dts' ) ) {
162
+ device . unsupportedAudio = device . unsupportedAudio . filter ( function ( e ) {
163
+ return e !== 'DTS' ;
164
+ } ) ;
165
+ }
166
+ if ( edidType . includes ( 'truehd' ) ) {
167
+ device . unsupportedAudio = device . unsupportedAudio . filter ( function ( e ) {
168
+ return e !== 'TRUEHD' ;
169
+ } ) ;
170
+ }
171
+ }
172
+ } ,
173
+ onFailure : function ( err ) {
174
+ // eslint-disable-next-line no-console
175
+ console . log ( 'could not get deviceInfo' , err ) ;
176
+ }
177
+ } ) ;
178
+ }
179
+
138
180
function WebOsVideo ( options ) {
139
181
140
182
options = options || { } ;
@@ -146,14 +188,10 @@ function WebOsVideo(options) {
146
188
147
189
var isLoaded = null ;
148
190
149
- var knownMediaId = false ;
150
-
151
191
var subSize = 75 ;
152
192
153
193
var disabledSubs = true ;
154
194
155
- var subscribed = false ;
156
-
157
195
var currentSubTrack = false ;
158
196
159
197
var currentAudioTrack = false ;
@@ -173,140 +211,6 @@ function WebOsVideo(options) {
173
211
char_opacity : 255
174
212
} ;
175
213
176
- var setSubs = function ( info ) {
177
- textTracks = [ ] ;
178
- if ( info . numSubtitleTracks ) {
179
- for ( var i = 0 ; i < info . subtitleTrackInfo . length ; i ++ ) {
180
- var textTrack = info . subtitleTrackInfo [ i ] ;
181
- textTrack . index = i ;
182
- var textTrackLang = textTrack . language === '(null)' ? null : textTrack . language ;
183
-
184
- var textTrackId = 'EMBEDDED_' + textTrack . index ;
185
-
186
- if ( ! currentSubTrack && ! textTracks . length ) {
187
- currentSubTrack = textTrackId ;
188
- }
189
-
190
- textTracks . push ( {
191
- id : textTrackId ,
192
- lang : textTrackLang ,
193
- label : textTrackLang ,
194
- origin : 'EMBEDDED' ,
195
- embedded : true ,
196
- mode : textTrackId === currentSubTrack ? 'showing' : 'disabled' ,
197
- } ) ;
198
-
199
- }
200
- onPropChanged ( 'subtitlesTracks' ) ;
201
- onPropChanged ( 'selectedSubtitlesTrackId' ) ;
202
-
203
- }
204
- } ;
205
-
206
- var setTracks = function ( info ) {
207
- audioTracks = [ ] ;
208
- if ( info . numAudioTracks ) {
209
- for ( var i = 0 ; i < info . audioTrackInfo . length ; i ++ ) {
210
- var audioTrack = info . audioTrackInfo [ i ] ;
211
- audioTrack . index = i ;
212
- var audioTrackId = 'EMBEDDED_' + audioTrack . index ;
213
- if ( ! currentAudioTrack && ! audioTracks . length ) {
214
- currentAudioTrack = audioTrackId ;
215
- }
216
- var audioTrackLang = audioTrack . language === '(null)' ? null : audioTrack . language ;
217
- audioTracks . push ( {
218
- id : audioTrackId ,
219
- lang : audioTrackLang ,
220
- label : audioTrackLang ,
221
- origin : 'EMBEDDED' ,
222
- embedded : true ,
223
- mode : audioTrackId === currentAudioTrack ? 'showing' : 'disabled' ,
224
- } ) ;
225
- }
226
- onPropChanged ( 'audioTracks' ) ;
227
- onPropChanged ( 'selectedAudioTrackId' ) ;
228
-
229
- }
230
- } ;
231
-
232
- var subscribe = function ( cb ) {
233
- if ( subscribed ) return ;
234
- subscribed = true ;
235
- var answered = false ;
236
- luna ( {
237
- method : 'subscribe' ,
238
- parameters : {
239
- 'mediaId' : knownMediaId ,
240
- 'subscribe' : true
241
- }
242
- } , function ( result ) {
243
- if ( result . sourceInfo && ! answered ) {
244
- answered = true ;
245
- var info = result . sourceInfo . programInfo [ 0 ] ;
246
-
247
- setSubs ( info ) ;
248
-
249
- setTracks ( info ) ;
250
-
251
- unsubscribe ( cb ) ;
252
- }
253
-
254
- if ( ( result . error || { } ) . errorCode ) {
255
- answered = true ;
256
- // console.error('luna playback error', result.error);
257
- unsubscribe ( cb ) ;
258
- // unsubscribe();
259
- // onVideoError();
260
- return ;
261
- }
262
-
263
- if ( ( result . unloadCompleted || { } ) . mediaId === knownMediaId && ( result . unloadCompleted || { } ) . state ) {
264
- // strange case where it just.. ends? without ever getting result.sourceInfo
265
- // onEnded();
266
- // console.log('strange case of end');
267
- // unsubscribe(cb);
268
- return ;
269
- }
270
-
271
- count_message ++ ;
272
-
273
- if ( count_message === 30 && ! answered ) {
274
- // cb();
275
- unsubscribe ( cb ) ;
276
- }
277
- } , function ( ) { // function(err)
278
- // console.log('luna error log 2');
279
- // console.error(err);
280
- } ) ;
281
- } ;
282
-
283
- var unsubscribe = function ( cb ) {
284
- if ( ! subscribed ) return ;
285
- subscribed = false ;
286
- luna ( {
287
- method : 'unsubscribe' ,
288
- parameters : {
289
- 'mediaId' : knownMediaId
290
- }
291
- } , function ( ) { // function(result)
292
- // console.log('unsubscribe result', JSON.stringify(result));
293
- cb ( ) ;
294
- } , function ( ) { // function(err)
295
- // console.log('unsubscribe error', JSON.stringify(err));
296
- cb ( ) ;
297
- } ) ;
298
- cb ( ) ;
299
- } ;
300
-
301
- // var unload = function (cb) {
302
- // luna({
303
- // method: 'unload',
304
- // parameters: {
305
- // 'mediaId': knownMediaId
306
- // }
307
- // }, cb, cb);
308
- // };
309
-
310
214
var toggleSubtitles = function ( status ) {
311
215
if ( ! videoElement . mediaId ) return ;
312
216
@@ -439,6 +343,69 @@ function WebOsVideo(options) {
439
343
playbackSpeed : false
440
344
} ;
441
345
346
+ var gotTraktData = false ;
347
+ var tracksData = { audio : [ ] , subs : [ ] } ;
348
+
349
+ function retrieveExtendedTracks ( ) {
350
+ if ( ! gotTraktData && stream !== null ) {
351
+ gotTraktData = true ;
352
+ getTracksData ( stream . url , function ( resp ) {
353
+ var nrSubs = 0 ;
354
+ var nrAudio = 0 ;
355
+ textTracks = [ ] ;
356
+ audioTracks = [ ] ;
357
+ if ( resp ) {
358
+ tracksData = resp ;
359
+ }
360
+ if ( ( ( tracksData || { } ) . subs || [ ] ) . length ) {
361
+ tracksData . subs . forEach ( function ( track ) {
362
+ if ( device . unsupportedSubs . includes ( track . codec || '' ) ) {
363
+ return ;
364
+ }
365
+ var textTrackId = nrSubs ;
366
+ nrSubs ++ ;
367
+ if ( ! currentSubTrack && ! textTracks . length ) {
368
+ currentSubTrack = textTrackId ;
369
+ }
370
+ textTracks . push ( {
371
+ id : 'EMBEDDED_' + textTrackId ,
372
+ lang : track . lang || 'eng' ,
373
+ label : track . lang || 'eng' ,
374
+ origin : 'EMBEDDED' ,
375
+ embedded : true ,
376
+ mode : textTrackId === currentSubTrack ? 'showing' : 'disabled' ,
377
+ } ) ;
378
+ } ) ;
379
+ onPropChanged ( 'subtitlesTracks' ) ;
380
+ onPropChanged ( 'selectedSubtitlesTrackId' ) ;
381
+ }
382
+ if ( ( ( tracksData || { } ) . audio || [ ] ) . length ) {
383
+ tracksData . audio . forEach ( function ( track ) {
384
+ if ( device . unsupportedAudio . includes ( track . codec || '' ) ) {
385
+ return ;
386
+ }
387
+ var audioTrackId = nrAudio ;
388
+ nrAudio ++ ;
389
+ if ( ! currentAudioTrack && ! audioTracks . length ) {
390
+ currentAudioTrack = audioTrackId ;
391
+ }
392
+ audioTracks . push ( {
393
+ id : 'EMBEDDED_' + audioTrackId ,
394
+ lang : track . lang || 'eng' ,
395
+ label : track . lang || 'eng' ,
396
+ origin : 'EMBEDDED' ,
397
+ embedded : true ,
398
+ mode : audioTrackId === currentAudioTrack ? 'showing' : 'disabled' ,
399
+ } ) ;
400
+ } ) ;
401
+ currentAudioTrack = 'EMBEDDED_0' ;
402
+ onPropChanged ( 'audioTracks' ) ;
403
+ onPropChanged ( 'selectedAudioTrackId' ) ;
404
+ }
405
+ } ) ;
406
+ }
407
+ }
408
+
442
409
function getProp ( propName ) {
443
410
switch ( propName ) {
444
411
case 'stream' : {
@@ -971,15 +938,18 @@ function WebOsVideo(options) {
971
938
var initMediaId = function ( cb ) {
972
939
function retrieveMediaId ( ) {
973
940
if ( videoElement . mediaId ) {
974
- knownMediaId = videoElement . mediaId ;
975
941
clearInterval ( timer ) ;
976
- subscribe ( cb ) ;
942
+ retrieveExtendedTracks ( ) ;
943
+ retrieveDeviceInfo ( ) ;
944
+ cb ( ) ;
977
945
return ;
978
946
}
979
947
count ++ ;
980
948
if ( count > 4 ) {
981
949
// console.log('failed to get media id');
982
950
clearInterval ( timer ) ;
951
+ retrieveExtendedTracks ( ) ;
952
+ retrieveDeviceInfo ( ) ;
983
953
cb ( ) ;
984
954
}
985
955
}
0 commit comments