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 not attachments: return None return random.choice(self.flatten_meta(attachments)) def get_random_audio(self) -> str or None: attachments = self.meta.get('attachments') if not attachments 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 not attachments or attachments.get('video') is None: return None return random.choice(attachments.get('video')) def dump_meta(self, path: str = None): if not path: path = "current_meta.json" with open(path, 'w', encoding='utf8') as f: f.write(json.dumps(self.meta)) @staticmethod def info_from_json(path: str) -> str: with open(path, 'w', encoding='utf8') as f: data = json.loads(f.read()) return f"{'Fandom: ' if data.get('fandom') else 'Project: '} {data.get('fandom', data.get('Project'))}\n"\ f"Character(s):\n{', '.join(c for c in data.get('characters'))}\n" @staticmethod def flatten_meta(meta: dict[str, any]) -> list[str]: return [a for k in [i for i in meta.values()] 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(os.path.join(folder, day_str)): file = os.path.join(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, os.path.join(folder, ".metadata")) with open(filename + '.json', 'r', encoding='utf8') as f: return json.loads(f.read())