This commit is contained in:
Frank Skare
2019-03-19 09:56:05 +01:00
parent 92b58873e2
commit b77bbd5aec
7 changed files with 171 additions and 18 deletions

124
mpv.net/PowerShellScript.cs Normal file
View 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);
});
}
}
}

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0.0")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyVersion("1.3.0.0")]
[assembly: AssemblyFileVersion("1.3.0.0")]

View File

@@ -7,12 +7,12 @@ using static mpvnet.StaticUsing;
namespace mpvnet
{
public class PyScript
public class PythonScript
{
ScriptEngine engine;
ScriptScope scope;
public PyScript(string code)
public PythonScript(string code)
{
try
{

View File

@@ -60,7 +60,7 @@ namespace mpvnet
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 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; }
private static Dictionary<string, string> _mpvConv;
@@ -122,10 +122,19 @@ namespace mpvnet
foreach (var scriptPath in startupScripts)
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"))
PyScripts.Add(new PyScript(File.ReadAllText(scriptPath)));
foreach (var scriptPath in startupScripts)
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()
@@ -251,7 +260,7 @@ namespace mpvnet
}
}
public class EventObject
public class PythonEventObject
{
public PyRT.PythonFunction PythonFunction { 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)
{
@@ -281,22 +290,22 @@ namespace mpvnet
{
if (eventInfo.Name.ToLower() == name.Replace("-", ""))
{
EventObject eventObject = new EventObject();
EventObjects.Add(eventObject);
PythonEventObject eventObject = new PythonEventObject();
PythonEventObjects.Add(eventObject);
eventObject.PythonFunction = pyFunc;
MethodInfo mi;
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>))
{
mi = eventObject.GetType().GetMethod(nameof(EventObject.InvokeEndFileEventMode));
mi = eventObject.GetType().GetMethod(nameof(PythonEventObject.InvokeEndFileEventMode));
}
else if (eventInfo.EventHandlerType == typeof(Action<string[]>))
{
mi = eventObject.GetType().GetMethod(nameof(EventObject.InvokeStrings));
mi = eventObject.GetType().GetMethod(nameof(PythonEventObject.InvokeStrings));
}
else
throw new Exception();
@@ -311,7 +320,7 @@ namespace mpvnet
public static void unregister_event(PyRT.PythonFunction pyFunc)
{
foreach (var eventObjects in EventObjects)
foreach (var eventObjects in PythonEventObjects)
if (eventObjects.PythonFunction == pyFunc)
eventObjects.EventInfo.RemoveEventHandler(eventObjects, eventObjects.Delegate);
}

View File

@@ -122,6 +122,9 @@
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<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.Xml" />
</ItemGroup>
@@ -137,7 +140,8 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="PyScript.cs" />
<Compile Include="PowerShellScript.cs" />
<Compile Include="PythonScript.cs" />
<Compile Include="StringExtensions.cs" />
<Compile Include="libmpv.cs" />
<Compile Include="MainForm.cs">
@@ -164,6 +168,7 @@
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.manifest" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>

4
mpv.net/packages.config Normal file
View 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>