[Source] Tag M4A Format Reader... QuickTime - itunes

Iniciado por BlackZeroX, 24 Septiembre 2010, 08:48 AM

0 Miembros y 1 Visitante están viendo este tema.

BlackZeroX

Es un Modulod e Clase que sirve para leer el Tag de los archivos de Musica, y extraer toda la informacion posible del mismo...

Saca los bytes del Cover del M4A incluyendo su formato... JPEG / PNG.
Saca el texto "liryc" del M4A (Si existe...)

y toda la informacion posible y de forma existencial!¡.

* Esta la es la primera version, asi que si tiene errores favor de comunicarlos en este mismo hilo.
* Deshacer este formato para obtener la información me a costa asi que disfrutenlo!¡.

NOTA: No saca informacion comprimida... para ello usar la Zlib...


Aqui hay varios archivos M4A... xP  --->  http://infrangelux.sytes.net/FileX/index.php?dir=/Musica/Slipknot

FormatM4A.cls

Código (Vb) [Seleccionar]



'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandesido //
'   // o achicado, si es en base a este codigo es requerido    //
'   // el agradacimiento al autor.                             //
'   /////////////////////////////////////////////////////////////
'   //////////////////////Lector Formato M4A/////////////////////
'   /////////////////////////////////////////////////////////////
'   //  1ra Version...                                         //
'   //      --> Verificación de Formato.                       //
'   //      --> Solo Lectura de Datos (Tag).                   //
'   /////////////////////////////////////////////////////////////

Option Explicit
Option Base 0
Option Compare Text

Private Str_Album                       As String
Private Str_Artist                      As String
Private Str_AlbumArtist                 As String
Private Str_Comment                     As String
Private Str_Year                        As String
Private Str_Title                       As String
Private Str_Genre                       As String
Private Str_TrackNumber                 As String
Private Str_DiskNumber                  As String
Private Str_Composer                    As String
Private Str_Encoder                     As String
Private Str_BPM                         As String
Private Str_Copyright                   As String
Private Str_Compilation                 As String
Private Arr_Artwork()                   As Byte
Private Str_ArtworkFormat               As String
Private Str_RatingAdvisory              As String
Private Str_Grouping                    As String
Private Str_qq_stik                     As String
Private Str_Podcast                     As String
Private Str_Category                    As String
Private Str_Keyword                     As String
Private Str_PodcastURL                  As String
Private Str_EpisodeGlobalUniqueID       As String
Private Str_Description                 As String
Private Str_Lyrics                      As String
Private Str_TVNetworkName               As String
Private Str_TVShowName                  As String
Private Str_TVEpisodeNumber             As String
Private Str_TVSeason                    As String
Private Str_TVEpisode                   As String
Private Str_PurchaseDate                As String
Private Str_GaplessPlayback             As String

Private Const lng_lAtom                 As Long = &H4
Private Const Str_Format                As String = "ftyp"
Private Const cContData                 As String = "udta"
Private Const cMetaData                 As String = "meta"
Private Const ChdlrData                 As String = "hdlr"

Private Const cAlbum                    As String = "©alb"
Private Const cArtist                   As String = "©art"
Private Const cAlbumArtist              As String = "aART"
Private Const cComment                  As String = "©cmt"
Private Const cYear                     As String = "©day"
Private Const cTitle                    As String = "©nam"
Private Const cGenre                    As String = "©gen|gnre"
Private Const cTrackNumber              As String = "trkn"
Private Const cDiskNumber               As String = "disk"
Private Const cComposer                 As String = "©wrt"
Private Const cEncoder                  As String = "©too"
Private Const cBPM                      As String = "tmpo"
Private Const cCopyright                As String = "cprt"
Private Const cCompilation              As String = "cpil"
Private Const cArtwork                  As String = "covr"
Private Const cRatingAdvisory           As String = "rtng"
Private Const cGrouping                 As String = "©grp"
Private Const cqq_stik                  As String = "stik"
Private Const cPodcast                  As String = "pcst"
Private Const cCategory                 As String = "catg"
Private Const cKeyword                  As String = "keyw"
Private Const cPodcastURL               As String = "purl"
Private Const cEpisodeGlobalUniqueID    As String = "egid"
Private Const cDescription              As String = "desc"
Private Const cStr_Lyrics               As String = "©lyr"
Private Const cTVNetworkName            As String = "tvnn"
Private Const cTVShowName               As String = "tvsh"
Private Const cTVEpisodeNumber          As String = "tven"
Private Const cTVSeason                 As String = "tvsn"
Private Const cTVEpisode                As String = "tves"
Private Const cPurchaseDate             As String = "purd"
Private Const cGaplessPlayback          As String = "pgap"

