Verified Commit a503e67c authored by Jakob Moser's avatar Jakob Moser
Browse files

Add Library

parent ee91e201
Loading
Loading
Loading
Loading
+33 −0
Changes for karaokatalog/Library.py: 33 added lines, 0 removed lines.
Original line number Diff line number Diff line
from pathlib import Path
from typing import Self

from dataclasses import dataclass
from collections.abc import Sequence

from tqdm import tqdm

from karaokatalog.Song import Song


@dataclass(frozen=True)
class Library:
    songs: Sequence[Song]
    unparseable_song_txts: Sequence[Path]

    @classmethod
    def from_dir(cls, library_dir: Path) -> Self:
        """
        Load a library from a directory by recursively finding all txt files in there
        and interpreting them as UltraStar Song TXT files.
        """
        maybe_songs_by_path = {
            song_txt: Song.from_song_txt(song_txt)
            for song_txt in tqdm(library_dir.rglob("*.txt"), unit=" songs")
        }

        songs = tuple(song for song in maybe_songs_by_path.values() if song)
        unparseable_song_txts = tuple(
            song_txt for song_txt, song in maybe_songs_by_path.items() if not song
        )

        return cls(songs, unparseable_song_txts)