ID3v2 Tag auslesen / schreiben

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

5k41

Betreff: ID3v2 Tag auslesen / schreiben

BeitragSa, Sep 23, 2006 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Blitzcoder

Newsposter

BeitragSa, Sep 23, 2006 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Sep 23, 2006 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Sep 23, 2006 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSa, Sep 23, 2006 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Sep 23, 2006 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Okt 02, 2006 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 02, 2006 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused . Werde - sobald ich Zeit finde- daran weiter machen ( kann noch ein bisschen dauern, da grad die Entwicklung von For a better World auf hochtouren läuft und ich ausserdem noch ein paar andere Verpflichtungen hab ). Melde mich wenn es was neues gibt Smile.
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group