/// <summary>
        /// Tries to find information on a particular song.
        /// </summary>
        /// <param name="song">The song to search for.</param>
        /// <param name="locale">The locale for narrowing the search.</param>
        /// <returns></returns>
        public async override Task TryFindSongAsync(ExtendedSongMetadata song, string locale = "JP")
        {
            var recordingQuery = new Hqub.MusicBrainz.API.QueryParameters <Hqub.MusicBrainz.API.Entities.Recording>();

            //artistQuery.Add("inc", "url-rels");

            recordingQuery.Add("artist", song.Artist);

            recordingQuery.Add("recording", song.Track);

            recordingQuery.Add("country", locale);

            var recordingResults = await Recording.SearchAsync(recordingQuery);

            var recording = recordingResults?.Items.FirstOrDefault();

            if (recording != null)
            {
                song.SongLength = TimeSpan.FromMilliseconds(recording.Length);
            }
        }
Пример #2
0
        private void ExtractFeaturedArtists(ExtendedSongMetadata originalMetadata)
        {
            //try to strip out "Feat." artists

            /* Formats:
             * - ArtistA & ArtistB | ([a-zA-Z1-9\w\.\~\-\']+)\s*(&|and|And|AND)\s*([a-zA-Z1-9\w\.\~\-\']+)
             * - ArtistA (F|f)eat. ArtistB ((,|%|and) ArtistC)*
             * - ArtistA, ArtistB .... (& ArtistC) |  e.g. 'Minase Inori, Hanazawa Kana, Iguchi Yuka & Hayami Saori' | s.Split(',', '&').Select(y => y.Trim());
             * - ArtistA x ArtistB
             */

            var artists = originalMetadata.Artist
                          .Split(new string[] { ",", "&", "ft.", "feat.", "Feat.", "FEAT.", " x " }, StringSplitOptions.None).Select(y => y.Trim());

            if (artists.Count() >= 1)
            {
                originalMetadata.Artist = artists.ElementAt(0);
            }

            if (artists.Count() > 1)
            {
                originalMetadata.FeaturedArtists = artists.Skip(1).ToArray();
            }
        }
Пример #3
0
 /// <summary>
 /// Tries to find information on a particular song.
 /// </summary>
 /// <param name="song">The song to search for.</param>
 /// <param name="locale">The locale for narrowing the search.</param>
 /// <returns></returns>
 public abstract Task TryFindSongAsync(ExtendedSongMetadata song, string locale = "JP");
Пример #4
0
        public async Task <bool> FindAdditionalMetadataAsync(ExtendedSongMetadata originalMetadata)
        {
            if (!IsInitialized)
            {
                return(false);
            }

            //Checks if original metadata is null.
            if (originalMetadata == null)
            {
                throw new ArgumentNullException(nameof(originalMetadata));
            }
            //Checks if Unknown Metadata was passed ("Unknown Song - Unknown Artist").
            if (originalMetadata.IsUnknownMetadata)
            {
                throw new ArgumentException("Unknown metadata was passed.", nameof(originalMetadata));
            }

            //Checks if we're on battery saver mode.
            if (Windows.System.Power.PowerManager.EnergySaverStatus == Windows.System.Power.EnergySaverStatus.On)
            {
                return(false);
            }

            //We're not on battery saver mode. Let's check to see if we're on a metered network or roaming.
            if (NepApp.Network.NetworkUtilizationBehavior != NepAppNetworkManager.NetworkDeterminedAppBehaviorStyle.Normal)
            {
                return(false);
            }

            //We're not metered or roaming. Lastly, lets check if the user wants us to find song metadata.
            if (!(bool)NepApp.Settings.GetSetting(AppSettings.TryToFindSongMetadata))
            {
                return(false);
            }


            AlbumData  albumData  = null;
            ArtistData artistData = null;
            var        station    = await NepApp.Stations.GetStationByNameAsync(originalMetadata.StationPlayedOn);

            ExtractFeaturedArtists(originalMetadata);

            //First, grab album data from musicbrainz.
            albumData = await musicBrainzSource.TryFindAlbumAsync(originalMetadata.Track, originalMetadata.Artist, station.PrimaryLocale);

            //Next, try and figure out the artist
            var builtInArtist = FindBuiltInArtist(originalMetadata.Artist, station.PrimaryLocale);

            if (builtInArtist == null)
            {
                builtInArtist = FindBuiltInArtistInsideInArtistMetadata(originalMetadata.Artist, station.PrimaryLocale);
            }
            if (builtInArtist != null)
            {
                if (builtInArtist.MusicBrainzUrl != null)
                {
                    //Grab MusicBrainz information directly from the url.

                    string artistID = musicBrainzSource.ExtractIDFromUri(builtInArtist.MusicBrainzUrl);
                    artistData = await musicBrainzSource.GetArtistAsync(artistID, builtInArtist.CountryOfOrigin ?? "JP");
                }

                if (builtInArtist.JPopAsiaUrl != null)
                {
                    originalMetadata.JPopAsiaArtistInfo = await JPopAsiaArtistFetcher.GetArtistDataOnJPopAsiaAsync(builtInArtist.Name, builtInArtist.JPopAsiaUrl);
                }
            }
            else
            {
                await Task.Delay(500); //500 ms sleep

                //Next, try and grab artist data from musicbrainz.
                artistData = await musicBrainzSource.TryFindArtistAsync(originalMetadata.Artist, station.PrimaryLocale);

                //Grab information about the artist from JPopAsia.com
                originalMetadata.JPopAsiaArtistInfo = await JPopAsiaArtistFetcher.FindArtistDataOnJPopAsiaAsync(originalMetadata.Artist.Trim(), station.PrimaryLocale);
            }

            //Grab a background of the artist from FanArtTV.com
            originalMetadata.FanArtTVBackgroundUrl = await FanArtTVFetcher.FetchArtistBackgroundAsync(originalMetadata.Artist.Trim(), station.PrimaryLocale);


            //todo cache
            originalMetadata.Album      = albumData;
            originalMetadata.ArtistInfo = artistData;

            return(true);
        }