コード例 #1
0
        /// <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;
                }
            }));
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        //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;
                }
            }));
        }