94 lines
2.1 KiB
Python
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)
|