/// <summary> /// 分析返回的DIV快内的歌曲信息 /// </summary> /// <param name="tr">歌曲TR块的HTML信息</param> /// <returns>TR块中歌曲信息列表</returns> private List<MusicInfo> MusicInfoBuild(string tr) { List<MusicInfo> musicInfoList = new List<MusicInfo>(); // 获取音乐地址 List<string> musicAddressList = MusicOperator.GetMusicUrlList(tr); if (musicAddressList != null && musicAddressList.Count > 0) { // 过滤掉重复地址,如果过滤后为空,则返回null var urlList = musicAddressList; if (urlList.Count() == 0) { return null; } // 如果获得地址成功,获得歌曲信息 GroupCollection group = RegexHelper.GetRegexGroup(tr, SOSO_MUSIC_INFO_PATTEN, RegexOptions.IgnoreCase | RegexOptions.Singleline); if (group != null) { // 新建歌曲信息列表,设置歌曲信息 MusicInfo musicInfo = new MusicInfo(); musicInfo.MusicName = EncodeConverter.HtmlDecode(group["MusicName"].Value); musicInfo.SingerName = EncodeConverter.HtmlDecode(group["SingerName"].Value); musicInfo.Album = EncodeConverter.HtmlDecode(group["Album"].Value); musicInfo.MusicSource = "搜搜音乐"; // 设置歌曲地址和格式 foreach (string address in urlList) { MusicInfo tmpMusic = musicInfo.Clone() as MusicInfo; // 检查地址是否合法 if (MusicOperator.urlIsValid(address)) { tmpMusic.MusicUrl = address; tmpMusic.MusicFormat = MusicOperator.GetMusicFormat(tmpMusic.MusicUrl); musicInfoList.Add(tmpMusic); } } } return musicInfoList; } else { return musicInfoList; } }
/// <summary> /// 分析返回的DIV快内的歌曲信息 /// </summary> /// <param name="tr">歌曲tr块的HTML信息</param> /// <returns>TR块中歌曲信息列表</returns> private List<MusicInfo> MusicInfoBuild(string tr) { List<MusicInfo> musicInfoList = new List<MusicInfo>(); // 从TR块中获取音乐基本信息 tr = tr.Replace("\n", string.Empty); tr = tr.Replace(" ", string.Empty); GroupCollection infoGroup = RegexHelper.GetRegexGroup(tr, BAIDU_MUSIC_INFO_PATTERN, RegexOptions.IgnoreCase); if (infoGroup == null) { return musicInfoList; } // 设置音乐基本信息 MusicInfo music = new MusicInfo(); music.MusicSource = "百度音乐"; music.MusicName = EncodeConverter.HtmlDecode(infoGroup["MusicName"].Value); // 这里单独从TR块中获取专辑信息,是出于性能考虑,如果在infoGroup中搜索专辑名信息,因为正则表达式过长 // 导致每次搜索要940ms左右,而分离后,两次搜索总时间不到5ms music.Album = EncodeConverter.HtmlDecode(RegexHelper.GetRegexGroupItem(tr, BAIDU_MUSIC_INFO_PATTERN_2, "Album", RegexOptions.IgnoreCase)); music.SingerName = infoGroup["Singer1"].Value + " " + infoGroup["Singer2"].Value + " " + infoGroup["Singer3"].Value; // 从歌名的链接地址中获得音乐地址 string detailLink = infoGroup["LinkUrl"].Value; if (!string.IsNullOrEmpty(detailLink)) { List<string> musicUrlList = MusicOperator.GetMusicUrlList(detailLink); //目前一些文件名后面没有后缀名 if (musicUrlList == null || musicUrlList.Count == 0) { return null; } // 过滤掉重复地址 var urlList = musicUrlList; // 每个不同的地址,组成一个音乐信息 foreach (string url in urlList) { if (MusicOperator.urlIsValid(url)) { MusicInfo tmpMusic = music.Clone() as MusicInfo; tmpMusic.MusicUrl = url; tmpMusic.MusicFormat = MusicOperator.GetMusicFormat(url); musicInfoList.Add(tmpMusic); } } } else { return musicInfoList; } return musicInfoList; }
/// <summary> /// 分析每个<URL>标签内的歌曲信息 /// </summary> /// <param name="node">返回的歌曲信息节点</param> /// <returns>歌曲信息类对象</returns> private MusicInfo MusicInfoBuild(XmlNode node) { // 从节点中读取歌曲信息 MusicInfo musicInfo = new MusicInfo(); string encodeUrl = node.SelectSingleNode("encode").InnerText; string decodeName = node.SelectSingleNode("decode").InnerText; string musicType = node.SelectSingleNode("type").InnerText.ToUpper(); string lrcid = node.SelectSingleNode("lrcid").InnerText; musicInfo.MusicSource = "百度音乐快搜"; // 获取真实的歌曲地址,地址或歌名为空时返回null if (!string.IsNullOrEmpty(encodeUrl) && !string.IsNullOrEmpty(decodeName)) { musicInfo.MusicUrl = encodeUrl.Replace(encodeUrl.Substring(encodeUrl.LastIndexOf("/") + 1), decodeName); // 检查获得的真实地址是否有效,无效则返回null //if (MusicOperate.urlIsValid(musicInfo.MusicUrl)) //{ // 暂时不检查,因为地址不一定是MP3,rm等结尾,后面可能还有?stdfrom=3等参数 musicInfo.MusicFileName = MusicOperator.GetMusicFileName(musicInfo.MusicUrl); musicInfo.MusicName = EncodeConverter.UrlDecode(musicInfo.MusicFileName); musicInfo.MusicFormat = MusicOperator.GetMusicFormat(musicInfo.MusicUrl); //} //else //{ // return null; //} } else { return null; } try { // 获取歌词地址 // musicInfo.LyricUrl = "http://box.zhangmen.baidu.com/bdlrc/" + ulong.Parse(lrcid) / 100 + "/" + lrcid + ".lrc"; } catch { } return musicInfo; }