1.3
This commit is contained in:
13
README.md
13
README.md
@@ -10,7 +10,7 @@ mpv manual: https://mpv.io/manual/master/
|
|||||||
|
|
||||||
- Customizable context menu defined in the same file as the keybindings
|
- Customizable context menu defined in the same file as the keybindings
|
||||||
- Addon API for .NET languages
|
- Addon API for .NET languages
|
||||||
- Python scripting implemented with IronPython
|
- 5 different scripting languages are supported, Python scripting implemented with IronPython, C# implemented with CS-Script, Lua and JavaScript implemented in libmpv and PowerShell
|
||||||
- C# scripting implemented with CS-Script
|
- C# scripting implemented with CS-Script
|
||||||
- mpv's OSC, IPC, Lua/JS, conf files and more
|
- mpv's OSC, IPC, Lua/JS, conf files and more
|
||||||
|
|
||||||
@@ -82,6 +82,17 @@ def add_zero(val):
|
|||||||
mp.register_event("seek", seek) # or use: mp.Seek += seek
|
mp.register_event("seek", seek) # or use: mp.Seek += seek
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### PowerShell Scripting
|
||||||
|
|
||||||
|
A simple PowerShell script located at: C:\Users\user\AppData\Roaming\mpv\scripts
|
||||||
|
|
||||||
|
Please note that PowerShell don't allow assigning to events and mpv.net uses as workaround the script filename.
|
||||||
|
|
||||||
|
```
|
||||||
|
$position = [mp]::get_property_number("time-pos");
|
||||||
|
[mp]::commandv("show-text", $position.ToString() + " seconds")
|
||||||
|
```
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|
||||||
### not yet released
|
### not yet released
|
||||||
|
|||||||
124
mpv.net/PowerShellScript.cs
Normal file
124
mpv.net/PowerShellScript.cs
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Management.Automation.Runspaces;
|
||||||
|
|
||||||
|
using static mpvnet.StaticUsing;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace mpvnet
|
||||||
|
{
|
||||||
|
public class PowerShellScript
|
||||||
|
{
|
||||||
|
public static object Execute(string code, string[] parameters)
|
||||||
|
{
|
||||||
|
using (Runspace runspace = RunspaceFactory.CreateRunspace())
|
||||||
|
{
|
||||||
|
runspace.ApartmentState = ApartmentState.STA;
|
||||||
|
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
|
||||||
|
runspace.Open();
|
||||||
|
|
||||||
|
using (Pipeline pipeline = runspace.CreatePipeline())
|
||||||
|
{
|
||||||
|
pipeline.Commands.AddScript(
|
||||||
|
@"Using namespace mpvnet;
|
||||||
|
Using namespace System;
|
||||||
|
[System.Reflection.Assembly]::LoadWithPartialName(""mpvnet"")");
|
||||||
|
|
||||||
|
pipeline.Commands.AddScript(code);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var ret = pipeline.Invoke(parameters);
|
||||||
|
|
||||||
|
if (ret.Count > 0)
|
||||||
|
return ret[0];
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (Pipeline pipeline2 = runspace.CreatePipeline())
|
||||||
|
{
|
||||||
|
pipeline2.Commands.AddScript("$PSVersionTable.PSVersion.Major * 10 +" +
|
||||||
|
"$PSVersionTable.PSVersion.Minor");
|
||||||
|
|
||||||
|
if (Convert.ToInt32(pipeline2.Invoke()[0].ToString()) < 51)
|
||||||
|
throw new Exception();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
MsgError("PowerShell Setup Problem\r\n\r\nEnsure you have at least PowerShell 5.1 installed.");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
MsgError(ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Init(string filePath)
|
||||||
|
{
|
||||||
|
foreach (var eventInfo in typeof(mp).GetEvents())
|
||||||
|
{
|
||||||
|
if (eventInfo.Name.ToLower() ==
|
||||||
|
Path.GetFileNameWithoutExtension(filePath).ToLower().Replace("-", ""))
|
||||||
|
{
|
||||||
|
PowerShellEventObject eventObject = new PowerShellEventObject();
|
||||||
|
MethodInfo mi;
|
||||||
|
eventObject.FilePath = filePath;
|
||||||
|
|
||||||
|
if (eventInfo.EventHandlerType == typeof(Action))
|
||||||
|
{
|
||||||
|
mi = eventObject.GetType().GetMethod(nameof(PowerShellEventObject.Invoke));
|
||||||
|
}
|
||||||
|
else if (eventInfo.EventHandlerType == typeof(Action<EndFileEventMode>))
|
||||||
|
{
|
||||||
|
mi = eventObject.GetType().GetMethod(nameof(PowerShellEventObject.InvokeEndFileEventMode));
|
||||||
|
}
|
||||||
|
else if (eventInfo.EventHandlerType == typeof(Action<string[]>))
|
||||||
|
{
|
||||||
|
mi = eventObject.GetType().GetMethod(nameof(PowerShellEventObject.InvokeStrings));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw new Exception();
|
||||||
|
|
||||||
|
eventObject.EventInfo = eventInfo;
|
||||||
|
Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, eventObject, mi);
|
||||||
|
eventObject.Delegate = handler;
|
||||||
|
eventInfo.AddEventHandler(eventObject, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PowerShellEventObject
|
||||||
|
{
|
||||||
|
public EventInfo EventInfo { get; set; }
|
||||||
|
public Delegate Delegate { get; set; }
|
||||||
|
public string FilePath { get; set; }
|
||||||
|
|
||||||
|
public void Invoke()
|
||||||
|
{
|
||||||
|
Task.Run(() => { PowerShellScript.Execute(File.ReadAllText(FilePath), new string[] { }); });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokeEndFileEventMode(EndFileEventMode arg)
|
||||||
|
{
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
PowerShellScript.Execute(File.ReadAllText(FilePath), new string[] { arg.ToString() });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InvokeStrings(string[] args)
|
||||||
|
{
|
||||||
|
Task.Run(() => {
|
||||||
|
PowerShellScript.Execute(File.ReadAllText(FilePath), args);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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("1.2.0.0")]
|
[assembly: AssemblyVersion("1.3.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.2.0.0")]
|
[assembly: AssemblyFileVersion("1.3.0.0")]
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ using static mpvnet.StaticUsing;
|
|||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
public class PyScript
|
public class PythonScript
|
||||||
{
|
{
|
||||||
ScriptEngine engine;
|
ScriptEngine engine;
|
||||||
ScriptScope scope;
|
ScriptScope scope;
|
||||||
|
|
||||||
public PyScript(string code)
|
public PythonScript(string code)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -60,7 +60,7 @@ namespace mpvnet
|
|||||||
public static string mpvConfFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
public static string mpvConfFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
||||||
public static string InputConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\input.conf";
|
public static string InputConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\input.conf";
|
||||||
public static string mpvConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpv.conf";
|
public static string mpvConfPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\mpv.conf";
|
||||||
public static List<PyScript> PyScripts { get; } = new List<PyScript>();
|
public static List<PythonScript> PythonScripts { get; } = new List<PythonScript>();
|
||||||
public static bool IsShutdownComplete { get; set; }
|
public static bool IsShutdownComplete { get; set; }
|
||||||
|
|
||||||
private static Dictionary<string, string> _mpvConv;
|
private static Dictionary<string, string> _mpvConv;
|
||||||
@@ -122,10 +122,19 @@ namespace mpvnet
|
|||||||
|
|
||||||
foreach (var scriptPath in startupScripts)
|
foreach (var scriptPath in startupScripts)
|
||||||
if (Path.GetExtension(scriptPath) == ".py")
|
if (Path.GetExtension(scriptPath) == ".py")
|
||||||
PyScripts.Add(new PyScript(File.ReadAllText(scriptPath)));
|
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
||||||
|
|
||||||
foreach(var scriptPath in Directory.GetFiles(mp.mpvConfFolderPath + "scripts", "*.py"))
|
foreach (var scriptPath in startupScripts)
|
||||||
PyScripts.Add(new PyScript(File.ReadAllText(scriptPath)));
|
if (Path.GetExtension(scriptPath) == ".ps1")
|
||||||
|
PowerShellScript.Init(scriptPath);
|
||||||
|
|
||||||
|
foreach (var scriptPath in Directory.GetFiles(mp.mpvConfFolderPath + "Scripts"))
|
||||||
|
{
|
||||||
|
if (Path.GetExtension(scriptPath) == ".py")
|
||||||
|
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
||||||
|
else if (Path.GetExtension(scriptPath) == ".ps1")
|
||||||
|
PowerShellScript.Init(scriptPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void EventLoop()
|
public static void EventLoop()
|
||||||
@@ -251,7 +260,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EventObject
|
public class PythonEventObject
|
||||||
{
|
{
|
||||||
public PyRT.PythonFunction PythonFunction { get; set; }
|
public PyRT.PythonFunction PythonFunction { get; set; }
|
||||||
public EventInfo EventInfo { get; set; }
|
public EventInfo EventInfo { get; set; }
|
||||||
@@ -273,7 +282,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<EventObject> EventObjects = new List<EventObject>();
|
private static List<PythonEventObject> PythonEventObjects = new List<PythonEventObject>();
|
||||||
|
|
||||||
public static void register_event(string name, PyRT.PythonFunction pyFunc)
|
public static void register_event(string name, PyRT.PythonFunction pyFunc)
|
||||||
{
|
{
|
||||||
@@ -281,22 +290,22 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (eventInfo.Name.ToLower() == name.Replace("-", ""))
|
if (eventInfo.Name.ToLower() == name.Replace("-", ""))
|
||||||
{
|
{
|
||||||
EventObject eventObject = new EventObject();
|
PythonEventObject eventObject = new PythonEventObject();
|
||||||
EventObjects.Add(eventObject);
|
PythonEventObjects.Add(eventObject);
|
||||||
eventObject.PythonFunction = pyFunc;
|
eventObject.PythonFunction = pyFunc;
|
||||||
MethodInfo mi;
|
MethodInfo mi;
|
||||||
|
|
||||||
if (eventInfo.EventHandlerType == typeof(Action))
|
if (eventInfo.EventHandlerType == typeof(Action))
|
||||||
{
|
{
|
||||||
mi = eventObject.GetType().GetMethod(nameof(EventObject.Invoke));
|
mi = eventObject.GetType().GetMethod(nameof(PythonEventObject.Invoke));
|
||||||
}
|
}
|
||||||
else if (eventInfo.EventHandlerType == typeof(Action<EndFileEventMode>))
|
else if (eventInfo.EventHandlerType == typeof(Action<EndFileEventMode>))
|
||||||
{
|
{
|
||||||
mi = eventObject.GetType().GetMethod(nameof(EventObject.InvokeEndFileEventMode));
|
mi = eventObject.GetType().GetMethod(nameof(PythonEventObject.InvokeEndFileEventMode));
|
||||||
}
|
}
|
||||||
else if (eventInfo.EventHandlerType == typeof(Action<string[]>))
|
else if (eventInfo.EventHandlerType == typeof(Action<string[]>))
|
||||||
{
|
{
|
||||||
mi = eventObject.GetType().GetMethod(nameof(EventObject.InvokeStrings));
|
mi = eventObject.GetType().GetMethod(nameof(PythonEventObject.InvokeStrings));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new Exception();
|
throw new Exception();
|
||||||
@@ -311,7 +320,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void unregister_event(PyRT.PythonFunction pyFunc)
|
public static void unregister_event(PyRT.PythonFunction pyFunc)
|
||||||
{
|
{
|
||||||
foreach (var eventObjects in EventObjects)
|
foreach (var eventObjects in PythonEventObjects)
|
||||||
if (eventObjects.PythonFunction == pyFunc)
|
if (eventObjects.PythonFunction == pyFunc)
|
||||||
eventObjects.EventInfo.RemoveEventHandler(eventObjects, eventObjects.Delegate);
|
eventObjects.EventInfo.RemoveEventHandler(eventObjects, eventObjects.Delegate);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,6 +122,9 @@
|
|||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.PowerShell.5.ReferenceAssemblies.1.1.0\lib\net4\System.Management.Automation.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -137,7 +140,8 @@
|
|||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="PyScript.cs" />
|
<Compile Include="PowerShellScript.cs" />
|
||||||
|
<Compile Include="PythonScript.cs" />
|
||||||
<Compile Include="StringExtensions.cs" />
|
<Compile Include="StringExtensions.cs" />
|
||||||
<Compile Include="libmpv.cs" />
|
<Compile Include="libmpv.cs" />
|
||||||
<Compile Include="MainForm.cs">
|
<Compile Include="MainForm.cs">
|
||||||
@@ -164,6 +168,7 @@
|
|||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<None Include="app.manifest" />
|
<None Include="app.manifest" />
|
||||||
|
<None Include="packages.config" />
|
||||||
<None Include="Properties\Settings.settings">
|
<None Include="Properties\Settings.settings">
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
|
|||||||
4
mpv.net/packages.config
Normal file
4
mpv.net/packages.config
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Microsoft.PowerShell.5.ReferenceAssemblies" version="1.1.0" targetFramework="net472" />
|
||||||
|
</packages>
|
||||||
Reference in New Issue
Block a user