Browse Source

switch to generic lookup type

Luke Pulverenti 11 năm trước cách đây
mục cha
commit
b1713a16cd
74 tập tin đã thay đổi với 458 bổ sung202 xóa
  1. 14 2
      MediaBrowser.Controller/Entities/Audio/Audio.cs
  2. 24 3
      MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
  3. 12 1
      MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
  4. 22 3
      MediaBrowser.Controller/Entities/BaseItem.cs
  5. 8 2
      MediaBrowser.Controller/Entities/Book.cs
  6. 12 2
      MediaBrowser.Controller/Entities/Game.cs
  7. 11 1
      MediaBrowser.Controller/Entities/GameSystem.cs
  8. 3 4
      MediaBrowser.Controller/Entities/IHasMetadata.cs
  9. 69 2
      MediaBrowser.Controller/Entities/Movies/BoxSet.cs
  10. 6 1
      MediaBrowser.Controller/Entities/Movies/Movie.cs
  11. 7 1
      MediaBrowser.Controller/Entities/MusicVideo.cs
  12. 8 2
      MediaBrowser.Controller/Entities/Person.cs
  13. 20 3
      MediaBrowser.Controller/Entities/TV/Episode.cs
  14. 7 1
      MediaBrowser.Controller/Entities/TV/Series.cs
  15. 8 2
      MediaBrowser.Controller/Entities/Trailer.cs
  16. 2 1
      MediaBrowser.Controller/Library/IMetadataSaver.cs
  17. 2 2
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  18. 6 6
      MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
  19. 2 1
      MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs
  20. 1 0
      MediaBrowser.Controller/Providers/IHasChangeMonitor.cs
  21. 1 0
      MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs
  22. 1 0
      MediaBrowser.Controller/Providers/IMetadataProvider.cs
  23. 1 0
      MediaBrowser.Controller/Providers/IMetadataService.cs
  24. 5 9
      MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs
  25. 68 8
      MediaBrowser.Controller/Providers/ItemLookupInfo.cs
  26. 1 1
      MediaBrowser.Providers/AdultVideos/AdultVideoMetadataService.cs
  27. 2 1
      MediaBrowser.Providers/BaseXmlProvider.cs
  28. 1 1
      MediaBrowser.Providers/Books/BookMetadataService.cs
  29. 1 1
      MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
  30. 3 3
      MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
  31. 1 1
      MediaBrowser.Providers/Folders/FolderMetadataService.cs
  32. 1 1
      MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs
  33. 1 10
      MediaBrowser.Providers/Games/GameMetadataService.cs
  34. 1 10
      MediaBrowser.Providers/Games/GameSystemMetadataService.cs
  35. 1 1
      MediaBrowser.Providers/Genres/GenreMetadataService.cs
  36. 1 1
      MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs
  37. 1 1
      MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs
  38. 8 27
      MediaBrowser.Providers/Manager/MetadataService.cs
  39. 2 0
      MediaBrowser.Providers/MediaBrowser.Providers.csproj
  40. 2 1
      MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
  41. 4 4
      MediaBrowser.Providers/Movies/MovieDbProvider.cs
  42. 3 3
      MediaBrowser.Providers/Movies/MovieDbSearch.cs
  43. 26 0
      MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs
  44. 1 1
      MediaBrowser.Providers/Movies/MovieMetadataService.cs
  45. 1 1
      MediaBrowser.Providers/Movies/TrailerMetadataService.cs
  46. 1 18
      MediaBrowser.Providers/Music/AlbumMetadataService.cs
  47. 1 1
      MediaBrowser.Providers/Music/ArtistMetadataService.cs
  48. 1 1
      MediaBrowser.Providers/Music/AudioMetadataService.cs
  49. 4 4
      MediaBrowser.Providers/Music/LastfmAlbumProvider.cs
  50. 2 2
      MediaBrowser.Providers/Music/LastfmArtistProvider.cs
  51. 27 0
      MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs
  52. 3 3
      MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs
  53. 3 3
      MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs
  54. 1 1
      MediaBrowser.Providers/Music/MusicVideoMetadataService.cs
  55. 1 1
      MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs
  56. 3 3
      MediaBrowser.Providers/People/MovieDbPersonProvider.cs
  57. 1 1
      MediaBrowser.Providers/People/PersonMetadataService.cs
  58. 1 0
      MediaBrowser.Providers/Savers/AlbumXmlSaver.cs
  59. 2 1
      MediaBrowser.Providers/Savers/ChannelXmlSaver.cs
  60. 1 0
      MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs
  61. 1 0
      MediaBrowser.Providers/Savers/SeasonXmlSaver.cs
  62. 1 0
      MediaBrowser.Providers/Savers/SeriesXmlSaver.cs
  63. 1 1
      MediaBrowser.Providers/Studios/StudioMetadataService.cs
  64. 3 19
      MediaBrowser.Providers/TV/EpisodeMetadataService.cs
  65. 1 1
      MediaBrowser.Providers/TV/SeasonMetadataService.cs
  66. 1 2
      MediaBrowser.Providers/TV/SeriesMetadataService.cs
  67. 5 4
      MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
  68. 3 2
      MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
  69. 1 1
      MediaBrowser.Providers/Users/UserMetadataService.cs
  70. 1 1
      MediaBrowser.Providers/Videos/VideoMetadataService.cs
  71. 1 1
      MediaBrowser.Providers/Years/YearMetadataService.cs
  72. 2 2
      Nuget/MediaBrowser.Common.Internal.nuspec
  73. 1 1
      Nuget/MediaBrowser.Common.nuspec
  74. 2 2
      Nuget/MediaBrowser.Server.Core.nuspec

+ 14 - 2
MediaBrowser.Controller/Entities/Audio/Audio.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// <summary>
     /// Class Audio
     /// </summary>
-    public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres
+    public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo>
     {
         public Audio()
         {
@@ -127,5 +128,16 @@ namespace MediaBrowser.Controller.Entities.Audio
         {
             return config.BlockUnratedMusic;
         }
+
+        public SongInfo GetLookupInfo()
+        {
+            var info = GetItemLookupInfo<SongInfo>();
+
+            info.AlbumArtist = AlbumArtist;
+            info.Album = Album;
+            info.Artists = Artists;
+
+            return info;
+        }
     }
 }

+ 24 - 3
MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using System;
 using System.Collections.Generic;
@@ -10,10 +11,10 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// <summary>
     /// Class MusicAlbum
     /// </summary>
