private void ExtractFanArt(Guid mediaItemId, IDictionary <Guid, IList <MediaItemAspect> > aspects, Guid?albumMediaItemId, IDictionary <Guid, string> artistMediaItems)
        {
            if (aspects.ContainsKey(AudioAspect.ASPECT_ID))
            {
                if (BaseInfo.IsVirtualResource(aspects))
                {
                    return;
                }

                TrackInfo trackInfo = new TrackInfo();
                trackInfo.FromMetadata(aspects);
                bool      forceFanart = !trackInfo.IsRefreshed;
                AlbumInfo albumInfo   = trackInfo.CloneBasicInstance <AlbumInfo>();
                ExtractLocalImages(aspects, albumMediaItemId, artistMediaItems, albumInfo.ToString());
                if (!AudioMetadataExtractor.SkipFanArtDownload)
                {
                    OnlineMatcherService.Instance.DownloadAudioFanArt(mediaItemId, trackInfo, forceFanart);
                }

                if (albumMediaItemId.HasValue && !_checkCache.Contains(albumMediaItemId.Value))
                {
                    if (!AudioMetadataExtractor.SkipFanArtDownload)
                    {
                        OnlineMatcherService.Instance.DownloadAudioFanArt(albumMediaItemId.Value, albumInfo, forceFanart);
                    }
                    _checkCache.Add(albumMediaItemId.Value);
                }
            }
            else if (aspects.ContainsKey(PersonAspect.ASPECT_ID))
            {
                PersonInfo personInfo = new PersonInfo();
                personInfo.FromMetadata(aspects);
                if (personInfo.Occupation == PersonAspect.OCCUPATION_ARTIST || personInfo.Occupation == PersonAspect.OCCUPATION_COMPOSER)
                {
                    if (!AudioMetadataExtractor.SkipFanArtDownload)
                    {
                        OnlineMatcherService.Instance.DownloadAudioFanArt(mediaItemId, personInfo, !personInfo.IsRefreshed);
                    }
                }
            }
            else if (aspects.ContainsKey(CompanyAspect.ASPECT_ID))
            {
                CompanyInfo companyInfo = new CompanyInfo();
                companyInfo.FromMetadata(aspects);
                if (companyInfo.Type == CompanyAspect.COMPANY_MUSIC_LABEL)
                {
                    if (!AudioMetadataExtractor.SkipFanArtDownload)
                    {
                        OnlineMatcherService.Instance.DownloadAudioFanArt(mediaItemId, companyInfo, !companyInfo.IsRefreshed);
                    }
                }
            }
        }
