diff --git a/.claude/settings.json b/.claude/settings.json index 8579b49..b0a3c42 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -8,7 +8,8 @@ "Bash(mkdocs build --strict)", "Read(//mnt/external/media/**)", "WebFetch(domain:www.makemkv.com)", - "Bash(node --check backend/src/services/pipelineService.js)" + "Bash(node --check backend/src/services/pipelineService.js)", + "Bash(wc -l /home/michael/ripster/debug/backend/data/logs/backend/*.log)" ] } } diff --git a/.gitignore b/.gitignore index a03b0e4..67ad41e 100644 --- a/.gitignore +++ b/.gitignore @@ -81,4 +81,5 @@ Thumbs.db # ---------------------------- /scripts/ /release.sh -/Audible_Tool \ No newline at end of file +/Audible_Tool +/AddOns \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index 5e60318..dcd1d12 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1,12 +1,12 @@ { "name": "ripster-backend", - "version": "0.10.2-1", + "version": "0.10.2-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ripster-backend", - "version": "0.10.2-1", + "version": "0.10.2-2", "dependencies": { "archiver": "^7.0.1", "cors": "^2.8.5", diff --git a/backend/package.json b/backend/package.json index b1f71d1..2747b6e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "ripster-backend", - "version": "0.10.2-1", + "version": "0.10.2-2", "private": true, "type": "commonjs", "scripts": { diff --git a/backend/src/services/pipelineService.js b/backend/src/services/pipelineService.js index e59fc40..310b2d7 100644 --- a/backend/src/services/pipelineService.js +++ b/backend/src/services/pipelineService.js @@ -3251,26 +3251,43 @@ function extractHandBrakeTrackSelectionFromPlan(encodePlan, inputPath = null) { return null; } - const audioTrackIds = normalizeTrackIdList( - (Array.isArray(encodeTitle.audioTracks) ? encodeTitle.audioTracks : []) - .filter((track) => Boolean(track?.selectedForEncode)) - .map((track) => track?.sourceTrackId ?? track?.id) - ); - const subtitleTrackIds = normalizeTrackIdList( - (Array.isArray(encodeTitle.subtitleTracks) ? encodeTitle.subtitleTracks : []) - .filter((track) => Boolean(track?.selectedForEncode)) - .map((track) => track?.sourceTrackId ?? track?.id) - ); - const selectedSubtitleTracks = (Array.isArray(encodeTitle.subtitleTracks) ? encodeTitle.subtitleTracks : []) - .filter((track) => Boolean(track?.selectedForEncode)); + const allAudioTracks = Array.isArray(encodeTitle.audioTracks) ? encodeTitle.audioTracks : []; + const allSubtitleTracks = Array.isArray(encodeTitle.subtitleTracks) ? encodeTitle.subtitleTracks : []; + + // manualTrackSelection stores validated track?.id values written by applyManualTrackSelectionToPlan. + // Use it as the authoritative source for audio/subtitle IDs. Fall back to the selectedForEncode + // flags on the track objects when the field is absent (e.g. auto-selected plans without user review). + // Always resolve through track?.id – never sourceTrackId, which may hold MakeMKV stream IDs + // (e.g. 189) that have no relation to HandBrake's 1-indexed track positions. + const manualSelection = plan.manualTrackSelection && typeof plan.manualTrackSelection === 'object' + ? plan.manualTrackSelection + : null; + const manualTitleId = normalizeReviewTitleId(manualSelection?.titleId); + const manualMatchesTitle = !manualTitleId || !encodeInputTitleId || manualTitleId === encodeInputTitleId; + + const audioTrackIds = (manualMatchesTitle && Array.isArray(manualSelection?.audioTrackIds)) + ? normalizeTrackIdList(manualSelection.audioTrackIds) + : normalizeTrackIdList(allAudioTracks.filter((t) => Boolean(t?.selectedForEncode)).map((t) => t?.id)); + + const subtitleTrackIds = (manualMatchesTitle && Array.isArray(manualSelection?.subtitleTrackIds)) + ? normalizeTrackIdList(manualSelection.subtitleTrackIds) + : normalizeTrackIdList(allSubtitleTracks.filter((t) => Boolean(t?.selectedForEncode)).map((t) => t?.id)); + + // Resolve burn/default/forced attributes from the actual track objects, matched by track?.id. + const subtitleTrackIdSet = new Set(subtitleTrackIds.map(String)); + const selectedSubtitleTracks = allSubtitleTracks.filter((t) => { + const tid = normalizeTrackIdList([t?.id])[0]; + return tid !== undefined && subtitleTrackIdSet.has(String(tid)); + }); + const subtitleBurnTrackId = normalizeTrackIdList( - selectedSubtitleTracks.filter((track) => Boolean(track?.burnIn)).map((track) => track?.sourceTrackId ?? track?.id) + selectedSubtitleTracks.filter((track) => Boolean(track?.burnIn)).map((track) => track?.id) )[0] || null; const subtitleDefaultTrackId = normalizeTrackIdList( - selectedSubtitleTracks.filter((track) => Boolean(track?.defaultTrack)).map((track) => track?.sourceTrackId ?? track?.id) + selectedSubtitleTracks.filter((track) => Boolean(track?.defaultTrack)).map((track) => track?.id) )[0] || null; const subtitleForcedTrackId = normalizeTrackIdList( - selectedSubtitleTracks.filter((track) => Boolean(track?.forced)).map((track) => track?.sourceTrackId ?? track?.id) + selectedSubtitleTracks.filter((track) => Boolean(track?.forced)).map((track) => track?.id) )[0] || null; const subtitleForcedOnly = selectedSubtitleTracks.some((track) => Boolean(track?.forcedOnly)); diff --git a/frontend/package-lock.json b/frontend/package-lock.json index bed5a80..35f725b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "ripster-frontend", - "version": "0.10.2-1", + "version": "0.10.2-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ripster-frontend", - "version": "0.10.2-1", + "version": "0.10.2-2", "dependencies": { "primeicons": "^7.0.0", "primereact": "^10.9.2", diff --git a/frontend/package.json b/frontend/package.json index 7a2ba23..de7df98 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "ripster-frontend", - "version": "0.10.2-1", + "version": "0.10.2-2", "private": true, "type": "module", "scripts": { diff --git a/package-lock.json b/package-lock.json index a7cf5c8..7539bc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ripster", - "version": "0.10.2-1", + "version": "0.10.2-2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ripster", - "version": "0.10.2-1", + "version": "0.10.2-2", "devDependencies": { "concurrently": "^9.1.2" } diff --git a/package.json b/package.json index cf39134..30b7348 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ripster", "private": true, - "version": "0.10.2-1", + "version": "0.10.2-2", "scripts": { "dev": "concurrently \"npm run dev --prefix backend\" \"npm run dev --prefix frontend\"", "dev:backend": "npm run dev --prefix backend",