update readme

This commit is contained in:
Frank Skare
2019-10-15 04:58:52 +02:00
parent e3227de8b4
commit ca153fecfc
9 changed files with 401 additions and 226 deletions

View File

@@ -81,7 +81,7 @@ Table of contents
- File history feature to log time and filename
- A-B loop feature
- Watch later feature to save the position
- Files can be added to the playlist from explorer using --queue with [Open with++](https://github.com/stax76/OpenWithPlusPlus#add-to-mpvnet-playlist)
- Files can be added to the playlist from Windows File Explorer using the shell extension [Open with++](https://github.com/stax76/OpenWithPlusPlus#add-to-mpvnet-playlist) and the --queue switch
- [Manual](#manual)
### Screenshots

View File

@@ -15,8 +15,10 @@ namespace DynamicGUI
public static List<SettingBase> LoadSettings(string content)
{
TomlTable table;
using (StringReader reader = new StringReader(content))
table = TOML.Parse(reader);
List<SettingBase> settingsList = new List<SettingBase>();
foreach (TomlTable setting in table["settings"])
@@ -34,12 +36,15 @@ namespace DynamicGUI
{
var opt = new OptionSettingOption();
opt.Name = option["name"];
if (option.HasKey("help"))
opt.Help = option["help"];
if (option.HasKey("text"))
opt.Text = option["text"];
else if (opt.Name == optionSetting.Default)
opt.Text = opt.Name + " (Default)";
opt.OptionSetting = optionSetting;
optionSetting.Options.Add(opt);
}
@@ -52,6 +57,7 @@ namespace DynamicGUI
}
baseSetting.Name = setting["name"];
baseSetting.File = setting["file"];
baseSetting.Filter = setting["filter"];
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
@@ -65,9 +71,22 @@ namespace DynamicGUI
}
}
public class ConfItem
{
public string Name { get; set; } = "";
public string Value { get; set; } = "";
public string Comment { get; set; } = "";
public string LineComment { get; set; } = "";
public string Section { get; set; } = "";
public string File { get; set; } = "";
public bool IsSectionItem { get; set; }
public SettingBase SettingBase { get; set; }
}
public abstract class SettingBase
{
public string Name { get; set; }
public string File { get; set; }
public string Value { get; set; }
public string Help { get; set; }
public string Default { get; set; }
@@ -75,6 +94,7 @@ namespace DynamicGUI
public string Filter { get; set; }
public string Type { get; set; }
public int Width { get; set; }
public ConfItem ConfItem { get; set; }
}
public class StringSetting : SettingBase
@@ -104,7 +124,10 @@ namespace DynamicGUI
public bool Checked
{
get => OptionSetting.Value == Name ;
set { if (value) OptionSetting.Value = Name; }
set {
if (value)
OptionSetting.Value = Name;
}
}
public Visibility Visibility

View File

@@ -60,6 +60,23 @@ namespace mpvnet.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to [[settings]]
///name = &quot;hwdec&quot;
///file = &quot;mpv&quot;
///default = &quot;no&quot;
///filter = &quot;Video&quot;
///url = &quot;https://mpv.io/manual/master/#options-hwdec&quot;
///help = &quot;Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If hardware decoding is not possible, mpv will fall back on software decoding.\n\nFor more information visit:&quot;
///options = [{ name = &quot;no&quot;, help = &quot;always use software decoding&quot; },
/// { name = &quot;auto&quot;, hel [rest of string was truncated]&quot;;.
/// </summary>
internal static string ConfToml {
get {
return ResourceManager.GetString("ConfToml", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to
/// # This file defines the key and mouse bindings and the context menu
@@ -104,22 +121,6 @@ namespace mpvnet.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to [[settings]]
///name = &quot;hwdec&quot;
///default = &quot;no&quot;
///filter = &quot;Video&quot;
///url = &quot;https://mpv.io/manual/master/#options-hwdec&quot;
///help = &quot;Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If hardware decoding is not possible, mpv will fall back on software decoding.\n\nFor more information visit:&quot;
///options = [{ name = &quot;no&quot;, help = &quot;always use software decoding&quot; },
/// { name = &quot;auto&quot;, help = &quot;enable be [rest of string was truncated]&quot;;.
/// </summary>
internal static string mpvConfToml {
get {
return ResourceManager.GetString("mpvConfToml", resourceCulture);
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -139,19 +140,5 @@ namespace mpvnet.Properties {
return ResourceManager.GetString("mpvNetConf", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to [[settings]]
///name = &quot;process-instance&quot;
///default = &quot;single&quot;
///filter = &quot;General&quot;
///help = &quot;Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files and URLs.&quot;
///options = [{ name = &quot;multi&quot;, help = &quot;Create a new process everytime the shell starts mpv.net [rest of string was truncated]&quot;;.
/// </summary>
internal static string mpvNetConfToml {
get {
return ResourceManager.GetString("mpvNetConfToml", resourceCulture);
}
}
}
}

View File

@@ -118,22 +118,19 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ConfToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="inputConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\inputConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252</value>
</data>
<data name="mpvConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\mpvConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="mpvConfToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\mpvConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="mpvnet" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\mpvnet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mpvNetConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\mpvNetConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="mpvNetConfToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\mpvNetConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
</root>

View File

@@ -1,5 +1,6 @@
[[settings]]
name = "hwdec"
file = "mpv"
default = "no"
filter = "Video"
url = "https://mpv.io/manual/master/#options-hwdec"
@@ -21,6 +22,7 @@ options = [{ name = "no", help = "always use software decoding" },
[[settings]]
name = "gpu-api"
file = "mpv"
default = "auto"
filter = "Video"
help = "Controls which type of graphics APIs will be accepted. Auto uses d3d11, it should only be changed in case of problems, Vulkan is not recommended."
@@ -31,6 +33,7 @@ options = [{ name = "auto", help = "Use any available API" },
[[settings]]
name = "gpu-context"
file = "mpv"
default = "auto"
filter = "Video"
options = [{ name = "auto", help = "auto-select" },
@@ -42,6 +45,7 @@ options = [{ name = "auto", help = "auto-select" },
[[settings]]
name = "vo"
file = "mpv"
default = "gpu"
filter = "Video"
help = "Video output drivers to be used.\n\nFor more information visit:"
@@ -51,6 +55,7 @@ options = [{ name = "gpu", help = "General purpose, customizable, GPU-accel
[[settings]]
name = "video-sync"
file = "mpv"
default = "audio"
filter = "Video"
help = "How the player synchronizes audio and video.\n\nFor more information visit:"
@@ -66,6 +71,7 @@ options = [{ name = "audio" },
[[settings]]
name = "scale"
file = "mpv"
default = "bilinear"
filter = "Video"
help = "The GPU renderer filter function to use when upscaling video. There are some more filters, but most are not as useful. For a complete list, pass help as value, e.g.: mpv --scale=help"
@@ -80,6 +86,7 @@ options = [{ name = "bilinear", help = "Bilinear hardware texture filter
[[settings]]
name = "cscale"
file = "mpv"
default = "bilinear"
filter = "Video"
help = "As scale, but for interpolating chroma information. If the image is not subsampled, this option is ignored entirely."
@@ -94,6 +101,7 @@ options = [{ name = "bilinear", help = "Bilinear hardware texture filter
[[settings]]
name = "dscale"
file = "mpv"
default = "bilinear"
filter = "Video"
help = "Like scale, but apply these filters on downscaling instead. If this option is unset, the filter implied by scale will be applied."
@@ -108,6 +116,7 @@ options = [{ name = "bilinear", help = "Bilinear hardware texture filter
[[settings]]
name = "dither-depth"
file = "mpv"
default = "no"
filter = "Video"
help = "Set dither target depth to N. Note that the depth of the connected video display device cannot be detected. Often, LCD panels will do dithering on their own, which conflicts with this option and leads to ugly output."
@@ -117,6 +126,7 @@ options = [{ name = "no", help = "Disable any dithering done by mpv." },
[[settings]]
name = "correct-downscaling"
file = "mpv"
default = "no"
filter = "Video"
help = "When using convolution based filters, extend the filter size when downscaling. Increases quality, but reduces performance while downscaling.\n\nThis will perform slightly sub-optimally for anamorphic video (but still better than without it) since it will extend the size to match only the milder of the scale factors between the axes."
@@ -125,6 +135,7 @@ options = [{ name = "yes" },
[[settings]]
name = "sigmoid-upscaling"
file = "mpv"
default = "no"
filter = "Video"
help = "When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts. This also implies linear-scaling."
@@ -133,6 +144,7 @@ options = [{ name = "yes" },
[[settings]]
name = "deband"
file = "mpv"
default = "no"
filter = "Video"
help = "Enable the debanding algorithm. This greatly reduces the amount of visible banding, blocking and other quantization artifacts, at the expense of very slightly blurring some of the finest details. In practice, it's virtually always an improvement - the only reason to disable it would be for performance."
@@ -141,18 +153,29 @@ options = [{ name = "yes" },
[[settings]]
name = "volume"
default = "100"
file = "mpv"
filter = "Audio"
help = "Set the startup volume. 0 means silence, 100 means no volume reduction or amplification. Negative values can be passed for compatibility, but are treated as 0. Since mpv 0.18.1, this always controls the internal mixer (aka \"softvol\"). Default: 100"
[[settings]]
name = "remember-volume"
file = "mpvnet"
default = "yes"
filter = "Audio"
help = "Save volume and mute on exit and restore it on start. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "alang"
file = "mpv"
filter = "Audio"
type = "string"
help = "Specify a priority list of audio languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two-letter language codes, Matroska, MPEG-TS and NUT use ISO 639-2 three-letter language codes, while OGM uses a free-form identifier. See also aid.\n\nExamples\n\nmpv dvd://1 alang=hu,en chooses the Hungarian language track on a DVD and falls back on English if Hungarian is not available.\n\nmpv alang=jpn example.mkv plays a Matroska file with Japanese audio."
[[settings]]
name = "audio-file-auto"
file = "mpv"
default = "no"
filter = "Audio"
help = "Load additional audio files matching the video filename. The parameter specifies how external audio files are matched."
@@ -163,12 +186,14 @@ options = [{ name = "no", help = "Don't automatically load external audio fil
[[settings]]
name = "slang"
file = "mpv"
filter = "Subtitle"
type = "string"
help = "Specify a priority list of subtitle languages to use. Different container formats employ different language codes. DVDs use ISO 639-1 two letter language codes, Matroska uses ISO 639-2 three letter language codes while OGM uses a free-form identifier. See also sid."
[[settings]]
name = "sub-auto"
file = "mpv"
default = "exact"
filter = "Subtitle"
help = "Load additional subtitle files matching the video filename. The parameter specifies how external subtitle files are matched. exact is enabled by default."
@@ -179,35 +204,41 @@ options = [{ name = "no", help = "Don't automatically load external subtitle
[[settings]]
name = "sub-font"
file = "mpv"
filter = "Subtitle"
type = "string"
help = "Specify font to use for subtitles that do not themselves specify a particular font. The default is sans-serif."
[[settings]]
name = "sub-font-size"
file = "mpv"
filter = "Subtitle"
help = "Specify the sub font size. The unit is the size in scaled pixels at a window height of 720. The actual pixel size is scaled with the window height: if the window height is larger or smaller than 720, the actual size of the text increases or decreases as well. Default: 55"
[[settings]]
name = "sub-color"
file = "mpv"
type = "color"
filter = "Subtitle"
help = "Specify the color used for unstyled text subtitles.\n\nThe color is specified in the form r/g/b, where each color component is specified as number in the range 0.0 to 1.0. It's also possible to specify the transparency by using r/g/b/a, where the alpha value 0 means fully transparent, and 1.0 means opaque. If the alpha component is not given, the color is 100% opaque.\n\nPassing a single number to the option sets the sub to gray, and the form gray/a lets you specify alpha additionally.\n\nExamples\n\n1.0/0.0/0.0 set sub to opaque red\n1.0/0.0/0.0/0.75 set sub to opaque red with 75% alpha\n0.5/0.75 set sub to 50% gray with 75% alpha\n\nAlternatively, the color can be specified as a RGB hex triplet in the form #RRGGBB, where each 2-digit group expresses a color value in the range 0 (00) to 255 (FF). For example, #FF0000 is red. This is similar to web colors. Alpha is given with #AARRGGBB.\n\nExamples\n\n#FF0000 set sub to opaque red\n#C0808080 set sub to 50% gray with 75% alpha"
[[settings]]
name = "sub-border-color"
file = "mpv"
type = "color"
filter = "Subtitle"
help = "See sub-color. Color used for the sub font border. Ignored when sub-back-color is specified (or more exactly: when that option is not set to completely transparent)."
[[settings]]
name = "sub-back-color"
file = "mpv"
type = "color"
filter = "Subtitle"
help = "See sub-color. Color used for sub text background. You can use sub-shadow-offset to change its size relative to the text."
[[settings]]
name = "fullscreen"
file = "mpv"
default = "no"
filter = "Screen"
help = "Start the player in fullscreen mode."
@@ -216,6 +247,7 @@ options = [{ name = "yes" },
[[settings]]
name = "border"
file = "mpv"
default = "yes"
filter = "Screen"
help = "Show window with decoration (titlebar, border)."
@@ -224,11 +256,13 @@ options = [{ name = "yes" },
[[settings]]
name = "screen"
file = "mpv"
filter = "Screen"
help = "<0-32> In multi-monitor configurations (i.e. a single desktop that spans across multiple displays), this option tells mpv which screen to display the video on."
[[settings]]
name = "osd-playing-msg"
file = "mpv"
width = 300
filter = "Screen"
type = "string"
@@ -237,12 +271,13 @@ url = "https://mpv.io/manual/master/#property-expansion"
[[settings]]
name = "osd-font-size"
default = "55"
file = "mpv"
filter = "Screen"
help = "Specify the OSD font size. See sub-font-size for details. Default: 55"
[[settings]]
name = "osd-scale-by-window"
file = "mpv"
default = "yes"
filter = "Screen"
help = "Whether to scale the OSD with the window size. If this is disabled, osd-font-size and other OSD options that use scaled pixels are always in actual pixels. The effect is that changing the window size won't change the OSD font size."
@@ -251,21 +286,64 @@ options = [{ name = "yes" },
[[settings]]
name = "autofit"
file = "mpv"
filter = "Screen"
help = "<int> Initial window height in percent. Default: 50"
[[settings]]
name = "autofit-smaller"
file = "mpv"
filter = "Screen"
help = "<int> Minimum window height in percent. Default: 40"
[[settings]]
name = "autofit-larger"
file = "mpv"
filter = "Screen"
help = "<int> Maximum window height in percent. Default: 75"
[[settings]]
name = "start-size"
file = "mpvnet"
default = "previous"
filter = "Screen"
help = "Setting to remember the window height in the current session, otherwise the video's native resolution is used. (mpv.net specific setting)"
options = [{ name = "video", help = "Window size is set to native video resolution" },
{ name = "previous", help = "Window size is remembered but only from the current session" }]
[[settings]]
name = "start-threshold"
file = "mpvnet"
filter = "Screen"
help = "Threshold in milliseconds to wait for libmpv returning the video resolution before the window is shown, otherwise default dimensions are used as defined by autofit and start-size. Default: 1500 (mpv.net specific setting)"
[[settings]]
name = "minimum-aspect-ratio"
file = "mpvnet"
filter = "Screen"
help = "<float> Minimum aspect ratio for the window. Default: 1.3 (mpv.net specific setting)"
[[settings]]
name = "remember-position"
file = "mpvnet"
default = "no"
filter = "Screen"
help = "Save the window position on exit. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "maximized"
file = "mpvnet"
default = "no"
filter = "Screen"
help = "Start with a maximized window. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "screenshot-directory"
file = "mpv"
width = 500
type = "folder"
filter = "Screen"
@@ -273,6 +351,7 @@ help = "Store screenshots in this directory. This path is joined with the filena
[[settings]]
name = "screenshot-format"
file = "mpv"
default = "jpg"
filter = "Screen"
help = "Set the image file type used for saving screenshots."
@@ -281,6 +360,7 @@ options = [{ name = "jpg" },
[[settings]]
name = "screenshot-tag-colorspace"
file = "mpv"
default = "no"
filter = "Screen"
help = "Tag screenshots with the appropriate colorspace. Note that not all formats are supported."
@@ -289,6 +369,7 @@ options = [{ name = "yes" },
[[settings]]
name = "screenshot-high-bit-depth"
file = "mpv"
default = "yes"
filter = "Screen"
help = "If possible, write screenshots with a bit depth similar to the source video. This is interesting in particular for PNG, as this sometimes triggers writing 16 bit PNGs with huge file sizes. This will also include an unused alpha channel in the resulting files if 16 bit is used."
@@ -297,6 +378,7 @@ options = [{ name = "yes" },
[[settings]]
name = "screenshot-jpeg-source-chroma"
file = "mpv"
default = "yes"
filter = "Screen"
help = "Write JPEG files with the same chroma subsampling as the video. If disabled, the libjpeg default is used."
@@ -305,6 +387,7 @@ options = [{ name = "yes" },
[[settings]]
name = "screenshot-template"
file = "mpv"
filter = "Screen"
type = "string"
help = "Specify the filename template used to save screenshots. The template specifies the filename without file extension, and can contain format specifiers, which will be substituted when taking a screenshot. By default, the template is mpv-shot%n, which results in filenames like mpv-shot0012.png for example.\n\nFind the full documentation here:"
@@ -312,21 +395,25 @@ url = "https://mpv.io/manual/master/#options-screenshot-template"
[[settings]]
name = "screenshot-jpeg-quality"
file = "mpv"
filter = "Screen"
help = "<0-100> Set the JPEG quality level. Higher means better quality. The default is 90."
[[settings]]
name = "screenshot-png-compression"
file = "mpv"
filter = "Screen"
help = "<0-9> Set the PNG compression level. Higher means better compression. This will affect the file size of the written screenshot file and the time it takes to write a screenshot. Too high compression might occupy enough CPU time to interrupt playback. The default is 7."
[[settings]]
name = "screenshot-png-filter"
file = "mpv"
filter = "Screen"
help = "<0-5> Set the filter applied prior to PNG compression. 0 is none, 1 is 'sub', 2 is 'up', 3 is 'average', 4 is 'Paeth', and 5 is 'mixed'. This affects the level of compression that can be achieved. For most images, 'mixed' achieves the best compression ratio, hence it is the default."
[[settings]]
name = "taskbar-progress"
file = "mpv"
default = "yes"
filter = "Playback"
help = "Show progress in taskbar."
@@ -335,6 +422,7 @@ options = [{ name = "yes" },
[[settings]]
name = "keep-open-pause"
file = "mpv"
default = "yes"
filter = "Playback"
help = "If set to no, instead of pausing when keep-open is active, just stop at end of file and continue playing forward when you seek backwards until end where it stops again."
@@ -343,6 +431,7 @@ options = [{ name = "yes" },
[[settings]]
name = "keep-open"
file = "mpv"
default = "no"
filter = "Playback"
help = "Using no, mpv would terminate after the last file but mpv.net never terminates automatically."
@@ -352,29 +441,22 @@ options = [{ name = "yes", help = "If the current file ends, go to the next f
[[settings]]
name = "loop-file"
file = "mpv"
filter = "Playback"
help = "<N|inf|no> Loop a single file N times. inf means forever, no means normal playback.\n\nThe difference to loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file. loop is an alias for this option."
[[settings]]
name = "save-position-on-quit"
file = "mpv"
default = "no"
filter = "Playback"
help = "Always save the current playback position on quit. When this file is played again later, the player will seek to the old playback position on start. This does not happen if playback of a file is stopped in any other way than quitting. For example, going to the next file in the playlist will not save the position, and start playback at beginning the next time the file is played.\n\nThis behavior is disabled by default, but is always available when quitting the player with Shift+Q."
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "input-ar-delay"
filter = "Input"
help = "Delay in milliseconds before we start to autorepeat a key (0 to disable)."
[[settings]]
name = "input-ar-rate"
filter = "Input"
help = "Number of key presses to generate per second on autorepeat."
[[settings]]
name = "hr-seek"
file = "mpv"
default = "absolute"
filter = "Playback"
help = "Select when to use precise seeks that are not limited to keyframes. Such seeks require decoding video from the previous keyframe up to the target position and so can take some time depending on decoding performance. For some video formats, precise seeks are disabled. This option selects the default choice to use for seeks; it is possible to explicitly override that default in the definition of key bindings and in input commands."
@@ -385,6 +467,7 @@ options = [{ name = "yes", help = "Use precise seeks whenever possible." },
[[settings]]
name = "track-auto-selection"
file = "mpv"
default = "yes"
filter = "Playback"
help = "Enable the default track auto-selection. Enabling this will make the player select streams according to aid, alang, and others. If it is disabled, no tracks are selected. In addition, the player will not exit if no tracks are selected, and wait instead (this wait mode is similar to pausing, but the pause option is not set).\n\nThis is useful with lavfi-complex: you can start playback in this mode, and then set select tracks at runtime by setting the filter graph. Note that if lavfi-complex is set before playback is started, the referenced tracks are always selected."
@@ -393,5 +476,85 @@ options = [{ name = "yes" },
[[settings]]
name = "loop-playlist"
file = "mpv"
filter = "Playback"
help = "<N|inf|force|no> Loops playback N times. A value of 1 plays it one time (default), 2 two times, etc. inf means forever. no is the same as 1 and disables looping. If several files are specified on command line, the entire playlist is looped. The force mode is like inf, but does not skip playlist entries which have been marked as failing. This means the player might waste CPU time trying to loop a file that doesn't exist. But it might be useful for playing webradios under very bad network conditions."
[[settings]]
name = "auto-load-folder"
file = "mpvnet"
default = "yes"
filter = "Playback"
help = "For single files automatically load the entire directory into the playlist. Can be suppressed via shift key. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "input-ar-delay"
file = "mpv"
filter = "Input"
help = "Delay in milliseconds before we start to autorepeat a key (0 to disable)."
[[settings]]
name = "input-ar-rate"
file = "mpv"
filter = "Input"
help = "Number of key presses to generate per second on autorepeat."
[[settings]]
name = "process-instance"
file = "mpvnet"
default = "single"
filter = "General"
help = "Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files and URLs."
options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net" },
{ name = "single", help = "Force a single process everytime the shell starts mpv.net" },
{ name = "queue", help = "Force a single process and add files to playlist" }]
[[settings]]
name = "recent-count"
file = "mpvnet"
filter = "General"
help = "<int> Amount of recent files to be remembered. Default: 15 (mpv.net specific setting)"
[[settings]]
name = "debug-mode"
file = "mpvnet"
default = "no"
filter = "General"
help = "Enable this only when a developer asks for it. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "dark-mode"
file = "mpvnet"
default = "always"
filter = "UI"
help = "Enables a dark theme. (mpv.net specific setting)"
options = [{ name = "always" },
{ name = "system" , help = "Available on Windows 10 or higher" },
{ name = "never" }]
[[settings]]
name = "dark-color"
file = "mpvnet"
type = "color"
filter = "UI"
help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
[[settings]]
name = "light-color"
file = "mpvnet"
type = "color"
filter = "UI"
help = "Theme color used when dark-mode is disabled. Leave empty to use OS theme. (mpv.net specific setting)"
[[settings]]
name = "themed-menu"
file = "mpvnet"
default = "no"
filter = "UI"
help = "Follow theme color in context menu. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]

View File

@@ -4,7 +4,7 @@ input-ar-rate = 20
keep-open = yes
keep-open-pause = no
osd-playing-msg = '${filename}'
script-opts=osc-scalewindowed=1.5
script-opts = osc-scalewindowed=1.5
screenshot-directory = '~~desktop/'
cscale = spline36
dscale = spline36

View File

@@ -1,100 +0,0 @@
[[settings]]
name = "process-instance"
default = "single"
filter = "General"
help = "Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files and URLs."
options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net" },
{ name = "single", help = "Force a single process everytime the shell starts mpv.net" },
{ name = "queue", help = "Force a single process and add files to playlist" }]
[[settings]]
name = "recent-count"
filter = "General"
help = "<int> Amount of recent files to be remembered. Default: 15 (mpv.net specific setting)"
[[settings]]
name = "start-size"
default = "previous"
filter = "Screen"
help = "Setting to remember the window height in the current session, otherwise the video's native resolution is used. (mpv.net specific setting)"
options = [{ name = "video", help = "Window size is set to native video resolution" },
{ name = "previous", help = "Window size is remembered but only from the current session" }]
[[settings]]
name = "start-threshold"
filter = "Screen"
help = "Threshold in milliseconds to wait for libmpv returning the video resolution before the window is shown, otherwise default dimensions are used as defined by autofit and start-size. Default: 1500 (mpv.net specific setting)"
[[settings]]
name = "minimum-aspect-ratio"
filter = "Screen"
help = "<float> Minimum aspect ratio for the window. Default: 1.3 (mpv.net specific setting)"
[[settings]]
name = "remember-position"
default = "no"
filter = "Screen"
help = "Save the window position on exit. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "maximized"
default = "no"
filter = "Screen"
help = "Start with a maximized window. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "remember-volume"
default = "yes"
filter = "Audio"
help = "Save volume and mute on exit and restore it on start. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "auto-load-folder"
default = "yes"
filter = "Playback"
help = "For single files automatically load the entire directory into the playlist. Can be suppressed via shift key. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "dark-mode"
default = "always"
filter = "UI"
help = "Enables a dark theme. (mpv.net specific setting)"
options = [{ name = "always" },
{ name = "system" , help = "Available on Windows 10 or higher" },
{ name = "never" }]
[[settings]]
name = "dark-color"
type = "color"
filter = "UI"
help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
[[settings]]
name = "light-color"
type = "color"
filter = "UI"
help = "Theme color used when dark-mode is disabled. Leave empty to use OS theme. (mpv.net specific setting)"
[[settings]]
name = "themed-menu"
default = "no"
filter = "UI"
help = "Follow theme color in context menu. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]
[[settings]]
name = "debug-mode"
default = "no"
filter = "General"
help = "Enable this only when a developer asks for it. (mpv.net specific setting)"
options = [{ name = "yes" },
{ name = "no" }]

View File

@@ -10,13 +10,14 @@ using System.Windows.Media;
using System.Linq;
using DynamicGUI;
using System.Text;
namespace mpvnet
{
public partial class ConfWindow : Window
{
private List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvConfToml);
private List<SettingBase> NetSettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvNetConfToml);
private List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.ConfToml);
private List<ConfItem> ConfItems = new List<ConfItem>();
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
string InitialContent;
@@ -25,10 +26,10 @@ namespace mpvnet
InitializeComponent();
DataContext = this;
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
LoadSettings(SettingsDefinitions, Conf);
LoadSettings(NetSettingsDefinitions, NetConf);
InitialContent = GetContent(mp.ConfPath, Conf, SettingsDefinitions) +
GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
LoadConf(mp.ConfPath);
LoadConf(App.ConfPath);
LoadSettings();
InitialContent = GetCompareString();
SearchControl.Text = RegHelp.GetString(App.RegPath, "ConfigEditorSearch");
if (App.IsDarkMode)
@@ -47,19 +48,20 @@ namespace mpvnet
public static readonly DependencyProperty Foreground2Property =
DependencyProperty.Register("Foreground2", typeof(Brush), typeof(ConfWindow), new PropertyMetadata(Brushes.DarkSlateGray));
private void LoadSettings(List<SettingBase> settingsDefinitions,
Dictionary<string, string> confSettings)
private void LoadSettings()
{
foreach (SettingBase setting in settingsDefinitions)
foreach (SettingBase setting in SettingsDefinitions)
{
if (!FilterStrings.Contains(setting.Filter))
FilterStrings.Add(setting.Filter);
foreach (var pair in confSettings)
foreach (ConfItem confItem in ConfItems)
{
if (setting.Name == pair.Key)
if (setting.Name == confItem.Name && confItem.Section == "" && !confItem.IsSectionItem)
{
setting.Value = pair.Value.Trim('\'', '"');
setting.Value = confItem.Value.Trim('\'', '"');
setting.ConfItem = confItem;
confItem.SettingBase = setting;
continue;
}
}
@@ -80,85 +82,188 @@ namespace mpvnet
}
}
private Dictionary<string, string> _Conf;
public Dictionary<string, string> Conf {
get {
if (_Conf == null) _Conf = LoadConf(mp.ConfPath);
return _Conf;
}
}
private Dictionary<string, string> _NetConf;
public Dictionary<string, string> NetConf {
get {
if (_NetConf == null) _NetConf = LoadConf(App.ConfPath);
return _NetConf;
}
}
private Dictionary<string, string> LoadConf(string filePath)
{
Dictionary<string, string> conf = new Dictionary<string, string>();
if (File.Exists(filePath))
{
foreach (string i in File.ReadAllLines(filePath))
{
if (i.Contains("="))
{
int pos = i.IndexOf("=");
string left = i.Substring(0, pos).Trim().ToLower();
string right = i.Substring(pos + 1).Trim();
if (left.StartsWith("#")) continue;
if (left == "fs") left = "fullscreen";
if (left == "loop") left = "loop-file";
conf[left] = right;
}
}
}
return conf;
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
RegHelp.SetObject(App.RegPath, "ConfigEditorSearch", SearchControl.Text);
string content = GetContent(mp.ConfPath, Conf, SettingsDefinitions);
string netContent = GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
if (InitialContent == content + netContent) return;
File.WriteAllText(mp.ConfPath, content);
File.WriteAllText(App.ConfPath, netContent);
if (InitialContent == GetCompareString())
return;
File.WriteAllText(mp.ConfPath, GetContent("mpv"));
File.WriteAllText(App.ConfPath, GetContent("mpvnet"));
Msg.Show("Changes will be available on next mpv.net startup.");
}
string GetContent(string filePath, Dictionary<string, string> confSettings, List<SettingBase> settings)
string GetCompareString()
{
string content = "";
return string.Join("", SettingsDefinitions.Select(item => item.Name + item.Value).ToArray());
}
foreach (SettingBase setting in settings)
string SectionComment;
void LoadConf(string file)
{
if (!File.Exists(file))
return;
string comment = "";
string section = "";
bool isSectionItem = false; ;
foreach (string currentLine in File.ReadAllLines(file))
{
string line = currentLine.Trim();
if (line == "")
{
comment += "\r\n";
}
else if (line.StartsWith("#"))
{
comment += line.Trim() + "\r\n";
}
else if (line.StartsWith("[") && line.Contains("]"))
{
section = line.Substring(0, line.IndexOf("]") + 1);
if (SectionComment == null)
SectionComment = comment;
comment = "";
isSectionItem = true;
}
else if (line.Contains("="))
{
ConfItem item = new ConfItem();
item.File = Path.GetFileNameWithoutExtension(file);
item.IsSectionItem = isSectionItem;
item.Comment = comment;
comment = "";
item.Section = section;
section = "";
if (line.Contains("#") && !line.Contains("'") && !line.Contains("\""))
{
item.LineComment = line.Substring(line.IndexOf("#")).Trim();
line = line.Substring(0, line.IndexOf("#")).Trim();
}
int pos = line.IndexOf("=");
string left = line.Substring(0, pos).Trim().ToLower();
string right = line.Substring(pos + 1).Trim();
if (left == "fs")
left = "fullscreen";
if (left == "loop")
left = "loop-file";
item.Name = left;
item.Value = right;
ConfItems.Add(item);
}
}
}
string GetContent(string name)
{
StringBuilder sb = new StringBuilder();
List<string> namesWritten = new List<string>();
foreach (ConfItem item in ConfItems)
{
if (name != item.File || item.Section != "" || item.IsSectionItem)
continue;
if (item.Comment != "")
sb.Append(item.Comment);
if (item.SettingBase == null)
{
sb.Append(item.Name + " = " + item.Value);
if (item.LineComment != "")
sb.Append(" " + item.LineComment);
sb.AppendLine();
namesWritten.Add(item.Name);
}
else if ((item.SettingBase.Value ?? "") != item.SettingBase.Default)
{
string value = "";
if (item.SettingBase.Type == "string" ||
item.SettingBase.Type == "folder" ||
item.SettingBase.Type == "color")
value = "'" + item.SettingBase.Value + "'";
else
value = item.SettingBase.Value;
sb.Append(item.Name + " = " + value);
if (item.LineComment != "")
sb.Append(" " + item.LineComment);
sb.AppendLine();
namesWritten.Add(item.Name);
}
}
if (SectionComment != "")
sb.Append(SectionComment);
if (!sb.ToString().Contains("\r\n# Editor"))
sb.AppendLine("\r\n# Editor");
foreach (SettingBase setting in SettingsDefinitions)
{
if (name != setting.File || namesWritten.Contains(setting.Name))
continue;
if ((setting.Value ?? "") != setting.Default)
{
string value = "";
if (setting.Type == "string" ||
setting.Type == "folder" ||
setting.Type == "color")
confSettings[setting.Name] = "'" + setting.Value + "'";
value = "'" + setting.Value + "'";
else
confSettings[setting.Name] = setting.Value;
value = setting.Value;
if (confSettings.ContainsKey(setting.Name) &&
(setting.Value ?? "") == setting.Default ||
(setting.Value ?? "") == "")
confSettings.Remove(setting.Name);
sb.AppendLine(setting.Name + " = " + value);
}
}
foreach (var i in confSettings)
content = content + $"{i.Key} = {i.Value}\r\n";
foreach (ConfItem item in ConfItems)
{
if (name != item.File || (item.Section == "" && !item.IsSectionItem))
continue;
return content;
if (item.Section != "")
{
if (!sb.ToString().EndsWith("\r\n\r\n"))
sb.AppendLine();
sb.AppendLine(item.Section);
}
if (item.Comment != "")
sb.Append(item.Comment);
sb.Append(item.Name + " = " + item.Value);
if (item.LineComment != "")
sb.Append(" " + item.LineComment);
sb.AppendLine();
namesWritten.Add(item.Name);
}
return "\r\n" + sb.ToString().Trim() + "\r\n";
}
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
@@ -210,7 +315,7 @@ namespace mpvnet
private void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
{
Msg.Show("mpv.conf Preview", GetContent(mp.ConfPath, Conf, SettingsDefinitions));
Msg.Show("mpv.conf Preview", GetContent("mpv"));
}
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
@@ -226,6 +331,7 @@ namespace mpvnet
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.Key == Key.Escape)
Close();
}

View File

@@ -239,11 +239,10 @@
</Content>
<Content Include="mpvnet.ico" />
<Content Include="Resources\mpvConf.txt" />
<Content Include="Resources\mpvConfToml.txt" />
<Content Include="Resources\ConfToml.txt" />
<None Include="Resources\mpvnet.ico" />
<None Include="Resources\mpvnet.png" />
<None Include="Resources\mpvNetConf.txt" />
<Content Include="Resources\mpvNetConfToml.txt" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />