diff --git a/Encoding/AOMEnc.vb b/Encoding/AOMEnc.vb deleted file mode 100644 index 1bb48480..00000000 --- a/Encoding/AOMEnc.vb +++ /dev/null @@ -1,310 +0,0 @@ -Imports System.Text -Imports StaxRip.CommandLine -Imports StaxRip.UI - - -Public Class AOMEnc - Inherits BasicVideoEncoder - - Property ParamsStore As New PrimitiveStore - - Sub New() - Name = "AV1" - End Sub - - - Private ParamsValue As AV1Params - - Property Params As AV1Params - Get - If ParamsValue Is Nothing Then - ParamsValue = New AV1Params - ParamsValue.Init(ParamsStore) - End If - - Return ParamsValue - End Get - Set(value As AV1Params) - ParamsValue = value - End Set - End Property - - Overrides ReadOnly Property OutputExt As String - Get - Return "webm" - End Get - End Property - - Overrides Sub Encode() - p.Script.Synchronize() - Encode("Video encoding using aomenc " + Package.AOMEnc.Version, GetArgs(1, p.Script)) - - If Params.Mode.Value = 1 Then - Encode("Video encoding second pass using aomenc " + Package.AOMEnc.Version, GetArgs(2, p.Script)) - End If - - AfterEncoding() - End Sub - - Overloads Sub Encode(passName As String, commandLine As String) - p.Script.Synchronize() - - Using proc As New Proc - proc.Header = passName - proc.Package = Package.AOMEnc - proc.SkipString = "[ETA" - proc.File = "cmd.exe" - proc.Arguments = "/S /C """ + commandLine + """" - proc.Start() - End Using - End Sub - - Overloads Function GetArgs(pass As Integer, script As VideoScript, Optional includePaths As Boolean = True) As String - Return Params.GetArgs(pass, script, OutputPath.DirAndBase + OutputExtFull, includePaths, True) - End Function - - Overrides Function GetMenu() As MenuList - Dim r As New MenuList - r.Add("Encoder Options", AddressOf ShowConfigDialog) - r.Add("Container Configuration", AddressOf OpenMuxerConfigDialog) - Return r - End Function - - Shared WarningShown As Boolean - - Overrides Sub ShowConfigDialog() - If Not WarningShown Then - MsgWarn( -"Please note that AV1 is experimental!", -"The bitstream format is not yet frozen. It's very -likely that files created with the current encoder -become unplayable in the future.") - - WarningShown = True - End If - - Dim newParams As New AV1Params - Dim store = DirectCast(ObjectHelp.GetCopy(ParamsStore), PrimitiveStore) - newParams.Init(store) - - Using form As New CommandLineForm(newParams) - Dim saveProfileAction = Sub() - Dim enc = ObjectHelp.GetCopy(Of AOMEnc)(Me) - Dim params2 As New AV1Params - Dim store2 = DirectCast(ObjectHelp.GetCopy(store), PrimitiveStore) - params2.Init(store2) - enc.Params = params2 - enc.ParamsStore = store2 - SaveProfile(enc) - End Sub - - ActionMenuItem.Add(form.cms.Items, "Save Profile...", saveProfileAction).SetImage(Symbol.Save) - - If form.ShowDialog() = DialogResult.OK Then - Params = newParams - ParamsStore = store - OnStateChange() - End If - End Using - End Sub - - Overrides Property QualityMode() As Boolean - Get - Return Params.RateMode.OptionText.EqualsAny("CQ", "Q") - End Get - Set(Value As Boolean) - End Set - End Property - - Public Overrides ReadOnly Property CommandLineParams As CommandLineParams - Get - Return Params - End Get - End Property -End Class - -Public Class AV1Params - Inherits CommandLineParams - - Sub New() - Title = "aomenc Options" - Separator = "=" - End Sub - - Property Mode As New OptionParam With { - .Name = "Mode", - .Text = "Mode", - .Path = "Basic", - .Options = {"One Pass", "Two Pass"}} - - Property RateMode As New OptionParam With { - .Path = "Basic", - .Switch = "--end-usage", - .Text = "Rate Mode", - .Options = {"VBR", "CBR", "CQ", "Q"}} - - Property Custom As New StringParam With { - .Text = "Custom", - .Path = "Misc 1", - .AlwaysOn = True} - - Overrides ReadOnly Property Items As List(Of CommandLineParam) - Get - If ItemsValue Is Nothing Then - ItemsValue = New List(Of CommandLineParam) - - Add(Mode) - - Add(RateMode, - New OptionParam With {.Path = "Basic", .Switch = "--bit-depth", .Text = "Depth", .Options = {"8", "10", "12"}}, - New NumParam With {.Path = "Basic", .Switch = "--cq-level", .Text = "CQ Level"}, - New StringParam With {.Path = "Analysis", .Switch = "--tile-loopfilter", .Text = "Tile Loopfilter"}, - New OptionParam With {.Path = "Analysis", .Switch = "--tune", .Text = "Tune", .Options = {"Disabled", "PSNR", "SSIM", "Cdef-Dist", "Daala-Dist"}}, - New NumParam With {.Path = "Analysis", .Switch = "--tile-columns", .Text = "Tile Columns"}, - New NumParam With {.Path = "Analysis", .Switch = "--tile-rows", .Text = "Tile Rows"}, - New NumParam With {.Path = "Analysis", .Switch = "--num-tile-groups", .Text = "Num Tile Groups"}, - New NumParam With {.Path = "Analysis", .Switch = "--mtu-size", .Text = "MTU Size"}, - New BoolParam With {.Path = "Analysis", .Switch = "--output-partitions", .Text = "Output Partitions"}, - New BoolParam With {.Path = "Analysis", .Switch = "--disable-tempmv", .Text = "Disable temporal MV prediction", .IntegerValue = True}, - New OptionParam With {.Path = "Rate Control 1", .Switch = "--aq-mode", .Text = "AQ Mode", .IntegerValue = True, .Options = {"Disabled", "Variance", "Complexity", "Cyclic", "Refresh"}}, - New OptionParam With {.Path = "Rate Control 1", .Switch = "--deltaq-mode", .Text = "Delta QIndex Mode", .IntegerValue = True, .Options = {"Disabled", "Deltaq", "Deltaq + Deltalf"}}, - New BoolParam With {.Path = "Rate Control 1", .Switch = "--lossless", .Text = "Lossless", .IntegerValue = True}, - New BoolParam With {.Path = "Rate Control 1", .Switch = "--enable-qm", .Text = "Enable QM", .IntegerValue = True}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--bias-pct", .Text = "Bias PCT", .Config = {0, 100}}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--max-intra-rate", .Text = "Max Intra Rate"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--max-inter-rate", .Text = "Max Inter Rate"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--undershoot-pct", .Text = "Undershoot PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--overshoot-pct", .Text = "Overshoot PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--minsection-pct", .Text = "Minsection PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--maxsection-pct", .Text = "Maxsection PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--gf-cbr-boost", .Text = "GF CBR Boost"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--min-q", .Text = "Minimum Quantizer"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--max-q", .Text = "Maximum Quantizer"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--qm-min", .Text = "Min QM Flatness", .Init = 8, .Config = {0, 16}}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--qm-max", .Text = "Max QM Flatness", .Init = 16, .Config = {0, 16}}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--buf-sz", .Text = "Buffer Size"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--buf-initial-sz", .Text = "Buf Initial Size"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--buf-optimal-sz", .Text = "Buf Optimal Size"}, - New NumParam With {.Path = "Slice Decision", .Switch = "--kf-min-dist", .Text = "Min GOP Size"}, - New NumParam With {.Path = "Slice Decision", .Switch = "--kf-max-dist", .Text = "Max GOP Size"}, - New NumParam With {.Path = "Slice Decision", .Switch = "--lag-in-frames", .Text = "Lag In Frames"}, - New BoolParam With {.Path = "Slice Decision", .Switch = "--disable-kf", .Text = "Disable keyframe placement"}, - New StringParam With {.Path = "Input/Output", .Switch = "--timebase", .Text = "Timebase"}, - New NumParam With {.Path = "Input/Output", .Switch = "--input-bit-depth", .Text = "Input Bit Depth"}, - New NumParam With {.Path = "Input/Output", .Switch = "--fps", .Text = "Frame Rate"}, - New NumParam With {.Path = "Input/Output", .Switch = "--limit", .Text = "Limit"}, - New NumParam With {.Path = "Input/Output", .Switch = "--skip", .Text = "Skip"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--yv12", .Text = "YV12"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i420", .Text = "I420"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i422", .Text = "I422"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i444", .Text = "I444"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i440", .Text = "I440"}, - New OptionParam With {.Path = "VUI", .Switch = "--color-space", .Text = "Color Space", .Options = {"Unknown", "BT 2020", "BT 601", "BT 709", "SMPTE 170", "SMPTE 240", "sRGB"}}, - New OptionParam With {.Path = "VUI", .Switch = "--transfer-function", .Text = "Transfer Function", .Options = {"Unknown", "BT 709", "HLG", "PQ"}}, - New NumParam With {.Path = "Performance", .Switch = "--threads", .Text = "Threads"}, - New NumParam With {.Path = "Performance", .Switch = "--cpu-used", .Text = "CPUs Used", .Config = {0, 8}}, - New BoolParam With {.Path = "Performance", .Switch = "--frame-parallel", .Text = "Frame Parallel", .IntegerValue = True}, - New OptionParam With {.Path = "Statistic", .Switch = "--test-decode", .Text = "Test Decode", .Options = {"Disabled", "Fatal", "Warn"}}, - New BoolParam With {.Path = "Statistic", .Switch = "--psnr", .Text = "PSNR"}, - New BoolParam With {.Path = "Statistic", .Switch = "--debug", .Text = "Debug"}, - New BoolParam With {.Path = "Statistic", .Switch = "--disable-warnings", .Text = "Disable Warnings"}, - New BoolParam With {.Path = "Statistic", .Switch = "--disable-warning-prompt", .Text = "Disable Warning Prompt"}, - New BoolParam With {.Path = "Statistic", .Switch = "--quiet", .Text = "Quiet"}, - New NumParam With {.Path = "Frame Size", .Switch = "--width", .Text = "Width"}, - New NumParam With {.Path = "Frame Size", .Switch = "--height", .Text = "Height"}, - New NumParam With {.Path = "Frame Size", .Switch = "--resize-mode", .Text = "Resize Mode"}, - New NumParam With {.Path = "Frame Size", .Switch = "--resize-numerator", .Text = "Resize Numerator"}, - New NumParam With {.Path = "Frame Size", .Switch = "--resize-kf-numerator", .Text = "Resize KF Numerator"}, - Custom, - New StringParam With {.Path = "Misc 1", .Switch = "--error-resilient", .Text = "Error Resilient"}, - New StringParam With {.Path = "Misc 1", .Switch = "--deadline", .Text = "Deadline"}, - New StringParam With {.Path = "Misc 1", .Switch = "--q-hist", .Text = "Q-Hist"}, - New StringParam With {.Path = "Misc 1", .Switch = "--codec", .Text = "Codec"}, - New StringParam With {.Path = "Misc 1", .Switch = "--rate-hist", .Text = "Rate Hist"}, - New OptionParam With {.Path = "Misc 1", .Switch = "--stereo-mode", .Text = "Stereo Mode", .Options = {"None", "Mono", "Left-Right", "Bottom-Top", "Top-Bottom", "Right-Left"}}, - New OptionParam With {.Path = "Misc 1", .Switch = "--tune-content", .Text = "Tune Content", .Options = {"Default", "Screen"}}, - New OptionParam With {.Path = "Misc 1", .Switch = "--chroma-sample-position", .Text = "Chroma Sample Pos", .Options = {"Unknown", "Vertical", "Colocated"}}, - New BoolParam With {.Path = "Misc 1", .Switch = "--good", .Text = "Good"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--verbose", .Text = "Verbose"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--webm", .Text = "WEBM"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--ivf", .Text = "IVF"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--frame-boost", .Text = "Enable frame periodic boost", .IntegerValue = True}, - New NumParam With {.Path = "Misc 2", .Switch = "--usage", .Text = "Usage"}, - New NumParam With {.Path = "Misc 2", .Switch = "--profile", .Text = "Profile"}, - New NumParam With {.Path = "Misc 2", .Switch = "--drop-frame", .Text = "Drop Frame"}, - New NumParam With {.Path = "Misc 2", .Switch = "--auto-alt-ref", .Text = "Auto Alt Ref"}, - New NumParam With {.Path = "Misc 2", .Switch = "--sharpness", .Text = "Sharpness", .Config = {0, 7}}, - New NumParam With {.Path = "Misc 2", .Switch = "--static-thresh", .Text = "Static Thresh"}, - New NumParam With {.Path = "Misc 2", .Switch = "--arnr-maxframes", .Text = "ARNR Maxframes", .Config = {0, 15}}, - New NumParam With {.Path = "Misc 2", .Switch = "--arnr-strength", .Text = "ARNR Strength", .Config = {0, 6}}, - New NumParam With {.Path = "Misc 2", .Switch = "--noise-sensitivity", .Text = "Noise Sensitivity"}, - New NumParam With {.Path = "Misc 2", .Switch = "--min-gf-interval", .Text = "Min GF Interval"}, - New NumParam With {.Path = "Misc 2", .Switch = "--max-gf-interval", .Text = "Max GF Interval"}) - End If - - Return ItemsValue - End Get - End Property - - Public Overrides Sub ShowHelp(id As String) - g.ShowCommandLineHelp(Package.AOMEnc, id) - End Sub - - Shadows Sub Add(ParamArray items As CommandLineParam()) - For Each i In items - If i.HelpSwitch = "" Then - Dim switches = i.GetSwitches - If Not switches.NothingOrEmpty Then i.HelpSwitch = switches(0) - End If - - ItemsValue.Add(i) - Next - End Sub - - Overloads Overrides Function GetCommandLine(includePaths As Boolean, - includeExecutable As Boolean, - Optional pass As Integer = 1) As String - - Return GetArgs(1, p.Script, p.VideoEncoder.OutputPath.DirAndBase + - p.VideoEncoder.OutputExtFull, includePaths, includeExecutable) - End Function - - Overloads Function GetArgs(pass As Integer, - script As VideoScript, - targetPath As String, - includePaths As Boolean, - includeExecutable As Boolean) As String - - Dim sb As New StringBuilder - - If includePaths AndAlso includeExecutable Then - If p.Script.Engine = ScriptEngine.VapourSynth Then - sb.Append(Package.vspipe.Path.Escape + " " + script.Path.Escape + " - --y4m | " + Package.AOMEnc.Path.Escape + " -") - Else - sb.Append(Package.ffmpeg.Path.Escape + " -i " + script.Path.Escape + " -f yuv4mpegpipe -loglevel fatal -hide_banner - | " + Package.AOMEnc.Path.Escape + " -") - End If - End If - - Select Case Mode.Value - Case 0 - sb.Append(" --passes=1") - Case 1 - sb.Append(" --passes=2 --pass=" & pass) - End Select - - If Not RateMode.OptionText.EqualsAny("CQ", "Q") Then sb.Append(" --target-bitrate=" & p.VideoBitrate) - Dim q = From i In Items Where i.GetArgs <> "" - If q.Count > 0 Then sb.Append(" " + q.Select(Function(item) item.GetArgs).Join(" ")) - - If includePaths Then - If Mode.Value = 1 Then sb.Append(" --fpf=" + (p.TempDir + p.TargetFile.Base + ".txt").Escape) - sb.Append(" -o " + targetPath.Escape) - End If - - Return Macro.Expand(sb.ToString.Trim.FixBreak.Replace(BR, " ")) - End Function - - Public Overrides Function GetPackage() As Package - Return Package.AOMEnc - End Function -End Class \ No newline at end of file diff --git a/Encoding/VideoEncoder.vb b/Encoding/VideoEncoder.vb index 8e314348..c76a83fb 100644 --- a/Encoding/VideoEncoder.vb +++ b/Encoding/VideoEncoder.vb @@ -72,8 +72,6 @@ Public MustInherit Class VideoEncoder cl += " --transfer smpte2084" Case "BT.709" If height <= 576 Then cl += " --transfer bt709" - '' Case "HLG", "HLG / BT.2020" - '' cl += " --Transfer arib-std-b67" End Select Dim matrix_coefficients = MediaInfo.GetVideo(sourceFile, "matrix_coefficients") @@ -87,13 +85,15 @@ Public MustInherit Class VideoEncoder Dim MasteringDisplay_Luminance = MediaInfo.GetVideo(sourceFile, "MasteringDisplay_Luminance") If MasteringDisplay_ColorPrimaries <> "" AndAlso MasteringDisplay_Luminance <> "" Then - Dim match1 = Regex.Match(MasteringDisplay_ColorPrimaries, "R: x=([0-9\.]+) y=([0-9\.]+), G: x=([0-9\.]+) y=([0-9\.]+), B: x=([0-9\.]+) y=([0-9\.]+), White point: x=([0-9\.]+) y=([0-9\.]+)") + Dim match1 = Regex.Match(MasteringDisplay_ColorPrimaries, "BT.2020") + ''Dim match1 = Regex.Match(MasteringDisplay_ColorPrimaries, "R: x=([0-9\.]+) y=([0-9\.]+), G: x=([0-9\.]+) y=([0-9\.]+), B: x=([0-9\.]+) y=([0-9\.]+), White point: x=([0-9\.]+) y=([0-9\.]+)") Dim match2 = Regex.Match(MasteringDisplay_Luminance, "min: ([0-9\.]+) cd/m2, max: ([0-9\.]+)") If match1.Success AndAlso match2.Success Then - Dim strings1 = match1.Groups.OfType(Of Group).Skip(1).Select(Function(group) CInt(group.Value.ToDouble * 50000).ToString) + ''Dim strings1 = match1.Groups.OfType(Of Group).Skip(1).Select(Function(group) CInt(group.Value.ToDouble * 50000).ToString) Dim strings2 = match2.Groups.OfType(Of Group).Skip(1).Select(Function(group) CInt(group.Value.ToDouble * 10000).ToString) - cl += $" --master-display ""G({strings1(2)},{strings1(3)})B({strings1(4)},{strings1(5)})R({strings1(0)},{strings1(1)})WP({strings1(6)},{strings1(7)})L({strings2(1)},{strings2(0)})""" + cl += "--master-display ""G(8500,39850)B(6550,2300)R(35400,14600)WP(15635,16450)L(10000000,1)""" + ''cl += $" --master-display ""G({strings1(2)},{strings1(3)})B({strings1(4)},{strings1(5)})R({strings1(0)},{strings1(1)})WP({strings1(6)},{strings1(7)})L({strings2(1)},{strings2(0)})""" cl += " --range limited" End If End If @@ -310,9 +310,17 @@ Public MustInherit Class VideoEncoder Gif.Name = "Command Line | Gif Maker" Gif.QualityMode = True Gif.Muxer = New NullMuxer("No Muxing") - Gif.CommandLines = "x264 --pass 1 --bitrate %video_bitrate% --stats ""%target_temp_file%.stats"" --output NUL ""%script_file%"" || exit" + BR + "x264 --pass 2 --bitrate %video_bitrate% --stats ""%target_temp_file%.stats"" --output ""%encoder_out_file%"" ""%script_file%""" + Gif.CommandLines = "ffmpeg -i ""%script_file%"" -vf ""fps=15,scale=%target_width%:-1:flags=spline,palettegen=stats_mode=diff"" -loglevel quiet -y ""%target_temp_file%.png"" || exit" + BR + "ffmpeg -i ""%script_file%"" -i ""%target_temp_file%.png"" -lavfi ""fps=15,scale=%target_width%:-1:flags=spline [x]; [x][1:v] paletteuse=dither=floyd_steinberg"" -loglevel quiet -y ""%target_file%""" ret.Add(Gif) + Dim Thumbs As New BatchEncoder() + Thumbs.OutputFileTypeValue = "jpg" + Thumbs.Name = "Command Line | jpg Maker" + Thumbs.QualityMode = True + Thumbs.Muxer = New NullMuxer("No Muxing") + Thumbs.CommandLines = "wsl python Thumbnailer.py /mnt/c/Users/Revan/Desktop/mtn/mtn ""/mnt/c/Users/Revan/Desktop/Lara.avi"" -c 4 -r 6 -w 1280 -h 150 -j 95 -D 12 -O /mnt/c/Users/Revan/Desktop -f /mnt/c/Users/Revan/Desktop/mtn/LiberationMono-Bold.ttf" + ret.Add(Thumbs) + Dim x264cli As New BatchEncoder() x264cli.OutputFileTypeValue = "h264" x264cli.Name = "Command Line | x264" @@ -526,7 +534,22 @@ Public Class BatchEncoder Return {" [ETA ", ", eta ", "frames: ", "frame= "} End If End Function + Function GetLinuxShell(value As String) As String + Dim ret = "" + + For Each pack In Package.Items.Values + If TypeOf pack Is PluginPackage Then Continue For + Dim dir = pack.GetDir + If Not Directory.Exists(dir) Then Continue For + If Not dir.Contains(Folder.Startup) Then Continue For + If value.ToLower.Contains(pack.Name.ToLower) Then + ret += "PATH=""""" + dir + """" + BR + End If + Next + + Return ret + BR + value + End Function Function GetBatchCode(value As String) As String Dim ret = "" diff --git a/Encoding/ffmpegEnc.vb b/Encoding/ffmpegEnc.vb index 8df1677a..4d195a79 100644 --- a/Encoding/ffmpegEnc.vb +++ b/Encoding/ffmpegEnc.vb @@ -142,7 +142,7 @@ Public Class ffmpegEnc .Switch = "-c:v", .Text = "Codec", .AlwaysOn = True, - .Options = {"x264", "x265", "VP8", "VP9", "Xvid", "ASP", "Theora", "ProRes", "UT Video", "Intel | Intel H.264", "Intel | Intel H.265", "Nvidia | Nvidia H.264", "Nvidia | Nvidia H.265"}, + .Options = {"x264", "x265", "VP8", "VP9", "XviD", "ASP", "Theora", "ProRes", "UT Video", "Intel | Intel H.264", "Intel | Intel H.265", "Nvidia | Nvidia H.264", "Nvidia | Nvidia H.265"}, .Values = {"libx264", "libx265", "libvpx", "libvpx-vp9", "libxvid", "mpeg4", "libtheora", "prores", "utvideo", "h264_qsv", "hevc_qsv", "h264_nvenc", "hevc_nvenc"}} Property Mode As New OptionParam With { @@ -224,7 +224,7 @@ Public Class ffmpegEnc ret += $" -b:v {p.VideoBitrate}k" End Select - If Codec.OptionText = "Xvid" Then ret += " -tag:v xvid" + If Codec.OptionText = "XviD" Then ret += " -tag:v xvid" Dim targetPath As String If Mode.OptionText = "Two Pass" AndAlso pass = 1 Then diff --git a/Encoding/x265Enc.vb b/Encoding/x265Enc.vb index e3f5ae48..fbd9ce2e 100644 --- a/Encoding/x265Enc.vb +++ b/Encoding/x265Enc.vb @@ -520,7 +520,7 @@ Public Class x265Params .Switch = "--profile", .Text = "Profile", .Value = 2, - .Options = {"Unrestricted", "Main", "Main 10", "Main - Intra", "Main Still Picture", "Main 422 - 8", "Main 444 - Intra", "Main 444 - Still Picture", "Main 444 - 8", "Main 10 - Intra", "Main 422 - 10", "Main 422 - 10 - Intra", "Main 444 - 10", "Main 444 - 10 - Intra", "main12", "main12-intra", "main422-12", "main422-12-intra", "main444-12", "main444-12-intra"}} + .Options = {"Unrestricted", "Main", "Main 10", "Main - Intra", "Main Still Picture", "Main 422 - 8", "Main 444 - Intra", "Main 444 - Still Picture", "Main 444 - 8", "Main 10 - Intra", "Main 422 - 10", "Main 422 - 10 - Intra", "Main 444 - 10", "Main 444 - 10 - Intra", "Main12", "Main12-intra", "Main422-12", "Main422-12-intra", "Main444-12", "Main444-12-intra"}} Property OutputDepth As New OptionParam With { .Switch = "--output-depth", @@ -850,7 +850,7 @@ Public Class x265Params New OptionParam With {.Switch = "--transfer", .Text = "Transfer", .Options = {"Undefined", "ARIB-STD-B67", "BT 1361 E", "BT 2020-10", "BT 2020-12", "BT 470 BG", "BT 470 M", "BT 709", "IEC 61966-2-1", "IEC 61966-2-4", "Linear", "Log 100", "Log 316", "SMPTE 170 M", "SMPTE 2084", "SMPTE 240 M", "SMPTE 428"}}, New OptionParam With {.Switch = "--overscan", .Text = "Overscan", .Options = {"Undefined", "Show", "Crop"}}, New OptionParam With {.Switch = "--range", .Text = "Range", .Options = {"Undefined", "Limited", "Full"}}, - minLuma, maxLuma, MaxCLL, MaxFALL, + Chromaloc, minLuma, maxLuma, MaxCLL, MaxFALL, New BoolParam With {.Switch = "--hdr", .Text = "Force signalling of HDR parameters in SEI packets"}, New BoolParam With {.Switch = "--hdr-opt", .Text = "Add luma and chroma offsets for HDR/WCG content"}, New BoolParam With {.Switch = "--dhdr10-opt", .Text = "Limit frames for which tone mapping information is inserted as SEI message"}) diff --git a/Resources/FontAwesome.ttf b/FontAwesome.ttf similarity index 100% rename from Resources/FontAwesome.ttf rename to FontAwesome.ttf diff --git a/Forms/MainForm.vb b/Forms/MainForm.vb index 6d95b4ed..cc158a1b 100644 --- a/Forms/MainForm.vb +++ b/Forms/MainForm.vb @@ -4296,8 +4296,9 @@ Public Class MainForm ret.Add("Tools|Folders|Working", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%working_dir%"""}) ret.Add("Tools|Advanced", Symbol.More) - If Application.StartupPath = "D:\Projekte\VS\VB\StaxRip\bin" Then ret.Add("Tools|Advanced|Test...", NameOf(g.DefaultCommands.Test), Keys.F12) + If Application.StartupPath = "C:\Users\Revan\Desktop\staxrip-1.8.2.0\bin" Then ret.Add("Tools|Advanced|Test...", NameOf(g.DefaultCommands.Test), Keys.F12) ret.Add("Tools|Advanced|Video Comparison...", NameOf(ShowVideoComparison)) + ret.Add("Tools|Advanced|Bash Prompt", NameOf(g.DefaultCommands.BashCommandPrompt), Symbol.fa_terminal) ret.Add("Tools|Advanced|Command Prompt", NameOf(g.DefaultCommands.ShowCommandPrompt), Symbol.fa_terminal) ret.Add("Tools|Advanced|PowerShell", NameOf(g.DefaultCommands.ShowPowerShell), Keys.Control Or Keys.P, Symbol.fa_terminal) ret.Add("Tools|Advanced|Event Commands...", NameOf(ShowEventCommandsDialog), Symbol.LightningBolt) @@ -4306,13 +4307,17 @@ Public Class MainForm ret.Add("Tools|Advanced|LAV Filters video decoder configuration...", NameOf(ShowLAVFiltersConfigDialog), Symbol.Filter) ret.Add("Tools|Advanced|MediaInfo Folder View...", NameOf(ShowMediaInfoFolderViewDialog), Symbol.Info) ret.Add("Tools|Advanced|Reset Setting...", NameOf(ResetSettings)) - ret.Add("Tools|Advanced|Thumbnails Generator...", NameOf(ShowBatchGenerateThumbnailsDialog)) + ret.Add("Tools|Advanced|Thumbnails|StaxRip Thumbnail Generator", NameOf(ShowBatchGenerateThumbnailsDialog)) + ret.Add("Tools|Advanced|Thumbnails|MTN Thumbnail Generator", NameOf(g.DefaultCommands.MTNCommand)) + ret.Add("Tools|Advanced|Thumbnails|VCS Thumbnail Generator", NameOf(g.DefaultCommands.VCSPythonPrompt)) ret.Add("Tools|Scripts", NameOf(DynamicMenuItem), Symbol.Code, {DynamicMenuItemID.Scripts}) ret.Add("Tools|Edit Menu...", NameOf(ShowMainMenuEditor)) ret.Add("Tools|Settings...", NameOf(ShowSettingsDialog), Symbol.Settings, {""}) ret.Add("Apps|AVSMeter", NameOf(g.DefaultCommands.StartTool), {"AVSMeter"}) + ret.Add("Apps|MKVInfo", NameOf(g.DefaultCommands.StartTool), {"MKVInfo"}) + ret.Add("Apps|MKVHDR", NameOf(g.DefaultCommands.StartTool), {"MKVHDR"}) ret.Add("Apps|BDSup2Sub++", NameOf(g.DefaultCommands.StartTool), {"BDSup2Sub++"}) ret.Add("Apps|DGIndex", NameOf(g.DefaultCommands.StartTool), {"DGIndex"}) ret.Add("Apps|DGIndexNV", NameOf(g.DefaultCommands.StartTool), {"DGIndexNV"}) @@ -5483,6 +5488,52 @@ Public Class MainForm SourceFileMenu.Add("Paste", Sub() tbSourceFile.Paste(), "Copies the full source file path to the clipboard.", Clipboard.GetText.Trim <> "").SetImage(Symbol.Paste) End Sub + + Sub ShowBatchGenerateThumbnailsDialog() + Using fd As New OpenFileDialog + fd.Title = "Select files" + fd.SetFilter(FileTypes.Video) + fd.Multiselect = False + + If fd.ShowDialog = DialogResult.OK Then + Using f As New SimpleSettingsForm("Thumbnail Options") + f.ScaleClientSize(27, 15) + + Dim ui = f.SimpleUI + Dim page = ui.CreateFlowPage("main page") + ui.Store = s + page.SuspendLayout() + + Dim row As SimpleUI.NumBlock + Dim interval As SimpleUI.NumBlock + + Dim mode = ui.AddMenu(Of Integer) + Dim m = ui.AddMenu(Of Integer) + + Dim nb = ui.AddNum() + nb.Text = "Thumbnail Width:" + nb.Config = {200, 4000, 10} + nb.NumEdit.Value = s.Storage.GetInt("Thumbnail Width", 500) + nb.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Width", CInt(value)) + + nb = ui.AddNum() + nb.Text = "Column Count:" + nb.Config = {1, 1000} + nb.NumEdit.Value = s.Storage.GetInt("Thumbnail Columns", 3) + nb.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Columns", CInt(value)) + + row = ui.AddNum() + row.Text = "Row Count:" + row.Config = {1, 1000} + row.NumEdit.Value = s.Storage.GetInt("Thumbnail Rows", 12) + row.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Rows", CInt(value)) + + interval = ui.AddNum() + interval.Text = "Interval (seconds):" + interval.NumEdit.Value = s.Storage.GetInt("Thumbnail Interval") + interval.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Interval", CInt(value)) + + Sub ShowBatchGenerateThumbnailsDialog() Using fd As New OpenFileDialog @@ -5577,7 +5628,6 @@ Public Class MainForm End If End Using End Sub - Sub ShowMediaInfoFolderViewDialog() Using d As New FolderBrowserDialog diff --git a/Forms/MediaInfoFolderViewForm.vb b/Forms/MediaInfoFolderViewForm.vb index 1d487526..2fac3d52 100644 --- a/Forms/MediaInfoFolderViewForm.vb +++ b/Forms/MediaInfoFolderViewForm.vb @@ -62,7 +62,7 @@ Public Class MediaInfoFolderViewForm MyBase.New() InitializeComponent() - Icon = My.Resources.RipIcon + Icon = My.Resources.MainIcon lv.View = View.Details lv.FullRowSelect = True diff --git a/General/GlobalCommands.vb b/General/GlobalCommands.vb index d3e6a9c5..773bd28a 100644 --- a/General/GlobalCommands.vb +++ b/General/GlobalCommands.vb @@ -78,6 +78,73 @@ Public Class GlobalCommands Sub StartJobs() g.ProcessJobs() End Sub + + Sub MTNCommand() + Dim val As String + 'g.DefaultCommands.ExecuteCommandLine(Package.Items("AVSMeter").Path.Escape+ " -avsinfo" + BR + "pause", False, False, True) + + If p.TempDir <> "" Then val += "cd \""" + p.TempDir + """" + g.StartProcess("powershell.exe", "-command wsl python3 '/mnt/c/Users/Revan/Desktop/Thumbnailer.py'" + val) + End Sub + + Sub VCSPythonPrompt() + Dim batchCode = "" + + For Each pack In Package.Items.Values + If TypeOf pack Is PluginPackage Then Continue For + Dim dir = pack.GetDir + If Not Directory.Exists(dir) Then Continue For + If Not dir.Contains(Folder.Startup) Then Continue For + + batchCode += "@set PATH=" + dir + ";%PATH%" + BR + batchCode += "wsl python3 '/mnt/c/Users/Revan/Desktop/Thumbnailer.py'" + Next + + Dim batchPath = Folder.Temp + Guid.NewGuid.ToString + ".bat" + Proc.WriteBatchFile(batchPath, batchCode) + + AddHandler g.MainForm.Disposed, Sub() FileHelp.Delete(batchPath) + + Dim batchProcess As New Process + batchProcess.StartInfo.FileName = "cmd.exe" + batchProcess.StartInfo.Arguments = "/C """ + batchPath + """" + batchProcess.StartInfo.WorkingDirectory = p.TempDir + batchProcess.Start() + End Sub + + + + ' + 'Sub VCSCommand() + + ' Using fd As New OpenFileDialog + ' fd.Title = "Select files" + ' fd.SetFilter(FileTypes.Video) + ' fd.Multiselect = False + + ' g. + + ' If fd.ShowDialog = DialogResult.OK Then + + ' p.StartInfo.FileName = "C:\Python33\python.exe" + + ' Dim Val As String + ' Dim Cmds As String + ' Cmds += "wsl python3 VCS.py " + ' If p.TempDir <> "" Then Val += "cd \""" + p.TempDir + """" + ' g.DefaultCommands.BashCommandPrompt() + ' g.StartProcess("python3 VCS.py " + p.SourceFile + " /mnt/c/users/Revan/Desktop/vcs.bash") + ' End If + ' End Using + 'End Sub + + + Sub BashCommandPrompt() + Dim val As String + + If p.TempDir <> "" Then val += "cd \""" + p.TempDir + """" + g.StartProcess("powershell.exe", "-noexit -command bash" + val) + End Sub Sub ShowCommandPrompt() @@ -103,7 +170,6 @@ Public Class GlobalCommands batchProcess.StartInfo.WorkingDirectory = p.TempDir batchProcess.Start() End Sub - Sub ShowPowerShell() Dim val As String @@ -384,22 +450,6 @@ Public Class GlobalCommands If x265Missing.Count > 0 Then msg += BR2 + "# Removed from x265" + BR2 + x265Missing.Join(" ") If x265Unknown.Count > 0 Then msg += BR2 + "# x265 Todo" + BR2 + x265Unknown.Join(" ") - '' Dim aomExcept = "--output".Split((" " + BR).ToCharArray()) - '' Dim aomCodeExcept = "--y4m".Split((" " + BR).ToCharArray()) - '' Dim aomHelp = ProcessHelp.GetErrOut(Package.AOMEnc.Path, Nothing) - '' File.WriteAllText(Package.AOMEnc.GetDir + "aomenc.txt", aomHelp) - '' aomHelp = aomHelp.Replace("(no-)", "").Replace("--no-", "--") - '' Dim aomHelpSwitches = Regex.Matches(aomHelp, "--[\w-]+").OfType(Of Match)().Select(Function(x) x.Value) - '' Dim aomCode = File.ReadAllText(Folder.Startup.Parent + "Encoding\aomenc.vb").Replace("--no-", "--") - '' Dim aomPresentInCode = Regex.Matches(aomCode, "--[\w-]+").OfType(Of Match)().Select(Function(x) x.Value) - '' Dim aomMissing = aomPresentInCode.Where(Function(arg) Not aomHelpSwitches.Contains(arg) AndAlso Not aomCodeExcept.Contains(arg)) - '' Dim aomUnknown = aomHelpSwitches.Where(Function(x) Not aomPresentInCode.Contains(x) AndAlso Not aomExcept.Contains(x)).ToList() - '' aomUnknown.Sort() - '' Dim aomNoNeedToExcept = aomExcept.Where(Function(arg) aomPresentInCode.Contains(arg)) - '' If aomNoNeedToExcept.Count > 0 Then msg += BR2 + "# Unnecessary aomenc Exception:" + BR2 + aomNoNeedToExcept.Join(" ") - '' If aomMissing.Count > 0 Then msg += BR2 + "# Removed from aomenc" + BR2 + aomMissing.Join(" ") - '' If aomUnknown.Count > 0 Then msg += BR2 + "# aomenc Todo" + BR2 + aomUnknown.Join(" ") - File.WriteAllText(Package.fdkaac.GetDir + "help.txt", ProcessHelp.GetStdOut(Package.fdkaac.Path, "-h")) For Each pack In Package.Items.Values @@ -459,10 +509,10 @@ Public Class GlobalCommands End If Next - supportedTools.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\tools.rst") + supportedTools.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\tools.rst") Dim screenshots = "Screenshots" + BR + "===========" + BR2 + ".. contents::" + BR2 - Dim screenshotFiles = Directory.GetFiles("C:\Users\Revan\Desktop\StaxRip.Source\docs\screenshots").ToList + Dim screenshotFiles = Directory.GetFiles("D:\Projekte\VS\VB\StaxRip\docs\screenshots").ToList screenshotFiles.Sort(New StringLogicalComparer) For Each i In screenshotFiles @@ -470,7 +520,7 @@ Public Class GlobalCommands screenshots += name + BR + "-".Multiply(name.Length) + BR2 + ".. image:: screenshots/" + i.FileName + BR2 Next - screenshots.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\screenshots.rst") + screenshots.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\screenshots.rst") Dim macros = "Macros" + BR + "======" + BR2 @@ -478,7 +528,7 @@ Public Class GlobalCommands macros += "``" + i.Name + "``" + BR2 + i.Value + BR2 Next - macros.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\macros.rst") + macros.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\macros.rst") Dim powershell = "PowerShell Scripting ==================== @@ -515,18 +565,18 @@ Default Scripts --------------- " - Dim psdir = "C:\Users\Revan\Desktop\StaxRip.Source\docs\powershell\" + Dim psdir = "D:\Projekte\VS\VB\StaxRip\docs\powershell\" DirectoryHelp.Delete(psdir) Directory.CreateDirectory(psdir) - For Each i In Directory.GetFiles("C:\Users\Revan\Desktop\StaxRip.Source\bin\Apps\Scripts") + For Each i In Directory.GetFiles("D:\Projekte\VS\VB\StaxRip\bin\Apps\Scripts") FileHelp.Copy(i, psdir + i.FileName) Dim filename = i.FileName powershell += filename + BR + "~".Multiply(filename.Length) + BR2 powershell += ".. literalinclude:: " + "powershell/" + i.FileName + BR + " :language: powershell" + BR2 Next - powershell.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\powershell.rst") + powershell.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\powershell.rst") Dim switches = "Command Line Interface ====================== @@ -595,7 +645,7 @@ Switches switches += command.Attribute.Description + BR2 + BR Next - switches.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\cli.rst") + switches.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\cli.rst") If msg <> "" Then Dim fs = Folder.Temp + "staxrip todo.txt" diff --git a/General/Package.vb b/General/Package.vb index 9663b613..f5099ec8 100644 --- a/General/Package.vb +++ b/General/Package.vb @@ -53,6 +53,7 @@ Public Class Package End Property Shared Property Items As New SortedDictionary(Of String, Package) + Shared Property Python As Package = Add(New PythonPackage) Shared Property DGIndexIM As Package = Add(New DGIndexIMPackage) Shared Property DGIndexNV As Package = Add(New DGIndexNVPackage) @@ -154,6 +155,28 @@ Public Class Package .WebURL = "http://forum.doom9.org/showthread.php?p=1613303", .Description = "Converts Blu-ray subtitles to other formats like VobSub."}) + Shared Property VCS As Package = Add(New Package With { + .Name = "VCS", + .Filename = "vcs.bash", + .DirPath = "/Apps/Thumbnailer", + .Description = "This is a bash script meant to create video contact sheets (previews) of videos.", + .WebURL = "http://p.outlyer.net/vcs", + .HelpURL = "http://p.outlyer.net/vcs/docs"}) + + Shared Property Thumbnailer As Package = Add(New Package With { + .Name = "Thumbnailer", + .Filename = "VCS.py", + .DirPath = "/Apps/Thumbnailer", + .Description = "Custom Launcher Script for VCS"}) + + Shared Property MTN As Package = Add(New Package With { + .Name = "MTN", + .Filename = "mtn", + .DirPath = "/Apps/Thumbnailer", + .Description = "movie thumbnailer saves thumbnails (screenshots) of movie or video files to jpeg files. StaxRip uses a custom built version with HEVC support added in and also includes the latest FFMPEG.", + .WebURL = "http://moviethumbnail.sourceforge.net/", + .HelpURL = "http://moviethumbnail.sourceforge.net/usage.en.html"}) + Shared Property SubtitleEdit As Package = Add(New Package With { .Name = "SubtitleEdit", .Filename = "SubtitleEdit.exe", @@ -172,15 +195,6 @@ Public Class Package .URL = "https://portableapps.com/apps/music_video/potplayer-portable", .Description = "mpv is a fork of mplayer2 and MPlayer. It shares some features with the former projects while introducing many more."}) - '' Shared Property AOMEnc As Package = Add(New Package With { - ''.Name = "aomenc", - ''.Filename = "aomenc.exe", - ''.HelpFile = "aomenc.txt", - ''.WebURL = "http://aomedia.org", - ''.DownloadURL = "http://tmod.nmm-hd.org/aom/", - ''.IsRequiredFunc = Function() TypeOf p.VideoEncoder Is AOMEnc, - ''.Description = "AOMedia Video 1 (AV1) is an open, royalty-free video coding format designed for video transmissions over the Internet."}) - Shared Property modPlus As Package = Add(New PluginPackage With { .Name = "modPlus", .Filename = "modPlus.dll", @@ -245,16 +259,17 @@ Public Class Package .HelpURL = "http://f3kdb.readthedocs.io/en/latest/#", .Description = "Simple debanding filter that can be quite effective for some anime sources.", .VSFilterNames = {"f3kdb.Deband"}, - .VSFiltersFunc = Function() {New VideoFilter("Misc", "F3KDB...", "clip = core.f3kdb.Deband(clip, preset = ""$select:msg:Select a preset.;depth;low;medium;high;veryhigh;nograin;luma;chroma$"")")}, .AvsFilterNames = {"f3kdb"}}) - ''.AvsFiltersFunc = Function() {New VideoFilter("Misc", "F3KDB...", "f3kdb(preset = ""$select:msg:Select a preset.;depth;low;medium;high;veryhigh;nograin;luma;chroma$"")")}}) Shared Property vinverse As Package = Add(New PluginPackage With { .Name = "vinverse", .Filename = "vinverse.dll", .WebURL = "http://avisynth.nl/index.php/Vinverse", .Description = "A modern rewrite of a simple but effective plugin to remove residual combing originally based on an AviSynth script by Didée and then written as a plugin by tritical.", - .AvsFilterNames = {"vinverse", "vinverse2"}}) + .AvsFilterNames = {"vinverse", "vinverse2"}, + .AvsFiltersFunc = Function() { + New VideoFilter("Restoration", "RCR | Vinverse", "vinverse()"), + New VideoFilter("Restoration", "RCR | Vinverse2", "vinverse2()")}}) Shared Property scenechange As Package = Add(New PluginPackage With { .Name = "scenechange", @@ -266,7 +281,6 @@ Public Class Package .Filename = "avs2pipemod64.exe", .WebURL = "http://github.com/chikuzen/avs2pipemod", .Description = "Given an AviSynth script as input, avs2pipemod can send video, audio, or information of various types to stdout for consumption by command line encoders or other tools."}) - Shared ReadOnly Property x264 As Package Get If IsX264_10Required() Then Return x264_10 Else Return x264_8 @@ -397,7 +411,6 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/SangNom2", .Description = "SangNom2 is a reimplementation of MarcFD's old SangNom filter. Originally it's a single field deinterlacer using edge-directed interpolation but nowadays it's mainly used in anti-aliasing scripts. The output is not completely but mostly identical to the original SangNom.", .AvsFilterNames = {"SangNom2"}}) - Shared Function Add(pack As Package) As Package Items(pack.ID) = pack Return pack @@ -465,6 +478,26 @@ Public Class Package .HelpFile = "doc\AVSMeter.html", .WebURL = "http://forum.doom9.org/showthread.php?t=174797"}) + Add(New Package With { + .Name = "MKVInfo", + .Filename = "MKVInfo.exe", + .DirPath = "Apps/MKVToolNix", + .Description = "MKVToolNix is a set of tools to create, alter and inspect Matroska files", + .StartActionValue = Sub() + g.DefaultCommands.ExecuteCommandLine(Package.Items("MKVInfo").Path.Escape + " " + p.SourceFile + BR + "pause", False, False, True) + End Sub, + .WebURL = "https://mkvtoolnix.download/doc/mkvinfo.html"}) + + Add(New Package With { + .Name = "MKVHDR", + .Filename = "MKVInfo.exe", + .DirPath = "Apps/MKVToolNix", + .Description = "MKVToolNix is a set of tools to create, alter and inspect Matroska files", + .StartActionValue = Sub() + g.DefaultCommands.ExecuteCommandLine(Package.Items("MKVInfo").Path.Escape + " " + "-o " + p.SourceFile + " --colour-matrix 0:9 --colour-range 0:1 --colour-transfer-characteristics 0:16 --colour-primaries 0:9 --max-content-light 0:1000 --max-frame-light 0:300 --max-luminance 0:1000 --min-luminance 0:0.01 --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 --white-colour-coordinates 0:0.3127,0.3290 " + p.TargetFile + BR + "pause", False, False, True) + End Sub, + .WebURL = "https://mkvtoolnix.download/doc/mkvinfo.html"}) + Add(New PluginPackage With { .Name = "KNLMeansCL", .Filename = "KNLMeansCL.dll", @@ -505,8 +538,6 @@ Public Class Package .AvsFilterNames = {"DSS2"}, .AvsFiltersFunc = Function() {New VideoFilter("Source", "DSS2", "DSS2(""%source_file%"")")}}) - ''Start of Custom Plugins - Add(New PluginPackage With { .Name = "Deblock", .Filename = "Deblock.dll", @@ -574,7 +605,7 @@ Public Class Package .Filename = "Shader.avsi", .HelpFile = "Readme.txt", .WebURL = "http://avisynth.nl/index.php/Shader", - .AvsFilterNames = {"SuperRes", "SuperResXBR", "SuperXBR", "ResizeShader", "Shader", "ShaderExecute", "ConvertToShader", "ConvertFromShader"}}) + .AvsFilterNames = {"SuperRes", "SuperResXBR", "SuperXBR", "ResizeShader", "SuperResPass", "SuperXbrMulti", "ResizeShader", "ResizeInternal", "CreateParamXY", "CreateParamDivXY", "CreateParamFloat4"}}) Add(New PluginPackage With { .Name = "Shader DLL", @@ -582,7 +613,7 @@ Public Class Package .Filename = "Shader.dll", .HelpFile = "Readme.txt", .WebURL = "http://avisynth.nl/index.php/Shader", - .AvsFilterNames = {"SuperRes", "SuperResXBR", "SuperXBR", "ResizeShader", "Shader", "ShaderExecute", "ConvertToShader", "ConvertFromShader"}}) + .AvsFilterNames = {"Shader", "ShaderExecute", "ConvertToShader", "ConvertFromShader"}}) Add(New PluginPackage With { .Name = "JincResize", @@ -795,8 +826,8 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/MAA2", .AvsFilterNames = {"MAA2", "Sangnom2AA", "maa2ee"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "Anti-Aliasing | MAA2 | MMA2 with nnedi3", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0, ext_aa=nnedi3_resize16())"), - New VideoFilter("Line", "Anti-Aliasing | MAA2 | MMA2", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0)")}}) + New VideoFilter("Line", "MAA2 | MMA2 with nnedi3", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0, ext_aa=nnedi3_resize16())"), + New VideoFilter("Line", "MAA2 | MMA2", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0)")}}) Add(New PluginPackage With { .Name = "DAA3Mod", @@ -805,8 +836,8 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/daa3", .AvsFilterNames = {"daa3mod", "mcdaa3"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "Anti-Aliasing | DAA3 | MCDAA3", "mcdaa3()"), - New VideoFilter("Line", "Anti-Aliasing | DAA3 | DAA3", "daa3mod()")}}) + New VideoFilter("Line", "DAA3 | MCDAA3", "mcdaa3()"), + New VideoFilter("Line", "DAA3 | DAA3", "daa3mod()")}}) Add(New PluginPackage With { .Name = "eedi3_resize", @@ -832,7 +863,7 @@ Public Class Package .WebURL = "http://avisynth.nl", .AvsFilterNames = {"DeNoiseMD1", "BlendClips", "Range8to16", "DenoiseMD2"}, .AvsFiltersFunc = Function() { - New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD 16Bit", "DeNoiseMD1(sigma=4, overlap=2, thcomp=80, str=0.8)" + BR + "#Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), + New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD 16Bit", "DeNoiseMD1(sigma=4, overlap=2, thcomp=80, str=0.8)" + BR + "Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD Histogram", "a = last" + BR + "DenoiseMD1(sigma = 4, overlap = 2, thcomp = 80, str = 0.8)" + BR + "b = last.DitherPost(mode = -1)" + BR + "DiffCol(a, b, col = 1, colnum = 4, hista = False, histb = False)"), New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD 8Bit", "DeNoiseMD1(sigma=4, overlap=2, thcomp=80, str=0.8)" + BR + "#Functions" + BR + "DitherPost(mode=7, ampo=1, ampn=0)")}}) @@ -843,7 +874,7 @@ Public Class Package .WebURL = "http://avisynth.nl", .AvsFilterNames = {"DeNoiseMF1", "DenoiseMF2"}, .AvsFiltersFunc = Function() { - New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF 16Bit", "DenoiseMF2(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8, gpu=$select:msg:Use GPU Enabled Feature?;True;False$)" + BR + "#Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), + New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF 16Bit", "DenoiseMF2(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8, gpu=$select:msg:Use GPU Enabled Feature?;True;False$)" + BR + "#Functions" + BR + "#16Bit Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF Histogram", "a = last" + BR + "DenoiseMF1(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8)" + BR + "b = last.DitherPost(mode = -1)" + BR + "DiffCol(a, b, col = 1, colnum = 4, hista = False, histb = False)"), New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF 8Bit", "DenoiseMF2(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8, gpu=$select:msg:Use GPU Enabled Feature?;True;False$)" + BR + "#Functions" + BR + "DitherPost(mode=7, ampo=1, ampn=0)")}}) @@ -915,87 +946,87 @@ Public Class Package ''.HelpFile = "HDRColor.txt", ''.AvsFilterNames = {"cube", "Repair Y", "DynRangeY", "DynRange", "Color"}, ''.AvsFiltersFunc = Function() { - '' New VideoFilter("Color", "HDRCore | HDRColor | Cube", "Cube(file=""$browse_file$"", from=$select:msg:Select Input Color Space;601;709;2020$, to=$select:msg:Select Output Color Space;601;709;2020$, rg=1.0, gg=1.0, bg=1.0, $select:msg:Select the Range you Wish to Use;TV Range|a=16, b=235, ao=16, bo=235;PC Range|a=0, b=255, ao=0, bo=255$, sat=1.0, sato=1.0, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - '' New VideoFilter("Color", "HDRCore | HDRColor | Repair Y", "RepairY($select:msg:Select Input Range;TV Range|a=16,b=235;PC Range|a=0,b=255$, black=0.0, hl=0.5, hlg=1.0, gain=1.0, $select:msg:Select Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, g=2.2, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - '' New VideoFilter("Color", "HDRCore | HDRColor | DynRangeY", "DynRangeY($select:msg:Select Y-Channel Range for Start Frame;TV Range|a1=16,b1=235;PCRange|a1=0,b1=255$, $select:msg:Select Y-Channel Range for End Frame;TV Range|a2=16,b2=235;PCRange|a2=0,b2=255$, g1=1.0, g2=1.0, $select:msg:Select The Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - ''New VideoFilter("Color", "HDRCore | HDRColor | Color", "Color(sat=1.0, g=1.0, saty=1.0, satb=1.0, satg=1.0, satr=1.0, gy=1.0, gb=1.0, gg=1.0, gr=1.0, dyb=0.0, dgr=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - '' New VideoFilter("Color", "HDRCore | HDRColor | DynColor", "DynColor(sat1=1.0, sat2=1.0, g1=1.0, g2=1.0, saty1=1.0, saty2=1.0, satb1=1.0, satb2=1.0, satg1=1.0, satg2=1.0, satr1=1.0, satr2=1.0, gy1=1.0, gy2=1.0, gb1=1.0, gb2=1.0, gg1=1.0, gg2=1.0, gr1=1.0, gr2=1.0, dyb1=0.0, dyb2=0.0, dgr1=0.0, dgr2=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")}}) - - Add(New PluginPackage With { - .Name = "HDRMatrix", - .Filename = "HDRMatrix.dll", - .Description = "HDRMatrix is a color matrix conversion filter library to work with HDR frames in AviSynth.", - .WebURL = "http://www.videoartifact.com/hdr/", - .IsRequired = False, - .HelpFile = "HDRMatrix.txt", - .AvsFilterNames = {"Matrix"}, - .AvsFiltersFunc = Function() { - New VideoFilter("Color", "HDR Core | HDRColor | Matrix", "Matrix(from=$select:msg:Select Input For Color Matrix;601;709;2020$, to=$select:msg:Select Output For Color Matrix;601;709;2020$, rg=1.0, gg=1.0, bg=1.0, a=16, b=235, ao=0, bo=255, bitdepth=$select:msg:Select BitDepth;8;88;16;32$)")}}) - - Add(New PluginPackage With { - .Name = "BicubicSharp", - .Filename = "BicubicSharp.avsi", - .Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", - .DirPath = "Plugins\AVS\HDRSharp", - .WebURL = "http://www.videoartifact.com/hdr/", - .IsRequired = False, - .HelpFile = "HDRSharp.txt", - .AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}}) - - Add(New PluginPackage With { - .Name = "HDRSharp", - .Filename = "HDRSharp.dll", - .Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", - .WebURL = "http://www.videoartifact.com/hdr/", - .DirPath = "Plugins\AVS\HDRSharp", - .IsRequired = False, - .HelpFile = "HDRSharp.txt", - .AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}, - .AvsFiltersFunc = Function() { - New VideoFilter("Line", "Sharpen | HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), - New VideoFilter("Line", "Sharpen | HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), - New VideoFilter("Line", "Sharpen | HDRSharp | BicubicSharp", "BicubicSharp(bitdepth=$select:msg:Select BitDepth;8;88;16$)"), - New VideoFilter("Line", "Sharpen | HDRSharp | BicubicSharp8", "BicubicSharp8()")}}) - - Add(New PluginPackage With { - .Name = "HDRCore", - .DirPath = "Plugins\AVS\HDRCore", - .Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types. ", - .IsRequired = False, - .HelpFile = "HDRCore.txt", - .Filename = "HDRCore.dll", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"BitdepthMsb", "BitdepthMsbLsb", "BitdepthLsb", "Bitdepth", "RangeY", "RangeUV", "ClampHDR"}}) - - Add(New PluginPackage With { - .Name = "HDRNoise", - .DirPath = "Plugins\AVS\HDRNoise", - .Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", - .IsRequired = False, - .HelpFile = "HDRNoise.txt", - .Filename = "HDRNoise.dll", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"NoiseY", "NoiseYM", "NoiseUV", "NoisedGrayY8", "NoiseMix1Y", "NoiseMix2Y"}}) - - Add(New PluginPackage With { - .Name = "FilmGrain", - .DirPath = "Plugins\AVS\HDRNoise", - .Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", - .IsRequired = False, - .HelpFile = "HDRNoise.txt", - .Filename = "FilmGrain.avsi", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"FilmGrain1", "FilmGrain2"}}) - - Add(New PluginPackage With { - .Name = "HDR Sources", - .Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types.", - .DirPath = "Plugins\AVS\HDRCore", - .IsRequired = False, - .Filename = "HDR-sources.avsi", - .HelpFile = "HDRCore.txt", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"VideoDS", "AudioDS", "VideoLS", "AudioLS", "VideoLA", "AudioLA", "AudioSilent"}}) + '' New VideoFilter("Color", "HDRColor | Cube", "Cube(file=""$browse_file$"", from=$select:msg:Select Input Color Space;601;709;2020$, to=$select:msg:Select Output Color Space;601;709;2020$, rg=1.0, gg=1.0, bg=1.0, $select:msg:Select the Range you Wish to Use;TV Range|a=16, b=235, ao=16, bo=235;PC Range|a=0, b=255, ao=0, bo=255$, sat=1.0, sato=1.0, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + '' New VideoFilter("Color", "HDRColor | Repair Y", "RepairY($select:msg:Select Input Range;TV Range|a=16,b=235;PC Range|a=0,b=255$, black=0.0, hl=0.5, hlg=1.0, gain=1.0, $select:msg:Select Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, g=2.2, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + '' New VideoFilter("Color", "HDRColor | DynRangeY", "DynRangeY($select:msg:Select Y-Channel Range for Start Frame;TV Range|a1=16,b1=235;PCRange|a1=0,b1=255$, $select:msg:Select Y-Channel Range for End Frame;TV Range|a2=16,b2=235;PCRange|a2=0,b2=255$, g1=1.0, g2=1.0, $select:msg:Select The Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + ''New VideoFilter("Color", "HDRColor | Color", "Color(sat=1.0, g=1.0, saty=1.0, satb=1.0, satg=1.0, satr=1.0, gy=1.0, gb=1.0, gg=1.0, gr=1.0, dyb=0.0, dgr=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + '' New VideoFilter("Color", "HDRColor | DynColor", "DynColor(sat1=1.0, sat2=1.0, g1=1.0, g2=1.0, saty1=1.0, saty2=1.0, satb1=1.0, satb2=1.0, satg1=1.0, satg2=1.0, satr1=1.0, satr2=1.0, gy1=1.0, gy2=1.0, gb1=1.0, gb2=1.0, gg1=1.0, gg2=1.0, gr1=1.0, gr2=1.0, dyb1=0.0, dyb2=0.0, dgr1=0.0, dgr2=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")}}) + + ' Add(New PluginPackage With { + '.Name = "HDRMatrix", + '.Filename = "HDRMatrix.dll", + '.Description = "HDRMatrix is a color matrix conversion filter library to work with HDR frames in AviSynth.", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.IsRequired = False, + '.HelpFile = "HDRMatrix.txt", + '.AvsFilterNames = {"matrix"}, + '.AvsFiltersFunc = Function() { + ' New VideoFilter("Color", "HDRColor | Matrix", "Matrix(from=$select:msg:Select Input For Color Matrix;601;709$, to=$select:msg:Select Output For Color Matrix;601;709$, rg=1.0, gg=1.0, bg=1.0, a=16, b=235, ao=0, bo=255, bitdepth=$select:msg:Select BitDepth;8;88;16;32$)")}}) + + ' Add(New PluginPackage With { + '.Name = "BicubicSharp", + '.Filename = "BicubicSharp.avsi", + '.Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", + '.DirPath = "Plugins\AVS\HDRSharp", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.IsRequired = False, + '.HelpFile = "HDRSharp.txt", + '.AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}}) + + ' Add(New PluginPackage With { + '.Name = "HDRSharp", + '.Filename = "HDRSharp.dll", + '.Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.DirPath = "Plugins\AVS\HDRSharp", + '.IsRequired = False, + '.HelpFile = "HDRSharp.txt", + '.AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}, + '.AvsFiltersFunc = Function() { + ' New VideoFilter("Line", "HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), + ' New VideoFilter("Line", "HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), + ' New VideoFilter("Line", "HDRSharp | BicubicSharp", "BicubicSharp(bitdepth=$select:msg:Select BitDepth;8;88;16$)"), + ' New VideoFilter("Line", "HDRSharp | BicubicSharp8", "BicubicSharp8()")}}) + + ' Add(New PluginPackage With { + '.Name = "HDRCore", + '.DirPath = "Plugins\AVS\HDRCore", + '.Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types. ", + '.IsRequired = False, + '.HelpFile = "HDRCore.txt", + '.Filename = "HDRCore.dll", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"BitdepthMsb", "BitdepthMsbLsb", "BitdepthLsb", "Bitdepth", "RangeY", "RangeUV", "ClampHDR"}}) + + ' Add(New PluginPackage With { + '.Name = "HDRNoise", + '.DirPath = "Plugins\AVS\HDRNoise", + '.Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", + '.IsRequired = False, + '.HelpFile = "HDRNoise.txt", + '.Filename = "HDRNoise.dll", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"NoiseY", "NoiseYM", "NoiseUV", "NoisedGrayY8", "NoiseMix1Y", "NoiseMix2Y"}}) + + ' Add(New PluginPackage With { + '.Name = "FilmGrain", + '.DirPath = "Plugins\AVS\HDRNoise", + '.Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", + '.IsRequired = False, + '.HelpFile = "HDRNoise.txt", + '.Filename = "FilmGrain.avsi", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"FilmGrain1", "FilmGrain2"}}) + + ' Add(New PluginPackage With { + '.Name = "HDR Sources", + '.Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types.", + '.DirPath = "Plugins\AVS\HDRCore", + '.IsRequired = False, + '.Filename = "HDR-sources.avsi", + '.HelpFile = "HDRCore.txt", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"VideoDS", "AudioDS", "VideoLS", "AudioLS", "VideoLA", "AudioLA", "AudioSilent"}}) Add(New PluginPackage With { .Name = "DeGrainMedian", @@ -1057,14 +1088,13 @@ Public Class Package .Name = "MCTemporalDenoise", .Filename = "MCTemporalDenoise.avsi", .HelpFile = "Readme.txt", - .WebURL = "http://avisynth.nl/index.php/mctemporaldenoise", + .WebURL = "http://avisynth.nl/index.php/Abcxyz", .Description = "A motion compensated noise removal script with an accompanying post-processing component.", .AvsFilterNames = {"MCTemporalDenoise", "MCTemporalDenoisePP"}, .AvsFiltersFunc = Function() { New VideoFilter("Noise", "MCTemporalDenoise | MCTemporalDenoise", "MCTemporalDenoise(settings=""medium"")"), New VideoFilter("Noise", "MCTemporalDenoise | MCTemporalDenoisePP", "source=last" + BR + "denoised=FFT3Dfilter()" + BR + "MCTemporalDenoisePP(denoised)")}}) - ''End of Custom Plugins Add(New PluginPackage With { .Name = "L-SMASH-Works", @@ -1096,7 +1126,7 @@ Public Class Package .URL = "http://github.com/HomeOfVapourSynthEvolution/VapourSynth-Deblock/", .VSFilterNames = {"deblock.Deblock"}, .VSFiltersFunc = Function() { - New VideoFilter("Misc", "Deblock", "clip = core.deblock.Deblock(clip, quant = 25, aoffset = 0, boffset = 0)")}}) + New VideoFilter("Restoration", "Deblock | Deblock", "clip = core.deblock.Deblock(clip, quant = 25, aoffset = 0, boffset = 0)")}}) Add(New PluginPackage With { .Name = "MSharpen", @@ -1105,7 +1135,7 @@ Public Class Package .HelpFile = "Readme.txt", .AvsFilterNames = {"MSharpen"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "MSharpen", "MSharpen(threshold = 10, strength = 100, highq = true, mask = false)")}}) + New VideoFilter("Line", "Sharpen | MSharpen", "MSharpen(threshold = 10, strength = 100, highq = true, mask = false)")}}) Add(New PluginPackage With { .Name = "aWarpSharp2", @@ -1115,7 +1145,7 @@ Public Class Package .Description = "This filter implements the same warp sharpening algorithm as aWarpSharp by Marc FD, but with several bugfixes and optimizations.", .WebURL = "http://avisynth.nl/index.php/AWarpSharp2", .AvsFiltersFunc = Function() { - New VideoFilter("Line", "aWarpSharp2", "aWarpSharp2(thresh=128, blur=2, type=0, depth=16, chroma=3)")}}) + New VideoFilter("Line", "Sharpen | aWarpSharp2", "aWarpSharp2(thresh=128, blur=2, type=0, depth=16, chroma=3)")}}) Add(New PluginPackage With { .Name = "QTGMC", @@ -1125,7 +1155,7 @@ Public Class Package .AvsFilterNames = {"QTGMC"}, .AvsFiltersFunc = Function() { New VideoFilter("Field", "QTGMC | QTGMC...", "QTGMC(Preset = ""$select:msg:Select a preset.;Draft;Ultra Fast;Super Fast;Very Fast;Faster;Fast;Medium;Slow;Slower;Very Slow;Placebo$"", InputType=$select:msg:Select Input Type;Interlaced|0;Progressive Type 1|1;Progressive Type 2|2;Progressive Type 3|3$, SourceMatch=3, Sharpness=0.2, TR2=2, EdiThreads=8)"), - New VideoFilter("Field", "QTGMC | QTGMC With Repair", "QTGMC1 = QTGMC( Preset=""Slower"", InputType=2 )" + BR + "QTGMC2 = QTGMC( Preset=""Slower"", InputType=3, PrevGlobals=""Reuse"")" + BR + "$Select:msg:Select the Filter Form you Wish to use. Repair|Repair(QTGMC1, QTGMC2, 1);Repair16|Repair16(QTGMC1, QTGMC2, 1)$")}}) + New VideoFilter("Field", "QTGMC | QTGMC With Repair", "QTGMC1 = QTGMC( Preset=""Slower"", InputType=2 )" + BR + "QTGMC2 = QTGMC( Preset=""Slower"", InputType=3, PrevGlobals=""Reuse"")" + BR + "$select:msg:Select the Filter Form you Wish to use. Repair|Repair(QTGMC1, QTGMC2, 1);Repair16|Repair16(QTGMC1, QTGMC2, 1)$")}}) Add(New PluginPackage With { .Name = "SMDegrain", @@ -1152,7 +1182,18 @@ Public Class Package .URL = "http://avisynth.nl/index.php/LSFmod", .Description = "A LimitedSharpenFaster mod with a lot of new features and optimizations.", .AvsFilterNames = {"LSFmod"}, - .AvsFiltersFunc = Function() {New VideoFilter("Line", "LSFmod", "LSFmod(strength = 100, Smode=5, Smethod=3, kernel=11, preblur=""OFF"", secure=true, Szrp= 16, Spwr= 4, SdmpLo= 4, SdmpHi= 48, Lmode=4, overshoot=1, undershoot=1, Overshoot2=1, Undershoot2=1, soft=-2, soothe=true, keep=20, edgemode=0, edgemaskHQ=true, ss_x= 1.50, ss_y=1.50 , dest_x=%target_width%, dest_y=%target_height%, show=false, screenW=1280, screenH=1024)")}}) + .AvsFiltersFunc = Function() {New VideoFilter("Line", "Sharpen | LSFmod", "LSFmod(strength = 100, Smode=5, Smethod=3, kernel=11, preblur=""OFF"", secure=true, Szrp= 16, Spwr= 4, SdmpLo= 4, SdmpHi= 48, Lmode=4, overshoot=1, undershoot=1, Overshoot2=1, Undershoot2=1, soft=-2, soothe=true, keep=20, edgemode=0, edgemaskHQ=true, ss_x= 1.50, ss_y=1.50 , dest_x=%target_width%, dest_y=%target_height%, show=false, screenW=1280, screenH=1024)")}}) + + Add(New PluginPackage With { + .Name = "vsCube", + .Filename = "vscube.dll", + .Description = "Deblocking plugin using the deblocking filter of h264.", + .HelpFile = "Readme.txt", + .WebURL = "http://rationalqm.us/mine.html", + .DirPath = "Plugins\AVS\VSCube", + .AvsFilterNames = {"Cube"}, + .AvsFiltersFunc = Function() { + New VideoFilter("Color", "HDRColor | 3DLutCube", "Cube(""$browse_file$"")")}}) Add(New PluginPackage With { .Name = "RgTools", @@ -1268,9 +1309,7 @@ Public Class Package .Filename = "fft3dfilter.dll", .WebURL = "http://github.com/VFR-maniac/VapourSynth-FFT3DFilter", .Description = "FFT3DFilter uses Fast Fourier Transform method for image processing in frequency domain.", - .VSFilterNames = {"fft3dfilter.FFT3DFilter"}, - .VSFiltersFunc = Function() { - New VideoFilter("Noise", "FFT3DFilter", "clip = core.fft3dfilter.FFT3DFilter(clip)")}}) + .VSFilterNames = {"fft3dfilter.FFT3DFilter"}}) Add(New PluginPackage With { .Name = "mvtools", @@ -1330,25 +1369,12 @@ Public Class Package .VSFiltersFunc = Function() { New VideoFilter("Source", "d2vsource", "clip = core.d2v.Source(r""%source_file%"")")}}) - Add(New PluginPackage With { - .Name = "DeLogo", - .Filename = "libdelogo.dll", - .Description = "DeLogo Plugin Ported for VapourSynth.", - .URL = "http://github.com/HomeOfVapourSynthEvolution/VapourSynth-DeLogo", - .VSFilterNames = {"delogo.AddLogo", "delogo.EraseLogo"}, - .VSFiltersFunc = Function() { - New VideoFilter("Misc", "Delogo AddLogo", "clip = core.delogo.AddLogo(clip, logofile = r""$browse_file$"")"), - New VideoFilter("Misc", "Delogo EraseLogo", "clip = core.delogo.EraseLogo(clip, logofile = r""$browse_file$"")")}}) - Add(New PluginPackage With { .Name = "FluxSmooth", .Filename = "libfluxsmooth.dll", .VSFilterNames = {"SmoothT", "SmoothST"}, .Description = "FluxSmooth is a filter for smoothing of fluctuations.", - .WebURL = "http://github.com/dubhater/vapoursynth-fluxsmooth", - .VSFiltersFunc = Function() { - New VideoFilter("Noise", "FluxSmooth SmoothT", "clip = core.flux.SmoothT(clip, temporal_threshold = 7, planes = [0, 1, 2])"), - New VideoFilter("Noise", "FluxSmooth SmoothST", "clip = core.flux.SmoothST(clip, temporal_threshold = 7, spatial_threshold = 7, planes = [0, 1, 2])")}}) + .WebURL = "http://github.com/dubhater/vapoursynth-fluxsmooth"}) Add(New PluginPackage With { .Name = "msmoosh", @@ -1357,8 +1383,8 @@ Public Class Package .Description = "MSmooth is a spatial smoother that doesn't touch edges." + BR + "MSharpen is a sharpener that tries to sharpen only edges.", .WebURL = "http://github.com/dubhater/vapoursynth-msmoosh", .VSFiltersFunc = Function() { - New VideoFilter("Noise", "MSmooth", "clip = core.msmoosh.MSmooth(clip, threshold = 6.0, strength = 3)"), - New VideoFilter("Misc", "MSharpen", "clip = core.msmoosh.MSharpen(clip, threshold = 6.0, strength = 39)")}}) + New VideoFilter("Restoration", "Deblock | MSmooth", "clip = core.msmoosh.MSmooth(clip, threshold = 6.0, strength = 3)"), + New VideoFilter("Line", "Sharpen | MSharpen", "clip = core.msmoosh.MSharpen(clip, threshold = 6.0, strength = 39)")}}) Add(New PluginPackage With { .Name = "fmtconv", @@ -1366,7 +1392,7 @@ Public Class Package .WebURL = "http://github.com/EleonoreMizo/fmtconv", .HelpFile = "fmtconv.html", .Description = "Fmtconv is a format-conversion plug-in for the Vapoursynth video processing engine. It does resizing, bitdepth conversion with dithering and colorspace conversion.", - .VSFilterNames = {"fmtc.bitdepth", "fmtc.convert", "fmtc.matrix", "fmtc.resample", "fmtc.transfer"}}) + .VSFilterNames = {"fmtc.bitdepth", "fmtc.convert", "fmtc.matrix", "fmtc.resample", "fmtc.transfer", "fmtc.primaries"}}) Add(New PluginPackage With { .Name = "finesharp", @@ -1375,7 +1401,7 @@ Public Class Package .WebURL = "http://forum.doom9.org/showthread.php?p=1777860#post1777860", .VSFilterNames = {"finesharp.sharpen"}, .VSFiltersFunc = Function() { - New VideoFilter("Misc", "finesharp", "clip = finesharp.sharpen(clip)")}}) + New VideoFilter("Line", "Sharpen | finesharp", "clip = finesharp.sharpen(clip)")}}) Add(New PluginPackage With { .Name = "FineSharp", @@ -1385,43 +1411,35 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/FineSharp", .AvsFilterNames = {"FineSharp"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "FineSharp | Light", "FineSharp(mode=1, sstr=2, cstr=0.8, xstr=0.19, lstr=1.49, pstr=1.272, ldmp=2.1)"), - New VideoFilter("Line", "FineSharp | Moderate", "FineSharp(mode=2, sstr=2.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472, ldmp=4.2)"), - New VideoFilter("Line", "FineSharp | Strong", "FineSharp(mode=3, sstr=6.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472, ldmp=9.2)")}}) - - 'Add(New PluginPackage With { - ' .Name = "Plum", - ' .Filename = "Plum.py", - ' .Description = "Plum is a sharpening/blind deconvolution suite with certain advanced features like Non-Local error, Block Matching, etc..", - ' .URL = "http://github.com/IFeelBloated/Plum", - ' .VSFilterNames = {"Plum.Basic", "Plum.Final", "Plum.Super"}, - ' .VSFiltersFunc = Function() {New VideoFilter("Misc", "Plum", $"ref = Plum.Basic(clip){BR}clip = Plum.Final([clip, ref], [Plum.Super(clip), Plum.Super(ref)], cutoff = 8, freq_margin = 12)")}}) + New VideoFilter("Line", "Sharpen | FineSharp | Light", "FineSharp(mode=1, sstr=2, cstr=0.8, xstr=0.19, lstr=1.49, pstr=1.272)"), + New VideoFilter("Line", "Sharpen | FineSharp | Moderate", "FineSharp(mode=2, sstr=2.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472)"), + New VideoFilter("Line", "Sharpen | FineSharp | Strong", "FineSharp(mode=3, sstr=6.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472)")}}) Dim fp = Folder.Settings + "Versions.txt" - Try - If Not File.Exists(fp) OrElse Not File.ReadAllText(fp).Contains(Application.ProductVersion + BR2) Then - FileHelp.Delete(fp) - fp = Folder.Apps + "Versions.txt" - End If - - For Each line In File.ReadAllLines(fp) - For Each pack In Items.Values - If line Like "*=*;*" Then - Dim name = line.Left("=").Trim - - If name = pack.ID Then - pack.Version = line.Right("=").Right(";").Trim - Dim a = line.Right("=").Left(";").Trim.Split("-"c) - pack.VersionDate = New DateTime(CInt(a(0)), CInt(a(1)), CInt(a(2))) - End If - End If - Next - Next - Catch ex As Exception - g.ShowException(ex) - End Try - End Sub + Try + If Not File.Exists(fp) OrElse Not File.ReadAllText(fp).Contains(Application.ProductVersion + BR2) Then + FileHelp.Delete(fp) + fp = Folder.Apps + "Versions.txt" + End If + + For Each line In File.ReadAllLines(fp) + For Each pack In Items.Values + If line Like "*=*;*" Then + Dim name = line.Left("=").Trim + + If name = pack.ID Then + pack.Version = line.Right("=").Right(";").Trim + Dim a = line.Right("=").Left(";").Trim.Split("-"c) + pack.VersionDate = New DateTime(CInt(a(0)), CInt(a(1)), CInt(a(2))) + End If + End If + Next + Next + Catch ex As Exception + g.ShowException(ex) + End Try + End Sub ReadOnly Property ID As String Get @@ -1470,18 +1488,6 @@ Public Class Package End Set End Property - ''Sub StartWithJava() - ''Try - ''Dim p As New Process - '' p.StartInfo.FileName = Package.Java.GetDir + "javaw.exe" - '' p.StartInfo.Arguments = "-jar """ + Path + """" - '' p.StartInfo.WorkingDirectory = GetDir() - ''p.Start() - ''Catch ex As Exception - '' g.ShowException(ex) - ''End Try - ''End Sub - Function GetHelpPath(Optional engine As ScriptEngine = ScriptEngine.AviSynth) As String If HelpFile <> "" Then Return GetDir() + HelpFile @@ -1689,7 +1695,7 @@ Public Class AviSynthPlusPackage WebURL = "http://avisynth.nl/index.php/AviSynth%2B" Description = "StaxRip support both AviSynth+ x64 and VapourSynth x64 as scripting based video processing tool." FixedDir = Folder.System - SetupFilename = "AviSynthPlus-MT-r2580.exe" + SetupFilename = "AviSynthPlus-MT-r2728.exe" End Sub Public Overrides Property IsRequired As Boolean @@ -1735,7 +1741,7 @@ Public Class PythonPackage If File.Exists(ret) Then Return ret For Each i In { - Registry.CurrentUser.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", "ExecutablePath"), + Registry.CurrentUser.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", "ExecutablePath"), ''Location will be Changed for next VS Release Registry.LocalMachine.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", "ExecutablePath"), Registry.CurrentUser.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", Nothing).FixDir + "python.exe", Registry.LocalMachine.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", Nothing).FixDir + "python.exe"} @@ -1812,60 +1818,6 @@ Public Class PluginPackage End Function End Class -''Public Class JavaPackage -''Inherits Package - -''Sub New() -''Name = "Java" -''Filename = "Java.exe" -''WebURL = "http://java.com" -''TreePath = "Runtimes" -''Description = "Java is required by ProjectX. " + Strings.ProjectX -''DownloadURL = "http://java.com/en/download" -''IsRequired = False -''IgnoreVersion = True -''End Sub - -''Public Overrides ReadOnly Property Path As String -''Get -''Dim ret = MyBase.Path -''If ret <> "" Then Return ret - -''ret = "C:\ProgramData\Oracle\Java\javapath\" + Filename -''If File.Exists(ret) Then Return ret - -''ret = "C:\Windows\Sysnative\" + Filename -''If File.Exists(ret) Then Return ret - -''ret = "C:\Windows\System32\" + Filename -''If File.Exists(ret) Then Return ret -''End Get -''End Property -''End Class - -''Public Class ProjectXPackage -''Inherits Package - -''Sub New() -''Name = "ProjectX" -''Filename = "ProjectX.jar" -''WebURL = "http://project-x.sourceforge.net" -''Description = Strings.ProjectX -''IsRequired = False -''End Sub - -''Overrides ReadOnly Property StartAction As Action -''Get -''Return AddressOf StartWithJava -''End Get -''End Property - -''Public Overrides Function GetStatus() As String -''If Package.Java.Path = "" Then Return "Failed to locate Java, ProjectX requires Java." -''Return MyBase.GetStatus() -''End Function -''End Class - Public Class qaacPackage Inherits Package diff --git a/General/VideoScript.vb b/General/VideoScript.vb index 69f5e0fa..569fb94d 100644 --- a/General/VideoScript.vb +++ b/General/VideoScript.vb @@ -642,15 +642,17 @@ Public Class FilterCategory Dim color As New FilterCategory("Color") color.Filters.Add(New VideoFilter(color.Name, "Convert | Format", "z_ConvertFormat(pixel_type=""$select:msg:Select Pixel Type.;RGBPS;RGBP10;RGBP12;RGBP16;YV12;YV16;YV24;YUV420P10;YUV420P12;YUV420P16;YUV444P10;YUV444P12;YUV444P16;YUV422P10;YUV422P12;YUV422P16$"",colorspace_op=""$select:msg:Select Color Matrix Input;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Input;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Input;470m;470bg;FILM;709;2020$:l=>$select:msg:Select Color Matrix output;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Output;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Output;470m;470bg;FILM;709;2020$:l"", dither_type=""$select:msg:Select Dither Type;None;ordered$"")")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoAdjust", "AutoAdjust( gamma_limit=1.0, scd_threshold=16, gain_mode=1, auto_gain=$select:msg:Enable Auto Gain?;True;False$, auto_balance=$select:msg:Enable Auto Balance?;True;False$, Input_tv=$select:msg:Is the Input using TV Range?;True;False$, output_tv=$select:msg:Do you want to use TV Range for Output?;True;False$, use_dither=$select:msg:Use Dither?;True;False$, high_quality=$select:msg:Use High Quality Mode?;True;False$, high_bitdepth=$select:msg:Use High Bit Depth Mode?;True;False$, threads_count=$enter_text:How Many Threads do You Wish to use?$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | Bitdepth(8Bit to 16 Bit)", "Bitdepth(from=$select:msg:Select Input BitDepth;8;16;32;88$, to=$select:msg:Select Output BitDepth;8;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (16-235 to 0-255)", "$select:msg:Select BitDepth;8Bit|Levels(16, 1, 235, 0, 255, coring=False);10Bit|Levels(64, 1, 940, 0, 1020, coring=false);12Bit|Levels(256, 1, 3670, 0, 4080, coring=false);14Bit|Levels(1024, 1, 15040, 0, 16320, coring=false);16Bit|Levels(4096, 1, 60160, 0, 65535, coring=false)$")) - color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (0-255 to 16-235)", "$select:msg:Select BitDepth;8Bit|Levels(0, 1, 255, 16, 235, coring=False);10Bit|Levels(0, 1, 1020, 64, 940, coring=false);12Bit|Levels(0, 1, 4080, 256, 3670, coring=false);14Bit|Levels(0, 1, 16320, 1024, 15040, coring=false);16Bit|Levels(0, 1, 65535, 4096, 60160, coring=false)$")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | Bitdepth", "Bitdepth(from=$select:msg:Select Input BitDepth;8;16;32;88$, to=$select:msg:Select Output BitDepth;8;16;32;88$)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (16-235 to 0-255)", "Levels(16, 1, 235, 0, 255, coring=False)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (0-255 to 16-235)", "Levels(0, 1, 255, 16, 235, coring=False)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Stack | ToStack", "ConvertToStacked()")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Stack | FromStack", "ConvertFromStacked()")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertTo", "ConvertTo$enter_text:Enter The Format You Wish To Convert To$()")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertBits", "ConvertBits($select:msg:Select the Bit Depth You want to Convert To;8;10;12;14;16;32$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthLsb", "LSB = BitdepthLsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsb", "MSB = BitdepthMsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsbLsb", "BitdepthMsbLsb(MSB, LSB, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | Clamp HDR", "ClampHDR($select:msg:Select the Range you Wish to Use;TV Range|ay=16,by=235,au=16,bu=240,av=16,bv=240;PC Range|ay=0,by=255,au=0,bu=255,av=0,bv=255$, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthLsb", "LSB = BitdepthLsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsb", "MSB = BitdepthMsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsbLsb", "BitdepthMsbLsb(MSB, LSB, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | Clamp HDR", "ClampHDR($select:msg:Select the Range you Wish to Use;TV Range|ay=16,by=235,au=16,bu=240,av=16,bv=240;PC Range|ay=0,by=255,au=0,bu=255,av=0,bv=255$, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Gamma to Linear", "Dither_y_gamma_to_linear(Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Linear to Gamma", "Dither_y_linear_to_gamma(Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid Direct", "Dither_sigmoid_direct()")) @@ -664,7 +666,7 @@ Public Class FilterCategory color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoGain", "ColorYUV(autogain=$select:msg:Enable AutoGain?;True;False$, autowhite=$select:msg:Enable AutoWhite?;True;False$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Histogram | BitDepth Version", "Histogram(""levels"", Bits=$select:msg:Select BitDepth;8;10;12$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Tweak", "Tweak(realcalc=true, dither_strength= 1.0, sat=0.75, startHue=105, endHue=138 )")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRToneMapping", "$select:msg:Select the Map Tone You Wish to Use;DGReinhard|DGReinhard();DGHable|DGHable()$")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRToneMapping", "$select:msg:Select the Map Tone You Wish to Use;DGReinhard|DGReinhard();DGHable|DGHable()$")) ret.Add(color) Dim line As New FilterCategory("Line") @@ -680,9 +682,7 @@ Public Class FilterCategory ret.Add(field) Dim noise As New FilterCategory("Noise") - noise.Filters.Add(New VideoFilter(noise.Name, "Soften | TemporalSoften", "TemporalSoften(3, 4, 8, scenechange=15, mode=2)")) - noise.Filters.Add(New VideoFilter(noise.Name, "Soften | SpatialSoften", "SpatialSoften(3,4,8)")) - noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain16 with Repair16", "Processed = Dither_removegrain16(Unprocessed, mode=2, modeU=2, modeV=2)" + BR + "Dither_repair16(Processed, Unprocessed, mode=2, modeU=2, modeV=2)" + BR + "#Unprocessed Is Clip Source, You must make this adjustment manually")) + noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain16 with Repair16", "Processed = Dither_removegrain16(mode=2, modeU=2, modeV=2)" + BR + "Dither_repair16(Processed, mode=2, modeU=2, modeV=2)")) ret.Add(noise) Dim misc As New FilterCategory("Misc") @@ -695,12 +695,11 @@ Public Class FilterCategory Dim resize As New FilterCategory("Resize") resize.Filters.Add(New VideoFilter(resize.Name, "Resize | Resize", "$select:BicubicResize;BilinearResize;BlackmanResize;GaussResize;Lanczos4Resize;LanczosResize;PointResize;SincResize;Spline16Resize;Spline36Resize;Spline64Resize$(%target_width%, %target_height%)")) - resize.Filters.Add(New VideoFilter(resize.Name, "Resize | Resize(Z)", "$select:z_BicubicResize;z_BilinearResize;z_BlackmanResize;z_GaussResize;z_Lanczos4Resize;z_LanczosResize;z_PointResize;z_SincResize;z_Spline16Resize;z_Spline36Resize;z_Spline64Resize$(%target_width%, %target_height%)")) - resize.Filters.Add(New VideoFilter(resize.Name, "Hardware Encoder", "# hardware encoder resizes")) + resize.Filters.Add(New VideoFilter(resize.Name, "Resize | Hardware Encoder", "# hardware encoder resizes")) resize.Filters.Add(New VideoFilter(resize.Name, "SuperRes | SuperResXBR", "SuperResXBR(Passes=$select:msg:How Many Passes Do you wish to Perform?;2;3;4;5$, Factor=$select:msg:Factor Increase by?;2;4$)")) resize.Filters.Add(New VideoFilter(resize.Name, "SuperRes | SuperRes", "SuperRes(Passes=$select:msg:How Many Passes Do you wish to Perform?;2;3;4;5$, Factor=$select:msg:Factor Increase by?;2;4$))")) resize.Filters.Add(New VideoFilter(resize.Name, "SuperRes | SuperXBR", "SuperXBR(Factor=$select:msg:Factor Increase by?;2;4$)")) - resize.Filters.Add(New VideoFilter(resize.Name, "JincResize", "$select:Jinc36Resize;Jinc64Resize;Jinc144Resize;Jinc256Resize$(%target_width%, %target_height%)")) + resize.Filters.Add(New VideoFilter(resize.Name, "Resize | JincResize", "$select:Jinc36Resize;Jinc64Resize;Jinc144Resize;Jinc256Resize$(%target_width%, %target_height%)")) resize.Filters.Add(New VideoFilter(resize.Name, "Dither_Resize16 | Dither_Resize16", "Dither_resize16(%target_width%, %target_height%)")) resize.Filters.Add(New VideoFilter(resize.Name, "Dither_Resize16 | Dither_Resize16 In Linear Light", "Dither_convert_yuv_to_rgb (matrix=""2020"", output=""rgb48y"", lsb_in=true)" + BR + "Dither_y_gamma_to_linear(tv_range_in=false, tv_range_out=false, curve=""2020"", sigmoid=true)" + BR + "Dither_resize16nr(%target_width%, %target_height%, kernel=""spline36"")" + BR + "Dither_y_linear_to_gamma(tv_range_in=false, tv_range_out=false, curve=""2020"", sigmoid=true)" + BR + "r = SelectEvery (3, 0)" + BR + "g = SelectEvery (3, 1)" + BR + "b = SelectEvery (3, 2)" + BR + "Dither_convert_rgb_to_yuv(r, g, b, matrix=""2020"", lsb=true)")) ret.Add(resize) @@ -730,34 +729,73 @@ Public Class FilterCategory New VideoFilter("Source", "AVISource", "clip = core.avisource.AVISource(r""%source_file%"")")}) ret.Add(src) + Dim framerate As New FilterCategory("FrameRate") + framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS | AssumeFPS Source", "clip = core.std.AssumeFPS(clip, fpsnum = int(%media_info_video:FrameRate% * 1000), fpsden = 1000)")) + framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS | AssumeFPS...", "clip = core.std.AssumeFPS(clip, None, $select:msg:Select a frame rate.;24000/1001|24000, 1001;24|24, 1;25|25, 1;30000/1001|30000, 1001;30|30, 1;50|50, 1;60000/1001|60000, 1001;60|60, 1$)")) + framerate.Filters.Add(New VideoFilter(framerate.Name, "InterFrame", "clip = havsfunc.InterFrame(clip, Preset=""Medium"", Tuning=""$select:msg:Select the Tuning Preset;Animation;Film;Smooth;Weak$"", NewNum=$enter_text:Enter the NewNum Value$, NewDen=$enter_text:Enter the NewDen Value$, OverrideAlgo=$select:msg:Which Algorithm Do you Wish to Use?;Strong Predictions|2;Intelligent|13;Smoothest|23$, GPU=$select:msg:Enable GPU Feature?;True;False$)")) + framerate.Filters.Add(New VideoFilter(framerate.Name, "SVPFlow", "sup = core.mv.Super(clip, pel=2, hpad=0, vpad=0)" + BR + "bvec = core.mv.Analyse(sup, blksize=16, isb=True, chroma=True, search=3, searchparam=1)" + BR + "fvec = core.mv.Analyse(sup, blksize=16, isb=False, chroma=True, search=3, searchparam=1)" + BR + "clip = core.mv.FlowFPS(clip, sup, bvec, fvec, num=60000, den=1001, mask=2)")) + ret.Add(framerate) + + Dim color As New FilterCategory("Color") + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Tweak", "clip = core.adjust.Tweak(clip, sat=0.75, hue=105-138)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoAdjust", "core.avs.AutoAdjust(clip, gamma_limit=1.0, scd_threshold=16, gain_mode=1, auto_gain=$select:msg:Enable Auto Gain?;True;False$, auto_balance=$select:msg:Enable Auto Balance?;True;False$, input_tv=$select:msg:Is the Input using TV Range?;True;False$, output_tv=$select:msg:Do you want to use TV Range for Output?;True;False$, use_dither=$select:msg:Use Dither?;True;False$, high_quality=$select:msg:Use High Quality Mode?;True;False$, high_bitdepth=$select:msg:Use High Bit Depth Mode?;True;False$, threads_count=$enter_text:How Many Threads do You Wish to use?$)")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | SmoothGrad", "clip = fvsfunc.GradFun3(src=clip, mode=6, smode=1)")) + color.Filters.Add(New VideoFilter(color.Name, "HDRColor | Cube", "clip = core.timecube.Cube(clip, cube = r""$browse_file$"")")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Range", "clip = core.resize.Point(clip, range_in_s = ""$select:msg:Select Input;TV|limited;PC|full$"", range_s = ""$select:msg:Select Output;TV|limited;PC|full$"")")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (16-235 to 0-255)", "clip = core.std.Levels(clip, min_in=16, max_in=235, min_out=0, max_out=255, planes=0)" + BR + "clip = core.std.Levels(clip, min_in=16, max_in=240, min_out=0, max_out=255, planes=[1,2])")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (0-255 to 16-235)", "clip = core.std.Levels(clip, min_in=0, max_in=255, min_out=16, max_out=235, planes=0)" + BR + "clip = core.std.Levels(clip, min_in=0, max_in=255, min_out=16, max_out=240, planes=[1,2])")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | Format", "clip = core.avs.z_ConvertFormat(clip, pixel_type = ""$select: Msg():Select Pixel Type.;RGBPS;RGBP10;RGBP12;RGBP16;YV12;YV16;YV24;YUV420P10;YUV420P12;YUV420P16;YUV444P10;YUV444P12;YUV444P16;YUV422P10;YUV422P12;YUV422P16$"",colorspace_op=""$select:msg:Select Color Matrix Input;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Input;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Input;470m;470bg;FILM;709;2020$:l=>$select:msg:Select Color Matrix output;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Output;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Output;470m;470bg;FILM;709;2020$:l"", dither_type=""$select:msg:Select Dither Type;None;ordered$"")")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | Convert To", "clip = core.resize.Bicubic(clip, format=vs.$enter_text:Enter The Format You Wish To Convert To$)")) ''Ex: resize.Bicubic( format=vs.YUV444P8) + color.Filters.Add(New VideoFilter(color.Name, "Convert | ReSample", "clip = core.fmtc.resample(clip, w=%target_width%, h=%target_height%)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | BitDepth", "clip = core.fmtc.bitdepth (clip, bits=$select:msg:Select BitDepth;8;10;12;16;32$)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | YUV to RGB", "clip = core.fmtc.resample (clip, css=""444"")" + BR + "clip = core.fmtc.matrix (clip, mat=""709"", col_fam=vs.RGB)" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | RGB to YUV", "clip = core.fmtc.matrix (clip, mat=""709"", col_fam=vs.YUV, bits=16)" + BR + "clip = core.fmtc.resample (clip, css=""420"")" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | Anamorphic to Standard", "clip = core.fmtc.resample (clip, w=1280, h=720, css=""444"")" + BR + "clip = core.fmtc.matrix (clip, mat=""709"", col_fam=vs.RGB)" + BR + "clip = core.fmtc.transfer (clip, transs=""1886"", transd=""srgb"")" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Matrix", "clip = core.fmtc.resample (clip, css=""444"")" + BR + "clip = core.fmtc.matrix (clip, mats=""601"", matd=""709"")" + BR + "clip = core.fmtc.resample (clip, css=""420"")" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Gamma to Linear", "clip =Dither.y_gamma_to_linear(clip, Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Linear to Gamma", "clip = Dither.y_linear_to_gamma(clip, Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid Direct", "clip = Dither.sigmoid_direct(clip)")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid Inverse", "clip = Dither.sigmoid_inverse(clip)")) + Dim crop As New FilterCategory("Crop") - crop.Filters.AddRange( - {New VideoFilter("Crop", "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)", False)}) + crop.Filters.Add(New VideoFilter(crop.Name, "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)")) ret.Add(crop) + Dim line As New FilterCategory("Line") + line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | DAA", "clip = havsfunc.daa(c = clip, nns = 1)")) + line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | MAA", "clip = muvsfunc.maa(clip)")) + ret.Add(line) + Dim resize As New FilterCategory("Resize") resize.Filters.Add(New VideoFilter("Resize", "Resize...", "clip = core.resize.$select:Bilinear;Bicubic;Point;Lanczos;Spline16;Spline36$(clip, %target_width%, %target_height%)")) + resize.Filters.Add(New VideoFilter(resize.Name, "Dither_Resize16 | Dither_Resize16", "clip = Dither.Resize16nr(clip, %target_width%, %target_height%)")) ret.Add(resize) Dim field As New FilterCategory("Field") field.Filters.Add(New VideoFilter(field.Name, "IVTC", "clip = core.vivtc.VFM(clip, 1)" + BR + "clip = core.vivtc.VDecimate(clip)")) field.Filters.Add(New VideoFilter(field.Name, "Vinverse", "clip = core.vinverse.Vinverse(clip)")) - field.Filters.Add(New VideoFilter(field.Name, "Select Even", "clip = clip[::2]")) - field.Filters.Add(New VideoFilter(field.Name, "Select Odd", "clip = clip[1::2]")) - field.Filters.Add(New VideoFilter(field.Name, "Set Frame Based", "clip = core.std.SetFieldBased(clip, 0) # 1 = BFF, 2 = TFF")) - field.Filters.Add(New VideoFilter(field.Name, "Set Bottom Field First", "clip = core.std.SetFieldBased(clip, 1) # 1 = BFF, 2 = TFF")) - field.Filters.Add(New VideoFilter(field.Name, "Set Top Field First", "clip = core.std.SetFieldBased(clip, 2) # 1 = BFF, 2 = TFF")) + field.Filters.Add(New VideoFilter(field.Name, "Select | Select Even", "clip = clip[::2]")) + field.Filters.Add(New VideoFilter(field.Name, "Select | Select Odd", "clip = clip[1::2]")) + field.Filters.Add(New VideoFilter(field.Name, "Set | Set Frame Based", "clip = core.std.SetFieldBased(clip, 0) # 1 = BFF, 2 = TFF")) + field.Filters.Add(New VideoFilter(field.Name, "Set | Set Bottom Field First", "clip = core.std.SetFieldBased(clip, 1) # 1 = BFF, 2 = TFF")) + field.Filters.Add(New VideoFilter(field.Name, "Set | Set Top Field First", "clip = core.std.SetFieldBased(clip, 2) # 1 = BFF, 2 = TFF")) ret.Add(field) Dim noise As New FilterCategory("Noise") - noise.Filters.Add(New VideoFilter(noise.Name, "SMDegrain", "clip = havsfunc.SMDegrain(clip, contrasharp = True)")) - noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain", "clip = core.rgvs.RemoveGrain(clip, 1)")) + noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | SMDegrain", "clip = havsfunc.SMDegrain(clip, contrasharp = True)")) + noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain", "clip = core.rgvs.RemoveGrain(clip, 1)")) + noise.Filters.Add(New VideoFilter(noise.Name, "MCTemporalDenoise", "clip = havsfunc.MCTemporalDenoise(i=clip, settings=""$select:msg:Select Strength;very low;low;medium;high;very high$"")")) ret.Add(noise) - Dim misc As New FilterCategory("Misc") - misc.Filters.Add(New VideoFilter(misc.Name, "AssumeFPS MediaInfo", "clip = core.std.AssumeFPS(clip, fpsnum = int(%media_info_video:FrameRate% * 1000), fpsden = 1000)")) - misc.Filters.Add(New VideoFilter(misc.Name, "AssumeFPS...", "clip = core.std.AssumeFPS(clip, None, $select:msg:Select a frame rate.;24000/1001|24000, 1001;24|24, 1;25|25, 1;30000/1001|30000, 1001;30|30, 1;50|50, 1;60000/1001|60000, 1001;60|60, 1$)")) - ret.Add(misc) + Dim restoration As New FilterCategory("Restoration") + restoration.Filters.Add(New VideoFilter(restoration.Name, "Deblock | Deblock_QED", "clip = havsfunc.Deblock_QED(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | DeHaloAlpha", "clip = havsfunc.DeHalo_alpha(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | BlindDeHalo3", "clip = muvsfunc.BlindDeHalo3(clip, interlaced=False)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | EdgeCleaner", "clip = havsfunc.EdgeCleaner(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | YAHR", "clip = havsfunc.YAHR(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | HQDering", "clip = havsfunc.HQDeringmod(clip, nrmode=2, darkthr=3.0)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "FixChromaBleeding", "clip = havsfunc.FixChromaBleedingMod(input=clip)")) + ret.Add(restoration) FilterCategory.AddDefaults(ScriptEngine.VapourSynth, ret) diff --git a/My Project/Application.Designer.vb b/My Project/Application.Designer.vb new file mode 100644 index 00000000..88dd01c7 --- /dev/null +++ b/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/My Project/Application.myapp b/My Project/Application.myapp new file mode 100644 index 00000000..43cf9b4c --- /dev/null +++ b/My Project/Application.myapp @@ -0,0 +1,9 @@ + + + false + false + 0 + true + 0 + true + \ No newline at end of file diff --git a/My Project/AssemblyInfo.vb b/My Project/AssemblyInfo.vb index 2bd53f9d..62f84226 100644 --- a/My Project/AssemblyInfo.vb +++ b/My Project/AssemblyInfo.vb @@ -7,5 +7,5 @@ Imports System.Runtime.InteropServices - - + + diff --git a/My Project/Resources.Designer.vb b/My Project/Resources.Designer.vb index 8632f25f..48ef4a1a 100644 --- a/My Project/Resources.Designer.vb +++ b/My Project/Resources.Designer.vb @@ -26,7 +26,7 @@ Namespace My.Resources Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _ Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _ - Public Module Resources + Friend Module Resources Private resourceMan As Global.System.Resources.ResourceManager @@ -36,7 +36,7 @@ Namespace My.Resources ''' Returns the cached ResourceManager instance used by this class. ''' _ - Public ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager Get If Object.ReferenceEquals(resourceMan, Nothing) Then Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("StaxRip.Resources", GetType(Resources).Assembly) @@ -51,7 +51,7 @@ Namespace My.Resources ''' resource lookups using this strongly typed resource class. ''' _ - Public Property Culture() As Global.System.Globalization.CultureInfo + Friend Property Culture() As Global.System.Globalization.CultureInfo Get Return resourceCulture End Get @@ -63,7 +63,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property BracketClose() As System.Drawing.Bitmap + Friend ReadOnly Property BracketClose() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("BracketClose", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -73,7 +73,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property BracketOpen() As System.Drawing.Bitmap + Friend ReadOnly Property BracketOpen() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("BracketOpen", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -83,7 +83,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Left1() As System.Drawing.Bitmap + Friend ReadOnly Property Left1() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Left1", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -93,7 +93,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Left2() As System.Drawing.Bitmap + Friend ReadOnly Property Left2() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Left2", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -103,7 +103,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Left3() As System.Drawing.Bitmap + Friend ReadOnly Property Left3() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Left3", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -113,7 +113,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). ''' - Public ReadOnly Property MainIcon() As System.Drawing.Icon + Friend ReadOnly Property MainIcon() As System.Drawing.Icon Get Dim obj As Object = ResourceManager.GetObject("MainIcon", resourceCulture) Return CType(obj,System.Drawing.Icon) @@ -123,7 +123,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Right1() As System.Drawing.Bitmap + Friend ReadOnly Property Right1() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Right1", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -133,7 +133,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Right2() As System.Drawing.Bitmap + Friend ReadOnly Property Right2() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Right2", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -143,7 +143,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Right3() As System.Drawing.Bitmap + Friend ReadOnly Property Right3() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Right3", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -153,7 +153,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property X() As System.Drawing.Bitmap + Friend ReadOnly Property X() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("X", resourceCulture) Return CType(obj,System.Drawing.Bitmap) diff --git a/My Project/app.manifest b/My Project/app.manifest index e93d2f58..40993c7b 100644 --- a/My Project/app.manifest +++ b/My Project/app.manifest @@ -1,14 +1,15 @@  - - + + + + + + @@ -30,14 +31,7 @@ - + \ No newline at end of file diff --git a/Segoe-MDL2-Assets.ttf b/Segoe-MDL2-Assets.ttf new file mode 100644 index 00000000..d3d1ee29 Binary files /dev/null and b/Segoe-MDL2-Assets.ttf differ diff --git a/StaxRip.vbproj b/StaxRip.vbproj index cea4b229..252b62b2 100644 --- a/StaxRip.vbproj +++ b/StaxRip.vbproj @@ -415,14 +415,11 @@ MyApplicationCodeGenerator Application.Designer.vb - - - - - - + + Always + @@ -582,6 +579,9 @@ StringEditorForm.vb + + Always + diff --git a/UI/ImageUtils.vb b/UI/ImageUtils.vb index 71939bed..774af148 100644 --- a/UI/ImageUtils.vb +++ b/UI/ImageUtils.vb @@ -41,11 +41,10 @@ Public Class ImageHelp Dim fontHeight = font.Height Dim bitmap As New Bitmap(CInt(fontHeight * 1.1F), CInt(fontHeight * 1.1F)) Dim graphics = Drawing.Graphics.FromImage(bitmap) - graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias + graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit graphics.DrawString(Convert.ToChar(CInt(symbol)), font, Brushes.Black, -fontHeight * 0.1F, fontHeight * 0.07F) graphics.Dispose() font.Dispose() - Return bitmap End Function End Class @@ -81,7 +80,7 @@ Public Class Thumbnails Dim cachePath = Folder.Settings + "Thumbnails.ffindex" Dim avsdoc As New VideoScript avsdoc.Path = Folder.Settings + "Thumbnails.avs" - avsdoc.Filters.Add(New VideoFilter("FFVideoSource(""" + inputFile + """, cachefile = """ + cachePath + """, colorspace = ""YV12"").LanczosResize(" & width & "," & height & ")")) + avsdoc.Filters.Add(New VideoFilter("FFVideoSource(""" + inputFile + """, cachefile = """ + cachePath + """, colorspace = ""YV12"").Spline64Resize(" & width & "," & height & ")")) avsdoc.Filters.Add(New VideoFilter("ConvertToRGB()")) g.ffmsindex(inputFile, cachePath, False, proj) @@ -202,7 +201,7 @@ Public Class Thumbnails g.DrawString(caption, font, brush, rect, format) format.Alignment = StringAlignment.Far format.LineAlignment = StringAlignment.Center - g.DrawString("StaxRip", New Font(fontname, font.Height * 2, FontStyle.Regular, GraphicsUnit.Pixel), brush, rect, format) + g.DrawString("StaxRip", New Font(fontname, font.Height * 2, FontStyle.Bold, GraphicsUnit.Pixel), brush, rect, format) End Using For x = 0 To bitmaps.Count - 1 diff --git a/app.config b/app.config index 65284fbe..e96024dd 100644 --- a/app.config +++ b/app.config @@ -1,7 +1,7 @@ - + diff --git a/docs/_static/ajax-loader.gif b/docs/_static/ajax-loader.gif deleted file mode 100644 index 61faf8ca..00000000 Binary files a/docs/_static/ajax-loader.gif and /dev/null differ diff --git a/docs/_static/alabaster.css b/docs/_static/alabaster.css deleted file mode 100644 index be65b137..00000000 --- a/docs/_static/alabaster.css +++ /dev/null @@ -1,693 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: 'Garamond', 'Georgia', serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} \ No newline at end of file diff --git a/docs/_static/basic.css b/docs/_static/basic.css deleted file mode 100644 index 19ced105..00000000 --- a/docs/_static/basic.css +++ /dev/null @@ -1,665 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_static/comment-bright.png b/docs/_static/comment-bright.png deleted file mode 100644 index 15e27edb..00000000 Binary files a/docs/_static/comment-bright.png and /dev/null differ diff --git a/docs/_static/comment-close.png b/docs/_static/comment-close.png deleted file mode 100644 index 4d91bcf5..00000000 Binary files a/docs/_static/comment-close.png and /dev/null differ diff --git a/docs/_static/comment.png b/docs/_static/comment.png deleted file mode 100644 index dfbc0cbd..00000000 Binary files a/docs/_static/comment.png and /dev/null differ diff --git a/docs/_static/custom.css b/docs/_static/custom.css deleted file mode 100644 index 2a924f1d..00000000 --- a/docs/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js deleted file mode 100644 index d8928926..00000000 --- a/docs/_static/doctools.js +++ /dev/null @@ -1,313 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var bbox = span.getBBox(); - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); \ No newline at end of file diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js deleted file mode 100644 index ca7136ea..00000000 --- a/docs/_static/documentation_options.js +++ /dev/null @@ -1,9 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.9', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt' -}; \ No newline at end of file diff --git a/docs/_static/down-pressed.png b/docs/_static/down-pressed.png deleted file mode 100644 index 5756c8ca..00000000 Binary files a/docs/_static/down-pressed.png and /dev/null differ diff --git a/docs/_static/down.png b/docs/_static/down.png deleted file mode 100644 index 1b3bdad2..00000000 Binary files a/docs/_static/down.png and /dev/null differ diff --git a/docs/_static/file.png b/docs/_static/file.png deleted file mode 100644 index a858a410..00000000 Binary files a/docs/_static/file.png and /dev/null differ diff --git a/docs/_static/jquery-3.1.0.js b/docs/_static/jquery-3.1.0.js deleted file mode 100644 index f2fc2747..00000000 --- a/docs/_static/jquery-3.1.0.js +++ /dev/null @@ -1,10074 +0,0 @@ -/*eslint-disable no-unused-vars*/ -/*! - * jQuery JavaScript Library v3.1.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2016-07-07T21:44Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.1.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.0 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-01-04 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - // Known :disabled false positives: - // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) - // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Check form elements and option elements for explicit disabling - return "label" in elem && elem.disabled === disabled || - "form" in elem && elem.disabled === disabled || - - // Check non-disabled form elements for fieldset[disabled] ancestors - "form" in elem && elem.disabled === false && ( - // Support: IE6-11+ - // Ancestry is covered for us - elem.isDisabled === disabled || - - // Otherwise, assume any non-