Skip to content

Commit

Permalink
Merge pull request #75 from Stremio/extended-tracks-data
Browse files Browse the repository at this point in the history
Retrieve Extended Tracks Data from Streaming Server
  • Loading branch information
jaruba committed Jun 13, 2024
2 parents f01a6c0 + 41e2283 commit f5b2c5e
Show file tree
Hide file tree
Showing 3 changed files with 170 additions and 140 deletions.
47 changes: 47 additions & 0 deletions src/TizenVideo/TizenVideo.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 || {};
Expand Down Expand Up @@ -148,6 +149,26 @@ 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) {
if (resp) {
tracksData = resp;
}
if (((tracksData || {}).subs || []).length) {
onPropChanged('subtitlesTracks');
}
if (((tracksData || {}).audio || []).length) {
onPropChanged('audioTracks');
}
});
}
}

function getProp(propName) {
switch (propName) {
case 'stream': {
Expand Down Expand Up @@ -213,6 +234,14 @@ 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 (((tracksData || {}).subs || []).length) {
var extendedTrackData = tracksData.subs.find(function(el) {
return (el || {}).id-1 === textTrack.index;
});
if (extendedTrackData) {
textTrackLang = extendedTrackData.lang || 'eng';
}
}
textTracks.push({
id: textTrackId,
lang: textTrackLang,
Expand Down Expand Up @@ -307,6 +336,14 @@ 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 (((tracksData || {}).audio || []).length) {
var extendedTrackData = tracksData.audio.find(function(el) {
return (el || {}).id-1 === audioTrack.index;
});
if (extendedTrackData) {
audioTrackLang = extendedTrackData.lang || 'eng';
}
}
audioTracks.push({
id: audioTrackId,
lang: audioTrackLang,
Expand Down Expand Up @@ -581,6 +618,16 @@ function TizenVideo(options) {
}
onPropChanged('buffering');

var tizenVersion = false;

try {
tizenVersion = parseFloat(global.tizen.systeminfo.getCapability('http://tizen.org/feature/platform.version'));
} catch(e) {}

if (!tizenVersion || tizenVersion >= 6) {
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');
Expand Down
250 changes: 110 additions & 140 deletions src/WebOsVideo/WebOsVideo.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {};
Expand Down Expand Up @@ -135,6 +136,47 @@ function stremioSubSizes(size) {
return false;
}

var device = {
unsupportedAudio: ['DTS', 'TRUEHD'],
unsupportedSubs: ['HDMV/PGS', 'VOBSUB']
};

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 || {};
Expand All @@ -146,14 +188,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;
Expand All @@ -173,140 +211,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');

}
};

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;

Expand Down Expand Up @@ -439,6 +343,69 @@ function WebOsVideo(options) {
playbackSpeed: false
};

var gotTraktData = false;
var tracksData = { audio: [], subs: [] };

function retrieveExtendedTracks() {
if (!gotTraktData && stream !== null) {
gotTraktData = true;
getTracksData(stream.url, function(resp) {
var nrSubs = 0;
var nrAudio = 0;
textTracks = [];
audioTracks = [];
if (resp) {
tracksData = resp;
}
if (((tracksData || {}).subs || []).length) {
tracksData.subs.forEach(function(track) {
if (device.unsupportedSubs.includes(track.codec || '')) {
return;
}
var textTrackId = nrSubs;
nrSubs++;
if (!currentSubTrack && !textTracks.length) {
currentSubTrack = textTrackId;
}
textTracks.push({
id: 'EMBEDDED_' + textTrackId,
lang: track.lang || 'eng',
label: track.lang || 'eng',
origin: 'EMBEDDED',
embedded: true,
mode: textTrackId === currentSubTrack ? 'showing' : 'disabled',
});
});
onPropChanged('subtitlesTracks');
onPropChanged('selectedSubtitlesTrackId');
}
if (((tracksData || {}).audio || []).length) {
tracksData.audio.forEach(function(track) {
if (device.unsupportedAudio.includes(track.codec || '')) {
return;
}
var audioTrackId = nrAudio;
nrAudio++;
if (!currentAudioTrack && !audioTracks.length) {
currentAudioTrack = audioTrackId;
}
audioTracks.push({
id: 'EMBEDDED_' + audioTrackId,
lang: track.lang || 'eng',
label: track.lang || 'eng',
origin: 'EMBEDDED',
embedded: true,
mode: audioTrackId === currentAudioTrack ? 'showing' : 'disabled',
});
});
currentAudioTrack = 'EMBEDDED_0';
onPropChanged('audioTracks');
onPropChanged('selectedAudioTrackId');
}
});
}
}

function getProp(propName) {
switch (propName) {
case 'stream': {
Expand Down Expand Up @@ -971,15 +938,18 @@ function WebOsVideo(options) {
var initMediaId = function (cb) {
function retrieveMediaId() {
if (videoElement.mediaId) {
knownMediaId = videoElement.mediaId;
clearInterval(timer);
subscribe(cb);
retrieveExtendedTracks();
retrieveDeviceInfo();
cb();
return;
}
count++;
if (count > 4) {
// console.log('failed to get media id');
clearInterval(timer);
retrieveExtendedTracks();
retrieveDeviceInfo();
cb();
}
}
Expand Down
13 changes: 13 additions & 0 deletions src/tracksData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
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'; });
cb({ audio: audioTracks, subs: subsTracks });
}).catch(function(err) {
// eslint-disable-next-line no-console
console.error(err);
cb(false);
});
};

0 comments on commit f5b2c5e

Please sign in to comment.