Files
folkugat-web/folkugat_web/model/temes.py
2025-03-23 21:46:04 +01:00

94 lines
2.1 KiB
Python

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:
return next(filter(self._is_score, self.links), None)