/// <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); } }
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(); } }
/// <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");
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); }