Files

6317 lines
266 KiB
VB.net

Imports System.ComponentModel
Imports System.Drawing.Design
Imports System.Drawing.Drawing2D
Imports System.Globalization
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports System.Security.Cryptography
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Threading
Imports System.Threading.Tasks
Imports Microsoft.VisualBasic
Imports StaxRip
Imports StaxRip.UI
Imports VB6 = Microsoft.VisualBasic
Partial Public Class MainForm
Inherits FormBase
#Region " Designer "
Private components As IContainer
Private Const _filterHeight As Integer = 640
Public WithEvents bnNext As ButtonEx
Public WithEvents tbSourceFile As TextEdit
Public WithEvents tbTargetFile As TextEdit
Public WithEvents gbAssistant As GroupBoxEx
Public WithEvents lgbFilters As LinkGroupBox
Public WithEvents tbTargetSize As TextEdit
Public WithEvents laBitrate As LabelEx
Public WithEvents tbBitrate As TextEdit
Public WithEvents lTarget1 As LabelEx
Public WithEvents lSource1 As LabelEx
Public WithEvents lgbResize As LinkGroupBox
Public WithEvents lPixel As LabelEx
Public WithEvents lPixelText As LabelEx
Public WithEvents tbResize As TrackBar
Public WithEvents lZoom As LabelEx
Public WithEvents lZoomText As LabelEx
Public WithEvents tbTargetHeight As TextEdit
Public WithEvents tbTargetWidth As TextEdit
Public WithEvents lTargetHeight As LabelEx
Public WithEvents lTargetWidth As LabelEx
Public WithEvents lDAR As LabelEx
Public WithEvents blTargetDarText As ButtonLabel
Public WithEvents lCrop As LabelEx
Public WithEvents lCropText As LabelEx
Public WithEvents lgbSource As LinkGroupBox
Public WithEvents lSource2 As LabelEx
Public WithEvents lgbTarget As LinkGroupBox
Public WithEvents GroupBox1 As GroupBoxEx
Public WithEvents laTip As LabelEx
Public WithEvents lgbEncoder As LinkGroupBox
Public WithEvents laTarget2 As LabelEx
Public WithEvents MenuStrip As MenuStrip
Public WithEvents pnEncoder As Panel
Public WithEvents FiltersListView As StaxRip.FiltersListView
Public WithEvents blFilesize As ButtonLabel
Public WithEvents llMuxer As ButtonLabel
Public WithEvents lPAR As StaxRip.UI.LabelEx
Public WithEvents blTargetParText As ButtonLabel
Public WithEvents lAspectRatioError As LabelEx
Public WithEvents lAspectRatioErrorText As LabelEx
Public WithEvents blCropText As ButtonLabel
Public WithEvents lCrop2 As LabelEx
Public WithEvents gbAudio As GroupBoxEx
Public WithEvents blSourceParText As ButtonLabel
Public WithEvents lSourcePAR As LabelEx
Public WithEvents lSourceDar As LabelEx
Public WithEvents lSAR As LabelEx
Public WithEvents lSarText As LabelEx
Friend WithEvents tlpTarget As TableLayoutPanel
Friend WithEvents tlpMain As TableLayoutPanel
Friend WithEvents tlpSource As TableLayoutPanel
Friend WithEvents tlpResizeValues As TableLayoutPanel
Friend WithEvents tlpResize As TableLayoutPanel
Friend WithEvents tlpAudio As TableLayoutPanel
Friend WithEvents tlpAssistant As TableLayoutPanel
Friend WithEvents blSourceDarText As ButtonLabel
Friend WithEvents tlpSourceValues As TableLayoutPanel
Public WithEvents TipProvider As StaxRip.UI.TipProvider
'<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.bnNext = New StaxRip.UI.ButtonEx()
Me.gbAssistant = New StaxRip.UI.GroupBoxEx()
Me.tlpAssistant = New TableLayoutPanel()
Me.laTip = New StaxRip.UI.LabelEx()
Me.gbAudio = New StaxRip.UI.GroupBoxEx()
Me.tlpAudio = New TableLayoutPanel()
Me.MenuStrip = New MenuStrip()
Me.lgbTarget = New StaxRip.UI.LinkGroupBox()
Me.tlpTarget = New TableLayoutPanel()
Me.tbTargetFile = New StaxRip.UI.TextEdit()
Me.laTarget2 = New StaxRip.UI.LabelEx()
Me.tbTargetSize = New StaxRip.UI.TextEdit()
Me.lTarget1 = New StaxRip.UI.LabelEx()
Me.tbBitrate = New StaxRip.UI.TextEdit()
Me.laBitrate = New StaxRip.UI.LabelEx()
Me.blFilesize = New StaxRip.UI.ButtonLabel()
Me.lgbSource = New StaxRip.UI.LinkGroupBox()
Me.tlpSource = New TableLayoutPanel()
Me.tlpSourceValues = New TableLayoutPanel()
Me.blSourceDarText = New StaxRip.UI.ButtonLabel()
Me.lSourcePAR = New StaxRip.UI.LabelEx()
Me.blSourceParText = New StaxRip.UI.ButtonLabel()
Me.lCrop = New StaxRip.UI.LabelEx()
Me.lCropText = New StaxRip.UI.LabelEx()
Me.lSourceDar = New StaxRip.UI.LabelEx()
Me.tbSourceFile = New StaxRip.UI.TextEdit()
Me.lSource1 = New StaxRip.UI.LabelEx()
Me.lSource2 = New StaxRip.UI.LabelEx()
Me.lgbResize = New StaxRip.UI.LinkGroupBox()
Me.tlpResize = New TableLayoutPanel()
Me.tlpResizeValues = New TableLayoutPanel()
Me.blTargetDarText = New StaxRip.UI.ButtonLabel()
Me.lAspectRatioError = New StaxRip.UI.LabelEx()
Me.lPAR = New StaxRip.UI.LabelEx()
Me.lZoom = New StaxRip.UI.LabelEx()
Me.lSarText = New StaxRip.UI.LabelEx()
Me.lPixel = New StaxRip.UI.LabelEx()
Me.blTargetParText = New StaxRip.UI.ButtonLabel()
Me.lAspectRatioErrorText = New StaxRip.UI.LabelEx()
Me.lCrop2 = New StaxRip.UI.LabelEx()
Me.blCropText = New StaxRip.UI.ButtonLabel()
Me.lDAR = New StaxRip.UI.LabelEx()
Me.lZoomText = New StaxRip.UI.LabelEx()
Me.lPixelText = New StaxRip.UI.LabelEx()
Me.lSAR = New StaxRip.UI.LabelEx()
Me.tbResize = New TrackBar()
Me.lTargetWidth = New StaxRip.UI.LabelEx()
Me.tbTargetWidth = New StaxRip.UI.TextEdit()
Me.lTargetHeight = New StaxRip.UI.LabelEx()
Me.tbTargetHeight = New StaxRip.UI.TextEdit()
Me.lgbFilters = New StaxRip.UI.LinkGroupBox()
Me.FiltersListView = New StaxRip.FiltersListView()
Me.lgbEncoder = New StaxRip.UI.LinkGroupBox()
Me.llMuxer = New StaxRip.UI.ButtonLabel()
Me.pnEncoder = New Panel()
Me.TipProvider = New StaxRip.UI.TipProvider(Me.components)
Me.tlpMain = New TableLayoutPanel()
Me.gbAssistant.SuspendLayout()
Me.tlpAssistant.SuspendLayout()
Me.gbAudio.SuspendLayout()
Me.tlpAudio.SuspendLayout()
Me.lgbTarget.SuspendLayout()
Me.tlpTarget.SuspendLayout()
Me.lgbSource.SuspendLayout()
Me.tlpSource.SuspendLayout()
Me.tlpSourceValues.SuspendLayout()
Me.lgbResize.SuspendLayout()
Me.tlpResize.SuspendLayout()
Me.tlpResizeValues.SuspendLayout()
CType(Me.tbResize, System.ComponentModel.ISupportInitialize).BeginInit()
Me.lgbFilters.SuspendLayout()
Me.lgbEncoder.SuspendLayout()
Me.tlpMain.SuspendLayout()
Me.SuspendLayout()
'
'bnNext
'
Me.bnNext.Anchor = AnchorStyles.None
Me.bnNext.AutoSize = False
Me.bnNext.AutoSizeMode = AutoSizeMode.GrowAndShrink
Me.bnNext.Cursor = Cursors.Default
Me.bnNext.FlatStyle = FlatStyle.Flat
Me.bnNext.Location = New System.Drawing.Point(1880, 33)
Me.bnNext.Margin = New Padding(0, 0, 20, 5)
'Me.bnNext.MinimumSize = New System.Drawing.Size(265, 85)
Me.bnNext.Size = New System.Drawing.Size(CInt(285 * s.UIScaleFactor), CInt(105 * s.UIScaleFactor))
Me.bnNext.UseCompatibleTextRendering = True
'
'gbAssistant
'
Me.gbAssistant.Anchor = CType((((AnchorStyles.Top) Or AnchorStyles.Left) Or AnchorStyles.Right), AnchorStyles)
Me.tlpMain.SetColumnSpan(Me.gbAssistant, 4)
Me.gbAssistant.Controls.Add(Me.tlpAssistant)
Me.gbAssistant.Dock = DockStyle.Fill
Me.gbAssistant.AutoSize = False
Me.gbAssistant.AutoSizeMode = AutoSizeMode.GrowAndShrink
Me.gbAssistant.Location = New System.Drawing.Point(9, 1534)
Me.gbAssistant.Margin = New Padding(9, 0, 9, 9)
Me.gbAssistant.Name = "gbAssistant"
Me.gbAssistant.Padding = New Padding(6, 6, 6, 6)
Me.gbAssistant.TabIndex = 44
Me.gbAssistant.TabStop = False
Me.gbAssistant.Text = "Assistant"
'
'tlpAssistant
'
Me.tlpAssistant.Anchor = CType((((AnchorStyles.Top) Or AnchorStyles.Left) Or AnchorStyles.Right), AnchorStyles)
Me.tlpAssistant.AutoSize = True
Me.tlpAssistant.AutoSizeMode = AutoSizeMode.GrowAndShrink
Me.tlpAssistant.ColumnCount = 2
Me.tlpAssistant.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 75.0!))
Me.tlpAssistant.ColumnStyles.Add(New ColumnStyle())
Me.tlpAssistant.Controls.Add(Me.laTip, 0, 0)
Me.tlpAssistant.Controls.Add(Me.bnNext, 1, 0)
Me.tlpAssistant.Dock = DockStyle.Fill
Me.tlpAssistant.Location = New System.Drawing.Point(6, 48)
Me.tlpAssistant.Margin = New Padding(0)
Me.tlpAssistant.Name = "tlpAssistant"
Me.tlpAssistant.RowCount = 1
Me.tlpAssistant.RowStyles.Add(New RowStyle(SizeType.Percent, 100.0!))
Me.tlpAssistant.TabIndex = 62
'
'laTip
'
Me.laTip.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.laTip.Dock = DockStyle.Fill
Me.laTip.Location = New System.Drawing.Point(0, 0)
Me.laTip.Margin = New Padding(20, 5, 20, 5)
Me.laTip.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'gbAudio
'
Me.gbAudio.Anchor = CType(((AnchorStyles.Top Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.tlpMain.SetColumnSpan(Me.gbAudio, 4)
Me.gbAudio.Controls.Add(Me.tlpAudio)
Me.gbAudio.Location = New System.Drawing.Point(9, 724)
Me.gbAudio.Margin = New Padding(9, 0, 9, 0)
Me.gbAudio.Name = "gbAudio"
Me.gbAudio.Padding = New Padding(6, 0, 6, 6)
Me.gbAudio.Size = New System.Drawing.Size(2031, 510)
Me.gbAudio.AutoSize = True
Me.gbAudio.AutoSizeMode = AutoSizeMode.GrowAndShrink
Me.gbAudio.TabIndex = 59
Me.gbAudio.TabStop = False
Me.gbAudio.Text = "Audio"
'
'tlpAudio
'
Me.tlpAudio.ColumnCount = 5
Me.tlpAudio.ColumnStyles.Add(New ColumnStyle())
Me.tlpAudio.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 100.0!))
Me.tlpAudio.ColumnStyles.Add(New ColumnStyle())
Me.tlpAudio.ColumnStyles.Add(New ColumnStyle())
Me.tlpAudio.ColumnStyles.Add(New ColumnStyle())
Me.tlpAudio.Dock = DockStyle.Fill
Me.tlpAudio.Location = New System.Drawing.Point(6, 48)
Me.tlpAudio.Margin = New Padding(0)
Me.tlpAudio.Name = "tlpAudio"
Me.tlpAudio.RowCount = 0
Me.tlpAudio.Size = New System.Drawing.Size(2019, 456)
Me.tlpAudio.TabIndex = 62
Me.tlpAudio.AutoSize = True
Me.tlpAudio.AutoSizeMode = AutoSizeMode.GrowAndShrink
'
'MenuStrip
'
Me.MenuStrip.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.MenuStrip.AutoSize = True
Me.tlpMain.SetColumnSpan(Me.MenuStrip, 4)
Me.MenuStrip.Dock = DockStyle.Fill
Me.MenuStrip.GripMargin = New Padding(2, 2, 0, 2)
Me.MenuStrip.ImageScalingSize = New System.Drawing.Size(24, 24)
Me.MenuStrip.Location = New System.Drawing.Point(0, 0)
Me.MenuStrip.Name = "MenuStrip"
Me.MenuStrip.Padding = New Padding(6, 6, 0, 6)
Me.MenuStrip.TabIndex = 60
Me.MenuStrip.Text = "MenuStrip"
'
'lgbTarget
'
Me.lgbTarget.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.tlpMain.SetColumnSpan(Me.lgbTarget, 2)
Me.lgbTarget.Controls.Add(Me.tlpTarget)
Me.lgbTarget.Location = New System.Drawing.Point(1029, 81)
Me.lgbTarget.Margin = New Padding(6, 0, 9, 0)
Me.lgbTarget.Name = "lgbTarget"
Me.lgbTarget.Padding = New Padding(6, 0, 6, 6)
Me.lgbTarget.Size = New System.Drawing.Size(1011, 357)
Me.lgbTarget.TabIndex = 58
Me.lgbTarget.TabStop = False
Me.lgbTarget.Text = "Target"
'
'tlpTarget
'
Me.tlpTarget.ColumnCount = 4
Me.tlpTarget.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpTarget.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpTarget.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpTarget.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpTarget.Controls.Add(Me.tbTargetFile, 0, 0)
Me.tlpTarget.Controls.Add(Me.blFilesize, 0, 1)
Me.tlpTarget.Controls.Add(Me.tbTargetSize, 1, 1)
Me.tlpTarget.Controls.Add(Me.laBitrate, 2, 1)
Me.tlpTarget.Controls.Add(Me.tbBitrate, 3, 1)
Me.tlpTarget.Controls.Add(Me.lTarget1, 0, 2)
Me.tlpTarget.Controls.Add(Me.laTarget2, 0, 3)
Me.tlpTarget.Dock = DockStyle.Fill
Me.tlpTarget.Location = New System.Drawing.Point(6, 48)
Me.tlpTarget.Margin = New Padding(0)
Me.tlpTarget.Name = "tlpTarget"
Me.tlpTarget.RowCount = 4
Me.tlpTarget.RowStyles.Add(New RowStyle(SizeType.Percent, 34.0!))
Me.tlpTarget.RowStyles.Add(New RowStyle(SizeType.Percent, 22.0!))
Me.tlpTarget.RowStyles.Add(New RowStyle(SizeType.Percent, 22.0!))
Me.tlpTarget.RowStyles.Add(New RowStyle(SizeType.Percent, 22.0!))
Me.tlpTarget.Size = New System.Drawing.Size(999, 303)
Me.tlpTarget.TabIndex = 62
'
'tbTargetFile
'
Me.tlpTarget.SetColumnSpan(Me.tbTargetFile, 4)
Me.tbTargetFile.Anchor = CType((AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles)
Me.tbTargetFile.AutoSize = True
Me.tbTargetFile.Location = New System.Drawing.Point(6, 10)
Me.tbTargetFile.Margin = New Padding(6, CInt(FontHeight / 1.5), 6, FontHeight \ 2)
Me.tbTargetFile.Padding = New Padding(6, FontHeight \ 2, 6, FontHeight \ 2)
Me.tbTargetFile.Name = "tbTargetFile"
Me.tbTargetFile.ReadOnly = False
Me.tbTargetFile.TabIndex = 0
'
'laTarget2
'
Me.laTarget2.Anchor = CType((AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles)
Me.tlpTarget.SetColumnSpan(Me.laTarget2, 4)
Me.laTarget2.ImeMode = ImeMode.NoControl
Me.laTarget2.Location = New System.Drawing.Point(6, 234)
Me.laTarget2.Margin = New Padding(6, 0, 6, 0)
Me.laTarget2.Size = New System.Drawing.Size(987, 60)
Me.laTarget2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'tbTargetSize
'
Me.tbTargetSize.Anchor = AnchorStyles.Left
Me.tbTargetSize.Location = New System.Drawing.Point(249, 85)
Me.tbTargetSize.Margin = New Padding(0)
Me.tbTargetSize.Name = "tbTargetSize"
Me.tbTargetSize.ReadOnly = False
Me.tbTargetSize.Size = New System.Drawing.Size(136, 55)
Me.tbTargetSize.TabIndex = 55
Me.tbTargetSize.TextBox.TextAlign = HorizontalAlignment.Center
'
'lTarget1
'
Me.lTarget1.Anchor = CType((AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles)
Me.tlpTarget.SetColumnSpan(Me.lTarget1, 4)
Me.lTarget1.Location = New System.Drawing.Point(6, 157)
Me.lTarget1.Margin = New Padding(6, 0, 6, 0)
Me.lTarget1.Size = New System.Drawing.Size(987, 60)
Me.lTarget1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'tbBitrate
'
Me.tbBitrate.Anchor = AnchorStyles.Left
Me.tbBitrate.Location = New System.Drawing.Point(747, 85)
Me.tbBitrate.Margin = New Padding(0)
Me.tbBitrate.Name = "tbBitrate"
Me.tbBitrate.ReadOnly = False
Me.tbBitrate.Size = New System.Drawing.Size(139, 55)
Me.tbBitrate.TabIndex = 41
Me.tbBitrate.TextBox.TextAlign = HorizontalAlignment.Center
'
'laBitrate
'
Me.laBitrate.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.laBitrate.Location = New System.Drawing.Point(498, 75)
Me.laBitrate.Margin = New Padding(0)
Me.laBitrate.Size = New System.Drawing.Size(249, 75)
Me.laBitrate.Text = "Video Bitrate:"
Me.laBitrate.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'blFilesize
'
Me.blFilesize.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.blFilesize.Location = New System.Drawing.Point(6, 75)
Me.blFilesize.Margin = New Padding(6, 0, 0, 0)
Me.blFilesize.Name = "blFilesize"
Me.blFilesize.Size = New System.Drawing.Size(243, 75)
Me.blFilesize.TabIndex = 59
Me.blFilesize.TabStop = True
Me.blFilesize.Text = "Size:"
Me.blFilesize.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lgbSource
'
Me.lgbSource.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.tlpMain.SetColumnSpan(Me.lgbSource, 2)
Me.lgbSource.Controls.Add(Me.tlpSource)
Me.lgbSource.Location = New System.Drawing.Point(9, 81)
Me.lgbSource.Margin = New Padding(9, 0, 6, 0)
Me.lgbSource.Name = "lgbSource"
Me.lgbSource.Padding = New Padding(6, 0, 6, 6)
Me.lgbSource.Size = New System.Drawing.Size(1008, 357)
Me.lgbSource.TabIndex = 57
Me.lgbSource.TabStop = False
Me.lgbSource.Text = "Source"
'
'tlpSource
'
Me.tlpSource.ColumnCount = 1
Me.tlpSource.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50.0!))
Me.tlpSource.Controls.Add(Me.tbSourceFile, 0, 0)
Me.tlpSource.Controls.Add(Me.lSource1, 0, 1)
Me.tlpSource.Controls.Add(Me.lSource2, 0, 2)
Me.tlpSource.Controls.Add(Me.tlpSourceValues, 0, 3)
Me.tlpSource.Dock = DockStyle.Fill
Me.tlpSource.Location = New System.Drawing.Point(6, 48)
Me.tlpSource.Margin = New Padding(0)
Me.tlpSource.Name = "tlpSource"
Me.tlpSource.RowCount = 4
Me.tlpSource.RowStyles.Add(New RowStyle(SizeType.Percent, 34.0!))
Me.tlpSource.RowStyles.Add(New RowStyle(SizeType.Percent, 22.0!))
Me.tlpSource.RowStyles.Add(New RowStyle(SizeType.Percent, 22.0!))
Me.tlpSource.RowStyles.Add(New RowStyle(SizeType.Percent, 22.0!))
Me.tlpSource.Size = New System.Drawing.Size(996, 303)
Me.tlpSource.TabIndex = 62
'
'tlpSourceValues
'
Me.tlpSourceValues.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.tlpSourceValues.ColumnCount = 7
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpSourceValues.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 100.0!))
Me.tlpSourceValues.Controls.Add(Me.blSourceDarText, 4, 0)
Me.tlpSourceValues.Controls.Add(Me.lSourcePAR, 3, 0)
Me.tlpSourceValues.Controls.Add(Me.blSourceParText, 2, 0)
Me.tlpSourceValues.Controls.Add(Me.lCrop, 1, 0)
Me.tlpSourceValues.Controls.Add(Me.lCropText, 0, 0)
Me.tlpSourceValues.Controls.Add(Me.lSourceDar, 5, 0)
Me.tlpSourceValues.Location = New System.Drawing.Point(0, 225)
Me.tlpSourceValues.Margin = New Padding(0)
Me.tlpSourceValues.Name = "tlpSourceValues"
Me.tlpSourceValues.RowCount = 1
Me.tlpSourceValues.RowStyles.Add(New RowStyle(SizeType.Percent, 100.0!))
Me.tlpSourceValues.Size = New System.Drawing.Size(996, 78)
Me.tlpSourceValues.TabIndex = 1
'
'blSourceDarText
'
Me.blSourceDarText.Anchor = AnchorStyles.None
Me.blSourceDarText.AutoSize = True
Me.blSourceDarText.Location = New System.Drawing.Point(446, 15)
Me.blSourceDarText.Name = "blSourceDarText"
Me.blSourceDarText.Size = New System.Drawing.Size(97, 48)
Me.blSourceDarText.TabIndex = 51
Me.blSourceDarText.Text = "DAR:"
Me.blSourceDarText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lSourcePAR
'
Me.lSourcePAR.Anchor = AnchorStyles.None
Me.lSourcePAR.AutoSize = True
Me.lSourcePAR.Location = New System.Drawing.Point(400, 15)
Me.lSourcePAR.Margin = New Padding(9, 0, 9, 0)
Me.lSourcePAR.Size = New System.Drawing.Size(34, 48)
Me.lSourcePAR.Text = "-"
Me.lSourcePAR.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'blSourceParText
'
Me.blSourceParText.Anchor = AnchorStyles.None
Me.blSourceParText.AutoSize = True
Me.blSourceParText.Location = New System.Drawing.Point(291, 15)
Me.blSourceParText.Margin = New Padding(9, 0, 9, 0)
Me.blSourceParText.Name = "blSourceParText"
Me.blSourceParText.Size = New System.Drawing.Size(91, 48)
Me.blSourceParText.TabIndex = 45
Me.blSourceParText.TabStop = True
Me.blSourceParText.Text = "PAR:"
Me.blSourceParText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lCrop
'
Me.lCrop.Anchor = AnchorStyles.None
Me.lCrop.AutoSize = True
Me.lCrop.Location = New System.Drawing.Point(120, 15)
Me.lCrop.Margin = New Padding(9, 0, 9, 0)
Me.lCrop.Size = New System.Drawing.Size(153, 48)
Me.lCrop.Text = "disabled"
Me.lCrop.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lCropText
'
Me.lCropText.Anchor = AnchorStyles.None
Me.lCropText.AutoSize = True
Me.lCropText.Location = New System.Drawing.Point(3, 15)
Me.lCropText.Size = New System.Drawing.Size(105, 48)
Me.lCropText.TabStop = True
Me.lCropText.Text = "Crop:"
Me.lCropText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lSourceDar
'
Me.lSourceDar.Anchor = AnchorStyles.None
Me.lSourceDar.AutoSize = True
Me.lSourceDar.Location = New System.Drawing.Point(549, 15)
Me.lSourceDar.Size = New System.Drawing.Size(34, 48)
Me.lSourceDar.Text = "-"
Me.lSourceDar.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'tbSourceFile
'
Me.tbSourceFile.Anchor = CType((AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles)
Me.tbSourceFile.AutoSize = True
Me.tbSourceFile.Location = New System.Drawing.Point(6, 10)
Me.tbSourceFile.Margin = New Padding(6, CInt(FontHeight / 1.5), 6, FontHeight \ 2)
Me.tbSourceFile.Padding = New Padding(6, FontHeight \ 2, 6, FontHeight \ 2)
Me.tbSourceFile.Name = "tbSourceFile"
Me.tbSourceFile.ReadOnly = False
Me.tbSourceFile.TabIndex = 2
'
'lSource1
'
Me.lSource1.Anchor = CType((AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles)
Me.lSource1.Location = New System.Drawing.Point(6, 84)
Me.lSource1.Margin = New Padding(6, 0, 6, 0)
Me.lSource1.Size = New System.Drawing.Size(984, 57)
Me.lSource1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lSource2
'
Me.lSource2.Anchor = CType((AnchorStyles.Left Or AnchorStyles.Right), AnchorStyles)
Me.lSource2.Location = New System.Drawing.Point(6, 159)
Me.lSource2.Margin = New Padding(6, 0, 6, 0)
Me.lSource2.Size = New System.Drawing.Size(984, 57)
Me.lSource2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lgbResize
'
Me.lgbResize.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right
Me.tlpMain.SetColumnSpan(Me.lgbResize, 2)
Me.lgbResize.Controls.Add(Me.tlpResize)
Me.lgbResize.Location = New System.Drawing.Point(688, 438)
Me.lgbResize.Margin = New Padding(6, 0, 6, 0)
Me.lgbResize.Name = "lgbResize"
Me.lgbResize.Padding = New Padding(6, 0, 6, 6)
Me.lgbResize.Size = New System.Drawing.Size(670, _filterHeight)
Me.lgbResize.TabIndex = 55
Me.lgbResize.TabStop = False
Me.lgbResize.Text = "Resize"
'
'tlpResize
'
Me.tlpResize.ColumnCount = 4
Me.tlpResize.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpResize.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpResize.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpResize.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 25.0!))
Me.tlpResize.Controls.Add(Me.tlpResizeValues, 0, 2)
Me.tlpResize.Controls.Add(Me.tbResize, 0, 1)
Me.tlpResize.Controls.Add(Me.lTargetWidth, 0, 0)
Me.tlpResize.Controls.Add(Me.tbTargetWidth, 1, 0)
Me.tlpResize.Controls.Add(Me.lTargetHeight, 2, 0)
Me.tlpResize.Controls.Add(Me.tbTargetHeight, 3, 0)
Me.tlpResize.Dock = DockStyle.Fill
Me.tlpResize.Location = New System.Drawing.Point(6, 48)
Me.tlpResize.Name = "tlpResize"
Me.tlpResize.RowCount = 3
Me.tlpResize.RowStyles.Add(New RowStyle(SizeType.Absolute, 81.0!))
Me.tlpResize.RowStyles.Add(New RowStyle(SizeType.Absolute, 81.0!))
Me.tlpResize.RowStyles.Add(New RowStyle(SizeType.Percent, 100.0!))
Me.tlpResize.Size = New System.Drawing.Size(658, 232)
Me.tlpResize.TabIndex = 63
Me.tlpResize.SetColumnSpan(Me.tlpResizeValues, 4)
'
'tlpResizeValues
'
Me.tlpResizeValues.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) Or AnchorStyles.Left) Or AnchorStyles.Right), AnchorStyles)
Me.tlpResizeValues.ColumnCount = 4
Me.tlpResizeValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpResizeValues.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 33.0!))
Me.tlpResizeValues.ColumnStyles.Add(New ColumnStyle())
Me.tlpResizeValues.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 40.0!))
Me.tlpResizeValues.Controls.Add(Me.blCropText, 0, 1)
Me.tlpResizeValues.Controls.Add(Me.lCrop2, 1, 1)
Me.tlpResizeValues.SetColumnSpan(Me.lCrop2, 3)
Me.tlpResizeValues.Controls.Add(Me.blTargetDarText, 0, 2)
Me.tlpResizeValues.Controls.Add(Me.lDAR, 1, 2)
Me.tlpResizeValues.Controls.Add(Me.lPixelText, 2, 2)
Me.tlpResizeValues.Controls.Add(Me.lPixel, 3, 2)
Me.tlpResizeValues.Controls.Add(Me.lSarText, 0, 3)
Me.tlpResizeValues.Controls.Add(Me.lSAR, 1, 3)
Me.tlpResizeValues.Controls.Add(Me.lZoomText, 2, 3)
Me.tlpResizeValues.Controls.Add(Me.lZoom, 3, 3)
Me.tlpResizeValues.Controls.Add(Me.blTargetParText, 0, 4)
Me.tlpResizeValues.Controls.Add(Me.lPAR, 1, 4)
Me.tlpResizeValues.Controls.Add(Me.lAspectRatioErrorText, 2, 4)
Me.tlpResizeValues.Controls.Add(Me.lAspectRatioError, 3, 4)
Me.tlpResizeValues.Location = New System.Drawing.Point(0, 162)
Me.tlpResizeValues.Margin = New Padding(0)
Me.tlpResizeValues.Name = "tlpResizeValues"
Me.tlpResizeValues.RowCount = 11
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 5.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 15.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 15.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 15.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 15.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 15.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 15.0!))
Me.tlpResizeValues.RowStyles.Add(New RowStyle(SizeType.Percent, 5.0!))
Me.tlpResizeValues.Size = New System.Drawing.Size(658, 70)
Me.tlpResizeValues.TabIndex = 62
'
'blTargetDarText
'
Me.blTargetDarText.Anchor = AnchorStyles.Left
Me.blTargetDarText.AutoSize = True
Me.blTargetDarText.ImeMode = ImeMode.NoControl
Me.blTargetDarText.Location = New System.Drawing.Point(0, 0)
Me.blTargetDarText.Margin = New Padding(0)
Me.blTargetDarText.Name = "blTargetDarText"
Me.blTargetDarText.Size = New System.Drawing.Size(97, 23)
Me.blTargetDarText.TabIndex = 23
Me.blTargetDarText.Text = "DAR:"
Me.blTargetDarText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lPAR
'
Me.lPAR.Anchor = AnchorStyles.Left
Me.lPAR.AutoSize = True
Me.lPAR.Location = New System.Drawing.Point(97, 46)
Me.lPAR.Margin = New Padding(0)
Me.lPAR.Size = New System.Drawing.Size(34, 24)
Me.lPAR.Text = "-"
Me.lPAR.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lZoom
'
Me.lZoom.Anchor = AnchorStyles.Left
Me.lZoom.AutoSize = True
Me.lZoom.Location = New System.Drawing.Point(253, 23)
Me.lZoom.Margin = New Padding(0)
Me.lZoom.Size = New System.Drawing.Size(34, 23)
Me.lZoom.Text = "-"
Me.lZoom.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lSarText
'
Me.lSarText.Anchor = AnchorStyles.Left
Me.lSarText.AutoSize = True
Me.lSarText.Location = New System.Drawing.Point(0, 23)
Me.lSarText.Margin = New Padding(0)
Me.lSarText.Size = New System.Drawing.Size(92, 23)
Me.lSarText.Text = "SAR:"
Me.lSarText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lPixel
'
Me.lPixel.Anchor = AnchorStyles.Left
Me.lPixel.AutoSize = True
Me.lPixel.Location = New System.Drawing.Point(253, 0)
Me.lPixel.Margin = New Padding(0)
Me.lPixel.Size = New System.Drawing.Size(34, 23)
Me.lPixel.Text = "-"
Me.lPixel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'blTargetParText
'
Me.blTargetParText.Anchor = AnchorStyles.Left
Me.blTargetParText.AutoSize = True
Me.blTargetParText.Location = New System.Drawing.Point(0, 46)
Me.blTargetParText.Margin = New Padding(0)
Me.blTargetParText.Name = "blTargetParText"
Me.blTargetParText.Size = New System.Drawing.Size(91, 24)
Me.blTargetParText.TabIndex = 51
Me.blTargetParText.Text = "PAR:"
Me.blTargetParText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lAspectRatioError
'
Me.lAspectRatioError.Anchor = AnchorStyles.Left
Me.lAspectRatioError.AutoSize = True
Me.lAspectRatioError.Location = New System.Drawing.Point(253, 46)
Me.lAspectRatioError.Margin = New Padding(0)
Me.lAspectRatioError.Size = New System.Drawing.Size(34, 24)
Me.lAspectRatioError.Text = "-"
Me.lAspectRatioError.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lAspectRatioErrorText
'
Me.lAspectRatioErrorText.Anchor = AnchorStyles.Left
Me.lAspectRatioErrorText.AutoSize = True
Me.lAspectRatioErrorText.Location = New System.Drawing.Point(131, 46)
Me.lAspectRatioErrorText.Margin = New Padding(0)
Me.lAspectRatioErrorText.Size = New System.Drawing.Size(106, 24)
Me.lAspectRatioErrorText.Text = "Error:"
Me.lAspectRatioErrorText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lCrop2
'
Me.lCrop2.Anchor = AnchorStyles.Left
Me.lCrop2.AutoSize = True
Me.lCrop2.Location = New System.Drawing.Point(253, 46)
Me.lCrop2.Margin = New Padding(0)
Me.lCrop2.Size = New System.Drawing.Size(34, 24)
Me.lCrop2.Text = "-"
Me.lCrop2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'blCropText
'
Me.blCropText.Anchor = AnchorStyles.Left
Me.blCropText.AutoSize = True
Me.blCropText.Location = New System.Drawing.Point(131, 46)
Me.blCropText.Margin = New Padding(0)
Me.blCropText.Size = New System.Drawing.Size(106, 24)
Me.blCropText.Text = "Crop:"
Me.blCropText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
Me.blCropText.ClickAction = AddressOf ShowCropDialog
'
'lDAR
'
Me.lDAR.Anchor = AnchorStyles.Left
Me.lDAR.AutoSize = True
Me.lDAR.ImeMode = ImeMode.NoControl
Me.lDAR.Location = New System.Drawing.Point(97, 0)
Me.lDAR.Margin = New Padding(0)
Me.lDAR.Size = New System.Drawing.Size(34, 23)
Me.lDAR.Text = "-"
Me.lDAR.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lZoomText
'
Me.lZoomText.Anchor = AnchorStyles.Left
Me.lZoomText.AutoSize = True
Me.lZoomText.Location = New System.Drawing.Point(131, 23)
Me.lZoomText.Margin = New Padding(0)
Me.lZoomText.Size = New System.Drawing.Size(122, 23)
Me.lZoomText.Text = "Zoom:"
Me.lZoomText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lPixelText
'
Me.lPixelText.Anchor = AnchorStyles.Left
Me.lPixelText.AutoSize = True
Me.lPixelText.Location = New System.Drawing.Point(131, 0)
Me.lPixelText.Margin = New Padding(0)
Me.lPixelText.Size = New System.Drawing.Size(102, 23)
Me.lPixelText.Text = "Pixel:"
Me.lPixelText.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'lSAR
'
Me.lSAR.Anchor = AnchorStyles.Left
Me.lSAR.AutoSize = True
Me.lSAR.Location = New System.Drawing.Point(97, 23)
Me.lSAR.Margin = New Padding(0)
Me.lSAR.Size = New System.Drawing.Size(34, 23)
Me.lSAR.Text = "-"
Me.lSAR.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'tbResize
'
Me.tbResize.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
Or AnchorStyles.Left) _
Or AnchorStyles.Right), AnchorStyles)
Me.tbResize.AutoSize = False
Me.tlpResize.SetColumnSpan(Me.tbResize, 4)
Me.tbResize.Location = New System.Drawing.Point(0, 81)
Me.tbResize.Margin = New Padding(0)
Me.tbResize.Minimum = 0
Me.tbResize.TickFrequency = TrackBarTicks
Me.tbResize.Name = "tbResize"
Me.tbResize.Size = New System.Drawing.Size(658, 81)
Me.tbResize.TabIndex = 46
'
'lTargetWidth
'
Me.lTargetWidth.Anchor = AnchorStyles.Left
Me.lTargetWidth.AutoSize = True
Me.lTargetWidth.Location = New System.Drawing.Point(3, 16)
Me.lTargetWidth.Size = New System.Drawing.Size(124, 48)
Me.lTargetWidth.Text = "Width:"
Me.lTargetWidth.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'tbTargetWidth
'
Me.tbTargetWidth.Anchor = AnchorStyles.Left
Me.tbTargetWidth.BorderStyle = BorderStyle.FixedSingle
Me.tbTargetWidth.Location = New System.Drawing.Point(167, 13)
Me.tbTargetWidth.Name = "tbTargetWidth"
Me.tbTargetWidth.ReadOnly = False
Me.tbTargetWidth.Size = New System.Drawing.Size(145, 55)
Me.tbTargetWidth.TabIndex = 39
Me.tbTargetWidth.TextBox.TextAlign = HorizontalAlignment.Center
'
'lTargetHeight
'
Me.lTargetHeight.Anchor = AnchorStyles.Left
Me.lTargetHeight.AutoSize = True
Me.lTargetHeight.Location = New System.Drawing.Point(331, 16)
Me.lTargetHeight.Size = New System.Drawing.Size(135, 48)
Me.lTargetHeight.Text = "Height:"
Me.lTargetHeight.TextAlign = System.Drawing.ContentAlignment.MiddleLeft
'
'tbTargetHeight
'
Me.tbTargetHeight.Anchor = AnchorStyles.Left
Me.tbTargetHeight.BorderStyle = BorderStyle.FixedSingle
Me.tbTargetHeight.Location = New System.Drawing.Point(495, 13)
Me.tbTargetHeight.Name = "tbTargetHeight"
Me.tbTargetHeight.ReadOnly = False
Me.tbTargetHeight.Size = New System.Drawing.Size(145, 55)
Me.tbTargetHeight.TabIndex = 40
Me.tbTargetHeight.TextBox.TextAlign = HorizontalAlignment.Center
'
'lgbFilters
'
Me.lgbFilters.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right
Me.lgbFilters.Controls.Add(Me.FiltersListView)
Me.lgbFilters.Location = New System.Drawing.Point(9, 438)
Me.lgbFilters.Margin = New Padding(9, 0, 6, 0)
Me.lgbFilters.Name = "lgbFilters"
Me.lgbFilters.Padding = New Padding(6, CInt(FontHeight / 1.5), 6, FontHeight \ 4)
Me.lgbFilters.Size = New System.Drawing.Size(667, _filterHeight)
Me.lgbFilters.TabIndex = 53
Me.lgbFilters.TabStop = False
'
'FiltersListView
'
Me.FiltersListView.AllowDrop = True
Me.FiltersListView.AutoCheckMode = StaxRip.UI.AutoCheckMode.None
Me.FiltersListView.CheckBoxes = True
Me.FiltersListView.Dock = DockStyle.Fill
Me.FiltersListView.FullRowSelect = True
Me.FiltersListView.HeaderStyle = ColumnHeaderStyle.None
Me.FiltersListView.HideSelection = False
Me.FiltersListView.IsLoading = False
Me.FiltersListView.Location = New System.Drawing.Point(9, 81)
Me.FiltersListView.Margin = New Padding(6, FontHeight \ 2, 6, FontHeight \ 4)
Me.FiltersListView.MultiSelect = False
Me.FiltersListView.Name = "FiltersListView"
Me.FiltersListView.OwnerDraw = True
Me.FiltersListView.Padding = New Padding(6, FontHeight \ 2, 6, FontHeight \ 4)
Me.FiltersListView.Size = New System.Drawing.Size(649, 226)
Me.FiltersListView.TabIndex = 0
Me.FiltersListView.UseCompatibleStateImageBehavior = False
Me.FiltersListView.View = View.Details
'
'lgbEncoder
'
Me.lgbEncoder.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right
Me.lgbEncoder.Controls.Add(Me.llMuxer)
Me.lgbEncoder.Controls.Add(Me.pnEncoder)
Me.lgbEncoder.Location = New System.Drawing.Point(1370, 438)
Me.lgbEncoder.Margin = New Padding(6, 0, 9, 0)
Me.lgbEncoder.Name = "lgbEncoder"
Me.lgbEncoder.Padding = New Padding(6, CInt(FontHeight / 1.5), 6, FontHeight \ 4)
Me.lgbEncoder.Size = New System.Drawing.Size(670, _filterHeight)
Me.lgbEncoder.TabIndex = 51
Me.lgbEncoder.TabStop = False
'
'llMuxer
'
Me.llMuxer.Anchor = AnchorStyles.Top Or AnchorStyles.Right
Me.llMuxer.AutoSize = True
Me.llMuxer.Location = New System.Drawing.Point(536, 0)
Me.llMuxer.Name = "llMuxer"
Me.llMuxer.Size = New System.Drawing.Size(201, 48)
Me.llMuxer.TabIndex = 1
Me.llMuxer.TabStop = True
Me.llMuxer.Text = "Muxer"
Me.llMuxer.TextAlign = ContentAlignment.MiddleRight
'
'pnEncoder
'
Me.pnEncoder.Dock = DockStyle.Fill
Me.pnEncoder.Location = New System.Drawing.Point(9, 51)
Me.pnEncoder.Name = "pnEncoder"
Me.pnEncoder.Margin = New Padding(6, FontHeight \ 2, 6, FontHeight \ 4)
Me.pnEncoder.Padding = New Padding(6, 0, 6, 0)
Me.pnEncoder.Size = New System.Drawing.Size(652, 226)
Me.pnEncoder.TabIndex = 0
'
'tlpMain
'
Me.tlpMain.AutoSize = False
Me.tlpMain.ColumnCount = 4
Me.tlpMain.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 33.33!))
Me.tlpMain.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 375.0!))
Me.tlpMain.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 375.0!))
Me.tlpMain.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 33.33!))
Me.tlpMain.Controls.Add(Me.MenuStrip, 0, 0)
Me.tlpMain.Controls.Add(Me.lgbSource, 0, 1)
Me.tlpMain.Controls.Add(Me.lgbTarget, 2, 1)
Me.tlpMain.Controls.Add(Me.lgbFilters, 0, 2)
Me.tlpMain.Controls.Add(Me.lgbResize, 1, 2)
Me.tlpMain.Controls.Add(Me.lgbEncoder, 3, 2)
Me.tlpMain.Controls.Add(Me.gbAudio, 0, 3)
Me.tlpMain.Controls.Add(Me.gbAssistant, 0, 4)
Me.tlpMain.Dock = DockStyle.Fill
Me.tlpMain.Location = New System.Drawing.Point(0, 0)
Me.tlpMain.Margin = New Padding(0)
Me.tlpMain.Name = "tlpMain"
Me.tlpMain.RowCount = 5
Me.tlpMain.RowStyles.Add(New RowStyle(SizeType.Absolute, 81.0!))
Me.tlpMain.RowStyles.Add(New RowStyle(SizeType.Absolute, 357.0!))
Me.tlpMain.RowStyles.Add(New RowStyle(SizeType.Absolute, _filterHeight))
Me.tlpMain.RowStyles.Add(New RowStyle(SizeType.AutoSize))
Me.tlpMain.RowStyles.Add(New RowStyle(SizeType.Absolute, 250.0!))
Me.tlpMain.TabIndex = 61
'
'MainForm
'
Me.AllowDrop = True
Me.AutoScaleDimensions = New System.Drawing.SizeF(288.0!, 288.0!)
Me.AutoScaleMode = AutoScaleMode.Dpi
Me.Controls.Add(Me.tlpMain)
Me.FormBorderStyle = FormBorderStyle.Sizable
Me.HelpButton = True
Me.MainMenuStrip = Me.MenuStrip
Me.Margin = New Padding(9, 12, 9, 12)
Me.MaximizeBox = False
Me.Name = "MainForm"
Me.Text = $"{g.DefaultCommands.GetApplicationDetails()}"
Me.StartPosition = FormStartPosition.CenterScreen
Me.gbAssistant.ResumeLayout(False)
Me.tlpAssistant.ResumeLayout(False)
Me.tlpAssistant.PerformLayout()
Me.gbAudio.ResumeLayout(False)
Me.tlpAudio.ResumeLayout(False)
Me.tlpAudio.PerformLayout()
Me.lgbTarget.ResumeLayout(False)
Me.lgbTarget.PerformLayout()
Me.tlpTarget.ResumeLayout(False)
Me.lgbSource.ResumeLayout(False)
Me.lgbSource.PerformLayout()
Me.tlpSource.ResumeLayout(False)
Me.tlpSourceValues.ResumeLayout(False)
Me.tlpSourceValues.PerformLayout()
Me.lgbResize.ResumeLayout(False)
Me.lgbResize.PerformLayout()
Me.tlpResize.ResumeLayout(False)
Me.tlpResize.PerformLayout()
Me.tlpResizeValues.ResumeLayout(False)
Me.tlpResizeValues.PerformLayout()
CType(Me.tbResize, System.ComponentModel.ISupportInitialize).EndInit()
Me.lgbFilters.ResumeLayout(False)
Me.lgbFilters.PerformLayout()
Me.lgbEncoder.ResumeLayout(False)
Me.lgbEncoder.PerformLayout()
Me.tlpMain.ResumeLayout(False)
Me.ResumeLayout(False)
Me.ScaleSize(44, 44)
End Sub
#End Region
Public WithEvents CustomMainMenu As CustomMenu
Public WithEvents CustomSizeMenu As CustomMenu
Public CurrentAssistantTipKey As String
Public BlockSubtitlesItemCheck As Boolean
Public AssistantPassed As Boolean
Public CommandManager As New CommandManager
Public Property LastTbTargetFileText As String = ""
Public Property PreviewScript As VideoScript
Private TargetAspectRatioMenu As ContextMenuStripEx
Private SizeContextMenuStrip As ContextMenuStripEx
Private EncoderMenu As ContextMenuStripEx
Private ContainerMenu As ContextMenuStripEx
Private SourceAspectRatioMenu As ContextMenuStripEx
Private TargetFileMenu As ContextMenuStripEx
Private SourceFileMenu As ContextMenuStripEx
Private NextContextMenuStrip As ContextMenuStripEx
Private CanIgnoreTip As Boolean = True
Private IsLoading As Boolean = True
Private BlockBitrate, BlockSize As Boolean
Private SkipAssistant As Boolean
Private BlockSourceTextBoxTextChanged As Boolean
Private AssistantClickAction As Action
Private ThemeRefresh As Boolean
Private Const TrackBarInterval As Integer = 16
Private Const TrackBarTicks As Integer = 4
Sub New(loadSettings As Boolean)
AddHandler Application.ThreadException, AddressOf g.OnUnhandledException
g.MainForm = Me
If loadSettings Then g.LoadSettings()
g.LoadAudioProfiles()
g.LoadVideoEncoderProfiles()
g.LoadEvents()
PowerShell.InitCode =
"Using namespace StaxRip;" + BR +
"Using namespace StaxRip.UI;" + BR +
"[Reflection.Assembly]::LoadWithPartialName(""StaxRip"")"
If s.WriteDebugLog Then
Dim filePath = Path.Combine(Folder.Startup, "Debug.log")
If File.Exists(filePath) Then
File.Delete(filePath)
End If
Dim listener = New TextWriterTraceListener(filePath) With {
.TraceOutputOptions = TraceOptions.ThreadId Or TraceOptions.DateTime
}
Trace.Listeners.Add(listener)
Trace.AutoFlush = True
End If
MenuItemEx.UseTooltips = s.EnableTooltips
Icon = g.Icon
g.DPI = DeviceDpi
InitializeComponent()
RestoreClientSize(60, 36)
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
If components Is Nothing Then
components = New Container()
End If
SetTip()
TargetAspectRatioMenu = New ContextMenuStripEx(components)
SizeContextMenuStrip = New ContextMenuStripEx(components)
EncoderMenu = New ContextMenuStripEx(components)
AddHandler EncoderMenu.Opening, Sub(sender As Object, e As CancelEventArgs) MenuOpening(sender, lgbEncoder.Tag)
ContainerMenu = New ContextMenuStripEx(components)
AddHandler ContainerMenu.Opening, Sub(sender As Object, e As CancelEventArgs) MenuOpening(sender, llMuxer.Tag)
SourceAspectRatioMenu = New ContextMenuStripEx(components)
TargetFileMenu = New ContextMenuStripEx(components)
SourceFileMenu = New ContextMenuStripEx(components)
NextContextMenuStrip = New ContextMenuStripEx(components)
tbTargetFile.TextBox.ContextMenuStrip = TargetFileMenu
tbSourceFile.TextBox.ContextMenuStrip = SourceFileMenu
Dim rc = "right-click"
tbSourceFile.TextBox.SendMessageCue(rc, False)
tbTargetFile.TextBox.SendMessageCue(rc, False)
MenuStrip.SuspendLayout()
MenuStrip.Font = FontManager.GetDefaultFont()
CommandManager.AddCommandsFromObject(Me)
CommandManager.AddCommandsFromObject(g.DefaultCommands)
CustomMainMenu = New CustomMenu(AddressOf GetDefaultMainMenu, s.CustomMenuMainForm, CommandManager, MenuStrip)
OpenProject(g.StartupTemplatePath)
CustomMainMenu.AddKeyDownHandler(Me)
CustomMainMenu.BuildMenu()
UpdateAudioMenus()
UpdateTargetSizeLabel()
MenuStrip.ResumeLayout()
SizeContextMenuStrip.SuspendLayout()
CustomSizeMenu = New CustomMenu(AddressOf GetDefaultMenuSize,
s.CustomMenuSize, CommandManager, SizeContextMenuStrip)
CustomSizeMenu.AddKeyDownHandler(Me)
CustomSizeMenu.BuildMenu()
SizeContextMenuStrip.ResumeLayout()
NextContextMenuStrip.Add("Add to top and open Jobs", Sub() AddJob(True, 0))
NextContextMenuStrip.Add("Add to bottom and open Jobs", Sub() AddJob(True, -1))
NextContextMenuStrip.Add("-")
NextContextMenuStrip.Add("Add to top w/o opening Jobs", Sub() AddJob(False, 0))
NextContextMenuStrip.Add("Add to bottom w/o opening Jobs", Sub() AddJob(False, -1))
g.SetRenderer(MenuStrip)
ThemeManager.SetCurrentTheme(s.ThemeName)
ApplyTheme()
AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged
AddHandler FiltersListView.Changed, AddressOf ApplyFilters
End Sub
Protected Overrides Sub Dispose(disposing As Boolean)
RemoveHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged
components?.Dispose()
MyBase.Dispose(disposing)
End Sub
Sub OnThemeChanged(theme As Theme)
ApplyTheme()
Assistant(False)
End Sub
Sub ApplyTheme()
ApplyTheme(ThemeManager.CurrentTheme)
End Sub
Sub ApplyTheme(theme As Theme)
ApplyTheme(GetAllControls(), theme)
End Sub
Sub ApplyTheme(controls As IEnumerable(Of Control))
ApplyTheme(controls, ThemeManager.CurrentTheme)
End Sub
Sub ApplyTheme(controls As IEnumerable(Of Control), theme As Theme)
If DesignHelp.IsDesignMode Then
Exit Sub
End If
BackColor = theme.General.BackColor
For Each control In controls.OfType(Of Label)
If control Is laTip Then
If CanIgnoreTip Then
control.BackColor = theme.MainForm.laTipBackColor
control.ForeColor = theme.MainForm.laTipForeColor
Else
control.BackColor = theme.MainForm.laTipBackHighlightColor
control.ForeColor = theme.MainForm.laTipForeHighlightColor
End If
Else
control.BackColor = theme.General.Controls.Label.BackColor
control.ForeColor = theme.General.Controls.Label.ForeColor
End If
Next
For Each control In controls.OfType(Of ButtonLabel)
control.ApplyTheme(theme)
control.BackColor = If(TypeOf control.Parent Is UserControl, theme.General.Controls.ListView.BackColor, theme.General.Controls.ButtonLabel.BackColor)
Next
For Each control In controls.OfType(Of ToggleButtonLabel)
control.ApplyTheme(theme)
control.BackColor = If(TypeOf control.Parent Is UserControl, theme.General.Controls.ListView.BackColor, theme.General.Controls.ToggleButtonLabel.BackColor)
Next
For Each control In controls.OfType(Of ButtonEx)
control.ApplyTheme(theme)
Next
For Each control In controls.OfType(Of GroupBox)
control.BackColor = theme.General.Controls.GroupBox.BackColor
control.ForeColor = theme.General.Controls.GroupBox.ForeColor
Next
For Each control In controls.OfType(Of Panel)
control.BackColor = theme.General.Controls.Panel.BackColor
control.ForeColor = theme.General.Controls.Panel.ForeColor
Next
For Each control In controls.OfType(Of TableLayoutPanel)
control.BackColor = theme.General.Controls.TableLayoutPanel.BackColor
control.ForeColor = theme.General.Controls.TableLayoutPanel.ForeColor
Next
For Each control In controls.OfType(Of TextBox)
control.BackColor = theme.General.Controls.TextBox.BackColor
control.ForeColor = theme.General.Controls.TextBox.ForeColor
Next
For Each control In controls.OfType(Of TextBoxEx)
control.BorderColor = theme.General.Controls.TextBox.BorderColor
control.BorderFocusedColor = theme.General.Controls.TextBox.BorderFocusedColor
Next
For Each control In controls.OfType(Of TextEdit)
control.BackColor = theme.General.Controls.TextEdit.BackColor
control.ForeColor = theme.General.Controls.TextEdit.ForeColor
control.BorderColor = theme.General.Controls.TextEdit.BorderColor
control.BorderFocusedColor = theme.General.Controls.TextEdit.BorderFocusedColor
Next
For Each control In controls.OfType(Of TrackBar)
control.BackColor = theme.General.Controls.TrackBar.BackColor
control.ForeColor = theme.General.Controls.TrackBar.ForeColor
Next
pnEncoder.BackColor = theme.General.Controls.ListView.BackColor
End Sub
Sub MenuOpening(sender As Object, tag As Object)
Dim menu = TryCast(sender, ContextMenuStripEx)
If menu Is Nothing Then Return
If tag Is Nothing Then Return
Dim allItems = menu.GetItems().OfType(Of MenuItemEx)
Dim selectedItem = allItems.Where(Function(x) tag IsNot Nothing AndAlso tag.Equals(x.Tag)).OrderBy(Function(x) x.Path.Length).FirstOrDefault()
If selectedItem Is Nothing Then Return
Dim selectedSubPath = If(selectedItem IsNot Nothing, selectedItem.Path.LeftLast(" | "), "")
Dim selectedSubSubPath = selectedSubPath.LeftLast(" | ")
Dim selectedPathLevel = If(selectedItem IsNot Nothing, Regex.Matches(selectedItem.Path, " \| ").Count, 0)
For Each item As MenuItemEx In allItems.Where(Function(x) Not String.IsNullOrEmpty(x.Path))
Dim sameLevel = Regex.Matches(item.Path, " \| ").Count = selectedPathLevel
item.CheckState = CheckState.Unchecked
item.CheckState = If(Not sameLevel AndAlso (selectedSubPath.Equals(item.Path) OrElse (selectedPathLevel > 1 AndAlso selectedSubSubPath.StartsWith(item.Path))), CheckState.Indeterminate, item.CheckState)
item.CheckState = If(item.Path = selectedItem?.Path, CheckState.Checked, item.CheckState)
Dim desiredFont = New Font(item.Font, If(item.CheckState = CheckState.Checked, FontStyle.Bold, FontStyle.Regular))
If Not item.Font.Equals(desiredFont) Then item.Font = desiredFont
Next
End Sub
Function GetIfoFile() As String
Dim ret = p.SourceFile.Dir
If New DirectoryInfo(ret).Name.EndsWithEx("_temp") Then
ret = ret.Parent
End If
ret = Path.Combine(ret, p.SourceFile.FileName.DeleteRight(5) + "0.ifo")
If File.Exists(ret) Then
Return ret
End If
End Function
Sub RenameDVDTracks()
Dim ifoPath = GetIfoFile()
If Not File.Exists(ifoPath) Then
Exit Sub
End If
For Each i In Directory.GetFiles(p.TempDir)
If g.IsSourceSame(i) AndAlso i.Contains("VTS") Then
Dim regex As New Regex(" T(\d\d) ")
Dim match = regex.Match(i)
If match.Success Then
Dim dgID = CInt(match.Groups(1).Value)
Using mi As New MediaInfo(ifoPath)
For x = 0 To mi.AudioStreams.Count - 1
If mi.GetAudio(x, "ID/String").Contains(" (0x" & dgID & ")") Then
Dim stream = mi.AudioStreams(x)
Dim base = i.Base
base = regex.Replace(base, " ID" & x & " ")
If base.Contains("2_0ch") Then
base = base.Replace("2_0ch", "2ch")
End If
If base.Contains("3_2ch") Then
base = base.Replace("3_2ch", "6ch")
End If
If base.Contains(" DELAY") Then
base = base.Replace(" DELAY", "")
End If
If base.Contains(" 0ms") Then
base = base.Replace(" 0ms", "")
End If
If stream.Language.TwoLetterCode <> "iv" Then
base += " " + stream.Language.EnglishName
End If
If stream.Title <> "" Then
base += " " + stream.Title
End If
FileHelp.Move(i, Path.Combine(i.Dir, base + i.ExtFull))
End If
Next
End Using
End If
End If
Next
End Sub
Function IsSaveCanceled(Optional saveProject As Boolean = True) As Boolean
SetLastModifiedTemplate()
If s.ApplicationExitMode <> ApplicationExitMode.Regular Then
Select Case s.ApplicationExitMode
Case ApplicationExitMode.BypassProjectSaving
Return False
Case ApplicationExitMode.ForceProjectSaving
If g.ProjectPath IsNot Nothing Then
SaveProjectPath(g.ProjectPath)
End If
Return False
Case Else
Throw New NotImplementedException()
End Select
If g.ProjectPath Is Nothing Then
If Not OpenSaveProjectDialog() Then
Return True
End If
Else
SaveProjectPath(g.ProjectPath)
End If
End If
If ObjectHelp.GetCompareString(g.SavedProject) <> ObjectHelp.GetCompareString(p) Then
'If String.IsNullOrWhiteSpace(p.SourceFile) AndAlso Log.Length > 0 Then Return False
If s.AutoSaveProject AndAlso p.SourceFile <> "" Then
If g.ProjectPath Is Nothing Then
g.ProjectPath = Path.Combine(p.TempDir, p.TargetFile.Base + ".srip")
End If
SaveProjectPath(g.ProjectPath)
Return False
End If
Using td As New TaskDialog(Of DialogResult)
td.Title = "Save changed project?"
td.AddButton("Save", DialogResult.Yes)
td.AddButton("Don't Save", DialogResult.No)
td.AddButton("Cancel", DialogResult.Cancel)
td.Show()
Refresh()
If td.SelectedValue = DialogResult.Yes Then
If g.ProjectPath Is Nothing Then
If Not OpenSaveProjectDialog() Then
Return True
End If
Else
SaveProjectPath(g.ProjectPath)
End If
ElseIf td.SelectedValue = DialogResult.Cancel Then
Return True
Else
Return False
End If
End Using
End If
End Function
Sub UpdateRecentProjectsMenu()
If Disposing OrElse IsDisposed Then Exit Sub
For Each mi In CustomMainMenu.MenuItems
If mi.CustomMenuItem?.MethodName = "DynamicMenuItem" AndAlso
mi.CustomMenuItem.Parameters(0).Equals(DynamicMenuItemID.RecentProjects) Then
mi.DropDownItems.ClearAndDisplose
SyncLock s.RecentProjects
For Each recentProj In s.RecentProjects
If File.Exists(recentProj) AndAlso Not recentProj.Base = "recover" Then
Dim name = recentProj
If recentProj.Length > 70 Then
name = "..." + name.Remove(0, name.Length - 70)
End If
mi.DropDownItems.Add(New MenuItemEx(name, Sub() LoadProject(recentProj)))
End If
Next
End SyncLock
Exit For
End If
Next
End Sub
<DebuggerNonUserCode>
Sub UpdateDynamicMenuAsync()
Task.Run(Sub()
Thread.Sleep(500)
Try
Invoke(Sub() UpdateDynamicMenu())
Catch
End Try
End Sub)
End Sub
Sub UpdateDynamicMenu()
PopulateProfileMenu(DynamicMenuItemID.EncoderProfiles)
PopulateProfileMenu(DynamicMenuItemID.MuxerProfiles)
PopulateProfileMenu(DynamicMenuItemID.AudioProfiles)
PopulateProfileMenu(DynamicMenuItemID.FilterSetupProfiles)
For Each iMenuItem In CustomMainMenu.MenuItems
If iMenuItem.CustomMenuItem.MethodName = "DynamicMenuItem" Then
If iMenuItem.CustomMenuItem.Parameters(0).Equals(DynamicMenuItemID.HelpApplications) Then
iMenuItem.DropDownItems.ClearAndDisplose
For Each pack In Package.Items.Values
MenuItemEx.Add(iMenuItem.DropDownItems, pack.Name.Substring(0, 1).ToUpperInvariant + " | " + pack.ID, Sub() pack.ShowHelp())
Next
End If
End If
Next
Application.DoEvents()
End Sub
Async Sub UpdateScriptsMenuAsync()
Dim files As String() = {}
Dim events As String() = System.Enum.GetNames(GetType(ApplicationEvent))
Await Task.Run(Sub()
If Folder.Scripts.DirExists Then
files = Directory.GetFiles(Folder.Scripts)
End If
End Sub)
If IsDisposed OrElse Native.GetForegroundWindow() <> Handle OrElse files.Count = 0 Then
Exit Sub
End If
For Each menuItem In CustomMainMenu.MenuItems
If menuItem.CustomMenuItem.MethodName = "DynamicMenuItem" Then
If menuItem.CustomMenuItem.Parameters(0).Equals(DynamicMenuItemID.Scripts) Then
menuItem.DropDownItems.ClearAndDisplose
For Each path In files
If Not events.Contains(path.FileName.Left(".")) AndAlso Not path.FileName.StartsWith("_") Then
MenuItemEx.Add(menuItem.DropDownItems, path.FileName.Base,
Sub() g.DefaultCommands.ExecutePowerShellFile(path))
End If
Next
menuItem.DropDownItems.Add(New ToolStripSeparator)
MenuItemEx.Add(menuItem.DropDownItems, "Open Script Folder", Sub() g.ShellExecute(Folder.Scripts))
End If
End If
Next
End Sub
Async Sub UpdateTemplatesMenuAsync()
If IsDisposed Then Exit Sub
Dim templates As IEnumerable(Of String) = Nothing
Await Task.Run(Sub()
Thread.Sleep(500)
For Each iFile In Directory.GetFiles(Folder.Template, "*.srip.backup")
FileHelp.Move(iFile, Path.Combine(iFile.Dir, "Backup", iFile.Base))
Next
templates = Directory.GetFiles(Folder.Template, "*.srip", SearchOption.AllDirectories).OrderBy(Function(x) x.Count(Function(c) c = Path.DirectorySeparatorChar)).ThenBy(Function(x) x)
End Sub)
For i = 0 To CustomMainMenu.MenuItems.Count - 1
Dim menuItem = CustomMainMenu.MenuItems(i)
If IsDisposed Then Exit Sub
If menuItem.CustomMenuItem.MethodName <> "DynamicMenuItem" OrElse Not menuItem.CustomMenuItem.Parameters(0).Equals(DynamicMenuItemID.TemplateProjects) Then Continue For
menuItem.DropDownItems.ClearAndDisplose()
Dim items As New List(Of MenuItemEx)
For Each template In templates
Dim text = template.Replace(Folder.Template, "").Trim(Path.DirectorySeparatorChar).Replace(Path.DirectorySeparatorChar, " | ")
text = text.Substring(0, text.LastIndexOf(".srip"))
text += If(template = g.StartupTemplatePath, " (Startup)", "")
MenuItemEx.Add(menuItem.DropDownItems, text, AddressOf LoadProject, template, Nothing)
Next
menuItem.DropDownItems.Add("-")
MenuItemEx.Add(menuItem.DropDownItems, "Explore", Sub() g.ShellExecute(Folder.Template), "Opens the directory containing the templates.")
MenuItemEx.Add(menuItem.DropDownItems, "Restore", AddressOf ResetTemplates, "Restores the default templates.")
Exit For
Next
If IsDisposed Then Exit Sub
Application.DoEvents()
End Sub
Sub ResetTemplates()
If MsgQuestion("Restore the default templates?") = DialogResult.OK Then
Try
FolderHelp.Delete(Folder.Template)
Folder.Template.ToString()
UpdateTemplatesMenuAsync()
Catch ex As Exception
g.ShowException(ex)
End Try
End If
End Sub
<Command("Loads a template.")>
Sub LoadTemplate(name As String)
Dim templates = Directory.GetFiles(Folder.Template, "*.srip", SearchOption.AllDirectories)
For Each template In templates
Dim temp = template.Replace(Folder.Template, "").Trim(Path.DirectorySeparatorChar)
Dim text1 = temp.Substring(0, temp.LastIndexOf(".srip"))
Dim text2 = text1.Replace(Path.DirectorySeparatorChar, " | ")
If {text1.ToLowerEx(), text2.ToLowerEx()}.Contains(name.ToLowerEx()) Then
LoadProject(template)
Exit Sub
End If
Next
End Sub
Function LoadTemplateWithSelectionDialog(sources As IEnumerable(Of String), timeout As Integer, Optional templateFolder As String = "") As Boolean
Return LoadTemplateWithSelectionDialog(sources?.Join("; "), timeout, templateFolder)
End Function
Function LoadTemplateWithSelectionDialog(sources As String(), timeout As Integer, Optional templateFolder As String = "") As Boolean
Return LoadTemplateWithSelectionDialog(sources?.Join("; "), timeout, templateFolder)
End Function
<Command("Loads a template that you can choose from via dialog.")>
Function LoadTemplateWithSelectionDialog(source As String, timeout As Integer, Optional templateFolder As String = "") As Boolean
If Not templateFolder.DirExists Then templateFolder = Folder.Template
If Not templateFolder.DirExists Then Return False
Dim directories = Directory.GetDirectories(templateFolder, "*", SearchOption.TopDirectoryOnly).ToList()
Dim templates = Directory.GetFiles(templateFolder, "*.srip", SearchOption.TopDirectoryOnly)?.Where(Function(x) x <> g.StartupTemplatePath)?.OrderBy(Function(x) x).ToList()
If Not templates?.Any() Then Return True
Using td As New TaskDialog(Of String)
td.Timeout = If(s.ShowTemplateSelectionDefault = ShowTemplateSelectionDefaultMode.None, 0, timeout)
td.Title = "Select a template"
td.Content = If(String.IsNullOrWhiteSpace(source),
"Please select a template you want to use:",
$"Please select a template you want to use for:{BR}{source}")
td.Icon = TaskIcon.Question
Dim isModified = ObjectHelp.GetCompareString(g.SavedProject) <> ObjectHelp.GetCompareString(p)
Dim isStartup = Not isModified AndAlso p.TemplateName = s.StartupTemplate
If p.SourceFile = "" Then
Dim postfix = If(isStartup, "(Startup and Current Template)", "(Current Template)")
Dim name = If(isModified, "Current Template", $"{p.TemplateName} {postfix}")
td.AddCommand(name, "CURRENT")
Else
td.AddCommand("Last set Template", "LAST")
End If
If isModified OrElse Not isStartup Then
td.AddCommand(g.StartupTemplatePath.Base() + " (Startup)", g.StartupTemplatePath, ThemeManager.CurrentTheme.TaskDialog.Button.TimeoutBackColor.SetHue(ThemeManager.CurrentTheme.HighlightHue))
End If
If templateFolder.Contains(Folder.Template + Path.DirectorySeparatorChar) Then
td.AddCommand($". . {Path.DirectorySeparatorChar}", "UP")
End If
For i = 0 To templates.Count() - 1
Dim text = templates(i).Replace(Folder.Template, "").Trim(Path.DirectorySeparatorChar).Replace(Path.DirectorySeparatorChar, $" {Path.DirectorySeparatorChar} ")
text = text.Substring(0, text.LastIndexOf(".srip"))
If text <> p.TemplateName OrElse isModified Then
td.AddCommand(text, templates(i))
End If
Next
For i = 0 To directories.Count() - 1
Dim text = directories(i).Replace(Folder.Template, "").Trim(Path.DirectorySeparatorChar).Replace(Path.DirectorySeparatorChar, $" {Path.DirectorySeparatorChar} ")
text += $" {Path.DirectorySeparatorChar} . ."
td.AddCommand(text, directories(i))
Next
If s.ShowTemplateSelectionDefault = ShowTemplateSelectionDefaultMode.None Then
td.AddButton("Abort", "", False)
ElseIf s.ShowTemplateSelectionDefault = ShowTemplateSelectionDefaultMode.Abort Then
td.AddButton("Abort", "", True)
ElseIf s.ShowTemplateSelectionDefault = ShowTemplateSelectionDefaultMode.CurrentLast Then
If p.SourceFile = "" Then
td.AddButton("Current Template", "CURRENT", True)
Else
td.AddButton("Last set Template", "LAST", True)
End If
td.AddButton("Abort", "", False)
ElseIf s.ShowTemplateSelectionDefault = ShowTemplateSelectionDefaultMode.Startup Then
td.AddButton("Startup Template", g.StartupTemplatePath, True)
td.AddButton("Abort", "", False)
End If
Dim selection = td.Show()
If selection = "" Then
Return False
ElseIf selection = "CURRENT" Then
Return True
ElseIf selection = "LAST" Then
Return OpenProject(g.LastModifiedTemplate)
ElseIf selection = "UP" Then
Return LoadTemplateWithSelectionDialog(source, timeout, templateFolder.Dir())
ElseIf selection.DirExists() Then
Return LoadTemplateWithSelectionDialog(source, timeout, selection)
Else
Return OpenProject(td.SelectedValue, True)
End If
End Using
End Function
<Command("Adds batch jobs for multiple files.")>
Sub AddBatchJobs(sourcefiles As String())
If sourcefiles Is Nothing Then Return
For Each sourcefile In sourcefiles
AddBatchJob(sourcefile)
Next
End Sub
<Command("Adds a batch job for a single file.")>
Sub AddBatchJob(sourcefile As String)
Dim batchFolder = Path.Combine(Folder.Settings, "Batch Projects")
If Not Directory.Exists(batchFolder) Then
Directory.CreateDirectory(batchFolder)
End If
g.RaiseAppEvent(ApplicationEvent.BeforeJobAdding)
sourcefile = sourcefile.TrimQuotes()
Dim batchProject = ObjectHelp.GetCopy(Of Project)(p)
batchProject.BatchMode = True
batchProject.SourceFiles = {sourcefile}.ToList
Dim splits = sourcefile.Dir.Split(Path.DirectorySeparatorChar)
Dim joins = splits.Select(Function(x) x.Substring(0, Math.Min(x.Length, 128 \ splits.Length))).Join("-").Replace(":", "-")
Dim jobPath = Path.Combine(batchFolder, joins + " " + p.TemplateName + " - " + sourcefile.FileName + ".srip")
SafeSerialization.Serialize(batchProject, jobPath)
JobManager.AddJob(sourcefile.Base, jobPath)
End Sub
Function LoadProject(path As String) As Boolean
SetLastModifiedTemplate()
Refresh()
If Not File.Exists(path) Then
MsgWarn("Project file not found.", $"{path}{BR}could not be found.")
s.UpdateRecentProjects(path)
UpdateRecentProjectsMenu()
UpdateTemplatesMenuAsync()
Return False
Else
Return OpenProject(path)
End If
End Function
Function OpenSaveProjectDialog() As Boolean
Using dialog As New SaveFileDialog
dialog.SetInitDir(p.TempDir)
dialog.FileName = If(p.SourceFile <> "", p.TargetFile.Base, "Untitled")
dialog.Filter = $"StaxRip Project Files (*.srip)|*.srip"
If dialog.ShowDialog() = DialogResult.OK Then
If Not dialog.FileName.ToLowerInvariant.EndsWith(".srip") Then
dialog.FileName += ".srip"
End If
SaveProjectPath(dialog.FileName)
Return True
End If
End Using
End Function
Function OpenSaveTemplateDialog() As Boolean
If p.SourceFile = "" Then
Using dialog As New SaveFileDialog
Dim tp As String
Try
Dim dirName = Path.GetDirectoryName(p.TemplatePath)
If Directory.Exists(dirName) Then tp = dirName
Catch ex As Exception
tp = Folder.Template
End Try
dialog.SetInitDir(tp)
dialog.FileName = If(p.TemplateName <> "", p.TemplateName, "Untitled")
dialog.Filter = $"StaxRip Template Files (*.srip)|*.srip"
If dialog.ShowDialog() = DialogResult.OK Then
Dim fp = Path.GetFullPath(dialog.FileName)
If Not fp.StartsWith(Folder.Template, StringComparison.OrdinalIgnoreCase) Then
If MsgQuestion("Saving outside Template Folder", "You are going to save the template outside of the Template Folder, so this template won't be able to be used!", TaskButton.OkCancel) = DialogResult.Cancel Then
Return False
End If
End If
If Not fp.ToLower.EndsWith(".srip") Then
fp += ".srip"
End If
SaveProjectPath(fp)
UpdateTemplatesMenuAsync()
Return True
End If
End Using
Else
MsgWarn("A template cannot be created after a source file was opened.")
End If
End Function
Sub SetBindings(proj As Project, add As Boolean)
SetTextBoxBinding(tbTargetFile, proj, NameOf(Project.TargetFile), add)
RemoveHandler proj.PropertyChanged, AddressOf ProjectPropertyChanged
If add Then
AddHandler proj.PropertyChanged, AddressOf ProjectPropertyChanged
End If
End Sub
Sub ProjectPropertyChanged(sender As Object, e As PropertyChangedEventArgs)
Assistant()
End Sub
Sub SetTextBoxBinding(tb As TextBox, obj As Object, prop As String, add As Boolean)
tb.DataBindings.Clear()
If add Then
tb.DataBindings.Add(New Binding(NameOf(TextBox.Text), obj, prop, False, DataSourceUpdateMode.OnPropertyChanged))
End If
End Sub
Sub SetTextBoxBinding(te As TextEdit, obj As Object, prop As String, add As Boolean)
te.TextBox.DataBindings.Clear()
If add Then
te.TextBox.DataBindings.Add(New Binding(NameOf(TextBox.Text), obj, prop, False, DataSourceUpdateMode.OnPropertyChanged))
End If
End Sub
Function OpenProject(Optional path As String = Nothing) As Boolean
Return OpenProject(path, True)
End Function
Function OpenProject(path As String, saveCurrentFirst As Boolean) As Boolean
Try
SetLastModifiedTemplate()
If Not IsLoading AndAlso saveCurrentFirst AndAlso IsSaveCanceled() Then Return False
If String.IsNullOrWhiteSpace(path) OrElse Not File.Exists(path) Then path = g.StartupTemplatePath
Try
p = SafeSerialization.Deserialize(New Project, path)
Catch ex As Exception
g.ShowException(ex, "Project file failed to load", "It will be reset to defaults." + BR2 + path)
p = New Project()
p.Init()
End Try
Return OpenProject(p, path)
Catch ex As Exception
OpenProject(g.StartupTemplatePath)
End Try
End Function
Function OpenProject(proj As Project, Optional path As String = "", Optional markAsPChanged As Boolean = True) As Boolean
Try
SetLastModifiedTemplate()
If proj IsNot Nothing AndAlso g.LastModifiedTemplate IsNot Nothing AndAlso ObjectHelp.GetCompareString(proj).Equals(ObjectHelp.GetCompareString(g.LastModifiedTemplate)) Then
proj = ObjectHelp.GetCopy(g.LastModifiedTemplate)
If String.IsNullOrWhiteSpace(path) Then path = proj.TemplatePath
If path = "" Then
Dim templates = Directory.GetFiles(Folder.Template, "*.srip", SearchOption.AllDirectories).Where(Function(x) x.Base() = proj.TemplateName).ToList()
If templates.Count = 0 Then
g.ShowException(New FileNotFoundException(), "Template not found", $"'{proj.TemplateName}' was not found")
ElseIf templates.Count = 1 Then
path = templates.First()
Else
g.ShowException(New Exception("Too many templates with the same name found and could not choose."))
End If
End If
ElseIf String.IsNullOrWhiteSpace(path) OrElse Not File.Exists(path) Then
path = g.StartupTemplatePath
End If
p = If(proj IsNot Nothing, proj, SafeSerialization.Deserialize(New Project(), path))
Log = p.Log
FileHelp.Delete(IO.Path.Combine(Folder.Temp, "staxrip.log"))
SetBindings(p, True)
Text = $"{path.Base} - {g.DefaultCommands.GetApplicationDetails()}"
If Not Environment.Is64BitProcess Then
Text += " (32 bit)"
End If
PreviewScript = Nothing
SkipAssistant = True
If path.StartsWith(Folder.Template) Then
g.ProjectPath = Nothing
p.TemplateName = path.Base
p.TemplatePath = path
p.BatchMode = False
Dim nnm = TypeOf p.Videoencoder.Muxer IsNot NullMuxer
If nnm AndAlso Not p.VideoEncoder.Muxer.CanEdit Then
p.VideoEncoder.Muxer.CanEdit = nnm
SaveProjectPath(path)
End If
Else
g.ProjectPath = path
End If
g.SetTempDir()
Dim width = p.TargetWidth
Dim height = p.TargetHeight
Dim size = p.TargetSize
Dim bitrate = p.VideoBitrate
FiltersListView.Load()
FiltersListView.Items(0).Selected = True
If p.SourceFile = "" AndAlso p.SourceFiles.Any() Then p.SourceFile = p.SourceFiles(0)
If p.SourceFile <> "" Then s.LastSourceDir = p.SourceFile.Dir
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
p.VideoEncoder.OnStateChange()
If p.TargetFile = "" Then
p.VideoEncoder.UpdateTargetFile(True)
End If
tbTargetFile.TextBox.SelectionStart = tbTargetFile.Text.Length
SetAudioTracks(p)
If p.BitrateIsFixed Then
tbBitrate.Text = ""
tbBitrate.Text = bitrate.ToString
Else
tbTargetSize.Text = ""
tbTargetSize.Text = size.ToString()
End If
SetSlider()
tbTargetWidth.Text = width.ToString
tbTargetHeight.Text = height.ToString
If markAsPChanged Then SetSavedProject()
SkipAssistant = False
Assistant(False)
s.UpdateRecentProjects(path)
UpdateRecentProjectsMenu()
g.RaiseAppEvent(ApplicationEvent.AfterProjectLoaded)
g.RaiseAppEvent(ApplicationEvent.AfterProjectOrSourceLoaded)
FiltersListView.RebuildMenu()
If p.SourceFile <> "" AndAlso Not g.VerifyRequirements Then
Throw New AbortException
End If
Return True
Catch ex As Exception
OpenProject(g.StartupTemplatePath)
Finally
SkipAssistant = False
End Try
End Function
Sub SetSlider()
tbResize.Maximum = ((Calc.FixMod(p.SourceWidth, TrackBarInterval) \ 2) * 3) \ Math.Max(TrackBarInterval, p.ForcedOutputMod)
tbResize.Maximum += If(tbResize.Maximum Mod 3 = 0, 0, 1)
tbResize.Maximum += If(tbResize.Maximum Mod 3 = 0, 0, 1)
End Sub
Sub SetSavedProject()
g.SavedProject = ObjectHelp.GetCopy(Of Project)(p)
End Sub
Sub SetLastModifiedTemplate()
If p.SourceFile <> "" OrElse Not p.Log.IsEmpty Then Exit Sub
g.LastModifiedTemplate = ObjectHelp.GetCopy(Of Project)(p)
End Sub
Sub SetAudioTracks(Optional proj As Project = Nothing)
proj = If(proj, p)
proj.AudioTracks = If(proj.AudioTracks, New List(Of AudioTrack))
Dim availableAudioTracks = Mathf.Clamp(proj.AudioTracksAvailable, 1, 25)
Dim sourceFile = p.LastOriginalSourceFile
Dim streams = If(sourceFile.FileExists(), MediaInfo.GetAudioStreams(sourceFile), New List(Of AudioStream))
Dim ateHeight = -1
'tlpAudio.SuspendLayout()
Try
tlpAudio.Controls.Clear()
tlpAudio.RowStyles.Clear()
If proj.AudioTracks.Count > availableAudioTracks Then
For index = proj.AudioTracks.Count - 1 To availableAudioTracks - 1 Step -1
proj.AudioTracks(index).TextEdit.Dispose()
proj.AudioTracks(index).LanguageLabel.Dispose()
proj.AudioTracks(index).NameLabel.Dispose()
proj.AudioTracks(index).EditLabel.Dispose()
proj.AudioTracks.RemoveAt(index)
Next
End If
For i = 0 To availableAudioTracks - 1
Dim index = i
Dim textEditContextMenuStripEx = New ContextMenuStripEx(components)
Dim audioTrack As AudioTrack
Dim audioProfile As AudioProfile = If(index < proj.AudioTracks.Count AndAlso proj.AudioTracks(index)?.AudioProfile IsNot Nothing, proj.AudioTracks(index)?.AudioProfile, New MuxAudioProfile())
If audioProfile.Streams Is Nothing OrElse Not audioProfile.Streams.Any() Then audioProfile.Streams = streams
Dim textEdit = New AudioTextEdit(index)
Dim languageLabel = New AudioLanguageLabel(index) With {
.Text = audioProfile.Language.Name
}
Dim nameLabel = New AudioNameButtonLabel(index) With {
.ContextMenuStripEx = New ContextMenuStripEx(components),
.ClickAction = Sub()
.ContextMenuStripEx.Show(audioTrack.NameLabel, 0, 16)
End Sub
}
Dim editLabel = New AudioEditButtonLabel(index) With {
.ClickAction = Sub()
audioTrack.AudioProfile.EditProject()
UpdateAudioMenus()
UpdateSizeOrBitrate()
nameLabel.Text = g.ConvertPath(audioTrack.AudioProfile.Name)
languageLabel.Text = audioTrack.AudioProfile.Language.Name
ShowAudioTip(audioTrack.AudioProfile)
End Sub
}
textEdit.TextBox.ContextMenuStrip = textEditContextMenuStripEx
TipProvider.SetTip("Shows the assigned language", languageLabel)
TipProvider.SetTip("Shows audio profiles", nameLabel)
TipProvider.SetTip("Opens audio settings for the current project/template", editLabel)
Dim textEditTextChanged = Sub(sender As Object, e As EventArgs)
AudioTextEditChanged(audioTrack)
End Sub
Dim textEditDoubleClick = Sub(sender As Object, e As EventArgs)
AudioTextEditDoubleClick(audioTrack)
End Sub
Dim textEditMouseDown = Sub(sender As Object, e As MouseEventArgs)
If e.Button = MouseButtons.Right Then
UpdateAudioFileMenu(audioTrack, index, Sub() textEditDoubleClick(Nothing, Nothing))
End If
End Sub
AddHandler textEdit.TextChanged, textEditTextChanged
AddHandler textEdit.DoubleClick, textEditDoubleClick
AddHandler textEdit.MouseDown, textEditMouseDown
If proj.AudioTracks.ElementAtOrDefault(index) Is Nothing Then
audioTrack = New AudioTrack(index) With {.AudioProfile = audioProfile, .EditLabel = editLabel, .LanguageLabel = languageLabel, .NameLabel = nameLabel, .TextEdit = textEdit}
proj.AudioTracks.Add(audioTrack)
Else
audioTrack = New AudioTrack(index) With {.AudioProfile = proj.AudioTracks(index).AudioProfile, .EditLabel = editLabel, .LanguageLabel = languageLabel, .NameLabel = nameLabel, .TextEdit = textEdit}
proj.AudioTracks(index) = audioTrack
End If
Next
For index = 0 To proj.AudioTracks.Count - 1
tlpAudio.Controls.Add(proj.AudioTracks(index).RowLabel, 0, index)
tlpAudio.Controls.Add(proj.AudioTracks(index).TextEdit, 1, index)
tlpAudio.Controls.Add(proj.AudioTracks(index).LanguageLabel, 2, index)
tlpAudio.Controls.Add(proj.AudioTracks(index).NameLabel, 3, index)
tlpAudio.Controls.Add(proj.AudioTracks(index).EditLabel, 4, index)
Next
Catch ex As Exception
Finally
tlpAudio.RowCount = availableAudioTracks
For Each ate In tlpAudio.Controls.OfType(Of AudioTextEdit)
ateHeight = ate.Height + ate.Margin.Vertical
ate.TextBox.SendMessageCue("right-click", False)
tlpAudio.RowStyles.Add(New RowStyle(SizeType.AutoSize))
Next
'tlpAudio.ResumeLayout()
SetFormBoundaries(ateHeight)
UpdateAudioMenus()
PopulateProfileMenu(DynamicMenuItemID.AudioProfiles)
End Try
End Sub
Sub AddAudioTracks()
If p.AudioTracks.Count = 0 Then Exit Sub
Dim files = g.GetFilesInTempDirAndParent().AsEnumerable()
files = files.Where(Function(x) FileTypes.Audio.Contains(x.Ext.ToLowerInvariant()))
files = files.Where(Function(x) g.IsSourceSame(x))
files = files.Where(Function(x) x.Ext.ToLowerInvariant() <> "avs")
files = files.Where(Function(x) Not x.ToLowerInvariant().Contains("_cut_"))
files = files.Where(Function(x) Not x.ToLowerInvariant().Contains("_out"))
files = files.Where(Function(x) Not x.ToLowerInvariant().Matches("_chunk\d+$"))
files = files.OrderBy(Function(x) x, New StringLogicalComparer()).ToList()
Dim hqAudioFiles = files.Where(Function(x) FileTypes.AudioHQ.Contains(x.Ext()))
Dim normalAudioFiles = files.Where(Function(x) (FileTypes.Audio.Except(FileTypes.AudioHQ)).Contains(x.Ext()))
Dim orderedAudioFiles = hqAudioFiles.Concat(normalAudioFiles).Distinct()
Dim groupedAudioFiles = orderedAudioFiles.GroupBy(Function(x) g.ExtractLanguageFromPath(x)).ToList()
Dim setLanguages = p.AudioTracks.Select(Function(x) x.AudioProfile.Language).Where(Function(x) x.IsDetermined).Select(Function(x) x.ThreeLetterCode)
Dim preferredAudios = p.PreferredAudio.ToLowerInvariant().SplitNoEmptyAndWhiteSpace(",", ";", " ")
Dim selectedAudios = preferredAudios.Concat(setLanguages.Distinct().Except(preferredAudios)).ToList()
Dim audioTracks As New List(Of (FilePath As String, Language As Language, Stream As AudioStream))
Dim addAudioTrack = Sub(groupIndex As Integer, pathIndex As Integer)
If groupedAudioFiles.Count <= groupIndex Then Exit Sub
If groupedAudioFiles(groupIndex) Is Nothing Then Exit Sub
If groupedAudioFiles(groupIndex).Count() <= pathIndex Then Exit Sub
If groupedAudioFiles(groupIndex)(pathIndex) = "" Then Exit Sub
Dim filePath = groupedAudioFiles(groupIndex)(pathIndex)
Dim baseName = filePath.Base().UnescapeIllegalFileSysChars()
audioTracks.Add((filePath, groupedAudioFiles(groupIndex).Key, Nothing))
End Sub
Dim audioStreams = New MediaInfo(p.SourceFile)?.AudioStreams
Dim addAudioStream = Sub(index As Integer)
If index >= audioStreams.Count Then Exit Sub
If audioStreams(index) Is Nothing Then Exit Sub
If p.DemuxAudio = DemuxMode.Dialog Then Exit Sub
If s.Demuxers.Any(Function(x) x.Active AndAlso TypeOf x Is eac3toDemuxer AndAlso x.InputExtensions.Contains(p.SourceFile.Ext())) Then Exit Sub
audioTracks.Add((audioStreams(index).Name, audioStreams(index).Language, audioStreams(index)))
End Sub
For i = 0 To selectedAudios.Count() - 1
Dim selectedAudio = selectedAudios(i)
Dim idMatch = Regex.Match(selectedAudio, "^(\d+)([^,; ]*)$", RegexOptions.IgnoreCase)
Dim languageMatch = Regex.Match(selectedAudio, "^([a-z]{2,}|[a-z]{2,4}(?:-[a-z]{2,})-[a-z]{2,5})([^,; ]*)$", RegexOptions.IgnoreCase)
If idMatch.Success Then
Dim id = idMatch.Groups(1).Value
Dim fileAdded = False
For j = 0 To groupedAudioFiles.Count() - 1
Dim item = groupedAudioFiles(j)
If item Is Nothing Then Continue For
For k = 0 To item.Count() - 1
If Not Regex.IsMatch(item(k).Base(), $"ID{id}\D") Then Continue For
addAudioTrack(j, k)
Next
fileAdded = True
Next
If Not fileAdded Then
addAudioStream(id.ToInt() - 1)
End If
ElseIf languageMatch.Success Then
Dim prefLangString = languageMatch.Groups(1).Value
Dim prefLang = New Language(prefLangString)
For j = 0 To groupedAudioFiles.Count() - 1
Dim item = groupedAudioFiles(j)
If item IsNot Nothing Then
If prefLangString.ToLowerInvariant() <> "all" AndAlso prefLang.ThreeLetterCode <> item.Key.ThreeLetterCode AndAlso prefLang.Name <> item.Key.Name Then Continue For
If prefLangString.ToLowerInvariant() = "all" AndAlso selectedAudios.Contains(item.Key.ThreeLetterCode, StringComparer.OrdinalIgnoreCase) Then Continue For
For k = 0 To item.Count() - 1
Dim index = k
If prefLangString.ToLowerInvariant() = "all" AndAlso audioTracks?.Any(Function(x) x.FilePath = item(index)) Then Continue For
addAudioTrack(j, k)
Next
End If
Next
For j = 0 To audioStreams.Count() - 1
Dim item = audioStreams(j)
If item IsNot Nothing Then
If prefLangString.ToLowerInvariant() <> "all" AndAlso prefLang.ThreeLetterCode <> item.Language.ThreeLetterCode AndAlso prefLang.Name <> item.Language.Name Then Continue For
If prefLangString.ToLowerInvariant() = "all" AndAlso selectedAudios.Contains(item.Language.ThreeLetterCode, StringComparer.OrdinalIgnoreCase) Then Continue For
If audioTracks?.Any(Function(x) x.FilePath.ContainsEx("ID" + (item.Index + 1).ToString()) AndAlso x.Language.ThreeLetterCode = item.Language.ThreeLetterCode) Then Continue For
addAudioStream(j)
End If
Next
End If
Next
Dim addTrack = Sub(source As (FilePath As String, Language As Language, Stream As AudioStream), dest As AudioTrack)
If source.FilePath = "" Then Return
If dest Is Nothing Then Return
dest.AudioProfile.Reset(dest.Index)
If source.Stream Is Nothing Then
dest.TextEdit.Text = source.FilePath
dest.AudioProfile.File = source.FilePath
Else
dest.AudioProfile.File = p.SourceFile
dest.AudioProfile.Stream = source.Stream
dest.TextEdit.Text = $"{source.Stream.Name} ({p.SourceFile?.Ext()})"
End If
dest.AudioProfile.Language = source.Language
dest.LanguageLabel.Refresh()
End Sub
For index = 0 To audioTracks.Count - 1
Dim i = index
If String.IsNullOrWhiteSpace(audioTracks(i).FilePath) Then Continue For
Dim sameLanguages = p.AudioTracks.Where(Function(x) x.TextEdit.Text = "" AndAlso
TypeOf x.AudioProfile IsNot NullAudioProfile AndAlso
x.AudioProfile.Language.ThreeLetterCode = audioTracks(i).Language.ThreeLetterCode).ToList()
If sameLanguages.Any() Then
addTrack(audioTracks(i), sameLanguages.First())
Else
For index2 = 0 To p.AudioTracks.Count - 1
Dim j = index2
If TypeOf p.AudioTracks(j).AudioProfile Is NullAudioProfile Then Continue For
If p.AudioTracks(j).TextEdit.Text <> "" Then Continue For
If p.AudioTracks(j).AudioProfile.Language.IsDetermined AndAlso p.AudioTracks(j).AudioProfile.Language.ThreeLetterCode <> audioTracks(i).Language.ThreeLetterCode Then Continue For
addTrack(audioTracks(i), p.AudioTracks(j))
Exit For
Next
End If
Next
End Sub
Function GetAudioTextBox(ap As AudioProfile) As TextEdit
Return p.AudioTracks.FirstOrDefault(Function(x) x.AudioProfile Is ap)?.TextEdit
End Function
Dim BlockAudioTextChanged As Boolean
Sub AudioTextEditChanged(audioTrack As AudioTrack)
If audioTrack Is Nothing Then Exit Sub
If BlockAudioTextChanged Then Exit Sub
Dim te = audioTrack.TextEdit
Dim ap = audioTrack.AudioProfile
If te.Text.Contains(":\") OrElse te.Text.StartsWith("\\") Then
If te.Text <> ap.File Then
ap.Reset(audioTrack.Index)
ap.File = te.Text
If FileTypes.Audio.Contains(ap.File.Ext) Then
If Not p.Script.GetFilter("Source").Script.Contains("DirectShowSource") Then
ap.Delay += g.ExtractDelay(ap.File)
End If
If p.TakeOverAudioName Then
If ap.StreamName = "" AndAlso ap.File.Contains("{") Then
ap.StreamName = g.ExtractTrackNameFromFilename(ap.File)
End If
End If
If p.TakeOverAudioDefault Then ap.Default = ( ap.Stream IsNot Nothing AndAlso ap.Stream.Default) OrElse g.ExtractDefaultFlagFromFilename(ap.File)
If p.TakeOverAudioForced Then ap.Forced = ( ap.Stream IsNot Nothing AndAlso ap.Stream.Forced) OrElse g.ExtractForcedFlagFromFilename(ap.File)
End If
ap.SetStreamOrLanguage()
End If
UpdateSizeOrBitrate()
BlockAudioTextChanged = True
te.Text = ap.DisplayName
BlockAudioTextChanged = False
ElseIf te.Text = "" Then
audioTrack.Remove()
UpdateSizeOrBitrate()
End If
audioTrack.LanguageLabel?.Refresh()
audioTrack.NameLabel.Text = g.ConvertPath(audioTrack.AudioProfile.Name)
End Sub
Sub AudioTextEditDoubleClick(audioTrack As AudioTrack)
Using dialog As New OpenFileDialog
Dim filter = FileTypes.Audio.ToList()
filter.Insert(0, "avs")
dialog.SetFilter(filter)
dialog.SetInitDir(p.TempDir, s.LastSourceDir)
If dialog.ShowDialog() = DialogResult.OK Then
audioTrack.TextEdit.Text = dialog.FileName
End If
End Using
End Sub
Function GetPathFromIndexFile(sourcePath As String) As String
For Each i In File.ReadAllLines(sourcePath)
If i.Contains(":\") OrElse i.StartsWith("\\") Then
If Regex.IsMatch(i, "^.+ \d+$") Then
i = i.LeftLast(" ")
End If
If File.Exists(i) AndAlso FileTypes.Video.Contains(i.Ext) Then
Return i
End If
End If
Next
End Function
Function ShowSourceFilterSelectionDialog(inputFile As String) As VideoFilter
Dim filters As New List(Of VideoFilter)
If inputFile.Ext.EqualsAny("mp4", "m4v", "mov") Then
AddSourceFilters({"LSMASHVideoSource", "LibavSMASHSource"}, filters)
End If
If FileTypes.Video.Contains(inputFile.Ext) AndAlso Not FileTypes.VideoText.Contains(inputFile.Ext) Then
AddSourceFilters({"BestSource", "FFVideoSource", "LWLibavVideoSource", "ffms2", "LWLibavSource"}, filters)
End If
If g.IsCOMObjectRegistered(GUIDS.LAVSplitter) AndAlso g.IsCOMObjectRegistered(GUIDS.LAVVideoDecoder) Then
AddSourceFilters({"DSS2"}, filters)
End If
If {"avi", "avs", "vdr"}.Contains(inputFile.Ext) Then
AddSourceFilters({"AVISource"}, filters)
End If
If inputFile.Ext = "d2v" Then
AddSourceFilters({"d2vsource"}, filters)
End If
If p.Script.IsAviSynth Then
filters = filters.Where(Function(filter) Not filter.Script.Replace(" ", "").Contains("clip=core.")).ToList
filters.Insert(0, New VideoFilter("Source", "Automatic", "#avs"))
Else
filters = filters.Where(Function(filter) filter.Script.Replace(" ", "").Contains("clip=core.")).ToList
filters.Insert(0, New VideoFilter("Source", "Automatic", "#vs"))
End If
Dim td As New TaskDialog(Of VideoFilter) With {
.Title = If(p.Script.IsAviSynth, "Select an AviSynth source filter:", "Select a VapourSynth source filter:")
}
For Each f In filters
td.AddCommand(f.Name, f)
Next
Dim ret = td.Show
td.Dispose()
If ret Is Nothing Then
Throw New AbortException
End If
ret.Script = Macro.ExpandGUI(ret.Script, True).Value
Return ret
End Function
Sub AddSourceFilters(filterNames As String(), filters As List(Of VideoFilter))
Dim avsProfiles = s.AviSynthProfiles.Where(Function(cat) cat.Name = "Source").First.Filters
Dim vsProfiles = s.VapourSynthProfiles.Where(Function(cat) cat.Name = "Source").First.Filters
Dim allFilters = avsProfiles.Concat(vsProfiles)
For Each f In allFilters
For Each filterName In filterNames
If f.Script.ToLowerInvariant.Contains(filterName.ToLowerInvariant + "(") OrElse
f.Script.ToLowerInvariant.Contains(filterName.ToLowerInvariant + ".") Then
If filters.Where(Function(val) val.Name = f.Name).Count = 0 Then
filters.Add(f.GetCopy)
End If
End If
Next
Next
End Sub
Sub OpenAnyFile(files As IEnumerable(Of String), showTemplateSelection As Boolean, Optional errorTimeout As Integer = 0)
If files Is Nothing Then Exit Sub
If Not files.Any() Then Exit Sub
SetLastModifiedTemplate()
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
files = files.Select(Function(filePath) New FileInfo(filePath.TrimQuotes()).FullName)
If files(0).Ext = "srip" Then
OpenProject(files(0))
ElseIf FileTypes.Video.Contains(files(0).Ext.ToLowerInvariant) Then
files = files.OrderBy(Function(x) FileTypes.Video.Contains(x.Ext)).ThenBy(Function(x) FileTypes.Audio.Contains(x.Ext))
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(files, showTemplateSelectionTimeout) Then
OpenVideoSourceFiles(files, True, errorTimeout)
Else
Exit Sub
End If
Else
OpenVideoSourceFiles(files, True, errorTimeout)
End If
ElseIf FileTypes.IsoImage.ContainsAny(files.Select(Function(s) s.Ext.ToLowerInvariant)) Then
files = files.Where(Function(x) FileTypes.IsoImage.Contains(x.Ext().ToLowerInvariant())).OrderBy(Function(x) x, New StringLogicalComparer())
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(files(0), showTemplateSelectionTimeout) Then
OpenBlurayImage(files(0))
Else
Exit Sub
End If
Else
OpenBlurayImage(files(0))
End If
ElseIf FileTypes.Audio.ContainsAny(files.Select(Function(s) s.Ext.ToLowerInvariant)) Then
Dim audioFiles = files.Where(Function(x) FileTypes.Audio.Contains(x.Ext().ToLowerInvariant())).OrderBy(Function(x) x, New StringLogicalComparer())
Dim fileIndex = 0
Dim freeAudioTracks = p.AudioTracks.Where(Function(x) x.TextEdit.Text = "")
If audioFiles?.Any() AndAlso freeAudioTracks?.Any() Then
For Each track In freeAudioTracks
If fileIndex >= audioFiles.Count() Then Exit For
track.TextEdit.Text = audioFiles(fileIndex)
fileIndex += 1
Next
End If
Else
files = files.OrderBy(Function(x) FileTypes.Video.Contains(x.Ext)).ThenBy(Function(x) FileTypes.Audio.Contains(x.Ext))
Dim action = Sub()
If files(0).DirExists() Then
OpenBlurayFolder(files(0))
Else
OpenVideoSourceFiles(files, True, errorTimeout)
End If
End Sub
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(files, showTemplateSelectionTimeout) Then
action()
Else
Exit Sub
End If
Else
action()
End If
End If
End Sub
Function OpenBlurayFolder(srcPath As String) As Boolean
If String.IsNullOrWhiteSpace(srcPath) Then Return False
If Not srcPath.DirExists() Then Return False
If Directory.Exists(Path.Combine(srcPath, "BDMV")) Then
srcPath = Path.Combine(srcPath, "BDMV")
End If
If Directory.Exists(Path.Combine(srcPath, "PLAYLIST")) Then
srcPath = Path.Combine(srcPath, "PLAYLIST")
End If
If New DirectoryInfo(srcPath).Name <> "PLAYLIST" Then
MsgWarn("No playlist directory found.")
Return False
End If
Dim minDuration = If(p.MinBdmvPlaylistDuration >= 0, $" -minDuration={p.MinBdmvPlaylistDuration}", "")
Log.WriteEnvironment()
Log.Write("Process Blu-Ray folder using eac3to", """" + Package.eac3to.Path + """ """ + srcPath + """" + minDuration + BR2)
Log.WriteLine("Source Drive Type: " + New DriveInfo(srcPath).DriveType.ToString + BR)
Dim output = ProcessHelp.GetConsoleOutput(Package.eac3to.Path, srcPath.Escape & minDuration).Replace(VB6.vbBack, "")
Log.WriteLine(output)
Dim a = Regex.Split(output, "^\d+\)", RegexOptions.Multiline).ToList
If a(0) = "" Then a.RemoveAt(0)
Using td As New TaskDialog(Of Integer)
td.Title = "Please select a playlist."
For Each i In a
If Not i.Contains(BR) Then Continue For
Dim match = Regex.Match(i, "(\+\d+)\1{8,}", RegexOptions.Multiline)
If match.Success AndAlso match.Groups.Count > 1 Then Continue For
Dim value = a.IndexOf(i) + 1
Dim text = value & ") " & i.Left(BR).Trim()
Dim description = i.Right(BR).TrimEnd()
td.AddCommand(text, description, value)
Next
If td.Show() <> 0 Then
OpenEac3toDemuxForm(srcPath, td.SelectedValue)
End If
End Using
Return True
End Function
Function OpenBlurayImage(isoPath As String) As Boolean
If String.IsNullOrWhiteSpace(isoPath) Then Return False
If Not isoPath.FileExists() Then Return False
Try
Dim drive = IsoHelp.Mount(isoPath)
Dim srcPath = drive & Path.VolumeSeparatorChar & Path.DirectorySeparatorChar
If Directory.Exists(Path.Combine(srcPath, "BDMV")) Then
srcPath = Path.Combine(srcPath, "BDMV")
End If
If Directory.Exists(Path.Combine(srcPath, "PLAYLIST")) Then
srcPath = Path.Combine(srcPath, "PLAYLIST")
End If
If New DirectoryInfo(srcPath).Name <> "PLAYLIST" Then
MsgWarn("No playlist directory found.")
Return False
End If
Dim minDuration = If(p.MinBdmvPlaylistDuration >= 0, $" -minDuration={p.MinBdmvPlaylistDuration}", "")
Log.WriteEnvironment()
Log.Write("Process mounted Blu-Ray folder using eac3to", """" + Package.eac3to.Path + """ """ + srcPath + """" + minDuration + BR2)
Log.WriteLine("Source Drive Type: " + New DriveInfo(srcPath).DriveType.ToString + BR)
Log.WriteLine("Mounted ISO File: " + isoPath.Escape() + BR)
Dim output = ProcessHelp.GetConsoleOutput(Package.eac3to.Path, srcPath.Escape & minDuration).Replace(VB6.vbBack, "")
Log.WriteLine(output)
Dim a = Regex.Split(output, "^\d+\)", RegexOptions.Multiline).ToList
If a(0) = "" Then a.RemoveAt(0)
Using td As New TaskDialog(Of Integer)
td.Title = "Please select a playlist."
For Each i In a
If Not i.Contains(BR) Then Continue For
Dim match = Regex.Match(i, "(\+\d+)\1{8,}", RegexOptions.Multiline)
If match.Success AndAlso match.Groups.Count > 1 Then Continue For
Dim value = a.IndexOf(i) + 1
Dim text = value & ") " & i.Left(BR).Trim()
Dim description = i.Right(BR).TrimEnd()
td.AddCommand(text, description, value)
Next
If td.Show() <> 0 Then
OpenEac3toDemuxForm(srcPath, td.SelectedValue)
End If
End Using
Return True
Catch ex As Exception
g.ShowException(ex)
Return False
Finally
IsoHelp.Dismount(isoPath)
End Try
End Function
Sub OpenVideoSourceFile(fp As String, Optional demux As Boolean = True, Optional errorTimeout As Integer = 0)
OpenVideoSourceFiles({fp}, demux, errorTimeout)
End Sub
Sub OpenVideoSourceFiles(files As IEnumerable(Of String), Optional demux As Boolean = True, Optional errorTimeout As Integer = 0)
OpenVideoSourceFiles(files, demux, False, errorTimeout)
End Sub
Sub OpenVideoSourceFiles(files As IEnumerable(Of String), demuxSource As Boolean, isEncoding As Boolean, Optional errorTimeout As Integer = 0)
If p.SourceFile = "" Then SetLastModifiedTemplate()
Dim recoverPath = g.ProjectPath
Dim recoverProjectPath = Path.Combine(Folder.Temp, Guid.NewGuid.ToString + ".bin")
Dim recoverText = Text
Dim saveCurrent = p.SourceFile <> ""
If saveCurrent AndAlso Not IsLoading Then
If IsSaveCanceled() Then
Return
End If
End If
Try
SafeSerialization.Serialize(p, recoverProjectPath)
AddHandler Disposed, Sub() FileHelp.Delete(recoverProjectPath)
Catch ex As Exception
MsgWarn("Recovery not saved!", $"The recovery project could not be saved at:{BR}{recoverProjectPath}")
End Try
SkipAssistant = True
Try
files = files.Select(Function(filePath) New FileInfo(filePath.TrimQuotes()).FullName).OrderBy(Function(filePath) filePath, StringComparer.InvariantCultureIgnoreCase)
If Not g.VerifySource(files) Then
Throw New AbortException
End If
For Each i In files
Dim name = i.FileName
If name.ToUpperInvariant Like "VTS_0#_0.VOB" Then
If MsgQuestion("Are you sure you want to open the file " + name + "," + BR + "the first VOB file usually contains a menu.") = DialogResult.Cancel Then
Throw New AbortException
End If
End If
If name.ToUpperInvariant = "VIDEO_TS.VOB" Then
MsgWarn("The file VIDEO_TS.VOB can't be opened.")
Throw New AbortException
End If
Next
p.SourceFiles = files.ToList()
p.SourceFile = files(0)
Debug.WriteLine(isEncoding)
Debug.WriteLine(p.SourceFile)
If p.SourceFile.Ext.EqualsAny(FileTypes.Image) Then
If p.SourceFile.Base(p.SourceFile.Base.Length - 1).IsDigit Then
If p.Script.IsAviSynth Then
Dim digitCount = 0
For i = p.SourceFile.Base.Length - 1 To 0 Step -1
If p.SourceFile.Base(i).IsDigit Then
digitCount += 1
End If
Next
Dim startText = p.SourceFile.Base.Substring(0, p.SourceFile.Base.Length - digitCount)
Dim images As New List(Of String)
Dim allFiles = Directory.GetFiles(p.SourceFile.Dir)
For Each file In allFiles
If file.Base.Length = p.SourceFile.Base.Length AndAlso file.Ext = p.SourceFile.Ext AndAlso file.Base.StartsWith(startText) Then
images.Add(file)
End If
Next
images.Sort()
Dim filter = p.Script.GetFilter("Source")
filter.Path = "Image"
filter.Script = "ImageSource(""" + Path.Combine(images(0).Dir, p.SourceFile.Base.Substring(0,
p.SourceFile.Base.Length - digitCount) + "%0" & digitCount & "d." + p.SourceFile.Ext) +
""", " & images(0).Base.Substring(p.SourceFile.Base.Length - digitCount).ToInt &
", " & images(images.Count - 1).Base.Substring(p.SourceFile.Base.Length - digitCount).ToInt & ", 25)"
End If
Else
Dim filter = p.Script.GetFilter("Source")
filter.Path = "Image"
filter.Script = "ImageSource(""%source_file%"", 0, 1000, 25)"
End If
End If
FiltersListView.IsLoading = True
PreviewScript = Nothing
Dim preferredSourceFilter As VideoFilter = Nothing
If p.SourceFiles.Count = 1 AndAlso
p.Script.Filters(0).Name = "Manual" AndAlso
Not p.NoDialogs AndAlso Not p.BatchMode AndAlso
Not p.SourceFile.Ext.EqualsAny("avs", "vpy") Then
preferredSourceFilter = ShowSourceFilterSelectionDialog(files(0))
End If
If preferredSourceFilter IsNot Nothing Then
Dim isVapourSynth = preferredSourceFilter.Script.Replace(" ", "").Contains("clip=core.") OrElse preferredSourceFilter.Script = "#vs"
If isVapourSynth Then
If Not Package.Python.VerifyOK(True) OrElse
Not Package.VapourSynth.VerifyOK(True) OrElse
Not Package.vspipe.VerifyOK(True) Then
Throw New AbortException
End If
If p.Script.IsAviSynth Then
p.Script = VideoScript.GetDefaults()(1)
End If
Else
If Not Package.AviSynth.VerifyOK(True) Then Throw New AbortException
If p.Script.Engine = ScriptEngine.VapourSynth Then
p.Script = VideoScript.GetDefaults()(0)
End If
End If
p.Script.SetFilter(preferredSourceFilter.Category, preferredSourceFilter.Name, preferredSourceFilter.Script)
End If
If Not g.VerifyRequirements() Then
Throw New AbortException
End If
p.LastOriginalSourceFile = p.SourceFile
p.FirstOriginalSourceFile = p.SourceFile
If FileTypes.VideoIndex.Contains(p.SourceFile.Ext) Then
Dim path = GetPathFromIndexFile(p.SourceFile)
If path <> "" Then
p.LastOriginalSourceFile = path
p.FirstOriginalSourceFile = path
End If
ElseIf p.SourceFile.Ext.EqualsAny({"avs", "vpy"}) Then
Dim code = p.SourceFile.ReadAllText
Dim matches = Regex.Matches(code, "('|"")(.+?)\1", RegexOptions.IgnoreCase)
For Each match As Match In matches
If match.Success Then
Dim path = match.Groups(2).Value
If File.Exists(path) AndAlso FileTypes.Video.Contains(path.Ext) Then
If FileTypes.VideoIndex.Contains(path.Ext) Then
path = GetPathFromIndexFile(path)
If path <> "" Then
p.LastOriginalSourceFile = path
p.FirstOriginalSourceFile = path
Exit For
End If
Else
p.LastOriginalSourceFile = path
p.FirstOriginalSourceFile = path
Exit For
End If
End If
End If
Next
End If
g.SetTempDir()
Dim sourcePAR = MediaInfo.GetVideo(p.LastOriginalSourceFile, "PixelAspectRatio")
If sourcePAR <> "" Then
p.SourcePAR.X = CInt(Convert.ToSingle(sourcePAR, CultureInfo.InvariantCulture) * 1000)
p.SourcePAR.Y = 1000
End If
p.SourceVideoHdrFormat = MediaInfo.GetVideo(p.LastOriginalSourceFile, "HDR_Format_Commercial")
p.SourceVideoHdrFormat = If(String.IsNullOrWhiteSpace(p.SourceVideoHdrFormat), "SDR", p.SourceVideoHdrFormat)
p.SourceVideoHdrFormat = If(p.SourceVideoHdrFormat = "Dolby Vision", "DV", p.SourceVideoHdrFormat)
If p.SourceVideoHdrFormat.ContainsAny("SDR", "HDR10", "HDR10+", "Dolby Vision") Then
Dim hdrFormat = MediaInfo.GetVideo(p.LastOriginalSourceFile, "HDR_Format/String")
If hdrFormat.ContainsEx("Dolby Vision") Then
p.SourceVideoHdrFormat = "DV"
Dim profileMatch = Regex.Match(hdrFormat, "Profile (\d\.\d),")
If profileMatch.Success Then
p.SourceVideoHdrFormat += " " + profileMatch.Groups(1).Value
End If
If Regex.IsMatch(hdrFormat, "HDR10 compatible") Then
p.SourceVideoHdrFormat += " / HDR10"
ElseIf Regex.IsMatch(hdrFormat, "HDR10\+ Profile [AB] compatible") Then
p.SourceVideoHdrFormat += " / HDR10+"
End If
End If
End If
p.SourceVideoFormat = MediaInfo.GetVideoFormat(p.LastOriginalSourceFile)
p.SourceVideoFormatProfile = MediaInfo.GetVideo(p.LastOriginalSourceFile, "Format_Profile")
p.SourceVideoBitDepth = MediaInfo.GetVideo(p.LastOriginalSourceFile, "BitDepth").ToInt
p.SourceColorSpace = MediaInfo.GetVideo(p.LastOriginalSourceFile, "ColorSpace")
p.SourceChromaSubsampling = MediaInfo.GetVideo(p.LastOriginalSourceFile, "ChromaSubsampling")
p.SourceSize = If(p.LastOriginalSourceFile.FileExists(), p.LastOriginalSourceFile.FileSize, If(p.LastOriginalSourceFile.DirExists(), p.LastOriginalSourceFile.DirSize(), 0L))
p.SourceVideoSize = MediaInfo.GetVideo(p.LastOriginalSourceFile, "StreamSize").ToLong()
p.SourceBitrate = CInt(MediaInfo.GetVideo(p.LastOriginalSourceFile, "BitRate").ToInt / 1000)
p.SourceFrameRateMode = MediaInfo.GetVideo(p.LastOriginalSourceFile, "FrameRate_Mode")
p.SourceScanType = MediaInfo.GetVideo(p.LastOriginalSourceFile, "ScanType")
p.SourceScanOrder = MediaInfo.GetVideo(p.LastOriginalSourceFile, "ScanOrder")
Dim mkvMuxer = TryCast(p.VideoEncoder.Muxer, MkvMuxer)
If mkvMuxer IsNot Nothing Then
If p.TakeOverVideoLanguage AndAlso Not mkvMuxer.VideoTrackLanguage?.IsDetermined Then
mkvMuxer.VideoTrackLanguage = New Language(MediaInfo.GetVideo(p.LastOriginalSourceFile, "Language"))
End If
If p.TakeOverTitle Then
If mkvMuxer.Title = "" Then mkvMuxer.Title = MediaInfo.GetGeneral(p.LastOriginalSourceFile, "Title")
If mkvMuxer.Title = "" Then mkvMuxer.Title = MediaInfo.GetGeneral(p.LastOriginalSourceFile, "Movie")
End If
End If
If Not isEncoding AndAlso p.BatchMode Then
Assistant()
Exit Sub
End If
Log.WriteEnvironment()
Log.WriteHeader("Media Info Source File")
For Each i In p.SourceFiles
Log.WriteLine(i)
Next
Log.WriteLine(BR + MediaInfo.GetSummary(p.SourceFile))
For Each i In DriveInfo.GetDrives()
If i.DriveType = DriveType.CDRom AndAlso
p.TempDir.ToUpperInvariant.StartsWith(i.RootDirectory.ToString.ToUpperInvariant) Then
MsgWarn("Opening files from an optical drive requires to set a temp files folder in the options.")
Throw New AbortException
End If
Next
If Not p.BatchMode Then p.VideoEncoder.UpdateTargetFile(True)
If demuxSource Then Demux()
If String.IsNullOrWhiteSpace(p.Hdr10PlusMetadataFile) OrElse String.IsNullOrWhiteSpace(p.HdrDolbyVisionMetadataFile?.Path) Then
Dim metadatas = Task.Run(Async Function() Await FindHdrMetadataAsync(p)).Result
p.Hdr10PlusMetadataFile = If(String.IsNullOrWhiteSpace(metadatas.jsonFile), Nothing, metadatas.jsonFile)
p.HdrDolbyVisionMetadataFile = If(String.IsNullOrWhiteSpace(metadatas.rpuFile), Nothing, New DolbyVisionMetadataFile(metadatas.rpuFile))
End If
If p.ExtractHdrmetadata <> HdrmetadataMode.None AndAlso
Not p.SourceVideoHdrFormat?.EqualsAny("", "SDR") AndAlso
(String.IsNullOrWhiteSpace(p.Hdr10PlusMetadataFile) OrElse String.IsNullOrWhiteSpace(p.HdrDolbyVisionMetadataFile?.Path)) Then
Select Case p.ExtractHdrmetadata
Case HdrmetadataMode.DolbyVision
ExtractDolbyVisionMetadata(p)
Case HdrmetadataMode.HDR10Plus
ExtractHdr10PlusMetadata(p)
Case Else
ExtractHdrMetadata(p)
End Select
End If
p.VideoEncoder.SetMetaData(p.LastOriginalSourceFile)
If p.LastOriginalSourceFile <> p.SourceFile AndAlso Not FileTypes.VideoText.Contains(p.SourceFile.Ext) Then
p.LastOriginalSourceFile = p.SourceFile
End If
s.LastSourceDir = p.SourceFile.Dir
If p.SourceFile.Ext = "avs" AndAlso p.Script.IsAviSynth Then
p.Script.Filters.Clear()
p.Script.Filters.Add(New VideoFilter("Source", "AVS Script Import", "Import(""" + p.SourceFile + """)"))
ElseIf p.SourceFile.Ext = "vpy" Then
p.Script.Engine = ScriptEngine.VapourSynth
p.Script.Filters.Clear()
Dim code = "import vapoursynth as vs" + BR +
"core = vs.core" + BR +
"from importlib.machinery import SourceFileLoader" + BR +
$"SourceFileLoader('clip', r""{p.SourceFile}"").load_module()" + BR +
"clip = vs.get_output()"
p.Script.Filters.Add(New VideoFilter("Source", "VS Script Import", code))
End If
ModifyFilters(errorTimeout)
FiltersListView.IsLoading = False
FiltersListView.Load()
RenameDVDTracks()
If FileTypes.VideoAudio.Contains(p.LastOriginalSourceFile.Ext) Then
Dim streams = MediaInfo.GetAudioStreams(p.LastOriginalSourceFile)
For Each track In p.AudioTracks
track.AudioProfile.Streams = streams
Next
End If
If p.SourceFile.Ext = "d2v" Then
Dim content = p.SourceFile.ReadAllText
If content.Contains("Aspect_Ratio=16:9") Then
p.SourceAnamorphic = True
Else
Dim ifoFile = GetIfoFile()
If ifoFile <> "" Then
Dim dar2 = MediaInfo.GetVideo(ifoFile, "DisplayAspectRatio")
If dar2 = "1.778" Then
p.SourceAnamorphic = True
End If
End If
End If
If content.Contains("Frame_Rate=29970") Then
Dim m = Regex.Match(content, "FINISHED\s+(\d{1,2}(?:\.\d{1,2}))\s?%\s+FILM")
If m.Success Then
Dim film = m.Groups(1).Value.ToSingle()
If film >= p.D2VAutoForceFilmThreshold Then
content = content.Replace($"Field_Operation=0{BR}Frame_Rate=29970 (30000/1001)", $"Field_Operation=1{BR}Frame_Rate=23976 (24000/1001)")
content.WriteFileSystemEncoding(p.SourceFile)
End If
End If
End If
End If
UpdateSourceParameters()
SetSlider()
AddAudioTracks()
If p.UseScriptAsAudioSource Then
If p.AudioTracks.Any() Then
p.AudioTracks(0).TextEdit.Text = p.Script.Path
End If
End If
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
s.LastPosition = 0
UpdateTargetParameters(p)
DemuxVobSubSubtitles()
ConvertBluRaySubtitles()
ExtractForcedVobSubSubtitles()
p.VideoEncoder.UpdateTargetFile(True)
g.RaiseAppEvent(ApplicationEvent.BeforeMuxingWhenSourceOpening)
p.VideoEncoder.Muxer.Init()
If p.HardcodedSubtitle Then
g.AddHardcodedSubtitle()
End If
AutoCrop()
AutoResize()
If p.Script.IsFilterActive("Crop") AndAlso (p.CropLeft Or p.CropTop Or p.CropRight Or p.CropBottom) <> 0 Then
g.OvercropWidth()
If p.AutoSmartCrop Then
g.SmartCrop()
End If
End If
Dim nonDvdFiles = files.Where(Function(x) Not Regex.IsMatch(x, ".*VTS_\d\d_\d\.vob", RegexOptions.IgnoreCase))
If nonDvdFiles.Count() > 1 Then
Dim psi = New ProcessStartInfo(Application.ExecutablePath, $"-NoFocus -LoadTemplate:""{p.TemplateName}"" -LoadSourceFiles:""{nonDvdFiles.Skip(1).Join(""";""", False)}""") With {
.UseShellExecute = False,
.CreateNoWindow = True
}
Process.Start(psi)?.Dispose()
End If
If p.AutoCompCheck AndAlso p.VideoEncoder.IsCompCheckEnabled Then
p.VideoEncoder.RunCompCheck()
End If
g.RaiseAppEvent(ApplicationEvent.AfterSourceOpened)
SkipAssistant = False
Assistant()
g.RaiseAppEvent(ApplicationEvent.AfterSourceLoaded)
g.RaiseAppEvent(ApplicationEvent.AfterProjectOrSourceLoaded)
Log.Save()
Catch ex As AbortException
Log.Save()
SetSavedProject()
OpenProject(recoverProjectPath)
Text = recoverText
g.ProjectPath = recoverPath
If isEncoding Then
Throw New AbortException
End If
Catch ex As Exception
g.OnException(ex)
OpenProject("", False)
Finally
SkipAssistant = False
If Not isEncoding Then
ProcController.Finished()
End If
End Try
End Sub
Sub ModifyFilters(Optional timeout As Integer = 0)
If p.SourceFile = "" Then Exit Sub
Dim profiles = If(p.Script.IsAviSynth, s.AviSynthProfiles, s.VapourSynthProfiles)
Dim preferences = If(p.Script.IsAviSynth, s.AviSynthFilterPreferences, s.VapourSynthFilterPreferences)
Dim editAVS = p.Script.IsAviSynth AndAlso p.SourceFile.Ext <> "avs"
Dim editVS = p.Script.IsVapourSynth AndAlso p.SourceFile.Ext <> "vpy"
If p.AutoRotation AndAlso (editAVS OrElse editVS) Then
Dim rot = MediaInfo.GetVideo(p.SourceFile, "Rotation").ToDouble
If rot <> 0 Then
Dim name = ""
Select Case rot
Case 90
name = "Right"
Case 180
name = "Upside Down"
Case 270
name = "Left"
Case Else
End Select
If name <> "" Then
Dim filter = VideoFilter.GetDefault("Rotation", name, p.Script.Engine)
If filter IsNot Nothing Then
p.Script.SetFilter(filter.Category, filter.Name, filter.Script)
End If
End If
End If
End If
Dim sourceFilter = p.Script.GetFilter("Source")
SetSourceFilter(sourceFilter, preferences, profiles, True, True, False, False)
SetSourceFilter(sourceFilter, preferences, profiles, False, True, True, False)
SetSourceFilter(sourceFilter, preferences, profiles, True, False, False, True)
SetSourceFilter(sourceFilter, preferences, profiles, False, False, False, False)
If editAVS Then
If Not sourceFilter.Script.Contains("(") Then
Dim filter = VideoFilter.GetDefault("Source", "FFVideoSource")
p.Script.SetFilter(filter.Category, filter.Name, filter.Script)
End If
ElseIf editVS Then
If Not sourceFilter.Script.Contains("(") Then
Dim filter = VideoFilter.GetDefault("Source", "ffms2", ScriptEngine.VapourSynth)
p.Script.SetFilter(filter.Category, filter.Name, filter.Script)
End If
End If
For Each iFilter In p.Script.Filters
If iFilter.Script.Contains("$") Then
iFilter.Script = Macro.ExpandGUI(iFilter.Script, True).Value
End If
Next
Dim errorMsg As String
Try
errorMsg = p.SourceScript.GetError
Catch ex As AbortException
errorMsg = ex.Message
timeout = -1
Catch ex As Exception
errorMsg = ex.Message
End Try
If errorMsg <> "" Then
Log.WriteHeader("Error opening source")
Log.WriteLine(errorMsg + BR2)
Log.WriteLine(p.SourceScript.GetFullScript)
Log.Save()
MsgError("Script Error", errorMsg, Handle, timeout)
Throw New AbortException
End If
If Not editAVS AndAlso Not editVS Then
Exit Sub
End If
Dim sourceInfo = p.SourceScript.Info
If p.FixFrameRate Then
Dim fixedFrameRate = FixFrameRate(sourceInfo.FrameRateNum, sourceInfo.FrameRateDen)
If fixedFrameRate.num <> sourceInfo.FrameRateNum OrElse fixedFrameRate.den <> sourceInfo.FrameRateDen Then
If editAVS Then
p.Script.GetFilter("Source").Script += BR + "AssumeFPS(" & fixedFrameRate.num & ", " & fixedFrameRate.den & ")"
Else
p.Script.GetFilter("Source").Script += BR + "clip = core.std.AssumeFPS(clip, None, " & fixedFrameRate.num & ", " & fixedFrameRate.den & ")"
End If
p.SourceScript.Synchronize()
End If
End If
If editAVS Then
Dim miFPS = MediaInfo.GetFrameRate(p.FirstOriginalSourceFile, 25)
Dim avsFPS = sourceInfo.FrameRate
If (CInt(miFPS) * 2) = CInt(avsFPS) Then
p.Script.GetFilter("Source").Script += BR + "SelectEven().AssumeFPS(" & miFPS.ToInvariantString + ")"
p.SourceScript.Synchronize()
End If
End If
Dim bitDepthAdjusted = False
If p.SourceChromaSubsampling <> "4:2:0" AndAlso p.ConvertChromaSubsampling Then
Dim interlaced = p.SourceScanType.EqualsAny("Interlaced", "MBAFF")
If editVS Then
Dim sourceHeight = MediaInfo.GetVideo(p.LastOriginalSourceFile, "Height").ToInt
Dim matrix = If(sourceHeight = 0 OrElse sourceHeight > 576, "709", "470bg")
Dim format = If(p.SourceVideoBitDepth = 10, "YUV420P10", "YUV420P8")
If p.ConvertToBits <> ConvertTo420BitDepth.None AndAlso p.ConvertToBits <> p.SourceVideoBitDepth Then
format = "YUV420P" & (p.ConvertToBits + 0)
bitDepthAdjusted = True
End If
Dim category = "Color"
Dim name = $"Convert To {format}"
Dim script = $"clip = clip.resize.Bicubic(format = vs.{format})"
If interlaced Then
p.Script.Filters.Add(New VideoFilter(category, name, script, True))
Else
p.Script.Filters.Insert(1, New VideoFilter(category, name, script, True))
End If
ElseIf editAVS Then
Dim category = "Color"
Dim name = $"ConvertToYUV420()"
Dim script = $"ConvertToYUV420()"
If interlaced Then
p.Script.Filters.Add(New VideoFilter(category, name, script, True))
Else
p.Script.Filters.Insert(1, New VideoFilter(category, name, script, True))
End If
End If
End If
If p.ConvertToBits <> ConvertTo420BitDepth.None AndAlso p.ConvertToBits <> p.SourceVideoBitDepth AndAlso Not bitDepthAdjusted Then
Dim bits = (p.ConvertToBits + 0)
Dim category = "BitDepth"
Dim name = $"Convert To {bits}-bit"
If editVS Then
Dim script = $"clip = core.fmtc.bitdepth(clip, bits={bits})"
p.Script.Filters.Add(New VideoFilter(category, name, script, True))
ElseIf editAVS Then
Dim script = $"ConvertBits({bits})"
p.Script.Filters.Add(New VideoFilter(category, name, script, True))
End If
End If
End Sub
Function FixFrameRate(num As Integer, den As Integer) As (num As Integer, den As Integer)
Dim rate = num / den
Return If(rate < 50 AndAlso rate > 49, (50, 1), (num, den))
End Function
Sub SetSourceFilter(
sourceFilter As VideoFilter,
preferences As StringPairList,
profiles As List(Of FilterCategory),
skipAnyExtension As Boolean,
skipAnyFormat As Boolean,
skipNonAnyExtension As Boolean,
skipNonAnyFormat As Boolean)
If Not sourceFilter.Script.Contains("(") Then
For Each pref In preferences
Dim extensions = pref.Name.SplitNoEmptyAndWhiteSpace({",", " ", ";"})
For Each extension In extensions
extension = extension.ToLowerInvariant
Dim format = "*"
If extension.Contains(":") Then
format = extension.Right(":").ToLowerInvariant
extension = extension.Left(":").ToLowerInvariant
End If
If skipAnyExtension AndAlso extension = "*" Then Continue For
If skipAnyFormat AndAlso format = "*" Then Continue For
If skipNonAnyExtension AndAlso extension <> "*" Then Continue For
If skipNonAnyFormat AndAlso format <> "*" Then Continue For
If (extension = p.SourceFile.Ext OrElse extension = "*") AndAlso
(format = "*" OrElse format = MediaInfo.GetVideo(p.SourceFile, "Format").ToLowerInvariant) Then
Dim filters = profiles.Where(
Function(cat) cat.Name = "Source").First.Filters.Where(
Function(cat) cat.Name = pref.Value)
If filters.Count > 0 Then
p.Script.SetFilter("Source", filters(0).Name, filters(0).Script)
Exit Sub
End If
End If
Next
Next
End If
End Sub
Sub AutoCrop()
g.CheckForModifiedDolbyVisionLevel5Data()
If p.AutoCropMode = AutoCropMode.DolbyVisionOnly OrElse p.AutoCropMode = AutoCropMode.Always Then
p.SourceScript.Synchronize(True, True, True)
Dim useDvOnly = p.HdrDolbyVisionMetadataFile IsNot Nothing AndAlso p.VideoEncoder.IsDolbyVisionSet AndAlso p.HdrDolbyVisionMetadataFile.Crop <> Padding.Empty
If useDvOnly Then
Dim c = p.HdrDolbyVisionMetadataFile.Crop
Dim sm = If(p.AutoCropDolbyVisionSideMode = AutoCropDolbyVisionSideMode.NoOverride, p.AutoCropSideMode, AutoCropSideMode.All)
If p.AutoCropDolbyVisionSideMode = AutoCropDolbyVisionSideMode.Horizontal Then sm = AutoCropSideMode.Horizontal
If p.AutoCropDolbyVisionSideMode = AutoCropDolbyVisionSideMode.Vertical Then sm = AutoCropSideMode.Vertical
g.SetCrop(c.Left, c.Top, c.Right, c.Bottom, sm, p.ForcedOutputModDirection, True)
ElseIf p.AutoCropMode <> AutoCropMode.Disabled Then
Dim info = p.SourceScript.Info
Dim selectionMode = Convert.ToInt32(p.AutoCropFrameSelectionMode)
Dim selectionValue = If(p.AutoCropFrameSelectionMode = AutoCropFrameSelectionMode.FrameInterval, p.AutoCropFrameIntervalFrameSelection, p.AutoCropFixedFramesFrameSelection)
selectionValue = If(p.AutoCropFrameSelectionMode = AutoCropFrameSelectionMode.TimeInterval, p.AutoCropTimeIntervalFrameSelection, selectionValue)
Dim considerationMode = Convert.ToInt32(p.AutoCropFrameRangeMode)
Dim considerationThresholdBegin = 0
Dim considerationThresholdEnd = 0
Dim luminanceThreshold = CInt(p.AutoCropLuminanceThreshold * 100)
Dim vfw = If(FrameServerHelp.IsVfwUsed, 1, 0)
If p.AutoCropFrameRangeMode = AutoCropFrameRangeMode.Automatic Then
Dim threshold = CInt(Conversion.Fix(info.FrameCount * 0.05))
considerationThresholdBegin = threshold
considerationThresholdEnd = threshold
ElseIf p.AutoCropFrameRangeMode = AutoCropFrameRangeMode.ManualThreshold Then
considerationThresholdBegin = p.AutoCropFrameRangeThresholdBegin
considerationThresholdEnd = p.AutoCropFrameRangeThresholdEnd
End If
Dim parameters = $"{selectionMode} {selectionValue} {considerationThresholdBegin} {considerationThresholdEnd} {luminanceThreshold.ToInvariantString()} {vfw}"
Dim savingFilePath = Path.Combine(p.TempDir, "autocrop.tmp")
Dim fileLines = If(savingFilePath.FileExists(), File.ReadAllLines(savingFilePath), {""})
Dim fileParameters = If(fileLines.Length > 0, fileLines(0), "")
Dim values = If(fileLines.Length > 1, fileLines(1), "")
Dim valuesPattern = "(\d+),(\d+),(\d+),(\d+)"
Dim redo = Not (Regex.IsMatch(values, valuesPattern) AndAlso parameters.Equals(fileParameters))
If redo Then
Try
g.AddToPath(
Package.Python.Directory,
Package.VapourSynth.Directory,
Package.vspipe.Directory,
Package.AviSynth.Directory,
Package.FFTW.Directory,
Path.Combine(Folder.Startup, "Apps", "Support", "VC"))
Using proc As New Proc
proc.Header = "Auto Crop"
proc.SkipString = "%"
proc.Package = Package.AutoCrop
proc.Arguments = $"{p.SourceScript.Path.Escape} {parameters}"
proc.Start()
Dim m = Regex.Match(proc.Log.ToString(), valuesPattern)
If m.Success Then
Try
values = m.Value
Dim content = parameters & Environment.NewLine & values
content.WriteFileUTF8(savingFilePath)
Catch ex As Exception
End Try
End If
End Using
Catch ex As SkipException
Log.WriteLine("AutoCrop skipped...")
Log.Save()
ProcController.Aborted = False
Catch ex As AbortException
Log.WriteLine("AutoCrop aborted...")
Log.Save()
ProcController.Aborted = False
Catch ex As ErrorAbortException
Log.WriteLine("AutoCrop aborted...")
Log.Save()
ProcController.Aborted = False
Catch ex As Exception
Throw ex
End Try
End If
Dim match = Regex.Match(values, valuesPattern)
If match.Success Then
g.SetCrop(match.Groups(1).Value.ToInt, match.Groups(2).Value.ToInt, match.Groups(3).Value.ToInt, match.Groups(4).Value.ToInt, p.AutoCropSideMode, p.ForcedOutputModDirection, False)
End If
End If
SetCropFilter()
DisableCropFilter()
End If
End Sub
Sub AutoResize()
If p.Script.IsFilterActive("Resize") Then
If p.AutoResizeImage <> 0 Then
SetTargetImageSizeByPixel(p.AutoResizeImage)
Else
If p.AdjustHeight Then
Dim h = Calc.FixMod(CInt(p.TargetWidth / Calc.GetTargetDAR()), p.ForcedOutputMod)
tbTargetHeight.Text = h.ToString()
End If
End If
Else
Dim cropw = p.SourceWidth - p.CropLeft - p.CropRight
tbTargetWidth.Text = cropw.ToString
tbTargetHeight.Text = (p.SourceHeight - p.CropTop - p.CropBottom).ToString
End If
End Sub
Sub ConvertBluRaySubtitles()
If Not p.ConvertSup2Sub Then Exit Sub
For Each i In g.GetFilesInTempDirAndParent
If i.Ext = "sup" AndAlso g.IsSourceSameOrSimilar(i) AndAlso Not File.Exists(i.DirAndBase + ".idx") Then
Using proc As New Proc
proc.Header = "Convert sup to sub"
proc.SkipStrings = {"#>", "#<", "Decoding frame"}
proc.File = Package.BDSup2SubPP.Path
proc.Arguments = "-o """ + i.DirAndBase + ".idx"" " + i.Escape
proc.Start()
End Using
End If
Next
End Sub
Sub ExtractForcedVobSubSubtitles()
If Not p.ExtractForcedSubSubtitles Then Exit Sub
For Each path In g.GetFilesInTempDirAndParent
If path.ExtFull = ".idx" AndAlso g.IsSourceSameOrSimilar(path) AndAlso
Not path.Contains("_forced") AndAlso
Not File.Exists(path.DirAndBase + "_forced.idx") Then
Dim idxContent = path.ReadAllTextDefault
If idxContent.Contains(VB6.ChrW(&HA) + VB6.ChrW(&H0) + VB6.ChrW(&HD) + VB6.ChrW(&HA)) Then
idxContent = idxContent.FixBreak
idxContent = idxContent.Replace(BR + VB6.ChrW(&H0) + BR, BR + "langidx: 0" + BR)
idxContent.WriteFileSystemEncoding(path)
End If
Using proc As New Proc
proc.Header = "Extract forced subtitles if existing"
proc.SkipString = "# "
proc.WriteLog(path.FileName + BR2)
proc.File = Package.BDSup2SubPP.Path
proc.Arguments = "--forced-only -o " + (path.DirAndBase + "_forced.idx").Escape + " " + path.Escape
proc.AllowedExitCodes = {0, 1, 4}
proc.Start()
End Using
End If
Next
End Sub
Sub DemuxVobSubSubtitles()
If p.SubtitleMode = SubtitleMode.Disabled Then Exit Sub
If Not {"vob", "m2v"}.Contains(p.LastOriginalSourceFile.Ext) Then Exit Sub
Dim ifoPath = GetIfoFile()
If ifoPath = "" Then Exit Sub
If File.Exists(Path.Combine(p.TempDir, p.SourceFile.Base + ".idx")) Then Exit Sub
Dim subtitleCount = MediaInfo.GetSubtitleCount(ifoPath)
If subtitleCount > 0 Then
Dim pgcCount As Byte
Dim sectorPointer As Integer
Dim buffer = File.ReadAllBytes(ifoPath)
sectorPointer = (((buffer(&HCC) * &H1000000) + (buffer(&HCD) * &H10000)) + (buffer(&HCE) * &H100)) + (buffer(&HCF) * 1)
pgcCount = CByte((buffer(sectorPointer * &H800) * &H100) + buffer((sectorPointer * &H800) + 1))
If pgcCount <> 0 Then
For i = 0 To pgcCount - 1
Dim a = ((sectorPointer * &H800) + (i * 8)) + 12
Dim b = (((buffer(a + 0) * &H1000000) + (buffer(a + 1) * &H10000)) + (buffer(a + 2) * &H100)) + (buffer(a + 3) * 1) + sectorPointer * &H800
Dim hour, min, sec As Integer
hour = CByte((((buffer(b + 4) And 240) >> 4) * 10) + (buffer(b + 4) And 15))
min = CByte((((buffer(b + 5) And 240) >> 4) * 10) + (buffer(b + 5) And 15))
sec = CByte((((buffer(b + 6) And 240) >> 4) * 10) + (buffer(b + 6) And 15))
If Math.Abs(p.SourceSeconds - ((hour * 60 ^ 2) + (min * 60) + sec)) < 30 Then
Dim args =
ifoPath + BR +
Path.Combine(p.TempDir, p.SourceFile.Base) + BR &
(i + 1) & BR +
"1" + BR +
"ALL" + BR +
"CLOSE"
Dim fileContent = Path.Combine(p.TempDir, p.TargetFile.Base + "_vsrip.txt")
args.WriteFileSystemEncoding(fileContent)
Using proc As New Proc
proc.Header = "Demux subtitles using VSRip"
proc.WriteLog(args + BR2)
proc.File = Package.VSRip.Path
proc.Arguments = """" + fileContent + """"
proc.AllowedExitCodes = {0, 1, 2}
proc.Start()
End Using
Exit For
End If
Next
End If
End If
End Sub
Function ProcessTip(message As String) As Boolean
If message.Contains(BR2) Then
message = message.Replace(BR2, BR)
End If
If message.Contains(VB6.vbLf + VB6.vbLf) Then
message = message.FixBreak.Replace(BR2, BR)
End If
CurrentAssistantTipKey = message.MD5Hash
If Not p.SkippedAssistantTips.Contains(CurrentAssistantTipKey) Then
If message <> "" Then
If message.Length > 130 Then
laTip.SetFontSize(8)
Else
laTip.SetFontSize(9)
End If
End If
laTip.Text = message
Return True
End If
End Function
Function RemoveTip(message As String) As Boolean
If message.Contains(BR2) Then
message = message.Replace(BR2, BR)
End If
If message.Contains(VB6.vbLf + VB6.vbLf) Then
message = message.FixBreak.Replace(BR2, BR)
End If
Return p.SkippedAssistantTips.Remove(message.MD5Hash)
End Function
Function Warn(msg As String, ParamArray controls As Control()) As Boolean
Warn(msg, Nothing, controls)
End Function
Function Warn(msg As String, clickAction As Action, ParamArray controls As Control()) As Boolean
AssistantClickAction = clickAction
bnNext.Enabled = True
If msg <> gbAssistant.Text Then
gbAssistant.Text = msg
End If
Highlight(True, controls)
UpdateNextButton()
End Function
Function Block(msg As String, ParamArray controls As Control()) As Boolean
Block(msg, Nothing, controls)
End Function
Function Block(msg As String, clickAction As Action, ParamArray controls As Control()) As Boolean
AssistantClickAction = clickAction
gbAssistant.Text = msg
bnNext.Enabled = False
CanIgnoreTip = False
ThemeRefresh = True
Highlight(True, controls)
UpdateNextButton()
End Function
Sub Highlight(ParamArray controls As Control())
Highlight(False, controls)
End Sub
Sub Highlight(highlight As Boolean, ParamArray controls As Control())
Dim theme = ThemeManager.CurrentTheme
If highlight Then
laTip.BackColor = theme.MainForm.laTipBackHighlightColor
laTip.ForeColor = theme.MainForm.laTipForeHighlightColor
Else
laTip.BackColor = theme.MainForm.laTipBackColor
laTip.ForeColor = theme.MainForm.laTipForeColor
End If
If controls Is Nothing Then Return
If Not controls.NothingOrEmpty Then ThemeRefresh = True
For Each control In controls.OfType(Of Label)
control.BackColor = theme.General.Controls.Label.BackHighlightColor
control.ForeColor = theme.General.Controls.Label.ForeHighlightColor
Next
For Each control In controls.OfType(Of ButtonLabel)
control.BackColor = If(TypeOf control.Parent Is UserControl, theme.General.Controls.ListView.BackHighlightColor, theme.General.Controls.ButtonLabel.BackHighlightColor)
control.ForeColor = theme.General.Controls.ButtonLabel.ForeHighlightColor
control.LinkColor = theme.General.Controls.ButtonLabel.ForeHighlightColor
control.LinkHoverColor = theme.General.Controls.ButtonLabel.ForeHighlightColor
Next
For Each control In controls.OfType(Of Button)
control.BackColor = theme.General.Controls.Button.BackHighlightColor
control.ForeColor = theme.General.Controls.Button.ForeHighlightColor
Next
For Each control In controls.OfType(Of GroupBox)
control.BackColor = theme.General.Controls.GroupBox.BackHighlightColor
control.ForeColor = theme.General.Controls.GroupBox.ForeHighlightColor
Next
For Each control In controls.OfType(Of Panel)
control.BackColor = theme.General.Controls.Panel.BackHighlightColor
control.ForeColor = theme.General.Controls.Panel.ForeHighlightColor
Next
For Each control In controls.OfType(Of TableLayoutPanel)
control.BackColor = theme.General.Controls.TableLayoutPanel.BackHighlightColor
control.ForeColor = theme.General.Controls.TableLayoutPanel.ForeHighlightColor
Next
For Each control In controls.OfType(Of TextBox)
control.BackColor = theme.General.Controls.TextBox.BackHighlightColor
control.ForeColor = theme.General.Controls.TextBox.ForeHighlightColor
Next
For Each control In controls.OfType(Of TextBoxEx)
control.BorderColor = theme.General.Controls.TextBox.BackHighlightColor
control.BorderFocusedColor = theme.General.Controls.TextBox.ForeHighlightColor
Next
For Each control In controls.OfType(Of TextEdit)
control.TextBox.BackColor = theme.General.Controls.TextEdit.BackHighlightColor
control.TextBox.ForeColor = theme.General.Controls.TextEdit.ForeHighlightColor
Next
For Each control In controls.OfType(Of TrackBar)
control.BackColor = theme.General.Controls.TrackBar.BackHighlightColor
control.ForeColor = theme.General.Controls.TrackBar.ForeHighlightColor
Next
End Sub
Sub OpenTargetFolder()
g.ShellExecute(p.TargetFile.Dir)
End Sub
Function AbortDueToLowDiskSpace() As Boolean
Try 'crashes with network shares
If p.TargetFile = "" OrElse p.TargetFile.StartsWith("\\") Then
Exit Function
End If
Dim di As New DriveInfo(p.TargetFile.Dir)
If di.AvailableFreeSpace / PrefixedSize(3).Factor < s.MinimumDiskSpace Then
Using td As New TaskDialog(Of String)
td.Title = "Low Disk Space"
td.Content = $"The target drive {Path.GetPathRoot(p.TargetFile)} has only " +
$"{(di.AvailableFreeSpace / PrefixedSize(3).Factor):f2} {PrefixedSize(3).Unit} free disk space."
td.Icon = TaskIcon.Warning
td.AddButton("Continue")
td.AddButton("Abort")
If td.Show <> "Continue" Then
Return True
End If
End Using
End If
Catch
End Try
End Function
<Command("Creates a job and runs the job list.")>
Sub StartEncoding()
AssistantPassed = True
AddJob(False, "")
g.ProcessJobs()
End Sub
<Command("Extract dynamic HDR metadata from a source file.")>
Sub ExtractHdrMetadata(sourcePath As String)
Dim proj = New Project() With {
.SourceFile = sourcePath,
.FirstOriginalSourceFile = sourcePath
}
ExtractHdrMetadata(proj)
End Sub
Sub ExtractHdrMetadata(proj As Project)
ExtractHdr10PlusMetadata(proj)
ExtractDolbyVisionMetadata(proj)
End Sub
Sub ExtractHdr10PlusMetadata(proj As Project)
If proj Is Nothing Then Return
If String.IsNullOrWhiteSpace(proj.SourceFile) Then Return
If Not File.Exists(proj.SourceFile) Then Return
Dim sourcePaths = {proj.SourceFile, proj.FirstOriginalSourceFile, proj.LastOriginalSourceFile}
For Each sourcePath As String In sourcePaths
Dim mi = New MediaInfo(sourcePath)
If Not mi.GetVideo("HDR_Format_Commercial")?.ContainsAny("HDR10+") Then Continue For
If mi.GetVideo("Format") <> "HEVC" Then Continue For
Dim jsonPath = sourcePath.ChangeExt("json")
If Not String.IsNullOrWhiteSpace(proj.TempDir) Then
jsonPath = If(sourcePath.Contains(proj.TempDir) AndAlso Not proj.TempDir.EndsWithEx("_temp"), jsonPath, If(proj.TempDir.DirExists(), $"{Path.Combine({proj.TempDir, "HDR10PlusMetadata.json"})}", jsonPath))
End If
If Not jsonPath.FileExists() Then
Dim commandLine = $"{Package.ffmpeg.Path.Escape} -hide_banner -probesize 50M -i ""{sourcePath}"" -an -sn -dn -c:v copy -bsf:v hevc_mp4toannexb -f hevc - | {Package.HDR10PlusTool.Path.Escape} extract -o ""{jsonPath}"" -"
Try
Using proc As New Proc
proc.Priority = s.ToolProcessPriority
proc.Package = Package.HDR10PlusTool
proc.Project = If(proj, p)
proc.Header = "Extract HDR10+ metadata"
proc.Encoding = Encoding.UTF8
proc.File = "cmd.exe"
proc.Arguments = "/S /C """ + commandLine + """"
proc.SkipStrings = Proc.GetSkipStrings(commandLine)
proc.AllowedExitCodes = {0}
proc.OutputFiles = {jsonPath}
proc.Start()
End Using
If jsonPath?.FileExists() Then
Try
Dim fi = New FileInfo(jsonPath)
If fi.Length < 100 Then
File.Delete(jsonPath)
End If
Catch ex As Exception
jsonPath = ""
End Try
End If
Catch ex As AbortException
Throw ex
Catch ex As Exception
g.ShowException(ex)
Throw New AbortException
Finally
Log.Save()
End Try
End If
If jsonPath.FileExists() Then
proj.Hdr10PlusMetadataFile = jsonPath
Exit For
End If
Next
End Sub
Sub ExtractDolbyVisionMetadata(proj As Project)
If proj Is Nothing Then Return
If String.IsNullOrWhiteSpace(proj.SourceFile) Then Return
If Not File.Exists(proj.SourceFile) Then Return
Dim sourcePaths = {proj.SourceFile, proj.FirstOriginalSourceFile, proj.LastOriginalSourceFile}
For Each sourcePath As String In sourcePaths
Dim isEL = False
Dim files = Directory.GetFiles(sourcePath.Dir, sourcePath.Base + "*_EL*.*", SearchOption.TopDirectoryOnly).AsEnumerable()
files = files?.Where(Function(x) {"h265", "hevc"}.Contains(x.Ext))
If files?.Any() Then
sourcePath = files.First()
isEL = True
End If
Dim format = MediaInfo.GetVideoFormat(sourcePath)
If format <> "HEVC" Then Continue For
Dim fileHdrFormat = MediaInfo.GetVideo(sourcePath, "HDR_Format/String")
If isEL OrElse (Regex.IsMatch(fileHdrFormat, "Dolby Vision.*Profile|HDR10+ Profile B")) Then
Dim rpuPath = sourcePath.ChangeExt("rpu")
Dim doviFile = proj.HdrDolbyVisionMetadataFile
If Not String.IsNullOrWhiteSpace(proj.TempDir) Then
rpuPath = If(sourcePath.Contains(proj.TempDir), rpuPath, If(proj.TempDir.DirExists(), $"{Path.Combine({proj.TempDir, "HDRDVmetadata.rpu"})}", rpuPath))
End If
Try
If Not rpuPath.FileExists() Then
Dim commandLine = $"{Package.ffmpeg.Path.Escape} -hide_banner -probesize 50M -i ""{sourcePath}"" -an -sn -dn -c:v copy -bsf:v hevc_mp4toannexb -f hevc - | {Package.DoViTool.Path.Escape} extract-rpu - -o ""{rpuPath}"""
Dim throwError As (Title As String, Content As String)
Using proc As New Proc
Dim throwIf = Sub(value As String)
If value?.Contains("Unexpected RPU NALU") Then
throwError = ("Unexpected RPU NALU", "Unexpected RPU NALU found, extraction aborts...")
proc.Kill()
End If
If value?.Contains("Discarding") Then
throwError = ("Discarding", "Dovi_tool is discarding data, extraction aborts...")
proc.Kill()
End If
End Sub
proc.Priority = s.ToolProcessPriority
proc.Package = Package.DoViTool
proc.Project = If(proj, p)
proc.Header = "Extract Dolby Vision metadata"
proc.Encoding = Encoding.UTF8
proc.File = "cmd.exe"
proc.Arguments = "/S /C """ + commandLine + """"
proc.SkipStrings = Proc.GetSkipStrings(commandLine)
proc.AllowedExitCodes = {0}
proc.OutputFiles = {rpuPath}
proc.ReadOutput = True
AddHandler proc.OutputDataReceived, throwIf
AddHandler proc.ErrorDataReceived, throwIf
proc.Start()
End Using
If throwError.Title IsNot Nothing AndAlso throwError.Content IsNot Nothing Then Throw New ErrorAbortException(throwError.Title, throwError.Content)
If rpuPath?.FileExists() Then
Try
Dim fi = New FileInfo(rpuPath)
If fi.Length > 100 Then
doviFile = New DolbyVisionMetadataFile(rpuPath)
Else
File.Delete(rpuPath)
End If
Catch ex As Exception
doviFile = New DolbyVisionMetadataFile(rpuPath)
End Try
End If
End If
Catch ex As ErrorAbortException
g.ShowException(ex, Nothing, Nothing, s.ErrorMessageTimeout)
doviFile = Nothing
Catch ex As AbortException
g.ShowException(ex)
doviFile = Nothing
Throw ex
Catch ex As Exception
g.ShowException(ex)
doviFile = Nothing
Throw New AbortException
Finally
Log.Save()
End Try
proj.HdrDolbyVisionMetadataFile = doviFile
Exit For
End If
Next
End Sub
Async Function FindHdrMetadataAsync(proj As Project) As Task(Of (jsonFile As String, rpuFile As String))
If proj Is Nothing Then Return Nothing
If String.IsNullOrWhiteSpace(proj.SourceFile) Then Return Nothing
Dim sourcePath = proj.SourceFile
Dim jsonFile = ""
Dim rpuFile = ""
Dim files As IEnumerable(Of String)
Dim searchTask = Task.Run(Sub()
Try
files = Directory.GetFiles(sourcePath.Dir(), $"{sourcePath.Base}*.*", SearchOption.TopDirectoryOnly)
jsonFile = files.FirstOrDefault(Function(x) {"json"}.Contains(x.Ext) AndAlso Not x.Base.EndsWithAny("_L5", "_Config"))
rpuFile = files.FirstOrDefault(Function(x) {"bin", "rpu"}.Contains(x.Ext) AndAlso Not x.Base.EndsWith("_Cropped"))
If Not String.IsNullOrWhiteSpace(proj.TempDir) AndAlso String.IsNullOrWhiteSpace(jsonFile) AndAlso String.IsNullOrWhiteSpace(rpuFile) Then
files = Directory.GetFiles(proj.TempDir, "*.*", SearchOption.TopDirectoryOnly)
jsonFile = If(String.IsNullOrWhiteSpace(jsonFile), files.FirstOrDefault(Function(x) {"json"}.Contains(x.Ext) AndAlso Not x.Base.EndsWithAny("_L5", "_Config")), jsonFile)
rpuFile = If(String.IsNullOrWhiteSpace(rpuFile), files.FirstOrDefault(Function(x) {"bin", "rpu"}.Contains(x.Ext) AndAlso Not x.Base.EndsWith("_Cropped")), rpuFile)
End If
Catch ex As Exception
Log.WriteLine(ex.Message)
Log.Save()
End Try
End Sub)
Await searchTask
Return (jsonFile, rpuFile)
End Function
Sub Demux()
Dim getFormat = Function() As String
Dim ret = MediaInfo.GetVideo(p.SourceFile, "Format")
Select Case ret
Case "MPEG Video"
ret = "mpeg2"
Case "VC-1"
ret = "vc1"
End Select
Return ret.ToLowerInvariant
End Function
Dim srcScript = p.Script.GetFilter("Source").Script.ToLowerInvariant
For Each i In s.Demuxers
If Not i.Active AndAlso (i.SourceFilters.NothingOrEmpty OrElse Not srcScript.ContainsAny(i.SourceFilters.Select(Function(val) val.ToLowerInvariant + "(").ToArray)) Then
Continue For
End If
If i.InputExtensions?.Length = 0 OrElse i.InputExtensions.Contains(p.SourceFile.Ext) Then
If Not srcScript?.Contains("(") OrElse i.SourceFilters.NothingOrEmpty OrElse
srcScript.ContainsAny(i.SourceFilters.Select(Function(val) val.ToLowerInvariant + "(").ToArray) Then
Dim inputFormats = i.InputFormats.NothingOrEmpty OrElse
i.InputFormats.Contains(getFormat())
If inputFormats Then
i.Run(p)
Refresh()
For Each outExt In i.OutputExtensions
Dim exitFor = False
For Each iFile In Directory.GetFiles(p.TempDir, "*." + outExt)
If g.IsSourceSame(iFile) AndAlso
p.SourceFile <> iFile AndAlso
Not iFile.Base.EndsWith("_CompCheck") AndAlso
Not iFile.Base.EndsWith("_out") AndAlso
Not iFile.Base.Matches("_chunk\d+$") AndAlso
Not iFile.Base.ContainsEx("_cut_") Then
p.SourceFile = iFile
p.SourceFiles.Clear()
p.SourceFiles.Add(p.SourceFile)
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
exitFor = True
Exit For
End If
Next
If exitFor Then
Exit For
End If
Next
End If
End If
End If
Next
p.Script.Synchronize()
End Sub
Sub Indexing()
If p.SourceFile.Ext.EqualsAny("avs", "vpy") Then Exit Sub
If Not p.Script.Path.FileExists Then p.Script.Synchronize(False, False)
Dim codeLower = p.Script.GetFilter("Source").Script.ToLowerInvariant
If codeLower.Contains("ffvideosource(") OrElse codeLower.Contains("ffms2(") OrElse codeLower.Contains("ffms2.source") Then
If FileTypes.VideoIndex.Contains(p.SourceFile.Ext) Then
p.SourceFile = p.LastOriginalSourceFile
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
End If
Dim cachePath = If(codeLower.Contains("cachefile") AndAlso p.TempDir <> "", Path.Combine(p.TempDir, g.GetSourceBase + ".ffindex"), p.SourceFile + ".ffindex")
If Not cachePath.FileExists() Then
g.ffmsindex(p.SourceFile, cachePath)
End If
ElseIf codeLower.Contains("lwlibavvideosource(") OrElse codeLower.Contains("lwlibavsource(") Then
If FileTypes.VideoIndex.Contains(p.SourceFile.Ext) Then
p.SourceFile = p.LastOriginalSourceFile
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
End If
If Not File.Exists(p.SourceFile + ".lwi") AndAlso
Not File.Exists(Path.Combine(p.TempDir, g.GetSourceBase + ".lwi")) AndAlso
File.Exists(p.Script.Path) AndAlso Not FileTypes.VideoText.Contains(p.SourceFile.Ext) Then
Using proc As New Proc
proc.Header = "Index LWLibav"
proc.Encoding = Encoding.UTF8
proc.SkipString = "Creating lwi"
If p.Script.IsAviSynth Then
proc.File = Package.ffmpeg.Path
proc.Arguments = "-i " + p.Script.Path.LongPathPrefix.Escape + " -hide_banner"
Else
proc.File = Package.vspipe.Path
proc.Arguments = p.Script.Path.Escape + " NUL -i"
End If
proc.AllowedExitCodes = {0, 1}
proc.Start()
End Using
End If
ElseIf codeLower.Contains("bsvideosource(") OrElse codeLower.Contains("bs.videosource(") Then
If FileTypes.VideoIndex.Contains(p.SourceFile.Ext) Then
p.SourceFile = p.LastOriginalSourceFile
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
End If
Dim cacheBase = If(codeLower.Contains("cachepath") AndAlso p.TempDir <> "", Path.Combine(p.TempDir, g.GetSourceBase), p.SourceFile)
Dim cachePath = cacheBase + ".0.bsindex"
If Not cachePath.FileExists() Then
Using proc As New Proc
proc.Header = "Index BestSource"
proc.Encoding = Encoding.UTF8
proc.SkipStrings = {"Creating bsindex"}
If p.Script.IsAviSynth Then
proc.File = Package.ffmpeg.Path
proc.Arguments = "-i " + p.Script.Path.LongPathPrefix.Escape + " -hide_banner"
Else
proc.File = Package.vspipe.Path
proc.Arguments = p.Script.Path.Escape + " NUL -i"
End If
proc.AllowedExitCodes = {0, 1}
proc.Start()
End Using
End If
ElseIf codeLower.Contains("lsmashvideosource(") OrElse
codeLower.Contains("libavsmashsource(") OrElse
codeLower.Contains("directshowsource(") OrElse
codeLower.Contains("dss2(") Then
If FileTypes.VideoIndex.Contains(p.SourceFile.Ext) Then
p.SourceFile = p.LastOriginalSourceFile
BlockSourceTextBoxTextChanged = True
tbSourceFile.Text = p.SourceFile
BlockSourceTextBoxTextChanged = False
End If
End If
End Sub
<Command("Shows a file browser to open a project file.")>
Sub ShowFileBrowserToOpenProject()
Using dialog As New OpenFileDialog
dialog.Filter = "Project Files|*.srip"
If dialog.ShowDialog() = DialogResult.OK Then
Refresh()
OpenProject(dialog.FileName)
End If
End Using
End Sub
<Command("Shows the Event Command dialog.")>
Sub ShowEventCommandsDialog()
Using form As New EventCommandsEditor(s.EventCommands)
If form.ShowDialog() = DialogResult.OK Then
s.EventCommands.Clear()
For Each i As ListViewItem In form.lv.Items
s.EventCommands.Add(DirectCast(i.Tag, EventCommand))
Next
g.SaveSettings()
g.SaveEvents()
End If
End Using
End Sub
<Command("Saves the current project.")>
Sub SaveProject()
If g.ProjectPath Is Nothing Then
OpenSaveProjectDialog()
Else
SaveProjectPath(g.ProjectPath)
End If
End Sub
<Command("Saves the current project at the specified path.")>
Sub SaveProjectPath(<Description("The path may contain macros."),
Editor(GetType(MacroStringTypeEditor), GetType(UITypeEditor))> path As String)
path = Macro.Expand(path)
If path.StartsWith(Folder.Template) Then
If p.SourceFile <> "" Then
MsgWarn("A template cannot be created after a source file was opened.")
Exit Sub
End If
p.Log.Clear()
p.TemplateName = path.Base()
p.TemplatePath = path
Else
g.ProjectPath = path
End If
Try
SafeSerialization.Serialize(p, path)
SetSavedProject()
Text = $"{path.Base} - {g.DefaultCommands.GetApplicationDetails()}"
s.UpdateRecentProjects(path)
UpdateRecentProjectsMenu()
Catch ex As Exception
g.ShowException(ex)
End Try
End Sub
<Command("Saves the current project.")>
Sub SaveProjectAs()
OpenSaveProjectDialog()
End Sub
<Command("Saves the current project as template.")>
Sub SaveProjectAsTemplate()
OpenSaveTemplateDialog()
End Sub
<Command("Closes the current project.")>
Sub CloseProject()
OpenProject(g.StartupTemplatePath)
End Sub
<Command("Starts the compressibility check.")>
Sub StartCompCheck()
p.VideoEncoder.RunCompCheck()
End Sub
<Command("Launches a new instance of StaxRip.")>
Sub StartNewInstance()
Using p As New Process()
p.StartInfo.FileName = Application.ExecutablePath
p.Start()
End Using
End Sub
<Command("Exits StaxRip.")>
Sub [Exit]()
Close()
End Sub
<Command("Exits StaxRip without saving an unsaved project.")>
Sub ExitWithoutSaving()
s.ApplicationExitMode = ApplicationExitMode.BypassProjectSaving
Close()
End Sub
<Command("Dialog to manage external tools.")>
Sub ShowAppsDialog()
Using form As New AppsForm
Dim found As Boolean
If s.StringDictionary.ContainsKey("RecentExternalApplicationControl") Then
For Each pack In Package.Items.Values
If pack.Name + pack.Version = s.StringDictionary("RecentExternalApplicationControl") Then
form.ShowPackage(pack)
found = True
Exit For
End If
Next
End If
If Not found Then
form.ShowPackage(Package.x265)
End If
form.ShowDialog()
g.SaveSettings()
End Using
End Sub
<Command("Shows a dialog to manage video encoder profiles.")>
Sub ShowEncoderProfilesDialog()
g.LoadVideoEncoderProfiles()
Using form As New ProfilesForm("Encoder Profiles", s.VideoEncoderProfiles, AddressOf g.LoadVideoEncoder, AddressOf GetNewVideoEncoderProfile, AddressOf VideoEncoder.GetDefaults)
If form.ShowDialog() = DialogResult.OK Then
g.SaveVideoEncoderProfiles()
End If
End Using
PopulateProfileMenu(DynamicMenuItemID.EncoderProfiles)
End Sub
<Command("Dialog to manage Muxer profiles.")>
Sub ShowMuxerProfilesDialog()
If p.VideoEncoder.OpenMuxerProfilesDialog() = DialogResult.OK Then
PopulateProfileMenu(DynamicMenuItemID.MuxerProfiles)
End If
Assistant()
End Sub
Sub RecalcBitrate()
UpdateSizeOrBitrate()
End Sub
Function GetNewVideoEncoderProfile() As Profile
Dim sb As New SelectionBox(Of VideoEncoder) With {
.Title = "Add New Profile",
.Text = "Please select a profile from the defaults."
}
sb.AddItem("Current Project", p.VideoEncoder)
For Each i In VideoEncoder.GetDefaults()
sb.AddItem(i)
Next
If sb.Show = DialogResult.OK Then
Return sb.SelectedValue
End If
End Function
Sub PopulateProfileMenu(id As DynamicMenuItemID)
For Each i In CustomMainMenu.MenuItems
If i.CustomMenuItem.MethodName = "DynamicMenuItem" AndAlso i.CustomMenuItem.Parameters(0).Equals(id) Then
i.DropDownItems.ClearAndDisplose
Select Case id
Case DynamicMenuItemID.EncoderProfiles
g.PopulateProfileMenu(i.DropDownItems, s.VideoEncoderProfiles, AddressOf ShowEncoderProfilesDialog, AddressOf g.LoadVideoEncoder)
Case DynamicMenuItemID.MuxerProfiles
g.PopulateProfileMenu(i.DropDownItems, s.MuxerProfiles, AddressOf ShowMuxerProfilesDialog, AddressOf p.VideoEncoder.LoadMuxer)
Case DynamicMenuItemID.AudioProfiles
For j = 0 To p.AudioTracks.Count - 1
Dim index = j
g.PopulateProfileMenu(i.DropDownItems, s.AudioProfiles, Sub() ShowAudioProfilesDialog(index), Sub(profile) g.LoadAudioProfile(profile, index))
Next
Case DynamicMenuItemID.FilterSetupProfiles
g.PopulateProfileMenu(i.DropDownItems, s.FilterSetupProfiles, AddressOf ShowFilterSetupProfilesDialog, AddressOf LoadFilterSetup)
End Select
Exit For
End If
Next
End Sub
<Command("Shows the crop dialog to crop borders.")>
Sub ShowCropDialog()
If p.SourceFile = "" Then
ShowOpenSourceDialog()
Else
If Not g.VerifyRequirements OrElse Not g.IsValidSource Then
Exit Sub
End If
Using form As New CropForm
form.ShowDialog()
End Using
SetCropFilter()
DisableCropFilter()
Assistant()
End If
End Sub
'<Command("Applies the current filter state.")>
Sub ApplyFilters(Optional filters As List(Of VideoFilter) = Nothing)
If PreviewScript Is Nothing Then Exit Sub
PreviewScript.Filters = If(filters, p.Script.Filters)
End Sub
<Command("Dialog to preview or cut the video.")>
Sub ShowPreviewDialog()
ShowPreview(True)
End Sub
<Command("Window to preview or cut the video.")>
Sub ShowPreview()
ShowPreview(False)
End Sub
Sub ShowPreview(modal As Boolean)
If p.SourceFile = "" Then
ShowOpenSourceDialog()
Else
If Not g.VerifyRequirements OrElse Not g.IsValidSource Then Exit Sub
If PreviewScript Is Nothing Then
PreviewScript = p.Script.GetNewScript()
If PreviewScript Is Nothing Then
Exit Sub
End If
PreviewScript.Path = Path.Combine(p.TempDir, p.TargetFile.Base + "_view." + PreviewScript.FileType)
PreviewScript.RemoveFilter("Cutting")
Else
ApplyFilters()
End If
PreviewScript.RemoveFilter("Cutting")
Dim err = PreviewScript.GetError()
If err <> "" Then
MsgError("Script Error", err)
Exit Sub
End If
If modal Then
Using form As New PreviewForm(PreviewScript)
form.ShowDialog()
End Using
Else
Dim form As New PreviewForm(PreviewScript)
form.Show()
End If
End If
End Sub
<Command("Dialog to configure the main menu.")>
Sub ShowMainMenuEditor()
s.CustomMenuMainForm = CustomMainMenu.Edit()
UpdateTemplatesMenuAsync()
UpdateScriptsMenuAsync()
UpdateRecentProjectsMenu()
UpdateDynamicMenuAsync()
g.SetRenderer(MenuStrip)
Refresh()
g.SaveSettings()
End Sub
<Command("Dialog to manage batch jobs.")>
Sub ShowJobsDialog()
JobsForm.ShowForm()
End Sub
<Command("Clears the job list.")>
Sub ClearJobs()
FileHelp.Delete(Path.Combine(Folder.Settings, "Jobs.dat"))
End Sub
<Command("Loads an audio or video profile.")>
Sub LoadProfile(<DispName("Video")> videoProfile As String,
<DispName("Audio 1")> audioProfile1 As String,
<DispName("Audio 2")> audioProfile2 As String)
videoProfile = videoProfile.TrimQuotes().Trim()
audioProfile1 = audioProfile1.TrimQuotes().Trim()
audioProfile2 = audioProfile2.TrimQuotes().Trim()
If videoProfile <> "" Then
For Each i In s.VideoEncoderProfiles
If i.Name = videoProfile Then
g.LoadVideoEncoder(i)
End If
Next
End If
If audioProfile1 <> "" Then
For Each i In s.AudioProfiles
If i.Name = audioProfile1 Then
g.LoadAudioProfile(i, 0)
End If
Next
End If
If audioProfile2 <> "" Then
For Each i In s.AudioProfiles
If i.Name = audioProfile2 Then
g.LoadAudioProfile(i, 1)
End If
Next
End If
End Sub
Sub AddJob(Optional showJobsDialog As Boolean = True, Optional position As Integer = -1)
If Not CanIgnoreTip Then
MsgWarn("Assistant warning cannot be skipped.")
Exit Sub
End If
If Not p.SkippedAssistantTips.Contains(CurrentAssistantTipKey) Then
p.SkippedAssistantTips.Add(CurrentAssistantTipKey)
End If
If Not g.VerifyRequirements() Then
Exit Sub
End If
For Each form In PreviewForm.Instances.ToArray
form.Close()
Next
If AssistantPassed Then
If AbortDueToLowDiskSpace() Then Exit Sub
g.RaiseAppEvent(ApplicationEvent.BeforeJobAdding)
Dim jobPath = JobManager.JobPath
Dim jobs = JobManager.GetJobs()?.Where(Function(x) x.Active AndAlso x.Path = jobPath)
If jobs.Any() Then
If MsgQuestion($"An active job for this project already exists.{BR}If you continue, it will be overwritten.", TaskButton.OkCancel) = DialogResult.Cancel Then
Exit Sub
End If
End If
If TypeOf p.VideoEncoder IsNot NullEncoder Then
Dim op = If(p.VideoEncoder.CanChunkEncode(), p.VideoEncoder.OutputPath.DirAndBase() + "_chunk1" + p.VideoEncoder.OutputPath.ExtFull(), p.VideoEncoder.OutputPath)
If op.FileExists() Then
Select Case p.FileExistVideo
Case FileExistMode.Ask
Using td As New TaskDialog(Of String)
td.Title = "A video encoding output file already exists"
td.Content = "Would you like to skip video encoding and reuse the existing video encoder output file or would you like to re-encode and overwrite it?"
td.AddCommand("Reuse")
td.AddCommand("Re-encode")
Select Case td.Show
Case "Reuse"
p.SkipVideoEncoding = True
Case "Re-encode"
p.SkipVideoEncoding = False
Case Else
Exit Sub
End Select
End Using
Case FileExistMode.Overwrite
p.SkipVideoEncoding = False
Case FileExistMode.Skip
p.SkipVideoEncoding = True
End Select
End If
End If
If p.AudioTracks.Any(Function(track) track.AudioProfile.File <> "" AndAlso
(TypeOf track.AudioProfile Is GUIAudioProfile OrElse TypeOf track.AudioProfile Is BatchAudioProfile) AndAlso
File.Exists(track.AudioProfile.GetOutputFile())) Then
Select Case p.FileExistAudio
Case FileExistMode.Ask
Using td As New TaskDialog(Of String)
td.Title = "An audio encoding output file already exists"
td.Content = "Would you like to skip audio encoding and reuse existing audio encoding output files or would you like to re-encode and overwrite?"
td.AddCommand("Reuse")
td.AddCommand("Re-encode")
Select Case td.Show
Case "Reuse"
p.SkipAudioEncoding = True
Case "Re-encode"
p.SkipAudioEncoding = False
Case Else
Exit Sub
End Select
End Using
Case FileExistMode.Overwrite
p.SkipAudioEncoding = False
Case FileExistMode.Skip
p.SkipAudioEncoding = True
End Select
End If
AddJob(False, Nothing, position)
If showJobsDialog Then
Me.ShowJobsDialog()
Else
bnNext.ShowBold()
End If
Else
Assistant()
End If
End Sub
<Command("Adds a job to the job list.")>
Sub AddJob(
<DispName("Show Confirmation")>
showConfirmation As Boolean,
<DispName("Template Name"),
Description("Name of the template to be loaded after the job was added. Empty to load no template.")>
templateName As String,
<DispName("Position to insert new job")>
Optional position As Integer = -1)
AddJob(showConfirmation, templateName, True, position)
End Sub
Sub AddJob(
showConfirmation As Boolean,
templateName As String,
showAssistant As Boolean,
Optional position As Integer = -1)
If Not g.VerifyRequirements() Then
Exit Sub
End If
If showAssistant AndAlso Not IsLoading AndAlso Not AssistantPassed Then
MsgWarn("Please follow the assistant.")
Exit Sub
End If
Dim jobPath = JobManager.JobPath
SaveProjectPath(jobPath)
JobManager.AddJob(jobPath, jobPath, position)
If showConfirmation Then
MsgInfo("Job added")
End If
If templateName <> "" Then
LoadProject(Path.Combine(Folder.Template, templateName + ".srip"))
End If
End Sub
<Command("Shows a dialog to compare different videos.")>
Sub ShowVideoComparison()
Dim form As New VideoComparisonForm
form.Show()
End Sub
<Command("Dialog to edit filters.")>
Sub ShowFiltersEditor()
FiltersListView.ShowCodeEditor()
End Sub
<Command("Dialog to preview script code.")>
Sub ShowCodePreview()
g.ShowCodePreview(p.Script.GetFullScript)
End Sub
Sub SetCropFilter()
If CInt(p.CropLeft Or p.CropTop Or p.CropRight Or p.CropBottom) <> 0 Then
If Not g.EnableFilter("Crop") Then
If p.Script.IsAviSynth Then
p.Script.InsertAfter("Source", New VideoFilter("Crop", "Crop", "Crop(%crop_left%, %crop_top%, -%crop_right%, -%crop_bottom%)"))
Else
p.Script.InsertAfter("Source", New VideoFilter("Crop", "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)"))
End If
End If
FiltersListView.Load()
End If
End Sub
Sub DisableCropFilter()
Dim f = p.Script.GetFilter("Crop")
If f IsNot Nothing AndAlso CInt(p.CropLeft Or p.CropTop Or p.CropRight Or p.CropBottom) = 0 Then
f.Active = False
FiltersListView.Load()
End If
End Sub
<Command("Dialog to configure filter setup profiles.")>
Sub ShowFilterSetupProfilesDialog()
Using form As New ProfilesForm(
"Filter Setup Profiles",
s.FilterSetupProfiles,
AddressOf LoadFilterSetup,
AddressOf GetScriptAsProfile,
AddressOf VideoScript.GetDefaults)
If form.ShowDialog() = DialogResult.OK Then
PopulateProfileMenu(DynamicMenuItemID.FilterSetupProfiles)
FiltersListView.RebuildMenu()
End If
End Using
End Sub
<Command("Dialog to configure filter profiles.")>
Sub ShowFilterProfilesDialog()
Dim filterProfiles = If(p.Script.IsAviSynth, s.AviSynthProfiles, s.VapourSynthProfiles)
Dim getDefaults = If(p.Script.IsAviSynth,
Function() FilterCategory.GetAviSynthDefaults,
Function() FilterCategory.GetVapourSynthDefaults)
Using dialog As New MacroEditorDialog
dialog.SetScriptDefaults()
dialog.Text = $"Filter Profiles - {g.DefaultCommands.GetApplicationDetails()}"
dialog.MacroEditorControl.Value = g.GetFilterProfilesText(filterProfiles)
dialog.bnContext.Text = " Restore Defaults... "
dialog.bnContext.Visible = True
dialog.MacroEditorControl.rtbDefaults.Text = g.GetFilterProfilesText(getDefaults())
dialog.bnContext.ClickAction = Sub()
If Msg("Restore defaults?", Nothing, TaskIcon.Warning, TaskButton.OkCancel) = DialogResult.OK Then
dialog.MacroEditorControl.Value = g.GetFilterProfilesText(getDefaults())
MsgInfo("Defaults were restored.")
End If
End Sub
If dialog.ShowDialog() = DialogResult.OK Then
Try
filterProfiles = FilterCategory.ParseFilterProfilesIniContent(dialog.MacroEditorControl.Value)
For Each i In getDefaults()
Dim found As Boolean
For Each i2 In filterProfiles
If i.Name = i2.Name Then
found = True
End If
Next
If Not found AndAlso {"Source", "Crop", "Resize"}.Contains(i.Name) Then
MsgWarn($"The category '{i.Name}' was recreated. A Source, Crop and Resize category is mandatory.")
filterProfiles.Add(i)
End If
Next
If p.Script.IsAviSynth Then
s.AviSynthProfiles = filterProfiles
Else
s.VapourSynthProfiles = filterProfiles
End If
g.SaveSettings()
g.MainForm.FiltersListView.RebuildMenu()
Catch ex As Exception
g.ShowException(ex)
End Try
End If
End Using
End Sub
Shared Function GetDefaultMainMenu() As CustomMenuItem
Dim ret As New CustomMenuItem("Root")
ret.Add("File|Open Video Source File(s)...", NameOf(ShowOpenSourceDialog), Keys.O Or Keys.Control, Symbol.Preview)
ret.Add("File|Open Video Source File(s)...|Single File", NameOf(ShowOpenSourceSingleFileDialog))
ret.Add("File|Open Video Source File(s)...|Multiple Files", NameOf(ShowOpenSourceMultipleFilesDialog))
ret.Add("File|Open Video Source File(s)...|Batch Multiple Files", NameOf(ShowOpenSourceBatchFilesDialog))
ret.Add("File|Open Video Source File(s)...|-")
ret.Add("File|Open Video Source File(s)...|Merge Files", NameOf(ShowOpenSourceMergeFilesDialog))
ret.Add("File|Open Video Source File(s)...|-")
ret.Add("File|Open Video Source File(s)...|Blu-ray Image File", NameOf(ShowOpenSourceBlurayImageDialog))
ret.Add("File|Open Video Source File(s)...|Blu-ray Folder", NameOf(ShowOpenSourceBlurayFolderDialog))
ret.Add("File|Demux...", NameOf(g.DefaultCommands.ShowDemuxTool), Symbol.fa_sitemap)
ret.Add("File|-")
ret.Add("File|Video Comparison...", NameOf(ShowVideoComparison), Keys.F5, Symbol.VideoLegacy)
ret.Add("File|-")
ret.Add("File|Open Project...", NameOf(ShowFileBrowserToOpenProject), Symbol.OpenFile)
ret.Add("File|Save Project", NameOf(SaveProject), Keys.S Or Keys.Control, Symbol.Save)
ret.Add("File|Save Project As...", NameOf(SaveProjectAs), Keys.S Or Keys.Control Or Keys.Shift, Symbol.SaveAs)
ret.Add("File|Save Project As Template...", NameOf(SaveProjectAsTemplate))
ret.Add("File|Close Project", NameOf(CloseProject), Keys.W Or Keys.Control, Symbol.fa_close)
ret.Add("File|-")
ret.Add("File|Project Templates", NameOf(g.DefaultCommands.DynamicMenuItem), Symbol.Library, {DynamicMenuItemID.TemplateProjects})
ret.Add("File|Recent Projects", NameOf(g.DefaultCommands.DynamicMenuItem), Symbol.History, {DynamicMenuItemID.RecentProjects})
ret.Add("File|-")
ret.Add("File|Launch New Instance", NameOf(StartNewInstance), Keys.N Or Keys.Control, Symbol.fa_clone)
ret.Add("File|-")
ret.Add("File|Exit", NameOf([Exit]), Keys.X Or Keys.Alt, Symbol.fa_window_close)
ret.Add("Crop", NameOf(ShowCropDialog), Keys.F3, Symbol.fa_crop)
ret.Add("Preview", NameOf(ShowPreview), Keys.F4, Symbol.fa_eye)
ret.Add("Project|Add Hardcoded Subtitle...", NameOf(ShowHardcodedSubtitleDialogFromTempDir), Keys.Control Or Keys.H, Symbol.Subtitles)
ret.Add("Project|Script Info...", NameOf(ShowScriptInfo), Keys.F2, Symbol.Info)
ret.Add("Project|Advanced Script Info...", NameOf(ShowAdvancedScriptInfo), Keys.Control Or Keys.F2, Symbol.AddTo)
ret.Add("Project|-")
ret.Add("Project|Log File", NameOf(g.DefaultCommands.ShowLogFile), Keys.F8, Symbol.Page)
ret.Add("Project|-")
ret.Add("Project|Folders", Symbol.Library)
ret.Add("Project|Folders|Source", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%source_dir%"""})
ret.Add("Project|Folders|Target", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%target_dir%"""})
ret.Add("Project|Folders|Temp", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%temp_dir%"""})
ret.Add("Project|Folders|Working", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%working_dir%"""})
ret.Add("Project|-")
ret.Add("Project|Options", NameOf(ShowOptionsDialog), Keys.F9, Symbol.Project)
ret.Add("Tools|Jobs...", NameOf(ShowJobsDialog), Keys.F6, Symbol.MultiSelectLegacy)
ret.Add("Tools|Folders", Symbol.Library)
ret.Add("Tools|Folders|Log Files", NameOf(g.DefaultCommands.ExecuteCommandLine), {$"""%settings_dir%{IO.Path.DirectorySeparatorChar}Log Files"""})
ret.Add("Tools|Folders|Plugins", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%plugin_dir%"""})
ret.Add("Tools|Folders|Programs", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%programs_dir%"""})
ret.Add("Tools|Folders|Scripts", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%script_dir%"""})
ret.Add("Tools|Folders|Settings", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%settings_dir%"""})
ret.Add("Tools|Folders|Startup", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%startup_dir%"""})
ret.Add("Tools|Folders|System", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%system_dir%"""})
ret.Add("Tools|Folders|Templates", NameOf(g.DefaultCommands.ExecuteCommandLine), {$"""%settings_dir%{IO.Path.DirectorySeparatorChar}Templates"""})
ret.Add("Tools|Scripts", NameOf(g.DefaultCommands.DynamicMenuItem), Symbol.Code, {DynamicMenuItemID.Scripts})
ret.Add("Tools|Advanced", Symbol.More)
ret.Add("Tools|Advanced|Event Commands...", NameOf(ShowEventCommandsDialog), Keys.Control Or Keys.E, Symbol.LightningBolt)
ret.Add("Tools|Advanced|Macros...", NameOf(g.DefaultCommands.ShowMacrosDialog), Keys.Control Or Keys.M, Symbol.CalculatorPercentage)
ret.Add("Tools|Advanced|Reset Settings...", NameOf(g.DefaultCommands.ResetSettings))
ret.Add("Tools|Advanced|-")
ret.Add("Tools|Advanced|Command Prompt", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.fa_terminal, {"cmd.exe", False, False, False, "%working_dir%"})
ret.Add("Tools|Advanced|PowerShell Terminal", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.fa_terminal, {"powershell.exe -nologo -executionpolicy bypass", False, False, False, "%working_dir%"})
If g.IsWindowsTerminalAvailable Then
ret.Add("Tools|Advanced|Windows Terminal", NameOf(g.DefaultCommands.ExecuteCommandLine), Keys.Control Or Keys.T, Symbol.fa_terminal, {"wt.exe", False, False, False, "%working_dir%"})
End If
ret.Add("Tools|Advanced|-")
ret.Add("Tools|Advanced|Generate Wiki Content", NameOf(g.DefaultCommands.GenerateWikiContent))
ret.Add("Tools|Advanced|Ingest HDR", NameOf(g.DefaultCommands.SaveMKVHDR))
ret.Add("Tools|-")
ret.Add("Tools|Edit Menu...", NameOf(ShowMainMenuEditor), Symbol.Settings)
ret.Add("Tools|Settings...", NameOf(ShowSettingsDialog), Keys.F10, Symbol.fa_cogs, {""})
ret.Add("Apps|Subtitles|Subtitle Edit", NameOf(g.DefaultCommands.StartTool), {"Subtitle Edit"})
ret.Add("Apps|Subtitles|BDSup2Sub++", NameOf(g.DefaultCommands.StartTool), {"BDSup2Sub++"})
ret.Add("Apps|Subtitles|VSRip", NameOf(g.DefaultCommands.StartTool), {"VSRip"})
ret.Add("Apps|Media Info|mkvinfo", NameOf(g.DefaultCommands.ShowMkvInfo))
ret.Add("Apps|Media Info|MediaInfo File", NameOf(g.DefaultCommands.ShowMediaInfo))
ret.Add("Apps|Media Info|MediaInfo Folder", NameOf(g.DefaultCommands.ShowMediaInfoFolderViewDialog))
ret.Add("Apps|Players|mpv.net", NameOf(g.DefaultCommands.StartTool), {"mpv.net"})
ret.Add("Apps|Players|MPC", NameOf(g.DefaultCommands.StartTool), {"MPC"})
ret.Add("Apps|Indexing|D2V Witch", NameOf(g.DefaultCommands.StartTool), {"D2V Witch"})
ret.Add("Apps|Indexing|DGIndex", NameOf(g.DefaultCommands.StartTool), {"DGIndex"})
ret.Add("Apps|Thumbnails|StaxRip Thumbnailer (using project options)", NameOf(g.DefaultCommands.ShowThumbnailerDialogAsync))
ret.Add("Apps|Animation|Animated GIF", NameOf(g.DefaultCommands.SaveGIF))
ret.Add("Apps|Animation|Animated PNG", NameOf(g.DefaultCommands.SavePNG))
ret.Add("Apps|Other|MKVToolnix GUI", NameOf(g.DefaultCommands.StartTool), {"MKVToolnix GUI"})
ret.Add("Apps|Other|chapterEditor", NameOf(g.DefaultCommands.StartTool), {"chapterEditor"})
ret.Add("Apps|-")
ret.Add("Apps|Manage...", NameOf(ShowAppsDialog), Keys.F11, Symbol.AllApps)
If g.IsDevelopmentPC Then
ret.Add("Apps|Test...", NameOf(g.DefaultCommands.Test), Keys.F12)
End If
ret.Add("Help|Apps", NameOf(g.DefaultCommands.DynamicMenuItem), Symbol.AllApps, {DynamicMenuItemID.HelpApplications})
ret.Add("Help|-")
ret.Add("Help|Website", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.fa_github, {"https://github.com/staxrip/staxrip"})
ret.Add("Help|Documentation", NameOf(g.DefaultCommands.ExecuteCommandLine), Keys.F1, Symbol.fa_book, {"https://github.com/staxrip/staxrip/tree/master/Docs/README.md"})
ret.Add("Help|Changelog", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.Bookmarks, {"https://github.com/staxrip/staxrip/blob/master/CHANGELOG.md"})
ret.Add("Help|Support", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.Heart, {"https://github.com/staxrip/staxrip?tab=readme-ov-file#contribution--support"})
ret.Add("Help|-")
ret.Add("Help|Report an issue", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.fa_bug, {"https://github.com/staxrip/staxrip/issues/new/choose"})
ret.Add("Help|-")
ret.Add("Help|Discord Server", NameOf(g.DefaultCommands.ExecuteCommandLine), Symbol.People, {"https://discord.gg/uz8pVR79Bd"})
ret.Add("Help|-")
ret.Add("Help|Check for Updates", NameOf(g.DefaultCommands.CheckForUpdate), Symbol.fa_recycle)
ret.Add("Help|-")
ret.Add("Help|What's new...", NameOf(ShowChangelog), Symbol.fa_shield, {True})
ret.Add("Help|Info...", NameOf(g.DefaultCommands.OpenHelpTopic), Symbol.Info, {"info"})
Return ret
End Function
<Command("Shows a dialog, opening from the last source directory, to add a hardcoded subtitle.")>
Sub ShowHardcodedSubtitleDialogFromLastSourceDir()
ShowHardcodedSubtitleDialog(s.LastSourceDir)
End Sub
<Command("Shows a dialog, opening from the temp folder, to add a hardcoded subtitle.")>
Sub ShowHardcodedSubtitleDialogFromTempDir()
ShowHardcodedSubtitleDialog(p.TempDir)
End Sub
Sub ShowHardcodedSubtitleDialog(initDir As String)
Using dialog As New OpenFileDialog
dialog.SetFilter(FileTypes.SubtitleExludingContainers)
dialog.SetInitDir(initDir)
If dialog.ShowDialog = DialogResult.OK Then
If dialog.FileName.Ext = "idx" Then
Dim subs = Subtitle.Create(dialog.FileName)
If subs.Count = 0 Then
MsgInfo("No subtitles found.")
Exit Sub
End If
Dim sb As New SelectionBox(Of Subtitle) With {
.Title = "Language",
.Text = "Please select a subtitle."
}
For Each i In subs
sb.AddItem(i.Language.EnglishName, i)
Next
If sb.Show = DialogResult.Cancel Then
Exit Sub
End If
Regex.Replace(dialog.FileName.ReadAllText, "langidx: \d+", "langidx: " +
sb.SelectedValue.IndexIDX.ToString).WriteFileSystemEncoding(dialog.FileName)
End If
p.AddHardcodedSubtitleFilter(dialog.FileName, True)
End If
End Using
End Sub
Sub tbResize_MouseUp(sender As Object, e As MouseEventArgs) Handles tbResize.MouseUp
Assistant()
End Sub
Sub tbResize_Scroll() Handles tbResize.Scroll
SkipAssistant = True
g.AddResizeFilter()
tbTargetWidth.Text = CInt(p.SourceWidth \ 2 + tbResize.Value * Math.Max(TrackBarInterval, p.ForcedOutputMod)).ToString
SetImageHeight()
SkipAssistant = False
Assistant(False)
End Sub
Sub SetImageHeight()
Try
Dim modval = p.ForcedOutputMod
Dim ar As Double
If ModifierKeys = Keys.Control Then
Dim cropw = p.SourceWidth - p.CropLeft - p.CropRight
Dim croph = p.SourceHeight - p.CropTop - p.CropBottom
ar = cropw / croph
Else
ar = Calc.GetTargetDAR
End If
tbTargetHeight.Text = (CInt(p.TargetWidth / ar / modval) * modval).ToString()
If p.TargetWidth = 1920 AndAlso p.TargetHeight = 1088 Then
tbTargetHeight.Text = CStr(1080)
End If
Catch
End Try
End Sub
Sub SetImageWidth()
Try
Dim modval = p.ForcedOutputMod
tbTargetWidth.Text = (CInt(p.TargetHeight * Calc.GetTargetDAR / modval) * modval).ToString()
Catch
End Try
End Sub
Sub tbBitrate_KeyDown(sender As Object, e As KeyEventArgs) Handles tbBitrate.KeyDown
If tbBitrate.ReadOnly Then
Exit Sub
End If
If e.KeyData = Keys.Up Then
e.Handled = True
tbBitrate.Text = Math.Max(0, Calc.GetNextMod(tbBitrate.Text.ToInt, 50)).ToString
ElseIf e.KeyData = Keys.Down Then
e.Handled = True
tbBitrate.Text = Math.Max(0, Calc.GetPreviousMod(tbBitrate.Text.ToInt, 50)).ToString
End If
End Sub
Sub tbTargetSize_KeyDown(sender As Object, e As KeyEventArgs) Handles tbTargetSize.KeyDown
If tbTargetSize.ReadOnly Then
Exit Sub
End If
Dim modValue As Integer
Select Case p.TargetSeconds
Case Is > 50 * 60
modValue = 50
Case Is > 10 * 60
modValue = 10
Case Is > 60
modValue = 5
Case Else
modValue = 1
End Select
If e.KeyData = Keys.Up Then
e.Handled = True
tbTargetSize.Text = Math.Max(0, Calc.GetNextMod(tbTargetSize.Text.ToInt, modValue)).ToString
ElseIf e.KeyData = Keys.Down Then
e.Handled = True
tbTargetSize.Text = Math.Max(0, Calc.GetPreviousMod(tbTargetSize.Text.ToInt, modValue)).ToString
End If
End Sub
Sub UpdateSizeOrBitrate()
If p.VideoEncoder.QualityMode Then Return
If p.BitrateIsFixed Then
tbBitrate_TextChanged()
Else
tbSize_TextChanged()
End If
End Sub
Sub tbSize_TextChanged() Handles tbTargetSize.TextChanged
Try
If tbTargetSize.TextBox.Focused Then
p.BitrateIsFixed = False
End If
If Integer.TryParse(tbTargetSize.Text, Nothing) Then
p.TargetSize = Math.Max(0, CInt(tbTargetSize.Text))
BlockSize = True
If Not BlockBitrate Then
tbBitrate.Text = CInt(Calc.GetVideoBitrate).ToString
End If
BlockSize = False
Assistant()
End If
Catch
End Try
End Sub
Sub tbBitrate_TextChanged() Handles tbBitrate.TextChanged
Try
If tbBitrate.TextBox.Focused Then
p.BitrateIsFixed = True
End If
If Integer.TryParse(tbBitrate.Text, Nothing) Then
p.VideoBitrate = Math.Max(0, CInt(tbBitrate.Text))
p.VideoEncoder.Bitrate = p.VideoBitrate
BlockBitrate = True
If Not BlockSize Then
tbTargetSize.Text = $"{CInt(Calc.GetSizeInBytes \ PrefixedSize(2).Factor)}"
End If
p.VideoEncoder.UpdateTargetFile()
BlockBitrate = False
Assistant()
End If
Catch
End Try
End Sub
Sub tbTargetWidth_TextChanged() Handles tbTargetWidth.TextChanged
Try
If Integer.TryParse(tbTargetWidth.Text, Nothing) Then
p.TargetWidth = CInt(tbTargetWidth.Text)
Assistant()
End If
Catch
End Try
End Sub
Sub tbTargetHeight_TextChanged() Handles tbTargetHeight.TextChanged
Try
If Integer.TryParse(tbTargetHeight.Text, Nothing) Then
p.TargetHeight = CInt(tbTargetHeight.Text)
Assistant()
End If
Catch
End Try
End Sub
Sub tbTargetWidth_KeyDown(sender As Object, e As KeyEventArgs) Handles tbTargetWidth.KeyDown
If e.KeyData = Keys.Up Then
e.Handled = True
Dim modVal = p.ForcedOutputMod
tbTargetWidth.Text = CInt(((p.TargetWidth + modVal) / modVal) * modVal).ToString()
ElseIf e.KeyData = Keys.Down Then
e.Handled = True
Dim modVal = p.ForcedOutputMod
tbTargetWidth.Text = CInt(((p.TargetWidth - modVal) / modVal) * modVal).ToString()
End If
End Sub
Sub tbTargetHeight_KeyDown(sender As Object, e As KeyEventArgs) Handles tbTargetHeight.KeyDown
If e.KeyData = Keys.Up Then
e.Handled = True
Dim modVal = p.ForcedOutputMod
tbTargetHeight.Text = CInt(((p.TargetHeight + modVal) / modVal) * modVal).ToString()
ElseIf e.KeyData = Keys.Down Then
e.Handled = True
Dim modVal = p.ForcedOutputMod
tbTargetHeight.Text = CInt(((p.TargetHeight - modVal) / modVal) * modVal).ToString()
End If
End Sub
Sub tbTargetWidth_MouseWheel(sender As Object, e As MouseEventArgs) Handles tbTargetWidth.MouseWheel
If e.Delta < 0 Then
Dim modVal = p.ForcedOutputMod
tbTargetWidth.Text = CInt(((p.TargetWidth - modVal) / modVal) * modVal).ToString()
Else
Dim modVal = p.ForcedOutputMod
tbTargetWidth.Text = CInt(((p.TargetWidth + modVal) / modVal) * modVal).ToString()
End If
End Sub
Sub tbTargetHeight_MouseWheel(sender As Object, e As MouseEventArgs) Handles tbTargetHeight.MouseWheel
If e.Delta < 0 Then
Dim modVal = p.ForcedOutputMod
tbTargetHeight.Text = CInt(((p.TargetHeight - modVal) / modVal) * modVal).ToString()
Else
Dim modVal = p.ForcedOutputMod
tbTargetHeight.Text = CInt(((p.TargetHeight + modVal) / modVal) * modVal).ToString()
End If
End Sub
Shared Function GetDefaultMenuSize() As CustomMenuItem
Dim ret = New CustomMenuItem("Root")
ret.Add("DVD/BD-5 (4482 MiB / 4700 MB)", NameOf(SetSize), {CInt(4700_000_000 \ PrefixedSize(2).Factor)})
ret.Add("DVD-DL/BD-9 (8145 MiB / 8540 MB)", NameOf(SetSize), {CInt(8540_000_000 \ PrefixedSize(2).Factor)})
ret.Add("-")
ret.Add("BD (23842 MiB / 25000 MB)", NameOf(SetSize), {CInt(25000_000_000 \ PrefixedSize(2).Factor)})
ret.Add("BD-DL (47684 MiB / 50000 MB)", NameOf(SetSize), {CInt(50000_000_000 \ PrefixedSize(2).Factor)})
ret.Add("-")
ret.Add("50%", NameOf(SetPercent), {50})
ret.Add("60%", NameOf(SetPercent), {60})
ret.Add("-")
ret.Add("Edit Menu...", NameOf(ShowSizeMenuEditor))
Return ret
End Function
<Command("Sets the target image size.")>
Sub SetTargetImageSize(width As Integer, height As Integer)
g.AddResizeFilter()
If height = 0 AndAlso width > 0 Then
tbTargetWidth.Text = width.ToString
SetImageHeight()
ElseIf width = 0 AndAlso height > 0 Then
tbTargetHeight.Text = height.ToString
SetImageWidth()
Else
tbTargetWidth.Text = width.ToString
tbTargetHeight.Text = height.ToString
End If
Assistant()
End Sub
<Command("Sets the target image size by pixels (width x height).")>
Sub SetTargetImageSizeByPixel(pixel As Integer)
g.AddResizeFilter()
Dim cropw = p.SourceWidth - p.CropLeft - p.CropRight
Dim ar = Calc.GetTargetDAR()
Dim w = Calc.FixMod16(CInt(Math.Sqrt(pixel * ar)))
If w > cropw Then
w = (cropw \ 16) * 16
End If
Dim h = Calc.FixMod16(CInt(w / ar))
tbTargetWidth.Text = w.ToString()
tbTargetHeight.Text = h.ToString()
Assistant()
End Sub
<Command("Sets the target file size in MB.")>
Sub SetSize(<DispName("Target File Size")> targetSize As Integer)
tbTargetSize.Text = targetSize.ToString
p.BitrateIsFixed = False
End Sub
<Command("Shows info about the output AviSynth/VapourSynth script.")>
Sub ShowScriptInfo()
g.ShowScriptInfo(p.Script)
End Sub
<Command("Shows advanced AviSynth/VapourSynth output script info using various tools.")>
Sub ShowAdvancedScriptInfo()
g.ShowAdvancedScriptInfo(p.Script)
End Sub
<Command("Sets the bitrate according to the compressibility.")>
Sub SetPercent(<DispName("Percent Value")> value As Integer)
tbTargetSize.Text = g.GetAutoSize(value).ToString
p.BitrateIsFixed = False
End Sub
<Command("Sets the target video bitrate in Kbps.")>
Sub SetBitrate(<DispName("Target Video Bitrate")> bitrate As Integer)
tbBitrate.Text = bitrate.ToString
End Sub
<Command("Crops borders automatically.")>
Sub StartAutoCrop()
g.RunAutoCrop(Nothing)
SetCropFilter()
DisableCropFilter()
Assistant()
End Sub
<Command("Crops borders automatically until the proper aspect ratio is found.")>
Sub StartSmartCrop()
g.SmartCrop()
SetCropFilter()
DisableCropFilter()
Assistant()
End Sub
<Command("Menu editor for the size menu.")>
Sub ShowSizeMenuEditor()
s.CustomMenuSize = CustomSizeMenu.Edit()
End Sub
Sub UpdateSizeMenu()
For Each i As MenuItemEx In CustomSizeMenu.MenuItems
If i.CustomMenuItem.MethodName = "SetPercent" Then
i.Enabled = p.Compressibility > 0
End If
Next
End Sub
Function GetScriptAsProfile() As Profile
Dim sb As New SelectionBox(Of TargetVideoScript) With {
.Title = "New Profile",
.Text = "Please select a profile."
}
sb.AddItem("Current Project", p.Script)
For Each i In VideoScript.GetDefaults
sb.AddItem(i)
Next
If sb.Show = DialogResult.OK Then
Return sb.SelectedValue
End If
End Function
Sub LoadFilterSetup(profileInterface As Profile)
Dim profile = DirectCast(ObjectHelp.GetCopy(profileInterface), TargetVideoScript)
If profile.Engine = ScriptEngine.AviSynth OrElse (Package.Python.VerifyOK(True) AndAlso Package.VapourSynth.VerifyOK(True) AndAlso Package.vspipe.VerifyOK(True)) Then
Dim currentSetup = p.Script
Try
p.Script = profile
SetCropFilter()
PreviewScript = Nothing
ModifyFilters()
FiltersListView.OnChanged()
Assistant()
Catch ex As Exception
p.Script = currentSetup
PreviewScript = Nothing
ModifyFilters()
FiltersListView.OnChanged()
Assistant()
End Try
End If
FiltersListView.RebuildMenu()
End Sub
Function ParseCommandLine(commandLine As String, Optional delimiter As Char = " "c) As String()
If String.IsNullOrWhiteSpace(commandLine) Then Return New List(Of String)().ToArray()
Dim args = New List(Of String)
Dim sb = New StringBuilder()
Dim insideQuote = False
Dim insideCurlyBracketsLevel = 0
Dim insideRoundBracketsLevel = 0
Dim insideSquareBracketsLevel = 0
For i = 0 To commandLine.Length - 1
Dim c = commandLine.Chars(i)
If c = """" Then
sb.Append(c)
Dim lc = If(i > 0, commandLine.Chars(i - 1), "_"c)
If lc <> "`" Then
insideQuote = Not insideQuote
End If
ElseIf c = "{" Then
sb.Append(c)
insideCurlyBracketsLevel += 1
ElseIf c = "}" Then
sb.Append(c)
If insideCurlyBracketsLevel > 0 Then insideCurlyBracketsLevel -= 1
ElseIf c = "(" Then
sb.Append(c)
insideRoundBracketsLevel += 1
ElseIf c = ")" Then
sb.Append(c)
If insideRoundBracketsLevel > 0 Then insideRoundBracketsLevel -= 1
ElseIf c = "[" Then
sb.Append(c)
insideSquareBracketsLevel += 1
ElseIf c = "]" Then
sb.Append(c)
If insideSquareBracketsLevel > 0 Then insideSquareBracketsLevel -= 1
ElseIf c = delimiter Then
If insideQuote Then
sb.Append(c)
ElseIf insideCurlyBracketsLevel > 0 Then
sb.Append(c)
ElseIf insideRoundBracketsLevel > 0 Then
sb.Append(c)
ElseIf insideSquareBracketsLevel > 0 Then
sb.Append(c)
Else
Dim str = sb.ToString()
If Not String.IsNullOrWhiteSpace(str) Then
args.Add(str)
End If
sb = New StringBuilder()
End If
Else
sb.Append(c)
End If
Next
If sb.Length > 0 Then args.Add(sb.ToString())
Return args.ToArray()
End Function
Sub ProcessCommandLine(commandLine As String)
If String.IsNullOrWhiteSpace(commandLine) Then Exit Sub
Dim args = ParseCommandLine(commandLine)
If args.Any() Then
Package.LoadConfAll()
Else
Exit Sub
End If
Dim files As New List(Of String)
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.CommandLine)) <> 0
Dim forcedTemplateLoading = args.Where(Function(s) s.ToLowerInvariant().TrimQuotes().StartsWith("-" & NameOf(LoadTemplate).ToLowerInvariant())).Any()
For Each arg In args.Skip(1)
Try
If Not arg.FileExists() AndAlso files.Count > 0 Then
Dim files2 As New List(Of String)(files)
Refresh()
If Not showTemplateSelection AndAlso Not forcedTemplateLoading Then OpenProject(g.LastModifiedTemplate)
OpenAnyFile(files2, showTemplateSelection AndAlso Not forcedTemplateLoading)
files.Clear()
End If
If arg.FileExists() Then
files.Add(arg)
Else
If Not CommandManager.ProcessCommandLineArgument(arg) Then
Throw New Exception
End If
End If
Catch ex As Exception
MsgWarn("Error parsing argument:" + BR2 + arg + BR2 + ex.Message)
End Try
Next
If files.Count > 0 Then
Refresh()
If Not showTemplateSelection AndAlso Not forcedTemplateLoading Then OpenProject(g.LastModifiedTemplate)
OpenAnyFile(files, showTemplateSelection AndAlso Not forcedTemplateLoading)
End If
End Sub
<Command("Sets the project option 'Hide dialogs asking to demux, source filter etc.'")>
Sub SetHideDialogsOption(hide As Boolean)
p.NoDialogs = hide
End Sub
<Command("Standby PC.")>
Sub Standby()
g.ShutdownPC(ShutdownMode.Standby)
End Sub
<Command("Shut down PC.")>
Sub Shutdown()
g.ShutdownPC(ShutdownMode.Shutdown)
End Sub
Sub SetEncoderControl(c As Control)
pnEncoder.Controls.Add(c)
If pnEncoder.Controls.Count > 1 Then
Dim old = pnEncoder.Controls(0)
pnEncoder.Controls.Remove(old)
old.Dispose()
End If
End Sub
Sub UpdateEncoderStateRelatedControls()
blFilesize.Visible = Not p.VideoEncoder.QualityMode
tbTargetSize.Visible = Not p.VideoEncoder.QualityMode
laBitrate.Visible = Not p.VideoEncoder.QualityMode
tbBitrate.Visible = Not p.VideoEncoder.QualityMode
End Sub
<Command("Dialog to open a single file source.")>
Sub ShowOpenSourceSingleFileDialog()
SetLastModifiedTemplate()
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
Using dialog As New OpenFileDialog
dialog.SetFilter(FileTypes.Video.Concat(FileTypes.Image))
dialog.SetInitDir(s.LastSourceDir)
If dialog.ShowDialog() = DialogResult.OK Then
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(dialog.FileNames, showTemplateSelectionTimeout) Then
OpenVideoSourceFiles(dialog.FileNames)
Else
Exit Sub
End If
Else
OpenProject(g.LastModifiedTemplate)
OpenVideoSourceFiles(dialog.FileNames)
End If
End If
End Using
End Sub
<Command("Dialog to open multiple file sources.")>
Sub ShowOpenSourceMultipleFilesDialog()
SetLastModifiedTemplate()
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
Using dialog As New OpenFileDialog
dialog.SetFilter(FileTypes.Video)
dialog.SetInitDir(s.LastSourceDir)
dialog.Multiselect = True
If dialog.ShowDialog() = DialogResult.OK Then
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(dialog.FileNames, showTemplateSelectionTimeout) Then
OpenVideoSourceFiles(dialog.FileNames)
Else
Exit Sub
End If
Else
OpenProject(g.LastModifiedTemplate)
OpenVideoSourceFiles(dialog.FileNames)
End If
End If
End Using
End Sub
<Command("Dialog to open a Blu-ray folder source.")>
Sub ShowOpenSourceBlurayFolderDialog()
SetLastModifiedTemplate()
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
Using dialog As New FolderBrowserDialog
dialog.Description = "Please select a Blu-ray source folder."
dialog.SetSelectedPath(s.Storage.GetString("last blu-ray source folder"))
dialog.ShowNewFolderButton = False
If dialog.ShowDialog = DialogResult.OK Then
s.Storage.SetString("last blu-ray source folder", dialog.SelectedPath)
Dim srcPath = dialog.SelectedPath.FixDir
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(srcPath, showTemplateSelectionTimeout) Then
OpenBlurayFolder(srcPath)
Else
Exit Sub
End If
Else
OpenProject(g.LastModifiedTemplate)
OpenBlurayFolder(srcPath)
End If
End If
End Using
End Sub
<Command("Dialog to open a Blu-ray ISO image.")>
Sub ShowOpenSourceBlurayImageDialog()
SetLastModifiedTemplate()
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
Using dialog As New OpenFileDialog
dialog.SetFilter(FileTypes.IsoImage)
dialog.SetInitDir(s.LastSourceDir)
If dialog.ShowDialog = DialogResult.OK Then
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(dialog.FileName, showTemplateSelectionTimeout) Then
OpenBlurayImage(dialog.FileName)
Else
Exit Sub
End If
Else
OpenProject(g.LastModifiedTemplate)
OpenBlurayImage(dialog.FileName)
End If
End If
End Using
End Sub
<Command("Dialog to open a merged files source.")>
Sub ShowOpenSourceMergeFilesDialog()
SetLastModifiedTemplate()
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
Using form As New SourceFilesForm()
form.Text = $"Merge - {g.DefaultCommands.GetApplicationDetails()}"
form.IsMerge = True
If form.ShowDialog() = DialogResult.OK AndAlso form.lb.Items.Count > 0 Then
Dim files = form.GetFiles
Select Case files(0).Ext
Case "mpg", "vob"
OpenVideoSourceFiles(files)
Case Else
Using proc As New Proc
proc.Header = "Merge source files"
For Each i In files
Log.WriteLine(MediaInfo.GetSummary(i) + "---------------------------------------------------------" + BR2)
Next
proc.Encoding = Encoding.UTF8
proc.Package = Package.mkvmerge
Dim outFile = files(0).DirAndBase + "_merged.mkv"
proc.Arguments = "-o " + outFile.Escape + " """ + files.Join(""" + """) + """"
Try
proc.Start()
Catch ex As Exception
g.ShowException(ex)
MsgInfo("Manual Merging", "Please merge the files manually with an appropriate tool or visit the support forum].")
Throw New AbortException
End Try
If Not g.FileExists(outFile) Then
Log.Write("Error merged output file is missing", outFile)
Exit Sub
Else
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(outFile, showTemplateSelectionTimeout) Then
OpenVideoSourceFile(outFile)
Else
Exit Sub
End If
Else
OpenProject(g.LastModifiedTemplate)
OpenVideoSourceFile(outFile)
End If
End If
End Using
End Select
End If
End Using
End Sub
<Command("Dialog to open a file batch source.")>
Sub ShowOpenSourceBatchFilesDialog()
SetLastModifiedTemplate()
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
If AbortDueToLowDiskSpace() Then Exit Sub
Using form As New SourceFilesForm()
form.Text = $"File Batch - {g.DefaultCommands.GetApplicationDetails()}"
If p.DefaultTargetName = "%source_dir_name%" Then
p.DefaultTargetName = "%source_name%"
End If
If form.ShowDialog() = DialogResult.OK AndAlso form.lb.Items.Count > 0 Then
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
Dim showTemplateSelectionTimeout = If(s.ShowTemplateSelection <> ShowTemplateSelectionMode.Never, s.ShowTemplateSelectionTimeout, 0)
If showTemplateSelection Then
If LoadTemplateWithSelectionDialog(form.GetFiles(), showTemplateSelectionTimeout) Then
For Each filepath In form.GetFiles()
AddBatchJob(filepath)
Next
Else
Exit Sub
End If
Else
OpenProject(g.LastModifiedTemplate, "", False)
For Each filepath In form.GetFiles
AddBatchJob(filepath)
Next
End If
ShowJobsDialog()
End If
End Using
End Sub
<Command("Dialog to open source files.")>
Sub ShowOpenSourceDialog()
Using td As New TaskDialog(Of String)
td.Title = "Select a method for opening a source:"
td.AddCommand("Single File")
td.AddCommand("Multiple Files")
td.AddCommand("Merge Files")
td.AddCommand("File Batch")
td.AddCommand("Blu-ray Folder")
td.AddCommand("Blu-ray Image File")
Select Case td.Show
Case "Single File"
ShowOpenSourceSingleFileDialog()
Case "Multiple Files"
ShowOpenSourceMultipleFilesDialog()
Case "Merge Files"
ShowOpenSourceMergeFilesDialog()
Case "File Batch"
ShowOpenSourceBatchFilesDialog()
Case "Blu-ray Folder"
ShowOpenSourceBlurayFolderDialog()
Case "Blu-ray Image File"
ShowOpenSourceBlurayImageDialog()
End Select
End Using
End Sub
Sub OpenEac3toDemuxForm(playlistFolder As String, playlistID As Integer)
Using form As New eac3toForm(p)
form.PlaylistFolder = playlistFolder
form.PlaylistID = playlistID
Dim workDir = playlistFolder.Parent.Parent
Dim title = InputBox.Show("Enter a short title used as filename", playlistFolder.Parent.Parent.DirName)
If title = "" Then Exit Sub
If p.TempDir <> "" Then
workDir = p.TempDir.Replace("%source_name%", title).FixDir
Else
workDir = Path.Combine(workDir, title)
End If
If Not g.IsFixedDrive(workDir) Then
Using dialog As New FolderBrowserDialog
dialog.Description = "Please select a folder for temporary files on a fixed local drive."
dialog.SetSelectedPath(s.Storage.GetString("last blu-ray target folder").Parent)
If dialog.ShowDialog = DialogResult.OK Then
workDir = dialog.SelectedPath
Else
Exit Sub
End If
End Using
End If
form.teTempDir.Text = workDir
If form.ShowDialog() = DialogResult.OK Then
If Not Directory.Exists(form.OutputFolder) Then
Try
Directory.CreateDirectory(form.OutputFolder)
Catch ex As Exception
MsgError("The temp folder could not be created." + BR2 + form.OutputFolder)
Exit Sub
End Try
End If
If Not g.IsFixedDrive(form.OutputFolder) Then
MsgError("Only fixed local drives are supported as temp dir.")
Exit Sub
End If
Try
Dim di As New DriveInfo(form.OutputFolder)
If di.AvailableFreeSpace / PrefixedSize(3).Factor < s.MinimumDiskSpace Then
Using td As New TaskDialog(Of String)
td.Title = "Low Disk Space"
td.Content = $"The target drive {Path.GetPathRoot(p.TargetFile)} has only " +
$"{(di.AvailableFreeSpace / PrefixedSize(3).Factor):f2} {PrefixedSize(3).Unit} free disk space."
td.Icon = TaskIcon.Warning
td.AddButton("Continue")
td.AddButton("Abort")
If td.Show <> "Continue" Then
Exit Sub
End If
End Using
End If
Using pr As New Proc
pr.Header = "Demux M2TS"
pr.TrimChars = {"-"c, " "c}
pr.SkipStrings = {"analyze: ", "process: "}
pr.Package = Package.eac3to
Dim outFiles As New List(Of String)
pr.Process.StartInfo.Arguments = form.GetArgs(playlistFolder.Escape + " " & playlistID & ")", title, outFiles)
pr.OutputFiles = outFiles
Try
pr.Start()
Catch ex As AbortException
Exit Sub
Catch ex As Exception
g.ShowException(ex)
Exit Sub
End Try
End Using
s.Storage.SetString("last blu-ray target folder", form.OutputFolder)
Dim fs = Path.Combine(form.OutputFolder, title + "." + form.cbVideoOutput.Text.ToLowerInvariant)
If File.Exists(fs) Then
p.TempDir = form.OutputFolder
OpenVideoSourceFile(fs, False)
End If
Catch
End Try
End If
End Using
End Sub
Function GetSourceFilesFromDir(path As String) As String()
For Each i In FileTypes.Video
Dim files = Directory.GetFiles(path, "*." + i)
Array.Sort(files)
If files.Length > 0 Then
Return files
End If
Next
End Function
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
End Sub
Sub tbSource_DoubleClick() Handles tbSourceFile.DoubleClick
SetLastModifiedTemplate()
Using dialog As New OpenFileDialog
dialog.SetFilter(FileTypes.Video)
dialog.Multiselect = True
dialog.SetInitDir(s.LastSourceDir)
If dialog.ShowDialog() = DialogResult.OK Then
Refresh()
Dim files = dialog.FileNames
files.Sort()
If Not files.NothingOrEmpty Then
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.OpeningMenu)) <> 0
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
If Not showTemplateSelection Then OpenProject(g.LastModifiedTemplate)
BeginInvoke(Sub() OpenAnyFile(files.ToList, showTemplateSelection))
End If
End If
End Using
End Sub
Function GetNewAudioProfile(currentProfile As AudioProfile) As AudioProfile
Dim sb As New SelectionBox(Of AudioProfile) With {
.Title = "New Profile",
.Text = "Please select a profile."
}
If currentProfile IsNot Nothing Then
sb.AddItem("Current Project", currentProfile)
End If
For Each i In AudioProfile.GetDefaults()
sb.AddItem(i)
Next
If sb.Show = DialogResult.OK Then
Return sb.SelectedValue
End If
End Function
Sub lTip_Click() Handles laTip.Click
If AssistantClickAction IsNot Nothing Then
AssistantClickAction.Invoke()
Assistant()
End If
End Sub
Sub UpdateTargetParameters(proj As Project)
If proj Is Nothing Then Exit Sub
If proj.Script Is Nothing Then Exit Sub
Dim info = proj.Script.GetInfo()
Dim frameCount = 0
Dim frameRate = 0D
Dim seconds = 0
If info.FrameRate > 0 Then
frameCount = info.FrameCount
frameRate = info.FrameRate
seconds = CInt(frameCount / frameRate)
Else
End If
UpdateTargetParameters(seconds, frameCount, frameRate)
End Sub
Sub UpdateTargetParameters(seconds As Integer, frames As Integer, frameRate As Double)
p.TargetSeconds = seconds
p.TargetFrames = frames
p.TargetFrameRate = frameRate
UpdateSizeOrBitrate()
End Sub
Sub pEncoder_MouseLeave() Handles pnEncoder.MouseLeave
Assistant()
End Sub
Sub ShowAudioTip(ap As AudioProfile)
If TypeOf ap Is GUIAudioProfile Then
Dim gap = DirectCast(ap, GUIAudioProfile)
If ap.Decoder = AudioDecoderMode.ffmpeg AndAlso gap.GetEncoder = GuiAudioEncoder.ffmpeg Then
Documentation.ShowTip(
"Please note that defining an audio decoder will always result in a separate " +
"decoding step, which is usually not necessary if the decoder and encoder are identical, " +
"it's a waste of time and disk space.")
End If
End If
End Sub
<Command("Dialog to manage audio profiles.")>
Sub ShowAudioProfilesDialog(<DispName("Track Number")> number As Integer)
g.LoadAudioProfiles()
Dim form = New ProfilesForm("Audio Profiles", s.AudioProfiles, Sub(profile) g.LoadAudioProfile(profile, number), Function() GetNewAudioProfile(p.AudioTracks(number).AudioProfile), AddressOf AudioProfile.GetDefaults)
If form.ShowDialog() = DialogResult.OK Then
g.SaveAudioProfiles()
End If
form.Dispose()
UpdateAudioMenus()
PopulateProfileMenu(DynamicMenuItemID.AudioProfiles)
End Sub
Sub UpdateAudioMenus()
If p.AudioTracksAvailable < 1 Then Exit Sub
Dim nameControls = tlpAudio?.Controls?.OfType(Of AudioNameButtonLabel)?.Where(Function(x) x.GetType() Is GetType(AudioNameButtonLabel))
If nameControls Is Nothing Then Exit Sub
If nameControls.Count < 1 Then Exit Sub
For i = 0 To nameControls.Count - 1
Dim index = i
Dim control = nameControls(index)
control.ContextMenuStripEx = If(control.ContextMenuStripEx, New ContextMenuStripEx(components))
control.ContextMenuStripEx.Items.ClearAndDisplose()
g.PopulateProfileMenu(control.ContextMenuStripEx.Items, s.AudioProfiles, Sub() ShowAudioProfilesDialog(index), Sub(profile) g.LoadAudioProfile(profile, index))
Next
End Sub
Sub AviSynthListView_ScriptChanged() Handles FiltersListView.Changed
If Not IsLoading AndAlso Not FiltersListView.IsLoading Then
If g.IsValidSource(False) Then
UpdateSourceParameters()
UpdateTargetParameters(p)
p.VideoEncoder?.UpdateTargetFile()
End If
Assistant()
End If
End Sub
Sub UpdateFilters()
FiltersListView.Load()
If g.IsValidSource(False) Then
UpdateTargetParameters(p)
End If
End Sub
Sub AviSynthListView_DoubleClick() Handles FiltersListView.DoubleClick
FiltersListView.ShowCodeEditor()
End Sub
Sub gbFilters_MenuClick() Handles lgbFilters.LinkClick
FiltersListView.ContextMenuStrip.Show(lgbFilters, 0, 16)
End Sub
Sub gbEncoder_LinkClick() Handles lgbEncoder.LinkClick
EncoderMenu.Items.ClearAndDisplose
g.PopulateProfileMenu(EncoderMenu.Items, s.VideoEncoderProfiles, AddressOf ShowEncoderProfilesDialog, AddressOf g.LoadVideoEncoder)
EncoderMenu.Show(lgbEncoder, 0, 16)
End Sub
Sub llSize_Click() Handles blFilesize.Click
UpdateSizeMenu()
SizeContextMenuStrip.Show(blFilesize, 0, 16)
End Sub
Sub llContainer_Click() Handles llMuxer.Click
ContainerMenu.Items.ClearAndDisplose
g.PopulateProfileMenu(ContainerMenu.Items, s.MuxerProfiles, AddressOf ShowMuxerProfilesDialog, AddressOf p.VideoEncoder.LoadMuxer)
ContainerMenu.Show(llMuxer, 0, 16)
End Sub
Sub gbResize_LinkClick() Handles lgbResize.LinkClick
Dim cms = TextCustomMenu.GetMenu(s.TargetImageSizeMenu, lgbResize.Label, components, AddressOf TargetImageMenuClick)
cms.Add("-")
cms.Add("Image Options...", Sub() ShowOptionsDialog("Image"))
cms.Add("Edit Menu...", Sub() s.TargetImageSizeMenu = TextCustomMenu.EditMenu(s.TargetImageSizeMenu, ApplicationSettings.GetDefaultTargetImageSizeMenu, Me))
cms.Show(lgbResize, 0, lgbResize.Label.Height)
End Sub
Sub blSourceParText_Click(sender As Object, e As EventArgs) Handles blSourceParText.Click
Dim menu = TextCustomMenu.GetMenu(s.ParMenu, blSourceParText, components, AddressOf SourceParMenuClick)
menu.Add("-")
menu.Items.Add(New MenuItemEx("Edit Menu...", Sub() s.ParMenu = TextCustomMenu.EditMenu(s.ParMenu, ApplicationSettings.GetParMenu, Me)))
menu.Show(blSourceParText, 0, blSourceParText.Height)
End Sub
Sub blSourceDarText_Click(sender As Object, e As EventArgs) Handles blSourceDarText.Click
Dim menu = TextCustomMenu.GetMenu(s.DarMenu, blSourceDarText, components, AddressOf SourceDarMenuClick)
menu.Add("-")
menu.Items.Add(New MenuItemEx("Edit Menu...", Sub() s.DarMenu = TextCustomMenu.EditMenu(s.DarMenu, ApplicationSettings.GetDarMenu, Me)))
menu.Show(blSourceDarText, 0, blSourceDarText.Height)
End Sub
Sub blTargetDarText_Click(sender As Object, e As EventArgs) Handles blTargetDarText.Click
Dim menu = TextCustomMenu.GetMenu(s.DarMenu, blTargetDarText, components, AddressOf TargetDarMenuClick)
menu.Add("-")
menu.Items.Add(New MenuItemEx("Edit Menu...", Sub() s.DarMenu = TextCustomMenu.EditMenu(s.DarMenu, ApplicationSettings.GetDarMenu, Me)))
menu.Show(blTargetDarText, 0, blTargetDarText.Height)
End Sub
Sub blTargetParText_Click(sender As Object, e As EventArgs) Handles blTargetParText.Click
Dim menu = TextCustomMenu.GetMenu(s.ParMenu, blTargetParText, components, AddressOf TargetParMenuClick)
menu.Add("-")
menu.Items.Add(New MenuItemEx("Edit Menu...", Sub() s.ParMenu = TextCustomMenu.EditMenu(s.ParMenu, ApplicationSettings.GetParMenu, Me)))
menu.Show(blTargetParText, 0, blTargetParText.Height)
End Sub
Sub SourceDarMenuClick(value As String)
value = Macro.Expand(value)
Dim tup = Macro.ExpandGUI(value)
If tup.Cancel Then
Exit Sub
End If
p.CustomSourcePAR = ""
p.CustomSourceDAR = tup.Value
If Calc.ParseCustomAR(tup.Value, 0, 0).X = 0 Then
p.CustomSourceDAR = ""
End If
Assistant()
End Sub
Sub SourceParMenuClick(value As String)
value = Macro.Expand(value)
Dim tup = Macro.ExpandGUI(value)
If tup.Cancel Then
Exit Sub
End If
p.CustomSourcePAR = tup.Value
p.CustomSourceDAR = ""
If value <> "force" AndAlso Calc.ParseCustomAR(tup.Value, 0, 0).X = 0 Then
p.CustomSourcePAR = ""
End If
Assistant()
End Sub
Sub TargetDarMenuClick(value As String)
value = Macro.Expand(value)
Dim tup = Macro.ExpandGUI(value)
If tup.Cancel Then
Exit Sub
End If
p.CustomTargetPAR = ""
p.CustomTargetDAR = tup.Value
If Calc.ParseCustomAR(tup.Value, 0, 0).X = 0 Then
p.CustomTargetDAR = ""
End If
Assistant()
End Sub
Sub TargetParMenuClick(value As String)
value = Macro.Expand(value)
Dim tup = Macro.ExpandGUI(value)
If tup.Cancel Then
Exit Sub
End If
p.CustomTargetPAR = tup.Value
p.CustomTargetDAR = ""
If value <> "force" AndAlso Calc.ParseCustomAR(tup.Value, 0, 0).X = 0 Then
p.CustomTargetPAR = ""
End If
Assistant()
End Sub
Sub TargetImageMenuClick(value As String)
g.EnableFilter("Resize")
value = Macro.Expand(value)
Dim tup = Macro.ExpandGUI(value)
If tup.Cancel Then
Exit Sub
End If
value = tup.Value
If value.IsInt Then
SetTargetImageSizeByPixel(CInt(value))
Exit Sub
End If
If value?.Contains("x") Then
Dim a = value.SplitNoEmptyAndWhiteSpace("x")
If a.Length = 2 AndAlso a(0).IsInt AndAlso a(1).IsInt Then
SetTargetImageSize(a(0).ToInt, a(1).ToInt)
Exit Sub
End If
End If
MsgWarn("Invalid format")
End Sub
Sub SetAutoAspectRatio(isAnamorphic As Boolean)
p.SourceAnamorphic = isAnamorphic
p.CustomSourcePAR = ""
p.CustomSourceDAR = ""
If p.Script.IsFilterActive("Resize)") Then
SetTargetImageSize(p.TargetWidth, 0)
End If
Assistant()
End Sub
Sub SetTip()
With TipProvider
.SetTip("Target Display Aspect Ratio", lDAR, blTargetDarText)
.SetTip("Target Pixel Aspect Ratio", lPAR, blTargetParText)
.SetTip("Target Storage Aspect Ratio", lSAR, lSarText)
.SetTip("Imagesize in pixel (width x height)", lPixel, lPixelText)
.SetTip("Zoom factor between source and target image size", lZoom, lZoomText)
.SetTip("Press Ctrl while using the slider to resize anamorphic.", tbResize)
.SetTip("Aspect Ratio Error", lAspectRatioError, lAspectRatioErrorText)
.SetTip("Cropped image size", lCrop, lCropText)
.SetTip("Cropped sides in format: Left, Right / Top, Bottom", blCropText, lCrop2)
.SetTip("Source Display Aspect Ratio", lSourceDar, blSourceDarText)
.SetTip("Source Pixel Aspect Ratio", lSourcePAR, blSourceParText)
.SetTip("Target Video Bitrate in Kbps (Up/Down key)", tbBitrate, laBitrate)
.SetTip("Target Image Width in pixel (Up/Down key)", tbTargetWidth, lTargetWidth)
.SetTip("Target Image Height in pixel (Up/Down key)", tbTargetHeight, lTargetHeight)
.SetTip("Target File Size (Up/Down key)", tbTargetSize)
.SetTip("Source file", tbSourceFile)
.SetTip("Target file", tbTargetFile)
.SetTip("Shows a menu with Container/Muxer profiles", llMuxer)
.SetTip("Shows a menu with video encoder profiles", lgbEncoder.Label)
.SetTip("Shows a menu with AviSynth filter options", lgbFilters.Label)
End With
End Sub
Sub UpdateSourceParameters()
If p.SourceScript Is Nothing Then Exit Sub
Try
Dim info = p.SourceScript.GetInfo
p.SourceWidth = info.Width
p.SourceHeight = info.Height
p.SourceSeconds = CInt(info.FrameCount / info.FrameRate)
p.SourceFrameRate = info.FrameRate
p.SourceFrames = info.FrameCount
Catch ex As Exception
MsgError("Source filter returned invalid parameters", p.SourceScript.GetFullScript)
Throw New AbortException()
End Try
End Sub
Sub tbSource_TextChanged(sender As Object, e As EventArgs) Handles tbSourceFile.TextChanged
If Not BlockSourceTextBoxTextChanged Then
If File.Exists(tbSourceFile.Text) Then
OpenVideoSourceFile(tbSourceFile.Text)
End If
End If
End Sub
Sub gbTarget_LinkClick() Handles lgbTarget.LinkClick
UpdateTargetFileMenu()
TargetFileMenu.Show(lgbTarget, 0, lgbTarget.Label.Height)
End Sub
Sub gbSource_MenuClick() Handles lgbSource.LinkClick
UpdateSourceFileMenu()
If File.Exists(p.SourceFile) Then
SourceFileMenu.Show(lgbSource, 0, lgbSource.Label.Height)
Else
ShowOpenSourceDialog()
End If
End Sub
Sub tbTargetFile_DoubleClick() Handles tbTargetFile.DoubleClick
Using dialog As New SaveFileDialog
dialog.FileName = p.TargetFile.Base
dialog.SetInitDir(p.TargetFile.Dir)
If dialog.ShowDialog() = DialogResult.OK Then
Dim ext = p.VideoEncoder.Muxer.OutputExtFull
p.TargetFile = If(dialog.FileName.Ext = ext, dialog.FileName, dialog.FileName + ext)
End If
End Using
End Sub
Sub tbTargetFile_TextChanged(sender As Object, e As EventArgs) Handles tbTargetFile.TextChanged
If LastTbTargetFileText <> tbTargetFile.Text Then
LastTbTargetFileText = tbTargetFile.Text
If Not p.BatchMode AndAlso Not String.IsNullOrWhiteSpace(tbTargetFile.Text) Then p.VideoEncoder.OverridesTargetFileName = False
End If
End Sub
Sub tbTargetFile_MouseDown(sender As Object, e As MouseEventArgs) Handles tbTargetFile.MouseDown
If e.Button = MouseButtons.Right Then
UpdateTargetFileMenu()
End If
End Sub
Sub tbSourceFile_MouseDown(sender As Object, e As MouseEventArgs) Handles tbSourceFile.MouseDown
If e.Button = MouseButtons.Right Then
UpdateSourceFileMenu()
End If
End Sub
Sub UpdateAudioFileMenu(audioTrack As AudioTrack, index As Integer, a As Action)
Dim cms = DirectCast(audioTrack.TextEdit.TextBox.ContextMenuStrip, ContextMenuStripEx)
Dim ap = audioTrack.AudioProfile
Dim te = audioTrack.TextEdit
Dim exist = File.Exists(ap.File)
cms.Items.ClearAndDisplose()
If ap.Streams IsNot Nothing AndAlso ap.Streams.Count > 0 Then
For Each i In ap.Streams
Dim temp = i
Dim menuAction = Sub()
If ap.File <> p.LastOriginalSourceFile Then
te.Text = p.LastOriginalSourceFile
End If
te.Text = temp.Name + " (" + ap.File.Ext + ")"
ap.Stream = temp
audioTrack.LanguageLabel.Refresh()
UpdateSizeOrBitrate()
End Sub
If ap.Streams.Count > 10 Then
cms.Add("Streams | " + g.ConvertPath(i.Name), menuAction)
Else
cms.Add(g.ConvertPath(i.Name), menuAction)
End If
Next
cms.Items.Add("-")
End If
If p.SourceFile.Ext = "avs" OrElse p.Script.GetScript.ToLowerInvariant.Contains("audiodub(") Then
cms.Add(p.Script.Path.FileName, Sub() te.Text = p.Script.Path)
End If
If p.TempDir <> "" AndAlso Directory.Exists(p.TempDir) Then
Dim audioFiles = Directory.GetFiles(p.TempDir).Where(
Function(audioPath) FileTypes.Audio.Contains(audioPath.Ext)).ToList
audioFiles.Sort(New StringLogicalComparer)
If audioFiles.Count > 0 Then
For Each i In audioFiles
Dim temp = i
Dim menuAction = Sub()
audioTrack.Remove()
te.Text = temp
End Sub
If audioFiles.Count > 10 Then
cms.Add("Files | " + i.FileName, menuAction)
Else
cms.Add(i.FileName, menuAction)
End If
Next
cms.Items.Add("-")
End If
End If
Dim moreFilesAction = Sub()
s.Storage.SetInt("last selected muxer tab", 1)
p.VideoEncoder.OpenMuxerConfigDialog()
End Sub
cms.Add("Open File", a, "Change the audio source file.").SetImage(Symbol.OpenFile)
cms.Add("Add more files...", moreFilesAction, exist)
cms.Add("Play", Sub() g.PlayAudio(ap), exist, "Plays the audio source file with a media player.").SetImage(Symbol.Play)
cms.Add("Media Info...", Sub() g.DefaultCommands.ShowMediaInfo(ap.File), exist, "Show MediaInfo for the audio source file.").SetImage(Symbol.Info)
cms.Add("Explore", Sub() g.SelectFileWithExplorer(ap.File), exist, "Open the audio source file directory with File Explorer.").SetImage(Symbol.FileExplorer)
cms.Add("-")
cms.Add("Execute", Sub() ExecuteAudio(ap), exist, "Processes the audio profile.").SetImage(Symbol.LightningBolt)
cms.Add("Execute All", Sub() ExecuteAllAudio(), p.AudioTracks.Any(Function(x) x.IsRelevant), "Processes all audio profiles.")
cms.Add("-")
cms.Add("Copy Path", Sub() Clipboard.SetText(ap.File), te.Text <> "")
cms.Add("Copy Selection", Sub() Clipboard.SetText(te.TextBox.SelectedText), te.Text <> "").SetImage(Symbol.Copy)
cms.Add("Paste", Sub() te.TextBox.Paste(), Clipboard.GetText.Trim <> "").SetImage(Symbol.Paste)
cms.Add("-")
cms.Add("Remove", Sub() audioTrack.Remove(), te.Text <> "", "Remove audio file").SetImage(Symbol.Remove)
End Sub
Sub ExecuteAudio(ap As AudioProfile)
If MsgQuestion("Confirm to process the track.") = DialogResult.OK Then
Dim cleanTemp = False
Try
If p.TempDir = "" Then
p.TempDir = ap.File.Dir
cleanTemp = True
End If
ap = ObjectHelp.GetCopy(ap)
Audio.Process(ap)
ap.Encode()
Catch
Finally
If cleanTemp Then p.TempDir = ""
End Try
End If
End Sub
Sub ExecuteAllAudio()
If MsgQuestion("Confirm to process ALL audio tracks.") = DialogResult.OK Then
For Each track In p.AudioTracks
Dim cleanTemp = False
Try
If track.TextEdit.Text = "" Then Continue For
If TypeOf track.AudioProfile Is NullAudioProfile Then Continue For
If p.TempDir = "" Then
p.TempDir = track.AudioProfile.File.Dir()
cleanTemp = True
End If
Dim ap = ObjectHelp.GetCopy(track.AudioProfile)
Audio.Process(ap)
ap.Encode()
Catch
Finally
If cleanTemp Then p.TempDir = ""
End Try
Next
End If
End Sub
Sub UpdateTargetFileMenu()
TargetFileMenu.Items.ClearAndDisplose
TargetFileMenu.Add("Browse File...", AddressOf tbTargetFile_DoubleClick, File.Exists(p.SourceFile), "Change the path of the target file.")
TargetFileMenu.Add("Play", Sub() g.Play(p.TargetFile), File.Exists(p.TargetFile), "Play the target file.").SetImage(Symbol.Play)
TargetFileMenu.Add("Media Info...", Sub() g.DefaultCommands.ShowMediaInfo(p.TargetFile), File.Exists(p.TargetFile), "Show MediaInfo for the target file.").SetImage(Symbol.Info)
TargetFileMenu.Add("Explore...", Sub() g.SelectFileWithExplorer(p.TargetFile), Directory.Exists(p.TargetFile.Dir), "Open the target file directory with File Explorer.").SetImage(Symbol.FileExplorer)
TargetFileMenu.Add("-")
TargetFileMenu.Add("Copy", Sub() tbTargetFile.TextBox.Copy(), tbTargetFile.Text <> "").SetImage(Symbol.Copy)
TargetFileMenu.Add("Paste", Sub() tbTargetFile.TextBox.Paste(), Clipboard.GetText.Trim <> "" AndAlso File.Exists(p.SourceFile)).SetImage(Symbol.Paste)
End Sub
Sub UpdateSourceFileMenu()
SourceFileMenu.Items.ClearAndDisplose
Dim isIndex = FileTypes.VideoIndex.Contains(p.LastOriginalSourceFile.Ext)
SourceFileMenu.Add("Open...", AddressOf ShowOpenSourceDialog, "Open source files").SetImage(Symbol.OpenFile)
SourceFileMenu.Add("Play", Sub() g.Play(p.LastOriginalSourceFile), File.Exists(p.LastOriginalSourceFile) AndAlso Not isIndex, "Play the source file.").SetImage(Symbol.Play)
SourceFileMenu.Add("Media Info...", Sub() g.DefaultCommands.ShowMediaInfo(p.LastOriginalSourceFile), File.Exists(p.LastOriginalSourceFile) AndAlso Not isIndex, "Show MediaInfo for the source file.").SetImage(Symbol.Info)
SourceFileMenu.Add("Explore...", Sub() g.SelectFileWithExplorer(p.SourceFile), File.Exists(p.SourceFile), "Open the source file directory with File Explorer.").SetImage(Symbol.FileExplorer)
SourceFileMenu.Items.Add("-")
SourceFileMenu.Add("Copy", Sub() tbSourceFile.TextBox.Copy(), tbSourceFile.Text <> "", "Copies the selected text to the clipboard.").SetImage(Symbol.Copy)
SourceFileMenu.Add("Paste", Sub() tbSourceFile.TextBox.Paste(), Clipboard.GetText.Trim <> "", "Copies the full source file path to the clipboard.").SetImage(Symbol.Paste)
End Sub
Protected Overrides Sub OnDragEnter(e As DragEventArgs)
MyBase.OnDragEnter(e)
Dim files = TryCast(e.Data.GetData(DataFormats.FileDrop), String())
If Not files.NothingOrEmpty Then
e.Effect = DragDropEffects.Copy
End If
End Sub
Protected Overrides Sub OnDragDrop(e As DragEventArgs)
MyBase.OnDragDrop(e)
SetLastModifiedTemplate()
Dim files = TryCast(e.Data.GetData(DataFormats.FileDrop), String())
If Not files.NothingOrEmpty Then
Dim showTemplateSelection = (s.ShowTemplateSelection And (ShowTemplateSelectionMode.Always Or ShowTemplateSelectionMode.DragDrop)) <> 0
If p.SourceFile <> "" AndAlso IsSaveCanceled() Then Exit Sub
If Not showTemplateSelection Then OpenProject(g.LastModifiedTemplate)
BeginInvoke(Sub() OpenAnyFile(files.ToList, showTemplateSelection))
End If
End Sub
Protected Overrides Sub OnActivated(e As EventArgs)
MyBase.OnActivated(e)
UpdateNextButton()
If Not FrameServerHelp.IsAviSynthPortable AndAlso FrameServerHelp.GetAviSynthInstallPath = "" Then
MsgError($"AviSynth installation not found,{BR}using portable mode instead.")
s.AviSynthMode = FrameServerMode.Portable
End If
If Not FrameServerHelp.IsVapourSynthPortable AndAlso FrameServerHelp.GetVapourSynthInstallPath = "" Then
MsgError($"VapourSynth installation not found,{BR}using portable mode instead.")
s.VapourSynthMode = FrameServerMode.Portable
End If
ProcController.SetLastActivation()
BeginInvoke(New Action(Sub()
Application.DoEvents()
Assistant()
UpdateScriptsMenuAsync()
End Sub))
End Sub
Protected Overrides Sub OnLoad(args As EventArgs)
MyBase.OnLoad(args)
End Sub
Protected Overrides Sub OnShown(e As EventArgs)
MyBase.OnShown(e)
UpdateDynamicMenuAsync()
UpdateRecentProjectsMenu()
UpdateTemplatesMenuAsync()
IsLoading = False
Refresh()
CheckForWindows7()
g.CheckForLongPathSupport()
g.PreloadValuesAsync()
ShowChangelog(False)
ProcessCommandLine(Environment.CommandLine)
StaxRipUpdate.SetFirstRunOnCurrentVersion()
StaxRipUpdate.ShowUpdateQuestion()
StaxRipUpdate.CheckForUpdateAsync(False, Environment.Is64BitProcess)
g.RunTask(AddressOf g.LoadPowerShellScripts)
'Text = $"{Size.Width}x{Size.Height}"
End Sub
Protected Overrides Sub OnResize(e As EventArgs)
MyBase.OnResize(e)
'Text = $"{Size.Width}x{Size.Height}"
End Sub
Protected Overrides Sub OnFormClosing(args As FormClosingEventArgs)
MyBase.OnFormClosing(args)
If IsSaveCanceled() Then
args.Cancel = True
End If
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
MyBase.OnFormClosed(e)
If g.ProcForm IsNot Nothing Then
If g.ProcForm.InvokeRequired Then
g.ProcForm.Invoke(Sub() g.ProcForm.Close())
Else
g.ProcForm.Close()
End If
End If
Try
g.RaiseAppEvent(ApplicationEvent.ApplicationExit)
Catch ex As Exception
End Try
g.SaveSettings()
End Sub
Protected Overrides Sub OnDeactivate(e As EventArgs)
MyBase.OnDeactivate(e)
UpdateNextButton()
End Sub
Protected Overrides Sub OnKeyDown(e As KeyEventArgs)
MyBase.OnKeyDown(e)
UpdateNextButton()
End Sub
Protected Overrides Sub OnKeyUp(e As KeyEventArgs)
MyBase.OnKeyUp(e)
UpdateNextButton()
End Sub
Protected Overrides ReadOnly Property ShowWithoutActivation As Boolean
Get
If g.IsAppStart Then
g.IsAppStart = False
If s.StartWithoutFocus OrElse ParseCommandLine(Environment.CommandLine)?.Contains("-" & NameOf(GlobalCommands.NoFocus), StringComparer.OrdinalIgnoreCase) Then
ProcController.SetLastActivation(-s.PreventFocusStealAfter * 2)
Return True
End If
End If
If ProcController.BlockActivation Then
ProcController.BlockActivation = False
Return True
End If
Return MyBase.ShowWithoutActivation
End Get
End Property
Sub UpdateTargetSizeLabel()
Me.blFilesize.Text = $"Size in {PrefixedSize(2).Unit}:"
End Sub
Sub UpdateNextButton()
If AssistantPassed AndAlso CanIgnoreTip Then
Dim toTop = ModifierKeys.HasFlag(Keys.Shift)
toTop = If(s.InvertShiftKeyOnNextButton, Not toTop, toTop)
Dim hideList = ModifierKeys.HasFlag(Keys.Control)
hideList = If(s.InvertCtrlKeyOnNextButton, Not hideList, hideList)
Dim txt = "Add job"
txt += If(toTop, " to top", "")
txt += If(hideList, $"{BR}w/o showing list", "")
bnNext.Text = txt
Else
bnNext.Text = "Accept / Next"
End If
End Sub
Sub bnNext_Click(sender As Object, e As EventArgs) Handles bnNext.Click
Dim toTop = ModifierKeys.HasFlag(Keys.Shift)
toTop = If(s.InvertShiftKeyOnNextButton, Not toTop, toTop)
Dim hideList = ModifierKeys.HasFlag(Keys.Control)
hideList = If(s.InvertCtrlKeyOnNextButton, Not hideList, hideList)
AddJob(Not hideList, If(toTop, 0, -1))
End Sub
Sub bnNext_MouseDown(sender As Object, e As MouseEventArgs) Handles bnNext.MouseDown
If e.Button = MouseButtons.Right AndAlso AssistantPassed AndAlso CanIgnoreTip Then
NextContextMenuStrip.Show(bnNext, New Point(bnNext.Width, 0), ToolStripDropDownDirection.AboveLeft)
End If
End Sub
Sub SetFormBoundaries(ateHeight As Integer)
Dim assistantHeight = tlpMain.RowStyles.Item(4).Height
Dim heights = tlpMain.GetRowHeights()
Dim selectedHeights = heights.TakeWhile(Function(x, y) y < heights.Length - 1)
Dim sum = CInt(selectedHeights.Sum(Function(s) s))
Dim h = sum + assistantHeight + (Size.Height - ClientSize.Height)
MinimumSize = New Size(Font.Height * 48, CInt(h))
MaximumSize = New Size(Font.Height * 80, CInt(h))
End Sub
Sub CheckForWindows7()
If s.ShowWindows7Warning AndAlso OSVersion.VersionInfo.dwMajorVersion = 7 Then
MsgWarn("Compatibility problem!", "Whereas Windows 7 is supported by StaxRip itself, some tools don't do it anymore. This can cause tools denying to work correctly or at whole. Currently those tools are 'MKVToolNix (mkvmerge)' and 'Python', which you have to downgrade or try to avoid. For further help join our Discord server.")
End If
s.ShowWindows7Warning = False
End Sub
<Command("Shows the latest changes.")>
Sub ShowChangelog(force As Boolean)
Dim appDetails = g.DefaultCommands.GetApplicationDetails(True, True, False)
If Not force AndAlso s.ShowChangelog = appDetails Then Exit Sub
Dim ass = Assembly.GetExecutingAssembly()
Dim currentVersion = ass.GetName().Version
If Not force AndAlso currentVersion.Minor >= 99 Then Exit Sub
Dim filepath = If(g.IsSupporterRelease, "StaxRip.CHANGELOG-SUPPORTER.md", "StaxRip.CHANGELOG.md")
Using stream = ass.GetManifestResourceStream(filepath)
Using reader As New StreamReader(stream)
Dim lastChangelogVersionMatch = Regex.Match(s.ShowChangelog, "\d+\.\d+(?:\.\d+)*")
Dim lastChangelogVersion = If(lastChangelogVersionMatch.Success, New Version(lastChangelogVersionMatch.Value), Nothing)
Dim releases As New List(Of (Version As Version, VersionText As String, Changelog As String))
Dim readoutVersion As Version = Nothing
Dim lastReadoutVersion As Version
Dim lastReadoutVersionText As String
Dim sb As New StringBuilder()
Dim isComment = False
Do While Not reader.EndOfStream
Dim line = reader.ReadLine()
If line = "<!--" Then isComment = True
If isComment Then
If line = "-->" Then isComment = False
Continue Do
End If
'If String.IsNullOrWhiteSpace(line) Then Continue Do
If line Like "========*" Then Continue Do
Dim readoutVersionMatch = Regex.Match(line, "^(v(?<version>\d+\.\d+(?:\.\d+)*(?:-(RC\d+))?))\W+\((?<text>.*)\)")
readoutVersion = If(readoutVersionMatch.Success, New Version(readoutVersionMatch.Groups("version").Value), readoutVersion)
If readoutVersionMatch.Success Then
If readoutVersion.Minor > currentVersion.Minor Then
sb.Clear()
Continue Do
End If
releases.Add((lastReadoutVersion, lastReadoutVersionText, sb.ToString().Trim()))
lastReadoutVersion = readoutVersion
lastReadoutVersionText = readoutVersionMatch.Groups("text").Value
sb.Clear()
Continue Do
End If
line = Regex.Replace(line, "(?<=\W\(?\[#\d+\])(\(/\.\./\.\./\w+/\d+\))(?=\)|(?>,|\)|$))", "", RegexOptions.CultureInvariant)
line = Regex.Replace(line, "(?<=^| ) (?= |-)", " ", RegexOptions.CultureInvariant)
sb.AppendLine(line)
Loop
Dim leftover = sb.ToString()
If Not String.IsNullOrWhiteSpace(leftover) Then
releases.Add((lastReadoutVersion, lastReadoutVersionText, leftover.Trim()))
End If
releases = releases.Where(Function(x) x.Version IsNot Nothing).ToList()
Dim selectedReleases = releases.SkipWhile(Function(x) Not x.VersionText.IsDate AndAlso x.Version.Minor > currentVersion.Minor)
selectedReleases = selectedReleases.Where(Function(x) x.Version.Minor = currentVersion.Minor AndAlso x.Version.Build <= Math.Max(currentVersion.Build, 0))
If lastChangelogVersion IsNot Nothing Then
selectedReleases = selectedReleases.Where(Function(x) x.Version.Minor > lastChangelogVersion.Minor OrElse (x.Version.Minor = lastChangelogVersion.Minor AndAlso x.Version.Build > Math.Max(lastChangelogVersion.Build, 0)))
End If
selectedReleases = selectedReleases.ToList()
Dim result = ""
Dim versionLineBuilder = Function(version As Version, versionText As String) As String
Dim versionLiner = New String("."c, 50)
Return $"{versionLiner} v{version} [{versionText}] {versionLiner}"
End Function
If selectedReleases.Count() = 1 Then
result = selectedReleases.Select(Function(x) x.Changelog).First()
ElseIf selectedReleases.Count() > 1 Then
result = selectedReleases.Select(Function(x) $"{versionLineBuilder(x.Version, x.VersionText)}{BR2}{x.Changelog}").Join(BR2)
ElseIf force Then
Dim currentRelease = releases.Where(Function(x) x.Version.Minor = currentVersion.Minor AndAlso x.Version.Build = Math.Max(currentVersion.Build, 0)).ToList()
If currentRelease.Any() Then
Dim release = currentRelease.FirstOrDefault()
result = release.Changelog
End If
Else
If force Then
result = "Nothing to show..."
End If
End If
If Not String.IsNullOrWhiteSpace(result) Then
Using td As New TaskDialog(Of String)()
td.Title = $"What's new in {appDetails}:"
td.Icon = TaskIcon.Shield
td.Content = result
td.AddButton("OK")
Dim answer = td.Show()
s.ShowChangelog = appDetails
If Not force Then g.SaveSettings()
End Using
End If
End Using
End Using
End Sub
End Class