/// <summary> /// 下载完成列表排序 /// </summary> /// <param name="finishedSort"></param> public static void SortDownloadedList(DownloadFinishedSort finishedSort) { List <DownloadedItem> list = DownloadedList.ToList(); switch (finishedSort) { case DownloadFinishedSort.DOWNLOAD: // 按下载先后排序 list.Sort((x, y) => { return(x.Downloaded.FinishedTimestamp.CompareTo(y.Downloaded.FinishedTimestamp)); }); break; case DownloadFinishedSort.NUMBER: // 按序号排序 list.Sort((x, y) => { int compare = x.MainTitle.CompareTo(y.MainTitle); return(compare == 0 ? x.Order.CompareTo(y.Order) : compare); }); break; default: break; } // 更新下载完成列表 // 如果有更好的方法再重写 DownloadedList.Clear(); foreach (DownloadedItem item in list) { DownloadedList.Add(item); } }
/// <summary> /// 设置下载完成列表排序 /// </summary> /// <param name="finishedSort"></param> /// <returns></returns> public bool SetDownloadFinishedSort(DownloadFinishedSort finishedSort) { appSettings.Basic.DownloadFinishedSort = finishedSort; return(SetSettings()); }
/// <summary> /// 下载一个视频 /// </summary> /// <param name="downloading"></param> /// <returns></returns> private async Task SingleDownload(DownloadingItem downloading) { // 路径 downloading.DownloadBase.FilePath = downloading.DownloadBase.FilePath.Replace("\\", "/"); string[] temp = downloading.DownloadBase.FilePath.Split('/'); //string path = downloading.DownloadBase.FilePath.Replace(temp[temp.Length - 1], ""); string path = downloading.DownloadBase.FilePath.TrimEnd(temp[temp.Length - 1].ToCharArray()); // 路径不存在则创建 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } try { await Task.Run(new Action(() => { // 初始化 downloading.DownloadStatusTitle = string.Empty; downloading.DownloadContent = string.Empty; //downloading.Downloading.DownloadFiles.Clear(); // 解析并依次下载音频、视频、弹幕、字幕、封面等内容 Parse(downloading); // 暂停 Pause(downloading); string audioUid = null; // 如果需要下载音频 if (downloading.DownloadBase.NeedDownloadContent["downloadAudio"]) { //audioUid = DownloadAudio(downloading); for (int i = 0; i < retry; i++) { audioUid = DownloadAudio(downloading); if (audioUid != null && audioUid != nullMark) { break; } } } if (audioUid == nullMark) { DownloadFailed(downloading); return; } // 暂停 Pause(downloading); string videoUid = null; // 如果需要下载视频 if (downloading.DownloadBase.NeedDownloadContent["downloadVideo"]) { //videoUid = DownloadVideo(downloading); for (int i = 0; i < retry; i++) { videoUid = DownloadVideo(downloading); if (videoUid != null && videoUid != nullMark) { break; } } } if (videoUid == nullMark) { DownloadFailed(downloading); return; } // 暂停 Pause(downloading); string outputDanmaku = null; // 如果需要下载弹幕 if (downloading.DownloadBase.NeedDownloadContent["downloadDanmaku"]) { outputDanmaku = DownloadDanmaku(downloading); } // 暂停 Pause(downloading); List <string> outputSubtitles = null; // 如果需要下载字幕 if (downloading.DownloadBase.NeedDownloadContent["downloadSubtitle"]) { outputSubtitles = DownloadSubtitle(downloading); } // 暂停 Pause(downloading); string outputCover = null; string outputPageCover = null; // 如果需要下载封面 if (downloading.DownloadBase.NeedDownloadContent["downloadCover"]) { // page的封面 string pageCoverFileName = $"{downloading.DownloadBase.FilePath}.{GetImageExtension(downloading.DownloadBase.PageCoverUrl)}"; outputPageCover = DownloadCover(downloading, downloading.DownloadBase.PageCoverUrl, pageCoverFileName); string coverFileName = $"{downloading.DownloadBase.FilePath}.Cover.{GetImageExtension(downloading.DownloadBase.CoverUrl)}"; // 封面 //outputCover = DownloadCover(downloading, downloading.DownloadBase.CoverUrl, $"{path}/Cover.{GetImageExtension(downloading.DownloadBase.CoverUrl)}"); outputCover = DownloadCover(downloading, downloading.DownloadBase.CoverUrl, coverFileName); } // 暂停 Pause(downloading); // 混流 string outputMedia = string.Empty; if (downloading.DownloadBase.NeedDownloadContent["downloadAudio"] || downloading.DownloadBase.NeedDownloadContent["downloadVideo"]) { outputMedia = MixedFlow(downloading, audioUid, videoUid); } // 这里本来只有IsExist,没有pause,不知道怎么处理 // 是否存在 //isExist = IsExist(downloading); //if (!isExist.Result) //{ // return; //} // 检测音频、视频是否下载成功 bool isMediaSuccess = true; if (downloading.DownloadBase.NeedDownloadContent["downloadAudio"] || downloading.DownloadBase.NeedDownloadContent["downloadVideo"]) { // 只有下载音频不下载视频时才输出aac // 只要下载视频就输出mp4 if (File.Exists(outputMedia)) { // 成功 isMediaSuccess = true; } else { isMediaSuccess = false; } } // 检测弹幕是否下载成功 bool isDanmakuSuccess = true; if (downloading.DownloadBase.NeedDownloadContent["downloadDanmaku"]) { if (File.Exists(outputDanmaku)) { // 成功 isDanmakuSuccess = true; } else { isDanmakuSuccess = false; } } // 检测字幕是否下载成功 bool isSubtitleSuccess = true; if (downloading.DownloadBase.NeedDownloadContent["downloadSubtitle"]) { if (outputSubtitles == null) { // 为null时表示不存在字幕 } else { foreach (string subtitle in outputSubtitles) { if (!File.Exists(subtitle)) { // 如果有一个不存在则失败 isSubtitleSuccess = false; } } } } // 检测封面是否下载成功 bool isCover = true; if (downloading.DownloadBase.NeedDownloadContent["downloadCover"]) { if (File.Exists(outputCover) || File.Exists(outputPageCover)) { // 成功 isCover = true; } else { isCover = false; } } if (!isMediaSuccess || !isDanmakuSuccess || !isSubtitleSuccess || !isCover) { DownloadFailed(downloading); return; } // 下载完成后处理 Downloaded downloaded = new Downloaded { MaxSpeedDisplay = Format.FormatSpeed(downloading.Downloading.MaxSpeed), }; // 设置完成时间 downloaded.SetFinishedTimestamp(new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds()); DownloadedItem downloadedItem = new DownloadedItem { DownloadBase = downloading.DownloadBase, Downloaded = downloaded }; App.PropertyChangeAsync(new Action(() => { // 加入到下载完成list中,并从下载中list去除 downloadedList.Add(downloadedItem); downloadingList.Remove(downloading); // 下载完成列表排序 DownloadFinishedSort finishedSort = SettingsManager.GetInstance().GetDownloadFinishedSort(); App.SortDownloadedList(finishedSort); })); })); } catch (OperationCanceledException e) { Core.Utils.Debugging.Console.PrintLine(Tag, e.ToString()); LogManager.Debug(Tag, e.Message); } }
/// <summary> /// 设置下载完成列表排序 /// </summary> /// <param name="finishedSort"></param> /// <returns></returns> public bool SetDownloadFinishedSort(DownloadFinishedSort finishedSort) { settingsEntity.DownloadFinishedSort = finishedSort; return(SetEntity()); }