Jdownloader : Download
param(
[Parameter(Mandatory = $true)]
[string]$InputFolder,
[Parameter(Mandatory = $true)]
[string]$OutputFolder,
[ValidateSet("speech", "music", "tiny", IgnoreCase = $true)]
[string]$Mode = "speech",
[switch]$IncludeVideo
)
if (!(Test-Path -LiteralPath $InputFolder)) {
Write-Host "Input folder tidak ditemukan: $InputFolder"
exit 1
}
$InputFolder = (Resolve-Path -LiteralPath $InputFolder).Path.TrimEnd('\')
if (!(Test-Path -LiteralPath $OutputFolder)) {
New-Item -ItemType Directory -Path $OutputFolder -Force | Out-Null
}
$extensions = @('*.opus','*.ogg','*.wav','*.flac','*.m4a','*.aac','*.wma','*.mp3')
if ($IncludeVideo) {
$extensions += @('*.mp4','*.mkv','*.webm','*.mov')
}
switch ($Mode.ToLower()) {
"tiny" { $quality = 9 }
"speech" { $quality = 7 }
"music" { $quality = 4 }
}
$files = Get-ChildItem -LiteralPath $InputFolder -Recurse -File |
Where-Object { $extensions -contains "*$($_.Extension.ToLower())" }
$total = $files.Count
$index = 0
if ($total -eq 0) {
Write-Host "Tidak ada file yang cocok ditemukan."
exit 1
}
foreach ($file in $files) {
$index++
$relativePath = $file.DirectoryName.Substring($InputFolder.Length).TrimStart('\')
$targetDir = if ([string]::IsNullOrWhiteSpace($relativePath)) {
$OutputFolder
} else {
Join-Path $OutputFolder $relativePath
}
if (!(Test-Path -LiteralPath $targetDir)) {
New-Item -ItemType Directory -Path $targetDir -Force | Out-Null
}
$outFile = Join-Path $targetDir ($file.BaseName + ".mp3")
if (Test-Path -LiteralPath $outFile) {
Write-Host "Skip (sudah ada): $outFile"
continue
}
Write-Progress -Activity "Converting to MP3" `
-Status "$index / $total : $($file.Name) [$Mode]" `
-PercentComplete (($index / $total) * 100)
if ($IncludeVideo) {
ffmpeg -n -i $file.FullName -vn -c:a libmp3lame -q:a $quality -map_metadata 0 $outFile
} else {
ffmpeg -n -i $file.FullName -c:a libmp3lame -q:a $quality -map_metadata 0 $outFile
}
}
Write-Progress -Activity "Converting to MP3" -Completed
Write-Host "Selesai. Output ada di: $OutputFolder"Untuk ceramah/kajian yang mau kecil tapi masih layak:
powershell -ExecutionPolicy Bypass -File .\convert-to-mp3.ps1 -InputFolder "D:\koleksi-audio" -OutputFolder "D:\hasil-mp3" -Mode speechUntuk file sekecil mungkin:
powershell -ExecutionPolicy Bypass -File .\convert-to-mp3.ps1 -InputFolder "D:\koleksi-audio" -OutputFolder "D:\hasil-mp3" -Mode tinyUntuk murottal/high quality:
powershell -ExecutionPolicy Bypass -File .\convert-to-mp3.ps1 -InputFolder "D:\koleksi-audio" -OutputFolder "D:\hasil-mp3" -Mode musicKalau mau ambil audio dari video juga:
powershell -ExecutionPolicy Bypass -File .\convert-to-mp3.ps1 -InputFolder "D:\koleksi-media" -OutputFolder "D:\hasil-mp3" -Mode speech -IncludeVideo-vn dipakai saat file video ikut diproses agar stream video dibuang dan hanya audio yang dikonversi ke MP3. gist.github
| Mode | Setting | Cocok untuk |
|---|---|---|
tiny |
-q:a 9 |
Ukuran sekecil mungkin, kualitas paling ditekan. stackoverflow |
speech |
-q:a 7 |
Ceramah, voice note, kajian. stackoverflow |
music |
-q:a 4 |
Murotal atau audio yang ingin tetap enak didengar. stackoverflow |
Kalau target speaker MP3 lawas, beberapa perangkat kadang lebih cocok dengan CBR daripada VBR. Jadi kalau nanti ada file yang tidak terbaca normal, kita bisa ubah mode ke bitrate tetap seperti -b:a 128k atau -b:a 96k. Sumber Stack Overflow juga menekankan bahwa -b:a adalah CBR, sedangkan -q:a adalah VBR. stackoverflow