Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d391e24784 | ||
|
|
430fef0ac4 | ||
|
|
8430842679 | ||
|
|
9d37e67901 | ||
|
|
e98ff53058 | ||
|
|
b47d3c34f2 | ||
|
|
54dd261df0 | ||
|
|
8eb7e41d16 | ||
|
|
2068bfb6fa | ||
|
|
dfc1ac712e | ||
|
|
d96587cb7b | ||
|
|
005550af55 | ||
|
|
543e2905cc | ||
|
|
a49b9bea61 | ||
|
|
9ea9cb2757 | ||
|
|
5543381a14 | ||
|
|
cd6dcf4640 | ||
|
|
d321ab477f | ||
|
|
1cd0f87278 | ||
|
|
936274fc3b | ||
|
|
2bbaa30322 | ||
|
|
cedd54d64d | ||
|
|
38604459a6 | ||
|
|
0a48a0dc6f | ||
|
|
85a23fbae1 | ||
|
|
01da76bdc4 | ||
|
|
1f1553e159 | ||
|
|
2af84941ca | ||
|
|
a82f558acf | ||
|
|
d13f7201ba | ||
|
|
89aa0c6133 | ||
|
|
1699467e0d | ||
|
|
7a27ab0513 | ||
|
|
2a0c68e4ec | ||
|
|
91c42d4d3f | ||
|
|
49d56166d7 | ||
|
|
1ac603b904 | ||
|
|
d5b2923c68 | ||
|
|
b80b375df1 | ||
|
|
2b2b60b90f | ||
|
|
3977283ecb | ||
|
|
d27778775d | ||
|
|
5c053bb5eb | ||
|
|
83658aa476 | ||
|
|
e0111b6f12 | ||
|
|
e308bbf928 | ||
|
|
1817fbc0fd | ||
|
|
3b149aea54 | ||
|
|
7575a2d736 | ||
|
|
17c198e711 | ||
|
|
1f8635e9c4 | ||
|
|
37e6c198a1 | ||
|
|
751c8779f4 | ||
|
|
9e2bf46636 | ||
|
|
3529323d93 | ||
|
|
ba52c1f8b5 | ||
|
|
bf2070d758 | ||
|
|
7a1de4cf0f | ||
|
|
caf0bee161 | ||
|
|
cedd694e8e | ||
|
|
d1c58585f5 | ||
|
|
0fce626c46 | ||
|
|
adb8f38c0d | ||
|
|
735ee42580 | ||
|
|
103ae81b8b | ||
|
|
8e351193e1 | ||
|
|
d57b9281a1 | ||
|
|
e07627377e | ||
|
|
8899f4b772 | ||
|
|
e7fd268927 |
114
Changelog.md
@@ -1,3 +1,117 @@
|
|||||||
|
### 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 synchronisation bug was fixed, the shutdown thread was aborted
|
||||||
|
if it was running more then 3 seconds, this caused the rating extension
|
||||||
|
to fail if it was waiting for a drive to wakeup
|
||||||
|
- 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 performence 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
|
||||||
|
WPF was returning a bad color on Win 7, this was fixed by reading
|
||||||
|
the theme color from the Registry on Win 7. If the theme color
|
||||||
|
is identical to the background color it's corrected
|
||||||
|
- dark-color setting was added to overwrite the OS theme color used in dark mode,
|
||||||
|
find the setting on the General tab
|
||||||
|
- light-color setting was added to overwrite the OS theme color used in non dark mode,
|
||||||
|
find the setting on the General tab
|
||||||
|
- various changes regarding input handling, multi media keys and
|
||||||
|
mouse forward/backward were successfully tested
|
||||||
|
- it's now possible to use a custom folder as config folder,
|
||||||
|
A TaskDialog shows five options: 1. appdata mpv.net, 2. appdata mpv (shared with mpv),
|
||||||
|
3. portable_config, 4. startup, 5. custom
|
||||||
|
- slightly increased startup performance, start-threshold setting added.
|
||||||
|
Threshold in milliseconds to wait for libmpv returning the video resolution
|
||||||
|
before the window is shown, otherwise default dimensions are used as defined
|
||||||
|
by autofit and start-size. Default: 1500
|
||||||
|
- autofit-smaller setting added. Minimum window height in percent. Default: 40%
|
||||||
|
- autofit-larger setting added. Maximum window height in percent. Default: 75%
|
||||||
|
|
||||||
|
### 4.7.3
|
||||||
|
|
||||||
|
- fix cursor showing load activity on startup
|
||||||
|
- added file size and type to info command using audio files
|
||||||
|
- added image format support to the info command, to file
|
||||||
|
association management, to folder loading, to Everything
|
||||||
|
- readme/github have a updated features and architecture section
|
||||||
|
|
||||||
|
### 4.7.1
|
||||||
|
|
||||||
|
- few layout problems were fixed, autosize for instance did not work
|
||||||
|
|
||||||
|
### 4.7
|
||||||
|
|
||||||
|
- remember-height was replaced with start-size, when start-size is set
|
||||||
|
to video the main video starts directly with the native video size,
|
||||||
|
before it was starting with the autofit size first and was only
|
||||||
|
afterwards resized to the native video size
|
||||||
|
- on exit the window location can be saved with remember-position
|
||||||
|
- in the learn window of the input editor underscores were stripped
|
||||||
|
because they have a special meaning in WPF labels
|
||||||
|
- fix for keys/input not working for MBTN_LEFT_DBL, MBTN_BACK, MBTN_FORWARD
|
||||||
|
- in the learn window of the input editor support was added for
|
||||||
|
mouse left, mouse left double, mouse mid, mouse forward, mouse back
|
||||||
|
- libmpv was updated to shinchiro 2019-07-07
|
||||||
|
- when border is none it wasn't possible to minimize the window from
|
||||||
|
the task bar because this is the WinForms default behavier. This
|
||||||
|
was fixed by calling Spy++ to the rescue and adding WS_MINIMIZEBOX
|
||||||
|
in CreateParams
|
||||||
|
|
||||||
|
### 4.6
|
||||||
|
|
||||||
|
- fix for middle mouse button not working
|
||||||
|
- fix of logo overlay using a huge amount of memory (thx for the [ghacks article](https://www.ghacks.net/2019/07/05/a-look-at-mpv-net-a-mpv-frontend-with-everything-integration/))
|
||||||
|
- fix config dialog showing a message about app restart without reason
|
||||||
|
- when multiple files are selected in Windows File Explorer and enter is
|
||||||
|
pressed, the files are opened as selected, the order is random though
|
||||||
|
because Explorer starts multiple mpv.net processes concurrently
|
||||||
|
- libmpv was updated to shinchiro 2019-06-30
|
||||||
|
- the [mpv.conf defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt) were changed to show a larger OSC
|
||||||
|
- in case a file is opened that has a aspect ratio smaller then 1.2 then
|
||||||
|
the window size will use a aspect ratio of 1.8
|
||||||
|
- new JavaScript script osc-visibility.js included in the distribution
|
||||||
|
under startup\scripts. It sets the OSC to be always on for audio files
|
||||||
|
and auto for non audio files
|
||||||
|
|
||||||
|
### 4.5
|
||||||
|
|
||||||
|
- opening a URL manually no longer uses a input box but uses the clipboard directly
|
||||||
|
- the manifest was missing the company attribute which caused
|
||||||
|
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
|
||||||
|
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
|
||||||
|
description [here](https://github.com/stax76/mpv.net/blob/master/Manual.md#chrome-extension)
|
||||||
|
- new config setting remember-height added to remember the window height,
|
||||||
|
otherwise the video's native resolution is used
|
||||||
|
- support for protocols other then http added
|
||||||
|
|
||||||
### 4.4
|
### 4.4
|
||||||
|
|
||||||
- clipboard-monitoring was replaced by url-whitelist:
|
- clipboard-monitoring was replaced by url-whitelist:
|
||||||
|
|||||||
47
Manual.md
@@ -7,6 +7,7 @@
|
|||||||
* [Requirements](#requirements)
|
* [Requirements](#requirements)
|
||||||
* [Installation](#installation)
|
* [Installation](#installation)
|
||||||
+ [File Associations](#file-associations)
|
+ [File Associations](#file-associations)
|
||||||
|
+ [Chrome Extension](#chrome-extension)
|
||||||
* [Context Menu](#context-menu)
|
* [Context Menu](#context-menu)
|
||||||
+ [Open > Open Files](#open--open-files)
|
+ [Open > Open Files](#open--open-files)
|
||||||
+ [Open > Open URL](#open--open-url)
|
+ [Open > Open URL](#open--open-url)
|
||||||
@@ -89,7 +90,6 @@
|
|||||||
+ [Exit](#exit)
|
+ [Exit](#exit)
|
||||||
+ [Exit Watch Later](#exit-watch-later)
|
+ [Exit Watch Later](#exit-watch-later)
|
||||||
* [Command Line Interface](#command-line-interface)
|
* [Command Line Interface](#command-line-interface)
|
||||||
* [Settings](#settings)
|
|
||||||
|
|
||||||
## About mpv.net
|
## About mpv.net
|
||||||
|
|
||||||
@@ -101,9 +101,9 @@ mpv.net is meant to be a small single person project, it's designed to be mpv co
|
|||||||
|
|
||||||
### Target Audience
|
### Target Audience
|
||||||
|
|
||||||
The target audience of mpv.net are Windows programmers and users that need something more advanced than common media players.
|
The target audience of mpv.net are programmers, nerds and software enthusiasts that need something more advanced than typical media players.
|
||||||
|
|
||||||
Furthermore mpv.net is well suited for Windows users who are interested to learn about the Linux operating system and portable apps, even though mpv.net self is not portable.
|
Furthermore mpv.net is well suited for users who are interested to learn mpv, Linux, portable apps and the command line.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ If you are new to mpv.net the portable download is recommended, for regular mpv.
|
|||||||
|
|
||||||
The x64 editions require more memory and have the advantage of decoders being typically first and better optimized for x64.
|
The x64 editions require more memory and have the advantage of decoders being typically first and better optimized for x64.
|
||||||
|
|
||||||
x86 should though still be well supported and work.
|
x86 should though still be well supported and work but it's not as well tested than x64.
|
||||||
|
|
||||||
### File Associations
|
### File Associations
|
||||||
|
|
||||||
@@ -129,6 +129,16 @@ Windows 10 prevents apps to register as the default app, to define the default v
|
|||||||
|
|
||||||
It's also possible to change the default application using the Open With feature of the context menu in Windows File Explorer.
|
It's also possible to change the default application using the Open With feature of the context menu in Windows File Explorer.
|
||||||
|
|
||||||
|
### Chrome Extension
|
||||||
|
|
||||||
|
In order to play videos from sites such as YouTube the Chrome Extension [Play with mpv](https://chrome.google.com/webstore/detail/play-with-mpv/hahklcmnfgffdlchjigehabfbiigleji) can be used.
|
||||||
|
|
||||||
|
Due to Chrome Extensions not being able to start a app, another app that communicates with the extension is required, this app can be downloaded [here](http://www.mediafire.com/file/6tmwdjsfknhmsxy/play-with-mpvnet-server.7z/file). The extension works only when the app is running, to have the app always running a link can be created in the auto start folder located at:
|
||||||
|
|
||||||
|
`C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`
|
||||||
|
|
||||||
|
This will start the app on system start and have it running in the background. When the file association registration of mpv.net was executed then the app should find the location of mpv.net, alternativly the mpv.net folder can be added to the PATH environment variable.
|
||||||
|
|
||||||
## Context Menu
|
## Context Menu
|
||||||
|
|
||||||
The most important part of the user interface in mpv.net is the context menu, the menu can be customized as it is defined in the same file where the key bindings are defined.
|
The most important part of the user interface in mpv.net is the context menu, the menu can be customized as it is defined in the same file where the key bindings are defined.
|
||||||
@@ -723,7 +733,7 @@ Shows the command palette window which allows to find mpv.net commands, it shows
|
|||||||
|
|
||||||
### Tools > Show History
|
### Tools > Show History
|
||||||
|
|
||||||
When enabled shows a file that contains the playback history containing the time and filename.
|
Shows a text file that contains the file history. If the file don't exist it asks if the file should be created in the settings folder. Once the file exist then the history is logged. It logges the playback history containing the time and filename.
|
||||||
|
|
||||||
### Tools > Set/clear A-B loop points
|
### Tools > Set/clear A-B loop points
|
||||||
|
|
||||||
@@ -807,29 +817,4 @@ mpvnet implements a basic CLI to set mpv commands.
|
|||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
mpvnet --mute=yes <file|URL>
|
mpvnet --mute=yes <file|URL>
|
||||||
|
|
||||||
## Settings
|
|
||||||
|
|
||||||
mpv.net is able to share the settings with mpv and mpv.net uses the same logic to decide from where the settings are loaded. The default location is:
|
|
||||||
|
|
||||||
```Text
|
|
||||||
C:\Users\%username%\AppData\Roaming\mpv\mpv.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
If a directory named portable_config next to the mpvnet.exe exists, all config will be loaded from this directory only.
|
|
||||||
|
|
||||||
```Text
|
|
||||||
<startup>\portable_config\mpv.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
In case there isn't any config folder mpv.net asks where to create it. If no mpv.conf file exists mpv.net generates it with the following defaults:
|
|
||||||
|
|
||||||
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt>
|
|
||||||
|
|
||||||
Config files located in the same directory as mpvnet.exe are loaded with lower priority. Some config files are loaded only once, which means that e.g. of 2 input.conf files located in two config directories, only the one from the directory with higher priority will be loaded.
|
|
||||||
|
|
||||||
The key bindings and the context menu definitions are stored in the input.conf file,
|
|
||||||
if it's missing mpv.net generates it with the following defaults:
|
|
||||||
|
|
||||||
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt>
|
|
||||||
84
README.md
@@ -37,7 +37,7 @@ Table of contents
|
|||||||
- [Context Menu](#context-menu)
|
- [Context Menu](#context-menu)
|
||||||
- [Settings](#settings)
|
- [Settings](#settings)
|
||||||
- [Scripting](#scripting)
|
- [Scripting](#scripting)
|
||||||
- [Add-ons](#add-ons)
|
- [Extensions](#extensions)
|
||||||
- [Architecture](#architecture)
|
- [Architecture](#architecture)
|
||||||
- [Support](#support)
|
- [Support](#support)
|
||||||
- [Links](#links)
|
- [Links](#links)
|
||||||
@@ -46,18 +46,38 @@ Table of contents
|
|||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
|
- Very high degree of mpv compatibility, almost all mpv features are available
|
||||||
|
- Great usability due to everything in the application being searchable
|
||||||
|
- Open source built with modern tools
|
||||||
- Customizable context menu defined in the same file as the key bindings ([Screenshot](#context-menu-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
- Customizable context menu defined in the same file as the key bindings ([Screenshot](#context-menu-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
||||||
- Searchable config dialog ([Screenshot](#config-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt))
|
- Searchable config dialog ([Screenshot](#config-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt))
|
||||||
- Searchable input (key/mouse) binding editor ([Screenshot](#input-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
- Searchable input (key/mouse) binding editor ([Screenshot](#input-editor-screenshot), [Defaults](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt))
|
||||||
|
- Configuration files that are easy to read and edit
|
||||||
- Searchable command palette to quickly launch commands and look for keys ([Screenshot](#command-palette-screenshot))
|
- Searchable command palette to quickly launch commands and look for keys ([Screenshot](#command-palette-screenshot))
|
||||||
- Modern UI with dark mode ([Screenshot](#config-editor-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))
|
- Scripting API for Python, C#, Lua, JavaScript and PowerShell ([Wiki](https://github.com/stax76/mpv.net/wiki/Scripting))
|
||||||
- mpv's OSC, IPC and conf files
|
- 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)
|
- [Command Line Interface](https://mpv.io/manual/master/#options)
|
||||||
- DXVA2 video decoding acceleration
|
- 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
|
- 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))
|
- Search feature powered by [Everything](https://www.voidtools.com) to find and play media ([Screenshot](#media-search-screenshot))
|
||||||
|
- Extension to start mpv.net from Google Chrome ([Manual](Manual.md#chrome-extension))
|
||||||
|
- Extremely fast seek performance
|
||||||
|
- Very fast startup performance, video is usally ready to play in less then a second
|
||||||
|
- Usable as video player, audio player and image viewer with a wide range of supported formats
|
||||||
|
- All decoders are built-in, no external codecs have to be installed
|
||||||
|
- Setup and portable download options, setup is recommended but not required
|
||||||
|
- Build-in media streaming via youtube-dl
|
||||||
|
- x64 and x86 Support (64-bit and 32-bit)
|
||||||
|
- File associations can be created by the setup and from the player
|
||||||
|
- External audio and subtitle files can either be loaded manually or automatically
|
||||||
|
- Screenshot feature with many options
|
||||||
|
- File history feature to log time and filename
|
||||||
|
- A-B loop feature
|
||||||
|
- watch later feature to save the position
|
||||||
|
- [Manual](#manual)
|
||||||
|
|
||||||
### Screenshots
|
### Screenshots
|
||||||
|
|
||||||
@@ -86,7 +106,7 @@ A searchable key and mouse binding editor.
|
|||||||
#### Command Palette Screenshot
|
#### Command Palette Screenshot
|
||||||
|
|
||||||
Forgot where a command in the menu is located or what shortcut key it has?
|
Forgot where a command in the menu is located or what shortcut key it has?
|
||||||
Just press Ctrl+Shift+P and find it easily in the searchable command palette.
|
Just press F1 and find it easily in the searchable command palette.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -116,44 +136,53 @@ input.conf defines mpv's key and mouse bindings and mpv.net uses comments to def
|
|||||||
|
|
||||||
### Settings
|
### Settings
|
||||||
|
|
||||||
mpv.net is able to share the settings with mpv and mpv.net uses the same logic to decide from where the settings are loaded. The default location is:
|
When mpv.net finds no config folder on startup it will ask for a location.
|
||||||
|
|
||||||
|
If a folder named portable_config next to the mpvnet.exe exists,
|
||||||
|
all config will be loaded from this folder only.
|
||||||
|
|
||||||
```Text
|
```Text
|
||||||
C:\Users\%username%\AppData\Roaming\mpv\mpv.conf
|
<startup>\portable_config\
|
||||||
```
|
```
|
||||||
|
|
||||||
If a directory named portable_config next to the mpvnet.exe exists, all config will be loaded from this directory only.
|
mpv specific settings are stored in the file mpv.conf, if no mpv.conf file exists
|
||||||
|
mpv.net generates it with the following defaults:
|
||||||
```Text
|
|
||||||
<startup>\portable_config\mpv.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
In case there isn't any config folder mpv.net asks where to create it. If no mpv.conf file exists mpv.net generates it with the following defaults:
|
|
||||||
|
|
||||||
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt>
|
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt>
|
||||||
|
|
||||||
Config files located in the same directory as mpvnet.exe are loaded with lower priority. Some config files are loaded only once, which means that e.g. of 2 input.conf files located in two config directories, only the one from the directory with higher priority will be loaded.
|
mpv.net specific settings are stored in the file mpvnet.conf
|
||||||
|
|
||||||
The key bindings and the context menu definitions are stored in the input.conf file,
|
The input (key/mouse) bindings and the context menu definitions are stored in the
|
||||||
if it's missing mpv.net generates it with the following defaults:
|
input.conf file, if it's missing mpv.net generates it with the following defaults:
|
||||||
|
|
||||||
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt>
|
<https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt>
|
||||||
|
|
||||||
mpv.net supports almost all mpv settings and features, [limitations are listed in the wiki](https://github.com/stax76/mpv.net/wiki/Limitations).
|
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
|
||||||
|
|
||||||
[Scripting wiki page](https://github.com/stax76/mpv.net/wiki/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
|
### Architecture
|
||||||
|
|
||||||
mpv.net is written in C# 7.0 and runs on the .NET framework 4.7 or higher.
|
Coding mpv.net was great fun because libmpv is such a awesome
|
||||||
|
library with a very clever design, I'm having a great experience
|
||||||
|
with libmpv.
|
||||||
|
|
||||||
The Add-on implementation is based on the [Managed Extensibility Framework](https://docs.microsoft.com/en-us/dotnet/framework/mef/).
|
The player does not contain any feature that was more work than 1-2 days or
|
||||||
|
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 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
|
There are no specific extension or scripting interfaces but instead everyting
|
||||||
is accessible for .NET compatible languages (C#, VB.NET, F#, Python, PowerShell),
|
is accessible for .NET compatible languages (C#, VB.NET, F#, Python, PowerShell),
|
||||||
@@ -161,9 +190,10 @@ this decision was made to keep the code simple and lightweight.
|
|||||||
|
|
||||||
Python scripting is implemented with IronPython which uses Python 2.7.
|
Python scripting is implemented with IronPython which uses Python 2.7.
|
||||||
|
|
||||||
The main/video window is WinForms based, all other windows are WPF based.
|
The main window is WinForms based and uses less than 600 lines of code,
|
||||||
|
all other windows are WPF based and use even less code.
|
||||||
|
|
||||||
The config editor adds it's controls dynamically and uses TOML to define it's
|
The config editor adds it's controls dynamically and uses [TOML](https://en.wikipedia.org/wiki/TOML) to define it's
|
||||||
content, there are only two simple types, StringSetting and OptionSetting.
|
content, there are only two simple types, StringSetting and OptionSetting.
|
||||||
|
|
||||||
mpv.net was started 2017 and consists of about 6000 lines of code and markup.
|
mpv.net was started 2017 and consists of about 6000 lines of code and markup.
|
||||||
@@ -194,6 +224,10 @@ Third party components:
|
|||||||
|
|
||||||
Please click on the star at the top of the page and like mpv.net at [alternativeto.net](https://alternativeto.net/software/mpv-net/).
|
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.
|
||||||
|
|
||||||
|
<https://www.paypal.me/stax76>
|
||||||
|
|
||||||
### Links
|
### Links
|
||||||
|
|
||||||
mpv manual: <https://mpv.io/manual/master/>
|
mpv manual: <https://mpv.io/manual/master/>
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
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.ConfFolder + "scripts") Then
|
|
||||||
scriptFiles.AddRange(Directory.GetFiles(mp.ConfFolder + "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,60 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.ComponentModel.Composition;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
|
|
||||||
using mpvnet;
|
|
||||||
|
|
||||||
namespace RatingAddon
|
|
||||||
{
|
|
||||||
[Export(typeof(IAddon))]
|
|
||||||
public class RatingAddon : IAddon
|
|
||||||
{
|
|
||||||
Dictionary<string, int> Dic = new Dictionary<string, int>();
|
|
||||||
|
|
||||||
public RatingAddon()
|
|
||||||
{
|
|
||||||
mp.ClientMessage += mpv_ClientMessage;
|
|
||||||
mp.Shutdown += mpv_Shutdown;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mpv_Shutdown()
|
|
||||||
{
|
|
||||||
foreach (var i in Dic)
|
|
||||||
{
|
|
||||||
string filepath = i.Key;
|
|
||||||
int rating = i.Value;
|
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(filepath) || ! File.Exists(filepath))
|
|
||||||
return;
|
|
||||||
|
|
||||||
string basename = Path.GetFileNameWithoutExtension(filepath);
|
|
||||||
|
|
||||||
for (int x = 0; x < 6; x++)
|
|
||||||
if (basename.Contains(" (" + x.ToString() + "stars)"))
|
|
||||||
basename = basename.Replace(" (" + x.ToString() + "stars)", "");
|
|
||||||
|
|
||||||
basename += $" ({rating}stars)";
|
|
||||||
string newPath = Path.Combine(Path.GetDirectoryName(filepath), basename + Path.GetExtension(filepath));
|
|
||||||
|
|
||||||
if (filepath.ToLower() != newPath.ToLower())
|
|
||||||
File.Move(filepath, newPath);
|
|
||||||
|
|
||||||
File.SetLastWriteTime(newPath, DateTime.Now);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void mpv_ClientMessage(string[] args)
|
|
||||||
{
|
|
||||||
if (args == null ||
|
|
||||||
args.Length != 2 ||
|
|
||||||
args[0] != "rate-file" ||
|
|
||||||
!int.TryParse(args[1], out int rating))
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
Dic[mp.get_property_string("path")] = rating;
|
|
||||||
mp.commandv("show-text", $"Rating: {rating}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyTitle("RatingAddon")]
|
[assembly: AssemblyTitle("RatingExtension")]
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("RatingAddon")]
|
[assembly: AssemblyProduct("RatingExtension")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
61
extensions/RatingExtension/RatingExtension.cs
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
using System.ComponentModel.Composition;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
using mpvnet;
|
||||||
|
|
||||||
|
namespace RatingExtension // the assembly name must end with 'Extension'
|
||||||
|
{
|
||||||
|
[Export(typeof(IExtension))]
|
||||||
|
public class RatingExtension : IExtension
|
||||||
|
{
|
||||||
|
// dictionory to store the filename and the rating
|
||||||
|
Dictionary<string, int> Dic = new Dictionary<string, int>();
|
||||||
|
|
||||||
|
public RatingExtension() // plugin initialization
|
||||||
|
{
|
||||||
|
mp.ClientMessage += ClientMessage; //handles keys defined in input.conf
|
||||||
|
mp.Shutdown += Shutdown; // handles MPV_EVENT_SHUTDOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
// handles MPV_EVENT_SHUTDOWN
|
||||||
|
void Shutdown()
|
||||||
|
{
|
||||||
|
foreach (var i in Dic)
|
||||||
|
{
|
||||||
|
string filepath = i.Key;
|
||||||
|
int rating = i.Value;
|
||||||
|
if (String.IsNullOrEmpty(filepath) || ! File.Exists(filepath))
|
||||||
|
return;
|
||||||
|
string basename = Path.GetFileNameWithoutExtension(filepath);
|
||||||
|
|
||||||
|
for (int x = 0; x < 6; x++)
|
||||||
|
if (basename.Contains(" (" + x.ToString() + "stars)"))
|
||||||
|
basename = basename.Replace(" (" + x.ToString() + "stars)", "");
|
||||||
|
|
||||||
|
basename += $" ({rating}stars)";
|
||||||
|
string newPath = Path.Combine(Path.GetDirectoryName(filepath), basename + Path.GetExtension(filepath));
|
||||||
|
if (filepath.ToLower() != newPath.ToLower())
|
||||||
|
File.Move(filepath, newPath);
|
||||||
|
File.SetLastWriteTime(newPath, DateTime.Now);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//handles keys defined in input.conf
|
||||||
|
void ClientMessage(string[] args)
|
||||||
|
{
|
||||||
|
if (args[0] != "rate-file") return;
|
||||||
|
|
||||||
|
if (int.TryParse(args[1], out int rating))
|
||||||
|
{
|
||||||
|
string path = mp.get_property_string("path");
|
||||||
|
if (!File.Exists(path)) return;
|
||||||
|
Dic[path] = rating;
|
||||||
|
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 extension to set ratings.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,53 +4,18 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}</ProjectGuid>
|
<ProjectGuid>{55C88710-539D-4402-84C8-31694841C731}</ProjectGuid>
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>TestAddon</RootNamespace>
|
<RootNamespace>RatingExtension</RootNamespace>
|
||||||
<AssemblyName>TestAddon</AssemblyName>
|
<AssemblyName>RatingExtension</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<Deterministic>true</Deterministic>
|
<TargetFrameworkProfile />
|
||||||
</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>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
<OutputPath>..\..\mpv.net\bin\x86\Extensions\RatingExtension\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
@@ -58,7 +23,7 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
||||||
<OutputPath>bin\x86\Release\</OutputPath>
|
<OutputPath>..\..\mpv.net\bin\x86\Extensions\RatingExtension\</OutputPath>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
@@ -66,6 +31,24 @@
|
|||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</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>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.ComponentModel.Composition" />
|
<Reference Include="System.ComponentModel.Composition" />
|
||||||
@@ -78,7 +61,7 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="TestAddon.cs" />
|
<Compile Include="RatingExtension.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
|
|||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyTitle("TestAddon")]
|
[assembly: AssemblyTitle("RatingExtension")]
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("TestAddon")]
|
[assembly: AssemblyProduct("RatingExtension")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2019")]
|
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: ComVisible(false)]
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
// 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:
|
// Version information for an assembly consists of the following four values:
|
||||||
//
|
//
|
||||||
47
extensions/ScriptingExtension/ScriptingExtension.cs
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
//'This extension implements the C# scripting feature of mpv.net which
|
||||||
|
// is based on CS-Script (https://www.cs-script.net).
|
||||||
|
|
||||||
|
// Furthermore the extension is used to code and debug scripts
|
||||||
|
// because writing script code without debugger is not an option :-)
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel.Composition;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
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(Application.StartupPath + "\\scripts"))
|
||||||
|
scriptFiles.AddRange(Directory.GetFiles(Application.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>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{55C88710-539D-4402-84C8-31694841C731}</ProjectGuid>
|
<ProjectGuid>{94255EF2-C823-4D82-9017-0E993CC0F5A1}</ProjectGuid>
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
<RootNamespace>RatingAddon</RootNamespace>
|
<RootNamespace>ScriptingExtension</RootNamespace>
|
||||||
<AssemblyName>RatingAddon</AssemblyName>
|
<AssemblyName>ScriptingExtension</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
</PropertyGroup>
|
</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'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>..\..\mpv.net\bin\x86\Addons\RatingAddon\</OutputPath>
|
<OutputPath>..\..\mpv.net\bin\x86\Extensions\ScriptingExtension\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x86</PlatformTarget>
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
@@ -40,7 +23,7 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
|
<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>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
@@ -50,7 +33,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<OutputPath>..\..\mpv.net\bin\x64\Addons\RatingAddon\</OutputPath>
|
<OutputPath>..\..\mpv.net\bin\x64\Extensions\ScriptingExtension\</OutputPath>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<DebugType>full</DebugType>
|
<DebugType>full</DebugType>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
@@ -58,7 +41,7 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
<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>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<Optimize>true</Optimize>
|
<Optimize>true</Optimize>
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
@@ -67,9 +50,13 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="CSScriptLibrary">
|
||||||
|
<HintPath>.\CSScriptLibrary.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.ComponentModel.Composition" />
|
<Reference Include="System.ComponentModel.Composition" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
@@ -78,8 +65,9 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="RatingAddon.cs" />
|
<Compile Include="ScriptingExtension.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="script.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\mpv.net\mpv.net.csproj">
|
<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/Main.png
|
Before Width: | Height: | Size: 5.8 MiB After Width: | Height: | Size: 2.5 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
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpv.net\mpv.net.csproj", "{1751F378-8EDF-4B62-BE6D-304C7C287089}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpv.net\mpv.net.csproj", "{1751F378-8EDF-4B62-BE6D-304C7C287089}"
|
||||||
EndProject
|
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
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RatingAddon", "addons\RatingAddon\RatingAddon.csproj", "{55C88710-539D-4402-84C8-31694841C731}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptingExtension", "extensions\ScriptingExtension\ScriptingExtension.csproj", "{94255EF2-C823-4D82-9017-0E993CC0F5A1}"
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestAddon", "addons\TestAddon\TestAddon.csproj", "{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -21,54 +19,36 @@ Global
|
|||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x64.ActiveCfg = Debug|x64
|
{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|x64.Build.0 = Debug|x64
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Debug|x86.ActiveCfg = Debug|x86
|
{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}.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.ActiveCfg = Release|x86
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x64.ActiveCfg = Release|x64
|
{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|x64.Build.0 = Release|x64
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.ActiveCfg = Release|x86
|
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.ActiveCfg = Release|x86
|
||||||
{1751F378-8EDF-4B62-BE6D-304C7C287089}.Release|x86.Build.0 = 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
|
{55C88710-539D-4402-84C8-31694841C731}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
{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|x64.ActiveCfg = Debug|x64
|
{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|x64.Build.0 = Debug|x64
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Debug|x86.ActiveCfg = Debug|x86
|
{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}.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.ActiveCfg = Release|x86
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x64.ActiveCfg = Release|x64
|
{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|x64.Build.0 = Release|x64
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86
|
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86
|
||||||
{55C88710-539D-4402-84C8-31694841C731}.Release|x86.Build.0 = 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
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x64.ActiveCfg = Debug|x64
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x64.Build.0 = Debug|x64
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x64.Build.0 = Debug|x64
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x86.ActiveCfg = Debug|x86
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Debug|x86.Build.0 = Debug|x86
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Debug|x86.Build.0 = Debug|x86
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|Any CPU.ActiveCfg = Release|x86
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.ActiveCfg = Release|x64
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|Any CPU.Build.0 = Release|Any CPU
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x64.Build.0 = Release|x64
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x64.ActiveCfg = Release|Any CPU
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x86.ActiveCfg = Release|x86
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x64.Build.0 = Release|Any CPU
|
{94255EF2-C823-4D82-9017-0E993CC0F5A1}.Release|x86.Build.0 = Release|x86
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{06F854B0-00F9-4B53-94D9-0BE65A7C55D8}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ namespace DynamicGUI
|
|||||||
baseSetting = optionSetting;
|
baseSetting = optionSetting;
|
||||||
optionSetting.Default = setting["default"];
|
optionSetting.Default = setting["default"];
|
||||||
optionSetting.Value = optionSetting.Default;
|
optionSetting.Value = optionSetting.Default;
|
||||||
optionSetting.StartValue = optionSetting.Default;
|
|
||||||
|
|
||||||
foreach (TomlTable option in setting["options"])
|
foreach (TomlTable option in setting["options"])
|
||||||
{
|
{
|
||||||
@@ -56,7 +55,7 @@ namespace DynamicGUI
|
|||||||
baseSetting.Filter = setting["filter"];
|
baseSetting.Filter = setting["filter"];
|
||||||
|
|
||||||
if (setting.HasKey("help")) baseSetting.Help = setting["help"];
|
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("width")) baseSetting.Width = setting["width"];
|
||||||
if (setting.HasKey("type")) baseSetting.Type = setting["type"];
|
if (setting.HasKey("type")) baseSetting.Type = setting["type"];
|
||||||
|
|
||||||
@@ -70,10 +69,9 @@ namespace DynamicGUI
|
|||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Value { get; set; }
|
public string Value { get; set; }
|
||||||
public string StartValue { get; set; }
|
|
||||||
public string Help { get; set; }
|
public string Help { get; set; }
|
||||||
public string Default { get; set; }
|
public string Default { get; set; }
|
||||||
public string HelpURL { get; set; }
|
public string URL { get; set; }
|
||||||
public string Filter { get; set; }
|
public string Filter { get; set; }
|
||||||
public string Type { get; set; }
|
public string Type { get; set; }
|
||||||
public int Width { get; set; }
|
public int Width { get; set; }
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ namespace DynamicGUI
|
|||||||
HelpTextBox.Visibility = Visibility.Collapsed;
|
HelpTextBox.Visibility = Visibility.Collapsed;
|
||||||
HelpTextBox.Text = optionSetting.Help;
|
HelpTextBox.Text = optionSetting.Help;
|
||||||
ItemsControl.ItemsSource = optionSetting.Options;
|
ItemsControl.ItemsSource = optionSetting.Options;
|
||||||
if (string.IsNullOrEmpty(optionSetting.HelpURL))
|
if (string.IsNullOrEmpty(optionSetting.URL))
|
||||||
LinkTextBlock.Visibility = Visibility.Collapsed;
|
LinkTextBlock.Visibility = Visibility.Collapsed;
|
||||||
Link.SetURL(optionSetting.HelpURL);
|
Link.SetURL(optionSetting.URL);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _SearchableText;
|
private string _SearchableText;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
<ColumnDefinition Width="Auto" />
|
<ColumnDefinition Width="Auto" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<TextBox x:Name="ValueTextBox" Text="{Binding Path=Text, ElementName=StringSettingControl1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="150" HorizontalAlignment="Left" Height="20" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" TextChanged="ValueTextBox_TextChanged"/>
|
<TextBox x:Name="ValueTextBox" Text="{Binding Path=Text, ElementName=StringSettingControl1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="150" HorizontalAlignment="Left" Height="20" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" CaretBrush="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" TextChanged="ValueTextBox_TextChanged"/>
|
||||||
<Button x:Name="Button" Height="20" Grid.Column="1" Visibility="{Binding Path=Text, ElementName=StringSettingControl1}" Margin="5,0,0,0" Width="20" Click="Button_Click">...</Button>
|
<Button x:Name="Button" Height="20" Grid.Column="1" Visibility="{Binding Path=Text, ElementName=StringSettingControl1}" Margin="5,0,0,0" Width="20" Click="Button_Click">...</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
<TextBox x:Name="HelpTextBox" TextWrapping="WrapWithOverflow" BorderThickness="0" IsReadOnly="True" Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Background="{Binding Path=Background, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}"></TextBox>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
@@ -22,8 +23,8 @@ namespace DynamicGUI
|
|||||||
ValueTextBox.Width = StringSetting.Width;
|
ValueTextBox.Width = StringSetting.Width;
|
||||||
if (StringSetting.Type != "folder" && StringSetting.Type != "color")
|
if (StringSetting.Type != "folder" && StringSetting.Type != "color")
|
||||||
Button.Visibility = Visibility.Hidden;
|
Button.Visibility = Visibility.Hidden;
|
||||||
Link.SetURL(StringSetting.HelpURL);
|
Link.SetURL(StringSetting.URL);
|
||||||
if (string.IsNullOrEmpty(stringSetting.HelpURL))
|
if (string.IsNullOrEmpty(stringSetting.URL))
|
||||||
LinkTextBlock.Visibility = Visibility.Collapsed;
|
LinkTextBlock.Visibility = Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ namespace DynamicGUI
|
|||||||
{
|
{
|
||||||
d.Description = "Choose a folder.";
|
d.Description = "Choose a folder.";
|
||||||
d.SelectedPath = ValueTextBox.Text;
|
d.SelectedPath = ValueTextBox.Text;
|
||||||
if (d.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
||||||
ValueTextBox.Text = d.SelectedPath;
|
ValueTextBox.Text = d.SelectedPath;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -64,11 +65,14 @@ namespace DynamicGUI
|
|||||||
{
|
{
|
||||||
d.FullOpen = true;
|
d.FullOpen = true;
|
||||||
try {
|
try {
|
||||||
Color col = GetColor(ValueTextBox.Text);
|
if (!string.IsNullOrEmpty(ValueTextBox.Text))
|
||||||
d.Color = System.Drawing.Color.FromArgb(col.A, col.R, col.G, col.B);
|
{
|
||||||
} catch { }
|
Color col = GetColor(ValueTextBox.Text);
|
||||||
|
d.Color = System.Drawing.Color.FromArgb(col.A, col.R, col.G, col.B);
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
||||||
ValueTextBox.Text = System.Drawing.ColorTranslator.ToHtml(d.Color);
|
ValueTextBox.Text = "#" + d.Color.ToArgb().ToString("X8");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1752,7 +1752,6 @@ namespace Tommy
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
stringBuilder.Append(c);
|
stringBuilder.Append(c);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Windows;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Windows.Interop;
|
using System.Windows.Interop;
|
||||||
|
|
||||||
@@ -13,42 +12,43 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
public class Command
|
public class Command
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public static void Execute(string id, string[] args)
|
||||||
public Action<string[]> Action { get; set; }
|
|
||||||
|
|
||||||
static List<Command> commands;
|
|
||||||
|
|
||||||
public static List<Command> Commands
|
|
||||||
{
|
{
|
||||||
get
|
switch (id)
|
||||||
{
|
{
|
||||||
if (commands == null)
|
case "manage-file-associations": ManageFileAssociations(); break;
|
||||||
{
|
case "cycle-audio": CycleAudio(); break;
|
||||||
commands = new List<Command>();
|
case "load-audio": LoadAudio(); break;
|
||||||
Type type = typeof(Command);
|
case "load-sub": LoadSubtitle(); break;
|
||||||
MethodInfo[] methods = type.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
|
case "open-url": OpenURL(); break;
|
||||||
|
case "execute-mpv-command": ExecuteMpvCommand(); break;
|
||||||
foreach (MethodInfo i in methods)
|
case "show-history": ShowHistory(); break;
|
||||||
{
|
case "show-media-search": ShowDialog(typeof(EverythingWindow)); break;
|
||||||
ParameterInfo[] parameters = i.GetParameters();
|
case "show-command-palette": ShowDialog(typeof(CommandPaletteWindow)); break;
|
||||||
|
case "show-about": ShowDialog(typeof(AboutWindow)); break;
|
||||||
if (parameters == null ||
|
case "show-conf-editor": ShowDialog(typeof(ConfWindow)); break;
|
||||||
parameters.Length != 1 ||
|
case "show-input-editor": ShowDialog(typeof(InputWindow)); break;
|
||||||
parameters[0].ParameterType != typeof(string[]))
|
case "open-conf-folder": Process.Start(mp.ConfigFolder); break;
|
||||||
continue;
|
case "open-files": OpenFiles(args); break;
|
||||||
|
case "shell-execute": Process.Start(args[0]); break;
|
||||||
Command cmd = new Command() {
|
case "show-info": ShowInfo(); break;
|
||||||
Name = i.Name.Replace("_", "-"),
|
case "add-files-to-playlist": OpenFiles("append"); break; // deprecated 2019
|
||||||
Action = (Action<string[]>)i.CreateDelegate(typeof(Action<string[]>)) };
|
default: Msg.ShowError($"No command '{id}' found."); break;
|
||||||
|
|
||||||
commands.Add(cmd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return commands;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void open_files(string[] args)
|
public static void InvokeOnMainThread(Action action) => MainForm.Instance.Invoke(action);
|
||||||
|
|
||||||
|
public static void ShowDialog(Type winType)
|
||||||
|
{
|
||||||
|
InvokeOnMainThread(new Action(() => {
|
||||||
|
Window win = Activator.CreateInstance(winType) as Window;
|
||||||
|
new WindowInteropHelper(win).Owner = MainForm.Instance.Handle;
|
||||||
|
win.ShowDialog();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OpenFiles(params string[] args)
|
||||||
{
|
{
|
||||||
bool append = Control.ModifierKeys.HasFlag(Keys.Control);
|
bool append = Control.ModifierKeys.HasFlag(Keys.Control);
|
||||||
bool loadFolder = true;
|
bool loadFolder = true;
|
||||||
@@ -59,77 +59,16 @@ namespace mpvnet
|
|||||||
if (arg == "no-folder") loadFolder = false;
|
if (arg == "no-folder") loadFolder = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
using (var d = new OpenFileDialog() { Multiselect = true })
|
using (var d = new OpenFileDialog() { Multiselect = true })
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
mp.Load(d.FileNames, loadFolder, append);
|
mp.Load(d.FileNames, loadFolder, append);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
// deprecated in 2019
|
public static void ShowHistory()
|
||||||
public static void add_files_to_playlist(string[] args)
|
|
||||||
{
|
{
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
var fp = mp.ConfigFolder + "history.txt";
|
||||||
using (var d = new OpenFileDialog() { Multiselect = true })
|
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
|
||||||
foreach (string file in d.FileNames)
|
|
||||||
mp.commandv("loadfile", file, "append");
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void open_conf_folder(string[] args)
|
|
||||||
{
|
|
||||||
Process.Start(mp.ConfFolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_input_editor(string[] args)
|
|
||||||
{
|
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
|
||||||
InputWindow w = new InputWindow();
|
|
||||||
new WindowInteropHelper(w).Owner = MainForm.Instance.Handle;
|
|
||||||
w.ShowDialog();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_conf_editor(string[] args)
|
|
||||||
{
|
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
|
||||||
ConfWindow w = new ConfWindow();
|
|
||||||
new WindowInteropHelper(w).Owner = MainForm.Instance.Handle;
|
|
||||||
w.ShowDialog();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_about(string[] args)
|
|
||||||
{
|
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
|
||||||
AboutWindow w = new AboutWindow();
|
|
||||||
new WindowInteropHelper(w).Owner = MainForm.Instance.Handle;
|
|
||||||
w.ShowDialog();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_command_palette(string[] args)
|
|
||||||
{
|
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
|
||||||
var w = new CommandPaletteWindow();
|
|
||||||
new WindowInteropHelper(w).Owner = MainForm.Instance.Handle;
|
|
||||||
w.ShowDialog();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_media_search(string[] args)
|
|
||||||
{
|
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
|
||||||
var w = new EverythingWindow();
|
|
||||||
new WindowInteropHelper(w).Owner = MainForm.Instance.Handle;
|
|
||||||
w.ShowDialog();
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void show_history(string[] args)
|
|
||||||
{
|
|
||||||
var fp = mp.ConfFolder + "history.txt";
|
|
||||||
|
|
||||||
if (File.Exists(fp))
|
if (File.Exists(fp))
|
||||||
Process.Start(fp);
|
Process.Start(fp);
|
||||||
@@ -139,9 +78,7 @@ namespace mpvnet
|
|||||||
File.WriteAllText(fp, "");
|
File.WriteAllText(fp, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void shell_execute(string[] args) => Process.Start(args[0]);
|
public static void ShowInfo()
|
||||||
|
|
||||||
public static void show_info(string[] args)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -172,6 +109,22 @@ namespace mpvnet
|
|||||||
if (genre != "") text += "Genre: " + genre + "\n";
|
if (genre != "") text += "Genre: " + genre + "\n";
|
||||||
if (date != "") text += "Year: " + date + "\n";
|
if (date != "") text += "Year: " + date + "\n";
|
||||||
if (duration != "") text += "Length: " + duration + "\n";
|
if (duration != "") text += "Length: " + duration + "\n";
|
||||||
|
text += "Size: " + mediaInfo.GetInfo(MediaInfoStreamKind.General, "FileSize/String") + "\n";
|
||||||
|
text += "Type: " + Path.GetExtension(path).ToUpper().TrimStart('.');
|
||||||
|
|
||||||
|
mp.commandv("show-text", text, "5000");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (App.ImageTypes.Contains(Path.GetExtension(path).ToLower().TrimStart('.')))
|
||||||
|
{
|
||||||
|
using (MediaInfo mediaInfo = new MediaInfo(path))
|
||||||
|
{
|
||||||
|
text =
|
||||||
|
"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('.');
|
||||||
|
|
||||||
mp.commandv("show-text", text, "5000");
|
mp.commandv("show-text", text, "5000");
|
||||||
return;
|
return;
|
||||||
@@ -184,7 +137,7 @@ namespace mpvnet
|
|||||||
string videoFormat = mp.get_property_string("video-format").ToUpper();
|
string videoFormat = mp.get_property_string("video-format").ToUpper();
|
||||||
string audioCodec = mp.get_property_string("audio-codec-name").ToUpper();
|
string audioCodec = mp.get_property_string("audio-codec-name").ToUpper();
|
||||||
|
|
||||||
text = Path.GetFileName(path) + "\n" +
|
text = PathHelp.GetFileName(path) + "\n" +
|
||||||
FormatTime(position.TotalMinutes) + ":" +
|
FormatTime(position.TotalMinutes) + ":" +
|
||||||
FormatTime(position.Seconds) + " / " +
|
FormatTime(position.Seconds) + " / " +
|
||||||
FormatTime(duration2.TotalMinutes) + ":" +
|
FormatTime(duration2.TotalMinutes) + ":" +
|
||||||
@@ -205,31 +158,36 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void execute_mpv_command(string[] args)
|
public static void ExecuteMpvCommand()
|
||||||
{
|
{
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
string command = VB.Interaction.InputBox("Enter a mpv command to be executed.", "Execute Command", RegHelp.GetString(App.RegPath, "RecentExecutedCommand"));
|
string command = VB.Interaction.InputBox("Enter a mpv command to be executed.", "Execute Command", RegHelp.GetString(App.RegPath, "RecentExecutedCommand"));
|
||||||
if (string.IsNullOrEmpty(command)) return;
|
if (string.IsNullOrEmpty(command)) return;
|
||||||
RegHelp.SetObject(App.RegPath, "RecentExecutedCommand", command);
|
RegHelp.SetObject(App.RegPath, "RecentExecutedCommand", command);
|
||||||
mp.command_string(command, false);
|
mp.command(command, false);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void open_url(string[] args)
|
public static void OpenURL()
|
||||||
{
|
{
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
string command = VB.Interaction.InputBox("Enter URL to be opened.");
|
string clipboard = System.Windows.Forms.Clipboard.GetText();
|
||||||
if (string.IsNullOrEmpty(command)) return;
|
if (string.IsNullOrEmpty(clipboard) || (!clipboard.Contains("://") && !File.Exists(clipboard)) || clipboard.Contains("\n"))
|
||||||
mp.Load(new [] { command }, false, Control.ModifierKeys.HasFlag(Keys.Control));
|
{
|
||||||
|
Msg.ShowError("The clipboard does not contain a valid URL or file, URLs have to contain :// and are not allowed to contain a newline character.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mp.Load(new [] { clipboard }, false, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void load_sub(string[] args)
|
public static void LoadSubtitle()
|
||||||
{
|
{
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
using (var d = new OpenFileDialog())
|
using (var d = new OpenFileDialog())
|
||||||
{
|
{
|
||||||
d.InitialDirectory = Path.GetDirectoryName(mp.get_property_string("path", false));
|
string path = mp.get_property_string("path");
|
||||||
|
if (File.Exists(path)) d.InitialDirectory = Path.GetDirectoryName(path);
|
||||||
d.Multiselect = true;
|
d.Multiselect = true;
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
foreach (string i in d.FileNames)
|
foreach (string i in d.FileNames)
|
||||||
@@ -238,12 +196,14 @@ namespace mpvnet
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void load_audio(string[] args)
|
public static void LoadAudio()
|
||||||
{
|
{
|
||||||
MainForm.Instance.Invoke(new Action(() => {
|
InvokeOnMainThread(new Action(() => {
|
||||||
using (var d = new OpenFileDialog())
|
using (var d = new OpenFileDialog())
|
||||||
{
|
{
|
||||||
d.InitialDirectory = Path.GetDirectoryName(mp.get_property_string("path", false));
|
string path = mp.get_property_string("path");
|
||||||
|
if (File.Exists(path))
|
||||||
|
d.InitialDirectory = Path.GetDirectoryName(path);
|
||||||
d.Multiselect = true;
|
d.Multiselect = true;
|
||||||
|
|
||||||
if (d.ShowDialog() == DialogResult.OK)
|
if (d.ShowDialog() == DialogResult.OK)
|
||||||
@@ -253,12 +213,12 @@ namespace mpvnet
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void cycle_audio(string[] args)
|
public static void CycleAudio()
|
||||||
{
|
{
|
||||||
string filePath = mp.get_property_string("path", false);
|
string path = mp.get_property_string("path");
|
||||||
if (!File.Exists(filePath)) return;
|
if (!File.Exists(path)) return;
|
||||||
|
|
||||||
using (MediaInfo mi = new MediaInfo(filePath))
|
using (MediaInfo mi = new MediaInfo(path))
|
||||||
{
|
{
|
||||||
MediaTrack[] audTracks = mp.MediaTracks.Where(track => track.Type == "a").ToArray();
|
MediaTrack[] audTracks = mp.MediaTracks.Where(track => track.Type == "a").ToArray();
|
||||||
if (audTracks.Length < 2) return;
|
if (audTracks.Length < 2) return;
|
||||||
@@ -270,7 +230,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void manage_file_associations(string[] args)
|
public static void ManageFileAssociations()
|
||||||
{
|
{
|
||||||
using (var td = new TaskDialog<string>())
|
using (var td = new TaskDialog<string>())
|
||||||
{
|
{
|
||||||
@@ -279,7 +239,8 @@ namespace mpvnet
|
|||||||
|
|
||||||
td.AddCommandLink("Register video file extensions", "video");
|
td.AddCommandLink("Register video file extensions", "video");
|
||||||
td.AddCommandLink("Register audio file extensions", "audio");
|
td.AddCommandLink("Register audio file extensions", "audio");
|
||||||
td.AddCommandLink("Unregister file extensions", "unreg");
|
td.AddCommandLink("Register image file extensions", "image");
|
||||||
|
td.AddCommandLink("Unregister file extensions", "unreg");
|
||||||
|
|
||||||
string result = td.Show();
|
string result = td.Show();
|
||||||
|
|
||||||
@@ -287,17 +248,13 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
using (var proc = new Process())
|
using (var proc = new Process())
|
||||||
{
|
{
|
||||||
proc.StartInfo.FileName = Application.ExecutablePath;
|
proc.StartInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
|
||||||
proc.StartInfo.Arguments = "--reg-file-assoc " + result;
|
proc.StartInfo.Arguments = "--reg-file-assoc " + result;
|
||||||
proc.StartInfo.Verb = "runas";
|
proc.StartInfo.Verb = "runas";
|
||||||
try {
|
try { proc.Start(); } catch { }
|
||||||
proc.Start();
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{ }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,30 +7,30 @@ using System.Windows.Forms;
|
|||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
public class Addon
|
public class Extension
|
||||||
{
|
{
|
||||||
[ImportMany]
|
[ImportMany]
|
||||||
public IEnumerable<IAddon> Addons = null;
|
public IEnumerable<IExtension> Extensions = null;
|
||||||
|
|
||||||
readonly CompositionContainer CompositionContainer;
|
readonly CompositionContainer CompositionContainer;
|
||||||
|
|
||||||
public Addon()
|
public Extension()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
AggregateCatalog catalog = new AggregateCatalog();
|
AggregateCatalog catalog = new AggregateCatalog();
|
||||||
|
|
||||||
string dir = Application.StartupPath + "\\Addons";
|
string dir = Application.StartupPath + "\\Extensions";
|
||||||
|
|
||||||
if (Directory.Exists(dir))
|
if (Directory.Exists(dir))
|
||||||
foreach (string i in Directory.GetDirectories(dir))
|
foreach (string i in Directory.GetDirectories(dir))
|
||||||
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll"));
|
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Extension.dll"));
|
||||||
|
|
||||||
dir = mp.ConfFolder + "\\Addons";
|
dir = mp.ConfigFolder + "\\Extensions";
|
||||||
|
|
||||||
if (Directory.Exists(dir))
|
if (Directory.Exists(dir))
|
||||||
foreach (string i in Directory.GetDirectories(dir))
|
foreach (string i in Directory.GetDirectories(dir))
|
||||||
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll"));
|
catalog.Catalogs.Add(new DirectoryCatalog(i, "*Extension.dll"));
|
||||||
|
|
||||||
if (catalog.Catalogs.Count > 0)
|
if (catalog.Catalogs.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -45,7 +45,7 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IAddon
|
public interface IExtension
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,24 +18,35 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
public class App
|
public class App
|
||||||
{
|
{
|
||||||
public static string ConfFilePath { get; } = mp.ConfFolder + "\\mpvnet.conf";
|
|
||||||
public static string RegPath { get; } = @"HKCU\Software\" + Application.ProductName;
|
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 DarkMode { get; set; } = "always";
|
||||||
public static string ProcessInstance { get; set; } = "single";
|
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[] 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[] 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".Split(' ');
|
||||||
public static string[] SubtitleTypes { get; } = "srt ass idx sup ttxt ssa smi".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 string[] UrlWhitelist { get; set; } = { "tube", "vimeo", "ard", "zdf" };
|
||||||
|
|
||||||
public static bool DebugMode { get; set; } = false;
|
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 IsDarkMode {
|
public static int StartThreshold { get; set; } = 1500;
|
||||||
|
|
||||||
|
public static bool IsDarkMode {
|
||||||
get => (DarkMode == "system" && Sys.IsDarkTheme) || DarkMode == "always";
|
get => (DarkMode == "system" && Sys.IsDarkTheme) || DarkMode == "always";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
|
string dummy = mp.ConfigFolder;
|
||||||
|
var dummy2 = mp.Conf;
|
||||||
|
|
||||||
foreach (var i in Conf)
|
foreach (var i in Conf)
|
||||||
ProcessProperty(i.Key, i.Value);
|
ProcessProperty(i.Key, i.Value);
|
||||||
|
|
||||||
@@ -43,12 +54,11 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string filePath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\mpvnet-debug.log";
|
string filePath = mp.ConfigFolder + "\\mpvnet-debug.log";
|
||||||
if (File.Exists(filePath)) File.Delete(filePath);
|
if (File.Exists(filePath)) File.Delete(filePath);
|
||||||
Trace.Listeners.Clear();
|
|
||||||
Trace.Listeners.Add(new TextWriterTraceListener(filePath));
|
Trace.Listeners.Add(new TextWriterTraceListener(filePath));
|
||||||
foreach (Screen screen in Screen.AllScreens)
|
Trace.AutoFlush = true;
|
||||||
Trace.WriteLine(screen);
|
//if (App.DebugMode) Trace.WriteLine("");
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -57,11 +67,6 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Exit()
|
|
||||||
{
|
|
||||||
if (Trace.Listeners.Count > 0) Trace.Listeners[0].Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
static Dictionary<string, string> _Conf;
|
static Dictionary<string, string> _Conf;
|
||||||
|
|
||||||
public static Dictionary<string, string> Conf {
|
public static Dictionary<string, string> Conf {
|
||||||
@@ -70,8 +75,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
_Conf = new Dictionary<string, string>();
|
_Conf = new Dictionary<string, string>();
|
||||||
|
|
||||||
if (File.Exists(ConfFilePath))
|
if (File.Exists(ConfPath))
|
||||||
foreach (string i in File.ReadAllLines(ConfFilePath))
|
foreach (string i in File.ReadAllLines(ConfPath))
|
||||||
if (i.Contains("=") && !i.StartsWith("#"))
|
if (i.Contains("=") && !i.StartsWith("#"))
|
||||||
_Conf[i.Substring(0, i.IndexOf("=")).Trim()] = i.Substring(i.IndexOf("=") + 1).Trim();
|
_Conf[i.Substring(0, i.IndexOf("=")).Trim()] = i.Substring(i.IndexOf("=") + 1).Trim();
|
||||||
}
|
}
|
||||||
@@ -83,12 +88,20 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
|
case "remember-position": RememberPosition = value == "yes"; break;
|
||||||
|
case "start-size": RememberHeight = value == "previous"; break;
|
||||||
case "process-instance": ProcessInstance = value; break;
|
case "process-instance": ProcessInstance = value; break;
|
||||||
case "dark-mode": DarkMode = value; break;
|
case "dark-mode": DarkMode = value; break;
|
||||||
case "debug-mode": DebugMode = value == "yes"; 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":
|
case "url-whitelist":
|
||||||
UrlWhitelist = value.Split(' ', ',', ';');
|
UrlWhitelist = value.Split(' ', ',', ';');
|
||||||
break;
|
break;
|
||||||
|
case "start-threshold":
|
||||||
|
int.TryParse(value, out int result);
|
||||||
|
StartThreshold = result;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,15 +122,9 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string switchName = i.Substring(2);
|
string name = i.Substring(2);
|
||||||
|
mp.ProcessProperty(name, "yes");
|
||||||
switch (switchName)
|
ProcessProperty(name, "yes");
|
||||||
{
|
|
||||||
case "fs":
|
|
||||||
case "fullscreen":
|
|
||||||
mp.Fullscreen = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,8 +181,8 @@ namespace mpvnet
|
|||||||
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}", "FriendlyAppName", "mpv.net media player");
|
||||||
RegHelp.SetObject($"HKCR\\Applications\\{ExeFilename}\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
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.net\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", "ApplicationName", "mpv.net");
|
||||||
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}", null, "");
|
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\video\\OpenWithList\\{ExeFilename}", null, "");
|
||||||
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}", null, "");
|
RegHelp.SetObject($"HKCR\\SystemFileAssociations\\audio\\OpenWithList\\{ExeFilename}", null, "");
|
||||||
|
|
||||||
@@ -188,6 +195,8 @@ namespace mpvnet
|
|||||||
RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "video");
|
RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "video");
|
||||||
if (App.AudioTypes.Contains(ext))
|
if (App.AudioTypes.Contains(ext))
|
||||||
RegHelp.SetObject($"HKCR\\" + "." + ext, "PerceivedType", "audio");
|
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", null, "Play with " + Application.ProductName);
|
||||||
RegHelp.SetObject($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
RegHelp.SetObject($"HKCR\\" + ExeFilenameNoExt + "." + ext + "\\shell\\open\\command", null, $"\"{ExePath}\" \"%1\"");
|
||||||
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities\FileAssociations", "." + ext, ExeFilenameNoExt + "." + ext);
|
RegHelp.SetObject(@"HKLM\SOFTWARE\Clients\Media\mpv.net\Capabilities\FileAssociations", "." + ext, ExeFilenameNoExt + "." + ext);
|
||||||
@@ -228,6 +237,13 @@ namespace mpvnet
|
|||||||
return val.ToString();
|
return val.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int GetInt(string path, string name)
|
||||||
|
{
|
||||||
|
object val = GetObject(path, name);
|
||||||
|
if (val == null || !(val is int)) return 0;
|
||||||
|
return (int)val;
|
||||||
|
}
|
||||||
|
|
||||||
public static object GetObject(string path, string name)
|
public static object GetObject(string path, string name)
|
||||||
{
|
{
|
||||||
using (RegistryKey rk = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
using (RegistryKey rk = GetRootKey(path).OpenSubKey(path.Substring(5)))
|
||||||
@@ -394,14 +410,16 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SingleProcess
|
public class PathHelp
|
||||||
{
|
{
|
||||||
public static int Message { get; } = RegisterWindowMessage("mpvnet_IPC");
|
public static string GetFileName(string path)
|
||||||
|
{
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
if (string.IsNullOrEmpty(path)) return "";
|
||||||
static extern int RegisterWindowMessage(string id);
|
int index = path.LastIndexOf('\\');
|
||||||
|
if (index > -1) return path.Substring(index + 1);
|
||||||
[DllImport("user32.dll")]
|
index = path.LastIndexOf('/');
|
||||||
public static extern bool AllowSetForegroundWindow(int dwProcessId);
|
if (index > -1) return path.Substring(index + 1);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,12 +15,16 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Application.EnableVisualStyles();
|
||||||
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
|
||||||
|
|
||||||
if (args.Length == 2 && args[0] == "--reg-file-assoc")
|
if (args.Length == 2 && args[0] == "--reg-file-assoc")
|
||||||
{
|
{
|
||||||
if (args[1] == "audio") FileAssociation.Register(App.AudioTypes);
|
if (args[1] == "audio") FileAssociation.Register(App.AudioTypes);
|
||||||
if (args[1] == "video") FileAssociation.Register(App.VideoTypes);
|
if (args[1] == "video") FileAssociation.Register(App.VideoTypes);
|
||||||
|
if (args[1] == "image") FileAssociation.Register(App.ImageTypes);
|
||||||
if (args[1] == "unreg") FileAssociation.Unregister();
|
if (args[1] == "unreg") FileAssociation.Unregister();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -31,31 +35,38 @@ namespace mpvnet
|
|||||||
if ((App.ProcessInstance == "single" || App.ProcessInstance == "queue") && !isFirst)
|
if ((App.ProcessInstance == "single" || App.ProcessInstance == "queue") && !isFirst)
|
||||||
{
|
{
|
||||||
List<string> files = new List<string>();
|
List<string> files = new List<string>();
|
||||||
|
files.Add(App.ProcessInstance);
|
||||||
|
|
||||||
foreach (string arg in args)
|
foreach (string arg in args)
|
||||||
if (!arg.StartsWith("--") && (File.Exists(arg) || arg == "-" || arg.StartsWith("http")))
|
if (!arg.StartsWith("--") && (arg == "-" || arg.Contains("://") || File.Exists(arg)))
|
||||||
files.Add(arg);
|
files.Add(arg);
|
||||||
|
|
||||||
if (files.Count > 0)
|
Process[] procs = Process.GetProcessesByName("mpvnet");
|
||||||
RegHelp.SetObject(App.RegPath, "ShellFiles", files.ToArray());
|
|
||||||
|
|
||||||
RegHelp.SetObject(App.RegPath, "ProcessInstanceMode", App.ProcessInstance);
|
for (int i = 0; i < 20; i++)
|
||||||
|
|
||||||
foreach(Process process in Process.GetProcessesByName("mpvnet"))
|
|
||||||
{
|
{
|
||||||
try {
|
foreach (Process proc in procs)
|
||||||
SingleProcess.AllowSetForegroundWindow(process.Id);
|
{
|
||||||
Native.SendMessage(process.MainWindowHandle, SingleProcess.Message, IntPtr.Zero, IntPtr.Zero);
|
if (proc.MainWindowHandle != IntPtr.Zero)
|
||||||
} catch {}
|
{
|
||||||
|
Native.AllowSetForegroundWindow(proc.Id);
|
||||||
|
var data = new Native.COPYDATASTRUCT();
|
||||||
|
data.lpData = string.Join("\n", files.ToArray());
|
||||||
|
data.cbData = data.lpData.Length * 2 + 1;
|
||||||
|
Native.SendMessage(proc.MainWindowHandle, 0x004A /*WM_COPYDATA*/, IntPtr.Zero, ref data);
|
||||||
|
mutex.Dispose();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Thread.Sleep(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex.Dispose();
|
mutex.Dispose();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Application.EnableVisualStyles();
|
if (App.IsStartedFromTerminal) Native.AttachConsole(-1 /*ATTACH_PARENT_PROCESS*/);
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
|
||||||
Application.Run(new MainForm());
|
Application.Run(new MainForm());
|
||||||
|
if (App.IsStartedFromTerminal) Native.FreeConsole();
|
||||||
mutex.Dispose();
|
mutex.Dispose();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -6,6 +6,12 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
public class Native
|
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")]
|
[DllImport("kernel32.dll")]
|
||||||
public static extern IntPtr LoadLibrary(string dllToLoad);
|
public static extern IntPtr LoadLibrary(string dllToLoad);
|
||||||
|
|
||||||
@@ -15,9 +21,15 @@ namespace mpvnet
|
|||||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||||
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
|
||||||
|
|
||||||
|
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||||
|
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
|
||||||
|
|
||||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||||
public static extern IntPtr PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
|
public static extern IntPtr PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
public static extern bool AllowSetForegroundWindow(int dwProcessId);
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
public static extern void ReleaseCapture();
|
public static extern void ReleaseCapture();
|
||||||
|
|
||||||
@@ -33,7 +45,7 @@ namespace mpvnet
|
|||||||
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
|
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
|
||||||
private static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex);
|
private static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex);
|
||||||
|
|
||||||
public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
|
public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex)
|
||||||
{
|
{
|
||||||
if (IntPtr.Size == 8)
|
if (IntPtr.Size == 8)
|
||||||
return GetWindowLong64(hWnd, nIndex);
|
return GetWindowLong64(hWnd, nIndex);
|
||||||
@@ -70,5 +82,14 @@ namespace mpvnet
|
|||||||
public int Width => Right - Left;
|
public int Width => Right - Left;
|
||||||
public int Height => Bottom - Top;
|
public int Height => Bottom - Top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
public struct COPYDATASTRUCT
|
||||||
|
{
|
||||||
|
public IntPtr dwData;
|
||||||
|
public int cbData;
|
||||||
|
[MarshalAs(UnmanagedType.LPStr)]
|
||||||
|
public string lpData;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static void AddWindowBorders(IntPtr hwnd, ref Native.RECT rc)
|
public static void AddWindowBorders(IntPtr hwnd, ref Native.RECT rc)
|
||||||
{
|
{
|
||||||
Native.AdjustWindowRect(ref rc, (uint)Native.GetWindowLongPtr(hwnd, -16 /* GWL_STYLE */), false);
|
Native.AdjustWindowRect(ref rc, (uint)Native.GetWindowLong(hwnd, -16 /* GWL_STYLE */), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,9 +6,9 @@ using System.Runtime.InteropServices;
|
|||||||
// set of attributes. Change these attribute values to modify the information
|
// set of attributes. Change these attribute values to modify the information
|
||||||
// associated with an assembly.
|
// associated with an assembly.
|
||||||
[assembly: AssemblyTitle("mpv.net")]
|
[assembly: AssemblyTitle("mpv.net")]
|
||||||
[assembly: AssemblyDescription("A modern media player")]
|
[assembly: AssemblyDescription("media player")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("Frank Skare (stax76)")]
|
||||||
[assembly: AssemblyProduct("mpv.net")]
|
[assembly: AssemblyProduct("mpv.net")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
[assembly: AssemblyCopyright("Copyright © 2017-2019 Frank Skare (stax76)")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("4.4.0.0")]
|
[assembly: AssemblyVersion("5.0.0.0")]
|
||||||
[assembly: AssemblyFileVersion("4.4.0.0")]
|
[assembly: AssemblyFileVersion("5.0.0.0")]
|
||||||
|
|||||||
36
mpv.net/Properties/Resources.Designer.cs
generated
@@ -96,7 +96,8 @@ namespace mpvnet.Properties {
|
|||||||
///keep-open-pause = no
|
///keep-open-pause = no
|
||||||
///osd-playing-msg = '${filename}'
|
///osd-playing-msg = '${filename}'
|
||||||
///screenshot-directory = '~~desktop/'
|
///screenshot-directory = '~~desktop/'
|
||||||
///input-default-bindings = no.
|
///input-default-bindings = no
|
||||||
|
///script-opts=osc-scalewindowed=1.5.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static string mpvConf {
|
internal static string mpvConf {
|
||||||
get {
|
get {
|
||||||
@@ -109,10 +110,10 @@ namespace mpvnet.Properties {
|
|||||||
///name = "hwdec"
|
///name = "hwdec"
|
||||||
///default = "no"
|
///default = "no"
|
||||||
///filter = "Video"
|
///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:"
|
///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" },
|
///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>
|
/// </summary>
|
||||||
internal static string mpvConfToml {
|
internal static string mpvConfToml {
|
||||||
get {
|
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>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to [[settings]]
|
/// Looks up a localized string similar to [[settings]]
|
||||||
///name = "dark-mode"
|
///name = "dark-mode"
|
||||||
///default = "always"
|
///default = "always"
|
||||||
///filter = "mpv.net"
|
///filter = "General"
|
||||||
///help = "Enables a dark theme."
|
///help = "Enables a dark theme. (mpv.net specific setting)"
|
||||||
///options = [{ name = "always" },
|
///options = [{ name = "always" },
|
||||||
/// { name = "system" , help = "Available on Windows 10 or higher" },
|
/// { name = "system" , help = "Available on Windows 10 or higher" },
|
||||||
/// { name = "never" }]
|
/// { name = "never" }]
|
||||||
///
|
///
|
||||||
///[[settings]]
|
///[[settings]]
|
||||||
///name = "url-whitelist"
|
///name = "dark-color"
|
||||||
///filter = "mpv.net"
|
///type = "color"
|
||||||
///type = "string"
|
///filter = "General"
|
||||||
///help = "Whitelist to monitor the clipboard for URLs to play.\n\nDefault: tube vimeo ard zdf"
|
///help = "Theme color used in dark-mode. Leave empty to use OS theme. (mpv.net specific setting)"
|
||||||
///
|
///
|
||||||
///[[settings]]
|
///[[settings]]
|
||||||
///name = "process-instance"
|
///name = "light-color"
|
||||||
///default = "single"
|
///type = "color"
|
||||||
///filter = "mpv.net"
|
///filter = "General" [rest of string was truncated]";.
|
||||||
///help = "Defines [rest of string was truncated]";.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static string mpvNetConfToml {
|
internal static string mpvNetConfToml {
|
||||||
get {
|
get {
|
||||||
|
|||||||
@@ -130,6 +130,9 @@
|
|||||||
<data name="mpvnet" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<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>
|
<value>..\Resources\mpvnet.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</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">
|
<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>
|
<value>..\Resources\mpvNetConfToml.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -24,8 +24,10 @@
|
|||||||
|
|
||||||
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys
|
# mpv input keys: https://github.com/stax76/mpv.net/wiki/mpv-input-keys
|
||||||
|
|
||||||
|
# run mpv.net in input test mode with: mpvnet --input-test
|
||||||
|
|
||||||
o script-message mpv.net open-files #menu: Open > Open Files...
|
o script-message mpv.net open-files #menu: Open > Open Files...
|
||||||
u script-message mpv.net open-url #menu: Open > Open URL...
|
u script-message mpv.net open-url #menu: Open > Open URL or file path from clipboard
|
||||||
_ ignore #menu: Open > -
|
_ ignore #menu: Open > -
|
||||||
Alt+a script-message mpv.net load-audio #menu: Open > Load external audio files...
|
Alt+a script-message mpv.net load-audio #menu: Open > Load external audio files...
|
||||||
Alt+s script-message mpv.net load-sub #menu: Open > Load external subtitle files...
|
Alt+s script-message mpv.net load-sub #menu: Open > Load external subtitle files...
|
||||||
@@ -129,15 +131,17 @@
|
|||||||
KP3 script-message rate-file 3 #menu: Extensions > Rating > 3stars
|
KP3 script-message rate-file 3 #menu: Extensions > Rating > 3stars
|
||||||
KP4 script-message rate-file 4 #menu: Extensions > Rating > 4stars
|
KP4 script-message rate-file 4 #menu: Extensions > Rating > 4stars
|
||||||
KP5 script-message rate-file 5 #menu: Extensions > Rating > 5stars
|
KP5 script-message rate-file 5 #menu: Extensions > Rating > 5stars
|
||||||
|
_ ignore #menu: Extensions > Rating > -
|
||||||
|
_ script-message rate-file about #menu: Extensions > Rating > About
|
||||||
|
|
||||||
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
Ctrl+t set ontop yes #menu: View > On Top > Enable
|
||||||
Ctrl+T set ontop no #menu: View > On Top > Disable
|
Ctrl+T set ontop no #menu: View > On Top > Disable
|
||||||
b cycle border #menu: View > Toggle Border
|
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 #menu: View > Show Statistics
|
||||||
T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
T script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
||||||
Del script-binding osc/visibility #menu: View > Toggle OSC Visibility
|
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
|
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
|
c script-message mpv.net show-conf-editor #menu: Settings > Show Config Editor
|
||||||
@@ -164,22 +168,27 @@
|
|||||||
Esc quit #menu: Exit
|
Esc quit #menu: Exit
|
||||||
Q quit-watch-later #menu: Exit Watch Later
|
Q quit-watch-later #menu: Exit Watch Later
|
||||||
|
|
||||||
> playlist-next
|
Power quit
|
||||||
< playlist-prev
|
Play cycle pause
|
||||||
Power quit
|
Pause cycle pause
|
||||||
Play cycle pause
|
PlayPause cycle pause
|
||||||
Pause cycle pause
|
MBTN_Mid cycle pause
|
||||||
PlayPause cycle pause
|
Stop stop
|
||||||
Stop stop
|
Forward seek 60
|
||||||
Forward seek 60
|
Rewind seek -60
|
||||||
Rewind seek -60
|
Mute cycle mute
|
||||||
Mute cycle mute
|
Volume_Up add volume 10
|
||||||
Volume_Up add volume 10
|
Volume_Down add volume -10
|
||||||
Volume_Down add volume -10
|
Wheel_Up add volume 10
|
||||||
Wheel_Up add volume 10
|
Wheel_Down add volume -10
|
||||||
Wheel_Down add volume -10
|
Prev playlist-prev
|
||||||
Prev playlist-prev
|
Next playlist-next
|
||||||
Next playlist-next
|
MBTN_Forward playlist-next
|
||||||
|
MBTN_Back playlist-prev
|
||||||
|
> playlist-next
|
||||||
|
< playlist-prev
|
||||||
Ctrl+Wheel_Up no-osd seek 7
|
Ctrl+Wheel_Up no-osd seek 7
|
||||||
Ctrl+Wheel_Down no-osd seek -7
|
Ctrl+Wheel_Down no-osd seek -7
|
||||||
MBTN_LEFT_DBL cycle fullscreen
|
MBTN_Left_DBL cycle fullscreen
|
||||||
|
KP_Enter cycle fullscreen
|
||||||
|
MBTN_Left ignore
|
||||||
@@ -11,4 +11,5 @@ keep-open = yes
|
|||||||
keep-open-pause = no
|
keep-open-pause = no
|
||||||
osd-playing-msg = '${filename}'
|
osd-playing-msg = '${filename}'
|
||||||
screenshot-directory = '~~desktop/'
|
screenshot-directory = '~~desktop/'
|
||||||
input-default-bindings = no
|
input-default-bindings = no
|
||||||
|
script-opts=osc-scalewindowed=1.5
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
name = "hwdec"
|
name = "hwdec"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "Video"
|
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:"
|
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" },
|
options = [{ name = "no", help = "always use software decoding" },
|
||||||
{ name = "auto", help = "enable best hw decoder (see below)" },
|
{ name = "auto", help = "enable best hw decoder (see below)" },
|
||||||
@@ -45,7 +45,7 @@ name = "vo"
|
|||||||
default = "gpu"
|
default = "gpu"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "Video output drivers to be used.\n\nFor more information visit:"
|
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." },
|
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" }]
|
{ name = "direct3d", help = "Video output driver that uses the Direct3D interface" }]
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ name = "video-sync"
|
|||||||
default = "audio"
|
default = "audio"
|
||||||
filter = "Video"
|
filter = "Video"
|
||||||
help = "How the player synchronizes audio and video.\n\nFor more information visit:"
|
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" },
|
options = [{ name = "audio" },
|
||||||
{ name = "display-resample" },
|
{ name = "display-resample" },
|
||||||
{ name = "display-resample-vdrop" },
|
{ name = "display-resample-vdrop" },
|
||||||
@@ -233,7 +233,7 @@ width = 300
|
|||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
type = "string"
|
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:"
|
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]]
|
[[settings]]
|
||||||
name = "osd-font-size"
|
name = "osd-font-size"
|
||||||
@@ -241,18 +241,81 @@ default = "55"
|
|||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Specify the OSD font size. See sub-font-size for details. Default: 55"
|
help = "Specify the OSD font size. See sub-font-size for details. Default: 55"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "autofit"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "<int> Initial window height in percent. Default: 50%"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "autofit-smaller"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "<int> Minimum window height in percent. Default: 40%"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "autofit-larger"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "<int> Maximum window height in percent. Default: 75%"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "screenshot-directory"
|
name = "screenshot-directory"
|
||||||
width = 500
|
width = 500
|
||||||
type = "folder"
|
type = "folder"
|
||||||
filter = "Screen"
|
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."
|
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]]
|
[[settings]]
|
||||||
name = "autofit"
|
name = "screenshot-format"
|
||||||
default = "50%"
|
default = "jpg"
|
||||||
filter = "Screen"
|
filter = "Screen"
|
||||||
help = "Set the initial window size in percent. Please note that this setting is only partly implemented in mpv.net, accepted are only integer values with percent sign added. Default: 50%"
|
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]]
|
[[settings]]
|
||||||
name = "keep-open-pause"
|
name = "keep-open-pause"
|
||||||
@@ -274,7 +337,7 @@ options = [{ name = "yes", help = "Don't terminate if the current file is the
|
|||||||
[[settings]]
|
[[settings]]
|
||||||
name = "loop-file"
|
name = "loop-file"
|
||||||
filter = "Playback"
|
filter = "Playback"
|
||||||
help = "Loop a single file N times. inf means forever, no means normal playback.\n\nThe difference to loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file. loop is an alias for this option."
|
help = "<N|inf|no> Loop a single file N times. inf means forever, no means normal playback.\n\nThe difference to loop-playlist is that this doesn't loop the playlist, just the file itself. If the playlist contains only a single file, the difference between the two option is that this option performs a seek on loop, instead of reloading the file. loop is an alias for this option."
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "save-position-on-quit"
|
name = "save-position-on-quit"
|
||||||
|
|||||||
2
mpv.net/Resources/mpvNetConf.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
dark-color = '#1E90FF'
|
||||||
|
light-color = '#28394F'
|
||||||
@@ -1,23 +1,35 @@
|
|||||||
[[settings]]
|
[[settings]]
|
||||||
name = "dark-mode"
|
name = "dark-mode"
|
||||||
default = "always"
|
default = "always"
|
||||||
filter = "mpv.net"
|
filter = "General"
|
||||||
help = "Enables a dark theme."
|
help = "Enables a dark theme. (mpv.net specific setting)"
|
||||||
options = [{ name = "always" },
|
options = [{ name = "always" },
|
||||||
{ name = "system" , help = "Available on Windows 10 or higher" },
|
{ name = "system" , help = "Available on Windows 10 or higher" },
|
||||||
{ name = "never" }]
|
{ 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]]
|
[[settings]]
|
||||||
name = "url-whitelist"
|
name = "url-whitelist"
|
||||||
filter = "mpv.net"
|
filter = "General"
|
||||||
type = "string"
|
type = "string"
|
||||||
help = "Whitelist to monitor the clipboard for URLs to play.\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"
|
||||||
|
|
||||||
[[settings]]
|
[[settings]]
|
||||||
name = "process-instance"
|
name = "process-instance"
|
||||||
default = "single"
|
default = "single"
|
||||||
filter = "mpv.net"
|
filter = "General"
|
||||||
help = "Defines if more then one mpv.net process is allowed."
|
help = "Defines if more then one mpv.net process is allowed. (mpv.net specific setting)\n\nTip: Whenever the control key is pressed when files or URLs are opened, the playlist is not cleared but the files or URLs are appended to the playlist. This not only works on process startup but in all mpv.net features that open files."
|
||||||
options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net" },
|
options = [{ name = "multi", help = "Create a new process everytime the shell starts mpv.net" },
|
||||||
{ name = "single", help = "Force a single process everytime the shell starts mpv.net" },
|
{ name = "single", help = "Force a single process everytime the shell starts mpv.net" },
|
||||||
{ name = "queue", help = "Force a single process and add files to playlist" }]
|
{ name = "queue", help = "Force a single process and add files to playlist" }]
|
||||||
@@ -25,7 +37,28 @@ options = [{ name = "multi", help = "Create a new process everytime the shell s
|
|||||||
[[settings]]
|
[[settings]]
|
||||||
name = "debug-mode"
|
name = "debug-mode"
|
||||||
default = "no"
|
default = "no"
|
||||||
filter = "mpv.net"
|
filter = "General"
|
||||||
help = "Writes debug info to a file located on the desktop."
|
help = "Enable this only when a developer asks for it. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "yes" },
|
||||||
|
{ name = "no" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "start-size"
|
||||||
|
default = "previous"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Setting to remember the window height in the current session, otherwise the video's native resolution is used. (mpv.net specific setting)"
|
||||||
|
options = [{ name = "video", help = "Window size is set to native video resolution" },
|
||||||
|
{ name = "previous", help = "Window size is remembered but only from the current session" }]
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "start-threshold"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Threshold in milliseconds to wait for libmpv returning the video resolution before the window is shown, otherwise default dimensions are used as defined by autofit and start-size. (mpv.net specific setting) Default: 1500"
|
||||||
|
|
||||||
|
[[settings]]
|
||||||
|
name = "remember-position"
|
||||||
|
default = "no"
|
||||||
|
filter = "Screen"
|
||||||
|
help = "Setting to save the window position on exit. (mpv.net specific setting)"
|
||||||
options = [{ name = "yes" },
|
options = [{ name = "yes" },
|
||||||
{ name = "no" }]
|
{ 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 |
@@ -1,5 +1,6 @@
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -9,7 +10,6 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Version.Text = $"Version {System.Windows.Forms.Application.ProductVersion}";
|
Version.Text = $"Version {System.Windows.Forms.Application.ProductVersion}";
|
||||||
Foreground = WPF.WPF.ThemeBrush;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnPreviewKeyDown(KeyEventArgs e) => Close();
|
protected override void OnPreviewKeyDown(KeyEventArgs e) => Close();
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
CommandItem item = ListView.SelectedItem as CommandItem;
|
CommandItem item = ListView.SelectedItem as CommandItem;
|
||||||
Close();
|
Close();
|
||||||
mp.command_string(item.Command);
|
mp.command(item.Command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
</ListBox.ItemTemplate>
|
</ListBox.ItemTemplate>
|
||||||
</ListBox>
|
</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="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="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>
|
<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>
|
</StackPanel>
|
||||||
|
|||||||
@@ -17,10 +17,9 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
private List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvConfToml);
|
private List<SettingBase> SettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvConfToml);
|
||||||
private List<SettingBase> NetSettingsDefinitions = Settings.LoadSettings(Properties.Resources.mpvNetConfToml);
|
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>();
|
public ObservableCollection<string> FilterStrings { get; } = new ObservableCollection<string>();
|
||||||
|
string InitialContent;
|
||||||
|
|
||||||
public ConfWindow()
|
public ConfWindow()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -28,6 +27,8 @@ namespace mpvnet
|
|||||||
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
SearchControl.SearchTextBox.TextChanged += SearchTextBox_TextChanged;
|
||||||
LoadSettings(SettingsDefinitions, Conf);
|
LoadSettings(SettingsDefinitions, Conf);
|
||||||
LoadSettings(NetSettingsDefinitions, NetConf);
|
LoadSettings(NetSettingsDefinitions, NetConf);
|
||||||
|
InitialContent = GetContent(mp.ConfPath, Conf, SettingsDefinitions) +
|
||||||
|
GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
|
||||||
SearchControl.Text = RegHelp.GetString(App.RegPath, "config editor search");
|
SearchControl.Text = RegHelp.GetString(App.RegPath, "config editor search");
|
||||||
|
|
||||||
if (App.IsDarkMode)
|
if (App.IsDarkMode)
|
||||||
@@ -59,7 +60,6 @@ namespace mpvnet
|
|||||||
if (setting.Name == pair.Key)
|
if (setting.Name == pair.Key)
|
||||||
{
|
{
|
||||||
setting.Value = pair.Value.Trim('\'', '"');
|
setting.Value = pair.Value.Trim('\'', '"');
|
||||||
setting.StartValue = pair.Value;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
public Dictionary<string, string> NetConf {
|
public Dictionary<string, string> NetConf {
|
||||||
get {
|
get {
|
||||||
if (_NetConf == null) _NetConf = LoadConf(App.ConfFilePath);
|
if (_NetConf == null) _NetConf = LoadConf(App.ConfPath);
|
||||||
return _NetConf;
|
return _NetConf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,6 @@ namespace mpvnet
|
|||||||
private Dictionary<string, string> LoadConf(string filePath)
|
private Dictionary<string, string> LoadConf(string filePath)
|
||||||
{
|
{
|
||||||
Dictionary<string, string> conf = new Dictionary<string, string>();
|
Dictionary<string, string> conf = new Dictionary<string, string>();
|
||||||
Comments[filePath] = new Dictionary<string, string>();
|
|
||||||
|
|
||||||
if (File.Exists(filePath))
|
if (File.Exists(filePath))
|
||||||
{
|
{
|
||||||
@@ -110,15 +109,9 @@ namespace mpvnet
|
|||||||
if (i.Contains("="))
|
if (i.Contains("="))
|
||||||
{
|
{
|
||||||
int pos = i.IndexOf("=");
|
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();
|
string right = i.Substring(pos + 1).Trim();
|
||||||
|
if (left.StartsWith("#")) continue;
|
||||||
if (left.StartsWith("#"))
|
|
||||||
{
|
|
||||||
Comments[filePath][left.TrimStart('#')] = right;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left == "fs") left = "fullscreen";
|
if (left == "fs") left = "fullscreen";
|
||||||
if (left == "loop") left = "loop-file";
|
if (left == "loop") left = "loop-file";
|
||||||
conf[left] = right;
|
conf[left] = right;
|
||||||
@@ -131,40 +124,20 @@ namespace mpvnet
|
|||||||
protected override void OnClosed(EventArgs e)
|
protected override void OnClosed(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnClosed(e);
|
base.OnClosed(e);
|
||||||
WriteToDisk();
|
string content = GetContent(mp.ConfPath, Conf, SettingsDefinitions);
|
||||||
|
string netContent = GetContent(App.ConfPath, NetConf, NetSettingsDefinitions);
|
||||||
|
if (InitialContent == content + netContent) return;
|
||||||
|
string header = "\r\n# manual: https://mpv.io/manual/master/\r\n\r\n# defaults: https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/mpvConf.txt\r\n\r\n";
|
||||||
|
File.WriteAllText(mp.ConfPath, header + content);
|
||||||
|
File.WriteAllText(App.ConfPath, netContent);
|
||||||
|
Msg.Show("Changes will be available on next mpv.net startup.");
|
||||||
RegHelp.SetObject(App.RegPath, "config editor search", SearchControl.Text);
|
RegHelp.SetObject(App.RegPath, "config editor search", SearchControl.Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteToDisk()
|
string GetContent(string filePath, Dictionary<string, string> confSettings, List<SettingBase> settings)
|
||||||
{
|
|
||||||
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 content = "";
|
string content = "";
|
||||||
|
|
||||||
foreach (var i in Comments[filePath])
|
|
||||||
content += $"#{i.Key} = {i.Value}\r\n";
|
|
||||||
|
|
||||||
foreach (SettingBase setting in settings)
|
foreach (SettingBase setting in settings)
|
||||||
{
|
{
|
||||||
if ((setting.Value ?? "") != setting.Default)
|
if ((setting.Value ?? "") != setting.Default)
|
||||||
@@ -186,7 +159,7 @@ namespace mpvnet
|
|||||||
foreach (var i in confSettings)
|
foreach (var i in confSettings)
|
||||||
content = content + $"{i.Key} = {i.Value}\r\n";
|
content = content + $"{i.Key} = {i.Value}\r\n";
|
||||||
|
|
||||||
File.WriteAllText(filePath, content);
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
private void SearchTextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||||
@@ -236,6 +209,11 @@ namespace mpvnet
|
|||||||
Process.Start(Path.GetDirectoryName(mp.ConfPath));
|
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)
|
private void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
{
|
{
|
||||||
Process.Start("https://mpv.io/manual/master/");
|
Process.Start("https://mpv.io/manual/master/");
|
||||||
|
|||||||
@@ -141,8 +141,12 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
Everything_GetResultFullPathName(i, buf, bufsize);
|
Everything_GetResultFullPathName(i, buf, bufsize);
|
||||||
string ext = Path.GetExtension(buf.ToString()).TrimStart('.').ToLower();
|
string ext = Path.GetExtension(buf.ToString()).TrimStart('.').ToLower();
|
||||||
if (App.AudioTypes.Contains(ext) || App.VideoTypes.Contains(ext))
|
|
||||||
|
if (App.AudioTypes.Contains(ext) || App.VideoTypes.Contains(ext) ||
|
||||||
|
App.ImageTypes.Contains(ext))
|
||||||
|
|
||||||
items.Add(buf.ToString());
|
items.Add(buf.ToString());
|
||||||
|
|
||||||
if (items.Count > 100) break;
|
if (items.Count > 100) break;
|
||||||
}
|
}
|
||||||
Application.Current.Dispatcher.Invoke(() => {
|
Application.Current.Dispatcher.Invoke(() => {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Learn Input" Height="200" Width="400" WindowStartupLocation="CenterOwner"
|
Title="Learn Input" Height="200" Width="400" WindowStartupLocation="CenterOwner"
|
||||||
ResizeMode="NoResize" Loaded="Window_Loaded" Background="Black" MouseWheel="Window_MouseWheel">
|
ResizeMode="NoResize" Loaded="Window_Loaded" Background="Black" MouseWheel="Window_MouseWheel" MouseUp="Window_MouseUp" MouseDoubleClick="Window_MouseDoubleClick">
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="*" />
|
<RowDefinition Height="*" />
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
<ColumnDefinition Width="*" />
|
<ColumnDefinition Width="*" />
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Label x:Name="MenuLabel" Grid.ColumnSpan="2" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16"></Label>
|
<TextBlock x:Name="MenuTextBlock" Grid.ColumnSpan="2" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="16"></TextBlock>
|
||||||
<Label x:Name="KeyLabel" Grid.Row="1" Grid.ColumnSpan="2" Foreground="White" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="16"></Label>
|
<TextBlock x:Name="KeyTextBlock" Grid.Row="1" Grid.ColumnSpan="2" Foreground="White" VerticalAlignment="Top" HorizontalAlignment="Center" FontSize="16"></TextBlock>
|
||||||
<Button x:Name="ConfirmButton" Grid.Row="2" Click="ConfirmButton_Click">Confirm</Button>
|
<Button x:Name="ConfirmButton" Grid.Row="2" Click="ConfirmButton_Click">Confirm</Button>
|
||||||
<Button x:Name="ClearButton" Grid.Row="2" Click="ClearButton_Click" Grid.Column="1">Clear</Button>
|
<Button x:Name="ClearButton" Grid.Row="2" Click="ClearButton_Click" Grid.Column="1">Clear</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -12,10 +12,7 @@ namespace mpvnet
|
|||||||
public CommandItem InputItem { get; set; }
|
public CommandItem InputItem { get; set; }
|
||||||
public string NewKey { get; set; } = "";
|
public string NewKey { get; set; } = "";
|
||||||
|
|
||||||
public LearnWindow()
|
public LearnWindow() => InitializeComponent();
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
|
||||||
{
|
{
|
||||||
@@ -43,8 +40,7 @@ namespace mpvnet
|
|||||||
else
|
else
|
||||||
try {
|
try {
|
||||||
text = Convert.ToChar(charValue).ToString().ToLower().Trim();
|
text = Convert.ToChar(charValue).ToString().ToLower().Trim();
|
||||||
}
|
} catch {}
|
||||||
catch {}
|
|
||||||
|
|
||||||
for (int i = 0; i < 13; i++)
|
for (int i = 0; i < 13; i++)
|
||||||
if ("D" + i.ToString() == text)
|
if ("D" + i.ToString() == text)
|
||||||
@@ -64,59 +60,59 @@ namespace mpvnet
|
|||||||
case WF.Keys.NumPad9:
|
case WF.Keys.NumPad9:
|
||||||
text = "KP" + e.KeyCode.ToString()[6].ToString(); break;
|
text = "KP" + e.KeyCode.ToString()[6].ToString(); break;
|
||||||
case WF.Keys.Space:
|
case WF.Keys.Space:
|
||||||
text = "Space"; break;
|
text = "SPACE"; break;
|
||||||
case WF.Keys.Enter:
|
case WF.Keys.Enter:
|
||||||
text = "Enter"; break;
|
text = "ENTER"; break;
|
||||||
case WF.Keys.Tab:
|
case WF.Keys.Tab:
|
||||||
text = "Tab"; break;
|
text = "TAB"; break;
|
||||||
case WF.Keys.Back:
|
case WF.Keys.Back:
|
||||||
text = "BS"; break;
|
text = "BS"; break;
|
||||||
case WF.Keys.Delete:
|
case WF.Keys.Delete:
|
||||||
text = "Del"; break;
|
text = "DEL"; break;
|
||||||
case WF.Keys.Insert:
|
case WF.Keys.Insert:
|
||||||
text = "Ins"; break;
|
text = "INS"; break;
|
||||||
case WF.Keys.Home:
|
case WF.Keys.Home:
|
||||||
text = "Home"; break;
|
text = "HOME"; break;
|
||||||
case WF.Keys.End:
|
case WF.Keys.End:
|
||||||
text = "End"; break;
|
text = "END"; break;
|
||||||
case WF.Keys.PageUp:
|
case WF.Keys.PageUp:
|
||||||
text = "PGUP"; break;
|
text = "PGUP"; break;
|
||||||
case WF.Keys.PageDown:
|
case WF.Keys.PageDown:
|
||||||
text = "PGDWN"; break;
|
text = "PGDWN"; break;
|
||||||
case WF.Keys.Escape:
|
case WF.Keys.Escape:
|
||||||
text = "Esc"; break;
|
text = "ESC"; break;
|
||||||
case WF.Keys.PrintScreen:
|
case WF.Keys.PrintScreen:
|
||||||
text = "Print"; break;
|
text = "PRINT"; break;
|
||||||
case WF.Keys.Play:
|
case WF.Keys.Play:
|
||||||
text = "Play"; break;
|
text = "PLAY"; break;
|
||||||
case WF.Keys.Pause:
|
case WF.Keys.Pause:
|
||||||
text = "Pause"; break;
|
text = "PAUSE"; break;
|
||||||
case WF.Keys.MediaPlayPause:
|
case WF.Keys.MediaPlayPause:
|
||||||
text = "PlayPause"; break;
|
text = "PLAYPAUSE"; break;
|
||||||
case WF.Keys.MediaStop:
|
case WF.Keys.MediaStop:
|
||||||
text = "Stop"; break;
|
text = "STOP"; break;
|
||||||
case WF.Keys.MediaNextTrack:
|
case WF.Keys.MediaNextTrack:
|
||||||
text = "Next"; break;
|
text = "NEXT"; break;
|
||||||
case WF.Keys.MediaPreviousTrack:
|
case WF.Keys.MediaPreviousTrack:
|
||||||
text = "Prev"; break;
|
text = "PREV"; break;
|
||||||
case WF.Keys.VolumeUp:
|
case WF.Keys.VolumeUp:
|
||||||
text = "Volume_Up"; break;
|
text = "VOLUME_UP"; break;
|
||||||
case WF.Keys.VolumeDown:
|
case WF.Keys.VolumeDown:
|
||||||
text = "Volume_Down"; break;
|
text = "VOLUME_DOWN"; break;
|
||||||
case WF.Keys.VolumeMute:
|
case WF.Keys.VolumeMute:
|
||||||
text = "Mute"; break;
|
text = "MUTE"; break;
|
||||||
case WF.Keys.BrowserHome:
|
case WF.Keys.BrowserHome:
|
||||||
text = "Homepage"; break;
|
text = "HOMEPAGE"; break;
|
||||||
case WF.Keys.LaunchMail:
|
case WF.Keys.LaunchMail:
|
||||||
text = "Mail"; break;
|
text = "MAIL"; break;
|
||||||
case WF.Keys.BrowserFavorites:
|
case WF.Keys.BrowserFavorites:
|
||||||
text = "Favorites"; break;
|
text = "FAVORITES"; break;
|
||||||
case WF.Keys.BrowserSearch:
|
case WF.Keys.BrowserSearch:
|
||||||
text = "Search"; break;
|
text = "SEARCH"; break;
|
||||||
case WF.Keys.Sleep:
|
case WF.Keys.Sleep:
|
||||||
text = "Sleep"; break;
|
text = "SLEEP"; break;
|
||||||
case WF.Keys.Cancel:
|
case WF.Keys.Cancel:
|
||||||
text = "Cancel"; break;
|
text = "CANCEL"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool shiftWasHandled = false;
|
bool shiftWasHandled = false;
|
||||||
@@ -141,11 +137,14 @@ namespace mpvnet
|
|||||||
SetKey(text);
|
SetKey(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DateTime LastKeyUp;
|
||||||
|
|
||||||
void SetKey(string key)
|
void SetKey(string key)
|
||||||
{
|
{
|
||||||
NewKey = key;
|
NewKey = key;
|
||||||
MenuLabel.Content = InputItem.Path;
|
MenuTextBlock.Text = InputItem.Path;
|
||||||
KeyLabel.Content = key;
|
KeyTextBlock.Text = key;
|
||||||
|
LastKeyUp = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("user32.dll")]
|
[DllImport("user32.dll")]
|
||||||
@@ -190,49 +189,66 @@ namespace mpvnet
|
|||||||
OnKeyUp(new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys));
|
OnKeyUp(new WF.KeyEventArgs((WF.Keys)(unchecked((int)(long)m.WParam)) | ModifierKeys));
|
||||||
else if (m.Msg == WM_APPCOMMAND)
|
else if (m.Msg == WM_APPCOMMAND)
|
||||||
{
|
{
|
||||||
switch ((AppCommand)(m.LParam.ToInt32() >> 16))
|
var value = (AppCommand)(m.LParam.ToInt64() >> 16 & ~0xf000);
|
||||||
|
|
||||||
|
switch (value)
|
||||||
{
|
{
|
||||||
case AppCommand.MEDIA_CHANNEL_DOWN:
|
case AppCommand.APPCOMMAND_MEDIA_CHANNEL_DOWN:
|
||||||
SetKey("Channel_Down");
|
SetKey("CHANNEL_DOWN");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_CHANNEL_UP:
|
case AppCommand.APPCOMMAND_MEDIA_CHANNEL_UP:
|
||||||
SetKey("Channel_Up");
|
SetKey("CHANNEL_UP");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_FAST_FORWARD:
|
case AppCommand.APPCOMMAND_MEDIA_FAST_FORWARD:
|
||||||
SetKey("Forward");
|
SetKey("FORWARD");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_REWIND:
|
case AppCommand.APPCOMMAND_MEDIA_REWIND:
|
||||||
SetKey("Rewind");
|
SetKey("REWIND");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_PAUSE:
|
case AppCommand.APPCOMMAND_MEDIA_PAUSE:
|
||||||
SetKey("Pause");
|
SetKey("PAUSE");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_PLAY:
|
case AppCommand.APPCOMMAND_MEDIA_PLAY:
|
||||||
SetKey("Play");
|
SetKey("PLAY");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_PLAY_PAUSE:
|
case AppCommand.APPCOMMAND_MEDIA_PLAY_PAUSE:
|
||||||
SetKey("PlayPause");
|
SetKey("PLAYPAUSE");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_NEXTTRACK:
|
case AppCommand.APPCOMMAND_MEDIA_NEXTTRACK:
|
||||||
SetKey("Next");
|
SetKey("NEXT");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_PREVIOUSTRACK:
|
case AppCommand.APPCOMMAND_MEDIA_PREVIOUSTRACK:
|
||||||
SetKey("Prev");
|
SetKey("PREV");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_RECORD:
|
case AppCommand.APPCOMMAND_MEDIA_RECORD:
|
||||||
SetKey("Record");
|
SetKey("RECORD");
|
||||||
break;
|
break;
|
||||||
case AppCommand.MEDIA_STOP:
|
case AppCommand.APPCOMMAND_MEDIA_STOP:
|
||||||
SetKey("Stop");
|
SetKey("STOP");
|
||||||
break;
|
break;
|
||||||
case AppCommand.VolumeUp:
|
case AppCommand.APPCOMMAND_VOLUME_UP:
|
||||||
SetKey("Volume_Up");
|
SetKey("VOLUME_UP");
|
||||||
break;
|
break;
|
||||||
case AppCommand.VolumeDown:
|
case AppCommand.APPCOMMAND_VOLUME_DOWN:
|
||||||
SetKey("Volume_Down");
|
SetKey("VOLUME_DOWN");
|
||||||
break;
|
break;
|
||||||
case AppCommand.VolumeMute:
|
case AppCommand.APPCOMMAND_VOLUME_MUTE:
|
||||||
SetKey("Mute");
|
SetKey("MUTE");
|
||||||
|
break;
|
||||||
|
case AppCommand.APPCOMMAND_BROWSER_HOME:
|
||||||
|
SetKey("HOMEPAGE");
|
||||||
|
break;
|
||||||
|
case AppCommand.APPCOMMAND_LAUNCH_MAIL:
|
||||||
|
SetKey("MAIL");
|
||||||
|
break;
|
||||||
|
case AppCommand.APPCOMMAND_BROWSER_FAVORITES:
|
||||||
|
SetKey("FAVORITES");
|
||||||
|
break;
|
||||||
|
case AppCommand.APPCOMMAND_BROWSER_SEARCH:
|
||||||
|
SetKey("SEARCH");
|
||||||
|
break;
|
||||||
|
case AppCommand.APPCOMMAND_PRINT:
|
||||||
|
SetKey("PRINT");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -240,20 +256,58 @@ namespace mpvnet
|
|||||||
|
|
||||||
internal enum AppCommand
|
internal enum AppCommand
|
||||||
{
|
{
|
||||||
MEDIA_CHANNEL_DOWN = 52,
|
APPCOMMAND_BASS_BOOST = 20,
|
||||||
MEDIA_CHANNEL_UP = 51,
|
APPCOMMAND_BASS_DOWN = 19,
|
||||||
MEDIA_FAST_FORWARD = 49,
|
APPCOMMAND_BASS_UP = 21,
|
||||||
MEDIA_NEXTTRACK = 11,
|
APPCOMMAND_BROWSER_BACKWARD = 1,
|
||||||
MEDIA_PAUSE = 47,
|
APPCOMMAND_BROWSER_FAVORITES = 6,
|
||||||
MEDIA_PLAY = 46,
|
APPCOMMAND_BROWSER_FORWARD = 2,
|
||||||
MEDIA_PLAY_PAUSE = 14,
|
APPCOMMAND_BROWSER_HOME = 7,
|
||||||
MEDIA_PREVIOUSTRACK = 12,
|
APPCOMMAND_BROWSER_REFRESH = 3,
|
||||||
MEDIA_RECORD = 48,
|
APPCOMMAND_BROWSER_SEARCH = 5,
|
||||||
MEDIA_REWIND = 50,
|
APPCOMMAND_BROWSER_STOP = 4,
|
||||||
MEDIA_STOP = 13,
|
APPCOMMAND_CLOSE = 31,
|
||||||
VolumeMute = 8,
|
APPCOMMAND_COPY = 36,
|
||||||
VolumeDown = 9,
|
APPCOMMAND_CORRECTION_LIST = 45,
|
||||||
VolumeUp = 10
|
APPCOMMAND_CUT = 37,
|
||||||
|
APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE = 43,
|
||||||
|
APPCOMMAND_FIND = 28,
|
||||||
|
APPCOMMAND_FORWARD_MAIL = 40,
|
||||||
|
APPCOMMAND_HELP = 27,
|
||||||
|
APPCOMMAND_LAUNCH_APP1 = 17,
|
||||||
|
APPCOMMAND_LAUNCH_APP2 = 18,
|
||||||
|
APPCOMMAND_LAUNCH_MAIL = 15,
|
||||||
|
APPCOMMAND_LAUNCH_MEDIA_SELECT = 16,
|
||||||
|
APPCOMMAND_MEDIA_CHANNEL_DOWN = 52,
|
||||||
|
APPCOMMAND_MEDIA_CHANNEL_UP = 51,
|
||||||
|
APPCOMMAND_MEDIA_FAST_FORWARD = 49,
|
||||||
|
APPCOMMAND_MEDIA_NEXTTRACK = 11,
|
||||||
|
APPCOMMAND_MEDIA_PAUSE = 47,
|
||||||
|
APPCOMMAND_MEDIA_PLAY = 46,
|
||||||
|
APPCOMMAND_MEDIA_PLAY_PAUSE = 14,
|
||||||
|
APPCOMMAND_MEDIA_PREVIOUSTRACK = 12,
|
||||||
|
APPCOMMAND_MEDIA_RECORD = 48,
|
||||||
|
APPCOMMAND_MEDIA_REWIND = 50,
|
||||||
|
APPCOMMAND_MEDIA_STOP = 13,
|
||||||
|
APPCOMMAND_MIC_ON_OFF_TOGGLE = 44,
|
||||||
|
APPCOMMAND_MICROPHONE_VOLUME_DOWN = 25,
|
||||||
|
APPCOMMAND_MICROPHONE_VOLUME_MUTE = 24,
|
||||||
|
APPCOMMAND_MICROPHONE_VOLUME_UP = 26,
|
||||||
|
APPCOMMAND_NEW = 29,
|
||||||
|
APPCOMMAND_OPEN = 30,
|
||||||
|
APPCOMMAND_PASTE = 38,
|
||||||
|
APPCOMMAND_PRINT = 33,
|
||||||
|
APPCOMMAND_REDO = 35,
|
||||||
|
APPCOMMAND_REPLY_TO_MAIL = 39,
|
||||||
|
APPCOMMAND_SAVE = 32,
|
||||||
|
APPCOMMAND_SEND_MAIL = 41,
|
||||||
|
APPCOMMAND_SPELL_CHECK = 42,
|
||||||
|
APPCOMMAND_TREBLE_DOWN = 22,
|
||||||
|
APPCOMMAND_TREBLE_UP = 23,
|
||||||
|
APPCOMMAND_UNDO = 34,
|
||||||
|
APPCOMMAND_VOLUME_DOWN = 9,
|
||||||
|
APPCOMMAND_VOLUME_MUTE = 8,
|
||||||
|
APPCOMMAND_VOLUME_UP = 10
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||||
@@ -295,5 +349,38 @@ namespace mpvnet
|
|||||||
else
|
else
|
||||||
SetKey("WHEEL_DOWN");
|
SetKey("WHEEL_DOWN");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Window_MouseUp(object sender, MouseButtonEventArgs e)
|
||||||
|
{
|
||||||
|
switch (e.ChangedButton)
|
||||||
|
{
|
||||||
|
case MouseButton.Left:
|
||||||
|
if (BlockMBTN_LEFT)
|
||||||
|
BlockMBTN_LEFT = false;
|
||||||
|
else
|
||||||
|
SetKey("MBTN_LEFT");
|
||||||
|
break;
|
||||||
|
case MouseButton.Middle:
|
||||||
|
SetKey("MBTN_MID");
|
||||||
|
break;
|
||||||
|
case MouseButton.XButton1:
|
||||||
|
SetKey("MBTN_BACK");
|
||||||
|
break;
|
||||||
|
case MouseButton.XButton2:
|
||||||
|
SetKey("MBTN_FORWARD");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BlockMBTN_LEFT;
|
||||||
|
|
||||||
|
private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ChangedButton == MouseButton.Left)
|
||||||
|
{
|
||||||
|
SetKey("MBTN_LEFT_DBL");
|
||||||
|
BlockMBTN_LEFT = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Globalization;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
using Microsoft.Win32;
|
||||||
|
using mpvnet;
|
||||||
|
|
||||||
namespace WPF
|
namespace WPF
|
||||||
{
|
{
|
||||||
public class WPF
|
public class WPF
|
||||||
@@ -22,12 +26,43 @@ namespace WPF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Brush ThemeBrush {
|
public static Brush ThemeBrush { get; } = new SolidColorBrush(ThemeColor);
|
||||||
|
|
||||||
|
static bool WasThemeColorSet;
|
||||||
|
|
||||||
|
static Color _ThemeColor;
|
||||||
|
|
||||||
|
public static Color ThemeColor {
|
||||||
get {
|
get {
|
||||||
if (Environment.OSVersion.Version.Major < 10)
|
if (!WasThemeColorSet)
|
||||||
return new SolidColorBrush(Colors.DarkSlateGray);
|
{
|
||||||
else
|
Color? color = null;
|
||||||
return SystemParameters.WindowGlassBrush;
|
|
||||||
|
try {
|
||||||
|
if (App.IsDarkMode && !string.IsNullOrEmpty(App.DarkColor))
|
||||||
|
color = (Color)ColorConverter.ConvertFromString(App.DarkColor);
|
||||||
|
else if (!App.IsDarkMode && !string.IsNullOrEmpty(App.LightColor))
|
||||||
|
color = (Color)ColorConverter.ConvertFromString(App.LightColor);
|
||||||
|
} catch { }
|
||||||
|
|
||||||
|
if (!color.HasValue)
|
||||||
|
{
|
||||||
|
if (Environment.OSVersion.Version.Major < 10)
|
||||||
|
{
|
||||||
|
int argb = Convert.ToInt32(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0));
|
||||||
|
var wfc = System.Drawing.Color.FromArgb(argb);
|
||||||
|
color = Color.FromArgb(wfc.A, wfc.R, wfc.G, wfc.B);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
color = SystemParameters.WindowGlassColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (App.IsDarkMode && color == Colors.Black) color = Colors.Orange;
|
||||||
|
if (!App.IsDarkMode && color == Colors.White) color = Colors.Orange;
|
||||||
|
_ThemeColor = color.Value;
|
||||||
|
WasThemeColorSet = true;
|
||||||
|
}
|
||||||
|
return _ThemeColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
mpv.net/WinForms/MainForm.Designer.cs
generated
@@ -45,13 +45,12 @@
|
|||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(288F, 288F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(288F, 288F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
|
||||||
this.BackColor = System.Drawing.Color.Black;
|
this.BackColor = System.Drawing.Color.Black;
|
||||||
this.ClientSize = new System.Drawing.Size(606, 368);
|
this.ClientSize = new System.Drawing.Size(542, 0);
|
||||||
this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
|
||||||
this.Name = "MainForm";
|
this.Name = "MainForm";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||||
this.Text = "mpv.net";
|
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ using System.Linq;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace mpvnet
|
namespace mpvnet
|
||||||
{
|
{
|
||||||
@@ -20,7 +22,7 @@ namespace mpvnet
|
|||||||
|
|
||||||
Point LastCursorPosChanged;
|
Point LastCursorPosChanged;
|
||||||
int LastCursorChangedTickCount;
|
int LastCursorChangedTickCount;
|
||||||
bool IgnoreDpiChanged = true;
|
bool WasShown;
|
||||||
List<string> RecentFiles;
|
List<string> RecentFiles;
|
||||||
|
|
||||||
public MainForm()
|
public MainForm()
|
||||||
@@ -29,15 +31,13 @@ namespace mpvnet
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
|
||||||
Application.ThreadException += Application_ThreadException;
|
|
||||||
Msg.SupportURL = "https://github.com/stax76/mpv.net#support";
|
|
||||||
Instance = this;
|
Instance = this;
|
||||||
WPF.WPF.Init();
|
|
||||||
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
|
||||||
Hwnd = Handle;
|
Hwnd = Handle;
|
||||||
MinimumSize = new Size(FontHeight * 16, FontHeight * 9);
|
mp.Init();
|
||||||
Text += " " + Application.ProductVersion;
|
AppDomain.CurrentDomain.UnhandledException += (sender, e) => Msg.ShowError(e.ExceptionObject.ToString());
|
||||||
|
Application.ThreadException += (sender, e) => Msg.ShowException(e.Exception);
|
||||||
|
Msg.SupportURL = "https://github.com/stax76/mpv.net#support";
|
||||||
|
Text = "mpv.net " + Application.ProductVersion;
|
||||||
|
|
||||||
object recent = RegHelp.GetObject(App.RegPath, "Recent");
|
object recent = RegHelp.GetObject(App.RegPath, "Recent");
|
||||||
|
|
||||||
@@ -46,11 +46,44 @@ namespace mpvnet
|
|||||||
else
|
else
|
||||||
RecentFiles = new List<string>();
|
RecentFiles = new List<string>();
|
||||||
|
|
||||||
var dummy = mp.Conf;
|
ContextMenu = new ContextMenuStripEx(components);
|
||||||
|
ContextMenu.Opened += ContextMenu_Opened;
|
||||||
|
ContextMenu.Opening += ContextMenu_Opening;
|
||||||
|
|
||||||
App.ProcessCommandLineEarly();
|
App.ProcessCommandLineEarly();
|
||||||
|
|
||||||
if (mp.Screen == -1) mp.Screen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen);
|
if (mp.Screen == -1) mp.Screen = Array.IndexOf(Screen.AllScreens, Screen.PrimaryScreen);
|
||||||
SetScreen(mp.Screen);
|
int targetIndex = mp.Screen;
|
||||||
CycleFullscreen(mp.Fullscreen);
|
Screen[] screens = Screen.AllScreens;
|
||||||
|
if (targetIndex < 0) targetIndex = 0;
|
||||||
|
if (targetIndex > screens.Length - 1) targetIndex = screens.Length - 1;
|
||||||
|
Screen screen = screens[Array.IndexOf(screens, screens[targetIndex])];
|
||||||
|
Rectangle target = screen.Bounds;
|
||||||
|
Left = target.X + (target.Width - Width) / 2;
|
||||||
|
Top = target.Y + (target.Height - Height) / 2;
|
||||||
|
|
||||||
|
int posX = RegHelp.GetInt(App.RegPath, "PosX");
|
||||||
|
int posY = RegHelp.GetInt(App.RegPath, "PosY");
|
||||||
|
|
||||||
|
if (posX != 0 && posY != 0 && App.RememberPosition)
|
||||||
|
{
|
||||||
|
Left = posX - Width / 2;
|
||||||
|
Top = posY - Height / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp.Shutdown += Shutdown;
|
||||||
|
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);
|
||||||
|
mp.observe_property_string("sid", PropChangeSid);
|
||||||
|
mp.observe_property_string("aid", PropChangeAid);
|
||||||
|
mp.observe_property_string("vid", PropChangeVid);
|
||||||
|
mp.observe_property_int("edition", PropChangeEdition);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -60,11 +93,11 @@ namespace mpvnet
|
|||||||
|
|
||||||
public MenuItem FindMenuItem(string text) => FindMenuItem(text, ContextMenu.Items);
|
public MenuItem FindMenuItem(string text) => FindMenuItem(text, ContextMenu.Items);
|
||||||
|
|
||||||
void Idle() => BeginInvoke(new Action(() => { Text = "mpv.net " + Application.ProductVersion; }));
|
void Idle() => BeginInvoke(new Action(() => Text = "mpv.net " + Application.ProductVersion));
|
||||||
|
|
||||||
void CM_Popup(object sender, EventArgs e) => CursorHelp.Show();
|
void CM_Popup(object sender, EventArgs e) => CursorHelp.Show();
|
||||||
|
|
||||||
void VideoSizeChanged() => BeginInvoke(new Action(() => SetFormPosAndSizeKeepHeight()));
|
void VideoSizeChanged() => BeginInvoke(new Action(() => SetFormPosAndSize()));
|
||||||
|
|
||||||
void Shutdown() => BeginInvoke(new Action(() => Close()));
|
void Shutdown() => BeginInvoke(new Action(() => Close()));
|
||||||
|
|
||||||
@@ -192,50 +225,111 @@ namespace mpvnet
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void SetScreen(int targetIndex)
|
bool WasInitialSizeSet;
|
||||||
{
|
|
||||||
Screen[] screens = Screen.AllScreens;
|
|
||||||
if (targetIndex < 0) targetIndex = 0;
|
|
||||||
if (targetIndex > screens.Length - 1) targetIndex = screens.Length - 1;
|
|
||||||
SetScreen(screens[Array.IndexOf(screens, screens[targetIndex])]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void SetScreen(Screen screen)
|
void SetFormPosAndSize()
|
||||||
{
|
{
|
||||||
Rectangle target = screen.Bounds;
|
if (mp.Fullscreen)
|
||||||
Left = target.X + Convert.ToInt32((target.Width - Width) / 2.0);
|
{
|
||||||
Top = target.Y + Convert.ToInt32((target.Height - Height) / 2.0);
|
CycleFullscreen(true);
|
||||||
SetStartFormPositionAndSize();
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetStartFormPositionAndSize()
|
|
||||||
{
|
|
||||||
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
|
||||||
Screen screen = Screen.FromControl(this);
|
Screen screen = Screen.FromControl(this);
|
||||||
int height = Convert.ToInt32(screen.Bounds.Height * mp.Autofit);
|
int autoFitHeight = Convert.ToInt32(screen.WorkingArea.Height * mp.Autofit);
|
||||||
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
|
||||||
|
if (mp.VideoSize.Height == 0 || mp.VideoSize.Width == 0 ||
|
||||||
|
mp.VideoSize.Width / (float)mp.VideoSize.Height < 1.3)
|
||||||
|
|
||||||
|
mp.VideoSize = new Size((int)(autoFitHeight * (16 / 9.0)), autoFitHeight);
|
||||||
|
|
||||||
|
Size size = mp.VideoSize;
|
||||||
|
|
||||||
|
int height = size.Height;
|
||||||
|
|
||||||
|
if (App.RememberHeight)
|
||||||
|
{
|
||||||
|
if (WasInitialSizeSet)
|
||||||
|
height = ClientSize.Height;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
height = autoFitHeight;
|
||||||
|
WasInitialSizeSet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int width = Convert.ToInt32(height * size.Width / (double)size.Height);
|
||||||
|
|
||||||
|
if (height > screen.WorkingArea.Height * 0.9)
|
||||||
|
{
|
||||||
|
height = Convert.ToInt32(screen.WorkingArea.Height * 0.9);
|
||||||
|
width = Convert.ToInt32(height * size.Width / (double)size.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (width > screen.WorkingArea.Width * 0.9)
|
||||||
|
{
|
||||||
|
width = Convert.ToInt32(screen.WorkingArea.Width * 0.9);
|
||||||
|
height = Convert.ToInt32(width * size.Height / (double)size.Width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (height < screen.WorkingArea.Height * mp.AutofitSmaller)
|
||||||
|
{
|
||||||
|
height = Convert.ToInt32(screen.WorkingArea.Height * mp.AutofitSmaller);
|
||||||
|
width = Convert.ToInt32(height * size.Width / (double)size.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (height > screen.WorkingArea.Height * mp.AutofitLarger)
|
||||||
|
{
|
||||||
|
height = Convert.ToInt32(screen.WorkingArea.Height * mp.AutofitLarger);
|
||||||
|
width = Convert.ToInt32(height * size.Width / (double)size.Height);
|
||||||
|
}
|
||||||
|
|
||||||
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
||||||
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
||||||
NativeHelp.AddWindowBorders(Handle, ref rect);
|
NativeHelp.AddWindowBorders(Handle, ref rect);
|
||||||
int left = middlePos.X - rect.Width / 2;
|
int left = middlePos.X - rect.Width / 2;
|
||||||
int top = middlePos.Y - rect.Height / 2;
|
int top = middlePos.Y - rect.Height / 2;
|
||||||
|
|
||||||
|
Screen[] screens = Screen.AllScreens;
|
||||||
|
int minLeft = screens.Select(val => val.WorkingArea.X).Min();
|
||||||
|
int maxRight = screens.Select(val => val.WorkingArea.Right).Max();
|
||||||
|
int minTop = screens.Select(val => val.WorkingArea.Y).Min();
|
||||||
|
int maxBottom = screens.Select(val => val.WorkingArea.Bottom).Max();
|
||||||
|
|
||||||
|
if (left < minLeft) left = minLeft;
|
||||||
|
if (left + rect.Width > maxRight) left = maxRight - rect.Width;
|
||||||
|
if (top < minTop) top = minTop;
|
||||||
|
if (top + rect.Height > maxBottom) top = maxBottom - rect.Height;
|
||||||
|
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetFormPosAndSizeKeepHeight()
|
public void CycleFullscreen(bool enabled)
|
||||||
{
|
{
|
||||||
if (IsFullscreen || mp.VideoSize.Width == 0) return;
|
mp.Fullscreen = enabled;
|
||||||
Screen screen = Screen.FromControl(this);
|
|
||||||
int height = ClientSize.Height;
|
if (enabled)
|
||||||
if (height > screen.Bounds.Height * 0.9) height = Convert.ToInt32(screen.Bounds.Height * mp.Autofit);
|
{
|
||||||
int width = Convert.ToInt32(height * mp.VideoSize.Width / (double)mp.VideoSize.Height);
|
if (WindowState != FormWindowState.Maximized)
|
||||||
Point middlePos = new Point(Left + Width / 2, Top + Height / 2);
|
{
|
||||||
var rect = new Native.RECT(new Rectangle(screen.Bounds.X, screen.Bounds.Y, width, height));
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
NativeHelp.AddWindowBorders(Handle, ref rect);
|
WindowState = FormWindowState.Maximized;
|
||||||
int left = middlePos.X - rect.Width / 2;
|
}
|
||||||
int top = middlePos.Y - rect.Height / 2;
|
}
|
||||||
Screen[] screens = Screen.AllScreens;
|
else
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero /* HWND_TOP */, left, top, rect.Width, rect.Height, 4 /* SWP_NOZORDER */);
|
{
|
||||||
|
if (WindowState == FormWindowState.Maximized)
|
||||||
|
{
|
||||||
|
WindowState = FormWindowState.Normal;
|
||||||
|
|
||||||
|
if (mp.Border)
|
||||||
|
FormBorderStyle = FormBorderStyle.Sizable;
|
||||||
|
else
|
||||||
|
FormBorderStyle = FormBorderStyle.None;
|
||||||
|
|
||||||
|
SetFormPosAndSize();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BuildMenu()
|
public void BuildMenu()
|
||||||
@@ -259,7 +353,7 @@ namespace mpvnet
|
|||||||
string path = item.Path.Replace("&", "&&");
|
string path = item.Path.Replace("&", "&&");
|
||||||
MenuItem menuItem = ContextMenu.Add(path, () => {
|
MenuItem menuItem = ContextMenu.Add(path, () => {
|
||||||
try {
|
try {
|
||||||
mp.command_string(item.Command);
|
mp.command(item.Command);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Msg.ShowException(ex);
|
Msg.ShowException(ex);
|
||||||
}
|
}
|
||||||
@@ -272,8 +366,8 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
string path = mp.get_property_string("path");
|
string path = mp.get_property_string("path");
|
||||||
BeginInvoke(new Action(() => {
|
BeginInvoke(new Action(() => {
|
||||||
if (File.Exists(path) || path.StartsWith("http"))
|
if (File.Exists(path) || path.Contains("://"))
|
||||||
Text = Path.GetFileName(path) + " - mpv.net " + Application.ProductVersion;
|
Text = PathHelp.GetFileName(path) + " - mpv.net " + Application.ProductVersion;
|
||||||
else
|
else
|
||||||
Text = "mpv.net " + Application.ProductVersion;
|
Text = "mpv.net " + Application.ProductVersion;
|
||||||
}));
|
}));
|
||||||
@@ -282,72 +376,53 @@ namespace mpvnet
|
|||||||
if (RecentFiles.Count > 15) RecentFiles.RemoveAt(15);
|
if (RecentFiles.Count > 15) RecentFiles.RemoveAt(15);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
|
protected override CreateParams CreateParams {
|
||||||
{
|
get {
|
||||||
Msg.ShowException(e.Exception);
|
CreateParams cp = base.CreateParams;
|
||||||
}
|
cp.Style |= 0x00020000 /* WS_MINIMIZEBOX */;
|
||||||
|
return cp;
|
||||||
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
|
||||||
{
|
|
||||||
Msg.ShowError(e.ExceptionObject.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CycleFullscreen(bool enabled)
|
|
||||||
{
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
if (WindowState != FormWindowState.Maximized)
|
|
||||||
{
|
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
|
||||||
WindowState = FormWindowState.Maximized;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WindowState = FormWindowState.Normal;
|
|
||||||
|
|
||||||
if (mp.Border)
|
|
||||||
FormBorderStyle = FormBorderStyle.Sizable;
|
|
||||||
else
|
|
||||||
FormBorderStyle = FormBorderStyle.None;
|
|
||||||
|
|
||||||
SetFormPosAndSizeKeepHeight();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void WndProc(ref Message m)
|
protected override void WndProc(ref Message m)
|
||||||
{
|
{
|
||||||
//System.Diagnostics.Debug.WriteLine(m);
|
//Debug.WriteLine(m);
|
||||||
|
|
||||||
switch (m.Msg)
|
switch (m.Msg)
|
||||||
{
|
{
|
||||||
case 0x0201: // WM_LBUTTONDOWN
|
case 0x0201: // WM_LBUTTONDOWN
|
||||||
case 0x0202: // WM_LBUTTONUP
|
case 0x0202: // WM_LBUTTONUP
|
||||||
|
case 0x0207: // WM_MBUTTONDOWN
|
||||||
|
case 0x0208: // WM_MBUTTONUP
|
||||||
|
case 0x020b: // WM_XBUTTONDOWN
|
||||||
|
case 0x020c: // WM_XBUTTONUP
|
||||||
|
case 0x020A: // WM_MOUSEWHEEL
|
||||||
case 0x0100: // WM_KEYDOWN
|
case 0x0100: // WM_KEYDOWN
|
||||||
case 0x0101: // WM_KEYUP
|
case 0x0101: // WM_KEYUP
|
||||||
case 0x0104: // WM_SYSKEYDOWN
|
case 0x0104: // WM_SYSKEYDOWN
|
||||||
case 0x0105: // WM_SYSKEYUP
|
case 0x0105: // WM_SYSKEYUP
|
||||||
case 0x020A: // WM_MOUSEWHEEL
|
case 0x319: // WM_APPCOMMAND
|
||||||
if (mp.WindowHandle != IntPtr.Zero)
|
if (mp.WindowHandle != IntPtr.Zero)
|
||||||
Native.SendMessage(mp.WindowHandle, m.Msg, m.WParam, m.LParam);
|
Native.SendMessage(mp.WindowHandle, m.Msg, m.WParam, m.LParam);
|
||||||
break;
|
break;
|
||||||
case 0x0200: // WM_MOUSEMOVE
|
case 0x0200: // WM_MOUSEMOVE
|
||||||
Point pos = PointToClient(Cursor.Position);
|
{
|
||||||
mp.command_string($"mouse {pos.X} {pos.Y}");
|
Point pos = PointToClient(Cursor.Position);
|
||||||
if (CursorHelp.IsPosDifferent(LastCursorPosChanged)) CursorHelp.Show();
|
mp.command($"mouse {pos.X} {pos.Y}");
|
||||||
|
if (CursorHelp.IsPosDifferent(LastCursorPosChanged)) CursorHelp.Show();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0x2a3: // WM_MOUSELEAVE
|
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 0x319: // WM_APPCOMMAND
|
|
||||||
if (mp.WindowHandle != IntPtr.Zero)
|
|
||||||
Native.PostMessage(mp.WindowHandle, m.Msg, m.WParam, m.LParam);
|
|
||||||
break;
|
break;
|
||||||
case 0x203: // Native.WM.LBUTTONDBLCLK
|
case 0x203: // Native.WM.LBUTTONDBLCLK
|
||||||
if (!IsMouseInOSC()) mp.command_string("cycle fullscreen");
|
{
|
||||||
|
Point pos = PointToClient(Cursor.Position);
|
||||||
|
mp.command($"mouse {pos.X} {pos.Y} 0 double");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 0x02E0: // WM_DPICHANGED
|
case 0x02E0: // WM_DPICHANGED
|
||||||
if (IgnoreDpiChanged) break;
|
if (!WasShown) break;
|
||||||
var r2 = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
var r2 = Marshal.PtrToStructure<Native.RECT>(m.LParam);
|
||||||
Native.SetWindowPos(Handle, IntPtr.Zero, r2.Left, r2.Top, r2.Width, r2.Height, 0);
|
Native.SetWindowPos(Handle, IntPtr.Zero, r2.Left, r2.Top, r2.Width, r2.Height, 0);
|
||||||
break;
|
break;
|
||||||
@@ -356,28 +431,25 @@ namespace mpvnet
|
|||||||
var r = rc;
|
var r = rc;
|
||||||
NativeHelp.SubtractWindowBorders(Handle, ref r);
|
NativeHelp.SubtractWindowBorders(Handle, ref r);
|
||||||
int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
|
int c_w = r.Right - r.Left, c_h = r.Bottom - r.Top;
|
||||||
float aspect = mp.VideoSize.Width / (float)mp.VideoSize.Height;
|
Size s = mp.VideoSize;
|
||||||
|
if (s == Size.Empty) s = new Size(16, 9);
|
||||||
|
float aspect = s.Width / (float)s.Height;
|
||||||
int d_w = Convert.ToInt32(c_h * aspect - c_w);
|
int d_w = Convert.ToInt32(c_h * aspect - c_w);
|
||||||
int d_h = Convert.ToInt32(c_w / aspect - c_h);
|
int d_h = Convert.ToInt32(c_w / aspect - c_h);
|
||||||
int[] d_corners = { d_w, d_h, -d_w, -d_h };
|
int[] d_corners = { d_w, d_h, -d_w, -d_h };
|
||||||
int[] corners = { rc.Left, rc.Top, rc.Right, rc.Bottom };
|
int[] corners = { rc.Left, rc.Top, rc.Right, rc.Bottom };
|
||||||
int corner = NativeHelp.GetResizeBorder(m.WParam.ToInt32());
|
int corner = NativeHelp.GetResizeBorder(m.WParam.ToInt32());
|
||||||
|
if (corner >= 0) corners[corner] -= d_corners[corner];
|
||||||
if (corner >= 0)
|
|
||||||
corners[corner] -= d_corners[corner];
|
|
||||||
|
|
||||||
Marshal.StructureToPtr<Native.RECT>(new Native.RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false);
|
Marshal.StructureToPtr<Native.RECT>(new Native.RECT(corners[0], corners[1], corners[2], corners[3]), m.LParam, false);
|
||||||
m.Result = new IntPtr(1);
|
m.Result = new IntPtr(1);
|
||||||
return;
|
return;
|
||||||
}
|
case 0x004A: // WM_COPYDATA
|
||||||
|
var copyData = (Native.COPYDATASTRUCT)m.GetLParam(typeof(Native.COPYDATASTRUCT));
|
||||||
|
string[] files = copyData.lpData.Split('\n');
|
||||||
|
string mode = files[0];
|
||||||
|
files = files.Skip(1).ToArray();
|
||||||
|
|
||||||
if (m.Msg == SingleProcess.Message)
|
switch (mode)
|
||||||
{
|
|
||||||
object filesObject = RegHelp.GetObject(App.RegPath, "ShellFiles");
|
|
||||||
|
|
||||||
if (filesObject is string[] files)
|
|
||||||
{
|
|
||||||
switch (RegHelp.GetString(App.RegPath, "ProcessInstanceMode"))
|
|
||||||
{
|
{
|
||||||
case "single":
|
case "single":
|
||||||
mp.Load(files, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
mp.Load(files, true, Control.ModifierKeys.HasFlag(Keys.Control));
|
||||||
@@ -387,11 +459,9 @@ namespace mpvnet
|
|||||||
mp.commandv("loadfile", file, "append");
|
mp.commandv("loadfile", file, "append");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
RegHelp.RemoveValue(App.RegPath, "ShellFiles");
|
Activate();
|
||||||
Activate();
|
return;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
base.WndProc(ref m);
|
base.WndProc(ref m);
|
||||||
@@ -451,40 +521,27 @@ namespace mpvnet
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnLoad(EventArgs e)
|
|
||||||
{
|
|
||||||
base.OnLoad(e);
|
|
||||||
mp.Init();
|
|
||||||
mp.observe_property_bool("fullscreen", PropChangeFullscreen);
|
|
||||||
mp.observe_property_bool("ontop", PropChangeOnTop);
|
|
||||||
mp.observe_property_bool("border", PropChangeBorder);
|
|
||||||
mp.observe_property_string("sid", PropChangeSid);
|
|
||||||
mp.observe_property_string("aid", PropChangeAid);
|
|
||||||
mp.observe_property_string("vid", PropChangeVid);
|
|
||||||
mp.observe_property_int("edition", PropChangeEdition);
|
|
||||||
mp.Shutdown += Shutdown;
|
|
||||||
mp.VideoSizeChanged += VideoSizeChanged;
|
|
||||||
mp.FileLoaded += FileLoaded;
|
|
||||||
mp.Idle += Idle;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnShown(EventArgs e)
|
protected override void OnShown(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnShown(e);
|
base.OnShown(e);
|
||||||
if (App.IsDarkMode) ToolStripRendererEx.ColorTheme = Color.Black;
|
var wpfColor = WPF.WPF.ThemeColor;
|
||||||
ContextMenu = new ContextMenuStripEx(components);
|
Color color = Color.FromArgb(wpfColor.A, wpfColor.R, wpfColor.G, wpfColor.B);
|
||||||
ContextMenu.Opened += ContextMenu_Opened;
|
ToolStripRendererEx.InitColors(color, App.IsDarkMode);
|
||||||
ContextMenu.Opening += ContextMenu_Opening;
|
|
||||||
BuildMenu();
|
BuildMenu();
|
||||||
ContextMenuStrip = ContextMenu;
|
ContextMenuStrip = ContextMenu;
|
||||||
IgnoreDpiChanged = false;
|
WPF.WPF.Init();
|
||||||
CheckUrlInClipboard();
|
System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
|
||||||
|
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)
|
protected override void OnActivated(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnActivated(e);
|
base.OnActivated(e);
|
||||||
CheckUrlInClipboard();
|
CheckClipboardForURL();
|
||||||
Message m = new Message() { Msg = 0x0202 }; // WM_LBUTTONUP
|
Message m = new Message() { Msg = 0x0202 }; // WM_LBUTTONUP
|
||||||
Native.SendMessage(Handle, m.Msg, m.WParam, m.LParam);
|
Native.SendMessage(Handle, m.Msg, m.WParam, m.LParam);
|
||||||
}
|
}
|
||||||
@@ -495,13 +552,23 @@ namespace mpvnet
|
|||||||
if (mp.IsLogoVisible) mp.ShowLogo();
|
if (mp.IsLogoVisible) mp.ShowLogo();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnFormClosed(FormClosedEventArgs e)
|
protected override void OnFormClosing(FormClosingEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnFormClosed(e);
|
base.OnFormClosing(e);
|
||||||
|
|
||||||
|
if (WindowState == FormWindowState.Normal)
|
||||||
|
{
|
||||||
|
RegHelp.SetObject(App.RegPath, "PosX", Left + Width / 2);
|
||||||
|
RegHelp.SetObject(App.RegPath, "PosY", Top + Height / 2);
|
||||||
|
}
|
||||||
|
|
||||||
RegHelp.SetObject(App.RegPath, "Recent", RecentFiles.ToArray());
|
RegHelp.SetObject(App.RegPath, "Recent", RecentFiles.ToArray());
|
||||||
App.Exit();
|
|
||||||
mp.commandv("quit");
|
if (mp.IsQuitNeeded)
|
||||||
mp.AutoResetEvent.WaitOne(3000);
|
mp.commandv("quit");
|
||||||
|
|
||||||
|
if (!mp.ShutdownAutoResetEvent.WaitOne(10000))
|
||||||
|
Msg.ShowError("Shutdown thread failed to complete within 10 seconds.");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnMouseDown(MouseEventArgs e)
|
protected override void OnMouseDown(MouseEventArgs e)
|
||||||
@@ -527,14 +594,14 @@ namespace mpvnet
|
|||||||
CursorHelp.Show();
|
CursorHelp.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckUrlInClipboard()
|
void CheckClipboardForURL()
|
||||||
{
|
{
|
||||||
string clipboard = Clipboard.GetText();
|
string clipboard = Clipboard.GetText();
|
||||||
|
|
||||||
foreach (string url in App.UrlWhitelist)
|
foreach (string url in App.UrlWhitelist)
|
||||||
{
|
{
|
||||||
if (clipboard.Contains("://") && !clipboard.Contains("\n") &&
|
if (clipboard.Contains("://") && ! clipboard.Contains("\n") &&
|
||||||
clipboard.Contains(url.ToLower()) &&
|
! clipboard.Contains(" ") && clipboard.Contains(url.ToLower().Trim()) &&
|
||||||
RegHelp.GetString(App.RegPath, "LastURL") != clipboard && Visible)
|
RegHelp.GetString(App.RegPath, "LastURL") != clipboard && Visible)
|
||||||
{
|
{
|
||||||
RegHelp.SetObject(App.RegPath, "LastURL", clipboard);
|
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">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
|
AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
|
||||||
IACoJQAA7h4AAAAAAAABACAAzhwAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
|
IACoJQAA7h4AAAAAAAABACAA3x8AAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
|
||||||
AAAAAAAAAAAAAAAAAAD/lAAA/5QABf+UAEH/lACe/5QA3P+UAPX/lAD1/5QA3P+UAJ7/lABB/5QABf+U
|
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
|
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
|
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
|
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//8aK///KlP//x4z//8eN///I
|
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//8aK///Ijv//5Mj//926///J
|
jv//x4v//7NW//+XCP//lAD//5QA6f+UAEH/lACe/5QA//+TAP//qDf//8aI///Sov//9+///+vX///T
|
||||||
kP//xov//8eM///Hi///qj7//5QA//+UAP//lACe/5QA2/+UAP//lgb//7pp///Ijv//yI3//+zZ///+
|
pP//x4z//8eM///Hi///qj7//5QA//+UAP//lACe/5QA2/+UAP//lgb//7pp///Hjf//06T///Hh///h
|
||||||
/v//7Nn//9Ki///HjP//yI7//71v//+XCf//lAD//5QA2/+UAPT/lAD//5oR///BfP//x43//8eN///s
|
wv//8eL//+TH///NmP//x43//7xv//+XCf//lAD//5QA2/+UAPT/lAD//5oR///BfP//x4z//9Ok///u
|
||||||
2P/////////////58///373//8iP///CgP//nBb//5MA//+UAPT/lAD0/5QA//+aEf//wXv//8eN///H
|
3P//yZD//8+c///q1f//8+f//9Gh///Cf///nBb//5MA//+UAPT/lAD0/5QA//+aEf//wXv//8eM///T
|
||||||
jf//7Nj/////////////9u3//9u1///Ijv//wn///5wW//+TAP//lAD0/5QA2/+UAP//lgb//7ln///I
|
pP//7tz//8mR///Up///7tz//+rU///Nmf//wn///5wW//+TAP//lAD0/5QA2/+UAP//lgb//7ln///H
|
||||||
jv//x43//+zY///9/P//6dL//8+c///Gi///yI7//7xt//+XCP//lAD//5QA2/+UAJ3/lAD//5MA//+m
|
jf//06T///Hj///lyv//8eL//9y3///Jj///x43//7xt//+XCP//lAD//5QA2/+UAJ3/lAD//5MA//+m
|
||||||
M///xoj//8iO///iw///27T//8iO///Gi///x43//8aK//+pOf//lAD//5QA//+UAJ3/lABB/5QA6f+U
|
M///xYf//9Gi///37///6dH//8+d///Gi///x4z//8aK//+pOf//lAD//5QA//+UAJ3/lABB/5QA6f+U
|
||||||
AP//lQT//69J///GiP//ypL//8eN///Hjf//yI7//8aJ//+xT///lgb//5QA//+UAOn/lABB/5QABP+U
|
AP//lQT//69J///IjP//06T//8mQ///HjP//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
|
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/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/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
|
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
|
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
|
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
|
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
|
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///Ijv//x4z//9Wp///Qn///xov//8eM///H
|
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
|
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
|
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///HjP//xov//+XK////
|
CP//lAD//5QA//+UAP3/lAB8/5QAvf+UAP//lAD//5MA//+fHv//xIP//8eN///Giv//1Kj///v3///i
|
||||||
/////vz//+3a///So///x4v//8eL///HjP//x4z//8WH//+iJ///kwD//5QA//+UAP//lAC8/5QA4v+U
|
xP//7tz///z5///t2f//06T//8eM///Hi///x4z//8WH//+iJ///kwD//5QA//+UAP//lAC8/5QA4v+U
|
||||||
AP//lAD//5MA//+qO///x43//8eM///HjP//xov//+XJ///////////////////58///4cL//8uU///H
|
AP//lAD//5MA//+qO///x43//8eM///Giv//1aj///v3///Vqf//yY///9y3///27P//+vT//+TH///N
|
||||||
i///x4z//8iO//+uR///kwD//5QA//+UAP//lADi/5QA8v+UAP//lAD//5MA//+vS///yI7//8eM///H
|
mP//x4z//8iO//+uR///kwD//5QA//+UAP//lADi/5QA8v+UAP//lAD//5MA//+vS///yI7//8eM///G
|
||||||
jP//xov//+XJ/////////////////////////v7///Hi///Rof//x4v//8iO//+zVv//lAD//5QA//+U
|
iv//1aj///v3///Wq///xor//8aK///NmP//6dL////////w3///ypP//8iO//+zVv//lAD//5QA//+U
|
||||||
AP//lADy/5QA8v+UAP//lAD//5MA//+vSf//yI7//8eM///HjP//xov//+TI////////////////////
|
AP//lADy/5QA8v+UAP//lAD//5MA//+vSf//yI7//8eM///Giv//1aj///v3///Wq///xon//8eN///W
|
||||||
/////fv//+rU///Om///x4v//8iO//+zVf//lAD//5QA//+UAP//lADy/5QA4v+UAP//lAD//5MA//+p
|
q///8uX///r2///hwf//yI///8iO//+zVf//lAD//5QA//+UAP//lADy/5QA4v+UAP//lAD//5MA//+p
|
||||||
OP//x4z//8eM///HjP//xov//+TH///////////////////16///27T//8iP///Hi///x4z//8iO//+t
|
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///HjP//xov//+TH////
|
RP//kwD//5QA//+UAP//lADi/5QAvP+UAP//lAD//5MA//+eG///w4H//8eN///Giv//1Kj///v3///m
|
||||||
/////Pn//+jQ///Om///xov//8eM///HjP//x4z//8WG//+hJP//kwD//5QA//+UAP//lAC8/5QAe/+U
|
y///8+f///r1///ixP//y5T//8aK///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
|
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///I
|
jP//yI7//7dh//+WBv//lAD//5QA//+UAP3/lAB7/5QAMf+UAOL/lAD//5QA//+UAP//nBf//750///H
|
||||||
jv//x4z//9Ki///Omv//xor//8eM///HjP//x4z//8eM///Ijv//wXr//58e//+TAP//lAD//5QA//+U
|
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//8eM///Hi///x4z//8eM///H
|
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
|
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
|
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
|
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
|
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//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
|
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
|
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
|
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
|
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
|
ANP/lAD//5QA//+UAP//lAD//5QA//+rQP//x4v//8eM///Giv//1qr///37///9+v//69b//9Kj///H
|
||||||
jP//x4z//8eM///HjP//x4z//8eM///HjP//x43//7BO//+VAv//lAD//5QA//+UAP//lAD//5QA0/+U
|
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//8eM///Giv//3rr////////3
|
AB7/lABa/5QA9/+UAP//lAD//5QA//+UAP//nBb//8B6///Hjf//x4z//8aK///Xrf///v3///79////
|
||||||
7///3rv//8qS///Gi///x4z//8eM///HjP//x4z//8eM///Hjf//w4L//6Ah//+TAP//lAD//5QA//+U
|
/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//x4z//8aK///e
|
AP//lAD3/5QAWv+UAJr/lAD//5QA//+UAP//lAD//5MA//+sQf//x43//8eM///HjP//xor//9et////
|
||||||
uv/////////////+/P//7tz//9Ol///HjP//x4v//8eM///HjP//x4z//8eM///Ijv//slH//5QA//+U
|
/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///H
|
AP//lAD//5QA//+UAP//lACa/5QAyP+UAP//lAD//5QA//+UAP//lgX//7lm///Ijv//x4z//8eM///G
|
||||||
jP//xor//926////////////////////////+fT//+LD///Llf//xor//8eM///HjP//x4z//8iO//+9
|
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
|
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
|
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
|
f///x43//8eM///HjP//xor//9et////////6dL//8eM///HjP//x4z//8aK///Llf//587///7+////
|
||||||
x///yZD//8eM///HjP//xYb//6Ah//+TAP//lAD//5QA//+UAP//lADv/5QA7/+UAP//lAD//5QA//+U
|
////5cr//8eL///HjP//xYb//6Ah//+TAP//lAD//5QA//+UAP//lADv/5QA7/+UAP//lAD//5QA//+U
|
||||||
AP//nBX//8J////Hjf//x4z//8eM///HjP//xor//924////////////////////////////////////
|
AP//nBX//8J////Hjf//x4z//8eM///Giv//163////////p0v//x4z//8eM///Gi///yI7//9iw///0
|
||||||
////9u3//9u2///Ijv//x4z//8eM///Fhv//oCH//5MA//+UAP//lAD//5QA//+UAO//lADj/5QA//+U
|
5/////////bs///WrP//x4v//8eM///Fhv//oCH//5MA//+UAP//lAD//5QA//+UAO//lADj/5QA//+U
|
||||||
AP//lAD//5QA//+ZDv//v3f//8eN///HjP//x4z//8eM///Giv//3Lf/////////////////////////
|
AP//lAD//5QA//+ZDv//v3f//8eN///HjP//x4z//8aK///Xrf///////+nS///Hi///xov//86b///o
|
||||||
/////Pr//+nR///PnP//xov//8eM///HjP//x43//8OA//+dGP//kwD//5QA//+UAP//lAD//5QA4/+U
|
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//x4z//8aK///ct///////////////
|
AMj/lAD//5QA//+UAP//lAD//5UE//+4Yv//yI7//8eM///HjP//xor//9et////////6dH//8iP///b
|
||||||
//////////Xq///asv//yI7//8aL///HjP//x4z//8eM///Ijv//vG///5cJ//+UAP//lAD//5QA//+U
|
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///HjP//xor//9y3////
|
AP//lADI/5QAmv+UAP//lAD//5QA//+UAP//kwD//6o8///HjP//x4z//8eM///Giv//163///7+///w
|
||||||
//////////z5///nzv//zpr//8aL///HjP//x4z//8eM///HjP//x4z//8iO//+vS///lAD//5QA//+U
|
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//8eM///G
|
AP//lAD//5QA//+UAJr/lABa/5QA9/+UAP//lAD//5QA//+UAP//mhH//791///Ijv//x4z//8aK///X
|
||||||
iv//27b////+///z5///2K///8iO///Hi///x4z//8eM///HjP//x4z//8eM///Hjf//wn7//54b//+T
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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//+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
|
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//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
|
AP//lAD//5QA//+UAP//lAD//5QB//+uSP//x4z//8eM///HjP//x4z//8aK///btP////7////////8
|
||||||
uP//yZD//8aL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///I
|
+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
|
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
|
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//kwD//6Ag///DgP//x43//8eM///HjP//x4z//8aK///d
|
||||||
i///0aD///v2///9/P//7Nf//9Gh///Hi///x4v//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
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
|
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
|
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
|
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
|
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
|
jf//x4z//8eM///HjP//x4z//8aK///duf/////////////nz///587///v4//////////////37///s
|
||||||
jP//x4v//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8aJ//+lMP//kwD//5QA//+U
|
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//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////////////////////
|
AP//rEH//8eN///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////fvv//x4z//9ar///w
|
||||||
//////////r1///jxv//zJf//8aK///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+0
|
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
|
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////
|
AP//lAD//5QA//+VA///t2D//8iO///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////g
|
||||||
/////////////////////////////////v//8uX//9iu///Ijv//xov//8eM///HjP//x4z//8eM///H
|
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
|
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
|
AP//lAD//5QA//+UAP//lAD//5QA//+YDP//vnT//8iN///HjP//x4z//8eM///HjP//x4z//8aK///d
|
||||||
i///0J7///r1//////////////////////////////////////////////z4///nzv//zpv//8aL///H
|
uf/////////////gv///xor//8eM///Hi///xov//8+c///mzf//+/f//////////////fv//+3a///U
|
||||||
jP//x4z//8eM///HjP//x4z//8eN///Dgv//nhv//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+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
|
AM//lADf/5QA//+UAP//lAD//5QA//+UAP//lAD//5MA//+cF///wn///8eN///HjP//x4z//8eM///H
|
||||||
jP//x4z//8eM///Gi///0J7///r1////////////////////////////////////////////////////
|
jP//x4z//8aK///duf/////////////gv///xor//8eM///HjP//x4z//8aL///Hjf//1an//+7d///9
|
||||||
////9ev//9u1///JkP//x4z//8eM///HjP//x4z//8eM///Gif//oyn//5MA//+UAP//lAD//5QA//+U
|
/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
|
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////////////////////////////////////
|
jP//x4z//8eM///HjP//x4z//8aK///duf/////////////gv///xor//8eM///HjP//x4z//8eM///H
|
||||||
//////////////////////////38///p0f//y5T//8eM///HjP//x4z//8eM///Gif//pCv//5MA//+U
|
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
|
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////////////////////
|
Gf//w4H//8eN///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////gv///xor//8eM///H
|
||||||
//////////////////////////////////////////bs///ct///yY///8eM///HjP//x4z//8eM///G
|
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
|
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////
|
AP//lAD//5QA//+bFP//wX3//8eN///HjP//x4z//8eM///HjP//x4z//8aK///duf/////////////g
|
||||||
///////////////////////////////////////////////8+v//6dH//8+c///Gi///x4z//8eM///H
|
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
|
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
|
AP//lAD//5QA//+UAP//lAD//5QA//+YCv//vXH//8iO///HjP//x4z//8eM///HjP//x4z//8aK///d
|
||||||
i///z5z///nz//////////////////////////////////////////////Tp///asv//yI7//8aL///H
|
uf/////////////gv///xor//8eM///Gi///ypP//+C////58v/////////////9+///6tT//8+d///G
|
||||||
jP//x4z//8eM///HjP//x4z//8eN///DgP//nRj//5MA//+UAP//lAD//5QA//+UAP//lAD//5QA//+U
|
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
|
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
|
jP//x4z//8aK///duf/////////////gv///xon//8eM///Upv//797///79//////////////Xr///b
|
||||||
i///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+8bv//lwn//5QA//+UAP//lAD//5QA//+U
|
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
|
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
|
jP//x4z//8eM///HjP//x4z//8aK///duf/////////////fvv//ypP//+LE///69P/////////////8
|
||||||
r///yI7//8eL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8iO//+xUP//lAD//5QA//+U
|
+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//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
|
AP//mxX//8F7///Hjf//x4z//8eM///HjP//x4z//8aK///duf/////////////s2P//8OD///7+////
|
||||||
9///5cr//82Y///Gi///x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8WG//+i
|
//////////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
|
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////
|
AP//lAD//5QA//+UAP//lAH//7BO///Ijf//x4z//8eM///HjP//x4z//8aK///duf//////////////
|
||||||
//////7///Lk///WrP//x43//8eL///HjP//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
/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
|
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
|
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5wX///Aef//yI3//8eM///HjP//x4z//8aK///d
|
||||||
i///zpv///ny///79v//48f//8yW///Giv//x4z//8eM///HjP//x4z//8eM///HjP//x4z//8eM///H
|
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
|
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
|
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
|
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
|
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
|
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//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
|
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//+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
|
AP//lAD//5QA//+UAP//lAD//5QA//+UAP//lAD//5cJ//+wTP//xYb//8iO///HjP//x4z//8eM///H
|
||||||
@@ -416,129 +416,142 @@
|
|||||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAAD
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAAD
|
||||||
AADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/AAAAAA/AAD/AAAAAH8AAP+A
|
AADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/AAAAAA/AAD/AAAAAH8AAP+A
|
||||||
AAAB/wAA/8AAAAP/AAD/8AAAD/8AAP/8AAA//wAA//8AAP//AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
|
AAAB/wAA/8AAAAP/AAD/8AAAD/8AAP/8AAA//wAA//8AAP//AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
|
||||||
AQAIBgAAAFxyqGYAAByVSURBVHja7Z19bFzVmYef65iMQ77seBIc4kAgIZgvk7ShbVrYuG0Q0KVVqEIb
|
AQAIBgAAAFxyqGYAAB+mSURBVHja7Z1/bFXXle8/xxiuCb9sfAEDJoFAiJMQfjSkDdNkcBuqhCozIlXa
|
||||||
CizsH9UWTVm1opVaoVVVVVVbdVGRqhFIbUVZQokK2kZtVGAJxZS0SQs0jgnFgBNMcMAk49hJnGQmGefu
|
SSbpJFNNNEW3fW+qTKWpqlFVVVU76osaveqqkaYzmSjJCzPJzPDaqCQT0pgJHZj8KMaBxEkNOMSAAwYb
|
||||||
H+deZ+z4Yz7unXPPue8jWXGsZOa91/P+7vtxznsc13UR7MRJUwc0eX9tBmqBeu+r1vsZQC+QBwa9r7z3
|
uMC9xubMH/tcc2384/445+yz91kfyQIsfO86x3d9z9pr77WW47ougp04aWqABu+fjUA1UOt9VXvfA+gC
|
||||||
M4A+N0VW97UI4eCIAJiHk6YWWFbwdWnB9wBJYFbAbzsEZLzvu72vPUCX/3c3RV73vRFKQwQgwjhpmoEW
|
BoA+72vA+x5At5siq/tahGBwRADMw0lTDSwr+Lq+4O8ASWC6z2+bAXq8v3d4XweA9vy/3RQDuu+NUBoi
|
||||||
znbyZagneNQYEQPOiEOXmxqJJoSIIQIQIZw0q4C1wBqgDajTbVNADAHbgBeBdjfFDt0GCQoRAI04aVpQ
|
ABHGSdMINHGlky9DPcGjxpAYcFkc2t3UUDQhRAwRgAjhpFkLbADWA81AjW6bfCID7AR2AC1uit26DRIU
|
||||||
jn6D92e9bpuqxCDQDjwPbHVTdOk2KK6IAFQRL6T3n/A3cqZAF3f6UILwLCpC6NFtUFwQAQgZ7yl/O7Ae
|
IgAacdI0oRz9Lu/PWt02hUQf0AK8Bmx3U7TrNiiuiACEiBfS55/wd3M5QRd3ulGC8AoqQujUbVBcEAEI
|
||||||
lc8LU9MDPAU87qbo0G2MzYgAhICTpgnYANwFrNBtj+F0AI8Dm6SYGDwiAAHh9dzXo572a4lmld5k8qg0
|
GO8p/yBwH2o9L0xMJ/Ai8JybolW3MTYjAhAATpoG4H7gYWC1bnsMpxV4DtgiyUT/EQHwCW/P/T7U034D
|
||||||
4VFgs5tiSLdBNiACUAFeP74N9aRfR/C9d2F8hoDNKDFol/UH5SMCUAZeiH8fKsxvrvDlhMroBTYBD7gp
|
0czSm8wAapnwNLDVTZHRbZANiABUgLcf34x60m/C/713YXQywFaUGLTI+YPyEQEoAy/EfwwV5jdW+HJC
|
||||||
+nQbYxoiACXgpFmGcvy7sadHbwtZYCPwEzdFt25jTEEEoAg8x78fuAPJ7aNOHiUED7gpdus2JuqIAEyC
|
ZXQBW4DH3RTduo0xDRGAEnDSLEM5/iPYs0dvC1ngWeDv3BQduo0xBRGAIvAc/7vAQ8jaPuoMoITgcTfF
|
||||||
k2YF8D3gZsTxTWQz8H1pJU6MCMA4FDj+Ot22CIGwBRURtOs2JGqIABTgpGlDOX6bbluEUGhHRQTtug2J
|
Pt3GRB0RgHFw0qwGvgfcgzi+iWwFvi9biWMjAjAKBY6/Sbctgi+8hIoIWnQbEjVEAApw0jSjHL9Zty1C
|
||||||
CiIAjCzR/Smqqi/YzxbgXllyHHMB8Pr4X0c99et12yNUlSzwQ+DHcV5HEFsBcNJ8AngIWaobd7qAe+Ka
|
ILSgIoIW3YZEBREAho7o/gSV1Rfs5yXgm3LkOOYC4O3jfwP11K/VbY8QKlngh8CP43yOILYC4KS5Dfg5
|
||||||
FsROAJw09cCPgK/ptkWIFBuBb8dtMVGsBMBJczcq10/qtkWIJIPAd4FfxiUtiIUAeFtyfwFcq9sWwQh2
|
clQ37rQDm+O6LIidADhpaoEfAV/XbYsQKZ4Fvh23w0SxEgAnzSOotX5Sty1CJOkDvgP8Ii7LglgIgFeS
|
||||||
oIqEr+g2JGysFgCvyPcdVJFPFvIIpZAHHgS+a3M0YK0AeBt2HkNtzRWEcnkFuNXWlmGNbgPCwEmzFtiJ
|
+/fA7bptEYxgNypJ+LZuQ4LGagHwknx/g0ryyUEeoRQGgCeA79gcDVgrAF7BzjOo0lxBKJe3gS/bumVY
|
||||||
OL9QOauAnU7azlWhVkUAXsj/A1TYLwhB8yCqU2BNSmCNAHir+Z5ACn1CuFiVEliRAjhpbkSF/OL8Qtj4
|
pduAIHDSbAD2IM4vVM5aYI+TtvNUqFURgBfy/wAV9guC3zyB2imwZklgjQB4p/meRxJ9QrBYtSSwYgng
|
||||||
KYEVy8aNjgAk5Bc08zDwTZPPTjRWALwq/5PIU1/QSwcqJTByCpGRAuAt7HkaWKLbFkFAHWxyvYkTiIyr
|
pLkbFfKL8wtBk18SWHFs3OgIQEJ+QTNPAt8yeXaisQLgZflfQJ76gl5aUUsCI7sQGSkA3sGebcBi3bYI
|
||||||
AXibeF5AnF+IDk3AdidtXjRqlAB4/f3nkCO1hOgxC3jOSbNetyGlYIwAeDf2aWT2vhBd6oAnnLQ5O02N
|
AmqwyRdM7EBkXA7AK+J5HXF+ITo0ALuctHnRqFEC4O3vv4qM1BKix3TgVSfNfboNKQVjBMC7sduQ3vtC
|
||||||
EAAnzTdQPX5Zzy9EnVrgISdtRmcq8gLgpPkB8DPE+QWz+JGT5me6jZiKyHYBvB7/z5HBHYLZPAXcFtXl
|
dKkBnnfS5lSaGiEATpq/Qu3xy3l+IepUAz930mbsTEVeAJw0PwB+iji/YBY/ctL8VLcRExHZXQBvj/9n
|
||||||
w5EUAM/5nwCzCiqCMAFbgVuieKBp5ARAnF+wlK3ATVGLBKJYA/g54vyCfaxFPdgiRaQEwCv4Sc4v2Mr6
|
SOMOwWxeBB6I6vHhSAqA5/zPg1kJFUEYg+3AvVEcaBo5ARDnFyxlO7AxapFAFHMAP0OcX7CPDagHW6SI
|
||||||
qBUGI5MCeK2+SN0cQQiJb7sp/lu3ERARAfAW+UifX4gTd7opNuo2QrsAeMt7n0acX4gXeVRnYItOI7QK
|
lAB4CT9Z8wu2cl/UEoORWQJ4W32RujmCEBDfdlP8H91GQEQEwDvkI/v8Qpz4qpviWd1GaBcA73jvNsT5
|
||||||
gLex5zlkea8QT4ZQnYFtugzQJgDelt4XkI09QrzpAz7tpujS8eZaBMAb5rEd2dIrCAA9wGodx5JVvQ3o
|
hXgxgNoZeEmnEVoFwCvseRU53ivEkwxqZ2CnLgO0CYBX0vs6UtgjxJtu4HNuinYdb65FALxmHruQkl5B
|
||||||
LfR5EnF+QfBZAvzB842qoqPw9gNkjFfoJBPQ2hDc63UOQCan+6qsZhXq3MpvVvNNq5oCeNN7n67mBdrO
|
AOgE1ukYSxb6NqB30OcFxPkFIc9i4Feeb4SKjsTbD5A2XoGTTMDKOv9er60XenK6r8pq1qLmVn4rzDcN
|
||||||
WEdPJqAxAQtnwLkByvvxPHxwAvpzo4VAhCFwbnFTbK7Wm1VNALy5/TuRk3nLptDZp9dA0wxYNhvqpumz
|
dQngde/dFuYF2s5IR08moD4B86fCVT7K+/kBOHYBTuaGC4EIg+/c66bYGtabhSYAXt/+Pchk3rIpdPYp
|
||||||
KTsM3Ueh7wScPK1+JqJQEYPAymqdO1AVAfBymxeQ0L9kfKefXgNXN8D8Ot0WTc3BLOwaUIIgYlAWr6CK
|
VdAwFZbNgJpJ+mzKDkLHWei+AP2X1PdEFCqiD1gT1tyBUATAW9u8joT+JZN3+ilVsKoO5tTotmhiTmRh
|
||||||
gqFvHKpWDUDy/hLwnX7edLiqAWYatkRqfh2sXai+X3MevDYAh06KGJRA1eoBoUcABYM8hUnwnX72OfCR
|
b68SBBGDsngblRQMvHAorByArPtLIO/0s6fAzXUwzbAjUnNqYMN89ff18+DdXjjVL2JQAqHlAwKPAAoa
|
||||||
eeY5fTEcy8M/DsHRUyIGRRJ6PSBUAfD6/TuRxT4T4jv+NY1mhPdBcTALL/eLEEzBICHXA0ITAC/vfxo5
|
eQrjkHf6GZPhU7PNc/piODcAvzsFZy+KGBRJ4PmAQAXA2+/fgxz2GZO8499ab0Z47xcnsvDWSRGCCegj
|
||||||
ovssCp/21zTqLeLpJjcMf++XqGASQq0HhBlofgdx/lH4jr9sNiyfo9uaaJCYBtctUN8vm606CiIEowi1
|
4HxAYALgrfu3ISO6r6DwaX9rvd4knm5yg/DmSYkKxiHQfECQgebfIM4/jLzjL5sBy2fqtiYaJCbBHXPV
|
||||||
HhBKBOCt838N2eEHnHH8S+fA0tm6rYk+e47Cm0dECMaw2k2xI+gXDUsAXkKq/oBy/nWLoWWubkvMo+sw
|
35fNUDsKIgTDCDQfEEgE4J3zfxep8AMuO/71M2HpDN3WRJ8DZ+GDMyIEI1jnptjt94sGJQBvIFl/QDn/
|
||||||
bH5PRMAjlFQgcAFw0twNPFK9+xJNkgn4WBI+NV+FuUJ55IZh+0HYkREhAO5xUzwc5AsGKgBOmnrgbWK8
|
pkXQNEu3JebRfhq2fiwi4BHIUsB3AXDSPAI8Fd59iSbJBHw6CZ+do8JcoTxyg7DrBOzuESEANrspnvTz
|
||||||
2s8P9z85H+qn67bGHo6cgm0HYp8WDAKXBblrMOjdgD8i5s6/bjF8bpE4f9DMOUfd13WL1X2OKfWogmBg
|
BX0VACdNLfB7YnzaLx/u/8EcqJ2i2xp7OHMRdh6P/bKgD7jBz6pBv6sBf0TMnX/TIvjiQnF+v5k5Wd3X
|
||||||
BBYBeNN9tlf/nujHf+qvOc/OBTxR43ge2j+MdTRwXVBThAIRAK/n/zKwQu99qT5S5NNHjIuEu1ELhCou
|
TYvUfY4ptaiEoG/4FgF43X12hX9P9JN/6q+fZ+cBnqhxfgBaPol1NHCHX12EfBEAb8//LWC13vsSPpLk
|
||||||
CAaVAnydmDl/MgGfaYKvXiLOr4uWufAfy9XvIWZpwZXAt4J4oYojAG+b72uo/CQWJBNw/UL4aKNuSwSf
|
00eMk4T7UAeEKk4I+rUE+AYxc/5kAj7fAI9eJ86vi6ZZ8JfL1e8hZsuCFcBf+/FCFUcAXpnvu6j1SSxI
|
||||||
V/vhuQ9iFQ0MoQqCvZW8SBARwE+JmfOvWyzOHzU+2hi7AuEsAigIVhQBOGnaUPv8Y0EyAbdfBItn6rZE
|
JuAL8+GWet2WCHneOQmvHotVNJBBJQS7KnkRPyKAnxAz59+0SJw/atxSH7sE4XR8SAhWFAE4aZpRdf6x
|
||||||
mIj9x+GxvbGKBD7tpmgv9z9XGgF8T/fVV4tkAr62XJw/6iw6F+5ZHqtIoCIfLDsCcNKsQG31tRq/xffZ
|
IJmAB5fAomm6LRHG4sh5eOZgrCKBz7kpWsr94UojgO/pvvqwSCbg68vF+aPOwqtg8/JYRQIV+WDZEYCT
|
||||||
JlnRZxK5YXi+LzatwpVuio5y/mMlEYD1T/9kQvX2P7dInN80EtPU723NebGIBsr2xbIigDg8/X3nXz1f
|
ZjWq1Ndq8lt8dzbIiT6TyA3Ca92x2Spc46ZoLecHK4kArH/6JxNqb/+LC8X5TSMxSf3e1s+LRTRQti+W
|
||||||
tyVCpWw/CC9+aH0kUFYUUG4EYPXTX5zfLlbPj0UkcH85/6nkCMBJswx4A0v3+ovz24vlkUAetS6gu5T/
|
FQHE4emfd/51c3RbIlTKrhOw4xPrI4GyooByIwCrn/7i/Haxbk4sIoHvlvNDJUcATpplwPtYWusvzm8v
|
||||||
VE4EcD+WOj+ogp84v52snh/saUkRo5YyooCSBMB7+t+h+0rDIpmAtTK+1GquX2h1KnCH56NFU2oEcB+W
|
lkcCA6hzAR2l/FA5EcB3sdT5QSX8xPntZN0cf6clRYxqyogCShIA7+n/kO4rDYpkAjZobl+amAQzE+pr
|
||||||
Pv2TCbi3BaZLtd9qzqmB/2yxVgRqUT5aNEXXALwR3+8A1g2vTibg7qXqqC0hHhzMwq+6rawHZIGLih0a
|
qrUyq48vzLd6KfCQ56NFU+pH7LEyfsYIkgn4ZhNM0ZTtnzcN1jRAUz1M8mT5kgsHeqHtE+g8rfsO2cHk
|
||||||
UkoEcB+WOv+Xlojzx435dXDbEisjgTpKiAKKEgBvv/8G3VcWNMkE3LQILp6l25LRtC6QhUfV4MJZ6vdv
|
KvhfTfB/261cClSjfHRzsT9QdA7Aa/F9CLCueXUyAY8sVaO2dLBxKdw4wbLj6Fl45QCcyuqx0TZOZOEf
|
||||||
oQhs8Hx2SoqNANqAZt1XFTStDerAzajR0gj/fjVcMk+3JfZzdYOVnYFmlM9OSbECcJfuKwoav98fVWZO
|
OqwUgSywpNimIaUsAR7DUuf/ymJ9zv8nN07s/AALZsDDq2BdIzh6TLWKOTXwwGIrlwM1KF8tiqIiAK/e
|
||||||
hy8sh89fAueeo9sau/m0nQNFbi/mH00pAE6aOmCd7qsJkmQCvnKRGfP7lnvRwBWyNiE0ZkxT27wtE4H1
|
/xDQqPvq/CSZgI0L1cw9HdyxCD69sPSfO34Oth+CYxk9dtvE3l7YdsS6SKALFQVM2C+g2AigGcucH1RG
|
||||||
nu9OSjERwHrU8AErSCbghvPhAoO29dbVwo1L4YstMMeuD2lkWDzTunrALJTvTkoxAlBUKGEKrQ2w0tDc
|
WJfzT62GW+aX97Nzp8H9N8EfXg2TJByoiFV1Vu4MNKJ8dkKKFYCHdV+R3+T3+3XxmQWXk33lUOXArQvg
|
||||||
+qJ6uKsVVkQ4dTEZC+sBU/rupALg9f6tOeAzmYhm0a8Upk+Dz14Et10B86xryupn5TyrooC1ng9PyFQR
|
qyuhUYaMVMTn7Gwo8mAx/2nCj6CTpgbYpPtq/CSZgD9dord/X4NPA0Lqp6o8wucXqwy3UDpTJ6kyb8tE
|
||||||
wAYsWvm3qlFNjLGB82fDna3wsfPB0W2MRSycoT4nljBl+34qAbCm+p9MwKcW6LYiWGpr4LoL4I6rYL4l
|
4D7Pd8elmI/MfajmA1aQTMBdC+BqzWW9dT5/2NY0wJ+vgmtr9V6XqSyapvJBFonAdJTvjksxAlBUKGEK
|
||||||
whYFrl1gVRQwaRowoQB4R3yv0G19ECQT8IVmVe21kQUzlQhcuximSThQMXXT4IsXWCMCqzxfHpfJIgBr
|
K+tgzWzdVsBVAbQNn5GAe5vgrmulerEcLMwHTOi74wqAt/dvzYDPZEJf0i9MVsyFr62G6yIgdKaxZrZV
|
||||||
in+tDXB5vW4rwqXGgY8vUmnBQmt6NvpYPseqguCEvjyZAEzZQjCBZAKuqtdtRfVonAEbroDPLFE734Ty
|
UcAGz4fHZKII4H4sOvm3tl51jIkDV02GP14Of3QdTJchJUUzf6r6nFhCNcqHx2QiAbAm+59MwGfn6rYi
|
||||||
+Yg9BcEJfXncj4h32s+EYYNJtDbEb5R3jQMrm1TLsHmObmvMpWmGNVFAi+fTZzHRM8KK1l8yAdfYU9Et
|
fJbXw8Mr4SYpcCqa2+daFQWMuwwYUwC8Ed+rdVvvB8kE/HGjyvbGkZpquHspfKlJFRkJ41MzCb50tTUi
|
||||||
mbl18OXL4fqLZXNRuayeb00UMK5PTyQAa3RbGwStDWrbZ9xpXaCigYvrdVtiHg3TrYkCxvXpiQTgRt3W
|
sNbz5VEZLwKwJvm3sg5urNVthX6W1KpoYLXG8w+msHymVQnBMX15PAGYcAvBBJIJuLlWtxXRYcokuHMJ
|
||||||
Vkrcn/5jmZ2AW1rgpqUww5qVHdXBkiiguAjAaxkYPxlPnv7jc/l8uFu2GpeEJVFA83jtwPEigDbdllZK
|
PHATzLaussNfPmVPQnBMXx5VALxpP2OGDSaxsk5aeY/GghnqFOHa+VJcNBYNU62JApo8n76CsSIAK7b+
|
||||||
3Cr/pXLuOWe2Gs+artsaM7BkiXDb2B+MJwA36LayUkyv/J9TpYLd8kZVG5CtxlOz0I6OwFm+bWUEMNvw
|
kgm41Z6Mru9UV8H6a+Chm2FOTHZHSmXdHGuigFF9eiwBWK/bWj9YWafKPoXxmTtNicBnG6W4aCR1U6yJ
|
||||||
ARrVzNH9rcbrLpWtxlMxz/xoqW3sD0YJgJNmFVCv28pKkOJfeSxtkK3GU2HBwqB6z8dHGBsBGN//b21Q
|
Akb16bEE4G7d1laKPP1Lo8qB2xrVsmC+NQe//cGSKKC4CMDbMtDcGa9y5OlfHvVTValx8zVSXJTHkiig
|
||||||
a7mF0vG3Gn/pMqg3+4MeCtOnWZEGjPLxsQJgdP/fhv3+UWDxXLjrali1ULYaj8WCYuAoHx8rAG26rauE
|
cbTtwNF+xc26La0U2zP/2QnbPFRGlaN6FTwspcZDWHJEuHnkN0YTgLt0W1kptmf+n25TzUKDZlaNKjWW
|
||||||
1gZ79vvrprYG1lyo9hU0ypkJI1hQDLy28C8jAuCtFTa6cz5dNr8Ezvmz4d9aYXWzRAM+hn/OZhXuCyi8
|
4iJ1RNiCKOAK37YyApgxWbcFwZLph60fwK874PzF4N9vxVwVDcS91Hi2+TUVzSO/MUwAnDRrgVrdVlZC
|
||||||
FKM3/yQTcGW9bivspMaBTzarmQPnGdxeDYoV5qcBI75eKAAlnSoaNVob5HivsFkwE75yJfzLBfEePJJM
|
nJJ/7/fAP+2FD08G/175UuM/ui6+8wosOBhU6/n4ECMjAOP3/1fWqbPcceHCAPzq9/Dv7XA2hMaWy+vh
|
||||||
GJ8GjPh6oQBcqtsqIfrUOHDN+TJ4xHBGfN2aCECKf9WlcYaKBuI6eMTwz9u4EYCxApBMqBFOQvWJ6+CR
|
kVVwU1L3lYfPlElWLAOG+fhIATB6/z8u9f6jcbBP5Qb2HQ/+va6aDHcvg03Xx6/U2IJk4DAfHykAzbqt
|
||||||
ljlG1wFGC4B3kqixAtDaYO/ATxPwB4/cEKPBIwmzFwUt808P9iOAZVg0/1/Qw5UyeMQURh74hQJgLE1G
|
q4SVdfGp9x+N3CC8chD++T04HcIAkaV1KjewMkZl1hYkA28v/MeQAHhnhY3eOZ8i+9YAdJ1R0cA7x9R4
|
||||||
r16wC3/wyL8us3/wiA11AOMFIJmApbN1WyGMpSVp/+CRpbPNrwP4AmBsC7C1Aeaav03TSvzBI19Ybufg
|
sSCpqYYvXAtfuSE+pcaGf86mF9YFFF6K0cU/yQSsqNVtRXS4eAlaPoIt++HkheDfb9Es1ZQ0DsVFq81f
|
||||||
kVm1RtcBLoUzeb+xEYAQfS6ZB4vnQPu78PpB3dYIHnakAIIZ+INH1l8mg0ciwigBMJY5hk//iRsXzrVr
|
Bgz5eqEAlDRVNGqsrNM33ivKHMvAM22wuyv4aCBfXHS/5aXGyYTxy4AhXy8UgOt1WyUEw6ALv+2CZ99V
|
||||||
8Ijpnz9fAJK6DSkXg4swscUfPPLly2Ge4R0cgz9/STgjAMau6q63sLgUF5rnqD0FJg8eWTzTWBGYBVDj
|
Y8WCRuYYRp4hX7cmAohz8q9YTpxXIrDjIxi4FOx7VTnwB42qytDG4iLDP2+jRgDGCkAyoVo4CRPjAm8f
|
||||||
pM2dAZBMQKOZN1/wKBw8Mt/AvvpMgzsBTpq6Ggw+BKS1IZ4bUWzk/Nlq3oAMHqkqTeI+QmQoHDwiW42r
|
U8uCo2eDf7/COYZm586G0zTT6DzAcAHwpv8aKwAr6+Lb8LNcTmXh+f3w2iHoHwz2vfJzDP9slT3FRQmz
|
||||||
Qw2Mf2ywoI8ZhleWK2XBTJUSxH3wSBVorkE2AUWO6THZUTcZhYNHFslS77CorcHwg0AEu2mcoaKBuA4e
|
DwUt83x+SJSXYVH/f6F4Wj9RW4aH+oJ/r8I5htWSHNDJ0AO/UACMpcHijHMYnMnBv7XDyweCLzUGNcfw
|
||||||
CZl6EQDBCPzBIxfEbPBIyNRLCiAYw9w6uDVmg0dCplaKgIJxyOCRwGiWrEowEn/wyOcvsX/wSJjUAH26
|
a6thySzdV14ZNuQBjBeAZAKW+jRpN+7sP6GigbCKi750gyo1NrXxyNIZ5ucB8rfe2C3AlXUwK2bn0YMk
|
||||||
jRCEcjk5rNsCo+mtBbK6rRCEUjmchf/bC/uO6LbEaPK1wJBuKwShWE678OoH8Jf3YNjVbY3xDNYCGd1W
|
06+Ki375YXilxn+xxsxS4+nVRucBrgcLIgAhGH5/Cv6xNbzionyp8RRJ5oaFHUsAITjyxUVhlho/ugau
|
||||||
CEIx9A2pp/7B47otsYZBKZ8IkefkMGzvVU9+eegHSr4W6NFthSBMxDuDsPUdOJLTbYmV9EoEIESS46fU
|
NfepahLDBMBYZlre/ScKHOyDp/bCnu7g36umGu69Xk02rjbg02n65y9/i41t72BwEsYoLl6C33SqUuMw
|
||||||
ENE3JEENFakBCJFj9wH48z44kddtifX01bgp6QII0eBwFp78Jzy7V5y/Grgpsn4KkAXzRoN1DsCa89RY
|
iouumw2bb4FFET83YPDnLwmXBcDYw5q1kgAMla4z6hThW0eDLy6aMgm+ciNsXBrdgSWLphkrAtMBqpy0
|
||||||
JsFc/Nbe9l44dVq3NaVxLK8+hwYyBGc2AvUBS3RbVCqZHLx3DFrm6rZEKJcDx1Rr78Njui0pj/3H1efQ
|
uT0AkgmoN/PmG82gC/95WJUah1FcdOMc+Pot0RxfNs3gnQAnTU0VBg8BWVln7h6yDRzLqOKi/wqh1Lim
|
||||||
QDJgwU5AQ29+7MmfVot5TG/tHTL88+cLQA8GRgAAR07ptkAolfcOwzN77WjtHTqp24Ky6YYzAtAFtOm2
|
Gv5sJWxYoo4WC77QIO4jVIQL7OqCp/eGU1y0ah58bVW8Gr8GSRWMPjZYEErhVFYtCcIoNZ5VA5vXqp6E
|
||||||
SLCbbF7OB4wQowRgj25rBLvpysCfeqS6HyH2wOgIwEg6B+BfzlNHNQvR43BWOf7eQd2WBM+QuR0A8Hze
|
QkU0ViFFQIJP5EuNn9oLH58O9r2qHNWV+EtNZmwXRpTqKgwfBCJEjzM5+Jf34dWDwRcXLalVS4Lphu/H
|
||||||
d5tu3daUSyYHe47C1YaezmIrp13Y9SG8tM+81l6x7D1qdBF6VApgrACAasWIAESHzHHV2vvA8iVmvWbv
|
a6JWBEAIjLbj4cwxnJGAP18NSekJWSq1sgQQAiWsOYZTJqk+hI3GnmjRQrUkAYVQCGuO4eeX6L5So2iU
|
||||||
SuwG73BQN0Ueg9MAmzjX4ENB8qdh23vwP532O7/hdHk+T+FMQGOjgM4ByFkyGqrW0CmN7x2Gxzrhb/vN
|
9IkQGmHMMZwzLX7jyiqhCgihxEMQLpOfYxhUNBD1+oEI0VUFhDBFThCGM3+6eloHQdDnECxioBrI6LZC
|
||||||
7usXS3bY6Px/xNdrx/uhaWRy0HVE0gAdZPPw53fhtZi19rotyP9htAAY3QqUOkD1easfXngXhsxdDFM2
|
iA8zpsDnFqtqv6C4EEJfQ0voqwZ6dFsh2E8V8JlG+PSCYA/uDFyCUyGUK1tCn2wBCoGzrA6ar1FHeINm
|
||||||
+wxduuwx4uuFAiA1AKEojuZUa6/b3BA47oz4ujUC0DkAH0tCMqHbErvZ2afW8NtScymHTM7o/B8KfH2k
|
/4lwehlawkA10KnbCsFOahNqW25JbTjv1z8Ibx/VfdVG0SURgOA71Q7c1qimAYVVuts/qGYb9IXQu9Am
|
||||||
5OSm6MXgEeGZHHQc0m2FvfSfgN/sVk/+ODs/KOc3OP8f8nwdOHs3YDtwo24Ly+WkpQtOdHLahR374e/7
|
JAcg+Mr19bD+anU8NyzO5uBf28NpVWYZ3dVuioyT1m2HYDr1U+HOxbAoxGk/l1zVmuy/j6iehUJpuCmy
|
||||||
ZQy3T9ZsAdxW+JexTacXdVtXCZ0D0HdCtxX28P5ReHSXGtQhzq/oO2F8+D/Kx8cKQLtu6yohk4N/SBpQ
|
+SVAFsxrDdbWC+vnqbZMgh4Sk2Bdoxr3FWannkN98JtD+kP+cwPqc2ggGbhcCNQNLNZtUan05ODjc9Bk
|
||||||
Mdk8PP8OPPE6HDI2KQyHfxwyOvyHMT4+SgDcFDuAQd0WVoJNi4J08PYheLQTOj7UbYkQAoOej48w3rqz
|
+Iw5U7lpDtyxCKaFePT2dBZaPoKOiDjdkfPqc2ggPWBBJaChN99o5k1TE34XhDiTceASvHkU3jyimpJG
|
||||||
dt1WVkImBy/367bCPI6dhN+/pb7i2NcvhreOGB/+t4/9wXibaJ8H1um2tBJkSlBpdB5Qq/kkcpocw1f/
|
hVOGf/7yAtCJgREAwBnZ8w2NxCS442q4eW644f7vT6mn/pkIOtupft0WlE0HXBaAdqBZt0VCNHFQTn/H
|
||||||
gfLtUYwnAFt1W1kpnQNqVeCic3VbEm36T6hTd3rlhN0psaD3D+P49lkpgJuiCzUl2FgyOdhl/i8rNE67
|
1ao7b1j0ZtU6vzPg9mIxZZgAHNBtjRBN5k9X4X5DiI02+gdVZv+to6rPoBAIB2B4BGAkbb3wh/PUqGbB
|
||||||
sKNXbd4R5y+Ov2eMf/r3eb49ion2nrXrtrZSOgeg3+xfWCi8fxQ2vgZ/kdZe0QyetOLp3z7eDycSgGd1
|
P66arBJ8K+aG+77tPbDjsOokFHUy5u4AgOfzebfp0G1NufTk4MBZWCUton3BQW3prWsMN9zvOQ+vdarR
|
||||||
W1spmRz8TQ49G+HkMLzQA5tel+O1S+WvB41/+sMEPj3RJL123dYGQecAfDwJjTHfH7BnQC3htWEMd7U5
|
Y6Zw8KzRSehhSwBjBQDUVowIQOUsnKEm7yRDHMGVHVCDRfZ0mxfud53XbUFFXBYAN8WAk6YdaNJtlRA+
|
||||||
bMfTH0qJANwUPVhwbHjco4Djp2DL27D5TXH+cvmLHU//Hs+nz2Ky+TNP6bY6CDoH4IMYLg/efQB+vQve
|
06eo47tNIc+I3ncc3vhYqvc00O6mGIDh5wA6MFQA2nrhzga1TSUUj4Mq2PnMQtVVNyy6M2rU+DGDW9Fk
|
||||||
lDURZXMwa83Tf0JfnkwAHtdtdRBkcrAzRsuD5YTd4Hi534qnP0ziyxMKgJuiA+jQbXkQdA6oVVw2c9qF
|
B41e/w9F/NWjfdM0enLQfkaWAaWweBY0L1Zn+MMiOwBvHIZ3j5sX7o+kw4L1PwwXAKO3AiUPUBwzE6o5
|
||||||
l9+HR3bBPsuvtRrsOWrN07/D8+VxmWoEpTVRwP/uM34b54QcOKZae3/eJ629IDh1Gp581/6nP0wtAJsA
|
R5AtuUZyyVVO/8ZhyA3qvgP+cDiEsegBMuTrhQJg7FagMDGTHFi7AG5bGO4svaNnVbj/idkOYxtDvm6N
|
||||||
KwLJTA62HdBtRbDkT8OL7yrnl9ZecLx0wBrnz6N8eEImFQBvcki77qsIilf67SkIvndYhfuvGH68dtTI
|
ALT1wqeTkAyxDt0UwmzJledcP/z2Y3j3hO6r95+enNHrfxhNANwUXU7azLJgUL+U1lOwYb5uS6JD2C25
|
||||||
5NSqP0toL5z+Mx7FTKF/VPdVBIUNBcFsHp7ZA799Q1p7YWDBkt9CpvTdYo7U3AwMAbN0X00QdA6oTUIm
|
QIX7e7rV1p4t4f5I2nqNXv9n3BRd+X+MPOrRAtyt28Jy6ZemEABMrlKZ/Vvmhxvud52B7Yfs78yTNVvY
|
||||||
jhB/q19t3pHqfjjsGrCm8AfKZzdP9Y+mjADcVHEvZAqZHDy9X50jYApHc/C7LvjD2+L8YdF3Qn0uLHr6
|
dhb+Y6QA7MBgAWjrhU/NhoYYT4nV1ZJrx2H4IOC5f1Gg+4Lx4f+Own+MFgEYS08OfncKvrhQtyXhUz9V
|
||||||
b/Z8d1KKPYjKmjQA1C/5sb1m7H/f2adyfRuP144KuWH49R6rnB+K9NliBaAdJi8mmEYmB89HeNNz4Rhu
|
Ddy4RlpyBcrvThkd/sMIHx8mAG6K3U6aPqBWt5XlErdDQTpbcrV0wikZLGcSfW6K3YXfGK3cowXYpNvS
|
||||||
W4/XjgrP91nn/EUX74sSAO8k0U3F/FuT6ByA3RHL+U678NdeNY1XTtgNn38OWpX3+2zyT/+dilLOon0A
|
cunJwVsn4faQq9h0cENShftxbskVJh+eMT78bxn5jdEE4DUMFgCwv0vQvGlqW68xxCm4A5fU0I3dEWvJ
|
||||||
gw8OGY9MDrbsh3cj5GhDJ9UYbmnthc++Y/D7Xuue/lmUrxZF0QLgpugDNuq+uqDJ5OCJHhkeEjcGT8Jv
|
FSaGn/4D5dvDGE0Atuu2slLaetWpwIUhVrWFyZ+ukJZcYWPB3j+M4ttXbBK5KdpRXYKNpScHe83/ZY1J
|
||||||
3rHO+QE2er5aFKWeRv8TLFkZWEgmB794G04YUBQUKic7DA+/ZaXz51E+WjQlCYCbohsLowBQH4YXIlwU
|
WM7fm4V/fR9++WG8nR/gzR7jn/7dnm8PY6xd4hbd1lZKWy+cNPsXpo3+QXVu/+m90o8PoK/fiqd/y2jf
|
||||||
FILjT/YV/Xw2ej5aNKVGAFBCfmEanQOw/aBuK4Qw2X7QyqKfT8m+WbIAuCl2Y9HCoEIyOXjxQxEBW9l+
|
HEsAXtFtbaX05OC/ZehZybT3wFN7VQvuuK71R/JfJ4x/+sMYPj1W06cW3db6QVsvfCYJ9VIfMCEnL6gO
|
||||||
UP1+LX36b/Z8syTKiQAAvq/7asPCF4FXZZKOVbzab7XzQ5k+WZYAeAMGtui+4rDI5OC5D0QEbOHVfvX7
|
vIcNaskVBqftePpDKRGAm6ITC8aGSxQwMdkBeL1Thfvi/FfyWzue/p2eT1/BeCfFX9RttR+09cIxy8+m
|
||||||
tNj5t0w29GMyyo0AwOJaAJwRAUkHzGb7QeudHyrwxbIFwE3RjkWzAsZDagJmY3nO79Pu+WJZVBIBgMW1
|
l8t7J1S4/zsD+/GFwYmsNU//MX15PAF4TrfVftCTgz2ndFsRLbozsGU/bDsg/fjG462TVjz9YRxfHlMA
|
||||||
AB9fBP64H4asWwFhJ8fy6vcVA+eHCn3Qcd3KFp06af4A3Kz7LlSDZALuXgpNM3RbIkzEwSz8qjsWjg/w
|
3BStQKtuy/2grVed4oo72QF49SD8v31w5Kxua6LNgbPWPP1bPV8elYmKRa2JAv7tsPFlnGVzyYW24/CP
|
||||||
jJvipkpeoNIIAOBeLNsjMBGZnNo2uueobkuE8dg7FCvnzwL3VPoiFQuAd+LID3XfjWqRyamJsaaPFrON
|
repPCffH5+IleOEj+5/+MLEAbAHVPth0enKw87huK8Ln6Fn1xH/1IFyw4jcZPG8ct8b5B1A+PCbjCoDX
|
||||||
XQPw257YOD/ADyc67acUKk4BAJw0tcBrQIvuu1ItkglobYBPzYe503VbE1+OnFLTnjsHYuX83cBVbqry
|
OaRF91X4xdsn45MQPH8R/uMAPL9f+vGVQk9OnfqzhJbC7j+jUUy/mKd1X4VfxCEheMmFd46pcN/GfnxB
|
||||||
yDsQAQBw0rQBL+i9L9UnmYBbL4Sls3VbEj/2DsXuqe9zk5vimSBeKDABAHDSPAbcoeuu6MKPBj7bBIlp
|
Y8GR30Im9N1ipr9tBTJAiPNhg6OtVxUJ6W4hfv6iGsDpJ3FpyRUUe3utSfyB8tmtE/2nCSMAN1XcC5lC
|
||||||
uq2xn5PDsLUvdk99n01uituCerGgBaAJeAOor/590Y9EA+ET46c+qEm/l001678UgugCjOANIvhute9K
|
Tw62HVFzBHTi51Scszn4dQf883vi/OXSfUF9Lix6+m/1fHdcim0Zac0yANQv+ZmDervW9vggQJdc1Y7r
|
||||||
VPALhH/cD8dlzUCgHPd6+zF2flCFv0BncwYaAcBIQfAl4BNVvDGRI5mAmxfBlQaePxA1dg+o0W0xdnyA
|
qb3wvj3r1tDJDcI/HbDK+aFIny1WAFpg/GSCafTk4DWNRc+tn6h9+XL56LQ6vrvz4/j04wuK17qtc/6i
|
||||||
3cDKYmf9FUvgAgDgpFkFbKe4g0esxa8NLJsNy+fotsY89hyFN4/ENtcfy3Vuim1Bv2goAgDgpPkZ8I2Q
|
k/dFCYA3SXRLMf/XJNp6YZ+mNV+mXzXZKJXTWfj/H8CL70s/Pj94r8+qdX+eLfnpvxNRTBIwz+PANzB0
|
||||||
b4oR+EJwxVy40IrzlcJl3zHYPSiOX8DDbqryRT/jEaYA1KKigFUh3hij8IWgZS5cLEJwFu8OweuHxfHH
|
cMho9OTgpSMwYzJcoyHFuf8E1NWoCb0TNfk4k4PdXfBej5Tp+sXhc/DLLuue/lmUrxaF47rFf5qcNH8P
|
||||||
0AGsDqLnPx6hCQCAk2YJsJOYdgUmwheCi2cpMYg7XYdVdV8c/yyGUHl/SXP+SiFUAQBw0qwDfhfqmxiK
|
/IXuK/SbZAIevU5f2fD86bBxmRKDkZzOqTLdg31ab5F19PXDkx9a5/wAv3BTPFrsfy5VAJYB71Na5GAE
|
||||||
LwTTa+CaxnitKDx8El7uh5OnxfEn4TY3Fe6BPKELAEg9oBh8MUgm1MnFNi4oyg2rNfuZnDh9EYSW9xdS
|
yQT87xtgqsZ24tOnQMM0mD0VTl2A7nNqqSD4S3YQnnjfSucfAG5wU5fHf09ESYOjvBd+VvdVBkFPDl7X
|
||||||
LQGQekAJ+GKwoA6uqIcZBovBiWF4fRAOZMXpS6CDEPP+QqoiACD1gHLxxaBumooMGhO6LZqa/px60meH
|
3Akx06/abb95VP0pzh8Mv7Ev6Zfn2VKcH0oUAI+i1xem0dYLu+T0nNXsOmFl0i9Pyb5ZsgC4KfZh0cGg
|
||||||
xenLIPS8v5CqCQCAk2YD8ETV3tAyfDEAJQjnz4CLZulNF3LD8M4QvH9COTyI01dI6Hl/IVUVAAAnzUPA
|
QnpysOMTEQFb2XVC/X4tffpv9XyzJMqdHft93VcbFHkReCcGgy7jxDsnrXZ+KNMnyxIAr8HAS7qvOCh6
|
||||||
16r6phZTKAoATXXQkFBTi4JMHU4MQ98JGMhBX0FgKs4eKFXJ+wvRIQB1qHrAiqq+ccwYKwyVIo4eOh1U
|
cvDqMREBW3jnpPp9Wuz8L43X9GM8Kpkeb20uAC6LgCwHzGbXCeudHyrwxbIFwE3RgkW9AkZDcgJmY/ma
|
||||||
Ke8vpOoCAOCkWYbaL9BU9TcXhOjRh1rqW5W8vxAtAgDgpLkSFQnImjghzgyhnL9Dx5sHuh24FLxzzG4i
|
P0+L54tlUUkEABbnAvLkReDXRyAjHXWM4NyA+n3FwPmhQh8s6SDQqC+Q5lfAPbrvQhgkE/DIUmiYqtsS
|
||||||
JgNFBWEc8qjpPh26DNAmAADe7qY7vRshCHEij6r4B77DrxS0CgCAm+Ip1GhxQYgT3/Y++1rRLgAAboqH
|
YSxOZOEfOmLh+AAvuyk2VvIClUYAAN9EnT+2np6cKhs9IB11I8nBTKycPwtsrvRFKhYAb+LID3XfjbDo
|
||||||
ifEkISF2/NhN8aBuI0BjEXBcY2TPgGA/v3RTfFW3ET6RiAB83BTfBP1hkSCExGYCOM0nSCIlAB63AVt1
|
yamOsba3FjONvb3wL52xcX6AH4417acUKl4CADhpqoF3gSbddyUskglYWQefnQOzpui2Jr6cuai6Pbf1
|
||||||
GyEIAbMNuDPomX6VEjkB8G7QLYgICPawDdXuG9JtyFgiJwAA3o26CUkHBPPZTESdHyJWBBzXQCkMCuby
|
xsr5O4Cb3VTlkbcvAgDgpGkGXtd7X8InmYAvXwNLZ+i2JH4czMTuqZ9no5viZT9eyDcBAHDSPAM8pOuu
|
||||||
S+CeqIX9hUReAACcNN8CfqrbDkEogR+7qei3to0QAAAnzR3AI8T8rAEh8uRRi3we1G1IMRgjAABOmptR
|
6CIfDdzZAAmN1YRxoX8QtnfH7qmfZ4ub4gG/XsxvAWhAlQvXhn9f9CPRQPDE+KkPqtPvDRP1+i8FP3YB
|
||||||
A0VkA5EQRfzlvcbUrowSAAAnzbXAk8hWYiFaDKGKfVrX9peKcQIA4KRpAZ4Glui2RRBQ+/m17uorl0i2
|
hnBTdAPfCfuuRIV8gvDXR+C8nBnwlfPe3n6MnR9U4s/X3py+RgAwlBB8A7gtxBsTOZIJuGchrNA8f8AG
|
||||||
AafCTdEFrAZe0W2LEHs60Lifv1KMFAAYOYp8NZhRbBGs5GHUGK+qT/IJCiNTgLMuQp0+9AgyclyoDkPA
|
9vWq1m0xdnyAfcCaYnv9FYvvAgDgpFkL7MLCzkGlkM8NLJsBy2fqtsY8DpyFD87Edq0/kjvcFDv9ftFA
|
||||||
V6s5vTcsrBAAGDl34Enk8BEhXDqAW01+6hdibAowFjdFD5ISCOFifMg/FmsigFEXJSmBECzWhPxjsVIA
|
BADASfNT4K8CvilGkBeCm2bpaT5qGofPwb4+cfwCnnRTlR/6GY0gBaAaFQWsDfDGGEVeCJpmwbUiBFfw
|
||||||
QFICITA6sCjkH4s1KcBYJCUQAsC6kH8s1kYAoy4yzSeAnyPRgFAcu1G7+Ixa1VcO1kYAhbgpdqCigXuA
|
UQb2nxbHH0ErsM6PPf/RCEwAAJw0i4E9xHRXYCzyQnDtdCUGcaf9tMrui+NfQQa17i+pz18pBCoAAE6a
|
||||||
Qd32CJFlCDWcdmUcnB9iEgGMuuA0TaitxXfotkWIFJtQu/h6dRtSTWInACMXrjYVPQRcqdsWQSvdwL1u
|
TcC/B/omhpIXgilVcGt9vE4Unu6Ht05C/yVx/HF4wE0FO5AncAEAyQcUQ14Mkgk1udjGA0W5QXVmvycn
|
||||||
imd0G6KDWKQA4+GFeCtRIV8kxzUJoZIF/gu4Kq7ODzGOAEbdhDTNqLRgg25bhKrwDKrI16PbEN2IABTg
|
Tl8Ega37CwlLACQfUAJ5MZhbAzfV6p1VUCkXBmF/HxzPitOXQCsBrvsLCUUAQPIB5ZIXg5pJKjLQNb2o
|
||||||
pGkDvge06bZFCIV24PtuinbdhkQFEYBxcNKsQAnBOt22CIGwBXhAHP9sRAAmoUAIbkZmEZrIZtQTv0O3
|
FHqy0NanBnCI05dM4Ov+QkITAAAnzf3A86G9oWXkxQCUICyYCkum610uZAfhUAaOXVB/B3H6Cgl83V9I
|
||||||
IVFFBKAInDTLgPtRrUMRgmiTBzainvi7dRsTdUQASsATgvuAu4E63fYIo8iiHP8nNi/dDRoRgDLwFhPd
|
qAIA4KT5OfD1UN/UYgpFAaChBuoSqmuRn0uHC4PQfQF6c9BdEJiKs/tKKOv+QnQIQA0qH7A61DeOGSOF
|
||||||
h+oaNOu2J+b0ohbxPOBNiRJKQASgApw0taiOwV2ogqGMK68OQ6j8/lGgPcon70QdEYCAcNLUAeuB24G1
|
oVLE0QOnlZDW/YWELgAwNGT0DaAh9DcXhOjRjTrqG8q6vxAtAgDgpFmBigTkTJwQZzIo52/V8ea+lgOX
|
||||||
SK0gaPKoNt6jwOaonrVnGiIAIeClCBtQkcEK3fYYTgfwOLApbuv0q4EIQMh4ZxjcjooOWnTbYwg9qJOh
|
gjfHbCMxaSgqCKMwgOru06rLAG0CAOBVN33VuxGCECcGUBl/3yv8SkGrAAC4KV5EtRYXhDjxbe+zrxXt
|
||||||
H5cWXriIAFQRb8nxWmANcCNyupFPHyq8fxaV0/foNiguiABoxIsO2oAbvD/rddtUJQZRDv88sNU76EXQ
|
AgDgpniSGHcSEmLHj90UT+g2AjQmAUc1RmoGBPv5hZviUd1G5IlEBJDHTfEt0B8WCUJAbMWHaT5+EikB
|
||||||
gAhAhHDSrOJMhNCGPWsNhoBtwIuoJ/wO3QYJChGACOOlDC3AMuBS70//K4pdhi7U/vpuYI/39y4p3kUX
|
8HgA2K7bCEHwmZ3AV/3u6VcpkRMA7wbdi4iAYA87Udt9Gd2GjCRyAgDg3aiNyHJAMJ+tRNT5IWJJwFEN
|
||||||
EQAD8dYfFIpBoTgAJAl+TcIQkPG+H+vk3UC39OPNQwTAYry1CX6hsRkVNdR7X7WcWcXYi+qzD3pfee9n
|
lMSgYC6/ADZHLewvJPICAOCk+WvgJ7rtEIQS+LGbiv7WthECAOCkeQh4ipjPGhAizwDqkM8Tug0pBmME
|
||||||
AH1uiqzuaxHC4f8Bg5IYHLOVtJYAAAAASUVORK5CYII=
|
AMBJcw+qoYgUEAlRJH+815jclVECAOCkuR14ASklFqJFBpXs03q2v1SMEwAAJ00TsA1YrNsWQUDV82ut
|
||||||
|
6iuXSG4DToSboh1YB7yt2xYh9rSisZ6/UowUABgaRb4OzEi2CFbyJKqNV+idfPzCyCXAFRehpg89hbQc
|
||||||
|
F8IhAzwaZvfeoLBCAGBo7sALyPARIVhagS+b/NQvxNglwEjcFJ3IkkAIFuND/pFYEwEMuyhZEgj+Yk3I
|
||||||
|
PxIrBQBkSSD4RisWhfwjsWYJMBJZEgg+YF3IPxJrI4BhF5nmNuBnSDQgFMc+VBWfUaf6ysHaCKAQN8Vu
|
||||||
|
VDSwGejTbY8QWTKo5rRr4uD8EJMIYNgFp2lAlRY/pNsWIVJsQVXxdek2JExiJwBDF66Kin4OrNBti6CV
|
||||||
|
DuCbboqXdRuig1gsAUbDC/HWoEK+SLZrEgIlC/wtcHNcnR9iHAEMuwlpGlHLgvt12yKEwsuoJF+nbkN0
|
||||||
|
IwJQgJOmGfge0KzbFiEQWoDvuyladBsSFUQARsFJsxolBJt02yL4wkvA4+L4VyICMA4FQnAP0ovQRLai
|
||||||
|
nvitug2JKiIAReCkWQZ8F7V1KEIQbQaAZ1FP/H26jYk6IgAl4AnBY8AjQI1ue4RhZFGO/3c2H931GxGA
|
||||||
|
MvAOEz2G2jVo1G1PzOlCHeJ53OsSJZSACEAFOGmqUTsGD6MShtKuPBwyqPX900BLlCfvRB0RAJ9w0tQA
|
||||||
|
9wEPAhuQXIHfDKC28Z4GtkZ11p5piAAEgLdEuB8VGazWbY/htALPAVvidk4/DEQAAsabYfAgKjpo0m2P
|
||||||
|
IXSiJkM/J1t4wSICECLekeMNwHrgbmS6UZ5uVHj/CmpN36nboLggAqARLzpoBu7y/qzVbVNI9KEc/jVg
|
||||||
|
uzfoRdCACECEcNKs5XKE0Iw9Zw0ywE5gB+oJv1u3QYJCBCDCeEuGJmAZcL33Z/4rirsM7aj6+g7ggPfv
|
||||||
|
dkneRRcRAAPxzh8UikGhOAAk8f9MQgbo8f4+0sk7gA7ZjzcPEQCL8c4m5BONjaioodb7qubyKcYu1D57
|
||||||
|
n/c14H0PoNtNkdV9LUIw/A9S7C5c0k6ZrgAAAABJRU5ErkJggg==
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -131,8 +131,10 @@ public class MenuItem : ToolStripMenuItem
|
|||||||
|
|
||||||
public class ToolStripRendererEx : ToolStripSystemRenderer
|
public class ToolStripRendererEx : ToolStripSystemRenderer
|
||||||
{
|
{
|
||||||
|
public static bool IsDarkMode { get; set; }
|
||||||
|
|
||||||
public static Color ColorForeground { get; set; } = Color.Black;
|
public static Color ColorForeground { get; set; } = Color.Black;
|
||||||
public static Color ColorTheme { get; set; } = Color.Empty;
|
public static Color ColorTheme { get; set; }
|
||||||
public static Color ColorChecked { get; set; }
|
public static Color ColorChecked { get; set; }
|
||||||
public static Color ColorBorder { get; set; }
|
public static Color ColorBorder { get; set; }
|
||||||
public static Color ColorTop { get; set; }
|
public static Color ColorTop { get; set; }
|
||||||
@@ -146,19 +148,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
|
|
||||||
int TextOffset;
|
int TextOffset;
|
||||||
|
|
||||||
public ToolStripRendererEx()
|
public static void InitColors(Color c, bool darkMode)
|
||||||
{
|
|
||||||
var argb = Convert.ToInt32(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0));
|
|
||||||
|
|
||||||
if (argb == 0)
|
|
||||||
argb = Color.LightBlue.ToArgb();
|
|
||||||
if (ColorTheme == Color.Empty)
|
|
||||||
InitColors(Color.FromArgb(argb));
|
|
||||||
else
|
|
||||||
InitColors(ColorTheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void InitColors(Color c)
|
|
||||||
{
|
{
|
||||||
ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100);
|
ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100);
|
||||||
ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(160);
|
ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(160);
|
||||||
@@ -166,7 +156,7 @@ public class ToolStripRendererEx : ToolStripSystemRenderer
|
|||||||
ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(210);
|
ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(210);
|
||||||
ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240);
|
ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240);
|
||||||
|
|
||||||
if (ColorTheme == Color.Black)
|
if (darkMode)
|
||||||
{
|
{
|
||||||
ColorBorder = Color.White;
|
ColorBorder = Color.White;
|
||||||
ColorBackground = Color.FromArgb(50, 50, 50);
|
ColorBackground = Color.FromArgb(50, 50, 50);
|
||||||
|
|||||||
@@ -14,29 +14,6 @@
|
|||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<TargetFrameworkProfile />
|
<TargetFrameworkProfile />
|
||||||
</PropertyGroup>
|
</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 />
|
<PropertyGroup />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
@@ -137,7 +114,7 @@
|
|||||||
<Reference Include="WindowsBase" />
|
<Reference Include="WindowsBase" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Misc\Addon.cs" />
|
<Compile Include="Misc\Extension.cs" />
|
||||||
<Page Include="Controls\SearchTextBoxUserControl.xaml">
|
<Page Include="Controls\SearchTextBoxUserControl.xaml">
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
@@ -253,7 +230,9 @@
|
|||||||
<Content Include="mpvnet.ico" />
|
<Content Include="mpvnet.ico" />
|
||||||
<Content Include="Resources\mpvConf.txt" />
|
<Content Include="Resources\mpvConf.txt" />
|
||||||
<Content Include="Resources\mpvConfToml.txt" />
|
<Content Include="Resources\mpvConfToml.txt" />
|
||||||
|
<None Include="Resources\mpvnet.ico" />
|
||||||
<None Include="Resources\mpvnet.png" />
|
<None Include="Resources\mpvnet.png" />
|
||||||
|
<None Include="Resources\mpvNetConf.txt" />
|
||||||
<Content Include="Resources\mpvNetConfToml.txt" />
|
<Content Include="Resources\mpvNetConfToml.txt" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ namespace mpvnet
|
|||||||
MPV_END_FILE_REASON_REDIRECT = 5
|
MPV_END_FILE_REASON_REDIRECT = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct mpv_event_log_message
|
public struct mpv_event_log_message
|
||||||
{
|
{
|
||||||
public string prefix;
|
public string prefix;
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
using WinForms = System.Windows.Forms;
|
||||||
|
|
||||||
using static mpvnet.libmpv;
|
using static mpvnet.libmpv;
|
||||||
using static mpvnet.Native;
|
using static mpvnet.Native;
|
||||||
|
|
||||||
@@ -54,19 +56,21 @@ namespace mpvnet
|
|||||||
|
|
||||||
public static IntPtr Handle { get; set; }
|
public static IntPtr Handle { get; set; }
|
||||||
public static IntPtr WindowHandle { get; set; }
|
public static IntPtr WindowHandle { get; set; }
|
||||||
public static Addon Addon { get; set; }
|
public static Extension Extension { get; set; }
|
||||||
public static bool IsLogoVisible { set; get; }
|
public static bool IsLogoVisible { set; get; }
|
||||||
|
public static bool IsQuitNeeded { set; get; } = true;
|
||||||
public static List<KeyValuePair<string, Action<bool>>> BoolPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<bool>>>();
|
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<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 List<KeyValuePair<string, Action<string>>> StringPropChangeActions { get; set; } = new List<KeyValuePair<string, Action<string>>>();
|
||||||
public static Size VideoSize { get; set; } = new Size(1920, 1080);
|
public static Size VideoSize { get; set; }
|
||||||
public static List<PythonScript> PythonScripts { get; set; } = new List<PythonScript>();
|
public static List<PythonScript> PythonScripts { get; set; } = new List<PythonScript>();
|
||||||
public static AutoResetEvent AutoResetEvent { get; set; } = new AutoResetEvent(false);
|
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<MediaTrack> MediaTracks { get; set; } = new List<MediaTrack>();
|
||||||
public static List<KeyValuePair<string, double>> Chapters { get; set; } = new List<KeyValuePair<string, double>>();
|
public static List<KeyValuePair<string, double>> Chapters { get; set; } = new List<KeyValuePair<string, double>>();
|
||||||
|
|
||||||
public static string InputConfPath { get; } = ConfFolder + "\\input.conf";
|
public static string InputConfPath { get; } = ConfigFolder + "\\input.conf";
|
||||||
public static string ConfPath { get; } = ConfFolder + "\\mpv.conf";
|
public static string ConfPath { get; } = ConfigFolder + "\\mpv.conf";
|
||||||
public static string Sid { get; set; } = "";
|
public static string Sid { get; set; } = "";
|
||||||
public static string Aid { get; set; } = "";
|
public static string Aid { get; set; } = "";
|
||||||
public static string Vid { get; set; } = "";
|
public static string Vid { get; set; } = "";
|
||||||
@@ -77,16 +81,48 @@ namespace mpvnet
|
|||||||
public static int Screen { get; set; } = -1;
|
public static int Screen { get; set; } = -1;
|
||||||
public static int Edition { get; set; }
|
public static int Edition { get; set; }
|
||||||
|
|
||||||
public static float Autofit { get; set; } = 0.50f;
|
public static float Autofit { get; set; } = 0.5f;
|
||||||
|
public static float AutofitSmaller { get; set; } = 0.4f;
|
||||||
|
public static float AutofitLarger { get; set; } = 0.75f;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
LoadLibrary("mpv-1.dll");
|
||||||
|
Handle = mpv_create();
|
||||||
|
|
||||||
|
if (App.IsStartedFromTerminal)
|
||||||
|
{
|
||||||
|
set_property_string("terminal", "yes");
|
||||||
|
set_property_string("msg-level", "osd/libass=fatal");
|
||||||
|
}
|
||||||
|
|
||||||
|
set_property_string("config-dir", ConfigFolder);
|
||||||
|
set_property_string("osc", "yes");
|
||||||
|
set_property_string("config", "yes");
|
||||||
|
set_property_string("wid", MainForm.Hwnd.ToString());
|
||||||
|
set_property_string("force-window", "yes");
|
||||||
|
set_property_string("input-media-keys", "yes");
|
||||||
|
mpv_initialize(Handle);
|
||||||
|
ShowLogo();
|
||||||
|
ProcessCommandLine();
|
||||||
|
Task.Run(() => { EventLoop(); });
|
||||||
|
}
|
||||||
|
|
||||||
public static void ProcessProperty(string name, string value)
|
public static void ProcessProperty(string name, string value)
|
||||||
{
|
{
|
||||||
switch (name)
|
switch (name)
|
||||||
{
|
{
|
||||||
case "autofit":
|
case "autofit":
|
||||||
if (value.Length == 3 && value.EndsWith("%"))
|
if (int.TryParse(value.Trim('%'), out int result))
|
||||||
if (int.TryParse(value.Substring(0, 2), out int result))
|
Autofit = result / 100f;
|
||||||
Autofit = result / 100f;
|
break;
|
||||||
|
case "autofit-smaller":
|
||||||
|
if (int.TryParse(value.Trim('%'), out int result2))
|
||||||
|
AutofitSmaller = result2 / 100f;
|
||||||
|
break;
|
||||||
|
case "autofit-larger":
|
||||||
|
if (int.TryParse(value.Trim('%'), out int result3))
|
||||||
|
AutofitLarger = result3 / 100f;
|
||||||
break;
|
break;
|
||||||
case "fs":
|
case "fs":
|
||||||
case "fullscreen": Fullscreen = value == "yes"; break;
|
case "fullscreen": Fullscreen = value == "yes"; break;
|
||||||
@@ -95,48 +131,65 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static string _ConfFolder;
|
static string _ConfigFolder;
|
||||||
|
|
||||||
public static string ConfFolder {
|
public static string ConfigFolder {
|
||||||
get {
|
get {
|
||||||
if (_ConfFolder == null)
|
if (_ConfigFolder == null)
|
||||||
{
|
{
|
||||||
string portableFolder = Application.StartupPath + "\\portable_config\\";
|
_ConfigFolder = Application.StartupPath + "\\portable_config\\";
|
||||||
string appdataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\";
|
|
||||||
string startupFolder = Application.StartupPath + "\\";
|
|
||||||
|
|
||||||
if (!Directory.Exists(appdataFolder) && !Directory.Exists(portableFolder) &&
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
Sys.IsDirectoryWritable(Application.StartupPath) &&
|
_ConfigFolder = RegHelp.GetString(App.RegPath, "ConfigFolder");
|
||||||
!File.Exists(startupFolder + "mpv.conf"))
|
|
||||||
|
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>())
|
using (TaskDialog<string> td = new TaskDialog<string>())
|
||||||
{
|
{
|
||||||
td.MainInstruction = "Choose a settings folder.";
|
td.MainInstruction = "Choose a settings folder.";
|
||||||
td.Content = "[MPV documentation about files on Windows.](https://mpv.io/manual/master/#files-on-windows)";
|
td.AddCommandLink(@"AppData\Roaming\mpv.net", appdataFolder, appdataFolder);
|
||||||
td.AddCommandLink("appdata", appdataFolder, appdataFolder);
|
td.AddCommandLink(@"AppData\Roaming\mpv", appdataFolderMpv, appdataFolderMpv);
|
||||||
td.AddCommandLink("portable", portableFolder, portableFolder);
|
td.AddCommandLink("<startup>\\portable_config", portableFolder, portableFolder);
|
||||||
td.AddCommandLink("startup", startupFolder, startupFolder);
|
td.AddCommandLink("<startup>", startupFolder, startupFolder);
|
||||||
|
td.AddCommandLink("Choose custom folder", "custom");
|
||||||
td.AllowCancel = false;
|
td.AllowCancel = false;
|
||||||
_ConfFolder = td.Show();
|
_ConfigFolder = td.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_ConfigFolder == "custom")
|
||||||
|
{
|
||||||
|
using (var d = new WinForms.FolderBrowserDialog())
|
||||||
|
{
|
||||||
|
d.Description = "Choose a folder.";
|
||||||
|
if (d.ShowDialog() == WinForms.DialogResult.OK)
|
||||||
|
_ConfigFolder = d.SelectedPath + "\\";
|
||||||
|
else
|
||||||
|
_ConfigFolder = appdataFolder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (Directory.Exists(portableFolder))
|
|
||||||
_ConfFolder = portableFolder;
|
|
||||||
else if (Directory.Exists(appdataFolder))
|
|
||||||
_ConfFolder = appdataFolder;
|
|
||||||
else if (File.Exists(Application.StartupPath + "\\mpv.conf"))
|
|
||||||
_ConfFolder = Application.StartupPath + "\\";
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(_ConfFolder)) _ConfFolder = appdataFolder;
|
if (!Directory.Exists(_ConfigFolder))
|
||||||
if (!Directory.Exists(_ConfFolder)) Directory.CreateDirectory(_ConfFolder);
|
Directory.CreateDirectory(_ConfigFolder);
|
||||||
|
|
||||||
if (!File.Exists(_ConfFolder + "\\input.conf"))
|
if (!_ConfigFolder.Contains("portable_config"))
|
||||||
File.WriteAllText(_ConfFolder + "\\input.conf", Properties.Resources.inputConf);
|
RegHelp.SetObject(App.RegPath, "ConfigFolder", _ConfigFolder);
|
||||||
|
|
||||||
if (!File.Exists(_ConfFolder + "\\mpv.conf"))
|
if (!File.Exists(_ConfigFolder + "\\input.conf"))
|
||||||
File.WriteAllText(_ConfFolder + "\\mpv.conf", Properties.Resources.mpvConf);
|
File.WriteAllText(_ConfigFolder + "\\input.conf", Properties.Resources.inputConf);
|
||||||
|
|
||||||
|
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 _ConfFolder;
|
return _ConfigFolder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,43 +213,28 @@ namespace mpvnet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Init()
|
|
||||||
{
|
|
||||||
string dummy = ConfFolder;
|
|
||||||
LoadLibrary("mpv-1.dll");
|
|
||||||
Handle = mpv_create();
|
|
||||||
set_property_string("osc", "yes");
|
|
||||||
set_property_string("config", "yes");
|
|
||||||
set_property_string("wid", MainForm.Hwnd.ToString());
|
|
||||||
set_property_string("force-window", "yes");
|
|
||||||
set_property_string("input-media-keys", "yes");
|
|
||||||
mpv_initialize(Handle);
|
|
||||||
ShowLogo();
|
|
||||||
ProcessCommandLine();
|
|
||||||
Task.Run(() => { LoadScripts(); });
|
|
||||||
Task.Run(() => { Addon = new Addon(); });
|
|
||||||
Task.Run(() => { EventLoop(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void LoadScripts()
|
public static void LoadScripts()
|
||||||
{
|
{
|
||||||
string[] jsLua = { ".lua", ".js" };
|
|
||||||
string[] startupScripts = Directory.GetFiles(Application.StartupPath + "\\Scripts");
|
|
||||||
|
|
||||||
foreach (var scriptPath in startupScripts)
|
if (Directory.Exists(Application.StartupPath + "\\Scripts"))
|
||||||
if (jsLua.Contains(Path.GetExtension(scriptPath).ToLower()))
|
{
|
||||||
commandv("load-script", $"{scriptPath}");
|
string[] startupScripts = Directory.GetFiles(Application.StartupPath + "\\Scripts");
|
||||||
|
|
||||||
foreach (var scriptPath in startupScripts)
|
foreach (string scriptPath in startupScripts)
|
||||||
if (Path.GetExtension(scriptPath) == ".py")
|
if (scriptPath.EndsWith(".lua") || scriptPath.EndsWith(".js"))
|
||||||
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
commandv("load-script", $"{scriptPath}");
|
||||||
|
|
||||||
foreach (var scriptPath in startupScripts)
|
foreach (string scriptPath in startupScripts)
|
||||||
if (Path.GetExtension(scriptPath) == ".ps1")
|
if (Path.GetExtension(scriptPath) == ".py")
|
||||||
PowerShellScript.Init(scriptPath);
|
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
||||||
|
|
||||||
if (Directory.Exists(ConfFolder + "Scripts"))
|
foreach (string scriptPath in startupScripts)
|
||||||
foreach (var scriptPath in Directory.GetFiles(ConfFolder + "Scripts"))
|
if (Path.GetExtension(scriptPath) == ".ps1")
|
||||||
|
PowerShellScript.Init(scriptPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Directory.Exists(ConfigFolder + "Scripts"))
|
||||||
|
foreach (string scriptPath in Directory.GetFiles(ConfigFolder + "Scripts"))
|
||||||
if (Path.GetExtension(scriptPath) == ".py")
|
if (Path.GetExtension(scriptPath) == ".py")
|
||||||
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
PythonScripts.Add(new PythonScript(File.ReadAllText(scriptPath)));
|
||||||
else if (Path.GetExtension(scriptPath) == ".ps1")
|
else if (Path.GetExtension(scriptPath) == ".ps1")
|
||||||
@@ -213,16 +251,17 @@ namespace mpvnet
|
|||||||
if (WindowHandle == IntPtr.Zero)
|
if (WindowHandle == IntPtr.Zero)
|
||||||
WindowHandle = FindWindowEx(MainForm.Hwnd, IntPtr.Zero, "mpv", null);
|
WindowHandle = FindWindowEx(MainForm.Hwnd, IntPtr.Zero, "mpv", null);
|
||||||
|
|
||||||
//Debug.WriteLine(evt.event_id.ToString());
|
// Debug.WriteLine(evt.event_id.ToString());
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
switch (evt.event_id)
|
switch (evt.event_id)
|
||||||
{
|
{
|
||||||
case mpv_event_id.MPV_EVENT_SHUTDOWN:
|
case mpv_event_id.MPV_EVENT_SHUTDOWN:
|
||||||
|
IsQuitNeeded = false;
|
||||||
Shutdown?.Invoke();
|
Shutdown?.Invoke();
|
||||||
WriteHistory(null);
|
WriteHistory(null);
|
||||||
AutoResetEvent.Set();
|
ShutdownAutoResetEvent.Set();
|
||||||
return;
|
return;
|
||||||
case mpv_event_id.MPV_EVENT_LOG_MESSAGE:
|
case mpv_event_id.MPV_EVENT_LOG_MESSAGE:
|
||||||
LogMessage?.Invoke();
|
LogMessage?.Invoke();
|
||||||
@@ -247,6 +286,16 @@ namespace mpvnet
|
|||||||
case mpv_event_id.MPV_EVENT_FILE_LOADED:
|
case mpv_event_id.MPV_EVENT_FILE_LOADED:
|
||||||
HideLogo();
|
HideLogo();
|
||||||
FileLoaded?.Invoke();
|
FileLoaded?.Invoke();
|
||||||
|
Size vidSize = new Size(get_property_int("width"), get_property_int("height"));
|
||||||
|
if (vidSize.Width == 0 || vidSize.Height == 0)
|
||||||
|
vidSize = new Size(1, 1);
|
||||||
|
if (VideoSize != vidSize)
|
||||||
|
{
|
||||||
|
VideoSize = vidSize;
|
||||||
|
VideoSizeChanged?.Invoke();
|
||||||
|
}
|
||||||
|
VideoSizeAutoResetEvent.Set();
|
||||||
|
Task.Run(new Action(() => ReadMetaData()));
|
||||||
WriteHistory(get_property_string("path"));
|
WriteHistory(get_property_string("path"));
|
||||||
break;
|
break;
|
||||||
case mpv_event_id.MPV_EVENT_TRACKS_CHANGED:
|
case mpv_event_id.MPV_EVENT_TRACKS_CHANGED:
|
||||||
@@ -274,27 +323,10 @@ namespace mpvnet
|
|||||||
case mpv_event_id.MPV_EVENT_CLIENT_MESSAGE:
|
case mpv_event_id.MPV_EVENT_CLIENT_MESSAGE:
|
||||||
var client_messageData = (mpv_event_client_message)Marshal.PtrToStructure(evt.data, typeof(mpv_event_client_message));
|
var client_messageData = (mpv_event_client_message)Marshal.PtrToStructure(evt.data, typeof(mpv_event_client_message));
|
||||||
string[] args = NativeUtf8StrArray2ManagedStrArray(client_messageData.args, client_messageData.num_args);
|
string[] args = NativeUtf8StrArray2ManagedStrArray(client_messageData.args, client_messageData.num_args);
|
||||||
|
if (args.Length > 1 && args[0] == "mpv.net")
|
||||||
if (args != null && args.Length > 1 && args[0] == "mpv.net")
|
Command.Execute(args[1], args.Skip(2).ToArray());
|
||||||
{
|
else if (args.Length > 0)
|
||||||
bool found = false;
|
ClientMessage?.Invoke(args);
|
||||||
|
|
||||||
foreach (var i in mpvnet.Command.Commands)
|
|
||||||
{
|
|
||||||
if (args[1] == i.Name)
|
|
||||||
{
|
|
||||||
found = true;
|
|
||||||
i.Action.Invoke(args.Skip(2).ToArray());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
{
|
|
||||||
List<string> names = mpvnet.Command.Commands.Select((item) => item.Name).ToList();
|
|
||||||
names.Sort();
|
|
||||||
Msg.ShowError($"No command '{args[1]}' found.", $"Available commands are:\n\n{string.Join("\n", names)}\n\nHow to bind these commands can be seen in the [default input bindings and menu definition](https://github.com/stax76/mpv.net/blob/master/mpv.net/Resources/inputConf.txt).");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ClientMessage?.Invoke(args);
|
|
||||||
break;
|
break;
|
||||||
case mpv_event_id.MPV_EVENT_VIDEO_RECONFIG:
|
case mpv_event_id.MPV_EVENT_VIDEO_RECONFIG:
|
||||||
VideoReconfig?.Invoke();
|
VideoReconfig?.Invoke();
|
||||||
@@ -328,15 +360,6 @@ namespace mpvnet
|
|||||||
break;
|
break;
|
||||||
case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART:
|
case mpv_event_id.MPV_EVENT_PLAYBACK_RESTART:
|
||||||
PlaybackRestart?.Invoke();
|
PlaybackRestart?.Invoke();
|
||||||
Size vidSize = new Size(get_property_int("dwidth"), get_property_int("dheight"));
|
|
||||||
|
|
||||||
if (VideoSize != vidSize && vidSize != Size.Empty)
|
|
||||||
{
|
|
||||||
VideoSize = vidSize;
|
|
||||||
VideoSizeChanged?.Invoke();
|
|
||||||
}
|
|
||||||
|
|
||||||
Task.Run(new Action(() => ReadMetaData()));
|
|
||||||
break;
|
break;
|
||||||
case mpv_event_id.MPV_EVENT_CHAPTER_CHANGE:
|
case mpv_event_id.MPV_EVENT_CHAPTER_CHANGE:
|
||||||
ChapterChange?.Invoke();
|
ChapterChange?.Invoke();
|
||||||
@@ -414,20 +437,18 @@ namespace mpvnet
|
|||||||
Marshal.FreeHGlobal(mainPtr);
|
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;
|
if (Handle == IntPtr.Zero) return;
|
||||||
int err = mpv_command_string(Handle, command);
|
int err = mpv_command_string(Handle, command);
|
||||||
if (err < 0 && throwException)
|
if (err < 0 && throwException) throw new Exception($"{(mpv_error)err}\n\n" + command);
|
||||||
throw new Exception($"{(mpv_error)err}\r\n\r\n" + command);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void set_property_string(string name, string value, bool throwOnException = false)
|
public static void set_property_string(string name, string value, bool throwOnException = false)
|
||||||
{
|
{
|
||||||
byte[] bytes = GetUtf8Bytes(value);
|
byte[] bytes = GetUtf8Bytes(value);
|
||||||
int err = mpv_set_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_STRING, ref bytes);
|
int err = mpv_set_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_STRING, ref bytes);
|
||||||
if (err < 0 && throwOnException)
|
if (err < 0 && throwOnException) throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
throw new Exception($"{name}: {(mpv_error)err}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string get_property_string(string name, bool throwOnException = false)
|
public static string get_property_string(string name, bool throwOnException = false)
|
||||||
@@ -435,7 +456,13 @@ namespace mpvnet
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_STRING, out IntPtr lpBuffer);
|
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_STRING, out IntPtr lpBuffer);
|
||||||
if (err < 0 && throwOnException) throw new Exception($"{name}: {(mpv_error)err}");
|
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
if (throwOnException) throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
string ret = StringFromNativeUtf8(lpBuffer);
|
string ret = StringFromNativeUtf8(lpBuffer);
|
||||||
mpv_free(lpBuffer);
|
mpv_free(lpBuffer);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -451,10 +478,13 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_INT64, out IntPtr lpBuffer);
|
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_INT64, out IntPtr lpBuffer);
|
||||||
|
|
||||||
if (err < 0 && throwOnException)
|
if (err < 0)
|
||||||
throw new Exception($"{name}: {(mpv_error)err}");
|
{
|
||||||
else
|
if (throwOnException) throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
return lpBuffer.ToInt32();
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lpBuffer.ToInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static double get_property_number(string name, bool throwOnException = false)
|
public static double get_property_number(string name, bool throwOnException = false)
|
||||||
@@ -462,29 +492,20 @@ namespace mpvnet
|
|||||||
double val = 0;
|
double val = 0;
|
||||||
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_DOUBLE, ref val);
|
int err = mpv_get_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_DOUBLE, ref val);
|
||||||
|
|
||||||
if (err < 0 && throwOnException)
|
if (err < 0)
|
||||||
throw new Exception($"{name}: {(mpv_error)err}");
|
{
|
||||||
else
|
if (throwOnException) throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
return val;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool get_property_bool(string name, bool throwOnException = false)
|
return val;
|
||||||
{
|
|
||||||
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)
|
public static void set_property_int(string name, int value, bool throwOnException = false)
|
||||||
{
|
{
|
||||||
Int64 val = value;
|
Int64 val = value;
|
||||||
int err = mpv_set_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_INT64, ref val);
|
int err = mpv_set_property(Handle, GetUtf8Bytes(name), mpv_format.MPV_FORMAT_INT64, ref val);
|
||||||
|
if (err < 0 && throwOnException) throw new Exception($"{name}: {(mpv_error)err}");
|
||||||
if (err < 0 && throwOnException)
|
|
||||||
throw new Exception($"{name}: {(mpv_error)err}");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void observe_property_int(string name, Action<int> action)
|
public static void observe_property_int(string name, Action<int> action)
|
||||||
@@ -524,37 +545,56 @@ namespace mpvnet
|
|||||||
|
|
||||||
foreach (string i in args)
|
foreach (string i in args)
|
||||||
{
|
{
|
||||||
if (!i.StartsWith("--") && (File.Exists(i) || i == "-" || i.StartsWith("http")))
|
if (!i.StartsWith("--") && (i == "-" || i.Contains("://") || File.Exists(i)))
|
||||||
{
|
{
|
||||||
files.Add(i);
|
files.Add(i);
|
||||||
if (i.StartsWith("http"))
|
if (i.Contains("://")) RegHelp.SetObject(App.RegPath, "LastURL", i);
|
||||||
RegHelp.SetObject(App.RegPath, "LastURL", i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Load(files.ToArray(), App.ProcessInstance != "queue", Control.ModifierKeys.HasFlag(Keys.Control));
|
|
||||||
|
|
||||||
foreach (string i in args)
|
foreach (string i in args)
|
||||||
{
|
{
|
||||||
if (i.StartsWith("--"))
|
if (i.StartsWith("--"))
|
||||||
{
|
{
|
||||||
if (i.Contains("="))
|
try
|
||||||
{
|
{
|
||||||
string left = i.Substring(2, i.IndexOf("=") - 2);
|
if (i.Contains("="))
|
||||||
string right = i.Substring(left.Length + 3);
|
{
|
||||||
set_property_string(left, right);
|
string left = i.Substring(2, i.IndexOf("=") - 2);
|
||||||
|
string right = i.Substring(left.Length + 3);
|
||||||
|
set_property_string(left, right, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
set_property_string(i.Substring(2), "yes", true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Msg.ShowException(e);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
set_property_string(i.Substring(2), "yes");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
public static void Load(string[] files, bool loadFolder, bool append)
|
public static void Load(string[] files, bool loadFolder, bool append)
|
||||||
{
|
{
|
||||||
if (files is null || files.Length == 0) return;
|
if (files is null || files.Length == 0) return;
|
||||||
HideLogo();
|
HideLogo();
|
||||||
|
|
||||||
|
if ((DateTime.Now - LastLoad).TotalMilliseconds < 500)
|
||||||
|
append = true;
|
||||||
|
|
||||||
|
LastLoad = DateTime.Now;
|
||||||
|
|
||||||
for (int i = 0; i < files.Length; i++)
|
for (int i = 0; i < files.Length; i++)
|
||||||
if (App.SubtitleTypes.Contains(Path.GetExtension(files[i]).TrimStart('.').ToLower()))
|
if (App.SubtitleTypes.Contains(Path.GetExtension(files[i]).TrimStart('.').ToLower()))
|
||||||
commandv("sub-add", files[i]);
|
commandv("sub-add", files[i]);
|
||||||
@@ -566,18 +606,20 @@ namespace mpvnet
|
|||||||
|
|
||||||
if (string.IsNullOrEmpty(get_property_string("path")))
|
if (string.IsNullOrEmpty(get_property_string("path")))
|
||||||
set_property_int("playlist-pos", 0);
|
set_property_int("playlist-pos", 0);
|
||||||
|
|
||||||
if (loadFolder && !append) Task.Run(() => LoadFolder()); // user reported race condition
|
if (loadFolder && !append) Task.Run(() => LoadFolder()); // user reported race condition
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LoadFolder()
|
public static void LoadFolder()
|
||||||
{
|
{
|
||||||
Thread.Sleep(50); // user reported race condition
|
Thread.Sleep(200); // user reported race condition
|
||||||
string path = get_property_string("path");
|
string path = get_property_string("path");
|
||||||
if (!File.Exists(path) || get_property_int("playlist-count") != 1) return;
|
if (!File.Exists(path) || get_property_int("playlist-count") != 1) return;
|
||||||
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
List<string> files = Directory.GetFiles(Path.GetDirectoryName(path)).ToList();
|
||||||
files = files.Where((file) =>
|
files = files.Where((file) =>
|
||||||
App.VideoTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower()) ||
|
App.VideoTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower()) ||
|
||||||
App.AudioTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower())).ToList();
|
App.AudioTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower()) ||
|
||||||
|
App.ImageTypes.Contains(Path.GetExtension(file).TrimStart('.').ToLower())).ToList();
|
||||||
files.Sort(new StringLogicalComparer());
|
files.Sort(new StringLogicalComparer());
|
||||||
int index = files.IndexOf(path);
|
int index = files.IndexOf(path);
|
||||||
files.Remove(path);
|
files.Remove(path);
|
||||||
@@ -604,16 +646,16 @@ namespace mpvnet
|
|||||||
return rootPointer;
|
return rootPointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static string[] NativeUtf8StrArray2ManagedStrArray(IntPtr pUnmanagedStringArray, int StringCount)
|
static string[] NativeUtf8StrArray2ManagedStrArray(IntPtr unmanagedStringArray, int StringCount)
|
||||||
{
|
{
|
||||||
IntPtr[] pIntPtrArray = new IntPtr[StringCount];
|
IntPtr[] intPtrArray = new IntPtr[StringCount];
|
||||||
string[] ManagedStringArray = new string[StringCount];
|
string[] stringArray = new string[StringCount];
|
||||||
Marshal.Copy(pUnmanagedStringArray, pIntPtrArray, 0, StringCount);
|
Marshal.Copy(unmanagedStringArray, intPtrArray, 0, StringCount);
|
||||||
|
|
||||||
for (int i = 0; i < StringCount; i++)
|
for (int i = 0; i < StringCount; i++)
|
||||||
ManagedStringArray[i] = StringFromNativeUtf8(pIntPtrArray[i]);
|
stringArray[i] = StringFromNativeUtf8(intPtrArray[i]);
|
||||||
|
|
||||||
return ManagedStringArray;
|
return stringArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
static string StringFromNativeUtf8(IntPtr nativeUtf8)
|
static string StringFromNativeUtf8(IntPtr nativeUtf8)
|
||||||
@@ -630,20 +672,21 @@ namespace mpvnet
|
|||||||
static string LastHistoryPath;
|
static string LastHistoryPath;
|
||||||
static DateTime LastHistoryStartDateTime;
|
static DateTime LastHistoryStartDateTime;
|
||||||
|
|
||||||
static void WriteHistory(string filePath)
|
static void WriteHistory(string path)
|
||||||
{
|
{
|
||||||
|
if (!File.Exists(path)) return;
|
||||||
int totalMinutes = Convert.ToInt32((DateTime.Now - LastHistoryStartDateTime).TotalMinutes);
|
int totalMinutes = Convert.ToInt32((DateTime.Now - LastHistoryStartDateTime).TotalMinutes);
|
||||||
|
|
||||||
if (File.Exists(LastHistoryPath) && totalMinutes > 1)
|
if (File.Exists(LastHistoryPath) && totalMinutes > 1)
|
||||||
{
|
{
|
||||||
string historyFilepath = ConfFolder + "history.txt";
|
string historyFilepath = ConfigFolder + "history.txt";
|
||||||
|
|
||||||
File.AppendAllText(historyFilepath, DateTime.Now.ToString().Substring(0, 16) +
|
File.AppendAllText(historyFilepath, DateTime.Now.ToString().Substring(0, 16) +
|
||||||
" " + totalMinutes.ToString().PadLeft(3) + " " +
|
" " + totalMinutes.ToString().PadLeft(3) + " " +
|
||||||
Path.GetFileNameWithoutExtension(LastHistoryPath) + "\r\n");
|
Path.GetFileNameWithoutExtension(LastHistoryPath) + "\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
LastHistoryPath = filePath;
|
LastHistoryPath = path;
|
||||||
LastHistoryStartDateTime = DateTime.Now;
|
LastHistoryStartDateTime = DateTime.Now;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -651,19 +694,21 @@ namespace mpvnet
|
|||||||
{
|
{
|
||||||
if (MainForm.Instance is null) return;
|
if (MainForm.Instance is null) return;
|
||||||
Rectangle cr = MainForm.Instance.ClientRectangle;
|
Rectangle cr = MainForm.Instance.ClientRectangle;
|
||||||
if (cr.Width == 0 || cr.Height == 0) return;
|
int len = cr.Height / 5;
|
||||||
|
if (len == 0) return;
|
||||||
|
|
||||||
using (Bitmap b = new Bitmap(cr.Width, cr.Height))
|
using (Bitmap b = new Bitmap(len, len))
|
||||||
{
|
{
|
||||||
using (Graphics g = Graphics.FromImage(b))
|
using (Graphics g = Graphics.FromImage(b))
|
||||||
{
|
{
|
||||||
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||||
g.Clear(Color.Black);
|
g.Clear(Color.Black);
|
||||||
int iconWidth = cr.Height / 7;
|
Rectangle rect = new Rectangle(0, 0, len, len);
|
||||||
Rectangle r = new Rectangle(cr.Width / 2 - iconWidth / 2, cr.Height / 2 - iconWidth / 2, iconWidth, iconWidth);
|
g.DrawImage(Properties.Resources.mpvnet, rect);
|
||||||
g.DrawImage(Properties.Resources.mpvnet, r);
|
BitmapData bd = b.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
|
||||||
BitmapData bd = b.LockBits(cr, ImageLockMode.ReadOnly, PixelFormat.Format32bppPArgb);
|
int x = Convert.ToInt32((cr.Width - len) / 2.0);
|
||||||
commandv("overlay-add", "0", "0", "0", "&" + bd.Scan0.ToInt64().ToString(), "0", "bgra", bd.Width.ToString(), bd.Height.ToString(), bd.Stride.ToString());
|
int y = Convert.ToInt32(((cr.Height - len) / 2.0) * 0.9);
|
||||||
|
commandv("overlay-add", "0", $"{x}", $"{y}", "&" + bd.Scan0.ToInt64().ToString(), "0", "bgra", bd.Width.ToString(), bd.Height.ToString(), bd.Stride.ToString());
|
||||||
b.UnlockBits(bd);
|
b.UnlockBits(bd);
|
||||||
IsLogoVisible = true;
|
IsLogoVisible = true;
|
||||||
}
|
}
|
||||||
@@ -675,80 +720,84 @@ namespace mpvnet
|
|||||||
lock (MediaTracks)
|
lock (MediaTracks)
|
||||||
{
|
{
|
||||||
MediaTracks.Clear();
|
MediaTracks.Clear();
|
||||||
|
string path = get_property_string("path");
|
||||||
|
|
||||||
using (MediaInfo mi = new MediaInfo(get_property_string("path")))
|
if (File.Exists(path))
|
||||||
{
|
{
|
||||||
int count = mi.GetCount(MediaInfoStreamKind.Video);
|
using (MediaInfo mi = new MediaInfo(path))
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
|
||||||
{
|
{
|
||||||
MediaTrack track = new MediaTrack();
|
int count = mi.GetCount(MediaInfoStreamKind.Video);
|
||||||
Add(track, mi.GetVideo(i, "Format"));
|
|
||||||
Add(track, mi.GetVideo(i, "Format_Profile"));
|
|
||||||
Add(track, mi.GetVideo(i, "Width") + "x" + mi.GetVideo(i, "Height"));
|
|
||||||
Add(track, mi.GetVideo(i, "FrameRate") + " FPS");
|
|
||||||
Add(track, mi.GetVideo(i, "Language/String"));
|
|
||||||
Add(track, mi.GetVideo(i, "Forced") == "Yes" ? "Forced" : "");
|
|
||||||
Add(track, mi.GetVideo(i, "Default") == "Yes" ? "Default" : "");
|
|
||||||
Add(track, mi.GetVideo(i, "Title"));
|
|
||||||
track.Text = "V: " + track.Text.Trim(' ', ',');
|
|
||||||
track.Type = "v";
|
|
||||||
track.ID = i + 1;
|
|
||||||
MediaTracks.Add(track);
|
|
||||||
}
|
|
||||||
|
|
||||||
count = mi.GetCount(MediaInfoStreamKind.Audio);
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
MediaTrack track = new MediaTrack();
|
||||||
|
Add(track, mi.GetVideo(i, "Format"));
|
||||||
|
Add(track, mi.GetVideo(i, "Format_Profile"));
|
||||||
|
Add(track, mi.GetVideo(i, "Width") + "x" + mi.GetVideo(i, "Height"));
|
||||||
|
Add(track, mi.GetVideo(i, "FrameRate") + " FPS");
|
||||||
|
Add(track, mi.GetVideo(i, "Language/String"));
|
||||||
|
Add(track, mi.GetVideo(i, "Forced") == "Yes" ? "Forced" : "");
|
||||||
|
Add(track, mi.GetVideo(i, "Default") == "Yes" ? "Default" : "");
|
||||||
|
Add(track, mi.GetVideo(i, "Title"));
|
||||||
|
track.Text = "V: " + track.Text.Trim(' ', ',');
|
||||||
|
track.Type = "v";
|
||||||
|
track.ID = i + 1;
|
||||||
|
MediaTracks.Add(track);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
count = mi.GetCount(MediaInfoStreamKind.Audio);
|
||||||
{
|
|
||||||
MediaTrack track = new MediaTrack();
|
|
||||||
Add(track, mi.GetAudio(i, "Language/String"));
|
|
||||||
Add(track, mi.GetAudio(i, "Format"));
|
|
||||||
Add(track, mi.GetAudio(i, "Format_Profile"));
|
|
||||||
Add(track, mi.GetAudio(i, "BitRate/String"));
|
|
||||||
Add(track, mi.GetAudio(i, "Channel(s)/String"));
|
|
||||||
Add(track, mi.GetAudio(i, "SamplingRate/String"));
|
|
||||||
Add(track, mi.GetAudio(i, "Forced") == "Yes" ? "Forced" : "");
|
|
||||||
Add(track, mi.GetAudio(i, "Default") == "Yes" ? "Default" : "");
|
|
||||||
Add(track, mi.GetAudio(i, "Title"));
|
|
||||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
|
||||||
track.Type = "a";
|
|
||||||
track.ID = i + 1;
|
|
||||||
MediaTracks.Add(track);
|
|
||||||
}
|
|
||||||
|
|
||||||
count = mi.GetCount(MediaInfoStreamKind.Text);
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
MediaTrack track = new MediaTrack();
|
||||||
|
Add(track, mi.GetAudio(i, "Language/String"));
|
||||||
|
Add(track, mi.GetAudio(i, "Format"));
|
||||||
|
Add(track, mi.GetAudio(i, "Format_Profile"));
|
||||||
|
Add(track, mi.GetAudio(i, "BitRate/String"));
|
||||||
|
Add(track, mi.GetAudio(i, "Channel(s)/String"));
|
||||||
|
Add(track, mi.GetAudio(i, "SamplingRate/String"));
|
||||||
|
Add(track, mi.GetAudio(i, "Forced") == "Yes" ? "Forced" : "");
|
||||||
|
Add(track, mi.GetAudio(i, "Default") == "Yes" ? "Default" : "");
|
||||||
|
Add(track, mi.GetAudio(i, "Title"));
|
||||||
|
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||||
|
track.Type = "a";
|
||||||
|
track.ID = i + 1;
|
||||||
|
MediaTracks.Add(track);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
count = mi.GetCount(MediaInfoStreamKind.Text);
|
||||||
{
|
|
||||||
MediaTrack track = new MediaTrack();
|
|
||||||
Add(track, mi.GetText(i, "Language/String"));
|
|
||||||
Add(track, mi.GetText(i, "Format"));
|
|
||||||
Add(track, mi.GetText(i, "Format_Profile"));
|
|
||||||
Add(track, mi.GetText(i, "Forced") == "Yes" ? "Forced" : "");
|
|
||||||
Add(track, mi.GetText(i, "Default") == "Yes" ? "Default" : "");
|
|
||||||
Add(track, mi.GetText(i, "Title"));
|
|
||||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
|
||||||
track.Type = "s";
|
|
||||||
track.ID = i + 1;
|
|
||||||
MediaTracks.Add(track);
|
|
||||||
}
|
|
||||||
|
|
||||||
count = get_property_int("edition-list/count");
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
MediaTrack track = new MediaTrack();
|
||||||
|
Add(track, mi.GetText(i, "Language/String"));
|
||||||
|
Add(track, mi.GetText(i, "Format"));
|
||||||
|
Add(track, mi.GetText(i, "Format_Profile"));
|
||||||
|
Add(track, mi.GetText(i, "Forced") == "Yes" ? "Forced" : "");
|
||||||
|
Add(track, mi.GetText(i, "Default") == "Yes" ? "Default" : "");
|
||||||
|
Add(track, mi.GetText(i, "Title"));
|
||||||
|
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||||
|
track.Type = "s";
|
||||||
|
track.ID = i + 1;
|
||||||
|
MediaTracks.Add(track);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
count = get_property_int("edition-list/count");
|
||||||
{
|
|
||||||
MediaTrack track = new MediaTrack();
|
|
||||||
track.Text = "E: " + get_property_string($"edition-list/{i}/title");
|
|
||||||
track.Type = "e";
|
|
||||||
track.ID = i;
|
|
||||||
MediaTracks.Add(track);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Add(MediaTrack track, string val)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(val) && !(track.Text != null && track.Text.Contains(val)))
|
MediaTrack track = new MediaTrack();
|
||||||
track.Text += " " + val + ",";
|
track.Text = "E: " + get_property_string($"edition-list/{i}/title");
|
||||||
|
track.Type = "e";
|
||||||
|
track.ID = i;
|
||||||
|
MediaTracks.Add(track);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Add(MediaTrack track, string val)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(val) && !(track.Text != null && track.Text.Contains(val)))
|
||||||
|
track.Text += " " + val + ",";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
@@ -39,6 +39,7 @@ Source: "{#MyAppSourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesub
|
|||||||
[Run]
|
[Run]
|
||||||
Filename: "{app}\{#MyAppExeName}"; Description: "Associate video file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc video"
|
Filename: "{app}\{#MyAppExeName}"; Description: "Associate video file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc video"
|
||||||
Filename: "{app}\{#MyAppExeName}"; Description: "Associate audio file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc audio"
|
Filename: "{app}\{#MyAppExeName}"; Description: "Associate audio file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc audio"
|
||||||
|
Filename: "{app}\{#MyAppExeName}"; Description: "Associate image file extensions?"; Flags: postinstall unchecked runascurrentuser runhidden nowait; Parameters: "--reg-file-assoc image"
|
||||||
|
|
||||||
[UninstallRun]
|
[UninstallRun]
|
||||||
Filename: "{app}\{#MyAppExeName}"; Flags: runascurrentuser runhidden; Parameters: "--reg-file-assoc unreg"
|
Filename: "{app}\{#MyAppExeName}"; Flags: runascurrentuser runhidden; Parameters: "--reg-file-assoc unreg"
|
||||||
48
setup.ps1
@@ -1,48 +0,0 @@
|
|||||||
# exit the script if the exit code is greater than 0
|
|
||||||
function CheckExitCode {
|
|
||||||
if ($LastExitCode -gt 0) {
|
|
||||||
Write-Host "`nExit code $LastExitCode was returned.`n" -ForegroundColor Red
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# exit the script if the file don't exist
|
|
||||||
function CheckFileExist($path) {
|
|
||||||
if (![IO.File]::Exists($path)) {
|
|
||||||
Write-Host "`nFile is missing:`n`n$path`n" -ForegroundColor Red
|
|
||||||
exit
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$msbuild = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"
|
|
||||||
$innoSetup = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
|
|
||||||
$sevenZip = "C:\Program Files\7-Zip\7z.exe"
|
|
||||||
|
|
||||||
# exit the script if one of the executables don't exist
|
|
||||||
CheckFileExist($msbuild); CheckFileExist($innoSetup); CheckFileExist($sevenZip);
|
|
||||||
|
|
||||||
# build the projects using msbuild
|
|
||||||
& $msbuild mpv.net.sln /p:Configuration=Debug /p:Platform=x64; CheckExitCode
|
|
||||||
& $msbuild mpv.net.sln /p:Configuration=Debug /p:Platform=x86; CheckExitCode
|
|
||||||
|
|
||||||
# build the setups using inno setup
|
|
||||||
& $innoSetup /Darch="x64" setup.iss; CheckExitCode
|
|
||||||
& $innoSetup /Darch="x86" setup.iss; CheckExitCode
|
|
||||||
|
|
||||||
# create the x64 portable archives using 7zip
|
|
||||||
$scriptDir = Split-Path -Path $PSCommandPath -Parent
|
|
||||||
$desktopDir = [Environment]::GetFolderPath("Desktop")
|
|
||||||
$exePath = $scriptDir + "\mpv.net\bin\x64\mpvnet.exe"
|
|
||||||
$version = [Diagnostics.FileVersionInfo]::GetVersionInfo($exePath).FileVersion
|
|
||||||
$targetDir = $desktopDir + "\mpv.net-portable-x64-" + $version
|
|
||||||
Copy-Item $scriptDir\mpv.net\bin\x64 $targetDir -Recurse -Exclude System.Management.Automation.xml -Force
|
|
||||||
& $sevenZip a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"; CheckExitCode
|
|
||||||
& $sevenZip a -tzip -mx9 "$targetDir.zip" -r "$targetDir\*"; CheckExitCode
|
|
||||||
|
|
||||||
# create the x86 portable archives using 7zip
|
|
||||||
$exePath = $scriptDir + "\mpv.net\bin\x86\mpvnet.exe"
|
|
||||||
$version = [Diagnostics.FileVersionInfo]::GetVersionInfo($exePath).FileVersion
|
|
||||||
$targetDir = $desktopDir + "\mpv.net-portable-x86-" + $version
|
|
||||||
Copy-Item $scriptDir\mpv.net\bin\x86 $targetDir -Recurse -Exclude System.Management.Automation.xml -Force
|
|
||||||
& $sevenZip a -t7z -mx9 "$targetDir.7z" -r "$targetDir\*"; CheckExitCode
|
|
||||||
& $sevenZip a -tzip -mx9 "$targetDir.zip" -r "$targetDir\*"; CheckExitCode
|
|
||||||