-    public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags
+    public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasTags, IHasLookupInfo<AlbumInfo>
     {
         public List<Guid> SoundtrackIds { get; set; }
-        
+
         public MusicAlbum()
         {
             Artists = new List<string>();
@@ -112,6 +113,26 @@ namespace MediaBrowser.Controller.Entities.Audio
         {
             return config.BlockUnratedMusic;
         }
+
+        public AlbumInfo GetLookupInfo()
+        {
+            var id = GetItemLookupInfo<AlbumInfo>();
+
+            id.AlbumArtist = AlbumArtist;
+
+            var artist = Parents.OfType<MusicArtist>().FirstOrDefault();
+
+            if (artist != null)
+            {
+                id.ArtistProviderIds = artist.ProviderIds;
+            }
+
+            id.SongInfos = RecursiveChildren.OfType<Audio>()
+                .Select(i => i.GetLookupInfo())
+                .ToList();
+
+            return id;
+        }
     }
 
     public class MusicAlbumDisc : Folder

+ 12 - 1
MediaBrowser.Controller/Entities/Audio/MusicArtist.cs

@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// <summary>
     /// Class MusicArtist
     /// </summary>
-    public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations
+    public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations, IHasLookupInfo<ArtistInfo>
     {
         [IgnoreDataMember]
         public List<ItemByNameCounts> UserItemCountList { get; set; }
@@ -201,5 +201,16 @@ namespace MediaBrowser.Controller.Entities.Audio
 
             progress.Report(100);
         }
+
+        public ArtistInfo GetLookupInfo()
+        {
+            var info = GetItemLookupInfo<ArtistInfo>();
+
+            info.SongInfos = RecursiveChildren.OfType<Audio>()
+                .Select(i => i.GetLookupInfo())
+                .ToList();
+
+            return info;
+        }
     }
 }

+ 22 - 3
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -21,7 +21,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// Class BaseItem
     /// </summary>
-    public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata
+    public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata, IHasLookupInfo<ItemLookupInfo>
     {
         protected BaseItem()
         {
@@ -236,7 +236,7 @@ namespace MediaBrowser.Controller.Entities
             {
                 var locationType = LocationType;
 
-                if (locationType != LocationType.Remote && locationType != LocationType.Virtual)
+                if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
                 {
                     return new string[] { };
                 }
@@ -610,7 +610,7 @@ namespace MediaBrowser.Controller.Entities
                     localTrailersChanged = await RefreshLocalTrailers(hasTrailers, options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
                 }
             }
-            
+
             if (themeSongsChanged || themeVideosChanged || localTrailersChanged)
             {
                 options.ForceSave = true;
@@ -1455,5 +1455,24 @@ namespace MediaBrowser.Controller.Entities
 
             return userdata == null || !userdata.Played;
         }
+
+        ItemLookupInfo IHasLookupInfo<ItemLookupInfo>.GetLookupInfo()
+        {
+            return GetItemLookupInfo<ItemLookupInfo>();
+        }
+
+        protected T GetItemLookupInfo<T>()
+            where T : ItemLookupInfo, new()
+        {
+            return new T
+            {
+                MetadataCountryCode = GetPreferredMetadataCountryCode(),
+                MetadataLanguage = GetPreferredMetadataLanguage(),
+                Name = Name,
+                ProviderIds = ProviderIds,
+                IndexNumber = IndexNumber,
+                ParentIndexNumber = ParentIndexNumber
+            };
+        }
     }
 }

+ 8 - 2
MediaBrowser.Controller/Entities/Book.cs

@@ -1,9 +1,10 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Entities
 {
-    public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage
+    public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage, IHasLookupInfo<BookInfo>
     {
         public override string MediaType
         {
@@ -38,5 +39,10 @@ namespace MediaBrowser.Controller.Entities
         {
             return config.BlockUnratedBooks;
         }
+
+        public BookInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<BookInfo>();
+        }
     }
 }

+ 12 - 2
MediaBrowser.Controller/Entities/Game.cs

@@ -1,11 +1,12 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using System;
 using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Entities
 {
-    public class Game : BaseItem, IHasSoundtracks, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, IHasPreferredMetadataLanguage
+    public class Game : BaseItem, IHasSoundtracks, IHasTrailers, IHasThemeMedia, IHasTags, IHasScreenshots, IHasPreferredMetadataLanguage, IHasLookupInfo<GameInfo>
     {
         public List<Guid> SoundtrackIds { get; set; }
 
@@ -115,5 +116,14 @@ namespace MediaBrowser.Controller.Entities
         {
             return config.BlockUnratedGames;
         }
+
+        public GameInfo GetLookupInfo()
+        {
+            var id = GetItemLookupInfo<GameInfo>();
+
+            id.GameSystem = GameSystem;
+
+            return id;
+        }
     }
 }

+ 11 - 1
MediaBrowser.Controller/Entities/GameSystem.cs

@@ -1,4 +1,5 @@
 using System.Runtime.Serialization;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using System;
 
@@ -7,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// Class GameSystem
     /// </summary>
-    public class GameSystem : Folder
+    public class GameSystem : Folder, IHasLookupInfo<GameSystemInfo>
     {
         /// <summary>
         /// Return the id that should be used to key display prefs for this item.
@@ -47,5 +48,14 @@ namespace MediaBrowser.Controller.Entities
             // Don't block. Determine by game
             return false;
         }
+
+        public GameSystemInfo GetLookupInfo()
+        {
+            var id = GetItemLookupInfo<GameSystemInfo>();
+
+            id.Path = Path;
+
+            return id;
+        }
     }
 }

+ 3 - 4
MediaBrowser.Controller/Providers/IHasMetadata.cs → MediaBrowser.Controller/Entities/IHasMetadata.cs

@@ -1,9 +1,8 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Entities;
-using System;
+using System;
 using System.Collections.Generic;
+using MediaBrowser.Model.Entities;
 
