213 lines
8.3 KiB
Python
213 lines
8.3 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.
|
|
"""
|
|
|
|
import xbmcgui
|
|
|
|
from ...items import VideoItem, AudioItem, UriItem
|
|
from ... import utils
|
|
from . import info_labels
|
|
|
|
|
|
def to_play_item(context, play_item):
|
|
context.log_debug('Converting PlayItem |%s|' % play_item.get_uri())
|
|
|
|
major_version = context.get_system_version().get_version()[0]
|
|
|
|
is_strm = str(context.get_param('strm', False)).lower() == 'true' and major_version >= 18
|
|
|
|
thumb = play_item.get_image() if play_item.get_image() else u'DefaultVideo.png'
|
|
title = play_item.get_title() if play_item.get_title() else play_item.get_name()
|
|
fanart = ''
|
|
settings = context.get_settings()
|
|
if is_strm:
|
|
list_item = xbmcgui.ListItem(offscreen=True)
|
|
elif major_version > 17:
|
|
list_item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
|
|
else:
|
|
list_item = xbmcgui.ListItem(label=utils.to_unicode(title))
|
|
|
|
if not is_strm:
|
|
list_item.setProperty('IsPlayable', 'true')
|
|
|
|
if play_item.get_fanart() and settings.show_fanart():
|
|
fanart = play_item.get_fanart()
|
|
if major_version <= 15:
|
|
list_item.setArt({'thumb': thumb, 'fanart': fanart})
|
|
list_item.setIconImage(thumb)
|
|
else:
|
|
list_item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
|
|
|
|
if not play_item.use_dash() and not settings.is_support_alternative_player_enabled() and \
|
|
play_item.get_headers() and play_item.get_uri().startswith('http'):
|
|
play_item.set_uri('|'.join([play_item.get_uri(), play_item.get_headers()]))
|
|
|
|
if settings.is_support_alternative_player_enabled() and \
|
|
settings.alternative_player_web_urls() and \
|
|
not play_item.get_license_key():
|
|
play_item.set_uri('https://www.youtube.com/watch?v={video_id}'.format(video_id=play_item.video_id))
|
|
|
|
if play_item.use_dash() and context.addon_enabled('inputstream.adaptive'):
|
|
inputstream_property = 'inputstream'
|
|
if major_version < 19:
|
|
inputstream_property += 'addon'
|
|
|
|
list_item.setContentLookup(False)
|
|
list_item.setMimeType('application/xml+dash')
|
|
list_item.setProperty(inputstream_property, 'inputstream.adaptive')
|
|
list_item.setProperty('inputstream.adaptive.manifest_type', 'mpd')
|
|
if play_item.get_headers():
|
|
list_item.setProperty('inputstream.adaptive.stream_headers', play_item.get_headers())
|
|
|
|
if play_item.get_license_key():
|
|
list_item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
|
|
list_item.setProperty('inputstream.adaptive.license_key', play_item.get_license_key())
|
|
|
|
if not is_strm:
|
|
if play_item.get_play_count() == 0:
|
|
if play_item.get_start_percent():
|
|
list_item.setProperty('StartPercent', play_item.get_start_percent())
|
|
|
|
if play_item.get_start_time():
|
|
list_item.setProperty('StartOffset', play_item.get_start_time())
|
|
|
|
if play_item.subtitles:
|
|
list_item.setSubtitles(play_item.subtitles)
|
|
|
|
_info_labels = info_labels.create_from_item(play_item)
|
|
|
|
# This should work for all versions of XBMC/KODI.
|
|
if 'duration' in _info_labels:
|
|
duration = _info_labels['duration']
|
|
del _info_labels['duration']
|
|
list_item.addStreamInfo('video', {'duration': duration})
|
|
|
|
list_item.setInfo(type='video', infoLabels=_info_labels)
|
|
return list_item
|
|
|
|
|
|
def to_video_item(context, video_item):
|
|
context.log_debug('Converting VideoItem |%s|' % video_item.get_uri())
|
|
major_version = context.get_system_version().get_version()[0]
|
|
thumb = video_item.get_image() if video_item.get_image() else u'DefaultVideo.png'
|
|
title = video_item.get_title() if video_item.get_title() else video_item.get_name()
|
|
fanart = ''
|
|
settings = context.get_settings()
|
|
if major_version > 17:
|
|
item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
|
|
else:
|
|
item = xbmcgui.ListItem(label=utils.to_unicode(title))
|
|
if video_item.get_fanart() and settings.show_fanart():
|
|
fanart = video_item.get_fanart()
|
|
if major_version <= 15:
|
|
item.setArt({'thumb': thumb, 'fanart': fanart})
|
|
item.setIconImage(thumb)
|
|
else:
|
|
item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
|
|
|
|
if video_item.get_context_menu() is not None:
|
|
item.addContextMenuItems(video_item.get_context_menu(), replaceItems=video_item.replace_context_menu())
|
|
|
|
item.setProperty('IsPlayable', 'true')
|
|
|
|
if not video_item.live:
|
|
published_at = video_item.get_aired_utc()
|
|
scheduled_start = video_item.get_scheduled_start_utc()
|
|
use_dt = scheduled_start or published_at
|
|
if use_dt:
|
|
local_dt = utils.datetime_parser.utc_to_local(use_dt)
|
|
item.setProperty('PublishedSince',
|
|
utils.to_unicode(utils.datetime_parser.datetime_to_since(context, local_dt)))
|
|
item.setProperty('PublishedLocal', str(local_dt))
|
|
else:
|
|
item.setProperty('PublishedSince', context.localize('30539'))
|
|
|
|
_info_labels = info_labels.create_from_item(video_item)
|
|
|
|
if video_item.get_play_count() == 0:
|
|
if video_item.get_start_percent():
|
|
item.setProperty('StartPercent', video_item.get_start_percent())
|
|
|
|
if video_item.get_start_time():
|
|
item.setProperty('StartOffset', video_item.get_start_time())
|
|
|
|
# This should work for all versions of XBMC/KODI.
|
|
if 'duration' in _info_labels:
|
|
duration = _info_labels['duration']
|
|
del _info_labels['duration']
|
|
item.addStreamInfo('video', {'duration': duration})
|
|
|
|
item.setInfo(type='video', infoLabels=_info_labels)
|
|
|
|
if video_item.get_channel_id(): # make channel_id property available for keymapping
|
|
item.setProperty('channel_id', video_item.get_channel_id())
|
|
|
|
if video_item.get_subscription_id(): # make subscription_id property available for keymapping
|
|
item.setProperty('subscription_id', video_item.get_subscription_id())
|
|
|
|
if video_item.get_playlist_id(): # make playlist_id property available for keymapping
|
|
item.setProperty('playlist_id', video_item.get_playlist_id())
|
|
|
|
if video_item.get_playlist_item_id(): # make playlist_item_id property available for keymapping
|
|
item.setProperty('playlist_item_id', video_item.get_playlist_item_id())
|
|
|
|
return item
|
|
|
|
|
|
def to_audio_item(context, audio_item):
|
|
context.log_debug('Converting AudioItem |%s|' % audio_item.get_uri())
|
|
major_version = context.get_system_version().get_version()[0]
|
|
thumb = audio_item.get_image() if audio_item.get_image() else u'DefaultAudio.png'
|
|
title = audio_item.get_name()
|
|
fanart = ''
|
|
settings = context.get_settings()
|
|
if major_version > 17:
|
|
item = xbmcgui.ListItem(label=utils.to_unicode(title), offscreen=True)
|
|
else:
|
|
item = xbmcgui.ListItem(label=utils.to_unicode(title))
|
|
if audio_item.get_fanart() and settings.show_fanart():
|
|
fanart = audio_item.get_fanart()
|
|
if major_version <= 15:
|
|
item.setArt({'thumb': thumb, 'fanart': fanart})
|
|
item.setIconImage(thumb)
|
|
else:
|
|
item.setArt({'icon': thumb, 'thumb': thumb, 'fanart': fanart})
|
|
|
|
if audio_item.get_context_menu() is not None:
|
|
item.addContextMenuItems(audio_item.get_context_menu(), replaceItems=audio_item.replace_context_menu())
|
|
|
|
item.setProperty('IsPlayable', 'true')
|
|
|
|
item.setInfo(type='music', infoLabels=info_labels.create_from_item(audio_item))
|
|
return item
|
|
|
|
|
|
def to_uri_item(context, base_item):
|
|
context.log_debug('Converting UriItem')
|
|
major_version = context.get_system_version().get_version()[0]
|
|
if major_version > 17:
|
|
item = xbmcgui.ListItem(path=base_item.get_uri(), offscreen=True)
|
|
else:
|
|
item = xbmcgui.ListItem(path=base_item.get_uri())
|
|
item.setProperty('IsPlayable', 'true')
|
|
return item
|
|
|
|
|
|
def to_playback_item(context, base_item):
|
|
if isinstance(base_item, UriItem):
|
|
return to_uri_item(context, base_item)
|
|
|
|
if isinstance(base_item, AudioItem):
|
|
return to_audio_item(context, base_item)
|
|
|
|
if isinstance(base_item, VideoItem):
|
|
return to_play_item(context, base_item)
|
|
|
|
return None
|