Private Str_File                        As String
Private Priv_ItsOkFormat                As Boolean

Private Function StringToLong(ByVal Str_Data As String) As Long
Dim TMP$, i&
Dim Byte_Str()      As Byte
   TMP$ = String$(Len(Str_Data) * 2 + 2, "0")
   Mid$(TMP$, 1, 2) = "&H"
   Byte_Str = StrConv(Str_Data$, vbFromUnicode)
   For i = LBound(Byte_Str) To UBound(Byte_Str)
       If Byte_Str(i) > 15 Then
           Mid$(TMP$, 3 + i * 2, 2) = Hex(Byte_Str(i))
       Else
           Mid$(TMP$, 3 + i * 2, 2) = "0" & Hex(Byte_Str(i))
       End If
   Next i
   StringToLong& = CLng(TMP$)
End Function

Private Function GetStrFromNumFile(ByVal IDFile As Integer, ByVal LngPos As Long, ByRef StrOut As String) As Long
   Get IDFile%, LngPos, StrOut$
   GetStrFromNumFile = LngPos + Len(StrOut$)
End Function

Public Property Let This_File(ByVal StrFilePath As String)
Dim Str_PointerStr      As String * lng_lAtom
Dim Str_CatNow          As String * lng_lAtom
Dim Str_DataPos         As String * lng_lAtom
Dim Str_CatData         As String
Dim lng_Pos             As Long
Dim int_FF              As Integer


   Str_Album$ = ""
   Str_Artist$ = ""
   Str_AlbumArtist$ = ""
   Str_Comment$ = ""
   Str_Year$ = ""
   Str_Title$ = ""
   Str_Genre$ = ""
   Str_TrackNumber$ = ""
   Str_DiskNumber$ = ""
   Str_Composer$ = ""
   Str_Encoder$ = ""
   Str_BPM$ = ""
   Str_Copyright$ = ""
   Str_Compilation$ = ""
   Erase Arr_Artwork
   Str_RatingAdvisory$ = ""
   Str_Grouping$ = ""
   Str_qq_stik$ = ""
   Str_Podcast$ = ""
   Str_Category$ = ""
   Str_Keyword$ = ""
   Str_PodcastURL$ = ""
   Str_EpisodeGlobalUniqueID$ = ""
   Str_Description$ = ""
   Str_Lyrics$ = ""
   Str_TVNetworkName$ = ""
   Str_TVShowName$ = ""
   Str_TVEpisodeNumber$ = ""
   Str_TVSeason$ = ""
   Str_TVEpisode$ = ""
   Str_PurchaseDate$ = ""
   Str_GaplessPlayback$ = ""
                                       
                                       
   Str_CatData$ = Space$(lng_lAtom&)
   Priv_ItsOkFormat = False
   Str_File$ = StrFilePath$
   int_FF% = FreeFile%
   
   Open Str_File$ For Binary As int_FF%
   
   If LOF(int_FF%) > 8 Then
   
       Get int_FF%, 5, Str_CatNow$
       
       If StrComp(Str_CatNow$, Str_Format$, vbBinaryCompare) = 0 Then
           'lng_Pos& = 148 '   //  Se puede Obviar, pero mejor comprovamos el formato...
           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + 1, Str_DataPos$) - (lng_lAtom& - 1)
           lng_Pos& = GetStrFromNumFile&(int_FF%, StringToLong&(Str_DataPos$) + ((lng_lAtom& * 2) + 1), Str_DataPos$) + StringToLong&(Str_DataPos$) - lng_lAtom& - 1
           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + 1, Str_DataPos$) + StringToLong&(Str_DataPos$)
           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos&, Str_CatNow$)
           
           If StrComp(Str_CatNow$, cContData$, vbTextCompare) = 0 Then
               lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_DataPos$)
               If StrComp(Str_DataPos$, cMetaData$, vbTextCompare) = 0 Then
                   lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_CatData$)
                   lng_Pos& = lng_Pos& + StringToLong&(Str_CatData$) + lng_lAtom&
                   Do
                       lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_CatNow$)
                       If StrComp(Str_CatNow$, "free", vbTextCompare) = 0 Or StrComp(Str_CatNow$, "name", vbTextCompare) = 0 Then Exit Do
                       Call GetStrFromNumFile&(int_FF%, lng_Pos& + lng_lAtom&, Str_DataPos$)
                       If StrComp(Str_DataPos$, "data", vbTextCompare) = 0 Then '   //  Atom Legible? (Sin Compresion o espesificaciones del Formato...)
                           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos&, Str_PointerStr$)
                           Str_CatData$ = Space$(StringToLong&(Str_PointerStr$) - (lng_lAtom& * 4))
                           If StrComp(Str_CatNow$, cArtwork$, vbTextCompare) = 0 Then
                               GetStrFromNumFile& int_FF%, lng_Pos& + lng_lAtom&, Str_PointerStr$
                               Select Case StringToLong&(Str_PointerStr$)
                                   Case 13
                                       Str_ArtworkFormat$ = "jpeg"
                                   Case 14
                                       Str_ArtworkFormat$ = "png"
                               End Select
                           End If
                           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& + (lng_lAtom * 3), Str_CatData)
                           If Not StrComp(Str_CatNow$, "", vbTextCompare) = 0 Then
                               Select Case Str_CatNow$
                                   Case cAlbum$
                                       Str_Album$ = Str_CatData$
                                   Case cArtist$
                                       Str_Artist$ = Str_CatData$
                                   Case cAlbumArtist$
                                       Str_AlbumArtist$ = Str_CatData$
                                   Case cComment$
                                       Str_Comment$ = Str_CatData$
                                   Case cYear$
                                       Str_Year$ = Str_CatData$
                                   Case cTitle$
                                       Str_Title$ = Str_CatData$
                                   Case Split(cGenre$, "|")(0), Split(cGenre$, "|")(1)                 '  //  "©gen|gnre"
                                       Str_Genre$ = Str_CatData$
                                   Case cTrackNumber$
                                       Str_TrackNumber$ = Str_CatData$
                                   Case cDiskNumber$
                                       Str_DiskNumber$ = Str_CatData$
                                   Case cComposer$
                                       Str_Composer$ = Str_CatData$
                                   Case cEncoder$
                                       Str_Encoder$ = Str_CatData$
                                   Case cBPM$
                                       Str_BPM$ = Str_CatData$
                                   Case cCopyright$
                                       Str_Copyright$ = Str_CatData$
                                   Case cCompilation$
                                       Str_Compilation$ = Str_CatData$
                                   Case cArtwork$
                                       Arr_Artwork = StrConv(Str_CatData$, vbFromUnicode)
                                   Case cRatingAdvisory$
                                       Str_RatingAdvisory$ = Str_CatData$
                                   Case cGrouping$
                                       Str_Grouping$ = Str_CatData$
                                   Case cqq_stik$
                                       Str_qq_stik$ = Str_CatData$
                                   Case cPodcast$
                                       Str_Podcast$ = Str_CatData$
                                   Case cCategory$
                                       Str_Category$ = Str_CatData$
                                   Case cKeyword$
                                       Str_Keyword$ = Str_CatData$
                                   Case cPodcastURL$
                                       Str_PodcastURL$ = Str_CatData$
                                   Case cEpisodeGlobalUniqueID$
                                       Str_EpisodeGlobalUniqueID$ = Str_CatData$
                                   Case cDescription$
                                       Str_Description$ = Str_CatData$
                                   Case cStr_Lyrics$
                                       Str_Lyrics$ = Str_CatData$
                                   Case cTVNetworkName$
                                       Str_TVNetworkName$ = Str_CatData$
                                   Case cTVShowName$
                                       Str_TVShowName$ = Str_CatData$
                                   Case cTVEpisodeNumber$
                                       Str_TVEpisodeNumber$ = Str_CatData$
                                   Case cTVSeason$
                                       Str_TVSeason$ = Str_CatData$
                                   Case cTVEpisode$
                                       Str_TVEpisode$ = Str_CatData$
                                   Case cPurchaseDate$
                                       Str_PurchaseDate$ = Str_CatData$
                                   Case cGaplessPlayback$
                                       Str_GaplessPlayback$ = Str_CatData$
                               End Select
                           End If
                       ElseIf Str_CatNow$ = "----" Then
                           lng_Pos& = GetStrFromNumFile&(int_FF%, lng_Pos& - 8, Str_DataPos$)
                           lng_Pos& = lng_Pos& + StringToLong&(Str_DataPos$) - lng_lAtom&
                       End If
                   Loop
                   Priv_ItsOkFormat = True
               End If
           End If
       End If
   End If
    Close int_FF%
