def _process_add(provider, context, re_match): subscription_id = context.get_param('subscription_id', '') if subscription_id: json_data = provider.get_client(context).subscribe(subscription_id) if not v3.handle_error(provider, context, json_data): return False return True
def _process_rate_video(provider, context, re_match): video_id = context.get_param('video_id', '') if not video_id: raise kodion.KodionException('video/rate/: missing video_id') client = provider.get_client(context) json_data = client.get_video_rating(video_id) if not v3.handle_error(provider, context, json_data): return False items = json_data.get('items', []) if items: current_rating = items[0].get('rating', '') ratings = ['like', 'dislike', 'none'] rating_items = [] for rating in ratings: if rating != current_rating: rating_items.append((context.localize( provider.LOCAL_MAP['youtube.video.rate.%s' % rating]), rating)) pass pass result = context.get_ui().on_select( context.localize(provider.LOCAL_MAP['youtube.video.rate']), rating_items) if result != -1: client = provider.get_client(context).rate_video(video_id, result) # this will be set if we are in the 'Liked Video' playlist if context.get_param('refresh_container', '0') == '1': context.get_ui().refresh_container() pass pass pass pass
def _load_videos(_page_token='', _progress_dialog=None): if not _progress_dialog: _progress_dialog = context.get_ui().create_progress_dialog( context.localize( provider.LOCAL_MAP['youtube.playlist.progress.updating']), context.localize(constants.localize.COMMON_PLEASE_WAIT), background=True) pass json_data = client.get_playlist_items(playlist_id, page_token=_page_token) if not v3.handle_error(provider, context, json_data): return False _progress_dialog.set_total( int(json_data.get('pageInfo', {}).get('totalResults', 0))) result = v3.response_to_items(provider, context, json_data, process_next_page=False) videos.extend(result) progress_text = '%s %d/%d' % (context.localize( constants.localize.COMMON_PLEASE_WAIT), len(videos), _progress_dialog.get_total()) _progress_dialog.update(steps=len(result), text=progress_text) next_page_token = json_data.get('nextPageToken', '') if next_page_token: _load_videos(_page_token=next_page_token, _progress_dialog=_progress_dialog) pass return _progress_dialog
def _process_rate_video(provider, context, re_match): video_id = context.get_param('video_id', '') if not video_id: raise kodion.KodionException('video/rate: missing video_id') client = provider.get_client(context) json_data = client.get_video_rating(video_id) if not v3.handle_error(provider, context, json_data): return False items = json_data.get('items', []) if items: current_rating = items[0].get('rating', '') ratings = ['like', 'dislike', 'none'] rating_items = [] for rating in ratings: if rating != current_rating: rating_items.append((context.localize(provider.LOCAL_MAP['youtube.video.rate.%s' % rating]), rating)) pass pass result = context.get_ui().on_select(context.localize(provider.LOCAL_MAP['youtube.video.rate']), rating_items) if result != -1: client = provider.get_client(context).rate_video(video_id, result) # this will be set if we are in the 'Liked Video' playlist if context.get_param('refresh_container', '0') == '1': context.get_ui().refresh_container() pass pass pass pass
def _process_recommendations(provider, context, re_match): result = [] page_token = context.get_param('page_token', '') json_data = provider.get_client(context).get_activities('home', page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data)) return result
def _process_disliked_videos(provider, context, re_match): result = [] page_token = context.get_param('page_token', '') json_data = provider.get_client(context).get_disliked_videos(page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data)) return result
def _process_browse_channels(provider, context, re_match): result = [] page_token = context.get_param('page_token', '') guide_id = context.get_param('guide_id', '') if guide_id: json_data = provider.get_client(context).get_guide_category(guide_id) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data)) pass else: json_data = provider.get_client(context).get_guide_categories() if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data)) pass return result
def _process_remove(provider, context, re_match): subscription_id = context.get_param('subscription_id', '') if subscription_id: json_data = provider.get_client(context).unsubscribe(subscription_id) if not v3.handle_error(provider, context, json_data): return False context.get_ui().refresh_container() pass return True
def _process_select_playlist(provider, context, re_match): json_data = context.get_function_cache().get(FunctionCache.ONE_MINUTE / 3, provider.get_client(context).get_playlists_of_channel, channel_id='mine') playlists = json_data.get('items', []) items = [] # create playlist items.append(('[B]' + context.localize(provider.LOCAL_MAP['youtube.playlist.create']) + '[/B]', 'playlist.create')) # add the 'Watch Later' playlist resource_manager = provider.get_resource_manager(context) my_playlists = resource_manager.get_related_playlists(channel_id='mine') if 'watchLater' in my_playlists: watch_later_playlist_id = my_playlists.get('watchLater', '') items.append( ('[B]' + context.localize(provider.LOCAL_MAP['youtube.watch_later']) + '[/B]', watch_later_playlist_id)) pass for playlist in playlists: snippet = playlist.get('snippet', {}) title = snippet.get('title', '') playlist_id = playlist.get('id', '') if title and playlist_id: items.append((title, playlist_id)) pass pass result = context.get_ui().on_select(context.localize(provider.LOCAL_MAP['youtube.playlist.select']), items) if result == 'playlist.create': result, text = context.get_ui().on_keyboard_input( context.localize(provider.LOCAL_MAP['youtube.playlist.create'])) if result and text: json_data = provider.get_client(context).create_playlist(title=text) if not v3.handle_error(provider, context, json_data): return playlist_id = json_data.get('id', '') if playlist: new_params = {} new_params.update(context.get_params()) new_params['playlist_id'] = playlist_id new_context = context.clone(new_params=new_params) _process_add_video(provider, new_context, re_match) pass pass pass elif result != -1: new_params = {} new_params.update(context.get_params()) new_params['playlist_id'] = result new_context = context.clone(new_params=new_params) _process_add_video(provider, new_context, re_match) pass pass
def _process_remove_playlist(provider, context, re_match): playlist_id = context.get_param('playlist_id', '') if not playlist_id: raise kodion.KodimonException('Playlist/Remove: missing playlist_id') json_data = provider.get_client(context).remove_playlist(playlist_id=playlist_id) if not v3.handle_error(provider, context, json_data): return False context.get_ui().refresh_container() return True
def _process_list(provider, context, re_match): result = [] page_token = context.get_param('page_token', '') # no caching json_data = provider.get_client(context).get_subscription('mine', page_token=page_token) if not v3.handle_error(provider, context, json_data): return [] result.extend(v3.response_to_items(provider, context, json_data)) return result
def _process_popular_right_now(provider, context, re_match): provider.set_content_type(context, kodion.constants.content_type.EPISODES) result = [] page_token = context.get_param('page_token', '') json_data = provider.get_client(context).get_popular_videos(page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data)) return result
def _process_popular_right_now(provider, context, re_match): provider.set_content_type(context, kodion.constants.content_type.VIDEOS) result = [] page_token = context.get_param('page_token', '') json_data = provider.get_client(context).get_popular_videos(page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data)) return result
def _process_remove_playlist(provider, context, re_match): playlist_id = context.get_param('playlist_id', '') if not playlist_id: raise kodion.KodimonException('Playlist/Remove: missing playlist_id') json_data = provider.get_client(context).remove_playlist( playlist_id=playlist_id) if not v3.handle_error(provider, context, json_data): return False context.get_ui().refresh_container() return True
def _process_list(provider, context, re_match): result = [] page_token = context.get_param('page_token', '') # no caching json_data = provider.get_client(context).get_subscription( 'mine', page_token=page_token) if not v3.handle_error(provider, context, json_data): return [] result.extend(v3.response_to_items(provider, context, json_data)) return result
def _process_add_video(provider, context, re_match): playlist_id = context.get_param('playlist_id', '') if not playlist_id: raise kodion.KodionException('Playlist/Remove: missing playlist_id') video_id = context.get_param('video_id', '') if not video_id: raise kodion.KodionException('Playlist/Remove: missing video_id') json_data = provider.get_client(context).add_video_to_playlist(playlist_id=playlist_id, video_id=video_id) if not v3.handle_error(provider, context, json_data): return False return True
def _process_related_videos(provider, context, re_match): result = [] provider.set_content_type(context, kodion.constants.content_type.VIDEOS) page_token = context.get_param('page_token', '') video_id = context.get_param('video_id', '') if video_id: json_data = provider.get_client(context).get_related_videos(video_id=video_id, page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data, process_next_page=False)) pass return result
def _process_related_videos(provider, context, re_match): result = [] provider.set_content_type(context, kodion.constants.content_type.EPISODES) page_token = context.get_param('page_token', '') video_id = context.get_param('video_id', '') if video_id: json_data = provider.get_client(context).get_related_videos(video_id=video_id, page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data, process_next_page=False)) pass return result
def _process_rename_playlist(provider, context, re_match): playlist_id = context.get_param('playlist_id', '') if not playlist_id: raise kodion.KodionException('playlist/rename: missing playlist_id') current_playlist_name = context.get_param('playlist_name', '') result, text = context.get_ui().on_keyboard_input(context.localize(provider.LOCAL_MAP['youtube.rename']), default=current_playlist_name) if result and text: json_data = provider.get_client(context).rename_playlist(playlist_id=playlist_id, new_title=text) if not v3.handle_error(provider, context, json_data): return context.get_ui().refresh_container() pass pass
def _process_live_events(provider, context, re_match): def _sort(x): return x.get_aired() provider.set_content_type(context, kodion.constants.content_type.EPISODES) result = [] # TODO: cache result page_token = context.get_param('page_token', '') json_data = provider.get_client(context).get_live_events(event_type='live', page_token=page_token) if not v3.handle_error(provider, context, json_data): return False result.extend(v3.response_to_items(provider, context, json_data, sort=_sort, reverse_sort=True)) return result
def _process_remove_video(provider, context, re_match): playlist_id = context.get_param('playlist_id', '') if not playlist_id: raise kodion.KodionException('Playlist/Remove: missing playlist_id') video_id = context.get_param('video_id', '') if not video_id: raise kodion.KodionException('Playlist/Remove: missing video_id') video_name = context.get_param('video_name', '') if not video_name: raise kodion.KodionException('Playlist/Remove: missing video_name') if context.get_ui().on_remove_content(video_name): json_data = provider.get_client(context).remove_video_from_playlist( playlist_id=playlist_id, playlist_item_id=video_id) if not v3.handle_error(provider, context, json_data): return False context.get_ui().refresh_container() pass return True
def _process_remove_video(provider, context, re_match): playlist_id = context.get_param('playlist_id', '') if not playlist_id: raise kodion.KodionException('Playlist/Remove: missing playlist_id') video_id = context.get_param('video_id', '') if not video_id: raise kodion.KodionException('Playlist/Remove: missing video_id') video_name = context.get_param('video_name', '') if not video_name: raise kodion.KodionException('Playlist/Remove: missing video_name') if context.get_ui().on_remove_content(video_name): json_data = provider.get_client(context).remove_video_from_playlist(playlist_id=playlist_id, playlist_item_id=video_id) if not v3.handle_error(provider, context, json_data): return False context.get_ui().refresh_container() pass return True
def _load_videos(_page_token='', _progress_dialog=None): if not _progress_dialog: _progress_dialog = context.get_ui().create_progress_dialog( context.localize(provider.LOCAL_MAP['youtube.playlist.progress.updating']), context.localize(constants.localize.COMMON_PLEASE_WAIT), background=True) pass json_data = client.get_playlist_items(playlist_id, page_token=_page_token) if not v3.handle_error(provider, context, json_data): return False _progress_dialog.set_total(int(json_data.get('pageInfo', {}).get('totalResults', 0))) result = v3.response_to_items(provider, context, json_data, process_next_page=False) videos.extend(result) progress_text = '%s %d/%d' % ( context.localize(constants.localize.COMMON_PLEASE_WAIT), len(videos), _progress_dialog.get_total()) _progress_dialog.update(steps=len(result), text=progress_text) next_page_token = json_data.get('nextPageToken', '') if next_page_token: _load_videos(_page_token=next_page_token, _progress_dialog=_progress_dialog) pass return _progress_dialog
def play_video(provider, context, re_match): try: video_id = context.get_param('video_id') client = provider.get_client(context) try: f = open(context._get_cache_path() + '/history.json', 'r') history = json.load(f) except: history = {} if not video_id in history: f = open(context._get_cache_path() + '/history.json', 'w') stamp = datetime.now().strftime('%s') history[video_id] = stamp json.dump(history, f) video_streams = client.get_video_streams(context, video_id) if len(video_streams) == 0: message = context.localize( provider.LOCAL_MAP['youtube.error.no_video_streams_found']) context.get_ui().show_notification(message, time_milliseconds=5000) return False video_stream = kodion.utils.select_stream(context, video_streams) if video_stream is None: return False if video_stream['video'].get('rtmpe', False): message = context.localize( provider.LOCAL_MAP['youtube.error.rtmpe_not_supported']) context.get_ui().show_notification(message, time_milliseconds=5000) return False video_item = VideoItem(video_id, video_stream['url']) if video_stream.get('meta', None): video_item.set_subtitles(video_stream['meta'].get( 'subtitles', None)) video_id_dict = {video_id: video_item} utils.update_video_infos(provider, context, video_id_dict) #get related video and set to queue videos = [] json_data = client.get_related_videos(video_id) if not v3.handle_error(provider, context, json_data): return False result = v3.response_to_items(provider, context, json_data, process_next_page=False) videos.extend(result) context.log_debug('video: "%s' % videos[0].get_uri()) playlist = context.get_video_playlist() for x in videos: r = re.compile("video_id=(.*)") m = r.search(x.get_uri()) vid = m.group(1) if vid not in history: playlist.add(x) break # Trigger post play events if provider.is_logged_in(): command = 'RunPlugin(%s)' % context.create_uri( ['events', 'post_play'], {'video_id': video_id}) context.execute(command) pass return video_item except YouTubeException, ex: message = ex.get_message() message = kodion.utils.strip_html_from_text(message) context.get_ui().show_notification(message, time_milliseconds=15000) pass