yumata/lampa-source

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));
                                 }
                        });
        }

image