-namespace MediaBrowser.Controller.Providers
+namespace MediaBrowser.Controller.Entities
 {
     /// <summary>
     /// Interface IHasMetadata

+ 69 - 2
MediaBrowser.Controller/Entities/Movies/BoxSet.cs

@@ -1,15 +1,20 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Common.Progress;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
 using System;
 using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace MediaBrowser.Controller.Entities.Movies
 {
     /// <summary>
     /// Class BoxSet
     /// </summary>
-    public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder
+    public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer
     {
         public BoxSet()
         {
@@ -74,5 +79,67 @@ namespace MediaBrowser.Controller.Entities.Movies
             // Default sorting
             return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending);
         }
+
+        public BoxSetInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<BoxSetInfo>();
+        }
+
+        public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
+        {
+            // Refresh bottom up, children first, then the boxset
+            // By then hopefully the  movies within will have Tmdb collection values
+            var items = RecursiveChildren.ToList();
+
+            var totalItems = items.Count;
+            var percentages = new Dictionary<Guid, double>(totalItems);
+
+            var tasks = new List<Task>();
+
+            // Refresh songs
+            foreach (var item in items)
+            {
+                if (tasks.Count > 3)
+                {
+                    await Task.WhenAll(tasks).ConfigureAwait(false);
+                    tasks.Clear();
+                }
+
+                cancellationToken.ThrowIfCancellationRequested();
+                var innerProgress = new ActionableProgress<double>();
+
+                // Avoid implicitly captured closure
+                var currentChild = item;
+                innerProgress.RegisterAction(p =>
+                {
+                    lock (percentages)
+                    {
+                        percentages[currentChild.Id] = p / 100;
+
+                        var percent = percentages.Values.Sum();
+                        percent /= totalItems;
+                        percent *= 100;
+                        progress.Report(percent);
+                    }
+                });
+
+                tasks.Add(RefreshItem(item, refreshOptions, innerProgress, cancellationToken));
+            }
+
+            await Task.WhenAll(tasks).ConfigureAwait(false);
+            tasks.Clear();
+
+            // Refresh current item
+            await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+
+            progress.Report(100);
+        }
+
+        private async Task RefreshItem(BaseItem item, MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
+        {
+            await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
+
+            progress.Report(100);
+        }
     }
 }

+ 6 - 1
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
+    public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>
     {
         public List<Guid> SpecialFeatureIds { get; set; }
 
@@ -166,5 +166,10 @@ namespace MediaBrowser.Controller.Entities.Movies
         {
             return config.BlockUnratedMovies;
         }
+
+        public MovieInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<MovieInfo>();
+        }
     }
 }

+ 7 - 1
MediaBrowser.Controller/Entities/MusicVideo.cs

@@ -1,11 +1,12 @@
 using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using System;
 
 namespace MediaBrowser.Controller.Entities
 {
-    public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasBudget
+    public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasBudget, IHasLookupInfo<MusicVideoInfo>
     {
         /// <summary>
         /// Gets or sets the artist.
@@ -54,5 +55,10 @@ namespace MediaBrowser.Controller.Entities
         {
             return config.BlockUnratedMusic;
         }
+
+        public MusicVideoInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<MusicVideoInfo>();
+        }
     }
 }

+ 8 - 2
MediaBrowser.Controller/Entities/Person.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Dto;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Dto;
 using System.Collections.Generic;
 using System.Runtime.Serialization;
 
@@ -7,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// This is the full Person object that can be retrieved with all of it's data.
     /// </summary>
-    public class Person : BaseItem, IItemByName
+    public class Person : BaseItem, IItemByName, IHasLookupInfo<Providers.PersonLookupInfo>
     {
         public Person()
         {
@@ -31,6 +32,11 @@ namespace MediaBrowser.Controller.Entities
         {
             return "Person-" + Name;
         }
+
+        public Providers.PersonLookupInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<Providers.PersonLookupInfo>();
+        }
     }
 
     /// <summary>

+ 20 - 3
MediaBrowser.Controller/Entities/TV/Episode.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.TV
     /// <summary>
     /// Class Episode
     /// </summary>
-    public class Episode : Video
+    public class Episode : Video, IHasLookupInfo<EpisodeInfo>
     {
         /// <summary>
         /// Gets the season in which it aired.
@@ -41,7 +42,7 @@ namespace MediaBrowser.Controller.Entities.TV
         /// </summary>
         /// <value>The index number.</value>
         public int? IndexNumberEnd { get; set; }
-        
+
         /// <summary>
         /// We want to group into series not show individually in an index
         /// </summary>
@@ -233,5 +234,21 @@ namespace MediaBrowser.Controller.Entities.TV
         {
             return config.BlockUnratedSeries;
         }
+
+        public EpisodeInfo GetLookupInfo()
+        {
+            var id = GetItemLookupInfo<EpisodeInfo>();
+
+            var series = Series;
+
+            if (series != null)
+            {
+                id.SeriesProviderIds = series.ProviderIds;
+            }
+
+            id.IndexNumberEnd = IndexNumberEnd;
+
+            return id;
+        }
     }
 }

+ 7 - 1
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -1,5 +1,6 @@
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.TV
     /// <summary>
     /// Class Series
     /// </summary>
-    public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder
+    public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasTags, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>
     {
         public List<Guid> SpecialFeatureIds { get; set; }
         public List<Guid> SoundtrackIds { get; set; }
@@ -222,5 +223,10 @@ namespace MediaBrowser.Controller.Entities.TV
         }
 
         public string PreferredMetadataLanguage { get; set; }
+
+        public SeriesInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<SeriesInfo>();
+        }
     }
 }

+ 8 - 2
MediaBrowser.Controller/Entities/Trailer.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using System;
 using System.Collections.Generic;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// Class Trailer
     /// </summary>
-    public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasMetascore
+    public class Trailer : Video, IHasCriticRating, IHasSoundtracks, IHasBudget, IHasTrailers, IHasKeywords, IHasTaglines, IHasTags, IHasPreferredMetadataLanguage, IHasMetascore, IHasLookupInfo<TrailerInfo>
     {
         public List<Guid> SoundtrackIds { get; set; }
 
@@ -105,5 +106,10 @@ namespace MediaBrowser.Controller.Entities
         {
             return config.BlockUnratedTrailers;
         }
+
+        public TrailerInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<TrailerInfo>();
+        }
     }
 }

+ 2 - 1
MediaBrowser.Controller/Library/IMetadataSaver.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Providers;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
 using System.Threading;
 
 namespace MediaBrowser.Controller.Library

+ 2 - 2
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -146,7 +146,7 @@
     <Compile Include="Persistence\MediaStreamQuery.cs" />
     <Compile Include="Providers\ICustomMetadataProvider.cs" />
     <Compile Include="Providers\IHasChangeMonitor.cs" />
-    <Compile Include="Providers\IHasMetadata.cs" />
+    <Compile Include="Entities\IHasMetadata.cs" />
     <Compile Include="Providers\IImageProvider.cs" />
     <Compile Include="Providers\ILocalMetadataProvider.cs" />
     <Compile Include="Providers\IProviderRepository.cs" />
@@ -155,7 +155,7 @@
     <Compile Include="Providers\IMetadataProvider.cs" />
     <Compile Include="Providers\IMetadataService.cs" />
     <Compile Include="Providers\IRemoteMetadataProvider.cs" />
-    <Compile Include="Providers\ItemId.cs" />
+    <Compile Include="Providers\ItemLookupInfo.cs" />
     <Compile Include="Providers\MetadataRefreshOptions.cs" />
     <Compile Include="Providers\NameParser.cs" />
     <Compile Include="Providers\MetadataStatus.cs" />

