code.pablomurad.com

fast-scripts

28 double-click Windows batch tools for video, audio and files

feat: fix
author
Pablo Murad
date
commit
af64d5aa730c850879168c65bf30932952ea591e
parent
3f48e7050a4830ba23b9dcf562e3497758ed9bc9
changes
6 files +129 −11
@@ -38,7 +38,7 @@ }     return $null
 }
 
-function Salvar-Config($entrada, $formato, $modo, $valor) {
+function Salvar-Config($entrada, $formato, $modo, $valor, $saida) {
     try {
         New-Item -ItemType Directory -Path $configDir -Force | Out-Null
         [pscustomobject]@{
@@ -46,6 +46,7 @@ UltimaEntrada   = $entrada             UltimoFormato   = $formato
             UltimoModo      = $modo
             UltimoValor     = $valor
+            UltimaSaida     = $saida
         } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8
     } catch {}
 }
@@ -230,7 +231,20 @@ else {     $resumoTam = 'sem redimensionar'
 }
 
-Salvar-Config $origem $formato.Id $modo $valor
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+    Titulo 'Pasta de saída'
+    Write-Host "  $saidaPadrao" -ForegroundColor White
+    Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+    $rsaida = Read-Host 'Pasta de saída'
+    $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+    try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+    catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config $origem $formato.Id $modo $valor $destino
 
 # ------------------------------------------------------------
 # 5) Coleta das imagens
@@ -21,6 +21,10 @@ Write-Host '============================================================' -ForegroundColor DarkCyan }
 
 $extImg = @('.jpg','.jpeg','.png','.webp','.bmp','.tif','.tiff')
+$configDir  = Join-Path $env:APPDATA 'ImagensEPdf'
+$configFile = Join-Path $configDir 'config.json'
+function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null }
+function Salvar-Config($o) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; $o | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }
 
 Titulo 'Imagens e PDF'
 Write-Host '  Desenvolvido por Pablo Murad - 2026' -ForegroundColor DarkGray
@@ -29,6 +33,7 @@ Write-Host 'Verificando o que é necessário...' -ForegroundColor Gray $magick = Get-Command magick -ErrorAction SilentlyContinue
 if (-not $magick) { Write-Host ''; Write-Host '[ERRO] ImageMagick não encontrado.' -ForegroundColor Red; Write-Host 'Instale com:  winget install ImageMagick.ImageMagick' -ForegroundColor White; Pausar; exit 1 }
 Write-Host "[OK] ImageMagick: $($magick.Source)" -ForegroundColor Green
+$config = Carregar-Config
 
 Titulo 'O que você quer fazer?'
 Write-Host '  [1] Imagens -> PDF   (junta todas as imagens de uma pasta num PDF)' -ForegroundColor White
@@ -51,7 +56,19 @@ Write-Host "$($imagens.Count) imagens encontradas (em ordem alfabética)." -ForegroundColor Cyan     $nome = (Read-Host 'Nome do PDF de saída (Enter = saida.pdf)').Trim()
     if ([string]::IsNullOrWhiteSpace($nome)) { $nome = 'saida.pdf' }
     if ($nome -notmatch '\.pdf$') { $nome += '.pdf' }
-    $pdf = Join-Path $pasta $nome
+    $saidaPadrao = if ($config -and $config.UltimaSaidaPdf) { $config.UltimaSaidaPdf } else { $pasta }
+    while ($true) {
+        Titulo 'Pasta de saída'
+        Write-Host "  $saidaPadrao" -ForegroundColor White
+        Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+        $rsaida = Read-Host 'Pasta de saída'
+        $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+        try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+        catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+    }
+    $destino = (Resolve-Path -LiteralPath $destino).Path
+    Salvar-Config ([pscustomobject]@{ UltimaSaidaPdf=$destino; UltimaSaidaImg=($config.UltimaSaidaImg) })
+    $pdf = Join-Path $destino $nome
     Write-Host ''; Write-Host "Gerando: $pdf ..." -ForegroundColor Cyan
     $imgArgs = @($imagens.FullName) + @('-auto-orient', $pdf)
     & magick @imgArgs
@@ -82,10 +99,25 @@ if ($modoArquivo) { $pdfs = @(Get-Item -LiteralPath $pdfAlvo) } else { $pdfs = @(Get-ChildItem -LiteralPath $pdfAlvo -File | Where-Object { $_.Extension.ToLowerInvariant() -eq '.pdf' }) }
 if ($pdfs.Count -eq 0) { Write-Host 'Nenhum PDF encontrado.' -ForegroundColor Yellow; Pausar; exit 0 }
 
