コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: jfwangncs/YuliYuli
        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);
        }
コード例 #2
0
ファイル: MainWindow.xaml.cs プロジェクト: jfwangncs/YuliYuli
        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();
                });
            }
        }