Skip to content

Commit

Permalink
Merge pull request #289 from mov-cli/v4.3
Browse files Browse the repository at this point in the history
V4.3
  • Loading branch information
THEGOLDENPRO committed Apr 9, 2024
2 parents 94a06f1 + ece6566 commit 0632aad
Show file tree
Hide file tree
Showing 18 changed files with 311 additions and 202 deletions.
2 changes: 1 addition & 1 deletion mov_cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
from .scraper import *
from .download import *

__version__ = "4.2.13"
__version__ = "4.3.0"
42 changes: 28 additions & 14 deletions mov_cli/cli/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@

from .play import play
from .search import search
from .ui import welcome_msg
from .episode import handle_episode
from .scraper import select_scraper, use_scraper, scrape
from .plugins import show_all_plugins
from .scraper import select_scraper, use_scraper, scrape, steal_scraper_args
from .configuration import open_config_file, set_cli_config
from .utils import welcome_msg, steal_scraper_args

from ..config import Config
from ..download import Download
Expand All @@ -37,7 +38,8 @@ def mov_cli(

version: bool = typer.Option(False, "--version", help = "Display what version mov-cli is currently on."),
edit: bool = typer.Option(False, "--edit", "-e", help = "Opens the mov-cli config with your respective editor."),
download: bool = typer.Option(False, "--download", "-d", help = "Downloads the media instead of playing.")
download: bool = typer.Option(False, "--download", "-d", help = "Downloads the media instead of playing."),
list_plugins: bool = typer.Option(False, "--list-plugins", "-lp", help = "Prints all configured plugins and their scrapers."),
):
config = Config()