+$baseSaida = if ($modoArquivo) { Split-Path $pdfAlvo -Parent } else { $pdfAlvo }
+$saidaPadrao = if ($config -and $config.UltimaSaidaImg) { $config.UltimaSaidaImg } else { $baseSaida }
+while ($true) {
+    Titulo 'Pasta de saída (base)'
+    Write-Host "  $saidaPadrao" -ForegroundColor White
+    Write-Host '(cada PDF cria uma subpasta <nome>-imagens aqui dentro)' -ForegroundColor DarkGray
+    Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+    $rsaida = Read-Host 'Pasta de saída'
+    $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+    try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+    catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+Salvar-Config ([pscustomobject]@{ UltimaSaidaPdf=($config.UltimaSaidaPdf); UltimaSaidaImg=$destino })
+
 Titulo 'Processando'
 $ok=0;$err=0
 foreach ($pf in $pdfs) {
-    $outDir = Join-Path $pf.DirectoryName ($pf.BaseName + '-imagens')
+    $outDir = Join-Path $destino ($pf.BaseName + '-imagens')
     New-Item -ItemType Directory -Path $outDir -Force | Out-Null
     $padraoSaida = Join-Path $outDir ('pagina-%03d' + $extSaida)
     Write-Host ''; Write-Host $pf.Name -ForegroundColor Magenta
@@ -88,7 +88,20 @@ while (-not $posicao) { $e = Read-Host 'Posição (1-5, Enter = 1)'; if ([string]::IsNullOrWhiteSpace($e)) { $e = '1' }; $posicao = $posicoes | Where-Object { $_.Id -eq ($e -as [int]) } | Select-Object -First 1; if (-not $posicao) { Write-Host '[!] Inválido.' -ForegroundColor Yellow } } $grav = $posicao.Gravity
 $offset = if ($grav -eq 'Center') { '+0+0' } else { '+25+25' }
 
-Salvar-Config ([pscustomobject]@{ UltimaEntrada=$origem; UltimoTipo=$tipo; UltimoTexto=$texto; UltimoLogo=$logo; UltimaPosicao=$posicao.Id })
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+    Titulo 'Pasta de saída'
+    Write-Host "  $saidaPadrao" -ForegroundColor White
+    Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+    $rsaida = Read-Host 'Pasta de saída'
+    $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+    try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+    catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config ([pscustomobject]@{ UltimaEntrada=$origem; UltimoTipo=$tipo; UltimoTexto=$texto; UltimoLogo=$logo; UltimaPosicao=$posicao.Id; UltimaSaida=$destino })
 
 # Coleta
 if ($modoArquivo) { $arquivos = @($arquivoObj) } else {
@@ -20,6 +20,11 @@ Write-Host "  $t" -ForegroundColor Cyan     Write-Host '============================================================' -ForegroundColor DarkCyan
 }
 
+$configDir  = Join-Path $env:APPDATA 'CriarGif'
+$configFile = Join-Path $configDir 'config.json'
+function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null }
+function Salvar-Config($o) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; $o | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }
+
 $extVideo = @('.mp4','.mkv','.avi','.mov','.wmv','.flv','.webm','.m4v','.mpg','.mpeg','.ts','.3gp','.vob')
 $extImg   = @('.jpg','.jpeg','.png','.webp','.bmp','.tif','.tiff')
 
@@ -30,6 +35,7 @@ Write-Host 'Verificando o que é necessário...' -ForegroundColor Gray $ffmpeg = Get-Command ffmpeg -ErrorAction SilentlyContinue
 if (-not $ffmpeg) { Write-Host ''; Write-Host '[ERRO] FFmpeg não encontrado.' -ForegroundColor Red; Write-Host 'Instale com:  winget install Gyan.FFmpeg' -ForegroundColor White; Pausar; exit 1 }
 Write-Host "[OK] FFmpeg: $($ffmpeg.Source)" -ForegroundColor Green
+$config = Carregar-Config
 
 Titulo 'O que você quer fazer?'
 Write-Host '  [1] Vídeo -> GIF' -ForegroundColor White
@@ -56,6 +62,20 @@ if ($modoArquivo) { $arquivoObj = Get-Item -LiteralPath $arquivoUnico; $origem = $arquivoObj.DirectoryName; $videos = @($arquivoObj) }     else { $origem = $entrada; $videos = @(Get-ChildItem -LiteralPath $origem -File | Where-Object { $extVideo -contains $_.Extension.ToLowerInvariant() }) }
     $destino = Join-Path $origem 'GIF'
 
+    # Pasta de saída (lembra a última; cria se não existir)
+    $saidaPadrao = if ($config -and $config.UltimaSaidaGif) { $config.UltimaSaidaGif } else { $destino }
+    while ($true) {
+        Titulo 'Pasta de saída'
+        Write-Host "  $saidaPadrao" -ForegroundColor White
+        Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+        $rsaida = Read-Host 'Pasta de saída'
+        $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+        try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+        catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+    }
+    $destino = (Resolve-Path -LiteralPath $destino).Path
+    Salvar-Config ([pscustomobject]@{ UltimaSaidaGif=$destino; UltimaSaidaSlide=($config.UltimaSaidaSlide) })
+
     Titulo 'Processando'
     Write-Host "Largura: $larg px   |   FPS: $fps   |   Destino: $destino"
     Write-Host "Vídeos: $($videos.Count)" -ForegroundColor Cyan
