Beispiel #1
0
        /// <summary>
        /// 设置音质
        /// </summary>
        /// <param name="playUrl"></param>
        /// <param name="defaultAudioQuality"></param>
        /// <returns></returns>
        private static ObservableCollection <string> GetAudioQualityFormatList(PlayUrl playUrl, int defaultAudioQuality)
        {
            List <string> audioQualityFormatList = new List <string>();

            if (playUrl.Dash.Audio == null)
            {
                return(new ObservableCollection <string>());
            }

            foreach (PlayUrlDashVideo audio in playUrl.Dash.Audio)
            {
                // 音质id大于设置画质时,跳过
                if (audio.Id > defaultAudioQuality)
                {
                    continue;
                }

                Quality audioQuality = Constant.GetAudioQualities().FirstOrDefault(t => { return(t.Id == audio.Id); });
                if (audioQuality != null)
                {
                    ListHelper.AddUnique(audioQualityFormatList, audioQuality.Name);
                }
            }

            audioQualityFormatList.Sort(new StringLogicalComparer <string>());
            audioQualityFormatList.Reverse();

            return(new ObservableCollection <string>(audioQualityFormatList));
        }
Beispiel #2
0
        public object Clone()
        {
            Channel channel = new Channel();

            channel.Title = (string)(Title.Clone());
            if (PlayUrl != null)
            {
                channel.PlayUrl = new Uri(PlayUrl.ToString());
            }
            else
            {
                channel.PlayUrl = null;
            }
            if (WebSiteUrl != null)
            {
                channel.WebSiteUrl = new Uri(WebSiteUrl.ToString());
            }
            else
            {
                channel.WebSiteUrl = null;
            }
            if (Description != null)
            {
                channel.Description = (string)(Description.Clone());
            }
            channel.Date = Date;
            if (Category != null)
            {
                channel.Category = (string)(Category.Clone());
            }
            if (Author != null)
            {
                channel.Author = (string)(Author.Clone());
            }
            if (Length != null)
            {
                channel.Length = (string)(Length.Clone());
            }
            if (Type != null)
            {
                channel.Type = (string)(Type.Clone());
            }

            return(channel);
        }
Beispiel #3
0
        public object Clone()
        {
            Channel channel = new Channel();

            channel.Title = (string)Title.Clone();
            if (this.PlayUrl != null)
            {
                channel.PlayUrl = new Uri(PlayUrl.ToString());
            }
            else
            {
                channel.PlayUrl = null;
            }
            if (this.WebSiteUrl != null)
            {
                channel.WebSiteUrl = new Uri(WebSiteUrl.ToString());
            }
            else
            {
                channel.WebSiteUrl = null;
            }
            if (this.Description != null)
            {
                channel.Description = (string)Description.Clone();
            }
            if (this.Category != null)
            {
                channel.Category = (string)Category.Clone();
            }
            channel.Listener = Listener;
            channel.Bitrate  = Bitrate;
            if (this.Length != null)
            {
                channel.Length = (string)Length.Clone();
            }
            if (this.Type != null)
            {
                channel.Type = (string)Type.Clone();
            }
            return(channel);
        }
