param( [string]$DefaultVideoUrl = "https://youtu.be/EExM3dueOeM", [string]$DefaultOutputLanguage = "es", [string]$DefaultInputLanguage = "", [string]$DefaultLmStudioBaseUrl = "http://127.0.0.1:1234/v1", [string]$DefaultLmStudioApiKey = "lm-studio", [string]$DefaultLmStudioModel = "gemma-3-4b-it" ) $ErrorActionPreference = "Stop" function Read-Value { param( [Parameter(Mandatory = $true)] [string]$Prompt, [string]$DefaultValue = "", [switch]$Required ) if ($DefaultValue) { $value = Read-Host "$Prompt [$DefaultValue]" if ([string]::IsNullOrWhiteSpace($value)) { $value = $DefaultValue } } else { $value = Read-Host $Prompt } if ($Required -and [string]::IsNullOrWhiteSpace($value)) { throw "A value is required for: $Prompt" } return $value.Trim() } $repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path $pythonExe = Join-Path $repoRoot ".venv\Scripts\python.exe" $mainPy = Join-Path $repoRoot "main.py" $logsDir = Join-Path $repoRoot "logs" $timestamp = Get-Date -Format "yyyyMMdd-HHmmss" $logFile = Join-Path $logsDir "auto-dub-$timestamp.log" if (-not (Test-Path $pythonExe)) { throw "Python executable not found at $pythonExe. Create the UV environment first." } if (-not (Test-Path $mainPy)) { throw "main.py not found at $mainPy." } New-Item -ItemType Directory -Force -Path $logsDir | Out-Null Write-Host "" Write-Host "YouTube Auto Dub Launcher" -ForegroundColor Cyan Write-Host "Repo: $repoRoot" Write-Host "Log file: $logFile" Write-Host "" Write-Host "Leave input language blank to let Whisper auto-detect it." -ForegroundColor Yellow Write-Host "" $videoUrl = Read-Value -Prompt "Video URL" -DefaultValue $DefaultVideoUrl -Required $outputLanguage = Read-Value -Prompt "Output language code" -DefaultValue $DefaultOutputLanguage -Required $inputLanguage = Read-Value -Prompt "Input language code (optional)" -DefaultValue $DefaultInputLanguage $lmStudioBaseUrl = Read-Value -Prompt "LM Studio base URL" -DefaultValue $DefaultLmStudioBaseUrl -Required $lmStudioApiKey = Read-Value -Prompt "LM Studio API key" -DefaultValue $DefaultLmStudioApiKey -Required $lmStudioModel = Read-Value -Prompt "LM Studio model" -DefaultValue $DefaultLmStudioModel -Required $env:LM_STUDIO_BASE_URL = $lmStudioBaseUrl $env:LM_STUDIO_API_KEY = $lmStudioApiKey $env:LM_STUDIO_MODEL = $lmStudioModel $commandArgs = @( $mainPy, $videoUrl, "--lang", $outputLanguage ) if (-not [string]::IsNullOrWhiteSpace($inputLanguage)) { $env:SOURCE_LANGUAGE_HINT = $inputLanguage Write-Host "Using input language hint: $inputLanguage" -ForegroundColor Yellow } else { Remove-Item Env:SOURCE_LANGUAGE_HINT -ErrorAction SilentlyContinue } Write-Host "" Write-Host "Running with:" -ForegroundColor Cyan Write-Host " Video URL: $videoUrl" Write-Host " Output language: $outputLanguage" Write-Host " LM Studio URL: $lmStudioBaseUrl" Write-Host " LM Studio model: $lmStudioModel" if ($inputLanguage) { Write-Host " Input language hint: $inputLanguage" } else { Write-Host " Input language hint: auto-detect" } Write-Host "" Push-Location $repoRoot try { $commandLine = @($pythonExe) + $commandArgs "[$(Get-Date -Format s)] Starting run" | Tee-Object -FilePath $logFile -Append | Out-Null "[$(Get-Date -Format s)] Command: $($commandLine -join ' ')" | Tee-Object -FilePath $logFile -Append | Out-Null "[$(Get-Date -Format s)] LM_STUDIO_BASE_URL=$lmStudioBaseUrl" | Tee-Object -FilePath $logFile -Append | Out-Null "[$(Get-Date -Format s)] LM_STUDIO_MODEL=$lmStudioModel" | Tee-Object -FilePath $logFile -Append | Out-Null if ($inputLanguage) { "[$(Get-Date -Format s)] SOURCE_LANGUAGE_HINT=$inputLanguage" | Tee-Object -FilePath $logFile -Append | Out-Null } & $pythonExe @commandArgs 2>&1 | Tee-Object -FilePath $logFile -Append } catch { Write-Host "" Write-Host "The run failed." -ForegroundColor Red Write-Host $_.Exception.Message -ForegroundColor Red "[$(Get-Date -Format s)] Launcher error: $($_.Exception.Message)" | Tee-Object -FilePath $logFile -Append | Out-Null } finally { Pop-Location Write-Host "" Write-Host "Run log saved to: $logFile" -ForegroundColor Cyan Read-Host "Press Enter to close" }