using DownKyi.Core.Aria2cNet.Client;
using DownKyi.Core.Aria2cNet.Client.Entity;
using DownKyi.Core.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace DownKyi.Core.Aria2cNet
{
public class AriaManager
{
// gid对应项目的状态
public delegate void TellStatusHandler(long totalLength, long completedLength, long speed, string gid);
public event TellStatusHandler TellStatus;
protected virtual void OnTellStatus(long totalLength, long completedLength, long speed, string gid)
{
TellStatus?.Invoke(totalLength, completedLength, speed, gid);
}
// 下载结果回调
public delegate void DownloadFinishHandler(bool isSuccess, string downloadPath, string gid, string msg = null);
public event DownloadFinishHandler DownloadFinish;
protected virtual void OnDownloadFinish(bool isSuccess, string downloadPath, string gid, string msg = null)
{
DownloadFinish?.Invoke(isSuccess, downloadPath, gid, msg);
}
// 全局下载状态
public delegate void GetGlobalStatusHandler(long speed);
public event GetGlobalStatusHandler GlobalStatus;
protected virtual void OnGlobalStatus(long speed)
{
GlobalStatus?.Invoke(speed);
}
///
/// 获取gid下载项的状态
///
/// TODO
/// 对于下载的不同状态的返回值的测试
///
///
///
///
public DownloadResult GetDownloadStatus(string gid, Action action = null)
{
string filePath = "";
while (true)
{
Task 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 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;
}
///
/// 获取全局下载速度
///
public async void GetGlobalStatus()
{
while (true)
{
// 查询全局status
AriaGetGlobalStat globalStatus = await AriaClient.GetGlobalStatAsync();
if (globalStatus == null || globalStatus.Result == null) { continue; }
long globalSpeed = long.Parse(globalStatus.Result.DownloadSpeed);
// 回调
OnGlobalStatus(globalSpeed);
// 降低CPU占用
Thread.Sleep(100);
}
}
}
}