Ejemplo n.º 1
0
        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("批量下载任务已创建");
            }
        }
Ejemplo n.º 3
0
        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();
            }
        }
Ejemplo n.º 7
0
        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);
                }
Ejemplo n.º 10
0
        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();
            }
        }
Ejemplo n.º 11
0
        //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();
            }
        }