Example #2
0
        protected async Task ExtractAlbumAndArtistFanArt(Guid mediaItemId, IDictionary <Guid, IList <MediaItemAspect> > aspects)
        {
            bool             shouldCacheLocal = false;
            IResourceLocator mediaItemLocator = null;

            if (!BaseInfo.IsVirtualResource(aspects))
            {
                mediaItemLocator = GetResourceLocator(aspects);

                //Whether local fanart should be stored in the fanart cache
                shouldCacheLocal = ShouldCacheLocalFanArt(mediaItemLocator.NativeResourcePath,
                                                          AudioMetadataExtractor.CacheLocalFanArt, AudioMetadataExtractor.CacheOfflineFanArt);
            }

            if (mediaItemLocator == null)
            {
                return;
            }

            if (!shouldCacheLocal && AudioMetadataExtractor.SkipFanArtDownload)
            {
                return; //Nothing to do
            }
            TrackInfo trackInfo = new TrackInfo();

            trackInfo.FromMetadata(aspects);
            AlbumInfo albumInfo  = trackInfo.CloneBasicInstance <AlbumInfo>();
            string    albumTitle = albumInfo.ToString();

            ResourcePath albumDirectory = null;

            if (shouldCacheLocal)
            {
                albumDirectory = ResourcePathHelper.Combine(mediaItemLocator.NativeResourcePath, "../");
                if (AudioMetadataExtractor.IsDiscFolder(albumTitle, albumDirectory.FileName))
                {
                    //Probably a CD folder so try next parent
                    albumDirectory = ResourcePathHelper.Combine(albumDirectory, "../");
                }
            }

            //Artist fanart may be stored in the album directory, so get the artists now
            IList <Tuple <Guid, string> > artists = GetArtists(aspects);

            //Album fanart
            if (RelationshipExtractorUtils.TryGetLinkedId(AudioAlbumAspect.ROLE_ALBUM, aspects, out Guid albumMediaItemId) &&
                AddToCache(albumMediaItemId))
            {
                if (shouldCacheLocal)
                {
                    //If the track is not a stub, Store track tag images in the album
                    if (!aspects.ContainsKey(ReimportAspect.ASPECT_ID) && MediaItemAspect.TryGetAttribute(aspects, MediaAspect.ATTR_ISSTUB, out bool isStub) && isStub == false)
                    {
                        await ExtractTagFanArt(mediaItemLocator, albumMediaItemId, albumTitle);
                    }
                    await ExtractAlbumFolderFanArt(mediaItemLocator.NativeSystemId, albumDirectory, albumMediaItemId, albumTitle, artists).ConfigureAwait(false);
                }
                if (!AudioMetadataExtractor.SkipFanArtDownload)
                {
                    await OnlineMatcherService.Instance.DownloadAudioFanArtAsync(albumMediaItemId, albumInfo).ConfigureAwait(false);
                }
            }

            if (shouldCacheLocal && artists != null)
            {
                await ExtractArtistFolderFanArt(mediaItemLocator.NativeSystemId, albumDirectory, artists).ConfigureAwait(false);
            }
        }
        public override async Task <bool> UpdateFromOnlineMusicTrackAlbumAsync(AlbumInfo album, string language, bool cacheOnly)
        {
            try
            {
                bool         cacheIncomplete = false;
                AudioDbAlbum albumDetail     = null;
                language = language ?? PreferredLanguage;

                if (album.AudioDbId > 0)
                {
                    albumDetail = await _audioDbHandler.GetAlbumAsync(album.AudioDbId, language, cacheOnly).ConfigureAwait(false);
                }
                if (albumDetail == null && !string.IsNullOrEmpty(album.MusicBrainzGroupId))
                {
                    List <AudioDbAlbum> foundAlbums = await _audioDbHandler.GetAlbumByMbidAsync(album.MusicBrainzGroupId, language, cacheOnly).ConfigureAwait(false);

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

                bool languageSet = albumDetail.SetLanguage(language);

                album.AudioDbId          = albumDetail.AlbumId;
                album.MusicBrainzGroupId = albumDetail.MusicBrainzID;
                album.AmazonId           = albumDetail.AmazonID;
                album.ItunesId           = albumDetail.ItunesID;

                album.Album       = albumDetail.Album;
                album.Description = new SimpleTitle(albumDetail.Description, !languageSet);

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

                album.Sales       = albumDetail.Sales ?? 0;
                album.ReleaseDate = albumDetail.Year.HasValue && albumDetail.Year.Value > 1900 ? new DateTime(albumDetail.Year.Value, 1, 1) : default(DateTime?);
                album.Rating      = new SimpleRating(albumDetail.Rating, albumDetail.RatingCount);

                if (albumDetail.ArtistId.HasValue)
                {
                    album.Artists = ConvertToPersons(albumDetail.ArtistId.Value, albumDetail.MusicBrainzArtistID, albumDetail.Artist, PersonAspect.OCCUPATION_ARTIST, null, albumDetail.Album);
                }

                if (albumDetail.LabelId.HasValue)
                {
                    album.MusicLabels = ConvertToCompanies(albumDetail.LabelId.Value, albumDetail.Label, CompanyAspect.COMPANY_MUSIC_LABEL);
                }

                List <AudioDbTrack> albumTracks = await _audioDbHandler.GetTracksByAlbumIdAsync(albumDetail.AlbumId, language, cacheOnly).ConfigureAwait(false);

                if (cacheOnly && albumTracks == null)
                {
                    cacheIncomplete = true;
                }
                if (albumTracks != null && albumTracks.Count > 0)
                {
                    album.TotalTracks = albumTracks.Count;

                    foreach (AudioDbTrack trackDetail in albumTracks)
                    {
                        TrackInfo track = new TrackInfo();
                        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.AlbumAmazonId           = albumDetail.AmazonID;
                        track.AlbumItunesId           = albumDetail.ItunesID;

                        track.TrackName   = trackDetail.Track;
                        track.Album       = albumDetail.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, albumDetail.Album);
                        }

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

                        track.AlbumArtists = album.Artists.ToList();
                        track.MusicLabels  = album.MusicLabels.ToList();

                        album.Tracks.Add(track);
                    }
                }

                return(!cacheIncomplete);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("TheAudioDbWrapper: Exception while processing album {0}", ex, album.ToString());
                return(false);
            }
        }
        public override async Task <bool> UpdateFromOnlineMusicTrackAlbumAsync(AlbumInfo album, string language, bool cacheOnly)
        {
            try
            {
                TrackRelease albumDetail = null;
                if (!string.IsNullOrEmpty(album.MusicBrainzId))
                {
                    albumDetail = await _musicBrainzHandler.GetAlbumAsync(album.MusicBrainzId, cacheOnly).ConfigureAwait(false);
                }
                if (albumDetail == null)
                {
                    return(false);
                }

                album.MusicBrainzId      = albumDetail.Id;
                album.AmazonId           = albumDetail.AmazonId;
                album.MusicBrainzGroupId = albumDetail.ReleaseGroup != null ? albumDetail.ReleaseGroup.Id : null;

                album.Album       = albumDetail.Title;
                album.TotalTracks = albumDetail.TrackCount;
                album.ReleaseDate = albumDetail.Date;

                album.Artists = ConvertToPersons(albumDetail.Artists, PersonAspect.OCCUPATION_ARTIST);

                if (albumDetail.Labels != null)
                {
                    album.MusicLabels = ConvertToCompanies(albumDetail.Labels, CompanyAspect.COMPANY_MUSIC_LABEL);
                }

                foreach (TrackMedia media in albumDetail.Media)
                {
                    if (media.Tracks == null || media.Tracks.Count <= 0)
                    {
                        continue;
                    }

                    if (media.Tracks.Count == album.TotalTracks || album.TotalTracks == 0)
                    {
                        foreach (TrackData trackDetail in media.Tracks)
                        {
                            TrackInfo track = new TrackInfo();
                            track.MusicBrainzId      = trackDetail.Id;
                            track.AlbumMusicBrainzId = albumDetail.Id;

                            track.TrackName   = trackDetail.Title;
                            track.Album       = albumDetail.Title;
                            track.TotalTracks = album.TotalTracks;
                            track.DiscNum     = album.DiscNum;
                            track.ReleaseDate = album.ReleaseDate;

                            int trackNo = 0;
                            if (int.TryParse(trackDetail.Number, out trackNo))
                            {
                                track.TrackNum = trackNo;
                            }

                            track.Artists      = ConvertToPersons(trackDetail.Artists, PersonAspect.OCCUPATION_ARTIST);
                            track.AlbumArtists = ConvertToPersons(albumDetail.Artists, PersonAspect.OCCUPATION_ARTIST);

                            album.Tracks.Add(track);
                        }
                    }
                    return(true);
                }

                return(true);
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("MusicBrainzWrapper: Exception while processing album {0}", ex, album.ToString());
                return(false);
            }
        }
        public override Task <bool> UpdateFromOnlineMusicTrackAlbumAsync(AlbumInfo album, string language, bool cacheOnly)
        {
            try
            {
                if (string.IsNullOrEmpty(album.CdDdId))
                {
                    return(Task.FromResult(false));
                }

                //TODO: Split CDDB ID into disc id and genre?
                string discId = null;

                FreeDBCDInfoDetail discInfo;
                if (GetCachedDisc(discId, out discInfo))
                {
                    album.Album       = discInfo.Title;
                    album.Artists     = ConvertToPersons(discInfo.Artist, PersonAspect.OCCUPATION_ARTIST);
                    album.TotalTracks = discInfo.Tracks.Count();
                    album.ReleaseDate = discInfo.Year > 0 ? new DateTime(discInfo.Year, 1, 1) : default(DateTime?);
                    if (!album.DataProviders.Contains(_name))
                    {
                        album.DataProviders.Add(_name);
                    }

                    foreach (FreeDBCDTrackDetail trackDetail in discInfo.Tracks)
                    {
                        TrackInfo track = new TrackInfo()
                        {
                            AlbumCdDdId  = album.CdDdId,
                            Album        = discInfo.Title,
                            AlbumArtists = ConvertToPersons(discInfo.Artist, PersonAspect.OCCUPATION_ARTIST),
                            TotalTracks  = discInfo.Tracks.Count(),
                            ReleaseDate  = discInfo.Year > 0 ? new DateTime(discInfo.Year, 1, 1) : default(DateTime?),

                            TrackNum  = trackDetail.TrackNumber,
                            TrackName = trackDetail.Title,
                            Artists   = ConvertToPersons(trackDetail.Artist, PersonAspect.OCCUPATION_ARTIST),
                            Duration  = trackDetail.Duration
                        };
                        if (!track.DataProviders.Contains(_name))
                        {
                            track.DataProviders.Add(_name);
                        }
                        album.Tracks.Add(track);
                    }

                    return(Task.FromResult(true));
                }
                return(Task.FromResult(false));
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Debug("FreeDbWrapper: Exception while processing album {0}", ex, album.ToString());
                return(Task.FromResult(false));
            }
        }