static async Task <SearchResult> SearchAll(string key)
    {
        var items = new List <IMusic>();
        var sr    = new SearchResult
        {
            Items      = items,
            Keyword    = key,
            Page       = -1,
            SearchType = EnumSearchType.all,
        };
        dynamic obj = await NetAccess.Json(XiamiUrl.url_search_all, "key", key);

        if (obj == null)
        {
            return(sr);
        }
        foreach (var type in new string[] { "song", "album", "artist", "collect" })
        {
            dynamic data = obj[type + "s"];
            if (data == null)
            {
                continue;
            }
            foreach (dynamic x in data)
            {
                items.Add(MusicFactory.CreateFromJson(x, (EnumMusicType)Enum.Parse(typeof(EnumMusicType), type)));
            }
        }
        return(sr);
    }
Ejemplo n.º 2
0
        void OnMp3PlayerSongChanged(object sender, SongChangedEventArgs e)
        {
            source.Clear();
            SongViewModel svm = SongViewModel.GetId(e.Id);

            if (svm == null)
            {
                return;
            }
            var lrcPath = Path.Combine(Global.AppSettings["DownloadFolder"], svm.FileNameBase + ".lrc");

            if (!File.Exists(lrcPath))
            {
                lrcPath = Path.Combine(Global.BasePath, "cache", e.Id + ".lrc");
            }
            if (!File.Exists(lrcPath))
            {
                Task.Run(async() =>
                {
                    var url = svm.Song.UrlLrc;
                    if (string.IsNullOrEmpty(url))
                    {
                        var json = await NetAccess.Json(XiamiUrl.url_song, "id", svm.Id);
                        if (json.song != null)
                        {
                            json = json.song;
                        }
                        url = MusicHelper.Get(json, "lyric", "song_lrc");
                        if (string.IsNullOrEmpty(url))
                        {
                            return;
                        }
                    }
                    string lrcText = await Http.Get(url, null);
                    File.WriteAllText(lrcPath, lrcText);
                    var f = LyricViewModel.LoadLrcFile(lrcPath);
                    UIHelper.RunOnUI(() =>
                    {
                        foreach (var item in f)
                        {
                            source.Add(item);
                        }
                        timelist = source.Select(x => x.Time.TotalMilliseconds).ToArray();
                    });
                });
                return;
            }
            var s = LyricViewModel.LoadLrcFile(lrcPath);

            foreach (var item in s)
            {
                source.Add(item);
            }
            timelist = source.Select(x => x.Time.TotalMilliseconds).ToArray();
        }
