diff --git a/akibabot/main.py b/akibabot/main.py index 7dd2a5b..631621c 100644 --- a/akibabot/main.py +++ b/akibabot/main.py @@ -24,6 +24,9 @@ class Show: # The release year of the show. year: int + # The season number, if specified + season: int | None + # The base URL of the show. url: str @@ -33,8 +36,21 @@ def build_show_dir_name(name: str, year: int) -> str: return f"{name} ({year})" +def build_episodes_path( + name: str, year: int, season: int | None, storage_path: Path +) -> Path: + show_path = storage_path / build_show_dir_name(name, year) + + if season is not None: + return show_path / f"Season {season}" + return show_path + + def get_episode_numbers( - show_name: str, show_year: int, storage_path: Path + show_name: str, + show_year: int, + show_season: int | None, + storage_path: Path, ) -> list[int]: """Computes the episode numbers that are locally available. @@ -42,7 +58,7 @@ def get_episode_numbers( @show_year: The release year of the show. @storage_path: Path to where the show directories are. """ - episodes_path = storage_path / build_show_dir_name(show_name, show_year) + episodes_path = build_episodes_path(show_name, show_year, show_season, storage_path) if not episodes_path.exists(): return [] @@ -79,10 +95,15 @@ def main(): storage_path = Path(config["general"]["path"]) shows: list[Show] = [] for show in config["shows"]: - logging.info(f"Processing {show['name']}...") + logging.info("Processing %s", show["name"]) max_episodes = show["max_episodes"] - local_episodes = get_episode_numbers(show["name"], show["year"], storage_path) - logging.debug(f"=> {max(local_episodes)}/{max_episodes}") + local_episodes = get_episode_numbers( + show["name"], + show["year"], + show.get("season", None), + storage_path, + ) + logging.debug("=> %d/%d", max(local_episodes), max_episodes) if len(set(local_episodes)) != max_episodes: shows.append( Show( @@ -90,6 +111,7 @@ def main(): name=show["name"], year=show["year"], url=show["url"], + season=show.get("season", None), ), ) @@ -102,7 +124,7 @@ def main(): cookies = {} cookies_path = Path(config["general"]["cookie_path"]) if cookies_path.exists(): - with open(cookies_path, "r") as f: + with open(cookies_path, "r", encoding="utf8") as f: cookies = json.load(f) # Request a new session, if required @@ -112,14 +134,19 @@ def main(): config["user"]["email"], config["user"]["password"], ) - with open(cookies_path, "w") as f: + with open(cookies_path, "w", encoding="utf8") as f: f.write(json.dumps(cookies)) logging.info("Done") # Iterate over the shows to process and download the new episodes for show in shows: logging.debug("Processing %s", show.name) - episodes_path = storage_path / build_show_dir_name(show.name, show.year) + episodes_path = build_episodes_path( + show.name, + show.year, + show.season, + storage_path, + ) if not episodes_path.exists(): logging.info( "Episodes directory of %s does not exist. Creating...", show.name @@ -135,7 +162,7 @@ def main(): for episode in episodes_remote: if episode.episode_nr in episodes_to_download: - logging.info(f"Downloading {episode.name} ({episode.episode_nr})...") + logging.info("Downloading %s (%d)", episode.name, episode.episode_nr) downloads = episode.get_downloads( cookies=cookies, filter_quality=akibapass_downloader.episode.Quality.UHD_1440P, diff --git a/akibabot/xmpp.py b/akibabot/xmpp.py index 8e1700c..f553b9d 100644 --- a/akibabot/xmpp.py +++ b/akibabot/xmpp.py @@ -17,8 +17,5 @@ async def send_notification( to=aioxmpp.JID.fromstr(to), type_=aioxmpp.MessageType.CHAT, ) - msg.body[None] = "Episode {} of {} is now downloaded and available!".format( - episode, - show_name, - ) + msg.body[None] = f"Episode {episode} of {show_name} is now downloaded and available!" await stream.send(msg)