Skip to content
Snippets Groups Projects
Select Git revision
  • main
  • fix/2023-10_gitlab-ci
  • renovate/configure
  • v1.8.0
  • v1.7.2
  • v1.7.1
  • v1.5.0
  • v1.4.1
  • v1.4.0
  • v1.3.0
  • v1.2.3
  • v1.2.2
  • v1.2.1
  • v1.2.0
  • v1.1.0
  • v1.0.0
16 results

tasks.py

Blame
  • program_info.py 4.41 KiB
    #!/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()