making generate_slimmed-aic-json a first class citizen, switching to non RGBA pings - losing quality, but might force the tv to read it

This commit is contained in:
Conor Horan-Kates 2016-12-23 09:27:20 -08:00
parent ad1af59c6d
commit 0d5398dfd1
16 changed files with 212 additions and 84 deletions

View File

@ -7,6 +7,7 @@
- [on boot](#on-boot) - [on boot](#on-boot)
- [channel search](#channel-search) - [channel search](#channel-search)
- [application marketplace](#application-marketplace) - [application marketplace](#application-marketplace)
- [license manager](#license-manager)
- [impersonating](#impersonating) - [impersonating](#impersonating)
- [OS update](#os-update) - [OS update](#os-update)
- [channel guide](#channel-guide) - [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 #### application marketplace
bar 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:<redacted>
X-Device-Type:T01
X-Device-Language:en-US
X-Device-Country:US
X-Device-Remote-Flag:N
X-Authentication:<redacted>
mode=issuelicense4pre&sid=1827712162&deviceid=<redacted>>&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
<?xml version='1.0' encoding='utf-8'?><response result='0' message=''><responsedata>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=</responsedata></response>
```
breaking down the XML response:
```xml
<?xml version='1.0' encoding='utf-8'?>
<response result='0' message=''>
<responsedata>
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=
</responsedata>
</response>
```
both `license` and `hmac` values are obviously hashes, but have been unable to determine what kind
# impersonating # impersonating
most (all?) of this data is based on `impersonate-lge.rb` interactions most (all?) of this data is based on `impersonate-lge.rb` interactions
@ -301,6 +367,7 @@ the traffic after the user chooses to upgrade:
``` ```
``` ```
<TODO finish this writeup and hack>
## channel guide ## channel guide
@ -324,6 +391,8 @@ key | value
`contentId` and `pgmGrId` were changed to make them line up with changes made to `schedule.json` `contentId` and `pgmGrId` were changed to make them line up with changes made to `schedule.json`
<TODO show interactions.. finish the writeup and the hack>
## application update ## application update

View File

@ -1,44 +1 @@
{ {"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"}]}
"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"
},
]
}

View File

@ -1,35 +1 @@
{ {"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"}]}
"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"
},
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,35 +1,35 @@
{ {
"chan_logo_list": [ "chan_logo_list": [
{ {
"chan_logo_file_name": "16715_201412040000_v94x100.png", "chan_logo_file_name": "16715_201412040000_v94x100-a.png",
"logo_bg_color": "#2C2C2C", "logo_bg_color": "#2C2C2C",
"major_chan": "1", "major_chan": "1",
"chan_logo_size": "V94x100", "chan_logo_size": "V94x100",
"code": "16715" "code": "16715"
}, },
{ {
"chan_logo_file_name": "78812_201412040000_h177x100.png", "chan_logo_file_name": "78812_201412040000_h177x100-a.png",
"logo_bg_color": "#2C2C2C", "logo_bg_color": "#2C2C2C",
"major_chan": "1", "major_chan": "1",
"chan_logo_size": "H177x100", "chan_logo_size": "H177x100",
"code": "78812" "code": "78812"
}, },
{ {
"chan_logo_file_name": "35513_201412040000_h169x100.png", "chan_logo_file_name": "35513_201412040000_h169x100-a.png",
"logo_bg_color": "#2C2C2C", "logo_bg_color": "#2C2C2C",
"major_chan": "1", "major_chan": "1",
"chan_logo_size": "H169x100", "chan_logo_size": "H169x100",
"code": "35513" "code": "35513"
}, },
{ {
"chan_logo_file_name": "11066_201412040000_h177x100.png", "chan_logo_file_name": "11066_201412040000_h177x100-a.png",
"logo_bg_color": "#2C2C2C", "logo_bg_color": "#2C2C2C",
"major_chan": "1", "major_chan": "1",
"chan_logo_size": "H177x100", "chan_logo_size": "H177x100",
"code": "11066" "code": "11066"
}, },
{ {
"chan_logo_file_name": "52199_201412040000_v71x100.png", "chan_logo_file_name": "52199_201412040000_v71x100-a.png",
"logo_bg_color": "#2C2C2C", "logo_bg_color": "#2C2C2C",
"major_chan": "1", "major_chan": "1",
"chan_logo_size": "V71x100", "chan_logo_size": "V71x100",

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -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}`