private async void FavVideoGridView_ItemClick(object sender, ItemClickEventArgs e) { if ((e.ClickedItem as FavVideoViewModel).Bv == "加载更多") { var vm = FavListView.SelectedItem as FavViewModel; await vm.GetMoreVideoAsync(); } else if (!Regex.IsMatch((e.ClickedItem as FavVideoViewModel).Bv, "[B|b][V|v][0-9]*")) { return; } else { try { var info = e.ClickedItem as FavVideoViewModel; var master = await BiliVideoHelper.GetVideoMasterAsync(info.Bv, Settings.SESSDATA); NavigationHelper.NavigateToPage(ContentPage.Search); SearchPage.Current.HandleMaster <BiliVideoMasterResultPage, BiliVideoMaster>(master); } catch (ParsingVideoException) { var dialog = new NoticeDialog("提示", "该视频已失效"); await dialog.ShowAsync(); } catch (Exception ex) { _logger.Info(ex, ex.Message); } } }
private async void DownloadMultipleBtn_Click(object sender, RoutedEventArgs e) { var dialog = MutipleDownloadDialog.Create(_master.EpisodeList, b => { var item = new MutipleDownloadDialogItem() { Name = b.Name, Oringin = b, ToDownload = false }; return(item); }, async(item, quality) => { var b = (BiliBangumi)item.Oringin; var dash = await BiliVideoHelper.GetVideoDashStreamAsync(b.Video, Settings.SESSDATA); await VideoDownloadManager.CreateDashDownloadAsync(b.Video, dash.TryGetTargetQuality(quality), dash.GetHighestAudioQuality()); }); if (await dialog.ShowAsync() == ContentDialogResult.Primary) { ShowTipWithMessage("批量下载任务已创建"); } }
public static async Task <IBiliDownload> RecreateAsync(DownloadXmlModel xml, string sessdata) { var video = await BiliVideoHelper.GetSingleVideoAsync(xml.Bv, xml.Cid, xml.Quality, sessdata); var partList = new List <IBiliDownloadPart>(); var t1 = JsonConvert.DeserializeObject <DownloadTaskRestoreModel>(xml.PartList[0].RestoreModelJson); var t2 = JsonConvert.DeserializeObject <DownloadTaskRestoreModel>(xml.PartList[1].RestoreModelJson); t1.Url = video.VideoUrl; t2.Url = video.AudioUrl; var part1 = new BiliDashDownloadPart()//使用构造函数来创建实例,灵活 { Task = DownloadTask.Restore(t1), CacheFile = await StorageFile.GetFileFromPathAsync(t1.Path) }; var part2 = new BiliDashDownloadPart() { Task = DownloadTask.Restore(t2), CacheFile = await StorageFile.GetFileFromPathAsync(t2.Path) }; partList.Add(part1); partList.Add(part2); var download = new BiliDashDownload() { DownloadName = xml.DownloadName, Bv = xml.Bv, Cid = xml.Cid, Quality = xml.Quality, VideoUrl = video.VideoUrl, AudioUrl = video.AudioUrl, CacheFolder = await StorageFolder.GetFolderFromPathAsync(xml.CacheFolderPath), PartList = partList, Title = xml.Title }; download.ChineseStatus = "已暂停"; ulong currentProgress = 0; ulong fullProgress = 0; foreach (var part in partList) { currentProgress += part.Task.DownloadedBytes; fullProgress += part.Task.TotalBytes; } download.CurrentProgress = currentProgress; download.FullProgress = fullProgress; download.currentSpeed = 0; download.IsPaused = true; return(download); }
private async void SingleDownloadBtn_Click(object sender, RoutedEventArgs e) { var btn = sender as DropDownButton; var video = (BiliVideo)btn.DataContext; if (btn.Flyout != null) { return; } btn.Content = new ProgressRing() { IsActive = true, Height = 20, Width = 20 }; BiliVideoDashInfo dashInfo; try { dashInfo = await BiliVideoHelper.GetVideoDashStreamAsync((BiliVideo)btn.DataContext, Settings.SESSDATA); } catch (Exception ex) { Debug.WriteLine(ex.Message); btn.Content = "错误"; return; } btn.Content = "下载"; var flyout = new Windows.UI.Xaml.Controls.MenuFlyout(); var items = flyout.Items; foreach (var info in dashInfo.Videos) { var item = new Windows.UI.Xaml.Controls.MenuFlyoutItem() { Text = $"{info.Quality.ToQualityString()}-{info.Codec}", DataContext = info }; item.Click += async(s, args) => { var task = VideoDownloadManager.CreateDashDownloadAsync (video, (DashVideoInfo)item.DataContext, dashInfo.Audios.OrderByDescending(a => a.Quality).First()); ShowTipWithMessage($"{video.Name}-{info.Quality.ToQualityString()}-{info.Codec}"); await task; }; items.Add(item); } btn.Flyout = flyout; flyout.ShowAt(btn); }
private async void Button_Click(object sender, RoutedEventArgs e) //单个视频下载 { var sESSDATA = ApplicationData.Current.LocalSettings.Values["biliUserSESSDATA"] as string; var model = (sender as Button)?.DataContext as VideoInfo; this.needToClose = true; this.Hide(); try { var info = await BiliVideoHelper.GetSingleVideoInfoAsync(model.Info.Bv, model.Info.Cid, 64, sESSDATA); var dialog = await SingleVideoDialog.CreateAsync(info, XamlRoot); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Secondary) { this.needToClose = false; await this.ShowAsync(); } } catch (ParsingVideoException ex) { var dialog = new ErrorDialog(ex.Message, XamlRoot); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Primary) { MainPage.NavView.SelectedItem = MainPage.NavViewItems[2]; MainPage.ContentFrame.Navigate(typeof(UserPage)); } } catch (NullReferenceException) { var dialog = new ContentDialog() { Title = "错误", Content = new TextBlock() { Text = "该视频不存在dash格式的视频文件", FontFamily = new FontFamily("Microsoft Yahei UI"), FontSize = 20 }, PrimaryButtonText = "知道了" }; await dialog.ShowAsync(); } }
private async void Button_Click(object sender, RoutedEventArgs e) { var sESSDATA = ApplicationData.Current.LocalSettings.Values["biliUserSESSDATA"] as string; var model = (sender as Button)?.DataContext as VideoInfo; this.needToClose = true; this.Hide(); try { var info = await BiliVideoHelper.GetSingleVideoInfoAsync(model.Info.Bv, model.Info.Cid, 64, sESSDATA); var dialog = await SingleVideoDialog.CreateAsync(info, XamlRoot); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Secondary) { this.needToClose = false; await this.ShowAsync(); } } catch (DirectoryNotFoundException ex) { var dialog = new ExceptionDialog(ex.Message, XamlRoot); await dialog.ShowAsync(); } catch (ParsingVideoException ex) { var dialog = new ErrorDialog(ex.Message, XamlRoot); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Primary) { MainPage.NavView.SelectedItem = MainPage.NavViewItems[2]; MainPage.ContentFrame.Navigate(typeof(UserPage)); } } catch (System.Exception ex) { var dialog = new ErrorDialog(ex.Message, XamlRoot); dialog.PrimaryButtonText = ""; await dialog.ShowAsync(); } }
public static async Task <IBiliDownload> CreateAsync(string bv, long cid, int quality, string sESSDATA) { var video = await BiliVideoHelper.GetSingleVideoAsync(bv, cid, quality, sESSDATA); var tokenSource = new CancellationTokenSource(); var downloadName = video.Name.Replace("\\", "").Replace("/", "").Replace(":", "").Replace("*", "") .Replace("?", "").Replace("\"", "").Replace("<", "").Replace(">", "").Replace("|", ""); var title = video.Title.Replace("\\", "").Replace("/", "").Replace(":", "").Replace("*", "") .Replace("?", "").Replace("\"", "").Replace("<", "").Replace(">", "").Replace("|", ""); //防止出现不允许的文件名 var ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63"; var referer = "http://www.bilibili.com"; if (Directory.Exists(ApplicationData.Current.LocalCacheFolder.Path + "/" + downloadName + "Cache")) { await(await ApplicationData.Current.LocalCacheFolder.GetFolderAsync(downloadName + "Cache")).DeleteAsync(); } var cacheFolder = await ApplicationData.Current.LocalCacheFolder.CreateFolderAsync(downloadName + "Cache"); var partList = new List <IBiliDownloadPart> { await BiliDashDownloadPart.CreateAsync(video.VideoUrl, ua, referer, $"{downloadName}Video", cacheFolder), await BiliDashDownloadPart.CreateAsync(video.AudioUrl, ua, referer, $"{downloadName}Audio", cacheFolder) }; var download = new BiliDashDownload() { DownloadName = downloadName, Bv = bv, Cid = cid, Quality = quality, VideoUrl = video.VideoUrl, AudioUrl = video.AudioUrl, CacheFolder = cacheFolder, PartList = partList, Title = title }; return(download); }
private async void DownloadMultipleBtn_Click(object sender, RoutedEventArgs e) { var dialog = MutipleDownloadDialog.Create(_master.Videos, v => { var item = new MutipleDownloadDialogItem { Name = v.Name, ToDownload = false, Oringin = v }; return(item); }, async(item, quality) => { var v = (BiliVideo)item.Oringin; var dash = await BiliVideoHelper.GetVideoDashStreamAsync(v, Settings.SESSDATA); await VideoDownloadManager.CreateDashDownloadAsync(v, dash.TryGetTargetQuality(quality), dash.GetHighestAudioQuality()); }); if (await dialog.ShowAsync() == Windows.UI.Xaml.Controls.ContentDialogResult.Primary) { ShowTipWithMessage("批量下载任务已创建"); } }
private async void SearchBtn_Click(object sender, RoutedEventArgs e) { var searchContent = SearchTextBox.Text; if (string.IsNullOrWhiteSpace(searchContent)) { return; } var result = AnalyzeUrl(searchContent); if (string.IsNullOrWhiteSpace(result.Item2))//输入了无效的url { ShowNoticeFlyout("输入了无效的url"); return; } SearchProgress(); try { switch (result.Item1) { case UrlType.Bv: var video1 = await BiliVideoHelper.GetVideoMasterAsync(result.Item2, Settings.SESSDATA); SearchPage.Current.HandleMaster <BiliVideoMasterResultPage, BiliVideoMaster>(video1); Reset(); break; case UrlType.Av: var video2 = await BiliVideoHelper.GetVideoMasterAsync(long.Parse(result.Item2), Settings.SESSDATA); SearchPage.Current.HandleMaster <BiliVideoMasterResultPage, BiliVideoMaster>(video2); Reset(); break; case UrlType.Ep: var bangumi1 = await BiliBangumiHelper.GetBangumiMasterAsync(long.Parse(result.Item2), Settings.SESSDATA, null); SearchPage.Current.HandleMaster <BiliBangumiMasterResultPage, BiliBangumiMaster>(bangumi1); Reset(); break; case UrlType.Ss: var bangumi2 = await BiliBangumiHelper.GetBangumiMasterAsync(long.Parse(result.Item2), Settings.SESSDATA); SearchPage.Current.HandleMaster <BiliBangumiMasterResultPage, BiliBangumiMaster>(bangumi2); Reset(); break; case UrlType.Mc: var manga = await BiliMangaHelper.GetMangaMasterAsync(long.Parse(result.Item2), Settings.SESSDATA); SearchPage.Current.HandleMaster <BiliMangaMasterResultPage, BiliMangaMaster>(manga); Reset(); break; case UrlType.Error: Reset(); break; default: Reset(); break; } } catch (Exception ex) { Reset(); if (ex is VideoNotFoundException or ArgumentException or UnauthorizedAccessException or ParsingVideoException) { ShowNoticeFlyout(ex.Message); }
public async void searchBtn_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrWhiteSpace(searchTextbox.Text)) { return; } var sESSDATA = ApplicationData.Current.LocalSettings.Values["biliUserSESSDATA"] as string; searchBtn.IsEnabled = false; searchProgressRing.IsActive = true; searchProgressRing.Visibility = Visibility.Visible; (string, long, UrlType, int)info = (null, 0, 0, 0); try { info = await AnalyzeVideoUrlAsync(searchTextbox.Text, sESSDATA); //分析输入的url,提取bv或者av,是否指定分p } catch (NullReferenceException) { Reset(); var dialog = new ExceptionDialog("未找到视频", XamlRoot); await dialog.ShowAsync(); return; } catch (Exception ex) { Reset(); var dialog = new ExceptionDialog(ex.Message, XamlRoot); await dialog.ShowAsync(); return; } if (info.Item3 == UrlType.BangumiEP)//下载ep番剧 { var bangumi = await BiliVideoHelper.GetBangumiInfoAsync(info.Item4, 0, sESSDATA); var dialog = await BangumiDialog.CreateAsync(bangumi, XamlRoot); Reset(); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Secondary) { return; } } else if (info.Item3 == UrlType.BangumiSS)//下载ss番剧 { var bangumi = await BiliVideoHelper.GetBangumiInfoAsync(info.Item4, 1, sESSDATA); var dialog = await BangumiDialog.CreateAsync(bangumi, XamlRoot); Reset(); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Secondary) { return; } } //else if (info.Item3 == UrlType.SingelVideo) //指定了分p的时候,废弃这种用法 //{ // var dialog = await SingleVideoDialog.CreateAsync // (await BiliVideoHelper.GetSingleVideoInfoAsync(info.Item1, info.Item2, 64, sESSDATA)); // Reset(); // var result = await dialog.ShowAsync(); // if (result == ContentDialogResult.Secondary) return; //} else if (info.Item3 == UrlType.MasteredVideo) //下载普通视频集合 { var master = await BiliVideoHelper.GetVideoMasterInfoAsync(info.Item1, sESSDATA); var dialog = await MasteredVideoDialog.CreateAsync(master, XamlRoot); Reset(); var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Secondary) { return; } } else if (info.Item3 == UrlType.MangaMC) //下载漫画 { if (Settings.DownloadPath == null) //检查下载目录是否为空 { Reset(); var dialog = new ErrorDialog("未设置下载储存文件夹,请前往设置以更改", XamlRoot) { PrimaryButtonText = "前往设置" }; var result = await dialog.ShowAsync(); if (result == ContentDialogResult.Secondary) { return; } else { MainPage.ContentFrame.Navigate(typeof(SettingPage)); MainPage.NavView.SelectedItem = MainPage.NavView.SettingsItem; return; } } try { await StorageFolder.GetFolderFromPathAsync(Settings.DownloadPath); } catch (FileNotFoundException) { Reset(); var dialog = new ExceptionDialog("找不到指定下载目录:" + Settings.DownloadPath, XamlRoot); await dialog.ShowAsync(); return; } var master = await BiliMangaHelper.GetBiliMangaMasterAsync(info.Item4, sESSDATA); Reset(); var mangaFrame = new Frame(); var mangaWindow = new Window { ExtendsContentIntoTitleBar = true, Content = mangaFrame }; mangaWindowDic.Add(master, mangaWindow); mangaFrame.Navigate(typeof(MangaDownloadPage), master); mangaWindow.Activate(); } else { Reset(); var dialog = new ContentDialog() { Content = "解析失败,没有找到合适的下载方法" }; await dialog.ShowAsync(); } }
//bv cid 类型 ep或ss或mc private async Task <(string, long, UrlType, int)> AnalyzeVideoUrlAsync(string url, string sESSDATA) //分析输入的url,提取bv { BiliVideoMaster master; long cid = 0; int p = 0; string bv; long av; int ep = 0; int ss = 0; int mc = 0; UrlType type = UrlType.MasteredVideo; //if (Regex.IsMatch(searchTextbox.Text, "\\?p=[0-9]*"))//判断分p //{ // p = int.Parse(Regex.Match(searchTextbox.Text, "p=[0-9]*").Value.Remove(0, 2)); // type = UrlType.SingelVideo; //}; if (Regex.IsMatch(url, "[B|b][V|v][a-z|A-Z|0-9]*"))//判断bv { bv = Regex.Match(url, "[B|b][V|v][a-z|A-Z|0-9]*").Value; master = await BiliVideoHelper.GetVideoMasterInfoAsync(bv, sESSDATA); } else if (Regex.IsMatch(url, "[a|A][v|V][0-9]*"))//判断av { av = long.Parse(Regex.Match(url, "[a|A][v|V][0-9]*").Value.Remove(0, 2)); master = await BiliVideoHelper.GetVideoMasterInfoAsync(av, sESSDATA); } else if (Regex.IsMatch(url, "[e|E][p|P][0-9]*"))//判断ep { p = 0; master = null; type = UrlType.BangumiEP; ep = int.Parse(Regex.Match(url, "[e|E][p|P][0-9]*").Value.Remove(0, 2)); } else if (Regex.IsMatch(url, "[s|S][s|S][0-9]*"))//判断ss { p = 0; master = null; type = UrlType.BangumiSS; ss = int.Parse(Regex.Match(url, "[s|S][s|S][0-9]*").Value.Remove(0, 2)); } else if (Regex.IsMatch(url, "[m|M][c|C][0-9]*")) { p = 0; master = null; type = UrlType.MangaMC; mc = int.Parse(Regex.Match(url, "[m|M][c|C][0-9]*").Value.Remove(0, 2)); } else { throw new ArgumentException("Url不合法"); } if (p != 0) { cid = (long)(master.VideoList.Where(v => v.P == p)?.FirstOrDefault().Cid); } if (type == UrlType.MangaMC) { return(null, 0, type, mc); } if (type == UrlType.BangumiEP) { return(null, 0, type, ep); } if (type == UrlType.BangumiSS) { return(null, 0, type, ss); } if (master != null)//只要是番剧,就把master赋值为空 { return(master.Bv, cid, type, 0); } else { throw new Exception(); } }