from collections import defaultdict import feedparser import json import re import subprocess import argparse from notifypy import Notify import os import sys from rich.console import Console from rich.table import Table feedparser.USER_AGENT = "anime-rss/1.0" # ANSI escape sequence coloring CSI = "\x1B[" BOLD = CSI + "1;49m" RESET = CSI + "0;0m" RED = CSI + "91;49m" GREEN = CSI + "92;49m" BOLD_RED = BOLD + RED BOLD_GREEN = BOLD + GREEN UNDERLINE = CSI + "4;4m" parser = argparse.ArgumentParser() parser.add_argument("-c", help="path to the config.json file", type=str, default="config.json", nargs='?') parser.add_argument("-a", help="path to the animes.json file", type=str, default="animes.json", nargs='?') parser.add_argument("-t", help="print a tabular calendar view and exit", action="store_true") args = parser.parse_args() def build_target_folder(): if config["dirPerAnime"]: return config["animeDownloadDir"] + "/" + anime["Title"].replace(" ", "_") else: return config["animeDownloadDir"] def send_notification(message): if config["notifications"]: notification = Notify() notification.title = "anime-rss" notification.message = message notification.icon = os.path.dirname(os.path.realpath(__file__)) + "/notfication-icon.png" notification.send() with open(args.a, "r") as feeds: feeds = json.load(feeds) if args.t: table = Table(title="Animes") table.add_column("Monday") table.add_column("Tuesday") table.add_column("Wednesday") table.add_column("Thursday") table.add_column("Friday") table.add_column("Saturday") table.add_column("Sunday") buckets = defaultdict(list) for feed in feeds["Feeds"]: for anime in feed["Animes"]: day = anime["Airing"].lower() buckets[day].append(anime["Title"]) while buckets.items(): monday = "" tuesday = "" wednesday = "" thursday = "" friday = "" saturday = "" sunday = "" if len(buckets["monday"]) > 0: monday = buckets["monday"].pop(len(buckets["monday"]) - 1) else: buckets.pop("monday") if len(buckets["tuesday"]) > 0: tuesday = buckets["tuesday"].pop(len(buckets["tuesday"]) - 1) else: buckets.pop("tuesday") if len(buckets["wednesday"]) > 0: wednesday = buckets["wednesday"].pop(len(buckets["wednesday"]) - 1) else: buckets.pop("wednesday") if len(buckets["thursday"]) > 0: thursday = buckets["thursday"].pop(len(buckets["thursday"]) - 1) else: buckets.pop("thursday") if len(buckets["friday"]) > 0: friday = buckets["friday"].pop(len(buckets["friday"]) - 1) else: buckets.pop("friday") if len(buckets["saturday"]) > 0: saturday = buckets["saturday"].pop(len(buckets["saturday"]) - 1) else: buckets.pop("saturday") if len(buckets["sunday"]) > 0: sunday = buckets["sunday"].pop(len(buckets["sunday"]) - 1) else: buckets.pop("sunday") table.add_row(monday, tuesday, wednesday, thursday, friday, saturday, sunday) console = Console() console.print(table, justify="center") sys.exit(0) with open(args.c, "r") as config: config = json.load(config) for feed in feeds["Feeds"]: print(BOLD + "Checking feed: " + feed["ID"] + RESET) NewsFeed = feedparser.parse(feed["URL"]) for anime in feed["Animes"]: print( "Checking anime: " + BOLD_RED + anime["Title"] + RESET + " - Airing every " + UNDERLINE + anime["Airing"] + RESET + " " + anime["Local"] + "/x") entries = NewsFeed.entries # Reverse the feed so the first EP gets grabbed first if anime["Airing"] == "Done": entries.reverse() for entry in entries: if anime["Title"] in entry.title: regex = feed["Episode-Regex"].replace("$SHOWS$", anime["Title"]) match = re.match(regex, entry.title) if match: episodeNumber = match.groups() if int(episodeNumber[0]) > int(anime["Local"]): print(BOLD_GREEN + "NEW NEW NEW " + anime["Title"] + " " + episodeNumber[0] + RESET) if subprocess.run(["transmission-remote", "-a", entry.link, "-w", build_target_folder()]).returncode == 0: anime["Local"] = str(int(anime["Local"]) + 1).zfill(2) send_notification("Episode " + anime["Local"] + " of " + anime["Title"] + " added!") else: send_notification("Transmission not running or not reachable!") # Reverse the feed back so the next anime in line has the original order if anime["Airing"] == "Done": entries.reverse() with open(args.a, "w") as new_feeds: new_feeds.write(json.dumps(feeds, indent=3))