In questa domenica pomeriggio, purtroppo relegato in casa, ho come mio solito giochicchiato con il Python e sono riuscito a terminare la scrittura di uno script per la conversione multi-formato e multipla di file audio, chiamato appunto gaudioconvert.py.
Rispetto al suo precedessore in BASH è stato migliorato. Ora accetta di convertire in un selezionato formato audio più file di diversi formati; forse c'è qualche altra novità ma sicuramente è di minore rilievo. Come il fratello minore è un G-script e supporta i formati audio più diffusi: aac, ape, flac, mp3, mpc, ogg, wav, wma (quest'ultimo sono in decodifica). Raccomando prima di usarlo di controllate che tutte le dipendenze indicate nei commenti iniziali dello script siano installate; non ho inserito nessun messaggio di avviso al questo riguardo.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# AUTHOR: Maurizio di NuvoleSparse
#
# License: GNU General Public version 2 or any later version.
# This program comes with ABSOLUTELY NO WARRANTY; for details
# see the COPYING file or visit "http://www.gnu.org/licenses/gpl.html".
# This is free software, and you are welcome to redistribute it under
# certain conditions. See the GPL license for details.
#
# Dependence:
# python
# zenity
# lame
# mac
# mppdec
# mplayer
# flac
# faad
# oggdec oggenc --> package: vorbis-tools
import os
from sys import argv, exit
from string import join
from re import compile, match
from commands import getoutput, getstatusoutput
from shutil import move
def warningmsg(audiofile):
"""Apre il file '/tmp/gaudioconvert.log' ed inserisce un\
messaggio di avviso
"""
if os.path.isfile('/tmp/gaudioconvert.log') and\
os.path.getsize('/tmp/gaudioconvert.log') != 0:
file = open('/tmp/gaudioconvert.log', 'a')
else:
file = open('/tmp/gaudioconvert.log', 'w')
file.write('ATTENZIONE!\nIl file '+audiofile+\
' appartiene ad un formato non supportato. :-(\n' )
file.close()
def checkformat(format, file):
if compile('[Aa][Aa][Cc]').match(format):
return 'aac'
elif compile('[Aa][Pp][Ee]').match(format):
return 'ape'
elif compile('[Ff][Ll][Aa][Cc]').match(format):
return 'flac'
elif compile('[Mm][Pp]3').match(format):
return 'mp3'
elif compile('[Mm][Pp][Cc]').match(format):
return 'mpc'
elif compile('[Oo][Gg][Gg]').match(format):
return 'ogg'
elif compile('[Ww][Aa][Vv]').match(format) or \
compile('[Ww][Aa][Vv][Ee]').match(format):
return 'wav'
elif compile('[Ww][Mm][Aa]').match(format):
return 'wma'
else:
warningmsg(file)
return 'salta'
def formatofout():
count3 = 0
while True:
format_out = getstatusoutput('zenity --title=gaudioconvert\
--list --text="Scegli il formato di conversione:" --radiolist\
--column=Selez. --column=Formato\
false aac false ape false flac false mp3 false mpc false ogg false wav')
if format_out[0] == 0 and format_out[0] == 256:
os.system('zenity --title="Errore - gaudioconvert" \
--error --text="Seleziona almeno un formato."')
count3 = count3 + 1
if count3 == 3:
os.system('zenity --title="Errore - \
gaudioconvert" --error --text="Odio girare in tondo! (Grrrrr)\nAddio! :-["')
exit(1)
elif format_out[0] == 256:
exit(0)
else:
break
if format_out[1] in ('aac'):
quality = getstatusoutput('zenity --list --text="Scegli \
la qualità." --radiolist --column=Selez. --column=Livello false 100 \
false 200 true 300 false 400 false 500 --title=gaudioconvert')
if format_out[1] in ('ape'):
quality = getstatusoutput('zenity --list --text="Scegli la \
qualità." --radiolist --column=Selez. --column=Livello false 1000 \
false 2000 true 3000 false 4000 false 5000 --title=gaudioconvert')
if format_out[1] in ('flac'):
quality = getstatusoutput('zenity --list --text="Scegli la \
qualità." --radiolist --column=Selez. --column=Livello false 0 false 1 \
false 2 false 3 false 4 false 5 false 6 false 7 true 8 --title=gaudioconvert')
if format_out[1] in ('mp3'):
quality = getstatusoutput('zenity --list --text="Scegli la \
qualità." --radiolist --column=Selez. --column=Livello true medium false \
standard false extreme false insane --title=gaudioconvert')
if format_out[1] in ('mpc'):
quality = getstatusoutput('zenity --list --text="Scegli la \
qualità." --radiolist --column=Selez. --column=Livello false thumb \
false radio true standard false xtreme --title=gaudioconvert')
if format_out[1] in ('ogg'):
quality = getstatusoutput('zenity --list --text="Scegli la \
qualità." --radiolist --column=Selez. --column=Livello false " -1" false 0 \
false 1 false 2 false 3 false 4 false 5 false 6 true 7 false 8 false 9 \
false 10 --title=gaudioconvert')
if format_out[1] in ('wav'):
quality = [ '1', 'wav' ]
if quality[0] == 256:
exit(0)
return format_out[1], quality[1]
def fromwmatowav(file, name, directory):
os.system('mplayer "'+file+'" -ao pcm:file="'+directory+'/'+name+\
'.wav" 2>>/tmp/gaudioconvert.log | zenity --progress --title=gaudioconvert \
--text="'+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def frommpctowav(file, name, directory):
os.system('mppdec "'+file+'" "'+directory+'/'+name+'.wav" \
2>>/tmp/gaudioconvert.log | zenity --progress --title=gaudioconvert --text="'\
+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def fromapetowav(file, name, directory):
os.system('mac "'+file+'" "'+directory+'/'+name+'.wav" -d \
2>>/tmp/gaudioconvert.log | zenity --progress --title=gaudioconvert --text="'\
+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def fromflactowav(file, name, directory):
os.system('flac -f -d "'+file+'" -o "'+directory+'/'+name+'.wav" \
2>>/tmp/gaudioconvert.log | zenity --progres --title=gaudioconverts --text="'\
+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def fromoggtowav(file, name, directory):
os.system('oggdec "'+file+'" -o "'+directory+'/'+name+'.wav" \
2>>/tmp/gaudioconvert.log | zenity --progress --title=gaudioconvert --text="'\
+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def fromaactowav(file, name, directory):
os.system('faad -o "'+directory+'/'+name+'.wav" "'+file+'" \
2>>/tmp/gaudioconvert.log | zenity --progress --title=gaudioconvert --text="'\
+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def frommp3towav(file, name, directory):
os.system('lame --decode "'+file+'" "'+directory+'/'+name+'.wav" \
2>>/tmp/gaudioconvert.log | zenity --progress --title=gaudioconvert --text="'\
+file+' to '+directory+'/'+name+'.wav" --auto-close --auto-kill')
def fromwav(quality, directory, name, format):
if format in ('aac'):
os.system('faac -q '+quality+' -o "'+directory+'/'+name+'.'\
+format+'" "'+directory+'/'+name+'.wav" 2>>/tmp/gaudioconvert.log | zenity \
--progress --title=gaudioconvert --text="'+name+'.wav to '+name+'.'+format+'" \
--auto-close --auto-kill')
if format in ('ape'):
os.system('mac "'+directory+'/'+name+'.wav" "'+directory+'/'\
+name+'.'+format+'" -c '+quality+' 2>>/tmp/gaudioconvert.log | zenity \
--progress --title=gaudioconvert --text="'+name+'.wav to '+name+'.'+format+'" \
--auto-close --auto-kill')
if format in ('flac'):
os.system('flac -f --compression-level-'+quality+' "'+directory+\
'/'+name+'.wav" -o "'+directory+'/'+name+'.'+format+'" 2>>/tmp/gaudioconvert.log \
| zenity --progress --title=gaudioconvert --text="'+name+'.wav to '+directory+'/'\
+name+'.'+format+'" --auto-close --auto-kill')
if format in ('mp3'):
os.system('lame -m auto --preset '+quality+' "'+directory+'/'\
+name+'.wav" "'+directory+'/'+name+'.'+format+'" 2>>/tmp/gaudioconvert.log \
| zenity --progress --title=gaudioconvert --text="'+name+'.wav to '+name+'.'\
+format+'" --auto-close --auto-kill')
if format in ('mpc'):
os.system('mppenc --'+quality+' "'+directory+'/'+name+'.wav" "'\
+directory+'/'+name+'.'+format+'" 2>>/tmp/gaudioconvert.log | zenity --progress \
--title=gaudioconvert --text="'+name+'.wav to '+name+'.'+format+'" --auto-close \
--auto-kill')
if format in ('ogg'):
os.system('oggenc "'+directory+'/'+name+'.wav" -q '+quality+' -o \
"'+directory+'/'+name+'.'+format+'" 2>>/tmp/gaudioconvert.log | zenity --progress \
--title=gaudioconvert --text="'+name+'.wav to '+name+'.'+format+'" --auto-close \
--auto-kill')
move(directory+'/'+name+'.'+format, name+'.'+format)
try:
os.remove(directory+'/'+name+'.wav')
except OSError, detail:
detail == '[Errno 2] No such file or directory'
pass
def main():
directory = '.'+os.path.basename(argv[0])
if not os.path.isdir(directory):
try:
os.mkdir(directory)
except OSError, detail:
detail == '[Errno 17] File exists'
pass
var_conversion = (formatofout())
format_out = var_conversion[0]
quality = var_conversion[1]
count = 1
while count < len(argv):
diviso = os.path.basename(argv[count]).split('.')
name = join(diviso[:-1], '.')
format = diviso[-1]
format_in = checkformat(format, argv[count])
if format_in == 'salta' or format_in == format_out:
file = open('/tmp/gaudioconvert.log', 'a')
file.write('ATTENZIONE!\nLa conversione del file \
"'+argv[count]+'" nel formato '+format_out+' è stata saltata. :-/\n' )
file.close()
count = count + 1
continue
if format_in in ('aac'):
fromaactowav(argv[count], name, directory)
if format_in in ('ape'):
fromapetowav(argv[count], name, directory)
if format_in in ('flac'):
fromflactowav(argv[count], name, directory)
if format_in in ('mp3'):
frommp3towav(argv[count], name, directory)
if format_in in ('mpc'):
frommpctowav(argv[count], name, directory)
if format_in in ('ogg'):
fromoggtowav(argv[count], name, directory)
if format_in in ('wav'):
fromwmatowav(argv[count], name, directory)
fromwav(quality, directory, name, format_out)
count = count + 1
os.rmdir(directory)
##INIZIO
if len(argv[1:]) == 0:
os.system('zenity --title="Attenzione - gaudioconvert" --error\
--text="Seleziona almeno un file."')
main()
if os.path.isfile("/tmp/gaudioconvert.log") and \
os.path.getsize("/tmp/gaudioconvert.log") != 0:
os.system("cat /tmp/gaudioconvert.log | zenity \
--title='Errori e Avvisi - gaudioconvert' --text-info")
os.remove("/tmp/gaudioconvert.log")
Ultimo aggiornamento 01 Giugno 2009