Как разобрать audio.cdindexPython

Программы на Python
Anonymous
Как разобрать audio.cdindex

Сообщение Anonymous »

На некоторых аудиокомпакт-дисках есть файл audio.cdindex, в котором указаны исполнитель, альбом и список названий. У меня есть инструмент Python для копирования моих компакт-дисков на NAS, и если я не нахожу идентификатор компакт-диска на musicbrainz или cddb, я пытаюсь проанализировать audio.cdindex, чтобы правильно назвать файлы. К счастью, файл имеет формат xml, поэтому
xml.etree.ElementTree
обычно хорошо справляется со своей задачей. Но теперь у меня есть компакт-диск, который ссылается на http://www.musicbrainz.org/dtd/CDInfo.dtd
как dtd, и этот файл исчез. Обычно отсутствующий dtd игнорируется библиотекой Python, но на этом компакт-диске дорожки ссылаются на объект ü, поэтому синтаксический анализ завершается неудачно. Я попытался заменить dtd копией http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent, где определена сущность, но, похоже, это dtd никогда не применяется. Вот файл audio.cdindex, который я использую:



Audiophile Pearls Vol. 40
18



69Zr3Q3U3DVbQpVr2iLBQ.XtFZY-






Do Do Do


I Fell In Love


Isla Feliz (feat. Antoine Boyer)


Dig!


Sulling


Press Play


Washington Heights


Get Down


Not Only Human


Money Matters


Streik


Chestnut Tree


Hydra


Malambe


Serenade in D Major Op. 41 I. Entrata. Allegro. Hustedt Speidel


Concerto No 2 f minor. Allegro vivace. Orchestre de Chambre de Lausanne Zacharias


Sonate für Klavier und Violoncello No. 1 B-Dur, Op. 45 III. Allegro assai. Grigoryan Petersen


String Quartet Op. 59, No. 2 - IV. Finale. Presto. Chiaroscuro Quartett




Я использую следующий код Python:
import xml.etree.ElementTree as ET
import re
import logging

dtype = re.compile(r"")
repl = r''

def clean(xtext):
dt = dtype.search(xtext)
if dt:
return xtext[:dt.start()] + repl + xtext[dt.end():]
else:
return xtext

def readAudioindex(dest):
Tracks = []
try:
with open(dest) as fd:
txt = fd.read()
root = ET.fromstring(clean(txt))
album = Name(root.find('Title').text)
artist = Name(root.find('.//Artist').text)
for track in root.iter('Track'):
tt = track.find('Name').text
tp = tt.find('/')
if tp >= 0:
ta = tt[:tp]
ta = ta.strip()
tt = tt[tp+1:]
tt = tt.strip()
else:
ta = root.find('.//Artist').text
num = int(track.get('Num'))
Tracks.append({'num':num, 'tt':Name(tt), 'ta':Name(ta)})
return (artist, album, Tracks)
except Exception as e:
logging.getLogger().error('Exception reading audioindex "{}"'.format(str(e)))
# shutil.copy(dest, 'faulty_audio.cdindex')
return None

if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("index")
parser.add_argument("-d", "--dry", action='store_true')
args = parser.parse_args()
txt = ""
with open(args.index) as fd:
txt = fd.read()
if args.dry:
print(clean(txt))
else:
cont = readAudioindex(clean(txt))
if cont == None:
print("not valid")
else:
print(f"artist: {cont[0]}, album: {cont[1]}")
for tr in cont[2]:
print(f'track {tr["num"]} \"{tr["tt"]}\"')

Вернуться в «Python»