Beispiel #4
0
        //public static long GetCheeseEpisodeIdBySeasonId(long seasonId, string referer)
        //{
        //    string url = $"https://api.bilibili.com/pugv/view/web/ep/list?season_id={seasonId}&pn=1";
        //    string response = Utils.RequestWeb(url, referer);

        //    try
        //    {
        //        CheeseList cheeseList = JsonConvert.DeserializeObject<CheeseList>(response);
        //        if (cheeseList.data.items != null && cheeseList.data.items.Count > 0)
        //        {
        //            return cheeseList.data.items[0].id;
        //        }
        //        else { return 0; }
        //    }
        //    catch (JsonReaderException e)
        //    {
        //        Console.WriteLine("发生异常: {0}", e);
        //        return 0;
        //    }
        //}

        /// <summary>
        /// 获得音视频流链接
        /// </summary>
        /// <param name="bvid">视频的bvid</param>
        /// <param name="cid">视频的cid</param>
        public static PlayUrlData GetStreamInfo(string bvid, long avid, long cid, long episodeId, int quality, string referer, bool isProxy = false, int proxy = 0)
        {
            string    baseUrlVideo  = "https://api.bilibili.com/x/player/playurl";
            string    baseUrlSeason = "https://api.bilibili.com/pgc/player/web/playurl";
            string    baseUrlCheese = "https://api.bilibili.com/pugv/player/web/playurl";
            string    baseUrl;
            VideoType videoType = Common.GetVideoType(referer);

            switch (videoType)
            {
            case VideoType.VIDEO:
                baseUrl = baseUrlVideo;
                break;

            case VideoType.VIDEO_AV:
                baseUrl = baseUrlVideo;
                break;

            case VideoType.BANGUMI_SEASON:
                baseUrl = baseUrlSeason;
                break;

            case VideoType.BANGUMI_EPISODE:
                baseUrl = baseUrlSeason;
                break;

            case VideoType.BANGUMI_MEDIA:
                baseUrl = baseUrlSeason;
                break;

            case VideoType.CHEESE_SEASON:
                baseUrl = baseUrlCheese;
                break;

            case VideoType.CHEESE_EPISODE:
                baseUrl = baseUrlCheese;
                break;

            default:
                baseUrl = baseUrlVideo;
                break;
            }
            // TODO 没有的参数不加入url
            //string url = $"{baseUrl}?cid={cid}&bvid={bvid}&avid={avid}&ep_id={episodeId}&qn={quality}&otype=json&fourk=1&fnver=0&fnval=16";
            string url = $"{baseUrl}?cid={cid}&qn={quality}&otype=json&fourk=1&fnver=0&fnval=16";

            if (bvid != null)
            {
                url += $"&bvid={bvid}";
            }
            if (avid != 0)
            {
                url += $"&avid={avid}";
            }
            if (episodeId != 0)
            {
                url += $"&ep_id={episodeId}";
            }

            // 代理网址
            //https://www.biliplus.com/BPplayurl.php?cid=180873425&qn=116&type=&otype=json&fourk=1&bvid=BV1pV411o7yD&ep_id=317925&fnver=0&fnval=16&module=pgc
            if (isProxy && proxy == 1)
            {
                string proxyUrl1 = "https://www.biliplus.com/BPplayurl.php";
                url = $"{proxyUrl1}?cid={cid}&bvid={bvid}&qn={quality}&otype=json&fourk=1&fnver=0&fnval=16&module=pgc";
            }
            else if (isProxy && proxy == 2)
            {
                string proxyUrl2 = "https://biliplus.ipcjs.top/BPplayurl.php";
                url = $"{proxyUrl2}?cid={cid}&bvid={bvid}&qn={quality}&otype=json&fourk=1&fnver=0&fnval=16&module=pgc";
            }

            string response = Utils.RequestWeb(url, referer);

            //Console.WriteLine(response);

            try
            {
                PlayUrl playUrl;
                if (isProxy)
                {
                    PlayUrlData playUrlData = JsonConvert.DeserializeObject <PlayUrlData>(response);

                    playUrl = new PlayUrl
                    {
                        result = playUrlData
                    };
                }
                else
                {
                    playUrl = JsonConvert.DeserializeObject <PlayUrl>(response);
                }

                if (playUrl != null)
                {
                    if (playUrl.data != null)
                    {
                        return(playUrl.data);
                    }
                    if (playUrl.result != null)
                    {
                        return(playUrl.result);
                    }

                    // 无法从B站获取数据,进入代理网站
                    if (Settings.GetInstance().IsLiftingOfRegion() == ALLOW_STATUS.YES)
                    {
                        switch (proxy)
                        {
                        case 0:
                            return(GetStreamInfo(bvid, avid, cid, episodeId, quality, referer, true, 1));

                        case 1:
                            return(GetStreamInfo(bvid, avid, cid, episodeId, quality, referer, true, 2));

                        case 2:
                            return(null);
                        }
                    }

                    return(null);
                }
                else
                {
                    return(null);
                }
            }
            catch (JsonReaderException e)
            {
                Console.WriteLine("GetStreamInfo()发生JsonReader异常: {0}", e);
                return(null);
            }
            catch (Exception e)
            {
                Console.WriteLine("GetStreamInfo()发生异常: {0}", e);
                return(null);
            }
        }
Beispiel #5
0
        /// <summary>
        /// 获取视频流的信息,从VideoPage返回
        /// </summary>
        /// <param name="page"></param>
        public void GetVideoStream(VideoPage page)
        {
            PlayUrl playUrl = VideoStream.GetBangumiPlayUrl(page.Avid, page.Bvid, page.Cid);

            Utils.VideoPageInfo(playUrl, page);
        }
Beispiel #6
0
        /// <summary>
        /// 获取视频流的信息,从VideoPage返回
        /// </summary>
        /// <param name="page"></param>
        public void GetVideoStream(VideoPage page)
        {
            PlayUrl playUrl = VideoStream.GetCheesePlayUrl(page.Avid, page.Bvid, page.Cid, page.EpisodeId);

            Utils.VideoPageInfo(playUrl, page);
        }
