Example #1
0
        public async Task <AudioDbTrack> GetTrackByMbidAsync(string mbid, string language, bool cacheOnly)
        {
            AudioDbTracks audioDbTracks = null;
            string        cache         = CreateAndGetCacheName(mbid, "Track_mbId");

            if (!string.IsNullOrEmpty(cache) && File.Exists(cache))
            {
                audioDbTracks = await _downloader.ReadCacheAsync <AudioDbTracks>(cache).ConfigureAwait(false);
            }
            else
            {
                if (cacheOnly)
                {
                    return(null);
                }
                string url = GetUrl(URL_TRACK_BY_MBDB, mbid);
                audioDbTracks = await _downloader.DownloadAsync <AudioDbTracks>(url, cache).ConfigureAwait(false);
            }
            if (audioDbTracks.Tracks != null && audioDbTracks.Tracks.Count > 0)
            {
                AudioDbTrack track = audioDbTracks.Tracks.Where(t => t.TrackID > 0).FirstOrDefault();
                if (track != null)
                {
                    track.SetLanguage(language);
                }
                return(track);
            }
            return(null);
        }
Example #2
0
        public AudioDbTrack GetTrack(long tadbTrackId, string language, bool cacheOnly)
        {
            AudioDbTracks audioDbTracks = null;
            string        cache         = CreateAndGetCacheName(tadbTrackId, "Track");

            if (!string.IsNullOrEmpty(cache) && File.Exists(cache))
            {
                audioDbTracks = _downloader.ReadCache <AudioDbTracks>(cache);
            }
            else
            {
                if (cacheOnly)
                {
                    return(null);
                }
                string url = GetUrl(URL_TRACK_BY_TADB, tadbTrackId);
                audioDbTracks = _downloader.Download <AudioDbTracks>(url, cache);
            }
            if (audioDbTracks.Tracks != null && audioDbTracks.Tracks.Count > 0)
            {
                AudioDbTrack track = audioDbTracks.Tracks.Where(t => t.TrackID > 0).FirstOrDefault();
                if (track != null)
                {
                    track.SetLanguage(language);
                }
                return(track);
            }
            return(null);
        }
        public override async Task <bool> UpdateFromOnlineMusicTrackAsync(TrackInfo track, string language, bool cacheOnly)
        {
            try
            {
                bool         cacheIncomplete = false;
                AudioDbTrack trackDetail     = null;
                language = language ?? PreferredLanguage;

                if (track.AudioDbId > 0)
                {
                    trackDetail = await _audioDbHandler.GetTrackAsync(track.AudioDbId, language, cacheOnly).ConfigureAwait(false);
                }
                //Musicbrainz Id can be unreliable in this regard because it is linked to a recording and the same recording can
                //be across multiple different albums. In other words the Id is unique per song not per album song, so using this can
                //lead to the wrong album id.
                //if (trackDetail == null && !string.IsNullOrEmpty(track.MusicBrainzId))
                //  trackDetail = _audioDbHandler.GetTrackByMbid(track.MusicBrainzId, language, cacheOnly);
                if (trackDetail == null && track.TrackNum > 0 && (track.AlbumAudioDbId > 0 || !string.IsNullOrEmpty(track.AlbumMusicBrainzGroupId)))
                {
                    List <AudioDbTrack> foundTracks = await _audioDbHandler.GetTracksByAlbumIdAsync(track.AlbumAudioDbId, language, cacheOnly).ConfigureAwait(false);

                    if (foundTracks == null && !string.IsNullOrEmpty(track.AlbumMusicBrainzGroupId))
                    {
                        List <AudioDbAlbum> foundAlbums = await _audioDbHandler.GetAlbumByMbidAsync(track.AlbumMusicBrainzGroupId, language, cacheOnly).ConfigureAwait(false);

                        if (foundAlbums != null && foundAlbums.Count == 1)
                        {
                            var albumDetail = await _audioDbHandler.GetAlbumAsync(foundAlbums[0].AlbumId, language, cacheOnly).ConfigureAwait(false);

                            if (albumDetail != null)
                            {
                                foundTracks = await _audioDbHandler.GetTracksByAlbumIdAsync(albumDetail.AlbumId, language, cacheOnly).ConfigureAwait(false);
                            }
                        }
                    }

                    if (foundTracks != null && foundTracks.Count > 0)
                    {
                        trackDetail = foundTracks.FirstOrDefault(t => t.TrackNumber == track.TrackNum);
                    }
                }
                if (trackDetail == null)
                {
                    return(false);
                }

                //Get the track into the cache
                AudioDbTrack trackTempDetail = await _audioDbHandler.GetTrackAsync(trackDetail.TrackID, language, cacheOnly).ConfigureAwait(false);

                if (trackTempDetail != null)
                {
                    trackDetail = trackTempDetail;
                }

                track.AudioDbId               = trackDetail.TrackID;
                track.LyricId                 = trackDetail.LyricID.HasValue ? trackDetail.LyricID.Value : 0;
                track.MvDbId                  = trackDetail.MvDbID.HasValue ? trackDetail.MvDbID.Value : 0;
                track.MusicBrainzId           = trackDetail.MusicBrainzID;
                track.AlbumAudioDbId          = trackDetail.AlbumID.HasValue ? trackDetail.AlbumID.Value : 0;
                track.AlbumMusicBrainzGroupId = trackDetail.MusicBrainzAlbumID;

                track.TrackName   = trackDetail.Track;
                track.Album       = trackDetail.Album;
                track.TrackNum    = trackDetail.TrackNumber;
                track.DiscNum     = trackDetail.CD.HasValue ? trackDetail.CD.Value : 1;
                track.Rating      = new SimpleRating(trackDetail.Rating, trackDetail.RatingCount);
                track.TrackLyrics = trackDetail.TrackLyrics;
                track.Duration    = trackDetail.Duration.HasValue ? trackDetail.Duration.Value / 1000 : 0;

                if (trackDetail.ArtistID.HasValue)
                {
                    track.Artists      = ConvertToPersons(trackDetail.ArtistID.Value, trackDetail.MusicBrainzArtistID, trackDetail.Artist, PersonAspect.OCCUPATION_ARTIST, trackDetail.Track, trackDetail.Album);
                    track.AlbumArtists = ConvertToPersons(trackDetail.ArtistID.Value, trackDetail.MusicBrainzArtistID, trackDetail.Artist, PersonAspect.OCCUPATION_ARTIST, trackDetail.Track, trackDetail.Album);
                }

                if (!string.IsNullOrEmpty(trackDetail.Genre?.Trim()))
                {
                    track.Genres.Add(new GenreInfo {
                        Name = trackDetail.Genre.Trim()
                    });
                }

                if (trackDetail.AlbumID.HasValue)
                {
                    AudioDbAlbum album = await _audioDbHandler.GetAlbumAsync(trackDetail.AlbumID.Value, language, cacheOnly).ConfigureAwait(false);

                    if (cacheOnly && album == null)
                    {
                        cacheIncomplete = true;
                    }
                    if (album != null && album.LabelId.HasValue)
                    {
                        track.MusicLabels = ConvertToCompanies(album.LabelId.Value, album.Label, CompanyAspect.COMPANY_MUSIC_LABEL);
                    }
                }

                return(!cacheIncomplete);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TheAudioDbWrapper: Exception while processing track {0}", ex, track.ToString());
                return(false);
            }
        }