#!/bin/env python3 import datetime import json import re from argparse import ArgumentParser from datetime import timedelta from io import BytesIO from pprint import pprint import requests from dateutil import parser as date_parser from pytz import UTC class Date: weekday = "" day = "" month = "" year = "" time = "" def __init__(self): pass class NextEvent: date = Date() title = "" description = "" movie_description = "" tags = "" link = "" image = "" trailer = "" days = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"] month = [ "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" ] def __init__(self, next_event, now): # passende Zeitangabe raussuchen event_date = date_parser.parse(next_event["date"]) tomorrow = now + timedelta(days=1) if event_date.day == now.day and event_date.month == now.month and event_date.year == now.year: start = "Heute" elif event_date.day == tomorrow.day and event_date.month == tomorrow.month and event_date.year == tomorrow.year: start = "Morgen" else: start = self.days[event_date.weekday()] self.date.weekday = start self.date.day = event_date.day self.date.month = self.month[event_date.month - 1] self.date.year = event_date.year self.date.time = event_date.strftime("%H:%M") # Title des Events self.title = next_event["title"] # Beschreibung des Events self.description = next_event["description"] # Beschreibung des Films self.movie_description = next_event["movie"]["description"] # Baue die Tag-Reihe zusammen. self.tags = " | ".join([w["description"] for w in next_event["tags"]]) # Generiere die URL zum Event, da diese nicht im JSON steht. link = next_event["title"].lower().replace('ö', 'o').replace('ä', 'a').replace('ü', 'u').replace('ß', 'ss') link = re.sub("[^[A-Za-z0-9]", '-', link) link = re.sub(r"-{2,}", '-', link) link: str = link.rstrip("-") link = str(next_event["id"]) + "-" + link self.link = "https://ufc.tu-dortmund.de/vorstellung/%s" % link if next_event["movie"]["youtube_id"] != "": self.trailer = "https://youtu.be/%s" % next_event["movie"]["youtube_id"] response = requests.get("https://ufc.tu-dortmund.de/%s" % next_event['movie']['image_url_medium'] .replace('medium', 'original')) self.image = BytesIO(response.content) class ProgramInfo: semester = "" next_event = "" def __init__(self): # Hole das UFC Semester self.semester = json.loads( requests.get(url="https://ufc.tu-dortmund.de/semesters/current.json").text ) def get_next_event(self, wanted_day_diff, just_print=False): # Finde das nächste Event, dass nach heute ist und in `day_diff` Tagen stattfindet. now = UTC.localize( datetime.datetime.now() ) for i in self.semester: d = date_parser.parse(i["date"]) if d < now: continue diff = (d - now) if now.date() == d.date(): day_diff = 0 elif now.time() > d.time(): day_diff = diff.days + 1 elif now.time() <= d.time(): day_diff = diff.days if day_diff == wanted_day_diff: if just_print: pprint(i) else: self.next_event = NextEvent(i, now) return self.next_event def get_image(self): # return image data return self.next_event.image def main(): # Parse Arguments aparser: ArgumentParser = ArgumentParser( description="UFC Programminfo Bot" ) aparser.add_argument( "--preview", dest='day_diff', action="store_const", const=7, default=1, help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag." ) args = aparser.parse_args() p_info = ProgramInfo() p_info.get_next_event(args.day_diff, True) if __name__ == "__main__": main()