Пример #1
0
        public Task AddArtist(Artist artist)
        {
            ArtistDictionary.Add(artist.Guid, artist);

            _imageProvider.AddImage(artist.SmallImage);
            _imageProvider.AddImage(artist.MediumImage);
            _imageProvider.AddImage(artist.LargeImage);

            using (
                var command =
                    new SQLiteCommand(
                        "INSERT INTO `Artists` (Name, MusicBrainzId, Url, Guid, SmallImage, MediumImage, LargeImage) VALUES (@name, @musicBrainzId, @url, @guid, @smallImage, @mediumImage, @largeImage)",
                        _connection))
            {
                command.Parameters.AddWithValue("@name", artist.Name);
                command.Parameters.AddWithValue("@musicBrainzId", artist.MusicBrainzId);
                command.Parameters.AddWithValue("@url", artist.Url);
                command.Parameters.AddGuid("@guid", artist.Guid);
                command.Parameters.AddGuid("@smallImage", artist.SmallImage?.Guid);
                command.Parameters.AddGuid("@mediumImage", artist.MediumImage?.Guid);
                command.Parameters.AddGuid("@largeImage", artist.LargeImage?.Guid);

                return command.ExecuteNonQueryAsync();
            }
        }
Пример #2
0
        public async Task<Artist> SearchArtistOnline(string name)
        {
            Artist foundArtist;
            if (SearchArtist(name, out foundArtist))
                return foundArtist;

            using (var wc = new WebClient { Proxy = null })
            {
                ArtistSearchResult searchedArtists ;

                var s = (await
                    wc.DownloadStringTaskAsync(
                        $"http://ws.audioscrobbler.com/2.0/?method=artist.search&artist={Uri.EscapeDataString(name)}&api_key={SensitiveInformation.LastfmKey}&format=json&limit=1"))
                    .FixJsonString();
                try
                {
                    searchedArtists = JsonConvert.DeserializeObject<ArtistSearchResult>(s);
                }
                catch (JsonException)
                {
                    return null;
                }

                var match = searchedArtists?.results?.ArtistMatches?.artist;
                if (match == null)
                    return null;

                if (SearchArtist(match.name, out foundArtist))
                {
                    if (ArtistKeywords.ContainsKey(foundArtist))
                        ArtistKeywords[foundArtist].Add(name);
                    else
                        ArtistKeywords.Add(foundArtist, new List<string> {name});
                    
                    return foundArtist;
                }

                var artist = new Artist(match.name)
                {
                    MusicBrainzId = match.mbid,
                    Url = match.url
                };
                SetImages(artist, match.image);

                await Artists.AddArtist(artist);
                ArtistKeywords.Add(artist, new List<string> { name });
                return artist;
            }
        }
Пример #3
0
        private static void SetImages(Artist artist, List <Image> images)
        {
            if (images == null || images.Count == 0)
            {
                return;
            }
            images = images.Where(x => !string.IsNullOrEmpty(x.text)).ToList();
            if (images.Count == 0)
            {
                return;
            }

            artist.SmallImage  = GetSmallImage(images);
            artist.MediumImage = GetMediumImage(images);
            artist.LargeImage  = GetBestImage(images);
        }
Пример #4
0
 public async Task <Artist> GetArtistByMusicbrainzId(string musicbrainzId, CultureInfo culture)
 {
     using (var wc = new WebClient {
         Proxy = null
     })
     {
         var artistInfo =
             JsonConvert.DeserializeObject <GetArtistInfoResult>(
                 (await
                  wc.DownloadStringTaskAsync(
                      $"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&mbid={musicbrainzId}&api_key={SensitiveInformation.LastfmKey}&format=json&lang={culture.TwoLetterISOLanguageName}"))
                 .FixJsonString());
         var artist = new Artist(artistInfo.artist.name)
         {
             MusicBrainzId = artistInfo.artist.mbid,
             Url           = artistInfo.artist.url
         };
         SetImages(artist, artistInfo.artist.image);
         return(artist);
     }
 }
