ID3-Tags und Dateinamen eines Hörbuchs anpassen

Submitted by Erik Wegner on
Body

Beim Umwandeln der CDs eines Hörbuchs kann auf die CDDB (CD Datenbank) zurückgegriffen werden, um den Titel und Interpreten zu befüllen. Allerdings ist die Qualität sehr schwankend und unter Umständen nicht einheitlich über mehrere CDs eines Hörbuchs. Wenn dann noch der MP3-Player die Stücke alphabetisch nach Titel sortiert, dann ist kein kontinuierliches Hören des Buches möglich.

Das folgende Skript hat die Aufgaben, bei jeder Datei den ID3-Tag anzupassen und den Dateinamen zu korrigieren. Dazu kommt die Python-Bibliothek Mutagen zum Einsatz.

Voraussetzung dafür ist, dass jede CD in einem Unterverzeichnis abgelegt ist:

Schwarm01/
-- Intro.mp3
-- Vorbereitung.mp3
-- Norwegen.mp3
Schwarm02/
-- Titel 1.mp3
-- Titel 2.mp3

# -*- coding: utf-8 -*-
 
from mutagen.easyid3 import EasyID3
import os.path
import sys
 
sourcedir = u'C:\\Users\\Erik.Wegner\\Music\\Frank Schätzing'
cdprefix = 'Schwarm'
albumname = "Der Schwarm %02i"
 
files = []
 
def scan_files_in_dir(dir):
    global files
    files_found = os.listdir(dir)
    for afile in files_found:
        fullname = os.path.join(dir, afile)
        if os.path.isfile(fullname) and str(os.path.splitext(afile)[1]).lower() == ".mp3":
            files.append(fullname)
 
def read_id3():
    numfiles = len(files)
    count = 0
    hcount = 0
    hcountstep = 80.0 / float(numfiles)
    for afile in files:
        # Fortschrittsanzeige
        count = count + 1
        if int(count * hcountstep) > hcount:
            hcount = hcount + 1
            sys.stdout.write('.')
        # Fortschrittsanzeige
 
        # Dateizugriff
        audio = EasyID3(afile)
        # Titelnummer
        track = int(audio["tracknumber"][0])
        # CD-Nummer
        disc = int((os.path.split(os.path.split(afile)[0])[1])[-2:])
        # Neuer Titel:
        title = audio["title"][0]
        if len(title) <= 4:
            title = ""
        title = "%02i%02i %s" % (disc, track, title)
        # Neuer Albumname
        album = albumname % disc
        # Setze ID3
        audio["title"] = title
        audio["album"] = album
        audio.save()
        # Neuer Dateiname
        newfilename = "%02i%02i.mp3" % (disc, track)
        newfilename = os.path.join(os.path.split(afile)[0], newfilename)
        os.rename(afile, newfilename)
        
for discnumber in range(1, 11):
    print("Verarbeite CD %i" % discnumber)
    cddir = os.path.join(sourcedir, "%s%02i" % (cdprefix, discnumber))
    scan_files_in_dir(cddir)
    print("%i Dateien gefunden" % len(files))
 
read_id3()

Nach dem Ausführen des Skripts sind die Dateistruktur so aus:

Schwarm01/
-- 0101.mp3
-- 0102.mp3
-- 0103.mp3
Schwarm02/
-- 0201.mp3
-- 0202.mp3