Initial commit

This commit is contained in:
marc
2025-03-09 20:00:54 +01:00
commit efd26ce19d
118 changed files with 78086 additions and 0 deletions

123
folkugat_web/model/temes.py Normal file
View File

@@ -0,0 +1,123 @@
import dataclasses
import datetime
import enum
from typing import Optional
from folkugat_web.services import ngrams
NGrams = dict[int, list[str]]
class LinkType(enum.Enum):
SCORE = "score"
AUDIO = "audio"
OTHER = "other"
class LinkSubtype(enum.Enum):
# Score
PDF = "pdf"
IMAGE = "image"
# Audio
SPOTIFY = "spotify"
YOUTUBE = "youtube"
@dataclasses.dataclass
class Link:
type: LinkType
subtype: Optional[LinkSubtype]
url: str
title: str = ""
def to_dict(self):
return dict(
type=self.type.value,
subtype=self.subtype.value if self.subtype else None,
url=self.url,
title=self.title,
)
@classmethod
def from_dict(cls, d):
return cls(
type=LinkType(d["type"]),
subtype=LinkSubtype(d["subtype"]) if d["subtype"] else None,
url=d["url"],
title=d["title"],
)
class PropertyField(enum.Enum):
AUTOR = "autor"
TIPUS = "tipus"
COMPAS = "compàs"
ORIGEN = "orígen"
@dataclasses.dataclass
class Property:
field: PropertyField
value: str
def to_dict(self):
return dict(
field=self.field.value,
value=self.value,
)
@classmethod
def from_dict(cls, d):
return cls(
field=PropertyField(d["field"]),
value=d["value"],
)
@dataclasses.dataclass
class Lyrics:
title: str
content: str
def to_dict(self):
return dict(
title=self.title,
content=self.content,
)
@classmethod
def from_dict(cls, d):
return cls(
title=d["title"],
content=d["content"],
)
@dataclasses.dataclass
class Tema:
id: Optional[int] = 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)
ngrams: NGrams = dataclasses.field(default_factory=dict)
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)
def compute_ngrams(self):
self.ngrams = ngrams.get_text_ngrams(self.title, *self.alternatives)
def with_ngrams(self):
self.compute_ngrams()
return self
def scores(self):
return [link for link in self.links if link.type is LinkType.SCORE]
def audios(self):
return [link for link in self.links if link.type is LinkType.AUDIO]