67 lines
1.4 KiB
Python
67 lines
1.4 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Optional
|
|
|
|
|
|
@dataclass
|
|
class Asset:
|
|
immich_id: str
|
|
taken_at: str = ""
|
|
gps_lat: Optional[float] = None
|
|
gps_lon: Optional[float] = None
|
|
place_city: Optional[str] = None
|
|
place_country: Optional[str] = None
|
|
type: str = ""
|
|
has_gps: bool = False
|
|
thumb_path: Optional[str] = None
|
|
processed: bool = False
|
|
ingested_at: str = ""
|
|
updated_at: str = ""
|
|
|
|
|
|
@dataclass
|
|
class Tag:
|
|
name: str
|
|
immich_tag_id: Optional[str] = None
|
|
count: int = 0
|
|
|
|
|
|
@dataclass
|
|
class AssetTag:
|
|
immich_id: str
|
|
tag_name: str
|
|
|
|
|
|
@dataclass
|
|
class Cluster:
|
|
id: Optional[int] = None
|
|
start_at: str = ""
|
|
end_at: str = ""
|
|
count: int = 0
|
|
suggested_name: str = ""
|
|
confidence: float = 0.0
|
|
kind_guess: str = "trip" # trip | everyday
|
|
status: str = "pending" # pending|approved|non_trip|merged|split|skipped
|
|
decided_name: Optional[str] = None
|
|
reviewed_at: Optional[str] = None
|
|
notes: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class ClusterMember:
|
|
cluster_id: int
|
|
immich_id: str
|
|
member_confidence: float = 1.0
|
|
is_outlier: bool = False
|
|
included: bool = True
|
|
flagged_coverage: bool = False
|
|
|
|
|
|
@dataclass
|
|
class WritebackLog:
|
|
id: Optional[int]
|
|
immich_id: str
|
|
action: str # trip | non-trip | processed
|
|
tag: Optional[str]
|
|
result: str # ok | error:<reason>
|
|
applied_at: str
|