mirror of
https://github.com/myronblair/kino-app
synced 2026-07-31 21:12:43 -05:00
Codec-aware transcode routing, two-stage queue, request candidate picker, admin reorg
- Requests approval now shows a Radarr/Sonarr candidate picker instead of grabbing the first search result (fixes wrong-title/wrong-year matches) - approve_request reuses an existing Radarr/Sonarr entry instead of erroring when content is already in the library - New codec-check queue (step 1) probes source codecs and skips transcoding entirely for already browser-native files; only non-native content reaches the transcode queue (step 2) - Fixes ffmpeg hard-failing on non-H.264 sources via the h264_mp4toannexb bitstream filter (root cause of the fix-audio-all failures) - Added Codec Check Worker / Transcode Worker to the services health panel with restart - Reorganized the admin page into Pipeline/Utilities dropdowns; added the missing Sonarr Import link - Bumped VERSION 1.0.0 -> 1.1.0
This commit is contained in:
@@ -193,6 +193,8 @@ class RequestUpdate(BaseModel):
|
||||
|
||||
class RequestApprove(BaseModel):
|
||||
content_type: str # "movie" | "tv"
|
||||
tmdb_id: Optional[int] = None # movie: explicit pick from /requests/{id}/candidates
|
||||
tvdb_id: Optional[int] = None # tv: explicit pick from /requests/{id}/candidates
|
||||
|
||||
|
||||
class MovieRequest(BaseModel):
|
||||
@@ -380,6 +382,26 @@ class TranscodeJob(BaseModel):
|
||||
finished_at: Optional[str] = None
|
||||
|
||||
|
||||
class CodecCheckJob(BaseModel):
|
||||
"""Step 1 of the pipeline, ahead of TranscodeJob (step 2): probes the source file's actual
|
||||
video/audio codecs and decides whether it needs a transcode at all. 'native' sources skip
|
||||
straight to the library with no transcode job ever created; 'audio'/'abr' sources get
|
||||
handed off to a TranscodeJob."""
|
||||
model_config = ConfigDict(extra="ignore")
|
||||
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
||||
movie_id: str # generic content id (movie_id OR episode_id, depending on content_type)
|
||||
movie_title: str = ""
|
||||
content_type: str = "movie" # movie | episode
|
||||
status: str = "pending" # pending | running | done | failed | cancelled | superseded
|
||||
classification: Optional[str] = None # native | audio | abr, set once done
|
||||
error: str = ""
|
||||
triggered_by: str = "manual"
|
||||
superseded_by: Optional[str] = None
|
||||
created_at: str = Field(default_factory=_now_iso)
|
||||
started_at: Optional[str] = None
|
||||
finished_at: Optional[str] = None
|
||||
|
||||
|
||||
class QueuePauseToggle(BaseModel):
|
||||
paused: bool
|
||||
|
||||
|
||||
Reference in New Issue
Block a user