alexdunlop81

nbcu

Apr 3rd, 2014
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.92 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 _main_nbcu
  8. import re
  9. import simplejson
  10. import sys
  11. import urllib
  12. import xbmc
  13. import xbmcgui
  14. import xbmcplugin
  15. from bs4 import BeautifulSoup, SoupStrainer
  16.  
  17. pluginHandle = int(sys.argv[1])
  18.  
  19. #SITE = 'syfy'
  20. #SHOWS = 'http://feed.theplatform.com/f/hQNl-B/sgM5DlyXAfwt/categories?form=json&sort=order'
  21. #CLIPS = 'http://feed.theplatform.com/f/hQNl-B/2g1gkJT0urp6?count=true&form=json&byCustomValue={fullEpisode}{false}&byCategories=%s'
  22. #FULLEPISODES = 'http://feed.theplatform.com/f/hQNl-B/2g1gkJT0urp6?count=true&form=json&byCustomValue={fullEpisode}{true}&byCategories=%s'
  23. #SWFURL = 'http://www.syfy.com/_utils/video/codebase/pdk/swf/flvPlayer.swf'
  24.  
  25. def masterlist(SHOWS, SITE):
  26.     master_db = []
  27.     master_data = _connection.getURL(SHOWS)
  28.     master_menu = simplejson.loads(master_data)['entries']
  29.     for master_item in master_menu:
  30.         master_name = master_item['title']
  31.         season_url = master_item['plcategory$fullTitle']
  32.         master_db.append((master_name, SITE, 'seasons', season_url))
  33.     return master_db
  34.  
  35. def rootlist(SHOWS, SITE):
  36.     root_data = _connection.getURL(SHOWS)
  37.     root_menu = simplejson.loads(root_data)['entries']
  38.     for root_item in root_menu:
  39.         root_name = root_item['title']
  40.         season_url = root_item['plcategory$fullTitle']
  41.         _common.add_show(root_name,  SITE, 'seasons', season_url)
  42.     _common.set_view('tvshows')
  43.  
  44. def seasons(FULLEPISODES, CLIPS, SITE):
  45.     season_url = _common.args.url
  46.     season_data = _connection.getURL(FULLEPISODES % urllib.quote_plus(season_url) + '&range=0-1')
  47.     try:
  48.         season_menu = int(simplejson.loads(season_data)['totalResults'])
  49.     except:
  50.         season_menu = 0
  51.     if season_menu > 0:
  52.         season_url2 = FULLEPISODES % urllib.quote_plus(season_url) + '&range=0-' + str(season_menu)
  53.         _common.add_directory('Full Episodes',  SITE, 'episodes', season_url2)
  54.     season_data2 = _connection.getURL(CLIPS % urllib.quote_plus(season_url) + '&range=0-1')
  55.     try:
  56.         season_menu2 = int(simplejson.loads(season_data2)['totalResults'])
  57.     except:
  58.         season_menu2 = 0
  59.     if season_menu2 > 0:
  60.         season_url3 = CLIPS % urllib.quote_plus(season_url) + '&range=0-' + str(season_menu2)
  61.         _common.add_directory('Clips',  SITE, 'episodes', season_url3)
  62.     _common.set_view('seasons')
  63.  
  64. def episodes(SITE):
  65.     episode_url = _common.args.url
  66.     episode_data = _connection.getURL(episode_url)
  67.     episode_menu = simplejson.loads(episode_data)['entries']
  68.     for i, episode_item in enumerate(episode_menu):
  69.         url = episode_item['media$content'][0]['plfile$url']
  70.         episode_duration = int(episode_item['media$content'][0]['plfile$duration'])
  71.         episode_plot = episode_item['description']
  72.         episode_airdate = _common.format_date(epoch = episode_item['pubDate']/1000)
  73.         episode_name = episode_item['title']
  74.         try:
  75.             season_number = int(episode_item['pl' + str(i + 1) + '$season'][0])
  76.         except:
  77.             season_number = -1
  78.         try:
  79.             episode_number = int(episode_item['pl' + str(i + 1) + '$episode'][0])
  80.         except:
  81.             episode_number = -1
  82.         try:
  83.             episode_thumb = episode_item['plmedia$defaultThumbnailUrl']
  84.         except:
  85.             episode_thumb = None
  86.         u = sys.argv[0]
  87.         u += '?url="' + urllib.quote_plus(url) + '"'
  88.         u += '&mode="' + SITE + '"'
  89.         u += '&sitemode="play_video"'
  90.         infoLabels={    'title' : episode_name,
  91.                         'durationinseconds' : episode_duration,
  92.                         'season' : season_number,
  93.                         'episode' : episode_number,
  94.                         'plot' : episode_plot,
  95.                         'premiered' : episode_airdate }
  96.         _common.add_video(u, episode_name, episode_thumb, infoLabels = infoLabels)
  97.     _common.set_view('episodes')
  98.  
  99. def play_video(SWFURL, SITE):
  100.     video_url = _common.args.url
  101.     hbitrate = -1
  102.     lbitrate = -1
  103.     sbitrate = int(_addoncompat.get_setting('quality')) * 1024
  104.     closedcaption = None
  105.     video_data = _connection.getURL(video_url)
  106.     video_tree = BeautifulSoup(video_data, 'html.parser')
  107.     video_rtmp = video_tree.meta
  108.     if video_rtmp is not None:
  109.         base_url = video_rtmp['base']
  110.         video_url2 = video_tree.switch.find_all('video')
  111.         for video_index in video_url2:
  112.             bitrate = int(video_index['system-bitrate'])
  113.             if bitrate > hbitrate and bitrate <= sbitrate:
  114.                 hbitrate = bitrate
  115.                 playpath_url = video_index['src']  
  116.                 if '.mp4' in playpath_url:
  117.                     playpath_url = 'mp4:'+ playpath_url
  118.                 else:
  119.                     playpath_url = playpath_url.replace('.flv','')
  120.                 finalurl = base_url +' playpath=' + playpath_url + ' swfurl=' + SWFURL + ' swfvfy=true'
  121.     else:
  122.         video_data = _connection.getURL(video_url + '&manifest=m3u')
  123.         video_tree = BeautifulSoup(video_data)
  124.         try:
  125.             closedcaption = video_tree.textstream['src']
  126.         except:
  127.             pass
  128.         if (_addoncompat.get_setting('enablesubtitles') == 'true') and (closedcaption is not None):
  129.                 convert_subtitles(closedcaption)
  130.         video_url2 = video_tree.seq.find_all('video')[0]
  131.         video_url3 = video_url2['src']
  132.         video_url4 = video_url3.split('/')[-1]
  133.         video_data2 = _connection.getURL(video_url3)
  134.         video_url5 = _m3u8.parse(video_data2)
  135.         video_uri = None
  136.         for video_index in video_url5.get('playlists'):
  137.             try:
  138.                 codecs =  video_index.get('stream_info')['codecs']
  139.             except:
  140.                 codecs = ''
  141.             if  codecs != 'mp4a.40.2':
  142.                 bitrate = int(video_index.get('stream_info')['bandwidth'])
  143.                 if (bitrate < lbitrate or lbitrate == -1) and 'mp4a.40.2' != codecs:
  144.                     lbitrate = bitrate
  145.                     lvideo_uri = video_index.get('uri')
  146.                 if bitrate > hbitrate and bitrate <= sbitrate:
  147.                     hbitrate = bitrate
  148.                     video_uri = video_index.get('uri')
  149.         if video_uri is None:
  150.             video_uri = lvideo_uri
  151.         finalurl = video_url3.replace(video_url4, video_uri)
  152.     xbmcplugin.setResolvedUrl(pluginHandle, True, xbmcgui.ListItem(path = finalurl))
  153.     if (_addoncompat.get_setting('enablesubtitles') == 'true') and (closedcaption is not None):
  154.         while not xbmc.Player().isPlaying():
  155.             xbmc.sleep(100)
  156.         xbmc.Player().setSubtitles(_common.SUBTITLE)
  157.  
  158. def clean_subs(data):
  159.     br = re.compile(r'<br.*?>')
  160.     tag = re.compile(r'<.*?>')
  161.     space = re.compile(r'\s\s\s+')
  162.     apos = re.compile(r'&amp;apos;')
  163.     sub = br.sub('\n', data)
  164.     sub = tag.sub(' ', sub)
  165.     sub = space.sub(' ', sub)
  166.     sub = apos.sub('\'', sub)
  167.     return sub
  168.  
  169. def convert_subtitles(closedcaption):
  170.     str_output = ''
  171.     subtitle_data = _connection.getURL(closedcaption, connectiontype = 0)
  172.     subtitle_data = BeautifulSoup(subtitle_data, 'html.parser', parse_only = SoupStrainer('div'))
  173.     lines = subtitle_data.find_all('p')
  174.     for i, line in enumerate(lines):
  175.         if line is not None:
  176.             sub = clean_subs(_common.smart_utf8(line))
  177.             start_time_rest, start_time_msec = line['begin'].rsplit(':',1)
  178.             start_time = _common.smart_utf8(start_time_rest + ',' + start_time_msec)
  179.             try:
  180.                 end_time_rest, end_time_msec = line['end'].rsplit(':',1)
  181.                 end_time = _common.smart_utf8(end_time_rest + ',' + end_time_msec)
  182.             except:
  183.                 continue
  184.             str_output += str(i + 1) + '\n' + start_time + ' --> ' + end_time + '\n' + sub + '\n\n'
  185.     file = open(_common.SUBTITLE, 'w')
  186.     file.write(str_output)
  187.     file.close()
Advertisement
Add Comment
Please, Sign In to add comment