Jump to content

_MP3GetID3v1Tag


taz742
 Share

Recommended Posts

These function is based on Lazycat's UDF _MP3GetTag()

I'll fix and rewrite it because his version wasn't fully support v1.0 and v1.1 ID3 TAG

_MP3GetID3v1Tag()

#include-once
;===============================================================================
; Function Name:    _MP3GetID3v1Tag($sFile)
; Description:        Retrive MP3 ID3Tag v1.0 & v1.1
; Parameter(s):        $sFile = FileFullPath
; Requirement(s):    Autoit v3.2.0
; Return Value(s):    On Success - array with data:
;                        0 - Title
;                        1 - Artist
;                        2 - Album
;                        3 - Year
;                        4 - Comment
;                        5 - Track number
;                        6 - Genre
;                        7 - Tag version
;                    On Failure empty string and sets @ERROR:
;                       -1 - File not found
;                         1 - TAG not found
; Version :            2.6.0
; Author(s):        taz742 based on Lazycat's UDF _MP3GetTag()
;===============================================================================
;
Func _MP3GetID3v1Tag($sFile)
    Local $ret = DllCall("kernel32.dll", "int", "CreateFile", _
            "str", $sFile, _
            "int", 0x80000000, _
            "int", 0, _
            "ptr", 0, _
            "int", 3, _
            "int", 0x80, _
            "ptr", 0), $error = 0

    If @error Or Not $ret[0] Then
        $error = -1
    Else
        Local $aID3v1
        Local $pTag = _FileReadToStruct("char[3];char[30];char[30];char[30];char[4];char[28];byte[2];byte", $ret[0], FileGetSize($sFile) - 128)
        ;TAG Header|Title|Artist|Album|Year|Comment|Track|Genre
        If Not (DllStructGetData($pTag, 1) == "TAG") Then
            $error = 1
        Else
            Dim $aID3v1[8]
            $aID3v1[0] = DllStructGetData($pTag, 2) ;Title
            $aID3v1[1] = DllStructGetData($pTag, 3) ;Artist
            $aID3v1[2] = DllStructGetData($pTag, 4) ;Album
            $aID3v1[3] = DllStructGetData($pTag, 5) ;Year
            If DllStructGetData($pTag, 7, 1) = 0 Then ;ID3Tag is v1.1 -> Track
                $aID3v1[4] = DllStructGetData($pTag, 6) ;Comment
                $aID3v1[5] = DllStructGetData($pTag, 7, 2) ;Track
                $aID3v1[7] = "1.1" ;version info
            Else ;ID3Tag is v1.0 -> Not Track
                $aID3v1[4] = DllStructGetData($pTag, 6) & String(BinaryToString(DllStructGetData($pTag, 7))) ;Comment
                $aID3v1[5] = "" ;Track is empty because not yet implanted in ID3v1.0
                $aID3v1[7] = "1.0" ;version info
            EndIf
            $aID3v1[6] = _MP3GetGenreByID(DllStructGetData($pTag, 8)) ;Genre
        EndIf
    EndIf
    DllCall("kernel32.dll", "int", "CloseHandle", "int", $ret[0])
    If Not $error Then Return $aID3v1
    SetError($error)
    Return ""
EndFunc   ;==>_MP3GetID3v1Tag
Func _MP3GetGenreByID($iID)
    Local $asGenre = StringSplit("Blues,Classic Rock,Country,Dance,Disco,Funk,Grunge,Hip-Hop," & _
            "Jazz,Metal,New Age,Oldies,Other,Pop,R&B,Rap,Reggae,Rock,Techno,Industrial,Alternative," & _
            "Ska,Death Metal,Pranks,Soundtrack,Euro-Techno,Ambient,Trip-Hop,Vocal,Jazz+Funk,Fusion," & _
            "Trance,Classical,Instrumental,Acid,House,Game,Sound Clip,Gospel,Noise,Alternative Rock," & _
            "Bass,Soul,Punk,Space,Meditative,Instrumental Pop,Instrumental Rock,Ethnic,Gothic,Darkwave," & _
            "Techno-Industrial,Electronic,Pop-Folk,Eurodance,Dream,Southern Rock,Comedy,Cult,Gangsta," & _
            "Top 40,Christian Rap,Pop/Funk,Jungle,Native US,Cabaret,New Wave,Psychadelic,Rave,Showtunes," & _
            "Trailer,Lo-Fi,Tribal,Acid Punk,Acid Jazz,Polka,Retro,Musical,Rock & Roll,Hard Rock,Folk," & _
            "Folk-Rock,National Folk,Swing,Fast Fusion,Bebob,Latin,Revival,Celtic,Bluegrass,Avantgarde," & _
            "Gothic Rock,Progressive Rock,Psychedelic Rock,Symphonic Rock,Slow Rock,Big Band,Chorus," & _
            "Easy Listening,Acoustic,Humour,Speech,Chanson,Opera,Chamber Music,Sonata,Symphony,Booty Bass," & _
            "Primus,Porn Groove,Satire,Slow Jam,Club,Tango,Samba,Folklore,Ballad,Power Ballad,Rhytmic Soul," & _
            "Freestyle,Duet,Punk Rock,Drum Solo,Acapella,Euro-House,Dance Hall,Goa,Drum & Bass,Club-House," & _
            "Hardcore,Terror,Indie,BritPop,Negerpunk,Polsk Punk,Beat,Christian Gangsta,Heavy Metal,Black Metal," & _
            "Crossover,Contemporary C,Christian Rock,Merengue,Salsa,Thrash Metal,Anime,JPop,SynthPop", ",")
    If ($iID >= 0) And ($iID < 148) Then Return $asGenre[$iID + 1]
    Return ("")
EndFunc   ;==>_MP3GetGenreByID
Func _FileReadToStruct($vStruct, $hFile, $nOffset)
    If Not DllStructGetSize($vStruct) Then $vStruct = DllStructCreate($vStruct)
    Local $nLen = DllStructGetSize($vStruct)
    Local $ret = DllCall("kernel32.dll", "int", "SetFilePointer", _
            "int", $hFile, _
            "int", $nOffset, _
            "int", 0, _
            "int", 0) ; FILE_BEGIN
    Local $pRead = DllStructCreate("dword")
    $ret = DllCall("kernel32.dll", "int", "ReadFile", _
            "int", $hFile, _
            "ptr", DllStructGetPtr($vStruct), _
            "int", $nLen, _
            "ptr", DllStructGetPtr($pRead), _
            "ptr", 0)
    If @error Then
        SetError(1)
    EndIf
    Local $nRead = DllStructGetData($pRead, 1)
    $pRead = 0
    SetExtended($nRead)
    If Not ($nRead = $nLen) Then SetError(2)
    Return $vStruct
EndFunc   ;==>_FileReadToStruct

_MP3GetID3v1Tag.rar

Edited by taz742
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...