+ 6 - 6
MediaBrowser.Controller/Providers/BaseItemXmlParser.cs

@@ -479,7 +479,7 @@ namespace MediaBrowser.Controller.Providers
 
                 case "Director":
                     {
-                        foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Director }))
+                        foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.Director }))
                         {
                             if (string.IsNullOrWhiteSpace(p.Name))
                             {
@@ -491,7 +491,7 @@ namespace MediaBrowser.Controller.Providers
                     }
                 case "Writer":
                     {
-                        foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
+                        foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
                         {
                             if (string.IsNullOrWhiteSpace(p.Name))
                             {
@@ -516,7 +516,7 @@ namespace MediaBrowser.Controller.Providers
                         else
                         {
                             // Old-style piped string
-                            foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
+                            foreach (var p in SplitNames(actors).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
                             {
                                 if (string.IsNullOrWhiteSpace(p.Name))
                                 {
@@ -530,7 +530,7 @@ namespace MediaBrowser.Controller.Providers
 
                 case "GuestStars":
                     {
-                        foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar }))
+                        foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new Entities.PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar }))
                         {
                             if (string.IsNullOrWhiteSpace(p.Name))
                             {
@@ -1195,7 +1195,7 @@ namespace MediaBrowser.Controller.Providers
         /// </summary>
         /// <param name="reader">The reader.</param>
         /// <returns>IEnumerable{PersonInfo}.</returns>
-        private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
+        private IEnumerable<Entities.PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
         {
             var name = string.Empty;
             var type = "Actor";  // If type is not specified assume actor
@@ -1257,7 +1257,7 @@ namespace MediaBrowser.Controller.Providers
                 }
             }
 
-            var personInfo = new PersonInfo
+            var personInfo = new Entities.PersonInfo
             {
                 Name = name.Trim(),
                 Role = role,

+ 2 - 1
MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
 using System.Threading;
 using System.Threading.Tasks;
 

+ 1 - 0
MediaBrowser.Controller/Providers/IHasChangeMonitor.cs

@@ -1,4 +1,5 @@
 using System;
+using MediaBrowser.Controller.Entities;
 
 namespace MediaBrowser.Controller.Providers
 {

+ 1 - 0
MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs

@@ -1,5 +1,6 @@
 using System.Threading;
 using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
 
 namespace MediaBrowser.Controller.Providers
 {

+ 1 - 0
MediaBrowser.Controller/Providers/IMetadataProvider.cs

@@ -1,4 +1,5 @@
 using System;
+using MediaBrowser.Controller.Entities;
 
 namespace MediaBrowser.Controller.Providers
 {

+ 1 - 0
MediaBrowser.Controller/Providers/IMetadataService.cs

@@ -1,5 +1,6 @@
 using System.Threading;
 using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
 
 namespace MediaBrowser.Controller.Providers
 {

+ 5 - 9
MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs

@@ -1,5 +1,6 @@
 using System.Threading;
 using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
 
 namespace MediaBrowser.Controller.Providers
 {
@@ -7,15 +8,10 @@ namespace MediaBrowser.Controller.Providers
     {
     }
 
-    public interface IRemoteMetadataProvider<TItemType> : IMetadataProvider<TItemType>, IRemoteMetadataProvider
-        where TItemType : IHasMetadata
+    public interface IRemoteMetadataProvider<TItemType, in TLookupInfoType> : IMetadataProvider<TItemType>, IRemoteMetadataProvider
+        where TItemType : IHasMetadata, IHasLookupInfo<TLookupInfoType>
+        where TLookupInfoType : ItemLookupInfo, new()
     {
-        /// <summary>
-        /// Gets the metadata.
-        /// </summary>
-        /// <param name="id">The identifier.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{MetadataResult{`0}}.</returns>
-        Task<MetadataResult<TItemType>> GetMetadata(ItemId id, CancellationToken cancellationToken);
+        Task<MetadataResult<TItemType>> GetMetadata(TLookupInfoType info, CancellationToken cancellationToken);
     }
 }

+ 68 - 8
MediaBrowser.Controller/Providers/ItemId.cs → MediaBrowser.Controller/Providers/ItemLookupInfo.cs

@@ -4,7 +4,7 @@ using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Providers
 {
-    public class ItemId : IHasProviderIds
+    public class ItemLookupInfo : IHasProviderIds
     {
         /// <summary>
         /// Gets or sets the name.
@@ -34,13 +34,29 @@ namespace MediaBrowser.Controller.Providers
         public int? IndexNumber { get; set; }
         public int? ParentIndexNumber { get; set; }
 
-        public ItemId()
+        public ItemLookupInfo()
         {
             ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
         }
     }
 
-    public class AlbumId : ItemId
+    public interface IHasLookupInfo<out TLookupInfoType>
+        where TLookupInfoType : ItemLookupInfo, new()
+    {
+        TLookupInfoType GetLookupInfo();
+    }
+
+    public class ArtistInfo : ItemLookupInfo
+    {
+        public List<SongInfo> SongInfos { get; set; }
+
+        public ArtistInfo()
+        {
+            SongInfos = new List<SongInfo>();
+        }
+    }
+
+    public class AlbumInfo : ItemLookupInfo
     {
         /// <summary>
         /// Gets or sets the album artist.
@@ -53,14 +69,16 @@ namespace MediaBrowser.Controller.Providers
         /// </summary>
         /// <value>The artist provider ids.</value>
         public Dictionary<string, string> ArtistProviderIds { get; set; }
+        public List<SongInfo> SongInfos { get; set; }
 
-        public AlbumId()
+        public AlbumInfo()
         {
             ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+            SongInfos = new List<SongInfo>();
         }
     }
 
-    public class GameId : ItemId
+    public class GameInfo : ItemLookupInfo
     {
         /// <summary>
         /// Gets or sets the game system.
@@ -69,7 +87,7 @@ namespace MediaBrowser.Controller.Providers
         public string GameSystem { get; set; }
     }
 
-    public class GameSystemId : ItemId
+    public class GameSystemInfo : ItemLookupInfo
     {
         /// <summary>
         /// Gets or sets the path.
@@ -78,15 +96,57 @@ namespace MediaBrowser.Controller.Providers
         public string Path { get; set; }
     }
 
-    public class EpisodeId : ItemId
+    public class EpisodeInfo : ItemLookupInfo
     {
         public Dictionary<string, string> SeriesProviderIds { get; set; }
 
         public int? IndexNumberEnd { get; set; }
 
-        public EpisodeId()
+        public EpisodeInfo()
         {
             SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
         }
     }
+
+    public class SongInfo : ItemLookupInfo
+    {
+        public string AlbumArtist { get; set; }
+        public string Album { get; set; }
+        public List<string> Artists { get; set; }
+    }
+
+    public class SeriesInfo : ItemLookupInfo
+    {
+
+    }
+
+    public class PersonLookupInfo : ItemLookupInfo
+    {
+        
+    }
+
+    public class MovieInfo : ItemLookupInfo
+    {
+
+    }
+
+    public class BoxSetInfo : ItemLookupInfo
+    {
+
+    }
+
+    public class MusicVideoInfo : ItemLookupInfo
+    {
+
+    }
+
+    public class TrailerInfo : ItemLookupInfo
+    {
+
+    }
+
+    public class BookInfo : ItemLookupInfo
+    {
+        
+    }
 }

+ 1 - 1
MediaBrowser.Providers/AdultVideos/AdultVideoMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.AdultVideos
 {
-    class AdultVideoMetadataService : MetadataService<AdultVideo, ItemId>
+    class AdultVideoMetadataService : MetadataService<AdultVideo, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 2 - 1
MediaBrowser.Providers/BaseXmlProvider.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Providers;
 using System;
 using System.IO;
@@ -64,7 +65,7 @@ namespace MediaBrowser.Providers
                 return false;
             }
 
-            return FileSystem.GetLastWriteTimeUtc(file) > date;
+            return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date;
         }
 
         public string Name

+ 1 - 1
MediaBrowser.Providers/Books/BookMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Books
 {
-    public class BookMetadataService : MetadataService<Book, ItemId>
+    public class BookMetadataService : MetadataService<Book, BookInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs

@@ -16,7 +16,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.BoxSets
 {
-    public class BoxSetMetadataService : MetadataService<BoxSet, ItemId>
+    public class BoxSetMetadataService : MetadataService<BoxSet, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILocalizationManager _iLocalizationManager;

+ 3 - 3
MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs

@@ -17,7 +17,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.BoxSets
 {
-    public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet>
+    public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo>
     {
         private  readonly CultureInfo _enUs = new CultureInfo("en-US");
         private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images";
@@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.BoxSets
             Current = this;
         }
 
-        public async Task<MetadataResult<BoxSet>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public async Task<MetadataResult<BoxSet>> GetMetadata(BoxSetInfo id, CancellationToken cancellationToken)
         {
             var tmdbId = id.GetProviderId(MetadataProviders.Tmdb);
 
@@ -188,7 +188,7 @@ namespace MediaBrowser.Providers.BoxSets
             return DownloadInfo(tmdbId, preferredMetadataLanguage, cancellationToken);
         }
         
-        private Task<string> GetTmdbId(ItemId id, CancellationToken cancellationToken)
+        private Task<string> GetTmdbId(ItemLookupInfo id, CancellationToken cancellationToken)
         {
             return new MovieDbSearch(_logger, _json).FindCollectionId(id, cancellationToken);
         }

+ 1 - 1
MediaBrowser.Providers/Folders/FolderMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Folders
 {
-    public class FolderMetadataService : MetadataService<Folder, ItemId>
+    public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.GameGenres
 {
-    public class GameGenreMetadataService : MetadataService<GameGenre, ItemId>
+    public class GameGenreMetadataService : MetadataService<GameGenre, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 10
MediaBrowser.Providers/Games/GameMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Games
 {
-    public class GameMetadataService : MetadataService<Game, GameId>
+    public class GameMetadataService : MetadataService<Game, GameInfo>
     {
         private readonly ILibraryManager _libraryManager;
 
@@ -44,14 +44,5 @@ namespace MediaBrowser.Providers.Games
         {
             return _libraryManager.UpdateItem(item, reason, cancellationToken);
         }
-
-        protected override GameId GetId(Game item)
-        {
-            var id = base.GetId(item);
-
-            id.GameSystem = item.GameSystem;
-
-            return id;
-        }
     }
 }

+ 1 - 10
MediaBrowser.Providers/Games/GameSystemMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Games
 {
-    public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemId>
+    public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemInfo>
     {
         private readonly ILibraryManager _libraryManager;
 
@@ -44,14 +44,5 @@ namespace MediaBrowser.Providers.Games
         {
             return _libraryManager.UpdateItem(item, reason, cancellationToken);
         }
-
-        protected override GameSystemId GetId(GameSystem item)
-        {
-            var id = base.GetId(item);
-
-            id.Path = item.Path;
-
-            return id;
-        }
     }
 }

+ 1 - 1
MediaBrowser.Providers/Genres/GenreMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Genres
 {
-    public class GenreMetadataService : MetadataService<Genre, ItemId>
+    public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.LiveTv
 {
-    public class ChannelMetadataService : MetadataService<LiveTvChannel, ItemId>
+    public class ChannelMetadataService : MetadataService<LiveTvChannel, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.LiveTv
 {
-    public class ProgramMetadataService : MetadataService<LiveTvProgram, ItemId>
+    public class ProgramMetadataService : MetadataService<LiveTvProgram, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 8 - 27
MediaBrowser.Providers/Manager/MetadataService.cs

@@ -16,8 +16,8 @@ using System.Threading.Tasks;
 namespace MediaBrowser.Providers.Manager
 {
     public abstract class MetadataService<TItemType, TIdType> : IMetadataService
-        where TItemType : IHasMetadata, new()
-        where TIdType : ItemId, new()
+        where TItemType : IHasMetadata, IHasLookupInfo<TIdType>, new()
+        where TIdType : ItemLookupInfo, new()
     {
         protected readonly IServerConfigurationManager ServerConfigurationManager;
         protected readonly ILogger Logger;
@@ -238,27 +238,6 @@ namespace MediaBrowser.Providers.Manager
 
         protected abstract Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken);
 
-        protected virtual TIdType GetId(TItemType item)
-        {
-            var id = new TIdType
-            {
-                MetadataCountryCode = item.GetPreferredMetadataCountryCode(),
-                MetadataLanguage = item.GetPreferredMetadataLanguage(),
-                Name = item.Name,
-                ProviderIds = item.ProviderIds
-            };
-
-            var baseItem = item as BaseItem;
-
-            if (baseItem != null)
-            {
-                id.IndexNumber = baseItem.IndexNumber;
-                id.ParentIndexNumber = baseItem.ParentIndexNumber;
-            }
-
-            return id;
-        }
-
         public bool CanRefresh(IHasMetadata item)
         {
             return item is TItemType;
@@ -278,7 +257,7 @@ namespace MediaBrowser.Providers.Manager
             // If replacing all metadata, run internet providers first
             if (options.ReplaceAllMetadata)
             {
-                await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType>>(), refreshResult, cancellationToken).ConfigureAwait(false);
+                await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false);
             }
 
             var hasLocalMetadata = false;
@@ -326,7 +305,7 @@ namespace MediaBrowser.Providers.Manager
 
             if (!options.ReplaceAllMetadata && !hasLocalMetadata)
             {
-                await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType>>(), refreshResult, cancellationToken).ConfigureAwait(false);
+                await ExecuteRemoteProviders(item, temp, providers.OfType<IRemoteMetadataProvider<TItemType, TIdType>>(), refreshResult, cancellationToken).ConfigureAwait(false);
             }
 
             if (refreshResult.UpdateType > ItemUpdateType.Unspecified)
@@ -367,14 +346,16 @@ namespace MediaBrowser.Providers.Manager
             return new TItemType();
         }
 
-        private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, IEnumerable<IRemoteMetadataProvider<TItemType>> providers, RefreshResult refreshResult, CancellationToken cancellationToken)
+        private async Task ExecuteRemoteProviders(TItemType item, TItemType temp, IEnumerable<IRemoteMetadataProvider<TItemType, TIdType>> providers, RefreshResult refreshResult, CancellationToken cancellationToken)
         {
-            var id = GetId(item);
+            TIdType id = null;
 
             foreach (var provider in providers)
             {
                 Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
 
+                id = id ?? item.GetLookupInfo();
+
                 try
                 {
                     var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false);

+ 2 - 0
MediaBrowser.Providers/MediaBrowser.Providers.csproj

@@ -93,6 +93,7 @@
     <Compile Include="MediaInfo\FFProbeHelpers.cs" />
     <Compile Include="MediaInfo\FFProbeProvider.cs" />
     <Compile Include="MediaInfo\FFProbeVideoInfo.cs" />
+    <Compile Include="Movies\MovieDbTrailerProvider.cs" />
     <Compile Include="Movies\TrailerMetadataService.cs" />
     <Compile Include="Movies\GenericMovieDbInfo.cs" />
     <Compile Include="Movies\MovieDbSearch.cs" />
@@ -115,6 +116,7 @@
     <Compile Include="Music\ArtistMetadataService.cs" />
     <Compile Include="Music\AudioMetadataService.cs" />
     <Compile Include="Music\LastfmArtistProvider.cs" />
+    <Compile Include="Music\MovieDbMusicVideoProvider.cs" />
     <Compile Include="Music\MusicBrainzArtistProvider.cs" />
     <Compile Include="Music\MusicVideoMetadataService.cs" />
     <Compile Include="Music\MusicVideoXmlProvider.cs" />

+ 2 - 1
MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs

@@ -12,6 +12,7 @@ using System.Linq;
 using System.Net;
 using System.Threading;
 using System.Threading.Tasks;
+using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
 
 namespace MediaBrowser.Providers.Movies
 {
@@ -29,7 +30,7 @@ namespace MediaBrowser.Providers.Movies
             _jsonSerializer = jsonSerializer;
         }
 
-        public async Task<MetadataResult<T>> GetMetadata(ItemId itemId, CancellationToken cancellationToken)
+        public async Task<MetadataResult<T>> GetMetadata(ItemLookupInfo itemId, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<T>();
 

+ 4 - 4
MediaBrowser.Providers/Movies/MovieDbProvider.cs

@@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.Movies
     /// <summary>
     /// Class MovieDbProvider
     /// </summary>
-    public class MovieDbProvider : IRemoteMetadataProvider<Movie>, IDisposable, IHasChangeMonitor
+    public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable, IHasChangeMonitor
     {
         internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1);
 
@@ -41,12 +41,12 @@ namespace MediaBrowser.Providers.Movies
             Current = this;
         }
 
-        public Task<MetadataResult<Movie>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public Task<MetadataResult<Movie>> GetMetadata(MovieInfo info, CancellationToken cancellationToken)
         {
-            return GetItemMetadata<Movie>(id, cancellationToken);
+            return GetItemMetadata<Movie>(info, cancellationToken);
         }
 
-        public Task<MetadataResult<T>> GetItemMetadata<T>(ItemId id, CancellationToken cancellationToken)
+        public Task<MetadataResult<T>> GetItemMetadata<T>(ItemLookupInfo id, CancellationToken cancellationToken)
             where T : Video, new ()
         {
             var movieDb = new GenericMovieDbInfo<T>(_logger, _jsonSerializer);

+ 3 - 3
MediaBrowser.Providers/Movies/MovieDbSearch.cs

@@ -29,17 +29,17 @@ namespace MediaBrowser.Providers.Movies
             _json = json;
         }
 
-        public Task<string> FindMovieId(ItemId idInfo, CancellationToken cancellationToken)
+        public Task<string> FindMovieId(ItemLookupInfo idInfo, CancellationToken cancellationToken)
         {
             return FindId(idInfo, "movie", cancellationToken);
         }
 
-        public Task<string> FindCollectionId(ItemId idInfo, CancellationToken cancellationToken)
+        public Task<string> FindCollectionId(ItemLookupInfo idInfo, CancellationToken cancellationToken)
         {
             return FindId(idInfo, "collection", cancellationToken);
         }
 
-        private async Task<string> FindId(ItemId idInfo, string searchType, CancellationToken cancellationToken)
+        private async Task<string> FindId(ItemLookupInfo idInfo, string searchType, CancellationToken cancellationToken)
         {
             int? yearInName;
             var name = idInfo.Name;

+ 26 - 0
MediaBrowser.Providers/Movies/MovieDbTrailerProvider.cs

@@ -0,0 +1,26 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Providers.Movies
+{
+    public class MovieDbTrailerProvider : IRemoteMetadataProvider<Trailer, TrailerInfo>, IHasChangeMonitor
+    {
+        public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken)
+        {
+            return MovieDbProvider.Current.GetItemMetadata<Trailer>(info, cancellationToken);
+        }
+
+        public string Name
+        {
+            get { return MovieDbProvider.Current.Name; }
+        }
+
+        public bool HasChanged(IHasMetadata item, DateTime date)
+        {
+            return MovieDbProvider.Current.HasChanged(item, date);
+        }
+    }
+}

+ 1 - 1
MediaBrowser.Providers/Movies/MovieMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Movies
 {
-    public class MovieMetadataService : MetadataService<Movie, ItemId>
+    public class MovieMetadataService : MetadataService<Movie, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/Movies/TrailerMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Movies
 {
-    public class TrailerMetadataService : MetadataService<Trailer, ItemId>
+    public class TrailerMetadataService : MetadataService<Trailer, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 18
MediaBrowser.Providers/Music/AlbumMetadataService.cs

@@ -14,7 +14,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumId>
+    public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo>
     {
         private readonly ILibraryManager _libraryManager;
 
@@ -102,23 +102,6 @@ namespace MediaBrowser.Providers.Music
             return updateType;
         }
 
-        protected override AlbumId GetId(MusicAlbum item)
-        {
-            var id = base.GetId(item);
-
-            id.AlbumArtist = item.AlbumArtist;
-
-            var artist = item.Parents.OfType<MusicArtist>().FirstOrDefault();
-
-            if (artist != null)
-            {
-                id.ArtistProviderIds = artist.ProviderIds;
-                id.AlbumArtist = id.AlbumArtist ?? artist.Name;
-            }
-
-            return id;
-        }
-
         private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
         {
             var updateType = ItemUpdateType.Unspecified;

+ 1 - 1
MediaBrowser.Providers/Music/ArtistMetadataService.cs

@@ -14,7 +14,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class ArtistMetadataService : MetadataService<MusicArtist, ItemId>
+    public class ArtistMetadataService : MetadataService<MusicArtist, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/Music/AudioMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class AudioMetadataService : MetadataService<Audio, ItemId>
+    public class AudioMetadataService : MetadataService<Audio, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 4 - 4
MediaBrowser.Providers/Music/LastfmAlbumProvider.cs

@@ -14,7 +14,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum>, IHasOrder
+    public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
     {
         private readonly IJsonSerializer _json;
         private readonly IHttpClient _httpClient;
@@ -30,11 +30,11 @@ namespace MediaBrowser.Providers.Music
             _logger = logger;
         }
 
-        public async Task<MetadataResult<MusicAlbum>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<MusicAlbum>();
 
-            var lastFmData = await GetAlbumResult((AlbumId)id, cancellationToken).ConfigureAwait(false);
+            var lastFmData = await GetAlbumResult(id, cancellationToken).ConfigureAwait(false);
 
             if (lastFmData != null && lastFmData.album != null)
             {
@@ -45,7 +45,7 @@ namespace MediaBrowser.Providers.Music
             return result;
         }
 
-        private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumId item, CancellationToken cancellationToken)
+        private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumInfo item, CancellationToken cancellationToken)
         {
             // Try album release Id
             if (!string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Musicbrainz)))

+ 2 - 2
MediaBrowser.Providers/Music/LastfmArtistProvider.cs

@@ -17,7 +17,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist>, IHasOrder
+    public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>, IHasOrder
     {
         private readonly IJsonSerializer _json;
         private readonly IHttpClient _httpClient;
@@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Music
             _logger = logger;
         }
 
-        public async Task<MetadataResult<MusicArtist>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo id, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<MusicArtist>();
 

+ 27 - 0
MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs

@@ -0,0 +1,27 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Providers.Movies;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Providers.Music
+{
+    public class MovieDbMusicVideoProvider : IRemoteMetadataProvider<MusicVideo, MusicVideoInfo>, IHasChangeMonitor
+    {
+        public Task<MetadataResult<MusicVideo>> GetMetadata(MusicVideoInfo info, CancellationToken cancellationToken)
+        {
+            return MovieDbProvider.Current.GetItemMetadata<MusicVideo>(info, cancellationToken);
+        }
+
+        public string Name
+        {
+            get { return MovieDbProvider.Current.Name; }
+        }
+
+        public bool HasChanged(IHasMetadata item, DateTime date)
+        {
+            return MovieDbProvider.Current.HasChanged(item, date);
+        }
+    }
+}

+ 3 - 3
MediaBrowser.Providers/Music/MusicBrainzAlbumProvider.cs

@@ -13,7 +13,7 @@ using System.Xml;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum>, IHasOrder
+    public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
     {
         internal static MusicBrainzAlbumProvider Current;
 
@@ -27,9 +27,9 @@ namespace MediaBrowser.Providers.Music
             Current = this;
         }
 
-        public async Task<MetadataResult<MusicAlbum>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo id, CancellationToken cancellationToken)
         {
-            var albumId = (AlbumId)id;
+            var albumId = id;
             var releaseId = albumId.GetProviderId(MetadataProviders.Musicbrainz);
             var releaseGroupId = albumId.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
 

+ 3 - 3
MediaBrowser.Providers/Music/MusicBrainzArtistProvider.cs

@@ -12,9 +12,9 @@ using System.Xml;
 
 namespace MediaBrowser.Providers.Music
 {
-    public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist>
+    public class MusicBrainzArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>
     {
-        public async Task<MetadataResult<MusicArtist>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo id, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<MusicArtist>();
 
@@ -39,7 +39,7 @@ namespace MediaBrowser.Providers.Music
         /// <param name="item">The item.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{System.String}.</returns>
-        private async Task<string> FindId(ItemId item, CancellationToken cancellationToken)
+        private async Task<string> FindId(ItemLookupInfo item, CancellationToken cancellationToken)
         {
             // They seem to throw bad request failures on any term with a slash
             var nameToSearch = item.Name.Replace('/', ' ');

+ 1 - 1
MediaBrowser.Providers/Music/MusicVideoMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Music
 {
-    class MusicVideoMetadataService : MetadataService<MusicVideo, ItemId>
+    class MusicVideoMetadataService : MetadataService<MusicVideo, MusicVideoInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.MusicGenres
 {
-    public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemId>
+    public class MusicGenreMetadataService : MetadataService<MusicGenre, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 3 - 3
MediaBrowser.Providers/People/MovieDbPersonProvider.cs

@@ -18,7 +18,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.People
 {
-    public class MovieDbPersonProvider : IRemoteMetadataProvider<Person>
+    public class MovieDbPersonProvider : IRemoteMetadataProvider<Person, PersonLookupInfo>
     {
         const string DataFileName = "info.json";
         
@@ -40,8 +40,8 @@ namespace MediaBrowser.Providers.People
         {
             get { return "TheMovieDb"; }
         }
-        
-        public async Task<MetadataResult<Person>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+
+        public async Task<MetadataResult<Person>> GetMetadata(PersonLookupInfo id, CancellationToken cancellationToken)
         {
             var tmdbId = id.GetProviderId(MetadataProviders.Tmdb);
 

+ 1 - 1
MediaBrowser.Providers/People/PersonMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.People
 {
-    public class PersonMetadataService : MetadataService<Person, ItemId>
+    public class PersonMetadataService : MetadataService<Person, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 0
MediaBrowser.Providers/Savers/AlbumXmlSaver.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;

+ 2 - 1
MediaBrowser.Providers/Savers/ChannelXmlSaver.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Providers;
 using System.Collections.Generic;

+ 1 - 0
MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Persistence;

+ 1 - 0
MediaBrowser.Providers/Savers/SeasonXmlSaver.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;

+ 1 - 0
MediaBrowser.Providers/Savers/SeriesXmlSaver.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;

+ 1 - 1
MediaBrowser.Providers/Studios/StudioMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Studios
 {
-    public class StudioMetadataService : MetadataService<Studio, ItemId>
+    public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 3 - 19
MediaBrowser.Providers/TV/EpisodeMetadataService.cs

@@ -1,5 +1,4 @@
-using System.IO;
-using MediaBrowser.Common.IO;
+using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
@@ -8,12 +7,13 @@ using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Providers.Manager;
 using System.Collections.Generic;
+using System.IO;
 using System.Threading;
 using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.TV
 {
-    public class EpisodeMetadataService : MetadataService<Episode, EpisodeId>
+    public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
     {
         private readonly ILibraryManager _libraryManager;
 
@@ -76,22 +76,6 @@ namespace MediaBrowser.Providers.TV
             return _libraryManager.UpdateItem(item, reason, cancellationToken);
         }
 
-        protected override EpisodeId GetId(Episode item)
-        {
-            var id = base.GetId(item);
-
-            var series = item.Series;
-
-            if (series != null)
-            {
-                id.SeriesProviderIds = series.ProviderIds;
-            }
-
-            id.IndexNumberEnd = item.IndexNumberEnd;
-
-            return id;
-        }
-
         protected override ItemUpdateType BeforeMetadataRefresh(Episode item)
         {
             var updateType = base.BeforeMetadataRefresh(item);

+ 1 - 1
MediaBrowser.Providers/TV/SeasonMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.TV
 {
-    public class SeasonMetadataService : MetadataService<Season, ItemId>
+    public class SeasonMetadataService : MetadataService<Season, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 2
MediaBrowser.Providers/TV/SeriesMetadataService.cs

@@ -13,7 +13,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.TV
 {
-    public class SeriesMetadataService : MetadataService<Series, ItemId>
+    public class SeriesMetadataService : MetadataService<Series, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 
@@ -59,7 +59,6 @@ namespace MediaBrowser.Providers.TV
 
             if (dateLastEpisodeAdded != item.DateLastEpisodeAdded)
             {
-                Logger.Debug("DateLastEpisodeAdded changed for {0}", item.Path);
                 updateType = updateType | ItemUpdateType.MetadataImport;
             }
 

+ 5 - 4
MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs

@@ -16,6 +16,7 @@ using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Xml;
+using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
 
 namespace MediaBrowser.Providers.TV
 {
@@ -23,7 +24,7 @@ namespace MediaBrowser.Providers.TV
     /// <summary>
     /// Class RemoteEpisodeProvider
     /// </summary>
-    class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode>, IHasChangeMonitor
+    class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode, EpisodeInfo>, IHasChangeMonitor
     {
         internal static TvdbEpisodeProvider Current;
         private readonly IFileSystem _fileSystem;
@@ -41,9 +42,9 @@ namespace MediaBrowser.Providers.TV
             get { return "TheTVDB"; }
         }
 
-        public Task<MetadataResult<Episode>> GetMetadata(ItemId id, CancellationToken cancellationToken)
+        public Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo id, CancellationToken cancellationToken)
         {
-            var episodeId = (EpisodeId)id;
+            var episodeId = id;
 
             string seriesTvdbId;
             episodeId.SeriesProviderIds.TryGetValue(MetadataProviders.Tvdb.ToString(), out seriesTvdbId);
@@ -172,7 +173,7 @@ namespace MediaBrowser.Providers.TV
         /// <param name="seriesDataPath">The series data path.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{System.Boolean}.</returns>
-        private Episode FetchEpisodeData(EpisodeId id, string seriesDataPath, CancellationToken cancellationToken)
+        private Episode FetchEpisodeData(EpisodeInfo id, string seriesDataPath, CancellationToken cancellationToken)
         {
             if (id.IndexNumber == null)
             {

+ 3 - 2
MediaBrowser.Providers/TV/TvdbSeriesProvider.cs

@@ -19,10 +19,11 @@ 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>, IHasChangeMonitor
+    public class TvdbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasChangeMonitor
     {
         internal readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(2, 2);
         internal static TvdbSeriesProvider Current { get; private set; }
@@ -47,7 +48,7 @@ namespace MediaBrowser.Providers.TV
         private const string SeriesQuery = "GetSeries.php?seriesname={0}";
         private const string SeriesGetZip = "http://www.thetvdb.com/api/{0}/series/{1}/all/{2}.zip";
 
-        public async Task<MetadataResult<Series>> GetMetadata(ItemId itemId, CancellationToken cancellationToken)
+        public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo itemId, CancellationToken cancellationToken)
         {
             var result = new MetadataResult<Series>();
 

+ 1 - 1
MediaBrowser.Providers/Users/UserMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Users
 {
-    public class UserMetadataService : MetadataService<User, ItemId>
+    public class UserMetadataService : MetadataService<User, ItemLookupInfo>
     {
         private readonly IUserManager _userManager;
 

+ 1 - 1
MediaBrowser.Providers/Videos/VideoMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Videos
 {
-    public class VideoMetadataService : MetadataService<Video, ItemId>
+    public class VideoMetadataService : MetadataService<Video, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 1 - 1
MediaBrowser.Providers/Years/YearMetadataService.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 namespace MediaBrowser.Providers.Years
 {
-    public class YearMetadataService : MetadataService<Year, ItemId>
+    public class YearMetadataService : MetadataService<Year, ItemLookupInfo>
     {
         private readonly ILibraryManager _libraryManager;
 

+ 2 - 2
Nuget/MediaBrowser.Common.Internal.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.318</version>
+        <version>3.0.320</version>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.318" />
+            <dependency id="MediaBrowser.Common" version="3.0.320" />
             <dependency id="NLog" version="2.1.0" />
             <dependency id="SimpleInjector" version="2.4.1" />
             <dependency id="sharpcompress" version="0.10.2" />

+ 1 - 1
Nuget/MediaBrowser.Common.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Common</id>
-        <version>3.0.318</version>
+        <version>3.0.320</version>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>

+ 2 - 2
Nuget/MediaBrowser.Server.Core.nuspec

@@ -2,7 +2,7 @@
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.318</version>
+        <version>3.0.320</version>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.318" />
+            <dependency id="MediaBrowser.Common" version="3.0.320" />
         </dependencies>
     </metadata>
     <files>