Imports TagLib
Imports Gnome.Vfs
Public Class ReadFromUri
Public Shared Sub Write(name As String, value As Object)
Console.WriteLine("{0,20}: {1}", name, If(value Is Nothing, "", value))
End Sub
Public Shared Sub Write(name As String, values As String())
Console.WriteLine("{0,20}: {1}", name, If(values Is Nothing, "", [String].Join(vbLf & " ", values)))
End Sub
Public Shared Sub Main(args As String())
If args.Length = 0 Then
Console.[Error].WriteLine("USAGE: mono ReadFromUri.exe PATH [...]")
Return
End If
Gnome.Vfs.Vfs.Initialize()
Dim start As DateTime = DateTime.Now
Dim songs_read As Integer = 0
Try
For Each path As String In args
Dim uri As String = path
Console.WriteLine(uri)
Dim file As TagLib.File = Nothing
Try
Dim file_info As New System.IO.FileInfo(uri)
uri = Gnome.Vfs.Uri.GetUriFromLocalPath(file_info.FullName)
Catch
End Try
Try
file = TagLib.File.Create(New VfsFileAbstraction(uri))
Catch generatedExceptionName As TagLib.UnsupportedFormatException
Console.WriteLine("UNSUPPORTED FILE: " & uri)
Console.WriteLine([String].Empty)
Console.WriteLine("---------------------------------------")
Console.WriteLine([String].Empty)
Continue Try
End Try
Console.WriteLine("Tags on disk: " + file.TagTypesOnDisk)
Console.WriteLine("Tags in object: " + file.TagTypes)
Console.WriteLine([String].Empty)
Write("Grouping", file.Tag.Grouping)
Write("Title", file.Tag.Title)
Write("TitleSort", file.Tag.TitleSort)
Write("Album Artists", file.Tag.AlbumArtists)
Write("Album Artists Sort", file.Tag.AlbumArtistsSort)
Write("Performers", file.Tag.Performers)
Write("Performers Sort", file.Tag.PerformersSort)
Write("Composers", file.Tag.Composers)
Write("Composers Sort", file.Tag.ComposersSort)
Write("Conductor", file.Tag.Conductor)
Write("Album", file.Tag.Album)
Write("Album Sort", file.Tag.AlbumSort)
Write("Comment", file.Tag.Comment)
Write("Copyright", file.Tag.Copyright)
Write("Genres", file.Tag.Genres)
Write("BPM", file.Tag.BeatsPerMinute)
Write("Year", file.Tag.Year)
Write("Track", file.Tag.Track)
Write("TrackCount", file.Tag.TrackCount)
Write("Disc", file.Tag.Disc)
Write("DiscCount", file.Tag.DiscCount)
Console.WriteLine("Lyrics:" & vbLf + file.Tag.Lyrics & vbLf)
Console.WriteLine("Media Types: " + file.Properties.MediaTypes & vbLf)
For Each codec As TagLib.ICodec In file.Properties.Codecs
Dim acodec As TagLib.IAudioCodec = TryCast(codec, TagLib.IAudioCodec)
Dim vcodec As TagLib.IVideoCodec = TryCast(codec, TagLib.IVideoCodec)
If acodec IsNot Nothing AndAlso (acodec.MediaTypes And TagLib.MediaTypes.Audio) <> TagLib.MediaTypes.None Then
Console.WriteLine("Audio Properties : " + acodec.Description)
Console.WriteLine("Bitrate: " + acodec.AudioBitrate)
Console.WriteLine("SampleRate: " + acodec.AudioSampleRate)
Console.WriteLine("Channels: " + acodec.AudioChannels & vbLf)
End If
If vcodec IsNot Nothing AndAlso (vcodec.MediaTypes And TagLib.MediaTypes.Video) <> TagLib.MediaTypes.None Then
Console.WriteLine("Video Properties : " + vcodec.Description)
Console.WriteLine("Width: " + vcodec.VideoWidth)
Console.WriteLine("Height: " + vcodec.VideoHeight & vbLf)
End If
Next
If file.Properties.MediaTypes <> TagLib.MediaTypes.None Then
Console.WriteLine("Length: " + file.Properties.Duration & vbLf)
End If
Dim pictures As IPicture() = file.Tag.Pictures
Console.WriteLine("Embedded Pictures: " + pictures.Length)
For Each picture As IPicture In pictures
Console.WriteLine(picture.Description)
Console.WriteLine(" MimeType: " + picture.MimeType)
Console.WriteLine(" Size: " + picture.Data.Count)
Console.WriteLine(" Type: " + picture.Type)
Next
Console.WriteLine([String].Empty)
Console.WriteLine("---------------------------------------")
Console.WriteLine([String].Empty)
songs_read += 1
Next
Finally
Gnome.Vfs.Vfs.Shutdown()
End Try
Dim [end] As DateTime = DateTime.Now
Console.WriteLine("Total running time: " & ([end] - start))
Console.WriteLine("Total files read: " & songs_read)
If songs_read > 0 Then
Console.WriteLine("Average time per file: " & Convert.ToString(New TimeSpan(([end] - start).Ticks \ songs_read)))
End If
End Sub
End Class
Public Class VfsFileAbstraction
Implements TagLib.File.IFileAbstraction
Private m_name As String
Public Sub New(file As String)
m_name = file
End Sub
Public ReadOnly Property Name() As String
Get
Return m_name
End Get
End Property
Public ReadOnly Property ReadStream() As System.IO.Stream
Get
Return New VfsStream(Name, System.IO.FileMode.Open)
End Get
End Property
Public ReadOnly Property WriteStream() As System.IO.Stream
Get
Return New VfsStream(Name, System.IO.FileMode.Open)
End Get
End Property
Public Sub CloseStream(stream As System.IO.Stream)
stream.Close()
End Sub
End Class