End Property

Public Property Get ItsOkFormat() As Boolean
   ItsOkFormat = Priv_ItsOkFormat
End Property

Public Property Get This_File() As String
   This_File = Str_File$
End Property

Public Property Get Album() As String
   Album = Str_Album
End Property
Public Property Get Artist() As String
   Artist = Str_Artist
End Property
Public Property Get AlbumArtist() As String
   AlbumArtist = Str_AlbumArtist
End Property
Public Property Get Comment() As String
   Comment = Str_Comment
End Property
Public Property Get Year() As String
   Year = Str_Year
End Property
Public Property Get Title() As String
   Title = Str_Title
End Property
Public Property Get Genre() As String
   Genre = Str_Genre
End Property
Public Property Get TrackNumber() As String
   TrackNumber = Str_TrackNumber
End Property
Public Property Get DiskNumber() As String
   DiskNumber = Str_DiskNumber
End Property
Public Property Get Composer() As String
   Composer = Str_Composer
End Property
Public Property Get Encoder() As String
   Encoder = Str_Encoder
End Property
Public Property Get BPM() As String
   BPM = Str_BPM
End Property
Public Property Get Copyright() As String
   Copyright = Str_Copyright
End Property
Public Property Get Compilation() As String
   Compilation = Str_Compilation
