feat(transcode): optimize + on-the-fly quality + HLS streaming (§6.6)
POST /tracks/{id}/optimize enqueues a transcode; GET /stream/{id}?quality=
serves a cached Opus rendition (miss → master + background warm); GET
/stream/{id}/hls/{playlist.m3u8,segment} serves the worker-generated HLS
rendition (AAC-in-TS), with ?token= propagated onto segment URLs for players
that can't set headers. Hexagonal: Transcoder port, FfmpegTranscoder adapter,
TranscodeService + cache-path helpers, transcode_track worker (idempotent),
schemas + deps wiring. ffmpeg already in the image.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -59,6 +59,28 @@ async def enqueue_materialize(job_id: uuid.UUID) -> None:
|
||||
log.warning("materialize_enqueue_failed", job_id=str(job_id))
|
||||
|
||||
|
||||
async def enqueue_transcode(
|
||||
track_id: uuid.UUID, *, quality: str = "high", hls: bool = True
|
||||
) -> str:
|
||||
"""Enqueue a transcode job (§6.6). Unlike the best-effort follow-ups below,
|
||||
this is user/stream-driven, so it surfaces a job id (and a 503 via the caller
|
||||
if the queue is down) rather than swallowing failures."""
|
||||
return await enqueue(
|
||||
"transcode_track", track_id=str(track_id), quality=quality, hls=hls
|
||||
)
|
||||
|
||||
|
||||
async def enqueue_transcode_quiet(
|
||||
track_id: uuid.UUID, *, quality: str = "high", hls: bool = False
|
||||
) -> None:
|
||||
"""Best-effort transcode enqueue for a streaming cache miss — never blocks or
|
||||
fails the play (the master is served meanwhile)."""
|
||||
try:
|
||||
await enqueue_transcode(track_id, quality=quality, hls=hls)
|
||||
except DependencyUnavailableError:
|
||||
log.warning("transcode_enqueue_failed", track_id=str(track_id))
|
||||
|
||||
|
||||
async def enqueue_enrich(track_id: uuid.UUID) -> None:
|
||||
"""Best-effort enqueue of metadata enrichment for a freshly stored track.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user