le script RIP.py :
# -*- coding: utf-8 -*-
'''
RIP PROCESS
- rip current CD in drive to "CD_xxx" directory
- create current "rip_info.xml" in "CD_XXX" directory
- rip audio into .wav files to "waverip" subdirectory
- update global "rip_process.xml"
'''
import pymedia.removable.cd as cd
import sys, wave, struct, os
import datetime
import lxml.etree as ET
import random
import CS_lib
# --- LOAD "rip_process.xml"
rip_process_path = os.path.normpath(CS_lib.DATAPATH+"/rip_process.xml")
parser = ET.XMLParser(remove_blank_text=True)
tree = ET.parse(rip_process_path, parser)
rip_process = tree.getroot()
cds = rip_process.findall("cd")
newCD_id = len(cds) + 1
# --- get basic info
print("Be sure to insert CD in drive...")
print("and input human readable labels below")
artistLabel = raw_input("Artist : ")
albumLabel = raw_input("Album : ")
now = datetime.datetime.now()
print("this is local time")
print(now)
# --- créer le dossier "CD_xxx" et son sous-dossier "waverip"
os.chdir(CS_lib.DATAPATH)
newCD_relDir = "CD_"+str(newCD_id)
os.mkdir(newCD_relDir)
newCD_dir = os.path.normpath(CS_lib.DATAPATH+"/"+newCD_relDir)
os.chdir(newCD_relDir)
os.mkdir("waverip")
newCD_waverip_dir = os.path.normpath(newCD_dir+"/waverip")
# --- Ouvrir le media, choisir le bon lecteur
cd.init()
driveNo = raw_input("Choose drive no. (on "+str(cd.getCount())+" drive(s) found) : ")
if driveNo == '':
driveNo = str(CS_lib.default_CDDriveNo)
c = cd.CD(int(driveNo))
# --- Récupérer les propriétés dont la Table Of Content (TOC), et le nombre de pistes
cd_props = c.getProperties()
print("opened cd")
newCD_tracksNb = len(cd_props['titles'])
print ("with "+str(newCD_tracksNb)+" track(s)")
currentTrackPos = 0
rip_info = ET.Element('rip_info')
# Itérer parmi les pistes
for tr_no in xrange(len(cd_props['titles'])):
# --- ouvrir piste
tr = c.open(cd_props['titles'][tr_no])
# --- calcul de la durée
tr_len_in_frames = int(cd_props['TOC'][tr_no][1])
tr_len_in_smp = tr_len_in_frames * 588
tr_len_min = (tr_len_in_smp / 44100) / 60
tr_len_sec = (tr_len_in_smp / 44100) % 60
tr_len_ms = int(((tr_len_in_smp / 44100.0) % 1.0) * 1000)
# --- affichage données de piste
print '--- TRACK %s ---' % (tr_no + 1)
print '%s frames = %s samples' % (tr_len_in_frames, tr_len_in_smp)
print '%s\'%s\":%s' % (tr_len_min, tr_len_sec, tr_len_ms)
# --- création du .wav et extraction des données vers fichier
wavefile_path = os.path.normpath(newCD_waverip_dir+"/TR_"+str(tr_no+1)+".wav")
wfile = wave.open(wavefile_path, 'w')
wfile.setparams((2, 2, 44100, 0, 'NONE', 'not compressed'))
wfile.writeframes(tr.read(tr_len_in_smp * 4))
wfile.close()
tr.close()
# --- ajout des données pour rip_info
track_info = ET.SubElement(rip_info, 'track', id=str(tr_no+1))
track_length = ET.SubElement(track_info, 'length_in_smp')
track_length.text = str(tr_len_in_smp)
track_position = ET.SubElement(track_info, 'position_in_smp')
track_position.text = str(currentTrackPos)
currentTrackPos += tr_len_in_smp
# --- fin du rip, éjection du CD
c.eject()
# --- Enregistrer "rip_info.xml"
xmlstring = ET.tostring(rip_info, pretty_print=True)
rip_info_path = os.path.normpath(newCD_dir+"/rip_info.xml")
output = open(rip_info_path, 'w')
output.write(xmlstring)
output.close()
print "rip_info.xml created"
# --- mettre à jour rip_process
newCD = ET.Element("cd", attrib={'id':str(newCD_id)})
artist = ET.SubElement(newCD, 'artist')
artist.text = artistLabel
album = ET.SubElement(newCD, 'album')
album.text = albumLabel
rip_date = ET.SubElement(newCD, 'rip_date')
now = datetime.datetime.now()
rip_date.text = now.strftime("%Y-%m-%d %H:%M:%S")
tracksNb = ET.SubElement(newCD, 'tracksNb')
tracksNb.text = str(newCD_tracksNb)
rip_process.append(newCD)
#xmlstring = CS_lib.prettify(rip_process)
xmlstring = ET.tostring(rip_process, pretty_print=True)
output = open(rip_process_path, 'w')
output.write(xmlstring)
output.close()
print "rip_process.xml updated"
le fichier ./rip_process.xml :
<rip_process>
<cd id="1">
<artist>Margo</artist>
<album>Furtive Furies</album>
<rip_date>2015-09-16 23:53:10</rip_date>
<tracksNb>13</tracksNb>
</cd>
<cd id="2">
<artist>Motorhead</artist>
<album>Dirty Love</album>
<rip_date>2015-09-16 23:59:39</rip_date>
<tracksNb>11</tracksNb>
</cd>
<cd id="3">
<artist>Portishead</artist>
<album>Portishead</album>
<rip_date>2015-09-17 00:06:08</rip_date>
<tracksNb>11</tracksNb>
</cd>
<cd id="4">
<artist>Laurie Anderson</artist>
<album>Bright Red</album>
<rip_date>2015-09-17 00:49:39</rip_date>
<tracksNb>14</tracksNb>
</cd>
<cd id="5">
<artist>MIS (Mexican Institute of Sound)</artist>
<album>Politico</album>
<rip_date>2015-09-17 01:01:02</rip_date>
<tracksNb>13</tracksNb>
</cd>
<cd id="6">
<artist>Robert Wyatt</artist>
<album>Rock Bottom</album>
<rip_date>2015-09-17 01:43:47</rip_date>
<tracksNb>6</tracksNb>
</cd>
<cd id="7">
<artist>KMFDM</artist>
<album>WWIII</album>
<rip_date>2015-09-17 01:51:50</rip_date>
<tracksNb>11</tracksNb>
</cd>
</rip_process>
exemple d’un fichier ./CD_xxx/rip_info.xml :
<rip_info>
<track id="1">
<length_in_smp>7952700</length_in_smp>
<position_in_smp>0</position_in_smp>
</track>
<track id="2">
<length_in_smp>11660628</length_in_smp>
<position_in_smp>7952700</position_in_smp>
</track>
<track id="3">
<length_in_smp>14457156</length_in_smp>
<position_in_smp>19613328</position_in_smp>
</track>
<track id="4">
<length_in_smp>10254132</length_in_smp>
<position_in_smp>34070484</position_in_smp>
</track>
<track id="5">
<length_in_smp>12640236</length_in_smp>
<position_in_smp>44324616</position_in_smp>
</track>
<track id="6">
<length_in_smp>8336076</length_in_smp>
<position_in_smp>56964852</position_in_smp>
</track>
<track id="7">
<length_in_smp>8220828</length_in_smp>
<position_in_smp>65300928</position_in_smp>
</track>
<track id="8">
<length_in_smp>15575532</length_in_smp>
<position_in_smp>73521756</position_in_smp>
</track>
<track id="9">
<length_in_smp>10181808</length_in_smp>
<position_in_smp>89097288</position_in_smp>
</track>
<track id="10">
<length_in_smp>7172424</length_in_smp>
<position_in_smp>99279096</position_in_smp>
</track>
<track id="11">
<length_in_smp>9042852</length_in_smp>
<position_in_smp>106451520</position_in_smp>
</track>
<track id="12">
<length_in_smp>13088880</length_in_smp>
<position_in_smp>115494372</position_in_smp>
</track>
<track id="13">
<length_in_smp>32832156</length_in_smp>
<position_in_smp>128583252</position_in_smp>
</track>
</rip_info>