domain: introduce provider-neutral media model (phase 1)
Establish src-tauri/src/domain/ as the single source of truth for the media model, with all Jellyfin translation isolated in from_jellyfin.rs. Adds MediaKind enum and neutral duration_ms/image_id fields to MediaItem as additive, defaulted dual-carry alongside the legacy Jellyfin-named fields, so nothing breaks while the frontend migrates off them. - domain/media.rs: canonical MediaKind (closed enum, replaces stringly item_type), Default = Other so unknown/defaulted items are inert. - domain/from_jellyfin.rs: total, panic-free item_type -> MediaKind classification (all audited types + person subroles) and ticks->ms. - MediaItem gains kind/duration_ms/image_id, populated at both mapping seams (online to_media_item, offline cached_item_to_media_item) and the synthesized-album/person sites. - Regenerated bindings.ts: frontend now HAS the neutral model available. Phase 1 of docs/specs/frontend-domain-model.md. No frontend behaviour change yet; wire shape is a superset of before. Rust 456 tests, frontend 644 tests, check + check:boundary all green.
This commit is contained in:
@@ -619,10 +619,13 @@ impl JellyfinItem {
|
||||
let primary_tag = self.image_tags.as_ref().and_then(|tags| tags.primary());
|
||||
let backdrop_tags = self.backdrop_image_tags;
|
||||
|
||||
let kind = crate::domain::kind_from_jellyfin(&self.item_type, self.is_folder);
|
||||
|
||||
MediaItem {
|
||||
id: self.id,
|
||||
name: self.name,
|
||||
item_type: self.item_type,
|
||||
kind,
|
||||
is_folder: self.is_folder,
|
||||
server_id,
|
||||
parent_id: self.parent_id,
|
||||
@@ -634,7 +637,9 @@ impl JellyfinItem {
|
||||
community_rating: self.community_rating,
|
||||
official_rating: self.official_rating,
|
||||
runtime_ticks: self.run_time_ticks,
|
||||
primary_image_tag: primary_tag,
|
||||
duration_ms: self.run_time_ticks.map(crate::domain::ticks_to_ms),
|
||||
primary_image_tag: primary_tag.clone(),
|
||||
image_id: primary_tag,
|
||||
backdrop_image_tags: backdrop_tags,
|
||||
parent_backdrop_image_tags: self.parent_backdrop_image_tags,
|
||||
album_id: self.album_id,
|
||||
@@ -923,6 +928,7 @@ impl MediaRepository for OnlineRepository {
|
||||
.clone()
|
||||
.unwrap_or_else(|| "Unknown Album".to_string()),
|
||||
item_type: "MusicAlbum".to_string(),
|
||||
kind: crate::domain::MediaKind::Album,
|
||||
is_folder: true,
|
||||
server_id: first_track.server_id.clone(),
|
||||
parent_id: None,
|
||||
@@ -934,7 +940,9 @@ impl MediaRepository for OnlineRepository {
|
||||
community_rating: None,
|
||||
official_rating: None,
|
||||
runtime_ticks: None,
|
||||
duration_ms: None,
|
||||
primary_image_tag: first_track.primary_image_tag.clone(),
|
||||
image_id: first_track.primary_image_tag.clone(),
|
||||
backdrop_image_tags: None,
|
||||
parent_backdrop_image_tags: None,
|
||||
album_id: None,
|
||||
|
||||
Reference in New Issue
Block a user