Home
> service-is-learning-materials-creation, service-is-programming, sourcecode > Adding APE input format support (and WMA output format) to Convert2MP3.ps
Adding APE input format support (and WMA output format) to Convert2MP3.ps
- FWIIW: When trying to run Paul Weterings’ script against a media folder, it failed.
- I added exception handling, to arrive at : “Exception calling “Create” with “1” argument(s): “s:\multimedia1\Piano.Sonatas\vol1\I1.ape (taglib/ape)”.
- Took me a while to realize: Taglib-sharp seems to stumble over APE file formats. Even though the taglib release notes seem to say it is supported since 2009. And even though I upgraded taglib-sharp to current version 2.1.0.0.
- Now I am simply bypassing the call to taglib-sharp for files with the APE extension, and default to a bitrate of 64 for those.
- I also
- changed the conversion direction to WMA format, including from MP3 source format.
- added an option $blndelete to not delete source files.
- No warranties of any kind. All due credit goes to Paul Weterings’ script here.
# trp: any2wma.ps1 # wma2mp3 conversion powershell script... # dec 2010 version 1.1 Servercare, Paul Weterings # Feb 2013 version 1.2 ServerCare, Paul Weterings, Byron & Chuck, added DRM check, # more formats and bitrate # trp: nov 2015: using *.wma as output, added *.ape as input (and *.mp3) Set-StrictMode -Version Latest # Set-PSDebug -trace 1 $blndelete = $true # $false # control whether originals get deleted after some success conversionchekc - good idea, but not yet # Where are we? # $loc = Get-Location $loc = $PSScriptRoot # trp # $tag = $tag = $loc.Path + "\MPTag" # trp: not really? butr this syntax apears more often , is this ps' append to existing variable # trp: $tag = $tag = $loc + "\MPTag" # trp: not really? butr this syntax apears more often , is this ps' append to existing variable # Import MPTag module # See: http://powershell.com/cs/media/p/9129/download.aspx $errorcountbefore = $error.count Import-Module $tag If ($error.count > $errorcountbefore) { Write-host "trp:" + $lastexitcode + \n + $error[0] } # Use Windows Media Player # See: http://msdn.microsoft.com/en-us/library/ee485348.aspx $errorcountbefore = $error.count $mpobj = New-Object -ComObject wmplayer.ocx If ($error.count > $errorcountbefore) { Write-host "trp:"+ $lastexitcode + \n + $error[0] } $tool = "ffmpeg.exe" # trp: done:test:can i have ffmpeg in $env:Path?$loc.path+"\ffmpeg.exe" $successcounter = $failurecounter = 0 # This is the root folder where script looks for the music, adjust this to your liking.# # # $strBaseDir = "S:\multimedia1\Piano.Sonatas" # ape # ######################################################################################## $objParent = Get-ChildItem $strBaseDir -recurse -Include *.aac, *.flac, *.m4p, *.ogg, *.ra, *.rm,` *.ram, *.raw, *.wav, *.mp3, *.ape # trp: now target instead: *.wma # todo: *.m4a, foreach ($child in $objParent) { trap { Write-Warning ('Failed to access "{0}" : {1} in "{2}"' -f $child.FullName, $_.Exception.Message, $_.InvocationInfo.ScriptName) continue } # trp: exclude .ape from taglib-sharp and set default bitrate of 64k if ($child.Fullname.EndsWith(".ape")) { $bitrate = 64 } else { # Use the MPTag library to get the correct bitrate $libmedia = Get-MediaInfo $child.Fullname $bitrate = $libmedia.Properties.AudioBitrate # sometimes the bitrate is reported way to high... anything over 192 gets lowered. # adjust if wanted/needed if ($bitrate -gt 192) { $bitrate = 192 } } # trp : work around Get-MediaInfo not working if (!$bitrate) # yes = null-valued expression { $bitrate = 64 } "-----------------------------------------------------------------------------" "- Processing: " + $child.FullName + " at Bitrate $bitrate" $media = $mpobj.newMedia($child.Fullname) $protected = $media.getItemInfo('Is_Protected') # Some files, such as flac or ogg may have the protection attribute empty if ($protected) { $prot = [System.Convert]::ToBoolean($protected) } else { $prot = $false } if (!$prot) { $strInName = $child.FullName $strOutName = $child.DirectoryName + "\" + $child.BaseName + ".wma" # trp ".mp3" # The argument string that tells ffmpeg what to do... # The generic syntax is: # ffmpeg [global options] [[infile options][‘-i’ infile]]... # {[outfile options] outfile}... # # -i filename (input) :: -i <string> :: input file name # -y (global) :: -y :: Overwrite output files without asking. # -acodec codec (input/output) :: -acodec libmp3lame :: Set the audio codec. # This is an alias for -codec:a. # trp: acodec wmav2 A..... wmav2 Windows Media Audio 2 # :: -ab 128k :: Set bitrate in bits to constant 128k bit rate # -ac[:stream_specifier] channels (input/output,per-stream) :: -ac 2 :: # Set the number of audio channels. For output streams it is set by default # to the number of input audio channels. For input streams this option only # makes sense for audio grabbing devices and raw demuxers and is mapped to the # corresponding demuxer options. # -ar[:stream_specifier] freq (input/output,per-stream) :: -ar 44100 :: # Set the audio sampling frequency. For output streams it is set by default # to the frequency of the corresponding input stream. For input streams this # option only makes sense for audio grabbing devices and raw demuxers and is # mapped to the corresponding demuxer options. # :: $mp3name :: Output name # file:///C:/ffmpeg-git-1eabd71-win32-static/doc/ffmpeg.html # trp: $arguments = '-i ' + '"'+$strInName +'"' +' -y -acodec libmp3lame -ab ' + $bitrate` $arguments = '-i ' + '"'+$strInName +'"' +' -y -acodec wmav2 -ab ' + $bitrate` +'k -ac 2 -ar 44100 ' + '"' + $strOutName+ '"' # This is where the conversion takes place # trp:debug Write-Warning "$tool + `r`n" Write-Warning "$arguments + `r`n" Invoke-Expression "$tool $arguments" # Lets see what we just converted, did everything go OK? $objOutFile = get-item $strOutName # if conversion went well the mp3 file is larger than 0 bytes, so remove the original file, # otherwise leave the wma file & remove the (zero length) mp3 file if (!$strOutName.Length -gt 0) # no success converting -> delete failed converted file { echo "----- removing $strOutName" Remove-Item -LiteralPath $strOutName $failurecounter++ } else # success converting { $successcounter++ if ($blndelete) # delete original requested { # you might want to consider moving the original file to # anther location instead of removing it. # Allowing you time to manually check if the conversions went OK echo "----- removing $strInName" Remove-Item -LiteralPath $strInName } } } else # $prot { "! File " + $child.FullName + " is DRM protected, skipping..." $failurecounter++ } } # We are done, so lets inform the user what the success rate was. Echo "Processing completed, $successcounter conversions were succesfull ` and $failurecounter were not."
Comments (0)
Trackbacks (0)
Leave a comment
Trackback