From a16b02f2797b6468b5d61a322a090f44297f285d Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Fri, 10 May 2024 15:57:14 +0300 Subject: [PATCH 01/20] Retrieve Extended Tracks Data from Streaming Server --- src/TizenVideo/TizenVideo.js | 43 ++++++++++++++++++++++++++++++++++++ src/tracksData.js | 14 ++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/tracksData.js diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 2433bd4..584f77a 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -3,6 +3,7 @@ var cloneDeep = require('lodash.clonedeep'); var deepFreeze = require('deep-freeze'); var Color = require('color'); var ERROR = require('../error'); +var getTracksData = require('../tracksData') function TizenVideo(options) { options = options || {}; @@ -148,6 +149,20 @@ function TizenVideo(options) { playbackSpeed: false }; + var gotTraktData = false + var tracksData = { audio: [], subs: [] } + + function retrieveExtendedTracks() { + if (!gotTraktData && stream !== null) { + gotTraktData = true + getTracksData(stream.url, function(resp) { + tracksData = resp + onPropChanged('subtitlesTracks'); + onPropChanged('audioTracks'); + }) + } + } + function getProp(propName) { switch (propName) { case 'stream': { @@ -213,6 +228,20 @@ function TizenVideo(options) { extra = JSON.parse(textTrack.extra_info); } catch(e) {} var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; + if (textTrackLang === null) { + retrieveExtendedTracks() + } + if (((tracksData || {}).subs || []).length) { + var extendedTrackData = tracksData.subs.find(function(el) { + if ((el || {})['StreamOrder'] === textTrack.index) { + return true + } + return false + }) + if ((extendedTrackData || {})['Language']) { + textTrackLang = extendedTrackData['Language'] + } + } textTracks.push({ id: textTrackId, lang: textTrackLang, @@ -307,6 +336,20 @@ function TizenVideo(options) { extra = JSON.parse(audioTrack.extra_info); } catch(e) {} var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; + if (audioTrackLang === null) { + retrieveExtendedTracks() + } + if (((tracksData || {}).audio || []).length) { + var extendedTrackData = tracksData.audio.find(function(el) { + if ((el || {})['StreamOrder'] === textTrack.index) { + return true + } + return false + }) + if ((extendedTrackData || {})['Language']) { + audioTrackLang = extendedTrackData['Language'] + } + } audioTracks.push({ id: audioTrackId, lang: audioTrackLang, diff --git a/src/tracksData.js b/src/tracksData.js new file mode 100644 index 0000000..01c9185 --- /dev/null +++ b/src/tracksData.js @@ -0,0 +1,14 @@ +async function getTracksData(url, cb) { + let tracks = [] + try { + const resp = await fetch('http://127.0.0.1:11470/tracks/'+encodeURIComponent(url)) + tracks = await resp.json() + } catch(e) { + console.error(e) + } + const audioTracks = tracks.filter(el => el['@type'] === 'Audio') + const subsTracks = tracks.filter(el => el['@type'] === 'Text') + cb({ audio: audioTracks, subs: subsTracks }) +} + +module.exports = getTracksData From c3816efde430ee3e8db97aaf204e51c5ba300286 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Fri, 10 May 2024 16:06:04 +0300 Subject: [PATCH 02/20] Fix Audio Tracks Lang --- src/TizenVideo/TizenVideo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 584f77a..76b2e4d 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -341,7 +341,7 @@ function TizenVideo(options) { } if (((tracksData || {}).audio || []).length) { var extendedTrackData = tracksData.audio.find(function(el) { - if ((el || {})['StreamOrder'] === textTrack.index) { + if ((el || {})['StreamOrder'] === audioTrack.index) { return true } return false From 4a66368a3940edffd1703e05ba291ffa0850106e Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Fri, 10 May 2024 16:13:28 +0300 Subject: [PATCH 03/20] Retrieve Extended Track Data Sooner For Known Devices --- src/TizenVideo/TizenVideo.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 76b2e4d..f324a6e 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -5,6 +5,8 @@ var Color = require('color'); var ERROR = require('../error'); var getTracksData = require('../tracksData') +var needsExtendedTracks = false + function TizenVideo(options) { options = options || {}; @@ -153,6 +155,7 @@ function TizenVideo(options) { var tracksData = { audio: [], subs: [] } function retrieveExtendedTracks() { + needsExtendedTracks = true if (!gotTraktData && stream !== null) { gotTraktData = true getTracksData(stream.url, function(resp) { @@ -624,6 +627,10 @@ function TizenVideo(options) { } onPropChanged('buffering'); + if (needsExtendedTracks) { + retrieveExtendedTracks() + } + window.webapis.avplay.open(stream.url); window.webapis.avplay.setDisplayRect(0, 0, window.innerWidth, window.innerHeight); window.webapis.avplay.setDisplayMethod('PLAYER_DISPLAY_MODE_LETTER_BOX'); From 236399229020591642563ba4ad6b697bfbab9d08 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Fri, 10 May 2024 16:24:20 +0300 Subject: [PATCH 04/20] Lint --- src/TizenVideo/TizenVideo.js | 38 ++++++++++++++++++------------------ src/tracksData.js | 31 ++++++++++++++++------------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index f324a6e..fe731a3 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -3,9 +3,9 @@ var cloneDeep = require('lodash.clonedeep'); var deepFreeze = require('deep-freeze'); var Color = require('color'); var ERROR = require('../error'); -var getTracksData = require('../tracksData') +var getTracksData = require('../tracksData'); -var needsExtendedTracks = false +var needsExtendedTracks = false; function TizenVideo(options) { options = options || {}; @@ -151,18 +151,18 @@ function TizenVideo(options) { playbackSpeed: false }; - var gotTraktData = false - var tracksData = { audio: [], subs: [] } + var gotTraktData = false; + var tracksData = { audio: [], subs: [] }; function retrieveExtendedTracks() { - needsExtendedTracks = true + needsExtendedTracks = true; if (!gotTraktData && stream !== null) { - gotTraktData = true + gotTraktData = true; getTracksData(stream.url, function(resp) { - tracksData = resp + tracksData = resp; onPropChanged('subtitlesTracks'); onPropChanged('audioTracks'); - }) + }); } } @@ -232,17 +232,17 @@ function TizenVideo(options) { } catch(e) {} var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; if (textTrackLang === null) { - retrieveExtendedTracks() + retrieveExtendedTracks(); } if (((tracksData || {}).subs || []).length) { var extendedTrackData = tracksData.subs.find(function(el) { if ((el || {})['StreamOrder'] === textTrack.index) { - return true + return true; } - return false - }) + return false; + }); if ((extendedTrackData || {})['Language']) { - textTrackLang = extendedTrackData['Language'] + textTrackLang = extendedTrackData['Language']; } } textTracks.push({ @@ -340,17 +340,17 @@ function TizenVideo(options) { } catch(e) {} var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; if (audioTrackLang === null) { - retrieveExtendedTracks() + retrieveExtendedTracks(); } if (((tracksData || {}).audio || []).length) { var extendedTrackData = tracksData.audio.find(function(el) { if ((el || {})['StreamOrder'] === audioTrack.index) { - return true + return true; } - return false - }) + return false; + }); if ((extendedTrackData || {})['Language']) { - audioTrackLang = extendedTrackData['Language'] + audioTrackLang = extendedTrackData['Language']; } } audioTracks.push({ @@ -628,7 +628,7 @@ function TizenVideo(options) { onPropChanged('buffering'); if (needsExtendedTracks) { - retrieveExtendedTracks() + retrieveExtendedTracks(); } window.webapis.avplay.open(stream.url); diff --git a/src/tracksData.js b/src/tracksData.js index 01c9185..ea4356e 100644 --- a/src/tracksData.js +++ b/src/tracksData.js @@ -1,14 +1,17 @@ -async function getTracksData(url, cb) { - let tracks = [] - try { - const resp = await fetch('http://127.0.0.1:11470/tracks/'+encodeURIComponent(url)) - tracks = await resp.json() - } catch(e) { - console.error(e) - } - const audioTracks = tracks.filter(el => el['@type'] === 'Audio') - const subsTracks = tracks.filter(el => el['@type'] === 'Text') - cb({ audio: audioTracks, subs: subsTracks }) -} - -module.exports = getTracksData +module.exports = function(url, cb) { + fetch('http://127.0.0.1:11470/tracks/'+encodeURIComponent(url)).then(function(resp) { + resp.json().then(function(tracks) { + var audioTracks = tracks.filter(function(el) { return el['@type'] === 'Audio'; }); + var subsTracks = tracks.filter(function(el) { return el['@type'] === 'Text'; }); + cb({ audio: audioTracks, subs: subsTracks }); + }).catch(function(err) { + // eslint-disable-next-line no-console + console.error(err); + cb({ audio: [], subs: [] }); + }); + }).catch(function(err) { + // eslint-disable-next-line no-console + console.error(err); + cb({ audio: [], subs: [] }); + }); +}; From 76707bbf1d25575f116ffc3fa0ae893af16461f6 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 13 May 2024 16:48:56 +0300 Subject: [PATCH 05/20] Tweaks to Extended Track Data Logic --- src/TizenVideo/TizenVideo.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index fe731a3..abbd911 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -219,6 +219,13 @@ function TizenVideo(options) { var totalTrackInfo = window.webapis.avplay.getTotalTrackInfo(); var textTracks = []; + var countTextTracks = 0; + for (var i = 0; i < totalTrackInfo.length; i++) { + if (totalTrackInfo[i].type === 'TEXT') { + countTextTracks++; + } + } + for (var i = 0; i < totalTrackInfo.length; i++) { if (totalTrackInfo[i].type === 'TEXT') { var textTrack = totalTrackInfo[i]; @@ -231,7 +238,7 @@ function TizenVideo(options) { extra = JSON.parse(textTrack.extra_info); } catch(e) {} var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; - if (textTrackLang === null) { + if (textTrackLang === null && countTextTracks > 1) { retrieveExtendedTracks(); } if (((tracksData || {}).subs || []).length) { @@ -327,6 +334,13 @@ function TizenVideo(options) { var totalTrackInfo = window.webapis.avplay.getTotalTrackInfo(); var audioTracks = []; + var countAudioTracks = 0; + for (var i = 0; i < totalTrackInfo.length; i++) { + if (totalTrackInfo[i].type === 'AUDIO') { + countAudioTracks++; + } + } + for (var i = 0; i < totalTrackInfo.length; i++) { if (totalTrackInfo[i].type === 'AUDIO') { var audioTrack = totalTrackInfo[i]; @@ -339,7 +353,7 @@ function TizenVideo(options) { extra = JSON.parse(audioTrack.extra_info); } catch(e) {} var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; - if (audioTrackLang === null) { + if (audioTrackLang === null && countAudioTracks > 1) { retrieveExtendedTracks(); } if (((tracksData || {}).audio || []).length) { From e83f2c55104bc426e2a3fbdffa5acdeedb71eb08 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 13 May 2024 18:05:24 +0300 Subject: [PATCH 06/20] Detect Tizen Version --- src/TizenVideo/TizenVideo.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index abbd911..b590d14 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -641,7 +641,13 @@ function TizenVideo(options) { } onPropChanged('buffering'); - if (needsExtendedTracks) { + var tizenVersion = false; + + try { + tizenVersion = parseFloat(global.tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version')); + } catch(e) {} + + if (needsExtendedTracks || !tizenVersion || tizenVersion >= 6) { retrieveExtendedTracks(); } From 4bd7c80ce2c5db32970901aba20d3897bc043c2a Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Tue, 14 May 2024 12:21:18 +0300 Subject: [PATCH 07/20] Simplify Extended Track Data Logic --- src/TizenVideo/TizenVideo.js | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index b590d14..6360675 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -5,8 +5,6 @@ var Color = require('color'); var ERROR = require('../error'); var getTracksData = require('../tracksData'); -var needsExtendedTracks = false; - function TizenVideo(options) { options = options || {}; @@ -155,7 +153,6 @@ function TizenVideo(options) { var tracksData = { audio: [], subs: [] }; function retrieveExtendedTracks() { - needsExtendedTracks = true; if (!gotTraktData && stream !== null) { gotTraktData = true; getTracksData(stream.url, function(resp) { @@ -219,13 +216,6 @@ function TizenVideo(options) { var totalTrackInfo = window.webapis.avplay.getTotalTrackInfo(); var textTracks = []; - var countTextTracks = 0; - for (var i = 0; i < totalTrackInfo.length; i++) { - if (totalTrackInfo[i].type === 'TEXT') { - countTextTracks++; - } - } - for (var i = 0; i < totalTrackInfo.length; i++) { if (totalTrackInfo[i].type === 'TEXT') { var textTrack = totalTrackInfo[i]; @@ -238,9 +228,6 @@ function TizenVideo(options) { extra = JSON.parse(textTrack.extra_info); } catch(e) {} var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; - if (textTrackLang === null && countTextTracks > 1) { - retrieveExtendedTracks(); - } if (((tracksData || {}).subs || []).length) { var extendedTrackData = tracksData.subs.find(function(el) { if ((el || {})['StreamOrder'] === textTrack.index) { @@ -334,13 +321,6 @@ function TizenVideo(options) { var totalTrackInfo = window.webapis.avplay.getTotalTrackInfo(); var audioTracks = []; - var countAudioTracks = 0; - for (var i = 0; i < totalTrackInfo.length; i++) { - if (totalTrackInfo[i].type === 'AUDIO') { - countAudioTracks++; - } - } - for (var i = 0; i < totalTrackInfo.length; i++) { if (totalTrackInfo[i].type === 'AUDIO') { var audioTrack = totalTrackInfo[i]; @@ -353,9 +333,6 @@ function TizenVideo(options) { extra = JSON.parse(audioTrack.extra_info); } catch(e) {} var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; - if (audioTrackLang === null && countAudioTracks > 1) { - retrieveExtendedTracks(); - } if (((tracksData || {}).audio || []).length) { var extendedTrackData = tracksData.audio.find(function(el) { if ((el || {})['StreamOrder'] === audioTrack.index) { @@ -647,7 +624,7 @@ function TizenVideo(options) { tizenVersion = parseFloat(global.tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version')); } catch(e) {} - if (needsExtendedTracks || !tizenVersion || tizenVersion >= 6) { + if (!tizenVersion || tizenVersion >= 6) { retrieveExtendedTracks(); } From edee7e2457eb1b7bdf02dbb82dcbc5267f60a772 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 20 May 2024 15:18:43 +0300 Subject: [PATCH 08/20] Small Refactor --- src/TizenVideo/TizenVideo.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 6360675..9f792a3 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -230,10 +230,7 @@ function TizenVideo(options) { var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; if (((tracksData || {}).subs || []).length) { var extendedTrackData = tracksData.subs.find(function(el) { - if ((el || {})['StreamOrder'] === textTrack.index) { - return true; - } - return false; + return (el || {})['StreamOrder'] === textTrack.index; }); if ((extendedTrackData || {})['Language']) { textTrackLang = extendedTrackData['Language']; @@ -335,10 +332,7 @@ function TizenVideo(options) { var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; if (((tracksData || {}).audio || []).length) { var extendedTrackData = tracksData.audio.find(function(el) { - if ((el || {})['StreamOrder'] === audioTrack.index) { - return true; - } - return false; + return (el || {})['StreamOrder'] === audioTrack.index; }); if ((extendedTrackData || {})['Language']) { audioTrackLang = extendedTrackData['Language']; From bc17bef84319d3216007038a14ce7c732ac06dea Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 20 May 2024 15:24:24 +0300 Subject: [PATCH 09/20] Ensure Changes Exist Prior to Using onPropChanged --- src/TizenVideo/TizenVideo.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 9f792a3..5c410a1 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -157,8 +157,12 @@ function TizenVideo(options) { gotTraktData = true; getTracksData(stream.url, function(resp) { tracksData = resp; - onPropChanged('subtitlesTracks'); - onPropChanged('audioTracks'); + if (((tracksData || {}).subs || []).length) { + onPropChanged('subtitlesTracks'); + } + if (((tracksData || {}).audio || []).length) { + onPropChanged('audioTracks'); + } }); } } From f2e3e1418f1e9aec8024333d922293c747cca201 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 3 Jun 2024 17:45:40 +0300 Subject: [PATCH 10/20] Test Subs --- src/WebOsVideo/WebOsVideo.js | 60 ++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index 4c3662a..d4f40c6 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -199,7 +199,6 @@ function WebOsVideo(options) { } onPropChanged('subtitlesTracks'); onPropChanged('selectedSubtitlesTrackId'); - } }; @@ -439,6 +438,60 @@ function WebOsVideo(options) { playbackSpeed: false }; + var gotTraktData = false; + + function retrieveExtendedTracks() { + if (!gotTraktData && stream !== null) { + gotTraktData = true; + getTracksData(stream.url, function(resp) { + var nrSubs = 0; + var nrAudio = 0; + textTracks = []; + audioTracks = []; + var respArr = resp || []; + respArr.forEach(function(track) { + if (track.type === 'text') { + var textTrackId = nrSubs; + nrSubs++; + if (!currentSubTrack && !textTracks.length) { + currentSubTrack = textTrackId; + } + textTracks.push({ + id: textTrackId, + lang: track.lang || null, + label: track.lang || null, + origin: 'EMBEDDED', + embedded: true, + mode: textTrackId === currentSubTrack ? 'showing' : 'disabled', + }); + } else if (track.type === 'audio') { + var audioTrackId = nrAudio; + nrAudio++; + if (!currentAudioTrack && !audioTracks.length) { + currentAudioTrack = audioTrackId; + } + audioTracks.push({ + id: audioTrackId, + lang: track.lang || null, + label: track.lang || null, + origin: 'EMBEDDED', + embedded: true, + mode: audioTrackId === currentAudioTrack ? 'showing' : 'disabled', + }); + } + }) + if (((tracksData || {}).subs || []).length) { + onPropChanged('subtitlesTracks'); + onPropChanged('selectedSubtitlesTrackId'); + } + if (((tracksData || {}).audio || []).length) { + onPropChanged('audioTracks'); + onPropChanged('selectedAudioTrackId'); + } + }); + } + } + function getProp(propName) { switch (propName) { case 'stream': { @@ -973,13 +1026,16 @@ function WebOsVideo(options) { if (videoElement.mediaId) { knownMediaId = videoElement.mediaId; clearInterval(timer); - subscribe(cb); + retrieveExtendedTracks() + cb() +// subscribe(cb); return; } count++; if (count > 4) { // console.log('failed to get media id'); clearInterval(timer); + retrieveExtendedTracks() cb(); } } From 0f44df827693488b933b3e53a9c437a5e25a286c Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 3 Jun 2024 17:47:55 +0300 Subject: [PATCH 11/20] Forgot Require --- src/WebOsVideo/WebOsVideo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index d4f40c6..420fecb 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -2,6 +2,7 @@ var EventEmitter = require('eventemitter3'); var cloneDeep = require('lodash.clonedeep'); var deepFreeze = require('deep-freeze'); var ERROR = require('../error'); +var getTracksData = require('../tracksData'); function luna(params, call, fail, method) { if (call) params.onSuccess = call || function() {}; From cb6323be6c2134065db19819b8143b50a3c54cc4 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 3 Jun 2024 18:45:22 +0300 Subject: [PATCH 12/20] Fix LG Extended Tracks --- src/WebOsVideo/WebOsVideo.js | 21 ++++++++++----------- src/tracksData.js | 4 ++-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index 420fecb..4b9e2df 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -449,9 +449,9 @@ function WebOsVideo(options) { var nrAudio = 0; textTracks = []; audioTracks = []; - var respArr = resp || []; - respArr.forEach(function(track) { - if (track.type === 'text') { + tracksData = resp; + if (((tracksData || {}).subs || []).length) { + tracksData.subs.forEach(function(track) { var textTrackId = nrSubs; nrSubs++; if (!currentSubTrack && !textTracks.length) { @@ -465,7 +465,12 @@ function WebOsVideo(options) { embedded: true, mode: textTrackId === currentSubTrack ? 'showing' : 'disabled', }); - } else if (track.type === 'audio') { + }); + onPropChanged('subtitlesTracks'); + onPropChanged('selectedSubtitlesTrackId'); + } + if (((tracksData || {}).audio || []).length) { + tracksData.audio.forEach(function(track) { var audioTrackId = nrAudio; nrAudio++; if (!currentAudioTrack && !audioTracks.length) { @@ -479,13 +484,7 @@ function WebOsVideo(options) { embedded: true, mode: audioTrackId === currentAudioTrack ? 'showing' : 'disabled', }); - } - }) - if (((tracksData || {}).subs || []).length) { - onPropChanged('subtitlesTracks'); - onPropChanged('selectedSubtitlesTrackId'); - } - if (((tracksData || {}).audio || []).length) { + }); onPropChanged('audioTracks'); onPropChanged('selectedAudioTrackId'); } diff --git a/src/tracksData.js b/src/tracksData.js index ea4356e..88388bc 100644 --- a/src/tracksData.js +++ b/src/tracksData.js @@ -1,8 +1,8 @@ module.exports = function(url, cb) { fetch('http://127.0.0.1:11470/tracks/'+encodeURIComponent(url)).then(function(resp) { resp.json().then(function(tracks) { - var audioTracks = tracks.filter(function(el) { return el['@type'] === 'Audio'; }); - var subsTracks = tracks.filter(function(el) { return el['@type'] === 'Text'; }); + var audioTracks = tracks.filter(function(el) { return el.type === 'audio'; }); + var subsTracks = tracks.filter(function(el) { return el.type === 'text'; }); cb({ audio: audioTracks, subs: subsTracks }); }).catch(function(err) { // eslint-disable-next-line no-console From e1c62be49e8f83cb89910038d174280db2a5f320 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 3 Jun 2024 18:47:47 +0300 Subject: [PATCH 13/20] Fix Tizen Extended Tracks --- src/TizenVideo/TizenVideo.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 5c410a1..239bd12 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -234,10 +234,10 @@ function TizenVideo(options) { var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; if (((tracksData || {}).subs || []).length) { var extendedTrackData = tracksData.subs.find(function(el) { - return (el || {})['StreamOrder'] === textTrack.index; + return (el || {}).id === textTrack.index; }); - if ((extendedTrackData || {})['Language']) { - textTrackLang = extendedTrackData['Language']; + if ((extendedTrackData || {}).lang) { + textTrackLang = extendedTrackData.lang; } } textTracks.push({ @@ -336,10 +336,10 @@ function TizenVideo(options) { var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; if (((tracksData || {}).audio || []).length) { var extendedTrackData = tracksData.audio.find(function(el) { - return (el || {})['StreamOrder'] === audioTrack.index; + return (el || {}).id === audioTrack.index; }); - if ((extendedTrackData || {})['Language']) { - audioTrackLang = extendedTrackData['Language']; + if ((extendedTrackData || {}).lang) { + audioTrackLang = extendedTrackData.lang; } } audioTracks.push({ From eb57575ab559ac02228836b98a1864a7f65d4a7f Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Thu, 6 Jun 2024 12:13:20 +0300 Subject: [PATCH 14/20] Fix Usage of Extended Tracks Data --- src/TizenVideo/TizenVideo.js | 16 +++++++++------- src/WebOsVideo/WebOsVideo.js | 22 +++++++++++++--------- src/tracksData.js | 16 ++++++---------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/TizenVideo/TizenVideo.js b/src/TizenVideo/TizenVideo.js index 239bd12..518a0f7 100644 --- a/src/TizenVideo/TizenVideo.js +++ b/src/TizenVideo/TizenVideo.js @@ -156,7 +156,9 @@ function TizenVideo(options) { if (!gotTraktData && stream !== null) { gotTraktData = true; getTracksData(stream.url, function(resp) { - tracksData = resp; + if (resp) { + tracksData = resp; + } if (((tracksData || {}).subs || []).length) { onPropChanged('subtitlesTracks'); } @@ -234,10 +236,10 @@ function TizenVideo(options) { var textTrackLang = typeof extra.track_lang === 'string' && extra.track_lang.length > 0 ? extra.track_lang.trim() : null; if (((tracksData || {}).subs || []).length) { var extendedTrackData = tracksData.subs.find(function(el) { - return (el || {}).id === textTrack.index; + return (el || {}).id-1 === textTrack.index; }); - if ((extendedTrackData || {}).lang) { - textTrackLang = extendedTrackData.lang; + if (extendedTrackData) { + textTrackLang = extendedTrackData.lang || 'eng'; } } textTracks.push({ @@ -336,10 +338,10 @@ function TizenVideo(options) { var audioTrackLang = typeof extra.language === 'string' && extra.language.length > 0 ? extra.language : null; if (((tracksData || {}).audio || []).length) { var extendedTrackData = tracksData.audio.find(function(el) { - return (el || {}).id === audioTrack.index; + return (el || {}).id-1 === audioTrack.index; }); - if ((extendedTrackData || {}).lang) { - audioTrackLang = extendedTrackData.lang; + if (extendedTrackData) { + audioTrackLang = extendedTrackData.lang || 'eng'; } } audioTracks.push({ diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index 4b9e2df..d9eaada 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -229,6 +229,7 @@ function WebOsVideo(options) { } }; + // eslint-disable-next-line no-unused-vars var subscribe = function (cb) { if (subscribed) return; subscribed = true; @@ -440,6 +441,7 @@ function WebOsVideo(options) { }; var gotTraktData = false; + var tracksData = { audio: [], subs: [] }; function retrieveExtendedTracks() { if (!gotTraktData && stream !== null) { @@ -449,7 +451,9 @@ function WebOsVideo(options) { var nrAudio = 0; textTracks = []; audioTracks = []; - tracksData = resp; + if (resp) { + tracksData = resp; + } if (((tracksData || {}).subs || []).length) { tracksData.subs.forEach(function(track) { var textTrackId = nrSubs; @@ -459,8 +463,8 @@ function WebOsVideo(options) { } textTracks.push({ id: textTrackId, - lang: track.lang || null, - label: track.lang || null, + lang: track.lang || 'eng', + label: track.lang || 'eng', origin: 'EMBEDDED', embedded: true, mode: textTrackId === currentSubTrack ? 'showing' : 'disabled', @@ -478,8 +482,8 @@ function WebOsVideo(options) { } audioTracks.push({ id: audioTrackId, - lang: track.lang || null, - label: track.lang || null, + lang: track.lang || 'eng', + label: track.lang || 'eng', origin: 'EMBEDDED', embedded: true, mode: audioTrackId === currentAudioTrack ? 'showing' : 'disabled', @@ -1026,16 +1030,16 @@ function WebOsVideo(options) { if (videoElement.mediaId) { knownMediaId = videoElement.mediaId; clearInterval(timer); - retrieveExtendedTracks() - cb() -// subscribe(cb); + retrieveExtendedTracks(); + cb(); + // subscribe(cb); return; } count++; if (count > 4) { // console.log('failed to get media id'); clearInterval(timer); - retrieveExtendedTracks() + retrieveExtendedTracks(); cb(); } } diff --git a/src/tracksData.js b/src/tracksData.js index 88388bc..b7360c3 100644 --- a/src/tracksData.js +++ b/src/tracksData.js @@ -1,17 +1,13 @@ module.exports = function(url, cb) { fetch('http://127.0.0.1:11470/tracks/'+encodeURIComponent(url)).then(function(resp) { - resp.json().then(function(tracks) { - var audioTracks = tracks.filter(function(el) { return el.type === 'audio'; }); - var subsTracks = tracks.filter(function(el) { return el.type === 'text'; }); - cb({ audio: audioTracks, subs: subsTracks }); - }).catch(function(err) { - // eslint-disable-next-line no-console - console.error(err); - cb({ audio: [], subs: [] }); - }); + return resp.json(); + }).then(function(tracks) { + var audioTracks = tracks.filter(function(el) { return el.type === 'audio'; }); + var subsTracks = tracks.filter(function(el) { return el.type === 'text'; }); + cb({ audio: audioTracks, subs: subsTracks }); }).catch(function(err) { // eslint-disable-next-line no-console console.error(err); - cb({ audio: [], subs: [] }); + cb(false); }); }; From 88b77e2716d0fcd913d9da4861ff8d416a42c0ba Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Thu, 6 Jun 2024 21:29:37 +0300 Subject: [PATCH 15/20] Always Use External MKV / MP4 Parsers for LG TV --- src/WebOsVideo/WebOsVideo.js | 145 +---------------------------------- 1 file changed, 3 insertions(+), 142 deletions(-) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index d9eaada..e6e8906 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -147,14 +147,10 @@ function WebOsVideo(options) { var isLoaded = null; - var knownMediaId = false; - var subSize = 75; var disabledSubs = true; - var subscribed = false; - var currentSubTrack = false; var currentAudioTrack = false; @@ -174,140 +170,6 @@ function WebOsVideo(options) { char_opacity: 255 }; - var setSubs = function (info) { - textTracks = []; - if (info.numSubtitleTracks) { - for (var i = 0; i < info.subtitleTrackInfo.length; i++) { - var textTrack = info.subtitleTrackInfo[i]; - textTrack.index = i; - var textTrackLang = textTrack.language === '(null)' ? null : textTrack.language; - - var textTrackId = 'EMBEDDED_' + textTrack.index; - - if (!currentSubTrack && !textTracks.length) { - currentSubTrack = textTrackId; - } - - textTracks.push({ - id: textTrackId, - lang: textTrackLang, - label: textTrackLang, - origin: 'EMBEDDED', - embedded: true, - mode: textTrackId === currentSubTrack ? 'showing' : 'disabled', - }); - - } - onPropChanged('subtitlesTracks'); - onPropChanged('selectedSubtitlesTrackId'); - } - }; - - var setTracks = function (info) { - audioTracks = []; - if (info.numAudioTracks) { - for (var i = 0; i < info.audioTrackInfo.length; i++) { - var audioTrack = info.audioTrackInfo[i]; - audioTrack.index = i; - var audioTrackId = 'EMBEDDED_' + audioTrack.index; - if (!currentAudioTrack && !audioTracks.length) { - currentAudioTrack = audioTrackId; - } - var audioTrackLang = audioTrack.language === '(null)' ? null : audioTrack.language; - audioTracks.push({ - id: audioTrackId, - lang: audioTrackLang, - label: audioTrackLang, - origin: 'EMBEDDED', - embedded: true, - mode: audioTrackId === currentAudioTrack ? 'showing' : 'disabled', - }); - } - onPropChanged('audioTracks'); - onPropChanged('selectedAudioTrackId'); - - } - }; - - // eslint-disable-next-line no-unused-vars - var subscribe = function (cb) { - if (subscribed) return; - subscribed = true; - var answered = false; - luna({ - method: 'subscribe', - parameters: { - 'mediaId': knownMediaId, - 'subscribe': true - } - }, function (result) { - if (result.sourceInfo && !answered) { - answered = true; - var info = result.sourceInfo.programInfo[0]; - - setSubs(info); - - setTracks(info); - - unsubscribe(cb); - } - - if ((result.error || {}).errorCode) { - answered = true; - // console.error('luna playback error', result.error); - unsubscribe(cb); - // unsubscribe(); - // onVideoError(); - return; - } - - if ((result.unloadCompleted || {}).mediaId === knownMediaId && (result.unloadCompleted || {}).state) { - // strange case where it just.. ends? without ever getting result.sourceInfo - // onEnded(); - // console.log('strange case of end'); - // unsubscribe(cb); - return; - } - - count_message++; - - if (count_message === 30 && !answered) { - // cb(); - unsubscribe(cb); - } - }, function() { // function(err) - // console.log('luna error log 2'); - // console.error(err); - }); - }; - - var unsubscribe = function (cb) { - if (!subscribed) return; - subscribed = false; - luna({ - method: 'unsubscribe', - parameters: { - 'mediaId': knownMediaId - } - }, function () { // function(result) - // console.log('unsubscribe result', JSON.stringify(result)); - cb(); - }, function () { // function(err) - // console.log('unsubscribe error', JSON.stringify(err)); - cb(); - }); - cb(); - }; - - // var unload = function (cb) { - // luna({ - // method: 'unload', - // parameters: { - // 'mediaId': knownMediaId - // } - // }, cb, cb); - // }; - var toggleSubtitles = function (status) { if (!videoElement.mediaId) return; @@ -462,7 +324,7 @@ function WebOsVideo(options) { currentSubTrack = textTrackId; } textTracks.push({ - id: textTrackId, + id: 'EMBEDDED_' + textTrackId, lang: track.lang || 'eng', label: track.lang || 'eng', origin: 'EMBEDDED', @@ -481,7 +343,7 @@ function WebOsVideo(options) { currentAudioTrack = audioTrackId; } audioTracks.push({ - id: audioTrackId, + id: 'EMBEDDED_' + audioTrackId, lang: track.lang || 'eng', label: track.lang || 'eng', origin: 'EMBEDDED', @@ -489,6 +351,7 @@ function WebOsVideo(options) { mode: audioTrackId === currentAudioTrack ? 'showing' : 'disabled', }); }); + currentAudioTrack = 'EMBEDDED_0'; onPropChanged('audioTracks'); onPropChanged('selectedAudioTrackId'); } @@ -1028,11 +891,9 @@ function WebOsVideo(options) { var initMediaId = function (cb) { function retrieveMediaId() { if (videoElement.mediaId) { - knownMediaId = videoElement.mediaId; clearInterval(timer); retrieveExtendedTracks(); cb(); - // subscribe(cb); return; } count++; From 83b9460efb5568b7772c1a17a10c0b55bf305eb8 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Fri, 7 Jun 2024 16:49:45 +0300 Subject: [PATCH 16/20] Filter Out Unsupported Tracks on LG --- src/WebOsVideo/WebOsVideo.js | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index e6e8906..49c8008 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -136,6 +136,47 @@ function stremioSubSizes(size) { return false; } +var device = { + unsupportedAudio: ['DTS', 'TRUEHD'], + unsupportedSubs: ['HDMV/PGS'] +}; + +var fetchedDeviceInfo = false; + +function retrieveDeviceInfo() { + if (fetchedDeviceInfo) { + return; + } + window.webOS.service.request('luna://com.webos.service.config', { + method: 'getConfigs', + parameters: { + 'configNames': [ + 'tv.model.edidType' + ] + }, + onSuccess: function (result) { + if (((result || {}).configs || {})['tv.model.edidType']) { + fetchedDeviceInfo = true; + var edidType = result.configs['tv.model.edidType'].toLowerCase(); + if (edidType.includes('dts')) { + device.unsupportedAudio = device.unsupportedAudio.filter(function(e) { + return e !== 'DTS'; + }); + } + if (edidType.includes('truehd')) { + device.unsupportedAudio = device.unsupportedAudio.filter(function(e) { + return e !== 'TRUEHD'; + }); + } + } + }, + onFailure: function (err) { + // eslint-disable-next-line no-console + console.log('could not get deviceInfo', err); + } + }); +} + function WebOsVideo(options) { options = options || {}; @@ -318,6 +359,9 @@ function WebOsVideo(options) { } if (((tracksData || {}).subs || []).length) { tracksData.subs.forEach(function(track) { + if (device.unsupportedSubs.includes(track.codec || '')) { + return; + } var textTrackId = nrSubs; nrSubs++; if (!currentSubTrack && !textTracks.length) { @@ -337,6 +381,9 @@ function WebOsVideo(options) { } if (((tracksData || {}).audio || []).length) { tracksData.audio.forEach(function(track) { + if (device.unsupportedAudio.includes(track.codec || '')) { + return; + } var audioTrackId = nrAudio; nrAudio++; if (!currentAudioTrack && !audioTracks.length) { @@ -893,6 +940,7 @@ function WebOsVideo(options) { if (videoElement.mediaId) { clearInterval(timer); retrieveExtendedTracks(); + retrieveDeviceInfo(); cb(); return; } @@ -901,6 +949,7 @@ function WebOsVideo(options) { // console.log('failed to get media id'); clearInterval(timer); retrieveExtendedTracks(); + retrieveDeviceInfo(); cb(); } } From d38c2faa1aa4765872fb7d8decfaeeec97df5098 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Sat, 8 Jun 2024 13:58:26 +0300 Subject: [PATCH 17/20] Add Logs for EDID --- src/WebOsVideo/WebOsVideo.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index 49c8008..ca3219f 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -156,6 +156,8 @@ function retrieveDeviceInfo() { }, onSuccess: function (result) { if (((result || {}).configs || {})['tv.model.edidType']) { + // eslint-disable-next-line no-console + console.log('edid', result.configs['tv.model.edidType']); fetchedDeviceInfo = true; var edidType = result.configs['tv.model.edidType'].toLowerCase(); if (edidType.includes('dts')) { @@ -168,6 +170,10 @@ function retrieveDeviceInfo() { return e !== 'TRUEHD'; }); } + // eslint-disable-next-line no-console + console.log('unsupported audio', device.unsupportedAudio); + // eslint-disable-next-line no-console + console.log('unsupported subs', device.unsupportedSubs); } }, onFailure: function (err) { From 326ea8ef50e75f03fb4cbd6ec4986a3853534cf4 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Mon, 10 Jun 2024 13:39:18 +0300 Subject: [PATCH 18/20] Fix Tracks Data When Array Elements are `null` --- src/tracksData.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tracksData.js b/src/tracksData.js index b7360c3..08db7fe 100644 --- a/src/tracksData.js +++ b/src/tracksData.js @@ -2,8 +2,8 @@ module.exports = function(url, cb) { fetch('http://127.0.0.1:11470/tracks/'+encodeURIComponent(url)).then(function(resp) { return resp.json(); }).then(function(tracks) { - var audioTracks = tracks.filter(function(el) { return el.type === 'audio'; }); - var subsTracks = tracks.filter(function(el) { return el.type === 'text'; }); + var audioTracks = tracks.filter(function(el) { return (el || {}).type === 'audio'; }); + var subsTracks = tracks.filter(function(el) { return (el || {}).type === 'text'; }); cb({ audio: audioTracks, subs: subsTracks }); }).catch(function(err) { // eslint-disable-next-line no-console From 4c3a7f8df9b195d5a6078af8d2646ed82b75b930 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Thu, 13 Jun 2024 15:52:58 +0300 Subject: [PATCH 19/20] Remove Helper Logs --- src/WebOsVideo/WebOsVideo.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index ca3219f..49c8008 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -156,8 +156,6 @@ function retrieveDeviceInfo() { }, onSuccess: function (result) { if (((result || {}).configs || {})['tv.model.edidType']) { - // eslint-disable-next-line no-console - console.log('edid', result.configs['tv.model.edidType']); fetchedDeviceInfo = true; var edidType = result.configs['tv.model.edidType'].toLowerCase(); if (edidType.includes('dts')) { @@ -170,10 +168,6 @@ function retrieveDeviceInfo() { return e !== 'TRUEHD'; }); } - // eslint-disable-next-line no-console - console.log('unsupported audio', device.unsupportedAudio); - // eslint-disable-next-line no-console - console.log('unsupported subs', device.unsupportedSubs); } }, onFailure: function (err) { From 41e2283203bdc14326e6f486323ec8b468904754 Mon Sep 17 00:00:00 2001 From: Alexandru Branza Date: Thu, 13 Jun 2024 18:30:37 +0300 Subject: [PATCH 20/20] Add VOBSUB to Unsupported Embedded Subs on LG TV --- src/WebOsVideo/WebOsVideo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WebOsVideo/WebOsVideo.js b/src/WebOsVideo/WebOsVideo.js index 49c8008..02ace2c 100644 --- a/src/WebOsVideo/WebOsVideo.js +++ b/src/WebOsVideo/WebOsVideo.js @@ -138,7 +138,7 @@ function stremioSubSizes(size) { var device = { unsupportedAudio: ['DTS', 'TRUEHD'], - unsupportedSubs: ['HDMV/PGS'] + unsupportedSubs: ['HDMV/PGS', 'VOBSUB'] }; var fetchedDeviceInfo = false;