mirror of
https://github.com/staxrip/staxrip.git
synced 2026-10-27 04:09:48 +08:00
4645 lines
140 KiB
VB.net
4645 lines
140 KiB
VB.net
|
|
Imports System.Collections.Concurrent
|
|
Imports System.ComponentModel
|
|
Imports System.Drawing.Design
|
|
Imports System.Drawing.Imaging
|
|
Imports System.Globalization
|
|
Imports System.Management
|
|
Imports System.Runtime.InteropServices
|
|
Imports System.Runtime.Serialization
|
|
Imports System.Text
|
|
Imports System.Text.RegularExpressions
|
|
Imports System.Threading.Tasks
|
|
Imports System.Web
|
|
Imports Microsoft.Win32
|
|
Imports StaxRip.UI
|
|
Imports StaxRip.VideoEncoder
|
|
|
|
Public Module ShortcutModule
|
|
Public g As New GlobalClass
|
|
Public p As New Project
|
|
Public s As New ApplicationSettings
|
|
End Module
|
|
|
|
Public Module SizePrefixModule
|
|
Private ReadOnly _types() As SizePrefix = {New SizePrefix(0), New SizePrefix(1), New SizePrefix(2), New SizePrefix(3), New SizePrefix(4), New SizePrefix(5)}
|
|
|
|
Public ReadOnly Property PrefixedSize(exp As Integer) As SizePrefix
|
|
Get
|
|
Return _types(Mathf.Clamp(exp, 0, _types.Length - 1))
|
|
End Get
|
|
End Property
|
|
End Module
|
|
|
|
Public Structure SizePrefix
|
|
Public Shared ReadOnly Property Base As Integer
|
|
Get
|
|
Return If(s.BinaryPrefix, 1024, 1000)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property Exponent As Integer
|
|
|
|
Public ReadOnly Property Factor As Long
|
|
Get
|
|
Return Convert.ToInt64(Base ^ Exponent)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property Prefix As String
|
|
Get
|
|
Dim a As String() = If(s.BinaryPrefix, {"", "Ki", "Mi", "Gi", "Ti", "Pi"}, {"", "K", "M", "G", "T", "P"})
|
|
Return a(Exponent)
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property Unit As String
|
|
Get
|
|
Return Prefix + "B"
|
|
End Get
|
|
End Property
|
|
|
|
Public Sub New(exponent As Integer)
|
|
Me.Exponent = exponent
|
|
End Sub
|
|
|
|
End Structure
|
|
|
|
<Serializable()>
|
|
Public Class Range
|
|
Implements IComparable(Of Range)
|
|
|
|
Public Start As Integer
|
|
Public [End] As Integer
|
|
|
|
Sub New(startPosition As Integer, endPosition As Integer)
|
|
Me.Start = startPosition
|
|
Me.End = endPosition
|
|
End Sub
|
|
|
|
Function GetLength() As Integer
|
|
Return Me.End - Start
|
|
End Function
|
|
|
|
Function CompareTo(other As Range) As Integer Implements System.IComparable(Of Range).CompareTo
|
|
Dim sc = Start.CompareTo(other.Start)
|
|
If sc <> 0 Then Return sc
|
|
Return [End].CompareTo(other.End)
|
|
End Function
|
|
End Class
|
|
|
|
Public Class Calc
|
|
Shared Function IsValidFrameRate(value As Double) As Boolean
|
|
Return Not (Double.IsNaN(value) OrElse Double.IsInfinity(value) OrElse
|
|
value < 1 OrElse value > 500)
|
|
End Function
|
|
|
|
Shared Function GetYFromTwoPointForm(x1 As Single, y1 As Single, x2 As Single, y2 As Single, x As Single) As Integer
|
|
Return CInt((((y2 - y1) / (x2 - x1)) * (x - x1)) + y1)
|
|
End Function
|
|
|
|
Shared Function GetPercent() As Double
|
|
If p.Compressibility = 0 Then
|
|
Return 0
|
|
End If
|
|
|
|
Return (GetBPF() / p.Compressibility) * 100
|
|
End Function
|
|
|
|
Shared Function GetBPF() As Double
|
|
Dim framerate = p.Script.GetFramerate
|
|
|
|
If framerate = 0 Then Return 0
|
|
If p.TargetWidth = 0 Then Return 0
|
|
If p.TargetHeight = 0 Then Return 0
|
|
|
|
Return p.VideoBitrate * 1000L / (p.TargetWidth * p.TargetHeight * CLng(framerate))
|
|
End Function
|
|
|
|
Shared Function GetSizeInBytes() As Long
|
|
Dim ret = (GetVideoBytes() + GetVideoMetadataBytes() + GetAudioBytes() + GetSubtitleBytes() + GetOverheadBytes())
|
|
|
|
Return Math.Max(1, ret)
|
|
End Function
|
|
|
|
Shared Function GetVideoBitrate() As Double
|
|
If p.TargetSeconds = 0 Then Return 0
|
|
|
|
Dim bytes = p.TargetSize * PrefixedSize(2).Factor - GetVideoMetadataBytes() - GetAudioBytes() - GetSubtitleBytes() - GetOverheadBytes()
|
|
Dim ret = bytes * 8 / 1000 / p.TargetSeconds
|
|
|
|
Return Math.Max(1, ret)
|
|
End Function
|
|
|
|
Shared Function GetVideoBytes() As Long
|
|
Return (p.VideoBitrate \ 8) * 1000L * p.TargetSeconds
|
|
End Function
|
|
|
|
Shared Function GetVideoMetadataBytes() As Long
|
|
Dim hdr10Plus = p.VideoEncoder?.Hdr10PlusMetadataPath
|
|
Dim dv = p.VideoEncoder?.DolbyVisionMetadataPath
|
|
Dim ret = 0L
|
|
|
|
ret += hdr10Plus.FileSize()
|
|
ret += dv.FileSize()
|
|
|
|
Return ret
|
|
End Function
|
|
|
|
Shared Function GetSubtitleBytes() As Long
|
|
Return Aggregate i In p.VideoEncoder.Muxer.Subtitles Into Sum(If(i.Enabled, i.Size \ 3, 0))
|
|
End Function
|
|
|
|
Shared Function GetOverheadBytes() As Long
|
|
Dim ret As Double
|
|
Dim frames = p.Script.Info.FrameCount
|
|
|
|
If {"avi", "divx"}.Contains(p.VideoEncoder.Muxer.OutputExt) Then
|
|
ret += frames * 0.024
|
|
For Each track In p.AudioTracks
|
|
If track.AudioProfile.File <> "" Then ret += frames * 0.04
|
|
Next
|
|
ElseIf p.VideoEncoder.Muxer.OutputExt = "mp4" Then
|
|
ret += frames * 0.013
|
|
ElseIf p.VideoEncoder.Muxer.OutputExt = "mkv" Then
|
|
ret += frames * 0.014
|
|
End If
|
|
|
|
Return CLng(ret * 1024)
|
|
End Function
|
|
|
|
Shared Function GetAudioBytes() As Long
|
|
Return (CLng(GetAudioBitrate() / 8) * 1000L * p.TargetSeconds)
|
|
End Function
|
|
|
|
Shared Function GetAudioBitrate() As Double
|
|
Dim ret As Double = 0
|
|
|
|
For Each tracks In p.AudioTracks
|
|
ret += GetAudioBitrateFromAudioProfile(tracks.AudioProfile)
|
|
Next
|
|
|
|
ret += p.AudioFiles.Sum(Function(arg) arg.Bitrate)
|
|
|
|
Return ret
|
|
End Function
|
|
|
|
Shared Function GetAudioBitrateFromAudioProfile(profile As AudioProfile) As Double
|
|
Dim ret As Double = 0.0
|
|
If profile.File <> "" Then
|
|
ret = If(TypeOf profile Is GUIAudioProfile, DirectCast(profile, GUIAudioProfile).GetBitrate(), profile.Bitrate)
|
|
Else
|
|
If profile.Stream IsNot Nothing Then
|
|
ret = profile.Bitrate
|
|
End If
|
|
End If
|
|
Return ret
|
|
End Function
|
|
|
|
Shared Function GetBitrateFromFile(path As String, seconds As Integer) As Double
|
|
Try
|
|
If path = "" OrElse seconds = 0 Then
|
|
Return 0
|
|
End If
|
|
|
|
Dim kBits = New FileInfo(path).Length * 8 / 1000
|
|
Return kBits / seconds
|
|
Catch ex As Exception
|
|
g.ShowException(ex)
|
|
End Try
|
|
End Function
|
|
|
|
Shared Function IsARSignalingRequired() As Boolean
|
|
If Not p.Script Is Nothing Then
|
|
Dim par = GetTargetPAR()
|
|
|
|
If par.X <> par.Y Then
|
|
If p.Script.IsFilterActive("Resize") Then
|
|
Return Math.Abs(GetAspectRatioError()) > p.MaxAspectRatioError
|
|
Else
|
|
Return True
|
|
End If
|
|
End If
|
|
End If
|
|
End Function
|
|
|
|
Private Shared Function GetSimplePar(par As Point) As Point
|
|
If par.Y > 0 Then
|
|
For Each i In New Point() {New Point(12, 11), New Point(10, 11), New Point(16, 11), New Point(40, 33)}
|
|
If Math.Abs((par.X / par.Y) / (i.X / i.Y) * 100 - 100) < 1 Then Return i
|
|
Next
|
|
End If
|
|
|
|
If par.X > 255 OrElse par.Y > 255 Then
|
|
Dim x = par.X / 255
|
|
Dim y = par.Y / 255
|
|
|
|
If x > y Then
|
|
par.X = CInt(par.X / x)
|
|
par.Y = CInt(par.Y / x)
|
|
Else
|
|
par.X = CInt(par.X / y)
|
|
par.Y = CInt(par.Y / y)
|
|
End If
|
|
End If
|
|
|
|
If par.X = par.Y Then
|
|
par.X = 1
|
|
par.Y = 1
|
|
End If
|
|
|
|
Return par
|
|
End Function
|
|
|
|
Shared Function ParseCustomAR(value As String, defaultX As Integer, defaultY As Integer) As Point
|
|
If value <> "" AndAlso (value.Contains(":") OrElse value.Contains("/")) Then
|
|
Dim a = value.Split(":/".ToCharArray)
|
|
|
|
If a.Length = 2 AndAlso a(0).IsInt AndAlso a(1).IsInt Then
|
|
Return Reduce(New Point(a(0).ToInt, a(1).ToInt))
|
|
End If
|
|
ElseIf value.IsDouble Then
|
|
Dim val = value.ToDouble
|
|
|
|
If val > 0 Then
|
|
Return Reduce(New Point(CInt(val * 1000000), 1000000))
|
|
End If
|
|
End If
|
|
|
|
Return New Point(defaultX, defaultY)
|
|
End Function
|
|
|
|
Shared Function GetSourceDAR() As Double
|
|
Try
|
|
Dim par = GetSourcePAR()
|
|
Return (par.X * p.SourceWidth) / (par.Y * p.SourceHeight)
|
|
Catch ex As Exception
|
|
Return 4 / 3
|
|
End Try
|
|
End Function
|
|
|
|
Shared Function GetSimpleSourcePAR() As Point
|
|
Return GetSimplePar(GetSourcePAR)
|
|
End Function
|
|
|
|
Shared Function GetSourcePAR() As Point
|
|
If p.CustomSourcePAR <> "" Then
|
|
Dim val = ParseCustomAR(p.CustomSourcePAR, 0, 0)
|
|
|
|
If val.X <> 0 Then
|
|
Return Reduce(val)
|
|
End If
|
|
End If
|
|
|
|
If p.CustomSourceDAR <> "" Then
|
|
Dim val = ParseCustomAR(p.CustomSourceDAR, 0, 0)
|
|
|
|
If val.X <> 0 Then
|
|
Return Reduce(New Point(p.SourceHeight * val.X, p.SourceWidth * val.Y))
|
|
End If
|
|
End If
|
|
|
|
Dim par As New Point(1, 1)
|
|
Dim w = p.SourceWidth, h = p.SourceHeight
|
|
|
|
If (h = 576 OrElse h = 480) AndAlso w <= 768 Then
|
|
Dim f As VideoFormat
|
|
|
|
For Each i In Formats
|
|
If i.Width = p.SourceWidth AndAlso i.Height = p.SourceHeight Then
|
|
f = i
|
|
Exit For
|
|
End If
|
|
Next
|
|
|
|
If f.Width > 0 Then
|
|
Dim samplingWidth = 52.0
|
|
|
|
If Not p.ITU Then
|
|
samplingWidth = f.Width / f.SamplingRate
|
|
End If
|
|
|
|
Dim dar = (p.SourcePAR.X * p.SourceWidth) / (p.SourcePAR.Y * p.SourceHeight)
|
|
par.X = CInt(If(p.SourceAnamorphic OrElse dar > 1.7, 16 / 9, 4 / 3) * f.Height)
|
|
par.Y = CInt(f.SamplingRate * samplingWidth)
|
|
Return Reduce(par)
|
|
Else
|
|
Dim dar = If(p.SourceAnamorphic, 16 / 9, 4 / 3)
|
|
If p.ITU Then dar *= 1.0255
|
|
par.X = CInt(dar * h)
|
|
par.Y = CInt(w)
|
|
Return Reduce(par)
|
|
End If
|
|
End If
|
|
|
|
If h = 720 OrElse h = 1080 OrElse h = 1088 Then
|
|
If p.SourcePAR.X = 1364 Then
|
|
p.SourcePAR.X = 4
|
|
p.SourcePAR.Y = 3
|
|
End If
|
|
End If
|
|
|
|
Return Reduce(p.SourcePAR)
|
|
End Function
|
|
|
|
Shared Function GetTargetPAR() As Point
|
|
Try
|
|
If p.CustomTargetPAR <> "" Then
|
|
Dim val = ParseCustomAR(p.CustomTargetPAR, 0, 0)
|
|
|
|
If val.X <> 0 Then
|
|
Return Reduce(val)
|
|
End If
|
|
End If
|
|
|
|
Dim par = GetSourcePAR()
|
|
Dim croppedWidth = p.SourceWidth
|
|
Dim croppedHeight = p.SourceHeight
|
|
|
|
If p.Script.IsFilterActive("Crop") Then
|
|
croppedWidth -= p.CropLeft + p.CropRight
|
|
croppedHeight -= p.CropTop + p.CropBottom
|
|
End If
|
|
|
|
If p.CustomTargetDAR <> "" Then
|
|
Dim val = ParseCustomAR(p.CustomTargetDAR, 0, 0)
|
|
|
|
If val.X <> 0 Then
|
|
Return Reduce(New Point(CInt(val.X * croppedHeight), CInt(val.Y * croppedWidth)))
|
|
End If
|
|
End If
|
|
|
|
If p.TargetWidth <> croppedWidth OrElse p.TargetHeight <> croppedHeight Then
|
|
Dim par2 = Reduce(New Point(croppedWidth * p.TargetHeight, croppedHeight * p.TargetWidth))
|
|
par.X = par.X * par2.X
|
|
par.Y = par.Y * par2.Y
|
|
par = Reduce(par)
|
|
End If
|
|
|
|
Return GetSimplePar(par)
|
|
Catch ex As Exception
|
|
Return New Point(1, 1)
|
|
End Try
|
|
End Function
|
|
|
|
Shared Function GetTargetSAR() As Double
|
|
Return p.TargetWidth / p.TargetHeight
|
|
End Function
|
|
|
|
Shared Function GetTargetDAR() As Double
|
|
If p.CustomTargetDAR <> "" Then
|
|
Dim val = ParseCustomAR(p.CustomTargetDAR, 0, 0)
|
|
|
|
If val.X <> 0 AndAlso val.Y <> 0 Then
|
|
Return val.X / val.Y
|
|
End If
|
|
End If
|
|
|
|
Dim w = p.SourceWidth, h = p.SourceHeight
|
|
Dim cropw = w, croph = h
|
|
|
|
If p.Script.IsFilterActive("Crop") Then
|
|
cropw = w - p.CropLeft - p.CropRight
|
|
croph = h - p.CropTop - p.CropBottom
|
|
End If
|
|
|
|
If p.CustomTargetPAR <> "" Then
|
|
Dim val = ParseCustomAR(p.CustomTargetPAR, 0, 0)
|
|
If val.X <> 0 Then Return (val.X * cropw) / (val.Y * croph)
|
|
End If
|
|
|
|
Return ((cropw / w) / (croph / h)) * GetSourceDAR()
|
|
End Function
|
|
|
|
Shared Function GetAspectRatioError() As Double
|
|
Return ((p.TargetWidth / p.TargetHeight) / Calc.GetTargetDAR) * 100 - 100
|
|
End Function
|
|
|
|
Shared Function Reduce(p As Point) As Point
|
|
If p.X <> 0 AndAlso p.Y <> 0 Then
|
|
Dim gcd = GetGCD(p.X, p.Y)
|
|
p.X \= gcd
|
|
p.Y \= gcd
|
|
End If
|
|
|
|
While p.X > 1000000
|
|
p.X = CInt(p.X / 10)
|
|
p.Y = CInt(p.Y / 10)
|
|
End While
|
|
|
|
Return p
|
|
End Function
|
|
|
|
Shared Function GetGCD(a As Integer, b As Integer) As Integer
|
|
If b = 0 Then
|
|
Return a
|
|
Else
|
|
Return GetGCD(b, a Mod b)
|
|
End If
|
|
End Function
|
|
|
|
Shared Function FixMod16(value As Integer) As Integer
|
|
Return CInt(value / 16) * 16
|
|
End Function
|
|
|
|
Shared Function FixMod(value As Integer, modValue As Integer) As Integer
|
|
Return CInt(value / modValue) * modValue
|
|
End Function
|
|
|
|
Shared Function GetMod(
|
|
w As Integer,
|
|
h As Integer,
|
|
Optional skip16 As Boolean = True) As String
|
|
|
|
Dim wmod, hmod As Integer
|
|
|
|
For Each x In {1, 2, 4, 8, 16}
|
|
If w Mod x = 0 Then wmod = x
|
|
If h Mod x = 0 Then hmod = x
|
|
Next
|
|
|
|
If wmod = 16 AndAlso hmod = 16 Then
|
|
If skip16 Then
|
|
Return ""
|
|
Else
|
|
Return "16/16"
|
|
End If
|
|
Else
|
|
Dim x = w - FixMod16(w)
|
|
Dim xval As String
|
|
|
|
If x = 8 OrElse x = -8 Then
|
|
xval = "8"
|
|
ElseIf x > 0 Then
|
|
xval = "+" & x
|
|
Else
|
|
xval = x.ToString
|
|
End If
|
|
|
|
Dim y = h - FixMod16(h)
|
|
Dim yval As String
|
|
|
|
If y = 8 OrElse y = -8 Then
|
|
yval = "8"
|
|
ElseIf y > 0 Then
|
|
yval = "+" & y
|
|
Else
|
|
yval = y.ToString
|
|
End If
|
|
|
|
Return wmod & "/" & hmod & " (" & xval & "/" & yval & ")"
|
|
End If
|
|
End Function
|
|
|
|
Shared Function GetNextMod(val As Integer, step1 As Integer) As Integer
|
|
Do
|
|
val += 1
|
|
Loop Until val Mod step1 = 0
|
|
|
|
Return val
|
|
End Function
|
|
|
|
Shared Function GetPreviousMod(val As Integer, step1 As Integer) As Integer
|
|
Do
|
|
val -= 1
|
|
Loop Until val Mod step1 = 0
|
|
|
|
Return val
|
|
End Function
|
|
|
|
Private Shared FormatsValue As VideoFormat()
|
|
|
|
Shared ReadOnly Property Formats() As VideoFormat()
|
|
Get
|
|
If FormatsValue Is Nothing Then
|
|
FormatsValue = {
|
|
New VideoFormat(768, 576, 14.75),
|
|
New VideoFormat(768, 560, 14.75),
|
|
New VideoFormat(720, 576, 13.5),
|
|
New VideoFormat(704, 576, 13.5),
|
|
New VideoFormat(702, 576, 13.5),
|
|
New VideoFormat(544, 576, 10.125),
|
|
New VideoFormat(480, 576, 9.0),
|
|
New VideoFormat(384, 288, 7.375),
|
|
New VideoFormat(384, 280, 7.375),
|
|
New VideoFormat(352, 576, 6.75),
|
|
New VideoFormat(352, 288, 6.75),
|
|
New VideoFormat(176, 144, 3.375),
|
|
New VideoFormat(720, 486, 13.5),
|
|
New VideoFormat(720, 480, 13.5),
|
|
New VideoFormat(711, 486, 13.5),
|
|
New VideoFormat(704, 486, 13.5),
|
|
New VideoFormat(704, 480, 13.5),
|
|
New VideoFormat(640, 480, 12.27272),
|
|
New VideoFormat(480, 480, 9.0),
|
|
New VideoFormat(352, 480, 6.75),
|
|
New VideoFormat(352, 240, 6.75),
|
|
New VideoFormat(320, 240, 6.13636)
|
|
}
|
|
End If
|
|
|
|
Return FormatsValue
|
|
End Get
|
|
End Property
|
|
End Class
|
|
|
|
Public Structure VideoFormat
|
|
Sub New(width As Integer, height As Integer, samplingRate As Double)
|
|
Me.Width = width
|
|
Me.Height = height
|
|
Me.SamplingRate = samplingRate
|
|
End Sub
|
|
|
|
Public Width As Integer
|
|
Public Height As Integer
|
|
Public SamplingRate As Double
|
|
End Structure
|
|
|
|
Public Class RtfBuilder
|
|
Private ReadOnly _colors As New Dictionary(Of Color, Integer)
|
|
Private ReadOnly _colorTable As New List(Of Color)
|
|
Private ReadOnly _sb As New StringBuilder(2048)
|
|
|
|
Public Sub New()
|
|
End Sub
|
|
|
|
Public Function AddColor(c As Color) As Integer
|
|
If Not _colors.ContainsKey(c) Then
|
|
_colors(c) = _colorTable.Count + 1
|
|
_colorTable.Add(c)
|
|
End If
|
|
|
|
Return _colors(c)
|
|
End Function
|
|
|
|
Public Sub AppendText(text As String, colorIndex As Integer, Optional bold As Boolean = False)
|
|
If bold Then _sb.Append("\b")
|
|
_sb.Append("\cf").Append(colorIndex).Append(" ")
|
|
_sb.Append(Escape(text))
|
|
If bold Then _sb.Append("\b0")
|
|
End Sub
|
|
|
|
Public Function Build(font As Font) As String
|
|
Dim rtf As New StringBuilder(4096)
|
|
|
|
rtf.Append("{\rtf1\ansi\deff0")
|
|
rtf.Append("{\fonttbl{\f0\fnil ").Append(font.Name).Append(";}}")
|
|
|
|
rtf.Append("{\colortbl;")
|
|
For Each c In _colorTable
|
|
rtf.Append("\red").Append(c.R)
|
|
rtf.Append("\green").Append(c.G)
|
|
rtf.Append("\blue").Append(c.B).Append(";")
|
|
Next
|
|
rtf.Append("}")
|
|
|
|
rtf.Append("\f0\fs").Append(CInt(font.SizeInPoints * 2)).Append(" ")
|
|
rtf.Append(_sb)
|
|
rtf.Append("}")
|
|
|
|
Return rtf.ToString()
|
|
End Function
|
|
|
|
Private Shared Function Escape(text As String) As String
|
|
Return text _
|
|
.Replace("\", "\\") _
|
|
.Replace("{", "\{") _
|
|
.Replace("}", "\}") _
|
|
.Replace(Microsoft.VisualBasic.vbCrLf, "\line ") _
|
|
.Replace(Microsoft.VisualBasic.vbLf, "\line ")
|
|
End Function
|
|
End Class
|
|
|
|
<Serializable()>
|
|
Public Class CustomCultureInfo
|
|
Inherits CultureInfo
|
|
Implements IDeserializationCallback
|
|
|
|
Private _name As String
|
|
Private _displayName As String
|
|
Private _twoLetterCode As String
|
|
Private _threeLetterCode As String
|
|
|
|
Protected Sub New(baseCultureName As String)
|
|
MyBase.New(baseCultureName)
|
|
End Sub
|
|
|
|
Public Sub New(baseCultureName As String, name As String, displayName As String, twoLetterCode As String, threeLetterCode As String)
|
|
MyBase.New(baseCultureName)
|
|
|
|
_name = name
|
|
_displayName = displayName
|
|
_twoLetterCode = _twoLetterCode
|
|
_threeLetterCode = threeLetterCode
|
|
|
|
PatchInternals()
|
|
End Sub
|
|
|
|
Public Sub OnDeserialization(sender As Object) Implements IDeserializationCallback.OnDeserialization
|
|
PatchInternals()
|
|
End Sub
|
|
|
|
Private Sub PatchInternals()
|
|
Dim cultureField = GetType(CultureInfo).GetField("m_name", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
cultureField?.SetValue(Me, _name)
|
|
|
|
Dim displayNameField = GetType(CultureInfo).GetField("m_cultureData", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
If displayNameField IsNot Nothing Then
|
|
Dim cultureData = displayNameField.GetValue(Me)
|
|
Dim displayNameProp = cultureData.GetType().GetField("sLocalizedDisplayName", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
displayNameProp?.SetValue(cultureData, _displayName)
|
|
displayNameProp = cultureData.GetType().GetField("sEnglishDisplayName", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
displayNameProp?.SetValue(cultureData, _displayName)
|
|
displayNameProp = cultureData.GetType().GetField("sISO639Language", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
displayNameProp?.SetValue(cultureData, _twoLetterCode)
|
|
displayNameProp = cultureData.GetType().GetField("sISO639Language2", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
displayNameProp?.SetValue(cultureData, _threeLetterCode)
|
|
displayNameProp = cultureData.GetType().GetField("sName", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
|
|
displayNameProp?.SetValue(cultureData, _name)
|
|
End If
|
|
End Sub
|
|
End Class
|
|
|
|
<Serializable()>
|
|
Public Class Language
|
|
Implements IComparable(Of Language)
|
|
|
|
<NonSerialized>
|
|
Public IsCommon As Boolean
|
|
|
|
Public ReadOnly Property IsDetermined As Boolean
|
|
Get
|
|
If CultureInfo IsNot Nothing Then Return Not CultureInfo.TwoLetterISOLanguageName.ContainsAny("iv", "und")
|
|
Return ThreeLetterCodeValue <> "und"
|
|
End Get
|
|
End Property
|
|
|
|
Sub New()
|
|
Me.New("")
|
|
End Sub
|
|
|
|
Sub New(ci As CultureInfo, Optional isCommon As Boolean = False, Optional isInitial As Boolean = False)
|
|
Me.IsCommon = isCommon
|
|
|
|
If isInitial OrElse ci IsNot Nothing OrElse Languages.Select(Function(x) x.Name).ContainsEx(ci.Name) Then
|
|
CultureInfoValue = ci
|
|
Else
|
|
CultureInfoValue = CultureInfo.InvariantCulture
|
|
End If
|
|
End Sub
|
|
|
|
Sub New(lang As String, Optional isCommon As Boolean = False, Optional isInitial As Boolean = False)
|
|
Try
|
|
If String.IsNullOrWhiteSpace(lang) Then Throw New ArgumentNullException("lang")
|
|
|
|
Me.IsCommon = isCommon
|
|
|
|
If isInitial Then
|
|
CultureInfoValue = New CultureInfo(lang)
|
|
Return
|
|
End If
|
|
|
|
Dim selectedLanguages As IEnumerable(Of Language)
|
|
|
|
Select Case lang.Length
|
|
Case 2
|
|
selectedLanguages = Languages.Where(Function(x) x.TwoLetterCode = lang OrElse x.CultureInfo.IetfLanguageTag = lang)
|
|
Case 3
|
|
selectedLanguages = Languages.Where(Function(x) x.ThreeLetterCode = lang)
|
|
Case Else
|
|
selectedLanguages = Languages.Where(Function(x) x.Name = lang)
|
|
End Select
|
|
|
|
If selectedLanguages.Any() Then
|
|
CultureInfoValue = selectedLanguages.First().CultureInfo
|
|
Else
|
|
CultureInfoValue = CultureInfo.InvariantCulture
|
|
End If
|
|
Catch ex As Exception
|
|
CultureInfoValue = CultureInfo.InvariantCulture
|
|
End Try
|
|
End Sub
|
|
|
|
Private CultureInfoValue As CultureInfo
|
|
|
|
ReadOnly Property CultureInfo() As CultureInfo
|
|
Get
|
|
Return CultureInfoValue
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property TwoLetterCode() As String
|
|
Get
|
|
Return CultureInfo.TwoLetterISOLanguageName
|
|
End Get
|
|
End Property
|
|
|
|
<NonSerialized()> Private ThreeLetterCodeValue As String
|
|
|
|
ReadOnly Property ThreeLetterCode() As String
|
|
Get
|
|
If ThreeLetterCodeValue Is Nothing Then
|
|
If CultureInfo.TwoLetterISOLanguageName = "iv" Then
|
|
ThreeLetterCodeValue = "und"
|
|
Else
|
|
Select Case CultureInfo.ThreeLetterISOLanguageName
|
|
Case "deu"
|
|
ThreeLetterCodeValue = "ger"
|
|
Case "ces"
|
|
ThreeLetterCodeValue = "cze"
|
|
Case "zho"
|
|
ThreeLetterCodeValue = "chi"
|
|
Case "nld"
|
|
ThreeLetterCodeValue = "dut"
|
|
Case "ell"
|
|
ThreeLetterCodeValue = "gre"
|
|
Case "fra"
|
|
ThreeLetterCodeValue = "fre"
|
|
Case "sqi"
|
|
ThreeLetterCodeValue = "alb"
|
|
Case "hye"
|
|
ThreeLetterCodeValue = "arm"
|
|
Case "eus"
|
|
ThreeLetterCodeValue = "baq"
|
|
Case "mya"
|
|
ThreeLetterCodeValue = "bur"
|
|
Case "kat"
|
|
ThreeLetterCodeValue = "geo"
|
|
Case "isl"
|
|
ThreeLetterCodeValue = "ice"
|
|
Case "bng"
|
|
ThreeLetterCodeValue = "ben"
|
|
Case Else
|
|
ThreeLetterCodeValue = CultureInfo.ThreeLetterISOLanguageName
|
|
End Select
|
|
End If
|
|
End If
|
|
|
|
Return ThreeLetterCodeValue
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property Name() As String
|
|
Get
|
|
Return If(CultureInfo.TwoLetterISOLanguageName = "iv", "und", CultureInfo.Name)
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property EnglishName() As String
|
|
Get
|
|
Return If(CultureInfo.TwoLetterISOLanguageName = "iv", "Undetermined", CultureInfo.EnglishName)
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property LocalName() As String
|
|
Get
|
|
Return If(CultureInfo.TwoLetterISOLanguageName = "iv", "Undetermined", CultureInfo.DisplayName)
|
|
End Get
|
|
End Property
|
|
|
|
Shared ReadOnly Property ConfusingTwoLetterISOLanguageNames As String()
|
|
Get
|
|
Return {"am", "an", "as", "be", "es", "et", "he", "hi", "in", "is", "it", "my", "no", "or", "so", "to", "yo"}
|
|
End Get
|
|
End Property
|
|
|
|
Shared ReadOnly Property ConfusingThreeLetterISOLanguageNames As String()
|
|
Get
|
|
Return {"ace", "bug", "cat", "fan", "gem", "hat", "lit", "mad", "nor", "pan", "per", "sin", "spa"}
|
|
End Get
|
|
End Property
|
|
|
|
Private Shared LanguagesValue As List(Of Language)
|
|
|
|
Shared ReadOnly Property Languages() As List(Of Language)
|
|
Get
|
|
If LanguagesValue Is Nothing Then
|
|
Dim l As New List(Of Language) From {
|
|
New Language("en", True, True),
|
|
New Language("es", True, True),
|
|
New Language("de", True, True),
|
|
New Language("fr", True, True),
|
|
New Language("it", True, True),
|
|
New Language("ru", True, True),
|
|
New Language("zh", True, True),
|
|
New Language("hi", True, True),
|
|
New Language("ja", True, True),
|
|
New Language("pt", True, True),
|
|
New Language("ar", True, True),
|
|
New Language("bn", True, True),
|
|
New Language("pa", True, True),
|
|
New Language("ms", True, True),
|
|
New Language("ko", True, True),
|
|
New Language(CultureInfo.InvariantCulture, True, True)
|
|
}
|
|
|
|
If Not g.IsRunningUnderWine AndAlso OSVersion.VersionInfo.dwMajorVersion > 7 Then
|
|
l.AddRange({
|
|
New Language(New CustomCultureInfo("cmn-Hans-CN", "cmn-Hans-CN", "Chinese (Mandarin, Simplified, China)", "zh", "cmn"), False, False),
|
|
New Language(New CustomCultureInfo("cmn-Hant-CN", "cmn-Hant-CN", "Chinese (Mandarin, Traditional, China)", "zh", "cmn"), False, False),
|
|
New Language(New CustomCultureInfo("no-NO", "no-NO", "Norwegian", "no", "nor"), False, False),
|
|
New Language(New CustomCultureInfo("yue-Hans-CN", "yue-Hans-CN", "Chinese (Cantonese, Simplified, China)", "zh", "yue"), False, False),
|
|
New Language(New CustomCultureInfo("yue-Hant-CN", "yue-Hant-CN", "Chinese (Cantonese, Traditional, China)", "zh", "yue"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hans-CN", "zh-Hans-CN", "Chinese (Simplified, China)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hans-HK", "zh-Hans-HK", "Chinese (Simplified, Hong Kong SAR)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hans-SG", "zh-Hans-SG", "Chinese (Simplified, Singapore)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hans-TW", "zh-Hans-TW", "Chinese (Simplified, Taiwan)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hant-CN", "zh-Hant-CN", "Chinese (Traditional, China)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hant-HK", "zh-Hant-HK", "Chinese (Traditional, Hong Kong SAR)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hant-SG", "zh-Hant-SG", "Chinese (Traditional, Singapore)", "zh", "chi"), False, False),
|
|
New Language(New CustomCultureInfo("zh-Hant-TW", "zh-Hant-TW", "Chinese (Traditional, Taiwan)", "zh", "chi"), False, False)
|
|
})
|
|
l.AddRange({
|
|
New Language(New CustomCultureInfo("zxx", "zxx", "No Linguistic Content", "xx", "zxx"), False, True),
|
|
New Language(New CustomCultureInfo("yue", "yue", "Chinese (Cantonese)", "zh", "yue"), False, False),
|
|
New Language(New CustomCultureInfo("cmn", "cmn", "Chinese (Mandarin)", "zh", "cmn"), False, False)
|
|
})
|
|
End If
|
|
|
|
Dim current = l.Where(Function(a) a.TwoLetterCode = CultureInfo.CurrentCulture.TwoLetterISOLanguageName).FirstOrDefault
|
|
|
|
If current Is Nothing Then
|
|
l.Add(CurrentCulture)
|
|
End If
|
|
|
|
l.Sort()
|
|
|
|
Dim l2 As New List(Of Language)
|
|
|
|
For Each i In CultureInfo.GetCultures(CultureTypes.AllCultures).Where(Function(x) x IsNot CultureInfo.InvariantCulture)
|
|
l2.Add(New Language(i, False, True))
|
|
Next
|
|
|
|
l2.Sort()
|
|
l.AddRange(l2)
|
|
LanguagesValue = l
|
|
End If
|
|
|
|
Return LanguagesValue
|
|
End Get
|
|
End Property
|
|
|
|
Shared ReadOnly Property CurrentCulture As Language
|
|
Get
|
|
Return New Language(CultureInfo.CurrentCulture.NeutralCulture, True)
|
|
End Get
|
|
End Property
|
|
|
|
|
|
Overrides Function ToString() As String
|
|
Return $"{EnglishName} [{Name}]"
|
|
End Function
|
|
|
|
Function CompareTo(other As Language) As Integer Implements IComparable(Of Language).CompareTo
|
|
Return String.Compare(Name, other.Name, StringComparison.Ordinal)
|
|
End Function
|
|
|
|
Overrides Function Equals(o As Object) As Boolean
|
|
Dim lang = TryCast(o, Language)
|
|
|
|
If lang IsNot Nothing Then Return CultureInfo.Equals(lang.CultureInfo)
|
|
End Function
|
|
End Class
|
|
|
|
Public Class CommandLineTypeEditor
|
|
Inherits UITypeEditor
|
|
|
|
Overloads Overrides Function EditValue(context As ITypeDescriptorContext,
|
|
provider As IServiceProvider,
|
|
value As Object) As Object
|
|
Using f As New MacroEditorDialog
|
|
f.SetBatchDefaults()
|
|
f.MacroEditorControl.Value = CStr(value)
|
|
|
|
If f.ShowDialog = DialogResult.OK Then
|
|
Return f.MacroEditorControl.Value
|
|
Else
|
|
Return value
|
|
End If
|
|
End Using
|
|
End Function
|
|
|
|
Overloads Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
|
|
Return UITypeEditorEditStyle.Modal
|
|
End Function
|
|
End Class
|
|
|
|
Public Class ScriptTypeEditor
|
|
Inherits UITypeEditor
|
|
|
|
Overloads Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
|
|
Using f As New MacroEditorDialog
|
|
f.SetScriptDefaults()
|
|
f.MacroEditorControl.Value = CStr(value)
|
|
|
|
If f.ShowDialog = DialogResult.OK Then
|
|
Return f.MacroEditorControl.Value
|
|
Else
|
|
Return value
|
|
End If
|
|
End Using
|
|
End Function
|
|
|
|
Overloads Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
|
|
Return UITypeEditorEditStyle.Modal
|
|
End Function
|
|
End Class
|
|
|
|
Public Class MacroStringTypeEditor
|
|
Inherits UITypeEditor
|
|
|
|
Overloads Overrides Function EditValue(context As ITypeDescriptorContext,
|
|
provider As IServiceProvider,
|
|
value As Object) As Object
|
|
Using f As New MacroEditorDialog
|
|
f.SetMacroDefaults()
|
|
f.MacroEditorControl.Value = CStr(value)
|
|
|
|
If f.ShowDialog = DialogResult.OK Then
|
|
Return f.MacroEditorControl.Value
|
|
Else
|
|
Return value
|
|
End If
|
|
End Using
|
|
End Function
|
|
|
|
Overloads Overrides Function GetEditStyle(context As ITypeDescriptorContext) As UITypeEditorEditStyle
|
|
Return UITypeEditorEditStyle.Modal
|
|
End Function
|
|
End Class
|
|
|
|
<Serializable()>
|
|
Public MustInherit Class Profile
|
|
Implements IComparable(Of Profile)
|
|
|
|
Sub New()
|
|
End Sub
|
|
|
|
Sub New(name As String)
|
|
Me.Name = name
|
|
End Sub
|
|
|
|
Private NameValue As String
|
|
|
|
Overridable Property Name() As String
|
|
Get
|
|
If NameValue = "" Then
|
|
Return DefaultName
|
|
Else
|
|
If NameValue = DefaultName Then
|
|
NameValue = Nothing
|
|
Return DefaultName
|
|
End If
|
|
End If
|
|
|
|
Return NameValue
|
|
End Get
|
|
Set(Value As String)
|
|
If Value = DefaultName Then
|
|
NameValue = Nothing
|
|
Else
|
|
NameValue = Value
|
|
End If
|
|
End Set
|
|
End Property
|
|
|
|
Overridable ReadOnly Property DefaultName As String
|
|
Get
|
|
Return "untitled"
|
|
End Get
|
|
End Property
|
|
|
|
Protected CanEditValue As Boolean
|
|
|
|
Overridable Property CanEdit As Boolean
|
|
Get
|
|
Return CanEditValue
|
|
End Get
|
|
Set(value As Boolean)
|
|
If CanEditValue <> value Then CanEditValue = value
|
|
End Set
|
|
End Property
|
|
|
|
Overridable Function Edit() As DialogResult
|
|
End Function
|
|
|
|
Overridable Function CreateEditControl() As Control
|
|
Return Nothing
|
|
End Function
|
|
|
|
Overridable Sub Clean()
|
|
End Sub
|
|
|
|
Overridable Function GetCopy() As Profile
|
|
Return DirectCast(ObjectHelp.GetCopy(Me), Profile)
|
|
End Function
|
|
|
|
Overrides Function ToString() As String
|
|
Return Name
|
|
End Function
|
|
|
|
Function CompareTo(other As Profile) As Integer Implements System.IComparable(Of Profile).CompareTo
|
|
Return Name.CompareTo(other.Name)
|
|
End Function
|
|
End Class
|
|
|
|
<Serializable()>
|
|
Public Class AudioTrack
|
|
Private _audioProfile As AudioProfile
|
|
<NonSerialized>
|
|
Private _editLabel As AudioEditButtonLabel
|
|
<NonSerialized>
|
|
Private ReadOnly _index As Integer
|
|
<NonSerialized>
|
|
Private _languageLabel As AudioLanguageLabel
|
|
<NonSerialized>
|
|
Private _nameLabel As AudioNameButtonLabel
|
|
<NonSerialized>
|
|
Private _rowLabel As AudioRowLabel
|
|
<NonSerialized>
|
|
Private _textEdit As AudioTextEdit
|
|
|
|
Public Property AudioProfile As AudioProfile
|
|
Get
|
|
Return _audioProfile
|
|
End Get
|
|
Set
|
|
_audioProfile = Value
|
|
End Set
|
|
End Property
|
|
|
|
Public Property EditLabel As AudioEditButtonLabel
|
|
Get
|
|
Dim ret = If(_editLabel, New AudioEditButtonLabel())
|
|
ret.Text = "Edit"
|
|
Return ret
|
|
End Get
|
|
Set
|
|
_editLabel = Value
|
|
End Set
|
|
End Property
|
|
|
|
Public ReadOnly Property Index As Integer
|
|
Get
|
|
Return _index
|
|
End Get
|
|
End Property
|
|
|
|
Public ReadOnly Property IsRelevant As Boolean
|
|
Get
|
|
Return TextEdit.Text <> "" AndAlso TypeOf AudioProfile IsNot NullAudioProfile
|
|
End Get
|
|
End Property
|
|
|
|
Public Property LanguageLabel As AudioLanguageLabel
|
|
Get
|
|
Dim ret = If(_languageLabel, New AudioLanguageLabel())
|
|
ret.Text = If(_audioProfile IsNot Nothing, _audioProfile.Language.Name, ret.Text)
|
|
Return ret
|
|
End Get
|
|
Set
|
|
_languageLabel = Value
|
|
End Set
|
|
End Property
|
|
|
|
Public Property NameLabel As AudioNameButtonLabel
|
|
Get
|
|
Dim ret = If(_nameLabel, New AudioNameButtonLabel())
|
|
ret.Text = If(_audioProfile IsNot Nothing, g.ConvertPath(_audioProfile.Name), g.ConvertPath(ret.Text))
|
|
Return ret
|
|
End Get
|
|
Set
|
|
_nameLabel = Value
|
|
End Set
|
|
End Property
|
|
|
|
Public Property RowLabel As AudioRowLabel
|
|
Get
|
|
Dim ret = If(_rowLabel, New AudioRowLabel(_index))
|
|
Return ret
|
|
End Get
|
|
Set
|
|
_rowLabel = Value
|
|
End Set
|
|
End Property
|
|
|
|
Public Property TextEdit As AudioTextEdit
|
|
Get
|
|
Dim ret = If(_textEdit, New AudioTextEdit())
|
|
ret.Text = If(ret.Text <> "", ret.Text, _audioProfile.File)
|
|
Return ret
|
|
End Get
|
|
Set
|
|
_textEdit = Value
|
|
End Set
|
|
End Property
|
|
|
|
Private Sub New()
|
|
End Sub
|
|
|
|
Public Sub New(index As Integer)
|
|
_index = index
|
|
End Sub
|
|
|
|
Public Sub Remove()
|
|
_audioProfile.Reset(Index)
|
|
|
|
If Index >= 0 Then
|
|
Dim ap = s.AudioProfiles.FirstOrDefault(Function(x)
|
|
Dim n1 = x.Name.Trim()
|
|
Dim n2 = _audioProfile.Name.Trim()
|
|
If n1.Contains("~") Then n1 = n1.Left("~").Trim()
|
|
If n2.Contains("~") Then n2 = n2.Left("~").Trim()
|
|
Return n1 = n2
|
|
End Function)
|
|
|
|
If ap IsNot Nothing Then
|
|
g.LoadAudioProfile(ap, Index)
|
|
End If
|
|
End If
|
|
|
|
_textEdit.Text = ""
|
|
_textEdit.Refresh()
|
|
End Sub
|
|
End Class
|
|
|
|
|
|
<Serializable()>
|
|
Public Class ObjectStorage
|
|
Private StringDictionary As New Dictionary(Of String, String)
|
|
Private IntDictionary As New Dictionary(Of String, Integer)
|
|
Private DoubleDictionary As New Dictionary(Of String, Double)
|
|
Private BoolDictionaryValue As Dictionary(Of String, Boolean)
|
|
|
|
ReadOnly Property BoolDictionary() As Dictionary(Of String, Boolean)
|
|
Get
|
|
If BoolDictionaryValue Is Nothing Then
|
|
BoolDictionaryValue = New Dictionary(Of String, Boolean)
|
|
End If
|
|
|
|
Return BoolDictionaryValue
|
|
End Get
|
|
End Property
|
|
|
|
Function GetBool(key As String) As Boolean
|
|
Return GetBool(key, False)
|
|
End Function
|
|
|
|
Function GetBool(key As String, defaultValue As Boolean) As Boolean
|
|
If BoolDictionary.ContainsKey(key) Then
|
|
Return BoolDictionary(key)
|
|
End If
|
|
|
|
Return defaultValue
|
|
End Function
|
|
|
|
Sub SetBool(key As String, Value As Boolean)
|
|
BoolDictionary(key) = Value
|
|
End Sub
|
|
|
|
Function GetInt(key As String) As Integer
|
|
Return GetInt(key, 0)
|
|
End Function
|
|
|
|
Function GetInt(key As String, defaultValue As Integer) As Integer
|
|
If IntDictionary.ContainsKey(key) Then
|
|
Return IntDictionary(key)
|
|
End If
|
|
|
|
Return defaultValue
|
|
End Function
|
|
|
|
Sub SetInt(key As String, value As Integer)
|
|
IntDictionary(key) = value
|
|
End Sub
|
|
|
|
Function GetDouble(key As String) As Double
|
|
Return GetDouble(key, 0.0)
|
|
End Function
|
|
|
|
Function GetDouble(key As String, defaultValue As Double) As Double
|
|
If DoubleDictionary.ContainsKey(key) Then
|
|
Return DoubleDictionary(key)
|
|
End If
|
|
|
|
Return defaultValue
|
|
End Function
|
|
|
|
Sub SetDouble(key As String, value As Double)
|
|
DoubleDictionary(key) = value
|
|
End Sub
|
|
|
|
Function GetString(key As String, Optional defaultValue As String = Nothing) As String
|
|
If StringDictionary.ContainsKey(key) Then
|
|
Return StringDictionary(key)
|
|
End If
|
|
|
|
Return defaultValue
|
|
End Function
|
|
|
|
Sub SetString(key As String, value As String)
|
|
If value Is Nothing Then
|
|
If StringDictionary.ContainsKey(key) Then
|
|
StringDictionary.Remove(key)
|
|
End If
|
|
Else
|
|
StringDictionary(key) = value
|
|
End If
|
|
End Sub
|
|
End Class
|
|
|
|
Public Enum CompCheckAction
|
|
[Nothing]
|
|
<DispName("image size")> AdjustImageSize
|
|
<DispName("file size")> AdjustFileSize
|
|
End Enum
|
|
|
|
<Serializable()>
|
|
Public Class EventCommand
|
|
Property Name As String = "???"
|
|
Property Enabled As Boolean = True
|
|
Property CriteriaList As New List(Of Criteria)
|
|
Property OrOnly As Boolean
|
|
Property CommandParameters As CommandParameters
|
|
Property [Event] As ApplicationEvent
|
|
|
|
Overrides Function ToString() As String
|
|
Return Name
|
|
End Function
|
|
End Class
|
|
|
|
Public Enum DynamicMenuItemID
|
|
AudioProfiles
|
|
EncoderProfiles
|
|
FilterSetupProfiles
|
|
MuxerProfiles
|
|
RecentProjects
|
|
TemplateProjects
|
|
HelpApplications
|
|
Scripts
|
|
AddFilters
|
|
InsertFilters
|
|
ReplaceFilters
|
|
FilterCategory
|
|
End Enum
|
|
|
|
Public Class Startup
|
|
<STAThread()>
|
|
Shared Sub Main()
|
|
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf g.OnUnhandledException
|
|
Application.EnableVisualStyles()
|
|
Application.SetCompatibleTextRenderingDefault(False)
|
|
Dim loadSettings = g.SettingsFile.FileExists()
|
|
If loadSettings Then g.LoadSettings()
|
|
Application.Run(New MainForm(Not loadSettings))
|
|
End Sub
|
|
End Class
|
|
|
|
Public Class GUIDS
|
|
Shared Property LAVSplitter As String = "{171252A0-8820-4AFE-9DF8-5C92B2D66B04}"
|
|
Shared Property LAVVideoDecoder As String = "{EE30215D-164F-4A92-A4EB-9D4C13390F9F}"
|
|
Shared Property HaaliMuxer As String = "{A28F324B-DDC5-4999-AA25-D3A7E25EF7A8}"
|
|
End Class
|
|
|
|
Public Class M2TSStream
|
|
Property Checked As Boolean
|
|
Property Codec As String = ""
|
|
Property ID As Integer
|
|
Property IsAudio As Boolean
|
|
Property IsChapters As Boolean
|
|
Property IsSubtitle As Boolean
|
|
Property IsVideo As Boolean
|
|
Property IsVideoEnhancementLayer As Boolean
|
|
Property Language As New Language
|
|
Property ListViewItem As ListViewItem
|
|
Property Options As String = ""
|
|
Property OutputType As String = ""
|
|
Property Text As String = "Nothing"
|
|
Property TypeID As Integer
|
|
|
|
Sub UpdateListViewItem()
|
|
ListViewItem.Text = ToString()
|
|
End Sub
|
|
|
|
Public Overrides Function ToString() As String
|
|
Dim ret = Text
|
|
|
|
If ret.Contains("TrueHD/AC3") Then
|
|
ret = ret.Replace("TrueHD/AC3", "THD+AC3")
|
|
End If
|
|
|
|
If ret.Contains("DTS Master Audio") Then
|
|
ret = ret.Replace("DTS Master Audio", "DTS-MA")
|
|
End If
|
|
|
|
If ret.Contains("DTS Hi-Res") Then
|
|
ret = ret.Replace("DTS Hi-Res", "DTS-HRA")
|
|
End If
|
|
|
|
If ret.Contains("DTS Express") Then
|
|
ret = ret.Replace("DTS Express", "DTS-EX")
|
|
End If
|
|
|
|
If IsAudio Then
|
|
ret += " -> " + OutputType
|
|
|
|
If Options <> "" Then
|
|
ret += ": " + Options
|
|
End If
|
|
End If
|
|
|
|
Return ret
|
|
End Function
|
|
End Class
|
|
|
|
<Serializable>
|
|
Public Class AudioStream
|
|
Property [Default] As Boolean
|
|
Property BitDepth As Integer
|
|
Property Bitrate As Integer
|
|
Property Bitrate2 As Integer
|
|
Property Channels As Integer
|
|
Property Channels2 As Integer
|
|
Property Commentary As Boolean
|
|
Property Delay As Integer
|
|
Property Enabled As Boolean = True
|
|
Property Forced As Boolean
|
|
Property Format As String
|
|
Property FormatProfile As String
|
|
Property FormatString As String
|
|
Property ID As Integer
|
|
Property Index As Integer
|
|
Property Language As Language
|
|
Property Lossy As Boolean
|
|
Property SamplingRate As Integer
|
|
Property SBR As Boolean
|
|
Property StreamOrder As Integer
|
|
Property Title As String
|
|
|
|
ReadOnly Property Name As String
|
|
Get
|
|
Dim ret = "#" & Index + 1
|
|
|
|
If FormatProfile.EqualsAny(
|
|
"TrueHD+Atmos / TrueHD",
|
|
"E-AC-3+Atmos / E-AC-3",
|
|
"TrueHD+Atmos / TrueHD / AC-3") Then
|
|
|
|
ret += " Atmos"
|
|
ElseIf FormatString = "TrueHD / AC3" Then
|
|
ret += " TrueHD"
|
|
ElseIf FormatString = "MPEG-1 Audio layer 2" Then
|
|
ret += " MP2"
|
|
ElseIf FormatString = "MPEG-1 Audio layer 3" Then
|
|
ret += " MP3"
|
|
ElseIf FormatString = "MPEG Audio" Then
|
|
If FormatProfile = "Layer 2" Then ret += " MP2"
|
|
If FormatProfile = "Layer 3" Then ret += " MP3"
|
|
ElseIf FormatString = "AC3+" OrElse Format = "E-AC-3" Then
|
|
ret += " EAC3"
|
|
ElseIf Format = "MLP FBA" Then
|
|
ret += " TrueHD"
|
|
ElseIf FormatString = "DTS XLL" OrElse FormatProfile.StartsWith("MA /") Then
|
|
ret += " DTSMA"
|
|
ElseIf FormatString = "DTS XLL X" Then
|
|
ret += " DTSX"
|
|
ElseIf FormatProfile.StartsWith("HRA /") Then
|
|
ret += " DTSHRA"
|
|
ElseIf FormatString = "AC-3" Then
|
|
ret += " AC3"
|
|
Else
|
|
ret += " " + FormatString
|
|
End If
|
|
|
|
If Not ret.Contains("Atmos") Then
|
|
If Channels <> Channels2 AndAlso Channels > 0 AndAlso Channels2 > 0 Then
|
|
ret += " " & Channels & "/" & Channels2 & "ch"
|
|
ElseIf Channels > 0 Then
|
|
ret += " " & Channels & "ch"
|
|
ElseIf Channels2 > 0 Then
|
|
ret += " " & Channels2 & "ch"
|
|
End If
|
|
End If
|
|
|
|
If BitDepth > 0 AndAlso Not Lossy Then
|
|
ret += " " & BitDepth & "Bit"
|
|
End If
|
|
|
|
If SamplingRate > 0 Then
|
|
If SamplingRate Mod 1000 = 0 Then
|
|
ret += " " & SamplingRate / 1000 & "kHz"
|
|
Else
|
|
ret += " " & SamplingRate & "Hz"
|
|
End If
|
|
End If
|
|
|
|
If Bitrate2 > 0 Then
|
|
ret += " " & If(Bitrate = 0, "?", Bitrate.ToString) & "/" & Bitrate2 & "Kbps"
|
|
ElseIf Bitrate > 0 Then
|
|
ret += " " & Bitrate & "Kbps"
|
|
End If
|
|
|
|
If Delay <> 0 Then
|
|
ret += " " & Delay & "ms"
|
|
End If
|
|
|
|
If Language.TwoLetterCode <> "iv" Then
|
|
ret += " " + Language.EnglishName
|
|
End If
|
|
|
|
If Title <> "" AndAlso Title <> " " Then
|
|
ret += " " + Title
|
|
End If
|
|
|
|
Return ret
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property ExtFull() As String
|
|
Get
|
|
Return "." + Ext
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property Ext() As String
|
|
Get
|
|
Select Case FormatString
|
|
Case "AAC LC", "AAC LC-SBR", "AAC LC-SBR-PS", "AAC LC SBR"
|
|
Return "m4a"
|
|
Case "AC3", "AC-3"
|
|
Return "ac3"
|
|
Case "DTS"
|
|
Return "dts"
|
|
Case "DTS-HD", "DTS XLL", "DTS XLL X", "DTS XBR", "DTS ES XLL"
|
|
Return "dtshd"
|
|
Case "PCM", "ADPCM"
|
|
Return "wav"
|
|
Case "MPEG-1 Audio layer 2"
|
|
Return "mp2"
|
|
Case "MPEG-1 Audio layer 3"
|
|
Return "mp3"
|
|
Case "MPEG Audio"
|
|
If FormatProfile = "Layer 2" Then Return "mp2"
|
|
If FormatProfile = "Layer 3" Then Return "mp3"
|
|
Case "TrueHD / AC3"
|
|
Return "thd"
|
|
Case "FLAC"
|
|
Return "flac"
|
|
Case "Vorbis"
|
|
Return "ogg"
|
|
Case "Opus"
|
|
Return "opus"
|
|
Case "TrueHD", "Atmos / TrueHD", "MLP FBA 16-ch"
|
|
Return "thd"
|
|
Case "AC3+", "E-AC-3"
|
|
Return "eac3"
|
|
Case Else
|
|
Select Case Format
|
|
Case "MLP FBA"
|
|
Return "thd"
|
|
Case "E-AC-3"
|
|
Return "eac3"
|
|
Case Else
|
|
Return "mka"
|
|
End Select
|
|
End Select
|
|
End Get
|
|
End Property
|
|
|
|
Public Overrides Function ToString() As String
|
|
Return Name
|
|
End Function
|
|
End Class
|
|
|
|
Public Class VideoStream
|
|
Property Format As String
|
|
Property StreamOrder As Integer
|
|
Property ID As Integer
|
|
Property Index As Integer
|
|
|
|
ReadOnly Property Ext() As String
|
|
Get
|
|
Select Case Format
|
|
Case "MPEG Video"
|
|
Return "mpg"
|
|
Case "AVC"
|
|
Return "h264"
|
|
Case "MPEG-4 Visual", "JPEG"
|
|
Return "avi"
|
|
Case "HEVC"
|
|
Return "h265"
|
|
Case "AV1", "VP8", "VP9"
|
|
Return "ivf"
|
|
Case Else
|
|
Return ""
|
|
End Select
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property ExtFull() As String
|
|
Get
|
|
Return "." + Ext
|
|
End Get
|
|
End Property
|
|
End Class
|
|
|
|
<Serializable()>
|
|
Public Class Subtitle
|
|
Property Title As String = ""
|
|
Property Path As String
|
|
Property CodecString As String
|
|
Property Format As String
|
|
Property ID As Integer
|
|
Property StreamOrder As Integer
|
|
Property Index As Integer
|
|
Property IndexIDX As Integer
|
|
Property Language As Language
|
|
Property [Default] As Boolean
|
|
Property Forced As Boolean
|
|
Property Commentary As Boolean
|
|
Property Hearingimpaired As Boolean
|
|
Property Enabled As Boolean = True
|
|
Property Size As Long
|
|
|
|
Sub New()
|
|
Language = New Language
|
|
End Sub
|
|
|
|
Sub New(lang As Language)
|
|
Language = lang
|
|
End Sub
|
|
|
|
ReadOnly Property Filename As String
|
|
Get
|
|
Dim ret = "ID" & (Index + 1)
|
|
ret += "_[" + Language.Name + "]"
|
|
|
|
If Title <> "" AndAlso Title <> " " AndAlso p.SourceFile <> "" Then
|
|
ret += " {" + Title.Shorten(50).EscapeIllegalFileSysChars + "}"
|
|
End If
|
|
|
|
Return ret
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property ExtFull As String
|
|
Get
|
|
Return "." + Ext
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property Ext As String
|
|
Get
|
|
Select Case CodecString
|
|
Case "VobSub"
|
|
Return "idx"
|
|
Case "S_HDMV/PGS", "PGS"
|
|
Return "sup"
|
|
Case "S_TEXT/ASS", "ASS"
|
|
Return "ass"
|
|
Case "S_TEXT/UTF8", "UTF-8", "SubRip", "Timed", "Timed Text"
|
|
Return "srt"
|
|
Case "S_TEXT/SSA", "SSA"
|
|
Return "ssa"
|
|
Case "S_TEXT/USF", "USF"
|
|
Return "usf"
|
|
Case "S_DVBSUB", "DVB Subtitle"
|
|
Return "mks"
|
|
End Select
|
|
|
|
Select Case Format
|
|
Case "VobSub"
|
|
Return "idx"
|
|
Case "S_HDMV/PGS", "PGS"
|
|
Return "sup"
|
|
Case "S_TEXT/ASS", "ASS"
|
|
Return "ass"
|
|
Case "S_TEXT/UTF8", "UTF-8", "SubRip", "Timed", "Timed Text"
|
|
Return "srt"
|
|
Case "S_TEXT/SSA", "SSA"
|
|
Return "ssa"
|
|
Case "S_TEXT/USF", "USF"
|
|
Return "usf"
|
|
Case "S_DVBSUB", "DVB Subtitle"
|
|
Return "mks"
|
|
End Select
|
|
|
|
Dim extension = Path.Ext()
|
|
If String.IsNullOrWhiteSpace(extension) Then extension = "srt"
|
|
Return extension
|
|
End Get
|
|
End Property
|
|
|
|
ReadOnly Property TypeName As String
|
|
Get
|
|
Dim ret = ExtFull
|
|
If ret = "" Then ret = Path.ExtFull
|
|
Return ret.TrimStart("."c).ToUpperInvariant.Replace("SUP", "PGS").Replace("IDX", "VobSub")
|
|
End Get
|
|
End Property
|
|
|
|
Shared Function Create(path As String) As List(Of Subtitle)
|
|
path = path.TrimQuotes()
|
|
Dim ret As New List(Of Subtitle)
|
|
|
|
If New FileInfo(path).Length = 0 Then Return ret
|
|
|
|
If path.Ext = "idx" Then
|
|
Dim indexData As Integer
|
|
Dim st As Subtitle = Nothing
|
|
|
|
For Each line In path.ReadAllText.SplitLinesNoEmpty
|
|
If line.StartsWith("id: ") AndAlso line Like "id: ??, index: *" Then
|
|
st = New Subtitle
|
|
|
|
Try
|
|
st.Language = New Language(New CultureInfo(line.Substring(4, 2)))
|
|
Catch
|
|
st.Language = New Language(CultureInfo.InvariantCulture)
|
|
End Try
|
|
|
|
Dim autoCode = p.PreferredSubtitles.ToLowerInvariant.SplitNoEmptyAndWhiteSpace(",", ";", " ")
|
|
Dim prefLang = autoCode.ContainsAny("all", st.Language.TwoLetterCode, st.Language.ThreeLetterCode) OrElse p.SubtitleMode = SubtitleMode.All
|
|
Dim goodMode = p.SubtitleMode <> SubtitleMode.PreferredNoMux AndAlso p.SubtitleMode <> SubtitleMode.Disabled
|
|
st.Enabled = prefLang AndAlso goodMode
|
|
st.Forced = path.ToLowerEx().Contains("forced")
|
|
st.Commentary = path.ToLowerEx().Contains("commentary")
|
|
st.Hearingimpaired = path.ToLowerEx().Contains("hearingimpaired")
|
|
|
|
st.IndexIDX = CInt(Regex.Match(line, ", index: (\d+)").Groups(1).Value)
|
|
End If
|
|
|
|
If st IsNot Nothing AndAlso line.StartsWith("timestamp: ") Then
|
|
st.StreamOrder = indexData
|
|
st.Path = path
|
|
indexData += 1
|
|
st.Size = CInt(New FileInfo(path).Length / SizePrefix.Base)
|
|
Dim subFile = path.ChangeExt("sub")
|
|
If File.Exists(subFile) Then st.Size += New FileInfo(subFile).Length
|
|
ret.Add(st)
|
|
st = Nothing
|
|
End If
|
|
Next
|
|
ElseIf path.Ext.EqualsAny("mkv", "mp4", "m2ts", "webm") Then
|
|
For Each st In MediaInfo.GetSubtitles(path)
|
|
If st.Size = 0 Then
|
|
Select Case st.TypeName
|
|
Case "SRT"
|
|
st.Size = 10L * p.TargetSeconds
|
|
Case "VobSub"
|
|
st.Size = 1250L * p.TargetSeconds
|
|
Case "PGS"
|
|
st.Size = 5000L * p.TargetSeconds
|
|
End Select
|
|
End If
|
|
|
|
Dim autoCode = p.PreferredSubtitles.ToLowerInvariant.SplitNoEmptyAndWhiteSpace(",", ";", " ")
|
|
Dim prefLang = autoCode.ContainsAny("all", st.Language.TwoLetterCode, st.Language.ThreeLetterCode) OrElse p.SubtitleMode = SubtitleMode.All
|
|
Dim goodMode = p.SubtitleMode <> SubtitleMode.PreferredNoMux AndAlso p.SubtitleMode <> SubtitleMode.Disabled
|
|
st.Enabled = prefLang AndAlso goodMode
|
|
st.Path = path
|
|
|
|
ret.Add(st)
|
|
Next
|
|
Else
|
|
Dim st As New Subtitle With {
|
|
.Size = New FileInfo(path).Length
|
|
}
|
|
Dim idMatch = Regex.Match(path, "\\ID(\d+)")
|
|
|
|
If idMatch.Success Then
|
|
st.StreamOrder = idMatch.Groups(1).Value.ToInt - 1
|
|
End If
|
|
|
|
Dim trackname = g.ExtractTrackNameFromFilename(path)
|
|
st.Title = If(trackname, st.Title)
|
|
st.Language = g.ExtractLanguageFromPath(path)
|
|
Dim autoCode = p.PreferredSubtitles.ToLowerInvariant.SplitNoEmptyAndWhiteSpace(",", ";", " ")
|
|
Dim prefLang = autoCode.ContainsAny("all", st.Language.TwoLetterCode, st.Language.ThreeLetterCode) OrElse p.SubtitleMode = SubtitleMode.All
|
|
Dim goodMode = p.SubtitleMode <> SubtitleMode.PreferredNoMux AndAlso p.SubtitleMode <> SubtitleMode.Disabled
|
|
st.Enabled = prefLang AndAlso goodMode
|
|
st.Path = path
|
|
st.Forced = path.Base.ToLowerEx().Contains("forced")
|
|
st.Commentary = path.Base.ToLowerEx().Contains("commentary")
|
|
st.Hearingimpaired = path.Base.ToLowerEx().ContainsAny("hearingimpaired", "sdh")
|
|
|
|
For Each i In autoCode
|
|
If i.IsInt AndAlso st.Path.Contains("ID" & i.ToInt & " ") Then
|
|
st.Enabled = True
|
|
End If
|
|
Next
|
|
|
|
ret.Add(st)
|
|
End If
|
|
|
|
Dim enabledSubs = ret.Where(Function(val) val.Enabled)
|
|
|
|
Select Case p.DefaultSubtitle
|
|
Case DefaultSubtitleMode.Single
|
|
If enabledSubs.Count = 1 Then enabledSubs(0).Default = True
|
|
Case DefaultSubtitleMode.First
|
|
If enabledSubs.Count > 0 Then enabledSubs(0).Default = True
|
|
Case DefaultSubtitleMode.Second
|
|
If enabledSubs.Count > 1 Then enabledSubs(1).Default = True
|
|
Case DefaultSubtitleMode.Default
|
|
For Each st In enabledSubs
|
|
If st.Path.Contains("_default") Then st.Default = True
|
|
Next
|
|
Case DefaultSubtitleMode.DefaultOrFirst
|
|
If enabledSubs.Any() Then enabledSubs(0).Default = True
|
|
|
|
For Each st In enabledSubs
|
|
If st.Path.Contains("_default") Then st.Default = True
|
|
Next
|
|
End Select
|
|
|
|
For Each st In ret
|
|
If p.SubtitleName <> "" Then
|
|
st.Title = p.SubtitleName
|
|
End If
|
|
Next
|
|
|
|
For Each st In ret
|
|
If p.DefaultSubtitle = DefaultSubtitleMode.English Then
|
|
If st.Language.TwoLetterCode = "en" Then
|
|
st.Default = True
|
|
Exit For
|
|
End If
|
|
ElseIf p.DefaultSubtitle = DefaultSubtitleMode.Native Then
|
|
If st.Language.TwoLetterCode = Language.CurrentCulture.TwoLetterCode Then
|
|
st.Default = True
|
|
Exit For
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
Return ret
|
|
End Function
|
|
|
|
Shared Sub Cut(subtitles As List(Of Subtitle))
|
|
If p.Ranges.Count = 0 OrElse TypeOf p.VideoEncoder Is NullEncoder Then
|
|
Exit Sub
|
|
End If
|
|
|
|
If Not Package.AviSynth.VerifyOK(True) Then
|
|
Throw New AbortException
|
|
End If
|
|
|
|
Dim emptySubs As New List(Of Subtitle)
|
|
|
|
For x = 0 To subtitles.Count - 1
|
|
Dim inSub = subtitles(x)
|
|
|
|
If Not inSub.Enabled OrElse Not File.Exists(inSub.Path) OrElse inSub.Path.Contains("_cut_") Then Continue For
|
|
Dim aviPath = IO.Path.Combine(p.TempDir, inSub.Path.Base + "_cut_mm.avi")
|
|
Dim d = (p.CutFrameCount / p.CutFrameRate).ToString("f9", CultureInfo.InvariantCulture)
|
|
Dim r = p.CutFrameRate.ToString("f9", CultureInfo.InvariantCulture)
|
|
Dim args = $"-f lavfi -i color=c=black:s=16x16:d={d}:r={r} -y -hide_banner -c:v ffv1 -g 1 " + aviPath.Escape
|
|
|
|
Using proc As New Proc
|
|
proc.Header = "Create avi file for subtitle cutting"
|
|
proc.SkipStrings = {"frame=", "size="}
|
|
proc.WriteLog("mkvmerge cannot cut subtitles without video so an avi file has to be created" + BR2)
|
|
proc.Encoding = Encoding.UTF8
|
|
proc.Package = Package.ffmpeg
|
|
proc.Arguments = args
|
|
proc.Start()
|
|
End Using
|
|
|
|
If Not File.Exists(aviPath) Then
|
|
Throw New ErrorAbortException("Error", "Output file missing")
|
|
Else
|
|
Log.WriteLine(MediaInfo.GetSummary(aviPath))
|
|
End If
|
|
|
|
Dim id = If(FileTypes.SubtitleSingle.Contains(inSub.Path.Ext), 0, inSub.StreamOrder)
|
|
Dim mkvPath = IO.Path.Combine(p.TempDir, inSub.Path.Base + " ID" & id & "_cut_sub.mkv")
|
|
args = "-o " + mkvPath.Escape + " " + aviPath.Escape
|
|
|
|
If Not FileTypes.SubtitleExludingContainers.Contains(inSub.Path.Ext) Then
|
|
args += " --no-audio --no-video --no-chapters --no-attachments --no-track-tags --no-global-tags"
|
|
End If
|
|
|
|
If Not FileTypes.SubtitleSingle.Contains(inSub.Path.Ext) Then args += " --subtitle-tracks " & id
|
|
args += " " + inSub.Path.Escape
|
|
args += " --split parts-frames:" + p.Ranges.Select(Function(v) v.Start & "-" & v.End).Join(",+")
|
|
args += " --ui-language en"
|
|
|
|
Using proc As New Proc
|
|
proc.Header = "Cut subtitle"
|
|
proc.SkipString = "Progress: "
|
|
proc.Encoding = Encoding.UTF8
|
|
proc.Package = Package.mkvmerge
|
|
proc.Arguments = args + " --ui-language en"
|
|
proc.AllowedExitCodes = {0, 1, 2}
|
|
proc.Start()
|
|
End Using
|
|
|
|
If Not File.Exists(mkvPath) Then
|
|
Throw New ErrorAbortException("Error", "Output file missing")
|
|
Else
|
|
Log.WriteLine(MediaInfo.GetSummary(mkvPath))
|
|
End If
|
|
|
|
Dim subPath = IO.Path.Combine(p.TempDir, inSub.Path.Base + " ID" & id & "_cut_" + inSub.ExtFull)
|
|
args = "tracks " + mkvPath.Escape + " 1:" + subPath.Escape
|
|
|
|
Using proc As New Proc
|
|
proc.Header = "Demux subtitle"
|
|
proc.SkipString = "Progress: "
|
|
proc.Encoding = Encoding.UTF8
|
|
proc.Package = Package.mkvextract
|
|
proc.Arguments = args + " --ui-language en"
|
|
proc.AllowedExitCodes = {0, 1, 2}
|
|
proc.Start()
|
|
End Using
|
|
|
|
If Not File.Exists(subPath) Then
|
|
Throw New ErrorAbortException("Error", "Output file missing")
|
|
Else
|
|
Log.WriteLine(MediaInfo.GetSummary(subPath))
|
|
End If
|
|
|
|
Dim subs = Subtitle.Create(subPath)
|
|
|
|
If Not subs.NothingOrEmpty Then
|
|
Dim outSub = Subtitle.Create(subPath)(0)
|
|
outSub.Language = inSub.Language
|
|
outSub.Title = inSub.Title
|
|
outSub.Enabled = True
|
|
outSub.Default = inSub.Default
|
|
outSub.Forced = inSub.Forced
|
|
outSub.Commentary = inSub.Commentary
|
|
outSub.Hearingimpaired = inSub.Hearingimpaired
|
|
subtitles(x) = outSub
|
|
Else
|
|
emptySubs.Add(subtitles(x))
|
|
End If
|
|
Next
|
|
|
|
For Each i In emptySubs
|
|
subtitles.Remove(i)
|
|
Next
|
|
End Sub
|
|
End Class
|
|
|
|
<Serializable>
|
|
Public Class PrimitiveStore
|
|
Property Bool As New Dictionary(Of String, Boolean)
|
|
Property Int As New Dictionary(Of String, Integer)
|
|
Property [Double] As New Dictionary(Of String, Double)
|
|
Property [String] As New Dictionary(Of String, String)
|
|
End Class
|
|
|
|
Public Enum ContainerStreamType
|
|
Unknown
|
|
Audio
|
|
Video
|
|
Subtitle
|
|
Attachment
|
|
Chapters
|
|
End Enum
|
|
|
|
Public Enum VideoComparisonFileType
|
|
AviSynthScript
|
|
Picture
|
|
VapourSynthScript
|
|
Video
|
|
End Enum
|
|
|
|
Public Class FileTypes
|
|
Shared Property AudioRaw As String() = {"aac", "eac3", "ec3", "thd"}
|
|
Shared Property Audio As String() = {"flac", "dtshd", "dtsma", "dtshr", "thd", "thd+ac3", "truehd", "aac", "ac3", "dts", "ec3", "eac3", "m4a", "mka", "mp2", "mp3", "mpa", "ogg", "opus", "pcm", "wav", "w64"}
|
|
Shared Property AudioHQ As String() = {"dtshr", "dtshd", "dtsma", "thd", "truehd", "ec3", "eac3", "thd+ac3", "flac", "pcm", "wav", "w64"}
|
|
Shared Property VideoAudio As String() = {"avi", "mp4", "mkv", "divx", "flv", "mov", "mpeg", "mpg", "ts", "m2t", "m2ts", "vob", "webm", "wmv", "pva", "ogg", "ogm", "m4v", "3gp"}
|
|
Shared Property DGDecNVInput As String() = {"264", "h264", "265", "h265", "avc", "hevc", "hvc", "mkv", "mp4", "m4v", "mpg", "vob", "ts", "m2ts", "mts", "m2t", "mpv", "m2v"}
|
|
Shared Property eac3toInput As String() = {"dts", "dtshd", "dtshr", "dtsma", "evo", "vob", "ts", "m2ts", "wav", "w64", "pcm", "raw", "flac", "ac3", "ec3", "eac3", "thd", "thd+ac3", "mlp", "mp2", "mp3", "mpa"}
|
|
Shared Property OpusencInput As String() = {"aif", "aiff", "flac", "ogg", "pcm", "wav", "w64"}
|
|
Shared Property NicAudioInput As String() = {"wav", "mp2", "mpa", "mp3", "ac3", "dts"}
|
|
Shared Property SubtitleExludingContainers As String() = {"srt", "ass", "idx", "sup", "ttxt", "ssa", "smi", "vtt", "webvtt"}
|
|
Shared Property SubtitleSingle As String() = {"srt", "ass", "sup", "ttxt", "ssa", "smi"}
|
|
Shared Property SubtitleIncludingContainers As String() = {"m2ts", "mkv", "mks", "mp4", "m4v", "ass", "idx", "smi", "srt", "ssa", "sup", "ttxt", "vtt", "webvtt"}
|
|
Shared Property TextSub As String() = {"ass", "idx", "smi", "srt", "ssa", "ttxt", "usf", "ssf", "psb", "sub", "vtt", "webvtt"}
|
|
Shared Property Projects As String() = {"srip"}
|
|
Shared Property Logs As String() = {"log"}
|
|
Shared Property Scripts As String() = {"avs", "vpy", "vs"}
|
|
Shared Property Indexes As String() = {"ffindex", "lwi"}
|
|
Shared Property IsoImage As String() = {"iso"}
|
|
Shared Property VideoComparisonInput As String() = {"264", "265", "avc", "avi", "avs", "d2v", "dgi", "dgim", "divx", "flv", "h264", "h265", "hevc", "hvc", "ivf", "m2ts", "m2t", "m2v", "mkv", "mov", "mp4", "m4v", "mpeg", "mpg", "mpv", "mts", "ogg", "ogm", "pva", "rmvb", "ts", "vdr", "vob", "vpy", "webm", "wmv", "y4m", "3gp"}
|
|
Shared Property Video As String() = {"264", "265", "3gp", "avc", "avi", "avs", "d2v", "dgi", "dgim", "divx", "flv", "h264", "h265", "hevc", "hvc", "ivf", "m2ts", "m2t", "m2v", "mkv", "mov", "mp4", "m4v", "mpeg", "mpg", "mpv", "mts", "ogg", "ogm", "pva", "rmvb", "ts", "vc1", "vdr", "vob", "vpy", "webm", "wmv", "y4m"}
|
|
Shared Property VideoIndex As String() = {"d2v", "dgi", "dga", "dgim"}
|
|
Shared Property VideoOnly As String() = {"264", "265", "avc", "gif", "h264", "h265", "hevc", "hvc", "ivf", "m2v", "mpv", "apng", "png", "vc1", "y4m"}
|
|
Shared Property VideoRaw As String() = {"264", "265", "h264", "h265", "avc", "hevc", "hvc", "ivf", "vc1"}
|
|
Shared Property VideoText As String() = {"d2v", "dgi", "dga", "dgim", "avs", "vpy"}
|
|
Shared Property VideoDemuxOutput As String() = {"avi", "mpg", "h264", "h265", "hevc"}
|
|
Shared Property Image As String() = {"bmp", "jpg", "png", "gif", "tif", "jpe", "jpeg", "psd"}
|
|
Shared Property DeezyInput As String() = VideoAudio.Concat(Audio).ToArray()
|
|
|
|
Shared Function GetFilter(values As IEnumerable(Of String)) As String
|
|
Return "*." + values.Join(";*.") + "|*." + values.Join(";*.") + "|All Files|*.*"
|
|
End Function
|
|
|
|
Shared Function VideoExtensionSupportsAudio(ext As String) As Boolean
|
|
Return Video.Contains(ext) AndAlso Not VideoOnly.Contains(ext) AndAlso
|
|
Not VideoRaw.Contains(ext) AndAlso Not VideoText.Contains(ext)
|
|
End Function
|
|
End Class
|
|
|
|
<StructLayout(LayoutKind.Sequential)>
|
|
Public Structure OSVERSIONINFOEXW
|
|
Public dwOSVersionInfoSize As UInteger
|
|
Public dwMajorVersion As UInteger
|
|
Public dwMinorVersion As UInteger
|
|
Public dwBuildNumber As UInteger
|
|
Public dwPlatformId As UInteger
|
|
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)>
|
|
Public szCSDVersion As String
|
|
Public wServicePackMajor As UShort
|
|
Public wServicePackMinor As UShort
|
|
Public wSuiteMask As UShort
|
|
Public wProductType As Byte
|
|
Public wReserved As Byte
|
|
End Structure
|
|
|
|
Public Class OSVersion
|
|
<DllImport("ntdll.dll", CharSet:=CharSet.Auto)>
|
|
Private Shared Function RtlGetVersion(ByRef osVersionInfo As OSVERSIONINFOEXW) As Integer
|
|
End Function
|
|
|
|
Private Shared _osVersionInfo As New OSVERSIONINFOEXW()
|
|
Private Shared _osVersionInfoInitialized As Boolean = False
|
|
Private Shared _versionString As String
|
|
|
|
Public Shared Sub NOSVersion()
|
|
If Not _osVersionInfoInitialized Then
|
|
_osVersionInfo.dwOSVersionInfoSize = CUInt(Marshal.SizeOf(_osVersionInfo))
|
|
_osVersionInfoInitialized = True
|
|
End If
|
|
End Sub
|
|
|
|
Public Shared ReadOnly Property VersionInfo As OSVERSIONINFOEXW
|
|
Get
|
|
If _osVersionInfo.dwMajorVersion = 0 Then
|
|
RtlGetVersion(_osVersionInfo)
|
|
End If
|
|
|
|
Return _osVersionInfo
|
|
End Get
|
|
End Property
|
|
|
|
Public Shared ReadOnly Property VersionString As String
|
|
Get
|
|
If String.IsNullOrWhiteSpace(_versionString) Then
|
|
Dim result = RtlGetVersion(_osVersionInfo)
|
|
Dim edition = Registry.LocalMachine.GetString("SOFTWARE\Microsoft\Windows NT\CurrentVersion", "EditionID")
|
|
Dim display = Registry.LocalMachine.GetString("SOFTWARE\Microsoft\Windows NT\CurrentVersion", "DisplayVersion")
|
|
_versionString = If(result = 0, $"Windows {_osVersionInfo.dwMajorVersion}.{_osVersionInfo.dwMinorVersion}.{_osVersionInfo.dwBuildNumber} {display} {edition}", "-?-").Trim()
|
|
End If
|
|
Return _versionString
|
|
End Get
|
|
End Property
|
|
End Class
|
|
|
|
Public Class OS
|
|
Public Shared ReadOnly Property EnvVars As String() = {"ALLUSERSPROFILE", "APPDATA", "CD", "CMDCMDLINE",
|
|
"CMDEXTVERSION", "CommonProgramFiles", "CommonProgramFiles(x86)", "CommonProgramW6432",
|
|
"COMPUTERNAME", "COMSPEC", "DATE", "ERRORLEVEL", "HOMEDRIVE", "HOMEPATH", "LOCALAPPDATA",
|
|
"LOGONSERVER", "NUMBER_OF_PROCESSORS", "OS", "PATH", "PATHEXT", "PROCESSOR_ARCHITECTURE",
|
|
"PROCESSOR_IDENTIFIER", "PROCESSOR_LEVEL", "PROCESSOR_REVISION", "ProgramData",
|
|
"ProgramFiles", "ProgramFiles(x86)", "ProgramW6432", "PROMPT", "PSModulePath", "PUBLIC",
|
|
"RANDOM", "SessionName", "SystemDrive", "SystemRoot", "TEMP", "TIME", "TMP", "USERDOMAIN",
|
|
"USERDOMAIN_ROAMINGPROFILE", "USERNAME", "USERPROFILE", "WINDIR"}
|
|
|
|
Private Shared VideoControllersValue As String()
|
|
|
|
Public Shared ReadOnly Property VideoControllers As String()
|
|
Get
|
|
If VideoControllersValue Is Nothing Then
|
|
Try 'bug report received
|
|
Dim mc As New ManagementClass("Win32_VideoController")
|
|
VideoControllersValue = mc.GetInstances().OfType(Of ManagementBaseObject)().Select(Function(val) CStr(val("Caption"))).ToArray
|
|
Catch ex As Exception
|
|
Return {"WMI Error"}
|
|
End Try
|
|
End If
|
|
|
|
Return VideoControllersValue
|
|
End Get
|
|
End Property
|
|
|
|
Public Class Hardware
|
|
Private Shared _cores As Integer = 0
|
|
|
|
Public Shared ReadOnly Property Cores As Integer
|
|
Get
|
|
If _cores <= 0 Then
|
|
Try 'bug report received
|
|
Using moc = New ManagementObjectSearcher("Select * from Win32_Processor").Get()
|
|
For Each mbo In moc
|
|
_cores += Integer.Parse(mbo("NumberOfCores").ToString())
|
|
Next
|
|
End Using
|
|
Catch ex As Exception
|
|
_cores = Environment.ProcessorCount \ 2
|
|
End Try
|
|
End If
|
|
|
|
Return _cores
|
|
End Get
|
|
End Property
|
|
|
|
Public Shared ReadOnly Property Threads As Integer
|
|
Get
|
|
Return Environment.ProcessorCount
|
|
End Get
|
|
End Property
|
|
|
|
Public Class Mouse
|
|
Public Shared ReadOnly Property WheelScrollLines As Integer
|
|
Get
|
|
Dim lines = 3
|
|
Dim ret As Integer
|
|
|
|
If Native.SystemParametersInfo(Native.SPI_GETWHEELSCROLLLINES, 0, ret, 0) Then lines = ret
|
|
|
|
Return lines
|
|
End Get
|
|
End Property
|
|
End Class
|
|
End Class
|
|
End Class
|
|
|
|
<Serializable>
|
|
Public Class eac3toProfile
|
|
Property Match As String
|
|
Property Output As String
|
|
Property Options As String
|
|
|
|
Sub New()
|
|
End Sub
|
|
|
|
Sub New(match As String,
|
|
output As String,
|
|
options As String)
|
|
|
|
Me.Match = match
|
|
Me.Output = output
|
|
Me.Options = options
|
|
End Sub
|
|
End Class
|
|
|
|
Public Class BitmapUtil
|
|
Property Data As Byte()
|
|
Property BitmapData As BitmapData
|
|
|
|
Function GetPixel(x As Integer, y As Integer) As Color
|
|
Dim pos = y * BitmapData.Stride + x * 4
|
|
Return Color.FromArgb(Data(pos), Data(pos + 1), Data(pos + 2))
|
|
End Function
|
|
|
|
Function GetMaxLuminance(x As Integer, y As Integer) As Single
|
|
Return GetPixel(x, y).ToColorHSL().L
|
|
End Function
|
|
|
|
Shared Function Create(bmp As Bitmap) As BitmapUtil
|
|
Dim util As New BitmapUtil
|
|
Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
|
|
util.BitmapData = bmp.LockBits(rect, Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
|
|
Dim ptr = util.BitmapData.Scan0
|
|
Dim bytesCount = Math.Abs(util.BitmapData.Stride) * bmp.Height
|
|
util.Data = New Byte(bytesCount - 1) {}
|
|
Marshal.Copy(ptr, util.Data, 0, bytesCount)
|
|
bmp.UnlockBits(util.BitmapData)
|
|
Return util
|
|
End Function
|
|
|
|
Shared Function CreateBitmap(server As IFrameServer, position As Integer) As Bitmap
|
|
Dim pitch As Integer
|
|
Dim data As IntPtr
|
|
|
|
If server.GetFrame(position, data, pitch) = 0 Then
|
|
Return New Bitmap(server.Info.Width, server.Info.Height, pitch, PixelFormat.Format32bppArgb, data)
|
|
End If
|
|
End Function
|
|
End Class
|
|
|
|
Public Class AutoCrop
|
|
Public Top As Integer()
|
|
Public Bottom As Integer()
|
|
Public Left As Integer()
|
|
Public Right As Integer()
|
|
|
|
Shared Function Start(bmp As Bitmap, threshold As Single) As AutoCrop
|
|
Dim ret As New AutoCrop
|
|
Dim u = BitmapUtil.Create(bmp)
|
|
Dim xCount = 20
|
|
Dim yCount = 20
|
|
|
|
Dim xValues(xCount) As Integer
|
|
|
|
For x = 0 To xCount
|
|
xValues(x) = CInt(bmp.Width / (xCount + 1) * x)
|
|
Next
|
|
|
|
ret.Top = New Integer(xValues.Length - 1) {}
|
|
ret.Bottom = New Integer(xValues.Length - 1) {}
|
|
|
|
For xValue = 0 To xValues.Length - 1
|
|
For y = 0 To u.BitmapData.Height \ 4
|
|
If u.GetMaxLuminance(xValues(xValue), y) < threshold Then
|
|
ret.Top(xValue) = y + 1
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next
|
|
|
|
For y = u.BitmapData.Height - 1 To u.BitmapData.Height - u.BitmapData.Height \ 4 Step -1
|
|
If u.GetMaxLuminance(xValues(xValue), y) < threshold Then
|
|
ret.Bottom(xValue) = u.BitmapData.Height - y
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next
|
|
Next
|
|
|
|
Dim yValues(yCount) As Integer
|
|
|
|
For x = 0 To yCount
|
|
yValues(x) = CInt(bmp.Height / (yCount + 1) * x)
|
|
Next
|
|
|
|
ret.Left = New Integer(yValues.Length - 1) {}
|
|
ret.Right = New Integer(yValues.Length - 1) {}
|
|
|
|
For yValue = 0 To yValues.Length - 1
|
|
For x = 0 To u.BitmapData.Width \ 4
|
|
If u.GetMaxLuminance(x, yValues(yValue)) < threshold Then
|
|
ret.Left(yValue) = x + 1
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next
|
|
|
|
For x = u.BitmapData.Width - 1 To u.BitmapData.Width - u.BitmapData.Width \ 4 Step -1
|
|
If u.GetMaxLuminance(x, yValues(yValue)) < threshold Then
|
|
ret.Right(yValue) = u.BitmapData.Width - x
|
|
Else
|
|
Exit For
|
|
End If
|
|
Next
|
|
Next
|
|
|
|
Return ret
|
|
End Function
|
|
End Class
|
|
|
|
Public Enum MsgIcon
|
|
None = MessageBoxIcon.None
|
|
Info = MessageBoxIcon.Information
|
|
[Error] = MessageBoxIcon.Error
|
|
Warning = MessageBoxIcon.Warning
|
|
Question = MessageBoxIcon.Question
|
|
End Enum
|
|
|
|
Public Enum ForceOutputModDirection
|
|
Decrease
|
|
Increase
|
|
End Enum
|
|
|
|
Public Enum ConvertTo420BitDepth
|
|
<DispName("None")> None = 0
|
|
<DispName("8")> _8 = 8
|
|
<DispName("10")> _10 = 10
|
|
<DispName("12")> _12 = 12
|
|
<DispName("14")> _14 = 14
|
|
<DispName("16")> _16 = 16
|
|
End Enum
|
|
|
|
Public Enum HdrmetadataMode
|
|
None
|
|
<DispName("HDR10+ only")> HDR10Plus
|
|
<DispName("Dolby Vision only")> DolbyVision
|
|
All
|
|
End Enum
|
|
|
|
Public Enum DoviMode
|
|
<DispName("0: Parses RPU, rewrites it untouched")> Mode0 = 0
|
|
<DispName("1: Convert RPU to be MEL compatible")> Mode1 = 1
|
|
<DispName("2: Convert RPU to be 8.1 compatible")> Mode2 = 2
|
|
<DispName("3: Convert 5 to 8.1")> Mode3 = 3
|
|
<DispName("4: Convert to 8.4")> Mode4 = 4
|
|
<DispName("5: Convert to 8.1, preserves mapping")> Mode5 = 5
|
|
End Enum
|
|
|
|
Public Enum AutoCropMode
|
|
<DispName("Disabled")> Disabled = 0
|
|
<DispName("Dolby Vision only")> DolbyVisionOnly = 1
|
|
<DispName("Always")> Always = 2
|
|
End Enum
|
|
|
|
Public Enum AutoCropFrameRangeMode
|
|
<DispName("Automatic")> Automatic = 0
|
|
<DispName("Complete")> Complete = 1
|
|
<DispName("Manual Threshold")> ManualThreshold = 2
|
|
End Enum
|
|
|
|
Public Enum AutoCropFrameSelectionMode
|
|
<DispName("Fixed Frame Number")> FixedFrames = 1
|
|
<DispName("Frame Interval")> FrameInterval = 2
|
|
<DispName("Time Interval")> TimeInterval = 3
|
|
End Enum
|
|
|
|
Public Enum AutoCropDolbyVisionMode
|
|
<DispName("Automatic")> Automatic = 0
|
|
<DispName("Manual Threshold")> ManualThreshold = 1
|
|
End Enum
|
|
|
|
Public Enum AutoCropSideMode
|
|
<DispName("All Sides")> All = 1
|
|
<DispName("Horizontal Only")> Horizontal = 2
|
|
<DispName("Vertical Only")> Vertical = 4
|
|
End Enum
|
|
|
|
Public Enum AutoCropDolbyVisionSideMode
|
|
<DispName("Apply General Setting")> NoOverride = 0
|
|
<DispName("All Sides")> All = 1
|
|
<DispName("Horizontal Only")> Horizontal = 2
|
|
<DispName("Vertical Only")> Vertical = 4
|
|
End Enum
|
|
|
|
Public Enum ShowTemplateSelectionMode
|
|
<DispName("Never")> Never = 0
|
|
<DispName("Command Line only")> CommandLine = 1 << 0
|
|
<DispName("Command Line + Drag&&Drop")> CommandLine_DragDrop = CommandLine Or DragDrop
|
|
<DispName("Command Line + Opening Menu")> CommandLine_OpeningMenu = CommandLine Or OpeningMenu
|
|
<DispName("Drag&&Drop only")> DragDrop = 1 << 1
|
|
<DispName("Drag&&Drop + Opening Menu")> DragDrop_OpeningMenu = DragDrop Or OpeningMenu
|
|
<DispName("Opening Menu only")> OpeningMenu = 1 << 2
|
|
<DispName("Always")> Always = 1 << 16
|
|
End Enum
|
|
|
|
Public Enum ShowTemplateSelectionDefaultMode
|
|
<DispName("None")> None
|
|
<DispName("Abort")> Abort
|
|
<DispName("Current/Last Template")> CurrentLast
|
|
<DispName("Startup Template")> Startup
|
|
End Enum
|
|
|
|
Public Enum TimestampsMode
|
|
Never
|
|
<DispName("VFR only")> VfrOnly
|
|
Always
|
|
End Enum
|
|
|
|
Public Enum DemuxMode
|
|
<DispName("Show Dialog")> Dialog
|
|
<DispName("Preferred Languages")> Preferred
|
|
All
|
|
None
|
|
End Enum
|
|
|
|
Public Enum SubtitleMode
|
|
<DispName("Demux and include all languages")> All
|
|
<DispName("Demux and include preferred languages")> Preferred
|
|
<DispName("Demux preferred languages but don't include them")> PreferredNoMux
|
|
<DispName("Include preferred languages directly without demuxing")> Direct
|
|
<DispName("Show dialog to choose subtitles to be included")> Dialog
|
|
<DispName("Don't include subtitles")> Disabled
|
|
End Enum
|
|
|
|
Public Enum CommandLinePresetType
|
|
Eac3to = 1
|
|
X264 = 50
|
|
MuxerMkvGeneral = 100
|
|
MuxerMp4General = 200
|
|
MuxerMp4Video = 220
|
|
TargetFileNameOverride = 1000
|
|
End Enum
|
|
|
|
Public Class StringLogicalComparer
|
|
Implements IComparer, IComparer(Of String)
|
|
|
|
<DllImport("shlwapi.dll", CharSet:=CharSet.Unicode)>
|
|
Shared Function StrCmpLogical(x As String, y As String) As Integer
|
|
End Function
|
|
|
|
Function IComparer_Compare(x As Object, y As Object) As Integer Implements IComparer.Compare
|
|
Return StrCmpLogical(x.ToString(), y.ToString())
|
|
End Function
|
|
|
|
Function IComparerOfString_Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
|
|
Return StrCmpLogical(x, y)
|
|
End Function
|
|
End Class
|
|
|
|
Public Class Comparer(Of T)
|
|
Implements IComparer(Of T)
|
|
|
|
Property PropName As String
|
|
Property Ascending As Boolean = True
|
|
|
|
Sub New(propName As String, Optional ascending As Boolean = True)
|
|
Me.PropName = propName
|
|
Me.Ascending = ascending
|
|
End Sub
|
|
|
|
Function Compare(x As T, y As T) As Integer Implements IComparer(Of T).Compare
|
|
If Not Ascending Then
|
|
Dim x1 = x
|
|
x = y
|
|
y = x1
|
|
End If
|
|
|
|
Dim type = x.GetType
|
|
Dim propInfo = type.GetProperty(PropName)
|
|
|
|
Return DirectCast(propInfo.GetValue(x), IComparable).CompareTo(propInfo.GetValue(y))
|
|
End Function
|
|
End Class
|
|
|
|
Public Enum Symbol
|
|
None = 0
|
|
[Error] = &HE783
|
|
[Like] = &HE8E1
|
|
[Next] = &HE893
|
|
[Stop] = &HE71A
|
|
Accept = &HE8FB
|
|
AcceptLegacy = &HE10B
|
|
Accident = &HE81F
|
|
AccidentSolid = &HEA8E
|
|
Accounts = &HE910
|
|
AccountsLegacy = &HE168
|
|
ActionCenter = &HE91C
|
|
ActionCenterAsterisk = &HEA21
|
|
ActionCenterMirrored = &HED0D
|
|
ActionCenterNotification = &HE7E7
|
|
ActionCenterNotificationMirrored = &HED0C
|
|
ActionCenterQuiet = &HEE79
|
|
ActionCenterQuietNotification = &HEE7A
|
|
Add = &HE710
|
|
AddFriend = &HE8FA
|
|
AddFriendLegacy = &HE1E2
|
|
AddLegacy = &HE109
|
|
AddRemoteDevice = &HE836
|
|
AddSurfaceHub = &HECC4
|
|
AddTo = &HECC8
|
|
AdjustHologram = &HEBD2
|
|
Admin = &HE7EF
|
|
AdminLegacy = &HE1A7
|
|
Airplane = &HE709
|
|
AirplaneSolid = &HEB4C
|
|
AlignCenter = &HE8E3
|
|
AlignCenterLegacy = &HE1A1
|
|
AlignLeft = &HE8E4
|
|
AlignLeftLegacy = &HE1A2
|
|
AlignRight = &HE8E2
|
|
AlignRightLegacy = &HE1A0
|
|
AllApps = &HE71D
|
|
AllAppsLegacy = &HE179
|
|
AllAppsLegacyMirrored = &HE1EC
|
|
AllAppsMirrored = &HEA40
|
|
Annotation = &HE924
|
|
AppIconDefault = &HECAA
|
|
ArrowHTMLLegacy = &HED5
|
|
ArrowHTMLLegacyMirrored = &HEAE
|
|
AspectRatio = &HE799
|
|
Asterisk = &HEA38
|
|
AsteriskBadge12 = &HEDAD
|
|
Attach = &HE723
|
|
AttachCamera = &HE8A2
|
|
AttachCameraLegacy = &HE12D
|
|
AttachLegacy = &HE16C
|
|
Audio = &HE8D6
|
|
AudioLegacy = &HE189
|
|
Back = &HE72B
|
|
BackBttnArrow20Legacy = &HEC4
|
|
BackBttnArrow42Legacy = &HEA6
|
|
BackBttnMirroredArrow20Legacy = &HEAD
|
|
BackBttnMirroredArrow42Legacy = &HEAB
|
|
BackgroundToggle = &HEF1F
|
|
BackLegacy = &HE112
|
|
BackSpaceQWERTY = &HE750
|
|
BackSpaceQWERTYLg = &HEB96
|
|
BackSpaceQWERTYMd = &HE926
|
|
BackSpaceQWERTYSm = &HE925
|
|
BackToWindow = &HE73F
|
|
BackToWindowLegacy = &HE1D8
|
|
Badge = &HEC1B
|
|
Bank = &HE825
|
|
BarcodeScanner = &HEC5A
|
|
Battery0 = &HE850
|
|
Battery1 = &HE851
|
|
Battery10 = &HE83F
|
|
Battery2 = &HE852
|
|
Battery3 = &HE853
|
|
Battery4 = &HE854
|
|
Battery5 = &HE855
|
|
Battery6 = &HE856
|
|
Battery7 = &HE857
|
|
Battery8 = &HE858
|
|
Battery9 = &HE859
|
|
BatteryCharging0 = &HE85A
|
|
BatteryCharging1 = &HE85B
|
|
BatteryCharging10 = &HEA93
|
|
BatteryCharging2 = &HE85C
|
|
BatteryCharging3 = &HE85D
|
|
BatteryCharging4 = &HE85E
|
|
BatteryCharging5 = &HE85F
|
|
BatteryCharging6 = &HE860
|
|
BatteryCharging7 = &HE861
|
|
BatteryCharging8 = &HE862
|
|
BatteryCharging9 = &HE83E
|
|
BatterySaver0 = &HE863
|
|
BatterySaver1 = &HE864
|
|
BatterySaver10 = &HEA95
|
|
BatterySaver2 = &HE865
|
|
BatterySaver3 = &HE866
|
|
BatterySaver4 = &HE867
|
|
BatterySaver5 = &HE868
|
|
BatterySaver6 = &HE869
|
|
BatterySaver7 = &HE86A
|
|
BatterySaver8 = &HE86B
|
|
BatterySaver9 = &HEA94
|
|
BatteryUnknown = &HE996
|
|
Beta = &HEA24
|
|
BidiLtr = &HE9AA
|
|
BidiRtl = &HE9AB
|
|
BlockContact = &HE8F8
|
|
BlockContactLegacy = &HE1E0
|
|
BlockedLegacy = &HE25B
|
|
Bluetooth = &HE702
|
|
BodyCam = &HEC80
|
|
Bold = &HE8DD
|
|
BoldFLegacy = &HE1B3
|
|
BoldGLegacy = &HE1B1
|
|
BoldKoreanLegacy = &HE1BD
|
|
BoldLegacy = &HE19B
|
|
BoldNLegacy = &HE1B7
|
|
BoldRussionLegacy = &HE1B9
|
|
Bookmarks = &HE8A4
|
|
BookmarksLegacy = &HE12F
|
|
BookmarksLegacyMirrored = &HE1EE
|
|
BookmarksMirrored = &HEA41
|
|
Brightness = &HE706
|
|
Broom = &HEA99
|
|
BrowsePhotos = &HE7C5
|
|
BrowsePhotosLegacy = &HE155
|
|
BrushSize = &HEDA8
|
|
BuildingEnergy = &HEC0B
|
|
BulletedList = &HE8FD
|
|
BulletedListLegacy = &HE292
|
|
BulletedListLegacyMirrored = &HE299
|
|
BulletedListMirrored = &HEA42
|
|
Bus = &HE806
|
|
BusSolid = &HEB47
|
|
Calculator = &HE8EF
|
|
CalculatorAddition = &HE948
|
|
CalculatorBackspace = &HE94F
|
|
CalculatorDivide = &HE94A
|
|
CalculatorEqualTo = &HE94E
|
|
CalculatorLegacy = &HE1D0
|
|
CalculatorMultiply = &HE947
|
|
CalculatorNegate = &HE94D
|
|
CalculatorPercentage = &HE94C
|
|
CalculatorSquareroot = &HE94B
|
|
CalculatorSubtract = &HE949
|
|
Calendar = &HE787
|
|
CalendarDay = &HE8BF
|
|
CalendarDayLegacy = &HE161
|
|
CalendarLegacy = &HE163
|
|
CalendarLegacyMirrored = &HE1DC
|
|
CalendarMirrored = &HED28
|
|
CalendarReply = &HE8F5
|
|
CalendarReplyLegacy = &HE1DB
|
|
CalendarSolid = &HEA89
|
|
CalendarWeek = &HE8C0
|
|
CalendarWeekLegacy = &HE162
|
|
CaligraphyPen = &HEDFB
|
|
CallForwarding = &HE7F2
|
|
CallForwardingMirrored = &HEA97
|
|
CallForwardInternational = &HE87A
|
|
CallForwardInternationalMirrored = &HEA43
|
|
CallForwardRoaming = &HE87B
|
|
CallForwardRoamingMirrored = &HEA44
|
|
Camera = &HE722
|
|
CameraLegacy = &HE114
|
|
Cancel = &HE711
|
|
CancelLegacy = &HE10A
|
|
Caption = &HE8BA
|
|
CaptionLegacy = &HE15A
|
|
Car = &HE804
|
|
CashDrawer = &HEC59
|
|
CC = &HE7F0
|
|
CCEuroLegacy = &HE18F
|
|
CCJapanLegacy = &HE18E
|
|
CCLegacy = &HE190
|
|
CellPhone = &HE8EA
|
|
CellPhoneLegacy = &HE1C9
|
|
Certificate = &HEB95
|
|
Characters = &HE8C1
|
|
CharactersLegacy = &HE164
|
|
ChatBubbles = &HE8F2
|
|
Checkbox = &HE739
|
|
CheckboxComposite = &HE73A
|
|
CheckboxCompositeLegacy = &HEA2
|
|
CheckboxCompositeReversed = &HE73D
|
|
CheckboxCompositeReversedLegacy = &HE5
|
|
CheckboxFill = &HE73B
|
|
CheckboxFillLegacy = &HE2
|
|
CheckboxFillZeroWidthLegacy = &HE9
|
|
CheckboxIndeterminate = &HE73C
|
|
CheckboxIndeterminateLegacy = &HE4
|
|
CheckboxLegacy = &HE3
|
|
CheckMark = &HE73E
|
|
CheckMarkLegacy = &HE1
|
|
CheckmarkListviewLegacy = &HE81
|
|
CheckmarkMenuLegacy = &HEE7
|
|
CheckMarkZeroWidthLegacy = &HE8
|
|
ChevronDown = &HE70D
|
|
ChevronDown1Legacy = &HE99
|
|
ChevronDown2Legacy = &HE9D
|
|
ChevronDown3Legacy = &HE15
|
|
ChevronDown4Legacy = &HEA1
|
|
ChevronDownMed = &HE972
|
|
ChevronDownSmall = &HE96E
|
|
ChevronDownSmLegacy = &HE228
|
|
ChevronFlipDownLegacy = &HEE5
|
|
ChevronFlipLeftLegacy = &HEE2
|
|
ChevronFlipRightLegacy = &HEE3
|
|
ChevronFlipUpLegacy = &HEE4
|
|
ChevronLeft = &HE76B
|
|
ChevronLeft1Legacy = &HE96
|
|
ChevronLeft2Legacy = &HE9A
|
|
ChevronLeft3Legacy = &HE12
|
|
ChevronLeft4Legacy = &HE9E
|
|
ChevronLeftMed = &HE973
|
|
ChevronLeftSmall = &HE96F
|
|
ChevronLeftSmLegacy = &HE26C
|
|
ChevronRight = &HE76C
|
|
ChevronRight1Legacy = &HE97
|
|
ChevronRight2Legacy = &HE9B
|
|
ChevronRight3Legacy = &HE13
|
|
ChevronRight4Legacy = &HE9F
|
|
ChevronRightMed = &HE974
|
|
ChevronRightSmall = &HE970
|
|
ChevronRightSmLegacy = &HE26B
|
|
ChevronUp = &HE70E
|
|
ChevronUp1Legacy = &HE98
|
|
ChevronUp2Legacy = &HE9C
|
|
ChevronUp3Legacy = &HE14
|
|
ChevronUp4Legacy = &HEA0
|
|
ChevronUpMed = &HE971
|
|
ChevronUpSmall = &HE96D
|
|
ChineseBoPoMoFo = &HE989
|
|
ChineseChangjie = &HE981
|
|
ChinesePinyin = &HE98A
|
|
ChineseQuick = &HE984
|
|
ChromeAnnotate = &HE931
|
|
ChromeBack = &HE830
|
|
ChromeBackMirrored = &HEA47
|
|
ChromeBackToWindow = &HE92C
|
|
ChromeClose = &HE8BB
|
|
ChromeFullScreen = &HE92D
|
|
ChromeMaximize = &HE922
|
|
ChromeMinimize = &HE921
|
|
ChromeRestore = &HE923
|
|
CircleFill = &HEA3B
|
|
CircleFillBadge12 = &HEDB0
|
|
CircleRing = &HEA3A
|
|
CircleRingBadge12 = &HEDAF
|
|
CityNext = &HEC06
|
|
CityNext2 = &HEC07
|
|
Clear = &HE894
|
|
ClearAllInk = &HED62
|
|
ClearAllInkMirrored = &HEF19
|
|
ClearLegacy = &HE106
|
|
ClearSelection = &HE8E6
|
|
ClearSelectionLegacy = &HE1C5
|
|
ClearSelectionLegacyMirrored = &HE1F4
|
|
ClearSelectionMirrored = &HEA48
|
|
Click = &HE8B0
|
|
ClockLegacy = &HE121
|
|
ClosePane = &HE89F
|
|
ClosePaneLegacy = &HE126
|
|
ClosePaneLegacyMirrored = &HE1BF
|
|
ClosePaneMirrored = &HEA49
|
|
Cloud = &HE753
|
|
CloudPrinter = &HEDA6
|
|
Code = &HE943
|
|
Color = &HE790
|
|
ColorLegacy = &HE2B1
|
|
CommaKey = &HE9AD
|
|
CommandPrompt = &HE756
|
|
Comment = &HE90A
|
|
CommentInlineLegacy = &HE206
|
|
CommentLegacy = &HE134
|
|
Communications = &HE95A
|
|
CompanionApp = &HEC64
|
|
CompanionDeviceFramework = &HED5D
|
|
Completed = &HE930
|
|
CompletedSolid = &HEC61
|
|
Component = &HE950
|
|
Connect = &HE703
|
|
ConnectApp = &HED5C
|
|
Construction = &HE822
|
|
ConstructionCone = &HE98F
|
|
ConstructionSolid = &HEA8D
|
|
Contact = &HE77B
|
|
Contact2 = &HE8D4
|
|
Contact2Legacy = &HE187
|
|
Contact3Legacy = &HE2AF
|
|
ContactInfo = &HE779
|
|
ContactInfoLegacy = &HE136
|
|
ContactInfoMirrored = &HEA4A
|
|
ContactLegacy = &HE13D
|
|
ContactPresence = &HE8CF
|
|
ContactPresenceLegacy = &HE181
|
|
ContactSolid = &HEA8C
|
|
Copy = &HE8C8
|
|
CopyLegacy = &HE16F
|
|
Courthouse = &HEC08
|
|
Crop = &HE7A8
|
|
CropLegacy = &HE123
|
|
Cut = &HE8C6
|
|
CutLegacy = &HE16B
|
|
DashKey = &HE9AE
|
|
DataSense = &HE791
|
|
DataSenseBar = &HE7A5
|
|
DateTime = &HEC92
|
|
DateTimeMirrored = &HEE93
|
|
DecreaseIndentLegacy = &HE290
|
|
DecreaseIndentLegacyMirrored = &HE297
|
|
DefenderApp = &HE83D
|
|
Delete = &HE74D
|
|
DeleteLegacy = &HE107
|
|
DeveloperTools = &HEC7A
|
|
DeviceDiscovery = &HEBDE
|
|
DeviceLaptopNoPic = &HE7F8
|
|
DeviceLaptopPic = &HE7F7
|
|
DeviceMonitorLeftPic = &HE7FA
|
|
DeviceMonitorNoPic = &HE7FB
|
|
DeviceMonitorRightPic = &HE7F9
|
|
Devices = &HE772
|
|
Devices2 = &HE975
|
|
Devices3 = &HEA6C
|
|
Devices4 = &HEB66
|
|
DevicesLegacy = &HE212
|
|
DevUpdate = &HECC5
|
|
Diagnostic = &HE9D9
|
|
Dialpad = &HE75F
|
|
DialUp = &HE83C
|
|
Dictionary = &HE82D
|
|
DictionaryAdd = &HE82E
|
|
DictionaryCloud = &HEBC3
|
|
DirectAccess = &HE83B
|
|
Directions = &HE8F0
|
|
DirectionsLegacy = &HE1D1
|
|
DisableUpdates = &HE8D8
|
|
DisableUpdatesLegacy = &HE194
|
|
DisconnectDisplay = &HEA14
|
|
DisconnectDrive = &HE8CD
|
|
DisconnectDriveLegacy = &HE17A
|
|
Dislike = &HE8E0
|
|
DislikeLegacy = &HE19E
|
|
DMC = &HE951
|
|
Dock = &HE952
|
|
DockBottom = &HE90E
|
|
DockBottomLegacy = &HE147
|
|
DockLeft = &HE90C
|
|
DockLeftLegacy = &HE145
|
|
DockLeftLegacyMirrored = &HE1AB
|
|
DockLeftMirrored = &HEA4C
|
|
DockRight = &HE90D
|
|
DockRightLegacy = &HE146
|
|
DockRightLegacyMirrored = &HE1AC
|
|
DockRightMirrored = &HEA4B
|
|
Document = &HE8A5
|
|
DocumentLegacy = &HE130
|
|
Down = &HE74B
|
|
DownLegacy = &HE1FD
|
|
Download = &HE896
|
|
DownloadLegacy = &HE118
|
|
DownloadMap = &HE826
|
|
DownShiftKey = &HE84A
|
|
Draw = &HEC87
|
|
DrawSolid = &HEC88
|
|
DrivingMode = &HE7EC
|
|
Drop = &HEB42
|
|
DullSound = &HE911
|
|
DullSoundKey = &HE9AF
|
|
EaseOfAccess = &HE776
|
|
EaseOfAccessLegacy = &HE7F
|
|
Edit = &HE70F
|
|
EditLegacy = &HE104
|
|
EditLegacyMirrored = &HE1C2
|
|
EditMirrored = &HEB7E
|
|
Education = &HE7BE
|
|
Emoji = &HE899
|
|
Emoji2 = &HE76E
|
|
Emoji2Legacy = &HE170
|
|
EmojiLegacy = &HE11D
|
|
EmojiSwatch = &HED5B
|
|
EmojiTabCelebrationObjects = &HED55
|
|
EmojiTabFavorites = &HED5A
|
|
EmojiTabFoodPlants = &HED56
|
|
EmojiTabPeople = &HED53
|
|
EmojiTabSmilesAnimals = &HED54
|
|
EmojiTabSymbols = &HED58
|
|
EmojiTabTextSmiles = &HED59
|
|
EmojiTabTransitPlaces = &HED57
|
|
EndPoint = &HE81B
|
|
EndPointSolid = &HEB4B
|
|
EraseTool = &HE75C
|
|
EraseToolFill = &HE82B
|
|
EraseToolFill2 = &HE82C
|
|
ErrorBadge = &HEA39
|
|
ErrorBadge12 = &HEDAE
|
|
eSIM = &HED2A
|
|
eSIMBusy = &HED2D
|
|
eSIMLocked = &HED2C
|
|
eSIMNoProfile = &HED2B
|
|
Ethernet = &HE839
|
|
EthernetError = &HEB55
|
|
EthernetWarning = &HEB56
|
|
ExpandTile = &HE976
|
|
ExpandTileLegacy = &HE13F
|
|
ExpandTileLegacyMirrored = &HE176
|
|
ExpandTileMirrored = &HEA4E
|
|
ExploreContent = &HECCD
|
|
Export = &HEDE1
|
|
ExportMirrored = &HEDE2
|
|
FastForward = &HEB9D
|
|
Favorite2Legacy = &HE249
|
|
FavoriteInlineLegacy = &HE208
|
|
FavoriteLegacy = &HE113
|
|
FavoriteList = &HE728
|
|
FavoriteStar = &HE734
|
|
FavoriteStarFill = &HE735
|
|
Feedback = &HED15
|
|
FeedbackApp = &HE939
|
|
Ferry = &HE7E3
|
|
FerrySolid = &HEB48
|
|
FileExplorer = &HEC50
|
|
FileExplorerApp = &HEC51
|
|
Filter = &HE71C
|
|
FilterLegacy = &HE16E
|
|
FindLegacy = &HE11A
|
|
FingerInking = &HED5F
|
|
Fingerprint = &HE928
|
|
Flag = &HE7C1
|
|
FlagLegacy = &HE129
|
|
Flashlight = &HE754
|
|
FlickDown = &HE935
|
|
FlickLeft = &HE937
|
|
FlickRight = &HE938
|
|
FlickUp = &HE936
|
|
Folder = &HE8B7
|
|
FolderFill = &HE8D5
|
|
FolderLegacy = &HE188
|
|
Font = &HE8D2
|
|
FontColor = &HE8D3
|
|
FontColorKoreanLegacy = &HE1BE
|
|
FontColorLegacy = &HE186
|
|
FontDecrease = &HE8E7
|
|
FontDecreaseLegacy = &HE1C6
|
|
FontIncrease = &HE8E8
|
|
FontIncreaseLegacy = &HE1C7
|
|
FontLegacy = &HE185
|
|
FontSize = &HE8E9
|
|
FontSizeLegacy = &HE1C8
|
|
FontStyleKoreanLegacy = &HE1BA
|
|
Forward = &HE72A
|
|
ForwardLegacy = &HE111
|
|
ForwardSm = &HE9AC
|
|
FourBars = &HE908
|
|
FourBarsLegacy = &HE1E9
|
|
Frigid = &HE9CA
|
|
FullAlpha = &HE97F
|
|
FullCircleMask = &HE91F
|
|
FullHiragana = &HE986
|
|
FullKatakana = &HE987
|
|
FullScreen = &HE740
|
|
FullScreenLegacy = &HE1D9
|
|
Game = &HE7FC
|
|
GameConsole = &HE967
|
|
GlobalNavButton = &HE700
|
|
Globe = &HE774
|
|
GlobeLegacy = &HE12B
|
|
Go = &HE8AD
|
|
GoLegacy = &HE143
|
|
GoLegacyMirrored = &HE1AA
|
|
GoMirrored = &HEA4F
|
|
GoToStart = &HE8FC
|
|
GoToStartLegacy = &HE1E4
|
|
GotoToday = &HE8D1
|
|
GotoTodayLegacy = &HE184
|
|
GripperBarHorizontal = &HE76F
|
|
GripperBarVertical = &HE784
|
|
GripperResize = &HE788
|
|
GripperResizeMirrored = &HEA50
|
|
GripperTool = &HE75E
|
|
Groceries = &HEC09
|
|
GuestUser = &HEE57
|
|
HalfAlpha = &HE97E
|
|
HalfDullSound = &HE9B0
|
|
HalfKatakana = &HE988
|
|
HalfStarLeft = &HE7C6
|
|
HalfStarRight = &HE7C7
|
|
Handwriting = &HE929
|
|
HangUp = &HE778
|
|
HangUpLegacy = &HE137
|
|
HardDrive = &HEDA2
|
|
Headphone = &HE7F6
|
|
Headphone0 = &HED30
|
|
Headphone1 = &HED31
|
|
Headphone2 = &HED32
|
|
Headphone3 = &HED33
|
|
Headset = &HE95B
|
|
Health = &HE95E
|
|
Heart = &HEB51
|
|
HeartBroken = &HEA92
|
|
HeartBrokenLegacy = &HE7
|
|
HeartBrokenZeroWidthLegacy = &HEC
|
|
HeartFill = &HEB52
|
|
HeartFillLegacy = &HEA5
|
|
HeartFillZeroWidthLegacy = &HEB
|
|
HeartLegacy = &HE6
|
|
Help = &HE897
|
|
HelpLegacy = &HE11B
|
|
HelpLegacyMirrored = &HE1F3
|
|
HelpMirrored = &HEA51
|
|
HideBcc = &HE8C5
|
|
HideBccLegacy = &HE16A
|
|
Highlight = &HE7E6
|
|
HighlightFill = &HE891
|
|
HighlightFill2 = &HE82A
|
|
HighlightLegacy = &HE193
|
|
History = &HE81C
|
|
Home = &HE80F
|
|
HomeGroup = &HEC26
|
|
HomeLegacy = &HE10F
|
|
HomeSolid = &HEA8A
|
|
HorizontalTabKey = &HE7FD
|
|
IBeam = &HE933
|
|
IBeamOutline = &HE934
|
|
ImageExport = &HEE71
|
|
Import = &HE8B5
|
|
ImportAll = &HE8B6
|
|
ImportAllLegacy = &HE151
|
|
ImportAllLegacyMirrored = &HE1AE
|
|
ImportAllMirrored = &HEA53
|
|
Important = &HE8C9
|
|
ImportantBadge12 = &HEDB1
|
|
ImportantLegacy = &HE171
|
|
ImportLegacy = &HE150
|
|
ImportLegacyMirrored = &HE1AD
|
|
ImportMirrored = &HEA52
|
|
IncidentTriangle = &HE814
|
|
IncreaseIndentLegacy = &HE291
|
|
IncreaseIndentLegacyMirrored = &HE298
|
|
Info = &HE946
|
|
Info2 = &HEA1F
|
|
InkingCaret = &HED65
|
|
InkingColorFill = &HED67
|
|
InkingColorOutline = &HED66
|
|
InkingTool = &HE76D
|
|
InkingToolFill = &HE88F
|
|
InkingToolFill2 = &HE829
|
|
InPrivate = &HE727
|
|
Input = &HE961
|
|
InsiderHubApp = &HEC24
|
|
InternetSharing = &HE704
|
|
Italic = &HE8DB
|
|
ItalicCLegacy = &HE1B0
|
|
ItalicILegacy = &HE1B6
|
|
ItalicKLegacy = &HE1B4
|
|
ItalicKoreanLegacy = &HE1BC
|
|
ItalicLegacy = &HE199
|
|
ItalicRussianLegacy = &HE1EA
|
|
Japanese = &HE985
|
|
JpnRomanji = &HE87C
|
|
JpnRomanjiLock = &HE87D
|
|
JpnRomanjiShift = &HE87E
|
|
JpnRomanjiShiftLock = &HE87F
|
|
Key12On = &HE980
|
|
KeyboardBrightness = &HED39
|
|
KeyboardClassic = &HE765
|
|
KeyboardDismiss = &HE92F
|
|
KeyboardFull = &HEC31
|
|
KeyboardLeftHanded = &HE763
|
|
KeyBoardLegacy = &HE144
|
|
KeyboardLowerBrightness = &HED3A
|
|
KeyboardOneHanded = &HED4C
|
|
KeyboardRightHanded = &HE764
|
|
KeyboardShortcut = &HEDA7
|
|
KeyboardSplit = &HE766
|
|
KeyboardSplitLegacy = &HE8F
|
|
KeyboardStandard = &HE92E
|
|
KeyboardStandardLegacy = &HE87
|
|
Korean = &HE97D
|
|
Label = &HE932
|
|
LangJPN = &HE7DE
|
|
LanguageChs = &HE88D
|
|
LanguageCht = &HE88C
|
|
LanguageJpn = &HEC45
|
|
LanguageKor = &HE88B
|
|
LaptopSelected = &HEC76
|
|
LayoutLegacy = &HE2AE
|
|
Leaf = &HE8BE
|
|
LeaveChat = &HE89B
|
|
LeaveChatLegacy = &HE11F
|
|
LeaveChatMirrored = &HEA54
|
|
LEDLight = &HE781
|
|
LeftArrowKeyTime0 = &HEC52
|
|
LeftDoubleQuote = &HE9B2
|
|
LeftQuote = &HE848
|
|
LengthLegacy = &HE2AD
|
|
Library = &HE8F1
|
|
LibraryLegacy = &HE1D3
|
|
Light = &HE793
|
|
Lightbulb = &HEA80
|
|
LightningBolt = &HE945
|
|
LikeDislike = &HE8DF
|
|
LikeDislikeLegacy = &HE19D
|
|
LikeInlineLegacy = &HE209
|
|
LikeLegacy = &HE19F
|
|
Link = &HE71B
|
|
LinkLegacy = &HE167
|
|
List = &HEA37
|
|
ListLegacy = &HE14C
|
|
ListLegacyMirrored = &HE175
|
|
ListMirrored = &HEA55
|
|
Location = &HE81D
|
|
LocationLegacy = &HE1D2
|
|
Lock = &HE72E
|
|
LockLegacy = &HE1F6
|
|
LockscreenDesktop = &HEE3F
|
|
LockScreenGlance = &HEE65
|
|
LowerBrightness = &HEC8A
|
|
MagStripeReader = &HEC5C
|
|
Mail = &HE715
|
|
MailBadge12 = &HEDB3
|
|
MailFill = &HE8A8
|
|
MailFillLegacy = &HE135
|
|
MailForward = &HE89C
|
|
MailForwardLegacy = &HE120
|
|
MailForwardLegacyMirrored = &HE1A8
|
|
MailForwardMirrored = &HEA56
|
|
MailLegacy = &HE119
|
|
MailMessageLegacy = &HE20B
|
|
MailReply = &HE8CA
|
|
MailReplyAll = &HE8C2
|
|
MailReplyAllLegacy = &HE165
|
|
MailReplyAllLegacyMirrored = &HE1F2
|
|
MailReplyAllMirrored = &HEA58
|
|
MailReplyLegacy = &HE172
|
|
MailReplyLegacyMirrored = &HE1AF
|
|
MailReplyMirrored = &HEA57
|
|
Manage = &HE912
|
|
ManageLegacy = &HE178
|
|
MapCompassBottom = &HE813
|
|
MapCompassTop = &HE812
|
|
MapDirections = &HE816
|
|
MapDrive = &HE8CE
|
|
MapDriveLegacy = &HE17B
|
|
MapLayers = &HE81E
|
|
MapLegacy = &HE1C4
|
|
MapPin = &HE707
|
|
MapPin2 = &HE7B7
|
|
MapPinLegacy = &HE139
|
|
Marker = &HED64
|
|
Marquee = &HEF20
|
|
Media = &HEA69
|
|
MediaStorageTower = &HE965
|
|
Megaphone = &HE789
|
|
Memo = &HE77C
|
|
MemoLegacy = &HE1D5
|
|
Message = &HE8BD
|
|
MessageLegacy = &HE15F
|
|
MicClipping = &HEC72
|
|
MicError = &HEC56
|
|
MicOff = &HEC54
|
|
MicOn = &HEC71
|
|
Microphone = &HE720
|
|
MicrophoneLegacy = &HE1D6
|
|
MicSleep = &HEC55
|
|
MiracastLogoLarge = &HEC16
|
|
MiracastLogoSmall = &HEC15
|
|
MobActionCenter = &HEC42
|
|
MobAirplane = &HEC40
|
|
MobBattery0 = &HEBA0
|
|
MobBattery1 = &HEBA1
|
|
MobBattery10 = &HEBAA
|
|
MobBattery2 = &HEBA2
|
|
MobBattery3 = &HEBA3
|
|
MobBattery4 = &HEBA4
|
|
MobBattery5 = &HEBA5
|
|
MobBattery6 = &HEBA6
|
|
MobBattery7 = &HEBA7
|
|
MobBattery8 = &HEBA8
|
|
MobBattery9 = &HEBA9
|
|
MobBatteryCharging0 = &HEBAB
|
|
MobBatteryCharging1 = &HEBAC
|
|
MobBatteryCharging10 = &HEBB5
|
|
MobBatteryCharging2 = &HEBAD
|
|
MobBatteryCharging3 = &HEBAE
|
|
MobBatteryCharging4 = &HEBAF
|
|
MobBatteryCharging5 = &HEBB0
|
|
MobBatteryCharging6 = &HEBB1
|
|
MobBatteryCharging7 = &HEBB2
|
|
MobBatteryCharging8 = &HEBB3
|
|
MobBatteryCharging9 = &HEBB4
|
|
MobBatterySaver0 = &HEBB6
|
|
MobBatterySaver1 = &HEBB7
|
|
MobBatterySaver10 = &HEBC0
|
|
MobBatterySaver2 = &HEBB8
|
|
MobBatterySaver3 = &HEBB9
|
|
MobBatterySaver4 = &HEBBA
|
|
MobBatterySaver5 = &HEBBB
|
|
MobBatterySaver6 = &HEBBC
|
|
MobBatterySaver7 = &HEBBD
|
|
MobBatterySaver8 = &HEBBE
|
|
MobBatterySaver9 = &HEBBF
|
|
MobBatteryUnknown = &HEC02
|
|
MobBluetooth = &HEC41
|
|
MobCallForwarding = &HEC7E
|
|
MobCallForwardingMirrored = &HEC7F
|
|
MobDrivingMode = &HEC47
|
|
MobileContactLegacy = &HE25A
|
|
MobileLocked = &HEC20
|
|
MobileSelected = &HEC75
|
|
MobileTablet = &HE8CC
|
|
MobLocation = &HEC43
|
|
MobQuietHours = &HEC46
|
|
MobSignal1 = &HEC37
|
|
MobSignal2 = &HEC38
|
|
MobSignal3 = &HEC39
|
|
MobSignal4 = &HEC3A
|
|
MobSignal5 = &HEC3B
|
|
MobWifi1 = &HEC3C
|
|
MobWifi2 = &HEC3D
|
|
MobWifi3 = &HEC3E
|
|
MobWifi4 = &HEC3F
|
|
MobWifiHotspot = &HEC44
|
|
More = &HE712
|
|
MoreLegacy = &HE10C
|
|
Mouse = &HE962
|
|
MoveToFolder = &HE8DE
|
|
MoveToFolderLegacy = &HE19C
|
|
Movies = &HE8B2
|
|
MultimediaDMP = &HED47
|
|
MultimediaDMS = &HE953
|
|
MultimediaDVR = &HE954
|
|
MultimediaPMP = &HE955
|
|
MultiSelect = &HE762
|
|
MultiSelectLegacy = &HE133
|
|
MultiSelectLegacyMirrored = &HE1EF
|
|
MultiSelectMirrored = &HEA98
|
|
Multitask = &HE7C4
|
|
Multitask16 = &HEE40
|
|
MultitaskExpanded = &HEB91
|
|
MusicAlbum = &HE93C
|
|
MusicInfo = &HE90B
|
|
MusicInfoLegacy = &HE142
|
|
MusicNote = &HEC4F
|
|
Mute = &HE74F
|
|
MuteLegacy = &HE198
|
|
MyNetwork = &HEC27
|
|
Narrator = &HED4D
|
|
NarratorForward = &HEDA9
|
|
NarratorForwardMirrored = &HEDAA
|
|
Network = &HE968
|
|
NetworkAdapter = &HEDA3
|
|
NetworkPrinter = &HEDA5
|
|
NetworkTower = &HEC05
|
|
NewFolder = &HE8F4
|
|
NewFolderLegacy = &HE1DA
|
|
NewWindow = &HE78B
|
|
NewWindowLegacy = &HE17C
|
|
NextLegacy = &HE101
|
|
NUIFace = &HEB68
|
|
NUIFPContinueSlideAction = &HEB85
|
|
NUIFPContinueSlideHand = &HEB84
|
|
NUIFPPressAction = &HEB8B
|
|
NUIFPPressHand = &HEB8A
|
|
NUIFPPressRepeatAction = &HEB8D
|
|
NUIFPPressRepeatHand = &HEB8C
|
|
NUIFPRollLeftAction = &HEB89
|
|
NUIFPRollLeftHand = &HEB88
|
|
NUIFPRollRightHand = &HEB86
|
|
NUIFPRollRightHandAction = &HEB87
|
|
NUIFPStartSlideAction = &HEB83
|
|
NUIFPStartSlideHand = &HEB82
|
|
NUIIris = &HEB67
|
|
OEM = &HE74C
|
|
OneBar = &HE905
|
|
OneBarLegacy = &HE1E6
|
|
OpenFile = &HE8E5
|
|
OpenFileLegacy = &HE1A5
|
|
OpenInNewWindow = &HE8A7
|
|
OpenInNewWindowLegacy = &HE2B4
|
|
OpenLocal = &HE8DA
|
|
OpenLocalLegacy = &HE197
|
|
OpenPane = &HE8A0
|
|
OpenPaneLegacy = &HE127
|
|
OpenPaneLegacyMirrored = &HE1C0
|
|
OpenPaneMirrored = &HEA5B
|
|
OpenWith = &HE7AC
|
|
OpenWithLegacy = &HE17D
|
|
OpenWithLegacyMirrored = &HE1ED
|
|
OpenWithMirrored = &HEA5C
|
|
Orientation = &HE8B4
|
|
OrientationLegacy = &HE14F
|
|
OtherUser = &HE7EE
|
|
OtherUserLegacy = &HE1A6
|
|
OutlineStarLegacy = &HE1CE
|
|
Package = &HE7B8
|
|
Page = &HE7C3
|
|
PageFillLegacy = &HE132
|
|
PageLeft = &HE760
|
|
PageLegacy = &HE160
|
|
PageRight = &HE761
|
|
PageSolid = &HE729
|
|
PanMode = &HECE9
|
|
ParkingLocation = &HE811
|
|
ParkingLocationMirrored = &HEA5E
|
|
ParkingLocationSolid = &HEA8B
|
|
PartyLeader = &HECA7
|
|
PasswordKeyHide = &HE9A9
|
|
PasswordKeyShow = &HE9A8
|
|
Paste = &HE77F
|
|
PasteLegacy = &HE16D
|
|
Pause = &HE769
|
|
PauseBadge12 = &HEDB4
|
|
PauseLegacy = &HE103
|
|
PC1 = &HE977
|
|
PC1Legacy = &HE211
|
|
Pencil = &HED63
|
|
PenPalette = &HEE56
|
|
PenPaletteMirrored = &HEF16
|
|
PenWorkspace = &HEDC6
|
|
PenWorkspaceMirrored = &HEF15
|
|
People = &HE716
|
|
PeopleLegacy = &HE125
|
|
PeriodKey = &HE843
|
|
Permissions = &HE8D7
|
|
PermissionsLegacy = &HE192
|
|
PersonalFolder = &HEC25
|
|
Personalize = &HE771
|
|
Phone = &HE717
|
|
PhoneBook = &HE780
|
|
PhoneBookLegacy = &HE1D4
|
|
PhoneLegacy = &HE13A
|
|
Photo = &HE91B
|
|
Photo2 = &HEB9F
|
|
Picture = &HE8B9
|
|
PictureLegacy = &HE158
|
|
PieSingle = &HEB05
|
|
Pin = &HE718
|
|
PinFill = &HE841
|
|
PinLegacy = &HE141
|
|
Pinned = &HE840
|
|
PinnedFill = &HE842
|
|
PlaceFolderLegacy = &HE18A
|
|
PLAP = &HEC19
|
|
Play = &HE768
|
|
Play36 = &HEE4A
|
|
PlaybackRate1x = &HEC57
|
|
PlaybackRateOther = &HEC58
|
|
PlayBadge12 = &HEDB5
|
|
PlayLegacy = &HE102
|
|
PlayOnLegacy = &HE29B
|
|
PointErase = &HED61
|
|
PointEraseMirrored = &HEF18
|
|
PoliceCar = &HEC81
|
|
PostUpdate = &HE8F3
|
|
PostUpdateLegacy = &HE1D7
|
|
PowerButton = &HE7E8
|
|
PresenceChicklet = &HE978
|
|
PresenceChickletLegacy = &HE25E
|
|
PresenceChickletVideo = &HE979
|
|
PresenceChickletVideoLegacy = &HE25D
|
|
Preview = &HE8FF
|
|
PreviewLegacy = &HE295
|
|
PreviewLink = &HE8A1
|
|
PreviewLinkLegacy = &HE12A
|
|
Previous = &HE892
|
|
PreviousLegacy = &HE100
|
|
Print = &HE749
|
|
Printer3D = &HE914
|
|
Printer3DLegacy = &HE2F7
|
|
PrintfaxPrinterFile = &HE956
|
|
PrintLegacy = &HE2F6
|
|
Priority = &HE8D0
|
|
PriorityLegacy = &HE182
|
|
Process = &HE9F3
|
|
Project = &HEBC6
|
|
Projector = &HE95D
|
|
ProtectedDocument = &HE8A6
|
|
ProtectedDocumentLegacy = &HE131
|
|
ProvisioningPackage = &HE835
|
|
PuncKey = &HE844
|
|
PuncKey0 = &HE84C
|
|
PuncKey1 = &HE9B4
|
|
PuncKey2 = &HE9B5
|
|
PuncKey3 = &HE9B6
|
|
PuncKey4 = &HE9B7
|
|
PuncKey5 = &HE9B8
|
|
PuncKey6 = &HE9B9
|
|
PuncKey7 = &HE9BB
|
|
PuncKey8 = &HE9BC
|
|
PuncKey9 = &HE9BA
|
|
PuncKeyLeftBottom = &HE84D
|
|
PuncKeyRightBottom = &HE9B3
|
|
Puzzle = &HEA86
|
|
QuickNote = &HE70B
|
|
QuietHours = &HE708
|
|
QWERTYOff = &HE983
|
|
QWERTYOn = &HE982
|
|
RadioBtnOff = &HECCA
|
|
RadioBtnOn = &HECCB
|
|
RadioBullet = &HE915
|
|
RadioBullet2 = &HECCC
|
|
RatingStarFillLegacy = &HEB4
|
|
RatingStarFillReducedPaddingHTMLLegacy = &HE82
|
|
RatingStarFillSmallLegacy = &HEB5
|
|
RatingStarFillZeroWidthLegacy = &HEA
|
|
RatingStarLegacy = &HE224
|
|
Read = &HE8C3
|
|
ReadingList = &HE7BC
|
|
ReadLegacy = &HE166
|
|
ReceiptPrinter = &HEC5B
|
|
Recent = &HE823
|
|
Record = &HE7C8
|
|
RecordLegacy = &HE1F5
|
|
Redo = &HE7A6
|
|
RedoLegacy = &HE10D
|
|
ReduceTileLegacy = &HE140
|
|
ReduceTileLegacyMirrored = &HE177
|
|
Refresh = &HE72C
|
|
RefreshLegacy = &HE149
|
|
RememberedDevice = &HE70C
|
|
Reminder = &HEB50
|
|
ReminderFill = &HEB4F
|
|
Remote = &HE8AF
|
|
RemoteLegacy = &HE148
|
|
Remove = &HE738
|
|
RemoveFrom = &HECC9
|
|
RemoveLegacy = &HE108
|
|
Rename = &HE8AC
|
|
RenameLegacy = &HE13E
|
|
Repair = &HE90F
|
|
RepairLegacy = &HE15E
|
|
RepeatAll = &HE8EE
|
|
RepeatAllLegacy = &HE1CD
|
|
RepeatOne = &HE8ED
|
|
RepeatOneLegacy = &HE1CC
|
|
Reply = &HE97A
|
|
ReplyLegacy = &HE248
|
|
ReplyMirrored = &HEE35
|
|
ReportHacked = &HE730
|
|
ReportHackedLegacy = &HE1DE
|
|
ResetDevice = &HED10
|
|
ResetDrive = &HEBC4
|
|
Reshare = &HE8EB
|
|
ReshareLegacy = &HE1CA
|
|
ResizeMouseLarge = &HE747
|
|
ResizeMouseMedium = &HE744
|
|
ResizeMouseMediumMirrored = &HEA5F
|
|
ResizeMouseSmall = &HE743
|
|
ResizeMouseSmallMirrored = &HEA60
|
|
ResizeMouseTall = &HE746
|
|
ResizeMouseTallMirrored = &HEA61
|
|
ResizeMouseWide = &HE745
|
|
ResizeTouchLarger = &HE741
|
|
ResizeTouchNarrower = &HE7EA
|
|
ResizeTouchNarrowerMirrored = &HEA62
|
|
ResizeTouchShorter = &HE7EB
|
|
ResizeTouchSmaller = &HE742
|
|
ResolutionLegacy = &HE2AC
|
|
ReturnKey = &HE751
|
|
ReturnKeyLg = &HEB97
|
|
ReturnKeySm = &HE966
|
|
ReturnToWindow = &HE944
|
|
ReturnToWindowLegacy = &HE2B3
|
|
RevealPasswordLegacy = &HE52
|
|
RevToggleKey = &HE845
|
|
Rewind = &HEB9E
|
|
RightArrowKeyTime0 = &HEBE7
|
|
RightArrowKeyTime1 = &HE846
|
|
RightArrowKeyTime2 = &HE847
|
|
RightArrowKeyTime3 = &HE84E
|
|
RightArrowKeyTime4 = &HE84F
|
|
RightDoubleQuote = &HE9B1
|
|
RightQuote = &HE849
|
|
Ringer = &HEA8F
|
|
RingerBadge12 = &HEDAC
|
|
RingerSilent = &HE7ED
|
|
RoamingDomestic = &HE879
|
|
RoamingInternational = &HE878
|
|
Robot = &HE99A
|
|
Rotate = &HE7AD
|
|
RotateCamera = &HE89E
|
|
RotateCameraLegacy = &HE124
|
|
RotateLegacy = &HE14A
|
|
RotateMapLeft = &HE80D
|
|
RotateMapRight = &HE80C
|
|
RotationLock = &HE755
|
|
Ruler = &HED5E
|
|
Save = &HE74E
|
|
SaveAs = &HE792
|
|
SaveAsLegacy = &HE28F
|
|
SaveCopy = &HEA35
|
|
SaveLegacy = &HE105
|
|
SaveLocal = &HE78C
|
|
SaveLocalLegacy = &HE159
|
|
Scan = &HE8FE
|
|
ScanLegacy = &HE294
|
|
ScrollChevronDownBoldLegacy = &HE19
|
|
ScrollChevronDownLegacy = &HE11
|
|
ScrollChevronLeftBoldLegacy = &HE16
|
|
ScrollChevronLeftLegacy = &HEE
|
|
ScrollChevronRightBoldLegacy = &HE17
|
|
ScrollChevronRightLegacy = &HEF
|
|
ScrollChevronUpBoldLegacy = &HE18
|
|
ScrollChevronUpLegacy = &HE10
|
|
ScrollMode = &HECE7
|
|
ScrollUpDown = &HEC8F
|
|
SDCard = &HE7F1
|
|
Search = &HE721
|
|
SearchAndApps = &HE773
|
|
SearchboxLegacy = &HE94
|
|
SelectAll = &HE8B3
|
|
SelectAllLegacy = &HE14E
|
|
SemanticZoomLegacy = &HEB8
|
|
Send = &HE724
|
|
SendFill = &HE725
|
|
SendFillMirrored = &HEA64
|
|
SendLegacy = &HE122
|
|
SendMirrored = &HEA63
|
|
Sensor = &HE957
|
|
SetlockScreen = &HE7B5
|
|
SetlockScreenLegacy = &HE18C
|
|
SetTile = &HE97B
|
|
SetTileLegacy = &HE18D
|
|
Settings = &HE713
|
|
SettingsBattery = &HEE63
|
|
SettingsDisplaySound = &HE7F3
|
|
SettingsLegacy = &HE115
|
|
Share = &HE72D
|
|
ShareBroadband = &HE83A
|
|
Shield = &HEA18
|
|
Shop = &HE719
|
|
ShopLegacy = &HE14D
|
|
ShoppingCart = &HE7BF
|
|
ShowAllFiles1Legacy = &HE153
|
|
ShowAllFiles3Legacy = &HE152
|
|
ShowAllFilesLegacy = &HE154
|
|
ShowBcc = &HE8C4
|
|
ShowBccLegacy = &HE169
|
|
ShowResults = &HE8BC
|
|
ShowResultsLegacy = &HE15C
|
|
ShowResultsLegacyMirrored = &HE1F1
|
|
ShowResultsMirrored = &HEA65
|
|
Shuffle = &HE8B1
|
|
ShuffleLegacy = &HE14B
|
|
SignalBars1 = &HE86C
|
|
SignalBars2 = &HE86D
|
|
SignalBars3 = &HE86E
|
|
SignalBars4 = &HE86F
|
|
SignalBars5 = &HE870
|
|
SignalError = &HED2E
|
|
SignalNotConnected = &HE871
|
|
SignalRoaming = &HEC1E
|
|
SIMLock = &HE875
|
|
SIMMissing = &HE876
|
|
SIPMove = &HE759
|
|
SIPRedock = &HE75B
|
|
SIPUndock = &HE75A
|
|
SizeLegacy = &HE2B2
|
|
SkipBack10 = &HED3C
|
|
SkipForward30 = &HED3D
|
|
SliderThumb = &HEC13
|
|
Slideshow = &HE786
|
|
SlideshowLegacy = &HE173
|
|
SlowMotionOn = &HEA79
|
|
Smartcard = &HE963
|
|
SmartcardVirtual = &HE964
|
|
SolidStarLegacy = &HE1CF
|
|
Sort = &HE8CB
|
|
SortLegacy = &HE174
|
|
Speakers = &HE7F5
|
|
SpeedHigh = &HEC4A
|
|
SpeedMedium = &HEC49
|
|
SpeedOff = &HEC48
|
|
StartPoint = &HE819
|
|
StartPointSolid = &HEB49
|
|
StatusCircle = &HEA81
|
|
StatusCircleLeft = &HEBFD
|
|
StatusConnecting1 = &HEB57
|
|
StatusConnecting2 = &HEB58
|
|
StatusDataTransfer = &HE880
|
|
StatusDataTransferVPN = &HE881
|
|
StatusDualSIM1 = &HE884
|
|
StatusDualSIM1VPN = &HE885
|
|
StatusDualSIM2 = &HE882
|
|
StatusDualSIM2VPN = &HE883
|
|
StatusError = &HEA83
|
|
StatusErrorFull = &HEB90
|
|
StatusErrorLeft = &HEBFF
|
|
StatusSGLTE = &HE886
|
|
StatusSGLTECell = &HE887
|
|
StatusSGLTEDataVPN = &HE888
|
|
StatusTriangle = &HEA82
|
|
StatusTriangleLeft = &HEBFE
|
|
StatusUnsecure = &HEB59
|
|
StatusVPN = &HE889
|
|
StatusWarning = &HEA84
|
|
StatusWarningLeft = &HEC00
|
|
StockDown = &HEB0F
|
|
StockUp = &HEB11
|
|
StopLegacy = &HE15B
|
|
StopPoint = &HE81A
|
|
StopPointSolid = &HEB4A
|
|
StopSlideshowLegacy = &HE191
|
|
Stopwatch = &HE916
|
|
StorageNetworkWireless = &HE969
|
|
StorageOptical = &HE958
|
|
StorageTape = &HE96A
|
|
Streaming = &HE93E
|
|
StreamingEnterprise = &HED2F
|
|
Street = &HE913
|
|
StreetLegacy = &HE1C3
|
|
StreetsideSplitExpand = &HE803
|
|
StreetsideSplitMinimize = &HE802
|
|
StrokeErase = &HED60
|
|
StrokeEraseMirrored = &HEF17
|
|
Subtitles = &HED1E
|
|
SubtitlesAudio = &HED1F
|
|
SurfaceHub = &HE8AE
|
|
Sustainable = &HEC0A
|
|
Swipe = &HE927
|
|
SwipeRevealArt = &HEC6D
|
|
Switch = &HE8AB
|
|
SwitchApps = &HE8F9
|
|
SwitchAppsLegacy = &HE1E1
|
|
SwitchLegacy = &HE13C
|
|
SwitchUser = &HE748
|
|
Sync = &HE895
|
|
SyncBadge12 = &HEDAB
|
|
SyncError = &HEA6A
|
|
SyncFolder = &HE8F7
|
|
SyncFolderLegacy = &HE1DF
|
|
SyncLegacy = &HE117
|
|
System = &HE770
|
|
Tablet = &HE70A
|
|
TabletMode = &HEBFC
|
|
TabletSelected = &HEC74
|
|
Tag = &HE8EC
|
|
TagLegacy = &HE1CB
|
|
TapAndSend = &HE9A1
|
|
TaskbarPhone = &HEE64
|
|
ThisPC = &HEC4E
|
|
ThoughtBubble = &HEA91
|
|
ThreeBars = &HE907
|
|
ThreeBarsLegacy = &HE1E8
|
|
Tiles = &HECA5
|
|
TiltDown = &HE80A
|
|
TiltUp = &HE809
|
|
TimeLanguage = &HE775
|
|
ToggleBorder = &HEC12
|
|
ToggleFilled = &HEC11
|
|
ToggleThumb = &HEC14
|
|
ToolTip = &HE82F
|
|
Touch = &HE815
|
|
TouchPointer = &HE7C9
|
|
TouchPointerLegacy = &HE1E3
|
|
Touchscreen = &HEDA4
|
|
Trackers = &HEADF
|
|
TrackersMirrored = &HEE92
|
|
Train = &HE7C0
|
|
TrainSolid = &HEB4D
|
|
TreeFolderFolder = &HED41
|
|
TreeFolderFolderFill = &HED42
|
|
TreeFolderFolderOpen = &HED43
|
|
TreeFolderFolderOpenFill = &HED44
|
|
Trim = &HE78A
|
|
TrimLegacy = &HE12C
|
|
TVMonitor = &HE7F4
|
|
TVMonitorSelected = &HEC77
|
|
TwoBars = &HE906
|
|
TwoBarsLegacy = &HE1E7
|
|
TwoPage = &HE89A
|
|
TwoPageLegacy = &HE11E
|
|
Type = &HE97C
|
|
TypeLegacy = &HE2B0
|
|
TypingIndicatorLegacy = &HE25C
|
|
Underline = &HE8DC
|
|
UnderlineLegacy = &HE19A
|
|
UnderlineLKoreanLegacy = &HE1BB
|
|
UnderlineRussianLegacy = &HE1B8
|
|
UnderlineSLegacy = &HE1B2
|
|
UnderlineULegacy = &HE1B5
|
|
UnderscoreSpace = &HE75D
|
|
Undo = &HE7A7
|
|
UndoLegacy = &HE10E
|
|
Unfavorite = &HE8D9
|
|
Unfavorite2Legacy = &HE24A
|
|
UnfavoriteLegacy = &HE195
|
|
Unit = &HECC6
|
|
Unlock = &HE785
|
|
UnlockLegacy = &HE1F7
|
|
Unpin = &HE77A
|
|
UnpinLegacy = &HE196
|
|
UnsyncFolder = &HE8F6
|
|
UnsyncFolderLegacy = &HE1DD
|
|
Up = &HE74A
|
|
UpArrowShiftKey = &HE752
|
|
UpdateRestore = &HE777
|
|
UpLegacy = &HE110
|
|
Upload = &HE898
|
|
UploadLegacy = &HE11C
|
|
UploadSkyDriveLegacy = &HE183
|
|
UpShiftKey = &HE84B
|
|
USB = &HE88E
|
|
USBSafeConnect = &HECF3
|
|
Vibrate = &HE877
|
|
Video = &HE714
|
|
VideoChat = &HE8AA
|
|
VideoChatLegacy = &HE13B
|
|
VideoInlineLegacy = &HE20A
|
|
VideoLegacy = &HE116
|
|
View = &HE890
|
|
ViewAll = &HE8A9
|
|
ViewAllLegacy = &HE138
|
|
ViewLegacy = &HE18B
|
|
Volume = &HE767
|
|
Volume0 = &HE992
|
|
Volume1 = &HE993
|
|
Volume2 = &HE994
|
|
Volume3 = &HE995
|
|
VolumeBars = &HEBC5
|
|
VolumeLegacy = &HE15D
|
|
VPN = &HE705
|
|
Walk = &HE805
|
|
WalkSolid = &HE726
|
|
Warning = &HE7BA
|
|
Webcam = &HE8B8
|
|
Webcam2 = &HE960
|
|
WebcamLegacy = &HE156
|
|
Wheel = &HEE94
|
|
Wifi = &HE701
|
|
Wifi1 = &HE872
|
|
Wifi2 = &HE873
|
|
Wifi3 = &HE874
|
|
WifiAttentionOverlay = &HE998
|
|
WifiCall0 = &HEBD5
|
|
WifiCall1 = &HEBD6
|
|
WifiCall2 = &HEBD7
|
|
WifiCall3 = &HEBD8
|
|
WifiCall4 = &HEBD9
|
|
WifiCallBars = &HEBD4
|
|
WifiError0 = &HEB5A
|
|
WifiError1 = &HEB5B
|
|
WifiError2 = &HEB5C
|
|
WifiError3 = &HEB5D
|
|
WifiError4 = &HEB5E
|
|
WifiEthernet = &HEE77
|
|
WifiHotspot = &HE88A
|
|
WifiWarning0 = &HEB5F
|
|
WifiWarning1 = &HEB60
|
|
WifiWarning2 = &HEB61
|
|
WifiWarning3 = &HEB62
|
|
WifiWarning4 = &HEB63
|
|
WindDirection = &HEBE6
|
|
WiredUSB = &HECF0
|
|
WirelessUSB = &HECF1
|
|
Work = &HE821
|
|
WorkSolid = &HEB4E
|
|
World = &HE909
|
|
WorldLegacy = &HE128
|
|
XboxOneConsole = &HE990
|
|
ZeroBars = &HE904
|
|
ZeroBarsLegacy = &HE1E5
|
|
Zoom = &HE71E
|
|
ZoomIn = &HE8A3
|
|
ZoomInLegacy = &HE12E
|
|
ZoomLegacy = &HE1A3
|
|
ZoomMode = &HECE8
|
|
ZoomOut = &HE71F
|
|
ZoomOutLegacy = &HE1A4
|
|
fa_500px = &HF26E
|
|
fa_address_book = &HF2B9
|
|
fa_address_book_o = &HF2BA
|
|
fa_address_card = &HF2BB
|
|
fa_address_card_o = &HF2BC
|
|
fa_adjust = &HF042
|
|
fa_adn = &HF170
|
|
fa_align_center = &HF037
|
|
fa_align_justify = &HF039
|
|
fa_align_left = &HF036
|
|
fa_align_right = &HF038
|
|
fa_amazon = &HF270
|
|
fa_ambulance = &HF0F9
|
|
fa_american_sign_language_interpreting = &HF2A3
|
|
fa_anchor = &HF13D
|
|
fa_android = &HF17B
|
|
fa_angellist = &HF209
|
|
fa_angle_double_down = &HF103
|
|
fa_angle_double_left = &HF100
|
|
fa_angle_double_right = &HF101
|
|
fa_angle_double_up = &HF102
|
|
fa_angle_down = &HF107
|
|
fa_angle_left = &HF104
|
|
fa_angle_right = &HF105
|
|
fa_angle_up = &HF106
|
|
fa_apple = &HF179
|
|
fa_archive = &HF187
|
|
fa_area_chart = &HF1FE
|
|
fa_arrow_circle_down = &HF0AB
|
|
fa_arrow_circle_left = &HF0A8
|
|
fa_arrow_circle_o_down = &HF01A
|
|
fa_arrow_circle_o_left = &HF190
|
|
fa_arrow_circle_o_right = &HF18E
|
|
fa_arrow_circle_o_up = &HF01B
|
|
fa_arrow_circle_right = &HF0A9
|
|
fa_arrow_circle_up = &HF0AA
|
|
fa_arrow_down = &HF063
|
|
fa_arrow_left = &HF060
|
|
fa_arrow_right = &HF061
|
|
fa_arrow_up = &HF062
|
|
fa_arrows = &HF047
|
|
fa_arrows_alt = &HF0B2
|
|
fa_arrows_h = &HF07E
|
|
fa_arrows_v = &HF07D
|
|
fa_asl_interpreting = &HF2A3
|
|
fa_assistive_listening_systems = &HF2A2
|
|
fa_asterisk = &HF069
|
|
fa_at = &HF1FA
|
|
fa_audio_description = &HF29E
|
|
fa_automobile = &HF1B9
|
|
fa_backward = &HF04A
|
|
fa_balance_scale = &HF24E
|
|
fa_ban = &HF05E
|
|
fa_bandcamp = &HF2D5
|
|
fa_bank = &HF19C
|
|
fa_bar_chart = &HF080
|
|
fa_bar_chart_o = &HF080
|
|
fa_barcode = &HF02A
|
|
fa_bars = &HF0C9
|
|
fa_bath = &HF2CD
|
|
fa_bathtub = &HF2CD
|
|
fa_battery = &HF240
|
|
fa_battery_0 = &HF244
|
|
fa_battery_1 = &HF243
|
|
fa_battery_2 = &HF242
|
|
fa_battery_3 = &HF241
|
|
fa_battery_4 = &HF240
|
|
fa_battery_empty = &HF244
|
|
fa_battery_full = &HF240
|
|
fa_battery_half = &HF242
|
|
fa_battery_quarter = &HF243
|
|
fa_battery_three_quarters = &HF241
|
|
fa_bed = &HF236
|
|
fa_beer = &HF0FC
|
|
fa_behance = &HF1B4
|
|
fa_behance_square = &HF1B5
|
|
fa_bell = &HF0F3
|
|
fa_bell_o = &HF0A2
|
|
fa_bell_slash = &HF1F6
|
|
fa_bell_slash_o = &HF1F7
|
|
fa_bicycle = &HF206
|
|
fa_binoculars = &HF1E5
|
|
fa_birthday_cake = &HF1FD
|
|
fa_bitbucket = &HF171
|
|
fa_bitbucket_square = &HF172
|
|
fa_bitcoin = &HF15A
|
|
fa_black_tie = &HF27E
|
|
fa_blind = &HF29D
|
|
fa_bluetooth = &HF293
|
|
fa_bluetooth_b = &HF294
|
|
fa_bold = &HF032
|
|
fa_bolt = &HF0E7
|
|
fa_bomb = &HF1E2
|
|
fa_book = &HF02D
|
|
fa_bookmark = &HF02E
|
|
fa_bookmark_o = &HF097
|
|
fa_braille = &HF2A1
|
|
fa_briefcase = &HF0B1
|
|
fa_btc = &HF15A
|
|
fa_bug = &HF188
|
|
fa_building = &HF1AD
|
|
fa_building_o = &HF0F7
|
|
fa_bullhorn = &HF0A1
|
|
fa_bullseye = &HF140
|
|
fa_bus = &HF207
|
|
fa_buysellads = &HF20D
|
|
fa_cab = &HF1BA
|
|
fa_calculator = &HF1EC
|
|
fa_calendar = &HF073
|
|
fa_calendar_check_o = &HF274
|
|
fa_calendar_minus_o = &HF272
|
|
fa_calendar_o = &HF133
|
|
fa_calendar_plus_o = &HF271
|
|
fa_calendar_times_o = &HF273
|
|
fa_camera = &HF030
|
|
fa_camera_retro = &HF083
|
|
fa_car = &HF1B9
|
|
fa_caret_down = &HF0D7
|
|
fa_caret_left = &HF0D9
|
|
fa_caret_right = &HF0DA
|
|
fa_caret_square_o_down = &HF150
|
|
fa_caret_square_o_left = &HF191
|
|
fa_caret_square_o_right = &HF152
|
|
fa_caret_square_o_up = &HF151
|
|
fa_caret_up = &HF0D8
|
|
fa_cart_arrow_down = &HF218
|
|
fa_cart_plus = &HF217
|
|
fa_cc = &HF20A
|
|
fa_cc_amex = &HF1F3
|
|
fa_cc_diners_club = &HF24C
|
|
fa_cc_discover = &HF1F2
|
|
fa_cc_jcb = &HF24B
|
|
fa_cc_mastercard = &HF1F1
|
|
fa_cc_paypal = &HF1F4
|
|
fa_cc_stripe = &HF1F5
|
|
fa_cc_visa = &HF1F0
|
|
fa_certificate = &HF0A3
|
|
fa_chain = &HF0C1
|
|
fa_chain_broken = &HF127
|
|
fa_check = &HF00C
|
|
fa_check_circle = &HF058
|
|
fa_check_circle_o = &HF05D
|
|
fa_check_square = &HF14A
|
|
fa_check_square_o = &HF046
|
|
fa_chevron_circle_down = &HF13A
|
|
fa_chevron_circle_left = &HF137
|
|
fa_chevron_circle_right = &HF138
|
|
fa_chevron_circle_up = &HF139
|
|
fa_chevron_down = &HF078
|
|
fa_chevron_left = &HF053
|
|
fa_chevron_right = &HF054
|
|
fa_chevron_up = &HF077
|
|
fa_child = &HF1AE
|
|
fa_chrome = &HF268
|
|
fa_circle = &HF111
|
|
fa_circle_o = &HF10C
|
|
fa_circle_o_notch = &HF1CE
|
|
fa_circle_thin = &HF1DB
|
|
fa_clipboard = &HF0EA
|
|
fa_clock_o = &HF017
|
|
fa_clone = &HF24D
|
|
fa_close = &HF00D
|
|
fa_cloud = &HF0C2
|
|
fa_cloud_download = &HF0ED
|
|
fa_cloud_upload = &HF0EE
|
|
fa_cny = &HF157
|
|
fa_code = &HF121
|
|
fa_code_fork = &HF126
|
|
fa_codepen = &HF1CB
|
|
fa_codiepie = &HF284
|
|
fa_coffee = &HF0F4
|
|
fa_cog = &HF013
|
|
fa_cogs = &HF085
|
|
fa_columns = &HF0DB
|
|
fa_comment = &HF075
|
|
fa_comment_o = &HF0E5
|
|
fa_commenting = &HF27A
|
|
fa_commenting_o = &HF27B
|
|
fa_comments = &HF086
|
|
fa_comments_o = &HF0E6
|
|
fa_compass = &HF14E
|
|
fa_compress = &HF066
|
|
fa_connectdevelop = &HF20E
|
|
fa_contao = &HF26D
|
|
fa_copy = &HF0C5
|
|
fa_copyright = &HF1F9
|
|
fa_creative_commons = &HF25E
|
|
fa_credit_card = &HF09D
|
|
fa_credit_card_alt = &HF283
|
|
fa_crop = &HF125
|
|
fa_crosshairs = &HF05B
|
|
fa_css3 = &HF13C
|
|
fa_cube = &HF1B2
|
|
fa_cubes = &HF1B3
|
|
fa_cut = &HF0C4
|
|
fa_cutlery = &HF0F5
|
|
fa_dashboard = &HF0E4
|
|
fa_dashcube = &HF210
|
|
fa_database = &HF1C0
|
|
fa_deaf = &HF2A4
|
|
fa_deafness = &HF2A4
|
|
fa_dedent = &HF03B
|
|
fa_delicious = &HF1A5
|
|
fa_desktop = &HF108
|
|
fa_deviantart = &HF1BD
|
|
fa_diamond = &HF219
|
|
fa_digg = &HF1A6
|
|
fa_dollar = &HF155
|
|
fa_dot_circle_o = &HF192
|
|
fa_download = &HF019
|
|
fa_dribbble = &HF17D
|
|
fa_drivers_license = &HF2C2
|
|
fa_drivers_license_o = &HF2C3
|
|
fa_dropbox = &HF16B
|
|
fa_drupal = &HF1A9
|
|
fa_edge = &HF282
|
|
fa_edit = &HF044
|
|
fa_eercast = &HF2DA
|
|
fa_eject = &HF052
|
|
fa_ellipsis_h = &HF141
|
|
fa_ellipsis_v = &HF142
|
|
fa_empire = &HF1D1
|
|
fa_envelope = &HF0E0
|
|
fa_envelope_o = &HF003
|
|
fa_envelope_open = &HF2B6
|
|
fa_envelope_open_o = &HF2B7
|
|
fa_envelope_square = &HF199
|
|
fa_envira = &HF299
|
|
fa_eraser = &HF12D
|
|
fa_etsy = &HF2D7
|
|
fa_eur = &HF153
|
|
fa_euro = &HF153
|
|
fa_exchange = &HF0EC
|
|
fa_exclamation = &HF12A
|
|
fa_exclamation_circle = &HF06A
|
|
fa_exclamation_triangle = &HF071
|
|
fa_expand = &HF065
|
|
fa_expeditedssl = &HF23E
|
|
fa_external_link = &HF08E
|
|
fa_external_link_square = &HF14C
|
|
fa_eye = &HF06E
|
|
fa_eye_slash = &HF070
|
|
fa_eyedropper = &HF1FB
|
|
fa_fa = &HF2B4
|
|
fa_facebook = &HF09A
|
|
fa_facebook_f = &HF09A
|
|
fa_facebook_official = &HF230
|
|
fa_facebook_square = &HF082
|
|
fa_fast_backward = &HF049
|
|
fa_fast_forward = &HF050
|
|
fa_fax = &HF1AC
|
|
fa_feed = &HF09E
|
|
fa_female = &HF182
|
|
fa_fighter_jet = &HF0FB
|
|
fa_file = &HF15B
|
|
fa_file_archive_o = &HF1C6
|
|
fa_file_audio_o = &HF1C7
|
|
fa_file_code_o = &HF1C9
|
|
fa_file_excel_o = &HF1C3
|
|
fa_file_image_o = &HF1C5
|
|
fa_file_movie_o = &HF1C8
|
|
fa_file_o = &HF016
|
|
fa_file_pdf_o = &HF1C1
|
|
fa_file_photo_o = &HF1C5
|
|
fa_file_picture_o = &HF1C5
|
|
fa_file_powerpoint_o = &HF1C4
|
|
fa_file_sound_o = &HF1C7
|
|
fa_file_text = &HF15C
|
|
fa_file_text_o = &HF0F6
|
|
fa_file_video_o = &HF1C8
|
|
fa_file_word_o = &HF1C2
|
|
fa_file_zip_o = &HF1C6
|
|
fa_files_o = &HF0C5
|
|
fa_film = &HF008
|
|
fa_filter = &HF0B0
|
|
fa_fire = &HF06D
|
|
fa_fire_extinguisher = &HF134
|
|
fa_firefox = &HF269
|
|
fa_first_order = &HF2B0
|
|
fa_flag = &HF024
|
|
fa_flag_checkered = &HF11E
|
|
fa_flag_o = &HF11D
|
|
fa_flash = &HF0E7
|
|
fa_flask = &HF0C3
|
|
fa_flickr = &HF16E
|
|
fa_floppy_o = &HF0C7
|
|
fa_folder = &HF07B
|
|
fa_folder_o = &HF114
|
|
fa_folder_open = &HF07C
|
|
fa_folder_open_o = &HF115
|
|
fa_font = &HF031
|
|
fa_font_awesome = &HF2B4
|
|
fa_fonticons = &HF280
|
|
fa_fort_awesome = &HF286
|
|
fa_forumbee = &HF211
|
|
fa_forward = &HF04E
|
|
fa_foursquare = &HF180
|
|
fa_free_code_camp = &HF2C5
|
|
fa_frown_o = &HF119
|
|
fa_futbol_o = &HF1E3
|
|
fa_gamepad = &HF11B
|
|
fa_gavel = &HF0E3
|
|
fa_gbp = &HF154
|
|
fa_ge = &HF1D1
|
|
fa_gear = &HF013
|
|
fa_gears = &HF085
|
|
fa_genderless = &HF22D
|
|
fa_get_pocket = &HF265
|
|
fa_gg = &HF260
|
|
fa_gg_circle = &HF261
|
|
fa_gift = &HF06B
|
|
fa_git = &HF1D3
|
|
fa_git_square = &HF1D2
|
|
fa_github = &HF09B
|
|
fa_github_alt = &HF113
|
|
fa_github_square = &HF092
|
|
fa_gitlab = &HF296
|
|
fa_gittip = &HF184
|
|
fa_glass = &HF000
|
|
fa_glide = &HF2A5
|
|
fa_glide_g = &HF2A6
|
|
fa_globe = &HF0AC
|
|
fa_google = &HF1A0
|
|
fa_google_plus = &HF0D5
|
|
fa_google_plus_circle = &HF2B3
|
|
fa_google_plus_official = &HF2B3
|
|
fa_google_plus_square = &HF0D4
|
|
fa_google_wallet = &HF1EE
|
|
fa_graduation_cap = &HF19D
|
|
fa_gratipay = &HF184
|
|
fa_grav = &HF2D6
|
|
fa_group = &HF0C0
|
|
fa_h_square = &HF0FD
|
|
fa_hacker_news = &HF1D4
|
|
fa_hand_grab_o = &HF255
|
|
fa_hand_lizard_o = &HF258
|
|
fa_hand_o_down = &HF0A7
|
|
fa_hand_o_left = &HF0A5
|
|
fa_hand_o_right = &HF0A4
|
|
fa_hand_o_up = &HF0A6
|
|
fa_hand_paper_o = &HF256
|
|
fa_hand_peace_o = &HF25B
|
|
fa_hand_pointer_o = &HF25A
|
|
fa_hand_rock_o = &HF255
|
|
fa_hand_scissors_o = &HF257
|
|
fa_hand_spock_o = &HF259
|
|
fa_hand_stop_o = &HF256
|
|
fa_handshake_o = &HF2B5
|
|
fa_hard_of_hearing = &HF2A4
|
|
fa_hashtag = &HF292
|
|
fa_hdd_o = &HF0A0
|
|
fa_header = &HF1DC
|
|
fa_headphones = &HF025
|
|
fa_heart = &HF004
|
|
fa_heart_o = &HF08A
|
|
fa_heartbeat = &HF21E
|
|
fa_history = &HF1DA
|
|
fa_home = &HF015
|
|
fa_hospital_o = &HF0F8
|
|
fa_hotel = &HF236
|
|
fa_hourglass = &HF254
|
|
fa_hourglass_1 = &HF251
|
|
fa_hourglass_2 = &HF252
|
|
fa_hourglass_3 = &HF253
|
|
fa_hourglass_end = &HF253
|
|
fa_hourglass_half = &HF252
|
|
fa_hourglass_o = &HF250
|
|
fa_hourglass_start = &HF251
|
|
fa_houzz = &HF27C
|
|
fa_html5 = &HF13B
|
|
fa_i_cursor = &HF246
|
|
fa_id_badge = &HF2C1
|
|
fa_id_card = &HF2C2
|
|
fa_id_card_o = &HF2C3
|
|
fa_ils = &HF20B
|
|
fa_image = &HF03E
|
|
fa_imdb = &HF2D8
|
|
fa_inbox = &HF01C
|
|
fa_indent = &HF03C
|
|
fa_industry = &HF275
|
|
fa_info = &HF129
|
|
fa_info_circle = &HF05A
|
|
fa_inr = &HF156
|
|
fa_instagram = &HF16D
|
|
fa_institution = &HF19C
|
|
fa_internet_explorer = &HF26B
|
|
fa_intersex = &HF224
|
|
fa_ioxhost = &HF208
|
|
fa_italic = &HF033
|
|
fa_joomla = &HF1AA
|
|
fa_jpy = &HF157
|
|
fa_jsfiddle = &HF1CC
|
|
fa_key = &HF084
|
|
fa_keyboard_o = &HF11C
|
|
fa_krw = &HF159
|
|
fa_language = &HF1AB
|
|
fa_laptop = &HF109
|
|
fa_lastfm = &HF202
|
|
fa_lastfm_square = &HF203
|
|
fa_leaf = &HF06C
|
|
fa_leanpub = &HF212
|
|
fa_legal = &HF0E3
|
|
fa_lemon_o = &HF094
|
|
fa_level_down = &HF149
|
|
fa_level_up = &HF148
|
|
fa_life_bouy = &HF1CD
|
|
fa_life_buoy = &HF1CD
|
|
fa_life_ring = &HF1CD
|
|
fa_life_saver = &HF1CD
|
|
fa_lightbulb_o = &HF0EB
|
|
fa_line_chart = &HF201
|
|
fa_link = &HF0C1
|
|
fa_linkedin = &HF0E1
|
|
fa_linkedin_square = &HF08C
|
|
fa_linode = &HF2B8
|
|
fa_linux = &HF17C
|
|
fa_list = &HF03A
|
|
fa_list_alt = &HF022
|
|
fa_list_ol = &HF0CB
|
|
fa_list_ul = &HF0CA
|
|
fa_location_arrow = &HF124
|
|
fa_lock = &HF023
|
|
fa_long_arrow_down = &HF175
|
|
fa_long_arrow_left = &HF177
|
|
fa_long_arrow_right = &HF178
|
|
fa_long_arrow_up = &HF176
|
|
fa_low_vision = &HF2A8
|
|
fa_magic = &HF0D0
|
|
fa_magnet = &HF076
|
|
fa_mail_forward = &HF064
|
|
fa_mail_reply = &HF112
|
|
fa_mail_reply_all = &HF122
|
|
fa_male = &HF183
|
|
fa_map = &HF279
|
|
fa_map_marker = &HF041
|
|
fa_map_o = &HF278
|
|
fa_map_pin = &HF276
|
|
fa_map_signs = &HF277
|
|
fa_mars = &HF222
|
|
fa_mars_double = &HF227
|
|
fa_mars_stroke = &HF229
|
|
fa_mars_stroke_h = &HF22B
|
|
fa_mars_stroke_v = &HF22A
|
|
fa_maxcdn = &HF136
|
|
fa_meanpath = &HF20C
|
|
fa_medium = &HF23A
|
|
fa_medkit = &HF0FA
|
|
fa_meetup = &HF2E0
|
|
fa_meh_o = &HF11A
|
|
fa_mercury = &HF223
|
|
fa_microchip = &HF2DB
|
|
fa_microphone = &HF130
|
|
fa_microphone_slash = &HF131
|
|
fa_minus = &HF068
|
|
fa_minus_circle = &HF056
|
|
fa_minus_square = &HF146
|
|
fa_minus_square_o = &HF147
|
|
fa_mixcloud = &HF289
|
|
fa_mobile = &HF10B
|
|
fa_mobile_phone = &HF10B
|
|
fa_modx = &HF285
|
|
fa_money = &HF0D6
|
|
fa_moon_o = &HF186
|
|
fa_mortar_board = &HF19D
|
|
fa_motorcycle = &HF21C
|
|
fa_mouse_pointer = &HF245
|
|
fa_music = &HF001
|
|
fa_navicon = &HF0C9
|
|
fa_neuter = &HF22C
|
|
fa_newspaper_o = &HF1EA
|
|
fa_object_group = &HF247
|
|
fa_object_ungroup = &HF248
|
|
fa_odnoklassniki = &HF263
|
|
fa_odnoklassniki_square = &HF264
|
|
fa_opencart = &HF23D
|
|
fa_openid = &HF19B
|
|
fa_opera = &HF26A
|
|
fa_optin_monster = &HF23C
|
|
fa_outdent = &HF03B
|
|
fa_pagelines = &HF18C
|
|
fa_paint_brush = &HF1FC
|
|
fa_paper_plane = &HF1D8
|
|
fa_paper_plane_o = &HF1D9
|
|
fa_paperclip = &HF0C6
|
|
fa_paragraph = &HF1DD
|
|
fa_paste = &HF0EA
|
|
fa_pause = &HF04C
|
|
fa_pause_circle = &HF28B
|
|
fa_pause_circle_o = &HF28C
|
|
fa_paw = &HF1B0
|
|
fa_paypal = &HF1ED
|
|
fa_pencil = &HF040
|
|
fa_pencil_square = &HF14B
|
|
fa_pencil_square_o = &HF044
|
|
fa_percent = &HF295
|
|
fa_phone = &HF095
|
|
fa_phone_square = &HF098
|
|
fa_photo = &HF03E
|
|
fa_picture_o = &HF03E
|
|
fa_pie_chart = &HF200
|
|
fa_pied_piper = &HF2AE
|
|
fa_pied_piper_alt = &HF1A8
|
|
fa_pied_piper_pp = &HF1A7
|
|
fa_pinterest = &HF0D2
|
|
fa_pinterest_p = &HF231
|
|
fa_pinterest_square = &HF0D3
|
|
fa_plane = &HF072
|
|
fa_play = &HF04B
|
|
fa_play_circle = &HF144
|
|
fa_play_circle_o = &HF01D
|
|
fa_plug = &HF1E6
|
|
fa_plus = &HF067
|
|
fa_plus_circle = &HF055
|
|
fa_plus_square = &HF0FE
|
|
fa_plus_square_o = &HF196
|
|
fa_podcast = &HF2CE
|
|
fa_power_off = &HF011
|
|
fa_print = &HF02F
|
|
fa_product_hunt = &HF288
|
|
fa_puzzle_piece = &HF12E
|
|
fa_qq = &HF1D6
|
|
fa_qrcode = &HF029
|
|
fa_question = &HF128
|
|
fa_question_circle = &HF059
|
|
fa_question_circle_o = &HF29C
|
|
fa_quora = &HF2C4
|
|
fa_quote_left = &HF10D
|
|
fa_quote_right = &HF10E
|
|
fa_ra = &HF1D0
|
|
fa_random = &HF074
|
|
fa_ravelry = &HF2D9
|
|
fa_rebel = &HF1D0
|
|
fa_recycle = &HF1B8
|
|
fa_reddit = &HF1A1
|
|
fa_reddit_alien = &HF281
|
|
fa_reddit_square = &HF1A2
|
|
fa_refresh = &HF021
|
|
fa_registered = &HF25D
|
|
fa_remove = &HF00D
|
|
fa_renren = &HF18B
|
|
fa_reorder = &HF0C9
|
|
fa_repeat = &HF01E
|
|
fa_reply = &HF112
|
|
fa_reply_all = &HF122
|
|
fa_resistance = &HF1D0
|
|
fa_retweet = &HF079
|
|
fa_rmb = &HF157
|
|
fa_road = &HF018
|
|
fa_rocket = &HF135
|
|
fa_rotate_left = &HF0E2
|
|
fa_rotate_right = &HF01E
|
|
fa_rouble = &HF158
|
|
fa_rss = &HF09E
|
|
fa_rss_square = &HF143
|
|
fa_rub = &HF158
|
|
fa_ruble = &HF158
|
|
fa_rupee = &HF156
|
|
fa_s15 = &HF2CD
|
|
fa_safari = &HF267
|
|
fa_save = &HF0C7
|
|
fa_scissors = &HF0C4
|
|
fa_scribd = &HF28A
|
|
fa_search = &HF002
|
|
fa_search_minus = &HF010
|
|
fa_search_plus = &HF00E
|
|
fa_sellsy = &HF213
|
|
fa_send = &HF1D8
|
|
fa_send_o = &HF1D9
|
|
fa_server = &HF233
|
|
fa_share = &HF064
|
|
fa_share_alt = &HF1E0
|
|
fa_share_alt_square = &HF1E1
|
|
fa_share_square = &HF14D
|
|
fa_share_square_o = &HF045
|
|
fa_shekel = &HF20B
|
|
fa_sheqel = &HF20B
|
|
fa_shield = &HF132
|
|
fa_ship = &HF21A
|
|
fa_shirtsinbulk = &HF214
|
|
fa_shopping_bag = &HF290
|
|
fa_shopping_basket = &HF291
|
|
fa_shopping_cart = &HF07A
|
|
fa_shower = &HF2CC
|
|
fa_sign_in = &HF090
|
|
fa_sign_language = &HF2A7
|
|
fa_sign_out = &HF08B
|
|
fa_signal = &HF012
|
|
fa_signing = &HF2A7
|
|
fa_simplybuilt = &HF215
|
|
fa_sitemap = &HF0E8
|
|
fa_skyatlas = &HF216
|
|
fa_skype = &HF17E
|
|
fa_slack = &HF198
|
|
fa_sliders = &HF1DE
|
|
fa_slideshare = &HF1E7
|
|
fa_smile_o = &HF118
|
|
fa_snapchat = &HF2AB
|
|
fa_snapchat_ghost = &HF2AC
|
|
fa_snapchat_square = &HF2AD
|
|
fa_snowflake_o = &HF2DC
|
|
fa_soccer_ball_o = &HF1E3
|
|
fa_sort = &HF0DC
|
|
fa_sort_alpha_asc = &HF15D
|
|
fa_sort_alpha_desc = &HF15E
|
|
fa_sort_amount_asc = &HF160
|
|
fa_sort_amount_desc = &HF161
|
|
fa_sort_asc = &HF0DE
|
|
fa_sort_desc = &HF0DD
|
|
fa_sort_down = &HF0DD
|
|
fa_sort_numeric_asc = &HF162
|
|
fa_sort_numeric_desc = &HF163
|
|
fa_sort_up = &HF0DE
|
|
fa_soundcloud = &HF1BE
|
|
fa_space_shuttle = &HF197
|
|
fa_spinner = &HF110
|
|
fa_spoon = &HF1B1
|
|
fa_spotify = &HF1BC
|
|
fa_square = &HF0C8
|
|
fa_square_o = &HF096
|
|
fa_stack_exchange = &HF18D
|
|
fa_stack_overflow = &HF16C
|
|
fa_star = &HF005
|
|
fa_star_half = &HF089
|
|
fa_star_half_empty = &HF123
|
|
fa_star_half_full = &HF123
|
|
fa_star_half_o = &HF123
|
|
fa_star_o = &HF006
|
|
fa_steam = &HF1B6
|
|
fa_steam_square = &HF1B7
|
|
fa_step_backward = &HF048
|
|
fa_step_forward = &HF051
|
|
fa_stethoscope = &HF0F1
|
|
fa_sticky_note = &HF249
|
|
fa_sticky_note_o = &HF24A
|
|
fa_stop = &HF04D
|
|
fa_stop_circle = &HF28D
|
|
fa_stop_circle_o = &HF28E
|
|
fa_street_view = &HF21D
|
|
fa_strikethrough = &HF0CC
|
|
fa_stumbleupon = &HF1A4
|
|
fa_stumbleupon_circle = &HF1A3
|
|
fa_subscript = &HF12C
|
|
fa_subway = &HF239
|
|
fa_suitcase = &HF0F2
|
|
fa_sun_o = &HF185
|
|
fa_superpowers = &HF2DD
|
|
fa_superscript = &HF12B
|
|
fa_support = &HF1CD
|
|
fa_table = &HF0CE
|
|
fa_tablet = &HF10A
|
|
fa_tachometer = &HF0E4
|
|
fa_tag = &HF02B
|
|
fa_tags = &HF02C
|
|
fa_tasks = &HF0AE
|
|
fa_taxi = &HF1BA
|
|
fa_telegram = &HF2C6
|
|
fa_television = &HF26C
|
|
fa_tencent_weibo = &HF1D5
|
|
fa_terminal = &HF120
|
|
fa_text_height = &HF034
|
|
fa_text_width = &HF035
|
|
fa_th = &HF00A
|
|
fa_th_large = &HF009
|
|
fa_th_list = &HF00B
|
|
fa_themeisle = &HF2B2
|
|
fa_thermometer = &HF2C7
|
|
fa_thermometer_0 = &HF2CB
|
|
fa_thermometer_1 = &HF2CA
|
|
fa_thermometer_2 = &HF2C9
|
|
fa_thermometer_3 = &HF2C8
|
|
fa_thermometer_4 = &HF2C7
|
|
fa_thermometer_empty = &HF2CB
|
|
fa_thermometer_full = &HF2C7
|
|
fa_thermometer_half = &HF2C9
|
|
fa_thermometer_quarter = &HF2CA
|
|
fa_thermometer_three_quarters = &HF2C8
|
|
fa_thumb_tack = &HF08D
|
|
fa_thumbs_down = &HF165
|
|
fa_thumbs_o_down = &HF088
|
|
fa_thumbs_o_up = &HF087
|
|
fa_thumbs_up = &HF164
|
|
fa_ticket = &HF145
|
|
fa_times = &HF00D
|
|
fa_times_circle = &HF057
|
|
fa_times_circle_o = &HF05C
|
|
fa_times_rectangle = &HF2D3
|
|
fa_times_rectangle_o = &HF2D4
|
|
fa_tint = &HF043
|
|
fa_toggle_down = &HF150
|
|
fa_toggle_left = &HF191
|
|
fa_toggle_off = &HF204
|
|
fa_toggle_on = &HF205
|
|
fa_toggle_right = &HF152
|
|
fa_toggle_up = &HF151
|
|
fa_trademark = &HF25C
|
|
fa_train = &HF238
|
|
fa_transgender = &HF224
|
|
fa_transgender_alt = &HF225
|
|
fa_trash = &HF1F8
|
|
fa_trash_o = &HF014
|
|
fa_tree = &HF1BB
|
|
fa_trello = &HF181
|
|
fa_tripadvisor = &HF262
|
|
fa_trophy = &HF091
|
|
fa_truck = &HF0D1
|
|
fa_try = &HF195
|
|
fa_tty = &HF1E4
|
|
fa_tumblr = &HF173
|
|
fa_tumblr_square = &HF174
|
|
fa_turkish_lira = &HF195
|
|
fa_tv = &HF26C
|
|
fa_twitch = &HF1E8
|
|
fa_twitter = &HF099
|
|
fa_twitter_square = &HF081
|
|
fa_umbrella = &HF0E9
|
|
fa_underline = &HF0CD
|
|
fa_undo = &HF0E2
|
|
fa_universal_access = &HF29A
|
|
fa_university = &HF19C
|
|
fa_unlink = &HF127
|
|
fa_unlock = &HF09C
|
|
fa_unlock_alt = &HF13E
|
|
fa_unsorted = &HF0DC
|
|
fa_upload = &HF093
|
|
fa_usb = &HF287
|
|
fa_usd = &HF155
|
|
fa_user = &HF007
|
|
fa_user_circle = &HF2BD
|
|
fa_user_circle_o = &HF2BE
|
|
fa_user_md = &HF0F0
|
|
fa_user_o = &HF2C0
|
|
fa_user_plus = &HF234
|
|
fa_user_secret = &HF21B
|
|
fa_user_times = &HF235
|
|
fa_users = &HF0C0
|
|
fa_vcard = &HF2BB
|
|
fa_vcard_o = &HF2BC
|
|
fa_venus = &HF221
|
|
fa_venus_double = &HF226
|
|
fa_venus_mars = &HF228
|
|
fa_viacoin = &HF237
|
|
fa_viadeo = &HF2A9
|
|
fa_viadeo_square = &HF2AA
|
|
fa_video_camera = &HF03D
|
|
fa_vimeo = &HF27D
|
|
fa_vimeo_square = &HF194
|
|
fa_vine = &HF1CA
|
|
fa_vk = &HF189
|
|
fa_volume_control_phone = &HF2A0
|
|
fa_volume_down = &HF027
|
|
fa_volume_off = &HF026
|
|
fa_volume_up = &HF028
|
|
fa_warning = &HF071
|
|
fa_wechat = &HF1D7
|
|
fa_weibo = &HF18A
|
|
fa_weixin = &HF1D7
|
|
fa_whatsapp = &HF232
|
|
fa_wheelchair = &HF193
|
|
fa_wheelchair_alt = &HF29B
|
|
fa_wifi = &HF1EB
|
|
fa_wikipedia_w = &HF266
|
|
fa_window_close = &HF2D3
|
|
fa_window_close_o = &HF2D4
|
|
fa_window_maximize = &HF2D0
|
|
fa_window_minimize = &HF2D1
|
|
fa_window_restore = &HF2D2
|
|
fa_windows = &HF17A
|
|
fa_won = &HF159
|
|
fa_wordpress = &HF19A
|
|
fa_wpbeginner = &HF297
|
|
fa_wpexplorer = &HF2DE
|
|
fa_wpforms = &HF298
|
|
fa_wrench = &HF0AD
|
|
fa_xing = &HF168
|
|
fa_xing_square = &HF169
|
|
fa_y_combinator = &HF23B
|
|
fa_y_combinator_square = &HF1D4
|
|
fa_yahoo = &HF19E
|
|
fa_yc = &HF23B
|
|
fa_yc_square = &HF1D4
|
|
fa_yelp = &HF1E9
|
|
fa_yen = &HF157
|
|
fa_yoast = &HF2B1
|
|
fa_youtube = &HF167
|
|
fa_youtube_play = &HF16A
|
|
fa_youtube_square = &HF166
|
|
End Enum
|
|
|
|
Public Enum DefaultSubtitleMode
|
|
None
|
|
[Single]
|
|
First
|
|
Second
|
|
English
|
|
Native
|
|
[Default]
|
|
DefaultOrFirst
|
|
End Enum
|
|
|
|
Public Class Attachment
|
|
Property ID As Integer
|
|
Property Name As String
|
|
Property Enabled As Boolean = True
|
|
End Class
|
|
|
|
Public Enum FileExistMode
|
|
Ask
|
|
Overwrite
|
|
Skip
|
|
End Enum
|
|
|
|
Public Enum SelectionMode
|
|
Include
|
|
Exclude
|
|
End Enum
|
|
|
|
<Flags>
|
|
Public Enum DeleteSelection
|
|
Everything = 1
|
|
Selective = 2
|
|
Custom = 4
|
|
End Enum
|
|
|
|
<Flags>
|
|
Public Enum DeleteSelectiveSelection
|
|
None = 0
|
|
Projects = 1
|
|
Logs = 1 << 1
|
|
Scripts = 1 << 2
|
|
Indexes = 1 << 3
|
|
Videos = 1 << 4
|
|
Audios = 1 << 5
|
|
Subtitles = 1 << 6
|
|
End Enum
|
|
|
|
Public Enum DeleteMode
|
|
Disabled
|
|
<DispName("Recycle Bin")> RecycleBin
|
|
Permanent
|
|
End Enum
|
|
|
|
Public Enum QuotesMode
|
|
Auto
|
|
Always
|
|
Never
|
|
End Enum
|
|
|
|
Public Enum CompressionMode
|
|
zlib
|
|
mpeg4p2
|
|
none
|
|
End Enum
|
|
|
|
Public Enum ImageFrameNumberPosition
|
|
Prefix
|
|
Suffix
|
|
End Enum
|
|
|
|
Public Enum ApplicationEvent
|
|
<DispName("After Job Added")> AfterJobAdded
|
|
<DispName("After Job Failed")> AfterJobFailed
|
|
<DispName("After Job Muxed")> AfterJobMuxed
|
|
<DispName("After Job Processed")> AfterJobProcessed
|
|
<DispName("After Jobs Processed")> AfterJobsProcessed
|
|
<DispName("After Project Loaded")> AfterProjectLoaded
|
|
<DispName("After Project Or Source Loaded")> AfterProjectOrSourceLoaded
|
|
<DispName("After Source Opened")> AfterSourceOpened
|
|
<DispName("After Source Loaded")> AfterSourceLoaded
|
|
<DispName("After Video Encoded")> AfterVideoEncoded
|
|
<DispName("Application Exit")> ApplicationExit
|
|
<DispName("Before Job Adding")> BeforeJobAdding
|
|
<DispName("Before Job Processed")> BeforeJobProcessed
|
|
<DispName("Before Processing")> BeforeProcessing
|
|
<DispName("Before Muxing When Source Opening")> BeforeMuxingWhenSourceOpening
|
|
<DispName("While Processing")> WhileProcessing
|
|
End Enum
|
|
|
|
Public Enum CommandLinePreview
|
|
<DispName("Code Preview")> CodePreview
|
|
<DispName("Powershell")> Powershell
|
|
<DispName("Windows Terminal")> WindowsTerminal
|
|
End Enum
|
|
|
|
Public Enum ApplicationExitMode
|
|
Regular
|
|
BypassProjectSaving
|
|
ForceProjectSaving
|
|
End Enum
|
|
|
|
<StructLayout(LayoutKind.Sequential)>
|
|
Public Structure VkInstanceCreateInfo
|
|
Public sType As Integer
|
|
Public pNext As IntPtr
|
|
Public flags As Integer
|
|
Public pApplicationInfo As IntPtr
|
|
Public enabledLayerCount As Integer
|
|
Public ppEnabledLayerNames As IntPtr
|
|
Public enabledExtensionCount As Integer
|
|
Public ppEnabledExtensionNames As IntPtr
|
|
End Structure
|
|
|
|
Public Enum VkResult
|
|
Success = 0
|
|
NotReady = 1
|
|
Timeout = 2
|
|
EventSet = 3
|
|
EventReset = 4
|
|
Incomplete = 5
|
|
ErrorOutOfHostMemory = -1
|
|
ErrorOutOfDeviceMemory = -2
|
|
ErrorInitializationFailed = -3
|
|
ErrorDeviceLost = -4
|
|
ErrorMemoryMapFailed = -5
|
|
ErrorLayerNotPresent = -6
|
|
ErrorExtensionNotPresent = -7
|
|
ErrorFeatureNotPresent = -8
|
|
ErrorIncompatibleDriver = -9
|
|
ErrorTooManyObjects = -10
|
|
ErrorFormatNotSupported = -11
|
|
ErrorFragmentedPool = -12
|
|
ErrorUnknown = -13
|
|
ErrorOutOfPoolMemory = -1000069000
|
|
ErrorInvalidExternalHandle = -1000072003
|
|
End Enum
|
|
|
|
Public Interface IUpdateUI
|
|
Sub UpdateUI()
|
|
End Interface
|
|
|
|
Public Class TextEncoding
|
|
Shared Property EncodingOfProcess As Encoding = Encoding.Default
|
|
Shared Property CodePageOfProcess As Integer = Encoding.Default.CodePage
|
|
Shared Property CodePageOfSystem As Integer = Registry.LocalMachine.GetString("SYSTEM\CurrentControlSet\Control\Nls\CodePage", "ACP").ToInt
|
|
Shared Property EncodingOfSystem As Encoding = Encoding.GetEncoding(CodePageOfSystem)
|
|
Shared Property PathsSupportedByProcessEncoding As New Dictionary(Of String, Boolean)
|
|
Shared Property UTF8CodePage As Integer = 65001
|
|
|
|
Shared Function ArePathsSupportedByASCIIEncoding() As Boolean
|
|
Return p.SourceFile.IsASCIIEncodingCompatible AndAlso p.TargetFile.IsASCIIEncodingCompatible
|
|
End Function
|
|
|
|
Shared Function ArePathsSupportedByProcessEncoding() As Boolean
|
|
Return IsPathSupportedByProcessEncoding(p.SourceFile) AndAlso IsPathSupportedByProcessEncoding(p.TargetFile)
|
|
End Function
|
|
|
|
Shared Function IsPathSupportedByProcessEncoding(path As String) As Boolean
|
|
If path = "" Then
|
|
Return True
|
|
End If
|
|
|
|
If Not PathsSupportedByProcessEncoding.ContainsKey(path) Then
|
|
PathsSupportedByProcessEncoding(path) = path.IsProcessEncodingCompatible
|
|
End If
|
|
|
|
Return PathsSupportedByProcessEncoding(path)
|
|
End Function
|
|
|
|
Shared Function IsProcessUTF8() As Boolean
|
|
Return CodePageOfProcess = UTF8CodePage
|
|
End Function
|
|
End Class
|
|
|
|
Public Class Ffprobe
|
|
|
|
Property Output As String = ""
|
|
Property Path As String = ""
|
|
Property StreamInfos As List(Of FfprobeStreamInfo)
|
|
|
|
Shared ReadOnly Cache As New ConcurrentDictionary(Of String, Ffprobe)()
|
|
|
|
Sub New(path As String, output As String)
|
|
Me.Output = output
|
|
Me.Path = path
|
|
Me.StreamInfos = New List(Of FfprobeStreamInfo)
|
|
|
|
Const pattern = "(?<=\s+?)Stream #(?<stream>\d+):(?<id>\d+)\((?<lang>\w+)\):\s(?<type>\w+?):\s(?<data>.+)"
|
|
Dim matches = Regex.Matches(output, pattern)
|
|
|
|
For Each match As Match In matches
|
|
Dim si = New FfprobeStreamInfo() With {
|
|
.Stream = match.Groups("stream").Value.ToInt(),
|
|
.StreamId = match.Groups("id").Value.ToInt(),
|
|
.Language = match.Groups("lang").Value,
|
|
.Type = match.Groups("type").Value,
|
|
.Data = match.Groups("data").Value
|
|
}
|
|
|
|
StreamInfos.Add(si)
|
|
Next
|
|
End Sub
|
|
|
|
Public Shared Function GetInfo(path As String) As Ffprobe
|
|
If String.IsNullOrWhiteSpace(path) Then Return Nothing
|
|
If Not path.FileExists() Then Return Nothing
|
|
|
|
Dim key = path & File.GetLastWriteTime(path).Ticks
|
|
If Cache.ContainsKey(key) AndAlso Cache(key) IsNot Nothing Then Return Cache(key)
|
|
|
|
Dim output = ProcessHelp.GetConsoleOutput(Package.ffprobe.Path, $"-hide_banner -i ""{path}""", True)
|
|
If String.IsNullOrWhiteSpace(output) Then Return Nothing
|
|
If Not output.ContainsAny({"Input #0", "Stream #0:0"}) Then Return Nothing
|
|
|
|
Dim ret = New Ffprobe(path, output)
|
|
Cache(key) = ret
|
|
Return ret
|
|
End Function
|
|
End Class
|
|
|
|
Public Class FfprobeStreamInfo
|
|
Property Stream As Integer
|
|
Property StreamId As Integer
|
|
Property Language As String
|
|
Property Type As String
|
|
Property Data As String
|
|
End Class |