import dataclasses import datetime import enum from folkugat_web.model.search import NGrams from folkugat_web.model.sessions import Session from folkugat_web.services import ngrams class ContentType(enum.Enum): PARTITURA = "partitura" AUDIO = "àudio" OTHER = "enllaç" class LinkType(enum.Enum): # Score PDF = "pdf" IMAGE = "image" # Audio SPOTIFY = "spotify" YOUTUBE = "youtube" @dataclasses.dataclass class Link: id: int | None tema_id: int content_type: ContentType link_type: LinkType | None url: str title: str = "" class PropertyField(enum.Enum): AUTOR = "autor" TIPUS = "tipus" COMPAS = "compàs" ORIGEN = "orígen" @dataclasses.dataclass class Property: id: int | None tema_id: int field: PropertyField value: str @dataclasses.dataclass class Lyrics: id: int | None tema_id: int title: str content: str @dataclasses.dataclass class Stats: times_played: int sessions_played: list[Session] @dataclasses.dataclass class Tema: id: int | None = None # Info title: str = "" properties: list[Property] = dataclasses.field(default_factory=list) links: list[Link] = dataclasses.field(default_factory=list) lyrics: list[Lyrics] = dataclasses.field(default_factory=list) # Search related alternatives: list[str] = dataclasses.field(default_factory=list) hidden: bool = True # Other info modification_date: datetime.datetime = dataclasses.field(default_factory=datetime.datetime.now) creation_date: datetime.datetime = dataclasses.field(default_factory=datetime.datetime.now) # Stats stats: Stats | None = None def ngrams(self) -> NGrams: return ngrams.get_text_ngrams(self.title, *self.alternatives) @staticmethod def _is_score(link: Link) -> bool: if link.content_type is not ContentType.PARTITURA: return False if link.link_type is LinkType.PDF: return link.url.startswith("/") return link.link_type is LinkType.IMAGE def score(self) -> Link | None: result = next(filter(self._is_score, self.links), None) return result class TemaCols(enum.Enum): NOM = "nom" COPS_TOCAT = "cops_tocat"