Seite 1 von 1

ID3v2.3 u. ID3v2.4 auslesen

Verfasst: Freitag 11. April 2008, 23:02
von kaytec
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

Verfasst: Samstag 12. April 2008, 09:28
von 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.

Verfasst: Samstag 12. April 2008, 10:28
von kaytec
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

Verfasst: Samstag 12. April 2008, 11:09
von HWK
Vielleicht hilft Dir das: http://www.omniscia.org/~vivake/python/MP3Info.py
MfG
HWK

Verfasst: Samstag 12. April 2008, 15:59
von 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.

Verfasst: Samstag 12. April 2008, 16:23
von jens
Dumme Idee: Mit RE nur ASCII Buchstaben rausfischen lassen ;)

Verfasst: Samstag 12. April 2008, 17:17
von 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.

Verfasst: Samstag 12. April 2008, 21:50
von kaytec
Danke an Alle !

Werde noch weiter probieren.

gruß frank