diff --git a/app/models/album.py b/app/models/album.py index 42693c8..ef69090 100644 --- a/app/models/album.py +++ b/app/models/album.py @@ -4,7 +4,7 @@ from dataclasses import dataclass from .track import Track from .artist import Artist from ..utils.hashing import create_hash -from ..utils.parsers import parse_feat_from_title +from ..utils.parsers import parse_feat_from_title, get_base_title_and_versions from app.settings import FromFlags @@ -34,6 +34,7 @@ class Album: is_favorite: bool = False is_live: bool = False genres: list[str] = dataclasses.field(default_factory=list) + versions: list[str] = dataclasses.field(default_factory=list) def __post_init__(self): self.og_title = self.title @@ -49,6 +50,12 @@ class Album: from ..store.tracks import TrackStore TrackStore.append_track_artists(self.albumhash, featured, self.title) + if FromFlags.REMOVE_REMASTER: + self.title, self.versions = get_base_title_and_versions(self.title) + + if "super_deluxe" in self.versions: + self.versions.remove("deluxe") + self.albumartists_hashes = "-".join(a.artisthash for a in self.albumartists) def set_colors(self, colors: list[str]): diff --git a/app/settings.py b/app/settings.py index 5cb8d4b..7bef97b 100644 --- a/app/settings.py +++ b/app/settings.py @@ -132,6 +132,9 @@ class FromFlags: Whether to remove the producers from the song title. """ + REMOVE_REMASTER = True + MERGE_REMASTERS = True + class TCOLOR: """ diff --git a/app/utils/parsers.py b/app/utils/parsers.py index d48fc3c..3e8ec10 100644 --- a/app/utils/parsers.py +++ b/app/utils/parsers.py @@ -1,4 +1,5 @@ import re +from enum import Enum def split_artists(src: str, with_and: bool = False): @@ -84,3 +85,50 @@ def parse_feat_from_title(title: str) -> tuple[list[str], str]: # remove "feat" group from title new_title = re.sub(regex, "", title, flags=re.IGNORECASE) return artists, new_title + + +def get_base_album_title(string): + pattern = re.compile(r'\s*(\(|\[).*?(version|remaster|deluxe|edition|expanded).*?(\)|\])', re.IGNORECASE) + match = pattern.search(string) + if match: + removed_block = match.group(0) + title = string.replace(removed_block, '').strip('()[] ') + return title, removed_block + + return string, None + + +class AlbumVersionEnum(Enum): + REMASTER = ("remaster", "remastered") + DELUXE = ("deluxe",) + EXPANDED = ("expanded",) + SUPER_DELUXE = ("super deluxe",) + EXTENDED = ("extended",) + BONUS_TRACK = ("bonus track", "bonus tracks") + RE_RECORD = ("re-recorded", "rerecorded") + INTL_VERSION = ("international",) + ORIGINAL = ("original",) + RE_MIX = ("re-mix",) + RE_RECORDED = ("re-recorded", "rerecorded") + REISSUE = ("reissue",) + + +def get_album_info(bracket_text: str | None) -> list[str]: + if not bracket_text: + return [] + + versions = [] + + for version_keywords in AlbumVersionEnum: + for keyword in version_keywords.value: + if re.search(keyword, bracket_text, re.IGNORECASE): + versions.append(version_keywords.name.lower()) + break + return versions + + +def get_base_title_and_versions(album: str) -> tuple[str, list[str]]: + album_title, version_block = get_base_album_title(album) + versions = get_album_info(version_block) + + return album_title, versions