/// <summary>
        /// Retrieve the equivalent item if it already exists in the database,
        /// if it does not, fill metadata using the metadata provider, download images and register the item to the
        /// database.
        /// </summary>
        /// <param name="item">The item to retrieve or fill and register</param>
        /// <typeparam name="T">The type of the item</typeparam>
        /// <returns>The existing or filled item.</returns>
        private async Task <T> _RegisterAndFill <T>(T item)
            where T : class, IResource, IThumbnails, IMetadata
        {
            if (item == null || string.IsNullOrEmpty(item.Slug))
            {
                return(null);
            }

            T existing = await _libraryManager.GetOrDefault <T>(item.Slug);

            if (existing != null)
            {
                await _libraryManager.Load(existing, x => x.ExternalIDs);

                return(existing);
            }

            item = await _metadataProvider.Get(item);

            await _thumbnailsManager.DownloadImages(item);

            switch (item)
            {
            case Show show when show.People != null:
                foreach (PeopleRole role in show.People)
                {
                    await _thumbnailsManager.DownloadImages(role.People);
                }
                break;

            case Season season:
                season.Title ??= $"Season {season.SeasonNumber}";
                break;
            }

            return(await _libraryManager.CreateIfNotExists(item));
        }