Ca fait un bout de tmps que je cherche à ajouter à mon desk, les titres pour les fichier MP3
Pour les ID V1, c'est facile, ce sont les 128 derniers octets (fileseek de la taille du fichier - 128 et hop)
C'est fait depuis longtemps.
Pour les ID V2, c'est l'horreur...
J'ai étudié tout ce que j'ai pu trouver sur le net
- La description officielle: http://id3.org/id3v2.3.0 (imbuvable pour mon cerveau à 2 neurones)
- Une page très intéressante: http://mgc99.free.fr/InfoMP3.html
Les exemples sur les forums PB (des tas!) mais surtout deux
- Celui de ts-soft (le seul qui marche bien en PB 5.60)
http://www.purebasic.fr/english/viewtop ... 12&t=55920
- Celui de Zorro/Spock , qui ne marche pas en PB 5.60 mais grâce à qui j'ai pu apprendre plein de trucs

http://www.purebasic.fr/french/viewtopi ... 0&start=31
(sauf que je n'ai rien pigé au little_indian

Grace à vos explications sur mon topic "memoryseek" j'ai pu me lancer et après plusieurs jours, ça marche

Vous allez me dire, il y a des libs bien mieux, mais cette roue (carrée) là c'est moi qui l'ai faite et elle roule (vite)

Code : Tout sélectionner
; Read MP3 Tags V2
; Minimum cherché: Lire le titre (Tag: TIT2)
; Marc56 - 22/03/2017
; Documentation:
; Format: http://id3.org/id3v2.3.0
; Explication Fr trouvée sur: http://mgc99.free.fr/InfoMP3.html
; Merci pour leurs exemples et explications à:
; Ts-soft: http://www.purebasic.fr/english/viewtopic.php?f=12&t=55920
; Zorro: http://www.purebasic.fr/french/viewtopic.php?f=1&t=11240&start=31
MusicFile$ = OpenFileRequester("Lecture Tags MP3 V2.3",
GetUserDirectory(#PB_Directory_Musics),
"Fichier MP3|*.mp3", 1)
If MusicFile$ = ""
End
EndIf
Declare.s Read_Value()
; Fichier cassé ou absent ? suivant.
If Not ReadFile(0, MusicFile$)
Debug "Erreur: " + MusicFile$
End
EndIf
; Tag ID V2 (ID3 sur les 3 premiers octets)
If Not ReadString(0, #PB_UTF8, 3) = "ID3"
Debug "Ce fichier n'est pas un mp3 V2"
CloseFile(0)
End
EndIf
Debug "Fichier: " + MusicFile$
; Lecture de l'entête (10 octets)
*Head = AllocateMemory(10)
ReadData(0, *Head, 10)
ID_Sub = PeekA(*Head) ; Identification version (position 4)
Debug "Tag ID v2." + ID_Sub
If ID_Sub <> 3 And ID_Sub <> 4
End
EndIf
; On avance de 3 et on récupère la taille complète des tags
*Head + 3
x3 = PeekB(*Head) : *Head + 1
x2 = PeekB(*Head) : *Head + 1
x1 = PeekB(*Head) : *Head + 1
x0 = PeekB(*Head) : *Head + 1
Header_Size = x3 * Pow(128,3) + x2 * Pow(128,2) + x1 * Pow(128,1) + x0 * Pow(128,0)
Debug "Taille entête: " + Header_Size + " octets"
; On libère le buffer d'entête
*Head - 7 : FreeMemory(*Head)
; Lecture de la zone de tags
Global *Buf = AllocateMemory(Header_Size)
FileSeek(0, 0) ; Revenir au début du fichier
ReadData(0, *Buf, Header_Size)
CloseFile(0)
; Lecture de toute la zone (décalage de 1 lecture de 4)
For i = 0 To Header_Size
IDT$ = PeekS(*Buf, 4, #PB_UTF8)
Select IDT$
Case "TPE1"
Debug "TPE1 - Artiste : " + Read_Value()
Case "TALB"
Debug "TALB - CD : " + Read_Value()
Case "TIT2"
Debug "TIT2 - Titre : " + Read_Value()
Case "TYER"
Debug "TYER - Année : " + Read_Value()
Case "TDRC"
Debug "TDRC - Année : " + Read_Value()
Case "TRCK"
Debug "TRCK - Piste : " + Read_Value()
Case "TLEN"
Debug "TLEN - Durée : " + Read_Value() + " (?)"
Case "TPUB"
Debug "TPUB - ??? : " + Read_Value()
EndSelect
; Avance de 1
*Buf + 1
Next
Procedure.s Read_Value()
; Récupérer la taille du champs
*Buf + 4
x3 = PeekB(*Buf) : *Buf + 1
x2 = PeekB(*Buf) : *Buf + 1
x1 = PeekB(*Buf) : *Buf + 1
x0 = PeekB(*Buf) : *Buf + 1
Frame_Size = x3 * Pow(128,3) + x2 * Pow(128,2) + x1 * Pow(128,1) + x0 * Pow(128,0)
; Déplacer le flag de 2 octets (?)
*Buf + 3
ProcedureReturn PeekS(*Buf, Frame_Size-1, #PB_UTF8)
EndProcedure
Il ne me reste plus qu'à le mettre au propre et à l'intégrer au desk.
Si vous avez des suggestions ou critiques, je suis preneur
