pub struct LineageStore {
pub schema_version: u32,
pub nodes: BTreeMap<String, Node>,
pub edges: Vec<StoredEdge>,
pub resolution_cache: BTreeMap<String, CacheEntry>,
pub albums: BTreeMap<String, AlbumArt>,
pub playlists: BTreeMap<String, PlaylistState>,
}Expand description
Fields§
§schema_version: u32On-disk schema version, so a future migration can branch on it.
nodes: BTreeMap<String, Node>Every clip ever seen (including trashed ancestors), keyed by clip id.
edges: Vec<StoredEdge>Every observed parent link, as a flat relational list.
resolution_cache: BTreeMap<String, CacheEntry>The last resolved (or last-known) root per clip, keyed by clip id.
albums: BTreeMap<String, AlbumArt>The reconciled folder-art state per album, keyed by the album’s stable root id (HARDENING H2). Additive: absent in older stores, defaults empty.
playlists: BTreeMap<String, PlaylistState>The reconciled .m3u8 state per playlist, keyed by the playlist’s Suno
id (the synthetic "liked" id for the liked feed). Additive: absent in
older stores, defaults empty.
Implementations§
Source§impl LineageStore
impl LineageStore
Sourcepub fn get_root(&self, id: &str) -> Option<&CacheEntry>
pub fn get_root(&self, id: &str) -> Option<&CacheEntry>
The cached root resolution for id, if present.
Sourcepub fn album_art(&self, root_id: &str) -> Option<&AlbumArt>
pub fn album_art(&self, root_id: &str) -> Option<&AlbumArt>
The reconciled folder-art state for the album rooted at root_id.
Sourcepub fn set_album_artifact(
&mut self,
root_id: &str,
kind: ArtifactKind,
state: Option<ArtifactState>,
)
pub fn set_album_artifact( &mut self, root_id: &str, kind: ArtifactKind, state: Option<ArtifactState>, )
Set (or clear, with None) one folder-art kind for the album rooted at
root_id.
A set upserts the album row; a clear that empties the row removes it, so
the store never accumulates dead all-None album entries. This is the
store-level counterpart the CLI persists after the executor mutates the
albums map in place.
Sourcepub fn playlist(&self, id: &str) -> Option<&PlaylistState>
pub fn playlist(&self, id: &str) -> Option<&PlaylistState>
The reconciled .m3u8 state for the playlist with id, if present.
Sourcepub fn set_playlist(&mut self, id: &str, state: Option<PlaylistState>)
pub fn set_playlist(&mut self, id: &str, state: Option<PlaylistState>)
Upsert (with Some) or remove (with None) the .m3u8 state for the
playlist id.
This is the store-level counterpart the CLI persists after the executor
mutates the playlists map in place: a write records
the new state; a delete clears the row so the store never keeps a
dangling entry for a playlist whose file was removed.
Sourcepub fn context_for(&self, clip: &Clip) -> LineageContext
pub fn context_for(&self, clip: &Clip) -> LineageContext
Build a LineageContext for clip from the durable store.
This is the source of truth for every file-affecting lineage decision (album folder, embedded tags, the change hash), so a dropped resolution call never rewrites the library (HARDENING H3). The root comes from the monotonic resolution cache (the clip’s own id when the store has no better answer) and the root title from that root’s archived node, so a transient miss keeps the last-known-good album even for a since-purged ancestor. The parent edge is read structurally from the clip itself.
Sourcepub fn colliding_root_titles(&self) -> BTreeSet<String>
pub fn colliding_root_titles(&self) -> BTreeSet<String>
The set of root titles shared by more than one distinct root.
Two distinct roots must never share an album folder (two different
uploads titled “Break Through” exist), so naming appends the short root
id to the album of any clip whose root title is in this set. It is
computed from the whole archive — every distinct root in the resolution
cache paired with its node title — so the decision is stable across runs
and independent of the current batch: a --since/--limit slice that
shows only one of two same-titled roots still disambiguates, instead of
oscillating between a bare and a suffixed folder.
Sourcepub fn update(&mut self, clips: &[Clip], resolution: &Resolution, now: &str)
pub fn update(&mut self, clips: &[Clip], resolution: &Resolution, now: &str)
Fold this run’s clips and their Resolution into the store.
Pure: it takes now (an ISO timestamp) from the caller rather than
reading a clock. Upserts a node for every clip and every gap-filled
ancestor (so trashed ancestors are archived), upserts an edge for every
lineage_edges link, and refreshes the monotonic resolution cache.
edges is left sorted so the serialised form is deterministic.
Trait Implementations§
Source§impl Clone for LineageStore
impl Clone for LineageStore
Source§fn clone(&self) -> LineageStore
fn clone(&self) -> LineageStore
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for LineageStore
impl Debug for LineageStore
Source§impl Default for LineageStore
impl Default for LineageStore
Source§impl<'de> Deserialize<'de> for LineageStorewhere
LineageStore: Default,
impl<'de> Deserialize<'de> for LineageStorewhere
LineageStore: Default,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for LineageStore
impl PartialEq for LineageStore
Source§fn eq(&self, other: &LineageStore) -> bool
fn eq(&self, other: &LineageStore) -> bool
self and other values to be equal, and is used by ==.