private async Task StartDownLoadVideo() { do { VideoPagedInfo data = new VideoPagedInfo(); if (tasks.Count < ThreadCount) { if (Queue.TryDequeue(out data)) { var tokenSource = new CancellationTokenSource(); var resetEvent = new ManualResetEvent(true); var task = Task.Run(() => DownLoadVideo(data, resetEvent), tokenSource.Token); tasks.Add(data.cid, new DownLoadTask { Key = data.AID + data.page.ToString(), ResetEvent = resetEvent, VideoTask = task, Token = tokenSource }); } } //检查进程 foreach (var item in tasks) { var v = DownList.Where(q => q.cid == item.Key).FirstOrDefault(); if (v.state == "错误") { var tokenSource = new CancellationTokenSource(); var resetEvent = new ManualResetEvent(true); var task = Task.Run(() => DownLoadVideo(data, resetEvent), tokenSource.Token); tasks[item.Key] = new DownLoadTask { Key = data.AID + data.page.ToString(), ResetEvent = resetEvent, VideoTask = task, Token = tokenSource }; } } await Task.Delay(1000); } while (true); }
private async Task DownLoadVideo(VideoPagedInfo data, ManualResetEvent resetEvent) { try { var video = DownList.FirstOrDefault(q => q.cid.Equals(data.cid)); if (video != null) { var SavePath = video.SavePath + "\\" + video.Title + "\\"; if (!Directory.Exists(SavePath)) { Directory.CreateDirectory(SavePath); } var fileName = $"P{data.page}{data.part}"; //三次重试 for (int j = 0; j < 4; j++) { var urlReq = new jfYuRequest($"https://api.bilibili.com/x/player/playurl?avid={data.AID}&cid={data.cid}&ptype=json&qn=112") { Encoding = Encoding.UTF8, Timeout = 30000 }; var urlReqhtml = await urlReq.GetHtmlAsync(); var urlReqData = Serializer.Deserialize <dynamic>(urlReqhtml); string url = urlReqData.data.durl[0].url; data.size = urlReqData.data.durl[0].size; data.Size = ((decimal)data.size / 1024 / 1024).ToString("0.00") + "MB"; var dfreq = new jfYuRequest(url); dfreq.RequestHeader.Referer = $"https://www.bilibili.com/video/{video.BVID}"; try { bool result = await dfreq.GetFileAsync($"{SavePath}\\{fileName}.flv", (q, e, t) => { resetEvent.WaitOne(); Dispatcher.Invoke(() => { var pro = double.Parse(q.ToString("0.00")); data.Process = pro + "%"; data.Speed = e > 1024 ? $"{e / 1024:0.00}MB/s" : $"{e:0.00}KB/s"; //TimeSpan time = TimeSpan.FromSeconds((double)t); VideoListView.Items.Refresh(); }); }); if (result) { Dispatcher.Invoke(() => { data.color = Color.Green; VideoListView.Items.Refresh(); }); tasks.Remove(data.cid); } return; } catch (Exception) { if (j >= 4) { data.Process = "0%"; data.Speed = "0KB/s"; data.state = "错误"; Dispatcher.Invoke(() => { VideoListView.Items.Refresh(); }); } } } } } catch (Exception) { data.Process = "0%"; data.Speed = "0KB/s"; data.state = "错误"; Dispatcher.Invoke(() => { VideoListView.Items.Refresh(); }); } }