Пример #5
0
        public async Task Load(SQLiteConnection connection)
        {
            using (var command = new SQLiteCommand("SELECT * FROM `Artists`", connection))
            {
                var reader = await command.ExecuteReaderAsync();
                while (await reader.ReadAsync())
                {
                    var id = reader.ReadGuid(3);
                    Artist artist;
                    if (id == UnknownArtistGuid)
                        artist = UnknownArtist;
                    else
                    {
                        artist = new Artist
                        {
                            Name = reader.GetString(0),
                            MusicBrainzId = reader.GetValue(1)?.ToString(),
                            Url = reader.GetValue(2)?.ToString(),
                            Guid = id
                        };
                    }

                    var temp = reader.ReadGuid(4);
                    if (temp != Guid.Empty)
                        artist.SmallImage = _imageProvider.Collection[temp];
                    temp = reader.ReadGuid(5);
                    if (temp != Guid.Empty)
                        artist.MediumImage = _imageProvider.Collection[temp];
                    temp = reader.ReadGuid(6);
                    if (temp != Guid.Empty)
                        artist.LargeImage = _imageProvider.Collection[temp];

                    ArtistDictionary.Add(artist.Guid, artist);
                    if (artist.Guid == UnknownArtistGuid)
                        UnknownArtist = artist;
                }
            }

            _connection = connection;
        }
Пример #6
0
        public bool SearchArtist(string name, out Artist artist)
        {
            var foundArtists =
                Artists.ArtistDictionary.Where(
                    x => string.Equals(x.Value.Name, name, StringComparison.OrdinalIgnoreCase)).ToList();

            if (foundArtists.Count > 0)
            {
                artist = foundArtists[0].Value;
                return(true);
            }

            var alreadyExistingArtist = ArtistKeywords.FirstOrDefault(x => x.Value.Contains(name)).Key;

            if (alreadyExistingArtist != null)
            {
                artist = alreadyExistingArtist;
                return(true);
            }

            artist = null;
            return(false);
        }
Пример #7
0
 public ArtistProvider(ImagesProvider imageProvider)
 {
     ArtistDictionary = new Dictionary<Guid, Artist>();
     UnknownArtist = new Artist {Guid = UnknownArtistGuid};
     _imageProvider = imageProvider;
 }
Пример #8
0
 private async void OpenArtist(Artist artist)
 {
     var artistView = new ArtistView(artist, () => IsSpecialViewOpen = false);
     await artistView.Load(MusicDataManager, _viewController, NotificationManager);
     SpecialView = artistView;
     IsSpecialViewOpen = true;
 }
Пример #9
0
        public async Task SetAdvancedInfoAboutArtist(Artist artist, CultureInfo culture)
        {
            if (artist.ProvidesAdvancedInfo)
                return;

            using (var wc = new WebClient {Proxy = null})
            {
                GetArtistInfoResult artistInfo;
                try
                {
                    var jsonString = (await
                        wc.DownloadStringTaskAsync(string.IsNullOrEmpty(artist.MusicBrainzId)
                            ? $"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist={Uri.EscapeDataString(artist.Name)}&autocorrect=1&api_key={SensitiveInformation.LastfmKey}&format=json&lang={culture.TwoLetterISOLanguageName}"
                            : $"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&mbid={artist.MusicBrainzId}&api_key={SensitiveInformation.LastfmKey}&format=json&lang={culture.TwoLetterISOLanguageName}"))
                        .FixJsonString();
                    artistInfo = JsonConvert.DeserializeObject<GetArtistInfoResult>(jsonString);
                }
                catch (JsonException)
                {
                    return;
                }

                if (string.IsNullOrEmpty(artist.MusicBrainzId))
                    artist.MusicBrainzId = artistInfo.artist.mbid;

                var topTracks = await 
                    wc.DownloadStringTaskAsync(string.IsNullOrEmpty(artist.MusicBrainzId)
                        ? $"http://ws.audioscrobbler.com/2.0/?method=artist.gettoptracks&artist={artist.Name}&api_key={SensitiveInformation.LastfmKey}&limit=10&format=json"
                        : $"http://ws.audioscrobbler.com/2.0/?method=artist.gettoptracks&mbid={artist.MusicBrainzId}&api_key={SensitiveInformation.LastfmKey}&limit=10&format=json");

                artist.Biography = Regex.Match(artistInfo.artist.bio.summary.Trim(), @"^(?<content>(.+))<a", RegexOptions.Singleline).Groups["content"].Value.Trim();
                if (string.IsNullOrWhiteSpace(artist.Biography))
                    artist.Biography = null;

                if (artistInfo.artist?.similar?.artist != null)
                {
                    var similarArtists = new List<Artist>();
                    foreach (var similarArtist in artistInfo.artist.similar.artist)
                    {
                        Artist existingArtist;
                        if (SearchArtist(similarArtist.name, out existingArtist))
                        {
                            similarArtists.Add(existingArtist);
                            break;
                        }

                        var newArtist = new Artist(similarArtist.name)
                        {
                            Url = similarArtist.url
                        };

                        SetImages(newArtist, similarArtist.image);
                        await Artists.AddArtist(newArtist);
                        similarArtists.Add(newArtist);
                    }
                    artist.SimilarArtists = similarArtists;
                }

                GetTopTracksResult topTrackResult;
                try
                {
                    topTrackResult =
                        JsonConvert.DeserializeObject<GetTopTracksResult>(topTracks.FixJsonString());
                }
                catch (JsonException)
                {
                    return;
                }
                artist.TopTracks = topTrackResult.toptracks?.track?.Where(x => !string.IsNullOrWhiteSpace(x.duration)).Select(x => new TopTrack
                {
                    Artist = artist,
                    Duration = TimeSpan.FromMilliseconds(int.Parse(x.duration)),
                    MusicbrainzId = x.mbid,
                    Name = x.name,
                    Url = x.url,
                    Thumbnail =
                        x.image?.Count > 0
                            ? GetBestImage(x.image)
                            : null
                }).ToList();
            }
            artist.ProvidesAdvancedInfo = true;
        }
