import os, sys
if len(sys.argv) == 1:
- install_dir = '/usr/share/telemeta/'
+ install_dir = '/usr/share/telemeta/'
elif len(sys.argv) > 2:
- sys.exit('Give just one directory to install Telemeta, or none.')
+ sys.exit('Give just one directory to install Telemeta, or none.')
else:
- install_dir = sys.argv[1]
+ install_dir = sys.argv[1]
if not os.path.exists(install_dir):
- os.mkdir(install_dir)
+ os.mkdir(install_dir)
os.system('cp -ra ./* '+install_dir+os.sep)
os.system('rm -rf '+install_dir+os.sep+'debian')
if os.path.exists('/usr/bin/telemeta'):
- os.system('rm -r /usr/bin/telemeta')
+ os.system('rm -r /usr/bin/telemeta')
os.system('ln -s '+install_dir+os.sep+'telemeta.py '+'/usr/bin/telemeta')
from audio_tools import *
def make_auto_mark(dir_in,file_in):
- media_in = dir_in+file_in
- artist_no_ = string.replace(tag_tools.get_tag_value('ARTIST'),'_',' ')
- title_no_ = string.replace(tag_tools.get_tag_value('TITLE'),'_',' ')
- description_no_ = string.replace(tag_tools.get_tag_value('COMMENT'),'_',' ')
- os.system('echo "This is: '+title_no_+'. By '+artist_no_+'. It is '+description_no_+'" | text2wave -f 44100 -o "'+media_in+'_mark.tmp"')
- #os.system('normalize-audio "'+media_in+'_mark.tmp"')
- os.system('sox "'+media_in+'_mark.tmp" -t wav -c2 "'+media_in+'_mark.wav" vol 10.0 dB compand 50,20 -80,-80,-25,-35,-15,-27,-5,-19,0,-15 15')
- os.system('rm '+dir_in+'*.tmp')
+ media_in = dir_in+file_in
+ artist_no_ = string.replace(tag_tools.get_tag_value('ARTIST'),'_',' ')
+ title_no_ = string.replace(tag_tools.get_tag_value('TITLE'),'_',' ')
+ description_no_ = string.replace(tag_tools.get_tag_value('COMMENT'),'_',' ')
+ os.system('echo "This is: '+title_no_+'. By '+artist_no_+'. It is '+description_no_+'" | text2wave -f 44100 -o "'+media_in+'_mark.tmp"')
+ #os.system('normalize-audio "'+media_in+'_mark.tmp"')
+ os.system('sox "'+media_in+'_mark.tmp" -t wav -c2 "'+media_in+'_mark.wav" vol 10.0 dB compand 50,20 -80,-80,-25,-35,-15,-27,-5,-19,0,-15 15')
+ os.system('rm '+dir_in+'*.tmp')
def mark_audio(dir_in,file_in,audio_marking_file,audio_marking_timeline):
- media_in = dir_in+file_in
- file_length_sec = audio_length_sec(media_in)
- audio_mark_length_sec = audio_length_sec(audio_marking_file)
- ecasound_phrase = ''
- audio_gain = str(100+100*len(audio_marking_timeline))
+ media_in = dir_in+file_in
+ file_length_sec = audio_length_sec(media_in)
+ audio_mark_length_sec = audio_length_sec(audio_marking_file)
+ ecasound_phrase = ''
+ audio_gain = str(100+100*len(audio_marking_timeline))
- for timeline in audio_marking_timeline:
- audio_marking_ecasound_filename = file_in+'_'+timeline+'.ewf'
- audio_marking_ecasound_path = dir_in+file_in+'_'+timeline+'.ewf'
- audio_marking_ecasound_file=open(audio_marking_ecasound_path,'w')
- audio_marking_ecasound_file.write('-- '+audio_marking_ecasound_filename+' --\n')
- audio_marking_ecasound_file.write('source = '+audio_marking_file+'\n')
- if timeline == 'b':
- mark_offset = '0'
- ecasound_phrase = '-a:2 -i:"'+audio_marking_ecasound_path+'" -ea:'+audio_gain+' '
- if timeline == 'm':
- mark_offset = str(file_length_sec/2)
- ecasound_phrase = ecasound_phrase+'-a:3 -i:"'+audio_marking_ecasound_path+'" -ea:'+audio_gain+' '
- if timeline == 'e':
- mark_offset = str(file_length_sec-audio_mark_length_sec)
- ecasound_phrase = ecasound_phrase+'-a:4 -i:"'+audio_marking_ecasound_path+'" -ea:'+audio_gain+' '
- audio_marking_ecasound_file.write('offset = '+mark_offset+'.0\n')
- audio_marking_ecasound_file.write('start-position = 0.0\n')
- audio_marking_ecasound_file.write('length = '+str(audio_mark_length_sec)+'.0\n')
- audio_marking_ecasound_file.write('looping = false\n')
- audio_marking_ecasound_file.write('--cut--\n')
- audio_marking_ecasound_file.close()
- os.system('ecasound -a:1 -i:"'+media_in+'" -ea:'+audio_gain+' '+ecasound_phrase+' -a:all -o "'+dir_in+'marked_'+file_in+'"')
+ for timeline in audio_marking_timeline:
+ audio_marking_ecasound_filename = file_in+'_'+timeline+'.ewf'
+ audio_marking_ecasound_path = dir_in+file_in+'_'+timeline+'.ewf'
+ audio_marking_ecasound_file=open(audio_marking_ecasound_path,'w')
+ audio_marking_ecasound_file.write('-- '+audio_marking_ecasound_filename+' --\n')
+ audio_marking_ecasound_file.write('source = '+audio_marking_file+'\n')
+ if timeline == 'b':
+ mark_offset = '0'
+ ecasound_phrase = '-a:2 -i:"'+audio_marking_ecasound_path+'" -ea:'+audio_gain+' '
+ if timeline == 'm':
+ mark_offset = str(file_length_sec/2)
+ ecasound_phrase = ecasound_phrase+'-a:3 -i:"'+audio_marking_ecasound_path+'" -ea:'+audio_gain+' '
+ if timeline == 'e':
+ mark_offset = str(file_length_sec-audio_mark_length_sec)
+ ecasound_phrase = ecasound_phrase+'-a:4 -i:"'+audio_marking_ecasound_path+'" -ea:'+audio_gain+' '
+ audio_marking_ecasound_file.write('offset = '+mark_offset+'.0\n')
+ audio_marking_ecasound_file.write('start-position = 0.0\n')
+ audio_marking_ecasound_file.write('length = '+str(audio_mark_length_sec)+'.0\n')
+ audio_marking_ecasound_file.write('looping = false\n')
+ audio_marking_ecasound_file.write('--cut--\n')
+ audio_marking_ecasound_file.close()
+ os.system('ecasound -a:1 -i:"'+media_in+'" -ea:'+audio_gain+' '+ecasound_phrase+' -a:all -o "'+dir_in+'marked_'+file_in+'"')
from audio_tools import *
def encode(enc_type,dir_in,file_in,dir_out,file_out):
- media_in = dir_in+file_in
- media_out = dir_out+file_out
+ media_in = dir_in+file_in
+ media_out = dir_out+file_out
- if enc_type == 'flac' :
- quality = tag_tools.get_opt_value(enc_type+'_quality')
- os.system('flac -f -V -q '+quality+' -o "'+media_out+'" "'+media_in+'"')
+ if enc_type == 'flac' :
+ quality = tag_tools.get_opt_value(enc_type+'_quality')
+ os.system('flac -f -V -q '+quality+' -o "'+media_out+'" "'+media_in+'"')
- if enc_type == 'ogg':
- bitrate = tag_tools.get_opt_value(enc_type+'_bitrate')
- os.system('oggenc -b '+bitrate+' -o "'+media_out+'" "'+media_in+'"')
+ if enc_type == 'ogg':
+ bitrate = tag_tools.get_opt_value(enc_type+'_bitrate')
+ os.system('oggenc -b '+bitrate+' -o "'+media_out+'" "'+media_in+'"')
- if enc_type == 'mp3':
- bitrate = tag_tools.get_opt_value(enc_type+'_bitrate')
- tag='temp'
- os.system('lame -b '+tag+' --ta "'+tag+'" --tt "'+tag+'" --tl "'+tag+'" --ty '+tag+' --tg "Other" --tc "'+tag+'" "'+media_in+'" "'+media_out+'"')
+ if enc_type == 'mp3':
+ bitrate = tag_tools.get_opt_value(enc_type+'_bitrate')
+ tag='temp'
+ os.system('lame -b '+tag+' --ta "'+tag+'" --tt "'+tag+'" --tl "'+tag+'" --ty '+tag+' --tg "Other" --tc "'+tag+'" "'+media_in+'" "'+media_out+'"')
- if enc_type == 'wav':
- if iswav16(media_in):
- os.system('cp -a "'+media_in+'" "'+media_out+'"')
- else:
- os.system('sox "'+media_in+'" -w -r 44100 -t wav -c2 "'+media_out+'"')
+ if enc_type == 'wav':
+ if iswav16(media_in):
+ os.system('cp -a "'+media_in+'" "'+media_out+'"')
+ else:
+ os.system('sox "'+media_in+'" -w -r 44100 -t wav -c2 "'+media_out+'"')
-# if enc_type == 'ogg' and ismp3(media_in):
+# if enc_type == 'ogg' and ismp3(media_in):
# os.system('mp32ogg --verbose "'+file_in+'" "'+file_out+'"')
def decode(media_in,file_ext):
- if ismp3(media_in) or file_ext == 'mp3':
- os.system('mpg123 -q -s "'+media_in+'" -w "'+media_in+'.wav"')
- if isogg(media_in) or file_ext == 'ogg':
- os.system('oggdec -o "'+media_in+'.wav" "'+media_in+'"')
- if isflac(media_in) or file_ext == 'flac':
- os.system('flac -d "'+media_in+'"')
- if iswav(media_in) or file_ext == 'wav':
- os.system('sox "'+media_in+'" -w -r 44100 -t wav -c2 "'+media_in+'.wav"')
- if isaiff(media_in) or file_ext == 'aiff':
- os.system('sox "'+media_in+'" -w -r 44100 -t aiff -c2 "'+media_in+'.wav"')
+ if ismp3(media_in) or file_ext == 'mp3':
+ os.system('mpg123 -q -s "'+media_in+'" -w "'+media_in+'.wav"')
+ if isogg(media_in) or file_ext == 'ogg':
+ os.system('oggdec -o "'+media_in+'.wav" "'+media_in+'"')
+ if isflac(media_in) or file_ext == 'flac':
+ os.system('flac -d "'+media_in+'"')
+ if iswav(media_in) or file_ext == 'wav':
+ os.system('sox "'+media_in+'" -w -r 44100 -t wav -c2 "'+media_in+'.wav"')
+ if isaiff(media_in) or file_ext == 'aiff':
+ os.system('sox "'+media_in+'" -w -r 44100 -t aiff -c2 "'+media_in+'.wav"')
def normalize(media_in):
- os.system('normalize-audio "'+media_in+'"')
+ os.system('normalize-audio "'+media_in+'"')
def create_md5_key(dir_in,file_in):
- media_in = dir_in+file_in
- os.system('md5sum -b "'+media_in+'" "'+media_in+'.md5"')
+ media_in = dir_in+file_in
+ os.system('md5sum -b "'+media_in+'" "'+media_in+'.md5"')
def check_md5_key(dir_in,file_in):
- media_in = dir_in+file_in
- md5_log = os.popen4('md5sum -c "'+media_in+'" "'+media_in+'.md5"')
- if 'OK' in md5_log.split(':'):
- return True
- else:
- return False
+ media_in = dir_in+file_in
+ md5_log = os.popen4('md5sum -c "'+media_in+'" "'+media_in+'.md5"')
+ if 'OK' in md5_log.split(':'):
+ return True
+ else:
+ return False
def compare_md5_key(file_in,file_out):
- media_in = file_in
- media_out = file_out
- if not os.path.exists(media_in):
- return False
- else:
- print 'Checking md5sums...'
- file_in_in, file_in_out = os.popen4('md5sum -b "'+media_in+'"')
- file_out_in, file_out_out = os.popen4('md5sum -b "'+media_out+'"')
- for line in file_in_out.readlines():
- line = line.split('*')
- line = line[0]
- #print line
- for file_out_out_line in file_out_out.readlines():
- file_out_out_line= file_out_out_line.split('*')
- file_out_out_line= file_out_out_line[0]
- #print file_out_out_line
- if line == file_out_out_line:
- print 'Files are equal...\n'
- return True
- exit
- else:
- print 'Files are different...\n'
- return False
- exit
-
+ media_in = file_in
+ media_out = file_out
+ if not os.path.exists(media_in):
+ return False
+ else:
+ print 'Checking md5sums...'
+ file_in_in, file_in_out = os.popen4('md5sum -b "'+media_in+'"')
+ file_out_in, file_out_out = os.popen4('md5sum -b "'+media_out+'"')
+ for line in file_in_out.readlines():
+ line = line.split('*')
+ line = line[0]
+ #print line
+ for file_out_out_line in file_out_out.readlines():
+ file_out_out_line= file_out_out_line.split('*')
+ file_out_out_line= file_out_out_line[0]
+ #print file_out_out_line
+ if line == file_out_out_line:
+ print 'Files are equal...\n'
+ return True
+ exit
+ else:
+ print 'Files are different...\n'
+ return False
+ exit
+
def create_par_key(dir_in,file_in):
- media_in = dir_in+file_in
- os.system('par2 c -n1 "'+media_in+'"')
+ media_in = dir_in+file_in
+ os.system('par2 c -n1 "'+media_in+'"')
def recover_par_key(dir_in):
- for file in os.listdir(dir_in):
- media_in = dir_in+file
- if iswav(media_in):
- os.system('par2 r "'+media_in+'"')
+ for file in os.listdir(dir_in):
+ media_in = dir_in+file
+ if iswav(media_in):
+ os.system('par2 r "'+media_in+'"')
def verify_par_key(media_in):
- os.system('par2 v "'+media_in+'.par2"')
+ os.system('par2 v "'+media_in+'.par2"')
def clean_directory(dir_in,type_list):
- for enc_type in type_list:
- if os.path.exists(dir_in+enc_type):
- print 'Removing '+dir_in+enc_type
- os.system('rm -rf "'+dir_in+enc_type+'"')
+ for enc_type in type_list:
+ if os.path.exists(dir_in+enc_type):
+ print 'Removing '+dir_in+enc_type
+ os.system('rm -rf "'+dir_in+enc_type+'"')
def audio_length_sec(file) :
- file_in, file_out = os.popen4('wavinfo "'+file+'" | grep wavDataSize')
- for line in file_out.readlines():
- line_split = line.split(':')
- value = int(int(line_split[1])/(4*44100))
- return value
+ file_in, file_out = os.popen4('wavinfo "'+file+'" | grep wavDataSize')
+ for line in file_out.readlines():
+ line_split = line.split(':')
+ value = int(int(line_split[1])/(4*44100))
+ return value
def ext_is_audio(file):
- file_name_woext, file_ext = tag_tools.filename_split(file)
- return file_ext == "mp3" or file_ext == "ogg" or file_ext == "flac" or file_ext == "wav" or file_ext == "aif" or file_ext == "aiff" or file_ext == "WAV" or file_ext == "AIFF" or file_ext == "AIF" or file_ext == "MP3" or file_ext == "OGG" or file_ext == "FLAC"
+ file_name_woext, file_ext = tag_tools.filename_split(file)
+ return file_ext == "mp3" or file_ext == "ogg" or file_ext == "flac" or file_ext == "wav" or file_ext == "aif" or file_ext == "aiff" or file_ext == "WAV" or file_ext == "AIFF" or file_ext == "AIF" or file_ext == "MP3" or file_ext == "OGG" or file_ext == "FLAC"
def isaudio(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(' ')
- return (iswav16(file) or iswav(file) or ismp3(file) or isogg(file) or isflac(file) or isaiff(file) or isaiff16(file))
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(' ')
+ return (iswav16(file) or iswav(file) or ismp3(file) or isogg(file) or isflac(file) or isaiff(file) or isaiff16(file))
def iswav(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(' ')
- return ('WAVE' in line_split)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(' ')
+ return ('WAVE' in line_split)
def iswav16(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(' ')
- return ('WAVE' in line_split) and ('16' in line_split)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(' ')
+ return ('WAVE' in line_split) and ('16' in line_split)
def isaiff(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(' ')
- return ('AIFF' in line_split)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(' ')
+ return ('AIFF' in line_split)
def isaiff16(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(' ')
- return ('AIFF' in line_split) and ('16' in line_split)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(' ')
+ return ('AIFF' in line_split) and ('16' in line_split)
def ismp3(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split_space = line.split(' ')
- line_split_comma = line.split(',')
- return (('MPEG' in line_split_space and ' layer III' in line_split_comma) or 'MP3' in line_split_space)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split_space = line.split(' ')
+ line_split_comma = line.split(',')
+ return (('MPEG' in line_split_space and ' layer III' in line_split_comma) or 'MP3' in line_split_space)
def isogg(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(',')
- return (' Vorbis audio' in line_split)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(',')
+ return (' Vorbis audio' in line_split)
def isflac(file) :
- file_in, file_out = os.popen4('file "'+file+'"')
- for line in file_out.readlines():
- line_split = line.split(' ')
- return ('FLAC' in line_split)
+ file_in, file_out = os.popen4('file "'+file+'"')
+ for line in file_out.readlines():
+ line_split = line.split(' ')
+ return ('FLAC' in line_split)
class Collection :
- def __init__(self) :
- self.collection_name = 'telemeta_default'
- self.collection_dir = '/home/'+os.environ["USER"]+'/telemeta/'
- self.user_dir = '/home/'+os.environ["USER"]+'/.telemeta/'
- self.user_tag_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_tags.xml'
- self.user_collection_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_collection.xml'
- self.tag_table = 'ARTIST,TITLE,ALBUM,DATE,GENRE,SOURCE,ENCODER,COMMENT'
- self.type_list = 'mp3,ogg,flac,wav,aiff'
- self.net_backup_host = 'domain.com'
- self.net_backup_dir = '/home/'+os.environ["USER"]+'/telemeta/'
+ def __init__(self) :
+ self.collection_name = 'telemeta_default'
+ self.collection_dir = '/home/'+os.environ["USER"]+'/telemeta/'
+ self.user_dir = '/home/'+os.environ["USER"]+'/.telemeta/'
+ self.user_tag_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_tags.xml'
+ self.user_collection_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_collection.xml'
+ self.tag_table = 'ARTIST,TITLE,ALBUM,DATE,GENRE,SOURCE,ENCODER,COMMENT'
+ self.type_list = 'mp3,ogg,flac,wav,aiff'
+ self.net_backup_host = 'domain.com'
+ self.net_backup_dir = '/home/'+os.environ["USER"]+'/telemeta/'
#option_table=['enc_types','flac_bitrate','ogg_bitrate','mp3_bitrate','audio_marking','auto_audio_marking','audio_marking_file','audio_marking_timeline']
class Collection :
- def __init__(self) :
- self.collection_name = 'telemeta_default'
- self.collection_dir = '/home/'+os.environ["USER"]+'/telemeta_default/'
- self.user_dir = '/home/'+os.environ["USER"]+'/.telemeta/'
- self.default_tag_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_tags.xml'
- self.default_collection_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_collection.xml'
- self.tag_table = 'ARTIST,TITLE,ALBUM,DATE,GENRE,SOURCE,ENCODER,COMMENT'
- self.type_list = 'mp3,ogg,flac,wav,aiff'
- self.net_backup_host = 'domain.com'
- self.net_backup_dir = '/home/'+os.environ["USER"]+'/telemeta/'
+ def __init__(self) :
+ self.collection_name = 'telemeta_default'
+ self.collection_dir = '/home/'+os.environ["USER"]+'/telemeta_default/'
+ self.user_dir = '/home/'+os.environ["USER"]+'/.telemeta/'
+ self.default_tag_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_tags.xml'
+ self.default_collection_xml = '/home/'+os.environ["USER"]+'/.telemeta/default_collection.xml'
+ self.tag_table = 'ARTIST,TITLE,ALBUM,DATE,GENRE,SOURCE,ENCODER,COMMENT'
+ self.type_list = 'mp3,ogg,flac,wav,aiff'
+ self.net_backup_host = 'domain.com'
+ self.net_backup_dir = '/home/'+os.environ["USER"]+'/telemeta/'
#option_table=['enc_types','flac_bitrate','ogg_bitrate','mp3_bitrate','audio_marking','auto_audio_marking','audio_marking_file','audio_marking_timeline']
class Tags :
- def __init__(self) :
- self.COLLECTION = 'Unknown'
- self.ARTIST = 'Unknown'
- self.TITLE = 'Unknown'
- self.ALBUM = 'Unknown'
- self.GENRE = 'Other'
- self.DATE = '1900'
- self.SOURCE = 'Here'
- self.ENCODER = 'me@domain.com'
- self.COMMENT = 'No comment'
- self.ORIGINAL_MEDIA = '1/4" tape'
+ def __init__(self) :
+ self.COLLECTION = 'Unknown'
+ self.ARTIST = 'Unknown'
+ self.TITLE = 'Unknown'
+ self.ALBUM = 'Unknown'
+ self.GENRE = 'Other'
+ self.DATE = '1900'
+ self.SOURCE = 'Here'
+ self.ENCODER = 'me@domain.com'
+ self.COMMENT = 'No comment'
+ self.ORIGINAL_MEDIA = '1/4" tape'
class Options :
- def __init__(self) :
- self.collection = 'Unknown'
- self.enc_types = 'flac, ogg, mp3'
- self.ogg_bitrate ='192'
- self.mp3_bitrate = '192'
- self.flac_quality = '5'
- self.audio_marking = False
- self.auto_audio_marking = True
- self.audio_marking_file = '/path/to/file'
- self.audio_marking_timeline = 'b, m, e'
- self.par_key = True
- self.normalize = False
+ def __init__(self) :
+ self.collection = 'Unknown'
+ self.enc_types = 'flac, ogg, mp3'
+ self.ogg_bitrate ='192'
+ self.mp3_bitrate = '192'
+ self.flac_quality = '5'
+ self.audio_marking = False
+ self.auto_audio_marking = True
+ self.audio_marking_file = '/path/to/file'
+ self.audio_marking_timeline = 'b, m, e'
+ self.par_key = True
+ self.normalize = False
class Collection :
- def __init__(self) :
- self.collection_name = 'telemeta_default'
- self.collection_dir = '/home/'+os.environ["USER"]+'/telemeta_default/'
- self.user_dir = '/home/'+os.environ["USER"]+'/.telemeta/'
- self.default_tag_xml = '/home/'+os.environ["USER"]+ \
- '/.telemeta/default_tags.xml'
- self.default_collection_xml = '/home/'+os.environ["USER"]+ \
- '/.telemeta/default_collection.xml'
- self.tag_table = 'ARTIST,TITLE,ALBUM,DATE,GENRE,SOURCE,ENCODER,COMMENT'
- self.type_list = 'mp3,ogg,flac,wav,aiff'
- self.net_backup_host = 'domain.com'
- self.net_backup_dir = '/home/'+os.environ["USER"]+'/telemeta/'
+ def __init__(self) :
+ self.collection_name = 'telemeta_default'
+ self.collection_dir = '/home/'+os.environ["USER"]+'/telemeta_default/'
+ self.user_dir = '/home/'+os.environ["USER"]+'/.telemeta/'
+ self.default_tag_xml = '/home/'+os.environ["USER"]+ \
+ '/.telemeta/default_tags.xml'
+ self.default_collection_xml = '/home/'+os.environ["USER"]+ \
+ '/.telemeta/default_collection.xml'
+ self.tag_table = 'ARTIST,TITLE,ALBUM,DATE,GENRE,SOURCE,ENCODER,COMMENT'
+ self.type_list = 'mp3,ogg,flac,wav,aiff'
+ self.net_backup_host = 'domain.com'
+ self.net_backup_dir = '/home/'+os.environ["USER"]+'/telemeta/'
class Options :
- def __init__(self) :
- self.collection = 'Unknown'
- self.enc_types = 'flac, ogg, mp3'
- self.ogg_bitrate ='192'
- self.mp3_bitrate = '192'
- self.flac_quality = '5'
- self.audio_marking = False
- self.auto_audio_marking = True
- self.audio_marking_file = '/path/to/file'
- self.audio_marking_timeline = 'b, m, e'
- self.par_key = True
- self.normalize = False
+ def __init__(self) :
+ self.collection = 'Unknown'
+ self.enc_types = 'flac, ogg, mp3'
+ self.ogg_bitrate ='192'
+ self.mp3_bitrate = '192'
+ self.flac_quality = '5'
+ self.audio_marking = False
+ self.auto_audio_marking = True
+ self.audio_marking_file = '/path/to/file'
+ self.audio_marking_timeline = 'b, m, e'
+ self.par_key = True
+ self.normalize = False
class Tags :
- def __init__(self) :
- self.COLLECTION = 'Unknown'
- self.ARTIST = 'Unknown'
- self.TITLE = 'Unknown'
- self.ALBUM = 'Unknown'
- self.GENRE = 'Other'
- self.DATE = '1900'
- self.SOURCE = 'Here'
- self.ENCODER = 'me@domain.com'
- self.COMMENT = 'No comment'
- self.ORIGINAL_MEDIA = '1/4" tape'
+ def __init__(self) :
+ self.COLLECTION = 'Unknown'
+ self.ARTIST = 'Unknown'
+ self.TITLE = 'Unknown'
+ self.ALBUM = 'Unknown'
+ self.GENRE = 'Other'
+ self.DATE = '1900'
+ self.SOURCE = 'Here'
+ self.ENCODER = 'me@domain.com'
+ self.COMMENT = 'No comment'
+ self.ORIGINAL_MEDIA = '1/4" tape'
# ============
def write_collection_consts(fic):
- doc = xml.dom.minidom.Document()
- root = doc.createElement('telemeta')
- doc.appendChild(root)
- for data in collection.__dict__.keys() :
- value = collection.__dict__[data]
- node = doc.createElement('data')
- node.setAttribute('name', data)
- node.setAttribute('value', str(value))
- node.setAttribute('type', typeToolBox.getType(value))
- root.appendChild(node)
- file_object = open(fic, "w")
- xml.dom.ext.PrettyPrint(doc, file_object)
- file_object.close()
+ doc = xml.dom.minidom.Document()
+ root = doc.createElement('telemeta')
+ doc.appendChild(root)
+ for data in collection.__dict__.keys() :
+ value = collection.__dict__[data]
+ node = doc.createElement('data')
+ node.setAttribute('name', data)
+ node.setAttribute('value', str(value))
+ node.setAttribute('type', typeToolBox.getType(value))
+ root.appendChild(node)
+ file_object = open(fic, "w")
+ xml.dom.ext.PrettyPrint(doc, file_object)
+ file_object.close()
def get_collection_consts(doc):
- for data in doc.documentElement.getElementsByTagName('data') :
- name = data.getAttribute('name')
- value = typeToolBox.cast(data.getAttribute('value'), data.getAttribute('type'))
- collection.__dict__[name] = value
+ for data in doc.documentElement.getElementsByTagName('data') :
+ name = data.getAttribute('name')
+ value = typeToolBox.cast(data.getAttribute('value'), data.getAttribute('type'))
+ collection.__dict__[name] = value
def ask_write_collection(name):
- global collection
- for data in collection.__dict__.keys() :
- if data == 'collection_name' :
- def_value = name
- type_def_value = typeToolBox.getType(def_value)
- value = raw_input(data+' ? ['+str(def_value)+']: ')
- elif data == 'default_collection_xml' :
- collection_xml = '/home/'+os.environ["USER"]+'/.telemeta/'+name+'.xml'
- type_def_collection = typeToolBox.getType(collection_xml)
- collection_tmp = typeToolBox.cast(collection_xml,type_def_collection)
- collection.__dict__[data] = collection_tmp
- value = collection.__dict__[data]
- elif data == 'collection_dir' :
- collection_dir = '/home/'+os.environ["USER"]+'/'+name
- type_def_collection_dir = typeToolBox.getType(collection_dir)
- collection_tmp = typeToolBox.cast(collection_dir,type_def_collection_dir)
- collection.__dict__[data] = collection_tmp
- def_value = collection.__dict__[data]
- value = raw_input(data+' ? ['+str(def_value)+']: ')
- elif data == 'user_dir' :
- def_value = '/home/'+os.environ["USER"]+'/.telemeta/'
- type_def_value = typeToolBox.getType(def_value)
- value = def_value
- elif data == 'default_tag_xml' :
- def_value = '/home/'+os.environ["USER"]+'/.telemeta/default_tags.xml'
- type_def_value = typeToolBox.getType(def_value)
- value = def_value
- else :
- def_value = collection.__dict__[data]
- type_def_value = typeToolBox.getType(def_value)
- value = raw_input(data+' ? ['+str(def_value)+']: ')
- if not value == '' :
- value = typeToolBox.cast(value,type_def_value)
- #value = string.replace(in_float,' ','')
- collection.__dict__[data] = value
+ global collection
+ for data in collection.__dict__.keys() :
+ if data == 'collection_name' :
+ def_value = name
+ type_def_value = typeToolBox.getType(def_value)
+ value = raw_input(data+' ? ['+str(def_value)+']: ')
+ elif data == 'default_collection_xml' :
+ collection_xml = '/home/'+os.environ["USER"]+'/.telemeta/'+name+'.xml'
+ type_def_collection = typeToolBox.getType(collection_xml)
+ collection_tmp = typeToolBox.cast(collection_xml,type_def_collection)
+ collection.__dict__[data] = collection_tmp
+ value = collection.__dict__[data]
+ elif data == 'collection_dir' :
+ collection_dir = '/home/'+os.environ["USER"]+'/'+name
+ type_def_collection_dir = typeToolBox.getType(collection_dir)
+ collection_tmp = typeToolBox.cast(collection_dir,type_def_collection_dir)
+ collection.__dict__[data] = collection_tmp
+ def_value = collection.__dict__[data]
+ value = raw_input(data+' ? ['+str(def_value)+']: ')
+ elif data == 'user_dir' :
+ def_value = '/home/'+os.environ["USER"]+'/.telemeta/'
+ type_def_value = typeToolBox.getType(def_value)
+ value = def_value
+ elif data == 'default_tag_xml' :
+ def_value = '/home/'+os.environ["USER"]+'/.telemeta/default_tags.xml'
+ type_def_value = typeToolBox.getType(def_value)
+ value = def_value
+ else :
+ def_value = collection.__dict__[data]
+ type_def_value = typeToolBox.getType(def_value)
+ value = raw_input(data+' ? ['+str(def_value)+']: ')
+ if not value == '' :
+ value = typeToolBox.cast(value,type_def_value)
+ #value = string.replace(in_float,' ','')
+ collection.__dict__[data] = value
def get_consts_value(data):
- value = collection.__dict__[data]
- type_value = typeToolBox.getType(value)
- return value
+ value = collection.__dict__[data]
+ type_value = typeToolBox.getType(value)
+ return value
# TAGS
# =====
def write_tags(enc_type,dir_out,file_out):
- media_out = dir_out+file_out
-
- if enc_type == 'flac':
- audio = FLAC(media_out)
- for tag in tags.__dict__.keys():
- if tag == 'COMMENT':
- audio['DESCRIPTION'] = tags.__dict__[tag]
- else:
- audio[tag] = tags.__dict__[tag]
- audio.save()
-
- if enc_type == 'ogg':
- audio = OggVorbis(media_out)
- for tag in tags.__dict__.keys():
- audio[tag] = tags.__dict__[tag]
- audio.save()
-
- if enc_type == 'mp3':
- audio = ID3(media_out)
- #tags = ['ALBUM','DATE','GENRE','SOURCE','ENCODER','COMMENT']
- tag = tags.__dict__['TITLE']
- audio.add(TIT2(encoding=3, text=tag))
- tag = tags.__dict__['ARTIST']
- audio.add(TP1(encoding=3, text=tag))
- tag = tags.__dict__['ALBUM']
- audio.add(TAL(encoding=3, text=tag))
- tag = tags.__dict__['DATE']
- audio.add(TDA(encoding=3, text=tag))
- tag = tags.__dict__['GENRE']
- audio.add(TCO(encoding=3, text=tag))
- tag = tags.__dict__['COMMENT']
- audio.add(COM(encoding=3, text=tag))
- audio.save()
+ media_out = dir_out+file_out
+
+ if enc_type == 'flac':
+ audio = FLAC(media_out)
+ for tag in tags.__dict__.keys():
+ if tag == 'COMMENT':
+ audio['DESCRIPTION'] = tags.__dict__[tag]
+ else:
+ audio[tag] = tags.__dict__[tag]
+ audio.save()
+
+ if enc_type == 'ogg':
+ audio = OggVorbis(media_out)
+ for tag in tags.__dict__.keys():
+ audio[tag] = tags.__dict__[tag]
+ audio.save()
+
+ if enc_type == 'mp3':
+ audio = ID3(media_out)
+ #tags = ['ALBUM','DATE','GENRE','SOURCE','ENCODER','COMMENT']
+ tag = tags.__dict__['TITLE']
+ audio.add(TIT2(encoding=3, text=tag))
+ tag = tags.__dict__['ARTIST']
+ audio.add(TP1(encoding=3, text=tag))
+ tag = tags.__dict__['ALBUM']
+ audio.add(TAL(encoding=3, text=tag))
+ tag = tags.__dict__['DATE']
+ audio.add(TDA(encoding=3, text=tag))
+ tag = tags.__dict__['GENRE']
+ audio.add(TCO(encoding=3, text=tag))
+ tag = tags.__dict__['COMMENT']
+ audio.add(COM(encoding=3, text=tag))
+ audio.save()
def write_def_tags(fic):
- doc = xml.dom.minidom.Document()
- root = doc.createElement('telemeta')
- doc.appendChild(root)
- for tag in tags.__dict__.keys() :
- value = tags.__dict__[tag]
- node = doc.createElement('tag')
- node.setAttribute('name', tag)
- node.setAttribute('value', str(value))
- node.setAttribute('type', typeToolBox.getType(value))
- root.appendChild(node)
- for opt in options.__dict__.keys() :
- value = options.__dict__[opt]
- node = doc.createElement('opt')
- node.setAttribute('name', opt)
- node.setAttribute('value', str(value))
- node.setAttribute('type', typeToolBox.getType(value))
- root.appendChild(node)
- file_object = open(fic, "w")
- xml.dom.ext.PrettyPrint(doc, file_object)
- file_object.close()
+ doc = xml.dom.minidom.Document()
+ root = doc.createElement('telemeta')
+ doc.appendChild(root)
+ for tag in tags.__dict__.keys() :
+ value = tags.__dict__[tag]
+ node = doc.createElement('tag')
+ node.setAttribute('name', tag)
+ node.setAttribute('value', str(value))
+ node.setAttribute('type', typeToolBox.getType(value))
+ root.appendChild(node)
+ for opt in options.__dict__.keys() :
+ value = options.__dict__[opt]
+ node = doc.createElement('opt')
+ node.setAttribute('name', opt)
+ node.setAttribute('value', str(value))
+ node.setAttribute('type', typeToolBox.getType(value))
+ root.appendChild(node)
+ file_object = open(fic, "w")
+ xml.dom.ext.PrettyPrint(doc, file_object)
+ file_object.close()
def ask_write_tag():
- global tags
- global options
- for tag in tags.__dict__.keys() :
- def_value = tags.__dict__[tag]
- type_def_value = typeToolBox.getType(def_value)
- value = raw_input(tag+' ? ['+str(def_value)+']: ')
- if not value == '' :
- value = typeToolBox.cast(value,type_def_value)
- #value = string.replace(in_float,' ','')
- tags.__dict__[tag] = value
- for opt in options.__dict__.keys() :
- def_value = options.__dict__[opt]
- type_def_value = typeToolBox.getType(def_value)
- value = raw_input(opt+' ? ['+str(def_value)+']: ')
- if not value == '' :
- value = typeToolBox.cast(value,type_def_value)
- #value = string.replace(in_float,' ','')
- options.__dict__[opt] = value
+ global tags
+ global options
+ for tag in tags.__dict__.keys() :
+ def_value = tags.__dict__[tag]
+ type_def_value = typeToolBox.getType(def_value)
+ value = raw_input(tag+' ? ['+str(def_value)+']: ')
+ if not value == '' :
+ value = typeToolBox.cast(value,type_def_value)
+ #value = string.replace(in_float,' ','')
+ tags.__dict__[tag] = value
+ for opt in options.__dict__.keys() :
+ def_value = options.__dict__[opt]
+ type_def_value = typeToolBox.getType(def_value)
+ value = raw_input(opt+' ? ['+str(def_value)+']: ')
+ if not value == '' :
+ value = typeToolBox.cast(value,type_def_value)
+ #value = string.replace(in_float,' ','')
+ options.__dict__[opt] = value
def get_def_tags(doc):
- for tag in doc.documentElement.getElementsByTagName('tag') :
- name = tag.getAttribute('name')
- value = typeToolBox.cast(tag.getAttribute('value'), tag.getAttribute('type'))
- tags.__dict__[name] = value
- for opt in doc.documentElement.getElementsByTagName('opt') :
- name = opt.getAttribute('name')
- value = typeToolBox.cast(opt.getAttribute('value'), opt.getAttribute('type'))
- options.__dict__[name] = value
+ for tag in doc.documentElement.getElementsByTagName('tag') :
+ name = tag.getAttribute('name')
+ value = typeToolBox.cast(tag.getAttribute('value'), tag.getAttribute('type'))
+ tags.__dict__[name] = value
+ for opt in doc.documentElement.getElementsByTagName('opt') :
+ name = opt.getAttribute('name')
+ value = typeToolBox.cast(opt.getAttribute('value'), opt.getAttribute('type'))
+ options.__dict__[name] = value
def rename_tag(old_tag,new_tag):
- tag_list = tags.__dict__.keys()
- if old_tag in tag_list:
- tag_index = tag_list.index(old_tag)
- tag_list.remove(old_tag)
- tag_list.insert(tag_index,new_tag)
+ tag_list = tags.__dict__.keys()
+ if old_tag in tag_list:
+ tag_index = tag_list.index(old_tag)
+ tag_list.remove(old_tag)
+ tag_list.insert(tag_index,new_tag)
def get_tag_value(tag):
- value = tags.__dict__[tag]
- type_value = typeToolBox.getType(value)
- return value
+ value = tags.__dict__[tag]
+ type_value = typeToolBox.getType(value)
+ return value
def get_opt_value(opt):
- value = options.__dict__[opt]
- type_value = typeToolBox.getType(value)
- return value
+ value = options.__dict__[opt]
+ type_value = typeToolBox.getType(value)
+ return value
def add_tag(tag,value):
- tag_list = tags.__dict__.keys()
- tag_list.insert(0,tag)
- tags.__dict__[tag] = value
+ tag_list = tags.__dict__.keys()
+ tag_list.insert(0,tag)
+ tags.__dict__[tag] = value
def add_opt(opt,value):
- opt_list = options.__dict__.keys()
- opt_list.insert(0,opt)
- options.__dict__[opt] = value
+ opt_list = options.__dict__.keys()
+ opt_list.insert(0,opt)
+ options.__dict__[opt] = value
def rename_file(src_dir,file,file_name):
- if (file_name != "" and file_name != file):
- print "Renaming: %s -> %s\n" % (file,file_name)
- os.rename(src_dir+file, src_dir+file_name)
+ if (file_name != "" and file_name != file):
+ print "Renaming: %s -> %s\n" % (file,file_name)
+ os.rename(src_dir+file, src_dir+file_name)
def filename_split(file_name):
- filename_split = file_name.split('.')
- if len(filename_split) > 0:
- file_ext = filename_split[len(filename_split)-1]
- else:
- file_ext = ''
- file_name_woext = '.'.join(filename_split[:-1])
- return file_name_woext, file_ext
+ filename_split = file_name.split('.')
+ if len(filename_split) > 0:
+ file_ext = filename_split[len(filename_split)-1]
+ else:
+ file_ext = ''
+ file_name_woext = '.'.join(filename_split[:-1])
+ return file_name_woext, file_ext
#def check_ext():
- #if not ext_is_audio(file):
- #file_name_woext = file_name
- #if iswav(src_dir+file) :
- #file_ext = "wav"
- #if isaiff(src_dir+file) :
- #file_ext = "aiff"
- #if ismp3(src_dir+file) :
- #file_ext = "mp3"
- #if isogg(src_dir+file) :
- #file_ext = "ogg"
- #if isflac(src_dir+file) :
- #file_ext = "flac"
+ #if not ext_is_audio(file):
+ #file_name_woext = file_name
+ #if iswav(src_dir+file) :
+ #file_ext = "wav"
+ #if isaiff(src_dir+file) :
+ #file_ext = "aiff"
+ #if ismp3(src_dir+file) :
+ #file_ext = "mp3"
+ #if isogg(src_dir+file) :
+ #file_ext = "ogg"
+ #if isflac(src_dir+file) :
+ #file_ext = "flac"
def clean_filename(file_name) :
- file_name = re.sub("^[^\w]+","",filename) #trim the beginning
- file_name = re.sub("[^\w]+$","",file_name) #trim the end
- file_name = string.replace(file_name,' ','_')
- file_name = re.sub("_+","_",file_name) #squeeze continuous _ to one _
- file_name = re.sub("^[^\w]+","",file_name) #trim the beginning _
- #file_name = string.capitalize(file_name)
- return file_name
+ file_name = re.sub("^[^\w]+","",filename) #trim the beginning
+ file_name = re.sub("[^\w]+$","",file_name) #trim the end
+ file_name = string.replace(file_name,' ','_')
+ file_name = re.sub("_+","_",file_name) #squeeze continuous _ to one _
+ file_name = re.sub("^[^\w]+","",file_name) #trim the beginning _
+ #file_name = string.capitalize(file_name)
+ return file_name
def name2tag(src_dir,file_name_woext,file_ext):
- # get main tag
- tag_list = file_name_woext.split('-')
- tag_list_new = range(len(tag_list))
-
- #for num_t in tag_list[0]:
- # if num_t == str(int(num_t)):
- # i_t = 1
- # else:
-
- # computing main tags if many tags
- if len(tag_list) > 1 :
- i_t = 0
- artist_tmp = string.replace(tag_list[i_t],' ','_')
- artist_tmp = artist_tmp.split('_')
- i = 0
- for artist_word in artist_tmp :
- artist_tmp[i] = string.capitalize(artist_word)
- i = i+1
- artist = '_'.join(artist_tmp[:])
- artist = re.sub("[\_]+$","",artist) #trim the end
- tag_list_new[i_t] = artist
- artist = string.replace(artist,'_',' ')
-
- i_t = i_t + 1
- title = string.replace(tag_list[i_t],' ','_')
- title = re.sub("^[\_]+","",title) #trim the beginning
- title = re.sub("[\_]+$","",title) #trim the end
- title_tmp = title.split('_')
- title_tmp[0] = string.capitalize(title_tmp[0])
- title = '_'.join(title_tmp[:])
- tag_list_new[i_t] = title
- title = string.replace(title,'_',' ')
-
- # computing main tag if only one tag
- if len(tag_list) == 1 :
- artist = get_tag_value('ARTIST')
- i_t = 0
- title = string.replace(tag_list[i_t],' ','_')
- title = re.sub("^[\_]+","",title) #trim the beginning
- title = re.sub("[\_]+$","",title) #trim the end
- title_tmp = title.split('_')
- title_tmp[0] = string.capitalize(title_tmp[0])
- title = '_'.join(title_tmp[:])
- tag_list_new[i_t] = title
- title = string.replace(title,'_',' ')
-
- file_name_new = '-'.join(tag_list_new[:])
-
- # renaming main source file
- file_name = file_name_new+'.'+file_ext
-
- return title,artist,file_name_new
+ # get main tag
+ tag_list = file_name_woext.split('-')
+ tag_list_new = range(len(tag_list))
+
+ #for num_t in tag_list[0]:
+ # if num_t == str(int(num_t)):
+ # i_t = 1
+ # else:
+
+ # computing main tags if many tags
+ if len(tag_list) > 1 :
+ i_t = 0
+ artist_tmp = string.replace(tag_list[i_t],' ','_')
+ artist_tmp = artist_tmp.split('_')
+ i = 0
+ for artist_word in artist_tmp :
+ artist_tmp[i] = string.capitalize(artist_word)
+ i = i+1
+ artist = '_'.join(artist_tmp[:])
+ artist = re.sub("[\_]+$","",artist) #trim the end
+ tag_list_new[i_t] = artist
+ artist = string.replace(artist,'_',' ')
+
+ i_t = i_t + 1
+ title = string.replace(tag_list[i_t],' ','_')
+ title = re.sub("^[\_]+","",title) #trim the beginning
+ title = re.sub("[\_]+$","",title) #trim the end
+ title_tmp = title.split('_')
+ title_tmp[0] = string.capitalize(title_tmp[0])
+ title = '_'.join(title_tmp[:])
+ tag_list_new[i_t] = title
+ title = string.replace(title,'_',' ')
+
+ # computing main tag if only one tag
+ if len(tag_list) == 1 :
+ artist = get_tag_value('ARTIST')
+ i_t = 0
+ title = string.replace(tag_list[i_t],' ','_')
+ title = re.sub("^[\_]+","",title) #trim the beginning
+ title = re.sub("[\_]+$","",title) #trim the end
+ title_tmp = title.split('_')
+ title_tmp[0] = string.capitalize(title_tmp[0])
+ title = '_'.join(title_tmp[:])
+ tag_list_new[i_t] = title
+ title = string.replace(title,'_',' ')
+
+ file_name_new = '-'.join(tag_list_new[:])
+
+ # renaming main source file
+ file_name = file_name_new+'.'+file_ext
+
+ return title,artist,file_name_new
# Info, error
# ===========
if len(sys.argv) == 1 :
- print "telemeta v"+str(version)+" (c) 2006-2007 Guillaume Pellerin <yomguy@altern.org>>"
- print "version: "+str(version)
- print "depends: python, python-xml, python-mutagen, sox, oggenc, flac, lame, normalize-audio, ecasound, wavbreaker, festival"
- print "distributed under the terms of the GNU Public License v2.\n"
- print """ This program is distributed in the hope that it will be useful,
+ print "telemeta v"+str(version)+" (c) 2006-2007 Guillaume Pellerin <yomguy@altern.org>>"
+ print "version: "+str(version)
+ print "depends: python, python-xml, python-mutagen, sox, oggenc, flac, lame, normalize-audio, ecasound, wavbreaker, festival"
+ print "distributed under the terms of the GNU Public License v2.\n"
+ print """ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.\n"""
- sys.exit('Type telemeta --help for help !\n')
+ sys.exit('Type telemeta --help for help !\n')
elif sys.argv[1] == '--help':
- print "TELEMETA:"
- print " backups, transcodes, tags and marks any audio content with metadata\n"
- print "VERSION:"
- print " "+str(version)+'\n'
- print "DEPENDS:"
- print " python, python-xml, python-mutagen, sox, oggenc, flac, lame, normalize-audio, ecasound, wavbreaker, festival\n"
- print "COPYRIGHT:"
- print " Copyright (c) 2006-2007 Guillaume Pellerin <yomguy@altern.org>\n"
- print "LICENSE:"
- print " distributed under the terms of the GNU Public License v2.\n"
- print "USAGE:"
- print " telemeta [OPTIONS] COLLECTION [OPTIONS] [MEDIA] \n"
- print "COLLECTION:"
- print " - the name of collection you want to create"
- print " - the name of collection you want to backup or process into\n"
- print "MEDIA:"
- print " - an audio file"
- print " - a directory when the --album option is given\n"
- print "OPTIONS:"
- print " --create creates a collection repository"
- print " --backup backups and transcodes wave files to a collection"
- print " --album proccesses an entire directory (one shot album)"
- print " --from-xml takes tags and opts in original xml source"
- print " --force forces file conversion"
- print " --add-tag add a tag to a collection"
- print ' --par2 forces security "par2" key creation'
- print " --all-default chooses default argument for all question"
- print ' --recover check an repair the backuped media with the previously created "par2" security key'
- print " --rsync synchronizes a collection with a remote server repository (ssh+rsync)"
- print " --erase erases a collection (flac, ogg, mp3 only !)"
- print " --version gives the program version"
- print " --help gives help page\n"
- print "EXAMPLES:"
- print " telemeta --create my_collection"
- print " telemeta --backup my_collection file.wav"
- print " telemeta --backup my_collection --album /path/to/directory/"
- print " telemeta --backup my_collection --album --par2 --rsync /path/to/directory/"
- print " telemeta --backup my_collection --album --par2 --rsync --force /path/to/directory/\n"
- print "AUTHOR:"
- print " Guillaume Pellerin <yomguy@altern.org>\n"
- print "URL:"
- print " http://svn.parisson.org/telemeta\n"
- print 'IMPORTANT:'
- print " With the '--album' option, it supposed that all your wav files in the directory are named respectively to this scheme :"
- print " artist-title[-album-date-genre-description][.wav]"
- print " where the 'artist' and 'title' tags are necessary needed."
- print " Tags between [] are optional main tags.\n"
- print "FOR MORE INFORMATIONS :"
- print " - read the README file"
- print " - go to http://svn.parisson.org/telemeta"
- sys.exit(' - email me !\n')
+ print "TELEMETA:"
+ print " backups, transcodes, tags and marks any audio content with metadata\n"
+ print "VERSION:"
+ print " "+str(version)+'\n'
+ print "DEPENDS:"
+ print " python, python-xml, python-mutagen, sox, oggenc, flac, lame, normalize-audio, ecasound, wavbreaker, festival\n"
+ print "COPYRIGHT:"
+ print " Copyright (c) 2006-2007 Guillaume Pellerin <yomguy@altern.org>\n"
+ print "LICENSE:"
+ print " distributed under the terms of the GNU Public License v2.\n"
+ print "USAGE:"
+ print " telemeta [OPTIONS] COLLECTION [OPTIONS] [MEDIA] \n"
+ print "COLLECTION:"
+ print " - the name of collection you want to create"
+ print " - the name of collection you want to backup or process into\n"
+ print "MEDIA:"
+ print " - an audio file"
+ print " - a directory when the --album option is given\n"
+ print "OPTIONS:"
+ print " --create creates a collection repository"
+ print " --backup backups and transcodes wave files to a collection"
+ print " --album proccesses an entire directory (one shot album)"
+ print " --from-xml takes tags and opts in original xml source"
+ print " --force forces file conversion"
+ print " --add-tag add a tag to a collection"
+ print ' --par2 forces security "par2" key creation'
+ print " --all-default chooses default argument for all question"
+ print ' --recover check an repair the backuped media with the previously created "par2" security key'
+ print " --rsync synchronizes a collection with a remote server repository (ssh+rsync)"
+ print " --erase erases a collection (flac, ogg, mp3 only !)"
+ print " --version gives the program version"
+ print " --help gives help page\n"
+ print "EXAMPLES:"
+ print " telemeta --create my_collection"
+ print " telemeta --backup my_collection file.wav"
+ print " telemeta --backup my_collection --album /path/to/directory/"
+ print " telemeta --backup my_collection --album --par2 --rsync /path/to/directory/"
+ print " telemeta --backup my_collection --album --par2 --rsync --force /path/to/directory/\n"
+ print "AUTHOR:"
+ print " Guillaume Pellerin <yomguy@altern.org>\n"
+ print "URL:"
+ print " http://svn.parisson.org/telemeta\n"
+ print 'IMPORTANT:'
+ print " With the '--album' option, it supposed that all your wav files in the directory are named respectively to this scheme :"
+ print " artist-title[-album-date-genre-description][.wav]"
+ print " where the 'artist' and 'title' tags are necessary needed."
+ print " Tags between [] are optional main tags.\n"
+ print "FOR MORE INFORMATIONS :"
+ print " - read the README file"
+ print " - go to http://svn.parisson.org/telemeta"
+ sys.exit(' - email me !\n')
elif sys.argv[1] == '--version':
- sys.exit('Version: '+str(version))
+ sys.exit('Version: '+str(version))
else :
- print "telemeta v"+str(version)+" (c) 2006-2007 Guillaume Pellerin <yomguy@altern.org>"
- print """ This program is distributed in the hope that it will be useful,
+ print "telemeta v"+str(version)+" (c) 2006-2007 Guillaume Pellerin <yomguy@altern.org>"
+ print """ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.\n"""
# Get arguments
if '--recover' in argv :
- index = argv.index('--recover')
- audio_tools.recover_par_key(argv[index+1]+os.sep)
- sys.exit('Directory successfully recovered !')
+ index = argv.index('--recover')
+ audio_tools.recover_par_key(argv[index+1]+os.sep)
+ sys.exit('Directory successfully recovered !')
if '--erase' in argv :
- type_list = tag_tools.get_consts_value('type_list')
- type_list = type_list.split(',')
- index = argv.index('--erase')
- audio_tools.clean_directory(argv[index+1],type_list)
- sys.exit('Media directories successfully cleaned !')
+ type_list = tag_tools.get_consts_value('type_list')
+ type_list = type_list.split(',')
+ index = argv.index('--erase')
+ audio_tools.clean_directory(argv[index+1],type_list)
+ sys.exit('Media directories successfully cleaned !')
if '--force' in argv :
- print 'Warning: forcing file transfert and conversion (no audio test) !\n'
- mode_force = True
+ print 'Warning: forcing file transfert and conversion (no audio test) !\n'
+ mode_force = True
else :
- mode_force = False
+ mode_force = False
if '--album' in argv :
- print 'Warning: album (recusive) mode...\n'
- mode_album = True
+ print 'Warning: album (recusive) mode...\n'
+ mode_album = True
else :
- mode_album = False
+ mode_album = False
if '--backup' in argv :
- print 'Warning: backup mode...\n'
- mode_backup = True
+ print 'Warning: backup mode...\n'
+ mode_backup = True
else :
- mode_backup = False
+ mode_backup = False
if '--tags' in argv :
- print 'Warning: making tags...\n'
- mode_tags = True
+ print 'Warning: making tags...\n'
+ mode_tags = True
else :
- mode_tags = False
+ mode_tags = False
if '--add-tag' in argv :
- print 'Warning: adding tags...\n'
- mode_add_tag = True
+ print 'Warning: adding tags...\n'
+ mode_add_tag = True
else :
- mode_add_tag = False
+ mode_add_tag = False
if '--from-xml' in argv :
- print 'Warning: processing from XML...\n'
- mode_from_xml = True
+ print 'Warning: processing from XML...\n'
+ mode_from_xml = True
else :
- mode_from_xml = False
+ mode_from_xml = False
if '--clean-strings' in argv :
- print 'Warning: Cleaning strings...\n'
- mode_clean = True
+ print 'Warning: Cleaning strings...\n'
+ mode_clean = True
else :
- mode_clean = False
+ mode_clean = False
if '--all-default' in argv :
- print 'Warning: default mode enabled...\n'
- mode_default = True
+ print 'Warning: default mode enabled...\n'
+ mode_default = True
else :
- mode_default = False
+ mode_default = False
if '--par2' in argv :
- print 'Warning: creates par2 security keys...\n'
- mode_par2 = True
+ print 'Warning: creates par2 security keys...\n'
+ mode_par2 = True
else :
- mode_par2 = False
+ mode_par2 = False
if '--rsync' in argv :
- print 'Warning: synchronize with remote host...\n'
- mode_rsync = True
+ print 'Warning: synchronize with remote host...\n'
+ mode_rsync = True
else :
- mode_rsync = False
+ mode_rsync = False
if '--create' in argv :
- print 'Warning: creating a telemeta collection...\n'
- mode_create = True
+ print 'Warning: creating a telemeta collection...\n'
+ mode_create = True
else :
- mode_create = False
+ mode_create = False
# Creates user default dir
user_dir = tag_tools.get_consts_value('user_dir')
if not os.path.exists(user_dir):
- os.mkdir(user_dir)
+ os.mkdir(user_dir)
# Create or check the databse config
default_collection_xml = tag_tools.get_consts_value('default_collection_xml')
if not os.access(default_collection_xml, os.F_OK) :
- tag_tools.write_collection_consts(default_collection_xml)
+ tag_tools.write_collection_consts(default_collection_xml)
# Create the collection
if mode_create :
- if len(argv) == 3 :
- index = argv.index('--create')
- collection_name = argv[index+1]
- tag_tools.ask_write_collection(collection_name)
- default_collection_xml = tag_tools.get_consts_value('default_collection_xml')
- collection_dir = tag_tools.get_consts_value('collection_dir')
- if not os.path.exists(collection_dir):
- os.mkdir(collection_dir)
- else :
- sys.exit('ERROR: the collection '+collection_name+' already exists')
- tag_tools.write_collection_consts(default_collection_xml)
- tag_tools.write_collection_consts(collection_dir+os.sep+collection_name+'.xml')
- # Parses collection data
- sys.exit("\nCollection created ! You can now --backup media in it...")
- else :
- sys.exit("ERROR: no collection name given... : give a name for your collection.")
+ if len(argv) == 3 :
+ index = argv.index('--create')
+ collection_name = argv[index+1]
+ tag_tools.ask_write_collection(collection_name)
+ default_collection_xml = tag_tools.get_consts_value('default_collection_xml')
+ collection_dir = tag_tools.get_consts_value('collection_dir')
+ if not os.path.exists(collection_dir):
+ os.mkdir(collection_dir)
+ else :
+ sys.exit('ERROR: the collection '+collection_name+' already exists')
+ tag_tools.write_collection_consts(default_collection_xml)
+ tag_tools.write_collection_consts(collection_dir+os.sep+collection_name+'.xml')
+ # Parses collection data
+ sys.exit("\nCollection created ! You can now --backup media in it...")
+ else :
+ sys.exit("ERROR: no collection name given... : give a name for your collection.")
# Backup into the collection
elif mode_backup :
- # Check syntax
- if not os.path.exists(sys.argv[len(sys.argv)-1]) :
- sys.exit("ERROR: no such media... : give a directory or a file as last argument.")
- index = argv.index('--backup')
- collection_name = argv[index+1]
- collection_xml = user_dir+os.sep+collection_name+'.xml'
- if not os.path.exists(collection_xml) :
- sys.exit("This collection doesn't exists. Create it first ! (--create)")
- else :
- doc = xml.dom.minidom.parse(user_dir+os.sep+collection_name+'.xml')
- print "Parsing collection XML file..."
- tag_tools.get_collection_consts(doc)
- collection_dir = tag_tools.get_consts_value('collection_dir')
- print "OK\n"
-
+ # Check syntax
+ if not os.path.exists(sys.argv[len(sys.argv)-1]) :
+ sys.exit("ERROR: no such media... : give a directory or a file as last argument.")
+ index = argv.index('--backup')
+ collection_name = argv[index+1]
+ collection_xml = user_dir+os.sep+collection_name+'.xml'
+ if not os.path.exists(collection_xml) :
+ sys.exit("This collection doesn't exists. Create it first ! (--create)")
+ else :
+ doc = xml.dom.minidom.parse(user_dir+os.sep+collection_name+'.xml')
+ print "Parsing collection XML file..."
+ tag_tools.get_collection_consts(doc)
+ collection_dir = tag_tools.get_consts_value('collection_dir')
+ print "OK\n"
+
# Creates source dir
src_dir = collection_dir+os.sep+'src'+os.sep
# Creates user default tag/opt file and parse it
default_tag_xml = tag_tools.get_consts_value('default_tag_xml')
if not os.access(default_tag_xml, os.F_OK) :
- tag_tools.write_def_tags(default_tag_xml)
+ tag_tools.write_def_tags(default_tag_xml)
# Parses tag data
doc = xml.dom.minidom.parse(default_tag_xml)
# File listing for album mode
if mode_album :
- master_dir = argv[len_argv-1]+os.sep
- if os.path.isdir(master_dir):
- file_master_list = os.listdir(master_dir)
- else:
- sys.exit('Please give a directory path for the last argument (album mode)...')
+ master_dir = argv[len_argv-1]+os.sep
+ if os.path.isdir(master_dir):
+ file_master_list = os.listdir(master_dir)
+ else:
+ sys.exit('Please give a directory path for the last argument (album mode)...')
# File listing in normal mode
else :
- master_dir = argv[len_argv-1]
- if os.path.isdir(master_dir):
- file_master_list = os.listdir(master_dir)
- elif os.path.isfile(master_dir):
- master_dir = os.getcwd()+os.sep
- file_master_list[0] = str(argv[len_argv-1])
- else:
- sys.exit('Please give a directory or a file path for the last argument...')
+ master_dir = argv[len_argv-1]
+ if os.path.isdir(master_dir):
+ file_master_list = os.listdir(master_dir)
+ elif os.path.isfile(master_dir):
+ master_dir = os.getcwd()+os.sep
+ file_master_list[0] = str(argv[len_argv-1])
+ else:
+ sys.exit('Please give a directory or a file path for the last argument...')
# Asks tags if mode album
if mode_album and not mode_from_xml :
- tag_tools.ask_write_tag()
- tag_tools.write_def_tags(default_tag_xml)
+ tag_tools.ask_write_tag()
+ tag_tools.write_def_tags(default_tag_xml)
# Main loop
# =========
for file in file_master_list :
- if isaudio(master_dir+os.sep+file) or (mode_force and ext_is_audio(master_dir+os.sep+file)):
- print '\n'
- print '+------------------------------------------------------------------------------------'
- print '| Processing '+master_dir+file
- print '+------------------------------------------------------------------------------------'
-
- # Init
- file_name = file
- file_in = file
- dir_in = src_dir
-
- # Backup mode
- if mode_backup :
- album_dir_tmp = tag_tools.get_tag_value('ALBUM')
- album_dir = collection_dir+os.sep+'src'+os.sep+album_dir_tmp+os.sep
- if not os.path.exists(album_dir) :
- os.mkdir(album_dir)
- if isaudio(master_dir+file) and ( not audio_tools.compare_md5_key(master_dir+file,album_dir+file) or mode_force ) :
- print 'Copying files into: '+album_dir+''
- os.system('cp -ra "'+master_dir+file+'" '+album_dir)
- print 'OK\n'
- #else:
- # sys.exit(master_dir+file+' is not an audio file...')
- src_dir = album_dir
- dir_in = src_dir
- else :
- dir_in = master_dir
-
- # Creating par2 key
- par_key_value = tag_tools.get_opt_value('par_key')
- if mode_par2 and par_key_value :
- # Creating "par2" security keys
- print 'Creating "par2" security keys...'
- audio_tools.create_par_key(dir_in,file)
-
- # Name, extension
- file_name_woext, file_ext = tag_tools.filename_split(file)
- tag_tools.add_tag('ORIGINAL_FILENAME',file)
- tag_tools.add_tag('ORIGINAL_TYPE',file_ext)
-
- # Get original XML
- if mode_from_xml :
- doc = xml.dom.minidom.parse(dir_in+file_name+'.xml')
- tag_tools.get_def_tags(doc)
-
- # Album mode
- if mode_album :
- # Getting file main tags
- title,artist,file_name_new = tag_tools.name2tag(dir_in,file_name_woext,file_ext)
- tag_tools.add_tag('ARTIST',artist)
- tag_tools.add_tag('TITLE',title)
- print "Artist: "+artist
- print "Title: "+title+'\n'
- #tag_tools.write_def_tags(default_tag_xml)
-
- # Asks for new metadata and write default user tags/options
- if not mode_default and not mode_from_xml and not mode_album:
- tag_tools.ask_write_tag()
- tag_tools.write_def_tags(default_tag_xml)
-
-
-
- # Clean mode
- if mode_clean :
- file_name = tag_tools.clean_filename(file_name)
- # Renaming backup source file
- tag_tools.rename_file(dir_in,dir_out,file,file_name)
-
- # Writing xml data
- if not mode_from_xml :
- print 'Writing xml data...'
- tag_tools.write_def_tags(dir_in+file_name+'.xml')
-
- # Getting encoding types
- enc_types = tag_tools.get_opt_value('enc_types')
- enc_types = string.replace(enc_types,' ','').split(',')
-
- # Checking existing file
- for enc_type in enc_types:
- dir_out = master_dir+enc_type+os.sep
- file_out = file_name_woext+'.'+enc_type
- if not os.path.exists(dir_out+file_out):
- new_track = True
- else :
- new_track = False
-
- # Decoding to a new 16 bits wav file if needed
- if not iswav16(dir_in+file_in) and new_track:
- print "Decoding to wav 16 bits..."
- audio_tools.decode(dir_in+file_in,file_ext)
- # Important !
- type_list = tag_tools.get_consts_value('type_list')
- type_list = type_list.split(',')
- if not file_ext in type_list :
- file_in=file_in+'.wav'
-
- # Normalize file if needed
- normalize_value = tag_tools.get_opt_value('normalize')
- if normalize_value:
- print 'Normalizing...'
- audio_tools.normalize(dir_in+file_in)
-
- # Marking
- audio_marking_value = tag_tools.get_opt_value('audio_marking')
- auto_audio_marking = tag_tools.get_opt_value('auto_audio_marking')
- audio_marking_file = tag_tools.get_opt_value('audio_marking_file')
- audio_marking_timeline = tag_tools.get_opt_value('audio_marking_timeline')
- audio_marking_timeline = string.replace(audio_marking_timeline,' ','').split(',')
- if audio_marking_value and new_track:
- if auto_audio_marking:
- print 'Creating track audio mark...'
- audio_marking.make_auto_mark(dir_in,file_in)
- audio_marking_file = dir_in+file_in+'_mark.wav'
- print 'Marking '+file_in+' with '+audio_marking_file+'...'
- audio_marking.mark_audio(dir_in,file_in,audio_marking_file,audio_marking_timeline)
- file_in = 'marked_'+file_in
-
- # Encoding loop
- for enc_type in enc_types:
- dir_out = collection_dir+os.sep+enc_type+os.sep
- if not os.path.exists(dir_out):
- os.mkdir(dir_out)
- album = tag_tools.get_tag_value('ALBUM')
- dir_out = collection_dir+os.sep+enc_type+os.sep+album+os.sep
- if not os.path.exists(dir_out):
- os.mkdir(dir_out)
- file_out = file_name_woext+'.'+enc_type
-
- if not os.path.exists(dir_out+file_out) or mode_force :
- print 'Converting '+dir_in+file_name+' to '+enc_type+'...'
- # Encoding
- print 'Encoding file...'
- audio_tools.encode(enc_type,dir_in,file_in,dir_out,file_out)
- print 'Writing tags to encoded file...'
- tag_tools.write_tags(enc_type,dir_out,file_out)
-
- else :
- print dir_out+file_out+' already exists !'
- if mode_tags :
- print 'But writing tags to encoded file...'
- tag_tools.write_tags(enc_type,dir_out,file_out)
-
- # Remove tmp files
- file_list = os.listdir(src_dir)
- for file in file_list:
- if 'marked_' in file or '.ewf' in file or '_mark.wav' in file or file_ext+'.wav' in file:
- os.system('rm "'+dir_in+file+'"')
-
- else :
- print file+" is not an audio file !"
+ if isaudio(master_dir+os.sep+file) or (mode_force and ext_is_audio(master_dir+os.sep+file)):
+ print '\n'
+ print '+------------------------------------------------------------------------------------'
+ print '| Processing '+master_dir+file
+ print '+------------------------------------------------------------------------------------'
+
+ # Init
+ file_name = file
+ file_in = file
+ dir_in = src_dir
+
+ # Backup mode
+ if mode_backup :
+ album_dir_tmp = tag_tools.get_tag_value('ALBUM')
+ album_dir = collection_dir+os.sep+'src'+os.sep+album_dir_tmp+os.sep
+ if not os.path.exists(album_dir) :
+ os.mkdir(album_dir)
+ if isaudio(master_dir+file) and ( not audio_tools.compare_md5_key(master_dir+file,album_dir+file) or mode_force ) :
+ print 'Copying files into: '+album_dir+''
+ os.system('cp -ra "'+master_dir+file+'" '+album_dir)
+ print 'OK\n'
+ #else:
+ # sys.exit(master_dir+file+' is not an audio file...')
+ src_dir = album_dir
+ dir_in = src_dir
+ else :
+ dir_in = master_dir
+
+ # Creating par2 key
+ par_key_value = tag_tools.get_opt_value('par_key')
+ if mode_par2 and par_key_value :
+ # Creating "par2" security keys
+ print 'Creating "par2" security keys...'
+ audio_tools.create_par_key(dir_in,file)
+
+ # Name, extension
+ file_name_woext, file_ext = tag_tools.filename_split(file)
+ tag_tools.add_tag('ORIGINAL_FILENAME',file)
+ tag_tools.add_tag('ORIGINAL_TYPE',file_ext)
+
+ # Get original XML
+ if mode_from_xml :
+ doc = xml.dom.minidom.parse(dir_in+file_name+'.xml')
+ tag_tools.get_def_tags(doc)
+
+ # Album mode
+ if mode_album :
+ # Getting file main tags
+ title,artist,file_name_new = tag_tools.name2tag(dir_in,file_name_woext,file_ext)
+ tag_tools.add_tag('ARTIST',artist)
+ tag_tools.add_tag('TITLE',title)
+ print "Artist: "+artist
+ print "Title: "+title+'\n'
+ #tag_tools.write_def_tags(default_tag_xml)
+
+ # Asks for new metadata and write default user tags/options
+ if not mode_default and not mode_from_xml and not mode_album:
+ tag_tools.ask_write_tag()
+ tag_tools.write_def_tags(default_tag_xml)
+
+
+
+ # Clean mode
+ if mode_clean :
+ file_name = tag_tools.clean_filename(file_name)
+ # Renaming backup source file
+ tag_tools.rename_file(dir_in,dir_out,file,file_name)
+
+ # Writing xml data
+ if not mode_from_xml :
+ print 'Writing xml data...'
+ tag_tools.write_def_tags(dir_in+file_name+'.xml')
+
+ # Getting encoding types
+ enc_types = tag_tools.get_opt_value('enc_types')
+ enc_types = string.replace(enc_types,' ','').split(',')
+
+ # Checking existing file
+ for enc_type in enc_types:
+ dir_out = master_dir+enc_type+os.sep
+ file_out = file_name_woext+'.'+enc_type
+ if not os.path.exists(dir_out+file_out):
+ new_track = True
+ else :
+ new_track = False
+
+ # Decoding to a new 16 bits wav file if needed
+ if not iswav16(dir_in+file_in) and new_track:
+ print "Decoding to wav 16 bits..."
+ audio_tools.decode(dir_in+file_in,file_ext)
+ # Important !
+ type_list = tag_tools.get_consts_value('type_list')
+ type_list = type_list.split(',')
+ if not file_ext in type_list :
+ file_in=file_in+'.wav'
+
+ # Normalize file if needed
+ normalize_value = tag_tools.get_opt_value('normalize')
+ if normalize_value:
+ print 'Normalizing...'
+ audio_tools.normalize(dir_in+file_in)
+
+ # Marking
+ audio_marking_value = tag_tools.get_opt_value('audio_marking')
+ auto_audio_marking = tag_tools.get_opt_value('auto_audio_marking')
+ audio_marking_file = tag_tools.get_opt_value('audio_marking_file')
+ audio_marking_timeline = tag_tools.get_opt_value('audio_marking_timeline')
+ audio_marking_timeline = string.replace(audio_marking_timeline,' ','').split(',')
+ if audio_marking_value and new_track:
+ if auto_audio_marking:
+ print 'Creating track audio mark...'
+ audio_marking.make_auto_mark(dir_in,file_in)
+ audio_marking_file = dir_in+file_in+'_mark.wav'
+ print 'Marking '+file_in+' with '+audio_marking_file+'...'
+ audio_marking.mark_audio(dir_in,file_in,audio_marking_file,audio_marking_timeline)
+ file_in = 'marked_'+file_in
+
+ # Encoding loop
+ for enc_type in enc_types:
+ dir_out = collection_dir+os.sep+enc_type+os.sep
+ if not os.path.exists(dir_out):
+ os.mkdir(dir_out)
+ album = tag_tools.get_tag_value('ALBUM')
+ dir_out = collection_dir+os.sep+enc_type+os.sep+album+os.sep
+ if not os.path.exists(dir_out):
+ os.mkdir(dir_out)
+ file_out = file_name_woext+'.'+enc_type
+
+ if not os.path.exists(dir_out+file_out) or mode_force :
+ print 'Converting '+dir_in+file_name+' to '+enc_type+'...'
+ # Encoding
+ print 'Encoding file...'
+ audio_tools.encode(enc_type,dir_in,file_in,dir_out,file_out)
+ print 'Writing tags to encoded file...'
+ tag_tools.write_tags(enc_type,dir_out,file_out)
+
+ else :
+ print dir_out+file_out+' already exists !'
+ if mode_tags :
+ print 'But writing tags to encoded file...'
+ tag_tools.write_tags(enc_type,dir_out,file_out)
+
+ # Remove tmp files
+ file_list = os.listdir(src_dir)
+ for file in file_list:
+ if 'marked_' in file or '.ewf' in file or '_mark.wav' in file or file_ext+'.wav' in file:
+ os.system('rm "'+dir_in+file+'"')
+
+ else :
+ print file+" is not an audio file !"
# Sync to the remote server
if mode_rsync :
- net_backup_host = tag_tools.get_consts_value('net_backup_host')
- net_backup_dir = tag_tools.get_consts_value('net_backup_dir')
- print '+------------------------------------------------------------------------------------'
- print '| Synchronizing with '+net_backup_host
- print '+------------------------------------------------------------------------------------'
- os.system('rsync -avzLp --delete --rsh="ssh -l '+os.environ["USER"]+'" '+collection_dir+' '+os.environ["USER"]+'@'+net_backup_host+':'+net_backup_dir)
- print "Collection Synchronized !"
+ net_backup_host = tag_tools.get_consts_value('net_backup_host')
+ net_backup_dir = tag_tools.get_consts_value('net_backup_dir')
+ print '+------------------------------------------------------------------------------------'
+ print '| Synchronizing with '+net_backup_host
+ print '+------------------------------------------------------------------------------------'
+ os.system('rsync -avzLp --delete --rsh="ssh -l '+os.environ["USER"]+'" '+collection_dir+' '+os.environ["USER"]+'@'+net_backup_host+':'+net_backup_dir)
+ print "Collection Synchronized !"
# End
# are also available at http://svn.parisson.org/telemeta/TelemetaLicense.
#
# Author: Olivier Guilyardi <olivier@samalyse.com>
-# Guillaume Pellerin <pellerin@parisson.com>
+# Guillaume Pellerin <pellerin@parisson.com>
from telemeta.core import *
resource
source is the audio/video source file absolute path. For audio that
- should be a WAV file
+ should be a WAV file
metadata is a dictionary
should be considered temporary/volatile by the caller.
It is highly recommended that export drivers implement some sort of
- cache instead of re-encoding each time process() is called.
+ cache instead of re-encoding each time process() is called.
It should be possible to make subsequent calls to process() with
- different items, using the same driver instance.
+ different items, using the same driver instance.
"""
import xml.dom.ext
class ExporterCore(Component):
- """Defines the main parts of the exporting tools :
- paths, formats, metadata..."""
-
- def __init__(self):
- self.source = ''
- self.collection = ''
- self.verbose = ''
- self.dest = ''
- self.metadata = []
- self.cache_dir = 'cache'
-
- def set_cache_dir(self,path):
- self.cache_dir = path
-
- def normalize(self):
- """ Normalize the source and return its path """
- args = ''
- if self.verbose == '0':
- args = '-q'
- try:
- os.system('normalize-audio '+args+' "'+self.source+'"')
- return self.source
- except IOError:
- return 'Exporter error: Cannot normalize, path does not exist.'
-
- def check_md5_key(self):
- """ Check if the md5 key is OK and return a boolean """
- try:
- md5_log = os.popen4('md5sum -c "'+self.dest+ \
- '" "'+self.dest+'.md5"')
- return 'OK' in md5_log.split(':')
- except IOError:
- return 'Exporter error: Cannot check the md5 key...'
-
- def get_file_info(self):
- """ Return the list of informations of the dest """
- return self.export.get_file_info()
-
- def get_wav_length_sec(self) :
- """ Return the length of the audio source file in seconds """
- try:
- file1, file2 = os.popen4('wavinfo "'+self.source+ \
- '" | grep wavDataSize')
- for line in file2.readlines():
- line_split = line.split(':')
- value = int(int(line_split[1])/(4*44100))
- return value
- except IOError:
- return 'Exporter error: Cannot get the wav length...'
-
- def compare_md5_key(self):
- """ Compare 2 files wih md5 method """
- in1, in2 = os.popen4('md5sum -b "'+self.source+'"')
- out1, out2 = os.popen4('md5sum -b "'+self.dest+'"')
- for line in in2.readlines():
- line1 = line.split('*')[0]
- for line in out2.readlines():
- line2 = line.split('*')[0]
- return line1 == line2
-
- def write_metadata_xml(self,path):
- doc = xml.dom.minidom.Document()
- root = doc.createElement('telemeta')
- doc.appendChild(root)
- for tag in self.metadata.keys() :
- value = self.metadata[tag]
- node = doc.createElement(tag)
- node.setAttribute('value', str(value))
- #node.setAttribute('type', get_type(value))
- root.appendChild(node)
- xml_file = open(path, "w")
- xml.dom.ext.PrettyPrint(doc, xml_file)
- xml_file.close()
-
- def pre_process(self, item_id, source, metadata, ext,
- cache_dir, options=None):
- """ Pre processing of the core. Prepare the export path and
- return it"""
- self.item_id = str(item_id)
- self.source = source
- file_name = get_file_name(self.source)
- file_name_wo_ext, file_ext = split_file_name(file_name)
- self.cache_dir = cache_dir
-
- self.metadata = metadata
- #self.collection = self.metadata['Collection']
- #self.artist = self.metadata['Artist']
- #self.title = self.metadata['Title']
-
- # Decode the source if needed
- if os.path.exists(self.source) and not iswav16(self.source):
- # TO FIX !
- self.source = self.export.decode()
-
- # Normalize if demanded
- if 'normalize' in self.metadata and self.metadata['normalize']:
- self.normalize()
-
- # Define the cache directory
- self.ext = self.get_file_extension()
-
- # Define and create the destination path
- # At the moment, the target directory is built with this scheme in
- # the cache directory : ./%Format/%Collection/%Artist/
- self.dest = self.cache_dir
-
- #export_dir = os.path.join(self.ext,self.collection,self.artist)
- export_dir = self.ext
- if not os.path.exists(os.path.join(self.dest,export_dir)):
- for _dir in export_dir.split(os.sep):
- self.dest = os.path.join(self.dest,_dir)
- if not os.path.exists(self.dest):
- os.mkdir(self.dest)
- else:
- self.dest = os.path.join(self.dest,export_dir)
-
- # Set the target file
- #target_file = file_name_wo_ext+'.'+self.ext
- target_file = self.item_id+'.'+self.ext
- self.dest = os.path.join(self.dest,target_file)
- return self.dest
-
-
- def post_process(self, item_id, source, metadata, ext,
- cache_dir, options=None):
- """ Post processing of the Core. Print infos, etc..."""
- if not options is None:
- if 'verbose' in self.options and self.options['verbose'] != '0':
- print self.dest
- print self.get_file_info()
+ """Defines the main parts of the exporting tools :
+ paths, formats, metadata..."""
+
+ def __init__(self):
+ self.source = ''
+ self.collection = ''
+ self.verbose = ''
+ self.dest = ''
+ self.metadata = []
+ self.cache_dir = 'cache'
+
+ def set_cache_dir(self,path):
+ self.cache_dir = path
+
+ def normalize(self):
+ """ Normalize the source and return its path """
+ args = ''
+ if self.verbose == '0':
+ args = '-q'
+ try:
+ os.system('normalize-audio '+args+' "'+self.source+'"')
+ return self.source
+ except IOError:
+ return 'Exporter error: Cannot normalize, path does not exist.'
+
+ def check_md5_key(self):
+ """ Check if the md5 key is OK and return a boolean """
+ try:
+ md5_log = os.popen4('md5sum -c "'+self.dest+ \
+ '" "'+self.dest+'.md5"')
+ return 'OK' in md5_log.split(':')
+ except IOError:
+ return 'Exporter error: Cannot check the md5 key...'
+
+ def get_file_info(self):
+ """ Return the list of informations of the dest """
+ return self.export.get_file_info()
+
+ def get_wav_length_sec(self) :
+ """ Return the length of the audio source file in seconds """
+ try:
+ file1, file2 = os.popen4('wavinfo "'+self.source+ \
+ '" | grep wavDataSize')
+ for line in file2.readlines():
+ line_split = line.split(':')
+ value = int(int(line_split[1])/(4*44100))
+ return value
+ except IOError:
+ return 'Exporter error: Cannot get the wav length...'
+
+ def compare_md5_key(self):
+ """ Compare 2 files wih md5 method """
+ in1, in2 = os.popen4('md5sum -b "'+self.source+'"')
+ out1, out2 = os.popen4('md5sum -b "'+self.dest+'"')
+ for line in in2.readlines():
+ line1 = line.split('*')[0]
+ for line in out2.readlines():
+ line2 = line.split('*')[0]
+ return line1 == line2
+
+ def write_metadata_xml(self,path):
+ doc = xml.dom.minidom.Document()
+ root = doc.createElement('telemeta')
+ doc.appendChild(root)
+ for tag in self.metadata.keys() :
+ value = self.metadata[tag]
+ node = doc.createElement(tag)
+ node.setAttribute('value', str(value))
+ #node.setAttribute('type', get_type(value))
+ root.appendChild(node)
+ xml_file = open(path, "w")
+ xml.dom.ext.PrettyPrint(doc, xml_file)
+ xml_file.close()
+
+ def pre_process(self, item_id, source, metadata, ext,
+ cache_dir, options=None):
+ """ Pre processing of the core. Prepare the export path and
+ return it"""
+ self.item_id = str(item_id)
+ self.source = source
+ file_name = get_file_name(self.source)
+ file_name_wo_ext, file_ext = split_file_name(file_name)
+ self.cache_dir = cache_dir
+
+ self.metadata = metadata
+ #self.collection = self.metadata['Collection']
+ #self.artist = self.metadata['Artist']
+ #self.title = self.metadata['Title']
+
+ # Decode the source if needed
+ if os.path.exists(self.source) and not iswav16(self.source):
+ # TO FIX !
+ self.source = self.export.decode()
+
+ # Normalize if demanded
+ if 'normalize' in self.metadata and self.metadata['normalize']:
+ self.normalize()
+
+ # Define the cache directory
+ self.ext = self.get_file_extension()
+
+ # Define and create the destination path
+ # At the moment, the target directory is built with this scheme in
+ # the cache directory : ./%Format/%Collection/%Artist/
+ self.dest = self.cache_dir
+
+ #export_dir = os.path.join(self.ext,self.collection,self.artist)
+ export_dir = self.ext
+ if not os.path.exists(os.path.join(self.dest,export_dir)):
+ for _dir in export_dir.split(os.sep):
+ self.dest = os.path.join(self.dest,_dir)
+ if not os.path.exists(self.dest):
+ os.mkdir(self.dest)
+ else:
+ self.dest = os.path.join(self.dest,export_dir)
+
+ # Set the target file
+ #target_file = file_name_wo_ext+'.'+self.ext
+ target_file = self.item_id+'.'+self.ext
+ self.dest = os.path.join(self.dest,target_file)
+ return self.dest
+
+
+ def post_process(self, item_id, source, metadata, ext,
+ cache_dir, options=None):
+ """ Post processing of the Core. Print infos, etc..."""
+ if not options is None:
+ if 'verbose' in self.options and self.options['verbose'] != '0':
+ print self.dest
+ print self.get_file_info()
# External functions
def get_type(value):
- """ Return a String with the type of value """
- types = {bool : 'bool', int : 'int', str : 'str'}
- # 'bool' type must be placed *before* 'int' type, otherwise booleans are
- # detected as integers
- for type in types.keys():
- if isinstance(value, type) :
- return types[type]
- raise TypeError, str(value) + ' has an unsupported type'
+ """ Return a String with the type of value """
+ types = {bool : 'bool', int : 'int', str : 'str'}
+ # 'bool' type must be placed *before* 'int' type, otherwise booleans are
+ # detected as integers
+ for type in types.keys():
+ if isinstance(value, type) :
+ return types[type]
+ raise TypeError, str(value) + ' has an unsupported type'
def get_cast(value, type) :
- """ Return value, casted into type """
- if type == 'bool' :
- if value == 'True' :
- return True
- return False
- elif type == 'int' :
- return int(value)
- elif type == 'str' :
- return str(value)
- raise TypeError, type + ' is an unsupported type'
+ """ Return value, casted into type """
+ if type == 'bool' :
+ if value == 'True' :
+ return True
+ return False
+ elif type == 'int' :
+ return int(value)
+ elif type == 'str' :
+ return str(value)
+ raise TypeError, type + ' is an unsupported type'
def get_file_mime_type(path):
- """ Return the mime type of a file """
- try:
- file_out1, file_out2 = os.popen4('file -i "'+path+'"')
- for line in file_out2.readlines():
- line_split = line.split(': ')
- mime = line_split[len(line_split)-1]
- return mime[:len(mime)-1]
- except IOError:
- return 'Exporter error [1]: path does not exist.'
+ """ Return the mime type of a file """
+ try:
+ file_out1, file_out2 = os.popen4('file -i "'+path+'"')
+ for line in file_out2.readlines():
+ line_split = line.split(': ')
+ mime = line_split[len(line_split)-1]
+ return mime[:len(mime)-1]
+ except IOError:
+ return 'Exporter error [1]: path does not exist.'
def get_file_type_desc(path):
- """ Return the type of a file given by the 'file' command """
- try:
- file_out1, file_out2 = os.popen4('file "'+path+'"')
- for line in file_out2.readlines():
- description = line.split(': ')
- description = description[1].split(', ')
- return description
- except IOError:
- return 'Exporter error [1]: path does not exist.'
+ """ Return the type of a file given by the 'file' command """
+ try:
+ file_out1, file_out2 = os.popen4('file "'+path+'"')
+ for line in file_out2.readlines():
+ description = line.split(': ')
+ description = description[1].split(', ')
+ return description
+ except IOError:
+ return 'Exporter error [1]: path does not exist.'
def iswav(path):
- """ Tell if path is a WAV """
- try:
- mime = get_file_mime_type(path)
- return mime == 'audio/x-wav'
- except IOError:
- return 'Exporter error [1]: path does not exist.'
+ """ Tell if path is a WAV """
+ try:
+ mime = get_file_mime_type(path)
+ return mime == 'audio/x-wav'
+ except IOError:
+ return 'Exporter error [1]: path does not exist.'
def iswav16(path):
- """ Tell if path is a 16 bit WAV """
- try:
- file_type_desc = get_file_type_desc(path)
- return iswav(path) and '16 bit' in file_type_desc
- except IOError:
- return 'Exporter error [1]: path does not exist.'
+ """ Tell if path is a 16 bit WAV """
+ try:
+ file_type_desc = get_file_type_desc(path)
+ return iswav(path) and '16 bit' in file_type_desc
+ except IOError:
+ return 'Exporter error [1]: path does not exist.'
def get_file_name(path):
- """ Return the file name targeted in the path """
- return os.path.split(path)[1]
+ """ Return the file name targeted in the path """
+ return os.path.split(path)[1]
def split_file_name(file):
- """ Return main file name and its extension """
- try:
- return os.path.splitext(file)
- except IOError:
- return 'Exporter error [1]: path does not exist.'
+ """ Return main file name and its extension """
+ try:
+ return os.path.splitext(file)
+ except IOError:
+ return 'Exporter error [1]: path does not exist.'
def clean_word(word) :
- """ Return the word without excessive blank spaces and underscores """
- word = re.sub("^[^\w]+","",word) #trim the beginning
- word = re.sub("[^\w]+$","",word) #trim the end
- #word = string.replace(word,' ','_')
- word = re.sub("_+","_",word) #squeeze continuous _ to one _
- word = re.sub("^[^\w]+","",word) #trim the beginning _
- #word = string.capitalize(word)
- return word
+ """ Return the word without excessive blank spaces and underscores """
+ word = re.sub("^[^\w]+","",word) #trim the beginning
+ word = re.sub("[^\w]+$","",word) #trim the end
+ #word = string.replace(word,' ','_')
+ word = re.sub("_+","_",word) #squeeze continuous _ to one _
+ word = re.sub("^[^\w]+","",word) #trim the beginning _
+ #word = string.capitalize(word)
+ return word
def recover_par_key(path):
- """ Recover a file with par2 key """
- os.system('par2 r "'+path+'"')
+ """ Recover a file with par2 key """
+ os.system('par2 r "'+path+'"')
def verify_par_key(path):
- """ Verify a par2 key """
- os.system('par2 v "'+path+'.par2"')
+ """ Verify a par2 key """
+ os.system('par2 v "'+path+'.par2"')
def get_consts_value(self, data):
- value = self.collection.__dict__[data]
- value_type = getType(value)
- return value, value_type
+ value = self.collection.__dict__[data]
+ value_type = getType(value)
+ return value, value_type
from mutagen.flac import FLAC
class FlacExporter(ExporterCore):
- """Defines methods to export to OGG Vorbis"""
+ """Defines methods to export to OGG Vorbis"""
- implements(IExporter)
-
- def __init__(self):
- self.item_id = ''
- self.source = ''
- self.metadata = {}
- self.options = {}
- self.description = ''
- self.dest = ''
- self.quality_default = '5'
- self.info = []
-
- def get_format(self):
- return 'FLAC'
-
- def get_file_extension(self):
- return 'flac'
+ implements(IExporter)
+
+ def __init__(self):
+ self.item_id = ''
+ self.source = ''
+ self.metadata = {}
+ self.options = {}
+ self.description = ''
+ self.dest = ''
+ self.quality_default = '5'
+ self.info = []
+
+ def get_format(self):
+ return 'FLAC'
+
+ def get_file_extension(self):
+ return 'flac'
- def get_mime_type(self):
- return 'application/flac'
+ def get_mime_type(self):
+ return 'application/flac'
- def get_description(self):
- return 'FIXME'
+ def get_description(self):
+ return 'FIXME'
- def get_file_info(self):
- try:
- file1, file2 = os.popen4('metaflac --list "'+self.dest+'"')
- info = []
- for line in file2.readlines():
- info.append(clean_word(line[:-1]))
- self.info = info
- return self.info
- except IOError:
- return 'Exporter error [1]: file does not exist.'
+ def get_file_info(self):
+ try:
+ file1, file2 = os.popen4('metaflac --list "'+self.dest+'"')
+ info = []
+ for line in file2.readlines():
+ info.append(clean_word(line[:-1]))
+ self.info = info
+ return self.info
+ except IOError:
+ return 'Exporter error [1]: file does not exist.'
- def set_cache_dir(self,path):
- """Set the directory where cached files should be stored. Does nothing
+ def set_cache_dir(self,path):
+ """Set the directory where cached files should be stored. Does nothing
if the exporter doesn't support caching.
The driver shouldn't assume that this method will always get called. A
temporary directory should be used if that's not the case.
"""
- self.cache_dir = path
+ self.cache_dir = path
- def decode(self):
- try:
- file_name, ext = get_file_name(self.source)
- dest = self.cache_dir+os.sep+file_name+'.wav'
- os.system('flac -d -o "'+dest+'" "'+self.source+'"')
- self.source = dest
- return dest
- except IOError:
- return 'ExporterError [2]: decoder not compatible.'
+ def decode(self):
+ try:
+ file_name, ext = get_file_name(self.source)
+ dest = self.cache_dir+os.sep+file_name+'.wav'
+ os.system('flac -d -o "'+dest+'" "'+self.source+'"')
+ self.source = dest
+ return dest
+ except IOError:
+ return 'ExporterError [2]: decoder not compatible.'
- def write_tags(self):
- media = FLAC(self.dest)
- for tag in self.metadata.keys():
- if tag == 'COMMENT':
- media['DESCRIPTION'] = str(self.metadata[tag])
- else:
- media[tag] = str(self.metadata[tag])
- media.save()
-
- def process(self, item_id, source, metadata, options=None):
- self.item_id = item_id
- self.source = source
- self.metadata = metadata
- self.options = {}
- args = ''
-
- if not options is None:
- self.options = options
- if 'verbose' in self.options and self.options['verbose'] != '0':
- args = args
- else:
- args = args + ' -s '
-
- if 'flac_quality' in self.options:
- args = args+' -f -V -'+self.options['flac_quality']
- else:
- args = args+' -f -V -'+self.quality_default
- else:
- args = args+' -s -f -V -'+self.quality_default
-
- try:
- # Pre-proccessing (core)
- self.ext = self.get_file_extension()
- self.dest = self.pre_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- # Encoding
- os.system('flac '+args+' -o "'+self.dest+'" "'+ \
- self.source+'" > /dev/null')
+ def write_tags(self):
+ media = FLAC(self.dest)
+ for tag in self.metadata.keys():
+ if tag == 'COMMENT':
+ media['DESCRIPTION'] = str(self.metadata[tag])
+ else:
+ media[tag] = str(self.metadata[tag])
+ media.save()
+
+ def process(self, item_id, source, metadata, options=None):
+ self.item_id = item_id
+ self.source = source
+ self.metadata = metadata
+ self.options = {}
+ args = ''
+
+ if not options is None:
+ self.options = options
+ if 'verbose' in self.options and self.options['verbose'] != '0':
+ args = args
+ else:
+ args = args + ' -s '
+
+ if 'flac_quality' in self.options:
+ args = args+' -f -V -'+self.options['flac_quality']
+ else:
+ args = args+' -f -V -'+self.quality_default
+ else:
+ args = args+' -s -f -V -'+self.quality_default
+
+ try:
+ # Pre-proccessing (core)
+ self.ext = self.get_file_extension()
+ self.dest = self.pre_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ # Encoding
+ os.system('flac '+args+' -o "'+self.dest+'" "'+ \
+ self.source+'" > /dev/null')
- # Pre-proccessing (self)
- self.write_tags()
- self.post_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
+ # Pre-proccessing (self)
+ self.write_tags()
+ self.post_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
- # Output
- return self.dest
+ # Output
+ return self.dest
- except IOError:
- return 'ExporterError [3]: source file does not exist.'
+ except IOError:
+ return 'ExporterError [3]: source file does not exist.'
class Mp3Exporter(ExporterCore):
- """Defines methods to export to MP3"""
+ """Defines methods to export to MP3"""
- implements(IExporter)
-
- def __init__(self):
- self.item_id = ''
- self.metadata = {}
- self.description = ''
- self.info = []
- self.source = ''
- self.dest = ''
- self.options = {}
- self.bitrate_default = '192'
- self.dub2id3_dict = {'title': 'TIT2', #title2
- 'creator': 'TCOM', #composer
- 'creator': 'TPE1', #lead
- 'identifier': 'UFID', #Unique ID...
- 'identifier': 'TALB', #album
- #'date': 'TYER', #year
- 'type': 'TCON', #genre
- 'publisher': 'TPUB', #comment
- }
+ implements(IExporter)
+
+ def __init__(self):
+ self.item_id = ''
+ self.metadata = {}
+ self.description = ''
+ self.info = []
+ self.source = ''
+ self.dest = ''
+ self.options = {}
+ self.bitrate_default = '192'
+ self.dub2id3_dict = {'title': 'TIT2', #title2
+ 'creator': 'TCOM', #composer
+ 'creator': 'TPE1', #lead
+ 'identifier': 'UFID', #Unique ID...
+ 'identifier': 'TALB', #album
+ #'date': 'TYER', #year
+ 'type': 'TCON', #genre
+ 'publisher': 'TPUB', #comment
+ }
- def get_format(self):
- return 'MP3'
-
- def get_file_extension(self):
- return 'mp3'
+ def get_format(self):
+ return 'MP3'
+
+ def get_file_extension(self):
+ return 'mp3'
- def get_mime_type(self):
- return 'audio/mpeg'
+ def get_mime_type(self):
+ return 'audio/mpeg'
- def get_description(self):
- return "FIXME"
+ def get_description(self):
+ return "FIXME"
- def get_file_info(self):
- try:
- file_out1, file_out2 = os.popen4('mp3info "'+self.dest+'"')
- info = []
- for line in file_out2.readlines():
- info.append(clean_word(line[:-1]))
- self.info = info
- return self.info
- except IOError:
- return 'Exporter error [1]: file does not exist.'
+ def get_file_info(self):
+ try:
+ file_out1, file_out2 = os.popen4('mp3info "'+self.dest+'"')
+ info = []
+ for line in file_out2.readlines():
+ info.append(clean_word(line[:-1]))
+ self.info = info
+ return self.info
+ except IOError:
+ return 'Exporter error [1]: file does not exist.'
- def decode(self):
- try:
- os.system('sox "'+self.source+'" -w -r 44100 -t wav "' \
- +self.cache_dir+os.sep+self.item_id+'"')
- return self.cache_dir+os.sep+self.item_id+'.wav'
- except IOError:
- return 'ExporterError [2]: decoder not compatible.'
+ def decode(self):
+ try:
+ os.system('sox "'+self.source+'" -w -r 44100 -t wav "' \
+ +self.cache_dir+os.sep+self.item_id+'"')
+ return self.cache_dir+os.sep+self.item_id+'.wav'
+ except IOError:
+ return 'ExporterError [2]: decoder not compatible.'
- def write_tags(self):
- """Write all ID3v2.4 tags by mapping dub2id3_dict dictionnary with the
- respect of mutagen classes and methods"""
- from mutagen import id3
-
- id3 = id3.ID3(self.dest)
- for tag in self.metadata.keys():
- if tag in self.dub2id3_dict.keys():
- frame_text = self.dub2id3_dict[tag]
- value = self.metadata[tag]
- #print frame_text+': '+value
- frame = mutagen.id3.Frames[frame_text](3,value)
- id3.add(frame)
- id3.save()
-
- def process(self, item_id, source, metadata, options=None):
- self.item_id = item_id
- self.source = source
- self.metadata = metadata
- self.options = {}
- args = ''
-
- if not options is None:
- self.options = options
-
- if 'verbose' in self.options and self.options['verbose'] != '0':
- args = args
- else:
- args= args + '-S '
-
- if 'mp3_bitrate' in self.options:
- args = args+'-b '+self.options['mp3_bitrate']
- else:
- args = args+'-b '+self.bitrate_default
-
- #Copyrights, etc..
- args = args + ' -c -o '
- else:
- args = args + ' -S -c -o '
-
- if os.path.exists(self.source) and not iswav16(self.source):
- self.source = self.decode()
-
- try:
- # Pre-proccessing (core)
- self.ext = self.get_file_extension()
- self.dest = self.pre_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- # Encoding
- os.system('lame '+args+' --tc "default" "'+self.source+
- '" "'+self.dest+'"')
-
- # Pre-proccessing (self)
- self.write_tags()
- self.post_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- # Output
- return self.dest
+ def write_tags(self):
+ """Write all ID3v2.4 tags by mapping dub2id3_dict dictionnary with the
+ respect of mutagen classes and methods"""
+ from mutagen import id3
+
+ id3 = id3.ID3(self.dest)
+ for tag in self.metadata.keys():
+ if tag in self.dub2id3_dict.keys():
+ frame_text = self.dub2id3_dict[tag]
+ value = self.metadata[tag]
+ #print frame_text+': '+value
+ frame = mutagen.id3.Frames[frame_text](3,value)
+ id3.add(frame)
+ id3.save()
+
+ def process(self, item_id, source, metadata, options=None):
+ self.item_id = item_id
+ self.source = source
+ self.metadata = metadata
+ self.options = {}
+ args = ''
+
+ if not options is None:
+ self.options = options
+
+ if 'verbose' in self.options and self.options['verbose'] != '0':
+ args = args
+ else:
+ args= args + '-S '
+
+ if 'mp3_bitrate' in self.options:
+ args = args+'-b '+self.options['mp3_bitrate']
+ else:
+ args = args+'-b '+self.bitrate_default
+
+ #Copyrights, etc..
+ args = args + ' -c -o '
+ else:
+ args = args + ' -S -c -o '
+
+ if os.path.exists(self.source) and not iswav16(self.source):
+ self.source = self.decode()
+
+ try:
+ # Pre-proccessing (core)
+ self.ext = self.get_file_extension()
+ self.dest = self.pre_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ # Encoding
+ os.system('lame '+args+' --tc "default" "'+self.source+
+ '" "'+self.dest+'"')
+
+ # Pre-proccessing (self)
+ self.write_tags()
+ self.post_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ # Output
+ return self.dest
- except IOError:
- return 'ExporterError [3]: source file does not exist.'
+ except IOError:
+ return 'ExporterError [3]: source file does not exist.'
from mutagen.oggvorbis import OggVorbis
class OggExporter(ExporterCore):
- """Defines methods to export to OGG Vorbis"""
+ """Defines methods to export to OGG Vorbis"""
- implements(IExporter)
-
- def __init__(self):
- self.item_id = ''
- self.metadata = {}
- self.description = ''
- self.info = []
- self.source = ''
- self.dest = ''
- self.options = {}
- self.bitrate_default = '192'
+ implements(IExporter)
+
+ def __init__(self):
+ self.item_id = ''
+ self.metadata = {}
+ self.description = ''
+ self.info = []
+ self.source = ''
+ self.dest = ''
+ self.options = {}
+ self.bitrate_default = '192'
- def get_format(self):
- return 'OGG'
-
- def get_file_extension(self):
- return 'ogg'
+ def get_format(self):
+ return 'OGG'
+
+ def get_file_extension(self):
+ return 'ogg'
- def get_mime_type(self):
- return 'application/ogg'
+ def get_mime_type(self):
+ return 'application/ogg'
- def get_description(self):
- return 'FIXME'
+ def get_description(self):
+ return 'FIXME'
- def get_file_info(self):
- try:
- file_out1, file_out2 = os.popen4('ogginfo "'+self.dest+'"')
- info = []
- for line in file_out2.readlines():
- info.append(clean_word(line[:-1]))
- self.info = info
- return self.info
- except IOError:
- return 'Exporter error [1]: file does not exist.'
+ def get_file_info(self):
+ try:
+ file_out1, file_out2 = os.popen4('ogginfo "'+self.dest+'"')
+ info = []
+ for line in file_out2.readlines():
+ info.append(clean_word(line[:-1]))
+ self.info = info
+ return self.info
+ except IOError:
+ return 'Exporter error [1]: file does not exist.'
- #def set_cache_dir(self,path):
- # self.cache_dir = path
+ #def set_cache_dir(self,path):
+ # self.cache_dir = path
- def decode(self):
- try:
- os.system('oggdec -o "'+self.cache_dir+os.sep+self.item_id+
- '.wav" "'+self.source+'"')
- return self.cache_dir+os.sep+self.item_id+'.wav'
- except IOError:
- return 'ExporterError [2]: decoder not compatible.'
+ def decode(self):
+ try:
+ os.system('oggdec -o "'+self.cache_dir+os.sep+self.item_id+
+ '.wav" "'+self.source+'"')
+ return self.cache_dir+os.sep+self.item_id+'.wav'
+ except IOError:
+ return 'ExporterError [2]: decoder not compatible.'
- def write_tags(self):
- media = OggVorbis(self.dest)
- for tag in self.metadata.keys():
- media[tag] = str(self.metadata[tag])
- media.save()
-
- def process(self, item_id, source, metadata, options=None):
- self.item_id = item_id
- self.source = source
- self.metadata = metadata
- self.options = {}
- args = ''
-
- if not options is None:
- self.options = options
-
- if 'verbose' in self.options and self.options['verbose'] != '0':
- args = args
- else:
- args = args + ' -Q '
-
- if 'ogg_bitrate' in self.options:
- args = args + '-b '+self.options['ogg_bitrate']
- elif 'ogg_quality' in self.options:
- args = args + '-q '+self.options['ogg_quality']
- else:
- args = args + '-b '+self.bitrate_default
+ def write_tags(self):
+ media = OggVorbis(self.dest)
+ for tag in self.metadata.keys():
+ media[tag] = str(self.metadata[tag])
+ media.save()
+
+ def process(self, item_id, source, metadata, options=None):
+ self.item_id = item_id
+ self.source = source
+ self.metadata = metadata
+ self.options = {}
+ args = ''
+
+ if not options is None:
+ self.options = options
+
+ if 'verbose' in self.options and self.options['verbose'] != '0':
+ args = args
+ else:
+ args = args + ' -Q '
+
+ if 'ogg_bitrate' in self.options:
+ args = args + '-b '+self.options['ogg_bitrate']
+ elif 'ogg_quality' in self.options:
+ args = args + '-q '+self.options['ogg_quality']
+ else:
+ args = args + '-b '+self.bitrate_default
- else:
- args = ' -Q -b '+self.bitrate_default
-
- if os.path.exists(self.source) and not iswav16(self.source):
- self.source = self.decode()
-
- try:
- # Pre-proccessing (core)
- self.ext = self.get_file_extension()
- self.dest = self.pre_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- # Encoding
- os.system('oggenc '+args+' -o "'+self.dest+
- '" "'+self.source+'"')
-
- # Pre-proccessing (self)
- self.write_tags()
- self.post_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- # Output
- return self.dest
+ else:
+ args = ' -Q -b '+self.bitrate_default
+
+ if os.path.exists(self.source) and not iswav16(self.source):
+ self.source = self.decode()
+
+ try:
+ # Pre-proccessing (core)
+ self.ext = self.get_file_extension()
+ self.dest = self.pre_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ # Encoding
+ os.system('oggenc '+args+' -o "'+self.dest+
+ '" "'+self.source+'"')
+
+ # Pre-proccessing (self)
+ self.write_tags()
+ self.post_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ # Output
+ return self.dest
- except IOError:
- return 'ExporterError [3]: source file does not exist.'
+ except IOError:
+ return 'ExporterError [3]: source file does not exist.'
from telemeta.export.api import IExporter
class WavExporter(ExporterCore):
- """Defines methods to export to OGG Vorbis"""
-
- implements(IExporter)
-
- def __init__(self):
- self.item_id = ''
- self.metadata = {}
- self.description = ''
- self.info = []
- self.source = ''
- self.dest = ''
- self.options = {}
-
- def get_format(self):
- return 'WAV'
-
- def get_file_extension(self):
- return 'wav'
-
- def get_mime_type(self):
- return 'audio/x-wav'
-
- def get_description(self):
- return 'FIXME'
-
- def get_file_info(self):
- try:
- file1, file2 = os.popen4('wavinfo "'+self.dest+'"')
- info = []
- for line in file2.readlines():
- info.append(clean_word(line[:-1]))
- self.info = info
- return self.info
- except IOError:
- return 'Exporter error [1]: file does not exist.'
-
- def set_cache_dir(self,path):
- """Set the directory where cached files should be stored. Does nothing
+ """Defines methods to export to OGG Vorbis"""
+
+ implements(IExporter)
+
+ def __init__(self):
+ self.item_id = ''
+ self.metadata = {}
+ self.description = ''
+ self.info = []
+ self.source = ''
+ self.dest = ''
+ self.options = {}
+
+ def get_format(self):
+ return 'WAV'
+
+ def get_file_extension(self):
+ return 'wav'
+
+ def get_mime_type(self):
+ return 'audio/x-wav'
+
+ def get_description(self):
+ return 'FIXME'
+
+ def get_file_info(self):
+ try:
+ file1, file2 = os.popen4('wavinfo "'+self.dest+'"')
+ info = []
+ for line in file2.readlines():
+ info.append(clean_word(line[:-1]))
+ self.info = info
+ return self.info
+ except IOError:
+ return 'Exporter error [1]: file does not exist.'
+
+ def set_cache_dir(self,path):
+ """Set the directory where cached files should be stored. Does nothing
if the exporter doesn't support caching.
The driver shouldn't assume that this method will always get called. A
temporary directory should be used if that's not the case.
"""
- self.cache_dir = path
-
- def decode(self):
- try:
- file_name, ext = get_file_name(self.source)
- dest = self.cache_dir+os.sep+file_name+'.wav'
- os.system('sox "'+self.source+'" -w -r 44100 -t wav -c2 "'+ \
- dest+'.wav"')
- self.source = dest
- return dest
- except IOError:
- return 'ExporterError [2]: decoder not compatible.'
-
- def write_tags(self):
- # Create metadata XML file !
- self.write_metadata_xml(self.dest+'.xml')
-
- def create_md5_key(self):
- """ Create the md5 keys of the dest """
- try:
- os.system('md5sum -b "'+self.dest+'" >"'+self.dest+'.md5"')
- except IOError:
- return 'Exporter error: Cannot create the md5 key...'
-
- def create_par_key(self):
- """ Create the par2 keys of the dest """
- args = 'c -n1 '
- if 'verbose' in self.options and self.options['verbose'] != '0':
- args = args
- else:
- args = args + '-q -q '
-
- try:
- os.system('par2 '+args+' "'+self.dest+'"')
- except IOError:
- return 'Exporter error: Cannot create the par2 key...'
-
- def process(self, item_id, source, metadata, options=None):
- self.item_id = item_id
- self.source = source
- self.metadata = metadata
- self.options = {}
-
- if not options is None:
- self.options = options
- try:
- # Pre-proccessing (core)
- self.ext = self.get_file_extension()
- self.dest = self.pre_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- #if self.compare_md5_key():
- os.system('cp -a "'+self.source+'" "'+ self.dest+'"')
- #print 'COPIED'
-
- # Pre-proccessing (self)
- self.write_tags()
-
- # Create the md5 key
- #if 'md5' in self.metadata and self.metadata['md5']:
- self.create_md5_key()
-
- # Create the par2 key
- #if 'par2' in self.metadata and self.metadata['par2']:
- self.create_par_key()
-
- self.post_process(self.item_id,
- self.source,
- self.metadata,
- self.ext,
- self.cache_dir,
- self.options)
-
- # Output
- return self.dest
-
- except IOError:
- return 'ExporterError [3]: source file does not exist.'
+ self.cache_dir = path
+
+ def decode(self):
+ try:
+ file_name, ext = get_file_name(self.source)
+ dest = self.cache_dir+os.sep+file_name+'.wav'
+ os.system('sox "'+self.source+'" -w -r 44100 -t wav -c2 "'+ \
+ dest+'.wav"')
+ self.source = dest
+ return dest
+ except IOError:
+ return 'ExporterError [2]: decoder not compatible.'
+
+ def write_tags(self):
+ # Create metadata XML file !
+ self.write_metadata_xml(self.dest+'.xml')
+
+ def create_md5_key(self):
+ """ Create the md5 keys of the dest """
+ try:
+ os.system('md5sum -b "'+self.dest+'" >"'+self.dest+'.md5"')
+ except IOError:
+ return 'Exporter error: Cannot create the md5 key...'
+
+ def create_par_key(self):
+ """ Create the par2 keys of the dest """
+ args = 'c -n1 '
+ if 'verbose' in self.options and self.options['verbose'] != '0':
+ args = args
+ else:
+ args = args + '-q -q '
+
+ try:
+ os.system('par2 '+args+' "'+self.dest+'"')
+ except IOError:
+ return 'Exporter error: Cannot create the par2 key...'
+
+ def process(self, item_id, source, metadata, options=None):
+ self.item_id = item_id
+ self.source = source
+ self.metadata = metadata
+ self.options = {}
+
+ if not options is None:
+ self.options = options
+ try:
+ # Pre-proccessing (core)
+ self.ext = self.get_file_extension()
+ self.dest = self.pre_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ #if self.compare_md5_key():
+ os.system('cp -a "'+self.source+'" "'+ self.dest+'"')
+ #print 'COPIED'
+
+ # Pre-proccessing (self)
+ self.write_tags()
+
+ # Create the md5 key
+ #if 'md5' in self.metadata and self.metadata['md5']:
+ self.create_md5_key()
+
+ # Create the par2 key
+ #if 'par2' in self.metadata and self.metadata['par2']:
+ self.create_par_key()
+
+ self.post_process(self.item_id,
+ self.source,
+ self.metadata,
+ self.ext,
+ self.cache_dir,
+ self.options)
+
+ # Output
+ return self.dest
+
+ except IOError:
+ return 'ExporterError [3]: source file does not exist.'
source = 'samples/wav/Cellar - Show Me - 02.wav'
item_id = '1'
metadata = {'identifier': 'Test', #collection
- 'title': 'Show Me',
- 'creator': 'Cellar',
- 'type': 'House',
- 'date': '2004',
- 'publisher': 'PArISs0n',
- }
+ 'title': 'Show Me',
+ 'creator': 'Cellar',
+ 'type': 'House',
+ 'date': '2004',
+ 'publisher': 'PArISs0n',
+ }
options = {'verbose': '0'}
class ExportTest(Component):
- exporters = ExtensionPoint(IExporter)
-
- def run(self):
- for exporter in self.exporters:
- format = exporter.get_format()
- if options['verbose'] != '0':
- print "\n+------------------------------------------"
- print '| Testing exporter format: ' + format
- print "+------------------------------------------"
- exporter.set_cache_dir(cache_dir)
- exporter.process(item_id,source,metadata,options)
- #exporter.process(item_id,source,metadata)
+ exporters = ExtensionPoint(IExporter)
+
+ def run(self):
+ for exporter in self.exporters:
+ format = exporter.get_format()
+ if options['verbose'] != '0':
+ print "\n+------------------------------------------"
+ print '| Testing exporter format: ' + format
+ print "+------------------------------------------"
+ exporter.set_cache_dir(cache_dir)
+ exporter.process(item_id,source,metadata,options)
+ #exporter.process(item_id,source,metadata)
compmgr = ComponentManager()