Files
FastAnime/fastanime/cli/service/player/service.py

68 lines
2.1 KiB
Python

import logging
from typing import Optional
from ....core.config import AppConfig
from ....core.exceptions import FastAnimeError
from ....libs.media_api.types import MediaItem
from ....libs.player.base import BasePlayer
from ....libs.player.params import PlayerParams
from ....libs.player.player import create_player
from ....libs.player.types import PlayerResult
from ....libs.provider.anime.base import BaseAnimeProvider
from ....libs.provider.anime.types import Anime
from ..registry import MediaRegistryService
logger = logging.getLogger(__name__)
class PlayerService:
app_config: AppConfig
provider: BaseAnimeProvider
player: BasePlayer
registry: Optional[MediaRegistryService] = None
local: bool = False
def __init__(
self,
app_config: AppConfig,
provider: BaseAnimeProvider,
registry: Optional[MediaRegistryService] = None,
):
self.app_config = app_config
self.provider = provider
self.registry = registry
self.player = create_player(app_config)
def play(
self,
params: PlayerParams,
anime: Optional[Anime] = None,
media_item: Optional[MediaItem] = None,
local: bool = False,
) -> PlayerResult:
self.local = local
if self.app_config.stream.use_ipc:
if anime or self.registry:
return self._play_with_ipc(params, anime, media_item)
else:
logger.warning(
f"Ipc player won't be used since Anime Object has not been given for url={params.url}"
)
return self.player.play(params)
def _play_with_ipc(
self,
params: PlayerParams,
anime: Optional[Anime] = None,
media_item: Optional[MediaItem] = None,
) -> PlayerResult:
if self.app_config.stream.player == "mpv":
from .ipc.mpv import MpvIPCPlayer
registry = self.registry if self.local else None
return MpvIPCPlayer(self.app_config.stream).play(
self.player, params, self.provider, anime, registry, media_item
)
else:
raise FastAnimeError("Not implemented")