/// <summary> /// 是否存在于下载列表中 /// </summary> /// <param name="downloading"></param> /// <returns></returns> private async Task <bool> IsExist(DownloadingItem downloading) { bool isExist = downloadingList.Contains(downloading); if (isExist) { return(true); } else { // 先恢复为waiting状态,暂停状态下Remove会导致文件重新下载,原因暂不清楚 await AriaClient.UnpauseAsync(downloading.Downloading.Gid); // 移除下载项 var ariaRemove = await AriaClient.RemoveAsync(downloading.Downloading.Gid); if (ariaRemove == null || ariaRemove.Result == downloading.Downloading.Gid) { // 从内存中删除下载项 await AriaClient.RemoveDownloadResultAsync(downloading.Downloading.Gid); } return(false); } }
/// <summary> /// 强制关闭aria2c服务器 /// </summary> /// <returns></returns> public static bool ForceCloseServer() { var task = AriaClient.ForceShutdownAsync(); if (task.Result != null && task.Result.Result != null && task.Result.Result == "OK") { return(true); } return(false); }
/// <summary> /// 关闭Aria服务器 /// </summary> private async Task CloseAriaServer() { // 暂停所有下载 var ariaPause = await AriaClient.PauseAllAsync(); Core.Utils.Debugging.Console.PrintLine(ariaPause.ToString()); // 关闭服务器 bool close = AriaServer.CloseServer(); Core.Utils.Debugging.Console.PrintLine(close); }
/// <summary> /// 强制关闭aria2c服务器,异步方法 /// </summary> /// <returns></returns> public static async Task <bool> ForceCloseServerAsync() { //await Task.Run(() => //{ // if (Server == null) { return; } // Server.Kill(); // Server = null; // 将Server指向null //}); //return true; await AriaClient.ForceShutdownAsync(); return(true); }
/// <summary> /// 启动Aria服务器 /// </summary> private async void StartAriaServer() { List <string> header = new List <string> { $"Cookie: {LoginHelper.GetLoginInfoCookiesString()}", $"Origin: https://www.bilibili.com", $"Referer: https://www.bilibili.com", $"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36" }; AriaConfig config = new AriaConfig() { ListenPort = SettingsManager.GetInstance().GetAriaListenPort(), Token = "downkyi", LogLevel = SettingsManager.GetInstance().GetAriaLogLevel(), MaxConcurrentDownloads = SettingsManager.GetInstance().GetMaxCurrentDownloads(), MaxConnectionPerServer = 8, // 最大取16 Split = SettingsManager.GetInstance().GetAriaSplit(), //MaxTries = 5, MinSplitSize = 10, // 10MB MaxOverallDownloadLimit = SettingsManager.GetInstance().GetAriaMaxOverallDownloadLimit() * 1024L, // 输入的单位是KB/s,所以需要乘以1024 MaxDownloadLimit = SettingsManager.GetInstance().GetAriaMaxDownloadLimit() * 1024L, // 输入的单位是KB/s,所以需要乘以1024 MaxOverallUploadLimit = 0, MaxUploadLimit = 0, ContinueDownload = true, FileAllocation = SettingsManager.GetInstance().GetAriaFileAllocation(), Headers = header }; var task = await AriaServer.StartServerAsync(config); if (task) { Console.WriteLine("Start ServerAsync Completed"); } for (int i = 0; i < 10; i++) { var globOpt = await AriaClient.GetGlobalOptionAsync(); if (globOpt != null) { break; } await Task.Delay(1000); } Console.WriteLine("Start ServerAsync end"); }
/// <summary> /// 关闭aria2c服务器 /// </summary> /// <returns></returns> public static bool CloseServer() { var task = AriaClient.ShutdownAsync(); if (task.Result != null && task.Result.Result != null && task.Result.Result == "OK") { // 等待进程结束 Server.WaitForExit(30000); try { Server.Kill(); } catch (Exception) { } return(true); } return(false); }
/// <summary> /// 关闭aria2c服务器,异步方法 /// </summary> /// <returns></returns> public static async Task <bool> CloseServerAsync() { await AriaClient.ShutdownAsync(); // 等待进程结束 await Task.Run(() => { Server.WaitForExit(30000); try { Server.Kill(); } catch (Exception) { } }); return(true); }
/// <summary> /// 获取全局下载速度 /// </summary> public async void GetGlobalStatus() { while (true) { // 查询全局status var globalStatus = await AriaClient.GetGlobalStatAsync(); if (globalStatus == null || globalStatus.Result == null) { continue; } long globalSpeed = long.Parse(globalStatus.Result.DownloadSpeed); // 回调 OnGlobalStatus(globalSpeed); // 降低CPU占用 Thread.Sleep(100); } }
/// <summary> /// 采用Aria下载文件 /// </summary> /// <param name="downloading"></param> /// <returns></returns> private DownloadResult DownloadByAria(DownloadingItem downloading, List <string> urls, string path, string localFileName) { // path已斜杠结尾,去掉斜杠 path = path.TrimEnd('/').TrimEnd('\\'); //检查gid对应任务,如果已创建那么直接使用 //但是代理设置会出现不能随时更新的问题 if (downloading.Downloading.Gid != null) { Task <AriaTellStatus> status = AriaClient.TellStatus(downloading.Downloading.Gid); if (status == null || status.Result == null) { downloading.Downloading.Gid = null; } else if (status.Result.Result == null && status.Result.Error != null) { if (status.Result.Error.Message.Contains("is not found")) { downloading.Downloading.Gid = null; } } } if (downloading.Downloading.Gid == null) { AriaSendOption option = new AriaSendOption { //HttpProxy = $"http://{Settings.GetAriaHttpProxy()}:{Settings.GetAriaHttpProxyListenPort()}", Dir = path, Out = localFileName, //Header = $"cookie: {LoginHelper.GetLoginInfoCookiesString()}\nreferer: https://www.bilibili.com", //UseHead = "true", UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36", }; // 如果设置了代理,则增加HttpProxy if (SettingsManager.GetInstance().IsAriaHttpProxy() == AllowStatus.YES) { option.HttpProxy = $"http://{SettingsManager.GetInstance().GetAriaHttpProxy()}:{SettingsManager.GetInstance().GetAriaHttpProxyListenPort()}"; } // 添加一个下载 Task <AriaAddUri> ariaAddUri = AriaClient.AddUriAsync(urls, option); if (ariaAddUri == null || ariaAddUri.Result == null || ariaAddUri.Result.Result == null) { return(DownloadResult.FAILED); } // 保存gid string gid = ariaAddUri.Result.Result; downloading.Downloading.Gid = gid; } else { Task <AriaPause> ariaUnpause = AriaClient.UnpauseAsync(downloading.Downloading.Gid); } // 管理下载 AriaManager ariaManager = new AriaManager(); ariaManager.TellStatus += AriaTellStatus; ariaManager.DownloadFinish += AriaDownloadFinish; return(ariaManager.GetDownloadStatus(downloading.Downloading.Gid, new Action(() => { cancellationToken.ThrowIfCancellationRequested(); switch (downloading.Downloading.DownloadStatus) { case DownloadStatus.PAUSE: Task <AriaPause> ariaPause = AriaClient.PauseAsync(downloading.Downloading.Gid); // 通知UI,并阻塞当前线程 Pause(downloading); break; case DownloadStatus.DOWNLOADING: break; } }))); }
public DownloadStatus GetDownloadStatus(string gid) { string filePath = ""; while (true) { var status = AriaClient.TellStatus(gid); if (status == null || status.Result == null) { continue; } if (status.Result.Result == null && status.Result.Error != null) { if (status.Result.Error.Message.Contains("is not found")) { OnDownloadFinish(false, null, gid, status.Result.Error.Message); return(DownloadStatus.ABORT); } } if (status.Result.Result.Files != null && status.Result.Result.Files.Count >= 1) { filePath = status.Result.Result.Files[0].Path; } long totalLength = long.Parse(status.Result.Result.TotalLength); long completedLength = long.Parse(status.Result.Result.CompletedLength); long speed = long.Parse(status.Result.Result.DownloadSpeed); // 回调 OnTellStatus(totalLength, completedLength, speed, gid); if (status.Result.Result.Status == "complete") { break; } if (status.Result.Result.ErrorCode != null && status.Result.Result.ErrorCode != "0") { Console.WriteLine("ErrorMessage: " + status.Result.Result.ErrorMessage); //// 如果返回状态码不是200,则继续 //if (status.Result.Result.ErrorMessage.Contains("The response status is not successful")) //{ // Thread.Sleep(1000); // continue; //} // aira中删除记录 var ariaRemove1 = AriaClient.RemoveDownloadResultAsync(gid); Console.WriteLine(ariaRemove1); // 返回回调信息,退出函数 OnDownloadFinish(false, null, gid, status.Result.Result.ErrorMessage); return(DownloadStatus.FAILED); } // 降低CPU占用 Thread.Sleep(500); } OnDownloadFinish(true, filePath, gid, null); return(DownloadStatus.SUCCESS); }
/// <summary> /// 获取gid下载项的状态 /// /// TODO /// 对于下载的不同状态的返回值的测试 /// </summary> /// <param name="gid"></param> /// <param name="action"></param> /// <returns></returns> public DownloadResult GetDownloadStatus(string gid, Action action = null) { string filePath = ""; while (true) { Task <AriaTellStatus> status = AriaClient.TellStatus(gid); if (status == null || status.Result == null) { continue; } if (status.Result.Result == null && status.Result.Error != null) { if (status.Result.Error.Message.Contains("is not found")) { OnDownloadFinish(false, null, gid, status.Result.Error.Message); return(DownloadResult.ABORT); } } if (status.Result.Result.Files != null && status.Result.Result.Files.Count >= 1) { filePath = status.Result.Result.Files[0].Path; } long totalLength = long.Parse(status.Result.Result.TotalLength); long completedLength = long.Parse(status.Result.Result.CompletedLength); long speed = long.Parse(status.Result.Result.DownloadSpeed); // 回调 OnTellStatus(totalLength, completedLength, speed, gid); // 在外部执行 if (action != null) { action.Invoke(); } if (status.Result.Result.Status == "complete") { break; } if (status.Result.Result.ErrorCode != null && status.Result.Result.ErrorCode != "0") { if (status.Result != null) { Utils.Debugging.Console.PrintLine("ErrorMessage: " + status.Result.Result.ErrorMessage); LogManager.Error("AriaManager", status.Result.Result.ErrorMessage); } //// 如果返回状态码不是200,则继续 //if (status.Result.Result.ErrorMessage.Contains("The response status is not successful")) //{ // Thread.Sleep(1000); // continue; //} // aira中删除记录 Task <AriaRemove> ariaRemove1 = AriaClient.RemoveDownloadResultAsync(gid); Utils.Debugging.Console.PrintLine(ariaRemove1); if (ariaRemove1.Result != null) { LogManager.Debug("AriaManager", ariaRemove1.Result.Result); } // 返回回调信息,退出函数 OnDownloadFinish(false, null, gid, status.Result.Result.ErrorMessage); return(DownloadResult.FAILED); } // 降低CPU占用 Thread.Sleep(100); } OnDownloadFinish(true, filePath, gid, null); return(DownloadResult.SUCCESS); }
/// <summary> /// 关闭aria2c服务器,异步方法 /// </summary> /// <returns></returns> public static async Task <bool> CloseServerAsync() { await AriaClient.ShutdownAsync(); return(true); }