SHOW:
|
|
- or go back to the newest paste.
1 | #!/usr/bin/python | |
2 | # -*- coding: utf-8 -* | |
3 | import xbmcplugin | |
4 | import xbmc | |
5 | import xbmcgui | |
6 | - | import urllib |
6 | + | |
7 | import re | |
8 | import sys | |
9 | from BeautifulSoup import BeautifulStoneSoup | |
10 | import resources.lib._common as common | |
11 | import resources.lib.m3u8 as m3u8 | |
12 | ||
13 | - | import base64 |
13 | + | |
14 | ||
15 | BRANDID = '001' | |
16 | PARTNERID = '585231' | |
17 | SITE = 'abc' | |
18 | SHOWLIST = 'http://abc.go.com/vp2/ws/s/contents/2012/shows/' + BRANDID + '/001/-1?rand=2.0.0000' | |
19 | VIDEOLIST = 'http://abc.go.com/vp2/ws/s/contents/2012/videos/' + BRANDID + '/001/' | |
20 | CLOSEDCAPTIONHOST = 'http://cdn.video.abc.com' | |
21 | ||
22 | def masterlist(): | |
23 | return rootlist(db=True) | |
24 | ||
25 | def rootlist(db=False): | |
26 | root_data = common.getURL(SHOWLIST) | |
27 | root_tree = BeautifulStoneSoup(root_data, convertEntities=BeautifulStoneSoup.XML_ENTITIES) | |
28 | - | root_tree = BeautifulStoneSoup(root_data, convertEntities=BeautifulStoneSoup.HTML_ENTITIES) |
28 | + | |
29 | db_shows = [] | |
30 | for root_item in root_menu: | |
31 | root_name = root_item('title')[0].string | |
32 | season_id = root_item['id'] | |
33 | if db == True: | |
34 | db_shows.append(root_name, SITE,'seasons',season_id) | |
35 | else: | |
36 | common.addShow(root_name, SITE,'seasons',season_id) | |
37 | if db == True: | |
38 | return db_shows | |
39 | else: | |
40 | common.setView('tvshows') | |
41 | ||
42 | def seasons(url=common.args.url): | |
43 | show_id = url | |
44 | show_url = VIDEOLIST + 'lf/' + show_id + '/-1/-1/-1/-1?rand=2.0.0000' | |
45 | show_data = common.getURL(show_url) | |
46 | show_menu = sorted(set(re.findall(r'<season id\=\"(.+?)\"',show_data))) | |
47 | for show_item in show_menu: | |
48 | show_name = 'Season ' + show_item | |
49 | show_url = VIDEOLIST + 'lf/' + show_id + '/' + show_item + '/-1/-1/-1?rand=2.0.0000' | |
50 | common.addDirectory(show_name, SITE, 'episodes', show_url) | |
51 | clip_id = url | |
52 | clip_url = VIDEOLIST + 'sf/' + show_id + '/-1/-1/-1/-1?rand=2.0.0000' | |
53 | clip_data = common.getURL(clip_url) | |
54 | clip_menu = sorted(set(re.findall(r'<season id\=\"(.+?)\"',clip_data))) | |
55 | for clip_item in clip_menu: | |
56 | clip_name = 'Clips Season ' + clip_item | |
57 | clip_url = VIDEOLIST + 'sf/' + clip_id + '/' + clip_item + '/-1/-1/-1?rand=2.0.0000' | |
58 | common.addDirectory(clip_name, SITE, 'episodes', clip_url) | |
59 | common.setView('seasons') | |
60 | ||
61 | def episodes(url=common.args.url): | |
62 | episode_data = common.getURL(url) | |
63 | episode_tree = BeautifulStoneSoup(episode_data, convertEntities=BeautifulStoneSoup.XML_ENTITIES) | |
64 | - | episode_tree = BeautifulStoneSoup(episode_data, convertEntities=BeautifulStoneSoup.HTML_ENTITIES) |
64 | + | |
65 | for episode_item in episode_menu: | |
66 | episode_name = episode_item('title')[1].string | |
67 | try: | |
68 | episode_thumb = episode_item('thumbnails')[1]('thumbnail')[1].string | |
69 | except: | |
70 | try: | |
71 | episode_thumb = episode_item('thumbnails')[1]('thumbnail')[0].string | |
72 | except: | |
73 | episode_thumb = episode_item('thumbnail')[0].string | |
74 | if (episode_item('asset')[0]['format'] == 'MOV'): | |
75 | sitemode = 'playVideoMOV' | |
76 | elif (episode_item('asset')[0]['format'] == 'MP4'): | |
77 | sitemode = 'playVideoMP4' | |
78 | else: | |
79 | sitemode = 'playVideoULNK' | |
80 | - | sitemode = 'playVideoUPL' |
80 | + | url = episode_item['id'].replace('VDKA', '') |
81 | - | url = episode_item['id'] |
81 | + | |
82 | description = episode_item('longdescription')[0].string | |
83 | except: | |
84 | description = episode_item('description')[0].string | |
85 | try: | |
86 | closedcaption = episode_item('closedcaption')[0]('src')[0].string | |
87 | closedcaption = CLOSEDCAPTIONHOST + closedcaption.split('.com')[1] | |
88 | except: | |
89 | closedcaption = 'false' | |
90 | episode_airDate = re.sub(r" P(.)T","",episode_item('airdate')[0].string) | |
91 | - | u += '?url="' + urllib.quote_plus(url) + '"' |
91 | + | |
92 | episode_number = episode_item('number')[0].string | |
93 | season_number = episode_item('season')[0]['id'] | |
94 | u = sys.argv[0] | |
95 | u += '?url="' + url + '#' + closedcaption + '"' | |
96 | u += '&mode="' + SITE + '"' | |
97 | u += '&sitemode="' + sitemode + '"' | |
98 | infoLabels={ "Title":episode_name, | |
99 | "Plot":description, | |
100 | "premiered":common.formatDate(episode_airDate,'%a, %d %b %Y %H:%M:%S','%d.%m.%Y'), | |
101 | "Duration":episode_duration, | |
102 | "Episode":episode_number, | |
103 | "Season":season_number | |
104 | } | |
105 | - | video_id = url.replace('VDKA', '') |
105 | + | |
106 | common.setView('episodes') | |
107 | ||
108 | def playVideoMOV(url=common.args.url): | |
109 | video_id = url.split('#')[0] | |
110 | - | video_tree = BeautifulStoneSoup(video_data, convertEntities=BeautifulStoneSoup.HTML_ENTITIES) |
110 | + | closedcaption = url.split('#')[1] |
111 | if (common.settings['enablesubtitles'] == 'true'): | |
112 | if (closedcaption != 'false'): | |
113 | convert_subtitles(closedcaption) | |
114 | hbitrate = -1 | |
115 | sbitrate = int(common.settings['quality']) | |
116 | video_url = 'http://www.kaltura.com/p/' + PARTNERID + '/sp/' + PARTNERID + '00/playManifest/format/rtmp/entryId/' + video_id | |
117 | video_data = common.getURL(video_url) | |
118 | video_tree = BeautifulStoneSoup(video_data, convertEntities=BeautifulStoneSoup.XML_ENTITIES) | |
119 | base_url = video_tree('baseurl')[0].string | |
120 | video_url2 = video_tree.findAll('media') | |
121 | for video_index in video_url2: | |
122 | bitrate = int(video_index['bitrate']) | |
123 | - | video_id = url.replace('VDKA', '') |
123 | + | |
124 | hbitrate = bitrate | |
125 | playpath_url = video_index['url'] | |
126 | swf_url = 'http://livepassdl.conviva.com/ver/2.61.0.65970/LivePassModuleMain.swf' | |
127 | finalurl = base_url + ' playpath=' + playpath_url + ' swfUrl=' + swf_url + ' swfVfy=true' | |
128 | xbmcplugin.setResolvedUrl(pluginHandle, True, xbmcgui.ListItem(path = finalurl)) | |
129 | if (common.settings['enablesubtitles'] == 'true') and (closedcaption != 'false'): | |
130 | while not xbmc.Player().isPlaying(): | |
131 | xbmc.sleep(100) | |
132 | subtitles = os.path.join(common.pluginpath,'resources','cache','subtitle.srt') | |
133 | xbmc.Player().setSubtitles(subtitles) | |
134 | ||
135 | def playVideoMP4(url=common.args.url): | |
136 | - | def playVideoUPL(url=common.args.url): |
136 | + | video_id = url.split('#')[0] |
137 | - | video_id = url.replace('VDKA', '') |
137 | + | closedcaption = url.split('#')[1] |
138 | if (common.settings['enablesubtitles'] == 'true'): | |
139 | if (closedcaption != 'false'): | |
140 | convert_subtitles(closedcaption) | |
141 | hbitrate = -1 | |
142 | - | video_tree = BeautifulStoneSoup(video_data, convertEntities=BeautifulStoneSoup.HTML_ENTITIES) |
142 | + | |
143 | video_url = 'http://www.kaltura.com/p/' + PARTNERID + '/sp/' + PARTNERID + '00/playManifest/format/applehttp/entryId/' + video_id | |
144 | video_data = common.getURL(video_url) | |
145 | video_url2 = m3u8.parse(video_data) | |
146 | for video_index in video_url2.get('playlists'): | |
147 | bitrate = int(video_index.get('stream_info')['bandwidth']) | |
148 | if bitrate > hbitrate and bitrate <= (sbitrate * 1000): | |
149 | hbitrate = bitrate | |
150 | finalurl = video_index.get('uri') | |
151 | - | xbmcplugin.setResolvedUrl(pluginHandle, True, xbmcgui.ListItem(path=finalurl)) |
151 | + | |
152 | if (common.settings['enablesubtitles'] == 'true') and (closedcaption != 'false'): | |
153 | while not xbmc.Player().isPlaying(): | |
154 | xbmc.sleep(100) | |
155 | subtitles = os.path.join(common.pluginpath,'resources','cache','subtitle.srt') | |
156 | xbmc.Player().setSubtitles(subtitles) | |
157 | ||
158 | def playVideoULNK(url=common.args.url): | |
159 | video_id = url.split('#')[0] | |
160 | closedcaption = url.split('#')[1] | |
161 | if (common.settings['enablesubtitles'] == 'true'): | |
162 | if (closedcaption != 'false'): | |
163 | convert_subtitles(closedcaption) | |
164 | hbitrate = -1 | |
165 | sbitrate = int(common.settings['quality']) | |
166 | video_url = 'http://www.kaltura.com/p/' + PARTNERID + '/sp/' + PARTNERID + '00/playManifest/format/http/entryId/' + video_id + '/a.f4m?playbackContext=brand%3D' + BRANDID + '%26device%3D001' | |
167 | video_data = common.getURL(video_url) | |
168 | video_tree = BeautifulStoneSoup(video_data, convertEntities=BeautifulStoneSoup.XML_ENTITIES) | |
169 | video_url2 = video_tree.find('media')['url'] | |
170 | video_data2 = common.getURL(video_url2) | |
171 | video_url3 = m3u8.parse(video_data2) | |
172 | for video_index in video_url3.get('playlists'): | |
173 | bitrate = int(video_index.get('stream_info')['bandwidth']) | |
174 | if bitrate > hbitrate and bitrate <= (sbitrate * 1000): | |
175 | hbitrate = bitrate | |
176 | video_url4 = video_index.get('uri') | |
177 | video_data3 = re.sub(r"\#EXT-X-DISCONTINUITY\n","",common.getURL(video_url4)) | |
178 | file = open(os.path.join(common.pluginpath,'resources','cache','play.m3u8'), 'w') | |
179 | file.write(video_data3) | |
180 | file.close() | |
181 | finalurl = os.path.join(common.pluginpath,'resources','cache','play.m3u8') | |
182 | xbmcplugin.setResolvedUrl(pluginHandle, True, xbmcgui.ListItem(path=finalurl)) | |
183 | if (common.settings['enablesubtitles'] == 'true') and (closedcaption != 'false'): | |
184 | while not xbmc.Player().isPlaying(): | |
185 | xbmc.sleep(100) | |
186 | subtitles = os.path.join(common.pluginpath,'resources','cache','subtitle.srt') | |
187 | xbmc.Player().setSubtitles(subtitles) | |
188 | ||
189 | def clean_subs(data): | |
190 | br = re.compile(r'<br.*?>') | |
191 | br_2 = re.compile(r'\n') | |
192 | tag = re.compile(r'<.*?>') | |
193 | space = re.compile(r'\s\s\s+') | |
194 | sub = br.sub('\n', str(data)) | |
195 | sub = tag.sub(' ', sub) | |
196 | sub = br_2.sub('<br/>', sub) | |
197 | sub = space.sub(' ', sub) | |
198 | return sub | |
199 | ||
200 | def convert_subtitles(xml_closedcaption): | |
201 | subtitle_array = [] | |
202 | srt_output = '' | |
203 | subtitle_data = common.getURL(xml_closedcaption) | |
204 | subtitle_data = BeautifulStoneSoup(subtitle_data, convertEntities=BeautifulStoneSoup.XML_ENTITIES) | |
205 | lines = subtitle_data.findAll('p') | |
206 | for line in lines: | |
207 | if line is not None: | |
208 | sub = str(clean_subs(line)) | |
209 | try: | |
210 | newsub=sub | |
211 | sub = BeautifulStoneSoup(sub, convertEntities=BeautifulStoneSoup.ALL_ENTITIES) | |
212 | except: | |
213 | sub=newsub | |
214 | start_time_hours, start_time_rest = line['begin'].split(':',1) | |
215 | start_time_hours = "%02d" % (int(start_time_hours) - 1) | |
216 | start_time = start_time_hours + ":" + start_time_rest.replace('.',',') | |
217 | end_time_hours, end_time_rest = line['end'].split(':',1) | |
218 | end_time_hours = "%02d" % (int(end_time_hours) - 1) | |
219 | end_time = end_time_hours + ":" + end_time_rest.replace('.',',') | |
220 | temp_dict = {'start':start_time, 'end':end_time, 'text':sub} | |
221 | subtitle_array.append(temp_dict) | |
222 | for i, subtitle in enumerate(subtitle_array): | |
223 | line = str(i+1)+"\n"+str(subtitle['start'])+" --> "+str(subtitle['end'])+"\n"+str(subtitle['text'])+"\n\n" | |
224 | srt_output += line | |
225 | file = open(os.path.join(common.pluginpath,'resources','cache','subtitle.srt'), 'w') | |
226 | file.write(srt_output) | |
227 | file.close() | |
228 | return True |