astrXbian/.install/.kodi/addons/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_playlist.py

303 lines
12 KiB
Python
Raw Normal View History

2020-12-17 21:52:17 +01:00
# -*- coding: utf-8 -*-
"""
Copyright (C) 2014-2016 bromix (plugin.video.youtube)
Copyright (C) 2016-2018 plugin.video.youtube
SPDX-License-Identifier: GPL-2.0-only
See LICENSES/GPL-2.0-only for more information.
"""
from ...kodion.utils.function_cache import FunctionCache
from ... import kodion
from ...youtube.helper import v3
def _process_add_video(provider, context, keymap_action=False):
listitem_path = context.get_ui().get_info_label('Container.ListItem(0).FileNameAndPath')
client = provider.get_client(context)
watch_later_id = context.get_access_manager().get_watch_later_id()
playlist_id = context.get_param('playlist_id', '')
if not playlist_id:
raise kodion.KodionException('Playlist/Add: missing playlist_id')
if playlist_id.lower() == 'watch_later':
playlist_id = watch_later_id
video_id = context.get_param('video_id', '')
if not video_id:
if context.is_plugin_path(listitem_path, 'play'):
video_id = kodion.utils.find_video_id(listitem_path)
keymap_action = True
if not video_id:
raise kodion.KodionException('Playlist/Add: missing video_id')
if playlist_id != 'HL':
json_data = client.add_video_to_playlist(playlist_id=playlist_id, video_id=video_id)
if not v3.handle_error(provider, context, json_data):
return False
if playlist_id == watch_later_id:
notify_message = context.localize(provider.LOCAL_MAP['youtube.added.to.watch.later'])
else:
notify_message = context.localize(provider.LOCAL_MAP['youtube.added.to.playlist'])
context.get_ui().show_notification(
message=notify_message,
time_milliseconds=2500,
audible=False
)
if keymap_action:
context.get_ui().set_focus_next_item()
return True
else:
context.log_debug('Cannot add to playlist id |%s|' % playlist_id)
return False
def _process_remove_video(provider, context):
listitem_playlist_id = context.get_ui().get_info_label('Container.ListItem(0).Property(playlist_id)')
listitem_playlist_item_id = context.get_ui().get_info_label('Container.ListItem(0).Property(playlist_item_id)')
listitem_title = context.get_ui().get_info_label('Container.ListItem(0).Title')
keymap_action = False
playlist_id = context.get_param('playlist_id', '')
video_id = context.get_param('video_id', '')
video_name = context.get_param('video_name', '')
if not playlist_id and not video_id: # keymap support
if listitem_playlist_id and listitem_playlist_id.startswith('PL') \
and listitem_playlist_item_id and listitem_playlist_item_id.startswith('UE'):
playlist_id = listitem_playlist_id
video_id = listitem_playlist_item_id
keymap_action = True
if not playlist_id:
raise kodion.KodionException('Playlist/Remove: missing playlist_id')
if not video_id:
raise kodion.KodionException('Playlist/Remove: missing video_id')
if not video_name:
if listitem_title:
video_name = listitem_title
else:
raise kodion.KodionException('Playlist/Remove: missing video_name')
if playlist_id != 'HL' and playlist_id.strip().lower() != 'wl':
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()
context.get_ui().show_notification(
message=context.localize(provider.LOCAL_MAP['youtube.removed.from.playlist']),
time_milliseconds=2500,
audible=False
)
if keymap_action:
context.get_ui().set_focus_next_item()
return True
else:
context.log_debug('Cannot remove from playlist id |%s|' % playlist_id)
return False
def _process_remove_playlist(provider, context):
playlist_id = context.get_param('playlist_id', '')
if not playlist_id:
raise kodion.KodionException('Playlist/Remove: missing playlist_id')
playlist_name = context.get_param('playlist_name', '')
if not playlist_name:
raise kodion.KodionException('Playlist/Remove: missing playlist_name')
if context.get_ui().on_delete_content(playlist_name):
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_select_playlist(provider, context):
listitem_path = context.get_ui().get_info_label('Container.ListItem(0).FileNameAndPath') # do this asap, relies on listitems focus
keymap_action = False
ui = context.get_ui()
page_token = ''
current_page = 0
video_id = context.get_param('video_id', '')
if not video_id:
if context.is_plugin_path(listitem_path, 'play'):
video_id = kodion.utils.find_video_id(listitem_path)
if video_id:
context.set_param('video_id', video_id)
keymap_action = True
if not video_id:
raise kodion.KodionException('Playlist/Select: missing video_id')
while True:
current_page += 1
if not page_token:
json_data = context.get_function_cache().get((FunctionCache.ONE_MINUTE // 3),
provider.get_client(context).get_playlists_of_channel,
channel_id='mine')
else:
json_data = context.get_function_cache().get((FunctionCache.ONE_MINUTE // 3),
provider.get_client(context).get_playlists_of_channel,
channel_id='mine', page_token=page_token)
playlists = json_data.get('items', [])
page_token = json_data.get('nextPageToken', False)
items = []
if current_page == 1:
# create playlist
items.append((ui.bold(context.localize(provider.LOCAL_MAP['youtube.playlist.create'])), '',
'playlist.create', context.create_resource_path('media', 'playlist.png')))
# 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 = context.get_access_manager().get_watch_later_id()
items.append((ui.bold(context.localize(provider.LOCAL_MAP['youtube.watch_later'])), '',
watch_later_playlist_id, context.create_resource_path('media', 'watch_later.png')))
for playlist in playlists:
snippet = playlist.get('snippet', {})
title = snippet.get('title', '')
description = snippet.get('description', '')
thumbnail = snippet.get('thumbnails', {}).get('default', {}).get('url', context.create_resource_path('media', 'playlist.png'))
playlist_id = playlist.get('id', '')
if title and playlist_id:
items.append((title, description, playlist_id, thumbnail))
if page_token:
items.append((ui.bold(context.localize(provider.LOCAL_MAP['youtube.next_page'])).replace('%d', str(current_page + 1)), '',
'playlist.next', 'DefaultFolder.png'))
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):
break
playlist_id = json_data.get('id', '')
if playlist_id:
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, keymap_action)
break
elif result == 'playlist.next':
continue
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, keymap_action)
break
else:
break
def _process_rename_playlist(provider, context):
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()
def _watchlater_playlist_id_change(context, method):
playlist_id = context.get_param('playlist_id', '')
if not playlist_id:
raise kodion.KodionException('watchlater_list/%s: missing playlist_id' % method)
playlist_name = context.get_param('playlist_name', '')
if not playlist_name:
raise kodion.KodionException('watchlater_list/%s: missing playlist_name' % method)
if method == 'set':
if context.get_ui().on_yes_no_input(context.get_name(), context.localize(30570) % playlist_name):
context.get_access_manager().set_watch_later_id(playlist_id)
else:
return
elif method == 'remove':
if context.get_ui().on_yes_no_input(context.get_name(), context.localize(30569) % playlist_name):
context.get_access_manager().set_watch_later_id(' WL')
else:
return
else:
return
context.get_ui().refresh_container()
def _history_playlist_id_change(context, method):
playlist_id = context.get_param('playlist_id', '')
if not playlist_id:
raise kodion.KodionException('history_list/%s: missing playlist_id' % method)
playlist_name = context.get_param('playlist_name', '')
if not playlist_name:
raise kodion.KodionException('history_list/%s: missing playlist_name' % method)
if method == 'set':
if context.get_ui().on_yes_no_input(context.get_name(), context.localize(30574) % playlist_name):
context.get_access_manager().set_watch_history_id(playlist_id)
else:
return
elif method == 'remove':
if context.get_ui().on_yes_no_input(context.get_name(), context.localize(30573) % playlist_name):
context.get_access_manager().set_watch_history_id('HL')
else:
return
else:
return
context.get_ui().refresh_container()
def process(method, category, provider, context):
if method == 'add' and category == 'video':
return _process_add_video(provider, context)
elif method == 'remove' and category == 'video':
return _process_remove_video(provider, context)
elif method == 'remove' and category == 'playlist':
return _process_remove_playlist(provider, context)
elif method == 'select' and category == 'playlist':
return _process_select_playlist(provider, context)
elif method == 'rename' and category == 'playlist':
return _process_rename_playlist(provider, context)
elif (method == 'set' or method == 'remove') and category == 'watchlater':
return _watchlater_playlist_id_change(context, method)
elif (method == 'set' or method == 'remove') and category == 'history':
return _history_playlist_id_change(context, method)
else:
raise kodion.KodionException("Unknown category '%s' or method '%s'" % (category, method))