plugin.video.viervijfzes/resources/lib/modules/player.py

133 lines
5.1 KiB
Python
Raw Normal View History

2020-03-19 16:45:31 +01:00
# -*- coding: utf-8 -*-
""" Player module """
from __future__ import absolute_import, division, unicode_literals
import logging
from resources.lib import kodiutils
2020-04-20 08:59:10 +02:00
from resources.lib.modules.menu import Menu
from resources.lib.viervijfzes import CHANNELS, ResolvedStream
2020-03-19 16:45:31 +01:00
from resources.lib.viervijfzes.auth import AuthApi
from resources.lib.viervijfzes.aws.cognito_idp import AuthenticationException, InvalidLoginException
from resources.lib.viervijfzes.content import CACHE_PREVENT, ContentApi, GeoblockedException, UnavailableException
2020-03-19 16:45:31 +01:00
_LOGGER = logging.getLogger(__name__)
2020-03-19 16:45:31 +01:00
class Player:
""" Code responsible for playing media """
def __init__(self):
""" Initialise object """
2020-04-20 08:59:10 +02:00
auth = AuthApi(kodiutils.get_setting('username'), kodiutils.get_setting('password'), kodiutils.get_tokens_path())
self._api = ContentApi(auth, cache_path=kodiutils.get_cache_path())
# Workaround for Raspberry Pi 3 and older
kodiutils.set_global_setting('videoplayer.useomxplayer', True)
2020-03-19 16:45:31 +01:00
2023-09-21 09:52:57 +02:00
def live(self, channel):
""" Play the live channel.
:type channel: string
"""
2021-04-23 23:27:55 +02:00
# TODO: this doesn't work correctly, playing a live program from the PVR won't play something from the beginning
# Lookup current program
# broadcast = self._epg.get_broadcast(channel, datetime.datetime.now().isoformat())
# if broadcast and broadcast.video_url:
# self.play_from_page(broadcast.video_url)
# return
2023-09-21 09:52:57 +02:00
channel_url = CHANNELS.get(channel, {'url': channel}).get('url')
self.play_from_page(channel_url)
def play_from_page(self, path):
2020-03-19 16:45:31 +01:00
""" Play the requested item.
:type path: string
"""
2021-04-23 23:27:55 +02:00
if not path:
kodiutils.ok_dialog(message=kodiutils.localize(30712)) # The video is unavailable...
return
2020-03-19 16:45:31 +01:00
# Get episode information
episode = self._api.get_episode(path, cache=CACHE_PREVENT)
2020-04-20 08:59:10 +02:00
resolved_stream = None
2020-03-19 16:45:31 +01:00
if episode is None:
kodiutils.ok_dialog(message=kodiutils.localize(30712))
return
2020-04-20 08:59:10 +02:00
if episode.stream:
# We already have a resolved stream. Nice!
# We don't need credentials for these streams.
resolved_stream = ResolvedStream(
uuid=episode.uuid,
url=episode.stream,
)
_LOGGER.debug('Already got a resolved stream: %s', resolved_stream)
2020-03-19 16:45:31 +01:00
2020-04-20 08:59:10 +02:00
if episode.uuid:
# Lookup the stream
2023-09-21 09:52:57 +02:00
resolved_stream = self._resolve_stream(episode.uuid, episode.content_type)
_LOGGER.debug('Resolved stream: %s', resolved_stream)
2020-04-20 08:59:10 +02:00
if resolved_stream:
titleitem = Menu.generate_titleitem(episode)
kodiutils.play(resolved_stream.url,
resolved_stream.stream_type,
2023-07-21 22:16:07 +02:00
resolved_stream.license_key,
info_dict=titleitem.info_dict,
art_dict=titleitem.art_dict,
prop_dict=titleitem.prop_dict)
2020-04-20 08:59:10 +02:00
2023-09-21 09:52:57 +02:00
def play(self, uuid, content_type):
2020-03-19 16:45:31 +01:00
""" Play the requested item.
2020-04-20 08:59:10 +02:00
:type uuid: string
2023-09-21 09:52:57 +02:00
:type content_type: string
2020-03-19 16:45:31 +01:00
"""
2021-04-23 23:27:55 +02:00
if not uuid:
kodiutils.ok_dialog(message=kodiutils.localize(30712)) # The video is unavailable...
return
2020-04-20 08:59:10 +02:00
# Lookup the stream
2023-09-21 09:52:57 +02:00
resolved_stream = self._resolve_stream(uuid, content_type)
2023-07-21 22:16:07 +02:00
kodiutils.play(resolved_stream.url, resolved_stream.stream_type, resolved_stream.license_key)
2020-03-25 07:50:45 +01:00
2020-04-20 08:59:10 +02:00
@staticmethod
2023-09-21 09:52:57 +02:00
def _resolve_stream(uuid, content_type):
2020-04-20 08:59:10 +02:00
""" Resolve the stream for the requested item
:type uuid: string
2023-09-21 09:52:57 +02:00
:type content_type: string
2020-04-20 08:59:10 +02:00
"""
2020-03-19 16:45:31 +01:00
try:
2020-03-21 20:34:07 +01:00
# Check if we have credentials
if not kodiutils.get_setting('username') or not kodiutils.get_setting('password'):
2020-03-22 10:30:23 +01:00
confirm = kodiutils.yesno_dialog(
message=kodiutils.localize(30701)) # To watch a video, you need to enter your credentials. Do you want to enter them now?
2020-03-21 20:34:07 +01:00
if confirm:
kodiutils.open_settings()
kodiutils.end_of_directory()
2020-04-20 08:59:10 +02:00
return None
2020-03-21 20:34:07 +01:00
# Fetch an auth token now
2020-03-22 10:30:23 +01:00
try:
auth = AuthApi(kodiutils.get_setting('username'), kodiutils.get_setting('password'), kodiutils.get_tokens_path())
# Get stream information
2023-09-21 09:52:57 +02:00
resolved_stream = ContentApi(auth).get_stream_by_uuid(uuid, content_type)
2020-04-20 08:59:10 +02:00
return resolved_stream
2020-03-22 10:30:23 +01:00
except (InvalidLoginException, AuthenticationException) as ex:
2020-11-28 17:13:21 +01:00
_LOGGER.exception(ex)
kodiutils.ok_dialog(message=kodiutils.localize(30702, error=str(ex)))
2020-03-22 10:30:23 +01:00
kodiutils.end_of_directory()
2020-04-20 08:59:10 +02:00
return None
2020-03-21 20:34:07 +01:00
2020-03-19 16:45:31 +01:00
except GeoblockedException:
2021-04-23 23:27:55 +02:00
kodiutils.ok_dialog(message=kodiutils.localize(30710)) # This video is geo-blocked...
2020-04-20 08:59:10 +02:00
return None
2020-03-19 16:45:31 +01:00
except UnavailableException:
2021-04-23 23:27:55 +02:00
kodiutils.ok_dialog(message=kodiutils.localize(30712)) # The video is unavailable...
2020-04-20 08:59:10 +02:00
return None