pubblicato Lunedì 06 Aprile del 2009 alle 08:31.

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


powered by FreeFind
Il sito è una creazione di Maurizio... ed è pubblicato sotto una Licenza CC; esso non viene aggiornato
in maniera periodica, pertanto non può essere considerato un prodotto editoriale ai sensi della legge n. 62 del 7.03.2001.