diff options
96 files changed, 634 insertions, 530 deletions
diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs index dfa245c0e..605873322 100644 --- a/MediaBrowser.Api/Images/RemoteImageService.cs +++ b/MediaBrowser.Api/Images/RemoteImageService.cs @@ -378,7 +378,7 @@ namespace MediaBrowser.Api.Images /// <returns>System.String.</returns> private string GetFullCachePath(string filename) { - return Path.Combine(_appPaths.DownloadedImagesDataPath, filename.Substring(0, 1), filename); + return Path.Combine(_appPaths.CachePath, "remote-images", filename.Substring(0, 1), filename); } } } diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 139d8c6fb..836874db9 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.Audio /// <summary> /// Class Audio /// </summary> - public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo> + public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo>, IHasSeries { public Audio() { @@ -51,6 +51,15 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public string SeriesName + { + get + { + return Album; + } + } + /// <summary> /// Gets or sets the artist. /// </summary> diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index 8b8c1a6ff..51c8a8727 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -11,7 +11,7 @@ namespace MediaBrowser.Controller.Entities.Audio /// <summary> /// Class MusicAlbum /// </summary> - public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags, IHasLookupInfo<AlbumInfo> + public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags, IHasLookupInfo<AlbumInfo>, IHasSeries { public List<Guid> SoundtrackIds { get; set; } @@ -50,6 +50,15 @@ namespace MediaBrowser.Controller.Entities.Audio } } + [IgnoreDataMember] + public string SeriesName + { + get + { + return AlbumArtist; + } + } + /// <summary> /// Override this to true if class should be grouped under a container in indicies /// The container class should be defined via IndexContainer diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 01e8741af..b3b6361a7 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -256,7 +256,7 @@ namespace MediaBrowser.Controller.Entities private string _sortName; /// <summary> - /// Gets or sets the name of the sort. + /// Gets the name of the sort. /// </summary> /// <value>The name of the sort.</value> [IgnoreDataMember] diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs index 211067f9d..85cf60c52 100644 --- a/MediaBrowser.Controller/Entities/Book.cs +++ b/MediaBrowser.Controller/Entities/Book.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace MediaBrowser.Controller.Entities { - public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage, IHasLookupInfo<BookInfo> + public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage, IHasLookupInfo<BookInfo>, IHasSeries { public override string MediaType { diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 101244d45..25197be67 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -518,7 +518,7 @@ namespace MediaBrowser.Controller.Entities foreach (var child in children) { - if (tasks.Count > 3) + if (tasks.Count > 5) { await Task.WhenAll(tasks).ConfigureAwait(false); tasks.Clear(); @@ -549,7 +549,7 @@ namespace MediaBrowser.Controller.Entities } else { - tasks.Add(RefreshChildMetadata(child, refreshOptions, recursive, innerProgress, cancellationToken)); + tasks.Add(RefreshChildMetadata(child, refreshOptions, false, innerProgress, cancellationToken)); } } diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index d260950bd..62ef0a85a 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -129,6 +129,12 @@ namespace MediaBrowser.Controller.Entities /// <param name="images">The images.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> bool AddImages(ImageType imageType, IEnumerable<FileInfo> images); + + /// <summary> + /// Determines whether [is save local metadata enabled]. + /// </summary> + /// <returns><c>true</c> if [is save local metadata enabled]; otherwise, <c>false</c>.</returns> + bool IsSaveLocalMetadataEnabled(); } public static class HasImagesExtensions diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 6466e18ce..1a1956c56 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Entities @@ -34,15 +37,17 @@ namespace MediaBrowser.Controller.Entities DateTime DateLastSaved { get; set; } /// <summary> - /// Determines whether [is save local metadata enabled]. - /// </summary> - /// <returns><c>true</c> if [is save local metadata enabled]; otherwise, <c>false</c>.</returns> - bool IsSaveLocalMetadataEnabled(); - - /// <summary> /// Gets a value indicating whether this instance is in mixed folder. /// </summary> /// <value><c>true</c> if this instance is in mixed folder; otherwise, <c>false</c>.</value> bool IsInMixedFolder { get; } + + /// <summary> + /// Updates to repository. + /// </summary> + /// <param name="updateReason">The update reason.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); } } diff --git a/MediaBrowser.Controller/Entities/IHasSeries.cs b/MediaBrowser.Controller/Entities/IHasSeries.cs new file mode 100644 index 000000000..64c33a376 --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasSeries.cs @@ -0,0 +1,12 @@ + +namespace MediaBrowser.Controller.Entities +{ + public interface IHasSeries + { + /// <summary> + /// Gets the name of the series. + /// </summary> + /// <value>The name of the series.</value> + string SeriesName { get; } + } +} diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 4d01c6a96..7214f0f6f 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Entities.Movies /// <summary> /// Class Movie /// </summary> - public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo> + public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasPreferredMetadataLanguage, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo> { public List<Guid> SpecialFeatureIds { get; set; } @@ -39,7 +39,6 @@ namespace MediaBrowser.Controller.Entities.Movies ThemeSongIds = new List<Guid>(); ThemeVideoIds = new List<Guid>(); Taglines = new List<string>(); - Tags = new List<string>(); Keywords = new List<string>(); } @@ -53,12 +52,6 @@ namespace MediaBrowser.Controller.Entities.Movies public List<MediaUrl> RemoteTrailers { get; set; } /// <summary> - /// Gets or sets the tags. - /// </summary> - /// <value>The tags.</value> - public List<string> Tags { get; set; } - - /// <summary> /// Gets or sets the taglines. /// </summary> /// <value>The taglines.</value> diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index 515f802e9..5413aa885 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.TV /// <summary> /// Class Episode /// </summary> - public class Episode : Video, IHasLookupInfo<EpisodeInfo> + public class Episode : Video, IHasLookupInfo<EpisodeInfo>, IHasSeries { /// <summary> /// Gets the season in which it aired. @@ -138,6 +138,16 @@ namespace MediaBrowser.Controller.Entities.TV get { return FindParent<Season>(); } } + [IgnoreDataMember] + public string SeriesName + { + get + { + var series = Series; + return series == null ? null : series.Name; + } + } + /// <summary> /// Creates the name of the sort. /// </summary> diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs index bc7e75b72..d266f1fde 100644 --- a/MediaBrowser.Controller/Entities/TV/Season.cs +++ b/MediaBrowser.Controller/Entities/TV/Season.cs @@ -1,11 +1,8 @@ -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Localization; +using MediaBrowser.Controller.Localization; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; -using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Runtime.Serialization; @@ -14,7 +11,7 @@ namespace MediaBrowser.Controller.Entities.TV /// <summary> /// Class Season /// </summary> - public class Season : Folder + public class Season : Folder, IHasSeries { /// <summary> @@ -218,7 +215,7 @@ namespace MediaBrowser.Controller.Entities.TV { episodes = episodes.Where(i => !i.IsVirtualUnaired); } - + return LibraryManager .Sort(episodes, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending) .Cast<Episode>(); @@ -234,5 +231,15 @@ namespace MediaBrowser.Controller.Entities.TV // Don't block. Let either the entire series rating or episode rating determine it return false; } + + [IgnoreDataMember] + public string SeriesName + { + get + { + var series = Series; + return series == null ? null : series.Name; + } + } } } diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs index 9b3104037..d655c275d 100644 --- a/MediaBrowser.Controller/Entities/Trailer.cs +++ b/MediaBrowser.Controller/Entities/Trailer.cs @@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Class Trailer /// </summary> - public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasMetascore, IHasLookupInfo<TrailerInfo> + public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasPreferredMetadataLanguage, IHasMetascore, IHasLookupInfo<TrailerInfo> { public List<Guid> SoundtrackIds { get; set; } @@ -28,7 +28,6 @@ namespace MediaBrowser.Controller.Entities Taglines = new List<string>(); SoundtrackIds = new List<Guid>(); LocalTrailerIds = new List<Guid>(); - Tags = new List<string>(); Keywords = new List<string>(); } @@ -41,12 +40,6 @@ namespace MediaBrowser.Controller.Entities public List<string> Keywords { get; set; } /// <summary> - /// Gets or sets the tags. - /// </summary> - /// <value>The tags.</value> - public List<string> Tags { get; set; } - - /// <summary> /// Gets or sets the taglines. /// </summary> /// <value>The taglines.</value> diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 6aa3ae819..e7bee35f5 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -16,7 +16,7 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Class Video /// </summary> - public class Video : BaseItem, IHasMediaStreams, IHasAspectRatio + public class Video : BaseItem, IHasMediaStreams, IHasAspectRatio, IHasTags { public bool IsMultiPart { get; set; } @@ -26,6 +26,7 @@ namespace MediaBrowser.Controller.Entities { PlayableStreamFileNames = new List<string>(); AdditionalPartIds = new List<Guid>(); + Tags = new List<string>(); } /// <summary> @@ -35,6 +36,12 @@ namespace MediaBrowser.Controller.Entities public bool HasSubtitles { get; set; } /// <summary> + /// Gets or sets the tags. + /// </summary> + /// <value>The tags.</value> + public List<string> Tags { get; set; } + + /// <summary> /// Gets or sets the video bit rate. /// </summary> /// <value>The video bit rate.</value> diff --git a/MediaBrowser.Controller/IServerApplicationPaths.cs b/MediaBrowser.Controller/IServerApplicationPaths.cs index e163ac31d..05f681597 100644 --- a/MediaBrowser.Controller/IServerApplicationPaths.cs +++ b/MediaBrowser.Controller/IServerApplicationPaths.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Configuration; +using System; +using MediaBrowser.Common.Configuration; namespace MediaBrowser.Controller { @@ -101,9 +102,16 @@ namespace MediaBrowser.Controller string TranscodingTempPath { get; } /// <summary> - /// Gets the downloaded images data path. + /// Gets the internal metadata path. /// </summary> - /// <value>The downloaded images data path.</value> - string DownloadedImagesDataPath { get; } + /// <value>The internal metadata path.</value> + string InternalMetadataPath { get; } + + /// <summary> + /// Gets the internal metadata path. + /// </summary> + /// <param name="id">The identifier.</param> + /// <returns>System.String.</returns> + string GetInternalMetadataPath(Guid id); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index 00e84177c..41e737300 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -94,6 +94,7 @@ <Compile Include="Entities\IHasPreferredMetadataLanguage.cs" /> <Compile Include="Entities\IHasProductionLocations.cs" /> <Compile Include="Entities\IHasScreenshots.cs" /> + <Compile Include="Entities\IHasSeries.cs" /> <Compile Include="Entities\IHasSoundtracks.cs" /> <Compile Include="Entities\IHasTaglines.cs" /> <Compile Include="Entities\IHasTags.cs" /> diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index dbb8c1edf..928e95833 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -247,7 +247,10 @@ namespace MediaBrowser.Controller.Providers { var val = reader.ReadElementContentAsString(); - + if (!string.IsNullOrWhiteSpace(val)) + { + item.ForcedSortName = val; + } break; } diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index 6818fa52b..f8580244a 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs @@ -40,8 +40,6 @@ namespace MediaBrowser.Controller.Providers protected static readonly Task<bool> FalseTaskResult = Task.FromResult(false); - protected static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4); - /// <summary> /// Supportses the specified item. /// </summary> diff --git a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs index 829dd34c8..3a33924f0 100644 --- a/MediaBrowser.Controller/Providers/BaseProviderInfo.cs +++ b/MediaBrowser.Controller/Providers/BaseProviderInfo.cs @@ -38,14 +38,14 @@ namespace MediaBrowser.Controller.Providers /// <summary> /// The success /// </summary> - Success, - /// <summary> - /// The failure - /// </summary> - Failure, + Success = 0, /// <summary> /// The completed with errors /// </summary> - CompletedWithErrors - } + CompletedWithErrors = 1, + /// <summary> + /// The failure + /// </summary> + Failure = 2 + } } diff --git a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs index d1ef68ce2..6b97a552d 100644 --- a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs +++ b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs @@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Providers { } - public interface IImageFileProvider : ILocalImageProvider + public interface ILocalImageFileProvider : ILocalImageProvider { List<LocalImageInfo> GetImages(IHasImages item); } diff --git a/MediaBrowser.Controller/Providers/IProviderRepository.cs b/MediaBrowser.Controller/Providers/IProviderRepository.cs index 1c0ad2cd7..3cd2c3f31 100644 --- a/MediaBrowser.Controller/Providers/IProviderRepository.cs +++ b/MediaBrowser.Controller/Providers/IProviderRepository.cs @@ -9,22 +9,6 @@ namespace MediaBrowser.Controller.Providers public interface IProviderRepository : IRepository { /// <summary> - /// Gets the provider history. - /// </summary> - /// <param name="itemId">The item identifier.</param> - /// <returns>IEnumerable{BaseProviderInfo}.</returns> - IEnumerable<BaseProviderInfo> GetProviderHistory(Guid itemId); - - /// <summary> - /// Saves the provider history. - /// </summary> - /// <param name="id">The identifier.</param> - /// <param name="history">The history.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task SaveProviderHistory(Guid id, IEnumerable<BaseProviderInfo> history, CancellationToken cancellationToken); - - /// <summary> /// Gets the metadata status. /// </summary> /// <param name="itemId">The item identifier.</param> diff --git a/MediaBrowser.Controller/Providers/MetadataStatus.cs b/MediaBrowser.Controller/Providers/MetadataStatus.cs index 834d8ec35..adfae54f5 100644 --- a/MediaBrowser.Controller/Providers/MetadataStatus.cs +++ b/MediaBrowser.Controller/Providers/MetadataStatus.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using MediaBrowser.Common.Extensions; namespace MediaBrowser.Controller.Providers { @@ -14,6 +13,18 @@ namespace MediaBrowser.Controller.Providers public Guid ItemId { get; set; } /// <summary> + /// Gets or sets the name of the item. + /// </summary> + /// <value>The name of the item.</value> + public string ItemName { get; set; } + + /// <summary> + /// Gets or sets the name of the series. + /// </summary> + /// <value>The name of the series.</value> + public string SeriesName { get; set; } + + /// <summary> /// Gets or sets the date last metadata refresh. /// </summary> /// <value>The date last metadata refresh.</value> diff --git a/MediaBrowser.Providers/AdultVideos/AdultVideoMetadataService.cs b/MediaBrowser.Providers/AdultVideos/AdultVideoMetadataService.cs index 4a713e735..b0d6af887 100644 --- a/MediaBrowser.Providers/AdultVideos/AdultVideoMetadataService.cs +++ b/MediaBrowser.Providers/AdultVideos/AdultVideoMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.AdultVideos { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(AdultVideo item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs b/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs new file mode 100644 index 000000000..cecde64ca --- /dev/null +++ b/MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs @@ -0,0 +1,71 @@ +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using System.Collections.Generic; +using System.IO; + +namespace MediaBrowser.Providers.All +{ + public class InternalMetadataFolderImageProvider : ILocalImageFileProvider, IHasOrder + { + private readonly IServerConfigurationManager _config; + + public InternalMetadataFolderImageProvider(IServerConfigurationManager config) + { + _config = config; + } + + public string Name + { + get { return "Internal Images"; } + } + + public bool Supports(IHasImages item) + { + if (!item.IsSaveLocalMetadataEnabled()) + { + return true; + } + + var locationType = item.LocationType; + + if (locationType == LocationType.FileSystem || + locationType == LocationType.Offline) + { + return false; + } + + // These always save locally + if (item is IItemByName || item is User) + { + return false; + } + + return true; + } + + public int Order + { + get + { + // Make sure this is last so that all other locations are scanned first + return 1000; + } + } + + public List<LocalImageInfo> GetImages(IHasImages item) + { + var path = _config.ApplicationPaths.GetInternalMetadataPath(item.Id); + + try + { + return new LocalImageProvider().GetImages(item, path); + } + catch (DirectoryNotFoundException) + { + return new List<LocalImageInfo>(); + } + } + } +} diff --git a/MediaBrowser.Providers/All/LocalImageProvider.cs b/MediaBrowser.Providers/All/LocalImageProvider.cs index 0d078499d..7d70a35b6 100644 --- a/MediaBrowser.Providers/All/LocalImageProvider.cs +++ b/MediaBrowser.Providers/All/LocalImageProvider.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; @@ -13,15 +12,8 @@ using System.Linq; namespace MediaBrowser.Providers.All { - public class LocalImageProvider : IImageFileProvider + public class LocalImageProvider : ILocalImageFileProvider { - private readonly IFileSystem _fileSystem; - - public LocalImageProvider(IFileSystem fileSystem) - { - _fileSystem = fileSystem; - } - public string Name { get { return "Local Images"; } @@ -91,12 +83,37 @@ namespace MediaBrowser.Providers.All var list = new List<LocalImageInfo>(); - PopulateImages(item, list, files); + PopulateImages(item, list, files, true); + + return list; + } + + public List<LocalImageInfo> GetImages(IHasImages item, string path) + { + return GetImages(item, new[] { path }); + } + + public List<LocalImageInfo> GetImages(IHasImages item, IEnumerable<string> paths) + { + var files = paths.SelectMany(i => new DirectoryInfo(i).EnumerateFiles("*", SearchOption.TopDirectoryOnly)) + .Where(i => + { + var ext = i.Extension; + + return !string.IsNullOrEmpty(ext) && + BaseItem.SupportedImageExtensions.Contains(ext, StringComparer.OrdinalIgnoreCase); + }) + .Cast<FileSystemInfo>() + .ToList(); + + var list = new List<LocalImageInfo>(); + + PopulateImages(item, list, files, false); return list; } - private void PopulateImages(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> files) + private void PopulateImages(IHasImages item, List<LocalImageInfo> images, List<FileSystemInfo> files, bool supportParentSeriesFiles) { var imagePrefix = string.Empty; @@ -126,11 +143,14 @@ namespace MediaBrowser.Providers.All AddImage(files, images, imagePrefix + "thumb", ImageType.Thumb); AddImage(files, images, imagePrefix + "landscape", ImageType.Thumb); - var season = item as Season; - - if (season != null) + if (supportParentSeriesFiles) { - PopulateSeasonImagesFromSeriesFolder(season, images); + var season = item as Season; + + if (season != null) + { + PopulateSeasonImagesFromSeriesFolder(season, images); + } } } @@ -278,7 +298,7 @@ namespace MediaBrowser.Providers.All } } - private bool AddImage(List<FileSystemInfo> files, List<LocalImageInfo> images, string name, ImageType type) + private bool AddImage(IEnumerable<FileSystemInfo> files, List<LocalImageInfo> images, string name, ImageType type) { var image = GetImage(files, name) as FileInfo; diff --git a/MediaBrowser.Providers/Books/BookMetadataService.cs b/MediaBrowser.Providers/Books/BookMetadataService.cs index c314b0a08..0cf672e2d 100644 --- a/MediaBrowser.Providers/Books/BookMetadataService.cs +++ b/MediaBrowser.Providers/Books/BookMetadataService.cs @@ -39,10 +39,5 @@ namespace MediaBrowser.Providers.Books target.SeriesName = source.SeriesName; } } - - protected override Task SaveItem(Book item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs index b1b5c7580..f4716f6dd 100644 --- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs +++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs @@ -41,11 +41,6 @@ namespace MediaBrowser.Providers.BoxSets ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - protected override Task SaveItem(BoxSet item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - protected override ItemUpdateType BeforeSave(BoxSet item) { var updateType = base.BeforeSave(item); diff --git a/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs b/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs new file mode 100644 index 000000000..f1b9a8384 --- /dev/null +++ b/MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs @@ -0,0 +1,37 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Providers.All; +using System.Collections.Generic; + +namespace MediaBrowser.Providers.Folders +{ + public class CollectionFolderLocalImageProvider : ILocalImageFileProvider, IHasOrder + { + public string Name + { + get { return "Collection Folder Images"; } + } + + public bool Supports(IHasImages item) + { + return item is CollectionFolder && item.LocationType == LocationType.FileSystem; + } + + public int Order + { + get + { + // Run after LocalImageProvider + return 1; + } + } + + public List<LocalImageInfo> GetImages(IHasImages item) + { + var collectionFolder = (CollectionFolder)item; + + return new LocalImageProvider().GetImages(item, collectionFolder.PhysicalLocations); + } + } +} diff --git a/MediaBrowser.Providers/Folders/FolderMetadataService.cs b/MediaBrowser.Providers/Folders/FolderMetadataService.cs index 5ce23aa76..c9e44177e 100644 --- a/MediaBrowser.Providers/Folders/FolderMetadataService.cs +++ b/MediaBrowser.Providers/Folders/FolderMetadataService.cs @@ -7,8 +7,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Manager; using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Folders { @@ -35,11 +33,6 @@ namespace MediaBrowser.Providers.Folders ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - protected override Task SaveItem(Folder item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - public override int Order { get diff --git a/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs b/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs new file mode 100644 index 000000000..e87f0919f --- /dev/null +++ b/MediaBrowser.Providers/Folders/ImagesByNameImageProvider.cs @@ -0,0 +1,57 @@ +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Providers.All; +using System.Collections.Generic; +using System.IO; + +namespace MediaBrowser.Providers.Folders +{ + public class ImagesByNameImageProvider : ILocalImageFileProvider, IHasOrder + { + private readonly IFileSystem _fileSystem; + private readonly IServerConfigurationManager _config; + + public ImagesByNameImageProvider(IFileSystem fileSystem, IServerConfigurationManager config) + { + _fileSystem = fileSystem; + _config = config; + } + + public string Name + { + get { return "Images By Name"; } + } + + public bool Supports(IHasImages item) + { + return item is ICollectionFolder; + } + + public int Order + { + get + { + // Run after LocalImageProvider, and after CollectionFolderImageProvider + return 2; + } + } + + public List<LocalImageInfo> GetImages(IHasImages item) + { + var name = _fileSystem.GetValidFilename(item.Name); + + var path = Path.Combine(_config.ApplicationPaths.GeneralPath, name); + + try + { + return new LocalImageProvider().GetImages(item, path); + } + catch (DirectoryNotFoundException) + { + return new List<LocalImageInfo>(); + } + } + } +} diff --git a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs index 0f2862846..0eaed59c7 100644 --- a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs +++ b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.GameGenres { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(GameGenre item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Games/GameMetadataService.cs b/MediaBrowser.Providers/Games/GameMetadataService.cs index 3a786385b..1586414ea 100644 --- a/MediaBrowser.Providers/Games/GameMetadataService.cs +++ b/MediaBrowser.Providers/Games/GameMetadataService.cs @@ -39,10 +39,5 @@ namespace MediaBrowser.Providers.Games target.GameSystem = source.GameSystem; } } - - protected override Task SaveItem(Game item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs index 9fb539d98..ae1ee1993 100644 --- a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs +++ b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs @@ -39,10 +39,5 @@ namespace MediaBrowser.Providers.Games target.GameSystemName = source.GameSystemName; } } - - protected override Task SaveItem(GameSystem item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Genres/GenreMetadataService.cs b/MediaBrowser.Providers/Genres/GenreMetadataService.cs index 199f79baf..b19241095 100644 --- a/MediaBrowser.Providers/Genres/GenreMetadataService.cs +++ b/MediaBrowser.Providers/Genres/GenreMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.Genres { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(Genre item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs index d11fb77ee..7ae27f4c9 100644 --- a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs +++ b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs @@ -33,10 +33,5 @@ namespace MediaBrowser.Providers.LiveTv { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(LiveTvAudioRecording item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs index fecee3ae2..57bc70156 100644 --- a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs @@ -29,10 +29,5 @@ namespace MediaBrowser.Providers.LiveTv { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(LiveTvChannel item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs index e6f020323..3172e0134 100644 --- a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs +++ b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs @@ -33,10 +33,5 @@ namespace MediaBrowser.Providers.LiveTv { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(LiveTvProgram item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs index fb4156e8d..f526db775 100644 --- a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs +++ b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs @@ -33,10 +33,5 @@ namespace MediaBrowser.Providers.LiveTv { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(LiveTvVideoRecording item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs index 1bccc6bb8..1b0ae1b5e 100644 --- a/MediaBrowser.Providers/Manager/ImageSaver.cs +++ b/MediaBrowser.Providers/Manager/ImageSaver.cs @@ -30,10 +30,6 @@ namespace MediaBrowser.Providers.Manager private readonly IServerConfigurationManager _config; /// <summary> - /// The remote image cache - /// </summary> - private readonly FileSystemRepository _remoteImageCache; - /// <summary> /// The _directory watchers /// </summary> private readonly ILibraryMonitor _libraryMonitor; @@ -41,17 +37,18 @@ namespace MediaBrowser.Providers.Manager private readonly ILogger _logger; /// <summary> - /// Initializes a new instance of the <see cref="ImageSaver"/> class. + /// Initializes a new instance of the <see cref="ImageSaver" /> class. /// </summary> /// <param name="config">The config.</param> /// <param name="libraryMonitor">The directory watchers.</param> + /// <param name="fileSystem">The file system.</param> + /// <param name="logger">The logger.</param> public ImageSaver(IServerConfigurationManager config, ILibraryMonitor libraryMonitor, IFileSystem fileSystem, ILogger logger) { _config = config; _libraryMonitor = libraryMonitor; _fileSystem = fileSystem; _logger = logger; - _remoteImageCache = new FileSystemRepository(config.ApplicationPaths.DownloadedImagesDataPath); } /// <summary> @@ -348,7 +345,7 @@ namespace MediaBrowser.Providers.Manager // None of the save local conditions passed, so store it in our internal folders if (string.IsNullOrEmpty(path)) { - path = _remoteImageCache.GetResourcePath(item.GetType().FullName + item.Id, filename + extension); + path = Path.Combine(_config.ApplicationPaths.GetInternalMetadataPath(item.Id), filename + extension); } return path; diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 4ba959d14..b50e028bf 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Manager { var hasChanges = item.ValidateImages(); - foreach (var provider in providers.OfType<IImageFileProvider>()) + foreach (var provider in providers.OfType<ILocalImageFileProvider>()) { var images = provider.GetImages(item); @@ -117,8 +117,7 @@ namespace MediaBrowser.Providers.Manager { var mimeType = "image/" + Path.GetExtension(response.Path).TrimStart('.').ToLower(); - var stream = _fileSystem.GetFileStream(response.Path, FileMode.Open, FileAccess.Read, - FileShare.Read, true); + var stream = _fileSystem.GetFileStream(response.Path, FileMode.Open, FileAccess.Read, FileShare.Read, true); await _providerManager.SaveImage((BaseItem)item, stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false); } @@ -335,7 +334,7 @@ namespace MediaBrowser.Providers.Manager } catch (HttpException ex) { - // Sometimes providers send back bad url's. Just move onto the next image + // Sometimes providers send back bad url's. Just move to the next image if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound) { continue; diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 21173aebc..be42589b7 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -37,10 +37,18 @@ namespace MediaBrowser.Providers.Manager /// <summary> /// Saves the provider result. /// </summary> + /// <param name="item">The item.</param> /// <param name="result">The result.</param> /// <returns>Task.</returns> - protected Task SaveProviderResult(MetadataStatus result) + protected Task SaveProviderResult(TItemType item, MetadataStatus result) { + result.ItemId = item.Id; + result.ItemName = item.Name; + + var series = item as IHasSeries; + + result.SeriesName = series == null ? null : series.SeriesName; + return ProviderRepo.SaveMetadataStatus(result, CancellationToken.None); } @@ -97,7 +105,6 @@ namespace MediaBrowser.Providers.Manager if (providers.Count > 0) { - var result = await RefreshWithProviders(itemOfType, refreshOptions, providers, cancellationToken).ConfigureAwait(false); updateType = updateType | result.UpdateType; @@ -140,7 +147,7 @@ namespace MediaBrowser.Providers.Manager if (providersHadChanges || refreshResult.IsDirty) { - await SaveProviderResult(refreshResult).ConfigureAwait(false); + await SaveProviderResult(itemOfType, refreshResult).ConfigureAwait(false); } } @@ -231,7 +238,10 @@ namespace MediaBrowser.Providers.Manager return providers; } - protected abstract Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken); + protected Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken) + { + return item.UpdateToRepository(reason, cancellationToken); + } public bool CanRefresh(IHasMetadata item) { @@ -298,6 +308,7 @@ namespace MediaBrowser.Providers.Manager } } + // Local metadata is king - if any is found don't run remote providers if (!options.ReplaceAllMetadata && !hasLocalMetadata) { await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false); @@ -349,7 +360,14 @@ namespace MediaBrowser.Providers.Manager { Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name); - id = id ?? item.GetLookupInfo(); + if (id == null) + { + id = item.GetLookupInfo(); + } + else + { + MergeNewData(temp, id); + } try { @@ -375,6 +393,15 @@ namespace MediaBrowser.Providers.Manager } } + private void MergeNewData(TItemType source, TIdType lookupInfo) + { + // Copy new provider id's that may have been obtained + foreach (var providerId in source.ProviderIds) + { + lookupInfo.ProviderIds[providerId.Key] = providerId.Value; + } + } + protected abstract void MergeData(TItemType source, TItemType target, List<MetadataFields> lockedFields, bool replaceData, bool mergeMetadataSettings); public virtual int Order diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index aec08a292..e0b07ef3a 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -470,7 +470,7 @@ namespace MediaBrowser.Providers.Manager })); // Savers - list.AddRange(_savers.Where(i => i.IsEnabledFor(item, ItemUpdateType.MetadataEdit)).OrderBy(i => i.Name).Select(i => new MetadataPlugin + list.AddRange(_savers.Where(i => IsSaverEnabledForItem(i, item, ItemUpdateType.MetadataEdit)).OrderBy(i => i.Name).Select(i => new MetadataPlugin { Name = i.Name, Type = MetadataPluginType.MetadataSaver @@ -506,7 +506,7 @@ namespace MediaBrowser.Providers.Manager /// <returns>Task.</returns> public async Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType) { - foreach (var saver in _savers.Where(i => i.IsEnabledFor(item, updateType))) + foreach (var saver in _savers.Where(i => IsSaverEnabledForItem(i, item, updateType))) { _logger.Debug("Saving {0} to {1}.", item.Path ?? item.Name, saver.Name); @@ -514,13 +514,17 @@ namespace MediaBrowser.Providers.Manager if (fileSaver != null) { - var locationType = item.LocationType; - if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + string path = null; + + try { - throw new ArgumentException("Only file-system based items can save metadata."); + path = fileSaver.GetSavePath(item); + } + catch (Exception ex) + { + _logger.ErrorException("Error in {0} GetSavePath", ex, saver.Name); + continue; } - - var path = fileSaver.GetSavePath(item); var semaphore = _fileLocks.GetOrAdd(path, key => new SemaphoreSlim(1, 1)); @@ -554,5 +558,18 @@ namespace MediaBrowser.Providers.Manager } } } + + private bool IsSaverEnabledForItem(IMetadataSaver saver, IHasMetadata item, ItemUpdateType updateType) + { + try + { + return saver.IsEnabledFor(item, updateType); + } + catch (Exception ex) + { + _logger.ErrorException("Error in {0}.IsEnabledFor", ex, saver.Name); + return false; + } + } } } diff --git a/MediaBrowser.Providers/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs index ecefb72c4..6e994c9f2 100644 --- a/MediaBrowser.Providers/ProviderUtils.cs +++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs @@ -3,7 +3,7 @@ using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Model.Entities; using System.Collections.Generic; -namespace MediaBrowser.Providers +namespace MediaBrowser.Providers.Manager { public static class ProviderUtils { diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index da9ea2947..d494f17b6 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -66,12 +66,15 @@ <ItemGroup> <Compile Include="AdultVideos\AdultVideoMetadataService.cs" /> <Compile Include="AdultVideos\AdultVideoXmlProvider.cs" /> + <Compile Include="All\InternalMetadataFolderImageProvider.cs" /> <Compile Include="All\LocalImageProvider.cs" /> <Compile Include="Books\BookMetadataService.cs" /> <Compile Include="BoxSets\BoxSetMetadataService.cs" /> <Compile Include="BoxSets\MovieDbBoxSetImageProvider.cs" /> <Compile Include="BoxSets\MovieDbBoxSetProvider.cs" /> + <Compile Include="Folders\CollectionFolderImageProvider.cs" /> <Compile Include="Folders\FolderMetadataService.cs" /> + <Compile Include="Folders\ImagesByNameImageProvider.cs" /> <Compile Include="GameGenres\GameGenreMetadataService.cs" /> <Compile Include="Games\GameMetadataService.cs" /> <Compile Include="Games\GameSystemMetadataService.cs" /> @@ -145,8 +148,7 @@ <Compile Include="People\PersonXmlProvider.cs" /> <Compile Include="People\MovieDbPersonProvider.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> - <Compile Include="ProviderUtils.cs" /> - <Compile Include="RefreshIntrosTask.cs" /> + <Compile Include="Manager\ProviderUtils.cs" /> <Compile Include="Savers\AlbumXmlSaver.cs" /> <Compile Include="Savers\ArtistXmlSaver.cs" /> <Compile Include="Savers\BoxSetXmlSaver.cs" /> diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs index 94d8566e1..ba3b468d4 100644 --- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs +++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Dto; diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs index ebed0c203..45d1eb531 100644 --- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs +++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -143,10 +144,6 @@ namespace MediaBrowser.Providers.Movies movieItem.TmdbCollectionName = movieData.belongs_to_collection.name; } } - else - { - movie.SetProviderId(MetadataProviders.TmdbCollection, null); // clear out any old entry - } float rating; string voteAvg = movieData.vote_average.ToString(CultureInfo.InvariantCulture); diff --git a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs index be2f7ad61..db3468816 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.Net; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Dto; @@ -15,7 +16,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - class MovieDbImageProvider : IRemoteImageProvider, IHasOrder + class MovieDbImageProvider : IRemoteImageProvider, IHasOrder, IHasChangeMonitor { private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; @@ -207,5 +208,10 @@ namespace MediaBrowser.Providers.Movies ResourcePool = MovieDbProvider.Current.MovieDbResourcePool }); } + + public bool HasChanged(IHasMetadata item, DateTime date) + { + return MovieDbProvider.Current.HasChanged(item, date); + } } } diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index a9526787c..36dfc64d2 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.Movies /// <summary> /// Class MovieDbProvider /// </summary> - public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable, IHasChangeMonitor + public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable { internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1); diff --git a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs index df786cffc..ed36cb7af 100644 --- a/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - public class MovieDbTrailerProvider : IRemoteMetadataProvider<Trailer, TrailerInfo>, IHasChangeMonitor + public class MovieDbTrailerProvider : IRemoteMetadataProvider<Trailer, TrailerInfo> { public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken) { diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs index 674b36422..34536d97d 100644 --- a/MediaBrowser.Providers/Movies/MovieMetadataService.cs +++ b/MediaBrowser.Providers/Movies/MovieMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.Movies { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(Movie item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs b/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs index 3f200dc8c..483175f37 100644 --- a/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs +++ b/MediaBrowser.Providers/Movies/MovieUpdatesPrescanTask.cs @@ -1,6 +1,5 @@ using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; -using MediaBrowser.Common.Progress; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Movies; diff --git a/MediaBrowser.Providers/Movies/TrailerMetadataService.cs b/MediaBrowser.Providers/Movies/TrailerMetadataService.cs index 620799a18..d9ae6187c 100644 --- a/MediaBrowser.Providers/Movies/TrailerMetadataService.cs +++ b/MediaBrowser.Providers/Movies/TrailerMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.Movies { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(Trailer item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Music/AlbumMetadataService.cs b/MediaBrowser.Providers/Music/AlbumMetadataService.cs index d4bbe5a28..410441fc8 100644 --- a/MediaBrowser.Providers/Music/AlbumMetadataService.cs +++ b/MediaBrowser.Providers/Music/AlbumMetadataService.cs @@ -42,11 +42,6 @@ namespace MediaBrowser.Providers.Music } } - protected override Task SaveItem(MusicAlbum item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - protected override ItemUpdateType BeforeSave(MusicAlbum item) { var updateType = base.BeforeSave(item); diff --git a/MediaBrowser.Providers/Music/ArtistMetadataService.cs b/MediaBrowser.Providers/Music/ArtistMetadataService.cs index 9cc4406ac..1b7f229e4 100644 --- a/MediaBrowser.Providers/Music/ArtistMetadataService.cs +++ b/MediaBrowser.Providers/Music/ArtistMetadataService.cs @@ -9,12 +9,10 @@ using MediaBrowser.Providers.Manager; using System; using System.Collections.Generic; using System.Linq; -using System.Threading; -using System.Threading.Tasks; namespace MediaBrowser.Providers.Music { - public class ArtistMetadataService : MetadataService<MusicArtist, ItemLookupInfo> + public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo> { private readonly ILibraryManager _libraryManager; @@ -37,11 +35,6 @@ namespace MediaBrowser.Providers.Music ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - protected override Task SaveItem(MusicArtist item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - protected override ItemUpdateType BeforeSave(MusicArtist item) { var updateType = base.BeforeSave(item); diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs index 408f499dc..cda22b0f5 100644 --- a/MediaBrowser.Providers/Music/AudioMetadataService.cs +++ b/MediaBrowser.Providers/Music/AudioMetadataService.cs @@ -44,10 +44,5 @@ namespace MediaBrowser.Providers.Music target.Album = source.Album; } } - - protected override Task SaveItem(Audio item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Music/Extensions.cs b/MediaBrowser.Providers/Music/Extensions.cs index 0ba02cbec..671242eed 100644 --- a/MediaBrowser.Providers/Music/Extensions.cs +++ b/MediaBrowser.Providers/Music/Extensions.cs @@ -63,5 +63,19 @@ namespace MediaBrowser.Providers.Music return id; } + + public static string GetArtistId(this ArtistInfo info) + { + string id; + info.ProviderIds.TryGetValue(MetadataProviders.MusicBrainzArtist.ToString(), out id); + + if (string.IsNullOrEmpty(id)) + { + return info.SongInfos.Select(i => i.GetProviderId(MetadataProviders.MusicBrainzAlbumArtist)) + .FirstOrDefault(i => !string.IsNullOrEmpty(i)); + } + + return id; + } } } diff --git a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs index 0affbf909..767c58cb9 100644 --- a/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/LastfmAlbumProvider.cs @@ -5,9 +5,11 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; +using MoreLinq; using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Threading; using System.Threading.Tasks; @@ -39,6 +41,7 @@ namespace MediaBrowser.Providers.Music if (lastFmData != null && lastFmData.album != null) { result.HasMetadata = true; + result.Item = new MusicAlbum(); ProcessAlbumData(result.Item, lastFmData.album); } @@ -72,18 +75,18 @@ namespace MediaBrowser.Providers.Music } var albumArtist = item.GetAlbumArtist(); - //// Get each song, distinct by the combination of AlbumArtist and Album - //var songs = item.RecursiveChildren.OfType<Audio>().DistinctBy(i => (i.AlbumArtist ?? string.Empty) + (i.Album ?? string.Empty), StringComparer.OrdinalIgnoreCase).ToList(); - - //foreach (var song in songs.Where(song => !string.IsNullOrEmpty(song.Album) && !string.IsNullOrEmpty(song.AlbumArtist))) - //{ - // var result = await GetAlbumResult(song.AlbumArtist, song.Album, cancellationToken).ConfigureAwait(false); - - // if (result != null && result.album != null) - // { - // return result; - // } - //} + // Get each song, distinct by the combination of AlbumArtist and Album + var songs = item.SongInfos.DistinctBy(i => (i.AlbumArtist ?? string.Empty) + (i.Album ?? string.Empty), StringComparer.OrdinalIgnoreCase).ToList(); + + foreach (var song in songs.Where(song => !string.IsNullOrEmpty(song.Album) && !string.IsNullOrEmpty(song.AlbumArtist))) + { + var result = await GetAlbumResult(song.AlbumArtist, song.Album, cancellationToken).ConfigureAwait(false); + + if (result != null && result.album != null) + { + return result; + } + } if (string.IsNullOrEmpty(albumArtist)) { diff --git a/MediaBrowser.Providers/Music/LastfmArtistProvider.cs b/MediaBrowser.Providers/Music/LastfmArtistProvider.cs index 865daaf00..7aceff41a 100644 --- a/MediaBrowser.Providers/Music/LastfmArtistProvider.cs +++ b/MediaBrowser.Providers/Music/LastfmArtistProvider.cs @@ -42,7 +42,7 @@ namespace MediaBrowser.Providers.Music { var result = new MetadataResult<MusicArtist>(); - var musicBrainzId = id.GetProviderId(MetadataProviders.MusicBrainzArtist); + var musicBrainzId = id.GetArtistId(); if (!String.IsNullOrWhiteSpace(musicBrainzId)) { diff --git a/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs b/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs index 32101260b..99fe5c38d 100644 --- a/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs +++ b/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Providers; using MediaBrowser.Providers.Movies; using System; @@ -7,7 +8,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Music { - public class MovieDbMusicVideoProvider : IRemoteMetadataProvider<MusicVideo, MusicVideoInfo>, IHasChangeMonitor + public class MovieDbMusicVideoProvider : IRemoteMetadataProvider<MusicVideo, MusicVideoInfo> { public Task<MetadataResult<MusicVideo>> GetMetadata(MusicVideoInfo info, CancellationToken cancellationToken) { diff --git a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs index 1ed5d6b38..2fbcf64ca 100644 --- a/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs @@ -47,14 +47,12 @@ namespace MediaBrowser.Providers.Music { releaseId = releaseResult.ReleaseId; result.HasMetadata = true; - result.Item.SetProviderId(MetadataProviders.MusicBrainzAlbum, releaseId); } if (!string.IsNullOrEmpty(releaseResult.ReleaseGroupId)) { releaseGroupId = releaseResult.ReleaseGroupId; result.HasMetadata = true; - result.Item.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, releaseGroupId); } } @@ -63,7 +61,6 @@ namespace MediaBrowser.Providers.Music { releaseGroupId = await GetReleaseGroupId(releaseId, cancellationToken).ConfigureAwait(false); result.HasMetadata = true; - result.Item.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, releaseGroupId); } if (result.HasMetadata) diff --git a/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs b/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs index 7eeb617a7..52a598171 100644 --- a/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs +++ b/MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs @@ -17,8 +17,8 @@ namespace MediaBrowser.Providers.Music public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo id, CancellationToken cancellationToken) { var result = new MetadataResult<MusicArtist>(); - - var musicBrainzId = id.GetProviderId(MetadataProviders.MusicBrainzArtist) ?? await FindId(id, cancellationToken).ConfigureAwait(false); + + var musicBrainzId = id.GetArtistId() ?? await FindId(id, cancellationToken).ConfigureAwait(false); if (!string.IsNullOrWhiteSpace(musicBrainzId)) { diff --git a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs index 5b46cb6ba..e30f93af9 100644 --- a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs +++ b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; @@ -44,10 +45,5 @@ namespace MediaBrowser.Providers.Music target.Artist = source.Artist; } } - - protected override Task SaveItem(MusicVideo item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Music/MusicVideoXmlParser.cs b/MediaBrowser.Providers/Music/MusicVideoXmlParser.cs index 5af203fa7..0c160ff66 100644 --- a/MediaBrowser.Providers/Music/MusicVideoXmlParser.cs +++ b/MediaBrowser.Providers/Music/MusicVideoXmlParser.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System.Xml; diff --git a/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs b/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs index 5bdc2cdd0..ec763c852 100644 --- a/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs +++ b/MediaBrowser.Providers/Music/MusicVideoXmlProvider.cs @@ -1,5 +1,6 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using MediaBrowser.Providers.Movies; diff --git a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs index 09b069c73..db5f1b8ce 100644 --- a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs +++ b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.MusicGenres { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(MusicGenre item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/People/PersonMetadataService.cs b/MediaBrowser.Providers/People/PersonMetadataService.cs index de192ea2f..b3b3e88d0 100644 --- a/MediaBrowser.Providers/People/PersonMetadataService.cs +++ b/MediaBrowser.Providers/People/PersonMetadataService.cs @@ -39,10 +39,5 @@ namespace MediaBrowser.Providers.People target.PlaceOfBirth = source.PlaceOfBirth; } } - - protected override Task SaveItem(Person item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs b/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs index 5d6193491..74c507394 100644 --- a/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/AlbumXmlSaver.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -35,6 +36,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs b/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs index 1ae1eaa64..c5c564fba 100644 --- a/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/ArtistXmlSaver.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; using MediaBrowser.Providers.Music; using System; using System.Collections.Generic; @@ -37,6 +38,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs b/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs index 06a17528b..fb5c57095 100644 --- a/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs @@ -7,6 +7,7 @@ using System.IO; using System.Text; using System.Threading; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -35,6 +36,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/ChannelXmlSaver.cs b/MediaBrowser.Providers/Savers/ChannelXmlSaver.cs index 36ee0dcc6..7da6c25c1 100644 --- a/MediaBrowser.Providers/Savers/ChannelXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/ChannelXmlSaver.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -22,6 +23,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs index f662c6cbf..f9932ce75 100644 --- a/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs @@ -10,6 +10,7 @@ using System.IO; using System.Security; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -26,6 +27,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/FolderXmlSaver.cs b/MediaBrowser.Providers/Savers/FolderXmlSaver.cs index e0ae638e9..5c21443ce 100644 --- a/MediaBrowser.Providers/Savers/FolderXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/FolderXmlSaver.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -37,6 +38,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var folder = item as Folder; if (folder == null) diff --git a/MediaBrowser.Providers/Savers/GameSystemXmlSaver.cs b/MediaBrowser.Providers/Savers/GameSystemXmlSaver.cs index 017f17f8d..f0d34df08 100644 --- a/MediaBrowser.Providers/Savers/GameSystemXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/GameSystemXmlSaver.cs @@ -7,6 +7,7 @@ using System.IO; using System.Security; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -35,6 +36,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/GameXmlSaver.cs b/MediaBrowser.Providers/Savers/GameXmlSaver.cs index 613819517..a2a96909f 100644 --- a/MediaBrowser.Providers/Savers/GameXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/GameXmlSaver.cs @@ -1,7 +1,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System.Collections.Generic; using System.Globalization; @@ -40,6 +39,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs index 15fdc6752..e62a86af0 100644 --- a/MediaBrowser.Providers/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/MovieXmlSaver.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; @@ -11,6 +12,7 @@ using System.Security; using System.Text; using System.Threading; using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -44,6 +46,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/PersonXmlSaver.cs b/MediaBrowser.Providers/Savers/PersonXmlSaver.cs index 167e514a8..10f75d591 100644 --- a/MediaBrowser.Providers/Savers/PersonXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/PersonXmlSaver.cs @@ -6,6 +6,7 @@ using System.IO; using System.Security; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -30,6 +31,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs b/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs index 6bb2855f0..cc0bf8b36 100644 --- a/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/SeasonXmlSaver.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; +using MediaBrowser.Model.Entities; namespace MediaBrowser.Providers.Savers { @@ -35,6 +36,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs b/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs index 946c49779..ffd90b5d1 100644 --- a/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs +++ b/MediaBrowser.Providers/Savers/SeriesXmlSaver.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; using System.Collections.Generic; using System.IO; @@ -37,6 +36,12 @@ namespace MediaBrowser.Providers.Savers /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns> public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || locationType == LocationType.Virtual) + { + return false; + } + var wasMetadataEdited = (updateType & ItemUpdateType.MetadataEdit) == ItemUpdateType.MetadataEdit; var wasMetadataDownloaded = (updateType & ItemUpdateType.MetadataDownload) == ItemUpdateType.MetadataDownload; diff --git a/MediaBrowser.Providers/Studios/StudioMetadataService.cs b/MediaBrowser.Providers/Studios/StudioMetadataService.cs index 5f39031b2..014ff3340 100644 --- a/MediaBrowser.Providers/Studios/StudioMetadataService.cs +++ b/MediaBrowser.Providers/Studios/StudioMetadataService.cs @@ -33,10 +33,5 @@ namespace MediaBrowser.Providers.Studios { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(Studio item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs b/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs index 03346d0d2..df3b8b48f 100644 --- a/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs +++ b/MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs @@ -2,14 +2,12 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; -using System; using System.Collections.Generic; using System.IO; -using System.Linq; namespace MediaBrowser.Providers.TV { - public class EpisodeLocalImageProvider : IImageFileProvider + public class EpisodeLocalLocalImageProvider : ILocalImageFileProvider { public string Name { @@ -23,37 +21,46 @@ namespace MediaBrowser.Providers.TV public List<LocalImageInfo> GetImages(IHasImages item) { + var file = GetFile(item); + + var list = new List<LocalImageInfo>(); + + if (file != null) + { + list.Add(new LocalImageInfo + { + FileInfo = file, + Type = ImageType.Primary + }); + } + + return list; + } + + private FileInfo GetFile(IHasImages item) + { var parentPath = Path.GetDirectoryName(item.Path); var nameWithoutExtension = Path.GetFileNameWithoutExtension(item.Path); var thumbName = nameWithoutExtension + "-thumb"; - return new DirectoryInfo(parentPath).EnumerateFiles("*", SearchOption.AllDirectories) - .Where(i => - { - if (BaseItem.SupportedImageExtensions.Contains(i.Extension)) - { - var currentNameWithoutExtension = Path.GetFileNameWithoutExtension(i.Name); - - if (string.Equals(nameWithoutExtension, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - - if (string.Equals(thumbName, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - }) - .Select(i => new LocalImageInfo - { - FileInfo = i, - Type = ImageType.Primary - }) - .ToList(); + var path = Path.Combine(parentPath, thumbName + ".jpg"); + var fileInfo = new FileInfo(path); + + if (fileInfo.Exists) + { + return fileInfo; + } + + path = Path.Combine(parentPath, "metadata", nameWithoutExtension + ".jpg"); + fileInfo = new FileInfo(path); + + if (fileInfo.Exists) + { + return fileInfo; + } + + return null; } } } diff --git a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs index 039a4750d..fa44af155 100644 --- a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs +++ b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs @@ -71,11 +71,6 @@ namespace MediaBrowser.Providers.TV } } - protected override Task SaveItem(Episode item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - protected override ItemUpdateType BeforeMetadataRefresh(Episode item) { var updateType = base.BeforeMetadataRefresh(item); diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs index 5173e03e4..b0c80d5d6 100644 --- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs @@ -35,11 +35,6 @@ namespace MediaBrowser.Providers.TV ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - protected override Task SaveItem(Season item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - protected override ItemUpdateType BeforeMetadataRefresh(Season item) { var updateType = base.BeforeMetadataRefresh(item); diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs index b858c3784..76c66ea36 100644 --- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs +++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs @@ -36,11 +36,6 @@ namespace MediaBrowser.Providers.TV ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - protected override Task SaveItem(Series item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - protected override ItemUpdateType BeforeSave(Series item) { var updateType = base.BeforeSave(item); diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs index 162eb45bc..754f973bc 100644 --- a/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbEpisodeImageProvider.cs @@ -194,6 +194,11 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { + if (!_config.Configuration.EnableTvDbUpdates && item.LocationType != LocationType.Virtual) + { + return false; + } + if (!item.HasImage(ImageType.Primary)) { var episode = (Episode)item; @@ -211,6 +216,7 @@ namespace MediaBrowser.Providers.TV return files.Any(i => _fileSystem.GetLastWriteTimeUtc(i) > date); } } + return false; } } diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs index 41e375bac..1c9f565f3 100644 --- a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs @@ -2,10 +2,8 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; -using MediaBrowser.Model.Net; using System; using System.Collections.Generic; using System.Globalization; @@ -16,7 +14,6 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; -using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo; namespace MediaBrowser.Providers.TV { @@ -71,7 +68,7 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { - if (!_config.Configuration.EnableTvDbUpdates) + if (!_config.Configuration.EnableTvDbUpdates && item.LocationType != LocationType.Virtual) { return false; } @@ -423,28 +420,6 @@ namespace MediaBrowser.Providers.TV break; } - case "filename": - { - if (string.IsNullOrEmpty(item.PrimaryImagePath)) - { - var val = reader.ReadElementContentAsString(); - if (!string.IsNullOrWhiteSpace(val)) - { - try - { - var url = TVUtils.BannerUrl + val; - - //await _providerManager.SaveImage(item, url, TvdbSeriesProvider.Current.TvDbResourcePool, ImageType.Primary, null, cancellationToken).ConfigureAwait(false); - } - catch (HttpException) - { - status = ProviderRefreshStatus.CompletedWithErrors; - } - } - } - break; - } - case "Overview": { if (!item.LockedFields.Contains(MetadataFields.Overview)) diff --git a/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs b/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs index a63f3ee24..a6276d0d7 100644 --- a/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeasonImageProvider.cs @@ -342,6 +342,11 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { + if (!_config.Configuration.EnableTvDbUpdates && item.LocationType != LocationType.Virtual) + { + return false; + } + var season = (Season)item; var series = season.Series; diff --git a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs index e56830644..3e1664f85 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesImageProvider.cs @@ -339,6 +339,11 @@ namespace MediaBrowser.Providers.TV public bool HasChanged(IHasMetadata item, DateTime date) { + if (!_config.Configuration.EnableTvDbUpdates) + { + return false; + } + var tvdbId = item.GetProviderId(MetadataProviders.Tvdb); if (!String.IsNullOrEmpty(tvdbId)) diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs index 57e518e85..ba8ac9fd6 100644 --- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs @@ -19,11 +19,10 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml; -using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo; namespace MediaBrowser.Providers.TV { - public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasChangeMonitor + public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo> { internal readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(2, 2); internal static TvdbSeriesProvider Current { get; private set; } diff --git a/MediaBrowser.Providers/Users/UserMetadataService.cs b/MediaBrowser.Providers/Users/UserMetadataService.cs index dac0c262f..5b49033a9 100644 --- a/MediaBrowser.Providers/Users/UserMetadataService.cs +++ b/MediaBrowser.Providers/Users/UserMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.Users { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(User item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _userManager.UpdateUser(item); - } } } diff --git a/MediaBrowser.Providers/Videos/VideoMetadataService.cs b/MediaBrowser.Providers/Videos/VideoMetadataService.cs index cce9dc6f0..de8bd44e6 100644 --- a/MediaBrowser.Providers/Videos/VideoMetadataService.cs +++ b/MediaBrowser.Providers/Videos/VideoMetadataService.cs @@ -35,11 +35,6 @@ namespace MediaBrowser.Providers.Videos ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - protected override Task SaveItem(Video item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } - public override int Order { get diff --git a/MediaBrowser.Providers/Years/YearMetadataService.cs b/MediaBrowser.Providers/Years/YearMetadataService.cs index d40b8cb65..621ea96ce 100644 --- a/MediaBrowser.Providers/Years/YearMetadataService.cs +++ b/MediaBrowser.Providers/Years/YearMetadataService.cs @@ -34,10 +34,5 @@ namespace MediaBrowser.Providers.Years { ProviderUtils.MergeBaseItemData(source, target, lockedFields, replaceData, mergeMetadataSettings); } - - protected override Task SaveItem(Year item, ItemUpdateType reason, CancellationToken cancellationToken) - { - return _libraryManager.UpdateItem(item, reason, cancellationToken); - } } } diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 998895cbf..f355f4bf6 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -1,6 +1,7 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index fe4283368..8489624fc 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -192,6 +192,7 @@ <Compile Include="Roku\RokuControllerFactory.cs" /> <Compile Include="ScheduledTasks\PeopleValidationTask.cs" /> <Compile Include="ScheduledTasks\ChapterImagesTask.cs" /> + <Compile Include="ScheduledTasks\RefreshIntrosTask.cs" /> <Compile Include="ScheduledTasks\RefreshMediaLibraryTask.cs" /> <Compile Include="ServerApplicationPaths.cs" /> <Compile Include="ServerManager\ServerManager.cs" /> diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs index 8a82c062d..eb6e142c1 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs @@ -1,10 +1,9 @@ -using System.IO; -using MediaBrowser.Common.Configuration; +using MediaBrowser.Common.Configuration; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System; -using System.Collections.Generic; using System.Data; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -17,8 +16,6 @@ namespace MediaBrowser.Server.Implementations.Persistence private readonly ILogger _logger; - private IDbCommand _deleteInfosCommand; - private IDbCommand _saveInfoCommand; private IDbCommand _saveStatusCommand; private readonly IApplicationPaths _appPaths; @@ -48,16 +45,13 @@ namespace MediaBrowser.Server.Implementations.Persistence /// <returns>Task.</returns> public async Task Initialize() { - var dbFile = Path.Combine(_appPaths.DataPath, "providerinfo.db"); + var dbFile = Path.Combine(_appPaths.DataPath, "refreshinfo.db"); _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); string[] queries = { - "create table if not exists providerinfos (ItemId GUID, ProviderId GUID, ProviderVersion TEXT, FileStamp GUID, LastRefreshStatus TEXT, LastRefreshed datetime, PRIMARY KEY (ItemId, ProviderId))", - "create index if not exists idx_providerinfos on providerinfos(ItemId, ProviderId)", - - "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastStatus TEXT, LastErrorMessage TEXT, MetadataProvidersRefreshed TEXT, ImageProvidersRefreshed TEXT)", + "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastStatus TEXT, LastErrorMessage TEXT, MetadataProvidersRefreshed TEXT, ImageProvidersRefreshed TEXT)", "create index if not exists idx_MetadataStatus on MetadataStatus(ItemId)", //pragmas @@ -73,21 +67,11 @@ namespace MediaBrowser.Server.Implementations.Persistence _shrinkMemoryTimer = new SqliteShrinkMemoryTimer(_connection, _writeLock, _logger); } - private static readonly string[] SaveHistoryColumns = - { - "ItemId", - "ProviderId", - "ProviderVersion", - "FileStamp", - "LastRefreshStatus", - "LastRefreshed" - }; - - private readonly string[] _historySelectColumns = SaveHistoryColumns.Skip(1).ToArray(); - private static readonly string[] StatusColumns = { "ItemId", + "ItemName", + "SeriesName", "DateLastMetadataRefresh", "DateLastImagesRefresh", "LastStatus", @@ -106,21 +90,6 @@ namespace MediaBrowser.Server.Implementations.Persistence /// </summary> private void PrepareStatements() { - _deleteInfosCommand = _connection.CreateCommand(); - _deleteInfosCommand.CommandText = "delete from providerinfos where ItemId=@ItemId"; - _deleteInfosCommand.Parameters.Add(_deleteInfosCommand, "@ItemId"); - - _saveInfoCommand = _connection.CreateCommand(); - - _saveInfoCommand.CommandText = string.Format("replace into providerinfos ({0}) values ({1})", - string.Join(",", SaveHistoryColumns), - string.Join(",", SaveHistoryColumns.Select(i => "@" + i).ToArray())); - - foreach (var col in SaveHistoryColumns) - { - _saveInfoCommand.Parameters.Add(_saveInfoCommand, "@" + col); - } - _saveStatusCommand = _connection.CreateCommand(); _saveStatusCommand.CommandText = string.Format("replace into MetadataStatus ({0}) values ({1})", @@ -133,132 +102,6 @@ namespace MediaBrowser.Server.Implementations.Persistence } } - public IEnumerable<BaseProviderInfo> GetProviderHistory(Guid itemId) - { - if (itemId == Guid.Empty) - { - throw new ArgumentNullException("itemId"); - } - - using (var cmd = _connection.CreateCommand()) - { - var cmdText = "select " + string.Join(",", _historySelectColumns) + " from providerinfos where"; - - cmdText += " ItemId=@ItemId"; - cmd.Parameters.Add(cmd, "@ItemId", DbType.Guid).Value = itemId; - - cmd.CommandText = cmdText; - - using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) - { - while (reader.Read()) - { - yield return GetBaseProviderInfo(reader); - } - } - } - } - - /// <summary> - /// Gets the base provider information. - /// </summary> - /// <param name="reader">The reader.</param> - /// <returns>BaseProviderInfo.</returns> - private BaseProviderInfo GetBaseProviderInfo(IDataReader reader) - { - var item = new BaseProviderInfo - { - ProviderId = reader.GetGuid(0) - }; - - if (!reader.IsDBNull(1)) - { - item.ProviderVersion = reader.GetString(1); - } - - item.FileStamp = reader.GetGuid(2); - item.LastRefreshStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(3), true); - item.LastRefreshed = reader.GetDateTime(4).ToUniversalTime(); - - return item; - } - - public async Task SaveProviderHistory(Guid id, IEnumerable<BaseProviderInfo> infos, CancellationToken cancellationToken) - { - if (id == Guid.Empty) - { - throw new ArgumentNullException("id"); - } - - if (infos == null) - { - throw new ArgumentNullException("infos"); - } - - cancellationToken.ThrowIfCancellationRequested(); - - await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); - - IDbTransaction transaction = null; - - try - { - transaction = _connection.BeginTransaction(); - - _deleteInfosCommand.GetParameter(0).Value = id; - - _deleteInfosCommand.Transaction = transaction; - - _deleteInfosCommand.ExecuteNonQuery(); - - foreach (var stream in infos) - { - cancellationToken.ThrowIfCancellationRequested(); - - _saveInfoCommand.GetParameter(0).Value = id; - _saveInfoCommand.GetParameter(1).Value = stream.ProviderId; - _saveInfoCommand.GetParameter(2).Value = stream.ProviderVersion; - _saveInfoCommand.GetParameter(3).Value = stream.FileStamp; - _saveInfoCommand.GetParameter(4).Value = stream.LastRefreshStatus.ToString(); - _saveInfoCommand.GetParameter(5).Value = stream.LastRefreshed; - - _saveInfoCommand.Transaction = transaction; - _saveInfoCommand.ExecuteNonQuery(); - } - - transaction.Commit(); - } - catch (OperationCanceledException) - { - if (transaction != null) - { - transaction.Rollback(); - } - - throw; - } - catch (Exception e) - { - _logger.ErrorException("Failed to save provider info:", e); - - if (transaction != null) - { - transaction.Rollback(); - } - - throw; - } - finally - { - if (transaction != null) - { - transaction.Dispose(); - } - - _writeLock.Release(); - } - } - public MetadataStatus GetMetadataStatus(Guid itemId) { if (itemId == Guid.Empty) @@ -296,32 +139,42 @@ namespace MediaBrowser.Server.Implementations.Persistence if (!reader.IsDBNull(1)) { - result.DateLastMetadataRefresh = reader.GetDateTime(1).ToUniversalTime(); + result.ItemName = reader.GetString(1); } if (!reader.IsDBNull(2)) { - result.DateLastImagesRefresh = reader.GetDateTime(2).ToUniversalTime(); + result.SeriesName = reader.GetString(2); } if (!reader.IsDBNull(3)) { - result.LastStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(3), true); + result.DateLastMetadataRefresh = reader.GetDateTime(3).ToUniversalTime(); } if (!reader.IsDBNull(4)) { - result.LastErrorMessage = reader.GetString(4); + result.DateLastImagesRefresh = reader.GetDateTime(4).ToUniversalTime(); } if (!reader.IsDBNull(5)) { - result.MetadataProvidersRefreshed = reader.GetString(5).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); + result.LastStatus = (ProviderRefreshStatus)Enum.Parse(typeof(ProviderRefreshStatus), reader.GetString(5), true); } if (!reader.IsDBNull(6)) { - result.ImageProvidersRefreshed = reader.GetString(6).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); + result.LastErrorMessage = reader.GetString(6); + } + + if (!reader.IsDBNull(7)) + { + result.MetadataProvidersRefreshed = reader.GetString(7).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); + } + + if (!reader.IsDBNull(8)) + { + result.ImageProvidersRefreshed = reader.GetString(8).Split('|').Where(i => !string.IsNullOrEmpty(i)).Select(i => new Guid(i)).ToList(); } return result; @@ -345,12 +198,14 @@ namespace MediaBrowser.Server.Implementations.Persistence transaction = _connection.BeginTransaction(); _saveStatusCommand.GetParameter(0).Value = status.ItemId; - _saveStatusCommand.GetParameter(1).Value = status.DateLastMetadataRefresh; - _saveStatusCommand.GetParameter(2).Value = status.DateLastImagesRefresh; - _saveStatusCommand.GetParameter(3).Value = status.LastStatus.ToString(); - _saveStatusCommand.GetParameter(4).Value = status.LastErrorMessage; - _saveStatusCommand.GetParameter(5).Value = string.Join("|", status.MetadataProvidersRefreshed.ToArray()); - _saveStatusCommand.GetParameter(6).Value = string.Join("|", status.ImageProvidersRefreshed.ToArray()); + _saveStatusCommand.GetParameter(1).Value = status.ItemName; + _saveStatusCommand.GetParameter(2).Value = status.SeriesName; + _saveStatusCommand.GetParameter(3).Value = status.DateLastMetadataRefresh; + _saveStatusCommand.GetParameter(4).Value = status.DateLastImagesRefresh; + _saveStatusCommand.GetParameter(5).Value = status.LastStatus.ToString(); + _saveStatusCommand.GetParameter(6).Value = status.LastErrorMessage; + _saveStatusCommand.GetParameter(7).Value = string.Join("|", status.MetadataProvidersRefreshed.ToArray()); + _saveStatusCommand.GetParameter(8).Value = string.Join("|", status.ImageProvidersRefreshed.ToArray()); _saveStatusCommand.Transaction = transaction; diff --git a/MediaBrowser.Providers/RefreshIntrosTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs index bfe7e7609..a65b46f64 100644 --- a/MediaBrowser.Providers/RefreshIntrosTask.cs +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Logging; using System; @@ -7,7 +6,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; -namespace MediaBrowser.Providers +namespace MediaBrowser.Server.Implementations.ScheduledTasks { /// <summary> /// Class RefreshIntrosTask @@ -24,12 +23,13 @@ namespace MediaBrowser.Providers private readonly ILogger _logger; private readonly IFileSystem _fileSystem; - + /// <summary> - /// Initializes a new instance of the <see cref="RefreshIntrosTask"/> class. + /// Initializes a new instance of the <see cref="RefreshIntrosTask" /> class. /// </summary> /// <param name="libraryManager">The library manager.</param> /// <param name="logger">The logger.</param> + /// <param name="fileSystem">The file system.</param> public RefreshIntrosTask(ILibraryManager libraryManager, ILogger logger, IFileSystem fileSystem) { _libraryManager = libraryManager; diff --git a/MediaBrowser.Server.Implementations/ServerApplicationPaths.cs b/MediaBrowser.Server.Implementations/ServerApplicationPaths.cs index abb60a1d5..c36c49df0 100644 --- a/MediaBrowser.Server.Implementations/ServerApplicationPaths.cs +++ b/MediaBrowser.Server.Implementations/ServerApplicationPaths.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Implementations; +using System; +using MediaBrowser.Common.Implementations; using MediaBrowser.Controller; using System.IO; @@ -214,18 +215,6 @@ namespace MediaBrowser.Server.Implementations } /// <summary> - /// Gets the images data path. - /// </summary> - /// <value>The images data path.</value> - public string DownloadedImagesDataPath - { - get - { - return Path.Combine(DataPath, "remote-images"); - } - } - - /// <summary> /// Gets the artists path. /// </summary> /// <value>The artists path.</value> @@ -249,5 +238,20 @@ namespace MediaBrowser.Server.Implementations return Path.Combine(ItemsByNamePath, "GameGenre"); } } + + public string InternalMetadataPath + { + get + { + return Path.Combine(DataPath, "metadata"); + } + } + + public string GetInternalMetadataPath(Guid id) + { + var idString = id.ToString("N"); + + return Path.Combine(InternalMetadataPath, idString.Substring(0, 2), idString); + } } } |
