class Playback: def __init__(self): import urlresolver self.addon = Addon() self.common = self.addon.common self.urlresolver = urlresolver self.urlresolver.plugnplay.plugin_dirs = [] if self.common.resolvers: self.urlresolver.plugnplay.set_plugin_dirs(self.urlresolver.common.plugins_path, self.common.resolvers_path, self.common.builtin_resolvers_path) else: self.urlresolver.plugnplay.set_plugin_dirs(self.urlresolver.common.plugins_path, self.common.builtin_resolvers_path) self.urlresolver.plugnplay.load_plugins() def _dialog_sources(self, source_list): if not isinstance(source_list, list): return return self.urlresolver.choose_source(source_list) def _directory_sources(self, source_list, dict_list): from addondict import AddonDict item_list = [] for index, item in enumerate(source_list): multipart = re.search('^playlist://[a-zA-Z0-9_]+?/([0-9]+?)/$', item.get_url()) if multipart: _dict = AddonDict(0).update(dict_list[int(multipart.group(1))]) else: _dict = AddonDict(0).update(dict_list[0]) _dict['title'] = str(item.title) + ' | ' + str(_dict['title']) _dict['site'] = 'play_this' _dict['sub_site'] = '' _dict['mode'] = '' _dict['type'] = 0 _dict['context'] = 3 _dict['url'] = str(item.get_url()) item_list.extend([_dict]) if item_list: self.addon.add_items(item_list) self.addon.end_of_directory() def _create_source_list(self, dict_list): source_list = [] part_list = [] full_list = [] playlist_list = [] host = re.compile('(?:http|https)://(?:.+?\.)*?([0-9a-zA-Z_\-]+?)\.[0-9a-zA-Z]{2,}(?:/|:).*') old_host = '' separator = ' | ' for iindex, item in enumerate(dict_list): playlist_host = 'playlist://%s/%s/' source_title = '' quality = separator + item.get('src_quality', 'SD') if item['multi-part']: if item['src_title']: source_title = item['src_title'] + separator source_host = host.search(item['url']) if source_host: source_host = source_host.group(1) else: source_host = 'UID' for index, part in enumerate(item['parts']): part_title = source_title + source_host + separator + self.common.language(30651, True) + ' ' + str(index + 1) + quality source = self.urlresolver.HostedMediaFile(url=part, title=part_title.upper()) if source: part_list.extend([source]) if old_host != source_host: old_host = source_host playlist_host = playlist_host % (old_host, iindex) playlist_title = source_title + old_host + separator + self.common.language(30650, True) + quality playlist_source = self.urlresolver.HostedMediaFile(url=playlist_host, title=playlist_title.upper()) if playlist_source: playlist_list.extend([playlist_source]) else: if item['src_title']: source_title = item['src_title'] + separator source_host = host.search(item['url']) if source_host: source_host = source_host.group(1) else: source_host = 'UID' source_title += source_host + quality source = self.urlresolver.HostedMediaFile(url=item['url'], title=source_title.upper()) if source: full_list.extend([source]) full_list.extend(playlist_list) source_list.extend(full_list) source_list.extend(part_list) return [source_list, full_list] def _sort_sources(self, dict_list): usehd = self.common.usehd() autoplay = self.common.autoplay() hd = [] hq = [] sd = [] lq = [] new_dict_list = [] for item in dict_list: source = True if item['multi-part']: item['url'] = 'playlist://' + item['parts'][0] if source: quality = item.get('src_quality', 'sd') if quality.lower() == 'hd': hd.extend([item]) elif quality.lower() == 'hq': hq.extend([item]) elif quality.lower() == 'sd': sd.extend([item]) elif quality.lower() == 'lq': lq.extend([item]) if (autoplay and usehd) or not autoplay: new_dict_list.extend(hd) new_dict_list.extend(hq) new_dict_list.extend(sd) new_dict_list.extend(lq) if autoplay and not usehd: new_dict_list.extend(hd) return new_dict_list def choose_sources(self, dict_list): if not isinstance(dict_list, list): raise TypeError for item in dict_list: try: item.keys() except: raise TypeError autoplay = self.common.autoplay() edit_url = self.common.editurl() dict_list = self._sort_sources(dict_list) if not dict_list: self.common.alert(self.common.language(30905, True), sound=False) return lists = self._create_source_list(dict_list) source_list = lists[0] full_list = lists[1] chosen = None img = dict_list[-1].get('cover_url', '') if (self.common.theme_path in img) or (self.common.media_path in img): img = '' thumb = dict_list[-1].get('thumb_url', None) if thumb: if (self.common.theme_path in thumb) or (self.common.media_path in thumb): img = thumb title = dict_list[-1].get('title', '') found = False if len(dict_list) == 1: if source_list: if len(source_list) > 0: stream_url = source_list[0].resolve() if stream_url: found = True self.play_this(stream_url, dict_list[0].get('title', ''), dict_list[0].get('cover_url', ''), self.common.usedirsources(), dict_list[0]) elif autoplay and full_list: for index, chosen in enumerate(full_list): stream_url = chosen.resolve() if stream_url: if not stream_url.startswith('playlist://'): if edit_url: stream_url = self.addon.edit_input(stream_url) found = True playback_item = xbmcgui.ListItem(label=title, thumbnailImage=img, path=stream_url) playback_item.setProperty('IsPlayable', 'true') xbmcplugin.setResolvedUrl(self.common.handle, True, playback_item) break else: list_index = re.search('^playlist://[a-zA-Z0-9_]+?/([0-9]+?)/$', stream_url) if list_index: found = True self.play_list(dict_list[int(list_index.group(1))], title, img) break elif source_list: if self.common.usedirsources(): found = True self._directory_sources(source_list, dict_list) else: chosen = self._dialog_sources(source_list) if chosen: idx = None stream_url = chosen.resolve() if stream_url: if not stream_url.startswith('playlist://'): if edit_url: stream_url = self.addon.edit_input(stream_url) part_title = re.search('.+?(\s[Pp][Aa][Rr][Tt]\s[0-9]+)', chosen.title) if part_title: title += part_title.group(1) playback_item = xbmcgui.ListItem(label=title, thumbnailImage=img, path=stream_url) playback_item.setProperty('IsPlayable', 'true') found = True xbmcplugin.setResolvedUrl(self.common.handle, True, playback_item) else: list_index = re.search('^playlist://[a-zA-Z0-9_]+?/([0-9]+?)/$', stream_url) if list_index: found = True self.play_list(dict_list[int(list_index.group(1))], title, img) if not found: try: failmsg = str(stream_url.msg) self.common.alert(failmsg, self.common.language(30923, True)) except: pass def play_list(self, source, title='', image=''): try: source.keys() except: raise TypeError if source['multi-part']: all_resolved = True playlist_item = self.addon.get_playlist(1, True) first_item = None try: source['parts'] = ast.literal_eval(source['parts']) except: pass for index, part in enumerate(source['parts']): this_title = title src_title = source['title'] + ' ' + self.common.language(30651, True) + ' ' + str(index + 1) if this_title: this_title += ' ' + self.common.language(30651, True) + ' ' + str(index + 1) else: this_title = src_title stream_url = None hmf = self.urlresolver.HostedMediaFile(url=part, title=src_title) if hmf: stream_url = hmf.resolve() if stream_url: playback_item = \ xbmcgui.ListItem(label=this_title, thumbnailImage=image, path=stream_url) playback_item.setProperty('IsPlayable', 'true') if not first_item: first_item = playback_item playlist_item.add(stream_url, playback_item) else: amsg = '%s %s %s' % (self.common.language(30991, True), str(index + 1), self.common.language(30922, True)) self.common.alert(amsg, self.common.language(30921, True)) all_resolved = False break if all_resolved and first_item: xbmcplugin.setResolvedUrl(self.common.handle, True, first_item) def play_this(self, item, title='', image='', with_player=True, meta_dict=None): if not isinstance(item, str): try: item = str(item) except: return source = self.urlresolver.HostedMediaFile(url=item, title=title) stream_url = source.resolve() if not stream_url or not isinstance(stream_url, basestring): stream_url = item if stream_url: multipart = False if meta_dict: multipart = meta_dict.get('multi-part', False) if multipart: if 'playlist://' not in item: multipart = False if multipart: self.play_list(meta_dict, title, image) else: playback_item = xbmcgui.ListItem(label=title, thumbnailImage=image, path=stream_url) playback_item.setProperty('IsPlayable', 'true') if with_player: core = self.common.player_core() xbmc.Player(core).play(stream_url, playback_item) else: xbmcplugin.setResolvedUrl(self.common.handle, True, playback_item)
class Playback: def __init__(self): import urlresolver self.addon = Addon() self.common = self.addon.common self.urlresolver = urlresolver self.urlresolver.plugnplay.plugin_dirs = [] if self.common.resolvers: self.urlresolver.plugnplay.set_plugin_dirs( self.urlresolver.common.plugins_path, self.common.resolvers_path, self.common.builtin_resolvers_path) else: self.urlresolver.plugnplay.set_plugin_dirs( self.urlresolver.common.plugins_path, self.common.builtin_resolvers_path) self.urlresolver.plugnplay.load_plugins() def _dialog_sources(self, source_list): if not isinstance(source_list, list): return return self.urlresolver.choose_source(source_list) def _directory_sources(self, source_list, dict_list): from addondict import AddonDict item_list = [] for index, item in enumerate(source_list): multipart = re.search('^playlist://[a-zA-Z0-9_]+?/([0-9]+?)/$', item.get_url()) if multipart: _dict = AddonDict(0).update(dict_list[int(multipart.group(1))]) else: _dict = AddonDict(0).update(dict_list[0]) _dict['title'] = str(item.title) + ' | ' + str(_dict['title']) _dict['site'] = 'play_this' _dict['sub_site'] = '' _dict['mode'] = '' _dict['type'] = 0 _dict['context'] = 3 _dict['url'] = str(item.get_url()) item_list.extend([_dict]) if item_list: self.addon.add_items(item_list) self.addon.end_of_directory() def _create_source_list(self, dict_list): source_list = [] part_list = [] full_list = [] playlist_list = [] host = re.compile( '(?:http|https)://(?:.+?\.)*?([0-9a-zA-Z_\-]+?)\.[0-9a-zA-Z]{2,}(?:/|:).*' ) old_host = '' separator = ' | ' for iindex, item in enumerate(dict_list): playlist_host = 'playlist://%s/%s/' source_title = '' quality = separator + item.get('src_quality', 'SD') if item['multi-part']: if item['src_title']: source_title = item['src_title'] + separator source_host = host.search(item['url']) if source_host: source_host = source_host.group(1) else: source_host = 'UID' for index, part in enumerate(item['parts']): part_title = source_title + source_host + separator + self.common.language( 30651, True) + ' ' + str(index + 1) + quality source = self.urlresolver.HostedMediaFile( url=part, title=part_title.upper()) if source: part_list.extend([source]) if old_host != source_host: old_host = source_host playlist_host = playlist_host % (old_host, iindex) playlist_title = source_title + old_host + separator + self.common.language( 30650, True) + quality playlist_source = self.urlresolver.HostedMediaFile( url=playlist_host, title=playlist_title.upper()) if playlist_source: playlist_list.extend([playlist_source]) else: if item['src_title']: source_title = item['src_title'] + separator source_host = host.search(item['url']) if source_host: source_host = source_host.group(1) else: source_host = 'UID' source_title += source_host + quality source = self.urlresolver.HostedMediaFile( url=item['url'], title=source_title.upper()) if source: full_list.extend([source]) full_list.extend(playlist_list) source_list.extend(full_list) source_list.extend(part_list) return [source_list, full_list] def _sort_sources(self, dict_list): usehd = self.common.usehd() autoplay = self.common.autoplay() hd = [] hq = [] sd = [] lq = [] new_dict_list = [] for item in dict_list: source = True if item['multi-part']: item['url'] = 'playlist://' + item['parts'][0] if source: quality = item.get('src_quality', 'sd') if quality.lower() == 'hd': hd.extend([item]) elif quality.lower() == 'hq': hq.extend([item]) elif quality.lower() == 'sd': sd.extend([item]) elif quality.lower() == 'lq': lq.extend([item]) if (autoplay and usehd) or not autoplay: new_dict_list.extend(hd) new_dict_list.extend(hq) new_dict_list.extend(sd) new_dict_list.extend(lq) if autoplay and not usehd: new_dict_list.extend(hd) return new_dict_list def choose_sources(self, dict_list): if not isinstance(dict_list, list): raise TypeError for item in dict_list: try: item.keys() except: raise TypeError autoplay = self.common.autoplay() edit_url = self.common.editurl() dict_list = self._sort_sources(dict_list) if not dict_list: self.common.alert(self.common.language(30905, True), sound=False) return lists = self._create_source_list(dict_list) source_list = lists[0] full_list = lists[1] chosen = None img = dict_list[-1].get('cover_url', '') if (self.common.theme_path in img) or (self.common.media_path in img): img = '' thumb = dict_list[-1].get('thumb_url', None) if thumb: if (self.common.theme_path in thumb) or (self.common.media_path in thumb): img = thumb title = dict_list[-1].get('title', '') found = False if len(dict_list) == 1: stream_url = source_list[0].resolve() if stream_url: found = True self.play_this(stream_url, dict_list[0].get('title', ''), dict_list[0].get('cover_url', ''), self.common.usedirsources(), dict_list[0]) elif autoplay and full_list: for index, chosen in enumerate(full_list): stream_url = chosen.resolve() if stream_url: if not stream_url.startswith('playlist://'): if edit_url: stream_url = self.addon.edit_input(stream_url) found = True playback_item = xbmcgui.ListItem(label=title, thumbnailImage=img, path=stream_url) playback_item.setProperty('IsPlayable', 'true') xbmcplugin.setResolvedUrl(self.common.handle, True, playback_item) break else: list_index = re.search( '^playlist://[a-zA-Z0-9_]+?/([0-9]+?)/$', stream_url) if list_index: found = True self.play_list(dict_list[int(list_index.group(1))], title, img) break elif source_list: if self.common.usedirsources(): found = True self._directory_sources(source_list, dict_list) else: chosen = self._dialog_sources(source_list) if chosen: idx = None stream_url = chosen.resolve() if stream_url: if not stream_url.startswith('playlist://'): if edit_url: stream_url = self.addon.edit_input(stream_url) part_title = re.search( '.+?(\s[Pp][Aa][Rr][Tt]\s[0-9]+)', chosen.title) if part_title: title += part_title.group(1) playback_item = xbmcgui.ListItem( label=title, thumbnailImage=img, path=stream_url) playback_item.setProperty('IsPlayable', 'true') found = True xbmcplugin.setResolvedUrl(self.common.handle, True, playback_item) else: list_index = re.search( '^playlist://[a-zA-Z0-9_]+?/([0-9]+?)/$', stream_url) if list_index: found = True self.play_list( dict_list[int(list_index.group(1))], title, img) if not found: try: failmsg = str(stream_url.msg) except: failmsg = self.common.language(30905, True) else: self.common.alert(failmsg, self.common.language(30923, True)) def play_list(self, source, title='', image=''): try: source.keys() except: raise TypeError if source['multi-part']: all_resolved = True playlist_item = self.addon.get_playlist(1, True) first_item = None try: source['parts'] = ast.literal_eval(source['parts']) except: pass for index, part in enumerate(source['parts']): this_title = title src_title = source['title'] + ' ' + self.common.language( 30651, True) + ' ' + str(index + 1) if this_title: this_title += ' ' + self.common.language( 30651, True) + ' ' + str(index + 1) else: this_title = src_title stream_url = None hmf = self.urlresolver.HostedMediaFile(url=part, title=src_title) if hmf: stream_url = hmf.resolve() if stream_url: playback_item = \ xbmcgui.ListItem(label=this_title, thumbnailImage=image, path=stream_url) playback_item.setProperty('IsPlayable', 'true') if not first_item: first_item = playback_item playlist_item.add(stream_url, playback_item) else: amsg = '%s %s %s' % (self.common.language( 30991, True), str(index + 1), self.common.language(30922, True)) self.common.alert(amsg, self.common.language(30921, True)) all_resolved = False break if all_resolved and first_item: xbmcplugin.setResolvedUrl(self.common.handle, True, first_item) def play_this(self, item, title='', image='', with_player=True, meta_dict=None): if not isinstance(item, str): try: item = str(item) except: return source = self.urlresolver.HostedMediaFile(url=item, title=title) stream_url = source.resolve() if not stream_url: try: failmsg = str(stream_url.msg) except: failmsg = self.common.language(30905, True) else: self.common.alert(failmsg, self.common.language(30923, True)) finally: stream_url = item if stream_url: multipart = False if meta_dict: multipart = meta_dict.get('multi-part', False) if multipart: if 'playlist://' not in item: multipart = False if multipart: self.play_list(meta_dict, title, image) else: playback_item = xbmcgui.ListItem(label=title, thumbnailImage=image, path=stream_url) playback_item.setProperty('IsPlayable', 'true') if with_player: core = self.common.player_core() xbmc.Player(core).play(stream_url, playback_item) else: xbmcplugin.setResolvedUrl(self.common.handle, True, playback_item)