Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7f680829ef | ||
|
|
603f956261 | ||
|
|
6d06df9004 | ||
|
|
5ea086d05b | ||
|
|
1ad819fa9d | ||
|
|
f2dd6205b5 | ||
|
|
b2a3c231ff | ||
|
|
f6c223a411 | ||
|
|
e7a2ba6805 | ||
|
|
5a08d9ccd6 | ||
|
|
5714a5e62a | ||
|
|
def7e5ac5a | ||
|
|
601bb20492 | ||
|
|
59600df977 | ||
|
|
e1b9730e9b | ||
|
|
e378551938 | ||
|
|
a82b2ef571 | ||
|
|
6157a01701 | ||
|
|
ec17ae8ce9 | ||
|
|
f719528017 | ||
|
|
966b45eb65 | ||
|
|
eeae6994a2 | ||
|
|
07809d882f | ||
|
|
e970f0b4e4 | ||
|
|
a36b6a3fdf | ||
|
|
4febca257f | ||
|
|
9d493b4d08 |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -1,3 +1,2 @@
|
||||
github: stax76
|
||||
patreon: stax76
|
||||
ko_fi: stax76
|
||||
|
||||
30
.github/ISSUE_TEMPLATE/ask-a-question.md
vendored
30
.github/ISSUE_TEMPLATE/ask-a-question.md
vendored
@@ -8,3 +8,33 @@ assignees: stax76
|
||||
---
|
||||
|
||||
This template is meant for usage questions of mpv.net.
|
||||
|
||||
Some type of questions like questions about a problem require filling out an issue template:
|
||||
|
||||
**Describe the problem**
|
||||
A clear and concise description of what the problem is.
|
||||
|
||||
**To Reproduce**
|
||||
To reproduce, try the last beta version using the CLI option `--config=no`.
|
||||
|
||||
In case of an audio or video problem, try to reproduce the problem using mpv instead of mpv.net.
|
||||
If it can be reproduced with mpv, use the [mpv issue tracker](https://github.com/mpv-player/mpv/issues).
|
||||
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
1. mpv.net version
|
||||
2. Windows version
|
||||
3. GPU name
|
||||
4. Media info
|
||||
|
||||
9
.github/ISSUE_TEMPLATE/report-a-bug.md
vendored
9
.github/ISSUE_TEMPLATE/report-a-bug.md
vendored
@@ -11,6 +11,11 @@ assignees: stax76
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
To reproduce, try the last beta version using the CLI option `--config=no`.
|
||||
|
||||
In case of an audio or video issue, try to reproduce the issue using mpv instead of mpv.net.
|
||||
If it can be reproduced with mpv, use the [mpv issue tracker](https://github.com/mpv-player/mpv/issues).
|
||||
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
@@ -25,3 +30,7 @@ If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
1. mpv.net version
|
||||
2. Windows version
|
||||
3. GPU name
|
||||
4. Media info
|
||||
|
||||
@@ -16,10 +16,6 @@ mpv focuses on the usage of the command line and the terminal,
|
||||
mpv.net retains the ability to be used from the command line and
|
||||
the terminal and adds a modern Windows GUI on top of it.
|
||||
|
||||
Like mpv, mpv.net is designed for power users, for regular users there is a
|
||||
[mpv.net-next](https://github.com/mpv-net-player/mpv.net-next)
|
||||
project under construction.
|
||||
|
||||
#### Graphical User Interface
|
||||
|
||||
Modern GUI with customizable color themes.
|
||||
|
||||
@@ -1,4 +1,30 @@
|
||||
|
||||
# 6.0.3.1 (2022-07-30)
|
||||
|
||||
- Creating a playlist from a folder uses absolute normalized paths, non-media files are ignored.
|
||||
- The show-info command shows directly an advanced view, which was enhanced with a General section and the filename.
|
||||
- Media info titles are shortened if they contain duplicated or obvious information.
|
||||
- Support of shortcuts (.lnk files) with media file target.
|
||||
- Support --audio-file and --sub-file aliases.
|
||||
- playlist-random command jumps to a random playlist entry, default key binding is F9.
|
||||
- Fix OSC hide behavior on mouse move.
|
||||
- Fix external audio tracks not shown correctly in tracks context menu.
|
||||
- New binding (e key) to show the current file in File Explorer.
|
||||
- Shift key enables `process-instance=multi`.
|
||||
- Command line syntax (preceding double hyphen) is supported in mpv.conf for options implemented by mpv.net.
|
||||
- MediaInfo v22.06
|
||||
- libmpv shinchiro 2022-07-30
|
||||
|
||||
input.conf changes:
|
||||
|
||||
New:
|
||||
|
||||
```
|
||||
e run powershell -command "explorer.exe '/select,' ( \"${path}\" -replace '/', '\\' )" #menu: Tools > Show current file in File Explorer
|
||||
F9 script-message-to mpvnet playlist-random #menu: Navigate > Random File
|
||||
```
|
||||
|
||||
|
||||
# 6.0.3.0 (2022-07-03)
|
||||
|
||||
- Fix the rare occasion of duplicated playlist entries produced by the auto-load-folder feature.
|
||||
|
||||
@@ -42,9 +42,7 @@ mpv focuses on the usage of the command line and the terminal,
|
||||
mpv.net retains the ability to be used from the command line and
|
||||
the terminal and adds a modern Windows GUI on top of it.
|
||||
|
||||
Like mpv, mpv.net is designed for power users, for regular users there is a
|
||||
[mpv.net-next](https://github.com/mpv-net-player/mpv.net-next)
|
||||
project under construction.
|
||||
Like mpv, mpv.net is designed for power users.
|
||||
|
||||
|
||||
Download
|
||||
@@ -90,12 +88,21 @@ the files are opened in mpv.net in random order, this works with maximum 15 file
|
||||
Support
|
||||
-------
|
||||
|
||||
Before making a support request, please try the newest version first.
|
||||
Before making a support request, please try the newest [beta version](../../../releases) first.
|
||||
|
||||
Bugs and feature requests can be made on the github [issue tracker](../../../issues),
|
||||
feel free to use for anything mpv.net related, usage questions are welcome.
|
||||
Support can be requested here:
|
||||
|
||||
Or use the [support thread](https://forum.videohelp.com/threads/392514-mpv-net-a-extendable-media-player-for-windows) in the VideoHelp forum.
|
||||
Beginner questions:
|
||||
|
||||
https://www.reddit.com/r/mpv
|
||||
|
||||
mpv.net bug reports, feature requests and advanced questions:
|
||||
|
||||
https://github.com/stax76/mpv.net/issues
|
||||
|
||||
Advanced mpv questions:
|
||||
|
||||
https://github.com/mpv-player/mpv/issues
|
||||
|
||||
|
||||
Settings
|
||||
@@ -270,6 +277,9 @@ already the first entry, nothing happens.
|
||||
Jumps to the last playlist entry, if the loaded file is
|
||||
already the last entry, nothing happens.
|
||||
|
||||
### playlist-random
|
||||
Jumps to a random playlist entry.
|
||||
|
||||
### quick-bookmark
|
||||
|
||||
On the first press a bookmark is saved, on the second
|
||||
@@ -320,9 +330,6 @@ Shows available demuxers.
|
||||
|
||||
Shows the history file when existing.
|
||||
|
||||
### show-info
|
||||
Shows media info on screen, a second key press shows more detailed media info.
|
||||
|
||||
### show-input-editor
|
||||
Shows the input editor.
|
||||
|
||||
@@ -475,10 +482,12 @@ playback automatically resumes.
|
||||
|
||||
Defines if more then one mpv.net process is allowed.
|
||||
|
||||
Tip: Whenever the CTRL key is pressed when files or URLs are opened,
|
||||
Whenever the CTRL 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 and URLs.
|
||||
|
||||
Multi can alternatively be enabled by pressing the SHIFT key.
|
||||
|
||||
**multi**
|
||||
Create a new process everytime the shell starts mpv.net.
|
||||
|
||||
@@ -572,31 +581,6 @@ Alternatively the Chrome/Firefox extension [Open With](../../../issues/119) can
|
||||
[Open with++](https://github.com/stax76/OpenWithPlusPlus) can be used to extend the File Explorer context menu to get menu items for [Play with mpv.net](https://github.com/stax76/OpenWithPlusPlus#play-with-mpvnet) and [Add to mpv.net playlist](https://github.com/stax76/OpenWithPlusPlus#add-to-mpvnet-playlist).
|
||||
|
||||
|
||||
### Universal Remote Android app
|
||||
|
||||
Universal Remote is Android remote control app which costs 5 €.
|
||||
|
||||
https://www.unifiedremote.com
|
||||
|
||||
https://play.google.com/store/apps/details?id=com.Relmtech.Remote
|
||||
|
||||
https://play.google.com/store/apps/details?id=com.Relmtech.RemotePaid
|
||||
|
||||
https://www.unifiedremote.com/tutorials/how-to-create-a-custom-keyboard-shortcuts-remote
|
||||
|
||||
https://www.unifiedremote.com/tutorials/how-to-install-a-custom-remote
|
||||
|
||||
[My config](./Universal%20Remote)
|
||||
|
||||
Very useful is the Universal Remote File Browser feature.
|
||||
|
||||
|
||||
### One For All Contour URC1210 and FLIRC USB
|
||||
|
||||
My primary remote control solution however is a One For All Contour URC1210
|
||||
using Philips code 0556 together with FLIRC USB (gen2).
|
||||
|
||||
|
||||
### External Application Button
|
||||
|
||||
Videos can be streamed or downloaded easily with the Chrome extension
|
||||
@@ -1241,7 +1225,7 @@ Adds a negative audio delay using the following command:
|
||||
|
||||
Shows the next subtitle track using the following command:
|
||||
|
||||
`cycle sub`
|
||||
`script-message-to mpvnet cycle-subtitles`
|
||||
|
||||
[cycle command](https://mpv.io/manual/master/#command-interface-cycle-%3Cname%3E-[%3Cvalue%3E])
|
||||
|
||||
|
||||
@@ -24,20 +24,19 @@ namespace mpvnet
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case "add-files-to-playlist": OpenFiles("append"); break; // deprecated 2019
|
||||
case "cycle-audio": CycleAudio(); break;
|
||||
case "execute-mpv-command": Msg.ShowError("The command was removed, reset input.conf by deleting it, in the new menu use the on screen console."); break; // deprecated 2020
|
||||
case "cycle-subtitles": CycleSubtitles(); break;
|
||||
case "load-audio": LoadAudio(); break;
|
||||
case "load-sub": LoadSubtitle(); break;
|
||||
case "open-clipboard": OpenFromClipboard(); break;
|
||||
case "open-conf-folder": ProcessHelp.ShellExecute(Core.ConfigFolder); break;
|
||||
case "open-files": OpenFiles(args); break;
|
||||
case "open-optical-media": Open_DVD_Or_BD_Folder(); break;
|
||||
case "open-url": OpenFromClipboard(); break; // deprecated 2022
|
||||
case "play-pause": PlayPause(); break;
|
||||
case "playlist-add": PlaylistAdd(Convert.ToInt32(args[0])); break;
|
||||
case "playlist-first": PlaylistFirst(); break;
|
||||
case "playlist-last": PlaylistLast(); break;
|
||||
case "playlist-random": PlaylistRandom(); break;
|
||||
case "quick-bookmark": QuickBookmark(); break;
|
||||
case "reg-file-assoc": RegisterFileAssociations(args[0]); break;
|
||||
case "scale-window": ScaleWindow(float.Parse(args[0], CultureInfo.InvariantCulture)); break;
|
||||
@@ -64,10 +63,20 @@ namespace mpvnet
|
||||
case "show-properties": ShowProperties(); break;
|
||||
case "show-protocols": ShowStrings(mpvHelp.GetProtocols().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)); break;
|
||||
case "show-recent": ShowRecent(); break;
|
||||
case "show-setup-dialog": ShowSetupDialog(); break; // deprecated 2022
|
||||
case "show-subtitle-tracks": ShowSubtitleTracks(); break;
|
||||
case "show-text": ShowText(args[0], Convert.ToInt32(args[1]), Convert.ToInt32(args[2])); break;
|
||||
case "window-scale": WindowScale(float.Parse(args[0], CultureInfo.InvariantCulture)); break;
|
||||
|
||||
// deprecated 2019
|
||||
case "add-files-to-playlist": OpenFiles("append"); break;
|
||||
|
||||
// deprecated 2020
|
||||
case "execute-mpv-command": Msg.ShowError("command was removed, reset input.conf by deleting it, in the new menu use the on screen console."); break;
|
||||
case "key-binding": if (args[0] == "show-playlist") ShowPlaylist(); break;
|
||||
|
||||
// deprecated 2022
|
||||
case "show-setup-dialog": ShowSetupDialog(); break;
|
||||
case "open-url": OpenFromClipboard(); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,30 +164,17 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
static int LastShowInfo;
|
||||
|
||||
public static void ShowInfo()
|
||||
{
|
||||
if (Core.PlaylistPos == -1)
|
||||
return;
|
||||
|
||||
if (Environment.TickCount - LastShowInfo < 5000)
|
||||
{
|
||||
Core.Command("script-message-to mpvnet show-media-info osd");
|
||||
LastShowInfo = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
LastShowInfo = Environment.TickCount;
|
||||
|
||||
string text;
|
||||
long fileSize = 0;
|
||||
string path = Core.GetPropertyString("path");
|
||||
|
||||
if (File.Exists(path))
|
||||
{
|
||||
fileSize = new FileInfo(path).Length;
|
||||
|
||||
if (CorePlayer.AudioTypes.Contains(path.Ext()))
|
||||
{
|
||||
text = Core.GetPropertyOsdString("filtered-metadata");
|
||||
@@ -187,6 +183,7 @@ namespace mpvnet
|
||||
}
|
||||
else if (CorePlayer.ImageTypes.Contains(path.Ext()))
|
||||
{
|
||||
fileSize = new FileInfo(path).Length;
|
||||
text = "Width: " + Core.GetPropertyInt("width") + "\n" +
|
||||
"Height: " + Core.GetPropertyInt("height") + "\n" +
|
||||
"Size: " + Convert.ToInt32(fileSize / 1024.0) + " KB\n" +
|
||||
@@ -195,6 +192,11 @@ namespace mpvnet
|
||||
Core.CommandV("show-text", text, "5000");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Core.Command("script-message-to mpvnet show-media-info osd");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (path.Contains("://")) path = Core.GetPropertyString("media-title");
|
||||
@@ -308,13 +310,44 @@ namespace mpvnet
|
||||
if (++aid > tracks.Length)
|
||||
aid = 1;
|
||||
|
||||
Core.CommandV("set", "aid", aid.ToString());
|
||||
Core.SetPropertyInt("aid", aid);
|
||||
}
|
||||
|
||||
Core.CommandV("show-text", aid + "/" + tracks.Length + ": " + tracks[aid - 1].Text.Substring(3), "5000");
|
||||
}
|
||||
}
|
||||
|
||||
public static void CycleSubtitles()
|
||||
{
|
||||
Core.UpdateExternalTracks();
|
||||
|
||||
lock (Core.MediaTracksLock)
|
||||
{
|
||||
MediaTrack[] tracks = Core.MediaTracks.Where(track => track.Type == "s").ToArray();
|
||||
|
||||
if (tracks.Length < 1)
|
||||
{
|
||||
Core.CommandV("show-text", "No subtitles");
|
||||
return;
|
||||
}
|
||||
|
||||
int sid = Core.GetPropertyInt("sid");
|
||||
|
||||
if (tracks.Length > 1)
|
||||
{
|
||||
if (++sid > tracks.Length)
|
||||
sid = 0;
|
||||
|
||||
Core.SetPropertyInt("sid", sid);
|
||||
}
|
||||
|
||||
if (sid == 0)
|
||||
Core.CommandV("show-text", "No subtitle");
|
||||
else
|
||||
Core.CommandV("show-text", sid + "/" + tracks.Length + ": " + tracks[sid - 1].Text.Substring(3), "5000");
|
||||
}
|
||||
}
|
||||
|
||||
public static void ShowCommands()
|
||||
{
|
||||
string jsonString = Core.GetPropertyString("command-list");
|
||||
@@ -391,6 +424,7 @@ namespace mpvnet
|
||||
else
|
||||
{
|
||||
Core.UpdateExternalTracks();
|
||||
text = "N: " + Core.GetPropertyString("filename") + BR;
|
||||
lock (Core.MediaTracksLock)
|
||||
foreach (MediaTrack track in Core.MediaTracks)
|
||||
text += track.Text + BR;
|
||||
@@ -518,6 +552,9 @@ namespace mpvnet
|
||||
Action = () => Core.SetPropertyInt("playlist-pos", index)
|
||||
};
|
||||
|
||||
if (string.IsNullOrEmpty(item.Text))
|
||||
item.Text = file;
|
||||
|
||||
items.Add(item);
|
||||
|
||||
if (currentPath.ToLowerEx() == file.ToLowerEx())
|
||||
@@ -701,6 +738,12 @@ namespace mpvnet
|
||||
Core.SetPropertyInt("playlist-pos", pos);
|
||||
}
|
||||
|
||||
public static void PlaylistRandom()
|
||||
{
|
||||
int count = Core.GetPropertyInt("playlist-count");
|
||||
Core.SetPropertyInt("playlist-pos", new Random().Next(count));
|
||||
}
|
||||
|
||||
public static void QuickBookmark()
|
||||
{
|
||||
if (App.QuickBookmark == 0)
|
||||
|
||||
@@ -7,7 +7,7 @@ public static class TestStringExtension
|
||||
{
|
||||
public static bool ContainsEx(this string instance, string value)
|
||||
{
|
||||
if (instance != null && value != null)
|
||||
if (!string.IsNullOrEmpty(instance) && !string.IsNullOrEmpty(value))
|
||||
return instance.Contains(value);
|
||||
|
||||
return false;
|
||||
@@ -47,6 +47,8 @@ public static class ConvertToStringExtension
|
||||
|
||||
return instance.Trim();
|
||||
}
|
||||
|
||||
public static string ToStringEx(this object instance) => instance?.ToString() ?? "";
|
||||
}
|
||||
|
||||
public static class ConvertStringExtension
|
||||
|
||||
@@ -118,6 +118,11 @@ namespace mpvnet
|
||||
|
||||
Handle = mpv_create();
|
||||
|
||||
var events = Enum.GetValues(typeof(mpv_event_id)).Cast<mpv_event_id>();
|
||||
|
||||
foreach (mpv_event_id i in events)
|
||||
mpv_request_event(Handle, i, 0);
|
||||
|
||||
mpv_request_log_messages(Handle, "no");
|
||||
|
||||
App.RunTask(() => MainEventLoop());
|
||||
@@ -373,6 +378,9 @@ namespace mpvnet
|
||||
string key = i.Substring(0, i.IndexOf("=")).Trim();
|
||||
string value = i.Substring(i.IndexOf("=") + 1).Trim();
|
||||
|
||||
if (key.StartsWith("-"))
|
||||
key = key.TrimStart('-');
|
||||
|
||||
if (value.Contains("#") && !value.StartsWith("#") &&
|
||||
!value.StartsWith("'#") && !value.StartsWith("\"#"))
|
||||
|
||||
@@ -1124,11 +1132,13 @@ namespace mpvnet
|
||||
string left = arg.Substring(2, arg.IndexOf("=") - 2);
|
||||
string right = arg.Substring(left.Length + 3);
|
||||
|
||||
if (left == "script")
|
||||
left = "scripts";
|
||||
|
||||
if (left == "external-file")
|
||||
left = "external-files";
|
||||
switch (left)
|
||||
{
|
||||
case "script": left = "scripts"; break;
|
||||
case "audio-file": left = "audio-files"; break;
|
||||
case "sub-file": left = "sub-files"; break;
|
||||
case "external-file": left = "external-files"; break;
|
||||
}
|
||||
|
||||
if (preInit && preInitProperties.Contains(left))
|
||||
{
|
||||
@@ -1194,22 +1204,39 @@ namespace mpvnet
|
||||
{
|
||||
string file = files[i];
|
||||
|
||||
if (string.IsNullOrEmpty(file))
|
||||
continue;
|
||||
|
||||
if (file.Contains("|"))
|
||||
file = file.Substring(0, file.IndexOf("|"));
|
||||
|
||||
if (file.Ext() == "avs")
|
||||
LoadAviSynth();
|
||||
string ext = file.Ext();
|
||||
|
||||
if (file.Ext() == "iso")
|
||||
LoadISO(file);
|
||||
else if(SubtitleTypes.Contains(file.Ext()))
|
||||
CommandV("sub-add", file);
|
||||
else if (file.Ext().Length != 3 && File.Exists(System.IO.Path.Combine(file, "BDMV\\index.bdmv")))
|
||||
switch (ext)
|
||||
{
|
||||
Command("stop");
|
||||
Thread.Sleep(500);
|
||||
SetPropertyString("bluray-device", file);
|
||||
CommandV("loadfile", @"bd://");
|
||||
case "avs": LoadAviSynth(); break;
|
||||
case "lnk": file = GetShortcutTarget(file); break;
|
||||
}
|
||||
|
||||
if (ext == "iso")
|
||||
LoadISO(file);
|
||||
else if(SubtitleTypes.Contains(ext))
|
||||
CommandV("sub-add", file);
|
||||
else if (ext == "" && !file.Contains("://") && Directory.Exists(file))
|
||||
{
|
||||
if (File.Exists(System.IO.Path.Combine(file, "BDMV\\index.bdmv")))
|
||||
{
|
||||
Command("stop");
|
||||
Thread.Sleep(500);
|
||||
SetPropertyString("bluray-device", file);
|
||||
CommandV("loadfile", @"bd://");
|
||||
}
|
||||
else
|
||||
{
|
||||
files = GetMediaFiles(Directory.GetFiles(file, "*.*", SearchOption.AllDirectories)).ToArray();
|
||||
LoadFiles(files, loadFolder, append);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1300,13 +1327,7 @@ namespace mpvnet
|
||||
if (path.Contains("\\"))
|
||||
dir = System.IO.Path.GetDirectoryName(path);
|
||||
|
||||
List<string> files = Directory.GetFiles(dir).ToList();
|
||||
|
||||
files = files.Where(file =>
|
||||
VideoTypes.Contains(file.Ext()) ||
|
||||
AudioTypes.Contains(file.Ext()) ||
|
||||
ImageTypes.Contains(file.Ext())).ToList();
|
||||
|
||||
List<string> files = GetMediaFiles(Directory.GetFiles(dir)).ToList();
|
||||
files.Sort(new StringLogicalComparer());
|
||||
int index = files.IndexOf(path);
|
||||
files.Remove(path);
|
||||
@@ -1319,6 +1340,13 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
IEnumerable<string> GetMediaFiles(IEnumerable<string> files)
|
||||
{
|
||||
return files.Where(i => VideoTypes.Contains(i.Ext()) ||
|
||||
AudioTypes.Contains(i.Ext()) ||
|
||||
ImageTypes.Contains(i.Ext()));
|
||||
}
|
||||
|
||||
bool WasAviSynthLoaded;
|
||||
|
||||
void LoadAviSynth()
|
||||
@@ -1437,6 +1465,22 @@ namespace mpvnet
|
||||
}
|
||||
}
|
||||
|
||||
string GetNativeLanguage(string name)
|
||||
{
|
||||
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.NeutralCultures))
|
||||
if (ci.EnglishName == name)
|
||||
return ci.NativeName;
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
public static string GetShortcutTarget(string path)
|
||||
{
|
||||
Type t = Type.GetTypeFromProgID("WScript.Shell");
|
||||
dynamic sh = Activator.CreateInstance(t);
|
||||
return sh.CreateShortcut(path).TargetPath;
|
||||
}
|
||||
|
||||
public void RaiseScaleWindow(float value) => ScaleWindow(value);
|
||||
|
||||
public void RaiseWindowScaleNET(float value) => WindowScaleNET(value);
|
||||
@@ -1482,12 +1526,13 @@ namespace mpvnet
|
||||
|
||||
public void UpdateExternalTracks()
|
||||
{
|
||||
int trackCount = GetPropertyInt("track-list/count");
|
||||
int trackListTrackCount = GetPropertyInt("track-list/count");
|
||||
int editionCount = GetPropertyInt("edition-list/count");
|
||||
int count = MediaTracks.Where(i => i.Type != "g").Count();
|
||||
|
||||
lock (MediaTracksLock)
|
||||
{
|
||||
if (MediaTracks.Count != (trackCount + editionCount))
|
||||
if (count != (trackListTrackCount + editionCount))
|
||||
{
|
||||
MediaTracks = MediaTracks.Where(i => !i.External).ToList();
|
||||
MediaTracks.AddRange(GetTracks(false));
|
||||
@@ -1605,6 +1650,15 @@ namespace mpvnet
|
||||
|
||||
using (MediaInfo mi = new MediaInfo(path))
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetGeneral("Format"));
|
||||
Add(track, mi.GetGeneral("FileSize/String"));
|
||||
Add(track, mi.GetGeneral("Duration/String"));
|
||||
Add(track, mi.GetGeneral("OverallBitRate/String"));
|
||||
track.Text = "G: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "g";
|
||||
tracks.Add(track);
|
||||
|
||||
int videoCount = mi.GetCount(MediaInfoStreamKind.Video);
|
||||
|
||||
for (int i = 0; i < videoCount; i++)
|
||||
@@ -1614,14 +1668,12 @@ namespace mpvnet
|
||||
if (float.TryParse(fps, NumberStyles.Float, CultureInfo.InvariantCulture, out float result))
|
||||
fps = result.ToString(CultureInfo.InvariantCulture);
|
||||
|
||||
MediaTrack track = new 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, "BitRate/String"));
|
||||
Add(track, fps + " FPS");
|
||||
Add(track, mi.GetVideo(i, "Language/String"));
|
||||
Add(track, mi.GetVideo(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, (videoCount > 1 && mi.GetVideo(i, "Default") == "Yes") ? "Default" : "");
|
||||
Add(track, mi.GetVideo(i, "Title"));
|
||||
track.Text = "V: " + track.Text.Trim(' ', ',');
|
||||
@@ -1634,16 +1686,80 @@ namespace mpvnet
|
||||
|
||||
for (int i = 0; i < audioCount; i++)
|
||||
{
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetAudio(i, "Language/String"));
|
||||
Add(track, mi.GetAudio(i, "Format"));
|
||||
string lang = mi.GetAudio(i, "Language/String");
|
||||
string nativeLang = GetNativeLanguage(lang);
|
||||
string title = mi.GetAudio(i, "Title");
|
||||
string format = mi.GetAudio(i, "Format");
|
||||
|
||||
if (!string.IsNullOrEmpty(title))
|
||||
{
|
||||
if (title.ContainsEx("DTS-HD MA"))
|
||||
format = "DTS-MA";
|
||||
|
||||
if (title.ContainsEx("DTS-HD MA"))
|
||||
title = title.Replace("DTS-HD MA", "");
|
||||
|
||||
if (title.ContainsEx("Blu-ray"))
|
||||
title = title.Replace("Blu-ray", "");
|
||||
|
||||
if (title.ContainsEx("UHD "))
|
||||
title = title.Replace("UHD ", "");
|
||||
|
||||
if (title.ContainsEx("EAC"))
|
||||
title = title.Replace("EAC", "E-AC");
|
||||
|
||||
if (title.ContainsEx("AC3"))
|
||||
title = title.Replace("AC3", "AC-3");
|
||||
|
||||
if (title.ContainsEx(lang))
|
||||
title = title.Replace(lang, "").Trim();
|
||||
|
||||
if (title.ContainsEx(nativeLang))
|
||||
title = title.Replace(nativeLang, "").Trim();
|
||||
|
||||
if (title.ContainsEx("Surround"))
|
||||
title = title.Replace("Surround", "");
|
||||
|
||||
if (title.ContainsEx("Dolby Digital"))
|
||||
title = title.Replace("Dolby Digital", "");
|
||||
|
||||
if (title.ContainsEx("Stereo"))
|
||||
title = title.Replace("Stereo", "");
|
||||
|
||||
if (title.StartsWith(format + " "))
|
||||
title = title.Replace(format + " ", "");
|
||||
|
||||
foreach (string i2 in new [] { "2.0", "5.1", "6.1", "7.1" })
|
||||
if (title.ContainsEx(i2))
|
||||
title = title.Replace(i2, "");
|
||||
|
||||
if (title.ContainsEx("()"))
|
||||
title = title.Replace("()", "");
|
||||
|
||||
if (title.ContainsEx("[]"))
|
||||
title = title.Replace("[]", "");
|
||||
|
||||
if (title.TrimEx() == format)
|
||||
title = null;
|
||||
}
|
||||
|
||||
track = new MediaTrack();
|
||||
Add(track, lang);
|
||||
Add(track, format);
|
||||
Add(track, mi.GetAudio(i, "Format_Profile"));
|
||||
Add(track, mi.GetAudio(i, "BitRate/String"));
|
||||
Add(track, mi.GetAudio(i, "Channel(s)") + " ch");
|
||||
Add(track, mi.GetAudio(i, "SamplingRate/String"));
|
||||
Add(track, mi.GetAudio(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, (audioCount > 1 && mi.GetAudio(i, "Default") == "Yes") ? "Default" : "");
|
||||
Add(track, mi.GetAudio(i, "Title"));
|
||||
Add(track, title);
|
||||
|
||||
if (track.Text.Contains("MPEG Audio, Layer 2"))
|
||||
track.Text = track.Text.Replace("MPEG Audio, Layer 2", "MP2");
|
||||
|
||||
if (track.Text.Contains("MPEG Audio, Layer 3"))
|
||||
track.Text = track.Text.Replace("MPEG Audio, Layer 2", "MP3");
|
||||
|
||||
track.Text = "A: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "a";
|
||||
track.ID = i + 1;
|
||||
@@ -1655,6 +1771,7 @@ namespace mpvnet
|
||||
for (int i = 0; i < subCount; i++)
|
||||
{
|
||||
string codec = mi.GetText(i, "Format").ToUpperEx();
|
||||
|
||||
if (codec == "UTF-8")
|
||||
codec = "SRT";
|
||||
else if (codec == "WEBVTT")
|
||||
@@ -1662,13 +1779,57 @@ namespace mpvnet
|
||||
else if (codec == "VOBSUB")
|
||||
codec = "VOB";
|
||||
|
||||
MediaTrack track = new MediaTrack();
|
||||
Add(track, mi.GetText(i, "Language/String"));
|
||||
string lang = mi.GetText(i, "Language/String");
|
||||
string nativeLang = GetNativeLanguage(lang);
|
||||
string title = mi.GetText(i, "Title");
|
||||
bool forced = mi.GetText(i, "Forced") == "Yes";
|
||||
|
||||
if (!string.IsNullOrEmpty(title))
|
||||
{
|
||||
if (title.ContainsEx("VobSub"))
|
||||
title = title.Replace("VobSub", "VOB");
|
||||
|
||||
if (title.ContainsEx(codec))
|
||||
title = title.Replace(codec, "");
|
||||
|
||||
if (title.ContainsEx(lang.ToLowerEx()))
|
||||
title = title.Replace(lang.ToLowerEx(), lang);
|
||||
|
||||
if (title.ContainsEx(nativeLang.ToLowerEx()))
|
||||
title = title.Replace(nativeLang.ToLowerEx(), nativeLang).Trim();
|
||||
|
||||
if (title.ContainsEx(lang))
|
||||
title = title.Replace(lang, "");
|
||||
|
||||
if (title.ContainsEx(nativeLang))
|
||||
title = title.Replace(nativeLang, "").Trim();
|
||||
|
||||
if (title.ContainsEx("full"))
|
||||
title = title.Replace("full", "").Trim();
|
||||
|
||||
if (title.ContainsEx("Full"))
|
||||
title = title.Replace("Full", "").Trim();
|
||||
|
||||
if (title.ContainsEx("forced"))
|
||||
title = title.Replace("forced", "Forced").Trim();
|
||||
|
||||
if (forced && title.ContainsEx("Forced"))
|
||||
title = title.Replace("Forced", "").Trim();
|
||||
|
||||
if (title.ContainsEx("()"))
|
||||
title = title.Replace("()", "");
|
||||
|
||||
if (title.ContainsEx("[]"))
|
||||
title = title.Replace("[]", "");
|
||||
}
|
||||
|
||||
track = new MediaTrack();
|
||||
Add(track, lang);
|
||||
Add(track, codec);
|
||||
Add(track, mi.GetText(i, "Format_Profile"));
|
||||
Add(track, mi.GetText(i, "Forced") == "Yes" ? "Forced" : "");
|
||||
Add(track, forced ? "Forced" : "");
|
||||
Add(track, (subCount > 1 && mi.GetText(i, "Default") == "Yes") ? "Default" : "");
|
||||
Add(track, mi.GetText(i, "Title"));
|
||||
Add(track, title);
|
||||
track.Text = "S: " + track.Text.Trim(' ', ',');
|
||||
track.Type = "s";
|
||||
track.ID = i + 1;
|
||||
@@ -1695,8 +1856,10 @@ namespace mpvnet
|
||||
|
||||
void Add(MediaTrack track, object value)
|
||||
{
|
||||
if (value != null && !(track.Text != null && track.Text.Contains(value.ToString())))
|
||||
track.Text += " " + value + ",";
|
||||
string str = value.ToStringEx().Trim();
|
||||
|
||||
if (str != "" && !(track.Text != null && track.Text.Contains(str)))
|
||||
track.Text += " " + str + ",";
|
||||
}
|
||||
|
||||
private string[] _ProfileNames;
|
||||
|
||||
@@ -32,6 +32,9 @@ namespace mpvnet
|
||||
App.Init();
|
||||
Mutex mutex = new Mutex(true, StringHelp.GetMD5Hash(App.ConfPath), out bool isFirst);
|
||||
|
||||
if (Control.ModifierKeys.HasFlag(Keys.Shift))
|
||||
App.ProcessInstance = "multi";
|
||||
|
||||
if ((App.ProcessInstance == "single" || App.ProcessInstance == "queue") && !isFirst)
|
||||
{
|
||||
List<string> args2 = new List<string>();
|
||||
|
||||
@@ -23,6 +23,12 @@ public class MediaInfo : IDisposable
|
||||
|
||||
public int GetCount(MediaInfoStreamKind kind) => MediaInfo_Count_Get(Handle, kind, -1);
|
||||
|
||||
public string GetGeneral(string parameter)
|
||||
{
|
||||
return Marshal.PtrToStringUni(MediaInfo_Get(Handle, MediaInfoStreamKind.General,
|
||||
0, parameter, MediaInfoKind.Text, MediaInfoKind.Name));
|
||||
}
|
||||
|
||||
public string GetVideo(int stream, string parameter)
|
||||
{
|
||||
return Marshal.PtrToStringUni(MediaInfo_Get(Handle, MediaInfoStreamKind.Video,
|
||||
|
||||
@@ -65,6 +65,9 @@ public class libmpv
|
||||
[DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern IntPtr mpv_wait_event(IntPtr mpvHandle, double timeout);
|
||||
|
||||
[DllImport("mpv-2.dll", CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern mpv_error mpv_request_event(IntPtr mpvHandle, mpv_event_id id, int enable);
|
||||
|
||||
public enum mpv_error
|
||||
{
|
||||
MPV_ERROR_SUCCESS = 0,
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<Identity
|
||||
Name="5664FrankSkare.mpv.net"
|
||||
Publisher="CN=6A1A1E69-736C-4C77-B310-7B6D38E32617"
|
||||
Version="5.7.0.0" />
|
||||
Version="6.0.3.0" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>mpv.net</DisplayName>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
|
||||
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
|
||||
<GenerateTestArtifacts>True</GenerateTestArtifacts>
|
||||
<AppxBundlePlatforms>neutral</AppxBundlePlatforms>
|
||||
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
|
||||
<GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>
|
||||
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("6.0.3.0")]
|
||||
[assembly: AssemblyFileVersion("6.0.3.0")]
|
||||
[assembly: AssemblyVersion("6.0.3.1")]
|
||||
[assembly: AssemblyFileVersion("6.0.3.1")]
|
||||
|
||||
@@ -24,6 +24,8 @@ _ ignore #menu: Navigate > -
|
||||
Home script-message-to mpvnet playlist-first #menu: Navigate > First File
|
||||
End script-message-to mpvnet playlist-last #menu: Navigate > Last File
|
||||
_ ignore #menu: Navigate > -
|
||||
F9 script-message-to mpvnet playlist-random #menu: Navigate > Random File
|
||||
_ ignore #menu: Navigate > -
|
||||
PGUP add chapter 1 #menu: Navigate > Next Chapter
|
||||
PGDWN add chapter -1 #menu: Navigate > Previous Chapter
|
||||
_ ignore #menu: Navigate > -
|
||||
@@ -78,7 +80,7 @@ _ ignore #menu: Audio > -
|
||||
Ctrl+d add audio-delay 0.1 #menu: Audio > Delay +0.1
|
||||
Ctrl+D add audio-delay -0.1 #menu: Audio > Delay -0.1
|
||||
|
||||
KP8 cycle sub #menu: Subtitle > Cycle/Next
|
||||
KP8 script-message-to mpvnet cycle-subtitles #menu: Subtitle > Cycle/Next #menu: Subtitle > Cycle/Next
|
||||
v cycle sub-visibility #menu: Subtitle > Toggle Visibility
|
||||
_ ignore #menu: Subtitle > -
|
||||
z add sub-delay -0.1 #menu: Subtitle > Delay -0.1
|
||||
@@ -125,10 +127,9 @@ b cycle border #menu: View > Toggle Borde
|
||||
Ctrl+t cycle ontop #menu: View > Toggle On Top
|
||||
t script-binding stats/display-stats-toggle #menu: View > Toggle Statistics
|
||||
Del script-binding osc/visibility #menu: View > Toggle OSC Visibility
|
||||
i script-message-to mpvnet show-info #menu: View > Show File/Stream Info
|
||||
i script-message-to mpvnet show-info #menu: View > Show Media Info
|
||||
Ctrl+m script-message-to mpvnet show-media-info #menu: View > Show Media Info Advanced
|
||||
p show-progress #menu: View > Show Progress
|
||||
F9 script-message-to mpvnet show-media-info osd #menu: View > Show Tracks
|
||||
Ctrl+m script-message-to mpvnet show-media-info #menu: View > Show Media Info
|
||||
Alt+r script-message-to mpvnet show-recent #menu: View > Show Recent
|
||||
|
||||
` script-binding console/enable #menu: View > Advanced > Show Console
|
||||
@@ -157,6 +158,7 @@ L cycle-values loop-file inf no #menu: Tools > Toggle infi
|
||||
_ playlist-shuffle #menu: Tools > Shuffle Playlist
|
||||
Ctrl+h cycle-values hwdec auto no #menu: Tools > Toggle Hardware Decoding
|
||||
Q quit-watch-later #menu: Tools > Exit Watch Later
|
||||
e run powershell -command "explorer.exe '/select,' ( \"${path}\" -replace '/', '\\' )" #menu: Tools > Show current file in File Explorer
|
||||
|
||||
_ script-message-to mpvnet shell-execute https://mpv.io #menu: Help > Website mpv
|
||||
_ script-message-to mpvnet shell-execute https://github.com/stax76/mpv.net #menu: Help > Website mpv.net
|
||||
@@ -179,8 +181,8 @@ Sharp script-message-to mpvnet cycle-audio
|
||||
Ctrl+F11 script-message-to mpvnet playlist-add -10
|
||||
Ctrl+F12 script-message-to mpvnet playlist-add 10
|
||||
Alt+q script-message-to mpvnet quick-bookmark
|
||||
8 cycle sub
|
||||
j cycle sub
|
||||
8 script-message-to mpvnet cycle-subtitles
|
||||
j script-message-to mpvnet cycle-subtitles
|
||||
q quit
|
||||
Power quit
|
||||
Play cycle pause
|
||||
|
||||
@@ -860,6 +860,7 @@ namespace mpvnet
|
||||
case 0x20b: // WM_XBUTTONDOWN
|
||||
case 0x20c: // WM_XBUTTONUP
|
||||
case 0x20e: // WM_MOUSEHWHEEL
|
||||
case 0x2a3: // WM_MOUSELEAVE
|
||||
if (mpvWindowHandle == IntPtr.Zero)
|
||||
mpvWindowHandle = FindWindowEx(Handle, IntPtr.Zero, "mpv", null);
|
||||
|
||||
@@ -894,10 +895,6 @@ namespace mpvnet
|
||||
if (CursorHelp.IsPosDifferent(LastCursorPosition))
|
||||
CursorHelp.Show();
|
||||
break;
|
||||
case 0x2a3: // WM_MOUSELEAVE
|
||||
//osc won't auto hide after mouse left window in borderless mode
|
||||
Core.Command($"mouse {ClientSize.Width / 2} {ClientSize.Height / 3}");
|
||||
break;
|
||||
case 0x203: // WM_LBUTTONDBLCLK
|
||||
{
|
||||
Point pos = PointToClient(Cursor.Position);
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="Microsoft.VisualBasic" />
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
|
||||
Reference in New Issue
Block a user