1
0
Files
anime-rss/anime-rss.py
MK13 6fe2fd4e76 #6 Calendar view
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>
2022-04-21 23:36:01 +02:00

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