diff --git a/lg_webOS/README.md b/lg_webOS/README.md index 1a0f948..dd9563a 100644 --- a/lg_webOS/README.md +++ b/lg_webOS/README.md @@ -7,6 +7,7 @@ - [on boot](#on-boot) - [channel search](#channel-search) - [application marketplace](#application-marketplace) + - [license manager](#license-manager) - [impersonating](#impersonating) - [OS update](#os-update) - [channel guide](#channel-guide) @@ -271,10 +272,75 @@ sample entry: } ``` +`generate_slimmed-aic-json.rb` can be used to create a small schedule starting at the current time. + #### application marketplace bar +#### license manager + +after an update of an application (and potentially other times), the device calls a different home: + +request: +``` +POST /license_manager.asp HTTP/1.1 +User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;) +Host: us.security.lgtvsdp.com +Content-Length: 210 +Content-Type:application/x-www-form-urlencoded +X-Device-Product:webOSTV 3.0 +X-Device-Platform:W16P +X-Device-Model:HE_DTV_W16P_AFADATAA +X-Device-Netcast-Platform-Version:3.3.1 +X-Device-Eco-Info:1 +X-Device-Country-Group:US +X-Device-Publish-Flag:Y +X-Device-ContentsQA-Flag:Y +X-Device-FW-Version:04.30.40 +X-Device-SDK-VERSION:3.3.1 +X-Device-ID: +X-Device-Type:T01 +X-Device-Language:en-US +X-Device-Country:US +X-Device-Remote-Flag:N +X-Authentication: + + +mode=issuelicense4pre&sid=1827712162&deviceid=>&devicemodel=webostv&p=D1609DEB7189B744D4BC272550CBF5BF&g=5&A=52013FFC91EA5A6F41BE025B5E4461FB&hmac=OnSGJj7D3yth5HPdafdtnArDKYc%3D +``` + +nothing in the request really jumps out + +response: +``` +HTTP/1.1 200 OK +Cache-Control: private +Content-Length: 935 +Content-Type: text/html +Server: Microsoft-IIS/7.5 +Set-Cookie: ASPSESSIONIDAARCQAST=DOLHEFIBIEAONHPFCIFPECDL; path=/ +X-Powered-By: ASP.NET +Date: Tue, 15 Nov 2016 19:00:39 GMT + +B=957172C7AF8EFA66326A7639D1C5301B;license=tDlsT2zdeFKZMZiOBv+pb9dSbyRclLkZJP4rw4Fv9tJYfqwbmE5kpDvHogWrC/yqMwlZG5tx+21PMV4zZDaYytZCZsfcJfLxHVFjU8MkfAOTtaPlUALmBvK/+jg4tGfE/LMoUGGle1huxAEM5UylS5zUA4yKa7V4XUgfFGde1ug9X3QzbnFH5oLMdmX7KyK3Z2HZ640kW/iGvPAz5lgZwvEx4I62aR7V0k/RbYMQfrC6jWHWVAz/yxNOOKSpMHK8tGNnGYoL9baiOh24jvoZ3lAvlLmPO/W8VmCZXRcmkTKuAvpej1fBFKzsRgfTci05MwqthA4caYxKGZhZdtWXJANzVE5V/2Xo35NG2lhwAEJmQoTP0ao6ygktdt+Eui6Ub4NIIn0WvpaNsQXkdhDnJ6ybpaXFy66KTevuJ7+/7N8E8RNF475EkF3FNuoVzNRTWxFmEk/IlMFVT0GgHh3q2sT8feNSo7usCYMLdnlDl15PDQ6894Weth6B+dbqe2xZk12qa7czTBlYAqjtH7oG2xg0G8N6vqrOHji8BkQ2zGnfqDmLq0OnFwlmUBu1GPyKpmsf+7pyuPEdVv8OI9TaEdqKw13IML6YVSJRHM7Q1hEpjwvbjttgk6XsJMvyVg7LMR3Fm1ZKOuRWbVrH/4j2fY5Nc6yek8y/aladiQnikoZ+CgSmvY58XsYu3Mo6J59X+z6jyUVka1/WhKAdVAHTUN2OZkH4rTYckgDMy3REXCU=;hmac=l0kBybteRX6bdSGjD/w0LV86MVU= +``` + +breaking down the XML response: + +```xml + + + + B=957172C7AF8EFA66326A7639D1C5301B; + license=tDlsT2zdeFKZMZiOBv+pb9dSbyRclLkZJP4rw4Fv9tJYfqwbmE5kpDvHogWrC/yqMwlZG5tx+21PMV4zZDaYytZCZsfcJfLxHVFjU8MkfAOTtaPlUALmBvK/+jg4tGfE/LMoUGGle1huxAEM5UylS5zUA4yKa7V4XUgfFGde1ug9X3QzbnFH5oLMdmX7KyK3Z2HZ640kW/iGvPAz5lgZwvEx4I62aR7V0k/RbYMQfrC6jWHWVAz/yxNOOKSpMHK8tGNnGYoL9baiOh24jvoZ3lAvlLmPO/W8VmCZXRcmkTKuAvpej1fBFKzsRgfTci05MwqthA4caYxKGZhZdtWXJANzVE5V/2Xo35NG2lhwAEJmQoTP0ao6ygktdt+Eui6Ub4NIIn0WvpaNsQXkdhDnJ6ybpaXFy66KTevuJ7+/7N8E8RNF475EkF3FNuoVzNRTWxFmEk/IlMFVT0GgHh3q2sT8feNSo7usCYMLdnlDl15PDQ6894Weth6B+dbqe2xZk12qa7czTBlYAqjtH7oG2xg0G8N6vqrOHji8BkQ2zGnfqDmLq0OnFwlmUBu1GPyKpmsf+7pyuPEdVv8OI9TaEdqKw13IML6YVSJRHM7Q1hEpjwvbjttgk6XsJMvyVg7LMR3Fm1ZKOuRWbVrH/4j2fY5Nc6yek8y/aladiQnikoZ+CgSmvY58XsYu3Mo6J59X+z6jyUVka1/WhKAdVAHTUN2OZkH4rTYckgDMy3REXCU=; + hmac=l0kBybteRX6bdSGjD/w0LV86MVU= + + +``` + +both `license` and `hmac` values are obviously hashes, but have been unable to determine what kind + # impersonating most (all?) of this data is based on `impersonate-lge.rb` interactions @@ -301,6 +367,7 @@ the traffic after the user chooses to upgrade: ``` ``` + ## channel guide @@ -324,6 +391,8 @@ key | value `contentId` and `pgmGrId` were changed to make them line up with changes made to `schedule.json` + + ## application update diff --git a/lg_webOS/_public/aic/_source/slimmed/program.json b/lg_webOS/_public/aic/_source/slimmed/program.json index ca32c7b..8ec0a38 100644 --- a/lg_webOS/_public/aic/_source/slimmed/program.json +++ b/lg_webOS/_public/aic/_source/slimmed/program.json @@ -1,44 +1 @@ -{ - "updateType": "full", - "contentSetId": "com.lge.crawler.xml.tms.TmsEpgCrawler", - "pgmCount": "1", - "programList": [ - { - "dbAction": "I", - "contentId": "EP022959710001", - "seqNo": "0", - "pgmGrId": "SH022959710000", - "connectorId": "1010999", - "serId": "184168", - "serNo": "", - "seasonId": "7894663", - "seasonNo": "2", - "pgmType": "Series", - "realEpsdNo": "13", - "summary": "h4ck the planet", - "pgmImgUrlName": "http://aic-gfts.lge.com/aic/hacktheplanet.jpg", - "orgGenreType": "", - "orgGenreCode": "5", - "oGenreCode": "2", - "oGenreType": "", - "subGenreType": "", - "subGenreCode": "", - "makeCom": "", - "makeCntry": "", - "makeYear": "1988-02-07", - "usrPplrSt": "", - "pplrSt": "", - "audLang": "en", - "dataLang": "ENG", - "audQlty": "", - "genreImgUrl": "http://aic-gfts.lge.com/aic/hacktheplanet.jpg", - "vodFlag": "N", - "pgmImgSize": "V480X720", - "genreImgSize": "V480X704", - "lgGenreCode2": "14", - "lgGenreName2": "Crime", - "programLock": "", - "castingFlag": "Y" - }, - ] -} \ No newline at end of file +{"updateType":"full","contentSetId":"com.lge.crawler.xml.tms.TmsEpgCrawler","pgmCount":"1","programList":[{"dbAction":"I","contentId":"EP022959710800","seqNo":"0","pgmGrId":"SH022959710800","connectorId":"1010999","serId":"184168","serNo":"","seasonId":"7894663","seasonNo":"2","pgmType":"Series","realEpsdNo":"13","summary":"h4ck the planet","pgmImgUrlName":"http://aic-gfts.lge.com/aic/hacktheplanet.jpg","orgGenreType":"","orgGenreCode":"5","oGenreCode":"2","oGenreType":"","subGenreType":"","subGenreCode":"","makeCom":"","makeCntry":"","makeYear":"1988-02-07","usrPplrSt":"","pplrSt":"","audLang":"en","dataLang":"ENG","audQlty":"","genreImgUrl":"http://aic-gfts.lge.com/aic/hacktheplanet.jpg","vodFlag":"N","pgmImgSize":"V480X720","genreImgSize":"V480X720","lgGenreCode2":"14","lgGenreName2":"Crime","programLock":"","castingFlag":"Y"}]} diff --git a/lg_webOS/_public/aic/_source/slimmed/schedule.json b/lg_webOS/_public/aic/_source/slimmed/schedule.json index 8614b6f..f884bb1 100644 --- a/lg_webOS/_public/aic/_source/slimmed/schedule.json +++ b/lg_webOS/_public/aic/_source/slimmed/schedule.json @@ -1,35 +1 @@ -{ - "updateType": "full", - "schCount": "1", - "scheduleList": [ - { - "dbAction": "I", - "schdId": "100006/EP022959710001/2016-11-11-05:00", - "contentId": "EP022959710001", - "seqNo": "0", - "chanCode": "100006", - "strtTime": "2016,11,11,05,00,00", - "strtTimeLong": 1478840400, - "endTime": "2016,11,11,08,00,00", - "endTimeLong": 1478851200, - "schdSummary": "h4ck the planet", - "timeType": "", - "schdPgmTtl": "h4ck the planet", - "schdSubTtl": "h4ck the planet", - "rebrdcstFlag": "Y", - "capFlag": "", - "liveFlag": "", - "dataBrdcstFlag": "", - "scExplnBrdcstFlag": "", - "scQualityGbn": "", - "signBrdcstFlag": "", - "voiceMultiBrdcstCount": "", - "threeDFlag": "", - "schdAdultClassCode": "-1", - "schdAgeGrdCode": "TVG", - "pgmGrId": "SH022959710000", - "genreCode": "61", - "realEpsdNo": "0" - }, - ] -} \ No newline at end of file +{"updateType":"full","schCount":"1","scheduleList":[{"dbAction":"I","schdId":"100006/EP022959710800/2016-12-23-05:00","contentId":"EP022959710800","seqNo":"0","chanCode":"100006","strtTime":"2016,12,23,Dec,00,00","strtTimeLong":1482512889,"endTime":"2016,12,23,Dec,00,00","endTimeLong":1482514689,"schdSummary":"h4ck the planet","timeType":"","schdPgmTtl":"h4ck the planet","schdSubTtl":"h4ck the planet","rebrdcstFlag":"Y","capFlag":"","liveFlag":"","dataBrdcstFlag":"","scExplnBrdcstFlag":"","scQualityGbn":"","signBrdcstFlag":"","voiceMultiBrdcstCount":"","threeDFlag":"","schdAdultClassCode":"-1","schdAgeGrdCode":"TVG","pgmGrId":"SH022959710800","genreCode":"61","realEpsdNo":"0"}]} diff --git a/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100-a.png b/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100-a.png new file mode 100644 index 0000000..b453bc7 Binary files /dev/null and b/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100-a.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100.png b/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100.png index 035afd6..8b62f74 100644 Binary files a/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100.png and b/lg_webOS/_public/ngfts/_source/_faked/11066_201412040000_h177x100.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100-a.png b/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100-a.png new file mode 100644 index 0000000..a9b9c0e Binary files /dev/null and b/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100-a.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100.png b/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100.png index 035afd6..053a4e2 100644 Binary files a/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100.png and b/lg_webOS/_public/ngfts/_source/_faked/16715_201412040000_v94x100.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/201412040000_10.json b/lg_webOS/_public/ngfts/_source/_faked/201412040000_10.json index 74e27eb..ee425dd 100644 --- a/lg_webOS/_public/ngfts/_source/_faked/201412040000_10.json +++ b/lg_webOS/_public/ngfts/_source/_faked/201412040000_10.json @@ -1,35 +1,35 @@ { "chan_logo_list": [ { - "chan_logo_file_name": "16715_201412040000_v94x100.png", + "chan_logo_file_name": "16715_201412040000_v94x100-a.png", "logo_bg_color": "#2C2C2C", "major_chan": "1", "chan_logo_size": "V94x100", "code": "16715" }, { - "chan_logo_file_name": "78812_201412040000_h177x100.png", + "chan_logo_file_name": "78812_201412040000_h177x100-a.png", "logo_bg_color": "#2C2C2C", "major_chan": "1", "chan_logo_size": "H177x100", "code": "78812" }, { - "chan_logo_file_name": "35513_201412040000_h169x100.png", + "chan_logo_file_name": "35513_201412040000_h169x100-a.png", "logo_bg_color": "#2C2C2C", "major_chan": "1", "chan_logo_size": "H169x100", "code": "35513" }, { - "chan_logo_file_name": "11066_201412040000_h177x100.png", + "chan_logo_file_name": "11066_201412040000_h177x100-a.png", "logo_bg_color": "#2C2C2C", "major_chan": "1", "chan_logo_size": "H177x100", "code": "11066" }, { - "chan_logo_file_name": "52199_201412040000_v71x100.png", + "chan_logo_file_name": "52199_201412040000_v71x100-a.png", "logo_bg_color": "#2C2C2C", "major_chan": "1", "chan_logo_size": "V71x100", diff --git a/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100-a.png b/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100-a.png new file mode 100644 index 0000000..78fdb33 Binary files /dev/null and b/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100-a.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100.png b/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100.png index 035afd6..67bd2e5 100644 Binary files a/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100.png and b/lg_webOS/_public/ngfts/_source/_faked/35513_201412040000_h169x100.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100-a.png b/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100-a.png new file mode 100644 index 0000000..f71e486 Binary files /dev/null and b/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100-a.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100.png b/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100.png index 035afd6..493f72a 100644 Binary files a/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100.png and b/lg_webOS/_public/ngfts/_source/_faked/52199_201412040000_h71x100.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100-a.png b/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100-a.png new file mode 100644 index 0000000..2c0c819 Binary files /dev/null and b/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100-a.png differ diff --git a/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100.png b/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100.png index 035afd6..4f82359 100644 Binary files a/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100.png and b/lg_webOS/_public/ngfts/_source/_faked/78812_201412040000_h177x100.png differ diff --git a/lg_webOS/_public/ngfts/faked-ngfts.zip b/lg_webOS/_public/ngfts/faked-ngfts.zip index c810f5a..d0d4cfd 100644 Binary files a/lg_webOS/_public/ngfts/faked-ngfts.zip and b/lg_webOS/_public/ngfts/faked-ngfts.zip differ diff --git a/lg_webOS/generate_slimmed-aic-json.rb b/lg_webOS/generate_slimmed-aic-json.rb new file mode 100644 index 0000000..19f4733 --- /dev/null +++ b/lg_webOS/generate_slimmed-aic-json.rb @@ -0,0 +1,136 @@ +#!/usr/bin/env ruby +## generate_slimmed-aic-json.rb -- generates a zip file suitable for faking the tv schedule + +require 'json' + +target_dir = sprintf('%s/_public/aic', File.expand_path(File.dirname(__FILE__))) +source_dir = sprintf('%s/_source/slimmed', target_dir) +target_zip = sprintf('%s/faked-aic.zip', target_dir) + +synchro = Time.now +datestamp = synchro.strftime('%Y-%m-%d-05:00') + +schedule_filename = sprintf('%s/schedule.json', source_dir) + +start_time_commas = synchro.strftime('%Y,%m,%d,%h,00,00') # as close to real as possible, but faking the last bit +start_time_ticks = synchro.to_i + +end_time_ticks = start_time_ticks + (30 * 60) # adding 30 minuted +end_time_commas = Time.at(end_time_ticks).strftime('%Y,%m,%d,%h,00,00') + +uniq_id = sprintf('0229597%s', 10001 + rand(1000)) +content_id = sprintf('EP%s', uniq_id) +program_id = sprintf('SH%s', uniq_id) +channel_code = '100006' + +schedule_id = sprintf('%s/%s/%s', channel_code, content_id, datestamp) # 100006/EP022959710001/2016-11-11-05:00 + +h4ck_text = 'h4ck the planet' + +schedule = { + 'updateType' => 'full', + 'schCount' => '1', + 'scheduleList' => [ + { + 'dbAction' => 'I', + 'schdId' => schedule_id, + 'contentId' => content_id, # this needs to match above and in program.json, but also needs to be unique + 'seqNo' => '0', + 'chanCode' => channel_code, + 'strtTime' => start_time_commas, + 'strtTimeLong' => start_time_ticks, + 'endTime' => end_time_commas, + 'endTimeLong' => end_time_ticks, + 'schdSummary' => h4ck_text, + 'timeType' => '', # this was blank in the source too + 'schdPgmTtl' => h4ck_text, + 'schdSubTtl' => h4ck_text, + 'rebrdcstFlag' => 'Y', + 'capFlag' => '', + 'liveFlag' => '', + 'dataBrdcstFlag' => '', + 'scExplnBrdcstFlag' => '', + 'scQualityGbn' => '', + 'signBrdcstFlag' => '', + 'voiceMultiBrdcstCount' => '', + 'threeDFlag' => '', + 'schdAdultClassCode' => '-1', + 'schdAgeGrdCode' => 'TVG', + 'pgmGrId' => program_id, + 'genreCode' => '61', + 'realEpsdNo' => '0' + }, + ] +} + +puts sprintf('outputting schedule to[%s]', schedule_filename) + +File.open(schedule_filename, 'w') do |f| + f.puts schedule.to_json +end + + +## now build program.json + +connector_id = '1010999' +serial_id = '184168' +season_id = '7894663' + +aic_h4ck_image = 'http://aic-gfts.lge.com/aic/hacktheplanet.jpg' + +program_filename = sprintf('%s/program.json', source_dir) + +program = { + 'updateType' => 'full', + 'contentSetId' => 'com.lge.crawler.xml.tms.TmsEpgCrawler', + 'pgmCount' => '1', + 'programList' => [ + { + 'dbAction' => 'I', + 'contentId' => content_id, + 'seqNo' => '0', + 'pgmGrId' => program_id, + 'connectorId' => connector_id, + 'serId' => serial_id, + 'serNo' => '', + 'seasonId' => season_id, + 'seasonNo' => '2', + 'pgmType' => 'Series', + 'realEpsdNo' => '13', + 'summary' => h4ck_text, + 'pgmImgUrlName' => aic_h4ck_image, + 'orgGenreType' => '', + 'orgGenreCode' => '5', + 'oGenreCode' => '2', + 'oGenreType' => '', + 'subGenreType' => '', + 'subGenreCode' => '', + 'makeCom' => '', + 'makeCntry' => '', + 'makeYear' => '1988-02-07', + 'usrPplrSt' => '', + 'pplrSt' => '', + 'audLang' => 'en', + 'dataLang' => 'ENG', + 'audQlty' => '', + 'genreImgUrl' => aic_h4ck_image, + 'vodFlag' => 'N', + 'pgmImgSize' => 'V480X720', + 'genreImgSize' => 'V480X720', + 'lgGenreCode2' => '14', + 'lgGenreName2' => 'Crime', + 'programLock' => '', + 'castingFlag' => 'Y' + }, + ] +} + + +puts sprintf('outputting program to[%s]', program_filename) + +File.open(program_filename, 'w') do |f| + f.puts program.to_json +end + +puts sprintf('creating[%s]', target_zip) +`cd #{source_dir}; zip #{target_zip} #{File.basename(program_filename)} #{File.basename(schedule_filename)}; ls -l #{target_zip}`