/// <summary> /// 通过AlbumId获取专辑信息(不含歌曲列表) /// </summary> /// <param name="cover">是否覆盖已存在的Artist信息</param> public IAsyncAction GetAlbumInfo(AlbumModel album, bool cover = false) { if (album.XiamiID == 0) { throw new ArgumentException("AlbumModel未设置ID"); } return(Run(async token => { try { LogService.DebugWrite($"Get info of Album {album.XiamiID}", nameof(WapApi)); var gettask = HttpHelper.GetAsync($"http://www.xiami.com/app/xiating/album?id={album.XiamiID}"); token.Register(() => gettask.Cancel()); var content = await gettask; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(content); List <Task> process = new List <Task>();//并行处理 process.Add(Task.Run(() => { if (album.SongList == null || cover) { album.SongList = ParseAlbumSongs(doc.DocumentNode.SelectSingleNode("//div/ul[1]"), album).ToList(); } })); process.Add(Task.Run(() => { if (album.RelateHotAlbums == null || cover) { album.RelateHotAlbums = ParseRelateAlbums(doc.DocumentNode.SelectSingleNode("//h3").NextSibling.NextSibling).ToList(); } })); var infonode = doc.DocumentNode.SelectSingleNode("//section[1]/div[1]/div[2]/div[1]"); if (album.Art.Host == "") { var art = infonode.SelectSingleNode(".//img").GetAttributeValue("src", AlbumModel.SmallDefaultUri); album.Art = new Uri(art); album.ArtFull = new Uri(art.Replace("_1", "")); } album.Name = infonode.SelectSingleNode(".//h2").InnerText; album.Rating = infonode.SelectSingleNode(".//p").InnerText.Remove(0, 4).Trim(); album.ReleaseDate = infonode.SelectSingleNode(".//span/span").InnerText.Remove(0, 5);//TODO: 针对地域进行转换 var artisttag = infonode.SelectSingleNode(".//span/a"); if ((album.Artist == null) || cover) { var idtext = artisttag.GetAttributeValue("onclick", "artist_detail(0);"); var addrlength = "artist_detail(".Length; uint artistID = uint.Parse(idtext.Substring(addrlength, idtext.IndexOf(")", addrlength) - addrlength)); ArtistModel artist = album.Artist ?? ArtistModel.GetNew(artistID); artist.Name = artisttag.InnerText; album.Artist = artist; } await Task.WhenAll(process); LogService.DebugWrite($"Finish Getting info of Album {album.Name}", nameof(WapApi)); } catch (Exception e) { LogService.ErrorWrite(e); throw e; } })); }
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary <string, object> state) { uint id = 0; if (!uint.TryParse(parameter.ToString(), out id)) { NavigationService.Navigate(typeof(Views.LibraryPage)); } Artist = ArtistModel.GetNew(id); if (Artist.Profile == null) { await Net.WebApi.Instance.GetArtistInfo(Artist); } }
//TODO: 判断歌曲是否被喜爱 /// <summary> /// 通过SongId获取歌曲的信息(不含取媒体地址) /// </summary> /// <param name="cover">是否覆盖已存在的Album和Artist信息</param> public IAsyncAction GetSongInfo(SongModel song, bool cover = false) { if (song.XiamiID == 0) { throw new ArgumentException("SongModel未设置ID"); } return(Run(async token => { try { LogService.DebugWrite($"Get info of Song {song.XiamiID}", nameof(WapApi)); var gettask = HttpHelper.GetAsync($"http://www.xiami.com/app/xiating/song?id={song.XiamiID}"); token.Register(() => gettask.Cancel()); var content = await gettask; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(content); HtmlNode root = doc.DocumentNode; var logo = root.SelectSingleNode("//img[1]"); var detail = root.SelectSingleNode("//ul[1]"); var detailgrade = root.SelectSingleNode("//div[1]/ul[1]"); if (song.Name == null) { song.Name = logo.GetAttributeValue("title", "UnKnown"); } song.PlayCount = int.Parse(detailgrade.SelectSingleNode(".//span[1]").InnerText); song.ShareCount = int.Parse(detailgrade.SelectSingleNode("./li[3]/span[1]").InnerText); var additionnodes = detail.SelectNodes("./li[position()>2]"); foreach (var node in additionnodes) { switch (node.FirstChild.InnerText) { case "作词:": song.Lyricist = node.LastChild.InnerText; break; case "作曲:": song.Composer = node.LastChild.InnerText; break; case "编曲:": song.Arranger = node.LastChild.InnerText; break; } } if ((song.Album == null) || cover) { var albumtag = detail.SelectSingleNode("./li[1]/a[1]"); var idtext = albumtag.GetAttributeValue("href", "/app/xiating/album?id=0"); var addrlength = "/app/xiating/album?id=".Length; uint albumID = uint.Parse(idtext.Substring(addrlength, idtext.IndexOf("&", addrlength) - addrlength)); AlbumModel album = song.Album ?? AlbumModel.GetNew(albumID); if (album.Art.Host == "") { var art = logo.GetAttributeValue("src", AlbumModel.SmallDefaultUri); album.Art = new Uri(art.Replace("_2", "_1")); album.ArtFull = new Uri(art.Replace("_2", "")); } album.Name = albumtag.InnerText; song.Album = album; } if ((song.Album?.Artist == null) || cover) { var artisttag = detail.SelectSingleNode("./li[2]/a[1]"); var idtext = artisttag.GetAttributeValue("href", "/app/xiating/artist?id=0"); var addrlength = "/app/xiating/artist?id=".Length; uint artistID = uint.Parse(idtext.Substring(addrlength, idtext.IndexOf("&", addrlength) - addrlength)); ArtistModel artist = song.Album?.Artist ?? ArtistModel.GetNew(artistID); artist.Name = artisttag.InnerText; song.Album.Artist = artist; } LogService.DebugWrite($"Finish Getting info of Song {song.Name}", nameof(WapApi)); } catch (Exception e) { LogService.ErrorWrite(e, nameof(WapApi)); throw e; } })); }