feat: show anime cover image for notifications on none windows systems

This commit is contained in:
Benex254
2024-08-05 09:47:04 +03:00
parent 3c79806a28
commit 8525d8fbfc
4 changed files with 45 additions and 12 deletions

View File

@@ -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,

View File

@@ -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")

View File

@@ -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...")

View File

@@ -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")