Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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");
        }
Example #6
0
        /// <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);
        }
Example #7
0
        /// <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);
        }
Example #8
0
        /// <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);
            }
        }
Example #9
0
        /// <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;
                }
            })));
        }
Example #10
0
        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);
        }
Example #11
0
        /// <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);
        }
Example #12
0
        /// <summary>
        /// 关闭aria2c服务器,异步方法
        /// </summary>
        /// <returns></returns>
        public static async Task <bool> CloseServerAsync()
        {
            await AriaClient.ShutdownAsync();

            return(true);
        }