Ich wärme diesen Thread nochmal auf. In der Zwischenzeit habe ich das ein oder andere Tutorial (quer)gelesen, habe mir ein E-Book über Python-Programmierung gekauft und (zum Teil) durchgearbeitet, habe viel herum probiert und bin oft auf die Nase gefallen, es gab aber auch Heureka-Momente. Vor allem aber bin ich immer wieder zu diesem Thread zurückgekehrt, weil ich am (eigenen) konkreten Beispiel am besten lerne. Dann bin ich das Skript nochmal neu angegangen und habe versucht, deine Hinweise, BlackJack, zu beherzigen. Allerdings habe ich nicht alle Vorschläge übernommen. Zum einen, weil ich nicht nur Copy&Paste machen, sondern zumindest halbwegs verstehen wollte, was ich da tue. Zum anderen, weil sich die Voraussetzungen ein wenig geändert haben.
So ist das Benennungsmuster bei den Ausgangsdateien tatsächlich ein anderes und ich brauche Datum und Zeit in verschiedenen Varianten. Die Trenner bei den Ausgangsdateien sind durchgängig Unterstriche, es gibt keine Bindestriche. Außerdem gibt es eine neue Variable timestamp, die ich für die Sortierung im Web-Frontend nutze, und es erfolgt jetzt nach erfolgreicher Bearbeitung der Ausgangsdatei ein Eintrag in eine Datenbank-Tabelle "aufnahmen", um vom Web-Frontend besser auf die Aufnahmen zurückgreifen zu können. Geknackt habe ich auch das Problem mit mutagen. Ich hatte für das ID3-Tagging ja nur auf id3v2 zurückgegriffen, weil ich bei der Verwendung von mutagen immer vor die Wand gelaufen war. Beim Versuch, ID3-Tags in eine Datei zu schreiben, die noch keine Tags hat, spuckt mutagen immer diesen ID3NoHeaderError aus. Alle Ansätze, das zu umgehen, die ich im Netz gefunden hatte, funktionierten bei mir nicht. Seit gestern weiß ich nun auch, warum: Ich hatte in meiner Entwicklungsumgebung (Raspbian auf einem RaspberryPi) eine veraltete Version von mutagen installiert, nämlich die aus den Paketquellen. Gestern habe ich die aktuelle (1.31) von der Entwickler-Homepage heruntergeladen und installiert und - Tadaaa! - läuft.
Zu erwähnen ist vielleicht noch, dass ich die Login-Daten für die Datenbank in eine eigene Python-Datei ausgelagert habe. Zum einen, weil ich auch von anderen Python-Skripten aus darauf zugreife und so nur EINE Datei ändern muss, wenn sich mal die Login-Daten ändern. Zum anderen, weil ich mit Git arbeite und so beim Pushen die Gefahr nicht so groß ist, versehentlich das richtige Passwort zu veröffentlichen
.gitignore sei Dank.
Perfekt ist das sicher alles noch nicht, aber hoffentlich konnte ich wenigstens die gröbsten Schnitzer ausmerzen - und bekomme die neue Version nicht gleich wieder um die Ohren gehauen
Für Hinweise bin ich dankbar. Sowieso. Ich bin ja immer noch Anfänger und lernbegierig. Sei also bitte nicht allzu streng, BlackJack
Ach so, eins noch: Für das Verkürzen von sehr langen Code-Zeilen habe ich auf Backslashes zurückgegriffen und nicht mit Einrückungen gearbeitet. Lag mir irgendwie eher. Hat das irgendwelche Nachteile?
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf8 -*-
import MySQLdb
import login
from contextlib import closing
from glob import glob
import os
import time
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, TIT2, TPE1, TALB
import datetime
filename_pattern = '/var/www/Aufnahmen/aufnahme_fertig_*.mp3'
def audio_length(filename):
length = str(datetime.timedelta(seconds = int((MP3(filename)).info.length)))
return length
def extract_metadata(filename):
_, _, station_alias, year, month, day, hour, minutes, _ = filename.split('_')
timestamp = int(time.mktime((int(year), int(month), int(day), int(hour), int(minutes), 0, 0, 0, -1)))
return station_alias, year, month, day, hour, minutes, timestamp
def get_station_name(connection, station_alias):
with closing(connection.cursor()) as cursor:
cursor.execute('SELECT name FROM sender WHERE alias=%s', (station_alias,))
row = cursor.fetchone()
if not row:
raise KeyError('Sender nicht in der Datenbank vorhanden')
return row[0]
def id3_tag(path, title, artist, album):
audio = ID3()
audio.save(path)
audio = ID3(path)
audio.add(TIT2(encoding=3, text = u"%s" % title))
audio.add(TPE1(encoding=3, text = u"%s" % artist))
audio.add(TALB(encoding=3, text = u"%s" % album))
audio.save(v2_version=3)
def write_to_db(connection, date, time, station, new_filename, timestamp, length):
with closing(connection.cursor()) as cursor:
cursor.execute('INSERT INTO aufnahmen(datum, uhrzeit, sender, datei, zeitstempel, laenge) \
VALUES (%s,%s,%s,%s,%s,%s)',(date, time, station, new_filename, timestamp, length,))
connection.commit()
def main():
with closing \
(MySQLdb.connect(login.DB_HOST, login.DB_USER, login.DB_PASSWORD, login.DB_DATABASE)) \
as connection:
for path in glob(filename_pattern):
directory = os.path.dirname(path)
filename, extension = os.path.splitext(os.path.basename(path))
length = audio_length(path)
station_alias, year, month, day, hour, minutes, timestamp = extract_metadata(filename)
station = get_station_name(connection, station_alias)
date = '{0}-{1}-{2}'.format(year, month, day)
time = '{0}:{1}'.format(hour, minutes)
title = '{0}, {1}.{2}.{3}, {4} Uhr'.format(station, day, month, year, time)
new_filename = '{0}_{1}-{2}-{3}_{4}-{5}{6}'.format \
(station_alias, year, month, day, hour, minutes, extension)
id3_tag(path, title, station, date)
write_to_db(connection, date, time, station, new_filename, timestamp, length)
os.rename(path, (os.path.join(directory, new_filename)))
if __name__ == '__main__':
main()