diff --git a/fastanime/cli/commands/anilist/__init__.py b/fastanime/cli/commands/anilist/__init__.py index 4fbae2c..6abca75 100644 --- a/fastanime/cli/commands/anilist/__init__.py +++ b/fastanime/cli/commands/anilist/__init__.py @@ -6,7 +6,7 @@ from ...utils.tools import QueryDict from .completed import completed from .dropped import dropped from .favourites import favourites -from .login import loggin +from .login import login from .notifier import notifier from .paused import paused from .planning import planning @@ -29,7 +29,7 @@ commands = { "popular": popular, "favourites": favourites, "random": random_anime, - "loggin": loggin, + "login": login, "watching": watch_list, "paused": paused, "repeating": repeating, diff --git a/fastanime/cli/commands/anilist/login.py b/fastanime/cli/commands/anilist/login.py index 556743e..e331841 100644 --- a/fastanime/cli/commands/anilist/login.py +++ b/fastanime/cli/commands/anilist/login.py @@ -2,7 +2,7 @@ import webbrowser import click from rich import print -from rich.prompt import Prompt +from rich.prompt import Confirm, Prompt from ....anilist import AniList from ...config import Config @@ -12,20 +12,23 @@ from ...utils.tools import exit_app @click.command(help="Login to your anilist account") @click.option("--status", "-s", help="Whether you are logged in or not", is_flag=True) @click.pass_obj -def loggin(config: Config, status): +def login(config: Config, status): if status: is_logged_in = True if config.user else False message = ( - "You are logged in :happy:" if is_logged_in else "You arent logged in :sad:" + "You are logged in :happy:" if is_logged_in else "You arent logged in :cry" ) print(message) print(config.user) exit_app() if config.user: print("Already logged in :confused:") - exit_app() + if not Confirm.ask("or would you like to reloggin", default=True): + exit_app() # ---- new loggin ----- - print("A browser session will be opened") + print( + f"A browser session will be opened ( [link]{config.fastanime_anilist_app_login_url}[/link] )", + ) webbrowser.open(config.fastanime_anilist_app_login_url) print("Please paste the token provided here") token = Prompt.ask("Enter token") diff --git a/fastanime/cli/commands/anilist/notifier.py b/fastanime/cli/commands/anilist/notifier.py index 053b8c4..16c1e74 100644 --- a/fastanime/cli/commands/anilist/notifier.py +++ b/fastanime/cli/commands/anilist/notifier.py @@ -4,10 +4,11 @@ import os import time import click +import requests from plyer import notification from ....anilist import AniList -from ....constants import APP_DATA_DIR, APP_NAME, ICON_PATH +from ....constants import APP_CACHE_DIR, APP_DATA_DIR, APP_NAME, PLATFORM from ..config import Config logger = logging.getLogger(__name__) @@ -18,6 +19,9 @@ logger = logging.getLogger(__name__) @click.pass_obj def notifier(config: Config): notified = os.path.join(APP_DATA_DIR, "last_notification.json") + anime_image = os.path.join(APP_CACHE_DIR, "notification_image") + notification_duration = config.notification_duration * 60 + if not config.user: print("Not Authenticated") print("Run the following to get started: fastanime anilist loggin") @@ -37,17 +41,23 @@ def notifier(config: Config): logger.info("checking for notifications") result = AniList.get_notification() if not result[0]: - logger.warning("Something went wrong", result[1]) + print(result) + logger.warning( + "Something went wrong this could mean anilist is down or you have lost internet connection" + ) + logger.info("sleeping...") + time.sleep(timeout * 60) continue data = result[1] notifications = data["data"]["Page"]["notifications"] # pyright:ignore if not notifications: logger.info("Nothing to notify") for notification_ in notifications: - title = "New episode just aired" anime_episode = notification_["episode"] + title = f"Episode {anime_episode} just aired" anime_title = notification_["media"]["title"][config.preferred_language] - message = f"{anime_title} episode {anime_episode} has just aired, be sure to watch it so you are not left out of the loop" # pyright:ignore + message = f"{anime_title}\nBe sure to watch so you are not left out of the loop." # pyright:ignore + # message = str(textwrap.wrap(message, width=50)) id = notification_["media"]["id"] if past_notifications.get(str(id)) == notification_["episode"]: @@ -56,6 +66,17 @@ def notifier(config: Config): ) else: + if PLATFORM != "Windows": + image_link = notification_["media"]["coverImage"]["medium"] + print(image_link) + logger.info("Downloading image") + + resp = requests.get(image_link) + if resp.status_code == 200: + with open(anime_image, "wb") as f: + f.write(resp.content) + ICON_PATH = anime_image + past_notifications[f"{id}"] = notification_["episode"] with open(notified, "w") as f: json.dump(past_notifications, f) @@ -65,7 +86,10 @@ def notifier(config: Config): message=message, app_name=APP_NAME, app_icon=ICON_PATH, + hints={"image-path": ICON_PATH}, + timeout=notification_duration, ) + time.sleep(30) except Exception as e: logger.error(e) logger.info("sleeping...") diff --git a/fastanime/cli/config.py b/fastanime/cli/config.py index 8736346..45c8e88 100644 --- a/fastanime/cli/config.py +++ b/fastanime/cli/config.py @@ -35,7 +35,8 @@ class Config(object): "format": "best[height<=1080]/bestvideo[height<=1080]+bestaudio/best", "provider": "allanime", "error": "3", - "icons":"false" + "icons": "false", + "notification_duration": "2", } ) self.configparser.add_section("stream") @@ -58,6 +59,7 @@ class Config(object): self.auto_next = self.get_auto_next() self.auto_select = self.get_auto_select() self.quality = self.get_quality() + self.notification_duration = self.get_notification_duration() self.error = self.get_error() self.server = self.get_server() self.format = self.get_format() @@ -112,6 +114,7 @@ class Config(object): def get_icons(self): return self.configparser.getboolean("general", "icons") + def get_preview(self): return self.configparser.getboolean("general", "preview") @@ -136,6 +139,9 @@ class Config(object): def get_quality(self): return self.configparser.getint("stream", "quality") + def get_notification_duration(self): + return self.configparser.getint("general", "notification_duration") + def get_error(self): return self.configparser.getint("stream", "error")