Beispiel #7
0
        /// <summary>
        /// 从视频流更新VideoPage
        /// </summary>
        /// <param name="playUrl"></param>
        /// <param name="page"></param>
        internal static void VideoPageInfo(PlayUrl playUrl, VideoPage page)
        {
            if (playUrl == null)
            {
                return;
            }

            // 视频流信息
            page.PlayUrl = playUrl;

            // 获取设置
            UserInfoSettings userInfo       = SettingsManager.GetInstance().GetUserInfo();
            int         defaultQuality      = SettingsManager.GetInstance().GetQuality();
            VideoCodecs videoCodecs         = SettingsManager.GetInstance().GetVideoCodecs();
            int         defaultAudioQuality = SettingsManager.GetInstance().GetAudioQuality();

            // 未登录时,最高仅720P
            if (userInfo.Mid == -1)
            {
                if (defaultQuality > 64)
                {
                    defaultQuality = 64;
                }
            }

            // 非大会员账户登录时,如果设置的画质高于1080P,则这里限制为1080P
            if (!userInfo.IsVip)
            {
                if (defaultQuality > 80)
                {
                    defaultQuality = 80;
                }
            }

            if (playUrl.Durl != null)
            {
                // 音质

                // 画质

                // 视频编码

                // 时长

                return;
            }

            if (playUrl.Dash != null)
            {
                // 如果video列表或者audio列表没有内容,则返回false
                if (playUrl.Dash.Video == null)
                {
                    return;
                }
                if (playUrl.Dash.Video.Count == 0)
                {
                    return;
                }

                // 音质
                page.AudioQualityFormatList = GetAudioQualityFormatList(playUrl, defaultAudioQuality);
                if (page.AudioQualityFormatList.Count > 0)
                {
                    page.AudioQualityFormat = page.AudioQualityFormatList[0];
                }

                // 画质 & 视频编码
                page.VideoQualityList = GetVideoQualityList(playUrl, userInfo, defaultQuality, videoCodecs);
                if (page.VideoQualityList.Count > 0)
                {
                    page.VideoQuality = page.VideoQualityList[0];
                }

                // 时长
                page.Duration = Format.FormatDuration(playUrl.Dash.Duration);
            }
        }
Beispiel #8
0
        /// <summary>
        /// 设置画质 & 视频编码
        /// </summary>
        /// <param name="playUrl"></param>
        /// <param name="defaultQuality"></param>
        /// <param name="userInfo"></param>
        /// <param name="videoCodecs"></param>
        /// <returns></returns>
        private static List <VideoQuality> GetVideoQualityList(PlayUrl playUrl, UserInfoSettings userInfo, int defaultQuality, VideoCodecs videoCodecs)
        {
            List <VideoQuality> videoQualityList = new List <VideoQuality>();

            if (playUrl.Dash.Video == null)
            {
                return(videoQualityList);
            }

            foreach (PlayUrlDashVideo video in playUrl.Dash.Video)
            {
                // 画质id大于设置画质时,跳过
                if (video.Id > defaultQuality)
                {
                    continue;
                }

                // 非大会员账户登录时
                if (!userInfo.IsVip)
                {
                    // 如果画质为720P60,跳过
                    if (video.Id == 74)
                    {
                        continue;
                    }
                }

                string qualityFormat = string.Empty;
                PlayUrlSupportFormat selectedQuality = playUrl.SupportFormats.FirstOrDefault(t => t.Quality == video.Id);
                if (selectedQuality != null)
                {
                    qualityFormat = selectedQuality.NewDescription;
                }

                // 寻找是否已存在这个画质
                // 不存在则添加,存在则修改
                string       codecName         = GetVideoCodecName(video.Codecs);
                VideoQuality videoQualityExist = videoQualityList.FirstOrDefault(t => t.Quality == video.Id);
                if (videoQualityExist == null)
                {
                    List <string> videoCodecList = new List <string>();
                    if (codecName != string.Empty)
                    {
                        ListHelper.AddUnique(videoCodecList, codecName);
                    }

                    VideoQuality videoQuality = new VideoQuality()
                    {
                        Quality        = video.Id,
                        QualityFormat  = qualityFormat,
                        VideoCodecList = videoCodecList
                    };
                    videoQualityList.Add(videoQuality);
                }
                else
                {
                    if (!videoQualityList[videoQualityList.IndexOf(videoQualityExist)].VideoCodecList.Exists(t => t.Equals(codecName)))
                    {
                        if (codecName != string.Empty)
                        {
                            videoQualityList[videoQualityList.IndexOf(videoQualityExist)].VideoCodecList.Add(codecName);
                        }
                    }
                }

                // 设置选中的视频编码
                VideoQuality selectedVideoQuality = videoQualityList.FirstOrDefault(t => t.Quality == video.Id);
                if (selectedVideoQuality == null)
                {
                    continue;
                }

                if (videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList.Count == 1)
                {
                    // 当获取的视频没有设置的视频编码时,执行
                    videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].SelectedVideoCodec = videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList[0];
                }

                // 设置选中的视频编码
                switch (videoCodecs)
                {
                case VideoCodecs.AVC:
                    if (videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList.Contains("H.264/AVC"))
                    {
                        videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].SelectedVideoCodec = "H.264/AVC";
                    }
                    break;

                case VideoCodecs.HEVC:
                    if (videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].VideoCodecList.Contains("H.265/HEVC"))
                    {
                        videoQualityList[videoQualityList.IndexOf(selectedVideoQuality)].SelectedVideoCodec = "H.265/HEVC";
                    }
                    break;

                case VideoCodecs.NONE:
                    break;

                default:
                    break;
                }
            }

            return(videoQualityList);
        }