Пример #10
0
        private static void SetImages(Artist artist, List<Image> images)
        {
            if (images == null || images.Count == 0) return;
            images = images.Where(x => !string.IsNullOrEmpty(x.text)).ToList();
            if (images.Count == 0)
                return;

            artist.SmallImage = GetSmallImage(images);
            artist.MediumImage = GetMediumImage(images);
            artist.LargeImage = GetBestImage(images);
        }
Пример #11
0
 public ArtistView(Artist artist, Action closeView)
 {
     Artist = artist;
     _closeView = closeView;
 }
Пример #12
0
 public async Task<Artist> GetArtistByMusicbrainzId(string musicbrainzId, CultureInfo culture)
 {
     using (var wc = new WebClient {Proxy = null})
     {
         var artistInfo =
             JsonConvert.DeserializeObject<GetArtistInfoResult>(
                 (await
                     wc.DownloadStringTaskAsync(
                         $"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&mbid={musicbrainzId}&api_key={SensitiveInformation.LastfmKey}&format=json&lang={culture.TwoLetterISOLanguageName}"))
                     .FixJsonString());
         var artist = new Artist(artistInfo.artist.name)
         {
             MusicBrainzId = artistInfo.artist.mbid,
             Url = artistInfo.artist.url
         };
         SetImages(artist, artistInfo.artist.image);
         return artist;
     }
 }
Пример #13
0
        public async Task <Artist> SearchArtistOnline(string name)
        {
            Artist foundArtist;

            if (SearchArtist(name, out foundArtist))
            {
                return(foundArtist);
            }

            using (var wc = new WebClient {
                Proxy = null
            })
            {
                ArtistSearchResult searchedArtists;

                var s = (await
                         wc.DownloadStringTaskAsync(
                             $"http://ws.audioscrobbler.com/2.0/?method=artist.search&artist={Uri.EscapeDataString(name)}&api_key={SensitiveInformation.LastfmKey}&format=json&limit=1"))
                        .FixJsonString();
                try
                {
                    searchedArtists = JsonConvert.DeserializeObject <ArtistSearchResult>(s);
                }
                catch (JsonException)
                {
                    return(null);
                }

                var match = searchedArtists?.results?.ArtistMatches?.artist;
                if (match == null)
                {
                    return(null);
                }

                if (SearchArtist(match.name, out foundArtist))
                {
                    if (ArtistKeywords.ContainsKey(foundArtist))
                    {
                        ArtistKeywords[foundArtist].Add(name);
                    }
                    else
                    {
                        ArtistKeywords.Add(foundArtist, new List <string> {
                            name
                        });
                    }

                    return(foundArtist);
                }

                var artist = new Artist(match.name)
                {
                    MusicBrainzId = match.mbid,
                    Url           = match.url
                };
                SetImages(artist, match.image);

                await Artists.AddArtist(artist);

                ArtistKeywords.Add(artist, new List <string> {
                    name
                });
                return(artist);
            }
        }
