Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
966f96a02b | ||
|
|
954c014708 | ||
|
|
ad30dc5ae2 | ||
|
|
3f74344b99 | ||
|
|
96d8d88d09 | ||
|
|
8626b8283f | ||
|
|
d90025e8fe | ||
|
|
a572bd8553 | ||
|
|
0f5146e58c | ||
|
|
9c6c0f3506 | ||
|
|
8c36cc8b8c | ||
|
|
44435057d7 | ||
|
|
135bdeb638 | ||
|
|
93c93b620d | ||
|
|
247aefbf07 | ||
|
|
0a8397652f | ||
|
|
ecd5b01161 | ||
|
|
1e9893977d | ||
|
|
4fd6b13e0f | ||
|
|
d21d36c196 | ||
|
|
fbffbea641 | ||
|
|
9899c2cd27 | ||
|
|
10370e9ae2 | ||
|
|
d391e24784 | ||
|
|
430fef0ac4 | ||
|
|
8430842679 | ||
|
|
9d37e67901 | ||
|
|
e98ff53058 | ||
|
|
b47d3c34f2 | ||
|
|
54dd261df0 | ||
|
|
8eb7e41d16 | ||
|
|
2068bfb6fa | ||
|
|
dfc1ac712e | ||
|
|
d96587cb7b | ||
|
|
005550af55 | ||
|
|
543e2905cc | ||
|
|
a49b9bea61 | ||
|
|
9ea9cb2757 | ||
|
|
5543381a14 | ||
|
|
cd6dcf4640 |
81
Changelog.md
@@ -1,3 +1,82 @@
|
||||
### 5.2
|
||||
|
||||
- bug fix for single-instance not working with unicode filenames
|
||||
- bug fix for logo not shown on start
|
||||
- osd-visibility.js script was removed because the OSC uses too much memory
|
||||
- youtube-dl was updated
|
||||
- libmpv was updated to shinchiro 2019-08-04
|
||||
- in case mpv.net was started from a terminal it sets now the mpv property input-terminal to yes,
|
||||
this means mpv.net will now receive and handle input keys from the terminal
|
||||
- certain command line properties didn't work (input-terminal, terminal, input-file,
|
||||
config, config-dir, input-conf, load-scripts, script, scripts, player-operation-mode)
|
||||
- the about dialog shows now the mpv version and build date
|
||||
- the dialog that asks for a config folder has now a cancel option
|
||||
|
||||
### 5.1
|
||||
|
||||
- 'Tools > Execute mpv command' was replaced with [mpv-repl](https://github.com/rossy/mpv-repl)
|
||||
- many [wiki pages](https://github.com/stax76/mpv.net/wiki) were improved
|
||||
- the logo/icon had a very small cosmetic change
|
||||
- the help in the context menu was improved,
|
||||
for quick access consider the command palette (F1 key)
|
||||
- config options specific to mpv.net are now available from the command line
|
||||
- the input editor no longer has known limitations, 'alt gr' and ctrl+alt are working now
|
||||
- the help in the input editor was simplified and the filter logic was improved
|
||||
- fixed issue in file associations causing mpv.net not to appear in OS default apps
|
||||
- 'Tools > Manage File Associations' was replaced by 'Tools > OS Setup',
|
||||
it has now a feature to add and remove mpv.net to and from the Path
|
||||
environment variable and the OS default apps settings can be opened (Win 10 only)
|
||||
- startup folder and config folder being identical was causing a critical issue
|
||||
as mpv.net was loading extensions twice and scripts four times, now identical
|
||||
folders are no longer permitted
|
||||
- error messages are shown when unknown scripts and extensions are found in the startup folder
|
||||
because user scripts and extensions are supposed to be located in the config folder instead
|
||||
- changing from maximized to fullscreen did not work
|
||||
- the search field in the config editor was not always remembered
|
||||
- new setting remember-volume added, saves volume and mute on exit
|
||||
and restores it on start.
|
||||
- it's now enforced that mpv properties on the command line and in
|
||||
the mpv.conf config file are lowercase, if not a error is shown
|
||||
- gpu-api vulkan was not working if media files were opened via
|
||||
command line (that included Explorer)
|
||||
- new setting minimum-aspect-ratio added, minimum aspect ratio for the window,
|
||||
this was previously hard coded to 1.3
|
||||
- new setting auto-load-folder added, for single files automatically load
|
||||
the entire directory into the playlist, previously this was forced,
|
||||
now it can be disabled
|
||||
- new setting themed-menu added, follow theme color in context menu,
|
||||
default: no. UI related settings have now a separate UI tab in the config editor
|
||||
|
||||
### 5.0
|
||||
|
||||
- [changed icon design](https://github.com/stax76/mpv.net/blob/master/img/mpvnet.png)
|
||||
- libmpv was updated to shinchiro 2019-07-14
|
||||
- new or improved config editor settings: screenshot-directory,
|
||||
screenshot-format, screenshot-tag-colorspace, screenshot-high-bit-depth,
|
||||
screenshot-jpeg-source-chroma, screenshot-template, screenshot-jpeg-quality,
|
||||
screenshot-png-compression, screenshot-png-filter
|
||||
- mpv.conf preview feature added to config editor, it previews the mpv.conf content
|
||||
- in the entire project the term addon was replaced with the term extension,
|
||||
unfortunately this will break user extensions. The reason for this drastic
|
||||
change is that there exist too many different terms, addons, addins,
|
||||
extensions, modules, packages etc.. mpv.net follows Google Chrome as the worlds
|
||||
most popular extendable app, Chrome uses the term Extension.
|
||||
- a thread synchronization bug was fixed, the shutdown thread was aborted
|
||||
if it was running more than 3 seconds, this caused the rating extension
|
||||
to fail if it was waiting for a drive to wake up
|
||||
- a new JavaScript was included to show the playlist with a smaller font size,
|
||||
the script is located at startup/scripts
|
||||
- terminal support added using mpvnet.com !
|
||||
- script engine performance and error handling was improved
|
||||
- the [scripting wiki page](https://github.com/stax76/mpv.net/wiki/Scripting) was improved
|
||||
- the C# scripting host extension was converted from VB to C# because it's not
|
||||
only used for hosting but I also use it now to code and debug script code
|
||||
- there was a copy paste bug in the file association feature resulting in keys
|
||||
from mpv being overwritten instead of using mpv.net keys. Thanks to floppyD!
|
||||
- there was a exception fixed that happened opening rar files
|
||||
- instead of using the OS theme color there are now default colors
|
||||
for dark-color and light-color
|
||||
|
||||
### 4.7.7
|
||||
|
||||
- on Win 7 the theme color was hardcoded to DarkSlateGrey because
|
||||
@@ -73,7 +152,7 @@
|
||||
mpv.net not appearing in the 'Open with' menu of the Windows File Explorer,
|
||||
thanks to 44vince44 for pointing this out!!!
|
||||
- new Python and C# script examples were added to the wiki and the scripting and
|
||||
add-on documentation was improved
|
||||
extension documentation was improved
|
||||
- invalid command line arguments were ignored, now an error message is shown
|
||||
- a description on how to start mpv.net from Google Chrome was added to the
|
||||
manual, it's useful to play videos from sites like YouTube, find the
|
||||
|
||||
70
README.md
@@ -1,5 +1,7 @@
|
||||

|
||||
|
||||
     [](https://www.paypal.me/stax76)
|
||||
|
||||
# 🎞 mpv.net
|
||||
|
||||
mpv.net is a modern media player for Windows that works just like [mpv](https://mpv.io).
|
||||
@@ -37,7 +39,7 @@ Table of contents
|
||||
- [Context Menu](#context-menu)
|
||||
- [Settings](#settings)
|
||||
- [Scripting](#scripting)
|
||||
- [Add-ons](#add-ons)
|
||||
- [Extensions](#extensions)
|
||||
- [Architecture](#architecture)
|
||||
- [Support](#support)
|
||||
- [Links](#links)
|
||||
@@ -55,11 +57,13 @@ Table of contents
|
||||
- Configuration files that are easy to read and edit
|
||||
- Searchable command palette to quickly launch commands and look for keys ([Screenshot](#command-palette-screenshot))
|
||||
- Modern WPF based graphical user interface with dark mode ([Screenshot](#config-editor-screenshot))
|
||||
- Addon/extension API for .NET languages
|
||||
- Extension API for .NET languages
|
||||
- Scripting API for Python, C#, Lua, JavaScript and PowerShell ([Wiki](https://github.com/stax76/mpv.net/wiki/Scripting))
|
||||
- Language agnostic JSON IPC to control the player with a external programs
|
||||
- On Screen Controler (OSC, play control buttons)
|
||||
- [Command Line Interface](https://mpv.io/manual/master/#options)
|
||||
- If started from a PowerShell terminal mpv.net will attach to the terminal and print status and debug output
|
||||
- [OSD REPL](https://github.com/rossy/mpv-repl)
|
||||
- DXVA2 video decoding acceleration
|
||||
- OpenGL based video output capable of features loved by videophiles, such as video scaling with popular high quality algorithms, color management, frame timing, interpolation, HDR, and more
|
||||
- Search feature powered by [Everything](https://www.voidtools.com) to find and play media ([Screenshot](#media-search-screenshot))
|
||||
@@ -97,6 +101,12 @@ A searchable config editor as alternative to edit the mpv.conf file manually.
|
||||
|
||||

|
||||
|
||||
#### Terminal and REPL Screenshot
|
||||
|
||||
mpv.net attached to a PowerShell terminal showing the [OSD REPL](https://github.com/rossy/mpv-repl).
|
||||
|
||||

|
||||
|
||||
#### Input Editor Screenshot
|
||||
|
||||
A searchable key and mouse binding editor.
|
||||
@@ -136,18 +146,15 @@ input.conf defines mpv's key and mouse bindings and mpv.net uses comments to def
|
||||
|
||||
### Settings
|
||||
|
||||
mpv.net is able to share the settings with mpv.
|
||||
When mpv.net finds no config folder on startup it will ask for a location.
|
||||
|
||||
If a directory named portable_config next to the mpvnet.exe exists,
|
||||
all config will be loaded from this directory only.
|
||||
If a folder named portable_config next to the mpvnet.exe exists,
|
||||
all config will be loaded from this folder only.
|
||||
|
||||
```Text
|
||||
<startup>\portable_config\
|
||||
```
|
||||
|
||||
On first start if no portable config folder exists mpv.net asks
|
||||
which folder should be used as config folder.
|
||||
|
||||
mpv specific settings are stored in the file mpv.conf, if no mpv.conf file exists
|
||||
mpv.net generates it with the following defaults:
|
||||
|
||||
@@ -163,13 +170,15 @@ input.conf file, if it's missing mpv.net generates it with the following default
|
||||
mpv.net supports almost all mpv settings and features,
|
||||
[limitations are listed in the wiki](https://github.com/stax76/mpv.net/wiki/Limitations).
|
||||
|
||||
The config folder can be opened from the context menu.
|
||||
|
||||
### Scripting
|
||||
|
||||
[Scripting wiki page](https://github.com/stax76/mpv.net/wiki/Scripting)
|
||||
|
||||
### Add-ons
|
||||
### Extensions
|
||||
|
||||
[Add-on wiki page](https://github.com/stax76/mpv.net/wiki/Addons)
|
||||
[Extensions wiki page](https://github.com/stax76/mpv.net/wiki/Extensions)
|
||||
|
||||
### Architecture
|
||||
|
||||
@@ -183,7 +192,7 @@ was difficult to build, the hard parts are totally covered by libmpv.
|
||||
mpv.net is written in C# 7 and runs on .NET 4.7, I've not yet decided
|
||||
if I will port it to C# 8 and .NET 5 once available.
|
||||
|
||||
The Add-on implementation is based on the [Managed Extensibility Framework](https://docs.microsoft.com/en-us/dotnet/framework/mef/).
|
||||
The Extension implementation is based on the [Managed Extensibility Framework](https://docs.microsoft.com/en-us/dotnet/framework/mef/).
|
||||
|
||||
There are no specific extension or scripting interfaces but instead everyting
|
||||
is accessible for .NET compatible languages (C#, VB.NET, F#, Python, PowerShell),
|
||||
@@ -219,39 +228,30 @@ Third party components:
|
||||
|
||||
[Support thread in VideoHelp forum](https://forum.videohelp.com/threads/392514-mpv-net-a-extendable-media-player-for-windows)
|
||||
|
||||
[Issue tracker to report bugs and request features](https://github.com/stax76/mpv.net/issues)
|
||||
[Issue tracker](https://github.com/stax76/mpv.net/issues), feel free to use for anything mpv.net related
|
||||
|
||||
[frank.skare.de@gmail.com](mailto:frank.skare.de@gmail.com?Subject=mpv.net%20support)
|
||||
|
||||
Please click on the star at the top of the page and like mpv.net at [alternativeto.net](https://alternativeto.net/software/mpv-net/).
|
||||
|
||||
If you like you can express your appreciation for my player by sending little beer money with paypal.
|
||||
If you want to support the development of mpv.net or express your appreciation you can do so with a donation:
|
||||
|
||||
<https://www.paypal.me/stax76>
|
||||
|
||||
### Links
|
||||
|
||||
mpv manual: <https://mpv.io/manual/master/>
|
||||
|
||||
mpv wiki: <https://github.com/mpv-player/mpv/wiki>
|
||||
|
||||
mpv.net wiki: <https://github.com/stax76/mpv.net/wiki>
|
||||
|
||||
mpv apps: <https://github.com/mpv-player/mpv/wiki/Applications-using-mpv>
|
||||
|
||||
mpv user scripts: <https://github.com/mpv-player/mpv/wiki/User-Scripts>
|
||||
|
||||
mpv default key bindings: <https://github.com/mpv-player/mpv/blob/master/etc/input.conf>
|
||||
|
||||
mpv.net default key bindings: <https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt>
|
||||
|
||||
mpv download: <https://mpv.io/installation/>
|
||||
|
||||
mpv.net download: <https://github.com/stax76/mpv.net/releases>
|
||||
|
||||
mpv bugs and requests: <https://mpv.io/bug-reports/>
|
||||
|
||||
mpv.net bugs and requests: <https://github.com/stax76/mpv.net/issues>
|
||||
- mpv.net wiki: <https://github.com/stax76/mpv.net/wiki>
|
||||
- mpv.net default key bindings: <https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt>
|
||||
- mpv.net download: <https://github.com/stax76/mpv.net/releases>
|
||||
- mpv.net bugs and requests: <https://github.com/stax76/mpv.net/issues>
|
||||
- mpv website: <https://mpv.io/>
|
||||
- mpv manual: <https://mpv.io/manual/master/>
|
||||
- mpv wiki: <https://github.com/mpv-player/mpv/wiki>
|
||||
- mpv apps: <https://github.com/mpv-player/mpv/wiki/Applications-using-mpv>
|
||||
- mpv user scripts: <https://github.com/mpv-player/mpv/wiki/User-Scripts>
|
||||
- mpv default key bindings: <https://github.com/mpv-player/mpv/blob/master/etc/input.conf>
|
||||
- mpv download: <https://mpv.io/installation/>
|
||||
- mpv bugs and requests: <https://mpv.io/bug-reports/>
|
||||
|
||||
### Changelog
|
||||
|
||||
@@ -259,4 +259,4 @@ mpv.net bugs and requests: <https://github.com/stax76/mpv.net/issues>
|
||||
|
||||
### Download
|
||||
|
||||
<https://github.com/stax76/mpv.net/releases>
|
||||
<https://github.com/stax76/mpv.net/releases>
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
'this addon implements the C# scripting feature of mpv.net,
|
||||
'it is based on CS-Script: https://www.cs-script.net/
|
||||
|
||||
Imports System.ComponentModel.Composition
|
||||
Imports System.IO
|
||||
Imports System.Windows.Forms
|
||||
|
||||
Imports mpvnet
|
||||
|
||||
Imports CSScriptLibrary
|
||||
|
||||
<Export(GetType(IAddon))>
|
||||
Public Class CSScriptAddon
|
||||
Implements IAddon
|
||||
|
||||
Sub New()
|
||||
Dim scriptFiles As New List(Of String)
|
||||
|
||||
If Directory.Exists(mp.ConfigFolder + "scripts") Then
|
||||
scriptFiles.AddRange(Directory.GetFiles(mp.ConfigFolder + "scripts", "*.cs"))
|
||||
End If
|
||||
|
||||
If Directory.Exists(Application.StartupPath + "\scripts") Then
|
||||
scriptFiles.AddRange(Directory.GetFiles(Application.StartupPath + "\scripts", "*.cs"))
|
||||
End If
|
||||
|
||||
If scriptFiles.Count = 0 Then Return
|
||||
CSScriptLibrary.CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom
|
||||
|
||||
For Each i In scriptFiles
|
||||
Try
|
||||
CSScriptLibrary.CSScript.Evaluator.LoadCode(File.ReadAllText(i))
|
||||
Catch ex As Exception
|
||||
Msg.ShowException(ex)
|
||||
End Try
|
||||
Next
|
||||
End Sub
|
||||
End Class
|
||||
@@ -1,166 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{71808A87-8B1C-4DF8-957C-D79C3B164CCA}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>CSScriptAddon</RootNamespace>
|
||||
<AssemblyName>CSScriptAddon</AssemblyName>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<MyType>Windows</MyType>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>..\mpv.net\bin\Addons\CSScriptAddon\</OutputPath>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<NoWarn>42105,42106,42107,42353,42354,42355</NoWarn>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<DefineDebug>false</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\mpv.net\bin\Addons\CSScriptAddon\</OutputPath>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<NoWarn>42105,42106,42107,42353,42354,42355</NoWarn>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionExplicit>On</OptionExplicit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionCompare>Binary</OptionCompare>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionStrict>On</OptionStrict>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OptionInfer>On</OptionInfer>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>..\..\mpv.net\bin\x86\Addons\CSScriptAddon\</OutputPath>
|
||||
<NoWarn>42105,42106,42107,42353,42354,42355</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>..\mpv.net\bin\x86\Addons\CSScriptAddon\</OutputPath>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>42105,42106,42107,42353,42354,42355</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DefineDebug>true</DefineDebug>
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>..\..\mpv.net\bin\x64\Addons\CSScriptAddon\</OutputPath>
|
||||
<NoWarn>42105,42106,42107,42353,42354,42355</NoWarn>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<DefineTrace>true</DefineTrace>
|
||||
<OutputPath>..\mpv.net\bin\x64\Addons\CSScriptAddon\</OutputPath>
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>42105,42106,42107,42353,42354,42355</NoWarn>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<WarningsAsErrors>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036</WarningsAsErrors>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="CSScriptLibrary, Version=3.27.5.0, Culture=neutral, PublicKeyToken=70fcc3d18c749033, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>.\CSScriptLibrary.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Import Include="Microsoft.VisualBasic" />
|
||||
<Import Include="System" />
|
||||
<Import Include="System.Collections" />
|
||||
<Import Include="System.Collections.Generic" />
|
||||
<Import Include="System.Data" />
|
||||
<Import Include="System.Diagnostics" />
|
||||
<Import Include="System.Linq" />
|
||||
<Import Include="System.Xml.Linq" />
|
||||
<Import Include="System.Threading.Tasks" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CSScriptAddon.vb" />
|
||||
<Compile Include="My Project\AssemblyInfo.vb" />
|
||||
<Compile Include="My Project\Application.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Application.myapp</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Resources.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="My Project\Settings.Designer.vb">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="My Project\Resources.resx">
|
||||
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
|
||||
<CustomToolNamespace>My.Resources</CustomToolNamespace>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="My Project\Application.myapp">
|
||||
<Generator>MyApplicationCodeGenerator</Generator>
|
||||
<LastGenOutput>Application.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
<None Include="My Project\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<CustomToolNamespace>My</CustomToolNamespace>
|
||||
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSScriptLibrary.dll" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\mpv.net\mpv.net.csproj">
|
||||
<Project>{1751f378-8edf-4b62-be6d-304c7c287089}</Project>
|
||||
<Name>mpv.net</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
|
||||
</Project>
|
||||
@@ -1,13 +0,0 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<MySubMain>false</MySubMain>
|
||||
<SingleInstance>false</SingleInstance>
|
||||
<ShutdownMode>0</ShutdownMode>
|
||||
<EnableVisualStyles>true</EnableVisualStyles>
|
||||
<AuthenticationMode>0</AuthenticationMode>
|
||||
<ApplicationType>1</ApplicationType>
|
||||
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
|
||||
</MyApplicationData>
|
||||
@@ -1,35 +0,0 @@
|
||||
Imports System
|
||||
Imports System.Reflection
|
||||
Imports System.Runtime.InteropServices
|
||||
|
||||
' General Information about an assembly is controlled through the following
|
||||
' set of attributes. Change these attribute values to modify the information
|
||||
' associated with an assembly.
|
||||
|
||||
' Review the values of the assembly attributes
|
||||
|
||||
<Assembly: AssemblyTitle("CSScriptAddon")>
|
||||
<Assembly: AssemblyDescription("")>
|
||||
<Assembly: AssemblyCompany("")>
|
||||
<Assembly: AssemblyProduct("CSScriptAddon")>
|
||||
<Assembly: AssemblyCopyright("Copyright © 2019")>
|
||||
<Assembly: AssemblyTrademark("")>
|
||||
|
||||
<Assembly: ComVisible(False)>
|
||||
|
||||
'The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
<Assembly: Guid("4a748201-3948-497d-b156-7d172a332bd6")>
|
||||
|
||||
' Version information for an assembly consists of the following four values:
|
||||
'
|
||||
' Major Version
|
||||
' Minor Version
|
||||
' Build Number
|
||||
' Revision
|
||||
'
|
||||
' 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.0.0.0")>
|
||||
<Assembly: AssemblyFileVersion("1.0.0.0")>
|
||||
@@ -1,63 +0,0 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
Imports System
|
||||
|
||||
Namespace My.Resources
|
||||
|
||||
'This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
'class via a tool like ResGen or Visual Studio.
|
||||
'To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
'with the /str option, or rebuild your VS project.
|
||||
'''<summary>
|
||||
''' A strongly-typed resource class, for looking up localized strings, etc.
|
||||
'''</summary>
|
||||
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0"), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
|
||||
Friend Module Resources
|
||||
|
||||
Private resourceMan As Global.System.Resources.ResourceManager
|
||||
|
||||
Private resourceCulture As Global.System.Globalization.CultureInfo
|
||||
|
||||
'''<summary>
|
||||
''' Returns the cached ResourceManager instance used by this class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
|
||||
Get
|
||||
If Object.ReferenceEquals(resourceMan, Nothing) Then
|
||||
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("CSScriptAddon.Resources", GetType(Resources).Assembly)
|
||||
resourceMan = temp
|
||||
End If
|
||||
Return resourceMan
|
||||
End Get
|
||||
End Property
|
||||
|
||||
'''<summary>
|
||||
''' Overrides the current thread's CurrentUICulture property for all
|
||||
''' resource lookups using this strongly typed resource class.
|
||||
'''</summary>
|
||||
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Friend Property Culture() As Global.System.Globalization.CultureInfo
|
||||
Get
|
||||
Return resourceCulture
|
||||
End Get
|
||||
Set
|
||||
resourceCulture = value
|
||||
End Set
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@@ -1,117 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
73
addons/CSScriptAddon/My Project/Settings.Designer.vb
generated
@@ -1,73 +0,0 @@
|
||||
'------------------------------------------------------------------------------
|
||||
' <auto-generated>
|
||||
' This code was generated by a tool.
|
||||
' Runtime Version:4.0.30319.42000
|
||||
'
|
||||
' Changes to this file may cause incorrect behavior and will be lost if
|
||||
' the code is regenerated.
|
||||
' </auto-generated>
|
||||
'------------------------------------------------------------------------------
|
||||
|
||||
Option Strict On
|
||||
Option Explicit On
|
||||
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
|
||||
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0"), _
|
||||
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Partial Friend NotInheritable Class MySettings
|
||||
Inherits Global.System.Configuration.ApplicationSettingsBase
|
||||
|
||||
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
|
||||
|
||||
#Region "My.Settings Auto-Save Functionality"
|
||||
#If _MyType = "WindowsForms" Then
|
||||
Private Shared addedHandler As Boolean
|
||||
|
||||
Private Shared addedHandlerLockObject As New Object
|
||||
|
||||
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
|
||||
Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
|
||||
If My.Application.SaveMySettingsOnExit Then
|
||||
My.Settings.Save()
|
||||
End If
|
||||
End Sub
|
||||
#End If
|
||||
#End Region
|
||||
|
||||
Public Shared ReadOnly Property [Default]() As MySettings
|
||||
Get
|
||||
|
||||
#If _MyType = "WindowsForms" Then
|
||||
If Not addedHandler Then
|
||||
SyncLock addedHandlerLockObject
|
||||
If Not addedHandler Then
|
||||
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
|
||||
addedHandler = True
|
||||
End If
|
||||
End SyncLock
|
||||
End If
|
||||
#End If
|
||||
Return defaultInstance
|
||||
End Get
|
||||
End Property
|
||||
End Class
|
||||
End Namespace
|
||||
|
||||
Namespace My
|
||||
|
||||
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
|
||||
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
|
||||
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
|
||||
Friend Module MySettingsProperty
|
||||
|
||||
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
|
||||
Friend ReadOnly Property Settings() As Global.CSScriptAddon.My.MySettings
|
||||
Get
|
||||
Return Global.CSScriptAddon.My.MySettings.Default
|
||||
End Get
|
||||
End Property
|
||||
End Module
|
||||
End Namespace
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
@@ -1,27 +0,0 @@
|
||||
using System.ComponentModel.Composition;
|
||||
|
||||
using mpvnet;
|
||||
|
||||
namespace TestAddon
|
||||
{
|
||||
[Export(typeof(IAddon))]
|
||||
public class TestAddon : IAddon
|
||||
{
|
||||
// do some init work in constructor
|
||||
public TestAddon()
|
||||
{
|
||||
// Observe changes of the fullscreen property.
|
||||
// You can find a list of available mpv properties
|
||||
// in mpv.net's wiki on github or use mpv --list-properties.
|
||||
// You can test properties in mpv.net in the menu at:
|
||||
// Tools > Execute mpv command
|
||||
// where you can enter: show-text ${fullscreen}
|
||||
mp.observe_property_bool("fullscreen", OnFullscreenChange);
|
||||
}
|
||||
|
||||
void OnFullscreenChange(bool val)
|
||||
{
|
||||
mp.commandv("show-text", "fullscreen: " + val.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("RatingAddon")]
|
||||
[assembly: AssemblyTitle("RatingExtension")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("RatingAddon")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||
[assembly: AssemblyProduct("RatingExtension")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
// sometimes the add-on don't work, it's containing a lot of trace code at the moment
|
||||
// This extension writes a rating to the filename of rated videos when mpv.net shuts down.
|
||||
|
||||
// The input.conf defaults contain key bindings for this extension to set ratings.
|
||||
|
||||
using System;
|
||||
using System.ComponentModel.Composition;
|
||||
@@ -6,18 +8,16 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
using mpvnet;
|
||||
using System.Diagnostics;
|
||||
|
||||
// the assembly name must end with 'Addon'
|
||||
namespace RatingAddon
|
||||
namespace RatingExtension // the assembly name must end with 'Extension'
|
||||
{
|
||||
[Export(typeof(IAddon))]
|
||||
public class RatingAddon : IAddon
|
||||
[Export(typeof(IExtension))]
|
||||
public class RatingExtension : IExtension
|
||||
{
|
||||
// dictionory to store the filename and the rating
|
||||
Dictionary<string, int> Dic = new Dictionary<string, int>();
|
||||
|
||||
public RatingAddon() // plugin initialization
|
||||
public RatingExtension() // plugin initialization
|
||||
{
|
||||
mp.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
||||
mp.Shutdown += Shutdown; // handles MPV_EVENT_SHUTDOWN
|
||||
@@ -26,16 +26,12 @@ namespace RatingAddon
|
||||
// handles MPV_EVENT_SHUTDOWN
|
||||
void Shutdown()
|
||||
{
|
||||
if (App.DebugMode) Trace.WriteLine("aaa");
|
||||
|
||||
foreach (var i in Dic)
|
||||
{
|
||||
string filepath = i.Key;
|
||||
int rating = i.Value;
|
||||
if (App.DebugMode) Trace.WriteLine("bbb");
|
||||
if (String.IsNullOrEmpty(filepath) || ! File.Exists(filepath))
|
||||
return;
|
||||
if (App.DebugMode) Trace.WriteLine("ccc");
|
||||
string basename = Path.GetFileNameWithoutExtension(filepath);
|
||||
|
||||
for (int x = 0; x < 6; x++)
|
||||
@@ -44,12 +40,9 @@ namespace RatingAddon
|
||||
|
||||
basename += $" ({rating}stars)";
|
||||
string newPath = Path.Combine(Path.GetDirectoryName(filepath), basename + Path.GetExtension(filepath));
|
||||
if (App.DebugMode) Trace.WriteLine("ddd");
|
||||
if (filepath.ToLower() != newPath.ToLower())
|
||||
File.Move(filepath, newPath);
|
||||
if (App.DebugMode) Trace.WriteLine("eee");
|
||||
File.SetLastWriteTime(newPath, DateTime.Now);
|
||||
if (App.DebugMode) Trace.WriteLine("fff");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +59,7 @@ namespace RatingAddon
|
||||
mp.commandv("show-text", $"Rating: {rating}");
|
||||
}
|
||||
else if (args[1] == "about")
|
||||
Msg.Show("Rating Extension", "This extension writes a rating to the filename of rated videos when mpv.net shuts down.\n\nThe input.conf defaults contain key bindings for this addon to set ratings.");
|
||||
Msg.Show("Rating Extension", "This extension writes a rating to the filename of rated videos when mpv.net shuts down.\n\nThe input.conf defaults contain key bindings for this extension to set ratings.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,53 +4,18 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}</ProjectGuid>
|
||||
<ProjectGuid>{55C88710-539D-4402-84C8-31694841C731}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TestAddon</RootNamespace>
|
||||
<AssemblyName>TestAddon</AssemblyName>
|
||||
<RootNamespace>RatingExtension</RootNamespace>
|
||||
<AssemblyName>RatingExtension</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<OutputPath>..\..\mpv.net\bin\x86\Extensions\RatingExtension\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
@@ -58,7 +23,7 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<OutputPath>..\..\mpv.net\bin\x86\Extensions\RatingExtension\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -66,6 +31,24 @@
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>..\..\mpv.net\bin\x64\Extensions\RatingExtension\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>..\..\mpv.net\bin\x64\Extensions\RatingExtension\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
@@ -78,7 +61,7 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TestAddon.cs" />
|
||||
<Compile Include="RatingExtension.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestAddon")]
|
||||
[assembly: AssemblyTitle("RatingExtension")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TestAddon")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2019")]
|
||||
[assembly: AssemblyProduct("RatingExtension")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("06f854b0-00f9-4b53-94d9-0be65a7c55d8")]
|
||||
[assembly: Guid("55c88710-539d-4402-84c8-31694841c731")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
48
extensions/ScriptingExtension/ScriptingExtension.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
// This extension implements the C# scripting feature of mpv.net which
|
||||
// is based on CS-Script (https://www.cs-script.net).
|
||||
|
||||
// I also use this extension to code scripts in order to have full
|
||||
// code completion and debugger support, once the script code is
|
||||
// finished I move it from the extension to a standalone script.
|
||||
|
||||
using System;
|
||||
using System.ComponentModel.Composition;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
using mpvnet;
|
||||
using CSScriptLibrary;
|
||||
|
||||
namespace ScriptingExtension // the file name of extensions must end with 'Extension'
|
||||
{
|
||||
[Export(typeof(IExtension))]
|
||||
public class ScriptingExtension : IExtension
|
||||
{
|
||||
//Script Script;
|
||||
|
||||
public ScriptingExtension()
|
||||
{
|
||||
//Script = new Script();
|
||||
List<string> scriptFiles = new List<string>();
|
||||
|
||||
if (Directory.Exists(mp.ConfigFolder + "scripts"))
|
||||
scriptFiles.AddRange(Directory.GetFiles(mp.ConfigFolder + "scripts", "*.cs"));
|
||||
|
||||
if (Directory.Exists(PathHelp.StartupPath + "scripts"))
|
||||
foreach (string path in Directory.GetFiles(PathHelp.StartupPath + "scripts", "*.cs"))
|
||||
scriptFiles.AddRange(Directory.GetFiles(PathHelp.StartupPath + "scripts", "*.cs"));
|
||||
|
||||
if (scriptFiles.Count == 0) return;
|
||||
CSScriptLibrary.CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom;
|
||||
|
||||
foreach (var i in scriptFiles)
|
||||
{
|
||||
try {
|
||||
CSScriptLibrary.CSScript.Evaluator.LoadCode(File.ReadAllText(i));
|
||||
} catch (Exception e) {
|
||||
Msg.ShowException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,35 +4,18 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{55C88710-539D-4402-84C8-31694841C731}</ProjectGuid>
|
||||
<ProjectGuid>{94255EF2-C823-4D82-9017-0E993CC0F5A1}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>RatingAddon</RootNamespace>
|
||||
<AssemblyName>RatingAddon</AssemblyName>
|
||||
<RootNamespace>ScriptingExtension</RootNamespace>
|
||||
<AssemblyName>ScriptingExtension</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\mpv.net\bin\Addons\RatingAddon\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\mpv.net\bin\Addons\RatingAddon\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>..\..\mpv.net\bin\x86\Addons\RatingAddon\</OutputPath>
|
||||
<OutputPath>..\..\mpv.net\bin\x86\Extensions\ScriptingExtension\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
@@ -40,7 +23,7 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||
<OutputPath>..\mpv.net\bin\x86\Addons\RatingAddon\</OutputPath>
|
||||
<OutputPath>..\..\mpv.net\bin\x86\Extensions\ScriptingExtension\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -50,7 +33,7 @@
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>..\..\mpv.net\bin\x64\Addons\RatingAddon\</OutputPath>
|
||||
<OutputPath>..\..\mpv.net\bin\x64\Extensions\ScriptingExtension\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
@@ -58,7 +41,7 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>..\mpv.net\bin\x64\Addons\RatingAddon\</OutputPath>
|
||||
<OutputPath>..\..\mpv.net\bin\x64\Extensions\ScriptingExtension\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
@@ -67,9 +50,13 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="CSScriptLibrary">
|
||||
<HintPath>.\CSScriptLibrary.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
@@ -78,8 +65,9 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="RatingAddon.cs" />
|
||||
<Compile Include="ScriptingExtension.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="script.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\mpv.net\mpv.net.csproj">
|
||||
31
extensions/ScriptingExtension/ScriptingExtension.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29123.88
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptingExtension", "ScriptingExtension.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.Build.0 = Debug|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.Build.0 = Debug|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.ActiveCfg = Release|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.Build.0 = Release|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {C8A53BF6-B00A-4215-B9D7-801ADB9C8F60}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
40
extensions/ScriptingExtension/script.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
using mpvnet;
|
||||
|
||||
class Script
|
||||
{
|
||||
MainForm Form;
|
||||
|
||||
bool WasPlaying;
|
||||
bool WasPaused;
|
||||
|
||||
public Script()
|
||||
{
|
||||
Form = MainForm.Instance;
|
||||
Form.Resize += Form_Resize;
|
||||
}
|
||||
|
||||
private void Form_Resize(object sender, EventArgs e)
|
||||
{
|
||||
if (Form.WindowState == FormWindowState.Minimized)
|
||||
{
|
||||
WasPlaying = mp.get_property_string("pause") == "no";
|
||||
|
||||
if (WasPlaying)
|
||||
{
|
||||
mp.command("set pause yes");
|
||||
WasPaused = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (WasPaused)
|
||||
{
|
||||
mp.command("set pause no");
|
||||
WasPaused = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
img/Avatar.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
img/Terminal.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
img/mpvnet.ico
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
img/mpvnet.pdn
BIN
img/mpvnet.png
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 8.2 KiB |
52
mpv.net.sln
@@ -5,11 +5,9 @@ VisualStudioVersion = 16.0.28729.10
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpv.net\mpv.net.csproj", "{1751F378-8EDF-4B62-BE6D-304C7C287089}"
|
||||
EndProject
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "CSScriptAddon", "addons\CSScriptAddon\CSScriptAddon.vbproj", "{71808A87-8B1C-4DF8-957C-D79C3B164CCA}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingExtension", "extensions\RatingExtension\RatingExtension.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingAddon", "addons\RatingAddon\RatingAddon.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAddon", "addons\TestAddon\TestAddon.csproj", "{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptingExtension", "extensions\ScriptingExtension\ScriptingExtension.csproj", "{94255EF2-C823-4D82-9017-0E993CC0F5A1}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -21,54 +19,36 @@ Global
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.Build.0 = Debug|x64
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.Build.0 = Debug|x86
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|Any CPU.ActiveCfg = Release|x86
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.ActiveCfg = Release|x64
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.Build.0 = Release|x64
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.ActiveCfg = Release|x86
|
||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.Build.0 = Release|x86
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x64.Build.0 = Debug|x64
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x86.Build.0 = Debug|x86
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x64.ActiveCfg = Release|x64
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x64.Build.0 = Release|x64
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x86.ActiveCfg = Release|x86
|
||||
{71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x86.Build.0 = Release|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x64.Build.0 = Debug|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.Build.0 = Debug|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.ActiveCfg = Release|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.ActiveCfg = Release|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.Build.0 = Release|x64
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86
|
||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.Build.0 = Release|x86
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x64.Build.0 = Debug|x64
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x86.Build.0 = Debug|x86
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x64.Build.0 = Release|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x86.Build.0 = Release|Any CPU
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.Build.0 = Debug|x64
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.Build.0 = Debug|x86
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|Any CPU.ActiveCfg = Release|x86
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.ActiveCfg = Release|x64
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.Build.0 = Release|x64
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x86.ActiveCfg = Release|x86
|
||||
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -29,7 +29,6 @@ namespace DynamicGUI
|
||||
baseSetting = optionSetting;
|
||||
optionSetting.Default = setting["default"];
|
||||
optionSetting.Value = optionSetting.Default;
|
||||
optionSetting.StartValue = optionSetting.Default;
|
||||
|
||||
foreach (TomlTable option in setting["options"])
|
||||
{
|
||||
@@ -56,7 +55,7 @@ namespace DynamicGUI
|
||||
baseSetting.Filter = setting["filter"];
|
||||
|
||||
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
|
||||
if (setting.HasKey("helpurl")) baseSetting.HelpURL = setting["helpurl"];
|
||||
if (setting.HasKey("url")) baseSetting.URL = setting["url"];
|
||||
if (setting.HasKey("width")) baseSetting.Width = setting["width"];
|
||||
if (setting.HasKey("type")) baseSetting.Type = setting["type"];
|
||||
|
||||
@@ -70,10 +69,9 @@ namespace DynamicGUI
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Value { get; set; }
|
||||
public string StartValue { get; set; }
|
||||
public string Help { get; set; }
|
||||
public string Default { get; set; }
|
||||
public string HelpURL { get; set; }
|
||||
public string URL { get; set; }
|
||||
public string Filter { get; set; }
|
||||
public string Type { get; set; }
|
||||
public int Width { get; set; }
|
||||
|
||||
@@ -16,9 +16,9 @@ namespace DynamicGUI
|
||||
HelpTextBox.Visibility = Visibility.Collapsed;
|
||||
HelpTextBox.Text = optionSetting.Help;
|
||||
ItemsControl.ItemsSource = optionSetting.Options;
|
||||
if (string.IsNullOrEmpty(optionSetting.HelpURL))
|
||||
if (string.IsNullOrEmpty(optionSetting.URL))
|
||||
LinkTextBlock.Visibility = Visibility.Collapsed;
|
||||
Link.SetURL(optionSetting.HelpURL);
|
||||
Link.SetURL(optionSetting.URL);
|
||||
}
|
||||
|
||||
private string _SearchableText;
|
||||
|
||||
@@ -23,8 +23,8 @@ namespace DynamicGUI
|
||||
ValueTextBox.Width = StringSetting.Width;
|
||||
if (StringSetting.Type != "folder" && StringSetting.Type != "color")
|
||||
Button.Visibility = Visibility.Hidden;
|
||||
Link.SetURL(StringSetting.HelpURL);
|
||||
if (string.IsNullOrEmpty(stringSetting.HelpURL))
|
||||
Link.SetURL(StringSetting.URL);
|
||||
if (string.IsNullOrEmpty(stringSetting.URL))
|
||||
LinkTextBlock.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.Composition;
|
||||
using System.ComponentModel.Composition.Hosting;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public class Addon
|
||||
{
|
||||
[ImportMany]
|
||||
public IEnumerable<IAddon> Addons = null;
|
||||
|
||||
readonly CompositionContainer CompositionContainer;
|
||||
|
||||
public Addon()
|
||||
{
|
||||
try
|
||||
{
|
||||
AggregateCatalog catalog = new AggregateCatalog();
|
||||
|
||||
string dir = Application.StartupPath + "\\Addons";
|
||||
|
||||
if (Directory.Exists(dir))
|
||||
foreach (string i in Directory.GetDirectories(dir))
|
||||
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll"));
|
||||
|
||||
dir = mp.ConfigFolder + "\\Addons";
|
||||
|
||||
if (Directory.Exists(dir))
|
||||
foreach (string i in Directory.GetDirectories(dir))
|
||||
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll"));
|
||||
|
||||
if (catalog.Catalogs.Count > 0)
|
||||
{
|
||||
CompositionContainer = new CompositionContainer(catalog);
|
||||
CompositionContainer.ComposeParts(this);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface IAddon
|
||||
{
|
||||
}
|
||||
}
|
||||
124
mpv.net/Misc/App.cs
Normal file
@@ -0,0 +1,124 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public class App
|
||||
{
|
||||
public static string[] VideoTypes { get; } = "264 265 asf avc avi avs flv h264 h265 hevc m2ts m2v m4v mkv mov mp4 mpeg mpg mpv mts ts vob vpy webm webm wmv y4m".Split(' ');
|
||||
public static string[] AudioTypes { get; } = "mp3 mp2 ac3 ogg opus flac wav w64 m4a dts dtsma dtshr dtshd eac3 thd thd+ac3 mka aac mpa".Split(' ');
|
||||
public static string[] ImageTypes { get; } = {"jpg", "bmp", "gif", "png"};
|
||||
public static string[] SubtitleTypes { get; } = { "srt", "ass", "idx", "sup", "ttxt", "ssa", "smi" };
|
||||
public static string[] UrlWhitelist { get; set; } = { "tube", "vimeo", "ard", "zdf" };
|
||||
|
||||
public static string RegPath { get; } = @"HKCU\Software\" + Application.ProductName;
|
||||
public static string ConfPath { get; } = mp.ConfigFolder + "\\mpvnet.conf";
|
||||
public static string DarkMode { get; set; } = "always";
|
||||
public static string ProcessInstance { get; set; } = "single";
|
||||
public static string DarkColor { get; set; }
|
||||
public static string LightColor { get; set; }
|
||||
|
||||
public static bool RememberHeight { get; set; } = true;
|
||||
public static bool RememberPosition { get; set; }
|
||||
public static bool DebugMode { get; set; }
|
||||
public static bool IsStartedFromTerminal { get; } = Environment.GetEnvironmentVariable("_started_from_console") == "yes";
|
||||
public static bool RememberVolume { get; set; }
|
||||
public static bool AutoLoadFolder { get; set; } = true;
|
||||
public static bool ThemedMenu { get; set; }
|
||||
|
||||
public static int StartThreshold { get; set; } = 1500;
|
||||
|
||||
public static float MinimumAspectRatio { get; set; } = 1.3f;
|
||||
|
||||
public static bool IsDarkMode {
|
||||
get => (DarkMode == "system" && Sys.IsDarkTheme) || DarkMode == "always";
|
||||
}
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
string dummy = mp.ConfigFolder;
|
||||
var dummy2 = mp.Conf;
|
||||
|
||||
foreach (var i in Conf)
|
||||
ProcessProperty(i.Key, i.Value);
|
||||
|
||||
if (App.DebugMode)
|
||||
{
|
||||
try
|
||||
{
|
||||
string filePath = mp.ConfigFolder + "\\mpvnet-debug.log";
|
||||
if (File.Exists(filePath)) File.Delete(filePath);
|
||||
Trace.Listeners.Add(new TextWriterTraceListener(filePath));
|
||||
Trace.AutoFlush = true;
|
||||
//if (App.DebugMode) Trace.WriteLine("");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Msg.ShowException(e);
|
||||
}
|
||||
}
|
||||
|
||||
mp.Shutdown += Shutdown;
|
||||
mp.Initialized += Initialized;
|
||||
}
|
||||
|
||||
private static void Initialized()
|
||||
{
|
||||
if (RememberVolume)
|
||||
{
|
||||
mp.set_property_int("volume", RegHelp.GetInt(App.RegPath, "Volume"));
|
||||
mp.set_property_string("mute", RegHelp.GetString(App.RegPath, "Mute"));
|
||||
}
|
||||
}
|
||||
|
||||
private static void Shutdown()
|
||||
{
|
||||
if (RememberVolume)
|
||||
{
|
||||
RegHelp.SetObject(App.RegPath, "Volume", mp.get_property_int("volume"));
|
||||
RegHelp.SetObject(App.RegPath, "Mute", mp.get_property_string("mute"));
|
||||
}
|
||||
}
|
||||
|
||||
static Dictionary<string, string> _Conf;
|
||||
|
||||
public static Dictionary<string, string> Conf {
|
||||
get {
|
||||
if (_Conf == null)
|
||||
{
|
||||
_Conf = new Dictionary<string, string>();
|
||||
|
||||
if (File.Exists(ConfPath))
|
||||
foreach (string i in File.ReadAllLines(ConfPath))
|
||||
if (i.Contains("=") && !i.StartsWith("#"))
|
||||
_Conf[i.Substring(0, i.IndexOf("=")).Trim()] = i.Substring(i.IndexOf("=") + 1).Trim();
|
||||
}
|
||||
return _Conf;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool ProcessProperty(string name, string value)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case "remember-position": RememberPosition = value == "yes"; return true;
|
||||
case "start-size": RememberHeight = value == "previous"; return true;
|
||||
case "process-instance": ProcessInstance = value; return true;
|
||||
case "dark-mode": DarkMode = value; return true;
|
||||
case "debug-mode": DebugMode = value == "yes"; return true;
|
||||
case "dark-color": DarkColor = value.Trim('\'', '"'); return true;
|
||||
case "light-color": LightColor = value.Trim('\'', '"'); return true;
|
||||
case "url-whitelist": UrlWhitelist = value.Split(' ', ',', ';'); return true;
|
||||
case "remember-volume": RememberVolume = value == "yes"; return true;
|
||||
case "start-threshold": StartThreshold = value.Int(); return true;
|
||||
case "minimum-aspect-ratio": MinimumAspectRatio = value.Float(); return true;
|
||||
case "auto-load-folder": AutoLoadFolder = value == "yes"; return true;
|
||||
case "themed-menu": ThemedMenu = value == "yes"; return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@ namespace mpvnet
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case "manage-file-associations": ManageFileAssociations(); break;
|
||||
case "manage-file-associations": ManageFileAssociations(); break; // deprecated 2019
|
||||
case "cycle-audio": CycleAudio(); break;
|
||||
case "load-audio": LoadAudio(); break;
|
||||
case "load-sub": LoadSubtitle(); break;
|
||||
@@ -28,6 +28,7 @@ namespace mpvnet
|
||||
case "show-about": ShowDialog(typeof(AboutWindow)); break;
|
||||
case "show-conf-editor": ShowDialog(typeof(ConfWindow)); break;
|
||||
case "show-input-editor": ShowDialog(typeof(InputWindow)); break;
|
||||
case "show-setup-dialog": ShowDialog(typeof(SetupWindow)); break;
|
||||
case "open-conf-folder": Process.Start(mp.ConfigFolder); break;
|
||||
case "open-files": OpenFiles(args); break;
|
||||
case "shell-execute": Process.Start(args[0]); break;
|
||||
@@ -92,7 +93,7 @@ namespace mpvnet
|
||||
{
|
||||
fileSize = new FileInfo(path).Length;
|
||||
|
||||
if (App.AudioTypes.Contains(Path.GetExtension(path).ToLower().TrimStart('.')))
|
||||
if (App.AudioTypes.Contains(path.ShortExt()))
|
||||
{
|
||||
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||
{
|
||||
@@ -110,13 +111,13 @@ namespace mpvnet
|
||||
if (date != "") text += "Year: " + date + "\n";
|
||||
if (duration != "") text += "Length: " + duration + "\n";
|
||||
text += "Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n";
|
||||
text += "Type: " + Path.GetExtension(path).ToUpper().TrimStart('.');
|
||||
text += "Type: " + path.ShortExt().ToUpper();
|
||||
|
||||
mp.commandv("show-text", text, "5000");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (App.ImageTypes.Contains(Path.GetExtension(path).ToLower().TrimStart('.')))
|
||||
else if (App.ImageTypes.Contains(path.ShortExt()))
|
||||
{
|
||||
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||
{
|
||||
@@ -124,7 +125,7 @@ namespace mpvnet
|
||||
"Width: " + mediaInfo.GetInfo(MediaInfoStreamKind.Image, "Width") + "\n" +
|
||||
"Height: " + mediaInfo.GetInfo(MediaInfoStreamKind.Image, "Height") + "\n" +
|
||||
"Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n" +
|
||||
"Type: " + Path.GetExtension(path).ToUpper().TrimStart('.');
|
||||
"Type: " + path.ShortExt().ToUpper();
|
||||
|
||||
mp.commandv("show-text", text, "5000");
|
||||
return;
|
||||
@@ -137,7 +138,7 @@ namespace mpvnet
|
||||
string videoFormat = mp.get_property_string("video-format").ToUpper();
|
||||
string audioCodec = mp.get_property_string("audio-codec-name").ToUpper();
|
||||
|
||||
text = Path.GetFileName(path) + "\n" +
|
||||
text = path.FileName() + "\n" +
|
||||
FormatTime(position.TotalMinutes) + ":" +
|
||||
FormatTime(position.Seconds) + " / " +
|
||||
FormatTime(duration2.TotalMinutes) + ":" +
|
||||
@@ -158,13 +159,13 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
public static void ExecuteMpvCommand()
|
||||
public static void ExecuteMpvCommand() // deprecated 2019
|
||||
{
|
||||
InvokeOnMainThread(new Action(() => {
|
||||
string command = VB.Interaction.InputBox("Enter a mpv command to be executed.", "Execute Command", RegHelp.GetString(App.RegPath, "RecentExecutedCommand"));
|
||||
if (string.IsNullOrEmpty(command)) return;
|
||||
RegHelp.SetObject(App.RegPath, "RecentExecutedCommand", command);
|
||||
mp.command_string(command, false);
|
||||
mp.command(command, false);
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -230,31 +231,6 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
public static void ManageFileAssociations()
|
||||
{
|
||||
using (var td = new TaskDialog<string>())
|
||||
{
|
||||
td.MainInstruction = "Choose an option.";
|
||||
td.MainIcon = MsgIcon.Shield;
|
||||
|
||||
td.AddCommandLink("Register video file extensions", "video");
|
||||
td.AddCommandLink("Register audio file extensions", "audio");
|
||||
td.AddCommandLink("Register audio file extensions", "image");
|
||||
td.AddCommandLink("Unregister file extensions", "unreg");
|
||||
|
||||
string result = td.Show();
|
||||
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
{
|
||||
using (var proc = new Process())
|
||||
{
|
||||
proc.StartInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
|
||||
proc.StartInfo.Arguments = "--reg-file-assoc " + result;
|
||||
proc.StartInfo.Verb = "runas";
|
||||
try { proc.Start(); } catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void ManageFileAssociations() => ShowDialog(typeof(SetupWindow)); // deprecated 2019
|
||||
}
|
||||
}
|
||||
59
mpv.net/Misc/Extension.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.Composition;
|
||||
using System.ComponentModel.Composition.Hosting;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public class Extension
|
||||
{
|
||||
[ImportMany]
|
||||
public IEnumerable<IExtension> Extensions = null;
|
||||
|
||||
readonly CompositionContainer CompositionContainer;
|
||||
|
||||
public Extension()
|
||||
{
|
||||
try
|
||||
{
|
||||
AggregateCatalog catalog = new AggregateCatalog();
|
||||
string dir = PathHelp.StartupPath + "Extensions";
|
||||
|
||||
if (Directory.Exists(dir))
|
||||
{
|
||||
string[] knownExtensions = { "RatingExtension", "ScriptingExtension" };
|
||||
|
||||
foreach (string path in Directory.GetDirectories(dir))
|
||||
{
|
||||
if (knownExtensions.Contains(Path.GetFileName(path)))
|
||||
catalog.Catalogs.Add(new DirectoryCatalog(path, "*Extension.dll"));
|
||||
else
|
||||
Msg.ShowError("Failed to load extension", path + "\n\nOnly extensions that ship with mpv.net are allowed in <startup>\\extensions\n\nUser extensions have to use <config folder>\\extensions\n\nNever copy or install a new mpv.net version over a old mpv.net version.");
|
||||
}
|
||||
}
|
||||
|
||||
dir = mp.ConfigFolder + "Extensions";
|
||||
|
||||
if (Directory.Exists(dir))
|
||||
foreach (string i in Directory.GetDirectories(dir))
|
||||
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Extension.dll"));
|
||||
|
||||
if (catalog.Catalogs.Count > 0)
|
||||
{
|
||||
CompositionContainer = new CompositionContainer(catalog);
|
||||
CompositionContainer.ComposeParts(this);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface IExtension
|
||||
{
|
||||
}
|
||||
}
|
||||
32
mpv.net/Misc/ExtensionMethods.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
|
||||
public static class Extensions
|
||||
{
|
||||
public static string FileName(this string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path)) return "";
|
||||
int index = path.LastIndexOf('\\');
|
||||
if (index > -1) return path.Substring(index + 1);
|
||||
index = path.LastIndexOf('/');
|
||||
if (index > -1) return path.Substring(index + 1);
|
||||
return path;
|
||||
}
|
||||
|
||||
public static string ShortExt(this string path)
|
||||
{
|
||||
return Path.GetExtension(path).ToLower().TrimStart('.');
|
||||
}
|
||||
|
||||
public static int Int(this string value)
|
||||
{
|
||||
int.TryParse(value, out int result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static float Float(this string value)
|
||||
{
|
||||
float.TryParse(value.Replace(",", "."), NumberStyles.Float, CultureInfo.InvariantCulture, out float result);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
@@ -16,119 +15,6 @@ using Microsoft.Win32;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public class App
|
||||
{
|
||||
public static string RegPath { get; } = @"HKCU\Software\" + Application.ProductName;
|
||||
public static string ConfFilePath { get; } = mp.ConfigFolder + "\\mpvnet.conf";
|
||||
public static string DarkMode { get; set; } = "always";
|
||||
public static string ProcessInstance { get; set; } = "single";
|
||||
public static string DarkColor { get; set; }
|
||||
public static string LightColor { get; set; }
|
||||
|
||||
public static string[] VideoTypes { get; } = "mkv mp4 mpg avi mov webm vob wmv flv avs 264 h264 asf webm mpeg mpv y4m avc hevc 265 h265 m2v m2ts vpy mts m4v".Split(' ');
|
||||
public static string[] AudioTypes { get; } = "mp3 mp2 ac3 ogg opus flac wav w64 m4a dts dtsma dtshr dtshd eac3 thd thd+ac3 mka aac mpa".Split(' ');
|
||||
public static string[] ImageTypes { get; } = "jpg bmp gif".Split(' ');
|
||||
public static string[] SubtitleTypes { get; } = "srt ass idx sup ttxt ssa smi".Split(' ');
|
||||
public static string[] UrlWhitelist { get; set; } = { "tube", "vimeo", "ard", "zdf" };
|
||||
|
||||
public static bool RememberHeight { get; set; } = true;
|
||||
public static bool RememberPosition { get; set; }
|
||||
public static bool DebugMode { get; set; }
|
||||
|
||||
public static int StartThreshold { get; set; } = 1500;
|
||||
|
||||
public static bool IsDarkMode {
|
||||
get => (DarkMode == "system" && Sys.IsDarkTheme) || DarkMode == "always";
|
||||
}
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
string dummy = mp.ConfigFolder;
|
||||
var dummy2 = mp.Conf;
|
||||
|
||||
foreach (var i in Conf)
|
||||
ProcessProperty(i.Key, i.Value);
|
||||
|
||||
if (App.DebugMode)
|
||||
{
|
||||
try
|
||||
{
|
||||
string filePath = mp.ConfigFolder + "\\mpvnet-debug.log";
|
||||
if (File.Exists(filePath)) File.Delete(filePath);
|
||||
Trace.Listeners.Add(new TextWriterTraceListener(filePath));
|
||||
Trace.AutoFlush = true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Msg.ShowException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Dictionary<string, string> _Conf;
|
||||
|
||||
public static Dictionary<string, string> Conf {
|
||||
get {
|
||||
if (_Conf == null)
|
||||
{
|
||||
_Conf = new Dictionary<string, string>();
|
||||
|
||||
if (File.Exists(ConfFilePath))
|
||||
foreach (string i in File.ReadAllLines(ConfFilePath))
|
||||
if (i.Contains("=") && !i.StartsWith("#"))
|
||||
_Conf[i.Substring(0, i.IndexOf("=")).Trim()] = i.Substring(i.IndexOf("=") + 1).Trim();
|
||||
}
|
||||
return _Conf;
|
||||
}
|
||||
}
|
||||
|
||||
public static void ProcessProperty(string name, string value)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case "remember-position": RememberPosition = value == "yes"; break;
|
||||
case "start-size": RememberHeight = value == "previous"; break;
|
||||
case "process-instance": ProcessInstance = value; break;
|
||||
case "dark-mode": DarkMode = value; break;
|
||||
case "debug-mode": DebugMode = value == "yes"; break;
|
||||
case "dark-color": DarkColor = value.Trim('\'', '"'); break;
|
||||
case "light-color": LightColor = value.Trim('\'', '"'); break;
|
||||
case "url-whitelist":
|
||||
UrlWhitelist = value.Split(' ', ',', ';');
|
||||
break;
|
||||
case "start-threshold":
|
||||
int.TryParse(value, out int result);
|
||||
StartThreshold = result;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static void ProcessCommandLineEarly()
|
||||
{
|
||||
var args = Environment.GetCommandLineArgs().Skip(1);
|
||||
|
||||
foreach (string i in args)
|
||||
{
|
||||
if (i.StartsWith("--"))
|
||||
{
|
||||
if (i.Contains("="))
|
||||
{
|
||||
string left = i.Substring(2, i.IndexOf("=") - 2);
|
||||
string right = i.Substring(left.Length + 3);
|
||||
mp.ProcessProperty(left, right);
|
||||
ProcessProperty(left, right);
|
||||
}
|
||||
else
|
||||
{
|
||||
string name = i.Substring(2);
|
||||
mp.ProcessProperty(name, "yes");
|
||||
ProcessProperty(name, "yes");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Sys
|
||||
{
|
||||
public static bool IsDarkTheme {
|
||||
@@ -176,25 +62,23 @@ namespace mpvnet
|
||||
{
|
||||
Types = types;
|
||||
|
||||
RegHelp.SetObject(@"HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + ExeFilename, null, ExePath);
|
||||
RegHelp.SetObject($"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\{ExeFilename}", null, ExePath);
|
||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}", "FriendlyAppName", "mpv.net media player");
|
||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv\Capabilities", "ApplicationDescription", "mpv.net media player");
|
||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv\Capabilities", "ApplicationName", "mpv.net");
|
||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities", "ApplicationDescription", "mpv.net media player");
|
||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities", "ApplicationName", "mpv.net");
|
||||
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}", null, "");
|
||||
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}", null, "");
|
||||
RegHelp.SetObject(@"HKLM\SOFTWARE\RegisteredApplications", "mpv.net", @"SOFTWARE\Clients\Media\mpv.net\Capabilities");
|
||||
|
||||
foreach (string ext in Types)
|
||||
{
|
||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}\\SupportedTypes", "." + ext, "");
|
||||
RegHelp.SetObject($"HKCR\\" + "." + ext, null, ExeFilenameNoExt + "." + ext);
|
||||
RegHelp.SetObject($"HKCR\\" + "." + ext + "\\OpenWithProgIDs", ExeFilenameNoExt + "." + ext, "");
|
||||
if (App.VideoTypes.Contains(ext))
|
||||
RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "video");
|
||||
if (App.AudioTypes.Contains(ext))
|
||||
RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "audio");
|
||||
if (App.ImageTypes.Contains(ext))
|
||||
RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "image");
|
||||
if (App.VideoTypes.Contains(ext)) RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "video");
|
||||
if (App.AudioTypes.Contains(ext)) RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "audio");
|
||||
if (App.ImageTypes.Contains(ext)) RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "image");
|
||||
RegHelp.SetObject($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open", null, "Play with " + Application.ProductName);
|
||||
RegHelp.SetObject($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities\FileAssociations", "." + ext, ExeFilenameNoExt + "." + ext);
|
||||
@@ -203,17 +87,16 @@ namespace mpvnet
|
||||
|
||||
public static void Unregister()
|
||||
{
|
||||
RegHelp.RemoveKey(@"HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + ExeFilename);
|
||||
RegHelp.RemoveKey($"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\{ExeFilename}");
|
||||
RegHelp.RemoveKey($"HKCR\\Applications\\{ExeFilename}");
|
||||
RegHelp.RemoveKey(@"HKLM\SOFTWARE\Clients\Media\mpv.net");
|
||||
RegHelp.RemoveKey($"HKLM\\SOFTWARE\\Clients\\Media\\mpv.net");
|
||||
RegHelp.RemoveKey($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}");
|
||||
RegHelp.RemoveKey($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}");
|
||||
RegHelp.RemoveValue(@"HKLM\SOFTWARE\RegisteredApplications", "mpv.net");
|
||||
|
||||
foreach (string id in Registry.ClassesRoot.GetSubKeyNames())
|
||||
{
|
||||
if (id.StartsWith(ExeFilenameNoExt + "."))
|
||||
Registry.ClassesRoot.DeleteSubKeyTree(id);
|
||||
|
||||
if (id.StartsWith(ExeFilenameNoExt + ".")) Registry.ClassesRoot.DeleteSubKeyTree(id);
|
||||
RegHelp.RemoveValue($"HKCR\\Software\\Classes\\" + id + "\\OpenWithProgIDs", ExeFilenameNoExt + id);
|
||||
RegHelp.RemoveValue($"HKLM\\Software\\Classes\\" + id + "\\OpenWithProgIDs", ExeFilenameNoExt + id);
|
||||
}
|
||||
@@ -407,4 +290,9 @@ namespace mpvnet
|
||||
Math.Abs(screenPos.Y - Control.MousePosition.Y) > 10;
|
||||
}
|
||||
}
|
||||
|
||||
public class PathHelp
|
||||
{
|
||||
public static string StartupPath { get; } = Application.StartupPath + "\\";
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,8 @@ namespace mpvnet
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
if (mp.ConfigFolder == "") return;
|
||||
|
||||
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
||||
|
||||
if (args.Length == 2 && args[0] == "--reg-file-assoc")
|
||||
@@ -64,7 +66,9 @@ namespace mpvnet
|
||||
return;
|
||||
}
|
||||
|
||||
if (App.IsStartedFromTerminal) Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
||||
Application.Run(new MainForm());
|
||||
if (App.IsStartedFromTerminal) Native.FreeConsole();
|
||||
mutex.Dispose();
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -6,6 +6,12 @@ namespace mpvnet
|
||||
{
|
||||
public class Native
|
||||
{
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern bool AttachConsole(int dwProcessId);
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true)]
|
||||
public static extern bool FreeConsole();
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
public static extern IntPtr LoadLibrary(string dllToLoad);
|
||||
|
||||
@@ -82,7 +88,7 @@ namespace mpvnet
|
||||
{
|
||||
public IntPtr dwData;
|
||||
public int cbData;
|
||||
[MarshalAs(UnmanagedType.LPStr)]
|
||||
[MarshalAs(UnmanagedType.LPTStr)]
|
||||
public string lpData;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -359,7 +359,7 @@ public class TaskDialog<T> : TaskDialogNative, IDisposable
|
||||
public void AddCommandLink(string text, T value)
|
||||
{
|
||||
int n = 1000 + IdValueDic.Count + 1;
|
||||
IdValueDic[n] = value == null ? (T)(object)text : value;
|
||||
IdValueDic[n] = value;
|
||||
IdTextDic[n] = text;
|
||||
Buttons.Add(new TaskDialogNative.TASKDIALOG_BUTTON(n, text));
|
||||
Config.dwFlags |= TaskDialogNative.TASKDIALOG_FLAGS.TDF_USE_COMMAND_LINKS;
|
||||
|
||||
@@ -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("4.7.7.0")]
|
||||
[assembly: AssemblyFileVersion("4.7.7.0")]
|
||||
[assembly: AssemblyVersion("5.2.0.0")]
|
||||
[assembly: AssemblyFileVersion("5.2.0.0")]
|
||||
|
||||
36
mpv.net/Properties/Resources.Designer.cs
generated
@@ -96,7 +96,8 @@ namespace mpvnet.Properties {
|
||||
///keep-open-pause = no
|
||||
///osd-playing-msg = '${filename}'
|
||||
///screenshot-directory = '~~desktop/'
|
||||
///input-default-bindings = no.
|
||||
///input-default-bindings = no
|
||||
///script-opts=osc-scalewindowed=1.5.
|
||||
/// </summary>
|
||||
internal static string mpvConf {
|
||||
get {
|
||||
@@ -109,10 +110,10 @@ namespace mpvnet.Properties {
|
||||
///name = "hwdec"
|
||||
///default = "no"
|
||||
///filter = "Video"
|
||||
///helpurl = "https://mpv.io/manual/master/#options-hwdec"
|
||||
///url = "https://mpv.io/manual/master/#options-hwdec"
|
||||
///help = "Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If hardware decoding is not possible, mpv will fall back on software decoding.\n\nFor more information visit:"
|
||||
///options = [{ name = "no", help = "always use software decoding" },
|
||||
/// { name = "auto", help = "enabl [rest of string was truncated]";.
|
||||
/// { name = "auto", help = "enable be [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string mpvConfToml {
|
||||
get {
|
||||
@@ -130,27 +131,36 @@ namespace mpvnet.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to dark-color = '#1E90FF'
|
||||
///light-color = '#28394F'.
|
||||
/// </summary>
|
||||
internal static string mpvNetConf {
|
||||
get {
|
||||
return ResourceManager.GetString("mpvNetConf", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to [[settings]]
|
||||
///name = "dark-mode"
|
||||
///default = "always"
|
||||
///filter = "mpv.net"
|
||||
///help = "Enables a dark theme."
|
||||
///filter = "General"
|
||||
///help = "Enables a dark theme. (mpv.net specific setting)"
|
||||
///options = [{ name = "always" },
|
||||
/// { name = "system" , help = "Available on Windows 10 or higher" },
|
||||
/// { name = "never" }]
|
||||
///
|
||||
///[[settings]]
|
||||
///name = "url-whitelist"
|
||||
///filter = "mpv.net"
|
||||
///type = "string"
|
||||
///help = "Whitelist to monitor the clipboard for URLs to play.\n\nDefault: tube vimeo ard zdf"
|
||||
///name = "dark-color"
|
||||
///type = "color"
|
||||
///filter = "General"
|
||||
///help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
|
||||
///
|
||||
///[[settings]]
|
||||
///name = "process-instance"
|
||||
///default = "single"
|
||||
///filter = "mpv.net"
|
||||
///help = "Defines [rest of string was truncated]";.
|
||||
///name = "light-color"
|
||||
///type = "color"
|
||||
///filter = "General" [rest of string was truncated]";.
|
||||
/// </summary>
|
||||
internal static string mpvNetConfToml {
|
||||
get {
|
||||
|
||||
@@ -130,6 +130,9 @@
|
||||
<data name="mpvnet" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\mpvnet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="mpvNetConf" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\mpvNetConf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
<data name="mpvNetConfToml" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\mpvNetConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||
</data>
|
||||
|
||||
@@ -137,11 +137,11 @@
|
||||
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
||||
Ctrl+T set ontop no #menu: View > On Top > Disable
|
||||
b cycle border #menu: View > Toggle Border
|
||||
i script-message mpv.net show-info #menu: View > File Info
|
||||
i script-message mpv.net show-info #menu: View > File/Stream Info
|
||||
t script-binding stats/display-stats #menu: View > Show Statistics
|
||||
T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
||||
Del script-binding osc/visibility #menu: View > Toggle OSC Visibility
|
||||
F8 show-text ${playlist} 5000 #menu: View > Show Playlist
|
||||
F8 script-binding show-playlist #menu: View > Show Playlist
|
||||
F9 show-text ${track-list} 5000 #menu: View > Show Audio/Video/Subtitle List
|
||||
|
||||
c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
||||
@@ -150,19 +150,27 @@
|
||||
|
||||
F1 script-message mpv.net show-command-palette #menu: Tools > Show All Commands
|
||||
h script-message mpv.net show-history #menu: Tools > Show History
|
||||
Ctrl+r script-message-to repl type "" #menu: Tools > Show REPL
|
||||
l ab-loop #menu: Tools > Set/clear A-B loop points
|
||||
L cycle-values loop-file "inf" "no" #menu: Tools > Toggle infinite file looping
|
||||
Ctrl+h cycle-values hwdec "auto" "no" #menu: Tools > Toggle Hardware Decoding
|
||||
_ script-message mpv.net execute-mpv-command #menu: Tools > Execute mpv command...
|
||||
_ script-message mpv.net manage-file-associations #menu: Tools > Manage File Associations...
|
||||
_ script-message mpv.net show-setup-dialog #menu: Tools > OS Setup...
|
||||
|
||||
_ 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/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt #menu: Help > Show mpv.net default keys
|
||||
_ script-message mpv.net shell-execute https://mpv-net.github.io/mpv.net-web-site/ #menu: Help > Show mpv.net web site
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/Manual.md #menu: Help > Show mpv.net manual
|
||||
_ ignore #menu: Help > -
|
||||
_ script-message mpv.net show-about #menu: Help > About mpv.net
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/Manual.md #menu: Help > mpv.net Manual
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net #menu: Help > mpv.net GitHub
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/wiki #menu: Help > mpv.net Wiki
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net#support #menu: Help > mpv.net Support
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/releases #menu: Help > mpv.net Download
|
||||
_ script-message mpv.net shell-execute https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt #menu: Help > mpv.net Default Key Bindings
|
||||
_ ignore #menu: Help > -
|
||||
_ script-message mpv.net shell-execute https://mpv.io/manual/stable/ #menu: Help > mpv Manual
|
||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/wiki #menu: Help > mpv Wiki
|
||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/wiki/User-Scripts #menu: Help > mpv User Scripts
|
||||
_ script-message mpv.net shell-execute https://mpv.io/bug-reports/ #menu: Help > mpv Bugs and Requests
|
||||
_ script-message mpv.net shell-execute https://mpv.io/installation/ #menu: Help > mpv Download
|
||||
_ script-message mpv.net shell-execute https://github.com/mpv-player/mpv/blob/master/etc/input.conf #menu: Help > mpv Default Key Bindings
|
||||
_ ignore #menu: Help > -
|
||||
_ script-message mpv.net show-about #menu: Help > About mpv.net
|
||||
|
||||
_ ignore #menu: -
|
||||
Esc quit #menu: Exit
|
||||
@@ -190,4 +198,5 @@
|
||||
Ctrl+Wheel_Up no-osd seek 7
|
||||
Ctrl+Wheel_Down no-osd seek -7
|
||||
MBTN_Left_DBL cycle fullscreen
|
||||
KP_Enter cycle fullscreen
|
||||
KP_Enter cycle fullscreen
|
||||
MBTN_Left ignore
|
||||
@@ -1,9 +1,4 @@
|
||||
|
||||
# manual: https://mpv.io/manual/master/
|
||||
|
||||
# defaults: https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt
|
||||
|
||||
input-ar-delay = 500
|
||||
input-ar-delay = 500
|
||||
input-ar-rate = 20
|
||||
volume = 50
|
||||
hwdec = yes
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "hwdec"
|
||||
default = "no"
|
||||
filter = "Video"
|
||||
helpurl = "https://mpv.io/manual/master/#options-hwdec"
|
||||
url = "https://mpv.io/manual/master/#options-hwdec"
|
||||
help = "Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If hardware decoding is not possible, mpv will fall back on software decoding.\n\nFor more information visit:"
|
||||
options = [{ name = "no", help = "always use software decoding" },
|
||||
{ name = "auto", help = "enable best hw decoder (see below)" },
|
||||
@@ -23,7 +23,7 @@ options = [{ name = "no", help = "always use software decoding" },
|
||||
name = "gpu-api"
|
||||
default = "auto"
|
||||
filter = "Video"
|
||||
help = "Controls which type of graphics APIs will be accepted."
|
||||
help = "Controls which type of graphics APIs will be accepted. Auto uses d3d11, it should only be changed in case of problems."
|
||||
options = [{ name = "auto", help = "Use any available API" },
|
||||
{ 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)" },
|
||||
@@ -45,7 +45,7 @@ name = "vo"
|
||||
default = "gpu"
|
||||
filter = "Video"
|
||||
help = "Video output drivers to be used.\n\nFor more information visit:"
|
||||
helpurl = "https://mpv.io/manual/master/#video-output-drivers-vo"
|
||||
url = "https://mpv.io/manual/master/#video-output-drivers-vo"
|
||||
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." },
|
||||
{ name = "direct3d", help = "Video output driver that uses the Direct3D interface" }]
|
||||
|
||||
@@ -54,7 +54,7 @@ name = "video-sync"
|
||||
default = "audio"
|
||||
filter = "Video"
|
||||
help = "How the player synchronizes audio and video.\n\nFor more information visit:"
|
||||
helpurl = "https://mpv.io/manual/master/#options-video-sync"
|
||||
url = "https://mpv.io/manual/master/#options-video-sync"
|
||||
options = [{ name = "audio" },
|
||||
{ name = "display-resample" },
|
||||
{ name = "display-resample-vdrop" },
|
||||
@@ -233,7 +233,7 @@ width = 300
|
||||
filter = "Screen"
|
||||
type = "string"
|
||||
help = "Show a message on OSD when playback starts. The string is expanded for properties, e.g. osd-playing-msg='file: ${filename}' will show the message file: followed by a space and the currently played filename. For more information visit:"
|
||||
helpurl = "https://mpv.io/manual/master/#property-expansion"
|
||||
url = "https://mpv.io/manual/master/#property-expansion"
|
||||
|
||||
[[settings]]
|
||||
name = "osd-font-size"
|
||||
@@ -241,27 +241,81 @@ default = "55"
|
||||
filter = "Screen"
|
||||
help = "Specify the OSD font size. See sub-font-size for details. Default: 55"
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-directory"
|
||||
width = 500
|
||||
type = "folder"
|
||||
filter = "Screen"
|
||||
help = "Store screenshots in this directory. This path is joined with the filename generated by screenshot-template. If the template filename is already absolute, the directory is ignored.\n\nIf the directory does not exist, it is created on the first screenshot. If it is not a directory, an error is generated when trying to write a screenshot.\n\nThis option is not set by default, and thus will write screenshots to the directory from which mpv was started. In pseudo-gui mode (see PSEUDO GUI MODE), this is set to the desktop."
|
||||
|
||||
[[settings]]
|
||||
name = "autofit"
|
||||
filter = "Screen"
|
||||
help = "<int> Initial window height in percent. Default: 50%"
|
||||
help = "<int> Initial window height in percent. Default: 50"
|
||||
|
||||
[[settings]]
|
||||
name = "autofit-smaller"
|
||||
filter = "Screen"
|
||||
help = "<int> Minimum window height in percent. Default: 40%"
|
||||
help = "<int> Minimum window height in percent. Default: 40"
|
||||
|
||||
[[settings]]
|
||||
name = "autofit-larger"
|
||||
filter = "Screen"
|
||||
help = "<int> Maximum window height in percent. Default: 75%"
|
||||
help = "<int> Maximum window height in percent. Default: 75"
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-directory"
|
||||
width = 500
|
||||
type = "folder"
|
||||
filter = "Screen"
|
||||
help = "Store screenshots in this directory. This path is joined with the filename generated by screenshot-template. If the template filename is already absolute, the directory is ignored.\n\nIf the directory does not exist, it is created on the first screenshot. If it is not a directory, an error is generated when trying to write a screenshot."
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-format"
|
||||
default = "jpg"
|
||||
filter = "Screen"
|
||||
help = "Set the image file type used for saving screenshots."
|
||||
options = [{ name = "jpg" },
|
||||
{ name = "png" }]
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-tag-colorspace"
|
||||
default = "no"
|
||||
filter = "Screen"
|
||||
help = "Tag screenshots with the appropriate colorspace. Note that not all formats are supported."
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-high-bit-depth"
|
||||
default = "yes"
|
||||
filter = "Screen"
|
||||
help = "If possible, write screenshots with a bit depth similar to the source video (default: yes). This is interesting in particular for PNG, as this sometimes triggers writing 16 bit PNGs with huge file sizes. This will also include an unused alpha channel in the resulting files if 16 bit is used."
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-jpeg-source-chroma"
|
||||
default = "yes"
|
||||
filter = "Screen"
|
||||
help = "Write JPEG files with the same chroma subsampling as the video (default: yes). If disabled, the libjpeg default is used."
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-template"
|
||||
filter = "Screen"
|
||||
type = "string"
|
||||
help = "Specify the filename template used to save screenshots. The template specifies the filename without file extension, and can contain format specifiers, which will be substituted when taking a screenshot. By default, the template is mpv-shot%n, which results in filenames like mpv-shot0012.png for example.\n\nFind the full documentation here:"
|
||||
url = "https://mpv.io/manual/master/#options-screenshot-template"
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-jpeg-quality"
|
||||
filter = "Screen"
|
||||
help = "<0-100> Set the JPEG quality level. Higher means better quality. The default is 90."
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-png-compression"
|
||||
filter = "Screen"
|
||||
help = "<0-9> Set the PNG compression level. Higher means better compression. This will affect the file size of the written screenshot file and the time it takes to write a screenshot. Too high compression might occupy enough CPU time to interrupt playback. The default is 7."
|
||||
|
||||
[[settings]]
|
||||
name = "screenshot-png-filter"
|
||||
filter = "Screen"
|
||||
help = "<0-5> Set the filter applied prior to PNG compression. 0 is none, 1 is 'sub', 2 is 'up', 3 is 'average', 4 is 'Paeth', and 5 is 'mixed'. This affects the level of compression that can be achieved. For most images, 'mixed' achieves the best compression ratio, hence it is the default."
|
||||
|
||||
[[settings]]
|
||||
name = "keep-open-pause"
|
||||
|
||||
2
mpv.net/Resources/mpvNetConf.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
dark-color = '#1E90FF'
|
||||
light-color = '#28394F'
|
||||
@@ -1,29 +1,9 @@
|
||||
[[settings]]
|
||||
name = "dark-mode"
|
||||
default = "always"
|
||||
filter = "General"
|
||||
help = "Enables a dark theme. (mpv.net specific setting)"
|
||||
options = [{ name = "always" },
|
||||
{ name = "system" , help = "Available on Windows 10 or higher" },
|
||||
{ name = "never" }]
|
||||
|
||||
[[settings]]
|
||||
name = "dark-color"
|
||||
type = "color"
|
||||
filter = "General"
|
||||
help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
|
||||
|
||||
[[settings]]
|
||||
name = "light-color"
|
||||
type = "color"
|
||||
filter = "General"
|
||||
help = "Theme color used when dark-mode is disabled. Leave empty to use OS theme. (mpv.net specific setting)"
|
||||
|
||||
[[settings]]
|
||||
name = "url-whitelist"
|
||||
filter = "General"
|
||||
type = "string"
|
||||
help = "Whitelist setting to monitor the clipboard for URLs to play. (mpv.net specific setting)\n\nDefault: tube vimeo ard zdf"
|
||||
help = "Whitelist setting to monitor the clipboard for URLs to play. (mpv.net specific setting)\n\nDefault: tube vimeo ard zdf\n\nHow to start mpv.net directly from Google Chrome is described in the manual:"
|
||||
url = "https://github.com/stax76/mpv.net/blob/master/Manual.md#chrome-extension"
|
||||
|
||||
[[settings]]
|
||||
name = "process-instance"
|
||||
@@ -55,10 +35,60 @@ name = "start-threshold"
|
||||
filter = "Screen"
|
||||
help = "Threshold in milliseconds to wait for libmpv returning the video resolution before the window is shown, otherwise default dimensions are used as defined by autofit and start-size. (mpv.net specific setting) Default: 1500"
|
||||
|
||||
[[settings]]
|
||||
name = "minimum-aspect-ratio"
|
||||
filter = "Screen"
|
||||
help = "<float> Minimum aspect ratio for the window. Default: 1.3"
|
||||
|
||||
[[settings]]
|
||||
name = "remember-position"
|
||||
default = "no"
|
||||
filter = "Screen"
|
||||
help = "Setting to save the window position on exit. (mpv.net specific setting)"
|
||||
help = "Save the window position on exit. (mpv.net specific setting)"
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
|
||||
[[settings]]
|
||||
name = "remember-volume"
|
||||
default = "no"
|
||||
filter = "Audio"
|
||||
help = "Save volume and mute on exit and restore it on start. (mpv.net specific setting)"
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
|
||||
[[settings]]
|
||||
name = "auto-load-folder"
|
||||
default = "yes"
|
||||
filter = "Playback"
|
||||
help = "For single files automatically load the entire directory into the playlist. (mpv.net specific setting)"
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
|
||||
[[settings]]
|
||||
name = "dark-mode"
|
||||
default = "always"
|
||||
filter = "UI"
|
||||
help = "Enables a dark theme. (mpv.net specific setting)"
|
||||
options = [{ name = "always" },
|
||||
{ name = "system" , help = "Available on Windows 10 or higher" },
|
||||
{ name = "never" }]
|
||||
|
||||
[[settings]]
|
||||
name = "dark-color"
|
||||
type = "color"
|
||||
filter = "UI"
|
||||
help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
|
||||
|
||||
[[settings]]
|
||||
name = "light-color"
|
||||
type = "color"
|
||||
filter = "UI"
|
||||
help = "Theme color used when dark-mode is disabled. Leave empty to use OS theme. (mpv.net specific setting)"
|
||||
|
||||
[[settings]]
|
||||
name = "themed-menu"
|
||||
default = "no"
|
||||
filter = "UI"
|
||||
help = "Follow theme color in context menu. (mpv.net specific setting)"
|
||||
options = [{ name = "yes" },
|
||||
{ name = "no" }]
|
||||
BIN
mpv.net/Resources/mpvnet.ico
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 8.2 KiB |
@@ -4,13 +4,14 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
Title="About mpv.net" Height="230" Width="420" FontSize="16" ShowInTaskbar="False"
|
||||
Title="About mpv.net" Height="230" Width="500" FontSize="16" ShowInTaskbar="False"
|
||||
WindowStartupLocation="CenterOwner" ResizeMode="NoResize">
|
||||
<Grid>
|
||||
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<TextBlock FontSize="48" HorizontalAlignment="Center" Margin="0,0,0,10">mpv.net</TextBlock>
|
||||
<TextBlock HorizontalAlignment="Center">Copyright (c) 2017-2019 Frank Skare (stax76)</TextBlock>
|
||||
<TextBlock Name="Version" HorizontalAlignment="Center" />
|
||||
<TextBlock Name="mpvVersion" HorizontalAlignment="Center" />
|
||||
<TextBlock HorizontalAlignment="Center" Margin="0,0,0,20">MIT License</TextBlock>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Windows;
|
||||
using System.IO;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
|
||||
@@ -9,7 +10,8 @@ namespace mpvnet
|
||||
public AboutWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
Version.Text = $"Version {System.Windows.Forms.Application.ProductVersion}";
|
||||
Version.Text = $"mpv.net Version {System.Windows.Forms.Application.ProductVersion}";
|
||||
mpvVersion.Text = $"{mp.get_property_string("mpv-version")} ({File.GetLastWriteTime(PathHelp.StartupPath + "mpv-1.dll").ToShortDateString()})";
|
||||
}
|
||||
|
||||
protected override void OnPreviewKeyDown(KeyEventArgs e) => Close();
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace mpvnet
|
||||
{
|
||||
CommandItem item = ListView.SelectedItem as CommandItem;
|
||||
Close();
|
||||
mp.command_string(item.Command);
|
||||
mp.command(item.Command);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:WPF="clr-namespace:WPF"
|
||||
mc:Ignorable="d"
|
||||
Height="500" Width="700" Loaded="ConfWindow1_Loaded" ShowInTaskbar="False"
|
||||
Height="530" Width="700" Loaded="ConfWindow1_Loaded" ShowInTaskbar="False"
|
||||
WindowStartupLocation="CenterScreen" Title="Config Editor">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
@@ -21,7 +21,7 @@
|
||||
<StackPanel x:Name="MainStackPanel"></StackPanel>
|
||||
</ScrollViewer>
|
||||
<StackPanel Margin="20,0,0,0" Grid.Row="1">
|
||||
<ListBox x:Name="FilterListBox" ItemsSource="{Binding FilterStrings}" BorderThickness="0" SelectionChanged="ListBox_SelectionChanged" Foreground="{x:Static WPF:WPF.ThemeBrush}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
|
||||
<ListBox x:Name="FilterListBox" ItemsSource="{Binding FilterStrings}" BorderThickness="0" SelectionChanged="FilterListBox_SelectionChanged" Foreground="{x:Static WPF:WPF.ThemeBrush}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock Text="{Binding}" FontSize="16" />
|
||||
@@ -29,6 +29,7 @@
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
<TextBlock x:Name="OpenSettingsTextBlock" Margin="0,30,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="OpenSettingsTextBlock_MouseUp">Open config folder</TextBlock>
|
||||
<TextBlock x:Name="PreviewTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="PreviewTextBlock_MouseUp">Preview mpv.conf</TextBlock>
|
||||
<TextBlock x:Name="ShowManualTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="ShowManualTextBlock_MouseUp">Show mpv manual</TextBlock>
|
||||
<TextBlock x:Name="SupportTextBlock" Margin="0,15,0,0" Cursor="Hand" TextWrapping="WrapWithOverflow" Foreground="{x:Static WPF:WPF.ThemeBrush}" MouseUp="SupportTextBlock_MouseUp">Show support forum</TextBlock>
|
||||
</StackPanel>
|
||||
|
||||
@@ -17,10 +17,9 @@ namespace mpvnet
|
||||
{
|
||||
private List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvConfToml);
|
||||
private List<SettingBase> NetSettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvNetConfToml);
|
||||
private Dictionary<string, Dictionary<string, string>> Comments = new Dictionary<string, Dictionary<string, string>>();
|
||||
|
||||
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
|
||||
|
||||
string InitialContent;
|
||||
|
||||
public ConfWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -28,7 +27,9 @@ namespace mpvnet
|
||||
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
||||
LoadSettings(SettingsDefinitions, Conf);
|
||||
LoadSettings(NetSettingsDefinitions, NetConf);
|
||||
SearchControl.Text = RegHelp.GetString(App.RegPath, "config editor search");
|
||||
InitialContent = GetContent(mp.ConfPath, Conf, SettingsDefinitions) +
|
||||
GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
|
||||
SearchControl.Text = RegHelp.GetString(App.RegPath, "ConfigEditorSearch");
|
||||
|
||||
if (App.IsDarkMode)
|
||||
{
|
||||
@@ -59,7 +60,6 @@ namespace mpvnet
|
||||
if (setting.Name == pair.Key)
|
||||
{
|
||||
setting.Value = pair.Value.Trim('\'', '"');
|
||||
setting.StartValue = pair.Value.Trim('\'', '"');
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -93,7 +93,7 @@ namespace mpvnet
|
||||
|
||||
public Dictionary<string, string> NetConf {
|
||||
get {
|
||||
if (_NetConf == null) _NetConf = LoadConf(App.ConfFilePath);
|
||||
if (_NetConf == null) _NetConf = LoadConf(App.ConfPath);
|
||||
return _NetConf;
|
||||
}
|
||||
}
|
||||
@@ -101,7 +101,6 @@ namespace mpvnet
|
||||
private Dictionary<string, string> LoadConf(string filePath)
|
||||
{
|
||||
Dictionary<string, string> conf = new Dictionary<string, string>();
|
||||
Comments[filePath] = new Dictionary<string, string>();
|
||||
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
@@ -110,15 +109,9 @@ namespace mpvnet
|
||||
if (i.Contains("="))
|
||||
{
|
||||
int pos = i.IndexOf("=");
|
||||
string left = i.Substring(0, pos).Replace(" ", "").ToLower();
|
||||
string left = i.Substring(0, pos).Trim().ToLower();
|
||||
string right = i.Substring(pos + 1).Trim();
|
||||
|
||||
if (left.StartsWith("#"))
|
||||
{
|
||||
Comments[filePath][left.TrimStart('#')] = right;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (left.StartsWith("#")) continue;
|
||||
if (left == "fs") left = "fullscreen";
|
||||
if (left == "loop") left = "loop-file";
|
||||
conf[left] = right;
|
||||
@@ -131,40 +124,19 @@ namespace mpvnet
|
||||
protected override void OnClosed(EventArgs e)
|
||||
{
|
||||
base.OnClosed(e);
|
||||
WriteToDisk();
|
||||
RegHelp.SetObject(App.RegPath, "config editor search", SearchControl.Text);
|
||||
RegHelp.SetObject(App.RegPath, "ConfigEditorSearch", SearchControl.Text);
|
||||
string content = GetContent(mp.ConfPath, Conf, SettingsDefinitions);
|
||||
string netContent = GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
|
||||
if (InitialContent == content + netContent) return;
|
||||
File.WriteAllText(mp.ConfPath, content);
|
||||
File.WriteAllText(App.ConfPath, netContent);
|
||||
Msg.Show("Changes will be available on next mpv.net startup.");
|
||||
}
|
||||
|
||||
void WriteToDisk()
|
||||
{
|
||||
bool isDirty = false;
|
||||
|
||||
foreach (SettingBase i in SettingsDefinitions)
|
||||
if (i.StartValue != i.Value)
|
||||
isDirty = true;
|
||||
|
||||
foreach (SettingBase i in NetSettingsDefinitions)
|
||||
if (i.StartValue != i.Value)
|
||||
isDirty = true;
|
||||
|
||||
if (!isDirty)
|
||||
return;
|
||||
|
||||
WriteToDisk(mp.ConfPath, Conf, SettingsDefinitions);
|
||||
WriteToDisk(App.ConfFilePath, NetConf, NetSettingsDefinitions);
|
||||
|
||||
Msg.Show("Changes will be available on next mpv.net startup.");
|
||||
}
|
||||
|
||||
void WriteToDisk(string filePath,
|
||||
Dictionary<string, string> confSettings,
|
||||
List<SettingBase> settings)
|
||||
string GetContent(string filePath, Dictionary<string, string> confSettings, List<SettingBase> settings)
|
||||
{
|
||||
string content = "";
|
||||
|
||||
foreach (var i in Comments[filePath])
|
||||
content += $"#{i.Key} = {i.Value}\r\n";
|
||||
|
||||
foreach (SettingBase setting in settings)
|
||||
{
|
||||
if ((setting.Value ?? "") != setting.Default)
|
||||
@@ -186,7 +158,7 @@ namespace mpvnet
|
||||
foreach (var i in confSettings)
|
||||
content = content + $"{i.Key} = {i.Value}\r\n";
|
||||
|
||||
File.WriteAllText(filePath, content);
|
||||
return content;
|
||||
}
|
||||
|
||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||
@@ -225,7 +197,7 @@ namespace mpvnet
|
||||
i.Update();
|
||||
}
|
||||
|
||||
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
private void FilterListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||
{
|
||||
if (e.AddedItems.Count > 0)
|
||||
SearchControl.Text = e.AddedItems[0].ToString() + ":";
|
||||
@@ -236,6 +208,11 @@ namespace mpvnet
|
||||
Process.Start(Path.GetDirectoryName(mp.ConfPath));
|
||||
}
|
||||
|
||||
private void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
Msg.Show("mpv.conf Preview", GetContent(mp.ConfPath, Conf, SettingsDefinitions));
|
||||
}
|
||||
|
||||
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
Process.Start("https://mpv.io/manual/master/");
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
@@ -137,10 +136,11 @@ namespace mpvnet
|
||||
Everything_SetRequestFlags(EVERYTHING_REQUEST_FILE_NAME | EVERYTHING_REQUEST_PATH);
|
||||
Everything_SetSort(EVERYTHING_SORT_SIZE_DESCENDING);
|
||||
Everything_Query(true);
|
||||
|
||||
for (i = 0; i < Everything_GetNumResults(); i++)
|
||||
{
|
||||
Everything_GetResultFullPathName(i, buf, bufsize);
|
||||
string ext = Path.GetExtension(buf.ToString()).TrimStart('.').ToLower();
|
||||
string ext = buf.ToString().ShortExt();
|
||||
|
||||
if (App.AudioTypes.Contains(ext) || App.VideoTypes.Contains(ext) ||
|
||||
App.ImageTypes.Contains(ext))
|
||||
@@ -149,6 +149,7 @@ namespace mpvnet
|
||||
|
||||
if (items.Count > 100) break;
|
||||
}
|
||||
|
||||
Application.Current.Dispatcher.Invoke(() => {
|
||||
ListView.ItemsSource = items;
|
||||
SelectFirst();
|
||||
|
||||
@@ -48,16 +48,21 @@ namespace mpvnet
|
||||
CollectionView.Refresh();
|
||||
|
||||
if (SearchControl.SearchTextBox.Text == "?")
|
||||
Msg.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>\n\nIf only one character is entered the search will be performed only in the input.", "Filtering");
|
||||
{
|
||||
SearchControl.SearchTextBox.Text = "";
|
||||
Msg.Show("Filtering", "Reduce the filter scope with:\n\ni input\n\nm menu\n\nc command\n\nIf only one character is entered input search is performed.");
|
||||
}
|
||||
}
|
||||
|
||||
bool Filter(CommandItem item)
|
||||
{
|
||||
if (item.Command == "") return false;
|
||||
string searchText = SearchControl.SearchTextBox.Text.ToLower();
|
||||
if (searchText == "") return true;
|
||||
if (searchText == "" || searchText == "?") return true;
|
||||
|
||||
if (searchText.StartsWith("i ") || searchText.StartsWith("i:") || searchText.Length == 1)
|
||||
if (searchText.Length == 1)
|
||||
return item.Input.ToLower().Replace("ctrl+", "").Replace("shift+", "").Replace("alt+", "") == searchText.ToLower();
|
||||
else if (searchText.StartsWith("i ") || searchText.StartsWith("i:") || searchText.Length == 1)
|
||||
{
|
||||
if (searchText.Length > 1)
|
||||
searchText = searchText.Substring(2).Trim();
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
Title="Learn Input" Height="200" Width="400" WindowStartupLocation="CenterOwner"
|
||||
ResizeMode="NoResize" Loaded="Window_Loaded" Background="Black" MouseWheel="Window_MouseWheel" MouseUp="Window_MouseUp" MouseDoubleClick="Window_MouseDoubleClick">
|
||||
ResizeMode="NoResize" Loaded="Window_Loaded" Background="Black" MouseWheel="Window_MouseWheel" MouseUp="Window_MouseUp" MouseDoubleClick="Window_MouseDoubleClick" TextInput="Window_TextInput">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*" />
|
||||
|
||||
@@ -10,7 +10,8 @@ namespace mpvnet
|
||||
public partial class LearnWindow : Window
|
||||
{
|
||||
public CommandItem InputItem { get; set; }
|
||||
public string NewKey { get; set; } = "";
|
||||
string NewKey = "";
|
||||
string KeyChar = "";
|
||||
|
||||
public LearnWindow() => InitializeComponent();
|
||||
|
||||
@@ -60,9 +61,9 @@ namespace mpvnet
|
||||
case WF.Keys.NumPad9:
|
||||
text = "KP" + e.KeyCode.ToString()[6].ToString(); break;
|
||||
case WF.Keys.Space:
|
||||
text = "SPACE"; break;
|
||||
text = "Space"; break;
|
||||
case WF.Keys.Enter:
|
||||
text = "ENTER"; break;
|
||||
text = "Enter"; break;
|
||||
case WF.Keys.Tab:
|
||||
text = "TAB"; break;
|
||||
case WF.Keys.Back:
|
||||
@@ -72,7 +73,7 @@ namespace mpvnet
|
||||
case WF.Keys.Insert:
|
||||
text = "INS"; break;
|
||||
case WF.Keys.Home:
|
||||
text = "HOME"; break;
|
||||
text = "Home"; break;
|
||||
case WF.Keys.End:
|
||||
text = "END"; break;
|
||||
case WF.Keys.PageUp:
|
||||
@@ -82,56 +83,56 @@ namespace mpvnet
|
||||
case WF.Keys.Escape:
|
||||
text = "ESC"; break;
|
||||
case WF.Keys.PrintScreen:
|
||||
text = "PRINT"; break;
|
||||
text = "Print"; break;
|
||||
case WF.Keys.Play:
|
||||
text = "PLAY"; break;
|
||||
text = "Play"; break;
|
||||
case WF.Keys.Pause:
|
||||
text = "PAUSE"; break;
|
||||
text = "Pause"; break;
|
||||
case WF.Keys.MediaPlayPause:
|
||||
text = "PLAYPAUSE"; break;
|
||||
text = "PlayPause"; break;
|
||||
case WF.Keys.MediaStop:
|
||||
text = "STOP"; break;
|
||||
text = "Stop"; break;
|
||||
case WF.Keys.MediaNextTrack:
|
||||
text = "NEXT"; break;
|
||||
text = "Next"; break;
|
||||
case WF.Keys.MediaPreviousTrack:
|
||||
text = "PREV"; break;
|
||||
text = "Prev"; break;
|
||||
case WF.Keys.VolumeUp:
|
||||
text = "VOLUME_UP"; break;
|
||||
text = "Volume_Up"; break;
|
||||
case WF.Keys.VolumeDown:
|
||||
text = "VOLUME_DOWN"; break;
|
||||
text = "Volume_Down"; break;
|
||||
case WF.Keys.VolumeMute:
|
||||
text = "MUTE"; break;
|
||||
text = "Mute"; break;
|
||||
case WF.Keys.BrowserHome:
|
||||
text = "HOMEPAGE"; break;
|
||||
text = "Homepage"; break;
|
||||
case WF.Keys.LaunchMail:
|
||||
text = "MAIL"; break;
|
||||
text = "Mail"; break;
|
||||
case WF.Keys.BrowserFavorites:
|
||||
text = "FAVORITES"; break;
|
||||
text = "Favorites"; break;
|
||||
case WF.Keys.BrowserSearch:
|
||||
text = "SEARCH"; break;
|
||||
text = "Search"; break;
|
||||
case WF.Keys.Sleep:
|
||||
text = "SLEEP"; break;
|
||||
text = "Sleep"; break;
|
||||
case WF.Keys.Cancel:
|
||||
text = "CANCEL"; break;
|
||||
text = "Cancel"; break;
|
||||
}
|
||||
|
||||
bool shiftWasHandled = false;
|
||||
bool wasModified = false;
|
||||
|
||||
bool isAlt = GetKeyState(18) < (short)0;
|
||||
bool isShift = GetKeyState(16) < (short)0;
|
||||
bool isCtrl = GetKeyState(17) < (short)0;
|
||||
|
||||
if (text.Length == 1 && isShift && text[0] != GetModifiedKey(text[0]))
|
||||
if (text.Length == 1 && KeyChar != text)
|
||||
{
|
||||
text = GetModifiedKey(text[0]).ToString();
|
||||
shiftWasHandled = true;
|
||||
text = KeyChar;
|
||||
wasModified = true;
|
||||
}
|
||||
|
||||
if (text == "#") text = "Sharp";
|
||||
if (text == "#") text = "SHARP";
|
||||
|
||||
if (isAlt) text = "Alt+" + text;
|
||||
if (isShift && !shiftWasHandled) text = "Shift+" + text;
|
||||
if (isCtrl) text = "Ctrl+" + text;
|
||||
if (isAlt && !wasModified) text = "ALT+" + text;
|
||||
if (isShift && !wasModified) text = "SHIFT+" + text;
|
||||
if (isCtrl && !wasModified) text = "CTRL+" + text;
|
||||
|
||||
if (!string.IsNullOrEmpty(text))
|
||||
SetKey(text);
|
||||
@@ -163,24 +164,6 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
public static char GetModifiedKey(char c)
|
||||
{
|
||||
short vkKeyScanResult = VkKeyScan(c);
|
||||
|
||||
if (vkKeyScanResult == -1)
|
||||
return c;
|
||||
|
||||
uint code = (uint)vkKeyScanResult & 0xff;
|
||||
byte[] b = new byte[256];
|
||||
b[0x10] = 0x80;
|
||||
uint r;
|
||||
|
||||
if (1 != ToAscii(code, code, b, out r, 0))
|
||||
return c;
|
||||
|
||||
return (char)r;
|
||||
}
|
||||
|
||||
void ProcessKeyEventArgs(ref WF.Message m)
|
||||
{
|
||||
int WM_KEYUP = 0x0101, WM_SYSKEYUP = 0x0105, WM_APPCOMMAND = 0x0319;
|
||||
@@ -382,5 +365,10 @@ namespace mpvnet
|
||||
BlockMBTN_LEFT = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void Window_TextInput(object sender, TextCompositionEventArgs e)
|
||||
{
|
||||
KeyChar = e.Text;
|
||||
}
|
||||
}
|
||||
}
|
||||
19
mpv.net/WPF/SetupWindow.xaml
Normal file
@@ -0,0 +1,19 @@
|
||||
<Window x:Class="mpvnet.SetupWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
mc:Ignorable="d"
|
||||
Title="mpv.net OS Setup" SizeToContent="WidthAndHeight" WindowStartupLocation="CenterOwner">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<Button Name="RegisterVideo" Margin="5" Click="RegisterVideo_Click">Register video file extensions (requires elevated privileges)</Button>
|
||||
<Button Name="RegisterAudio" Margin="5" Click="RegisterAudio_Click">Register audio file extensions (requires elevated privileges)</Button>
|
||||
<Button Name="RegisterImage" Margin="5" Click="RegisterImage_Click">Register image file extensions (requires elevated privileges)</Button>
|
||||
<Button Name="AddToPathEnvVar" Margin="5" Click="AddToPathEnvVar_Click">Add mpv.net to Path environment variable</Button>
|
||||
<Button Name="ManageDefaultApps" Margin="5" Click="ManageDefaultApps_Click">Manage Default Apps (Win 10 or higher)</Button>
|
||||
<Button Name="UnregisterFileAssociations" Margin="5,20,5,5" Click="UnregisterFileAssociations_Click">Unregister file extensions (requires elevated privileges)</Button>
|
||||
<Button Name="RemoveFromPathEnvVar" Margin="5" Click="RemoveFromPathEnvVar_Click">Remove mpv.net from Path environment variable</Button>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Window>
|
||||
57
mpv.net/WPF/SetupWindow.xaml.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using WF = System.Windows.Forms;
|
||||
|
||||
namespace mpvnet
|
||||
{
|
||||
public partial class SetupWindow : Window
|
||||
{
|
||||
public SetupWindow() => InitializeComponent();
|
||||
|
||||
void RegisterFileAssociations(string value)
|
||||
{
|
||||
using (var proc = new Process())
|
||||
{
|
||||
proc.StartInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
|
||||
proc.StartInfo.Arguments = "--reg-file-assoc " + value;
|
||||
proc.StartInfo.Verb = "runas";
|
||||
try { proc.Start(); } catch { }
|
||||
}
|
||||
}
|
||||
|
||||
private void RegisterVideo_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("video");
|
||||
private void RegisterAudio_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("audio");
|
||||
private void RegisterImage_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("image");
|
||||
private void UnregisterFileAssociations_Click(object sender, RoutedEventArgs e) => RegisterFileAssociations("unreg");
|
||||
private void ManageDefaultApps_Click(object sender, RoutedEventArgs e) => Process.Start("ms-settings:defaultapps");
|
||||
|
||||
private void AddToPathEnvVar_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string var = WF.Application.StartupPath + ";";
|
||||
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User);
|
||||
|
||||
if (path.Contains(var))
|
||||
Msg.ShowWarning("Path was already containing mpv.net.");
|
||||
else
|
||||
{
|
||||
Environment.SetEnvironmentVariable("Path", var + path, EnvironmentVariableTarget.User);
|
||||
Msg.Show("mpv.net was successfully added to Path.", (var + path).Replace(";","\n"));
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveFromPathEnvVar_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string var = WF.Application.StartupPath + ";";
|
||||
string path = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.User);
|
||||
|
||||
if (path.Contains(var))
|
||||
{
|
||||
Environment.SetEnvironmentVariable("Path", path.Replace(var, ""), EnvironmentVariableTarget.User);
|
||||
Msg.Show("mpv.net was successfully removed from Path.");
|
||||
}
|
||||
else
|
||||
Msg.ShowWarning("Path was not containing mpv.net.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
@@ -22,7 +21,7 @@ namespace mpvnet
|
||||
|
||||
Point LastCursorPosChanged;
|
||||
int LastCursorChangedTickCount;
|
||||
bool IgnoreDpiChanged = true;
|
||||
bool WasShown;
|
||||
List<string> RecentFiles;
|
||||
|
||||
public MainForm()
|
||||
@@ -50,8 +49,6 @@ namespace mpvnet
|
||||
ContextMenu.Opened += ContextMenu_Opened;
|
||||
ContextMenu.Opening += ContextMenu_Opening;
|
||||
|
||||
App.ProcessCommandLineEarly();
|
||||
|
||||
if (mp.Screen == -1) mp.Screen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen);
|
||||
int targetIndex = mp.Screen;
|
||||
Screen[] screens = Screen.AllScreens;
|
||||
@@ -75,8 +72,7 @@ namespace mpvnet
|
||||
mp.VideoSizeChanged += VideoSizeChanged;
|
||||
mp.FileLoaded += FileLoaded;
|
||||
mp.Idle += Idle;
|
||||
mp.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
||||
if (Height < FontHeight * 4) SetFormPosAndSize();
|
||||
|
||||
mp.observe_property_bool("fullscreen", PropChangeFullscreen);
|
||||
mp.observe_property_bool("ontop", PropChangeOnTop);
|
||||
mp.observe_property_bool("border", PropChangeBorder);
|
||||
@@ -84,6 +80,9 @@ namespace mpvnet
|
||||
mp.observe_property_string("aid", PropChangeAid);
|
||||
mp.observe_property_string("vid", PropChangeVid);
|
||||
mp.observe_property_int("edition", PropChangeEdition);
|
||||
|
||||
if (mp.GPUAPI != "vulkan") mp.VideoSizeAutoResetEvent.WaitOne(App.StartThreshold);
|
||||
if (Height < FontHeight * 4) SetFormPosAndSize();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -239,7 +238,7 @@ namespace mpvnet
|
||||
int autoFitHeight = Convert.ToInt32(screen.WorkingArea.Height * mp.Autofit);
|
||||
|
||||
if (mp.VideoSize.Height == 0 || mp.VideoSize.Width == 0 ||
|
||||
mp.VideoSize.Width / (float)mp.VideoSize.Height < 1.3)
|
||||
mp.VideoSize.Width / (float)mp.VideoSize.Height < App.MinimumAspectRatio)
|
||||
|
||||
mp.VideoSize = new Size((int)(autoFitHeight * (16 / 9.0)), autoFitHeight);
|
||||
|
||||
@@ -310,8 +309,11 @@ namespace mpvnet
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
if (WindowState != FormWindowState.Maximized)
|
||||
if (WindowState != FormWindowState.Maximized || FormBorderStyle != FormBorderStyle.None)
|
||||
{
|
||||
if (WindowState == FormWindowState.Maximized)
|
||||
WindowState = FormWindowState.Minimized;
|
||||
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
WindowState = FormWindowState.Maximized;
|
||||
}
|
||||
@@ -325,7 +327,7 @@ namespace mpvnet
|
||||
if (mp.Border)
|
||||
FormBorderStyle = FormBorderStyle.Sizable;
|
||||
else
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
|
||||
SetFormPosAndSize();
|
||||
}
|
||||
@@ -353,7 +355,7 @@ namespace mpvnet
|
||||
string path = item.Path.Replace("&", "&&");
|
||||
MenuItem menuItem = ContextMenu.Add(path, () => {
|
||||
try {
|
||||
mp.command_string(item.Command);
|
||||
mp.command(item.Command);
|
||||
} catch (Exception ex) {
|
||||
Msg.ShowException(ex);
|
||||
}
|
||||
@@ -367,7 +369,7 @@ namespace mpvnet
|
||||
string path = mp.get_property_string("path");
|
||||
BeginInvoke(new Action(() => {
|
||||
if (File.Exists(path) || path.Contains("://"))
|
||||
Text = Path.GetFileName(path) + " - mpv.net " + Application.ProductVersion;
|
||||
Text = path.FileName() + " - mpv.net " + Application.ProductVersion;
|
||||
else
|
||||
Text = "mpv.net " + Application.ProductVersion;
|
||||
}));
|
||||
@@ -408,21 +410,21 @@ namespace mpvnet
|
||||
case 0x0200: // WM_MOUSEMOVE
|
||||
{
|
||||
Point pos = PointToClient(Cursor.Position);
|
||||
mp.command_string($"mouse {pos.X} {pos.Y}");
|
||||
mp.command($"mouse {pos.X} {pos.Y}");
|
||||
if (CursorHelp.IsPosDifferent(LastCursorPosChanged)) CursorHelp.Show();
|
||||
}
|
||||
break;
|
||||
case 0x2a3: // WM_MOUSELEAVE
|
||||
mp.command_string("mouse 1 1"); // osc won't always auto hide
|
||||
mp.command("mouse 1 1"); // osc won't always auto hide
|
||||
break;
|
||||
case 0x203: // Native.WM.LBUTTONDBLCLK
|
||||
{
|
||||
Point pos = PointToClient(Cursor.Position);
|
||||
mp.command_string($"mouse {pos.X} {pos.Y} 0 double");
|
||||
mp.command($"mouse {pos.X} {pos.Y} 0 double");
|
||||
}
|
||||
break;
|
||||
case 0x02E0: // WM_DPICHANGED
|
||||
if (IgnoreDpiChanged) break;
|
||||
if (!WasShown) break;
|
||||
var r2 = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
||||
Native.SetWindowPos(Handle, IntPtr.Zero, r2.Left, r2.Top, r2.Width, r2.Height, 0);
|
||||
break;
|
||||
@@ -467,22 +469,6 @@ namespace mpvnet
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
|
||||
protected override void OnDragEnter(DragEventArgs e)
|
||||
{
|
||||
base.OnDragEnter(e);
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop) || e.Data.GetDataPresent(DataFormats.Text))
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
}
|
||||
|
||||
protected override void OnDragDrop(DragEventArgs e)
|
||||
{
|
||||
base.OnDragDrop(e);
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
mp.Load(e.Data.GetData(DataFormats.FileDrop) as String[], true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||
if (e.Data.GetDataPresent(DataFormats.Text))
|
||||
mp.Load(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||
}
|
||||
|
||||
void Timer_Tick(object sender, EventArgs e)
|
||||
{
|
||||
if (CursorHelp.IsPosDifferent(LastCursorPosChanged))
|
||||
@@ -521,19 +507,28 @@ namespace mpvnet
|
||||
}));
|
||||
}
|
||||
|
||||
protected override void OnLoad(EventArgs e)
|
||||
{
|
||||
base.OnLoad(e);
|
||||
if (mp.get_property_int("playlist-count") == 0) mp.ShowLogo();
|
||||
}
|
||||
|
||||
protected override void OnShown(EventArgs e)
|
||||
{
|
||||
base.OnShown(e);
|
||||
if (mp.GPUAPI == "vulkan") mp.ProcessCommandLine(false);
|
||||
var wpfColor = WPF.WPF.ThemeColor;
|
||||
Color color = Color.FromArgb(wpfColor.A, wpfColor.R, wpfColor.G, wpfColor.B);
|
||||
ToolStripRendererEx.InitColors(color, App.IsDarkMode);
|
||||
ToolStripRendererEx.InitColors(color, App.IsDarkMode, App.ThemedMenu);
|
||||
BuildMenu();
|
||||
ContextMenuStrip = ContextMenu;
|
||||
WPF.WPF.Init();
|
||||
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
||||
IgnoreDpiChanged = false;
|
||||
CheckClipboardForURL();
|
||||
Cursor.Position = new Point(Cursor.Position.X + 1, Cursor.Position.Y);
|
||||
WasShown = true;
|
||||
Task.Run(() => { mp.LoadScripts(); });
|
||||
Task.Run(() => { mp.Extension = new Extension(); });
|
||||
}
|
||||
|
||||
protected override void OnActivated(EventArgs e)
|
||||
@@ -561,8 +556,12 @@ namespace mpvnet
|
||||
}
|
||||
|
||||
RegHelp.SetObject(App.RegPath, "Recent", RecentFiles.ToArray());
|
||||
mp.commandv("quit");
|
||||
mp.ShutdownAutoResetEvent.WaitOne(3000);
|
||||
|
||||
if (mp.IsQuitNeeded)
|
||||
mp.commandv("quit");
|
||||
|
||||
if (!mp.ShutdownAutoResetEvent.WaitOne(10000))
|
||||
Msg.ShowError("Shutdown thread failed to complete within 10 seconds.");
|
||||
}
|
||||
|
||||
protected override void OnMouseDown(MouseEventArgs e)
|
||||
@@ -582,6 +581,22 @@ namespace mpvnet
|
||||
mp.commandv("quit");
|
||||
}
|
||||
|
||||
protected override void OnDragEnter(DragEventArgs e)
|
||||
{
|
||||
base.OnDragEnter(e);
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop) || e.Data.GetDataPresent(DataFormats.Text))
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
}
|
||||
|
||||
protected override void OnDragDrop(DragEventArgs e)
|
||||
{
|
||||
base.OnDragDrop(e);
|
||||
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
||||
mp.Load(e.Data.GetData(DataFormats.FileDrop) as String[], true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||
if (e.Data.GetDataPresent(DataFormats.Text))
|
||||
mp.Load(new[] { e.Data.GetData(DataFormats.Text).ToString() }, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||
}
|
||||
|
||||
protected override void OnLostFocus(EventArgs e)
|
||||
{
|
||||
base.OnLostFocus(e);
|
||||
@@ -594,8 +609,8 @@ namespace mpvnet
|
||||
|
||||
foreach (string url in App.UrlWhitelist)
|
||||
{
|
||||
if (clipboard.Contains("://") && ! clipboard.Contains("\n") &&
|
||||
! clipboard.Contains(" ") && clipboard.Contains(url.ToLower()) &&
|
||||
if (clipboard.Contains("://") && !clipboard.Contains("\n") &&
|
||||
!clipboard.Contains(" ") && clipboard.Contains(url.ToLower().Trim()) &&
|
||||
RegHelp.GetString(App.RegPath, "LastURL") != clipboard && Visible)
|
||||
{
|
||||
RegHelp.SetObject(App.RegPath, "LastURL", clipboard);
|
||||
|
||||
@@ -124,21 +124,21 @@
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
|
||||
IACoJQAA7h4AAAAAAAABACAAzhwAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
|
||||
IACoJQAA7h4AAAAAAAABACAA3x8AAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
|
||||
AAAAAAAAAAAAAAAAAAD/lAAA/5QABf+UAEH/lACe/5QA3P+UAPX/lAD1/5QA3P+UAJ7/lABB/5QABf+U
|
||||
AAAAAAAAAAAAAP+UAAD/lAAA/5QAFP+UAIn/lADr/5QA//+UAP//lAD//5QA//+UAP//lAD//5QA6/+U
|
||||
AIr/lAAU/5QAAP+UAAD/lAAA/5QAFP+UAKj/lAD+/5QA//+TAP//lgb//5oR//+aEf//lgf//5MA//+U
|
||||
AP//lAD+/5QAqf+UABT/lAAA/5QABP+UAIn/lAD+/5QA//+WBv//qDb//7po///Be///wXz//7tq//+p
|
||||
Ov//lwj//5QA//+UAP7/lACK/5QABP+UAEH/lADp/5QA//+WBv//sVD//8aK///KlP//x4z//8eN///I
|
||||
jv//x4v//7NW//+XCP//lAD//5QA6f+UAEH/lACe/5QA//+TAP//qDf//8aK///Ijv//5Mj//926///J
|
||||
kP//xov//8eM///Hi///qj7//5QA//+UAP//lACe/5QA2/+UAP//lgb//7pp///Ijv//yI3//+zZ///+
|
||||
/v//7Nn//9Ki///HjP//yI7//71v//+XCf//lAD//5QA2/+UAPT/lAD//5oR///BfP//x43//8eN///s
|
||||
2P/////////////58///373//8iP///CgP//nBb//5MA//+UAPT/lAD0/5QA//+aEf//wXv//8eN///H
|
||||
jf//7Nj/////////////9u3//9u1///Ijv//wn///5wW//+TAP//lAD0/5QA2/+UAP//lgb//7ln///I
|
||||
jv//x43//+zY///9/P//6dL//8+c///Gi///yI7//7xt//+XCP//lAD//5QA2/+UAJ3/lAD//5MA//+m
|
||||
M///xoj//8iO///iw///27T//8iO///Gi///x43//8aK//+pOf//lAD//5QA//+UAJ3/lABB/5QA6f+U
|
||||
AP//lQT//69J///GiP//ypL//8eN///Hjf//yI7//8aJ//+xT///lgb//5QA//+UAOn/lABB/5QABP+U
|
||||
AIn/lAD+/5QA//+VBP//pS///7dh//+/dv//v3f//7hj//+mMv//lgX//5QA//+UAP7/lACJ/5QABP+U
|
||||
AP//lAD+/5QAqf+UABT/lAAA/5QABP+UAIn/lAD+/5QA//+WBv//pzX//7ln///Be///wXz//7tq//+p
|
||||
Ov//lwj//5QA//+UAP7/lACK/5QABP+UAEH/lADp/5QA//+WBv//sVD//8mP///Tpv//yZH//8eM///I
|
||||
jv//x4v//7NW//+XCP//lAD//5QA6f+UAEH/lACe/5QA//+TAP//qDf//8aI///Sov//9+///+vX///T
|
||||
pP//x4z//8eM///Hi///qj7//5QA//+UAP//lACe/5QA2/+UAP//lgb//7pp///Hjf//06T///Hh///h
|
||||
wv//8eL//+TH///NmP//x43//7xv//+XCf//lAD//5QA2/+UAPT/lAD//5oR///BfP//x4z//9Ok///u
|
||||
3P//yZD//8+c///q1f//8+f//9Gh///Cf///nBb//5MA//+UAPT/lAD0/5QA//+aEf//wXv//8eM///T
|
||||
pP//7tz//8mR///Up///7tz//+rU///Nmf//wn///5wW//+TAP//lAD0/5QA2/+UAP//lgb//7ln///H
|
||||
jf//06T///Hj///lyv//8eL//9y3///Jj///x43//7xt//+XCP//lAD//5QA2/+UAJ3/lAD//5MA//+m
|
||||
M///xYf//9Gi///37///6dH//8+d///Gi///x4z//8aK//+pOf//lAD//5QA//+UAJ3/lABB/5QA6f+U
|
||||
AP//lQT//69J///IjP//06T//8mQ///HjP//yI7//8aJ//+xT///lgb//5QA//+UAOn/lABB/5QABP+U
|
||||
AIn/lAD+/5QA//+VBP//pS7//7dg//+/dv//v3f//7hj//+mMv//lgX//5QA//+UAP7/lACJ/5QABP+U
|
||||
AAD/lAAU/5QAqP+UAP7/lAD//5MA//+VBP//mQ3//5kN//+VBP//kwD//5QA//+UAP7/lACo/5QAFP+U
|
||||
AAD/lAAA/5QAAP+UABT/lACJ/5QA6/+UAP//lAD//5QA//+UAP//lAD//5QA//+UAOv/lACJ/5QAFP+U
|
||||
AAD/lAAAAAAAAAAAAAD/lAAA/5QABf+UAEH/lACe/5QA3P+UAPX/lAD1/5QA3P+UAJ7/lABB/5QABf+U
|
||||
@@ -154,26 +154,26 @@
|
||||
Of//r0r//69L//+qPP//nx///5YG//+TAP//lAD//5QA//+UAP//lADv/5QAWP+UAAD/lAAA/5QAAP+U
|
||||
ACn/lADZ/5QA//+UAP//lAD//5QA//+eG///tVz//8OC///HjP//yI7//8iO///Hjf//xIT//7dh//+g
|
||||
IP//lAH//5QA//+UAP//lAD//5QA2f+UACn/lAAA/5QAA/+UAJP/lAD//5QA//+UAP//lAD//6Mq///A
|
||||
ef//yI7//8eM///Hi///x4z//8eM///HjP//x43//8iO///Cfv//pjL//5QA//+UAP//lAD//5QA//+U
|
||||
AJP/lAAD/5QAMf+UAOL/lAD//5QA//+TAP//nhz//8B6///Ijv//x4z//9Wp///Qn///xov//8eM///H
|
||||
ef//yI///8qS///HjP//x4v//8eM///HjP//x43//8iO///Cfv//pjL//5QA//+UAP//lAD//5QA//+U
|
||||
AJP/lAAD/5QAMf+UAOL/lAD//5QA//+TAP//nhz//8B6///Hjf//0J7///Dg///ixP//zJf//8aK///H
|
||||
jP//x4z//8eM///Ijv//wn///6Ek//+TAP//lAD//5QA//+UAOL/lAAx/5QAfP+UAP3/lAD//5QA//+V
|
||||
BP//tlz//8iO///HjP//xov//+XK///48P//3br//8mR///Gi///x4z//8eM///HjP//yI7//7lm//+X
|
||||
CP//lAD//5QA//+UAP3/lAB8/5QAvf+UAP//lAD//5MA//+fHv//xIP//8eN///HjP//xov//+XK////
|
||||
/////vz//+3a///So///x4v//8eL///HjP//x4z//8WH//+iJ///kwD//5QA//+UAP//lAC8/5QA4v+U
|
||||
AP//lAD//5MA//+qO///x43//8eM///HjP//xov//+XJ///////////////////58///4cL//8uU///H
|
||||
i///x4z//8iO//+uR///kwD//5QA//+UAP//lADi/5QA8v+UAP//lAD//5MA//+vS///yI7//8eM///H
|
||||
jP//xov//+XJ/////////////////////////v7///Hi///Rof//x4v//8iO//+zVv//lAD//5QA//+U
|
||||
AP//lADy/5QA8v+UAP//lAD//5MA//+vSf//yI7//8eM///HjP//xov//+TI////////////////////
|
||||
/////fv//+rU///Om///x4v//8iO//+zVf//lAD//5QA//+UAP//lADy/5QA4v+UAP//lAD//5MA//+p
|
||||
OP//x4z//8eM///HjP//xov//+TH///////////////////16///27T//8iP///Hi///x4z//8iO//+t
|
||||
RP//kwD//5QA//+UAP//lADi/5QAvP+UAP//lAD//5MA//+eG///w4H//8eN///HjP//xov//+TH////
|
||||
/////Pn//+jQ///Om///xov//8eM///HjP//x4z//8WG//+hJP//kwD//5QA//+UAP//lAC8/5QAe/+U
|
||||
AP3/lAD//5QA//+VA///s1f//8iO///HjP//xov//+PG///16v//2bH//8iO///Gi///x4z//8eM///H
|
||||
jP//yI7//7dh//+WBv//lAD//5QA//+UAP3/lAB7/5QAMf+UAOL/lAD//5QA//+UAP//nBf//750///I
|
||||
jv//x4z//9Ki///Omv//xor//8eM///HjP//x4z//8eM///Ijv//wXr//58e//+TAP//lAD//5QA//+U
|
||||
AOL/lAAx/5QAA/+UAJL/lAD//5QA//+UAP//lAD//6Ah//++cv//yI7//8eM///Hi///x4z//8eM///H
|
||||
BP//tlz//8iO///Giv//1Kj///36///+/P//9Oj//9qz///JkP//xov//8eM///HjP//yI7//7lm//+X
|
||||
CP//lAD//5QA//+UAP3/lAB8/5QAvf+UAP//lAD//5MA//+fHv//xIP//8eN///Giv//1Kj///v3///i
|
||||
xP//7tz///z5///t2f//06T//8eM///Hi///x4z//8WH//+iJ///kwD//5QA//+UAP//lAC8/5QA4v+U
|
||||
AP//lAD//5MA//+qO///x43//8eM///Giv//1aj///v3///Vqf//yY///9y3///27P//+vT//+TH///N
|
||||
mP//x4z//8iO//+uR///kwD//5QA//+UAP//lADi/5QA8v+UAP//lAD//5MA//+vS///yI7//8eM///G
|
||||
iv//1aj///v3///Wq///xor//8aK///NmP//6dL////////w3///ypP//8iO//+zVv//lAD//5QA//+U
|
||||
AP//lADy/5QA8v+UAP//lAD//5MA//+vSf//yI7//8eM///Giv//1aj///v3///Wq///xon//8eN///W
|
||||
q///8uX///r2///hwf//yI///8iO//+zVf//lAD//5QA//+UAP//lADy/5QA4v+UAP//lAD//5MA//+p
|
||||
OP//x4z//8eM///Giv//1aj///v3///Vqf//zJb//+bL///79///8eP//9Wp///HjP//x4z//8iO//+t
|
||||
RP//kwD//5QA//+UAP//lADi/5QAvP+UAP//lAD//5MA//+eG///w4H//8eN///Giv//1Kj///v3///m
|
||||
y///8+f///r1///ixP//y5T//8aK///HjP//x4z//8WG//+hJP//kwD//5QA//+UAP//lAC8/5QAe/+U
|
||||
AP3/lAD//5QA//+VA///s1f//8iO///Giv//1Kf///36///+/f//79///9Om///HjP//x4v//8eM///H
|
||||
jP//yI7//7dh//+WBv//lAD//5QA//+UAP3/lAB7/5QAMf+UAOL/lAD//5QA//+UAP//nBf//750///H
|
||||
jf//z5z//+7d///gv///ypP//8aL///HjP//x4z//8eM///Ijv//wXr//58e//+TAP//lAD//5QA//+U
|
||||
AOL/lAAx/5QAA/+UAJL/lAD//5QA//+UAP//lAD//6Ah//++cv//yI7//8mR///HjP//x4v//8eM///H
|
||||
jP//x43//8iO///AeP//oyn//5QA//+UAP//lAD//5QA//+UAJL/lAAD/5QAAP+UACj/lADY/5QA//+U
|
||||
AP//lAD//5QA//+bFP//sVD//8F8///Giv//x43//8eN///Hi///wn7//7NW//+dGP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+bFP//sVD//8F7///Giv//x43//8eN///Hi///wn7//7NW//+dGP//lAD//5QA//+U
|
||||
AP//lAD//5QA2f+UACn/lAAA/5QAAP+UAAD/lABX/5QA7/+UAP//lAD//5QA//+UAP//lAL//5sU//+l
|
||||
Lv//qz7//6s///+mMf//nBb//5UD//+TAP//lAD//5QA//+UAP//lADv/5QAWP+UAAD/lAAAAAAAAP+U
|
||||
AAD/lAAD/5QAav+UAO//lAD//5QA//+UAP//lAD//5QA//+TAP//kwD//5MA//+TAP//lAD//5QA//+U
|
||||
@@ -202,39 +202,39 @@
|
||||
AP//lAD//5QA//+UAP//lACz/5QAEv+UAAAAAAAA/5QAAP+UAAD/lAB4/5QA/f+UAP//lAD//5QA//+U
|
||||
AP//lAD//5cI//+rPv//wHr//8eN///Ijv//x43//8eN///Hjf//x43//8iO///Hjf//wn7//65H//+Y
|
||||
DP//kwD//5QA//+UAP//lAD//5QA//+UAP3/lAB5/5QAAP+UAAD/lAAA/5QALP+UAOD/lAD//5QA//+U
|
||||
AP//lAD//5QA//+ZDv//tVr//8eL///Hjf//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+ZDv//tVr//8eL///Hjf//xov//8aL///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jf//x4z//7hk//+bFf//kwD//5QA//+UAP//lAD//5QA//+UAOD/lAAs/5QAAP+UAAD/lACH/5QA//+U
|
||||
AP//lAD//5QA//+UAP//lwj//7Va///Hjf//x4z//8eM///Lk///yZD//8aL///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+UAP//lwj//7Va///Hjf//x4z//8uU///gv///2K///8mP///Gi///x4z//8eM///H
|
||||
jP//x4z//8eM///HjP//yI7//7lm//+ZDv//lAD//5QA//+UAP//lAD//5QA//+UAIf/lAAA/5QAHv+U
|
||||
ANP/lAD//5QA//+UAP//lAD//5QA//+rQP//x4v//8eM///HjP//xor//9y2///r1f//0J///8aL///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//x43//7BO//+VAv//lAD//5QA//+UAP//lAD//5QA0/+U
|
||||
AB7/lABa/5QA9/+UAP//lAD//5QA//+UAP//nBb//8B6///Hjf//x4z//8eM///Giv//3rr////////3
|
||||
7///3rv//8qS///Gi///x4z//8eM///HjP//x4z//8eM///Hjf//w4L//6Ah//+TAP//lAD//5QA//+U
|
||||
AP//lAD3/5QAWv+UAJr/lAD//5QA//+UAP//lAD//5MA//+sQf//x43//8eM///HjP//x4z//8aK///e
|
||||
uv/////////////+/P//7tz//9Ol///HjP//x4v//8eM///HjP//x4z//8eM///Ijv//slH//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lACa/5QAyP+UAP//lAD//5QA//+UAP//lgX//7lm///Ijv//x4z//8eM///H
|
||||
jP//xor//926////////////////////////+fT//+LD///Llf//xor//8eM///HjP//x4z//8iO//+9
|
||||
ANP/lAD//5QA//+UAP//lAD//5QA//+rQP//x4v//8eM///Giv//1qr///37///9+v//69b//9Kj///H
|
||||
jP//x4v//8eM///HjP//x4z//8eM///HjP//x43//7BO//+VAv//lAD//5QA//+UAP//lAD//5QA0/+U
|
||||
AB7/lABa/5QA9/+UAP//lAD//5QA//+UAP//nBb//8B6///Hjf//x4z//8aK///Xrf///v3///79////
|
||||
/v//+fP//+PF///Nl///xor//8eM///HjP//x4z//8eM///Hjf//w4L//6Ah//+TAP//lAD//5QA//+U
|
||||
AP//lAD3/5QAWv+UAJr/lAD//5QA//+UAP//lAD//5MA//+sQf//x43//8eM///HjP//xor//9et////
|
||||
/v//7tz//+PF///69P////////To///atP//yZD//8aL///HjP//x4z//8eM///Ijv//slH//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lACa/5QAyP+UAP//lAD//5QA//+UAP//lgX//7lm///Ijv//x4z//8eM///G
|
||||
iv//163////////p0v//x4v//9Kj///s1////fv///38///s2f//06X//8eM///Hi///x4z//8iO//+9
|
||||
cv//mAv//5QA//+UAP//lAD//5QA//+UAMj/lADj/5QA//+UAP//lAD//5QA//+aEP//wHn//8eN///H
|
||||
jP//x4z//8eM///Giv//3bn//////////////////////////////v7///Hj///Wq///yI3//8eM///H
|
||||
jP//x4z//8aK///Xrf///////+nS///HjP//xov//8mP///asv//8+b////+///69P//5Mj//8yX///H
|
||||
jP//x43//8OB//+dGv//kwD//5QA//+UAP//lAD//5QA4/+UAO//lAD//5QA//+UAP//kwD//5wW///C
|
||||
f///x43//8eM///HjP//x4z//8aK///duf////////////////////////////////////////z4///k
|
||||
x///yZD//8eM///HjP//xYb//6Ah//+TAP//lAD//5QA//+UAP//lADv/5QA7/+UAP//lAD//5QA//+U
|
||||
AP//nBX//8J////Hjf//x4z//8eM///HjP//xor//924////////////////////////////////////
|
||||
////9u3//9u2///Ijv//x4z//8eM///Fhv//oCH//5MA//+UAP//lAD//5QA//+UAO//lADj/5QA//+U
|
||||
AP//lAD//5QA//+ZDv//v3f//8eN///HjP//x4z//8eM///Giv//3Lf/////////////////////////
|
||||
/////Pr//+nR///PnP//xov//8eM///HjP//x43//8OA//+dGP//kwD//5QA//+UAP//lAD//5QA4/+U
|
||||
AMj/lAD//5QA//+UAP//lAD//5UE//+4Yv//yI7//8eM///HjP//x4z//8aK///ct///////////////
|
||||
//////////Xq///asv//yI7//8aL///HjP//x4z//8eM///Ijv//vG///5cJ//+UAP//lAD//5QA//+U
|
||||
AP//lADI/5QAmv+UAP//lAD//5QA//+UAP//kwD//6o8///HjP//x4z//8eM///HjP//xor//9y3////
|
||||
//////////z5///nzv//zpr//8aL///HjP//x4z//8eM///HjP//x4z//8iO//+vS///lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAJr/lABa/5QA9/+UAP//lAD//5QA//+UAP//mhH//791///Ijv//x4z//8eM///G
|
||||
iv//27b////+///z5///2K///8iO///Hi///x4z//8eM///HjP//x4z//8eM///Hjf//wn7//54b//+T
|
||||
f///x43//8eM///HjP//xor//9et////////6dL//8eM///HjP//x4z//8aK///Llf//587///7+////
|
||||
////5cr//8eL///HjP//xYb//6Ah//+TAP//lAD//5QA//+UAP//lADv/5QA7/+UAP//lAD//5QA//+U
|
||||
AP//nBX//8J////Hjf//x4z//8eM///Giv//163////////p0v//x4z//8eM///Gi///yI7//9iw///0
|
||||
5/////////bs///WrP//x4v//8eM///Fhv//oCH//5MA//+UAP//lAD//5QA//+UAO//lADj/5QA//+U
|
||||
AP//lAD//5QA//+ZDv//v3f//8eN///HjP//x4z//8aK///Xrf///////+nS///Hi///xov//86b///o
|
||||
0P///Pr///37///q1P//z53//8eL///HjP//x43//8OA//+dGP//kwD//5QA//+UAP//lAD//5QA4/+U
|
||||
AMj/lAD//5QA//+UAP//lAD//5UE//+4Yv//yI7//8eM///HjP//xor//9et////////6dH//8iP///b
|
||||
tf//9ev////////27P//27X//8mP///Gi///x4z//8eM///Ijv//vG///5cJ//+UAP//lAD//5QA//+U
|
||||
AP//lADI/5QAmv+UAP//lAD//5QA//+UAP//kwD//6o8///HjP//x4z//8eM///Giv//163///7+///w
|
||||
4P//6tP///37///9+v//6NH//8+c///Gi///x4z//8eM///HjP//x4z//8iO//+vS///lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAJr/lABa/5QA9/+UAP//lAD//5QA//+UAP//mhH//791///Ijv//x4z//8aK///X
|
||||
rf///v3////+////////9On//9mx///Ijv//xov//8eM///HjP//x4z//8eM///Hjf//wn7//54b//+T
|
||||
AP//lAD//5QA//+UAP//lAD3/5QAWv+UAB7/lADT/5QA//+UAP//lAD//5QA//+UAP//qDf//8aI///H
|
||||
jf//x4z//8aK///Yr///5cr//82Y///Giv//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eL//+t
|
||||
jf//xor//9Wp///9+////Pj//+bM///Nmf//xov//8eM///HjP//x4z//8eM///HjP//x4z//8eL//+t
|
||||
Rf//lAH//5QA//+UAP//lAD//5QA//+UANP/lAAe/5QAAP+UAIb/lAD//5QA//+UAP//lAD//5QA//+V
|
||||
Bf//sU///8eM///Hjf//x4z//8mQ///Ijf//x4v//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
Bf//sU///8eM///HjP//ypL//967///XrP//yI3//8eL///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jf//tVv//5cJ//+UAP//lAD//5QA//+UAP//lAD//5QAhv+UAAD/lAAA/5QAK/+UAOD/lAD//5QA//+U
|
||||
AP//lAD//5QA//+XCf//sEz//8WH///Ijv//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///I
|
||||
AP//lAD//5QA//+XCf//sEz//8WH///Hjf//xov//8aL///HjP//x4z//8eM///HjP//x4z//8eM///I
|
||||
jv//xor//7RX//+ZDf//lAD//5QA//+UAP//lAD//5QA//+UAOD/lAAr/5QAAP+UAAD/lAAA/5QAd/+U
|
||||
APz/lAD//5QA//+UAP//lAD//5QA//+VBP//pjD//7xv///Giv//yI7//8iO///Ijf//yI3//8iO///I
|
||||
jv//x4v//750//+pOf//lgf//5QA//+UAP//lAD//5QA//+UAP//lAD9/5QAeP+UAAD/lAAAAAAAAP+U
|
||||
@@ -298,74 +298,74 @@
|
||||
YP//x4z//8eN///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//x4z//8eN///Hjf//vG3//58g//+UAP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
ANL/lAAf/5QAAAAAAAD/lAAA/5QAAP+UAHb/lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+T
|
||||
AP//mxX//7tr///Ijv//x4z//8eM///HjP//x4z//8eL///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
AP//mxX//7tr///Ijv//x4z//8eM///Hi///yI7//8iO///Gi///x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//yI7//8B4//+gIv//kwD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAB2/5QAAP+UAAD/lAAA/5QAGv+UANH/lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+YCv//t2D//8iO///HjP//x4z//8eM///HjP//ypL//82Z///Gi///x4z//8eM///H
|
||||
AP//lAD//5QA//+YCv//t2D//8iO///HjP//x4z//8eL///NmP//6tT//+3a///YsP//yI///8aL///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+9cP//mxX//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//lADR/5QAGv+UAAD/lAAA/5QAWf+UAPv/lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QB//+uSP//x4z//8eM///HjP//x4z//8eM///Gi///0aD///Hj///c
|
||||
uP//yZD//8aL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///I
|
||||
AP//lAD//5QA//+UAP//lAD//5QB//+uSP//x4z//8eM///HjP//x4z//8aK///btP////7////////8
|
||||
+v//69X//9Ki///HjP//x4v//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///I
|
||||
jv//tVz//5YG//+UAP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD7/5QAWf+UAAD/lAAF/5QApf+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//kwD//6Ag///DgP//x43//8eM///HjP//x4z//8eM///G
|
||||
i///0aD///v2///9/P//7Nf//9Gh///Hi///x4v//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//kwD//6Ag///DgP//x43//8eM///HjP//x4z//8aK///d
|
||||
uf////////////////////////ny///ixP//zJf//8aL///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///HjP//xoj//6cz//+TAP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QApf+U
|
||||
AAX/lAAj/5QA2/+UAP//lAD//5QA//+UAP//lAD//5QA//+UAP//lQP//7RZ///Ijv//x4z//8eM///H
|
||||
jP//x4z//8eM///Gi///0aD///v2//////////////jx///gv///ypP//8aL///HjP//x4z//8eM///H
|
||||
jP//x4z//8aK///duf/////////////9/P////7//////////v//8+f//9qz///JkP//xov//8eM///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//yI7//7xt//+YC///lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA2/+UACP/lABU/5QA9v+UAP//lAD//5QA//+UAP//lAD//5QA//+TAP//nhv//8OA///H
|
||||
jf//x4z//8eM///HjP//x4z//8eM///Gi///0aD///v2///////////////////+/f//797//9Sn///H
|
||||
jP//x4v//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8aJ//+lMP//kwD//5QA//+U
|
||||
jf//x4z//8eM///HjP//x4z//8aK///duf/////////////nz///587///v4//////////////37///s
|
||||
2P//06T//8eM///Hi///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8aJ//+lMP//kwD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA9v+UAFT/lACI/5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+T
|
||||
AP//rEH//8eN///HjP//x4z//8eM///HjP//x4z//8eM///Gi///0aD///v2////////////////////
|
||||
//////////r1///jxv//zJf//8aK///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+0
|
||||
AP//rEH//8eN///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////fvv//x4z//9ar///w
|
||||
4P///v3/////////////+fT//+TH///NmP//xov//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+0
|
||||
V///lAH//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+UAIj/lACv/5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+VA///t2D//8iO///HjP//x4z//8eM///HjP//x4z//8eM///Gi///0J////r1////
|
||||
/////////////////////////////////v//8uX//9iu///Ijv//xov//8eM///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+VA///t2D//8iO///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////g
|
||||
v///xor//8aK///Kk///3rv///bt///////////////+///06f//27b//8mR///Gi///x4z//8eM///H
|
||||
jP//x4z//8iO//++c///mAz//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+UAK//lADP/5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+YDP//vnT//8iN///HjP//x4z//8eM///HjP//x4z//8eM///G
|
||||
i///0J7///r1//////////////////////////////////////////////z4///nzv//zpv//8aL///H
|
||||
jP//x4z//8eM///HjP//x4z//8eN///Dgv//nhv//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+YDP//vnT//8iN///HjP//x4z//8eM///HjP//x4z//8aK///d
|
||||
uf/////////////gv///xor//8eM///Hi///xov//8+c///mzf//+/f//////////////fv//+3a///U
|
||||
pv//x43//8eM///HjP//x4z//8eN///Dgv//nhv//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AM//lADf/5QA//+UAP//lAD//5QA//+UAP//lAD//5MA//+cF///wn///8eN///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///Gi///0J7///r1////////////////////////////////////////////////////
|
||||
////9ev//9u1///JkP//x4z//8eM///HjP//x4z//8eM///Gif//oyn//5MA//+UAP//lAD//5QA//+U
|
||||
jP//x4z//8aK///duf/////////////gv///xor//8eM///HjP//x4z//8aL///Hjf//1an//+7d///9
|
||||
/P/////////////69f//4MD//8iO///HjP//x4z//8eM///Gif//oyn//5MA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAN//lADp/5QA//+UAP//lAD//5QA//+UAP//lAD//5MA//+dGf//w4H//8eN///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///Gi///0J7///r1////////////////////////////////////
|
||||
//////////////////////////38///p0f//y5T//8eM///HjP//x4z//8eM///Gif//pCv//5MA//+U
|
||||
jP//x4z//8eM///HjP//x4z//8aK///duf/////////////gv///xor//8eM///HjP//x4z//8eM///H
|
||||
jP//xor//8mR///my////v7/////////////9u3//8yX///Hi///x4z//8eM///Gif//pCv//5MA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAOn/lADp/5QA//+UAP//lAD//5QA//+UAP//lAD//5MA//+d
|
||||
Gf//w4H//8eN///HjP//x4z//8eM///HjP//x4z//8eM///Gi///0J7///r1////////////////////
|
||||
//////////////////////////////////////////bs///ct///yY///8eM///HjP//x4z//8eM///G
|
||||
Gf//w4H//8eN///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////gv///xor//8eM///H
|
||||
jP//x4z//8eM///Gi///ypH//967///37v/////////////8+v//48b//8iP///HjP//x4z//8eM///G
|
||||
if//pCz//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+UAOn/lADf/5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+bFP//wX3//8eN///HjP//x4z//8eM///HjP//x4z//8eM///Gi///z53///n0////
|
||||
///////////////////////////////////////////////8+v//6dH//8+c///Gi///x4z//8eM///H
|
||||
AP//lAD//5QA//+bFP//wX3//8eN///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////g
|
||||
v///xor//8eM///HjP//x4v//8eL///So///7dr///78//////////////bt///atP//yI7//8eM///H
|
||||
jP//x4z//8eM///FiP//oif//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+UAN//lADP/5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+YCv//vXH//8iO///HjP//x4z//8eM///HjP//x4z//8eM///G
|
||||
i///z5z///nz//////////////////////////////////////////////Tp///asv//yI7//8aL///H
|
||||
jP//x4z//8eM///HjP//x4z//8eN///DgP//nRj//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+YCv//vXH//8iO///HjP//x4z//8eM///HjP//x4z//8aK///d
|
||||
uf/////////////gv///xor//8eM///Gi///ypP//+C////58v/////////////9+///6tT//8+d///G
|
||||
i///x4z//8eM///HjP//x4z//8eN///DgP//nRj//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AM//lACv/5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+VAv//tVv//8iO///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///Gi///z5z///nz///////////////////////////////////8+f//587//86a///G
|
||||
i///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+8bv//lwn//5QA//+UAP//lAD//5QA//+U
|
||||
jP//x4z//8aK///duf/////////////gv///xon//8eM///Upv//797///79//////////////Xr///b
|
||||
tf//yY///8aL///HjP//x4z//8eM///HjP//x4z//8iO//+8bv//lwn//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAK//lACI/5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+TAP//qTr//8eM///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///Gi///z5z///nz//////////////////////////7///Pn///Y
|
||||
r///yI7//8eL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+xUP//lAD//5QA//+U
|
||||
jP//x4z//8eM///HjP//x4z//8aK///duf/////////////fvv//ypP//+LE///69P/////////////8
|
||||
+f//6ND//8+c///Gi///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+xUP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAIj/lABU/5QA9v+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//mxX//8F7///Hjf//x4z//8eM///HjP//x4z//8eM///Hi///z5z///nz///////////////////7
|
||||
9///5cr//82Y///Gi///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8WG//+i
|
||||
AP//mxX//8F7///Hjf//x4z//8eM///HjP//x4z//8aK///duf/////////////s2P//8OD///7+////
|
||||
//////////To///Zsf//yI7//8aL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8WG//+i
|
||||
Jv//kwD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA9v+UAFT/lAAj/5QA2v+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAH//7BO///Ijf//x4z//8eM///HjP//x4z//8eM///Hi///zpv///jy////
|
||||
//////7///Lk///WrP//x43//8eL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+UAP//lAH//7BO///Ijf//x4z//8eM///HjP//x4z//8aK///duf//////////////
|
||||
/v/////////////7+P//5sz//82Z///Gi///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//yI7//7hj//+WB///lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA2v+UACP/lAAF/5QApf+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5wX///Aef//yI3//8eM///HjP//x4z//8eM///H
|
||||
i///zpv///ny///79v//48f//8yW///Giv//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5wX///Aef//yI3//8eM///HjP//x4z//8aK///d
|
||||
uf////////////////////7///Ll///Xrf//yI3//8eL///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///Hjf//xIT//6Io//+TAP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QApP+U
|
||||
AAX/lAAA/5QAWf+UAPv/lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+pOv//xon//8eN///H
|
||||
jP//x4z//8eM///Hi///zpr//+rU///Vqf//x4z//8eL///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//x4z//8aK///Zsv///v3////////79v//5Mj//8yX///Giv//x4z//8eM///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//sE7//5UD//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD7/5QAWf+UAAD/lAAA/5QAGv+UANH/lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5QA//+W
|
||||
Bf//sU///8eM///HjP//x4z//8eM///HjP//yI7//8mR///Gi///x4z//8eM///HjP//x4z//8eM///H
|
||||
Bf//sU///8eM///HjP//x4z//8eL///LlP//5cv//+zX///Vqv//x4z//8eL///HjP//x4z//8eM///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+3Yf//mAz//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lADR/5QAGv+UAAD/lAAA/5QAAP+UAHb/lAD//5QA//+UAP//lAD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//mAv//7Va///Hi///x43//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
||||
AP//lAD//5QA//+UAP//mAv//7Va///Hi///x43//8eM///HjP//x4z//8iN///Gi///x4z//8eM///H
|
||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x43//7pp//+bFf//kwD//5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP7/lAB2/5QAAP+UAAAAAAAA/5QAAP+UAB//lADR/5QA//+U
|
||||
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5cJ//+wTP//xYb//8iO///HjP//x4z//8eM///H
|
||||
@@ -416,129 +416,142 @@
|
||||
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
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -131,8 +131,6 @@ public class MenuItem : ToolStripMenuItem
|
||||
|
||||
public class ToolStripRendererEx : ToolStripSystemRenderer
|
||||
{
|
||||
public static bool IsDarkMode { get; set; }
|
||||
|
||||
public static Color ColorForeground { get; set; } = Color.Black;
|
||||
public static Color ColorTheme { get; set; }
|
||||
public static Color ColorChecked { get; set; }
|
||||
@@ -141,34 +139,33 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
||||
public static Color ColorSelection { get; set; }
|
||||
public static Color ColorBackground { get; set; }
|
||||
|
||||
public static Color ColorToolStrip1 { get; set; }
|
||||
public static Color ColorToolStrip2 { get; set; }
|
||||
public static Color ColorToolStrip3 { get; set; }
|
||||
public static Color ColorToolStrip4 { get; set; }
|
||||
|
||||
int TextOffset;
|
||||
|
||||
public static void InitColors(Color c, bool darkMode)
|
||||
public static void InitColors(Color themeColor, bool darkMode, bool themed)
|
||||
{
|
||||
ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100);
|
||||
ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(160);
|
||||
ColorSelection = HSLColor.Convert(c).ToColorSetLuminosity(180);
|
||||
ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(210);
|
||||
ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240);
|
||||
|
||||
if (darkMode)
|
||||
{
|
||||
ColorBorder = Color.White;
|
||||
ColorBackground = Color.FromArgb(50, 50, 50);
|
||||
ColorSelection = Color.FromArgb(80, 80, 80);
|
||||
ColorForeground = Color.White;
|
||||
|
||||
if (themed)
|
||||
ColorForeground = themeColor;
|
||||
else
|
||||
ColorForeground = Color.White;
|
||||
|
||||
ColorChecked = Color.FromArgb(90, 90, 90);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!themed) themeColor = Color.FromArgb(238, 238, 238);
|
||||
|
||||
ColorToolStrip1 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 1)));
|
||||
ColorToolStrip2 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.7f)));
|
||||
ColorToolStrip3 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.1f)));
|
||||
ColorToolStrip4 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.4f)));
|
||||
ColorBorder = HSLColor.Convert(themeColor).ToColorSetLuminosity(100);
|
||||
ColorChecked = HSLColor.Convert(themeColor).ToColorSetLuminosity(160);
|
||||
ColorSelection = HSLColor.Convert(themeColor).ToColorSetLuminosity(180);
|
||||
ColorBackground = HSLColor.Convert(themeColor).ToColorSetLuminosity(210);
|
||||
ColorTop = HSLColor.Convert(themeColor).ToColorSetLuminosity(240);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
|
||||
@@ -200,17 +197,6 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
||||
base.OnRenderItemText(e);
|
||||
}
|
||||
|
||||
protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
|
||||
{
|
||||
if (!(e.ToolStrip is ToolStripDropDownMenu) && !(e.ToolStrip.LayoutStyle == ToolStripLayoutStyle.VerticalStackWithOverflow))
|
||||
{
|
||||
Rectangle r = new Rectangle(-1, -1, e.AffectedBounds.Width, e.AffectedBounds.Height);
|
||||
|
||||
using (SolidBrush b = new SolidBrush(ColorToolStrip2))
|
||||
e.Graphics.FillRectangle(b, r);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
|
||||
{
|
||||
Rectangle rect = new Rectangle(Point.Empty, e.Item.Size);
|
||||
|
||||
@@ -14,29 +14,6 @@
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
<GenerateSerializationAssemblies>On</GenerateSerializationAssemblies>
|
||||
<LangVersion>7.3</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup />
|
||||
<PropertyGroup />
|
||||
<PropertyGroup>
|
||||
@@ -137,11 +114,16 @@
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Misc\Addon.cs" />
|
||||
<Compile Include="Misc\App.cs" />
|
||||
<Compile Include="Misc\Extension.cs" />
|
||||
<Page Include="Controls\SearchTextBoxUserControl.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="WPF\SetupWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Include="WPF\AboutWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
@@ -169,6 +151,7 @@
|
||||
<DependentUpon>StringSettingControl.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="DynamicGUI\Tommy.cs" />
|
||||
<Compile Include="Misc\ExtensionMethods.cs" />
|
||||
<Compile Include="Native\MediaInfo.cs" />
|
||||
<Compile Include="WinForms\Menu.cs">
|
||||
<SubType>Component</SubType>
|
||||
@@ -195,6 +178,9 @@
|
||||
<Compile Include="Misc\Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Native\TaskDialog.cs" />
|
||||
<Compile Include="WPF\SetupWindow.xaml.cs">
|
||||
<DependentUpon>SetupWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="WPF\EverythingWindow.xaml.cs">
|
||||
<DependentUpon>EverythingWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
@@ -253,7 +239,9 @@
|
||||
<Content Include="mpvnet.ico" />
|
||||
<Content Include="Resources\mpvConf.txt" />
|
||||
<Content Include="Resources\mpvConfToml.txt" />
|
||||
<None Include="Resources\mpvnet.ico" />
|
||||
<None Include="Resources\mpvnet.png" />
|
||||
<None Include="Resources\mpvNetConf.txt" />
|
||||
<Content Include="Resources\mpvNetConfToml.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -54,29 +54,34 @@ namespace mpvnet
|
||||
public static event Action QueueOverflow; // MPV_EVENT_QUEUE_OVERFLOW
|
||||
public static event Action Hook; // MPV_EVENT_HOOK
|
||||
|
||||
public static IntPtr Handle { get; set; }
|
||||
public static IntPtr WindowHandle { get; set; }
|
||||
public static Addon Addon { get; set; }
|
||||
public static bool IsLogoVisible { set; get; }
|
||||
public static event Action Initialized;
|
||||
|
||||
public static List<KeyValuePair<string, Action<bool>>> BoolPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<bool>>>();
|
||||
public static List<KeyValuePair<string, Action<int>>> IntPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<int>>>();
|
||||
public static List<KeyValuePair<string, Action<string>>> StringPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<string>>>();
|
||||
public static Size VideoSize { get; set; }
|
||||
public static List<PythonScript> PythonScripts { get; set; } = new List<PythonScript>();
|
||||
public static AutoResetEvent ShutdownAutoResetEvent { get; set; } = new AutoResetEvent(false);
|
||||
public static AutoResetEvent VideoSizeAutoResetEvent { get; set; } = new AutoResetEvent(false);
|
||||
public static List<MediaTrack> MediaTracks { get; set; } = new List<MediaTrack>();
|
||||
public static List<KeyValuePair<string, double>> Chapters { get; set; } = new List<KeyValuePair<string, double>>();
|
||||
|
||||
public static IntPtr Handle { get; set; }
|
||||
public static IntPtr WindowHandle { get; set; }
|
||||
public static Extension Extension { get; set; }
|
||||
public static List<PythonScript> PythonScripts { get; set; } = new List<PythonScript>();
|
||||
public static Size VideoSize { get; set; }
|
||||
public static AutoResetEvent ShutdownAutoResetEvent { get; set; } = new AutoResetEvent(false);
|
||||
public static AutoResetEvent VideoSizeAutoResetEvent { get; set; } = new AutoResetEvent(false);
|
||||
|
||||
public static string InputConfPath { get; } = ConfigFolder + "\\input.conf";
|
||||
public static string ConfPath { get; } = ConfigFolder + "\\mpv.conf";
|
||||
public static string Sid { get; set; } = "";
|
||||
public static string Aid { get; set; } = "";
|
||||
public static string Vid { get; set; } = "";
|
||||
public static string GPUAPI { get; set; } = "auto";
|
||||
|
||||
public static bool IsLogoVisible { set; get; }
|
||||
public static bool IsQuitNeeded { set; get; } = true;
|
||||
public static bool Fullscreen { get; set; }
|
||||
public static bool Border { get; set; } = true;
|
||||
|
||||
|
||||
public static int Screen { get; set; } = -1;
|
||||
public static int Edition { get; set; }
|
||||
|
||||
@@ -88,22 +93,33 @@ namespace mpvnet
|
||||
{
|
||||
LoadLibrary("mpv-1.dll");
|
||||
Handle = mpv_create();
|
||||
set_property_string("config-dir", ConfigFolder);
|
||||
set_property_string("osc", "yes");
|
||||
set_property_string("config", "yes");
|
||||
Task.Run(() => { EventLoop(); });
|
||||
|
||||
if (App.IsStartedFromTerminal)
|
||||
{
|
||||
set_property_string("terminal", "yes");
|
||||
set_property_string("input-terminal", "yes");
|
||||
set_property_string("msg-level", "osd/libass=fatal");
|
||||
}
|
||||
|
||||
set_property_string("wid", MainForm.Hwnd.ToString());
|
||||
set_property_string("osc", "yes");
|
||||
set_property_string("force-window", "yes");
|
||||
set_property_string("input-media-keys", "yes");
|
||||
set_property_string("config-dir", ConfigFolder);
|
||||
set_property_string("config", "yes");
|
||||
|
||||
ProcessCommandLine(true);
|
||||
mpv_initialize(Handle);
|
||||
ShowLogo();
|
||||
ProcessCommandLine();
|
||||
Task.Run(() => { LoadScripts(); });
|
||||
Task.Run(() => { Addon = new Addon(); });
|
||||
Task.Run(() => { EventLoop(); });
|
||||
Initialized?.Invoke();
|
||||
LoadMpvScripts();
|
||||
if (GPUAPI != "vulkan") ProcessCommandLine(false);
|
||||
}
|
||||
|
||||
public static void ProcessProperty(string name, string value)
|
||||
{
|
||||
if (name.Any(char.IsUpper)) Msg.ShowError("Uppercase char detected: " + name, "mpv properties using the command line and the mpv.conf config file are required to be lowercase.");
|
||||
|
||||
switch (name)
|
||||
{
|
||||
case "autofit":
|
||||
@@ -122,6 +138,7 @@ namespace mpvnet
|
||||
case "fullscreen": Fullscreen = value == "yes"; break;
|
||||
case "border": Border = value == "yes"; break;
|
||||
case "screen": Screen = Convert.ToInt32(value); break;
|
||||
case "gpu-api": GPUAPI = value; break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,17 +148,16 @@ namespace mpvnet
|
||||
get {
|
||||
if (_ConfigFolder == null)
|
||||
{
|
||||
_ConfigFolder = Application.StartupPath + "\\portable_config\\";
|
||||
string portableFolder = PathHelp.StartupPath + "portable_config\\";
|
||||
_ConfigFolder = portableFolder;
|
||||
|
||||
if (!Directory.Exists(_ConfigFolder))
|
||||
_ConfigFolder = RegHelp.GetString(App.RegPath, "ConfigFolder");
|
||||
|
||||
if (!Directory.Exists(_ConfigFolder))
|
||||
{
|
||||
string portableFolder = Application.StartupPath + "\\portable_config\\";
|
||||
string appdataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv.net\\";
|
||||
string appdataFolderMpv = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
||||
string startupFolder = Application.StartupPath + "\\";
|
||||
|
||||
using (TaskDialog<string> td = new TaskDialog<string>())
|
||||
{
|
||||
@@ -149,17 +165,22 @@ namespace mpvnet
|
||||
td.AddCommandLink(@"AppData\Roaming\mpv.net", appdataFolder, appdataFolder);
|
||||
td.AddCommandLink(@"AppData\Roaming\mpv", appdataFolderMpv, appdataFolderMpv);
|
||||
td.AddCommandLink("<startup>\\portable_config", portableFolder, portableFolder);
|
||||
td.AddCommandLink("<startup>", startupFolder, startupFolder);
|
||||
td.AddCommandLink("Choose custom folder", "custom");
|
||||
td.AllowCancel = false;
|
||||
_ConfigFolder = td.Show();
|
||||
}
|
||||
|
||||
if (_ConfigFolder == null)
|
||||
{
|
||||
_ConfigFolder = "";
|
||||
return "";
|
||||
}
|
||||
|
||||
if (_ConfigFolder == "custom")
|
||||
{
|
||||
using (var d = new WinForms.FolderBrowserDialog())
|
||||
{
|
||||
d.Description = "Choose a folder.";
|
||||
|
||||
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
||||
_ConfigFolder = d.SelectedPath + "\\";
|
||||
else
|
||||
@@ -168,6 +189,12 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
if (PathHelp.StartupPath == _ConfigFolder)
|
||||
{
|
||||
Msg.ShowError("Startup folder and config folder cannot be identical, using portable_config instead.");
|
||||
_ConfigFolder = portableFolder;
|
||||
}
|
||||
|
||||
if (!Directory.Exists(_ConfigFolder))
|
||||
Directory.CreateDirectory(_ConfigFolder);
|
||||
|
||||
@@ -179,6 +206,9 @@ namespace mpvnet
|
||||
|
||||
if (!File.Exists(_ConfigFolder + "\\mpv.conf"))
|
||||
File.WriteAllText(_ConfigFolder + "\\mpv.conf", Properties.Resources.mpvConf);
|
||||
|
||||
if (!File.Exists(_ConfigFolder + "\\mpvnet.conf"))
|
||||
File.WriteAllText(_ConfigFolder + "\\mpvnet.conf", Properties.Resources.mpvNetConf);
|
||||
}
|
||||
return _ConfigFolder;
|
||||
}
|
||||
@@ -194,41 +224,53 @@ namespace mpvnet
|
||||
|
||||
if (File.Exists(ConfPath))
|
||||
foreach (var i in File.ReadAllLines(ConfPath))
|
||||
if (i.Contains("=") && ! i.StartsWith("#"))
|
||||
if (i.Contains("=") && !i.TrimStart().StartsWith("#"))
|
||||
_Conf[i.Substring(0, i.IndexOf("=")).Trim()] = i.Substring(i.IndexOf("=") + 1).Trim();
|
||||
|
||||
foreach (var i in Conf)
|
||||
foreach (var i in _Conf)
|
||||
ProcessProperty(i.Key, i.Value);
|
||||
}
|
||||
return _Conf;
|
||||
}
|
||||
}
|
||||
|
||||
public static void LoadMpvScripts()
|
||||
{
|
||||
if (Directory.Exists(PathHelp.StartupPath + "Scripts"))
|
||||
{
|
||||
string[] startupScripts = Directory.GetFiles(PathHelp.StartupPath + "Scripts");
|
||||
|
||||
foreach (string path in startupScripts)
|
||||
if ((path.EndsWith(".lua") || path.EndsWith(".js")) && KnownScripts.Contains(Path.GetFileName(path)))
|
||||
commandv("load-script", $"{path}");
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] KnownScripts { get; } = { "osc-visibility.js", "show-playlist.js", "seek-show-position.py", "repl.lua" };
|
||||
|
||||
public static void LoadScripts()
|
||||
{
|
||||
|
||||
if (Directory.Exists(Application.StartupPath + "\\Scripts"))
|
||||
if (Directory.Exists(PathHelp.StartupPath + "Scripts"))
|
||||
{
|
||||
string[] startupScripts = Directory.GetFiles(Application.StartupPath + "\\Scripts");
|
||||
|
||||
foreach (string scriptPath in startupScripts)
|
||||
if (scriptPath.EndsWith(".lua") || scriptPath.EndsWith(".js"))
|
||||
commandv("load-script", $"{scriptPath}");
|
||||
|
||||
foreach (string scriptPath in startupScripts)
|
||||
if (Path.GetExtension(scriptPath) == ".py")
|
||||
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
||||
|
||||
foreach (string scriptPath in startupScripts)
|
||||
if (Path.GetExtension(scriptPath) == ".ps1")
|
||||
PowerShellScript.Init(scriptPath);
|
||||
foreach (string path in Directory.GetFiles(PathHelp.StartupPath + "Scripts"))
|
||||
{
|
||||
if (KnownScripts.Contains(Path.GetFileName(path)))
|
||||
{
|
||||
if (path.EndsWith(".py"))
|
||||
PythonScripts.Add(new PythonScript(File.ReadAllText(path)));
|
||||
else if (path.EndsWith(".ps1"))
|
||||
PowerShellScript.Init(path);
|
||||
}
|
||||
else
|
||||
Msg.ShowError("Failed to load script", path + "\n\nOnly scripts that ship with mpv.net are allowed in <startup>\\scripts\n\nUser scripts have to use <config folder>\\scripts\n\nNever copy or install a new mpv.net version over a old mpv.net version.");
|
||||
}
|
||||
}
|
||||
|
||||
if (Directory.Exists(ConfigFolder + "Scripts"))
|
||||
foreach (string scriptPath in Directory.GetFiles(ConfigFolder + "Scripts"))
|
||||
if (Path.GetExtension(scriptPath) == ".py")
|
||||
if (scriptPath.EndsWith(".py"))
|
||||
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
||||
else if (Path.GetExtension(scriptPath) == ".ps1")
|
||||
else if (scriptPath.EndsWith(".ps1"))
|
||||
PowerShellScript.Init(scriptPath);
|
||||
}
|
||||
|
||||
@@ -249,9 +291,8 @@ namespace mpvnet
|
||||
switch (evt.event_id)
|
||||
{
|
||||
case mpv_event_id.MPV_EVENT_SHUTDOWN:
|
||||
if (App.DebugMode) Trace.WriteLine("before Shutdown.Invoke");
|
||||
IsQuitNeeded = false;
|
||||
Shutdown?.Invoke();
|
||||
if (App.DebugMode) Trace.WriteLine("after Shutdown.Invoke");
|
||||
WriteHistory(null);
|
||||
ShutdownAutoResetEvent.Set();
|
||||
return;
|
||||
@@ -429,7 +470,7 @@ namespace mpvnet
|
||||
Marshal.FreeHGlobal(mainPtr);
|
||||
}
|
||||
|
||||
public static void command_string(string command, bool throwException = false)
|
||||
public static void command(string command, bool throwException = false)
|
||||
{
|
||||
if (Handle == IntPtr.Zero) return;
|
||||
int err = mpv_command_string(Handle, command);
|
||||
@@ -493,16 +534,6 @@ namespace mpvnet
|
||||
return val;
|
||||
}
|
||||
|
||||
public static bool get_property_bool(string name, bool throwOnException = false)
|
||||
{
|
||||
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_FLAG, out IntPtr lpBuffer);
|
||||
|
||||
if (err < 0 && throwOnException)
|
||||
throw new Exception($"{name}: {(mpv_error)err}");
|
||||
else
|
||||
return lpBuffer.ToInt32() == 1;
|
||||
}
|
||||
|
||||
public static void set_property_int(string name, int value, bool throwOnException = false)
|
||||
{
|
||||
Int64 val = value;
|
||||
@@ -540,42 +571,41 @@ namespace mpvnet
|
||||
StringPropChangeActions.Add(new KeyValuePair<string, Action<string>>(name, action));
|
||||
}
|
||||
|
||||
protected static void ProcessCommandLine()
|
||||
public static void ProcessCommandLine(bool preInit)
|
||||
{
|
||||
var args = Environment.GetCommandLineArgs().Skip(1);
|
||||
List<string> files = new List<string>();
|
||||
|
||||
//Msg.Show(string.Join("\n", args));
|
||||
|
||||
string[] preInitProperties = { "input-terminal", "terminal", "input-file", "config", "config-dir", "input-conf", "load-scripts", "scripts", "player-operation-mode" };
|
||||
|
||||
foreach (string i in args)
|
||||
{
|
||||
if (!i.StartsWith("--") && (i == "-" || i.Contains("://") || File.Exists(i)))
|
||||
{
|
||||
files.Add(i);
|
||||
if (i.Contains("://")) RegHelp.SetObject(App.RegPath, "LastURL", i);
|
||||
}
|
||||
}
|
||||
string arg = i;
|
||||
|
||||
Load(files.ToArray(), App.ProcessInstance != "queue", Control.ModifierKeys.HasFlag(Keys.Control));
|
||||
|
||||
if (files.Count == 0 || files[0].Contains("://"))
|
||||
{
|
||||
VideoSizeAutoResetEvent.Set();
|
||||
VideoSizeChanged?.Invoke();
|
||||
}
|
||||
|
||||
foreach (string i in args)
|
||||
{
|
||||
if (i.StartsWith("--"))
|
||||
if (arg.StartsWith("--"))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (i.Contains("="))
|
||||
if (!arg.Contains("=")) arg += "=yes";
|
||||
|
||||
string left = arg.Substring(2, arg.IndexOf("=") - 2);
|
||||
string right = arg.Substring(left.Length + 3);
|
||||
|
||||
if (left == "script") left = "scripts";
|
||||
|
||||
if (preInit && preInitProperties.Contains(left))
|
||||
{
|
||||
string left = i.Substring(2, i.IndexOf("=") - 2);
|
||||
string right = i.Substring(left.Length + 3);
|
||||
set_property_string(left, right, true);
|
||||
mp.ProcessProperty(left, right);
|
||||
if (!App.ProcessProperty(left, right))
|
||||
set_property_string(left, right, true);
|
||||
}
|
||||
else if (!preInit && !preInitProperties.Contains(left))
|
||||
{
|
||||
mp.ProcessProperty(left, right);
|
||||
if (!App.ProcessProperty(left, right))
|
||||
set_property_string(left, right, true);
|
||||
}
|
||||
else
|
||||
set_property_string(i.Substring(2), "yes", true);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -583,6 +613,28 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!preInit)
|
||||
{
|
||||
List<string> files = new List<string>();
|
||||
|
||||
foreach (string i in args)
|
||||
{
|
||||
if (!i.StartsWith("--") && (i == "-" || i.Contains("://") || File.Exists(i)))
|
||||
{
|
||||
files.Add(i);
|
||||
if (i.Contains("://")) RegHelp.SetObject(App.RegPath, "LastURL", i);
|
||||
}
|
||||
}
|
||||
|
||||
Load(files.ToArray(), App.ProcessInstance != "queue", Control.ModifierKeys.HasFlag(Keys.Control));
|
||||
|
||||
if (files.Count == 0 || files[0].Contains("://"))
|
||||
{
|
||||
VideoSizeAutoResetEvent.Set();
|
||||
VideoSizeChanged?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static DateTime LastLoad;
|
||||
@@ -598,7 +650,7 @@ namespace mpvnet
|
||||
LastLoad = DateTime.Now;
|
||||
|
||||
for (int i = 0; i < files.Length; i++)
|
||||
if (App.SubtitleTypes.Contains(Path.GetExtension(files[i]).TrimStart('.').ToLower()))
|
||||
if (App.SubtitleTypes.Contains(files[i].ShortExt()))
|
||||
commandv("sub-add", files[i]);
|
||||
else
|
||||
if (i == 0 && !append)
|
||||
@@ -614,14 +666,15 @@ namespace mpvnet
|
||||
|
||||
public static void LoadFolder()
|
||||
{
|
||||
if (!App.AutoLoadFolder) return;
|
||||
Thread.Sleep(200); // user reported race condition
|
||||
string path = get_property_string("path");
|
||||
if (!File.Exists(path) || get_property_int("playlist-count") != 1) return;
|
||||
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
||||
files = files.Where((file) =>
|
||||
App.VideoTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower()) ||
|
||||
App.AudioTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower()) ||
|
||||
App.ImageTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower())).ToList();
|
||||
App.VideoTypes.Contains(file.ShortExt()) ||
|
||||
App.AudioTypes.Contains(file.ShortExt()) ||
|
||||
App.ImageTypes.Contains(file.ShortExt())).ToList();
|
||||
files.Sort(new StringLogicalComparer());
|
||||
int index = files.IndexOf(path);
|
||||
files.Remove(path);
|
||||
@@ -630,7 +683,7 @@ namespace mpvnet
|
||||
if (index > 0) commandv("playlist-move", "0", (index + 1).ToString());
|
||||
}
|
||||
|
||||
static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers)
|
||||
public static IntPtr AllocateUtf8IntPtrArrayWithSentinel(string[] arr, out IntPtr[] byteArrayPointers)
|
||||
{
|
||||
int numberOfStrings = arr.Length + 1; // add extra element for extra null pointer last (sentinel)
|
||||
byteArrayPointers = new IntPtr[numberOfStrings];
|
||||
@@ -648,7 +701,7 @@ namespace mpvnet
|
||||
return rootPointer;
|
||||
}
|
||||
|
||||
static string[] NativeUtf8StrArray2ManagedStrArray(IntPtr unmanagedStringArray, int StringCount)
|
||||
public static string[] NativeUtf8StrArray2ManagedStrArray(IntPtr unmanagedStringArray, int StringCount)
|
||||
{
|
||||
IntPtr[] intPtrArray = new IntPtr[StringCount];
|
||||
string[] stringArray = new string[StringCount];
|
||||
@@ -660,7 +713,7 @@ namespace mpvnet
|
||||
return stringArray;
|
||||
}
|
||||
|
||||
static string StringFromNativeUtf8(IntPtr nativeUtf8)
|
||||
public static string StringFromNativeUtf8(IntPtr nativeUtf8)
|
||||
{
|
||||
int len = 0;
|
||||
while (Marshal.ReadByte(nativeUtf8, len) != 0) ++len;
|
||||
@@ -669,7 +722,7 @@ namespace mpvnet
|
||||
return Encoding.UTF8.GetString(buffer);
|
||||
}
|
||||
|
||||
static byte[] GetUtf8Bytes(string s) => Encoding.UTF8.GetBytes(s + "\0");
|
||||
public static byte[] GetUtf8Bytes(string s) => Encoding.UTF8.GetBytes(s + "\0");
|
||||
|
||||
static string LastHistoryPath;
|
||||
static DateTime LastHistoryStartDateTime;
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |