astrXbian/.install/.kodi/addons/plugin.video.youtube/resources/lib/youtube_plugin/kodion/impl/xbmc/xbmc_items.py

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