VB .NET  - Decifrando detalhes de arquivos MP3


Os arquivos MP3 são um padrão e revolucionaram nosso relacionamento com a música. Devido ao seu tamanho, fica fácil carregar centenas de arquivos em um pequeno dispositivo como um pen-drive para ouvir em qualquer lugar. Quem imaginaria tal cenário a uns 15 anos atrás...

Vou apresentar uma singela aplicação que permite obter alguns detalhes como nome do artista, título da música, nome do álbum e ano de gravação, de arquivos padrão MP3 usando o Visual Basic 2005 Express.

Vamos então direto ao que interessa.

A interface da nossa aplicação é muito simples; ela tem o seguinte leiaute:

Com apenas dois controles ListBox , um botão de comando e uma caixa de texto temos a interface pronta. Pode ser melhorada , talvez com um componente OpenFileDialog , mas o quis ser o mais simples possível.

Abra o VB 2005 Express e crie um novo projeto do tipo Windows Application usando a linguagem Visual Basic com o nome decifa_MP3 ou algo parecido.

No menu Project selecione a opção Add Class e informe o nome mp3.vb ao arquivo. Em seguida vamos criar uma classe chamada  MP3TagData com o seguinte código.

Imports System.io
 

Public Class MP3TagData

Private _Artista As String

Private _Titulo As String

Private _Album As String

Private _Ano As String


Public
ReadOnly Property Artista() As
String

Get

Return _Artista

End Get

End Property


Public
ReadOnly Property Titulo() As String

Get

Return _Titulo

End Get

End Property

 

Public ReadOnly Property Album() As String

Get

Return _Album

End Get

End Property


Public
ReadOnly Property Ano() As
String

Get

Return _Ano

End Get

End Property


Public
Sub ReadFromFile(ByVal filename As String
)

' Limpa valores

Me._Titulo = ""

Me._Artista = ""

Me._Album = ""

Me._Ano = ""

Dim fs As New FileStream(filename, FileMode.Open)

'----------------------------------

' Le a tag MP3.

'----------------------------------

fs.Seek(0 - 128, SeekOrigin.End)

Dim Tag(2) As Byte

fs.Read(Tag, 0, 3)

'----------------------------------

' Verifa se a tag existe.

'----------------------------------

If System.Text.Encoding.ASCII.GetString(Tag).Trim() = "TAG" Then

   ' Titulo.

Me._Titulo = GetTagData(fs, 30)

' Artista.

Me._Artista = GetTagData(fs, 30)

' Album.

Me._Album = GetTagData(fs, 30)

' Ano.

Me._Ano = GetTagData(fs, 4)

End If

fs.Close()

End Sub


Private
Function GetTagData(ByVal stream As Stream, ByVal length As Integer) As
String

'---------------------------

' Le os dados.

'---------------------------

Dim Bytes(length - 1) As Byte

stream.Read(Bytes, 0, length)

Dim TagData As String = System.Text.Encoding.ASCII.GetString(Bytes)

' Trim nulls.

Dim TrimChars() As Char = {Char.Parse(" "), Char.Parse(vbNullChar)}

TagData = TagData.Trim(TrimChars)

Return TagData

End Function


End
Class

Nossa classe possui  4 membros privados:


Private
_Artista As
String

Private _Titulo As String

Private _Album As String

Private _Ano As String

 

Possui também 4 propriedades públicas:

  1. Artista

  2. Titulo

  3. Album

  4. Ano

Que são as informações que vamos obter do arquivo MP3

 

Temos  também os seguintes métodos:

  • ReadFromFile - que abre o arquivo mp3 e obtêm os valores das tags para titulo, artista, album e ano;

  • GetTagData - que extrais os valores acima do arquivo.

 

Na interface temos o código do botão - Exibir Relação de músicas - que preenche o listbox com a relação de músicas , e, é mostrado a seguir:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 

Dim di As New IO.DirectoryInfo(txtMusicas.Text)

Dim diar1 As IO.FileInfo() = di.GetFiles()

Dim dra As IO.FileInfo


For Each dra In diar1

    ListBox1.Items.Add(dra)

Next

   Label2.Text = "Total de musicas = " + ListBox1.Items.Count.ToString

End Sub

 

Nota: Devemos informar o nome do diretório informando o local de localização dos arquivos MP3. (Use um componente OpenFileDialog para automatizar esta tarefa)

Veja o artigo: VB.NET -  Criando um Slide Show onde eu mostro como usar este recurso.

Após preencher o ListBox com a relação de músicas o usuário poderá selecionar qualquer uma delas e obter os detalhes no segundo ListBox. Para isso estou usando o evento ListBox1_SelectedIndexChanged do ListBox cujo código é exibido abaixo:

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged


'instancia a classe
Dim
MP3Tag As New MP3TagData

'------------------------------------------

' Caminho completo e nome do arquivo.MP3

'------------------------------------------

Dim caminho As String = txtMusicas.Text + ListBox1.Text


MP3Tag.ReadFromFile(caminho)


ListBox2.Items.Clear()

ListBox2.Items.Add("Album: " & MP3Tag.Album)

ListBox2.Items.Add("Artista: " & MP3Tag.Artista)

ListBox2.Items.Add("Música: " & MP3Tag.Titulo)

ListBox2.Items.Add("Ano: " & MP3Tag.Ano)

End Sub

 

Com apenas isso já podemos obter os detalhes dos arquivos MP3. Basta executar o projeto e iremos obter:

Podemos melhorar a interface usando os antigos componentes COM  DirListBox , FileListBox e DriveListBox do VB6. No próximo artigo eu vou mostrar como você pode referenciar estes componentes no VB 2005 sem problema.

Ps: Que tal incrementar o programa criando uma rotina para tocar os arquivos MP3 ???

Eu sei é apenas Visual Basic , mas eu gosto...


José Carlos Macoratti