making generate_slimmed-aic-json a first class citizen, switching to non RGBA pings - losing quality, but might force the tv to read it
@ -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:<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
|
||||
|
||||
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
|
||||
|
||||
@ -324,6 +391,8 @@ key | value
|
||||
|
||||
`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
|
||||
|
||||
|
@ -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"
|
||||
},
|
||||
]
|
||||
}
|
||||
{"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"}]}
|
||||
|
@ -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"
|
||||
},
|
||||
]
|
||||
}
|
||||
{"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"}]}
|
||||
|
After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 22 KiB |
@ -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",
|
||||
|
After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 304 KiB After Width: | Height: | Size: 37 KiB |
136
lg_webOS/generate_slimmed-aic-json.rb
Normal 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}`
|