Add a calendar view Update required python version to 3.10 Correct config and animes flags to -c and -a Change timer tick rate to every 15mins instead of 55mins Update readme Signed-off-by: MK13 <marius@kleberonline.de>
164 lines
5.0 KiB
Python
164 lines
5.0 KiB
Python
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))
|