From b30daf8e56ded50e6585a8dcebc972fbbe2b03f3 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Thu, 6 Apr 2023 15:09:49 +0800 Subject: [PATCH] Add more subscription url for one group --- v2rayN/v2rayN/App.xaml.cs | 2 +- v2rayN/v2rayN/Handler/UpdateHandle.cs | 66 +++++++++++++------ v2rayN/v2rayN/Mode/SubItem.cs | 39 ++--------- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 42 ++++-------- v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx | 12 ---- v2rayN/v2rayN/Resx/ResUI.resx | 18 ++--- v2rayN/v2rayN/Resx/ResUI.ru.resx | 12 ---- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 15 +---- v2rayN/v2rayN/Tool/Utils.cs | 5 ++ .../v2rayN/ViewModels/MainWindowViewModel.cs | 7 +- v2rayN/v2rayN/ViewModels/SubEditViewModel.cs | 1 + v2rayN/v2rayN/Views/SubEditWindow.xaml | 34 ++++++++++ v2rayN/v2rayN/Views/SubEditWindow.xaml.cs | 1 + v2rayN/v2rayN/Views/SubSettingWindow.xaml | 2 +- 14 files changed, 120 insertions(+), 136 deletions(-) diff --git a/v2rayN/v2rayN/App.xaml.cs b/v2rayN/v2rayN/App.xaml.cs index 4ac1a638..810f08fc 100644 --- a/v2rayN/v2rayN/App.xaml.cs +++ b/v2rayN/v2rayN/App.xaml.cs @@ -38,7 +38,7 @@ namespace v2rayN Current.Shutdown(); Environment.Exit(0); return; - } + } Global.processJob = new Job(); diff --git a/v2rayN/v2rayN/Handler/UpdateHandle.cs b/v2rayN/v2rayN/Handler/UpdateHandle.cs index 7db31e41..ded256c3 100644 --- a/v2rayN/v2rayN/Handler/UpdateHandle.cs +++ b/v2rayN/v2rayN/Handler/UpdateHandle.cs @@ -1,4 +1,5 @@ -using Splat; +using DynamicData; +using Splat; using System.Diagnostics; using System.IO; using System.Text; @@ -163,16 +164,6 @@ namespace v2rayN.Handler Task.Run(async () => { - //Turn off system proxy - //bool bSysProxyType = false; - //if (!blProxy && config.sysProxyType == ESysProxyType.ForcedChange) - //{ - // bSysProxyType = true; - // config.sysProxyType = ESysProxyType.ForcedClear; - // SysProxyHandle.UpdateSysProxy(config, false); - // Thread.Sleep(3000); - //} - foreach (var item in subItem) { string id = item.id.TrimEx(); @@ -196,16 +187,55 @@ namespace v2rayN.Handler _updateFunc(false, $"{hashCode}{args.GetException().Message}"); }; - //idn to idc - url = Utils.GetPunycode(url); - _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); + + //one url + url = Utils.GetPunycode(url); var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent); if (blProxy && Utils.IsNullOrEmpty(result)) { result = await downloadHandle.TryDownloadString(url, false, userAgent); } + //more url + if (!Utils.IsNullOrEmpty(item.moreUrl.TrimEx())) + { + if (!Utils.IsNullOrEmpty(result) && Utils.IsBase64String(result)) + { + result = Utils.Base64Decode(result); + } + + var lstUrl = new List + { + item.moreUrl.TrimEx().Split(",") + }; + foreach (var it in lstUrl) + { + var url2 = Utils.GetPunycode(it); + if (Utils.IsNullOrEmpty(url2)) + { + continue; + } + + var result2 = await downloadHandle.TryDownloadString(url2, blProxy, userAgent); + if (blProxy && Utils.IsNullOrEmpty(result2)) + { + result2 = await downloadHandle.TryDownloadString(url2, false, userAgent); + } + if (!Utils.IsNullOrEmpty(result2)) + { + if (Utils.IsBase64String(result2)) + { + result += Utils.Base64Decode(result2); + } + else + { + result += result2; + } + } + } + } + if (Utils.IsNullOrEmpty(result)) { _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); @@ -231,18 +261,12 @@ namespace v2rayN.Handler } _updateFunc(false, "-------------------------------------------------------"); } - ////restore system proxy - //if (bSysProxyType) - //{ - // config.sysProxyType = ESysProxyType.ForcedChange; - // SysProxyHandle.UpdateSysProxy(config, false); - //} + _updateFunc(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); }); } - public void UpdateGeoFile(string geoName, Config config, Action update) { _config = config; diff --git a/v2rayN/v2rayN/Mode/SubItem.cs b/v2rayN/v2rayN/Mode/SubItem.cs index 3caa262c..5995b273 100644 --- a/v2rayN/v2rayN/Mode/SubItem.cs +++ b/v2rayN/v2rayN/Mode/SubItem.cs @@ -6,45 +6,20 @@ namespace v2rayN.Mode public class SubItem { [PrimaryKey] - public string id - { - get; set; - } + public string id { get; set; } - /// - /// 备注 - /// - public string remarks - { - get; set; - } + public string remarks { get; set; } - /// - /// url - /// - public string url - { - get; set; - } + public string url { get; set; } + + public string moreUrl { get; set; } - /// - /// enable - /// public bool enabled { get; set; } = true; - /// - /// - /// - public string userAgent - { - get; set; - } = string.Empty; + public string userAgent { get; set; } = string.Empty; + public int sort { get; set; } - public int sort - { - get; set; - } public string filter { get; set; } } diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index cbbc01b9..5a9c4aff 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -420,6 +420,15 @@ namespace v2rayN.Resx { } } + /// + /// 查找类似 More urls, separated by commas 的本地化字符串。 + /// + public static string LvMoreUrl { + get { + return ResourceManager.GetString("LvMoreUrl", resourceCulture); + } + } + /// /// 查找类似 Port 的本地化字符串。 /// @@ -564,15 +573,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Medium 的本地化字符串。 - /// - public static string MediumFresh { - get { - return ResourceManager.GetString("MediumFresh", resourceCulture); - } - } - /// /// 查找类似 Add a custom configuration server 的本地化字符串。 /// @@ -1671,15 +1671,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Fast 的本地化字符串。 - /// - public static string QuickFresh { - get { - return ResourceManager.GetString("QuickFresh", resourceCulture); - } - } - /// /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 /// @@ -1762,20 +1753,11 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Slow 的本地化字符串。 + /// 查找类似 {0}:{1}/s↑ | {2}/s↓ 的本地化字符串。 /// - public static string SlowFresh { + public static string SpeedDisplayText { get { - return ResourceManager.GetString("SlowFresh", resourceCulture); - } - } - - /// - /// 查找类似 Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. 的本地化字符串。 - /// - public static string SpeedServerTips { - get { - return ResourceManager.GetString("SpeedServerTips", resourceCulture); + return ResourceManager.GetString("SpeedDisplayText", resourceCulture); } } diff --git a/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx b/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx index bc198929..0a9ded03 100644 --- a/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx +++ b/v2rayN/v2rayN/Resx/ResUI.fa-Ir.resx @@ -228,9 +228,6 @@ جابجایی - - متوسط - محتوای اشتراک اصلی را پاک کنید @@ -315,9 +312,6 @@ لطفا ابتدا سرور را انتخاب کنید - - سریع - Servers deduplication completed. Old: {0}, New: {1}. @@ -330,12 +324,6 @@ The server configuration file is saved at: {0} - - آهسته. تدریجی - - - توجه: این ویژگی به پروکسی جهانی Http متکی است. لطفاً پس از آزمایش، پراکسی جهانی Http و گره فعال را به صورت دستی تنظیم کنید. - PAC شروع نشد. لطفا این برنامه را به عنوان Administrator اجرا کنید. diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index 6d8e905f..1e31a294 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -228,9 +228,6 @@ Transport - - Medium - Clear original subscription content @@ -315,9 +312,6 @@ Please select the server first - - Fast - Servers deduplication completed. Old: {0}, New: {1}. @@ -330,12 +324,6 @@ The server configuration file is saved at: {0} - - Slow - - - Note: This feature relies on the Http global proxy. Please manually adjust the Http global proxy and active node after testing. - PAC failed to start. Please run this program as Administrator. @@ -1156,4 +1144,10 @@ Reboot as administrator + + More urls, separated by commas + + + {0}:{1}/s↑ | {2}/s↓ + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.ru.resx b/v2rayN/v2rayN/Resx/ResUI.ru.resx index 366ef232..89ce5db1 100644 --- a/v2rayN/v2rayN/Resx/ResUI.ru.resx +++ b/v2rayN/v2rayN/Resx/ResUI.ru.resx @@ -228,9 +228,6 @@ Протокол - - Medium - Очистить контент оригинальной подписки @@ -315,9 +312,6 @@ Сначала выберите сервер - - Быстрый - Удаление дублей завершено. Старая: {0}, Новая: {1}. @@ -330,12 +324,6 @@ Файл конфигурации сервера сохранен по адресу: {0} - - Медленный - - - Примечание. Эта функция зависит от глобального прокси-сервера HTTP. После тестирования вручную настройте глобальный прокси-сервер HTTP и активный узел. - PAC не удалось запустить. Пожалуйста, запустите эту программу от имени администратора. diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index ba9fb5eb..e883ec61 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -228,9 +228,6 @@ 传输协议 - - 中等 - 清除原订阅内容 @@ -315,9 +312,6 @@ 请先选择服务器 - - - 服务器去重完成。原数量: {0},现数量: {1} @@ -330,12 +324,6 @@ 服务端配置文件保存在:{0} - - - - - 注意:此功能依赖Http全局代理!测试完成后,请手工调整Http全局代理和活动节点。 - PAC服务启动失败,请用管理员启动 @@ -1156,4 +1144,7 @@ 以管理员身份重启 + + 更多地址(url),用逗号隔开 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index f4befda0..f687ba11 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -429,6 +429,11 @@ namespace v2rayN BitmapSizeOptions.FromEmptyOptions()); } + /// + /// idn to idc + /// + /// + /// public static string GetPunycode(string url) { if (string.IsNullOrWhiteSpace(url)) diff --git a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs index 4721980c..dd9f0526 100644 --- a/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/MainWindowViewModel.cs @@ -122,7 +122,7 @@ namespace v2rayN.ViewModels public ReactiveCommand OptionSettingCmd { get; } public ReactiveCommand RoutingSettingCmd { get; } public ReactiveCommand GlobalHotkeySettingCmd { get; } - public ReactiveCommand RebootAsAdminCmd { get; } + public ReactiveCommand RebootAsAdminCmd { get; } public ReactiveCommand ClearServerStatisticsCmd { get; } public ReactiveCommand ImportOldGuiConfigCmd { get; } @@ -568,8 +568,9 @@ namespace v2rayN.ViewModels { return; } - SpeedProxyDisplay = string.Format("{0}:{1}/s�� | {2}/s��", Global.agentTag, Utils.HumanFy(update.proxyUp), Utils.HumanFy(update.proxyDown)); - SpeedDirectDisplay = string.Format("{0}:{1}/s�� | {2}/s��", Global.directTag, Utils.HumanFy(update.directUp), Utils.HumanFy(update.directDown)); + + SpeedProxyDisplay = string.Format(ResUI.SpeedDisplayText, Global.agentTag, Utils.HumanFy(update.proxyUp), Utils.HumanFy(update.proxyDown)); + SpeedDirectDisplay = string.Format(ResUI.SpeedDisplayText, Global.directTag, Utils.HumanFy(update.directUp), Utils.HumanFy(update.directDown)); if (update.proxyUp + update.proxyDown > 0) { diff --git a/v2rayN/v2rayN/ViewModels/SubEditViewModel.cs b/v2rayN/v2rayN/ViewModels/SubEditViewModel.cs index b72f61f6..aef1a3ba 100644 --- a/v2rayN/v2rayN/ViewModels/SubEditViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/SubEditViewModel.cs @@ -62,6 +62,7 @@ namespace v2rayN.ViewModels { item.remarks = SelectedSource.remarks; item.url = SelectedSource.url; + item.moreUrl = SelectedSource.moreUrl; item.enabled = SelectedSource.enabled; item.userAgent = SelectedSource.userAgent; item.sort = SelectedSource.sort; diff --git a/v2rayN/v2rayN/Views/SubEditWindow.xaml b/v2rayN/v2rayN/Views/SubEditWindow.xaml index 022759d0..9c716014 100644 --- a/v2rayN/v2rayN/Views/SubEditWindow.xaml +++ b/v2rayN/v2rayN/Views/SubEditWindow.xaml @@ -23,6 +23,14 @@ TextOptions.TextRenderingMode="Auto" WindowStartupLocation="CenterScreen" mc:Ignorable="d"> + + + + + + + + + + + + + + + + vm.SelectedSource.remarks, v => v.txtRemarks.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.url, v => v.txtUrl.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.moreUrl, v => v.txtMoreUrl.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.enabled, v => v.togEnable.IsChecked).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.userAgent, v => v.txtUserAgent.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.sort, v => v.txtSort.Text).DisposeWith(disposables); diff --git a/v2rayN/v2rayN/Views/SubSettingWindow.xaml b/v2rayN/v2rayN/Views/SubSettingWindow.xaml index 6e2242ed..39af5091 100644 --- a/v2rayN/v2rayN/Views/SubSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/SubSettingWindow.xaml @@ -108,7 +108,7 @@ Binding="{Binding url}" Header="{x:Static resx:ResUI.LvUrl}" />