refactor: replace get_stream_url with get_source_uri per ADR-0002

Providers now expose a source URI (for FFmpeg) instead of a
viewer-facing stream URL. Playout Service will own transcoding.

- Add SourceUri value object (NetworkUrl | FilePath)
- Remove StreamQuality, StreamingProtocol from domain
- Simplify ProviderCapabilities (drop streaming_protocol, transcode)
- Jellyfin: return static direct stream URL
- Local files: return absolute file path
- Rename use case get_stream_url -> get_source
- Stream endpoint returns JSON SourceUri instead of 307 redirect
This commit is contained in:
2026-07-12 07:34:13 +02:00
parent abcf69ce7e
commit 39f5f99bfd
21 changed files with 82 additions and 256 deletions

View File

@@ -3,20 +3,7 @@ use serde::{Deserialize, Serialize};
use crate::errors::{DomainError, DomainResult};
use crate::models::MediaItem;
use crate::value_objects::{ContentType, MediaFilter, MediaItemId};
#[derive(Debug, Clone)]
pub enum StreamQuality {
Direct,
Transcode(u32),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StreamingProtocol {
Hls,
DirectFile,
}
use crate::value_objects::{ContentType, MediaFilter, MediaItemId, SourceUri};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderCapabilities {
@@ -26,9 +13,7 @@ pub struct ProviderCapabilities {
pub tags: bool,
pub decade: bool,
pub search: bool,
pub streaming_protocol: StreamingProtocol,
pub rescan: bool,
pub transcode: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -55,11 +40,7 @@ pub trait IMediaProvider: Send + Sync {
async fn fetch_by_id(&self, item_id: &MediaItemId) -> DomainResult<Option<MediaItem>>;
async fn get_stream_url(
&self,
item_id: &MediaItemId,
quality: &StreamQuality,
) -> DomainResult<String>;
async fn get_source_uri(&self, item_id: &MediaItemId) -> DomainResult<SourceUri>;
async fn list_collections(&self) -> DomainResult<Vec<Collection>> {
Err(DomainError::InfrastructureError(
@@ -95,11 +76,7 @@ pub trait IProviderRegistry: Send + Sync {
async fn fetch_by_id(&self, item_id: &MediaItemId) -> DomainResult<Option<MediaItem>>;
async fn get_stream_url(
&self,
item_id: &MediaItemId,
quality: &StreamQuality,
) -> DomainResult<String>;
async fn get_source_uri(&self, item_id: &MediaItemId) -> DomainResult<SourceUri>;
fn provider_ids(&self) -> Vec<String>;

View File

@@ -17,7 +17,6 @@ pub use events::{DomainEvent, EventConsumer, EventEnvelope, EventHandler, EventP
pub use library::{LibraryCommand, LibraryQuery, LibrarySyncAdapter};
pub use media::{
Collection, IMediaProvider, IProviderRegistry, ProviderCapabilities, SeriesSummary,
StreamQuality, StreamingProtocol,
};
pub use provider_config::{ProviderConfigCommand, ProviderConfigQuery};
pub use schedule::{ScheduleCommand, ScheduleQuery};