Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Mp3 Deep Analyzer - Mp3.vb

Mp3.vb

Caricato da: Totem
Scarica il programma completo

  1. Imports System.Text.UTF8Encoding
  2. Namespace Mp3
  3.     Public Enum Mp3Genre
  4.         Blues
  5.         Classic_Rock
  6.         Country
  7.         Dance
  8.         Disco
  9.         Funk
  10.         Grunge
  11.         Hip_Hop
  12.         Jazz
  13.         Metal
  14.         New_Age
  15.         Oldies
  16.         Other
  17.         Pop
  18.         R_And_B
  19.         Rap
  20.         Reggae
  21.         Rock
  22.         Techno
  23.         Industrial
  24.         Alternative
  25.         Ska
  26.         Death_Metal
  27.         Pranks
  28.         Soundtrack
  29.         Euro_Techno
  30.         Ambient
  31.         Trip_Hop
  32.         Vocal
  33.         Jazz_Funk
  34.         Fusion
  35.         Trance
  36.         Classical
  37.         Instrumental
  38.         Acid
  39.         House
  40.         Game
  41.         Sound_Clip
  42.         Gospel
  43.         Noise
  44.         AlternRock
  45.         Bass
  46.         Soul
  47.         Punk
  48.         Space
  49.         Meditative
  50.         Instrumental_Pop
  51.         Instrumental_Rock
  52.         Ethnic
  53.         Gothic
  54.         Darkwave
  55.         Techno_Industrial
  56.         Electronic
  57.         Pop_Folk
  58.         Eurodance
  59.         Dream
  60.         Southern_Rock
  61.         Comedy
  62.         Cult
  63.         Gangsta
  64.         Top_40
  65.         Christian_Rap
  66.         Pop_Funk
  67.         Jungle
  68.         Native_American
  69.         Cabaret
  70.         New_Wave
  71.         Psychadelic
  72.         Rave
  73.         Showtunes
  74.         Trailer
  75.         Lo_Fi
  76.         Tribal
  77.         Acid_Punk
  78.         Acid_Jazz
  79.         Polka
  80.         Retro
  81.         Musical
  82.         Rock_And_Roll
  83.         Hard_Rock
  84.     End Enum
  85.  
  86.     Namespace ID3v1
  87.         Public Class General
  88.             Public Shared Function GetString(ByVal Bytes As Byte()) As String
  89.                 Dim Result As New System.Text.StringBuilder
  90.  
  91.                 For Each B As Byte In Bytes
  92.                     If B = 0 Then
  93.                         Exit For
  94.                     Else
  95.                         Result.Append(Chr(B))
  96.                     End If
  97.                 Next
  98.  
  99.                 Return Result.ToString
  100.             End Function
  101.  
  102.             Public Shared Function GetBytes(ByVal S As String, ByVal Len As Int32) As Byte()
  103.                 Dim Buffer(Len - 1) As Byte
  104.  
  105.                 For I As Int16 = 0 To Len - 1
  106.                     Buffer(I) = 0
  107.                 Next
  108.  
  109.                 Dim Str() As Byte
  110.  
  111.                 If S Is Nothing Then
  112.                     Str = New Byte() {0}
  113.                 Else
  114.                     Str = UTF8.GetBytes(S)
  115.                 End If
  116.  
  117.                 If Str.Length < Len Then
  118.                     Array.ConstrainedCopy(Str, 0, Buffer, 0, Str.Length)
  119.                 Else
  120.                     Array.ConstrainedCopy(Str, 0, Buffer, 0, Len)
  121.                 End If
  122.  
  123.  
  124.                 Return Buffer
  125.             End Function
  126.         End Class
  127.  
  128.         Public Class ID3TagV1
  129.             Private _Title As String
  130.             Private _Artist As String
  131.             Private _Album As String
  132.             Private _Year As String
  133.             Private _Comment As String
  134.             Private _Genre As Mp3Genre
  135.  
  136.             Public Property Title() As String
  137.                 Get
  138.                     Return _Title
  139.                 End Get
  140.                 Set(ByVal Value As String)
  141.                     _Title = Value
  142.                 End Set
  143.             End Property
  144.  
  145.             Public Property Artist() As String
  146.                 Get
  147.                     Return _Artist
  148.                 End Get
  149.                 Set(ByVal Value As String)
  150.                     _Artist = Value
  151.                 End Set
  152.             End Property
  153.  
  154.             Public Property Album() As String
  155.                 Get
  156.                     Return _Album
  157.                 End Get
  158.                 Set(ByVal Value As String)
  159.                     _Album = Value
  160.                 End Set
  161.             End Property
  162.  
  163.             Public Property Year() As String
  164.                 Get
  165.                     Return _Year
  166.                 End Get
  167.                 Set(ByVal Value As String)
  168.                     _Year = Value
  169.                 End Set
  170.             End Property
  171.  
  172.             Public Property Comment() As String
  173.                 Get
  174.                     Return _Comment
  175.                 End Get
  176.                 Set(ByVal Value As String)
  177.                     _Comment = Value
  178.                 End Set
  179.             End Property
  180.  
  181.             Public Property Genre() As Mp3Genre
  182.                 Get
  183.                     Return _Genre
  184.                 End Get
  185.                 Set(ByVal Value As Mp3Genre)
  186.                     _Genre = Value
  187.                 End Set
  188.             End Property
  189.  
  190.             Public Function Read(ByVal File As String) As Boolean
  191.                 Dim Stream As New IO.FileStream(File, IO.FileMode.Open)
  192.                 Dim Buffer(127) As Byte
  193.  
  194.                 Stream.Seek(-128, IO.SeekOrigin.End)
  195.                 Stream.Read(Buffer, 0, 128)
  196.                 Stream.Close()
  197.  
  198.                 If Not (Buffer(0) = Asc("T") And Buffer(1) = Asc("A") And Buffer(2) = Asc("G")) Then
  199.                     Return False
  200.                 End If
  201.  
  202.                 Dim Temp() As Byte
  203.  
  204.                 ReDim Temp(29)
  205.                 Array.ConstrainedCopy(Buffer, 3, Temp, 0, 30)
  206.                 Me.Title = General.GetString(Temp)
  207.  
  208.                 Array.ConstrainedCopy(Buffer, 33, Temp, 0, 30)
  209.                 Me.Artist = General.GetString(Temp)
  210.  
  211.                 Array.ConstrainedCopy(Buffer, 63, Temp, 0, 30)
  212.                 Me.Album = General.GetString(Temp)
  213.  
  214.                 ReDim Temp(3)
  215.                 Array.ConstrainedCopy(Buffer, 93, Temp, 0, 4)
  216.                 Me.Year = General.GetString(Temp)
  217.  
  218.                 ReDim Temp(29)
  219.                 Array.ConstrainedCopy(Buffer, 97, Temp, 0, 30)
  220.                 Me.Comment = General.GetString(Temp)
  221.  
  222.                 Me.Genre = Buffer(127)
  223.  
  224.                 Return True
  225.             End Function
  226.  
  227.             Public Sub Write(ByVal File As String)
  228.                 Dim Stream As New IO.FileStream(File, IO.FileMode.Open)
  229.                 Dim Buffer(127) As Byte
  230.  
  231.                 Stream.Seek(-128, IO.SeekOrigin.End)
  232.                 Stream.Read(Buffer, 0, 128)
  233.  
  234.                 If Buffer(0) = Asc("T") And Buffer(1) = Asc("A") And Buffer(2) = Asc("G") Then
  235.                     Stream.Seek(-128, IO.SeekOrigin.End)
  236.                 Else
  237.                     Stream.Seek(0, IO.SeekOrigin.End)
  238.                 End If
  239.  
  240.                 With Stream
  241.                     .WriteByte(Asc("T"))
  242.                     .WriteByte(Asc("A"))
  243.                     .WriteByte(Asc("G"))
  244.                     .Write(General.GetBytes(Me.Title, 30), 0, 30)
  245.                     .Write(General.GetBytes(Me.Artist, 30), 0, 30)
  246.                     .Write(General.GetBytes(Me.Album, 30), 0, 30)
  247.                     .Write(General.GetBytes(Me.Year, 4), 0, 4)
  248.                     .Write(General.GetBytes(Me.Comment, 30), 0, 30)
  249.                     .WriteByte(Me.Genre)
  250.                     .Close()
  251.                 End With
  252.             End Sub
  253.         End Class
  254.     End Namespace
  255.  
  256.     Namespace ID3v2
  257.         Friend Class Functions
  258.             Friend Shared Function SizeToBytes(ByVal Number As Int32) As Byte()
  259.                 Dim Buffer(3) As Byte
  260.  
  261.                 For Index As SByte = 3 To 0 Step -1
  262.                     For E As SByte = 6 To 0 Step -1
  263.                         If Number >= 2 ^ (Index * 7 + E) Then
  264.                             Buffer(3 - Index) += 2 ^ E
  265.                             Number -= 2 ^ (Index * 7 + E)
  266.                         End If
  267.                     Next
  268.                 Next
  269.  
  270.                 Return Buffer
  271.             End Function
  272.  
  273.             Friend Shared Function BytesToSize(ByVal Bytes() As Byte) As Int32
  274.                 Dim Result As Int32
  275.  
  276.                 For Index As SByte = 3 To 0 Step -1
  277.                     For E As SByte = 6 To 0 Step -1
  278.                         If (Bytes(3 - Index) And 2 ^ E) = 2 ^ E Then
  279.                             Result += 2 ^ (Index * 7 + E)
  280.                         End If
  281.                     Next
  282.                 Next
  283.  
  284.                 Return Result
  285.             End Function
  286.  
  287.             Friend Shared Function ReadString(ByVal OpenStream As IO.BinaryReader) As String
  288.                 Dim B As Byte
  289.                 Dim Temp As New System.Text.StringBuilder
  290.                 B = OpenStream.ReadByte
  291.                 Do While B > 0
  292.                     Temp.Append(Chr(B))
  293.                     B = OpenStream.ReadByte
  294.                 Loop
  295.  
  296.                 Return Temp.ToString
  297.             End Function
  298.  
  299.             Friend Shared Sub WriteString(ByVal OpenStream As IO.BinaryWriter, ByVal S As String, Optional ByVal Terminator As Boolean = True)
  300.                 For Each C As Char In S
  301.                     OpenStream.Write(C)
  302.                 Next
  303.                 If Terminator Then
  304.                     OpenStream.Write(CByte(0))
  305.                 End If
  306.             End Sub
  307.         End Class
  308.  
  309.         Public Class FrameHeader
  310.             <Flags()> _
  311.             Public Enum HeaderFlags
  312.                 PreserveFrame = 0
  313.                 PreserveFile = 1
  314.                 [ReadOnly] = 2
  315.                 Compression = 4
  316.                 Encryption = 8
  317.                 Grouping = 16
  318.             End Enum
  319.  
  320.             Private _Identifier As String
  321.             Private _DataSize As Int32
  322.             Private _Flags As HeaderFlags
  323.  
  324.             Public Property Identifier() As String
  325.                 Get
  326.                     Return _Identifier
  327.                 End Get
  328.                 Set(ByVal Value As String)
  329.                     _Identifier = Value
  330.                 End Set
  331.             End Property
  332.  
  333.             Public Property DataSize() As Int32
  334.                 Get
  335.                     Return _DataSize
  336.                 End Get
  337.                 Set(ByVal Value As Int32)
  338.                     _DataSize = Value
  339.                 End Set
  340.             End Property
  341.  
  342.             Public Property Flags() As HeaderFlags
  343.                 Get
  344.                     Return _Flags
  345.                 End Get
  346.                 Set(ByVal Value As HeaderFlags)
  347.                     _Flags = Value
  348.                 End Set
  349.             End Property
  350.  
  351.             Sub New(ByVal ID As String)
  352.                 Me.Identifier = ID
  353.             End Sub
  354.  
  355.             Sub New()
  356.  
  357.             End Sub
  358.  
  359.             Public Function Read(ByVal OpenStream As IO.BinaryReader) As Boolean
  360.                 Try
  361.                     Me.Identifier = OpenStream.ReadChars(4)
  362.                     Me.DataSize = Functions.BytesToSize(OpenStream.ReadBytes(4))
  363.  
  364.                     Dim Buffer() As Byte = OpenStream.ReadBytes(2)
  365.  
  366.                     'Primi 3 bit del byte 1
  367.                     If (Buffer(0) And 128) = 128 Then
  368.                         Me.Flags = Me.Flags Or HeaderFlags.PreserveFrame
  369.                     End If
  370.                     If (Buffer(0) And 64) = 64 Then
  371.                         Me.Flags = Me.Flags Or HeaderFlags.PreserveFile
  372.                     End If
  373.                     If (Buffer(0) And 32) = 32 Then
  374.                         Me.Flags = Me.Flags Or HeaderFlags.ReadOnly
  375.                     End If
  376.  
  377.                     'Primi 3 bit del byte 2
  378.                     If (Buffer(1) And 128) = 128 Then
  379.                         Me.Flags = Me.Flags Or HeaderFlags.Compression
  380.                     End If
  381.                     If (Buffer(1) And 64) = 64 Then
  382.                         Me.Flags = Me.Flags Or HeaderFlags.Encryption
  383.                     End If
  384.                     If (Buffer(1) And 32) = 32 Then
  385.                         Me.Flags = Me.Flags Or HeaderFlags.Grouping
  386.                     End If
  387.  
  388.                     Return True
  389.                 Catch ex As Exception
  390.                     Return False
  391.                 End Try
  392.             End Function
  393.  
  394.             Public Sub Write(ByVal OpenStream As IO.BinaryWriter)
  395.                 With OpenStream
  396.                     Functions.WriteString(OpenStream, Me.Identifier, False)
  397.                     .Write(Functions.SizeToBytes(Me.DataSize))
  398.  
  399.                     Dim Buffer(1) As Byte
  400.  
  401.                     If (Me.Flags And HeaderFlags.PreserveFrame) = HeaderFlags.PreserveFrame Then
  402.                         Buffer(0) += 128
  403.                     End If
  404.                     If (Me.Flags And HeaderFlags.PreserveFile) = HeaderFlags.PreserveFile Then
  405.                         Buffer(0) += 64
  406.                     End If
  407.                     If (Me.Flags And HeaderFlags.ReadOnly) = HeaderFlags.ReadOnly Then
  408.                         Buffer(0) += 32
  409.                     End If
  410.  
  411.                     If (Me.Flags And HeaderFlags.Compression) = HeaderFlags.Compression Then
  412.                         Buffer(1) += 128
  413.                     End If
  414.                     If (Me.Flags And HeaderFlags.Encryption) = HeaderFlags.Encryption Then
  415.                         Buffer(1) += 64
  416.                     End If
  417.                     If (Me.Flags And HeaderFlags.Grouping) = HeaderFlags.Grouping Then
  418.                         Buffer(1) += 32
  419.                     End If
  420.  
  421.                     .Write(Buffer)
  422.                 End With
  423.             End Sub
  424.         End Class
  425.  
  426.         Public MustInherit Class Frame
  427.             Protected Const Null As Byte = 0
  428.  
  429.             Private _Header As FrameHeader
  430.             Private _Description As String
  431.             Protected Shared _DefaultDescriptions As New Dictionary(Of String, String)
  432.  
  433.             Public Property Header() As FrameHeader
  434.                 Get
  435.                     Return _Header
  436.                 End Get
  437.                 Set(ByVal value As FrameHeader)
  438.                     _Header = value
  439.                 End Set
  440.             End Property
  441.  
  442.             Public ReadOnly Property Description() As String
  443.                 Get
  444.                     Return _Description
  445.                 End Get
  446.             End Property
  447.  
  448.             Public ReadOnly Property Size() As Int32
  449.                 Get
  450.                     Me.CalculateSize()
  451.                     Return 10 + Me.Header.DataSize
  452.                 End Get
  453.             End Property
  454.  
  455.             Protected Shared ReadOnly Property DefaultDescriptions() As Dictionary(Of String, String)
  456.                 Get
  457.                     Return _DefaultDescriptions
  458.                 End Get
  459.             End Property
  460.  
  461.             Shared Sub New()
  462.                 With DefaultDescriptions
  463.                     .Add("TALB", "Album")
  464.                     .Add("TCOM", "Compositore")
  465.                     .Add("TCON", "Genere Musicale")
  466.                     .Add("TCOP", "Copyright (C)")
  467.                     .Add("TDAT", "Data registrazione")
  468.                     .Add("TENC", "Prodotto da")
  469.                     .Add("TEXT", "Autore testi")
  470.                     .Add("TIME", "Durata")
  471.                     .Add("TIT1", "Tipologia")
  472.                     .Add("TIT2", "Titolo")
  473.                     .Add("TIT3", "Sottotitolo")
  474.                     .Add("TKEY", "Tonalità")
  475.                     .Add("TLAN", "Lingua")
  476.                     .Add("TPE1", "Artista principale")
  477.                     .Add("TPE2", "Orchestra/Band")
  478.                     .Add("TPE3", "Direttore d'Orchestra")
  479.                     .Add("TPE4", "Remixato da")
  480.                     .Add("TPUB", "Casa discografica")
  481.                     .Add("TRCK", "Traccia")
  482.                     .Add("TSRC", "Codice registrazione")
  483.                     .Add("TSSE", "Hardware/Software utilizzati")
  484.                     .Add("TYER", "Anno registrazione")
  485.                     .Add("WCOM", "Home page CD")
  486.                     .Add("WCOP", "Termini Copyright")
  487.                     .Add("WOAR", "Sito ufficiale")
  488.                 End With
  489.             End Sub
  490.  
  491.             Protected Sub SetDescription()
  492.                 If (Not String.IsNullOrEmpty(Me.Header.Identifier)) AndAlso DefaultDescriptions.ContainsKey(Me.Header.Identifier) Then
  493.                     _Description = DefaultDescriptions(Me.Header.Identifier)
  494.                 End If
  495.             End Sub
  496.  
  497.             Friend Sub Initialize(ByVal Header As FrameHeader)
  498.                 Me.Header = Header
  499.                 Me.SetDescription()
  500.             End Sub
  501.  
  502.             Protected MustOverride Sub CalculateSize()
  503.             Public MustOverride Function Read(ByVal OpenStream As IO.BinaryReader) As Boolean
  504.             Public MustOverride Sub Write(ByVal OpenStream As IO.BinaryWriter)
  505.         End Class
  506.  
  507.  
  508.         Public Class TextFrame
  509.             Inherits Frame
  510.  
  511.             Private _Text As String
  512.  
  513.             Public Property Text() As String
  514.                 Get
  515.                     Return _Text
  516.                 End Get
  517.                 Set(ByVal value As String)
  518.                     _Text = value
  519.                 End Set
  520.             End Property
  521.  
  522.             Sub New(ByVal ID As String)
  523.                 Me.Header = New FrameHeader
  524.                 Me.Header.Identifier = ID
  525.                 Me.SetDescription()
  526.             End Sub
  527.  
  528.             Sub New(ByVal Header As FrameHeader)
  529.                 Me.Header = Header
  530.                 Me.SetDescription()
  531.             End Sub
  532.  
  533.             Sub New()
  534.             End Sub
  535.  
  536.             Protected Overrides Sub CalculateSize()
  537.                 Me.Header.DataSize = Me.Text.Length + 2
  538.             End Sub
  539.  
  540.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  541.                 Try
  542.                     'Salta il byte di codifica
  543.                     OpenStream.ReadByte()
  544.                     'Legge il testo
  545.                     Me.Text = Functions.ReadString(OpenStream)
  546.                     Return True
  547.                 Catch ex As Exception
  548.                     Return False
  549.                 End Try
  550.             End Function
  551.  
  552.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  553.                 Me.CalculateSize()
  554.                 Me.Header.Write(OpenStream)
  555.  
  556.                 OpenStream.Write(CByte(0))
  557.                 Functions.WriteString(OpenStream, Me.Text)
  558.             End Sub
  559.         End Class
  560.  
  561.         Public Class InvolvedPeopleFrame
  562.             Inherits Frame
  563.  
  564.             Private _PeopleList As New Dictionary(Of String, String)
  565.  
  566.             Public ReadOnly Property PeopleList() As Dictionary(Of String, String)
  567.                 Get
  568.                     Return _PeopleList
  569.                 End Get
  570.             End Property
  571.  
  572.             Public Shared ReadOnly Property DefaultID() As String
  573.                 Get
  574.                     Return "IPLS"
  575.                 End Get
  576.             End Property
  577.  
  578.             Sub New(ByVal Header As FrameHeader)
  579.                 Me.Header = Header
  580.                 Me.SetDescription()
  581.             End Sub
  582.  
  583.             Sub New(ByVal ID As String)
  584.                 Me.New(New FrameHeader(ID))
  585.             End Sub
  586.  
  587.             Sub New()
  588.                 Me.New(DefaultID)
  589.             End Sub
  590.  
  591.             Protected Overrides Sub CalculateSize()
  592.                 Me.Header.DataSize = 0
  593.                 For Each K As String In Me.PeopleList.Keys
  594.                     Me.Header.DataSize += (K.Length + Me.PeopleList(K).Length + 2)
  595.                 Next
  596.             End Sub
  597.  
  598.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  599.                 Try
  600.                     Dim Buffer() As Byte = OpenStream.ReadBytes(Me.Header.DataSize)
  601.                     Dim StringBuffer As New List(Of String)
  602.                     Dim Temp As New System.Text.StringBuilder
  603.  
  604.                     For I As Int32 = 0 To Buffer.Length - 1
  605.                         If Buffer(I) = 0 Then
  606.                             StringBuffer.Add(Temp.ToString)
  607.                             Temp.Remove(0, Temp.Length)
  608.                         Else
  609.                             Temp.Append(Chr(Buffer(I)))
  610.                         End If
  611.                     Next
  612.  
  613.                     If StringBuffer.Count Mod 2 <> 0 Then
  614.                         StringBuffer.Add("")
  615.                     End If
  616.  
  617.                     Me.PeopleList.Clear()
  618.                     For I As Int32 = 0 To StringBuffer.Count - 1 Step 2
  619.                         Me.PeopleList.Add(StringBuffer(I), StringBuffer(I + 1))
  620.                     Next
  621.                     Return True
  622.                 Catch Ex As Exception
  623.                     Return False
  624.                 End Try
  625.             End Function
  626.  
  627.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  628.                 Me.CalculateSize()
  629.                 Me.Header.Write(OpenStream)
  630.  
  631.                 For Each K As String In Me.PeopleList.Keys
  632.                     Functions.WriteString(OpenStream, K)
  633.                     Functions.WriteString(OpenStream, Me.PeopleList(K))
  634.                 Next
  635.             End Sub
  636.         End Class
  637.  
  638.         Public Class SynchronizedLyricTextFrame
  639.             Inherits Frame
  640.  
  641.             Public Enum TimeStampFormat As Byte
  642.                 Frames = 1
  643.                 Milliseconds = 2
  644.             End Enum
  645.  
  646.             Public Enum TextPurpose As Byte
  647.                 Unspcified
  648.                 SongText
  649.                 TransposedText
  650.                 Movement
  651.                 [Event]
  652.                 Chord
  653.                 Other
  654.             End Enum
  655.  
  656.             Public Class SyncText
  657.                 Private _Text As String
  658.                 Private _Time As Int32
  659.  
  660.                 Public Property Text() As String
  661.                     Get
  662.                         Return _Text
  663.                     End Get
  664.                     Set(ByVal Value As String)
  665.                         _Text = Value
  666.                     End Set
  667.                 End Property
  668.  
  669.                 Public Property Time() As Int32
  670.                     Get
  671.                         Return _Time
  672.                     End Get
  673.                     Set(ByVal Value As Int32)
  674.                         _Time = Value
  675.                     End Set
  676.                 End Property
  677.  
  678.                 Sub New(ByVal Text As String, ByVal Time As Int32)
  679.                     Me.Text = Text
  680.                     Me.Time = Time
  681.                 End Sub
  682.  
  683.                 Sub New()
  684.  
  685.                 End Sub
  686.             End Class
  687.  
  688.             Public Class SyncTextList
  689.                 Inherits List(Of SyncText)
  690.  
  691.                 Public Overloads Sub Add(ByVal Text As String, ByVal Time As Int32)
  692.                     Me.Add(New SyncText(Text, Time))
  693.                 End Sub
  694.             End Class
  695.  
  696.             <VBFixedString(3)> _
  697.             Private _Language As String
  698.             Private _TimeStamp As TimeStampFormat
  699.             Private _ContentType As TextPurpose
  700.             Private _ContentDescription As String
  701.             Private _SyncTextChunks As New SyncTextList
  702.  
  703.             Public Property Language() As String
  704.                 Get
  705.                     Return _Language
  706.                 End Get
  707.                 Set(ByVal Value As String)
  708.                     _Language = Value
  709.                 End Set
  710.             End Property
  711.  
  712.             Public Property TimeStamp() As TimeStampFormat
  713.                 Get
  714.                     Return _TimeStamp
  715.                 End Get
  716.                 Set(ByVal Value As TimeStampFormat)
  717.                     _TimeStamp = Value
  718.                 End Set
  719.             End Property
  720.  
  721.             Public Property ContentType() As TextPurpose
  722.                 Get
  723.                     Return _ContentType
  724.                 End Get
  725.                 Set(ByVal Value As TextPurpose)
  726.                     _ContentType = Value
  727.                 End Set
  728.             End Property
  729.  
  730.             Public Property ContentDescription() As String
  731.                 Get
  732.                     Return _ContentDescription
  733.                 End Get
  734.                 Set(ByVal Value As String)
  735.                     _ContentDescription = Value
  736.                 End Set
  737.             End Property
  738.  
  739.             Public ReadOnly Property SyncTextChunks() As SyncTextList
  740.                 Get
  741.                     Return _SyncTextChunks
  742.                 End Get
  743.             End Property
  744.  
  745.             Public Shared ReadOnly Property DefaultID() As String
  746.                 Get
  747.                     Return "SYLT"
  748.                 End Get
  749.             End Property
  750.  
  751.             Sub New(ByVal Header As FrameHeader)
  752.                 Me.Header = Header
  753.                 Me.SetDescription()
  754.  
  755.                 Me.Language = "ITA"
  756.                 Me.TimeStamp = TimeStampFormat.Milliseconds
  757.                 Me.ContentDescription = ""
  758.             End Sub
  759.  
  760.             Sub New(ByVal ID As String)
  761.                 Me.New(New FrameHeader(ID))
  762.             End Sub
  763.  
  764.             Sub New()
  765.                 Me.New(DefaultID)
  766.             End Sub
  767.  
  768.             Protected Overrides Sub CalculateSize()
  769.                 Me.Header.DataSize = 1 + Me.Language.Length + 1 + 1 + Me.ContentDescription.Length + 1
  770.                 For Each T As SyncText In Me.SyncTextChunks
  771.                     Me.Header.DataSize += T.Text.Length + 1 + 4
  772.                 Next
  773.             End Sub
  774.  
  775.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  776.                 Try
  777.                     'Codifica
  778.                     OpenStream.ReadByte()
  779.  
  780.                     Me.Language = OpenStream.ReadChars(3)
  781.                     Me.TimeStamp = OpenStream.ReadByte
  782.                     Me.ContentType = OpenStream.ReadByte
  783.                     Me.ContentDescription = Functions.ReadString(OpenStream)
  784.  
  785.                     Dim ChunkSize As Int32 = Me.Header.DataSize - 6 - (Me.ContentDescription.Length + 1)
  786.                     Dim Start As Int32 = OpenStream.BaseStream.Position
  787.  
  788.                     Me.SyncTextChunks.Clear()
  789.                     Do While OpenStream.BaseStream.Position < Start + ChunkSize
  790.                         Dim T As New SyncText
  791.                         T.Text = Functions.ReadString(OpenStream)
  792.                         T.Time = OpenStream.ReadInt32
  793.                         Me.SyncTextChunks.Add(T)
  794.                     Loop
  795.  
  796.                     Return True
  797.                 Catch ex As Exception
  798.                     Return False
  799.                 End Try
  800.             End Function
  801.  
  802.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  803.                 Me.CalculateSize()
  804.                 Me.Header.Write(OpenStream)
  805.  
  806.                 'Codifica
  807.                 OpenStream.Write(Null)
  808.                 Functions.WriteString(OpenStream, Me.Language, False)
  809.                 OpenStream.Write(Me.TimeStamp)
  810.                 OpenStream.Write(Me.ContentType)
  811.                 Functions.WriteString(OpenStream, Me.ContentDescription)
  812.  
  813.                 For Each T As SyncText In Me.SyncTextChunks
  814.                     Functions.WriteString(OpenStream, T.Text)
  815.                     OpenStream.Write(T.Time)
  816.                 Next
  817.             End Sub
  818.         End Class
  819.  
  820.         Public Class CommentFrame
  821.             Inherits Frame
  822.  
  823.             <VBFixedString(3)> _
  824.             Private _Language As String
  825.             Private _Text As String
  826.             Private _ContentDescription As String
  827.  
  828.             Public Property Language() As String
  829.                 Get
  830.                     Return _Language
  831.                 End Get
  832.                 Set(ByVal Value As String)
  833.                     _Language = Value
  834.                 End Set
  835.             End Property
  836.  
  837.             Public Property Text() As String
  838.                 Get
  839.                     Return _Text
  840.                 End Get
  841.                 Set(ByVal Value As String)
  842.                     _Text = Value
  843.                 End Set
  844.             End Property
  845.  
  846.             Public Property ContentDescription() As String
  847.                 Get
  848.                     Return _ContentDescription
  849.                 End Get
  850.                 Set(ByVal Value As String)
  851.                     _ContentDescription = Value
  852.                 End Set
  853.             End Property
  854.  
  855.             Public Shared ReadOnly Property DefaultID() As String
  856.                 Get
  857.                     Return "COMM"
  858.                 End Get
  859.             End Property
  860.  
  861.             Sub New(ByVal Header As FrameHeader)
  862.                 Me.Header = Header
  863.                 Me.SetDescription()
  864.  
  865.                 Me.Language = "ITA"
  866.                 Me.Text = ""
  867.                 Me.ContentDescription = ""
  868.             End Sub
  869.  
  870.             Sub New(ByVal ID As String)
  871.                 Me.New(New FrameHeader(ID))
  872.             End Sub
  873.  
  874.             Sub New()
  875.                 Me.New(DefaultID)
  876.             End Sub
  877.  
  878.             Protected Overrides Sub CalculateSize()
  879.                 Me.Header.DataSize = 1 + 3 + Me.Text.Length + 1 + Me.ContentDescription.Length + 1
  880.             End Sub
  881.  
  882.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  883.                 Try
  884.                     'Salta il byte di codifica
  885.                     OpenStream.ReadByte()
  886.                     Me.Language = OpenStream.ReadChars(3)
  887.                     Me.ContentDescription = Functions.ReadString(OpenStream)
  888.                     Me.Text = Functions.ReadString(OpenStream)
  889.  
  890.                     Return True
  891.                 Catch ex As Exception
  892.                     Return False
  893.                 End Try
  894.             End Function
  895.  
  896.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  897.                 Me.CalculateSize()
  898.                 Me.Header.Write(OpenStream)
  899.  
  900.                 OpenStream.Write(Null)
  901.                 Functions.WriteString(OpenStream, Me.Language, False)
  902.                 Functions.WriteString(OpenStream, Me.ContentDescription)
  903.                 Functions.WriteString(OpenStream, Me.Text)
  904.             End Sub
  905.         End Class
  906.  
  907.         Public Class AttachedImageFrame
  908.             Inherits Frame
  909.  
  910.             Public Enum ImagePurpose As Byte
  911.                 Other
  912.                 Icon32x32
  913.                 Icon
  914.                 CoverFront
  915.                 CoverBack
  916.                 Depliant
  917.                 CdLabel
  918.                 MainArtist
  919.                 Artists
  920.                 Conductor
  921.                 Band
  922.                 Composer
  923.                 TextAuthor
  924.                 RegistrationPlace
  925.                 RegistrationImages
  926.                 ConcertImages
  927.                 Screenshot
  928.                 Illustration = 18
  929.                 ArtistLogo
  930.                 PublisherLogo
  931.             End Enum
  932.  
  933.             Private _MimeType As String
  934.             Private _ImageType As ImagePurpose
  935.             Private _ImageDescription As String
  936.             Private _ImageData As Byte()
  937.  
  938.             Public Property MimeType() As String
  939.                 Get
  940.                     Return _MimeType
  941.                 End Get
  942.                 Set(ByVal Value As String)
  943.                     _MimeType = Value
  944.                 End Set
  945.             End Property
  946.  
  947.             Public Property ImageType() As ImagePurpose
  948.                 Get
  949.                     Return _ImageType
  950.                 End Get
  951.                 Set(ByVal Value As ImagePurpose)
  952.                     _ImageType = Value
  953.                 End Set
  954.             End Property
  955.  
  956.             Public Property ImageDescription() As String
  957.                 Get
  958.                     Return _ImageDescription
  959.                 End Get
  960.                 Set(ByVal Value As String)
  961.                     _ImageDescription = Value
  962.                 End Set
  963.             End Property
  964.  
  965.             Public Property ImageData() As Byte()
  966.                 Get
  967.                     Return _ImageData
  968.                 End Get
  969.                 Set(ByVal Value As Byte())
  970.                     _ImageData = Value
  971.                 End Set
  972.             End Property
  973.  
  974.             Public Shared ReadOnly Property DefaultID() As String
  975.                 Get
  976.                     Return "APIC"
  977.                 End Get
  978.             End Property
  979.  
  980.             Sub New(ByVal Header As FrameHeader)
  981.                 Me.Header = Header
  982.                 Me.SetDescription()
  983.  
  984.                 Me.MimeType = ""
  985.                 Me.ImageDescription = ""
  986.                 Me.ImageData = New Byte() {}
  987.             End Sub
  988.  
  989.             Sub New(ByVal ID As String)
  990.                 Me.New(New FrameHeader(ID))
  991.             End Sub
  992.  
  993.             Sub New()
  994.                 Me.New(DefaultID)
  995.             End Sub
  996.  
  997.             Protected Overrides Sub CalculateSize()
  998.                 Me.Header.DataSize = 1 + Me.MimeType.Length + 1 + 1 + Me.ImageDescription.Length + 1 + Me.ImageData.Length
  999.             End Sub
  1000.  
  1001.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  1002.                 Try
  1003.                     'Salta il byte di codifica
  1004.                     OpenStream.ReadByte()
  1005.                     Me.MimeType = Functions.ReadString(OpenStream)
  1006.                     Me.ImageType = OpenStream.ReadByte
  1007.                     Me.ImageDescription = Functions.ReadString(OpenStream)
  1008.                     Me.ImageData = OpenStream.ReadBytes(Me.Header.DataSize - 1 - Me.MimeType.Length - 1 - 1 - Me.ImageDescription.Length - 1)
  1009.  
  1010.                     Return True
  1011.                 Catch ex As Exception
  1012.                     Return False
  1013.                 End Try
  1014.             End Function
  1015.  
  1016.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  1017.                 Me.CalculateSize()
  1018.                 Me.Header.Write(OpenStream)
  1019.  
  1020.                 With OpenStream
  1021.                     .Write(Null)
  1022.                     Functions.WriteString(OpenStream, Me.MimeType)
  1023.                     .Write(Me.ImageType)
  1024.                     Functions.WriteString(OpenStream, Me.ImageDescription)
  1025.                     .Write(Me.ImageData)
  1026.                 End With
  1027.             End Sub
  1028.  
  1029.             Public Function GetImage() As Image
  1030.                 Dim Mem As New IO.MemoryStream(Me.ImageData)
  1031.                 Dim Result As Image
  1032.  
  1033.                 Result = Image.FromStream(Mem)
  1034.                 Mem.Close()
  1035.  
  1036.                 Return Result
  1037.             End Function
  1038.  
  1039.             Public Sub SetImage(ByVal Img As Image)
  1040.                 Dim Mem As New IO.MemoryStream
  1041.                 Img.Save(Mem, Img.RawFormat)
  1042.                 Mem.Position = 0
  1043.                 ReDim Me.ImageData(Mem.Length - 1)
  1044.                 Mem.Read(Me.ImageData, 0, Mem.Length)
  1045.                 Mem.Close()
  1046.             End Sub
  1047.         End Class
  1048.  
  1049.         Public Class GeneralObjectFrame
  1050.             Inherits Frame
  1051.  
  1052.             Private _MimeType As String
  1053.             Private _FileName As String
  1054.             Private _ContentDescription As String
  1055.             Private _ObjectData() As Byte
  1056.  
  1057.             Public Property MimeType() As String
  1058.                 Get
  1059.                     Return _MimeType
  1060.                 End Get
  1061.                 Set(ByVal Value As String)
  1062.                     _MimeType = Value
  1063.                 End Set
  1064.             End Property
  1065.  
  1066.             Public Property FileName() As String
  1067.                 Get
  1068.                     Return _FileName
  1069.                 End Get
  1070.                 Set(ByVal Value As String)
  1071.                     _FileName = Value
  1072.                 End Set
  1073.             End Property
  1074.  
  1075.             Public Property ContentDescription() As String
  1076.                 Get
  1077.                     Return _ContentDescription
  1078.                 End Get
  1079.                 Set(ByVal Value As String)
  1080.                     _ContentDescription = Value
  1081.                 End Set
  1082.             End Property
  1083.  
  1084.             Public Property ObjectData() As Byte()
  1085.                 Get
  1086.                     Return _ObjectData
  1087.                 End Get
  1088.                 Set(ByVal value As Byte())
  1089.                     _ObjectData = value
  1090.                 End Set
  1091.             End Property
  1092.  
  1093.             Public Shared ReadOnly Property DefaultId() As String
  1094.                 Get
  1095.                     Return "GEOB"
  1096.                 End Get
  1097.             End Property
  1098.  
  1099.             Sub New(ByVal Header As FrameHeader)
  1100.                 Me.Header = Header
  1101.                 Me.SetDescription()
  1102.  
  1103.                 Me.MimeType = ""
  1104.                 Me.FileName = ""
  1105.                 Me.ContentDescription = ""
  1106.                 Me.ObjectData = New Byte() {}
  1107.             End Sub
  1108.  
  1109.             Sub New(ByVal ID As String)
  1110.                 Me.New(New FrameHeader(ID))
  1111.             End Sub
  1112.  
  1113.             Sub New()
  1114.                 Me.New(DefaultId)
  1115.             End Sub
  1116.  
  1117.             Protected Overrides Sub CalculateSize()
  1118.                 Me.Header.DataSize = 1 + Me.MimeType.Length + 1 + Me.FileName.Length + 1 + Me.ContentDescription.Length + 1 + Me.ObjectData.Length
  1119.             End Sub
  1120.  
  1121.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  1122.                 Try
  1123.                     OpenStream.ReadByte()
  1124.                     Me.MimeType = Functions.ReadString(OpenStream)
  1125.                     Me.FileName = Functions.ReadString(OpenStream)
  1126.                     Me.ContentDescription = Functions.ReadString(OpenStream)
  1127.                     Me.ObjectData = OpenStream.ReadBytes(Me.Header.DataSize - 1 - Me.MimeType.Length - 1 - Me.FileName.Length - 1 - Me.ContentDescription.Length - 1)
  1128.  
  1129.                     Return True
  1130.                 Catch ex As Exception
  1131.                     Return False
  1132.                 End Try
  1133.             End Function
  1134.  
  1135.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  1136.                 Me.CalculateSize()
  1137.                 Me.Header.Write(OpenStream)
  1138.  
  1139.                 With OpenStream
  1140.                     .Write(Null)
  1141.                     Functions.WriteString(OpenStream, Me.MimeType)
  1142.                     Functions.WriteString(OpenStream, Me.FileName)
  1143.                     Functions.WriteString(OpenStream, Me.ContentDescription)
  1144.                     .Write(Me.ObjectData)
  1145.                 End With
  1146.             End Sub
  1147.  
  1148.             Public Sub SetObject(Of T)(ByVal Obj As T)
  1149.                 Dim Serializer As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
  1150.                 Dim Mem As New IO.MemoryStream
  1151.                 Serializer.Serialize(Mem, Obj)
  1152.                 Mem.Position = 0
  1153.                 ReDim Me.ObjectData(Mem.Length - 1)
  1154.                 Mem.Read(Me.ObjectData, 0, Mem.Length)
  1155.                 Mem.Close()
  1156.             End Sub
  1157.  
  1158.             Public Function GetObject(Of T)() As T
  1159.                 Dim Mem As New IO.MemoryStream(Me.ObjectData)
  1160.                 Try
  1161.                     Dim Serializer As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
  1162.                     Dim Result As T = Serializer.Deserialize(Mem)
  1163.                     Return Result
  1164.                 Catch ex As Exception
  1165.                     Mem.Close()
  1166.                     Return Nothing
  1167.                 End Try
  1168.             End Function
  1169.         End Class
  1170.  
  1171.         Public Class PopularimeterFrame
  1172.             Inherits Frame
  1173.  
  1174.             Private _EMail As String
  1175.             Private _Value As Byte
  1176.             Private _Counter As Int32
  1177.  
  1178.             Public Property EMail() As String
  1179.                 Get
  1180.                     Return _EMail
  1181.                 End Get
  1182.                 Set(ByVal Value As String)
  1183.                     _EMail = Value
  1184.                 End Set
  1185.             End Property
  1186.  
  1187.             Public Property Value() As Byte
  1188.                 Get
  1189.                     Return _Value
  1190.                 End Get
  1191.                 Set(ByVal Value As Byte)
  1192.                     _Value = Value
  1193.                 End Set
  1194.             End Property
  1195.  
  1196.             Public Property Counter() As Int32
  1197.                 Get
  1198.                     Return _Counter
  1199.                 End Get
  1200.                 Set(ByVal Value As Int32)
  1201.                     _Counter = Value
  1202.                 End Set
  1203.             End Property
  1204.  
  1205.             Public Shared ReadOnly Property DefaultID() As String
  1206.                 Get
  1207.                     Return "POPM"
  1208.                 End Get
  1209.             End Property
  1210.  
  1211.             Sub New(ByVal Header As FrameHeader)
  1212.                 Me.Header = Header
  1213.                 Me.SetDescription()
  1214.  
  1215.                 Me.EMail = ""
  1216.                 Me.Value = 0
  1217.                 Me.Counter = 0
  1218.             End Sub
  1219.  
  1220.             Sub New(ByVal ID As String)
  1221.                 Me.New(New FrameHeader(ID))
  1222.             End Sub
  1223.  
  1224.             Sub New()
  1225.                 Me.New(DefaultID)
  1226.             End Sub
  1227.  
  1228.             Protected Overrides Sub CalculateSize()
  1229.                 Me.Header.DataSize = Me.EMail.Length + 1 + 1 + 4
  1230.             End Sub
  1231.  
  1232.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  1233.                 Try
  1234.                     Me.EMail = Functions.ReadString(OpenStream)
  1235.                     Me.Value = OpenStream.ReadByte
  1236.                     Me.Counter = OpenStream.ReadInt32
  1237.  
  1238.                     Return True
  1239.                 Catch ex As Exception
  1240.                     Return False
  1241.                 End Try
  1242.             End Function
  1243.  
  1244.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  1245.                 Me.CalculateSize()
  1246.                 Me.Header.Write(OpenStream)
  1247.  
  1248.                 Functions.WriteString(OpenStream, Me.EMail)
  1249.                 OpenStream.Write(Me.Value)
  1250.                 OpenStream.Write(Me.Counter)
  1251.             End Sub
  1252.         End Class
  1253.  
  1254.         Public Class CommercialFrame
  1255.             Inherits Frame
  1256.  
  1257.             Public Enum GetMode As Byte
  1258.                 Other
  1259.                 CD
  1260.                 CompressCD
  1261.                 Download
  1262.                 Streaming
  1263.                 AttachToMusicSheet
  1264.                 AttachToMusicBook
  1265.                 Other2
  1266.                 NonMusic
  1267.             End Enum
  1268.  
  1269.             Private _Price As String
  1270.             Private _ExpireDate As Date
  1271.             Private _PublisherUrl As String
  1272.             Private _BuyMode As GetMode
  1273.             Private _SellerName As String
  1274.             Private _ProductDescription As String
  1275.             Private _MimeType As String
  1276.             Private _PublisherLogoData As Byte()
  1277.  
  1278.             Public Property Price() As String
  1279.                 Get
  1280.                     Return _Price
  1281.                 End Get
  1282.                 Set(ByVal Value As String)
  1283.                     _Price = Value
  1284.                 End Set
  1285.             End Property
  1286.  
  1287.             Public Property ExpireDate() As Date
  1288.                 Get
  1289.                     Return _ExpireDate
  1290.                 End Get
  1291.                 Set(ByVal Value As Date)
  1292.                     _ExpireDate = Value
  1293.                 End Set
  1294.             End Property
  1295.  
  1296.             Public Property PublisherUrl() As String
  1297.                 Get
  1298.                     Return _PublisherUrl
  1299.                 End Get
  1300.                 Set(ByVal Value As String)
  1301.                     _PublisherUrl = Value
  1302.                 End Set
  1303.             End Property
  1304.  
  1305.             Public Property BuyMode() As GetMode
  1306.                 Get
  1307.                     Return _BuyMode
  1308.                 End Get
  1309.                 Set(ByVal Value As GetMode)
  1310.                     _BuyMode = Value
  1311.                 End Set
  1312.             End Property
  1313.  
  1314.             Public Property SellerName() As String
  1315.                 Get
  1316.                     Return _SellerName
  1317.                 End Get
  1318.                 Set(ByVal Value As String)
  1319.                     _SellerName = Value
  1320.                 End Set
  1321.             End Property
  1322.  
  1323.             Public Property ProductDescription() As String
  1324.                 Get
  1325.                     Return _ProductDescription
  1326.                 End Get
  1327.                 Set(ByVal Value As String)
  1328.                     _ProductDescription = Value
  1329.                 End Set
  1330.             End Property
  1331.  
  1332.             Public Property MimeType() As String
  1333.                 Get
  1334.                     Return _MimeType
  1335.                 End Get
  1336.                 Set(ByVal Value As String)
  1337.                     _MimeType = Value
  1338.                 End Set
  1339.             End Property
  1340.  
  1341.             Public Property PublisherLogoData() As Byte()
  1342.                 Get
  1343.                     Return _PublisherLogoData
  1344.                 End Get
  1345.                 Set(ByVal Value As Byte())
  1346.                     _PublisherLogoData = Value
  1347.                 End Set
  1348.             End Property
  1349.  
  1350.             Public Shared ReadOnly Property DefaultID() As String
  1351.                 Get
  1352.                     Return "COMR"
  1353.                 End Get
  1354.             End Property
  1355.  
  1356.             Sub New(ByVal Header As FrameHeader)
  1357.                 Me.Header = Header
  1358.                 Me.SetDescription()
  1359.  
  1360.                 Me.Price = ""
  1361.                 Me.ExpireDate = New Date(1, 1, 1)
  1362.                 Me.PublisherUrl = ""
  1363.                 Me.SellerName = ""
  1364.                 Me.ProductDescription = ""
  1365.                 Me.MimeType = ""
  1366.                 Me.PublisherLogoData = New Byte() {}
  1367.             End Sub
  1368.  
  1369.             Sub New(ByVal ID As String)
  1370.                 Me.New(New FrameHeader(ID))
  1371.             End Sub
  1372.  
  1373.             Sub New()
  1374.                 Me.New(DefaultID)
  1375.             End Sub
  1376.  
  1377.             Protected Overrides Sub CalculateSize()
  1378.                 Dim LogoLen As Int32
  1379.                 If Me.PublisherLogoData Is Nothing Then
  1380.                     LogoLen = 0
  1381.                 Else
  1382.                     LogoLen = Me.PublisherLogoData.Length
  1383.                 End If
  1384.  
  1385.                 Me.Header.DataSize = 1 + Me.Price.Length + 1 + 8 + Me.PublisherUrl.Length + 1 + 1 + Me.SellerName.Length + 1 + Me.ProductDescription.Length + 1 + Me.MimeType.Length + 1 + LogoLen
  1386.             End Sub
  1387.  
  1388.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  1389.                 Try
  1390.                     OpenStream.ReadByte()
  1391.                     Me.Price = Functions.ReadString(OpenStream)
  1392.  
  1393.                     Dim Buffer As String = OpenStream.ReadChars(8)
  1394.                     Dim Year As String = Buffer.Substring(0, 4)
  1395.                     Dim Month As String = Buffer.Substring(4, 2)
  1396.                     Dim Day As String = Buffer.Substring(6, 2)
  1397.                     Try
  1398.                         Me.ExpireDate = New Date(CInt(Year), CInt(Month), CInt(Day))
  1399.                     Catch Ex As Exception
  1400.                         Me.ExpireDate = New Date(1, 1, 1)
  1401.                     End Try
  1402.  
  1403.                     Me.PublisherUrl = Functions.ReadString(OpenStream)
  1404.                     Me.BuyMode = OpenStream.ReadByte
  1405.                     Me.SellerName = Functions.ReadString(OpenStream)
  1406.                     Me.ProductDescription = Functions.ReadString(OpenStream)
  1407.                     Me.MimeType = Functions.ReadString(OpenStream)
  1408.                     Me.PublisherLogoData = OpenStream.ReadBytes(Me.Header.DataSize - 1 - Me.Price.Length - 1 - 8 - Me.PublisherUrl.Length - 1 - 1 - Me.SellerName.Length - 1 - Me.ProductDescription.Length - 1 - Me.MimeType.Length - 1)
  1409.  
  1410.                     Return True
  1411.                 Catch ex As Exception
  1412.                     Return False
  1413.                 End Try
  1414.             End Function
  1415.  
  1416.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  1417.                 Me.CalculateSize()
  1418.                 Me.Header.Write(OpenStream)
  1419.  
  1420.                 OpenStream.Write(Null)
  1421.                 Functions.WriteString(OpenStream, Me.Price)
  1422.                 Functions.WriteString(OpenStream, CStr(Me.ExpireDate.Year) & CStr(Me.ExpireDate.Month).PadRight(2, "0") & CStr(Me.ExpireDate.Day).PadRight(2, "0"), False)
  1423.                 Functions.WriteString(OpenStream, Me.PublisherUrl)
  1424.                 OpenStream.Write(Me.BuyMode)
  1425.                 Functions.WriteString(OpenStream, Me.SellerName)
  1426.                 Functions.WriteString(OpenStream, Me.ProductDescription)
  1427.                 Functions.WriteString(OpenStream, Me.MimeType)
  1428.                 OpenStream.Write(Me.PublisherLogoData)
  1429.             End Sub
  1430.  
  1431.             Public Function GetPublisherLogo() As Image
  1432.                 Dim Mem As New IO.MemoryStream(Me.PublisherLogoData)
  1433.                 Dim Result As Image
  1434.  
  1435.                 Result = Image.FromStream(Mem)
  1436.                 Mem.Close()
  1437.  
  1438.                 Return Result
  1439.             End Function
  1440.  
  1441.             Public Sub SetPublicherLogo(ByVal Img As Image)
  1442.                 Dim Mem As New IO.MemoryStream
  1443.                 Img.Save(Mem, Img.RawFormat)
  1444.                 Mem.Position = 0
  1445.                 ReDim Me.PublisherLogoData(Mem.Length - 1)
  1446.                 Mem.Read(Me.PublisherLogoData, 0, Mem.Length)
  1447.                 Mem.Close()
  1448.             End Sub
  1449.         End Class
  1450.  
  1451.         Public Class PrivateFrame
  1452.             Inherits Frame
  1453.  
  1454.             Private _OwnerIdentifier As String
  1455.             Private _Data() As Byte
  1456.  
  1457.             Public Property OwnerIdentifier() As String
  1458.                 Get
  1459.                     Return _OwnerIdentifier
  1460.                 End Get
  1461.                 Set(ByVal value As String)
  1462.                     _OwnerIdentifier = value
  1463.                 End Set
  1464.             End Property
  1465.  
  1466.             Public Property Data() As Byte()
  1467.                 Get
  1468.                     Return _Data
  1469.                 End Get
  1470.                 Set(ByVal value As Byte())
  1471.                     _Data = value
  1472.                 End Set
  1473.             End Property
  1474.  
  1475.             Public Shared ReadOnly Property DefaultID() As String
  1476.                 Get
  1477.                     Return "PRIV"
  1478.                 End Get
  1479.             End Property
  1480.  
  1481.             Sub New(ByVal Header As FrameHeader)
  1482.                 Me.Header = Header
  1483.                 Me.SetDescription()
  1484.  
  1485.                 Me.OwnerIdentifier = ""
  1486.                 Me.Data = New Byte() {}
  1487.             End Sub
  1488.  
  1489.             Sub New(ByVal ID As String)
  1490.                 Me.New(New FrameHeader(ID))
  1491.             End Sub
  1492.  
  1493.             Sub New()
  1494.                 Me.New(DefaultID)
  1495.             End Sub
  1496.  
  1497.             Protected Overrides Sub CalculateSize()
  1498.                 Me.Header.DataSize = Me.OwnerIdentifier.Length + 1 + Me.Data.Length
  1499.             End Sub
  1500.  
  1501.             Public Overrides Function Read(ByVal OpenStream As System.IO.BinaryReader) As Boolean
  1502.                 Try
  1503.                     Me.OwnerIdentifier = Functions.ReadString(OpenStream)
  1504.                     Me.Data = OpenStream.ReadBytes(Me.Header.DataSize - Me.OwnerIdentifier.Length - 1)
  1505.  
  1506.                     Return True
  1507.                 Catch ex As Exception
  1508.                     Return False
  1509.                 End Try
  1510.             End Function
  1511.  
  1512.             Public Overrides Sub Write(ByVal OpenStream As System.IO.BinaryWriter)
  1513.                 Me.CalculateSize()
  1514.                 Me.Header.Write(OpenStream)
  1515.  
  1516.                 Functions.WriteString(OpenStream, Me.OwnerIdentifier)
  1517.                 OpenStream.Write(Me.Data)
  1518.             End Sub
  1519.         End Class
  1520.  
  1521.  
  1522.         Public Class ID3TagV2
  1523.             <Flags()> _
  1524.             Public Enum MainHeaderFlags
  1525.                 Desynchronization = 0
  1526.                 ExtendedHeader = 1
  1527.                 Experimental = 2
  1528.             End Enum
  1529.  
  1530.             Public Enum ReadResult
  1531.                 Failure
  1532.                 HeaderOnly
  1533.                 TagOnly
  1534.                 Success
  1535.             End Enum
  1536.  
  1537.             Private _Frames As New List(Of Frame)
  1538.             Private _Flags As MainHeaderFlags
  1539.             Private _Version As Version
  1540.             Private _Size As Int32
  1541.  
  1542.             Private Mp3Data() As Byte
  1543.  
  1544.             Public ReadOnly Property Frames() As List(Of Frame)
  1545.                 Get
  1546.                     Return _Frames
  1547.                 End Get
  1548.             End Property
  1549.  
  1550.             Public Property Version() As Version
  1551.                 Get
  1552.                     Return _Version
  1553.                 End Get
  1554.                 Set(ByVal value As Version)
  1555.                     _Version = value
  1556.                 End Set
  1557.             End Property
  1558.  
  1559.             Public Property Flags() As MainHeaderFlags
  1560.                 Get
  1561.                     Return _Flags
  1562.                 End Get
  1563.                 Set(ByVal value As MainHeaderFlags)
  1564.                     _Flags = value
  1565.                 End Set
  1566.             End Property
  1567.  
  1568.             Public Property Size() As Int32
  1569.                 Get
  1570.                     Return _Size
  1571.                 End Get
  1572.                 Set(ByVal value As Int32)
  1573.                     _Size = value
  1574.                 End Set
  1575.             End Property
  1576.  
  1577.             Protected Sub QuickAdd(Of FrameType As {New, Frame})(ByVal H As FrameHeader, ByVal Reader As IO.BinaryReader)
  1578.                 Dim AFrame As New FrameType
  1579.                 AFrame.Initialize(H)
  1580.                 If AFrame.Read(Reader) Then
  1581.                     Me.Frames.Add(AFrame)
  1582.                 End If
  1583.             End Sub
  1584.  
  1585.             Public Function Read(ByVal File As String) As ReadResult
  1586.                 Dim Reader As New IO.BinaryReader(New IO.FileStream(File, IO.FileMode.Open))
  1587.                 Dim ID3 As String
  1588.  
  1589.                 ID3 = Reader.ReadChars(3)
  1590.                 If ID3 <> "ID3" Then
  1591.                     Reader.Close()
  1592.                     Return ReadResult.Failure
  1593.                 End If
  1594.  
  1595.                 Me.Version = New Version(Reader.ReadByte, Reader.ReadByte)
  1596.  
  1597.                 Dim Buffer As Byte = Reader.ReadByte
  1598.                 If (Buffer And 128) = 128 Then
  1599.                     Me.Flags = Me.Flags Or MainHeaderFlags.Desynchronization
  1600.                 End If
  1601.                 If (Buffer And 64) = 64 Then
  1602.                     Me.Flags = Me.Flags Or MainHeaderFlags.ExtendedHeader
  1603.                 End If
  1604.                 If (Buffer And 32) = 32 Then
  1605.                     Me.Flags = Me.Flags Or MainHeaderFlags.Experimental
  1606.                 End If
  1607.  
  1608.                 Me.Size = Functions.BytesToSize(Reader.ReadBytes(4))
  1609.  
  1610.                 If Me.Size = 0 Then
  1611.                     Reader.Close()
  1612.                     Return ReadResult.HeaderOnly
  1613.                 End If
  1614.  
  1615.                 Do While Reader.BaseStream.Position < Me.Size + 10
  1616.                     Dim Header As New FrameHeader
  1617.                     Dim p As Int32 = Reader.BaseStream.Position
  1618.                     If p > 2000 Then
  1619.  
  1620.                     End If
  1621.                     If Header.Read(Reader) Then
  1622.                         If Header.Identifier.StartsWith("T") Or Header.Identifier.StartsWith("W") Then
  1623.                             Me.QuickAdd(Of TextFrame)(Header, Reader)
  1624.  
  1625.                         ElseIf Header.Identifier = InvolvedPeopleFrame.DefaultID Then
  1626.                             Me.QuickAdd(Of InvolvedPeopleFrame)(Header, Reader)
  1627.  
  1628.                         ElseIf Header.Identifier = SynchronizedLyricTextFrame.DefaultID Then
  1629.                             Me.QuickAdd(Of SynchronizedLyricTextFrame)(Header, Reader)
  1630.  
  1631.                         ElseIf Header.Identifier = CommentFrame.DefaultID Then
  1632.                             Me.QuickAdd(Of CommentFrame)(Header, Reader)
  1633.  
  1634.                         ElseIf Header.Identifier = AttachedImageFrame.DefaultID Then
  1635.                             Me.QuickAdd(Of AttachedImageFrame)(Header, Reader)
  1636.  
  1637.                         ElseIf Header.Identifier = GeneralObjectFrame.DefaultId Then
  1638.                             Me.QuickAdd(Of GeneralObjectFrame)(Header, Reader)
  1639.  
  1640.                         ElseIf Header.Identifier = PopularimeterFrame.DefaultID Then
  1641.                             Me.QuickAdd(Of PopularimeterFrame)(Header, Reader)
  1642.  
  1643.                         ElseIf Header.Identifier = CommercialFrame.DefaultID Then
  1644.                             Me.QuickAdd(Of CommercialFrame)(Header, Reader)
  1645.  
  1646.                         Else
  1647.                             Reader.ReadBytes(Header.DataSize)
  1648.                         End If
  1649.                     Else
  1650.                         Reader.Close()
  1651.                         Return ReadResult.TagOnly
  1652.                     End If
  1653.                 Loop
  1654.  
  1655.                 ReDim Mp3Data(Reader.BaseStream.Length - Me.Size - 11)
  1656.                 Reader.BaseStream.Position = 0
  1657.                 Reader.BaseStream.Seek(Me.Size + 10, IO.SeekOrigin.Begin)
  1658.                 Reader.Read(Mp3Data, 0, Mp3Data.Length)
  1659.                 Reader.Close()
  1660.                 Return ReadResult.Success
  1661.             End Function
  1662.  
  1663.             Private Sub CalculateSize()
  1664.                 Me.Size = 0
  1665.                 For Each F As Frame In Me.Frames
  1666.                     Me.Size += F.Size
  1667.                 Next
  1668.             End Sub
  1669.  
  1670.             Public Sub Write(ByVal File As String)
  1671.                 If (Mp3Data Is Nothing) OrElse (Mp3Data.Length = 0) Then
  1672.                     If Not IO.File.Exists(File) Then
  1673.                         Throw New IO.FileNotFoundException(File & " non esiste!")
  1674.                     End If
  1675.  
  1676.                     Dim Reader As New IO.BinaryReader(New IO.FileStream(File, IO.FileMode.Open))
  1677.                     Dim ID3 As String
  1678.                     Dim TempSize As Int32
  1679.  
  1680.                     ID3 = Reader.ReadChars(3)
  1681.                     If ID3 <> "ID3" Then
  1682.                         Reader.Close()
  1683.                         System.Threading.Thread.Sleep(10)
  1684.                         Mp3Data = IO.File.ReadAllBytes(File)
  1685.                     Else
  1686.                         Reader.ReadBytes(3)
  1687.                         TempSize = Functions.BytesToSize(Reader.ReadBytes(4))
  1688.                         If TempSize = 0 Then
  1689.                             ReDim Mp3Data(Reader.BaseStream.Length - 11)
  1690.                             Reader.Read(Mp3Data, 0, Mp3Data.Length)
  1691.                             Reader.Close()
  1692.                         Else
  1693.                             Reader.ReadBytes(TempSize)
  1694.                             ReDim Mp3Data(Reader.BaseStream.Length - 11 - TempSize)
  1695.                             Reader.Read(Mp3Data, 0, Mp3Data.Length)
  1696.                             Reader.Close()
  1697.                         End If
  1698.                     End If
  1699.                     System.Threading.Thread.Sleep(10)
  1700.                 End If
  1701.  
  1702.                 Dim Writer As New IO.BinaryWriter(New IO.FileStream(File, IO.FileMode.Create))
  1703.  
  1704.                 Functions.WriteString(Writer, "ID3", False)
  1705.                 Writer.Write(CByte(3))
  1706.                 Writer.Write(CByte(0))
  1707.  
  1708.                 Dim Buffer As Byte
  1709.                 If (Me.Flags And MainHeaderFlags.Desynchronization) = MainHeaderFlags.Desynchronization Then
  1710.                     Buffer += 128
  1711.                 End If
  1712.                 If (Me.Flags And MainHeaderFlags.ExtendedHeader) = MainHeaderFlags.ExtendedHeader Then
  1713.                     Buffer += 64
  1714.                 End If
  1715.                 If (Me.Flags And MainHeaderFlags.Experimental) = MainHeaderFlags.Experimental Then
  1716.                     Buffer += 32
  1717.                 End If
  1718.                 Writer.Write(Buffer)
  1719.  
  1720.                 Me.CalculateSize()
  1721.                 Writer.Write(Functions.SizeToBytes(Me.Size))
  1722.  
  1723.                 For Each F As Frame In Me.Frames
  1724.                     F.Write(Writer)
  1725.                 Next
  1726.  
  1727.                 Writer.Write(Mp3Data)
  1728.                 Writer.Close()
  1729.             End Sub
  1730.         End Class
  1731.     End Namespace
  1732. End Namespace