add domain concepts: FillStrategy variants, Chapter, InterstitialRule, MidRollRule, gap_filler

- FillStrategy: +Alternating (round-robin series), +Weighted (fresh-first), +Marathon (always ep1, loops)
- Chapter value object on MediaItem (JSON column in library_items)
- InterstitialRule + MidRollRule on ProgrammingBlock (data model only)
- gap_filler: Option<MediaFilter> on Channel (persisted as JSON column)
- migration: 20260712000002_add_chapters_and_gap_filler.sql
This commit is contained in:
2026-07-12 07:41:57 +02:00
parent 39f5f99bfd
commit 60524c56f7
16 changed files with 547 additions and 10 deletions

View File

@@ -42,6 +42,7 @@ fn seed_items_with_genres(repo: &std::sync::Arc<domain::testing::InMemoryLibrary
thumbnail_url: None,
synced_at: Some("2026-01-01".into()),
role: MediaRole::default(),
chapters: Vec::new(),
});
let scifi = MediaItem::from_persistence(MediaItemRow {
id: MediaItemId::new("test::m2"),
@@ -63,6 +64,7 @@ fn seed_items_with_genres(repo: &std::sync::Arc<domain::testing::InMemoryLibrary
thumbnail_url: None,
synced_at: Some("2026-01-01".into()),
role: MediaRole::default(),
chapters: Vec::new(),
});
let comedy = MediaItem::from_persistence(MediaItemRow {
id: MediaItemId::new("test::m3"),
@@ -84,6 +86,7 @@ fn seed_items_with_genres(repo: &std::sync::Arc<domain::testing::InMemoryLibrary
thumbnail_url: None,
synced_at: Some("2026-01-01".into()),
role: MediaRole::default(),
chapters: Vec::new(),
});
store.insert(action.id().value().to_string(), action);