Пример #14
0
        public async Task SetAdvancedInfoAboutArtist(Artist artist, CultureInfo culture)
        {
            if (artist.ProvidesAdvancedInfo)
            {
                return;
            }

            using (var wc = new WebClient {
                Proxy = null
            })
            {
                GetArtistInfoResult artistInfo;
                try
                {
                    var jsonString = (await
                                      wc.DownloadStringTaskAsync(string.IsNullOrEmpty(artist.MusicBrainzId)
                            ? $"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist={Uri.EscapeDataString(artist.Name)}&autocorrect=1&api_key={SensitiveInformation.LastfmKey}&format=json&lang={culture.TwoLetterISOLanguageName}"
                            : $"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&mbid={artist.MusicBrainzId}&api_key={SensitiveInformation.LastfmKey}&format=json&lang={culture.TwoLetterISOLanguageName}"))
                                     .FixJsonString();
                    artistInfo = JsonConvert.DeserializeObject <GetArtistInfoResult>(jsonString);
                }
                catch (JsonException)
                {
                    return;
                }

                if (string.IsNullOrEmpty(artist.MusicBrainzId))
                {
                    artist.MusicBrainzId = artistInfo.artist.mbid;
                }

                var topTracks = await
                                wc.DownloadStringTaskAsync(string.IsNullOrEmpty(artist.MusicBrainzId)
                                                           ?$"http://ws.audioscrobbler.com/2.0/?method=artist.gettoptracks&artist={artist.Name}&api_key={SensitiveInformation.LastfmKey}&limit=10&format=json"
                                                           : $"http://ws.audioscrobbler.com/2.0/?method=artist.gettoptracks&mbid={artist.MusicBrainzId}&api_key={SensitiveInformation.LastfmKey}&limit=10&format=json");

                artist.Biography = Regex.Match(artistInfo.artist.bio.summary.Trim(), @"^(?<content>(.+))<a", RegexOptions.Singleline).Groups["content"].Value.Trim();
                if (string.IsNullOrWhiteSpace(artist.Biography))
                {
                    artist.Biography = null;
                }

                if (artistInfo.artist?.similar?.artist != null)
                {
                    var similarArtists = new List <Artist>();
                    foreach (var similarArtist in artistInfo.artist.similar.artist)
                    {
                        Artist existingArtist;
                        if (SearchArtist(similarArtist.name, out existingArtist))
                        {
                            similarArtists.Add(existingArtist);
                            break;
                        }

                        var newArtist = new Artist(similarArtist.name)
                        {
                            Url = similarArtist.url
                        };

                        SetImages(newArtist, similarArtist.image);
                        await Artists.AddArtist(newArtist);

                        similarArtists.Add(newArtist);
                    }
                    artist.SimilarArtists = similarArtists;
                }

                GetTopTracksResult topTrackResult;
                try
                {
                    topTrackResult =
                        JsonConvert.DeserializeObject <GetTopTracksResult>(topTracks.FixJsonString());
                }
                catch (JsonException)
                {
                    return;
                }
                artist.TopTracks = topTrackResult.toptracks?.track?.Where(x => !string.IsNullOrWhiteSpace(x.duration)).Select(x => new TopTrack
                {
                    Artist        = artist,
                    Duration      = TimeSpan.FromMilliseconds(int.Parse(x.duration)),
                    MusicbrainzId = x.mbid,
                    Name          = x.name,
                    Url           = x.url,
                    Thumbnail     =
                        x.image?.Count > 0
                            ? GetBestImage(x.image)
                            : null
                }).ToList();
            }
            artist.ProvidesAdvancedInfo = true;
        }
Пример #15
0
        public bool SearchArtist(string name, out Artist artist)
        {
            var foundArtists =
                Artists.ArtistDictionary.Where(
                    x => string.Equals(x.Value.Name, name, StringComparison.OrdinalIgnoreCase)).ToList();
            if (foundArtists.Count > 0)
            {
                artist = foundArtists[0].Value;
                return true;
            }

            var alreadyExistingArtist = ArtistKeywords.FirstOrDefault(x => x.Value.Contains(name)).Key;
            if (alreadyExistingArtist != null)
            {
                artist = alreadyExistingArtist;
                return true;
            }

            artist = null;
            return false;
        }
Пример #16
0
        public async Task<IPlayable> SearchTrack(Artist artist, string title)
        {
            PlayableBase result = null;
            var sw = Stopwatch.StartNew();
            foreach (var track in Tracks.Tracks.Where(x => x.Artist == artist))
            {
                if (track.Title.IndexOf(title, StringComparison.OrdinalIgnoreCase) > -1)
                {
                    result = track;
                    break;
                }
            }

            Debug.Print($"Search track in local collection: {sw.ElapsedMilliseconds} ms");

            if (result != null)
                return result;

            return
                await
                    MusicStreamingPluginManager.DefaultMusicStreaming.GetTrack(
                        $"{artist} - {title}");
        }
Пример #17
0
 public void OpenArtist(Artist artist)
 {
     _openArtistAction.Invoke(artist);
 }