/// <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)); }
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); }
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); }
//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); } }
/// <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); }
/// <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); }
/// <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); } }
/// <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); }