Expand All @@ -52,26 +54,37 @@ def mov_cli(
if config.debug:
mov_cli_logger.setLevel(logging.DEBUG)

print(
welcome_msg(True if query is None else False, version)
)

mov_cli_logger.debug(f"Config -> {config.data}")

if edit is True:
if edit:
open_config_file(config)
return None

plugins = config.plugins

if list_plugins:
show_all_plugins(plugins)
return None

welcome_message = welcome_msg(
plugins = plugins,
check_for_updates = True if query is None and config.skip_update_checker is False else False,
display_hint = True if query is None else False,
display_version = version
)

print(welcome_message)

if query is not None:
scrape_args = steal_scraper_args(query)
scrape_options = steal_scraper_args(query)
# This allows passing arguments to scrapers like this:
# https://github.com/mov-cli/mov-cli-youtube/commit/b538d82745a743cd74a02530d6a3d476cd60b808#diff-4e5b064838aa74a5375265f4dfbd94024b655ee24a191290aacd3673abed921a

query: str = " ".join(query)

http_client = HTTPClient(config)

selected_scraper = select_scraper(config.plugins, config.fzf_enabled, config.default_scraper)
selected_scraper = select_scraper(plugins, config.fzf_enabled, config.default_scraper)

if selected_scraper is None:
mov_cli_logger.error(
Expand All @@ -80,7 +93,7 @@ def mov_cli(
)
return False

chosen_scraper = use_scraper(selected_scraper, config, http_client)
chosen_scraper = use_scraper(selected_scraper, config, http_client, scrape_options)

choice = search(query, auto_select, chosen_scraper, config.fzf_enabled)

Expand All @@ -99,7 +112,7 @@ def mov_cli(
mov_cli_logger.error("You didn't select a season/episode.")
return False

media = scrape(choice, chosen_episode, chosen_scraper, **scrape_args)
media = scrape(choice, chosen_episode, chosen_scraper)

if media.url is None:
mov_cli_logger.error(
Expand All @@ -116,7 +129,7 @@ def mov_cli(
popen.wait()

else:
option = play(media, choice, chosen_scraper, chosen_episode, config, scrape_args)
option = play(media, choice, chosen_scraper, chosen_episode, config)

if option == "search":
query = input(Colours.BLUE.apply(" Enter Query: "))
Expand All @@ -132,7 +145,8 @@ def mov_cli(

version = False,
edit = False,
download = False
download = False,
list_plugins = False
)

def app():
Expand Down
4 changes: 0 additions & 4 deletions mov_cli/cli/auto_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@

T = TypeVar("T")

__all__ = (
"auto_select_choice",
)

def auto_select_choice(choices: Iterable[T], auto_select: int) -> Optional[T]:

if auto_select == 0:
Expand Down
5 changes: 0 additions & 5 deletions mov_cli/cli/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,6 @@
from .. import utils
from ..logger import mov_cli_logger

__all__ = (
"set_cli_config",
"open_config_file"
)

def set_cli_config(config: Config, **kwargs: Optional[Any]) -> Config:
debug = kwargs.get("debug")
player = kwargs.get("player")
Expand Down
4 changes: 0 additions & 4 deletions mov_cli/cli/episode.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,6 @@
from ..utils import EpisodeSelector
from ..logger import mov_cli_logger

__all__ = (
"handle_episode",
)

def handle_episode(episode_string: Optional[str], scraper: Scraper, choice: Metadata, fzf_enabled: bool) -> Optional[EpisodeSelector]:
if choice.type == MetadataType.MOVIE:
return EpisodeSelector()
Expand Down
16 changes: 6 additions & 10 deletions mov_cli/cli/play.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from typing import Optional, Literal, Dict
from typing import Optional, Literal

from ..config import Config
from ..scraper import Scraper
Expand All @@ -19,11 +19,7 @@
from ..utils import what_platform
from ..logger import mov_cli_logger

__all__ = (
"play",
)

def play(media: Media, metadata: Metadata, scraper: Scraper, episode: EpisodeSelector, config: Config, scrape_args: Dict[str, bool]) -> Optional[Literal["search"]]:
def play(media: Media, metadata: Metadata, scraper: Scraper, episode: EpisodeSelector, config: Config) -> Optional[Literal["search"]]:
platform = what_platform()

chosen_player = config.player
Expand Down Expand Up @@ -70,9 +66,9 @@ def play(media: Media, metadata: Metadata, scraper: Scraper, episode: EpisodeSel
mov_cli_logger.info("No more episodes :(")
return None

media = scrape(metadata, episode, scraper, **scrape_args)
media = scrape(metadata, episode, scraper)

return play(media, metadata, scraper, episode, config, scrape_args)
return play(media, metadata, scraper, episode, config)

elif option == "select":
popen.kill()
Expand All @@ -82,9 +78,9 @@ def play(media: Media, metadata: Metadata, scraper: Scraper, episode: EpisodeSel
if episode is None:
return None

media = scrape(metadata, episode, scraper, **scrape_args)
media = scrape(metadata, episode, scraper)

return play(media, metadata, scraper, episode, config, scrape_args)
return play(media, metadata, scraper, episode, config)

popen.wait()

Expand Down
59 changes: 59 additions & 0 deletions mov_cli/cli/plugins.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from __future__ import annotations
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from typing import Tuple, List, Dict, NoReturn

from ..plugins import PluginHookData

from devgoldyutils import Colours

from ..plugins import load_plugin
from ..logger import mov_cli_logger

def get_plugins_data(plugins: Dict[str, str]) -> List[Tuple[str, str, PluginHookData]]:
plugins_data: List[Tuple[str, str, PluginHookData]] = []

for plugin_namespace, plugin_module_name in plugins.items():
plugin = load_plugin(plugin_module_name)

if plugin is None:
continue

plugin_data, _ = plugin

if plugin_data is None:
continue

plugins_data.append(
(plugin_namespace, plugin_module_name, plugin_data)
)

return plugins_data

def show_all_plugins(plugins: Dict[str, str]) -> None:

for plugin_namespace, plugin_module_name, plugin_hook_data in get_plugins_data(plugins):
# TODO: Have 'get_plugins_data' return plugin module so we shouldn't have to load the plugin twice.
plugin = load_plugin(plugin_module_name)

if plugin is not None:
plugin_module = plugin[1]

plugin_version = getattr(plugin_module, "__version__", "N/A")

print(f"- {Colours.PURPLE.apply(plugin_module_name)} ({plugin_namespace}) [{Colours.BLUE.apply(plugin_version)}]")

for scraper_name in plugin_hook_data["scrapers"]:
if scraper_name == "DEFAULT":
continue

print(f" - {Colours.PINK_GREY.apply(scraper_name)}")

def handle_internal_plugin_error(e: Exception) -> NoReturn:
mov_cli_logger.critical(
"An error occurred inside a plugin. This is MOST LIKELY not a mov-cli error, " \
f"make SURE mov-cli and your plugins are up to date. Also report this to the plugin, not mov-cli! \nError: {e}"
)

raise e
51 changes: 21 additions & 30 deletions mov_cli/cli/scraper.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,38 @@
from ..http_client import HTTPClient
from ..utils.episode_selector import EpisodeSelector

from ..scraper import Scraper
from ..plugins import PluginHookData
from ..scraper import Scraper, ScraperOptionsT

from devgoldyutils import Colours

from .ui import prompt
from .utils import handle_internal_plugin_error
from .plugins import get_plugins_data, handle_internal_plugin_error

from ..plugins import load_plugin
from ..logger import mov_cli_logger

__all__ = (
"scrape",
"use_scraper",
"select_scraper",
)

def scrape(choice: Metadata, episode: EpisodeSelector, scraper: Scraper, **kwargs) -> Media:
def scrape(choice: Metadata, episode: EpisodeSelector, scraper: Scraper) -> Media:
mov_cli_logger.info(f"Scrapping media for '{Colours.CLAY.apply(choice.title)}'...")

try:
media = scraper.scrape(choice, episode, **kwargs)
media = scraper.scrape(choice, episode)
except Exception as e:
handle_internal_plugin_error(e)

return media

def use_scraper(
selected_scraper: Optional[Tuple[str, Type[Scraper]]],
selected_scraper: Tuple[str, Type[Scraper]],
config: Config,
http_client: HTTPClient
http_client: HTTPClient,
scraper_options: ScraperOptionsT
) -> Scraper:
scraper_name, scraper_class = selected_scraper

mov_cli_logger.info(f"Using '{Colours.BLUE.apply(scraper_name)}' scraper...")

try:
chosen_scraper = scraper_class(config, http_client)
chosen_scraper = scraper_class(config, http_client, scraper_options)
except Exception as e:
handle_internal_plugin_error(e)

Expand Down Expand Up @@ -95,6 +89,18 @@ def select_scraper(plugins: Dict[str, str], fzf_enabled: bool, default_scraper:

return None

def steal_scraper_args(query: List[str]) -> ScraperOptionsT:
scrape_arguments = [x for x in query if "--" in x]

mov_cli_logger.debug(f"Scraper args picked up on --> {scrape_arguments}")

for scrape_arg in scrape_arguments:
query.remove(scrape_arg)

return dict(
[(x.replace("--", "").replace("-", "_"), True) for x in scrape_arguments]
)

def get_scraper(scraper_id: str, plugins_data: List[Tuple[str, str, PluginHookData]]) -> Tuple[str, Type[Scraper] | Tuple[None, List[str]]]:
available_scrapers = []

Expand All @@ -112,19 +118,4 @@ def get_scraper(scraper_id: str, plugins_data: List[Tuple[str, str, PluginHookDa
if scraper_id.lower() == id:
return id, scraper

return None, available_scrapers

def get_plugins_data(plugins: Dict[str, str]) -> List[Tuple[str, str, PluginHookData]]:
plugins_data: List[Tuple[str, str, PluginHookData]] = []

for plugin_namespace, plugin_module_name in plugins.items():
plugin_data = load_plugin(plugin_module_name)

if plugin_data is None:
continue

plugins_data.append(
(plugin_namespace, plugin_module_name, plugin_data)
)

return plugins_data
return None, available_scrapers
6 changes: 1 addition & 5 deletions mov_cli/cli/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,11 @@

from .ui import prompt
from .auto_select import auto_select_choice
from .utils import handle_internal_plugin_error
from .plugins import handle_internal_plugin_error

from ..media import MetadataType
from ..logger import mov_cli_logger

__all__ = (
"search",
)

def search(query: str, auto_select: Optional[int], scraper: Scraper, fzf_enabled: bool) -> Optional[Metadata]:
choice = None

Expand Down

0 comments on commit 0632aad

Please sign in to comment.