End Property
Public Property Get Artwork() As Byte()
   Artwork = Arr_Artwork
End Property
Public Property Get ArtworkFormat() As String
   ArtworkFormat = Str_ArtworkFormat
End Property
Public Property Get RatingAdvisory() As String
   RatingAdvisory = Str_RatingAdvisory
End Property
Public Property Get Grouping() As String
   Grouping = Str_Grouping
End Property
Public Property Get qq_stik() As String
   qq_stik = Str_qq_stik
End Property
Public Property Get Podcast() As String
   Podcast = Str_Podcast
End Property
Public Property Get Category() As String
   Category = Str_Category
End Property
Public Property Get Keyword() As String
   Keyword = Str_Keyword
End Property
Public Property Get PodcastURL() As String
   PodcastURL = Str_PodcastURL
End Property
Public Property Get EpisodeGlobalUniqueID() As String
   EpisodeGlobalUniqueID = Str_EpisodeGlobalUniqueID
End Property
Public Property Get Description() As String
   Description = Str_Description
End Property
Public Property Get Lyrics() As String
   Lyrics = Str_Lyrics
End Property
Public Property Get TVNetworkName() As String
   TVNetworkName = Str_TVNetworkName
End Property
Public Property Get TVShowName() As String
   TVShowName = Str_TVShowName
