def compile_tasks(videoid, task_handler, nfo_settings=None): """Compile a list of tasks for items based on the videoid""" common.debug('Compiling library tasks for {}', videoid) task = None try: if task_handler == export_item: metadata = api.metadata(videoid) if videoid.mediatype == common.VideoId.MOVIE: task = _create_export_movie_task(videoid, metadata[0], nfo_settings) elif videoid.mediatype in common.VideoId.TV_TYPES: task = _create_export_tv_tasks(videoid, metadata, nfo_settings) else: raise ValueError('Cannot handle {}'.format(videoid)) if task_handler == export_new_item: metadata = api.metadata(videoid, True) task = _create_new_episodes_tasks(videoid, metadata, nfo_settings) if task_handler == remove_item: if videoid.mediatype == common.VideoId.MOVIE: task = _create_remove_movie_task(videoid) if videoid.mediatype == common.VideoId.SHOW: task = _compile_remove_tvshow_tasks(videoid) if videoid.mediatype == common.VideoId.SEASON: task = _compile_remove_season_tasks(videoid) if videoid.mediatype == common.VideoId.EPISODE: task = _create_remove_episode_task(videoid) except MetadataNotAvailable: common.warn('compile_tasks: task_handler {} unavailable metadata for {} task skipped', task_handler, videoid) return [{}] if task is None: common.warn('compile_tasks: task_handler {} did not match any task for {}', task_handler, videoid) return task
def compile_tasks(videoid, task_handler, nfo_settings=None): """Compile a list of tasks for items based on the videoid""" common.debug('Compiling library tasks for {}', videoid) if task_handler == export_item: metadata = api.metadata(videoid) if videoid.mediatype == common.VideoId.MOVIE: return _create_export_movie_task(videoid, metadata[0], nfo_settings) if videoid.mediatype in common.VideoId.TV_TYPES: return _create_export_tv_tasks(videoid, metadata, nfo_settings) raise ValueError('Cannot handle {}'.format(videoid)) if task_handler == export_new_item: metadata = api.metadata(videoid, True) return _create_new_episodes_tasks(videoid, metadata, nfo_settings) if task_handler == remove_item: if videoid.mediatype == common.VideoId.MOVIE: return _create_remove_movie_task(videoid) if videoid.mediatype == common.VideoId.SHOW: return _compile_remove_tvshow_tasks(videoid) if videoid.mediatype == common.VideoId.SEASON: return _compile_remove_season_tasks(videoid) if videoid.mediatype == common.VideoId.EPISODE: return _create_remove_episode_task(videoid) common.debug( 'compile_tasks: task_handler {} did not match any task for {}', task_handler, videoid) return None
def play(videoid): """Play an episode or movie as specified by the path""" common.debug('Playing {}'.format(videoid)) metadata = api.metadata(videoid) common.debug('Metadata is {}'.format(metadata)) if not _verify_pin(metadata[0].get('requiresPin', False)): ui.show_notification(common.get_local_string(30106)) xbmcplugin.endOfDirectory(g.PLUGIN_HANDLE, succeeded=False) return list_item = get_inputstream_listitem(videoid) infos, art = infolabels.add_info_for_playback(videoid, list_item) common.debug('Sending initialization signal') common.send_signal( common.Signals.PLAYBACK_INITIATED, { 'videoid': videoid.to_dict(), 'infos': infos, 'art': art, 'timeline_markers': get_timeline_markers(metadata[0]), 'upnext_info': get_upnext_info(videoid, (infos, art), metadata) }) xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item)
def _get_root_videoid(filename, pattern): match = re.search( pattern, xbmcvfs.File(filename, 'r').read().decode('utf-8').split('\n')[-1]) metadata = api.metadata(common.VideoId(videoid=match.groups()[0]))[0] if metadata['type'] == 'show': return common.VideoId(tvshowid=metadata['id']) return common.VideoId(movieid=metadata['id'])
def play(videoid): """Play an episode or movie as specified by the path""" common.info('Playing {}', videoid) is_up_next_enabled = g.ADDON.getSettingBool('UpNextNotifier_enabled') metadata = [{}, {}] try: metadata = api.metadata(videoid) common.debug('Metadata is {}', metadata) except MetadataNotAvailable: common.warn('Metadata not available for {}', videoid) # Parental control PIN pin_result = _verify_pin(metadata[0].get('requiresPin', False)) if not pin_result: if pin_result is not None: ui.show_notification(common.get_local_string(30106), time=10000) xbmcplugin.endOfDirectory(g.PLUGIN_HANDLE, succeeded=False) return list_item = get_inputstream_listitem(videoid) infos, art = infolabels.add_info_for_playback(videoid, list_item, is_up_next_enabled) # Workaround for resuming strm files from library resume_position = infos.get('resume', {}).get('position') \ if g.IS_SKIN_CALL and g.ADDON.getSettingBool('ResumeManager_enabled') else None if resume_position: index_selected = ui.ask_for_resume( resume_position) if g.ADDON.getSettingBool( 'ResumeManager_dialog') else None if index_selected == -1: xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=False, listitem=list_item) return if index_selected == 1: resume_position = None xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item) upnext_info = get_upnext_info(videoid, (infos, art), metadata) if is_up_next_enabled else None common.debug('Sending initialization signal') common.send_signal(common.Signals.PLAYBACK_INITIATED, { 'videoid': videoid.to_dict(), 'infos': infos, 'art': art, 'timeline_markers': get_timeline_markers(metadata[0]), 'upnext_info': upnext_info, 'resume_position': resume_position }, non_blocking=True) xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item)
def compile_tasks(videoid, nfo_settings=None): """Compile a list of tasks for items based on the videoid""" common.debug('Compiling library tasks for {}'.format(videoid)) metadata = api.metadata(videoid) if videoid.mediatype == common.VideoId.MOVIE: return _create_movie_task(videoid, metadata[0], nfo_settings) elif videoid.mediatype in common.VideoId.TV_TYPES: return _create_tv_tasks(videoid, metadata, nfo_settings) raise ValueError('Cannot handle {}'.format(videoid))
def play(videoid): """Play an episode or movie as specified by the path""" common.debug('Playing {}'.format(videoid)) metadata = api.metadata(videoid) common.debug('Metadata is {}'.format(metadata)) if not _verify_pin(metadata[0].get('requiresPin', False)): ui.show_notification(common.get_local_string(30106)) xbmcplugin.endOfDirectory(g.PLUGIN_HANDLE, succeeded=False) return list_item = get_inputstream_listitem(videoid) infos, art = infolabels.add_info_for_playback(videoid, list_item) # Workaround for resuming strm files from library resume_position = infos.get('resume', {}).get('position') \ if xbmc.getInfoLabel('Container.PluginName') != g.ADDON.getAddonInfo('id') \ and g.ADDON.getSettingBool('ResumeManager_enabled') else None if resume_position: index_selected = ui.ask_for_resume( resume_position) if g.ADDON.getSettingBool( 'ResumeManager_dialog') else None if index_selected == -1: xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=False, listitem=list_item) return if index_selected == 1: resume_position = None common.debug('Sending initialization signal') common.send_signal( common.Signals.PLAYBACK_INITIATED, { 'videoid': videoid.to_dict(), 'infos': infos, 'art': art, 'timeline_markers': get_timeline_markers(metadata[0]), 'upnext_info': get_upnext_info(videoid, (infos, art), metadata), 'resume_position': resume_position }) xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item)
def play(videoid): """Play an episode or movie as specified by the path""" common.info('Playing {}', videoid) is_up_next_enabled = g.ADDON.getSettingBool('UpNextNotifier_enabled') metadata = [{}, {}] try: metadata = api.metadata(videoid) common.debug('Metadata is {}', metadata) except MetadataNotAvailable: common.warn('Metadata not available for {}', videoid) # Parental control PIN pin_result = _verify_pin(metadata[0].get('requiresPin', False)) if not pin_result: if pin_result is not None: ui.show_notification(common.get_local_string(30106), time=10000) xbmcplugin.endOfDirectory(g.PLUGIN_HANDLE, succeeded=False) return list_item = get_inputstream_listitem(videoid) infos, art = infolabels.add_info_for_playback( videoid, list_item, is_up_next_enabled, skip_set_progress_status=True) resume_position = {} event_data = {} if g.IS_SKIN_CALL: # Workaround for resuming strm files from library resume_position = infos.get('resume', {}).get('position') \ if g.ADDON.getSettingBool('ResumeManager_enabled') else None if resume_position: index_selected = ui.ask_for_resume( resume_position) if g.ADDON.getSettingBool( 'ResumeManager_dialog') else None if index_selected == -1: xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=False, listitem=list_item) return if index_selected == 1: resume_position = None elif (g.ADDON.getSettingBool('ProgressManager_enabled') and videoid.mediatype in [common.VideoId.MOVIE, common.VideoId.EPISODE]): # To now we have this limits: # - enabled only with items played inside the addon then not Kodi library, need impl. JSON-RPC lib update code event_data = _get_event_data(videoid) event_data['videoid'] = videoid.to_dict() event_data['is_played_by_library'] = g.IS_SKIN_CALL # Todo: UpNext addon is incompatible with netflix watched status sync feature # Problems: # - Need to modify the cache (to update the watched status) on every played item # - Modifying the cache after the stop, is wrong due to below problems # - The new fast play, 'play_url' method, cause problems with the Player callbacks, after press play next is missing the Stop event in the controller! # - To verify possibility problems of data mixing of controller._get_player_state() # - The call of next video from UpNext is recognized as Skin call, because it's an external addon call, so it causes several operating problems is_up_next_enabled = False if 'raspberrypi' in common.get_system_platform( ) and '18' in common.GetKodiVersion().version: # OMX Player is not compatible with netflix video streams # Only Kodi 18 has this property, on Kodi 19 Omx Player has been removed value = common.json_rpc('Settings.GetSettingValue', {'setting': 'videoplayer.useomxplayer'}) if value.get('value'): common.json_rpc('Settings.SetSettingValue', { 'setting': 'videoplayer.useomxplayer', 'value': False }) xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item) upnext_info = get_upnext_info(videoid, (infos, art), metadata) if is_up_next_enabled else None g.LOCAL_DB.set_value('last_videoid_played', videoid.to_dict(), table=TABLE_SESSION) common.debug('Sending initialization signal') common.send_signal(common.Signals.PLAYBACK_INITIATED, { 'videoid': videoid.to_dict(), 'infos': infos, 'art': art, 'timeline_markers': get_timeline_markers(metadata[0]), 'upnext_info': upnext_info, 'resume_position': resume_position, 'event_data': event_data }, non_blocking=True)
def play(videoid): """Play an episode or movie as specified by the path""" common.info('Playing {}', videoid) is_up_next_enabled = g.ADDON.getSettingBool('UpNextNotifier_enabled') metadata = [{}, {}] try: metadata = api.metadata(videoid) common.debug('Metadata is {}', metadata) except MetadataNotAvailable: common.warn('Metadata not available for {}', videoid) # Parental control PIN pin_result = _verify_pin(metadata[0].get('requiresPin', False)) if not pin_result: if pin_result is not None: ui.show_notification(common.get_local_string(30106), time=10000) xbmcplugin.endOfDirectory(g.PLUGIN_HANDLE, succeeded=False) return list_item = get_inputstream_listitem(videoid) infos, art = infolabels.add_info_for_playback(videoid, list_item, is_up_next_enabled) resume_position = {} event_data = {} if g.IS_SKIN_CALL: # Workaround for resuming strm files from library resume_position = infos.get('resume', {}).get('position') \ if g.ADDON.getSettingBool('ResumeManager_enabled') else None if resume_position: index_selected = ui.ask_for_resume( resume_position) if g.ADDON.getSettingBool( 'ResumeManager_dialog') else None if index_selected == -1: xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=False, listitem=list_item) return if index_selected == 1: resume_position = None elif (g.ADDON.getSettingBool('ProgressManager_enabled') and videoid.mediatype in [common.VideoId.MOVIE, common.VideoId.EPISODE]): # To now we have this limits: # - enabled only with items played inside the addon then not Kodi library, need impl. JSON-RPC lib update code event_data = _get_event_data(videoid) event_data['videoid'] = videoid.to_dict() event_data['is_played_by_library'] = g.IS_SKIN_CALL xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item) upnext_info = get_upnext_info(videoid, (infos, art), metadata) if is_up_next_enabled else None g.LOCAL_DB.set_value('last_videoid_played', videoid.to_dict(), table=TABLE_SESSION) common.debug('Sending initialization signal') common.send_signal(common.Signals.PLAYBACK_INITIATED, { 'videoid': videoid.to_dict(), 'infos': infos, 'art': art, 'timeline_markers': get_timeline_markers(metadata[0]), 'upnext_info': upnext_info, 'resume_position': resume_position, 'event_data': event_data }, non_blocking=True) xbmcplugin.setResolvedUrl(handle=g.PLUGIN_HANDLE, succeeded=True, listitem=list_item)