ID3v2.3 u. ID3v2.4 auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !!

Habe mal versucht ID3v2.3 u. ID3v2.4 auszulesen. Funktioniert bei mir gut, doch ist wohl nicht ganz so allgemeingültig ?

Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8


file_name = "01 Rehab.mp3"
positions = list()
infos = list()
info = ""
such_kriterien = ("TPE1", "TPE2", "TCOM", "TIT2", "TCON", "TYER", "TRCK",
                  "TALB",)

stop_kriterien = ("AENC", "ASPI", "COMR", "EQU2", "GEOB", "LINK", "MLLT", 
                  "PRIV", "POPM", "RBUF", "RVRB", "SIGN", "SYTC", "TBPM", 
                  "TCON", "TDEN", "TDOR", "TDRL", "TENC", "TEXT", "TFLT", 
                  "TIT1", "TIT2", "TLAN", "TMCL", "TMOO", "TOFN", "TOPE", 
		  "TPE1", "TPE3", "TPOS", "TPRO", "TPUB", "TSOA", "TSOT", 
		  "TXXX", "USER", "WCOM", "WCOP", "WOAF", "WOAS", "WPAY", 
		  "APIC", "COMM", "ENCR", "ETCO", "GRID", "TLEN", "MCDI",
		  "OWNE", "PCNT", "POSS", "RVA2", "SEEK", "SYLT", "TALB", 
		  "TCOM", "TCOP", "TDLY", "TDRC", "TDTG", "TEXT", "TIPL", 
		  "TIT3", "TKEY", "TMED", "TOAL", "TOLY", "TOWN", "WXXX",
		  "TPE2", "TPE4", "TPRO", "TRCK", "TRSO", "TSOP", "TSRC", 
		  "TSST", "UFID", "USLT", "WCOP", "WOAR", "WORS", "WPUB",
		  "TALB", "TYER", "IPLS", "TDAT")


datei = open(file_name, 'r')
data = datei.read()


for string_start in such_kriterien:
    if data.find(string_start) > 0:
        position = data.find(string_start) + 11
        positions.append(position)


for start_position in positions:
    datei.seek(start_position)
    while True:
        info += datei.read(1)
        if len(info) > 4:
            test = info[-4] + info[-3] + info[-2] + info[-1]
            if test in stop_kriterien:
                mp3_info = info.replace(test, "")
                break
    infos.append(mp3_info)
    info = ""
    
datei.close()

for info in infos:
    print info

Amy Winehouse
Amy Winehouse
Amy Winehouse
Rehab
Soul And R&B
2007
1
Back to Black [Canada]

Das kommt dann so raus.

gruß frank
BlackJack

Nein das ist wohl nicht wirklich robust. Und Einlesen einer Datei Byteweise ist verhältnismässig sehr langsam und vor allem total überflüssig, weil Du die *gesamte* Datei zu dem Zeitpunkt ja schon längst in den Speicher gelesen hast.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo BlackJack !

Das ich die Daten eigentlich schon habe ist mir klar, doch es gibt da keine wirkliche Ordnung und die Anordnung ist eher "zufällig". Es gibt es auch als Beispiel in einem Python-Tutorial. Da wird der hinterer Teil ausgelesen, denn dort scheint es eine einheitliche Ordnung zu geben. Es stecken aber viel mehr Informationen in einer mp3 und die wollte ich auch haben. Den ganzen String (data) in seine Einzelteile aufzulösen, machte mir echt Probleme !

gruß frank
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Vielleicht hilft Dir das: http://www.omniscia.org/~vivake/python/MP3Info.py
MfG
HWK
BlackJack

Wenn man so etwas selber implementieren möchte, sollte man sich auf jeden Fall die Spezifikation auf http://www.id3.org/ zur Hand nehmen und nicht so auf gut Glück in den Daten herum stochern.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dumme Idee: Mit RE nur ASCII Buchstaben rausfischen lassen ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Was das ganze so furchtbar unsicher macht, wenn man nur nach den Zeichenketten sucht, ist dass die ja auch in Text vorkommen können. Nicht jedes SEEK, SIGN, oder TOWN muss ein Tag sein.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke an Alle !

Werde noch weiter probieren.

gruß frank
Antworten