Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4492a423b4 | ||
|
|
39f6f4de0d | ||
|
|
b16bcd0295 | ||
|
|
1caa814c95 | ||
|
|
bbf0f6e127 | ||
|
|
22bd5a5999 | ||
|
|
cb146c1cf1 | ||
|
|
1671cd6c3c | ||
|
|
541ac5f6d5 |
52
README.md
52
README.md
@@ -19,10 +19,12 @@ Table of contents
|
|||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- Customizable context menu defined in the same file as the keybindings
|
- Customizable context menu defined in the same file as the key bindings
|
||||||
- Addon API for .NET languages
|
- Searchable options dialog with modern UI as mpv compatible standalone application
|
||||||
- Scripting API for Python, C#, Lua, JavaScript and PowerShell
|
- Searchable input (key/mouse) binding editor with modern UI as mpv compatible standalone application
|
||||||
- mpv's OSC, IPC, conf files and more
|
- Rich addon API for .NET languages
|
||||||
|
- Rich scripting API for Python, C#, Lua, JavaScript and PowerShell
|
||||||
|
- mpv's OSC (on screen controller (play control bar)), IPC, conf files
|
||||||
|
|
||||||
### Screenshots
|
### Screenshots
|
||||||
|
|
||||||
@@ -68,27 +70,33 @@ https://github.com/stax76/mpv.net/wiki/Scripting-(CSharp,-Python,-JavaScript,-Lu
|
|||||||
|
|
||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
### 2.2
|
### 2.4 (2019-04-06)
|
||||||
|
|
||||||
|
- new options added to the conf GUI editor: gpu-context, gpu-api, scale, cscale, dscale, dither-depth, correct-downscaling, sigmoid-upscaling, deband
|
||||||
|
- the conf edit GUI has a 'Apply' feature added to write the conf to mpv.conf without the need to close the conf edit GUI
|
||||||
|
- the input edit GUI shows a message box when a duplicate is detected and it has a new feature to reduce the filter scope to eather of input, menu or command and the editor writes always the same help on top of input.conf as it is found in the defaults
|
||||||
|
- the conf edit GUI was often starting out of working area bounds and is now starting with center screen
|
||||||
|
- the startup size was reduced and a issue was fixed that when the screen property was defined for a screen that isn't connected the startup size wasn't applied
|
||||||
|
- added feature to load external audio and subtitle files in the menu under: Open > Load external audio|subtitle files (default binding at: [input.conf](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt))
|
||||||
|
- previously the conf edit GUI removed settings from the conf file if the setting was set to the default, the new behavior is not to remove anything
|
||||||
|
- the autofit mpv property was partly implemented, you can use 'autofit = 50%' in mpv.conf or '--autofit=50%' on the command line, WxH isn't implemented and only percent values are accepted. There is a new wiki page explaining limitations compared to the original mpv: <https://github.com/stax76/mpv.net/wiki/Limitations>
|
||||||
|
|
||||||
|
### 2.3 (2019-04-04)
|
||||||
|
|
||||||
|
- dragging a youtube URL on mpv.net would still break something, it should work now
|
||||||
|
- when the main window gets focus/activation it will check the clibboard for a YouTube video and ask to play it
|
||||||
|
- libmpv updated
|
||||||
|
- changing to normal size from fullscreen resulted in a too large window in some circumstances
|
||||||
|
- some default key bindings and menu structure have changed and the input.conf file has a description added on top <https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt>
|
||||||
|
- the file association code was completely rewriten, it's now contained within mpvnet.exe instead of a separate application and it adds a few more keys
|
||||||
|
- various new info added to the wiki: <https://github.com/stax76/mpv.net/wiki>
|
||||||
|
- On Top feature was implemented using mpv's native property 'ontop', default bindings at: <https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt>
|
||||||
|
|
||||||
|
### 2.2 (2019-04-01)
|
||||||
|
|
||||||
- messages boxes had always the info icon even if a different icon (error, warning, question) was intended
|
- messages boxes had always the info icon even if a different icon (error, warning, question) was intended
|
||||||
- instead of silently do nothing on unknown commands there is now a error message listing available commands and showing the location of the default bindings, this helps when commands are removed or renamed
|
- instead of silently do nothing on unknown commands there is now a error message listing available commands and showing the location of the default bindings, this helps when commands are removed or renamed
|
||||||
- there was a problem fixed that made the cursor hidden when it should be visible
|
- there was a problem fixed that made the cursor hidden when it should be visible
|
||||||
- dragging a youtube URL on mpv.net would break certain input related features
|
- dragging a youtube URL on mpv.net would break certain input related features
|
||||||
- there is now an installer with file extension registration (limited on Win 10) available
|
- there is now an installer with file extension registration (limited on Win 10) available
|
||||||
- WM_APPCOMMAND media keys were not working in the input (shortcut) editor and there were no defaults for prev and next defined
|
- WM_APPCOMMAND media keys were not working in the input (shortcut) editor and there were no defaults for prev and next defined
|
||||||
|
|
||||||
### 2.1 (2019-03-30)
|
|
||||||
|
|
||||||
- new input editor added, default key binding is here: <https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt#L89>
|
|
||||||
|
|
||||||
### 2.0 (2019-03-28)
|
|
||||||
|
|
||||||
- setting track-auto-selection added to settings editor (<https://mpv.io/manual/master/#options-track-auto-selection>)
|
|
||||||
- setting loop-playlist added to settings editor (<https://mpv.io/manual/master/#options-loop-playlist>)
|
|
||||||
- setting audio-file-auto added to settings editor (<https://mpv.io/manual/master/#options-audio-file-auto>)
|
|
||||||
- setting video-sync added to settings editor (<https://mpv.io/manual/master/#options-video-sync>)
|
|
||||||
- command execute-mpv-command added to menu: Tools > Enter a mpv command for execution
|
|
||||||
- added youtube-dl.exe, please note this will only work when a certain Visual C++ runtime is installed
|
|
||||||
- added drag & drop support to drag & drop a youtube URL on mpv.net
|
|
||||||
- added support to open a youtube URL from command line
|
|
||||||
- added support for opening a URL from the menu: Open > Open URL
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" setup\mpvnet.iss
|
|
||||||
pause
|
|
||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
@@ -187,5 +188,35 @@ namespace mpvnet
|
|||||||
mp.LoadURL(command);
|
mp.LoadURL(command);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void load_sub(string[] args)
|
||||||
|
{
|
||||||
|
MainForm.Instance.BeginInvoke(new Action(() => {
|
||||||
|
using (var d = new OpenFileDialog())
|
||||||
|
{
|
||||||
|
d.InitialDirectory = Path.GetDirectoryName(mp.get_property_string("path", false));
|
||||||
|
d.Multiselect = true;
|
||||||
|
|
||||||
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
|
foreach (string i in d.FileNames)
|
||||||
|
mp.commandv("sub-add", i);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void load_audio(string[] args)
|
||||||
|
{
|
||||||
|
MainForm.Instance.BeginInvoke(new Action(() => {
|
||||||
|
using (var d = new OpenFileDialog())
|
||||||
|
{
|
||||||
|
d.InitialDirectory = Path.GetDirectoryName(mp.get_property_string("path", false));
|
||||||
|
d.Multiselect = true;
|
||||||
|
|
||||||
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
|
foreach (string i in d.FileNames)
|
||||||
|
mp.commandv("audio-add", i);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
2
mpv.net/MainForm.Designer.cs
generated
2
mpv.net/MainForm.Designer.cs
generated
@@ -45,7 +45,7 @@
|
|||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(288F, 288F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(288F, 288F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
||||||
this.BackColor = System.Drawing.Color.Black;
|
this.BackColor = System.Drawing.Color.Black;
|
||||||
this.ClientSize = new System.Drawing.Size(1012, 615);
|
this.ClientSize = new System.Drawing.Size(606, 368);
|
||||||
this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using System.Runtime.InteropServices;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -15,8 +14,11 @@ namespace mpvnet
|
|||||||
public static IntPtr Hwnd;
|
public static IntPtr Hwnd;
|
||||||
|
|
||||||
private Point LastCursorPosChanged;
|
private Point LastCursorPosChanged;
|
||||||
private int LastCursorChangedTickCount;
|
private int LastCursorChangedTickCount;
|
||||||
private bool IgnoreDpiChanged = true;
|
private bool IgnoreDpiChanged = true;
|
||||||
|
private float mpvAutofit = 0.42f;
|
||||||
|
private bool mpvFullscreen;
|
||||||
|
private int mpvScreen = -1;
|
||||||
|
|
||||||
public ContextMenuStripEx CMS;
|
public ContextMenuStripEx CMS;
|
||||||
|
|
||||||
@@ -26,31 +28,34 @@ namespace mpvnet
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
||||||
Application.ThreadException += Application_ThreadException;
|
Application.ThreadException += Application_ThreadException;
|
||||||
Instance = this;
|
Instance = this;
|
||||||
Hwnd = Handle;
|
Hwnd = Handle;
|
||||||
|
MinimumSize = new Size(FontHeight * 16, FontHeight * 9);
|
||||||
Text += " " + Application.ProductVersion;
|
Text += " " + Application.ProductVersion;
|
||||||
|
|
||||||
if (mp.mpvConf.ContainsKey("screen"))
|
foreach (var i in mp.mpvConf)
|
||||||
SetScreen(Convert.ToInt32(mp.mpvConf["screen"]));
|
ProcessMpvProperty(i.Key, i.Value);
|
||||||
else
|
|
||||||
SetScreen(Screen.PrimaryScreen);
|
|
||||||
|
|
||||||
ChangeFullscreen((mp.mpvConf.ContainsKey("fullscreen") && mp.mpvConf["fullscreen"] == "yes") ||
|
|
||||||
(mp.mpvConf.ContainsKey("fs") && mp.mpvConf["fs"] == "yes"));
|
|
||||||
|
|
||||||
ProcessCommandLineEarly();
|
ProcessCommandLineEarly();
|
||||||
|
|
||||||
|
if (mpvScreen == -1) mpvScreen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen);
|
||||||
|
SetScreen(mpvScreen);
|
||||||
|
|
||||||
|
ChangeFullscreen(mpvFullscreen);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
MainForm.Instance.ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void SetScreen(int targetIndex)
|
protected void SetScreen(int targetIndex)
|
||||||
{
|
{
|
||||||
Screen[] screens = Screen.AllScreens;
|
Screen[] screens = Screen.AllScreens;
|
||||||
if (targetIndex < 0 || targetIndex > screens.Length - 1) return;
|
if (targetIndex < 0) targetIndex = 0;
|
||||||
|
if (targetIndex > screens.Length - 1) targetIndex = screens.Length - 1;
|
||||||
SetScreen(screens[Array.IndexOf(screens, screens[targetIndex])]);
|
SetScreen(screens[Array.IndexOf(screens, screens[targetIndex])]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +71,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
int height = Convert.ToInt32(screen.Bounds.Height * 0.6);
|
int height = Convert.ToInt32(screen.Bounds.Height * mpvAutofit);
|
||||||
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
||||||
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
||||||
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
||||||
@@ -81,6 +86,7 @@ namespace mpvnet
|
|||||||
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
int height = ClientSize.Height;
|
int height = ClientSize.Height;
|
||||||
|
if (height > screen.Bounds.Height * 0.9) height = Convert.ToInt32(screen.Bounds.Height * mpvAutofit);
|
||||||
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
||||||
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
||||||
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
||||||
@@ -88,15 +94,9 @@ namespace mpvnet
|
|||||||
int left = middlePos.X - rect.Width / 2;
|
int left = middlePos.X - rect.Width / 2;
|
||||||
int top = middlePos.Y - rect.Height / 2;
|
int top = middlePos.Y - rect.Height / 2;
|
||||||
Screen[] screens = Screen.AllScreens;
|
Screen[] screens = Screen.AllScreens;
|
||||||
|
if (left < screens[0].Bounds.Left) left = screens[0].Bounds.Left;
|
||||||
if (left < screens[0].Bounds.Left)
|
|
||||||
left = screens[0].Bounds.Left;
|
|
||||||
|
|
||||||
int maxLeft = screens[0].Bounds.Left + screens.Select((sc) => sc.Bounds.Width).Sum() - rect.Width - SystemInformation.CaptionHeight;
|
int maxLeft = screens[0].Bounds.Left + screens.Select((sc) => sc.Bounds.Width).Sum() - rect.Width - SystemInformation.CaptionHeight;
|
||||||
|
if (left > maxLeft) left = maxLeft;
|
||||||
if (left > maxLeft)
|
|
||||||
left = maxLeft;
|
|
||||||
|
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,11 +112,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
string left = i.Substring(2, i.IndexOf("=") - 2);
|
string left = i.Substring(2, i.IndexOf("=") - 2);
|
||||||
string right = i.Substring(left.Length + 3);
|
string right = i.Substring(left.Length + 3);
|
||||||
|
ProcessMpvProperty(left, right);
|
||||||
if (left == "screen")
|
|
||||||
SetScreen(Convert.ToInt32(right));
|
|
||||||
|
|
||||||
ChangeFullscreen((left == "fs" || left == "fullscreen") && right == "yes");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -126,7 +122,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
case "fs":
|
case "fs":
|
||||||
case "fullscreen":
|
case "fullscreen":
|
||||||
ChangeFullscreen(true);
|
mpvFullscreen = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,6 +130,25 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProcessMpvProperty(string name, string value)
|
||||||
|
{
|
||||||
|
switch (name)
|
||||||
|
{
|
||||||
|
case "autofit":
|
||||||
|
if (value.Length == 3 && value.EndsWith("%"))
|
||||||
|
if (int.TryParse(value.Substring(0, 2), out int result))
|
||||||
|
mpvAutofit = result / 100f;
|
||||||
|
break;
|
||||||
|
case "fs":
|
||||||
|
case "fullscreen":
|
||||||
|
mpvFullscreen = value == "yes";
|
||||||
|
break;
|
||||||
|
case "screen":
|
||||||
|
mpvScreen = Convert.ToInt32(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void BuildMenu()
|
public void BuildMenu()
|
||||||
{
|
{
|
||||||
foreach (var i in File.ReadAllText(mp.InputConfPath).Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
|
foreach (var i in File.ReadAllText(mp.InputConfPath).Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
|
||||||
@@ -156,7 +171,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
MainForm.Instance.ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
ShowMsgBox(e.ToString(), MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -165,10 +180,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CMS_Opened(object sender, EventArgs e)
|
private void CMS_Opened(object sender, EventArgs e) => CursorHelp.Show();
|
||||||
{
|
|
||||||
CursorHelp.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private string LastHistory;
|
private string LastHistory;
|
||||||
|
|
||||||
@@ -191,16 +203,18 @@ namespace mpvnet
|
|||||||
BeginInvoke(new Action(() => { Text = "mpv.net " + Application.ProductVersion; }));
|
BeginInvoke(new Action(() => { Text = "mpv.net " + Application.ProductVersion; }));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CM_Popup(object sender, EventArgs e)
|
private void CM_Popup(object sender, EventArgs e) => CursorHelp.Show();
|
||||||
{
|
|
||||||
CursorHelp.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
|
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
|
||||||
{
|
{
|
||||||
ShowMsgBox(e.Exception.ToString(), MessageBoxIcon.Error);
|
ShowMsgBox(e.Exception.ToString(), MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
ShowMsgBox(e.ExceptionObject.ToString(), MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
|
||||||
private void mp_VideoSizeChanged()
|
private void mp_VideoSizeChanged()
|
||||||
{
|
{
|
||||||
BeginInvoke(new Action(() => SetFormPositionAndSizeKeepHeight()));
|
BeginInvoke(new Action(() => SetFormPositionAndSizeKeepHeight()));
|
||||||
@@ -213,7 +227,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public bool IsFullscreen => WindowState == FormWindowState.Maximized;
|
public bool IsFullscreen => WindowState == FormWindowState.Maximized;
|
||||||
|
|
||||||
void mp_ChangeFullscreen(bool value)
|
void mpPropChangeFullscreen(bool value)
|
||||||
{
|
{
|
||||||
BeginInvoke(new Action(() => ChangeFullscreen(value)));
|
BeginInvoke(new Action(() => ChangeFullscreen(value)));
|
||||||
}
|
}
|
||||||
@@ -288,7 +302,6 @@ namespace mpvnet
|
|||||||
m.Result = new IntPtr(1);
|
m.Result = new IntPtr(1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,12 +314,11 @@ namespace mpvnet
|
|||||||
|
|
||||||
protected override void OnDragDrop(DragEventArgs e)
|
protected override void OnDragDrop(DragEventArgs e)
|
||||||
{
|
{
|
||||||
|
base.OnDragDrop(e);
|
||||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||||
mp.LoadFiles(e.Data.GetData(DataFormats.FileDrop) as String[]);
|
mp.LoadFiles(e.Data.GetData(DataFormats.FileDrop) as String[]);
|
||||||
if (e.Data.GetDataPresent(DataFormats.Text))
|
if (e.Data.GetDataPresent(DataFormats.Text))
|
||||||
mp.LoadURL(e.Data.GetData(DataFormats.Text).ToString());
|
mp.LoadURL(e.Data.GetData(DataFormats.Text).ToString());
|
||||||
|
|
||||||
base.OnDragDrop(e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnMouseDown(MouseEventArgs e)
|
protected override void OnMouseDown(MouseEventArgs e)
|
||||||
@@ -371,13 +383,16 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
base.OnLoad(e);
|
base.OnLoad(e);
|
||||||
mp.Init();
|
mp.Init();
|
||||||
mp.observe_property_bool("fullscreen", mp_ChangeFullscreen);
|
mp.observe_property_bool("fullscreen", mpPropChangeFullscreen);
|
||||||
|
mp.observe_property_bool("ontop", mpPropChangeOnTop);
|
||||||
mp.Shutdown += mp_Shutdown;
|
mp.Shutdown += mp_Shutdown;
|
||||||
mp.VideoSizeChanged += mp_VideoSizeChanged;
|
mp.VideoSizeChanged += mp_VideoSizeChanged;
|
||||||
mp.PlaybackRestart += mp_PlaybackRestart;
|
mp.PlaybackRestart += mp_PlaybackRestart;
|
||||||
mp.Idle += Mp_Idle;
|
mp.Idle += Mp_Idle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mpPropChangeOnTop(bool value) => BeginInvoke(new Action(() => TopMost = value));
|
||||||
|
|
||||||
protected override void OnShown(EventArgs e)
|
protected override void OnShown(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnShown(e);
|
base.OnShown(e);
|
||||||
@@ -386,6 +401,7 @@ namespace mpvnet
|
|||||||
ContextMenuStrip = CMS;
|
ContextMenuStrip = CMS;
|
||||||
BuildMenu();
|
BuildMenu();
|
||||||
IgnoreDpiChanged = false;
|
IgnoreDpiChanged = false;
|
||||||
|
CheckYouTube();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnFormClosed(FormClosedEventArgs e)
|
protected override void OnFormClosed(FormClosedEventArgs e)
|
||||||
@@ -400,5 +416,24 @@ namespace mpvnet
|
|||||||
base.OnLostFocus(e);
|
base.OnLostFocus(e);
|
||||||
CursorHelp.Show();
|
CursorHelp.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnActivated(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnActivated(e);
|
||||||
|
CheckYouTube();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string LastURL;
|
||||||
|
|
||||||
|
void CheckYouTube()
|
||||||
|
{
|
||||||
|
string clipboard = Clipboard.GetText();
|
||||||
|
if (clipboard.StartsWith("https://www.youtube.com/watch?") && LastURL != clipboard && Visible)
|
||||||
|
{
|
||||||
|
LastURL = clipboard;
|
||||||
|
if (ShowMsgBox("Play YouTube URL?", MessageBoxIcon.Question) == DialogResult.OK)
|
||||||
|
mp.LoadURL(clipboard);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
using System;
|
using Microsoft.Win32;
|
||||||
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
@@ -34,4 +37,91 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static float Current => Environment.OSVersion.Version.Major + Environment.OSVersion.Version.Minor / 10f;
|
public static float Current => Environment.OSVersion.Version.Major + Environment.OSVersion.Version.Minor / 10f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class FileAssociation
|
||||||
|
{
|
||||||
|
static string ExePath = Application.ExecutablePath;
|
||||||
|
static string ExeFilename = Path.GetFileName(Application.ExecutablePath);
|
||||||
|
static string ExeFilenameNoExt = Path.GetFileNameWithoutExtension(Application.ExecutablePath);
|
||||||
|
static string[] Types;
|
||||||
|
public static string[] VideoTypes = "mpg avi vob mp4 mkv avs 264 mov wmv flv h264 asf webm mpeg mpv y4m avc hevc 265 h265 m2v m2ts vpy mts webm m4v".Split(" ".ToCharArray());
|
||||||
|
public static string[] AudioTypes = "mp2 mp3 ac3 wav w64 m4a dts dtsma dtshr dtshd eac3 thd thd+ac3 ogg mka aac opus flac mpa".Split(" ".ToCharArray());
|
||||||
|
|
||||||
|
public static void Register(string[] types)
|
||||||
|
{
|
||||||
|
Types = types;
|
||||||
|
|
||||||
|
RegistryHelp.SetValue(@"HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + ExeFilename, null, ExePath);
|
||||||
|
RegistryHelp.SetValue($"HKCR\\Applications\\{ExeFilename}", "FriendlyAppName", "mpv.net media player");
|
||||||
|
RegistryHelp.SetValue($"HKCR\\Applications\\{ExeFilename}\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
||||||
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\Clients\Media\mpv\Capabilities", "ApplicationDescription", "mpv.net media player");
|
||||||
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\Clients\Media\mpv\Capabilities", "ApplicationName", "mpv.net");
|
||||||
|
RegistryHelp.SetValue($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}", null, "");
|
||||||
|
RegistryHelp.SetValue($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}", null, "");
|
||||||
|
|
||||||
|
foreach (string ext in Types)
|
||||||
|
{
|
||||||
|
RegistryHelp.SetValue($"HKCR\\Applications\\{ExeFilename}\\SupportedTypes", "." + ext, "");
|
||||||
|
RegistryHelp.SetValue($"HKCR\\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
||||||
|
RegistryHelp.SetValue($"HKCR\\" + "." + ext + "\\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
||||||
|
if (VideoTypes.Contains(ext))
|
||||||
|
RegistryHelp.SetValue($"HKCR\\" + "." + ext, "PerceivedType", "video");
|
||||||
|
if (AudioTypes.Contains(ext))
|
||||||
|
RegistryHelp.SetValue($"HKCR\\" + "." + ext, "PerceivedType", "audio");
|
||||||
|
RegistryHelp.SetValue($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open", null, "Play with " + Application.ProductName);
|
||||||
|
RegistryHelp.SetValue($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
||||||
|
RegistryHelp.SetValue(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities\FileAssociations", "." + ext, ExeFilenameNoExt + "." + ext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Unregister()
|
||||||
|
{
|
||||||
|
RegistryHelp.RemoveKey(@"HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + ExeFilename);
|
||||||
|
RegistryHelp.RemoveKey($"HKCR\\Applications\\{ExeFilename}");
|
||||||
|
RegistryHelp.RemoveKey(@"HKLM\SOFTWARE\Clients\Media\mpv.net");
|
||||||
|
RegistryHelp.RemoveKey($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}");
|
||||||
|
RegistryHelp.RemoveKey($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}");
|
||||||
|
|
||||||
|
foreach (string id in Registry.ClassesRoot.GetSubKeyNames())
|
||||||
|
{
|
||||||
|
if (id.StartsWith(ExeFilenameNoExt + "."))
|
||||||
|
Registry.ClassesRoot.DeleteSubKeyTree(id);
|
||||||
|
|
||||||
|
RegistryHelp.RemoveValue($"HKCR\\Software\\Classes\\" + id + "\\OpenWithProgIDs", ExeFilenameNoExt + id);
|
||||||
|
RegistryHelp.RemoveValue($"HKLM\\Software\\Classes\\" + id + "\\OpenWithProgIDs", ExeFilenameNoExt + id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RegistryHelp
|
||||||
|
{
|
||||||
|
public static void SetValue(string path, string name, string value)
|
||||||
|
{
|
||||||
|
using (RegistryKey rk = GetRootKey(path).CreateSubKey(path.Substring(5), RegistryKeyPermissionCheck.ReadWriteSubTree))
|
||||||
|
rk.SetValue(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveKey(string path)
|
||||||
|
{
|
||||||
|
GetRootKey(path).DeleteSubKeyTree(path.Substring(5), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveValue(string path, string name)
|
||||||
|
{
|
||||||
|
using (RegistryKey rk = GetRootKey(path).OpenSubKey(path.Substring(5), true))
|
||||||
|
if (!(rk is null))
|
||||||
|
rk.DeleteValue(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static RegistryKey GetRootKey(string path)
|
||||||
|
{
|
||||||
|
switch (path.Substring(0, 4))
|
||||||
|
{
|
||||||
|
case "HKLM": return Registry.LocalMachine;
|
||||||
|
case "HKCU": return Registry.CurrentUser;
|
||||||
|
case "HKCR": return Registry.ClassesRoot;
|
||||||
|
default: throw new Exception();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,24 @@ namespace mpvnet
|
|||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main()
|
static void Main()
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string[] args = Environment.GetCommandLineArgs();
|
||||||
|
|
||||||
|
if (args.Length == 3 && args[1] == "--reg-file-assoc")
|
||||||
|
{
|
||||||
|
if (args[2] == "audio") FileAssociation.Register(FileAssociation.AudioTypes);
|
||||||
|
if (args[2] == "video") FileAssociation.Register(FileAssociation.VideoTypes);
|
||||||
|
if (args[2] == "unregister") FileAssociation.Unregister();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
Application.Run(new MainForm());
|
Application.Run(new MainForm());
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("mpv.net")]
|
[assembly: AssemblyProduct("mpv.net")]
|
||||||
[assembly: AssemblyCopyright("Copyright © stax76")]
|
[assembly: AssemblyCopyright("Copyright © 2017 stax76")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("2.2.0.0")]
|
[assembly: AssemblyVersion("2.4.0.0")]
|
||||||
[assembly: AssemblyFileVersion("2.2.0.0")]
|
[assembly: AssemblyFileVersion("2.4.0.0")]
|
||||||
|
|||||||
@@ -1,5 +1,35 @@
|
|||||||
|
|
||||||
|
# This file defines the input (keys and mouse) bindings of mpv and mpv.net
|
||||||
|
# and it also defines the context menu of mpv.net. mpv.net has a input
|
||||||
|
# editor and a conf editor as alternatives to editing this file via texteditor.
|
||||||
|
# The input and conf editors can be found in mpv.net's context menu at:
|
||||||
|
|
||||||
|
# Settings > Show Config Editor
|
||||||
|
# Settings > Show Input Editor
|
||||||
|
|
||||||
|
# The defaults of this file can be found at:
|
||||||
|
|
||||||
|
# https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt
|
||||||
|
|
||||||
|
# the defaults of mpv can be found at:
|
||||||
|
|
||||||
|
# https://github.com/mpv-player/mpv/blob/master/etc/input.conf
|
||||||
|
|
||||||
|
# mpv.net's defaults of mpv.conf contain: 'input-default-bindings = no'
|
||||||
|
# which disables mpv's input defaults. Every line in this file begins with a
|
||||||
|
# space character to make it easier to do a text search, so if you want to know
|
||||||
|
# if 'o' has already a binding you can make a text search on ' o '.
|
||||||
|
|
||||||
|
# mpv input commands: https://github.com/stax76/mpv.net/wiki/mpv-input-commands
|
||||||
|
|
||||||
|
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys
|
||||||
|
|
||||||
o script-message mpv.net open-files #menu: Open > Open Files...
|
o script-message mpv.net open-files #menu: Open > Open Files...
|
||||||
u script-message mpv.net open-url #menu: Open > Open URL...
|
u script-message mpv.net open-url #menu: Open > Open URL...
|
||||||
|
_ ignore #menu: Open > -
|
||||||
|
Alt+a script-message mpv.net load-audio #menu: Open > Load external audio files...
|
||||||
|
Alt+s script-message mpv.net load-sub #menu: Open > Load external subtitle files...
|
||||||
|
|
||||||
_ ignore #menu: -
|
_ ignore #menu: -
|
||||||
Space cycle pause #menu: Play/Pause
|
Space cycle pause #menu: Play/Pause
|
||||||
s stop #menu: Stop
|
s stop #menu: Stop
|
||||||
@@ -33,20 +63,20 @@
|
|||||||
Ctrl+KP2 add video-pan-y 0.01 #menu: Pan & Scan > Move Down
|
Ctrl+KP2 add video-pan-y 0.01 #menu: Pan & Scan > Move Down
|
||||||
_ ignore #menu: Pan & Scan > -
|
_ ignore #menu: Pan & Scan > -
|
||||||
w add panscan -0.1 #menu: Pan & Scan > Decrease Height
|
w add panscan -0.1 #menu: Pan & Scan > Decrease Height
|
||||||
W add panscan +0.1 #menu: Pan & Scan > Increase Height
|
W add panscan 0.1 #menu: Pan & Scan > Increase Height
|
||||||
_ ignore #menu: Pan & Scan > -
|
_ ignore #menu: Pan & Scan > -
|
||||||
Ctrl+BS set video-zoom 0 ; set video-pan-x 0 ; set video-pan-y 0 #menu: Pan & Scan > Reset
|
Ctrl+BS set video-zoom 0; set video-pan-x 0; set video-pan-y 0 #menu: Pan & Scan > Reset
|
||||||
Ctrl+1 add contrast -1 #menu: Video > Decrease Contrast
|
Ctrl+1 add contrast -1 #menu: Video > Decrease Contrast
|
||||||
Ctrl+2 add contrast 1 #menu: Video > Increase Contrast
|
Ctrl+2 add contrast #menu: Video > Increase Contrast
|
||||||
_ ignore #menu: Video > -
|
_ ignore #menu: Video > -
|
||||||
Ctrl+3 add brightness -1 #menu: Video > Decrease Brightness
|
Ctrl+3 add brightness -1 #menu: Video > Decrease Brightness
|
||||||
Ctrl+4 add brightness 1 #menu: Video > Increase Brightness
|
Ctrl+4 add brightness 1 #menu: Video > Increase Brightness
|
||||||
_ ignore #menu: Video > -
|
_ ignore #menu: Video > -
|
||||||
Ctrl+5 add gamma -1 #menu: Video > Decrease Gamma
|
Ctrl+5 add gamma -1 #menu: Video > Decrease Gamma
|
||||||
Ctrl+6 add gamma 1 #menu: Video > Increase Gamma
|
Ctrl+6 add gamma 1 #menu: Video > Increase Gamma
|
||||||
_ ignore #menu: Video > -
|
_ ignore #menu: Video > -
|
||||||
Ctrl+7 add saturation -1 #menu: Video > Decrease Saturation
|
Ctrl+7 add saturation -1 #menu: Video > Decrease Saturation
|
||||||
Ctrl+8 add saturation 1 #menu: Video > Increase Saturation
|
Ctrl+8 add saturation 1 #menu: Video > Increase Saturation
|
||||||
_ ignore #menu: Video > -
|
_ ignore #menu: Video > -
|
||||||
Ctrl+s async screenshot #menu: Video > Take Screenshot
|
Ctrl+s async screenshot #menu: Video > Take Screenshot
|
||||||
d cycle deinterlace #menu: Video > Toggle Deinterlace
|
d cycle deinterlace #menu: Video > Toggle Deinterlace
|
||||||
@@ -59,13 +89,13 @@
|
|||||||
v cycle sub-visibility #menu: Subtitle > Toggle Visibility
|
v cycle sub-visibility #menu: Subtitle > Toggle Visibility
|
||||||
_ ignore #menu: Subtitle > -
|
_ ignore #menu: Subtitle > -
|
||||||
z add sub-delay -0.1 #menu: Subtitle > Delay -0.1
|
z add sub-delay -0.1 #menu: Subtitle > Delay -0.1
|
||||||
Z add sub-delay +0.1 #menu: Subtitle > Delay +0.1
|
Z add sub-delay 0.1 #menu: Subtitle > Delay +0.1
|
||||||
_ ignore #menu: Subtitle > -
|
_ ignore #menu: Subtitle > -
|
||||||
r add sub-pos -1 #menu: Subtitle > Move Up
|
r add sub-pos -1 #menu: Subtitle > Move Up
|
||||||
R add sub-pos +1 #menu: Subtitle > Move Down
|
R add sub-pos +1 #menu: Subtitle > Move Down
|
||||||
_ ignore #menu: Subtitle > -
|
_ ignore #menu: Subtitle > -
|
||||||
_ add sub-scale -0.1 #menu: Subtitle > Decrease Subtitle Font Size
|
_ add sub-scale -0.1 #menu: Subtitle > Decrease Subtitle Font Size
|
||||||
_ add sub-scale +0.1 #menu: Subtitle > Increase Subtitle Font Size
|
_ add sub-scale 0.1 #menu: Subtitle > Increase Subtitle Font Size
|
||||||
+ add volume 10 #menu: Volume > Up
|
+ add volume 10 #menu: Volume > Up
|
||||||
- add volume -10 #menu: Volume > Down
|
- add volume -10 #menu: Volume > Down
|
||||||
_ ignore #menu: Volume > -
|
_ ignore #menu: Volume > -
|
||||||
@@ -83,30 +113,36 @@
|
|||||||
KP3 script-message rate-file 3 #menu: Addons > Rating > 3stars
|
KP3 script-message rate-file 3 #menu: Addons > Rating > 3stars
|
||||||
KP4 script-message rate-file 4 #menu: Addons > Rating > 4stars
|
KP4 script-message rate-file 4 #menu: Addons > Rating > 4stars
|
||||||
KP5 script-message rate-file 5 #menu: Addons > Rating > 5stars
|
KP5 script-message rate-file 5 #menu: Addons > Rating > 5stars
|
||||||
_ script-message mpv.net set-setting hwdec yes #menu: Settings > Hardware Decoding > Enable
|
|
||||||
_ script-message mpv.net set-setting hwdec no #menu: Settings > Hardware Decoding > Disable
|
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
||||||
e script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
Ctrl+T set ontop no #menu: View > On Top > Disable
|
||||||
Ctrl+i script-message mpv.net show-input-editor #menu: Settings > Show Input Editor
|
i script-message mpv.net show-info #menu: View > File Info
|
||||||
c script-message mpv.net open-config-folder #menu: Settings > Open Config Folder
|
t script-binding stats/display-stats #menu: View > Show Statistics
|
||||||
i script-message mpv.net show-info #menu: Tools > Info
|
T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
||||||
t script-binding stats/display-stats #menu: Tools > Show Statistics
|
|
||||||
T script-binding stats/display-stats-toggle #menu: Tools > Toggle Statistics
|
_ script-message mpv.net set-setting hwdec yes #menu: Settings > Hardware Decoding > Enable
|
||||||
_ ignore #menu: Tools > -
|
_ script-message mpv.net set-setting hwdec no #menu: Settings > Hardware Decoding > Disable
|
||||||
h script-message mpv.net show-history #menu: Tools > Show History
|
Ctrl+c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
||||||
l ab-loop #menu: Tools > Set/clear A-B loop points
|
Ctrl+i script-message mpv.net show-input-editor #menu: Settings > Show Input Editor
|
||||||
L cycle-values loop-file "inf" "no" #menu: Tools > Toggle Infinite Looping
|
Ctrl+f script-message mpv.net open-config-folder #menu: Settings > Open Config Folder
|
||||||
Del script-binding osc/visibility #menu: Tools > Toggle OSC Visibility
|
|
||||||
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Cycle Hardware Decoding
|
h script-message mpv.net show-history #menu: Tools > Show History
|
||||||
F8 show-text ${playlist} 5000 #menu: Tools > Show Playlist
|
l ab-loop #menu: Tools > Set/clear A-B loop points
|
||||||
F9 show-text ${track-list} 5000 #menu: Tools > Show Audio/Video/Subtitle List
|
L cycle-values loop-file "inf" "no" #menu: Tools > Toggle Infinite Looping
|
||||||
_ script-message mpv.net execute-mpv-command #menu: Tools > Execute mpv command...
|
Del script-binding osc/visibility #menu: Tools > Toggle OSC Visibility
|
||||||
|
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Cycle Hardware Decoding
|
||||||
|
F8 show-text ${playlist} 5000 #menu: Tools > Show Playlist
|
||||||
|
F9 show-text ${track-list} 5000 #menu: Tools > Show Audio/Video/Subtitle List
|
||||||
|
_ script-message mpv.net execute-mpv-command #menu: Tools > Execute mpv command...
|
||||||
|
|
||||||
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > Show mpv manual
|
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > Show mpv manual
|
||||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/blob/master/etc/input.conf #menu: Help > Show mpv default keys
|
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/blob/master/etc/input.conf #menu: Help > Show mpv default keys
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt #menu: Help > Show mpv.net default keys
|
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt #menu: Help > Show mpv.net default keys
|
||||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpvnet #menu: Help > Show mpv.net web site
|
_ script-message mpv.net shell-execute https://github.com/stax76/mpvnet #menu: Help > Show mpv.net web site
|
||||||
_ ignore #menu: -
|
|
||||||
Esc quit #menu: Exit
|
_ ignore #menu: -
|
||||||
Q quit-watch-later #menu: Exit Watch Later
|
Esc quit #menu: Exit
|
||||||
|
Q quit-watch-later #menu: Exit Watch Later
|
||||||
> playlist-next
|
> playlist-next
|
||||||
< playlist-prev
|
< playlist-prev
|
||||||
Enter cycle pause
|
Enter cycle pause
|
||||||
@@ -118,9 +154,9 @@
|
|||||||
Forward seek 60
|
Forward seek 60
|
||||||
Rewind seek -60
|
Rewind seek -60
|
||||||
Mute cycle mute
|
Mute cycle mute
|
||||||
Volume_Up add volume 10
|
Volume_Up add volume 10
|
||||||
Volume_Down add volume -10
|
Volume_Down add volume -10
|
||||||
Wheel_Up add volume 10
|
Wheel_Up add volume 10
|
||||||
Wheel_Down add volume -10
|
Wheel_Down add volume -10
|
||||||
Prev playlist-prev
|
Prev playlist-prev
|
||||||
Next playlist-next
|
Next playlist-next
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
# mpv manual: https://mpv.io/manual/master/
|
|
||||||
|
# mpv manual: https://mpv.io/manual/master/
|
||||||
|
|
||||||
# mpv.net mpv.conf defaults: https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpv.conf.txt
|
# mpv.net mpv.conf defaults: https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpv.conf.txt
|
||||||
|
|
||||||
input-ar-delay = 500
|
input-ar-delay = 500
|
||||||
input-ar-rate = 20
|
input-ar-rate = 20
|
||||||
volume = 50
|
volume = 50
|
||||||
hwdec = yes
|
hwdec = yes
|
||||||
vo = direct3d
|
|
||||||
keep-open = yes
|
keep-open = yes
|
||||||
keep-open-pause = no
|
keep-open-pause = no
|
||||||
osd-playing-msg = ${filename}
|
osd-playing-msg = ${filename}
|
||||||
|
|||||||
252
mpv.net/mp.cs
252
mpv.net/mp.cs
@@ -142,130 +142,137 @@ namespace mpvnet
|
|||||||
|
|
||||||
//Debug.WriteLine(evt.event_id.ToString());
|
//Debug.WriteLine(evt.event_id.ToString());
|
||||||
|
|
||||||
switch (evt.event_id)
|
try
|
||||||
{
|
{
|
||||||
case mpv_event_id.MPV_EVENT_SHUTDOWN:
|
switch (evt.event_id)
|
||||||
Shutdown?.Invoke();
|
{
|
||||||
AutoResetEvent.Set();
|
case mpv_event_id.MPV_EVENT_SHUTDOWN:
|
||||||
return;
|
Shutdown?.Invoke();
|
||||||
case mpv_event_id.MPV_EVENT_LOG_MESSAGE:
|
AutoResetEvent.Set();
|
||||||
LogMessage?.Invoke();
|
return;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_LOG_MESSAGE:
|
||||||
case mpv_event_id.MPV_EVENT_GET_PROPERTY_REPLY:
|
LogMessage?.Invoke();
|
||||||
GetPropertyReply?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_GET_PROPERTY_REPLY:
|
||||||
case mpv_event_id.MPV_EVENT_SET_PROPERTY_REPLY:
|
GetPropertyReply?.Invoke();
|
||||||
SetPropertyReply?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_SET_PROPERTY_REPLY:
|
||||||
case mpv_event_id.MPV_EVENT_COMMAND_REPLY:
|
SetPropertyReply?.Invoke();
|
||||||
CommandReply?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_COMMAND_REPLY:
|
||||||
case mpv_event_id.MPV_EVENT_START_FILE:
|
CommandReply?.Invoke();
|
||||||
StartFile?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_START_FILE:
|
||||||
case mpv_event_id.MPV_EVENT_END_FILE:
|
StartFile?.Invoke();
|
||||||
var end_fileData = (mpv_event_end_file)Marshal.PtrToStructure(evt.data, typeof(mpv_event_end_file));
|
break;
|
||||||
EndFile?.Invoke((EndFileEventMode)end_fileData.reason);
|
case mpv_event_id.MPV_EVENT_END_FILE:
|
||||||
break;
|
var end_fileData = (mpv_event_end_file)Marshal.PtrToStructure(evt.data, typeof(mpv_event_end_file));
|
||||||
case mpv_event_id.MPV_EVENT_FILE_LOADED:
|
EndFile?.Invoke((EndFileEventMode)end_fileData.reason);
|
||||||
FileLoaded?.Invoke();
|
break;
|
||||||
LoadFolder();
|
case mpv_event_id.MPV_EVENT_FILE_LOADED:
|
||||||
break;
|
FileLoaded?.Invoke();
|
||||||
case mpv_event_id.MPV_EVENT_TRACKS_CHANGED:
|
LoadFolder();
|
||||||
TracksChanged?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_TRACKS_CHANGED:
|
||||||
case mpv_event_id.MPV_EVENT_TRACK_SWITCHED:
|
TracksChanged?.Invoke();
|
||||||
TrackSwitched?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_TRACK_SWITCHED:
|
||||||
case mpv_event_id.MPV_EVENT_IDLE:
|
TrackSwitched?.Invoke();
|
||||||
Idle?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_IDLE:
|
||||||
case mpv_event_id.MPV_EVENT_PAUSE:
|
Idle?.Invoke();
|
||||||
Pause?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_PAUSE:
|
||||||
case mpv_event_id.MPV_EVENT_UNPAUSE:
|
Pause?.Invoke();
|
||||||
Unpause?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_UNPAUSE:
|
||||||
case mpv_event_id.MPV_EVENT_TICK:
|
Unpause?.Invoke();
|
||||||
Tick?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_TICK:
|
||||||
case mpv_event_id.MPV_EVENT_SCRIPT_INPUT_DISPATCH:
|
Tick?.Invoke();
|
||||||
ScriptInputDispatch?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_SCRIPT_INPUT_DISPATCH:
|
||||||
case mpv_event_id.MPV_EVENT_CLIENT_MESSAGE:
|
ScriptInputDispatch?.Invoke();
|
||||||
if (ClientMessage != null)
|
break;
|
||||||
{
|
case mpv_event_id.MPV_EVENT_CLIENT_MESSAGE:
|
||||||
try
|
if (ClientMessage != null)
|
||||||
{
|
{
|
||||||
var client_messageData = (mpv_event_client_message)Marshal.PtrToStructure(evt.data, typeof(mpv_event_client_message));
|
try
|
||||||
string[] args = NativeUtf8StrArray2ManagedStrArray(client_messageData.args, client_messageData.num_args);
|
|
||||||
|
|
||||||
if (args != null && args.Length > 1 && args[0] == "mpv.net")
|
|
||||||
{
|
{
|
||||||
bool found = false;
|
var client_messageData = (mpv_event_client_message)Marshal.PtrToStructure(evt.data, typeof(mpv_event_client_message));
|
||||||
|
string[] args = NativeUtf8StrArray2ManagedStrArray(client_messageData.args, client_messageData.num_args);
|
||||||
|
|
||||||
foreach (var i in mpvnet.Command.Commands)
|
if (args != null && args.Length > 1 && args[0] == "mpv.net")
|
||||||
{
|
{
|
||||||
if (args[1] == i.Name)
|
bool found = false;
|
||||||
|
|
||||||
|
foreach (var i in mpvnet.Command.Commands)
|
||||||
{
|
{
|
||||||
found = true;
|
if (args[1] == i.Name)
|
||||||
i.Action.Invoke(args.Skip(2).ToArray());
|
{
|
||||||
|
found = true;
|
||||||
|
i.Action.Invoke(args.Skip(2).ToArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
List<string> names = mpvnet.Command.Commands.Select((item) => item.Name).ToList();
|
||||||
|
names.Sort();
|
||||||
|
MainForm.Instance.ShowMsgBox($"No command '{args[1]}' found. Available commands are:\n\n{string.Join("\n", names)}\n\nHow to bind these commands can be seen in the default input bindings and menu definition located at:\n\nhttps://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt", MessageBoxIcon.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found)
|
ClientMessage?.Invoke(args);
|
||||||
{
|
}
|
||||||
List<string> names = mpvnet.Command.Commands.Select((item) => item.Name).ToList();
|
catch (Exception ex)
|
||||||
names.Sort();
|
{
|
||||||
MainForm.Instance.ShowMsgBox($"No command '{args[1]}' found. Available commands are:\n\n{string.Join("\n", names)}\n\nHow to bind these commands can be seen in the default input bindings and menu definition located at:\n\nhttps://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt", MessageBoxIcon.Error);
|
MainForm.Instance.ShowMsgBox(ex.GetType().Name + "\n\n" + ex.ToString(), MessageBoxIcon.Error);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ClientMessage?.Invoke(args);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
break;
|
||||||
|
case mpv_event_id.MPV_EVENT_VIDEO_RECONFIG:
|
||||||
|
VideoReconfig?.Invoke();
|
||||||
|
break;
|
||||||
|
case mpv_event_id.MPV_EVENT_AUDIO_RECONFIG:
|
||||||
|
AudioReconfig?.Invoke();
|
||||||
|
break;
|
||||||
|
case mpv_event_id.MPV_EVENT_METADATA_UPDATE:
|
||||||
|
MetadataUpdate?.Invoke();
|
||||||
|
break;
|
||||||
|
case mpv_event_id.MPV_EVENT_SEEK:
|
||||||
|
Seek?.Invoke();
|
||||||
|
break;
|
||||||
|
case mpv_event_id.MPV_EVENT_PROPERTY_CHANGE:
|
||||||
|
var event_propertyData = (mpv_event_property)Marshal.PtrToStructure(evt.data, typeof(mpv_event_property));
|
||||||
|
|
||||||
|
if (event_propertyData.format == mpv_format.MPV_FORMAT_FLAG)
|
||||||
|
foreach (var i in BoolPropChangeActions)
|
||||||
|
if (i.Key== event_propertyData.name)
|
||||||
|
i.Value.Invoke(Marshal.PtrToStructure<int>(event_propertyData.data) == 1);
|
||||||
|
break;
|
||||||
|
case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART:
|
||||||
|
PlaybackRestart?.Invoke();
|
||||||
|
Size s = new Size(get_property_int("dwidth"), get_property_int("dheight"));
|
||||||
|
|
||||||
|
if (VideoSize != s && s != Size.Empty)
|
||||||
{
|
{
|
||||||
MainForm.Instance.ShowMsgBox(ex.GetType().Name + "\n\n" + ex.ToString(), MessageBoxIcon.Error);
|
VideoSize = s;
|
||||||
|
VideoSizeChanged?.Invoke();
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_CHAPTER_CHANGE:
|
||||||
case mpv_event_id.MPV_EVENT_VIDEO_RECONFIG:
|
ChapterChange?.Invoke();
|
||||||
VideoReconfig?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_QUEUE_OVERFLOW:
|
||||||
case mpv_event_id.MPV_EVENT_AUDIO_RECONFIG:
|
QueueOverflow?.Invoke();
|
||||||
AudioReconfig?.Invoke();
|
break;
|
||||||
break;
|
case mpv_event_id.MPV_EVENT_HOOK:
|
||||||
case mpv_event_id.MPV_EVENT_METADATA_UPDATE:
|
Hook?.Invoke();
|
||||||
MetadataUpdate?.Invoke();
|
break;
|
||||||
break;
|
}
|
||||||
case mpv_event_id.MPV_EVENT_SEEK:
|
}
|
||||||
Seek?.Invoke();
|
catch (Exception ex)
|
||||||
break;
|
{
|
||||||
case mpv_event_id.MPV_EVENT_PROPERTY_CHANGE:
|
MainForm.Instance.ShowMsgBox(ex.ToString(), MessageBoxIcon.Error);
|
||||||
var event_propertyData = (mpv_event_property)Marshal.PtrToStructure(evt.data, typeof(mpv_event_property));
|
|
||||||
|
|
||||||
if (event_propertyData.format == mpv_format.MPV_FORMAT_FLAG)
|
|
||||||
foreach (var i in BoolPropChangeActions)
|
|
||||||
if (i.Key== event_propertyData.name)
|
|
||||||
i.Value.Invoke(Marshal.PtrToStructure<int>(event_propertyData.data) == 1);
|
|
||||||
break;
|
|
||||||
case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART:
|
|
||||||
PlaybackRestart?.Invoke();
|
|
||||||
Size s = new Size(get_property_int("dwidth"), get_property_int("dheight"));
|
|
||||||
|
|
||||||
if (VideoSize != s && s != Size.Empty)
|
|
||||||
{
|
|
||||||
VideoSize = s;
|
|
||||||
VideoSizeChanged?.Invoke();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case mpv_event_id.MPV_EVENT_CHAPTER_CHANGE:
|
|
||||||
ChapterChange?.Invoke();
|
|
||||||
break;
|
|
||||||
case mpv_event_id.MPV_EVENT_QUEUE_OVERFLOW:
|
|
||||||
QueueOverflow?.Invoke();
|
|
||||||
break;
|
|
||||||
case mpv_event_id.MPV_EVENT_HOOK:
|
|
||||||
Hook?.Invoke();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -353,15 +360,23 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static string get_property_string(string name, bool throwOnException = false)
|
public static string get_property_string(string name, bool throwOnException = false)
|
||||||
{
|
{
|
||||||
int err = mpv_get_property(MpvHandle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_STRING, out IntPtr lpBuffer);
|
try
|
||||||
|
{
|
||||||
|
int err = mpv_get_property(MpvHandle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_STRING, out IntPtr lpBuffer);
|
||||||
|
|
||||||
if (err < 0 && throwOnException)
|
if (err < 0 && throwOnException)
|
||||||
throw new Exception($"{name}: {(mpv_error)err}");
|
throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
|
|
||||||
var ret = StringFromNativeUtf8(lpBuffer);
|
var ret = StringFromNativeUtf8(lpBuffer);
|
||||||
mpv_free(lpBuffer);
|
mpv_free(lpBuffer);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (throwOnException) throw ex;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int get_property_int(string name, bool throwOnException = false)
|
public static int get_property_int(string name, bool throwOnException = false)
|
||||||
@@ -489,6 +504,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
string[] types = "264 265 3gp aac ac3 avc avi avs bmp divx dts dtshd dtshr dtsma eac3 evo flac flv h264 h265 hevc hvc jpg jpeg m2t m2ts m2v m4a m4v mka mkv mlp mov mp2 mp3 mp4 mpa mpeg mpg mpv mts ogg ogm opus pcm png pva raw rmvb thd thd+ac3 true-hd truehd ts vdr vob vpy w64 wav webm wmv y4m".Split(' ');
|
string[] types = "264 265 3gp aac ac3 avc avi avs bmp divx dts dtshd dtshr dtsma eac3 evo flac flv h264 h265 hevc hvc jpg jpeg m2t m2ts m2v m4a m4v mka mkv mlp mov mp2 mp3 mp4 mpa mpeg mpg mpv mts ogg ogm opus pcm png pva raw rmvb thd thd+ac3 true-hd truehd ts vdr vob vpy w64 wav webm wmv y4m".Split(' ');
|
||||||
string path = get_property_string("path");
|
string path = get_property_string("path");
|
||||||
|
if (!Directory.Exists(Path.GetDirectoryName(path))) return;
|
||||||
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
||||||
files = files.Where((file) => types.Contains(Path.GetExtension(file).TrimStart(".".ToCharArray()).ToLower())).ToList();
|
files = files.Where((file) => types.Contains(Path.GetExtension(file).TrimStart(".".ToCharArray()).ToLower())).ToList();
|
||||||
files.Sort(new StringLogicalComparer());
|
files.Sort(new StringLogicalComparer());
|
||||||
|
|||||||
@@ -168,6 +168,9 @@
|
|||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<None Include="..\README.md">
|
||||||
|
<Link>README.md</Link>
|
||||||
|
</None>
|
||||||
<None Include="app.manifest" />
|
<None Include="app.manifest" />
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
<None Include="Properties\Settings.settings">
|
<None Include="Properties\Settings.settings">
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Height="500" Width="700" Loaded="MainWindow1_Loaded">
|
Height="600" Width="800" Loaded="MainWindow1_Loaded" WindowStartupLocation="CenterScreen">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
@@ -14,8 +14,8 @@
|
|||||||
<ColumnDefinition Width="10*" />
|
<ColumnDefinition Width="10*" />
|
||||||
<ColumnDefinition Width="60*" />
|
<ColumnDefinition Width="60*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Controls:SearchTextBoxUserControl x:Name="SearchControl" Width="300" Margin="0,0,0,10" Grid.ColumnSpan="2" />
|
<Controls:SearchTextBoxUserControl x:Name="SearchControl" Width="300" Margin="0,20,0,10" Grid.ColumnSpan="2" />
|
||||||
<ScrollViewer x:Name="MainScrollViewer" VerticalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="1">
|
<ScrollViewer x:Name="MainScrollViewer" VerticalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="1" Margin="0,0,0,10">
|
||||||
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="OpenSettingsTextBlock_MouseUp">Open settings folder</TextBlock>
|
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="OpenSettingsTextBlock_MouseUp">Open settings folder</TextBlock>
|
||||||
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
||||||
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
||||||
|
<TextBlock x:Name="ApplyTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static SystemParameters.WindowGlassBrush}" MouseUp="ApplyTextBlock_MouseUp">Write config to mpv.conf</TextBlock>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Window>
|
</Window>
|
||||||
@@ -79,7 +79,11 @@ namespace mpvConfEdit
|
|||||||
protected override void OnClosed(EventArgs e)
|
protected override void OnClosed(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnClosed(e);
|
base.OnClosed(e);
|
||||||
|
WriteToDisk();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteToDisk()
|
||||||
|
{
|
||||||
foreach (var mpvSetting in DynamicSettings)
|
foreach (var mpvSetting in DynamicSettings)
|
||||||
{
|
{
|
||||||
switch (mpvSetting)
|
switch (mpvSetting)
|
||||||
@@ -87,14 +91,10 @@ namespace mpvConfEdit
|
|||||||
case StringSetting s:
|
case StringSetting s:
|
||||||
if ((s.Value ?? "") != s.Default)
|
if ((s.Value ?? "") != s.Default)
|
||||||
mpvConf[s.Name] = s.Value;
|
mpvConf[s.Name] = s.Value;
|
||||||
else
|
|
||||||
mpvConf.Remove(s.Name);
|
|
||||||
break;
|
break;
|
||||||
case OptionSetting s:
|
case OptionSetting s:
|
||||||
if ((s.Value ?? "") != s.Default)
|
if ((s.Value ?? "") != s.Default)
|
||||||
mpvConf[s.Name] = s.Value;
|
mpvConf[s.Name] = s.Value;
|
||||||
else
|
|
||||||
mpvConf.Remove(s.Name);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -149,12 +149,8 @@ namespace mpvConfEdit
|
|||||||
}
|
}
|
||||||
|
|
||||||
File.WriteAllText(mpvConfPath, String.Join(Environment.NewLine, lines));
|
File.WriteAllText(mpvConfPath, String.Join(Environment.NewLine, lines));
|
||||||
|
MessageBox.Show("Changes will be available on next startup of mpv(.net).",
|
||||||
foreach (Process process in Process.GetProcesses())
|
Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
if (process.ProcessName == "mpvnet")
|
|
||||||
MessageBox.Show("Restart mpv.net in order to apply changed settings.", Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
|
||||||
else if (process.ProcessName == "mpv")
|
|
||||||
MessageBox.Show("Restart mpv in order to apply changed settings.", Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
@@ -210,5 +206,10 @@ namespace mpvConfEdit
|
|||||||
{
|
{
|
||||||
Process.Start("https://github.com/stax76/mpv.net#Support");
|
Process.Start("https://github.com/stax76/mpv.net#Support");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ApplyTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
|
{
|
||||||
|
WriteToDisk();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ using System.Windows;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("mpv(.net) conf edit")]
|
[assembly: AssemblyProduct("mpv(.net) conf edit")]
|
||||||
[assembly: AssemblyCopyright("Copyright © stax76")]
|
[assembly: AssemblyCopyright("Copyright © 2017 stax76")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -51,5 +51,5 @@ using System.Windows;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.1.0.0")]
|
[assembly: AssemblyVersion("1.2.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.1.0.0")]
|
[assembly: AssemblyFileVersion("1.2.0.0")]
|
||||||
|
|||||||
@@ -19,6 +19,28 @@ options = [{ name = "no", help = "always use software decoding (Defaul
|
|||||||
{ name = "crystalhd", help = "copies video back to system RAM (Any platform supported by hardware)" },
|
{ name = "crystalhd", help = "copies video back to system RAM (Any platform supported by hardware)" },
|
||||||
{ name = "rkmpp", help = "requires --vo=gpu (some RockChip devices only)" }]
|
{ name = "rkmpp", help = "requires --vo=gpu (some RockChip devices only)" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "gpu-api"
|
||||||
|
default = "auto"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--gpu-api=<type> Controls which type of graphics APIs will be accepted."
|
||||||
|
options = [{ name = "auto", help = "Use any available API (Default)" },
|
||||||
|
{ name = "opengl", help = "Allow only OpenGL (requires OpenGL 2.1+ or GLES 2.0+)" },
|
||||||
|
{ name = "vulkan", help = "Allow only Vulkan (requires a valid/working --spirv-compiler)" },
|
||||||
|
{ name = "d3d11", help = "Allow only --gpu-context=d3d11" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "gpu-context"
|
||||||
|
default = "auto"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--gpu-context=<sys> The value auto (the default) selects the GPU context. You can also pass help to get a complete list of compiled in backends (sorted by autoprobe order)."
|
||||||
|
options = [{ name = "auto", help = "auto-select (Default)" },
|
||||||
|
{ name = "win", help = "Win32/WGL" },
|
||||||
|
{ name = "winvk", help = "VK_KHR_win32_surface" },
|
||||||
|
{ name = "angle", help = "Direct3D11 through the OpenGL ES translation layer ANGLE. This supports almost everything the win backend does (if the ANGLE build is new enough)." },
|
||||||
|
{ name = "dxinterop", help = "(experimental) Win32, using WGL for rendering and Direct3D 9Ex for presentation. Works on Nvidia and AMD. Newer Intel chips with the latest drivers may also work." },
|
||||||
|
{ name = "d3d11", help = "Win32, with native Direct3D 11 rendering." }]
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "vo"
|
name = "vo"
|
||||||
default = "gpu"
|
default = "gpu"
|
||||||
@@ -28,6 +50,96 @@ help = "--gpu=<mode> Video output drivers to be used. Default = gpu.\n\nFor more
|
|||||||
options = [{ name = "gpu", help = "General purpose, customizable, GPU-accelerated video output driver. It supports extended scaling methods, dithering, color management, custom shaders, HDR, and more. (Default)" },
|
options = [{ name = "gpu", help = "General purpose, customizable, GPU-accelerated video output driver. It supports extended scaling methods, dithering, color management, custom shaders, HDR, and more. (Default)" },
|
||||||
{ name = "direct3d", help = "Video output driver that uses the Direct3D interface" }]
|
{ name = "direct3d", help = "Video output driver that uses the Direct3D interface" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "video-sync"
|
||||||
|
default = "audio"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--video-sync=<audio|...> How the player synchronizes audio and video.\n\nFor more information visit:"
|
||||||
|
helpurl = "https://mpv.io/manual/master/#options-video-sync"
|
||||||
|
options = [{ name = "audio" },
|
||||||
|
{ name = "display-resample" },
|
||||||
|
{ name = "display-resample-vdrop" },
|
||||||
|
{ name = "display-resample-desync" },
|
||||||
|
{ name = "display-vdrop" },
|
||||||
|
{ name = "display-adrop" },
|
||||||
|
{ name = "display-desync" },
|
||||||
|
{ name = "desync" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "scale"
|
||||||
|
default = "bilinear"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--scale=<filter> 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"
|
||||||
|
options = [{ name = "bilinear", help = "Bilinear hardware texture filtering (fastest, very low quality). This is the default for compatibility reasons." },
|
||||||
|
{ name = "spline36", help = "Mid quality and speed. This is the default when using gpu-hq." },
|
||||||
|
{ name = "lanczos", help = "Lanczos scaling. Provides mid quality and speed. Generally worse than spline36, but it results in a slightly sharper image which is good for some content types. The number of taps can be controlled with scale-radius, but is best left unchanged. (This filter is an alias for sinc-windowed sinc)" },
|
||||||
|
{ name = "ewa_lanczos", help = "Elliptic weighted average Lanczos scaling. Also known as Jinc. Relatively slow, but very good quality. The radius can be controlled with scale-radius. Increasing the radius makes the filter sharper but adds more ringing. (This filter is an alias for jinc-windowed jinc)" },
|
||||||
|
{ name = "ewa_lanczossharp", help = "A slightly sharpened version of ewa_lanczos, preconfigured to use an ideal radius and parameter. If your hardware can run it, this is probably what you should use by default." },
|
||||||
|
{ name = "mitchell", help = "Mitchell-Netravali. The B and C parameters can be set with --scale-param1 and --scale-param2. This filter is very good at downscaling (see --dscale)." },
|
||||||
|
{ name = "oversample", help = "A version of nearest neighbour that (naively) oversamples pixels, so that pixels overlapping edges get linearly interpolated instead of rounded. This essentially removes the small imperfections and judder artifacts caused by nearest-neighbour interpolation, in exchange for adding some blur. This filter is good at temporal interpolation, and also known as \"smoothmotion\" (see --tscale)." },
|
||||||
|
{ name = "linear", help = "A --tscale filter." }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "cscale"
|
||||||
|
default = "bilinear"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--cscale=<filter> As --scale, but for interpolating chroma information. If the image is not subsampled, this option is ignored entirely."
|
||||||
|
options = [{ name = "bilinear", help = "Bilinear hardware texture filtering (fastest, very low quality). This is the default for compatibility reasons." },
|
||||||
|
{ name = "spline36", help = "Mid quality and speed. This is the default when using gpu-hq." },
|
||||||
|
{ name = "lanczos", help = "Lanczos scaling. Provides mid quality and speed. Generally worse than spline36, but it results in a slightly sharper image which is good for some content types. The number of taps can be controlled with scale-radius, but is best left unchanged. (This filter is an alias for sinc-windowed sinc)" },
|
||||||
|
{ name = "ewa_lanczos", help = "Elliptic weighted average Lanczos scaling. Also known as Jinc. Relatively slow, but very good quality. The radius can be controlled with scale-radius. Increasing the radius makes the filter sharper but adds more ringing. (This filter is an alias for jinc-windowed jinc)" },
|
||||||
|
{ name = "ewa_lanczossharp", help = "A slightly sharpened version of ewa_lanczos, preconfigured to use an ideal radius and parameter. If your hardware can run it, this is probably what you should use by default." },
|
||||||
|
{ name = "mitchell", help = "Mitchell-Netravali. The B and C parameters can be set with --scale-param1 and --scale-param2. This filter is very good at downscaling (see --dscale)." },
|
||||||
|
{ name = "oversample", help = "A version of nearest neighbour that (naively) oversamples pixels, so that pixels overlapping edges get linearly interpolated instead of rounded. This essentially removes the small imperfections and judder artifacts caused by nearest-neighbour interpolation, in exchange for adding some blur. This filter is good at temporal interpolation, and also known as \"smoothmotion\" (see --tscale)." },
|
||||||
|
{ name = "linear", help = "A --tscale filter." }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "dscale"
|
||||||
|
default = "bilinear"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--dscale=<filter> Like --scale, but apply these filters on downscaling instead. If this option is unset, the filter implied by --scale will be applied."
|
||||||
|
options = [{ name = "bilinear", help = "Bilinear hardware texture filtering (fastest, very low quality). This is the default for compatibility reasons." },
|
||||||
|
{ name = "spline36", help = "Mid quality and speed. This is the default when using gpu-hq." },
|
||||||
|
{ name = "lanczos", help = "Lanczos scaling. Provides mid quality and speed. Generally worse than spline36, but it results in a slightly sharper image which is good for some content types. The number of taps can be controlled with scale-radius, but is best left unchanged. (This filter is an alias for sinc-windowed sinc)" },
|
||||||
|
{ name = "ewa_lanczos", help = "Elliptic weighted average Lanczos scaling. Also known as Jinc. Relatively slow, but very good quality. The radius can be controlled with scale-radius. Increasing the radius makes the filter sharper but adds more ringing. (This filter is an alias for jinc-windowed jinc)" },
|
||||||
|
{ name = "ewa_lanczossharp", help = "A slightly sharpened version of ewa_lanczos, preconfigured to use an ideal radius and parameter. If your hardware can run it, this is probably what you should use by default." },
|
||||||
|
{ name = "mitchell", help = "Mitchell-Netravali. The B and C parameters can be set with --scale-param1 and --scale-param2. This filter is very good at downscaling (see --dscale)." },
|
||||||
|
{ name = "oversample", help = "A version of nearest neighbour that (naively) oversamples pixels, so that pixels overlapping edges get linearly interpolated instead of rounded. This essentially removes the small imperfections and judder artifacts caused by nearest-neighbour interpolation, in exchange for adding some blur. This filter is good at temporal interpolation, and also known as \"smoothmotion\" (see --tscale)." },
|
||||||
|
{ name = "linear", help = "A --tscale filter." }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "dither-depth"
|
||||||
|
default = "no"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--dither-depth=<N|no|auto> Set dither target depth to N. Default: no. 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."
|
||||||
|
options = [{ name = "no", help = "Disable any dithering done by mpv." },
|
||||||
|
{ name = "auto", help = "Automatic selection. If output bit depth cannot be detected, 8 bits per component are assumed." },
|
||||||
|
{ name = "8", help = "Dither to 8 bit output." }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "correct-downscaling"
|
||||||
|
default = "no"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--correct-downscaling 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."
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "sigmoid-upscaling"
|
||||||
|
default = "no"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--sigmoid-upscaling When upscaling, use a sigmoidal color transform to avoid emphasizing ringing artifacts. This also implies --linear-scaling."
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "deband"
|
||||||
|
default = "no"
|
||||||
|
filter = "Video"
|
||||||
|
help = "--deband 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."
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "volume"
|
name = "volume"
|
||||||
default = "100"
|
default = "100"
|
||||||
@@ -145,21 +257,6 @@ default = ""
|
|||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "--loop-playlist=<N|inf|force|no>, --loop-playlist 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. --loop-playlist is the same as --loop-playlist=inf.\n\nThe 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."
|
help = "--loop-playlist=<N|inf|force|no>, --loop-playlist 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. --loop-playlist is the same as --loop-playlist=inf.\n\nThe 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 = "video-sync"
|
|
||||||
default = "audio"
|
|
||||||
filter = "Video"
|
|
||||||
help = "--video-sync=<audio|...> How the player synchronizes audio and video.\n\nFor more information visit:"
|
|
||||||
helpurl = "https://mpv.io/manual/master/#options-video-sync"
|
|
||||||
options = [{ name = "audio" },
|
|
||||||
{ name = "display-resample" },
|
|
||||||
{ name = "display-resample-vdrop" },
|
|
||||||
{ name = "display-resample-desync" },
|
|
||||||
{ name = "display-vdrop" },
|
|
||||||
{ name = "display-adrop" },
|
|
||||||
{ name = "display-desync" },
|
|
||||||
{ name = "desync" }]
|
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "audio-file-auto"
|
name = "audio-file-auto"
|
||||||
default = "no"
|
default = "no"
|
||||||
|
|||||||
@@ -1,6 +1,41 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<configuration>
|
<configuration>
|
||||||
|
<configSections>
|
||||||
|
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||||
|
<section name="mpvInputEdit.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||||
|
</sectionGroup>
|
||||||
|
</configSections>
|
||||||
<startup>
|
<startup>
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
||||||
</startup>
|
</startup>
|
||||||
|
<userSettings>
|
||||||
|
<mpvInputEdit.Properties.Settings>
|
||||||
|
<setting name="input_conf_help" serializeAs="String">
|
||||||
|
<value> # This file defines the input (keys and mouse) bindings of mpv and mpv.net
|
||||||
|
# and it also defines the context menu of mpv.net. mpv.net has a input
|
||||||
|
# editor and a conf editor as alternatives to editing this file via texteditor.
|
||||||
|
# The input and conf editors can be found in mpv.net's context menu at:
|
||||||
|
|
||||||
|
# Settings > Show Config Editor
|
||||||
|
# Settings > Show Input Editor
|
||||||
|
|
||||||
|
# The defaults of this file can be found at:
|
||||||
|
|
||||||
|
# https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt
|
||||||
|
|
||||||
|
# the defaults of mpv can be found at:
|
||||||
|
|
||||||
|
# https://github.com/mpv-player/mpv/blob/master/etc/input.conf
|
||||||
|
|
||||||
|
# mpv.net's defaults of mpv.conf contain: 'input-default-bindings = no'
|
||||||
|
# which disables mpv's input defaults. Every line in this file begins with a
|
||||||
|
# space character to make it easier to do a text search, so if you want to know
|
||||||
|
# if 'o' has already a binding you can make a text search on ' o '.
|
||||||
|
|
||||||
|
# mpv input commands: https://github.com/stax76/mpv.net/wiki/mpv-input-commands
|
||||||
|
|
||||||
|
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys</value>
|
||||||
|
</setting>
|
||||||
|
</mpvInputEdit.Properties.Settings>
|
||||||
|
</userSettings>
|
||||||
</configuration>
|
</configuration>
|
||||||
@@ -27,8 +27,8 @@ namespace mpvInputEdit
|
|||||||
if (l.StartsWith("#")) continue;
|
if (l.StartsWith("#")) continue;
|
||||||
if (!l.Contains(" ")) continue;
|
if (!l.Contains(" ")) continue;
|
||||||
InputItem item = new InputItem();
|
InputItem item = new InputItem();
|
||||||
item.Key = l.Substring(0, l.IndexOf(" "));
|
item.Input = l.Substring(0, l.IndexOf(" "));
|
||||||
if (item.Key == "") continue;
|
if (item.Input == "") continue;
|
||||||
l = l.Substring(l.IndexOf(" ") + 1);
|
l = l.Substring(l.IndexOf(" ") + 1);
|
||||||
|
|
||||||
if (l.Contains("#menu:"))
|
if (l.Contains("#menu:"))
|
||||||
|
|||||||
@@ -277,18 +277,18 @@ namespace mpvInputEdit
|
|||||||
{
|
{
|
||||||
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
|
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
|
||||||
source.AddHook(new HwndSourceHook(WndProc));
|
source.AddHook(new HwndSourceHook(WndProc));
|
||||||
SetKey(InputItem.Key);
|
SetKey(InputItem.Input);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
|
private void ConfirmButton_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
InputItem.Key = NewKey;
|
InputItem.Input = NewKey;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClearButton_Click(object sender, RoutedEventArgs e)
|
private void ClearButton_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
InputItem.Key = "_";
|
InputItem.Input = "_";
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,18 +8,18 @@
|
|||||||
Loaded="Window_Loaded" Closed="Window_Closed">
|
Loaded="Window_Loaded" Closed="Window_Closed">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="60" />
|
<RowDefinition Height="Auto" />
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Controls:SearchTextBoxUserControl x:Name="SearchControl" Width="300" Margin="0,0,0,10" Grid.ColumnSpan="2" />
|
<Controls:SearchTextBoxUserControl x:Name="SearchControl" Width="300" Margin="0,20,0,20" Grid.ColumnSpan="2" />
|
||||||
<DataGrid Grid.Row="1" x:Name="DataGrid" AutoGenerateColumns="False" CellStyle="{StaticResource DataGrid_Font_Centering}">
|
<DataGrid Grid.Row="1" x:Name="DataGrid" CommandManager.PreviewCanExecute="DataGrid_PreviewCanExecute" AutoGenerateColumns="False" CellStyle="{StaticResource DataGrid_Font_Centering}">
|
||||||
<DataGrid.Columns>
|
<DataGrid.Columns>
|
||||||
<DataGridTextColumn Header="Context Menu" Binding="{Binding Menu}"/>
|
<DataGridTextColumn Header="Menu" Binding="{Binding Menu}"/>
|
||||||
<DataGridTemplateColumn Header="Input">
|
<DataGridTemplateColumn Header="Input">
|
||||||
<DataGridTemplateColumn.CellTemplate>
|
<DataGridTemplateColumn.CellTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<Button MinHeight="20" Click="ButtonClick">
|
<Button MinHeight="20" Click="ButtonClick">
|
||||||
<TextBlock Text="{Binding Key}"></TextBlock>
|
<TextBlock Text="{Binding Input}"></TextBlock>
|
||||||
</Button>
|
</Button>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</DataGridTemplateColumn.CellTemplate>
|
</DataGridTemplateColumn.CellTemplate>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
@@ -34,14 +34,24 @@ namespace mpvInputEdit
|
|||||||
|
|
||||||
bool Filter(InputItem item)
|
bool Filter(InputItem item)
|
||||||
{
|
{
|
||||||
string searchText = SearchControl.SearchTextBox.Text.ToLowerInvariant();
|
string searchText = SearchControl.SearchTextBox.Text.ToLower();
|
||||||
|
if (searchText == "") return true;
|
||||||
|
|
||||||
if (searchText == "")
|
if (searchText.StartsWith("i ") || searchText.StartsWith("i:"))
|
||||||
return true;
|
{
|
||||||
|
searchText = searchText.Substring(2).Trim();
|
||||||
|
|
||||||
if (item.Command.ToLower().Contains(searchText) ||
|
if (searchText.Length < 3)
|
||||||
|
return item.Input.ToLower().Replace("ctrl+", "").Replace("shift+", "").Replace("alt+", "").Contains(searchText);
|
||||||
|
else
|
||||||
|
return item.Input.ToLower().Contains(searchText);
|
||||||
|
} else if (searchText.StartsWith("m ") || searchText.StartsWith("m:"))
|
||||||
|
return item.Menu.ToLower().Contains(searchText.Substring(2).Trim());
|
||||||
|
else if (searchText.StartsWith("c ") || searchText.StartsWith("c:"))
|
||||||
|
return item.Command.ToLower().Contains(searchText.Substring(2).Trim());
|
||||||
|
else if (item.Command.ToLower().Contains(searchText) ||
|
||||||
item.Menu.ToLower().Contains(searchText) ||
|
item.Menu.ToLower().Contains(searchText) ||
|
||||||
item.Key.ToLower().Contains(searchText))
|
item.Input.ToLower().Contains(searchText))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -56,44 +66,33 @@ namespace mpvInputEdit
|
|||||||
w.Owner = this;
|
w.Owner = this;
|
||||||
w.InputItem = item;
|
w.InputItem = item;
|
||||||
w.ShowDialog();
|
w.ShowDialog();
|
||||||
|
|
||||||
|
var items = new Dictionary<string, InputItem>();
|
||||||
|
|
||||||
|
foreach (InputItem i in App.InputItems)
|
||||||
|
if (items.ContainsKey(i.Input) && i.Input != "_")
|
||||||
|
MessageBox.Show($"Duplicate found:\n\n{i.Input}: {i.Menu}\n\n{items[i.Input].Input}: {items[i.Input].Menu}\n\nPlease note that you can chain multiple commands in the same line by using a semicolon as separator.", "Duplicate Found", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||||
|
else
|
||||||
|
items[i.Input] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs e)
|
private void Window_Loaded(object sender, RoutedEventArgs e) => Keyboard.Focus(SearchControl.SearchTextBox);
|
||||||
{
|
|
||||||
Keyboard.Focus(SearchControl.SearchTextBox);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Grid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e)
|
|
||||||
{
|
|
||||||
DataGrid grid = (DataGrid)sender;
|
|
||||||
|
|
||||||
if (e.Command == DataGrid.DeleteCommand)
|
|
||||||
{
|
|
||||||
if (MessageBox.Show($"Would you like to delete the selected item?\n\n{(grid.SelectedItem as InputItem).Menu}",
|
|
||||||
"Confirm Delete", MessageBoxButton.OKCancel) != MessageBoxResult.OK)
|
|
||||||
{
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Window_Closed(object sender, EventArgs e)
|
private void Window_Closed(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (MessageBox.Show("Would you like to save changes?", "Confirm Save", MessageBoxButton.OKCancel) != MessageBoxResult.OK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var backupDir = Path.GetDirectoryName(App.InputConfPath) + "\\backup\\";
|
var backupDir = Path.GetDirectoryName(App.InputConfPath) + "\\backup\\";
|
||||||
|
|
||||||
if (!Directory.Exists(backupDir))
|
if (!Directory.Exists(backupDir))
|
||||||
Directory.CreateDirectory(backupDir);
|
Directory.CreateDirectory(backupDir);
|
||||||
|
|
||||||
File.Copy(App.InputConfPath, backupDir + "input conf " + DateTime.Now.ToString("yyyy-MM-dd HH-mm") + ".conf");
|
if (File.Exists(App.InputConfPath))
|
||||||
|
File.Copy(App.InputConfPath, backupDir + "input conf " + DateTime.Now.ToString("yyyy-MM-dd HH-mm") + ".conf");
|
||||||
|
|
||||||
string text = "";
|
string text = "\r\n" + Properties.Settings.Default.input_conf_help + "\r\n\r\n";
|
||||||
|
|
||||||
foreach (InputItem item in App.InputItems)
|
foreach (InputItem item in App.InputItems)
|
||||||
{
|
{
|
||||||
string line = " " + item.Key.PadRight(14);
|
string line = " " + item.Input.PadRight(10);
|
||||||
|
|
||||||
if (item.Command.Trim() == "")
|
if (item.Command.Trim() == "")
|
||||||
line += " ignore";
|
line += " ignore";
|
||||||
@@ -108,11 +107,17 @@ namespace mpvInputEdit
|
|||||||
|
|
||||||
File.WriteAllText(App.InputConfPath, text);
|
File.WriteAllText(App.InputConfPath, text);
|
||||||
|
|
||||||
foreach (Process process in Process.GetProcesses())
|
MessageBox.Show("Changes will be available on next mpv(.net) startup.",
|
||||||
if (process.ProcessName == "mpvnet")
|
Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
MessageBox.Show("Restart mpv.net in order to apply changed input bindings.", Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
}
|
||||||
else if (process.ProcessName == "mpv")
|
|
||||||
MessageBox.Show("Restart mpv in order to apply changed input bindings.", Title, MessageBoxButton.OK, MessageBoxImage.Information);
|
private void DataGrid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e)
|
||||||
|
{
|
||||||
|
DataGrid grid = (DataGrid)sender;
|
||||||
|
|
||||||
|
if (e.Command == DataGrid.DeleteCommand)
|
||||||
|
if (MessageBox.Show($"Confirm to delete: {(grid.SelectedItem as InputItem).Input} ({(grid.SelectedItem as InputItem).Menu})", "Confirm Delete", MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK)
|
||||||
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ using System.Windows;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("mpv(.net) input edit")]
|
[assembly: AssemblyProduct("mpv(.net) input edit")]
|
||||||
[assembly: AssemblyCopyright("Copyright © stax76")]
|
[assembly: AssemblyCopyright("Copyright © 2017 stax76")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -51,5 +51,5 @@ using System.Windows;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.1.0.0")]
|
[assembly: AssemblyVersion("1.2.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.1.0.0")]
|
[assembly: AssemblyFileVersion("1.2.0.0")]
|
||||||
|
|||||||
51
mpvInputEdit/Properties/Settings.Designer.cs
generated
51
mpvInputEdit/Properties/Settings.Designer.cs
generated
@@ -8,21 +8,54 @@
|
|||||||
// </auto-generated>
|
// </auto-generated>
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace mpvInputEdit.Properties
|
namespace mpvInputEdit.Properties {
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")]
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
|
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||||
{
|
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||||
|
|
||||||
public static Settings Default {
|
public static Settings Default {
|
||||||
get {
|
get {
|
||||||
return defaultInstance;
|
return defaultInstance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute(@" # This file defines the input (keys and mouse) bindings of mpv and mpv.net
|
||||||
|
# and it also defines the context menu of mpv.net. mpv.net has a input
|
||||||
|
# editor and a conf editor as alternatives to editing this file via texteditor.
|
||||||
|
# The input and conf editors can be found in mpv.net's context menu at:
|
||||||
|
|
||||||
|
# Settings > Show Config Editor
|
||||||
|
# Settings > Show Input Editor
|
||||||
|
|
||||||
|
# The defaults of this file can be found at:
|
||||||
|
|
||||||
|
# https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt
|
||||||
|
|
||||||
|
# the defaults of mpv can be found at:
|
||||||
|
|
||||||
|
# https://github.com/mpv-player/mpv/blob/master/etc/input.conf
|
||||||
|
|
||||||
|
# mpv.net's defaults of mpv.conf contain: 'input-default-bindings = no'
|
||||||
|
# which disables mpv's input defaults. Every line in this file begins with a
|
||||||
|
# space character to make it easier to do a text search, so if you want to know
|
||||||
|
# if 'o' has already a binding you can make a text search on ' o '.
|
||||||
|
|
||||||
|
# mpv input commands: https://github.com/stax76/mpv.net/wiki/mpv-input-commands
|
||||||
|
|
||||||
|
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys")]
|
||||||
|
public string input_conf_help {
|
||||||
|
get {
|
||||||
|
return ((string)(this["input_conf_help"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["input_conf_help"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,32 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
|
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="mpvInputEdit.Properties" GeneratedClassName="Settings">
|
||||||
<Profiles>
|
<Profiles />
|
||||||
<Profile Name="(Default)" />
|
<Settings>
|
||||||
</Profiles>
|
<Setting Name="input_conf_help" Type="System.String" Scope="User">
|
||||||
<Settings />
|
<Value Profile="(Default)"> # This file defines the input (keys and mouse) bindings of mpv and mpv.net
|
||||||
|
# and it also defines the context menu of mpv.net. mpv.net has a input
|
||||||
|
# editor and a conf editor as alternatives to editing this file via texteditor.
|
||||||
|
# The input and conf editors can be found in mpv.net's context menu at:
|
||||||
|
|
||||||
|
# Settings > Show Config Editor
|
||||||
|
# Settings > Show Input Editor
|
||||||
|
|
||||||
|
# The defaults of this file can be found at:
|
||||||
|
|
||||||
|
# https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/input.conf.txt
|
||||||
|
|
||||||
|
# the defaults of mpv can be found at:
|
||||||
|
|
||||||
|
# https://github.com/mpv-player/mpv/blob/master/etc/input.conf
|
||||||
|
|
||||||
|
# mpv.net's defaults of mpv.conf contain: 'input-default-bindings = no'
|
||||||
|
# which disables mpv's input defaults. Every line in this file begins with a
|
||||||
|
# space character to make it easier to do a text search, so if you want to know
|
||||||
|
# if 'o' has already a binding you can make a text search on ' o '.
|
||||||
|
|
||||||
|
# mpv input commands: https://github.com/stax76/mpv.net/wiki/mpv-input-commands
|
||||||
|
|
||||||
|
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys</Value>
|
||||||
|
</Setting>
|
||||||
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DesignHeight="450" d:DesignWidth="800">
|
d:DesignHeight="450" d:DesignWidth="800">
|
||||||
<Grid x:Name="SearchTextBoxUserControl1" Background="White">
|
<Grid x:Name="SearchTextBoxUserControl1" Background="White">
|
||||||
<TextBlock x:Name="SearchTextBlock" Margin="5,2" Text="Search" Foreground="LightSteelBlue" VerticalAlignment="Center" />
|
<TextBlock x:Name="SearchHintTextBlock" Margin="5,2" Text="Type ? to get help." Foreground="LightSteelBlue" VerticalAlignment="Center" />
|
||||||
<TextBox Name="SearchTextBox" Height="25" Padding="1,2,0,0" BorderThickness="2" Background="Transparent" TextChanged="SearchTextBox_TextChanged" />
|
<TextBox Name="SearchTextBox" Height="25" Padding="1,2,0,0" BorderThickness="2" Background="Transparent" TextChanged="SearchTextBox_TextChanged" />
|
||||||
<Button x:Name="SearchClearButton" Background="Transparent" HorizontalAlignment="Right" Margin="2,0,4,0" FontSize="5" Width="17" Height="17" Visibility="Hidden" Click="SearchClearButton_Click">╳</Button>
|
<Button x:Name="SearchClearButton" Background="Transparent" HorizontalAlignment="Right" Margin="2,0,4,0" FontSize="5" Width="17" Height="17" Visibility="Hidden" Click="SearchClearButton_Click">╳</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -21,12 +21,15 @@ namespace Controls
|
|||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
{
|
{
|
||||||
SearchTextBlock.Text = SearchTextBox.Text == "" ? "Search" : "";
|
SearchHintTextBlock.Text = SearchTextBox.Text == "" ? "Type ? to get help." : "";
|
||||||
|
|
||||||
if (SearchTextBox.Text == "")
|
if (SearchTextBox.Text == "")
|
||||||
SearchClearButton.Visibility = Visibility.Hidden;
|
SearchClearButton.Visibility = Visibility.Hidden;
|
||||||
else
|
else
|
||||||
SearchClearButton.Visibility = Visibility.Visible;
|
SearchClearButton.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
if (SearchTextBox.Text == "?")
|
||||||
|
MessageBox.Show("Filtering works by searching in the Input, Menu and Command but it's possible to reduce the filter scope to either of Input, Menu or Command by prefixing as follows:\n\ni <input search>\ni: <input search>\n\nm <menu search>\nm: <menu search>\n\nc <command search>\nc: <command search>", "Filtering", MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,14 +21,12 @@ namespace mpvInputEdit
|
|||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _Key = "";
|
private string _Input = "";
|
||||||
|
|
||||||
public string Key {
|
public string Input {
|
||||||
get {
|
get => _Input;
|
||||||
return _Key;
|
|
||||||
}
|
|
||||||
set {
|
set {
|
||||||
_Key = value;
|
_Input = value;
|
||||||
NotifyPropertyChanged();
|
NotifyPropertyChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
mpvnet.iss
17
mpvnet.iss
@@ -1,6 +1,7 @@
|
|||||||
#define MyAppName "mpv.net"
|
#define MyAppName "mpv.net"
|
||||||
#define MyAppVersion GetFileVersion("mpv.net\bin\mpvnet.exe")
|
#define MyAppVersion GetFileVersion("mpv.net\bin\mpvnet.exe")
|
||||||
#define MyAppExeName "mpvnet.exe"
|
#define MyAppExeName "mpvnet.exe"
|
||||||
|
#define MyAppSourceDir "mpv.net\bin"
|
||||||
|
|
||||||
[Setup]
|
[Setup]
|
||||||
AppId={{9AA2B100-BEF3-44D0-B819-D8FC3C4D557D}}
|
AppId={{9AA2B100-BEF3-44D0-B819-D8FC3C4D557D}}
|
||||||
@@ -10,18 +11,20 @@ AppPublisher=stax76
|
|||||||
ArchitecturesInstallIn64BitMode=x64
|
ArchitecturesInstallIn64BitMode=x64
|
||||||
Compression=lzma2
|
Compression=lzma2
|
||||||
DefaultDirName={commonpf}\{#MyAppName}
|
DefaultDirName={commonpf}\{#MyAppName}
|
||||||
DisableProgramGroupPage=yes
|
|
||||||
OutputBaseFilename=mpvnet-{#MyAppVersion}
|
OutputBaseFilename=mpvnet-{#MyAppVersion}
|
||||||
OutputDir=C:\Users\frank\Desktop
|
OutputDir=C:\Users\frank\Desktop
|
||||||
ChangesAssociations=yes
|
DefaultGroupName={#MyAppName}
|
||||||
|
|
||||||
|
[Icons]
|
||||||
|
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "C:\Users\frank\Daten\Projekte\CS\mpv.net\mpv.net\bin\mpvnet.exe"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "{#MyAppSourceDir}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
||||||
Source: "C:\Users\frank\Daten\Projekte\CS\mpv.net\mpv.net\bin\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "System.Management.Automation.xml"
|
Source: "{#MyAppSourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: "System.Management.Automation.xml"
|
||||||
|
|
||||||
[Run]
|
[Run]
|
||||||
Filename: "{app}\defapp.exe"; Description: "Associate video file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: """{app}\{#MyAppExeName}"" mpg avi vob mp4 mkv avs 264 mov wmv flv h264 asf webm mpeg mpv y4m avc hevc 265 h265 m2v m2ts vpy mts webm m4v"
|
Filename: "{app}\{#MyAppExeName}"; Description: "Associate video file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc video"
|
||||||
Filename: "{app}\defapp.exe"; Description: "Associate audio file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: """{app}\{#MyAppExeName}"" mp2 mp3 ac3 wav w64 m4a dts dtsma dtshr dtshd eac3 thd thd+ac3 ogg mka aac opus flac mpa"
|
Filename: "{app}\{#MyAppExeName}"; Description: "Associate audio file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc audio"
|
||||||
|
|
||||||
[UninstallRun]
|
[UninstallRun]
|
||||||
Filename: "{app}\defapp.exe"; Flags: runascurrentuser runhidden nowait; Parameters: """{app}\{#MyAppExeName}"""
|
Filename: "{app}\{#MyAppExeName}"; Flags: runascurrentuser runhidden; Parameters: "--reg-file-assoc unregister"
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 194 KiB After Width: | Height: | Size: 193 KiB |
Reference in New Issue
Block a user