webos api для управления субтитрами и аудиодорожками
aabytt opened this issue · 4 comments
при запуске видео в плеере лампы в шине webOS появляется запрос com.webos.media метод load, в ответ прилетает mediaId, имея который можно управлять субтитрами и дорожками
описание метода load
https://www.webosose.org/docs/reference/ls2-api/com-webos-media/#load
живой пример лога шины при запуске видео из лампы:
запрос
3628.258 [PUB] call 5 com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) com.webos.media (/var/run/ls2/jpn9J7) (null) //load {"payload":{"option":{"appId":"com.lampa.tv","transmission":{"httpHeader":{"referer":"","userAgent":"Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41","cookies":""}},"bufferControl":{"userBufferCtrl":false}}},"uri":"http://127.0.0.1:8090/stream?link=df1c4e7677f1a517fca74111c5e9f79b7f9305ea&index=16&play&preload","type":"media"}
ответ
3628.279 [PUB] return 5 com.webos.media (/var/run/ls2/jpn9J7) com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) {"errorCode":0,"returnValue":true,"errorText":"","mediaId":"_MQUBT01X5MiTj4"}
после load происходит подписка на события по mediaId, в числе которых возвращается sourceinfo - инфа об источнике в т.ч. количестве и языках субтитров и дорожек
описание метода subscribe
https://www.webosose.org/docs/reference/ls2-api/com-webos-media/#subscribe
https://www.webosose.org/docs/reference/ls2-api/com-webos-media/#sourceinfo
пример возвращаемого sourceInfo из лога шины webOS
3640.414 [PRV] return 5 com.webos.pipeline._MQUBT01X5MiTj4 (/var/run/ls2/lWULGd) com.webos.pipelinectrl._MQUBT01X5MiTj4 (/var/run/ls2/1XB7fo) «{"sourceInfo":{"numPrograms":1,"container":"mkv","seekable":true,"trickable":true,"programInfo":[{"duration":1295552,"numAudioTracks":4,"audioTrackInfo":[{"bitRate":0,"language":"ru","codec":"ac3","sampleRate":48,"channels":2,"audioType":0},{"bitRate":0,"language":"ru","codec":"ac3","sampleRate":48,"channels":2,"audioType":0},{"bitRate":0,"language":"ru","codec":"ac3","sampleRate":48,"channels":2,"audioType":0},{"bitRate":0,"language":"en","codec":"ac3","sampleRate":48,"channels":6,"audioType":0} ],"numVideoTracks":1,"videoTrackInfo":[{"angleNumber":0,"level":3.1,"width":1280,"height":720,"codec":"H264","profile":"high","frameRate":23.976,"progressive":true} ],"numSubtitleTracks":2,"subtitleTrackInfo":[{"language":"ru","type":"text"},{"language":"en","type":"text"} ]} ],"mediaId":"_MQUBT01X5MiTj4"}}
формат методов для переключения дорожек и субтитров
(они не описаны тут https://www.webosose.org/docs/reference/ls2-api/com-webos-media/)
вкл/выкл отображения субтитров
(параметр enable значение true/false, mediaId - id воспроизводимого потока полученный при запуске)
webOS.service.request("luna://com.webos.media", {
method:"setSubtitleEnable",
parameters: {
"mediaId": "_MQUBT01X5MiTj4",
"enable": true
},
onSuccess: function (result) {
console.log(JSON.stringify(result));
}
},
onFailure: function (result) {
console.log( "[fail][" + result.errorCode + "] " + result.errorText );
}
});
переключение дорожек и субтитров
( параметр type - audio для дорожек, text для субтитров, index - номер дорожки/субтитров, mediaId - id воспроизводимого потока полученный при запуске)
webOS.service.request("luna://com.webos.media", {
method:"selectTrack",
parameters: {
"type": "audio",
"index": 1,
"mediaId": "_MQUBT01X5MiTj4"
},
onSuccess: function (result) {
console.log(JSON.stringify(result));
},
onFailure: function (result) {
console.log( "[fail][" + result.errorCode + "] " + result.errorText );
}
});
Потестил, вся проблема в том, что когда использую метод load, то запускается отдельное окно, как будто плеер запустил без интерфейса.
Похоже не как не получить субтитры :(
для рутованных девайсов останется способ получать "незаконным" путём mediaId и управлять сабами и дорогами.
доделаю и выкачу скрипт для этого
не знаешь как мне имея mediaId получать в js события которые вспоследствии генерируются? я пробовал - первый ответ приходит после подписки и всё, а в консоли webos после загрузки и старта видео прилетает sourceInfo и другие события но их уже не могу спарсить, чтобы вычитать сколько дорожек и сабов и какой их язык.
вот пример что происходит в шине, нужно получать в приложение этот sourceInfo через запрос вида webOS.service.request("luna://com.webos.media", { method:"subscribe"... }
3628.281 [PUB] call 8 com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) com.webos.media (/var/run/ls2/jpn9J7) (null) //subscribe «{"mediaId":"_MQUBT01X5MiTj4"}»
3628.955 [PUB] return 8 com.webos.media (/var/run/ls2/jpn9J7) com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) «{"subscription":true}»
3628.288 [PUB] return 8 com.webos.media (/var/run/ls2/jpn9J7) com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) «{"errorCode":0,"returnValue":true,"errorText":"","mediaId":"_MQUBT01X5MiTj4"}»
3629.907 [PUB] return 8 com.webos.media (/var/run/ls2/jpn9J7) com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) «{"streamingInfo":{"instantBitrate":0,"totalBitrate":0,"mediaId":"_MQUBT01X5MiTj4"}}»
...
3640.405 [PUB] return 8 com.webos.media (/var/run/ls2/jpn9J7) com.webos.media.client._5IC7T01btpYJEV (/var/run/ls2/vnsgcd) «{"sourceInfo":{"numPrograms":1,"container":"mkv","seekable":true,"trickable":true,"programInfo":[{"duration":1295552,"numAudioTracks":4,"audioTrackInfo":[{"bitRate":0,"language":"ru","codec":"ac3","sampleRate":48,"channels":2,"audioType":0},{"bitRate":0,"language":"ru","codec":"ac3","sampleRate":48,"channels":2,"audioType":0},{"bitRate":0,"language":"ru","codec":"ac3","sampleRate":48,"channels":2,"audioType":0},{"bitRate":0,"language":"en","codec":"ac3","sampleRate":48,"channels":6,"audioType":0} ],"numVideoTracks":1,"videoTrackInfo":[{"angleNumber":0,"level":3.1,"width":1280,"height":720,"codec":"H264","profile":"high","frameRate":23.976,"progressive":true} ],"numSubtitleTracks":2,"subtitleTrackInfo":[{"language":"ru","type":"text"},{"language":"en","type":"text"} ]} ],"mediaId":"_MQUBT01X5MiTj4"}}»
...
всё просто оказалось
добавил параметр subscribe: true и вуаля )
после получения sourceinfo можно сделать unsubscribe
function subscribe(mediaId) {
webOS.service.request("luna://com.webos.media", {
method: "subscribe",
parameters: {
"mediaId": mediaId,
"subscribe": true
},
onSuccess: function (result) {
console.log("[Subscribed]" + JSON.stringify(result));
},
onFailure: function (result) {
console.log("[failed to subscribe]" + JSON.stringify(result));
}
});
}