End Property
Public Property Get TVEpisodeNumber() As String
   TVEpisodeNumber = Str_TVEpisodeNumber
End Property
Public Property Get TVSeason() As String
   TVSeason = Str_TVSeason
End Property
Public Property Get TVEpisode() As String
   TVEpisode = Str_TVEpisode
End Property
Public Property Get PurchaseDate() As String
   PurchaseDate = Str_PurchaseDate
End Property
Public Property Get GaplessPlayback() As String
   GaplessPlayback = Str_GaplessPlayback
End Property


'Public Property Let Album(ByVal vData As String)
'Public Property Let Artist(ByVal vData As String)
'Public Property Let AlbumArtist(ByVal vData As String)
'Public Property Let Comment(ByVal vData As String)
'Public Property Let Year(ByVal vData As String)
'Public Property Let Title(ByVal vData As String)
'Public Property Let Genre(ByVal vData As Integer)
'Public Property Let TrackNumber(ByVal vData As Integer)
'Public Property Let DiskNumber(ByVal vData As Integer)
'Public Property Let Composer(ByVal vData As String)
'Public Property Let Encoder(ByVal vData As String)
'Public Property Let BPM(ByVal vData As Integer)
'Public Property Let Copyright(ByVal vData As String)
'Public Property Let Compilation(ByVal vData As Integer)
'Public Property Let Artwork(ByRef vData() As Byte)
'   //  Public Property Let ArtworkFormat(ByRef vData As String)
'Public Property Let RatingAdvisory(ByVal vData As Integer)
'Public Property Let Grouping(ByVal vData As String)
'Public Property Let qq_stik(ByVal vData As Integer)
'Public Property Let Podcast(ByVal vData As Integer)
'Public Property Let Category(ByVal vData As String)
'Public Property Let Keyword(ByVal vData As String)
'Public Property Let PodcastURL(ByVal vData As Integer)
'Public Property Let EpisodeGlobalUniqueID(ByVal vData As Integer)
'Public Property Let Description(ByVal vData As String)
'Public Property Let Lyrics(ByVal vData As String)
'Public Property Let TVNetworkName(ByVal vData As String)
'Public Property Let TVShowName(ByVal vData As String)
'Public Property Let TVEpisodeNumber(ByVal vData As String)
'Public Property Let TVSeason(ByVal vData As Integer)
'Public Property Let TVEpisode(ByVal vData As Integer)
'Public Property Let PurchaseDate(ByVal vData As String)
'Public Property Let GaplessPlayback(ByVal vData As Integer)



Ejemplo de uso:

Código (Vb) [Seleccionar]



Option Explicit
Option Base 0

Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" (ByVal lpPath As String) As Long

Sub main()
Dim clsFM4A         As Cls_FormatM4A
Dim StrDir          As String
Dim int_FF          As Integer

   Set clsFM4A = New Cls_FormatM4A
   With clsFM4A
   
       .This_File = App.Path & "\SCGJ.m4a"
       
       If .ItsOkFormat Then
       
           StrDir$ = Replace$("c:\Musica\" & .Artist & "\" & .Year & "-" & .Album & "\", "\\", "\")
           Call MakeSureDirectoryPathExists(StrDir$)
           
           '   //  extraemos la Imagen Cover
           int_FF% = FileSystem.FreeFile%
           Open StrDir & .Artist & " - " & .Title & "." & .ArtworkFormat For Binary As int_FF%
               Put int_FF%, , .Artwork
           Close int_FF%
           
           '   //  Extraemos la lirica del archivo
           int_FF% = FileSystem.FreeFile%
           Open StrDir & .Artist & " - " & .Title & ".txt" For Binary As int_FF%
               Put int_FF%, , .Lyrics
           Close int_FF%
           
       End If
   End With
   Set clsFM4A = Nothing
   
End Sub



Dulce Infierno Lunar!¡.
The Dark Shadow is my passion.