Add read-only database V2 parser
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
from serato_doctor.models.crate import Crate, CrateKind
|
||||
from serato_doctor.models.database import DatabaseTrack, SeratoDatabase
|
||||
from serato_doctor.models.duplicate import DuplicateGroup, DuplicateKind
|
||||
from serato_doctor.models.filesystem import BrokenSymlink, FilesystemScan
|
||||
from serato_doctor.models.health import HealthReport
|
||||
@@ -10,6 +11,7 @@ from serato_doctor.models.track import DiskTrack
|
||||
__all__ = [
|
||||
"Crate",
|
||||
"CrateKind",
|
||||
"DatabaseTrack",
|
||||
"DiskTrack",
|
||||
"DuplicateGroup",
|
||||
"DuplicateKind",
|
||||
@@ -19,6 +21,7 @@ __all__ = [
|
||||
"Library",
|
||||
"MatchEvidence",
|
||||
"ReferenceResult",
|
||||
"SeratoDatabase",
|
||||
"TrackMatch",
|
||||
"TrackReference",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from typing import Optional, Tuple
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class DatabaseTrack:
|
||||
"""Read-only metadata extracted from one database V2 track record."""
|
||||
|
||||
path: Path
|
||||
filename: str
|
||||
title: Optional[str] = None
|
||||
artist: Optional[str] = None
|
||||
album: Optional[str] = None
|
||||
genre: Optional[str] = None
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SeratoDatabase:
|
||||
path: Path
|
||||
version: Optional[str]
|
||||
tracks: Tuple[DatabaseTrack, ...]
|
||||
@@ -25,6 +25,12 @@ class HealthReport:
|
||||
smart_crate_containers: int
|
||||
unknown_crates: int
|
||||
dynamic_references_excluded: int
|
||||
database_present: bool
|
||||
database_entries: int
|
||||
database_library_matches: int
|
||||
database_unmatched_entries: int
|
||||
tracks_missing_from_database: int
|
||||
duplicate_database_paths: int
|
||||
|
||||
@property
|
||||
def score_basis(self) -> str:
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
from dataclasses import dataclass
|
||||
from typing import Iterable, Tuple
|
||||
from typing import Iterable, Optional, Tuple
|
||||
|
||||
from serato_doctor.models.crate import Crate
|
||||
from serato_doctor.models.database import SeratoDatabase
|
||||
from serato_doctor.models.filesystem import BrokenSymlink
|
||||
from serato_doctor.models.reference import ReferenceResult, TrackReference
|
||||
from serato_doctor.models.track import DiskTrack
|
||||
@@ -15,6 +16,7 @@ class Library:
|
||||
tracks: Tuple[DiskTrack, ...]
|
||||
crates: Tuple[Crate, ...] = ()
|
||||
broken_symlinks: Tuple[BrokenSymlink, ...] = ()
|
||||
database: Optional[SeratoDatabase] = None
|
||||
|
||||
@classmethod
|
||||
def build(
|
||||
@@ -22,11 +24,13 @@ class Library:
|
||||
references: Iterable[TrackReference],
|
||||
tracks: Iterable[DiskTrack],
|
||||
broken_symlinks: Iterable[BrokenSymlink] = (),
|
||||
database: Optional[SeratoDatabase] = None,
|
||||
) -> "Library":
|
||||
return cls(
|
||||
tuple(references),
|
||||
tuple(tracks),
|
||||
broken_symlinks=tuple(broken_symlinks),
|
||||
database=database,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
@@ -35,6 +39,7 @@ class Library:
|
||||
crates: Iterable[Crate],
|
||||
tracks: Iterable[DiskTrack],
|
||||
broken_symlinks: Iterable[BrokenSymlink] = (),
|
||||
database: Optional[SeratoDatabase] = None,
|
||||
) -> "Library":
|
||||
crate_tuple = tuple(crates)
|
||||
references = tuple(
|
||||
@@ -47,6 +52,7 @@ class Library:
|
||||
tuple(tracks),
|
||||
crate_tuple,
|
||||
tuple(broken_symlinks),
|
||||
database,
|
||||
)
|
||||
|
||||
def reconcile_by_filename(self) -> Tuple[ReferenceResult, ...]:
|
||||
|
||||
Reference in New Issue
Block a user