from dataclasses import dataclass from typing import Iterable, Tuple from serato_doctor.models.reference import ReferenceResult, TrackReference from serato_doctor.models.track import DiskTrack @dataclass(frozen=True) class Library: """The read-only view of crate references and audio found on disk.""" references: Tuple[TrackReference, ...] tracks: Tuple[DiskTrack, ...] @classmethod def build( cls, references: Iterable[TrackReference], tracks: Iterable[DiskTrack], ) -> "Library": return cls(tuple(references), tuple(tracks)) def reconcile_by_filename(self) -> Tuple[ReferenceResult, ...]: disk_names = {track.filename for track in self.tracks} return tuple( ReferenceResult( reference=reference, exists_by_filename=reference.filename in disk_names, ) for reference in self.references )