import json import random from datetime import datetime from dataclasses import dataclass import os DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] @dataclass class Meme: image_path: str name: str day: str meta: dict[str, any] def get_random_attachment(self) -> str or None: attachments = self.meta.get('attachments') if len(attachments) < 1: return None return random.choice(self.flatten_meta(attachments)) def get_random_audio(self) -> str or None: attachments = self.meta.get('attachments') if len(attachments) < 1 or attachments.get('audio') is None: return None return random.choice(attachments.get('audio')) def get_random_video(self) -> str or None: attachments = self.meta.get('attachments') if len(attachments) < 1 or attachments.get('video') is None: return None return random.choice(attachments.get('video')) @staticmethod def flatten_meta(meta: dict[str, any]) -> list[str]: return [a for k in [i for i in meta] for a in k] class Day: def __init__(self, **kwargs) -> None: self.memes = kwargs.get('memes') or [] def __str__(self) -> str: return str(len(self.memes)) def randompic(self): return random.choice(self.memes) class DayOfTheWeek: def __init__(self) -> None: self.days = self.get_data() def today(self) -> Day: return self.days[datetime.today().weekday()] def get_day(self, day: str or int) -> Day: if type(day) is str: return self.days[DAYS.index(day)] else: return self.days[day] @staticmethod def get_data() -> list[Day]: folder = os.path.dirname(os.path.abspath(__file__)) week = [] for day_str in DayOfTheWeek.get_day_of_the_week(-1): day = Day() for file in os.listdir(folder + '\\' + day_str): file = folder + '\\' + day_str + '\\' + file day.memes.append(DayOfTheWeek.create_meme(file)) week.append(day) return week @staticmethod def get_day_of_the_week(day_number: int) -> str or list[str]: return DAYS[day_number] if 0 <= day_number < len(DAYS) else DAYS @staticmethod def create_meme(filename: str) -> Meme: meta = DayOfTheWeek.get_meta(filename) return Meme( filename, os.path.basename(filename), meta.get('day'), meta ) @staticmethod def get_meta(filename: str) -> dict[str, any]: folder = os.path.dirname(os.path.abspath(__file__)) if not '.metadata' in filename: filename = filename.replace(folder, folder + "\\.metadata") with open(filename + '.json', 'r', encoding='utf8') as f: return json.loads(f.read())