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
|
2020-11-04 12:48:33 +01:00
|
|
|
from resources.lib.viervijfzes import CHANNELS, ResolvedStream
|
2020-03-19 16:45:31 +01:00
|
|
|
from resources.lib.viervijfzes.auth import AuthApi
|
2021-02-09 20:54:40 +01:00
|
|
|
from resources.lib.viervijfzes.aws.cognito_idp import AuthenticationException, InvalidLoginException
|
2021-03-22 13:40:26 +01:00
|
|
|
from resources.lib.viervijfzes.content import CACHE_PREVENT, ContentApi, GeoblockedException, UnavailableException
|
2020-03-19 16:45:31 +01:00
|
|
|
|
2020-10-26 10:25:57 +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
|
|
|
|
2020-05-25 20:41:38 +02:00
|
|
|
@staticmethod
|
|
|
|
def live(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
|
|
|
|
|
2020-05-25 20:41:38 +02:00
|
|
|
channel_name = CHANNELS.get(channel, dict(name=channel))
|
|
|
|
kodiutils.ok_dialog(message=kodiutils.localize(30718, channel=channel_name.get('name'))) # There is no live stream available for {channel}.
|
|
|
|
kodiutils.end_of_directory()
|
|
|
|
|
2021-02-01 08:53:13 +01:00
|
|
|
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
|
2021-03-22 13:40:26 +01:00
|
|
|
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
|
|
|
|
2020-05-25 20:41:38 +02: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.
|
2020-11-04 12:48:33 +01:00
|
|
|
resolved_stream = ResolvedStream(
|
|
|
|
uuid=episode.uuid,
|
|
|
|
url=episode.stream,
|
|
|
|
)
|
2020-05-11 14:12:13 +02:00
|
|
|
_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-01-16 17:59:29 +01:00
|
|
|
resolved_stream = self._resolve_stream(episode.uuid, episode.islongform)
|
2020-05-11 14:12:13 +02:00
|
|
|
_LOGGER.debug('Resolved stream: %s', resolved_stream)
|
2020-04-20 08:59:10 +02:00
|
|
|
|
|
|
|
if resolved_stream:
|
|
|
|
titleitem = Menu.generate_titleitem(episode)
|
2020-11-04 12:48:33 +01:00
|
|
|
kodiutils.play(resolved_stream.url,
|
|
|
|
resolved_stream.stream_type,
|
2023-07-21 22:16:07 +02:00
|
|
|
resolved_stream.license_key,
|
2020-11-04 12:48:33 +01:00
|
|
|
info_dict=titleitem.info_dict,
|
|
|
|
art_dict=titleitem.art_dict,
|
|
|
|
prop_dict=titleitem.prop_dict)
|
2020-04-20 08:59:10 +02:00
|
|
|
|
2023-01-16 17:59:29 +01:00
|
|
|
def play(self, uuid, islongform):
|
2020-03-19 16:45:31 +01:00
|
|
|
""" Play the requested item.
|
2020-04-20 08:59:10 +02:00
|
|
|
:type uuid: string
|
2023-01-16 17:59:29 +01:00
|
|
|
:type islongform: bool
|
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-01-16 17:59:29 +01:00
|
|
|
resolved_stream = self._resolve_stream(uuid, islongform)
|
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-01-16 17:59:29 +01:00
|
|
|
def _resolve_stream(uuid, islongform):
|
2020-04-20 08:59:10 +02:00
|
|
|
""" Resolve the stream for the requested item
|
|
|
|
:type uuid: string
|
2023-01-16 17:59:29 +01:00
|
|
|
:type islongform: bool
|
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:
|
2020-04-01 11:01:22 +02:00
|
|
|
auth = AuthApi(kodiutils.get_setting('username'), kodiutils.get_setting('password'), kodiutils.get_tokens_path())
|
2020-03-22 15:37:15 +01:00
|
|
|
|
|
|
|
# Get stream information
|
2023-01-16 17:59:29 +01:00
|
|
|
resolved_stream = ContentApi(auth).get_stream_by_uuid(uuid, islongform)
|
2020-04-20 08:59:10 +02:00
|
|
|
return resolved_stream
|
2020-03-22 15:37:15 +01:00
|
|
|
|
2020-03-22 10:30:23 +01:00
|
|
|
except (InvalidLoginException, AuthenticationException) as ex:
|
2020-11-28 17:13:21 +01:00
|
|
|
_LOGGER.exception(ex)
|
2020-03-22 15:37:15 +01:00
|
|
|
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
|