下载

https://files.1fav.org/s/pY2HN

首先声明这个软件的原作者不是我,我只是二次开发了,原作者是D9论坛的Gpower2


改了什么,没兴趣可以不看.

20250216

1.给仅展开新文件的选项添加到配置文件,可以自动记住

20250214

1.给主界面增加了几个按钮,我拖入个剧集,尼玛界面被拉的N长,原作者估计是没考虑到别人会批量提取吧..
2.把昨天去掉的几个异常处理的代码修改了下加回去了..当时估计是让烟熏了眼,多注释了几行...
3.又是几根烟之后,发现了个小bug,如果文件数量大于1,文件图标在折叠再展开的情况下会有出现错误的问题.然后顺便把文件图标按钮移动到主界面了


20250213修改记录

1.去掉了停止任务的弹出提醒,多此一举
2.修改了几处字符串
3.给轨道加了几个简单的图标,加起来10KB左右,还好,能接受的范围内..主要这样更加容易分辨.
4.过了5分钟抽了一根烟,想了想,万一有人不喜欢这个图标呢,加了一个图标开关.自由控制,无需重启,实时生效.

文件图标展示
文件图标展示
自己选择是否开启图标
自己选择是否开启图标


原本是想修改掉它的界面,自己重构UI的,但是看了看自己做的软件,界面也和这人做的大差不差,于是界面基本没改动,改动了很多代码层面的东西,原作者是.NET4.0,到我这里项目变成了.NET4.8,去掉了很多看起来很繁杂的逻辑,优化了工具目录的加载逻辑,现在是优先从配置文件加载,如果没有,则从同级目录和同级子目录中自动搜索.看下图:

if (manualMkvToolNixPath && !manualPathOK)
                {
                    gMKVLogger.Log(string.Format("无法加载工具路径!尝试自动检测..."));
                }

                if (!manualMkvToolNixPath || (manualMkvToolNixPath && !manualPathOK))
                {
                    // Find MKVToolnix path
                    try
                    {
                        bool found = false;

                        // 1. 首先检查配置文件中保存的路径
                        if (File.Exists(Path.Combine(_Settings.MkvToolnixPath, gMKVHelper.MKV_MERGE_GUI_FILENAME))
                            || File.Exists(Path.Combine(_Settings.MkvToolnixPath, gMKVHelper.MKV_MERGE_NEW_GUI_FILENAME)))
                        {
                            gMKVLogger.Log("在配置文件保存的路径中已找到 mkvmerge...");
                            _FromConstructor = true;
                            txtMKVToolnixPath.Text = _Settings.MkvToolnixPath;
                            _FromConstructor = false;
                            found = true;
                        }

                        // 2. 检查当前目录
                        if (!found && (File.Exists(Path.Combine(GetCurrentDirectory(), gMKVHelper.MKV_MERGE_GUI_FILENAME))
                            || File.Exists(Path.Combine(GetCurrentDirectory(), gMKVHelper.MKV_MERGE_NEW_GUI_FILENAME))))
                        {
                            gMKVLogger.Log("在当前目录中找到 mkvmerge...");
                            txtMKVToolnixPath.Text = GetCurrentDirectory();
                            found = true;
                        }

                        // 3. 检查当前目录下的子文件夹
                        if (!found)
                        {
                            string[] subDirs = Directory.GetDirectories(GetCurrentDirectory());
                            foreach (string dir in subDirs)
                            {
                                if (File.Exists(Path.Combine(dir, gMKVHelper.MKV_MERGE_GUI_FILENAME))
                                    || File.Exists(Path.Combine(dir, gMKVHelper.MKV_MERGE_NEW_GUI_FILENAME)))
                                {
                                    gMKVLogger.Log($"在子文件夹 {Path.GetFileName(dir)} 中找到 mkvmerge...");
                                    txtMKVToolnixPath.Text = dir;
                                    found = true;
                                    break;
                                }
                            }
                        }

                        // 4. 最后检查系统路径(注册表或/usr/bin)
                        if (!found)
                        {
                            if (!gMKVHelper.IsOnLinux)
                            {
                                gMKVLogger.Log("在本地目录未找到 mkvmerge,正在检查注册表...");
                                txtMKVToolnixPath.Text = gMKVHelper.GetMKVToolnixPathViaRegistry();
                            }
                            else
                            {
                                if (File.Exists(Path.Combine("/usr", "bin", gMKVHelper.MKV_MERGE_GUI_FILENAME))
                                    || File.Exists(Path.Combine("/usr", "bin", gMKVHelper.MKV_MERGE_NEW_GUI_FILENAME)))
                                {
                                    txtMKVToolnixPath.Text = Path.Combine("/usr", "bin");
                                }
                                else
                                {
                                    throw new Exception(string.Format("未在路径 {0} 中找到 mkvmerge!", Path.Combine("usr", "bin")));
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex);
                        gMKVLogger.Log(ex.Message);

                        string exceptionMessage = gMKVHelper.IsOnLinux
                            ? "在配置文件、当前目录及其子文件夹中找不到 MKVToolNix,也不在 /usr/bin 中!"
                            : "在配置文件、当前目录及其子文件夹中找不到 MKVToolNix,也不在注册表中!";
                        
                        gMKVLogger.Log(exceptionMessage);
                        throw new Exception(exceptionMessage + Environment.NewLine + "请下载并重新安装,或手动指定路径!");
                    }
                }

再就是做了大量的代码优化,这就不贴出来了,然后主界面上的进度条在不工作的时候改成了不显示,不然左下角一个空缺看着不舒服,添加了一个关闭软件时,最小化到托盘区域的功能,后面看兴趣吧,如果有兴趣和有必要,我看要不要把软件改成多任务同时进行的,以提高提取效率.虽然我已经优化了相关代码..然后我不喜欢软件目录和什么配置文件以及DLL文件全部都放在一起,我喜欢层级感,所以DLL文件和配置文件同一移动到了Config目录中,然后我编译的DLL文件名字改成了MKVExtractCore.dll,其他的改动想不起来了...