Copyrighted Silence : structuration des données et métadonnées

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>