[OK] Lecture de Tags MP3 V2.3
Publié : mer. 22/mars/2017 13:16
Bon, bon, bon
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
donc je me suis débrouillé autrement)
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)
Voilà. Ce code est affreux, car c'est le fruit de tout un tas d'essais, mais ça fonctionne.
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

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