@@ -98,7 +118,20 @@ $sEnt = Read-Host 'Segundos por foto (Enter = 2)'; $seg = if ($sEnt -as [double]) { [double]$sEnt } else { 2 } $nome = (Read-Host 'Nome do vídeo de saída (Enter = slideshow.mp4)').Trim()
 if ([string]::IsNullOrWhiteSpace($nome)) { $nome = 'slideshow.mp4' }
 if ($nome -notmatch '\.mp4$') { $nome += '.mp4' }
-$saida = Join-Path $pasta $nome
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaidaSlide) { $config.UltimaSaidaSlide } else { $pasta }
+while ($true) {
+    Titulo 'Pasta de saída'
+    Write-Host "  $saidaPadrao" -ForegroundColor White
+    Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+    $rsaida = Read-Host 'Pasta de saída'
+    $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+    try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+    catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+Salvar-Config ([pscustomobject]@{ UltimaSaidaGif=($config.UltimaSaidaGif); UltimaSaidaSlide=$destino })
+$saida = Join-Path $destino $nome
 
 # Monta arquivo de lista para o demuxer concat (caminhos com / e aspas)
 $listaTxt = Join-Path $env:TEMP ("slide_{0}.txt" -f ([guid]::NewGuid().ToString('N')))
@@ -23,7 +23,7 @@ $configDir  = Join-Path $env:APPDATA 'ExtrairAudio'
 $configFile = Join-Path $configDir 'config.json'
 function Carregar-Config { if (Test-Path -LiteralPath $configFile) { try { return Get-Content -LiteralPath $configFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch {} }; return $null }
-function Salvar-Config($e,$f) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; [pscustomobject]@{ UltimaEntrada=$e; UltimoFormato=$f } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }
+function Salvar-Config($e,$f,$s) { try { New-Item -ItemType Directory -Path $configDir -Force | Out-Null; [pscustomobject]@{ UltimaEntrada=$e; UltimoFormato=$f; UltimaSaida=$s } | ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8 } catch {} }
 
 $extensoes = @('.mp4','.mkv','.avi','.mov','.wmv','.flv','.webm','.m4v','.mpg','.mpeg','.mts','.m2ts','.ts','.3gp','.vob')
 
@@ -80,7 +80,20 @@ $e = Read-Host 'Formato (1-3)'; if ([string]::IsNullOrWhiteSpace($e)) { $e = "$fmtPadrao" }     $formato = $formatos | Where-Object { $_.Id -eq ($e -as [int]) } | Select-Object -First 1
     if (-not $formato) { Write-Host '[!] Inválido.' -ForegroundColor Yellow }
 }
-Salvar-Config $origem $formato.Id
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+    Titulo 'Pasta de saída'
+    Write-Host "  $saidaPadrao" -ForegroundColor White
+    Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+    $rsaida = Read-Host 'Pasta de saída'
+    $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+    try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+    catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config $origem $formato.Id $destino
 
 # Coleta
 if ($modoArquivo) { $arquivos = @($arquivoObj) } else {
@@ -38,10 +38,10 @@ }     return $null
 }
 
-function Salvar-Config($pasta, $qualidade) {
+function Salvar-Config($pasta, $qualidade, $saida) {
     try {
         New-Item -ItemType Directory -Path $configDir -Force | Out-Null
-        [pscustomobject]@{ UltimaPasta = $pasta; UltimaQualidade = $qualidade } |
+        [pscustomobject]@{ UltimaPasta = $pasta; UltimaQualidade = $qualidade; UltimaSaida = $saida } |
             ConvertTo-Json | Set-Content -LiteralPath $configFile -Encoding UTF8
     } catch {}
 }
@@ -172,7 +172,20 @@ $perfil = $perfis | Where-Object { $_.Id -eq ($escolha -as [int]) } | Select-Object -First 1     if (-not $perfil) { Write-Host '[!] Escolha inválida. Digite um número de 1 a 5.' -ForegroundColor Yellow }
 }
 
-Salvar-Config $origem $perfil.Id
+# Pasta de saída (lembra a última; cria se não existir)
+$saidaPadrao = if ($config -and $config.UltimaSaida) { $config.UltimaSaida } else { $destino }
+while ($true) {
+    Titulo 'Pasta de saída'
+    Write-Host "  $saidaPadrao" -ForegroundColor White
+    Write-Host 'Enter = usar esta pasta   |   ou cole/digite outra' -ForegroundColor DarkGray
+    $rsaida = Read-Host 'Pasta de saída'
+    $destino = if ([string]::IsNullOrWhiteSpace($rsaida)) { $saidaPadrao } else { $rsaida.Trim().Trim('"') }
+    try { New-Item -ItemType Directory -Path $destino -Force | Out-Null; break }
+    catch { Write-Host '[!] Não foi possível criar/usar essa pasta.' -ForegroundColor Yellow }
+}
+$destino = (Resolve-Path -LiteralPath $destino).Path
+
+Salvar-Config $origem $perfil.Id $destino
 
 # ------------------------------------------------------------
 # 4) Coleta dos arquivos de vídeo