303 lines
12 KiB
Python
303 lines
12 KiB
Python
# -*- 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))
|