Ejemplo n.º 3
0
 void OnMp3PlayerSongChanged(object sender, SongChangedEventArgs e)
 {
     if (SongViewModel.NowPlaying != null)
     {
         SongViewModel.NowPlaying.IsNowPlaying = false;
     }
     SongViewModel.NowPlaying = SongViewModel.GetId(e.Id);
     if (SongViewModel.NowPlaying != null)
     {
         Task.Run(() =>
         {
             if (!Mp3Player.IsPlaying)
             {
                 return;
             }
             var id = SongViewModel.NowPlaying.Id;
             System.Threading.Thread.Sleep(10000);
             if (SongViewModel.NowPlaying.Id != id)
             {
                 return;
             }
             NetAccess.Json(XiamiUrl.url_playlog, "uid", Global.AppSettings["xiami_uid"], "id", id);
             // XiamiClient.GetDefault().Call_xiami_api("Playlog.add",
             //    "id=" + SongViewModel.NowPlaying.Id,
             //    "time=" + XiamiClient.DateTimeToUnixTimestamp(DateTime.Now).ToString(),
             //    "type=20"
             //);
         });
         SongViewModel.NowPlaying.IsNowPlaying = true;
         var now = SongViewModel.NowPlaying;
         info_now.Visibility         = Visibility.Visible;
         part_nowPlaying.DataContext = now;
         Title   = string.Format("{0} - {1}      ", now.Name, now.ArtistName);
         counter = 0;
         if (trayIcon != null && Global.AppSettings["ShowNowPlaying"] != "0" && Mp3Player.IsPlaying)
         {
             balloonTip           = new MyBalloonTip();
             balloonTip.ViewModel = now;
             trayIcon.ShowCustomBalloon(balloonTip, PopupAnimation.Fade, 3000);
         }
     }
     ActionBarService.Refresh();
     refreshPlause();
     currentList.PerformAction("选中正在播放");
 }
    async static Task <SearchResult> _searchByKey(string keyword, int page, EnumMusicType type = EnumMusicType.song)
    {
        dynamic obj = await NetAccess.Json(XiamiUrl.url_search_all, "key", keyword, "page", page.ToString());

        /////////////
        if (obj == null)
        {
            return(null);
        }
        //string typestr = type.ToString();
        //dynamic obj = await XiamiClient.GetDefault().Call_xiami_api(string.Format("Search.{0}s", typestr),
        //    string.Format("\"key={0}\"", keyword),
        //    string.Format("page={0}", page));
        //if (obj == null) return null;
        dynamic data = obj[type.ToString() + "s"];

        if (data == null)
        {
            return(null);
        }
        var items = new List <IMusic>();

        foreach (dynamic x in data)
        {
            items.Add(MusicFactory.CreateFromJson(x, type));
        }
        var searchType = EnumSearchType.song;

        Enum.TryParse <EnumSearchType>(type.ToString(), out searchType);
        bool hasNext = page.ToString() != obj["next"];
        var  res     = new SearchResult
        {
            Items      = items,
            Keyword    = keyword,
            Page       = page,
            HasNext    = hasNext,
            SearchType = searchType,
        };

        return(res);
    }
    static async Task <SearchResult> getByType(EnumSearchType type, string id)
    {
        List <IMusic> items = new List <IMusic>();
        dynamic       json  = null;

        switch (type)
        {
        case EnumSearchType.song:
            json = await NetAccess.Json(XiamiUrl.url_song, "id", id);

            items = GetSong(json);
            break;

        case EnumSearchType.album:
            json = await NetAccess.Json(XiamiUrl.url_album, "id", id);

            items = GetAlbum(json);
            break;

        case EnumSearchType.album_song:
            json = await NetAccess.Json(XiamiUrl.url_album, "id", id);

            items = GetSongsOfAlbum(json);
            break;

        case EnumSearchType.artist_song:
            json = await NetAccess.Json(XiamiUrl.url_artist_top_song, "id", id);

            items = GetSongsOfArtist(json);
            break;

        case EnumSearchType.artist:
            json = await NetAccess.Json(XiamiUrl.url_artist, "id", id);

            items = GetArtist(json);
            break;

        case EnumSearchType.collect:
        case EnumSearchType.collect_song:
            json = await NetAccess.Json(XiamiUrl.url_collect, "id", id);

            getCollectDetails(json["collect"]["id"].ToString());
            items = GetSongsOfCollect(json);
            break;

        case EnumSearchType.artist_artist:
            json = await NetAccess.Json(XiamiUrl.url_artsit_similars, "id", id);

            items = GetSimilarsOfArtist(json);
            break;

        case EnumSearchType.artist_album:
            json = await NetAccess.Json(XiamiUrl.url_artist_albums, "id", id);

            items = GetAlbumsOfArtist(json);
            break;

        default:
            break;
        }
        if (json == null)
        {
            return(null);
        }
        if (type.ToString().Contains("_"))
        {
            var duo = type.ToString().Split("_".ToCharArray());
            id = duo[0] + ":" + id;
            Enum.TryParse(duo[1], out type);
        }
        else
        {
            id   = type.ToString() + ":" + id;
            type = EnumSearchType.all;
        }
        var res = new SearchResult
        {
            Items      = items,
            Keyword    = id,
            SearchType = type,
            Page       = 1,
        };

        return(res);
    }
    static async Task getUserMusic(string key)
    {
        bool isKeyValidMusicType = new Regex("^(song|album|artist|collect)$").IsMatch(key.Trim());
        var  searchType          = EnumSearchType.song;
        var  musicType           = EnumMusicType.song;

        if (isKeyValidMusicType)
        {
            Enum.TryParse(key, out searchType);
            Enum.TryParse(key, out musicType);
        }
        int page = 1;

        while (true)
        {
            dynamic obj = null;
            if (key == "daily")
            {
                obj = await XiamiClient.GetDefault().Call_xiami_api("Recommend.DailySongs");
            }
            else if (key == "guess")
            {
                if (!isGuessUsed)
                {
                    await Http.Get("http://www.xiami.com/index/feeds", null);

                    isGuessUsed = true;
                }
                musicType  = EnumMusicType.all;
                searchType = EnumSearchType.all;
                var html = await Http.Get(string.Format(XiamiUrl.url_recommend_guess, page), null);

                var doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(html);
                obj      = new JObject();
                obj.alls = new JArray();
                HtmlNodeCollection nodes = null;
                nodes = doc.DocumentNode.SelectNodes("*[contains(concat(' ', @class, ' '), ' album ')]");
                if (nodes != null)
                {
                    foreach (var x in nodes)
                    {
                        string id, name, artist_id, artist_name;
                        string logo = x.SelectSingleNode(".//img").Attributes["src"].Value;
                        getIdName(x, "/album/", out id, out name);
                        getIdName(x, "/artist/", out artist_id, out artist_name);
                        try
                        {
                            obj.alls.Add(JObject.Parse(string.Format(@"
                            {{
                                Type: 'album',
                                album_id : '{0}',
                                album_name : '{1}',
                                artist_id : '{2}',
                                artist_name : '{3}',
                                logo:'{4}',
                            }}", id, name, artist_id, artist_name, logo)));
                        }
                        catch
                        {
                        }
                    }
                }
                nodes = doc.DocumentNode.SelectNodes("*[contains(concat(' ', @class, ' '), ' collect ')]");
                if (nodes != null)
                {
                    foreach (var x in nodes)
                    {
                        string id, name, artist_id, artist_name;
                        string logo = x.SelectSingleNode(".//img").Attributes["src"].Value;
                        getIdName(x, "/song/showcollect/id/", out id, out name);
                        getIdName(x, "/u/", out artist_id, out artist_name);
                        try
                        {
                            obj.alls.Add(JObject.Parse(string.Format(@"
                    {{
                        Type: 'collect',
                        list_id : '{0}',
                        collect_name : '{1}',
                        user_id : '{2}',
                        user_name : '{3}',
                        logo:'{4}',
                    }}", id, name, artist_id, artist_name, logo)));
                        }
                        catch
                        {
                        }
                    }
                }
            }
            else if (key == "collect_recommend")
            {
                musicType  = EnumMusicType.collect;
                searchType = EnumSearchType.collect;
                obj        = await XiamiClient.GetDefault().Call_xiami_api("Collects.recommend");
            }
            else if (isKeyValidMusicType)
            {
                obj = await NetAccess.Json(XiamiUrl.url_lib_music, "music", key, "uid", Global.AppSettings["xiami_uid"], "page", page.ToString());
            }
            else
            {
                Logger.Error(new Exception("user:"******" is not supported"));
                break;
            }
            if (obj == null)
            {
                break;
            }
            var items = new List <IMusic>();
            if (obj[musicType.ToString() + "s"] != null)
            {
                obj = obj[musicType.ToString() + "s"] as dynamic;
            }
            foreach (dynamic item in obj)
            {
                try
                {
                    EnumMusicType t = musicType;
                    if (item["Type"] != null)
                    {
                        Enum.TryParse(item["Type"].ToString(), out t);
                    }
                    items.Add(MusicFactory.CreateFromJson(item, t));
                }
                catch (Exception e)
                {
                }
            }
            var sr = new SearchResult {
                Keyword = "user:"******"song")
            {
                foreach (Song item in sr.Items)
                {
                    item.InFav = true;
                }
            }
            SearchManager.notifyState(sr);
            //if (obj.more != null && obj.more != "true")
            //    break;
            page++;
        }
    }
        void btn_import_click(object sender, RoutedEventArgs e)
        {
            var dir = Global.AppSettings["DownloadFolder"];

            Task.Run(async() =>
            {
                var buffer       = new List <IMusic>();
                int bufferLength = 10;
                var mp3s         = Directory.EnumerateFiles(dir, "*.mp3").ToArray();
                foreach (var item in mp3s)
                {
                    try
                    {
                        var mp3  = TagLib.File.Create(item);
                        var tags = mp3.Tag;
                        if (tags.Comment == null)
                        {
                            continue;
                        }
                        var id       = "";
                        var artistid = "";
                        var albumid  = "";
                        var logo     = "";
                        var m        = reg_ids.Match(tags.Comment);
                        if (!m.Success)
                        {
                            m = reg.Match(tags.Comment);
                            if (!m.Success)
                            {
                                continue;
                            }
                            id           = m.Groups[1].Value;
                            var obj      = await NetAccess.Json(XiamiUrl.url_song, "id", id);
                            artistid     = MusicHelper.Get(obj["song"], "artist_id");
                            albumid      = MusicHelper.Get(obj["song"], "album_id");
                            logo         = StringHelper.EscapeUrl(MusicHelper.Get(obj["song"], "logo"));
                            tags.Comment = string.Join(" ", new[] { id, artistid, albumid });
                            mp3.Save();
                        }
                        else
                        {
                            id       = m.Groups[1].Value;
                            artistid = m.Groups[2].Value;
                            albumid  = m.Groups[3].Value;
                        }
                        var art = System.IO.Path.Combine(Global.BasePath, "cache", albumid + ".art");
                        if (!File.Exists(art))
                        {
                            if (string.IsNullOrEmpty(logo))
                            {
                                var obj = await NetAccess.Json(XiamiUrl.url_song, "id", id);
                                logo    = StringHelper.EscapeUrl(MusicHelper.Get(obj["song"], "logo"));
                            }
                            await new System.Net.WebClient().DownloadFileTaskAsync(logo, art);
                        }
                        var song = new Song
                        {
                            Id         = id,
                            ArtistId   = artistid,
                            AlbumId    = albumid,
                            Name       = tags.Title,
                            ArtistName = tags.FirstPerformer,
                            AlbumName  = tags.Album,
                            FilePath   = item,
                            Logo       = logo,
                        };
                        buffer.Add(song);
                    }
                    catch
                    {
                    }
                    if (buffer.Count == bufferLength)
                    {
                        var songs = new List <IMusic>();
                        foreach (var s in buffer.OfType <Song>())
                        {
                            SongViewModel.Get(s).HasMp3 = true;
                        }
                        songs.AddRange(buffer);
                        Items.AddItems(songs);
                        buffer.Clear();
                    }
                }
                if (buffer.Count > 0)
                {
                    foreach (var s in buffer.OfType <Song>())
                    {
                        SongViewModel.Get(s).HasMp3 = true;
                    }
                    Items.AddItems(buffer);
                }
            });
        }