Advertisement
alexdunlop81

ABC login

Apr 3rd, 2014
507
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 22.05 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import _addoncompat
  4. import _common
  5. import _connection
  6. import _m3u8
  7. import os
  8. import re
  9. import simplejson
  10. import sys
  11. import time
  12. import mechanize
  13. import cookielib
  14. import urllib
  15. from PIL import Image
  16. import xbmc
  17. import xbmcgui
  18. import xbmcplugin
  19. from bs4 import BeautifulSoup, SoupStrainer
  20.  
  21. pluginHandle = int(sys.argv[1])
  22.  
  23. ACTION_PREVIOUS_MENU = 10
  24. SHOWS = 'http://api.watchabc.go.com/vp2/ws/s/contents/2015/shows/jsonp/%s/001/-1'
  25. VIDEOLIST = 'http://api.watchabc.go.com/vp2/ws/s/contents/2015/videos/jsonp/%s/'
  26. VIDEOURL = 'http://api.watchabc.go.com/vp2/ws/s/contents/2015/videos/jsonp/%s'
  27. PLAYLISTMOV = 'http://www.kaltura.com/p/%s/sp/%s00/playManifest/format/rtmp/entryId/'
  28. PLAYLISTMP4 = 'http://www.kaltura.com/p/%s/sp/%s00/playManifest/format/applehttp/entryId/'
  29. CLOSEDCAPTIONHOST = 'http://cdn.video.abc.com'
  30. GETAUTHORIZATION = 'http://api.watchabc.go.com/vp2/ws-secure/entitlement/2015/authorize/json'
  31. SWFURL = 'http://livepassdl.conviva.com/ver/2.61.0.65970/LivePassModuleMain.swf'
  32. BITRATETABLE = {    60 : 'a',
  33.                     110 : 'b',
  34.                     190 : 'c',
  35.                     360 : 'd',
  36.                     590 : 'e',
  37.                     1010 : 'f',
  38.                     2100 : 'g' }
  39.  
  40. class MyClass(xbmcgui.WindowDialog):
  41.     def __init__(self):
  42.         self.addControl(xbmcgui.ControlImage(0,0,800,600, 'https://login.comcast.net/proxy/captcha/data/?type=GIF&lang=eng&index=0&token=2.4132.107322.1395844078.2.P8SSmxmMdp0gmIUrRdTLkg,,.11t4hEplRErAmS0Iq_jkpS_5T44f1deWNXpc3FYj07bBovV8hZ9_s1o9RyiLLXTDv0mYVNilBXZyQOpUfS5vuYhMesVAkraKaYmWN0kGqf0vfE3Uzx3jLnpxA01J6ugAkvaocwRULGnJ4inlckxVlzjzWW-gdF4SkUByRYIS_2cbtDRblfXdPNI4qg7qssmdNwWiZYxvDmro9ylIUHIAztB3FpTwhmfDXRaVf0OEt2krFXPTU2r8AsEDAC8h8VtaRfV7w0aQEYzL0tEdHGCcif2Xnfilkk-0IIwWDJnPit7SMLZFppchq0WYRdxqpmlr_2nJn5gIVaWvoi7uQ_TTfPCPmNFpCBC2jotl2HtRJsQDMWaKjU5D-UmPxGn05ywNqmj-nzRf6THsKmQGB_CAFlCq02DMyb1KMkqIudpn0tD4zaMOp5wUoR_6RxMBz8mJWh4Az_Rw28uBYxNy8codKkyDPpnIugxhBlns-f3J438,.WTJIa3ZsVmNXT1BtQm85Q21pMG1peDNyOXkwc1dRbG5MQkFqTHg5OWdmcSs1M0d6UVJES1FIOGt4elBtRUpSaFZxQVZXZzdRcUhXLzYzWE1WMUEvRFdST3pvVXJzN2lvdU4wYlRTZjhwR3pCaGhXV2F1TjVrQkRCSVJwdGh5bHRBWDZFMi9MNndNWWFjZkRvcXhQNTV5aE5hTURoOUJ3ZnB2MzNLQThYaEZ3PQ,,'))
  43.         self.strActionInfo = xbmcgui.ControlLabel(100, 120, 200, 200, '', 'font13', '0xFFFF00FF')
  44.         self.addControl(self.strActionInfo)
  45.         self.strActionInfo.setLabel('Push BACK to quit')
  46.         self.strActionInfo = xbmcgui.ControlLabel(100, 300, 200, 200, '', 'font13', '0xFFFFFFFF')
  47.         self.addControl(self.strActionInfo)
  48.         #keyboard = xbmc.Keyboard('mytext')
  49.         #keyboard.doModal()
  50.         #if (keyboard.isConfirmed()):
  51.         #   self.strActionInfo.setLabel(keyboard.getText())
  52.         #else:
  53.         #   self.strActionInfo.setLabel('user canceled')
  54.  
  55.     def onAction(self, action):
  56.         if action == ACTION_PREVIOUS_MENU:
  57.             self.close()
  58.  
  59. ACTION_MOVE_LEFT                            = 1
  60. ACTION_MOVE_RIGHT                           = 2
  61. ACTION_MOVE_UP                              = 3
  62. ACTION_MOVE_DOWN                            = 4
  63. ACTION_PAGE_UP                              = 5
  64. ACTION_PAGE_DOWN                            = 6
  65. ACTION_SELECT_ITEM                      = 7
  66. ACTION_HIGHLIGHT_ITEM                   = 8
  67. ACTION_PARENT_DIR                           = 9
  68. ACTION_PREVIOUS_MENU                    = 10
  69. ACTION_SHOW_INFO                            = 11
  70.  
  71. ACTION_PAUSE                                    = 12
  72. ACTION_STOP                                     = 13
  73. ACTION_NEXT_ITEM                            = 14
  74. ACTION_PREV_ITEM                            = 15
  75.  
  76. # NewDialog class with xbmcgui.WindowDialog as it's base class
  77. # note xbmcgui.WindowDialog has xbmcgui.Window as it's baseclass so we can use this
  78. # dialog the same as a window
  79.  
  80. class NewDialog(xbmcgui.WindowDialog):
  81.     def __init__(self):
  82.        
  83.         # create result variable and add some images + buttons to our dialog
  84.         self.result = 0
  85.         self.addControl(xbmcgui.ControlImage(0,0,406,140, os.path.join(_common.CACHEPATH,'captcha.png')))
  86.         #self.edtE = xbmcgui.ControlEdit(700, 210, 150, 40,'')
  87.         #self.addControl(self.edtE)
  88.         self.buttonOK = xbmcgui.ControlButton(290, 330, 80, 32, 'OK')
  89.         self.buttonCancel = xbmcgui.ControlButton(380, 330, 80, 32, 'Cancel')
  90.        
  91.         self.addControl(self.buttonOK)
  92.         self.addControl(self.buttonCancel)
  93.        
  94.         # setting up navigation and focus
  95.         self.setFocus(self.buttonOK)
  96.         self.buttonOK.controlRight(self.buttonCancel)
  97.         self.buttonOK.controlLeft(self.buttonCancel)
  98.         self.buttonCancel.controlRight(self.buttonOK)
  99.         self.buttonCancel.controlLeft(self.buttonOK)
  100.        
  101.         # labels
  102.         self.lblHeading = xbmcgui.ControlLabel(190, 226, 200, 20, '')
  103.        
  104.         self.lblLine = []
  105.         self.lblLine.append(xbmcgui.ControlLabel(190, 260, 200, 20, ''))
  106.         self.lblLine.append(xbmcgui.ControlLabel(190, 280, 200, 20, ''))
  107.         self.lblLine.append(xbmcgui.ControlLabel(190, 300, 200, 20, ''))
  108.         self.addControl(self.lblHeading)
  109.         self.addControl(self.lblLine[0])
  110.         self.addControl(self.lblLine[1])
  111.         self.addControl(self.lblLine[2])
  112.        
  113.        
  114.     def setHeading(self, text):
  115.         self.lblHeading.setLabel(text)
  116.  
  117.     def setLine(self, line, text):
  118.         self.lblLine[line].setLabel(text)
  119.  
  120.     def onAction(self, action):
  121.         if action == ACTION_PREVIOUS_MENU:
  122.             # previous menu action recieved, set result to 0 (cancel / aborted) and close the window
  123.             self.result = 0
  124.             self.close()
  125.    
  126.     def onControl(self, control):
  127.         if control == self.buttonOK:
  128.             # ok butten pressed, set result to 1 and close the dialog
  129.             self.result = 1
  130.             self.close()
  131.         elif control == self.buttonCancel:
  132.             # ok butten pressed, set result to 0 and close the dialog
  133.             self.result = 0
  134.             self.close()
  135.  
  136.     def ask(self):
  137.         # show this dialog and wait until it's closed
  138.        
  139.         self.show()
  140.        
  141.         keyboard = xbmc.Keyboard()
  142.         keyboard.doModal()
  143.         if (keyboard.isConfirmed()):
  144.             return keyboard.getText()
  145.         else:
  146.             return None
  147.         #return self.result
  148.        
  149. def masterlist(SITE, BRANDID):
  150.     master_db = []
  151.     master_data = _connection.getURL(SHOWS % BRANDID)
  152.     master_menu = simplejson.loads(master_data)['shows']['show']
  153.     for master_item in master_menu:
  154.         fullepisodes = 0
  155.         clips = 0
  156.         if (int(master_item['clips']['count']['@total']) + int(master_item['fullepisodes']['count']['@total'])) > 0:
  157.             if int(master_item['clips']['count']['@total']) > 0:
  158.                 try:
  159.                     if int(master_item['clips']['count']['video']['@accesslevel']) == 0:
  160.                         clips = int(master_item['clips']['count']['video']['$'])   
  161.                 except:
  162.                     if int(master_item['clips']['count']['video'][0]['@accesslevel']) == 0:
  163.                         clips = int(master_item['clips']['count']['video'][0]['$'])
  164.             if int(master_item['fullepisodes']['count']['@total']) > 0:
  165.                 try:
  166.                     if int(master_item['fullepisodes']['count']['video']['@accesslevel']) == 0:
  167.                         fullepisodes = int(master_item['fullepisodes']['count']['video']['$'])
  168.                 except:
  169.                     if int(master_item['fullepisodes']['count']['video'][0]['@accesslevel']) == 0:
  170.                         fullepisodes = int(master_item['fullepisodes']['count']['video'][0]['$'])
  171.             if (fullepisodes + clips) > 0:
  172.                 master_name = master_item['title']
  173.                 season_url = master_item['@id']
  174.                 master_db.append((master_name, SITE, 'seasons', season_url))
  175.     print master_db
  176.     return master_db
  177.  
  178. def rootlist(SITE, BRANDID):
  179.     root_data = _connection.getURL(SHOWS % BRANDID)
  180.     root_menu = simplejson.loads(root_data)['shows']['show']
  181.     for root_item in root_menu:
  182.         fullepisodes = 0
  183.         clips = 0
  184.         if (int(root_item['clips']['count']['@total']) + int(root_item['fullepisodes']['count']['@total'])) > 0:
  185.             if int(root_item['clips']['count']['@total']) > 0:
  186.                 try:
  187.                     if int(root_item['clips']['count']['video']['@accesslevel']) == 0:
  188.                         clips = int(root_item['clips']['count']['video']['$']) 
  189.                 except:
  190.                     if int(root_item['clips']['count']['video'][0]['@accesslevel']) == 0:
  191.                         clips = int(root_item['clips']['count']['video'][0]['$'])
  192.             if int(root_item['fullepisodes']['count']['@total']) > 0:
  193.                 try:
  194.                     if int(root_item['fullepisodes']['count']['video']['@accesslevel']) == 0:
  195.                         fullepisodes = int(root_item['fullepisodes']['count']['video']['$'])
  196.                 except:
  197.                     if int(root_item['fullepisodes']['count']['video'][0]['@accesslevel']) == 0:
  198.                         fullepisodes = int(root_item['fullepisodes']['count']['video'][0]['$'])
  199.             if (fullepisodes + clips) > 0:
  200.                 root_name = root_item['title']
  201.                 season_url = root_item['@id']
  202.                 _common.add_show(root_name, SITE, 'seasons', season_url)
  203.     _common.set_view('tvshows')
  204.  
  205. def seasons(SITE, BRANDID):
  206.     xbmcplugin.addSortMethod(pluginHandle, xbmcplugin.SORT_METHOD_LABEL)
  207.     season_url = _common.args.url
  208.     season_menu = []
  209.     season_numbers = []
  210.     clip_numbers = []
  211.     season_url2 = VIDEOLIST % BRANDID + '001/-1/' + season_url + '/-1/-1/-1/-1'
  212.     season_data = _connection.getURL(season_url2)
  213.     season_data2 = simplejson.loads(season_data)['videos']
  214.     season_count = int(season_data2['@count'])
  215.     if season_count > 1:
  216.         season_menu = season_data2['video']
  217.     elif season_count == 1:
  218.         season_menu.append(dict(season_data2['video']))
  219.     for season_item in season_menu:
  220.         if int(season_item['@accesslevel']) == 0:
  221.             if season_item['@type'] == 'lf':
  222.                 try:
  223.                     if season_item['season']['@id'] not in season_numbers:
  224.                         season_numbers.append(season_item['season']['@id'])
  225.                         season_name = 'Season ' + season_item['season']['@id']
  226.                         season_url3 = VIDEOLIST % BRANDID + '001/' + season_item['@type'] + '/' + season_url + '/' + season_item['season']['@id'] + '/-1/-1/-1'
  227.                         _common.add_directory(season_name, SITE, 'episodes', season_url3)
  228.                 except:
  229.                     pass
  230.             elif season_item['@type'] == 'sf':
  231.                 try:
  232.                     if season_item['season']['@id'] not in clip_numbers:
  233.                         clip_numbers.append(season_item['season']['@id'])
  234.                         season_name = 'Season Clips ' + season_item['season']['@id']
  235.                         season_url4 = VIDEOLIST % BRANDID + '001/' + season_item['@type'] + '/' + season_url + '/' + season_item['season']['@id'] + '/-1/-1/-1'
  236.                         _common.add_directory(season_name, SITE, 'episodes', season_url4)
  237.                 except:
  238.                     pass
  239.     _common.set_view('seasons')
  240.  
  241. def episodes(SITE):
  242.    
  243.     cj = cookielib.LWPCookieJar()
  244.     br = mechanize.Browser()  
  245.     br.set_handle_robots(False)
  246.     br.set_cookiejar(cj)
  247.     br.addheaders = [('User-agent', 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A405')]
  248.     #br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0')]
  249.     #'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0'
  250.     #http://api.watchabc.go.com/vp2/ws/s/presentation/2018/distributors/jsonp/001/001/-1?callback=datg.kaltura.mvpdLoad
  251.     loginURL = "https://sp.auth.adobe.com/adobe-services/authenticate?domain%5Fname=kaltura%2Ecom&mso%5Fid=Comcast%5FSSO&redirect%5Furl=http%3A%2F%2Fabc%2Ego%2Ecom%2Fshows%2Fonce%2Dupon%2Da%2Dtime%2Fepisode%2Dguide%2Fseason%2D03%2F314%2Dthe%2Dtower&requestor%5Fid=ABC"
  252.                 #https://sp.auth.adobe.com/adobe-services/1.0/authenticate/saml?domain_name=adobe.com&noflash=true&no_iframe=true&mso_id=Comcast_SSO&requestor_id=AdultSwim&redirect_url=adobepass%3A%2F%2Fandroid.app&client_type=android&client_version=1.7
  253.  
  254.     #data = _connection.getURL(loginURL)
  255.     response  = br.open(loginURL)
  256.    
  257.     #data = response.read()
  258. #   print data
  259.     #loginTree = BeautifulSoup(data)
  260.    
  261.     #comcast= loginTree.meta['content'].split('url=')[1]
  262.     #cl = _connection.getRedirect(comcast)
  263.     #sign_in = br.open(cl)
  264.     #br.select_form(nr=0)
  265.     #response = br.submit()
  266.     #print response.read()
  267.     cathpa= "https://login.comcast.net/proxy/captcha/data/?type=GIF&lang=eng&index=0&token=" + re.compile('"token":"(.*?)"').findall(response.read())[0]
  268.     cathpa_data = _connection.getURL(cathpa)
  269.     file = open(os.path.join(_common.CACHEPATH,'captcha.gif'), 'wb')
  270.     file.write(cathpa_data)
  271.     file.close()
  272.     print cathpa
  273.     im = Image.open(os.path.join(_common.CACHEPATH,'captcha.gif'))
  274.     nx, ny = im.size
  275.     im2 = im.resize((int(nx*5), int(ny*5)), Image.BICUBIC)
  276.     im2.save(os.path.join(_common.CACHEPATH,'captcha.png'))
  277.    
  278.     dialog = NewDialog()
  279.     dialog.setHeading('Python OK / Cancel Dialog')
  280.     #dialog.setLine(0, 'line 0')
  281.     #dialog.setLine(1, 'line 1')
  282.     #dialog.setLine(2, 'line 2')
  283.     #dialog.edtE.setText("Here's some text")
  284.  
  285.    
  286.     answer = dialog.ask()
  287.     print answer
  288.     #responseTree = BeautifulSoup(response.read())
  289.     #print responseTree.find('img', id='nucaptcha-media')
  290.     #print responseTree
  291.     #br.select_form("signin")
  292.     br.form = list(br.forms())[0]
  293.     #print br.form
  294.     #print br["nucaptcha-media"]
  295.     br["user"] = 'xxx'
  296.     br["passwd"] = 'xxx'
  297.     br["nucaptcha-answer"] = answer
  298.     response = br.submit()
  299.     print br.geturl()
  300.     print response.read()
  301.     br.form = list(br.forms())[0]
  302.     response = br.submit()
  303.     print br.geturl()
  304.     print response.read()
  305.     #br.open('http://xfinity.comcast.net/')
  306.     #print "Loading homepage"
  307.     #br.select_form(nr=0)
  308.     #response = br.submit()
  309.     #print response.read()
  310.     #br.select_form(nr=0)
  311.     #response = br.submit()
  312.     #print response.read()
  313.     #Comcast%5FSSO=id
  314.     #ABC=site
  315.     #https://login.comcast.net/login?r=comcast.net&s=sso-pf&continue=%2Fidp%2FVyIIU%2FresumeSAML20%2Fidp%2FSSO.ping%3Fresponse%3D1%26ref_url%3Dhttps%253A%252F%252Fsp.auth.adobe.com%252Fadobe-services%252Fauthenticate%253Fmso%25255Fid%253DComcast%25255FSSO%2526requestor%25255Fid%253DABC%2526domain%25255Fname%253Dkaltura%25252Ecom%2526redirect%25255Furl%253Dhttp%25253A%25252F%25252Fabc%25252Ego%25252Ecom%25252Fshows%25252Fonce%25252Dupon%25252Da%25252Dtime%25252Fepisode%25252Dguide%25252Fseason%25252D03%25252F313%25252Dwitch%25252Dhunt&pf_sp=https%3A%2F%2Fsaml.sp.auth.adobe.com%2Fon-behalf-of%2FABC&passive=0&forceAuthn=0
  316.          
  317.     auth_time = time.time()
  318.     #parameters = { 'user' : 'lucxxxxs',
  319.     #               'passwd' : 'xxxx',
  320.     #               'passive' : 'true',
  321.     #               'forceAuthn' : 'tue',
  322.     #               #'video_type' : video_type
  323.     #               }
  324.     #auth_data = _connection.getURL("https://login.comcast.net/login", parameters)
  325.     #print auth_data
  326.     #dialog = NewDialog()
  327.     #dialog.setHeading('Python OK / Cancel Dialog')
  328.     #dialog.setLine(0, 'line 0')
  329.     #dialog.setLine(1, 'line 1')
  330.     #dialog.setLine(2, 'line 2')
  331.     #dialog.edtE.setText("Here's some text")
  332.  
  333.    
  334.     #print(dialog.ask())
  335.     episode_menu = []
  336.     episode_data = _connection.getURL(_common.args.url)
  337.     episode_data2 = simplejson.loads(episode_data)['videos']
  338.     episode_count = int(episode_data2['@count'])
  339.     if episode_count > 1:
  340.         episode_menu = episode_data2['video']
  341.     elif episode_count == 1:
  342.         episode_menu.append(dict(episode_data2['video']))
  343.     for episode_item in episode_menu:
  344.         if int(episode_item['@accesslevel']) == 0:
  345.             highest_height = -1
  346.             episode_name = episode_item['title']
  347.             episode_duration = int(episode_item['duration']['$']) / 1000
  348.             season_number = episode_item['season']['@id']
  349.             episode_id = episode_item['@id']
  350.             episode_type = episode_item['@type']
  351.             try:
  352.                 episode_description = _common.replace_signs(episode_item['longdescription'])
  353.             except:
  354.                 episode_description = _common.replace_signs(episode_item['description'])
  355.             try:
  356.                 episode_airdate = episode_item['airdates']['airdate'].rsplit(' ',1)[0]
  357.                 episode_airdate = _common.format_date(episode_airdate,'%a, %d %b %Y %H:%M:%S', '%d.%m.%Y')
  358.             except:
  359.                 try:
  360.                     episode_airdate = episode_item['airdates']['airdate'][0].rsplit(' ',1)[0]
  361.                     episode_airdate = _common.format_date(episode_airdate,'%a, %d %b %Y %H:%M:%S', '%d.%m.%Y')
  362.                 except:
  363.                     episode_airdate = -1
  364.             try:
  365.                 episode_number = episode_item['number']
  366.             except:
  367.                 episode_number = -1
  368.             try:
  369.                 for episode_picture in episode_item['thumbnails']['thumbnail']:
  370.                     try:
  371.                         picture_height = int(episode_picture['@width'])
  372.                     except:
  373.                         if episode_picture['@type'] == 'source-16x9':
  374.                             picture_height = 720
  375.                         else:
  376.                             picture_height = 0
  377.                     if picture_height > highest_height:
  378.                         highest_height = picture_height
  379.                         episode_thumb = episode_picture['$']
  380.             except:
  381.                 episode_thumb = episode_item['thumbnails']['thumbnail']['$']
  382.             u = sys.argv[0]
  383.             u += '?url="' + urllib.quote_plus(episode_id) + '#' + urllib.quote_plus(episode_type) + '"'
  384.             u += '&mode="' + SITE + '"'
  385.             u += '&sitemode="play_video"'
  386.             infoLabels={'title' : episode_name,
  387.                         'plot' : episode_description,
  388.                         'premiered' : episode_airdate,
  389.                         'durationinseconds' : episode_duration,
  390.                         'episode' : episode_number,
  391.                         'season' : season_number }
  392.             _common.add_video(u, episode_name, episode_thumb, infoLabels = infoLabels)
  393.     _common.set_view('episodes')
  394.  
  395. def play_video(SITE, BRANDID, PARTNERID):
  396.     video_id, video_type = _common.args.url.split('#')
  397.     hbitrate = -1
  398.     lbitrate = -1
  399.     sbitrate = int(_addoncompat.get_setting('quality'))
  400.     localhttpserver = False
  401.     video_auth = get_authorization(BRANDID, video_id, video_type)
  402.     if video_auth is False:
  403.         video_url = VIDEOLIST % BRANDID + '001/-1/-1/-1/' + video_id + '/-1/-1'
  404.         video_data = _connection.getURL(video_url)
  405.         try:
  406.             video_data2 = simplejson.loads(video_data)['videos']['video']
  407.             video_format = video_data2['assets']['asset'][0]['@format']
  408.             video_closedcaption = video_data2['closedcaption']['@enabled']
  409.         except:
  410.             try:
  411.                 video_data2 = simplejson.loads(video_data)['videos']['video']
  412.                 video_format = video_data2['assets']['asset']['@format']
  413.                 video_closedcaption = video_data2['closedcaption']['@enabled']
  414.             except:
  415.                 video_format = 'MOV'
  416.                 video_closedcaption = 'false'
  417.         video_id = video_id.replace('VDKA','')
  418.         if video_format == 'MP4':
  419.             video_url = PLAYLISTMP4 % (PARTNERID, PARTNERID) + video_id
  420.             video_data = _connection.getURL(video_url)
  421.             video_url2 = _m3u8.parse(video_data)
  422.             for video_index in video_url2.get('playlists'):
  423.                 bitrate = int(video_index.get('stream_info')['bandwidth'])
  424.                 if bitrate > hbitrate and bitrate <= (sbitrate * 1000):
  425.                     hbitrate = bitrate
  426.                     playpath_url = video_index.get('uri')
  427.             finalurl = playpath_url
  428.         elif  video_format == 'MOV':
  429.             playpath_url = None
  430.             video_url = PLAYLISTMOV % (PARTNERID, PARTNERID) + video_id
  431.             video_data = _connection.getURL(video_url)
  432.             video_tree = BeautifulSoup(video_data)
  433.             base_url = video_tree('baseurl')[0].string
  434.             video_url2 = video_tree.findAll('media')
  435.             for video_index in video_url2:
  436.                 bitrate = int(video_index['bitrate'])
  437.                 if bitrate < lbitrate or lbitrate == -1:
  438.                     lbitrate = bitrate
  439.                     lplaypath_url = video_index['url'] 
  440.                 if bitrate > hbitrate and bitrate <= sbitrate:
  441.                     hbitrate = bitrate
  442.                     playpath_url = video_index['url']
  443.             if playpath_url is None:
  444.                 playpath_url = lplaypath_url
  445.             finalurl = base_url + ' playpath=' + playpath_url + ' swfUrl=' + SWFURL + ' swfVfy=true'
  446.     else:
  447.         video_url = VIDEOLIST % BRANDID + '002/-1/-1/-1/' + video_id + '/-1/-1'
  448.         video_data = _connection.getURL(video_url)
  449.         video_data2 = simplejson.loads(video_data)['videos']['video']
  450.         video_closedcaption = video_data2['closedcaption']['@enabled']
  451.         try:
  452.             video_url2 = video_data2['assets']['asset']['$'] + video_auth
  453.         except:
  454.             video_url2 = video_data2['assets']['asset'][1]['$'] + video_auth
  455.         video_data3 = _connection.getURL(video_url2.replace('m3u8','json'))
  456.         video_url3 = simplejson.loads(video_data3)
  457.         for video_keys in BITRATETABLE.iterkeys():
  458.             bitrate = int(video_keys)
  459.             if bitrate > hbitrate and bitrate <= sbitrate:
  460.                 hbitrate = bitrate
  461.                 video_url4 = video_url3['url'].replace('__ray__', BITRATETABLE[video_keys])
  462.         video_url4 = video_url4.replace('https','http').replace('json','m3u8')
  463.         video_data4 = re.sub(r"\#EXT-X-DISCONTINUITY\n","", _connection.getURL(video_url4))
  464.         key_url = re.compile('URI="(.*?)"').findall(video_data4)[0]
  465.         key_data = _connection.getURL(key_url)     
  466.         key_file = open(_common.KEYFILE, 'wb')
  467.         key_file.write(key_data)
  468.         key_file.close()
  469.         localhttpserver = True
  470.         filestring = 'XBMC.RunScript(' + os.path.join(_common.LIBPATH,'_proxy.py') + ', 12345)'
  471.         xbmc.executebuiltin(filestring)
  472.         time.sleep(20)
  473.         video_data4 = video_data4.replace(key_url, 'http://127.0.0.1:12345/play.key')
  474.         playfile = open(_common.PLAYFILE, 'w')
  475.         playfile.write(video_data4)
  476.         playfile.close()
  477.         finalurl = _common.PLAYFILE
  478.     if (video_closedcaption == 'true') and (_addoncompat.get_setting('enablesubtitles') == 'true'):
  479.         try:
  480.             closedcaption = CLOSEDCAPTIONHOST + video_data2['closedcaption']['src']['$'].split('.com')[1]
  481.             convert_subtitles(closedcaption)
  482.         except:
  483.             video_closedcaption = 'false'
  484.     xbmcplugin.setResolvedUrl(pluginHandle, True, xbmcgui.ListItem(path = finalurl))
  485.     if (_addoncompat.get_setting('enablesubtitles') == 'true') and (video_closedcaption != 'false'):
  486.         while not xbmc.Player().isPlaying():
  487.             xbmc.sleep(100)
  488.         xbmc.Player().setSubtitles(_common.SUBTITLE)
  489.     if localhttpserver is True:
  490.         time.sleep(100)
  491.         try:
  492.             _connection.getURL('http://localhost:12345/stop', connectiontype = 0)
  493.         except:
  494.             pass
  495.  
  496. def clean_subs(data):
  497.     br = re.compile(r'<br.*?>')
  498.     tag = re.compile(r'<.*?>')
  499.     space = re.compile(r'\s\s\s+')
  500.     apos = re.compile(r'&amp;apos;')
  501.     sub = br.sub('\n', str(data))
  502.     sub = tag.sub(' ', sub)
  503.     sub = space.sub(' ', sub)
  504.     sub = apos.sub('\'', sub)
  505.     return sub
  506.  
  507. def convert_subtitles(closedcaption):
  508.     str_output = ''
  509.     subtitle_data = _connection.getURL(closedcaption, connectiontype = 0)
  510.     subtitle_data = BeautifulSoup(subtitle_data, 'html.parser', parse_only = SoupStrainer('div'))
  511.     lines = subtitle_data.find_all('p')
  512.     for i, line in enumerate(lines):
  513.         if line is not None:
  514.             sub = clean_subs(_common.smart_utf8(line))
  515.             start_time_hours, start_time_rest = line['begin'].split(':', 1)
  516.             start_time_hours = '%02d' % (int(start_time_hours) - 1)
  517.             start_time = _common.smart_utf8(start_time_hours + ':' + start_time_rest.replace('.', ','))
  518.             end_time_hours, end_time_rest = line['end'].split(':', 1)
  519.             end_time_hours = '%02d' % (int(end_time_hours) - 1)
  520.             end_time = _common.smart_utf8(end_time_hours + ':' + end_time_rest.replace('.', ','))
  521.             str_output += str(i + 1) + '\n' + start_time + ' --> ' + end_time + '\n' + sub + '\n\n'
  522.     file = open(_common.SUBTITLE, 'w')
  523.     file.write(str_output)
  524.     file.close()
  525.     return True
  526.  
  527. def get_authorization(brandid, video_id, video_type):
  528.     #do login
  529.     #mydisplay = MyClass()
  530.     #mydisplay .doModal()
  531.     #del mydisplay
  532.     auth_time = time.time()
  533.     #crack.decode(os.path.join(_common.CACHEPATH,'download.gif'),_common.CACHEPATH)
  534.    
  535.     parameters = {  'video_id' : video_id,
  536.                     '__rnd' : auth_time,
  537.                     'device' : '001',
  538.                     'brand' : brandid,
  539.                     'video_type' : video_type }
  540.     auth_data = _connection.getURL(GETAUTHORIZATION, parameters)
  541.     try:
  542.         auth_sig = '?' + simplejson.loads(auth_data)['entitlement']['uplynk']['sessionKey']
  543.     except:
  544.         auth_sig = False
  545.     return auth_sig
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement