ID3v2 Tag auslesen / schreiben
Übersicht

![]() |
5k41Betreff: ID3v2 Tag auslesen / schreiben |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
Erstmal ein großes Dankeschön an hectic, der die read funktion geschrieben hat, an der ich mich sehr gut orientieren konnte! Und nun, ohne Worte: Code: [AUSKLAPPEN] Graphics 600,400,0,2 mp3name$="blub.mp3" Print "Dateiname :"+read_id3v2(mp3name,0) Print "Tracknummer :"+read_id3v2(mp3name,1) Print "Kuenstler :"+read_id3v2(mp3name,2) Print "Musiktitel :"+read_id3v2(mp3name,3) Print "Albumname :"+read_id3v2(mp3name,4) Print "Produktionsjahr :"+read_id3v2(mp3name,5) Print "Kommentar :"+read_id3v2(mp3name,6) Print "Komponist :"+read_id3v2(mp3name,7) Print "Urspr. Kuenstler :"+read_id3v2(mp3name,8) Print "Copyright :"+read_id3v2(mp3name,9) Print "Encoder :"+read_id3v2(mp3name,10) Print "URL :"+read_id3v2(mp3name,11) Print "ändern..." write_id3v2(mp3name,"huhu.mp3",0) mp3name = "huhu.mp3" write_id3v2(mp3name$,"65/1200",1) write_id3v2(mp3name$,"Julius Caesar",2) write_id3v2(mp3name$,"Colloseum",3) write_id3v2(mp3name$,"Best of Julius Caesar",4) write_id3v2(mp3name$,"2500 v. Chr.",5) write_id3v2(mp3name$,"scheiß Mukke!",6) write_id3v2(mp3name$,"weiss man nicht genau!",7) write_id3v2(mp3name$,"Neandertaler",8) write_id3v2(mp3name$,"Copyright by Neandertaler",9) write_id3v2(mp3name$,"vergessen...",10) write_id3v2(mp3name$,"www.blitzforum.de",11) Print "geändert!" Print "Dateiname :"+read_id3v2(mp3name,0) Print "Tracknummer :"+read_id3v2(mp3name,1) Print "Kuenstler :"+read_id3v2(mp3name,2) Print "Musiktitel :"+read_id3v2(mp3name,3) Print "Albumname :"+read_id3v2(mp3name,4) Print "Produktionsjahr :"+read_id3v2(mp3name,5) Print "Kommentar :"+read_id3v2(mp3name,6) Print "Komponist :"+read_id3v2(mp3name,7) Print "Urspr. Kuenstler :"+read_id3v2(mp3name,8) Print "Copyright :"+read_id3v2(mp3name,9) Print "Encoder :"+read_id3v2(mp3name,10) Print "URL :"+read_id3v2(mp3name,11) WaitKey End ;Functions---------------------------------------------------------- ;ID Bedeutung: ; 0 Dateiname ; 1 Tracknummer ; 2 Künstler ; 3 Musiktitel ; 4 Albumname ; 5 Prduktionsjahr ; 6 Kommentar ; 7 Komponist ; 8 Ursp.Künstler ; 9 Copyright ; 10 Encoder ; 11 URL ;ID3v2 aus mp3 lesen Function read_id3v2$(name$,id%) ;Prüfen ob Eingabe gültig If Lower(Right(name,4))<>".mp3" RuntimeError "read_id3v2: Eingabe ungültig" ;Prüfen ob Datei vorhanden If FileType(name)<>1 RuntimeError "read_id3v2: Datei existiert nicht" ;Datei zum lesen öffnen datei=ReadFile(name) ;Ersten kByte einlesen For stelle=0 To 1023 ;Ersten kByte an TagStream anfügen TagStream$=TagStream+Chr(ReadByte(datei)) Next ;mp3-Datei freigeben CloseFile(datei) ;Dateiname If id=0 Return(name) End If ;Tracknummer If id=1 SPos=Instr(TagStream,"TRCK") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Künstler If id=2 SPos=Instr(TagStream,"TPE1") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Musiktitel If id=3 SPos=Instr(TagStream,"TIT2") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Albumname If id=4 SPos=Instr(TagStream,"TALB") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Prod.Jahr If id=5 SPos=Instr(TagStream,"TYER") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Kommentar If id=6 SPos=Instr(TagStream,"COMM") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+15,EPos-5) End If ;Komponist If id=7 SPos=Instr(TagStream,"TCOM") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Ursp.Künstler If id=8 SPos=Instr(TagStream,"TOPE") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Copyright If id=9 SPos=Instr(TagStream,"TCOP") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;Encoder If id=10 SPos=Instr(TagStream,"TENC") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+11,EPos-1) End If ;URL If id=11 SPos=Instr(TagStream,"WXXX") EPos=Asc(Mid(TagStream,SPos+7,1)) Out$=Mid$(TagStream,SPos+12,EPos-2) End If ;Kein Eintrag gefunden If SPos=0 Return "" ;Bereinigen If Len(Out)>0 For clean=1 To Len(Out) If Asc(Mid(Out,clean,1))>31 If Asc(Mid(Out,clean,1))<254 Puffer$=Puffer$+Mid(Out,clean,1) End If End If Next Return Puffer Else ;Wenn alles nichts nützt Return "-" End If ;Funktionende End Function ;ID3v2 in mp3 schreiben Function write_id3v2(name$,strg$,id%) ;Prüfen ob Eingabe gültig If Lower(Right(name,4))<>".mp3" RuntimeError "write_id3v2: Eingabe ungültig" ;Prüfen ob Datei vorhanden If FileType(name)<>1 RuntimeError "write_id3v2: Datei existiert nicht" ;Dateiname If id=0 CopyFile name$,strg$ DeleteFile name$ Return 0 End If ;Datei zum lesen/schreiben öffnen datei=OpenFile(name) ;Ersten kByte einlesen For stelle=0 To 1023 ;Ersten kByte an TagStream anfügen TagStream$=TagStream+Chr(ReadByte(datei)) Next ;Tracknummer If id=1 SPos=Instr(TagStream,"TRCK") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Künstler If id=2 SPos=Instr(TagStream,"TPE1") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Musiktitel If id=3 SPos=Instr(TagStream,"TIT2") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Albumname If id=4 SPos=Instr(TagStream,"TALB") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Prod.Jahr If id=5 SPos=Instr(TagStream,"TYER") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Kommentar If id=6 SPos=Instr(TagStream,"COMM") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+5)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+15+EPos-6)) End If ;Komponist If id=7 SPos=Instr(TagStream,"TCOM") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Ursp.Künstler If id=8 SPos=Instr(TagStream,"TOPE") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Copyright If id=9 SPos=Instr(TagStream,"TCOP") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;Encoder If id=10 SPos=Instr(TagStream,"TENC") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+1)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+11+EPos-2)) End If ;URL If id=11 SPos=Instr(TagStream,"WXXX") EPos=Asc(Mid(TagStream,SPos+7,1)) TagStream=Left(TagStream,SPos+6)+Chr(Len(strg$)+2)+Chr(0)+Chr(0)+Chr(0)+Chr(0)+strg$+Right(TagStream,Len(TagStream)-(SPos+12+EPos-3)) End If ;Kein Eintrag gefunden If SPos=0 Return 0 SeekFile(datei,0) For stelle = 0 To 1023 ;Rotz wieder in die Datei schreiben WriteByte datei,Asc(Mid(TagStream,stelle+1,1)) Next ;mp3-Datei freigeben CloseFile(datei) ;Funktionende End Function Bugs: Kommentar funktioniert nocht nicht Keine Ahnung wie man das Genre ändern kann (bin ich dran) MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nett, nett. feht eben noch Kommentar und genre. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
PowerProgrammer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Endlich mal was anderes, nicht nur diese Ausleseteile!
Nice work. Auslesen klappt super, Ändern funzt irgendwie nicht... |
||
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter! |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@PowerProgrammer:
Wie ändern funtzt net? Kannst du das Präzisieren? @Blitzcoder: Das mit dem Kommentar ist nicht so ganz leicht... mit dem Ausleseteil kann ich mein eigenes Kommentar auslesen, doch bei Windows klappts irgendwie nicht... werd nun grad nochmal wegen dem Genre schauen... MfG ~Edit~ Habe grade herraus gefunden, das Winamp mein Comment auch lesen kann... muss wohl an Windows liegen. Mit dem Genre bin ich immer noch nicht weiter, habe mich nun schon durch 2 Id3v2 Dokus gearbeitet, und bin nicht fündig geworden, zur Not müsste ich da auf Id3v1 ausweichen, wobei ich nicht weiss ob man das so gemischt auslesen und schreiben kann... naja suche nochmal ein bisschen weiter! |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
PowerProgrammer |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab dein Beispiel ausprobiert und aufeinmal klappte der Song nicht, als ich ihn mit dem Windows Media Player abspielen wollte. Dann kam da diese Meldung und ein Ausrufezeichen war vor dem Songnamen.
Keine Ahnung, woran es lag. |
||
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter! |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
mh, das Problem hatte ich am Anfang auch, als der Header noch fehlerhaft war... habs eben nochmal ausprobiert und es funktioniert auch mit dem MediaPlayer perfekt... zum Genre: In Winamp kann man das Genre von ID3v2 ändern, das ist meine einzige Motivation im moment, da man laut 2 Dokus das Genre nur mit ID3v1 ändern kann...
MfG achja, versuch es doch nochmal mit einer anderen Datei... und stell sie auf keinen Fall auf Read-Only ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi 5k41, konnte es leider noch nicht ausprobieren da ich noch bei der Arbeit bin, aber es gibt vielleicht einiges an Informationen die hilfreich sein könnten. Folgendes habe ich herausfinden können:
- Sowohl die Tag-ID in V1 und V2 sind nicht komplett standarisiert! Daher fügen die meisten Editoren ihre Informationen nur hinzu und belassen die alten Informationen im header liegen. Das führt dazu, daß bei mehrmaligem ändern der ID-Informationen natürlich der Header völlig sinnfrei größer wird, aber eben keine Informationen verloren gehen. Dieses sollte beachtet werden. - Der Header hat eine Stoppbytefolge welches angibt "hier ist der Header zuende!". Keine Ahnung welche Bytes es nun waren. Wenn du diese Bytes überschreiben solltest, dann könnte dieses die Ursache der 'fehlerhaften' Dateien sein. - Schön währe eine Möglichkeit die alten sinnlos gespeicherten Informationen löschen zu können und nur die gewünschten durch ein Filter zu übertragen bzw. zu belassen. Dadurch währe der angesammelte Datenmüll ein Ende bereitet. |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ui, das die alten Infos behalten werden wusste ich garnicht, hab mich bei meinem Code nur an deinem Orientiert und ihn halt fürs schreiben ungeschrieben. Einen Bug habe ich schon gefunden, doch als ich ihn "behoben" hab war wieder alles kaputt ![]() ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group