import importlib from pathlib import Path from pkgutil import iter_modules from typing import Optional from xml.etree.ElementTree import Element from watfag.parsers.generic import Release, ParserManager from watfag.trackers import TrackerInfo class TVBoxSetRelease(Release): """Holds info representing a release of a TV box set.""" def __init__( self, xml_result: Element, tracker_info: Optional[TrackerInfo] = None ): super().__init__(xml_result, tracker_info) self.seasons: Optional[str] = None def __str__(self): parts = [f"{self.title} (Seasons: {self.seasons})"] for attr in ['quality', 'video_codec', 'audio_codec', 'audio_layout', 'dynamic_range', 'repack', 'multi', 'source']: value = getattr(self, attr) parts.append(f"{attr.capitalize()}: {value if value else 'Unknown'}") if self.streaming: parts.append(f"Streaming: {self.streaming}") parts.append(f"Group: {self.group_name if self.group else 'Unknown'}") if not self.fully_consumed(): parts.append(f"Unparsed: {self.metadata_text}") parts.append(f"WATFAG: {self.watfag:.2f}") return " | ".join(parts) class TVBoxSetParser: """ This class can be inherited by any parser that is specific to TV box sets. It allows dynamic importing of parser classes and provides a method to run all parsers on a given TV box set release. """ class TVBoxSetParserManager(ParserManager): """Parses TV box set releases.""" def collect_parsers(self): """Dynamically imports all TV box set parsers.""" super().collect_parsers() package_dir = Path(__file__).parent for _, module_name, _ in iter_modules([package_dir]): importlib.import_module(f"{__package__}.{module_name}") self.parsers.extend(TVBoxSetParser.__subclasses__())