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

@@ -1,7 +1,6 @@
use std::sync::Arc;
use domain::ports::{IMediaProvider, IProviderRegistry, ProviderCapabilities, StreamingProtocol};
use domain::ports::StreamQuality;
use domain::ports::{IMediaProvider, IProviderRegistry, ProviderCapabilities};
use domain::{DomainError, DomainResult, MediaFilter, MediaItem, MediaItemId, ScheduleEngineService};
use infra_wiring::DbPool;
use tracing::info;
@@ -175,9 +174,7 @@ impl IMediaProvider for NoopMediaProvider {
tags: false,
decade: false,
search: false,
streaming_protocol: StreamingProtocol::DirectFile,
rescan: false,
transcode: false,
}
}
@@ -193,7 +190,7 @@ impl IMediaProvider for NoopMediaProvider {
))
}
async fn get_stream_url(&self, _: &MediaItemId, _: &StreamQuality) -> DomainResult<String> {
async fn get_source_uri(&self, _: &MediaItemId) -> DomainResult<domain::SourceUri> {
Err(DomainError::InfrastructureError(
"No media provider configured.".into(),
))
@@ -254,19 +251,18 @@ impl IProviderRegistry for SimpleProviderRegistry {
}
}
async fn get_stream_url(
async fn get_source_uri(
&self,
item_id: &MediaItemId,
quality: &StreamQuality,
) -> DomainResult<String> {
) -> DomainResult<domain::SourceUri> {
let id_str = item_id.value();
if let Some(pid) = Self::extract_provider_id(id_str)
&& let Some(provider) = self.get(pid)
{
return provider.get_stream_url(item_id, quality).await;
return provider.get_source_uri(item_id).await;
}
if let Some(provider) = self.primary() {
provider.get_stream_url(item_id, quality).await
provider.get_source_uri(item_id).await
} else {
Err(DomainError::InfrastructureError(
"No provider available".into(),