From 6deb883472de40f391001f8f8c6d520654f773f1 Mon Sep 17 00:00:00 2001 From: Talon Date: Fri, 15 May 2026 04:10:06 +0200 Subject: [PATCH] Fix muxing --- .claude/settings.local.json | 20 ++ dist/server/db/jobStore.d.ts | 1 + dist/server/db/jobStore.js.map | 2 +- dist/server/public/app.d.ts | 6 +- dist/server/public/app.js | 320 ++++++++++++++++++------- dist/server/public/app.js.map | 2 +- dist/server/routes/config.js | 40 +++- dist/server/routes/config.js.map | 2 +- dist/server/routes/files.js | 72 +++++- dist/server/routes/files.js.map | 2 +- dist/server/routes/jobs.js | 7 +- dist/server/routes/jobs.js.map | 2 +- dist/server/services/jobManager.js | 61 ++++- dist/server/services/jobManager.js.map | 2 +- dist/server/services/muxer.d.ts | 1 + dist/server/services/muxer.js | 90 +++++-- dist/server/services/muxer.js.map | 2 +- dist/server/services/ytDlp.d.ts | 3 +- dist/server/services/ytDlp.js | 110 +++++++-- dist/server/services/ytDlp.js.map | 2 +- src/server/db/jobStore.ts | 1 + src/server/public/app.ts | 2 + src/server/public/index.html | 6 +- src/server/routes/jobs.ts | 9 +- src/server/services/jobManager.ts | 17 +- src/server/services/muxer.ts | 49 ++++ 26 files changed, 662 insertions(+), 169 deletions(-) create mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..a9126c7 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,20 @@ +{ + "permissions": { + "allow": [ + "Bash(dir D:\\\\code\\\\aidio-description *)", + "Bash(cd /d \"D:\\\\code\\\\aidio-description\")", + "Bash(Get-ChildItem -Filter \"package.json\" -Recurse)", + "Bash(Select-Object -ExpandProperty FullName)", + "Bash(Get-ChildItem -Path \"D:\\\\code\\\\aidio-description\" -Recurse -Include \".env*\")", + "Bash(Select-Object -First 20)", + "Bash(xargs grep -l \"tempDir\\\\|tempDir\\\\|frame_\\\\|batch_audio\")", + "Bash(npm run *)", + "Bash(npx tsc *)", + "Bash(curl -s -H \"Authorization: Basic YWRtaW46YWlkaW8yMDI0\" http://localhost:3000/api/config)", + "Bash(node -e \"const d=JSON.parse\\(require\\('fs'\\).readFileSync\\(0,'utf-8'\\)\\); const c=d.config||{}; console.log\\('keys:', Object.keys\\(c\\).sort\\(\\).join\\(', '\\)\\); console.log\\(\\); console.log\\('defaultPrompt \\(first 80 chars\\):'\\); console.log\\(' ' + \\(c.defaultPrompt||''\\).slice\\(0,80\\)\\); console.log\\(\\); console.log\\('visionProvider:', c.visionProvider\\); console.log\\('ttsProvider:', c.ttsProvider\\); console.log\\('tempDir:', c.tempDir\\); console.log\\('nested leaked?', 'visionProviders' in c, 'ttsProviders' in c\\);\")", + "Bash(powershell *)", + "Bash(AIDIO_DEFAULT_PROMPT=\"CUSTOM ENV OVERRIDE FOR TEST\" npm run *)", + "Bash(node -e \"const d=JSON.parse\\(require\\('fs'\\).readFileSync\\(0,'utf-8'\\)\\); console.log\\('defaultPrompt:', d.config.defaultPrompt\\);\")" + ] + } +} diff --git a/dist/server/db/jobStore.d.ts b/dist/server/db/jobStore.d.ts index 5fe39d5..fc82b34 100644 --- a/dist/server/db/jobStore.d.ts +++ b/dist/server/db/jobStore.d.ts @@ -2,6 +2,7 @@ export interface OutputOptions { audio: boolean; subtitles: boolean; muxed: boolean; + muxMode: 'separate' | 'mixed'; } export interface Job { id: string; diff --git a/dist/server/db/jobStore.js.map b/dist/server/db/jobStore.js.map index 97bca73..2f9d145 100644 --- a/dist/server/db/jobStore.js.map +++ b/dist/server/db/jobStore.js.map @@ -1 +1 @@ -{"version":3,"file":"jobStore.js","sourceRoot":"","sources":["../../../src/server/db/jobStore.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jobStore.js","sourceRoot":"","sources":["../../../src/server/db/jobStore.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/server/public/app.d.ts b/dist/server/public/app.d.ts index 5cf4b03..1185632 100644 --- a/dist/server/public/app.d.ts +++ b/dist/server/public/app.d.ts @@ -48,7 +48,6 @@ declare let authToken: string | null; declare let selectedFilePath: string | null; declare const sseMap: Map; declare let pollTimer: number | null; -declare const $: (sel: string) => HTMLElement; declare const $$: (sel: string) => NodeListOf; declare const el: (id: string) => HTMLElement; declare function apiHeaders(): Record; @@ -56,12 +55,15 @@ declare function api(method: string, url: string, body?: unknown): Promise(method: string, url: string, body?: unknown): Promise; declare function showLoginScreen(): void; declare function showMainScreen(): void; -declare function switchTab(name: string): void; +declare function activateTab(tablistId: string, tabId: string): void; +declare function onTabActivated(tablistId: string, panelId: string): void; +declare function wireTablist(tablistId: string): void; declare function escapeHtml(str: string | null | undefined): string; declare function formatSize(bytes: number): string; declare function loadBrowseFiles(): Promise; declare const videoUpload: HTMLInputElement; declare const uploadName: HTMLElement; +declare let youtubeStream: EventSource | null; declare function loadJobs(): Promise; declare function renderJobs(jobs: Job[]): void; declare function handleJobAction(id: string, action: string): Promise; diff --git a/dist/server/public/app.js b/dist/server/public/app.js index 454ed3b..e977e56 100644 --- a/dist/server/public/app.js +++ b/dist/server/public/app.js @@ -6,9 +6,13 @@ let selectedFilePath = null; const sseMap = new Map(); let pollTimer = null; // ── DOM helpers ─────────────────────────────────────── -const $ = (sel) => document.querySelector(sel); const $$ = (sel) => document.querySelectorAll(sel); -const el = (id) => document.getElementById(id); +const el = (id) => { + const e = document.getElementById(id); + if (!e) + throw new Error(`Missing element #${id}`); + return e; +}; // ── API ─────────────────────────────────────────────── function apiHeaders() { const h = { 'Content-Type': 'application/json' }; @@ -39,45 +43,75 @@ async function apiJson(method, url, body) { } // ── Screen switching ────────────────────────────────── function showLoginScreen() { - el('login-screen').classList.remove('hidden'); - el('main-screen').classList.add('hidden'); + el('login-screen').hidden = false; + el('main-screen').hidden = true; } function showMainScreen() { - el('login-screen').classList.add('hidden'); - el('main-screen').classList.remove('hidden'); + el('login-screen').hidden = true; + el('main-screen').hidden = false; } -// ── Tab navigation ──────────────────────────────────── -function switchTab(name) { - $$('button.tab').forEach(b => b.classList.remove('active')); - document.querySelector(`button.tab[data-tab="${name}"]`)?.classList.add('active'); - $$('.tab-content').forEach(c => c.classList.remove('active')); - const pane = document.getElementById(name); - if (pane) - pane.classList.add('active'); - if (name === 'dashboard') +// ── Tablist (WAI-ARIA) ──────────────────────────────── +function activateTab(tablistId, tabId) { + const tablist = el(tablistId); + const tabs = Array.from(tablist.querySelectorAll('[role="tab"]')); + tabs.forEach(t => { + const selected = t.id === tabId; + t.setAttribute('aria-selected', selected ? 'true' : 'false'); + t.setAttribute('tabindex', selected ? '0' : '-1'); + t.classList.toggle('active', selected); + const panelId = t.getAttribute('aria-controls'); + if (!panelId) + return; + const panel = document.getElementById(panelId); + if (panel) + panel.hidden = !selected; + }); + const tab = tabs.find(t => t.id === tabId); + const tabName = tab?.getAttribute('aria-controls') || ''; + onTabActivated(tablistId, tabName); +} +function onTabActivated(tablistId, panelId) { + if (tablistId !== 'main-tablist') + return; + if (panelId === 'dashboard') loadJobs(); - if (name === 'files') + if (panelId === 'files') loadFilesList(); } -$$('button.tab').forEach(btn => { - btn.addEventListener('click', () => switchTab(btn.dataset.tab || '')); -}); -// ── Mini tabs (video source) ────────────────────────── -$$('button.tab-mini').forEach(btn => { - btn.addEventListener('click', () => { - $$('button.tab-mini').forEach(b => b.classList.remove('active')); - btn.classList.add('active'); - $$('.src-panel').forEach(p => p.classList.remove('active')); - const panel = document.getElementById('src-' + (btn.dataset.src || '')); - if (panel) - panel.classList.add('active'); +function wireTablist(tablistId) { + const tablist = el(tablistId); + const tabs = Array.from(tablist.querySelectorAll('[role="tab"]')); + tabs.forEach(tab => { + tab.addEventListener('click', () => activateTab(tablistId, tab.id)); }); -}); + tablist.addEventListener('keydown', (e) => { + const ke = e; + const current = document.activeElement; + if (!current || !tabs.includes(current)) + return; + let next; + const idx = tabs.indexOf(current); + if (ke.key === 'ArrowRight') + next = tabs[(idx + 1) % tabs.length]; + else if (ke.key === 'ArrowLeft') + next = tabs[(idx - 1 + tabs.length) % tabs.length]; + else if (ke.key === 'Home') + next = tabs[0]; + else if (ke.key === 'End') + next = tabs[tabs.length - 1]; + if (next) { + ke.preventDefault(); + activateTab(tablistId, next.id); + next.focus(); + } + }); +} // ── Login ───────────────────────────────────────────── el('login-form').addEventListener('submit', async (e) => { e.preventDefault(); const username = el('login-username').value; const password = el('login-password').value; + const errorEl = el('login-error'); try { const res = await fetch('/api/auth/login', { method: 'POST', @@ -89,17 +123,18 @@ el('login-form').addEventListener('submit', async (e) => { authToken = data.token; if (authToken) sessionStorage.setItem('authToken', authToken); + errorEl.hidden = true; showMainScreen(); initApp(); } else { - el('login-error').textContent = data.error; - el('login-error').classList.remove('hidden'); + errorEl.textContent = data.error || 'Login failed'; + errorEl.hidden = false; } } catch { - el('login-error').textContent = 'Connection failed'; - el('login-error').classList.remove('hidden'); + errorEl.textContent = 'Connection failed'; + errorEl.hidden = false; } }); el('logout-btn').addEventListener('click', () => { @@ -160,37 +195,84 @@ const videoUpload = el('video-upload'); const uploadName = el('upload-name'); videoUpload.addEventListener('change', function () { if (this.files?.length) { - selectedFilePath = null; // will upload on submit + selectedFilePath = null; uploadName.textContent = `Selected: ${this.files[0].name} (${formatSize(this.files[0].size)})`; } else { uploadName.textContent = ''; } }); -// ── YouTube download ────────────────────────────────── -el('download-url').addEventListener('click', async () => { - const url = el('youtube-url').value; +// ── YouTube download (SSE) ──────────────────────────── +let youtubeStream = null; +el('download-url').addEventListener('click', () => { + const url = el('youtube-url').value.trim(); if (!url) return; + if (!authToken) + return; const status = el('download-status'); - status.textContent = 'Downloading...'; + const progressWrap = document.querySelector('.download-progress'); + const progressbar = el('download-progressbar'); + const fill = el('download-fill'); + status.textContent = 'Starting download...'; status.className = 'status'; - try { - const data = await apiJson('POST', '/api/files/youtube', { url }); - status.textContent = `Downloaded: ${data.filename}`; - status.className = 'status success'; - selectedFilePath = data.filePath; - const sel = el('video-select'); - const opt = document.createElement('option'); - opt.value = data.filePath; - opt.textContent = data.filename; - opt.selected = true; - sel.appendChild(opt); - } - catch (err) { - status.textContent = `Error: ${err.message}`; + if (progressWrap) + progressWrap.hidden = false; + progressbar.setAttribute('aria-valuenow', '0'); + fill.style.width = '0%'; + if (youtubeStream) + youtubeStream.close(); + const streamUrl = `/api/files/youtube/stream?url=${encodeURIComponent(url)}&token=${encodeURIComponent(authToken)}`; + const es = new EventSource(streamUrl); + youtubeStream = es; + es.onmessage = (event) => { + let data; + try { + data = JSON.parse(event.data); + } + catch { + return; + } + if (data.type === 'progress' && typeof data.percent === 'number') { + const pct = Math.max(0, Math.min(100, data.percent)); + progressbar.setAttribute('aria-valuenow', String(Math.round(pct))); + fill.style.width = `${pct}%`; + status.textContent = `Downloading ${pct.toFixed(1)}%`; + return; + } + if (data.type === 'done' && data.filePath && data.filename) { + progressbar.setAttribute('aria-valuenow', '100'); + fill.style.width = '100%'; + status.textContent = `Downloaded: ${data.filename}`; + status.className = 'status success'; + selectedFilePath = data.filePath; + const sel = el('video-select'); + const opt = document.createElement('option'); + opt.value = data.filePath; + opt.textContent = data.filename; + opt.selected = true; + sel.appendChild(opt); + es.close(); + youtubeStream = null; + return; + } + if (data.type === 'error') { + status.textContent = `Error: ${data.message || 'Download failed'}`; + status.className = 'status error'; + if (progressWrap) + progressWrap.hidden = true; + es.close(); + youtubeStream = null; + } + }; + es.onerror = () => { + if (es.readyState === EventSource.CLOSED) + return; + status.textContent = 'Connection lost'; status.className = 'status error'; - } + es.close(); + youtubeStream = null; + }; }); // ── New Job form ────────────────────────────────────── el('new-job-form').addEventListener('submit', async (e) => { @@ -233,10 +315,18 @@ el('new-job-form').addEventListener('submit', async (e) => { else config[key] = val; } + // Empty strings would clobber server-side defaults during the spread-merge in + // JobManager.createJob — drop them. (The server also filters defensively.) + for (const k of Object.keys(config)) { + const v = config[k]; + if (v === '' || v === undefined || v === null) + delete config[k]; + } const outputOptions = { audio: fd.get('output-audio') === 'on', subtitles: fd.get('output-subtitles') === 'on', muxed: fd.get('output-muxed') === 'on', + muxMode: fd.get('mux-mode') === 'mixed' ? 'mixed' : 'separate', }; if (config.visionProvider) { const vp = {}; @@ -260,6 +350,7 @@ el('new-job-form').addEventListener('submit', async (e) => { delete config['output-audio']; delete config['output-subtitles']; delete config['output-muxed']; + delete config['mux-mode']; try { const data = await apiJson('POST', '/api/jobs', { videoPath: selectedFilePath, @@ -271,7 +362,7 @@ el('new-job-form').addEventListener('submit', async (e) => { videoUpload.value = ''; uploadName.textContent = ''; el('new-job-form').reset(); - switchTab('dashboard'); + activateTab('main-tablist', 'tab-dashboard'); } catch (err) { alert('Error creating job: ' + err.message); @@ -279,6 +370,8 @@ el('new-job-form').addEventListener('submit', async (e) => { }); // ── Job list & rendering ────────────────────────────── async function loadJobs() { + const container = el('jobs-list'); + container.setAttribute('aria-busy', 'true'); try { const data = await apiJson('GET', '/api/jobs'); renderJobs(data.jobs); @@ -291,11 +384,14 @@ async function loadJobs() { catch (err) { console.error(err); } + finally { + container.setAttribute('aria-busy', 'false'); + } } function renderJobs(jobs) { const container = el('jobs-list'); if (!jobs.length) { - container.innerHTML = '

No jobs yet. Create one from the "New Job" tab.

'; + container.innerHTML = '

No jobs yet. Create one from the “New Job” tab.

'; return; } container.innerHTML = jobs.map(j => { @@ -303,50 +399,57 @@ function renderJobs(jobs) { const progressClass = j.status === 'completed' ? 'completed' : j.status === 'failed' ? 'failed' : ''; const downloads = []; if (j.status === 'completed') { + // Plain navigations don't send our Authorization header. + // Pass the token via query string — middleware/auth.ts accepts ?token=. + const tok = authToken ? `token=${encodeURIComponent(authToken)}` : ''; + const sep = (qs) => qs.includes('?') ? '&' : '?'; + const url = (path) => tok ? `${path}${sep(path)}${tok}` : path; if (j.output_audio) - downloads.push(`Audio`); + downloads.push(`Audio`); if (j.output_subtitles_srt) - downloads.push(`SRT`); + downloads.push(`SRT`); if (j.output_subtitles_vtt) - downloads.push(`VTT`); + downloads.push(`VTT`); if (j.output_muxed) - downloads.push(`Muxed`); + downloads.push(`Muxed`); } let actions = ''; if (j.status === 'pending' || j.status === 'queued') { - actions += ``; + actions += ``; } if (j.status === 'processing') { - actions += ``; + actions += ``; } if (j.status === 'failed' || j.status === 'paused' || j.status === 'cancelled') { - actions += ``; + actions += ``; } if (j.status !== 'processing') { - actions += ``; + actions += ``; } + const pct = Math.round(j.progress); return ` -
+
-

${escapeHtml(j.video_filename)}

+

${escapeHtml(j.video_filename)}

${actions}
${j.status} -
+
+
+
- ${Math.round(j.progress)}% + ${pct}% Idx: ${j.current_index}/${j.total_units} ${new Date(j.created_at).toLocaleString()}
- ${j.error ? `
${escapeHtml(j.error)}
` : ''} + ${j.error ? `` : ''} ${downloads.length ? `` : ''} -
-
${segs.map((s, i) => `
[${s.startTime.toFixed(1)}s] ${escapeHtml(s.description)}
`).join('')}
+ + - -
`; +
`; }).join(''); - // Wire up action buttons container.querySelectorAll('.act-start').forEach(b => b.addEventListener('click', () => handleJobAction(b.dataset.id || '', 'start'))); container.querySelectorAll('.act-pause').forEach(b => b.addEventListener('click', () => handleJobAction(b.dataset.id || '', 'pause'))); container.querySelectorAll('.act-restart').forEach(b => b.addEventListener('click', () => handleJobAction(b.dataset.id || '', 'restart'))); @@ -357,10 +460,12 @@ function renderJobs(jobs) { const detail = container.querySelector(`.job-detail[data-id="${jobId}"]`); if (!detail) return; - detail.classList.toggle('open'); + const willOpen = detail.hidden; + detail.hidden = !willOpen; + b.setAttribute('aria-expanded', willOpen ? 'true' : 'false'); const job = jobs.find(j => j.id === jobId); const segs = job ? JSON.parse(job.segments || '[]') : []; - b.textContent = detail.classList.contains('open') ? 'Hide segments' : `${segs.length} segments`; + b.textContent = willOpen ? 'Hide segments' : `${segs.length} segments`; }); }); } @@ -386,6 +491,8 @@ function startPolling() { function connectSSE(jobId) { if (sseMap.has(jobId)) return; + if (!authToken) + return; const es = new EventSource(`/api/jobs/${jobId}/progress?token=${encodeURIComponent(authToken)}`); es.onmessage = (event) => { const data = JSON.parse(event.data); @@ -410,9 +517,13 @@ function updateJobCard(jobId, data) { badge.className = `status-badge status-${data.status}`; badge.textContent = data.status; } + const pct = Math.round(data.progress); + const bar = card.querySelector('[role="progressbar"]'); + if (bar) + bar.setAttribute('aria-valuenow', String(pct)); const fill = card.querySelector('.progress-fill'); if (fill) { - fill.style.width = data.progress + '%'; + fill.style.width = pct + '%'; fill.className = 'progress-fill'; if (data.status === 'completed') fill.classList.add('completed'); @@ -421,7 +532,7 @@ function updateJobCard(jobId, data) { } const metaSpans = card.querySelectorAll('.job-meta span'); if (metaSpans[0]) - metaSpans[0].textContent = Math.round(data.progress) + '%'; + metaSpans[0].textContent = pct + '%'; if (metaSpans[1]) metaSpans[1].textContent = `Idx: ${data.currentIndex}/${data.totalUnits}`; const log = card.querySelector('.segment-log'); @@ -430,7 +541,9 @@ function updateJobCard(jobId, data) { } const toggleBtn = card.querySelector('.toggle-detail'); if (toggleBtn && data.segments) { - toggleBtn.textContent = `${data.segments.length} segments`; + const expanded = toggleBtn.getAttribute('aria-expanded') === 'true'; + if (!expanded) + toggleBtn.textContent = `${data.segments.length} segments`; } } // ── Settings ────────────────────────────────────────── @@ -443,7 +556,10 @@ async function loadSettings() { container.innerHTML = '

No custom settings yet. Settings from .env are used as defaults.

'; return; } - container.innerHTML = entries.map(([key, value]) => ``).join(''); + container.innerHTML = entries.map(([key, value]) => { + const safeKey = escapeHtml(key); + return `
`; + }).join(''); } catch (err) { console.error(err); @@ -472,7 +588,7 @@ async function loadFilesList() { const tbody = document.querySelector('#files-table tbody'); tbody.innerHTML = data.files.map(f => ` - + ${escapeHtml(f.filename)} ${formatSize(f.size)} @@ -480,6 +596,9 @@ async function loadFilesList() { tbody.querySelectorAll('.file-checkbox').forEach(cb => { cb.addEventListener('change', updateFileSelection); }); + el('select-all-files').checked = false; + selectedFiles.clear(); + updateFileSelection(); } catch (err) { console.error(err); @@ -488,8 +607,8 @@ async function loadFilesList() { function updateFileSelection() { selectedFiles.clear(); document.querySelectorAll('.file-checkbox:checked').forEach(cb => { - if (cb.dataset.path) - selectedFiles.add(cb.dataset.path); + if (cb.dataset.filename) + selectedFiles.add(cb.dataset.filename); }); el('delete-selected-files').disabled = selectedFiles.size === 0; } @@ -499,10 +618,25 @@ el('select-all-files').addEventListener('change', function () { }); updateFileSelection(); }); -el('delete-selected-files').addEventListener('click', () => { +el('delete-selected-files').addEventListener('click', async () => { + if (!selectedFiles.size) + return; if (!confirm(`Delete ${selectedFiles.size} file(s)?`)) return; - alert('File deletion not yet implemented'); + const failures = []; + for (const filename of selectedFiles) { + try { + await api('DELETE', `/api/files/${encodeURIComponent(filename)}`); + } + catch (err) { + failures.push(`${filename}: ${err.message}`); + } + } + if (failures.length) { + alert(`Some deletions failed:\n${failures.join('\n')}`); + } + await loadFilesList(); + await loadBrowseFiles(); }); el('refresh-files-list').addEventListener('click', loadFilesList); // ── Config defaults for New Job form ───────────────── @@ -525,15 +659,14 @@ async function loadConfigDefaults() { } } const fields = [ - ['visionModel'], ['ttsModel'], ['ttsVoice'], ['ttsSpeedFactor'], - ['ttsInstructions', 'textarea'], ['batchWindowDuration'], ['framesInBatch'], - ['captureIntervalSeconds'], ['contextWindowSize'], - ['defaultPrompt', 'textarea'], ['changePrompt', 'textarea'], ['batchPrompt', 'textarea'], + 'visionModel', 'ttsModel', 'ttsVoice', 'ttsSpeedFactor', 'ttsInstructions', + 'batchWindowDuration', 'framesInBatch', 'captureIntervalSeconds', 'contextWindowSize', + 'defaultPrompt', 'changePrompt', 'batchPrompt', ]; - for (const [name, tag] of fields) { - const el = document.querySelector(`[name="${name}"]`); - if (el && c[name] !== undefined) - el.value = c[name]; + for (const name of fields) { + const field = document.querySelector(`[name="${name}"]`); + if (field && c[name] !== undefined) + field.value = c[name]; } } catch (err) { @@ -542,9 +675,12 @@ async function loadConfigDefaults() { } // ── Init ────────────────────────────────────────────── function initApp() { + wireTablist('main-tablist'); + wireTablist('source-tablist'); loadJobs(); loadBrowseFiles(); loadConfigDefaults(); + loadSettings(); startPolling(); } // ── Startup ─────────────────────────────────────────── diff --git a/dist/server/public/app.js.map b/dist/server/public/app.js.map index 383bd3e..6b0b51b 100644 --- a/dist/server/public/app.js.map +++ b/dist/server/public/app.js.map @@ -1 +1 @@ -{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/server/public/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/server/public/app.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/server/routes/config.js b/dist/server/routes/config.js index 4323ca8..ec3c43e 100644 --- a/dist/server/routes/config.js +++ b/dist/server/routes/config.js @@ -2,10 +2,43 @@ Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = require("express"); const jobStore_1 = require("../db/jobStore"); +const config_1 = require("../../config/config"); const router = (0, express_1.Router)(); +// Optional .env overrides for the (long) prompt strings — keep getDefaultConfig()'s +// hardcoded prompts as the final fallback. Users who want to tweak prompts without +// editing source can set these in .env, or set them per-job in the Settings UI. +const ENV_OVERRIDES = { + defaultPrompt: process.env.AIDIO_DEFAULT_PROMPT, + changePrompt: process.env.AIDIO_CHANGE_PROMPT, + batchPrompt: process.env.AIDIO_BATCH_PROMPT, +}; +// Fields in Config that are nested objects (provider configs, etc.) and shouldn't +// be flattened into the form-facing config map. API keys live inside these — keep +// them off the wire. +const NESTED_FIELDS = new Set(['visionProviders', 'ttsProviders']); +function buildLayeredConfig() { + const defaults = (0, config_1.getDefaultConfig)(); + const db = (0, jobStore_1.getAllConfig)(); + const merged = {}; + for (const [key, value] of Object.entries(defaults)) { + if (NESTED_FIELDS.has(key)) + continue; + if (value === undefined || value === null) + continue; + merged[key] = String(value); + } + for (const [key, value] of Object.entries(ENV_OVERRIDES)) { + if (value !== undefined && value !== '') + merged[key] = value; + } + for (const [key, value] of Object.entries(db)) { + if (value !== undefined && value !== '') + merged[key] = value; + } + return merged; +} router.get('/', (_req, res) => { - const config = (0, jobStore_1.getAllConfig)(); - res.json({ config }); + res.json({ config: buildLayeredConfig() }); }); router.put('/', (req, res) => { const updates = req.body; @@ -16,8 +49,7 @@ router.put('/', (req, res) => { for (const [key, value] of Object.entries(updates)) { (0, jobStore_1.setConfigValue)(key, String(value)); } - const config = (0, jobStore_1.getAllConfig)(); - res.json({ config }); + res.json({ config: buildLayeredConfig() }); }); exports.default = router; //# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/dist/server/routes/config.js.map b/dist/server/routes/config.js.map index 2ada3bd..f192374 100644 --- a/dist/server/routes/config.js.map +++ b/dist/server/routes/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/server/routes/config.ts"],"names":[],"mappings":";;AAAA,qCAAoD;AACpD,6CAA8D;AAE9D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAA,uBAAY,GAAE,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;IACzB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAA,yBAAc,EAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,uBAAY,GAAE,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/server/routes/config.ts"],"names":[],"mappings":";;AAAA,qCAAoD;AACpD,6CAA8D;AAC9D,gDAAuD;AAEvD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,oFAAoF;AACpF,mFAAmF;AACnF,gFAAgF;AAChF,MAAM,aAAa,GAAuC;IACxD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;IAC/C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB;IAC7C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;CAC5C,CAAC;AAEF,kFAAkF;AAClF,kFAAkF;AAClF,qBAAqB;AACrB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC,CAAC;AAEnE,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,IAAA,yBAAgB,GAAwC,CAAC;IAC1E,MAAM,EAAE,GAAG,IAAA,uBAAY,GAAE,CAAC;IAE1B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACzD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/D,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAC/C,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;IACzB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAA,yBAAc,EAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/dist/server/routes/files.js b/dist/server/routes/files.js index c6598e0..a2558d3 100644 --- a/dist/server/routes/files.js +++ b/dist/server/routes/files.js @@ -65,23 +65,69 @@ router.get('/', (_req, res) => { .sort((a, b) => b.filePath.localeCompare(a.filePath)); res.json({ files }); }); -router.post('/youtube', (req, res) => { +router.delete('/:filename', (req, res) => { + const raw = req.params.filename; + const requested = Array.isArray(raw) ? raw[0] : raw; + if (!requested) { + res.status(400).json({ error: 'filename is required' }); + return; + } + const resolved = path_1.default.resolve(UPLOADS_DIR, requested); + const uploadsWithSep = UPLOADS_DIR.endsWith(path_1.default.sep) ? UPLOADS_DIR : UPLOADS_DIR + path_1.default.sep; + if (!resolved.startsWith(uploadsWithSep)) { + res.status(400).json({ error: 'Invalid filename' }); + return; + } + if (!fs_1.default.existsSync(resolved)) { + res.status(404).json({ error: 'File not found' }); + return; + } + try { + fs_1.default.unlinkSync(resolved); + res.json({ ok: true }); + } + catch (err) { + res.status(500).json({ error: `Failed to delete: ${err.message}` }); + } +}); +// Stream yt-dlp download progress over SSE. +// Returns events: {type:'progress', percent} ... {type:'done', filePath, filename, title} +// or {type:'error', message} +router.get('/youtube/stream', (req, res) => { + const url = req.query.url || ''; + if (!url) { + res.status(400).json({ error: 'url query param is required' }); + return; + } if (!(0, ytDlp_1.isYtDlpAvailable)()) { res.status(400).json({ error: 'yt-dlp is not installed or not in PATH' }); return; } - const { url } = req.body; - if (!url) { - res.status(400).json({ error: 'URL is required' }); - return; - } - try { - const result = (0, ytDlp_1.downloadVideo)(url, UPLOADS_DIR); - res.json(result); - } - catch (err) { - res.status(500).json({ error: `Failed to download: ${err.message}` }); - } + res.setHeader('Content-Type', 'text/event-stream'); + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Connection', 'keep-alive'); + res.setHeader('X-Accel-Buffering', 'no'); + res.flushHeaders?.(); + const send = (data) => { + res.write(`data: ${JSON.stringify(data)}\n\n`); + }; + let clientGone = false; + req.on('close', () => { clientGone = true; }); + (0, ytDlp_1.downloadVideo)(url, UPLOADS_DIR, (percent) => { + if (clientGone) + return; + send({ type: 'progress', percent }); + }).then((result) => { + if (clientGone) + return; + send({ type: 'done', ...result }); + res.end(); + }).catch((err) => { + if (clientGone) + return; + send({ type: 'error', message: err.message }); + res.end(); + }); }); exports.default = router; //# sourceMappingURL=files.js.map \ No newline at end of file diff --git a/dist/server/routes/files.js.map b/dist/server/routes/files.js.map index bc70c3e..59dc870 100644 --- a/dist/server/routes/files.js.map +++ b/dist/server/routes/files.js.map @@ -1 +1 @@ -{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/server/routes/files.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/server/routes/files.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/server/routes/jobs.js b/dist/server/routes/jobs.js index 3f8138b..2dd6f0f 100644 --- a/dist/server/routes/jobs.js +++ b/dist/server/routes/jobs.js @@ -145,10 +145,13 @@ function createJobsRouter(jobManager) { filePath = format === 'vtt' ? job.output_subtitles_vtt : job.output_subtitles_srt; filename = `${path_1.default.basename(job.video_filename, path_1.default.extname(job.video_filename))}_description.${format}`; break; - case 'muxed': + case 'muxed': { + const opts = JSON.parse(job.output_options || '{}'); + const suffix = opts.muxMode === 'mixed' ? '_described_mixed' : '_described'; filePath = job.output_muxed; - filename = `${path_1.default.basename(job.video_filename, path_1.default.extname(job.video_filename))}_described.mkv`; + filename = `${path_1.default.basename(job.video_filename, path_1.default.extname(job.video_filename))}${suffix}.mkv`; break; + } default: res.status(400).json({ error: 'Invalid download type' }); return; diff --git a/dist/server/routes/jobs.js.map b/dist/server/routes/jobs.js.map index 16cb52f..4cf9cc1 100644 --- a/dist/server/routes/jobs.js.map +++ b/dist/server/routes/jobs.js.map @@ -1 +1 @@ -{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/server/routes/jobs.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/server/routes/jobs.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/server/services/jobManager.js b/dist/server/services/jobManager.js index 3a09270..2570c7d 100644 --- a/dist/server/services/jobManager.js +++ b/dist/server/services/jobManager.js @@ -13,6 +13,20 @@ const muxer_1 = require("./muxer"); const config_1 = require("../../config/config"); const mediaUtils_1 = require("../../utils/mediaUtils"); const events_1 = require("events"); +function jobTempDir(baseTempDir, jobId) { + return path_1.default.join(baseTempDir, jobId); +} +function safeCleanupJobTmp(dir) { + try { + if (!fs_1.default.existsSync(dir)) + return; + (0, mediaUtils_1.cleanupTempFiles)(dir); + fs_1.default.rmSync(dir, { recursive: true, force: true }); + } + catch (err) { + console.warn(`Failed to clean up tmp dir ${dir}:`, err.message); + } +} class JobManager { constructor() { this.queue = []; @@ -33,12 +47,22 @@ class JobManager { } createJob(videoPath, configOverride = {}, outputOptions = {}) { const baseConfig = (0, config_1.getDefaultConfig)(); - const mergedConfig = { ...baseConfig, ...configOverride }; + // Drop empty/undefined/null values so blank form fields don't clobber the + // baked-in defaults (a blank prompt textarea must NOT overwrite the real + // prompt with ""). + const cleanedOverride = {}; + for (const [k, v] of Object.entries(configOverride)) { + if (v === '' || v === null || v === undefined) + continue; + cleanedOverride[k] = v; + } + const mergedConfig = { ...baseConfig, ...cleanedOverride }; const filename = path_1.default.basename(videoPath); const opts = { audio: outputOptions.audio !== false, subtitles: outputOptions.subtitles !== false, - muxed: outputOptions.muxed || false + muxed: outputOptions.muxed || false, + muxMode: outputOptions.muxMode === 'mixed' ? 'mixed' : 'separate' }; return (0, jobStore_1.createJob)(videoPath, filename, mergedConfig, opts); } @@ -92,6 +116,18 @@ class JobManager { throw new Error('Job not found'); if (job.status === 'processing') throw new Error('Cannot delete a running job'); + try { + const config = JSON.parse(job.config); + // job.config may contain either the base tempDir (older jobs) or the + // per-job tempDir (newer jobs). Trim a trailing job-id segment if present; + // otherwise compute the per-job dir from the stored base. + const stored = config.tempDir || './desc/tmp/'; + const candidate = path_1.default.basename(stored) === jobId ? stored : jobTempDir(stored, jobId); + safeCleanupJobTmp(candidate); + } + catch { + // ignore: cleanup is best-effort and must not block deletion + } (0, jobStore_1.deleteJob)(jobId); } listJobs() { @@ -156,6 +192,14 @@ class JobManager { this.emitProgress(job.id); const config = JSON.parse(job.config); const outputOptions = JSON.parse(job.output_options); + // Isolate this job's intermediates so concurrent jobs (or future resumes) + // don't collide on filenames like frame_00001.jpg / segment_3_std.wav. + // The pipeline already reads config.tempDir, so just override it here. + const baseTempDir = config.tempDir || './desc/tmp/'; + if (path_1.default.basename(baseTempDir) !== job.id) { + config.tempDir = jobTempDir(baseTempDir, job.id); + } + fs_1.default.mkdirSync(config.tempDir, { recursive: true }); const existingSegments = JSON.parse(job.segments || '[]'); const lastContext = JSON.parse(job.last_context || '{}'); const startIndex = existingSegments.length > 0 ? job.current_index : 0; @@ -209,8 +253,14 @@ class JobManager { outputSubtitlesVtt = vttPath; } if (outputOptions.muxed && fs_1.default.existsSync(outputAudio)) { - const muxedPath = path_1.default.join(outputDir, `${baseName}_described.mkv`); - (0, muxer_1.muxAudioDescription)(job.video_path, outputAudio, muxedPath); + const isMixed = outputOptions.muxMode === 'mixed'; + const muxedPath = path_1.default.join(outputDir, `${baseName}${isMixed ? '_described_mixed' : '_described'}.mkv`); + if (isMixed) { + (0, muxer_1.muxMixedAudioDescription)(job.video_path, outputAudio, muxedPath); + } + else { + (0, muxer_1.muxAudioDescription)(job.video_path, outputAudio, muxedPath); + } outputMuxed = muxedPath; } (0, jobStore_1.saveJobOutputs)(job.id, { @@ -222,9 +272,11 @@ class JobManager { (0, jobStore_1.saveCheckpoint)(job.id, JSON.stringify(segments), totalUnits, totalUnits, 0, '{}', 100); (0, jobStore_1.updateJobStatus)(job.id, 'completed'); this.emitProgress(job.id); + safeCleanupJobTmp(config.tempDir); } catch (err) { if (err.message === 'JOB_PAUSED') { + // Keep config.tempDir intact — restart will resume into the same dir. (0, jobStore_1.updateJobStatus)(job.id, 'paused'); this.emitProgress(job.id); return; @@ -232,6 +284,7 @@ class JobManager { const errorMsg = err.message || 'Unknown error'; (0, jobStore_1.updateJobStatus)(job.id, 'failed', errorMsg); this.emitProgress(job.id); + safeCleanupJobTmp(config.tempDir); } } } diff --git a/dist/server/services/jobManager.js.map b/dist/server/services/jobManager.js.map index 39453a7..afcb3ad 100644 --- a/dist/server/services/jobManager.js.map +++ b/dist/server/services/jobManager.js.map @@ -1 +1 @@ -{"version":3,"file":"jobManager.js","sourceRoot":"","sources":["../../../src/server/services/jobManager.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jobManager.js","sourceRoot":"","sources":["../../../src/server/services/jobManager.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,6CAGwB;AACxB,qDAA4E;AAC5E,2DAA+D;AAC/D,mCAAwE;AACxE,gDAA+D;AAE/D,uDAA4E;AAC5E,mCAAsC;AAEtC,SAAS,UAAU,CAAC,WAAmB,EAAE,KAAa;IACpD,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO;QAChC,IAAA,6BAAgB,EAAC,GAAG,CAAC,CAAC;QACtB,YAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAgBD,MAAa,UAAU;IAOrB;QANQ,UAAK,GAAa,EAAE,CAAC;QACrB,eAAU,GAAG,KAAK,CAAC;QACnB,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,YAAO,GAAG,IAAI,qBAAY,EAAE,CAAC;QAC7B,iBAAY,GAA0C,IAAI,CAAC;QAGjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAEO,gBAAgB;QACtB,MAAM,IAAI,GAAG,IAAA,qBAAU,GAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAChC,IAAA,0BAAe,EAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,+FAA+F,CAAC,CAAC;YACrI,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,SAAiB,EAAE,iBAAkC,EAAE,EAAE,gBAAwC,EAAE;QAC3G,MAAM,UAAU,GAAG,IAAA,yBAAgB,GAAE,CAAC;QAEtC,0EAA0E;QAC1E,yEAAyE;QACzE,mBAAmB;QACnB,MAAM,eAAe,GAA4B,EAAE,CAAC;QACpD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;gBAAE,SAAS;YACxD,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,YAAY,GAAW,EAAE,GAAG,UAAU,EAAE,GAAI,eAAmC,EAAE,CAAC;QAExF,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAkB;YAC1B,KAAK,EAAE,aAAa,CAAC,KAAK,KAAK,KAAK;YACpC,SAAS,EAAE,aAAa,CAAC,SAAS,KAAK,KAAK;YAC5C,KAAK,EAAE,aAAa,CAAC,KAAK,IAAI,KAAK;YACnC,OAAO,EAAE,aAAa,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;SAClE,CAAC;QAEF,OAAO,IAAA,oBAAS,EAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC9E,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE5E,IAAA,0BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAEvF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAA,0BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACrF,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAA,0BAAe,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAE3C,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,IAAA,0BAAe,EAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,KAAa;QACrB,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAEhF,IAAI,CAAC;YACH,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,qEAAqE;YACrE,2EAA2E;YAC3E,0DAA0D;YAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC;YAC/C,MAAM,SAAS,GAAG,cAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvF,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QAED,IAAA,oBAAe,EAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ;QACN,OAAO,IAAA,qBAAU,GAAE,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,KAAa,EAAE,QAAsC;QACjE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;oBAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBACtC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;wBAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,KAAa;QAChC,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,IAAI,GAAiB;YACzB,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;YAC1C,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;YAC9C,oBAAoB,EAAE,GAAG,CAAC,oBAAoB;YAC9C,YAAY,EAAE,GAAG,CAAC,YAAY;SAC/B,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAE5B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YAElC,MAAM,GAAG,GAAG,IAAA,iBAAM,EAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS;YAE9C,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAQ;QAC/B,IAAA,0BAAe,EAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,aAAa,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEpE,0EAA0E;QAC1E,uEAAuE;QACvE,uEAAuE;QACvE,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,IAAI,aAAa,CAAC;QACpD,IAAI,cAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,YAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,gBAAgB,GAAmB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAiB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;QAEvE,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,iBAAiB,GAAG,GAAG,CAAC,qBAAqB,IAAI,CAAC,CAAC;QAEzD,MAAM,aAAa,GAAG,IAAA,6BAAgB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa;YACrC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAE9D,IAAA,yBAAc,EAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QACpI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,+CAAmC,EACtD,GAAG,CAAC,UAAU,EACd,MAAM,EACN;gBACE,UAAU;gBACV,gBAAgB;gBAChB,WAAW;gBACX,mBAAmB,EAAE,iBAAiB;gBACtC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;oBACnB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAChC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;oBAChC,CAAC;oBAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU;wBAC1E,CAAC,CAAC,CAAC,GAAG,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC;wBACrC,CAAC,CAAC,CAAC,GAAG,EAAE;4BACJ,MAAM,UAAU,GAAG,IAAA,iBAAM,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BAClC,IAAI,CAAC,UAAU;gCAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;4BACrD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BACxB,OAAO,IAAI,CAAC;wBACd,CAAC,CAAC,EAAE,CAAC;oBAET,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAE3F,IAAA,yBAAc,EACZ,GAAG,CAAC,EAAE,EACN,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAC3B,IAAI,CAAC,KAAK,GAAG,CAAC,EACd,UAAU,EACV,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EACpF,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAC3B,QAAQ,CACT,CAAC;oBAEF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC;aACF,CACF,CAAC;YAEF,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAEvC,+EAA+E;YAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC;YAEhD,IAAI,kBAAkB,GAAkB,IAAI,CAAC;YAC7C,IAAI,kBAAkB,GAAkB,IAAI,CAAC;YAC7C,IAAI,WAAW,GAAkB,IAAI,CAAC;YAEtC,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7E,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAEnC,IAAI,aAAa,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,kBAAkB,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,kBAAkB,CAAC,CAAC;gBACpE,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAA,+BAAW,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;gBAChE,YAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAA,+BAAW,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;gBAChE,kBAAkB,GAAG,OAAO,CAAC;gBAC7B,kBAAkB,GAAG,OAAO,CAAC;YAC/B,CAAC;YAED,IAAI,aAAa,CAAC,KAAK,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,KAAK,OAAO,CAAC;gBAClD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CACzB,SAAS,EACT,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,MAAM,CAChE,CAAC;gBACF,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAA,gCAAwB,EAAC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,IAAA,2BAAmB,EAAC,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBAC9D,CAAC;gBACD,WAAW,GAAG,SAAS,CAAC;YAC1B,CAAC;YAED,IAAA,yBAAc,EAAC,GAAG,CAAC,EAAE,EAAE;gBACrB,KAAK,EAAE,WAAW;gBAClB,YAAY,EAAE,kBAAkB,IAAI,SAAS;gBAC7C,YAAY,EAAE,kBAAkB,IAAI,SAAS;gBAC7C,KAAK,EAAE,WAAW,IAAI,SAAS;aAChC,CAAC,CAAC;YAEH,IAAA,yBAAc,EAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACvF,IAAA,0BAAe,EAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAE1B,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEpC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;gBACjC,sEAAsE;gBACtE,IAAA,0BAAe,EAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,IAAI,eAAe,CAAC;YAChD,IAAA,0BAAe,EAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAE1B,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AArTD,gCAqTC"} \ No newline at end of file diff --git a/dist/server/services/muxer.d.ts b/dist/server/services/muxer.d.ts index 42baaae..972576a 100644 --- a/dist/server/services/muxer.d.ts +++ b/dist/server/services/muxer.d.ts @@ -1 +1,2 @@ export declare function muxAudioDescription(videoPath: string, audioPath: string, outputPath: string): void; +export declare function muxMixedAudioDescription(videoPath: string, audioPath: string, outputPath: string): void; diff --git a/dist/server/services/muxer.js b/dist/server/services/muxer.js index 92ca3f6..e027514 100644 --- a/dist/server/services/muxer.js +++ b/dist/server/services/muxer.js @@ -4,26 +4,80 @@ var __importDefault = (this && this.__importDefault) || function (mod) { }; Object.defineProperty(exports, "__esModule", { value: true }); exports.muxAudioDescription = muxAudioDescription; +exports.muxMixedAudioDescription = muxMixedAudioDescription; const child_process_1 = require("child_process"); const path_1 = __importDefault(require("path")); +const fs_1 = __importDefault(require("fs")); function muxAudioDescription(videoPath, audioPath, outputPath) { - const ext = path_1.default.extname(outputPath).toLowerCase(); - const isMkv = ext === '.mkv'; - const cmd = [ - 'ffmpeg -v error', - `-i "${videoPath}"`, - `-i "${audioPath}"`, - '-map 0:v', - '-map 0:a?', - '-map 1:a', - '-c:v copy', - '-c:a copy', - isMkv - ? '-metadata:s:a:1 title="Audio Description"' - : '-metadata:s:a:1 title="Audio Description"', - `"${outputPath}"`, - '-y' - ].join(' '); - (0, child_process_1.execSync)(cmd); + if (!fs_1.default.existsSync(videoPath)) { + throw new Error(`mux: video not found: ${videoPath}`); + } + if (!fs_1.default.existsSync(audioPath)) { + throw new Error(`mux: audio not found: ${audioPath}`); + } + fs_1.default.mkdirSync(path_1.default.dirname(outputPath), { recursive: true }); + // Argv form — no shell, no quoting issues, and -y is a global option (placed + // up front, not after the output). Stderr is captured so failures aren't + // silent. + const args = [ + '-y', + '-v', 'error', + '-i', videoPath, + '-i', audioPath, + '-map', '0:v', + '-map', '0:a?', + '-map', '1:a', + '-c:v', 'copy', + '-c:a', 'copy', + '-metadata:s:a:1', 'title=Audio Description', + '-disposition:a:1', 'visual_impaired', + outputPath, + ]; + const result = (0, child_process_1.spawnSync)('ffmpeg', args, { shell: false, encoding: 'utf-8' }); + if (result.error) { + throw new Error(`mux: ffmpeg failed to start: ${result.error.message}`); + } + if (result.status !== 0) { + const tail = (result.stderr || '').trim().split('\n').slice(-5).join(' | '); + throw new Error(`mux: ffmpeg exited ${result.status}: ${tail || '(no stderr)'}`); + } +} +function muxMixedAudioDescription(videoPath, audioPath, outputPath) { + if (!fs_1.default.existsSync(videoPath)) { + throw new Error(`mux: video not found: ${videoPath}`); + } + if (!fs_1.default.existsSync(audioPath)) { + throw new Error(`mux: audio not found: ${audioPath}`); + } + fs_1.default.mkdirSync(path_1.default.dirname(outputPath), { recursive: true }); + // Sidechain-ducked mix: original audio dips when the AD track is speaking, + // then both are summed into a single output audio stream. The AD track is + // already a full-length file that is silent between description segments + // (built by combineAudioSegments), so asplit gives us one copy to drive the + // sidechain detector and another to mix in on top. + const filterGraph = '[1:a]asplit=2[ad_mix][ad_sc];' + + '[0:a][ad_sc]sidechaincompress=threshold=0.03:ratio=20:attack=5:release=300:level_sc=2[ducked];' + + '[ducked][ad_mix]amix=inputs=2:duration=first:dropout_transition=0:normalize=0[aout]'; + const args = [ + '-y', + '-v', 'error', + '-i', videoPath, + '-i', audioPath, + '-filter_complex', filterGraph, + '-map', '0:v', + '-map', '[aout]', + '-c:v', 'copy', + '-c:a', 'aac', + '-b:a', '192k', + outputPath, + ]; + const result = (0, child_process_1.spawnSync)('ffmpeg', args, { shell: false, encoding: 'utf-8' }); + if (result.error) { + throw new Error(`mux: ffmpeg failed to start: ${result.error.message}`); + } + if (result.status !== 0) { + const tail = (result.stderr || '').trim().split('\n').slice(-5).join(' | '); + throw new Error(`mux: ffmpeg exited ${result.status}: ${tail || '(no stderr)'}`); + } } //# sourceMappingURL=muxer.js.map \ No newline at end of file diff --git a/dist/server/services/muxer.js.map b/dist/server/services/muxer.js.map index 9230075..01a9ffe 100644 --- a/dist/server/services/muxer.js.map +++ b/dist/server/services/muxer.js.map @@ -1 +1 @@ -{"version":3,"file":"muxer.js","sourceRoot":"","sources":["../../../src/server/services/muxer.ts"],"names":[],"mappings":";;;;;AAGA,kDAyBC;AA5BD,iDAAyC;AACzC,gDAAwB;AAExB,SAAgB,mBAAmB,CACjC,SAAiB,EACjB,SAAiB,EACjB,UAAkB;IAElB,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,KAAK,MAAM,CAAC;IAE7B,MAAM,GAAG,GAAG;QACV,iBAAiB;QACjB,OAAO,SAAS,GAAG;QACnB,OAAO,SAAS,GAAG;QACnB,UAAU;QACV,WAAW;QACX,UAAU;QACV,WAAW;QACX,WAAW;QACX,KAAK;YACH,CAAC,CAAC,2CAA2C;YAC7C,CAAC,CAAC,2CAA2C;QAC/C,IAAI,UAAU,GAAG;QACjB,IAAI;KACL,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,IAAA,wBAAQ,EAAC,GAAG,CAAC,CAAC;AAChB,CAAC"} \ No newline at end of file +{"version":3,"file":"muxer.js","sourceRoot":"","sources":["../../../src/server/services/muxer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/server/services/ytDlp.d.ts b/dist/server/services/ytDlp.d.ts index 218286c..2e2f262 100644 --- a/dist/server/services/ytDlp.d.ts +++ b/dist/server/services/ytDlp.d.ts @@ -3,5 +3,6 @@ export interface YtDlpResult { filename: string; title: string; } +export type YtDlpProgress = (percent: number) => void; export declare function isYtDlpAvailable(): boolean; -export declare function downloadVideo(url: string, outputDir: string): YtDlpResult; +export declare function downloadVideo(url: string, outputDir: string, onProgress?: YtDlpProgress): Promise; diff --git a/dist/server/services/ytDlp.js b/dist/server/services/ytDlp.js index e84e592..bc4c6a7 100644 --- a/dist/server/services/ytDlp.js +++ b/dist/server/services/ytDlp.js @@ -17,22 +17,98 @@ function isYtDlpAvailable() { return false; } } -function downloadVideo(url, outputDir) { - if (!fs_1.default.existsSync(outputDir)) { - fs_1.default.mkdirSync(outputDir, { recursive: true }); - } - const outputTemplate = path_1.default.join(outputDir, '%(title)s.%(ext)s'); - const result = (0, child_process_1.execSync)(`yt-dlp -f "best[ext=mp4]/best" -o "${outputTemplate}" --print filename --print title "${url}"`, { encoding: 'utf-8', timeout: 600000 }); - const lines = result.trim().split('\n'); - const filename = lines[0]?.trim(); - const title = lines[1]?.trim() || filename; - if (!filename) { - throw new Error('yt-dlp: Failed to parse downloaded filename'); - } - const filePath = path_1.default.resolve(outputDir, filename); - if (!fs_1.default.existsSync(filePath)) { - throw new Error(`yt-dlp: Downloaded file not found at ${filePath}`); - } - return { filePath, filename, title }; +const PROGRESS_PREFIX = 'PROG '; +function downloadVideo(url, outputDir, onProgress) { + return new Promise((resolve, reject) => { + if (!fs_1.default.existsSync(outputDir)) { + fs_1.default.mkdirSync(outputDir, { recursive: true }); + } + const outputTemplate = path_1.default.join(outputDir, '%(title)s.%(ext)s'); + // Pass arguments as an array — no shell, no quoting issues, no truncation + // on URLs containing & | % ^ etc. (the original execSync bug on Windows). + const args = [ + '-f', 'best[ext=mp4]/best', + '-o', outputTemplate, + '--newline', + '--progress-template', `${PROGRESS_PREFIX}%(progress._percent_str)s`, + '--print', 'after_move:filepath', + '--print', 'title', + '--no-simulate', + url, + ]; + const child = (0, child_process_1.spawn)('yt-dlp', args, { shell: false }); + const stderrLines = []; + const outputLines = []; + let stdoutBuf = ''; + let stderrBuf = ''; + const handleStdoutLine = (line) => { + if (!line) + return; + if (line.startsWith(PROGRESS_PREFIX)) { + const m = line.slice(PROGRESS_PREFIX.length).match(/([\d.]+)\s*%/); + if (m && onProgress) { + const pct = parseFloat(m[1]); + if (!isNaN(pct)) + onProgress(pct); + } + return; + } + outputLines.push(line); + }; + child.stdout.on('data', (chunk) => { + stdoutBuf += chunk.toString('utf-8'); + let nl; + while ((nl = stdoutBuf.indexOf('\n')) !== -1) { + const line = stdoutBuf.slice(0, nl).replace(/\r$/, ''); + stdoutBuf = stdoutBuf.slice(nl + 1); + handleStdoutLine(line.trim()); + } + }); + child.stderr.on('data', (chunk) => { + stderrBuf += chunk.toString('utf-8'); + let nl; + while ((nl = stderrBuf.indexOf('\n')) !== -1) { + const line = stderrBuf.slice(0, nl).replace(/\r$/, '').trim(); + stderrBuf = stderrBuf.slice(nl + 1); + if (line) + stderrLines.push(line); + } + }); + child.on('error', (err) => { + reject(new Error(`yt-dlp failed to start: ${err.message}`)); + }); + const timeoutMs = 600000; + const timer = setTimeout(() => { + child.kill(); + reject(new Error(`yt-dlp timed out after ${timeoutMs / 1000}s`)); + }, timeoutMs); + child.on('close', (code) => { + clearTimeout(timer); + if (stdoutBuf.trim()) + handleStdoutLine(stdoutBuf.trim()); + if (stderrBuf.trim()) + stderrLines.push(stderrBuf.trim()); + if (code !== 0) { + const tail = stderrLines.slice(-3).join(' | ') || `exit code ${code}`; + reject(new Error(tail)); + return; + } + const filePath = outputLines[0]; + const title = outputLines[1] || (filePath ? path_1.default.basename(filePath) : ''); + if (!filePath) { + reject(new Error('yt-dlp completed but did not report a filename')); + return; + } + if (!fs_1.default.existsSync(filePath)) { + reject(new Error(`yt-dlp reported success but file not found: ${filePath}`)); + return; + } + resolve({ + filePath: path_1.default.resolve(filePath), + filename: path_1.default.basename(filePath), + title, + }); + }); + }); } //# sourceMappingURL=ytDlp.js.map \ No newline at end of file diff --git a/dist/server/services/ytDlp.js.map b/dist/server/services/ytDlp.js.map index cac6825..ba18ff5 100644 --- a/dist/server/services/ytDlp.js.map +++ b/dist/server/services/ytDlp.js.map @@ -1 +1 @@ -{"version":3,"file":"ytDlp.js","sourceRoot":"","sources":["../../../src/server/services/ytDlp.ts"],"names":[],"mappings":";;;;;AAUA,4CAOC;AAED,sCA2BC;AA9CD,iDAAyC;AACzC,gDAAwB;AACxB,4CAAoB;AAQpB,SAAgB,gBAAgB;IAC9B,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW,EAAE,SAAiB;IAC1D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,IAAA,wBAAQ,EACrB,sCAAsC,cAAc,qCAAqC,GAAG,GAAG,EAC/F,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CACvC,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC;IAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC"} \ No newline at end of file +{"version":3,"file":"ytDlp.js","sourceRoot":"","sources":["../../../src/server/services/ytDlp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/server/db/jobStore.ts b/src/server/db/jobStore.ts index b706be3..23e98ee 100644 --- a/src/server/db/jobStore.ts +++ b/src/server/db/jobStore.ts @@ -5,6 +5,7 @@ export interface OutputOptions { audio: boolean; subtitles: boolean; muxed: boolean; + muxMode: 'separate' | 'mixed'; } export interface Job { diff --git a/src/server/public/app.ts b/src/server/public/app.ts index bdf3706..15ecef4 100644 --- a/src/server/public/app.ts +++ b/src/server/public/app.ts @@ -379,6 +379,7 @@ el('download-url').addEventListener('click', () => { audio: fd.get('output-audio') === 'on', subtitles: fd.get('output-subtitles') === 'on', muxed: fd.get('output-muxed') === 'on', + muxMode: (fd.get('mux-mode') as string) === 'mixed' ? 'mixed' : 'separate', }; if (config.visionProvider) { @@ -404,6 +405,7 @@ el('download-url').addEventListener('click', () => { delete config['output-audio']; delete config['output-subtitles']; delete config['output-muxed']; + delete config['mux-mode']; try { const data = await apiJson<{ job: Job }>('POST', '/api/jobs', { diff --git a/src/server/public/index.html b/src/server/public/index.html index d573957..abeda7b 100644 --- a/src/server/public/index.html +++ b/src/server/public/index.html @@ -99,7 +99,11 @@ Output options - + +
+ + +
diff --git a/src/server/routes/jobs.ts b/src/server/routes/jobs.ts index 0074766..9666ccc 100644 --- a/src/server/routes/jobs.ts +++ b/src/server/routes/jobs.ts @@ -2,7 +2,7 @@ import { Router, Request, Response } from 'express'; import path from 'path'; import fs from 'fs'; import { JobManager } from '../services/jobManager'; -import { getJob } from '../db/jobStore'; +import { getJob, OutputOptions } from '../db/jobStore'; function getParam(req: Request, name: string): string { const val = req.params[name]; @@ -153,10 +153,13 @@ export function createJobsRouter(jobManager: JobManager): Router { filePath = format === 'vtt' ? job.output_subtitles_vtt : job.output_subtitles_srt; filename = `${path.basename(job.video_filename, path.extname(job.video_filename))}_description.${format}`; break; - case 'muxed': + case 'muxed': { + const opts = JSON.parse(job.output_options || '{}') as Partial; + const suffix = opts.muxMode === 'mixed' ? '_described_mixed' : '_described'; filePath = job.output_muxed; - filename = `${path.basename(job.video_filename, path.extname(job.video_filename))}_described.mkv`; + filename = `${path.basename(job.video_filename, path.extname(job.video_filename))}${suffix}.mkv`; break; + } default: res.status(400).json({ error: 'Invalid download type' }); return; diff --git a/src/server/services/jobManager.ts b/src/server/services/jobManager.ts index f018dea..e0c1ac1 100644 --- a/src/server/services/jobManager.ts +++ b/src/server/services/jobManager.ts @@ -6,7 +6,7 @@ import { } from '../db/jobStore'; import { generateAudioDescriptionFromOptions } from '../../utils/processor'; import { generateSRT, generateVTT } from './subtitleGenerator'; -import { muxAudioDescription } from './muxer'; +import { muxAudioDescription, muxMixedAudioDescription } from './muxer'; import { getDefaultConfig, Config } from '../../config/config'; import { AudioSegment, BatchContext } from '../../interfaces'; import { getVideoDuration, cleanupTempFiles } from '../../utils/mediaUtils'; @@ -79,7 +79,8 @@ export class JobManager { const opts: OutputOptions = { audio: outputOptions.audio !== false, subtitles: outputOptions.subtitles !== false, - muxed: outputOptions.muxed || false + muxed: outputOptions.muxed || false, + muxMode: outputOptions.muxMode === 'mixed' ? 'mixed' : 'separate' }; return createJob(videoPath, filename, mergedConfig, opts); @@ -307,8 +308,16 @@ export class JobManager { } if (outputOptions.muxed && fs.existsSync(outputAudio)) { - const muxedPath = path.join(outputDir, `${baseName}_described.mkv`); - muxAudioDescription(job.video_path, outputAudio, muxedPath); + const isMixed = outputOptions.muxMode === 'mixed'; + const muxedPath = path.join( + outputDir, + `${baseName}${isMixed ? '_described_mixed' : '_described'}.mkv` + ); + if (isMixed) { + muxMixedAudioDescription(job.video_path, outputAudio, muxedPath); + } else { + muxAudioDescription(job.video_path, outputAudio, muxedPath); + } outputMuxed = muxedPath; } diff --git a/src/server/services/muxer.ts b/src/server/services/muxer.ts index 22a2a30..dca6b83 100644 --- a/src/server/services/muxer.ts +++ b/src/server/services/muxer.ts @@ -44,3 +44,52 @@ export function muxAudioDescription( throw new Error(`mux: ffmpeg exited ${result.status}: ${tail || '(no stderr)'}`); } } + +export function muxMixedAudioDescription( + videoPath: string, + audioPath: string, + outputPath: string +): void { + if (!fs.existsSync(videoPath)) { + throw new Error(`mux: video not found: ${videoPath}`); + } + if (!fs.existsSync(audioPath)) { + throw new Error(`mux: audio not found: ${audioPath}`); + } + + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + + // Sidechain-ducked mix: original audio dips when the AD track is speaking, + // then both are summed into a single output audio stream. The AD track is + // already a full-length file that is silent between description segments + // (built by combineAudioSegments), so asplit gives us one copy to drive the + // sidechain detector and another to mix in on top. + const filterGraph = + '[1:a]asplit=2[ad_mix][ad_sc];' + + '[0:a][ad_sc]sidechaincompress=threshold=0.03:ratio=20:attack=5:release=300:level_sc=2[ducked];' + + '[ducked][ad_mix]amix=inputs=2:duration=first:dropout_transition=0:normalize=0[aout]'; + + const args = [ + '-y', + '-v', 'error', + '-i', videoPath, + '-i', audioPath, + '-filter_complex', filterGraph, + '-map', '0:v', + '-map', '[aout]', + '-c:v', 'copy', + '-c:a', 'aac', + '-b:a', '192k', + outputPath, + ]; + + const result = spawnSync('ffmpeg', args, { shell: false, encoding: 'utf-8' }); + + if (result.error) { + throw new Error(`mux: ffmpeg failed to start: ${result.error.message}`); + } + if (result.status !== 0) { + const tail = (result.stderr || '').trim().split('\n').slice(-5).join(' | '); + throw new Error(`mux: ffmpeg exited ${result.status}: ${tail || '(no stderr)'}`); + } +}