Browse Source

switch to generic lookup type

Luke Pulverenti 11 years ago
parent
commit
b1713a16cd
74 changed files with 458 additions and 202 deletions
  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;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// <summary>
     /// <summary>
     /// Class Audio
     /// Class Audio
     /// </summary>
     /// </summary>
-    public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres
+    public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo>
     {
     {
         public Audio()
         public Audio()
         {
         {
@@ -127,5 +128,16 @@ namespace MediaBrowser.Controller.Entities.Audio
         {
         {
             return config.BlockUnratedMusic;
             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 MediaBrowser.Model.Entities;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -10,10 +11,10 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// <summary>
     /// <summary>
     /// Class MusicAlbum
     /// Class MusicAlbum
     /// </summary>
     /// </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 List<Guid> SoundtrackIds { get; set; }
-        
+
         public MusicAlbum()
         public MusicAlbum()
         {
         {
             Artists = new List<string>();
             Artists = new List<string>();
@@ -112,6 +113,26 @@ namespace MediaBrowser.Controller.Entities.Audio
         {
         {
             return config.BlockUnratedMusic;
             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
     public class MusicAlbumDisc : Folder

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

@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// <summary>
     /// <summary>
     /// Class MusicArtist
     /// Class MusicArtist
     /// </summary>
     /// </summary>
-    public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations
+    public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations, IHasLookupInfo<ArtistInfo>
     {
     {
         [IgnoreDataMember]
         [IgnoreDataMember]
         public List<ItemByNameCounts> UserItemCountList { get; set; }
         public List<ItemByNameCounts> UserItemCountList { get; set; }
@@ -201,5 +201,16 @@ namespace MediaBrowser.Controller.Entities.Audio
 
 
             progress.Report(100);
             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>
     /// <summary>
     /// Class BaseItem
     /// Class BaseItem
     /// </summary>
     /// </summary>
-    public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata
+    public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata, IHasLookupInfo<ItemLookupInfo>
     {
     {
         protected BaseItem()
         protected BaseItem()
         {
         {
@@ -236,7 +236,7 @@ namespace MediaBrowser.Controller.Entities
             {
             {
                 var locationType = LocationType;
                 var locationType = LocationType;
 
 
-                if (locationType != LocationType.Remote && locationType != LocationType.Virtual)
+                if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
                 {
                 {
                     return new string[] { };
                     return new string[] { };
                 }
                 }
@@ -610,7 +610,7 @@ namespace MediaBrowser.Controller.Entities
                     localTrailersChanged = await RefreshLocalTrailers(hasTrailers, options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
                     localTrailersChanged = await RefreshLocalTrailers(hasTrailers, options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
                 }
                 }
             }
             }
-            
+
             if (themeSongsChanged || themeVideosChanged || localTrailersChanged)
             if (themeSongsChanged || themeVideosChanged || localTrailersChanged)
             {
             {
                 options.ForceSave = true;
                 options.ForceSave = true;
@@ -1455,5 +1455,24 @@ namespace MediaBrowser.Controller.Entities
 
 
             return userdata == null || !userdata.Played;
             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;
 using System.Collections.Generic;
 
 
 namespace MediaBrowser.Controller.Entities
 namespace MediaBrowser.Controller.Entities
 {
 {
-    public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage
+    public class Book : BaseItem, IHasTags, IHasPreferredMetadataLanguage, IHasLookupInfo<BookInfo>
     {
     {
         public override string MediaType
         public override string MediaType
         {
         {
@@ -38,5 +39,10 @@ namespace MediaBrowser.Controller.Entities
         {
         {
             return config.BlockUnratedBooks;
             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 MediaBrowser.Model.Entities;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 
 
 namespace MediaBrowser.Controller.Entities
 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; }
         public List<Guid> SoundtrackIds { get; set; }
 
 
@@ -115,5 +116,14 @@ namespace MediaBrowser.Controller.Entities
         {
         {
             return config.BlockUnratedGames;
             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 System.Runtime.Serialization;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Configuration;
 using System;
 using System;
 
 
@@ -7,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// <summary>
     /// Class GameSystem
     /// Class GameSystem
     /// </summary>
     /// </summary>
-    public class GameSystem : Folder
+    public class GameSystem : Folder, IHasLookupInfo<GameSystemInfo>
     {
     {
         /// <summary>
         /// <summary>
         /// Return the id that should be used to key display prefs for this item.
         /// 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
             // Don't block. Determine by game
             return false;
             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 System.Collections.Generic;
+using MediaBrowser.Model.Entities;
 
 
-namespace MediaBrowser.Controller.Providers
+namespace MediaBrowser.Controller.Entities
 {
 {
     /// <summary>
     /// <summary>
     /// Interface IHasMetadata
     /// 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.Entities;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Controller.Entities.Movies
 namespace MediaBrowser.Controller.Entities.Movies
 {
 {
     /// <summary>
     /// <summary>
     /// Class BoxSet
     /// Class BoxSet
     /// </summary>
     /// </summary>
-    public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder
+    public class BoxSet : Folder, IHasTrailers, IHasTags, IHasKeywords, IHasPreferredMetadataLanguage, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IMetadataContainer
     {
     {
         public BoxSet()
         public BoxSet()
         {
         {
@@ -74,5 +79,67 @@ namespace MediaBrowser.Controller.Entities.Movies
             // Default sorting
             // Default sorting
             return LibraryManager.Sort(children, user, new[] { ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName }, SortOrder.Ascending);
             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>
     /// <summary>
     /// Class Movie
     /// Class Movie
     /// </summary>
     /// </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; }
         public List<Guid> SpecialFeatureIds { get; set; }
 
 
@@ -166,5 +166,10 @@ namespace MediaBrowser.Controller.Entities.Movies
         {
         {
             return config.BlockUnratedMovies;
             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.Entities.Audio;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using System;
 using System;
 
 
 namespace MediaBrowser.Controller.Entities
 namespace MediaBrowser.Controller.Entities
 {
 {
-    public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasBudget
+    public class MusicVideo : Video, IHasArtist, IHasMusicGenres, IHasBudget, IHasLookupInfo<MusicVideoInfo>
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the artist.
         /// Gets or sets the artist.
@@ -54,5 +55,10 @@ namespace MediaBrowser.Controller.Entities
         {
         {
             return config.BlockUnratedMusic;
             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.Collections.Generic;
 using System.Runtime.Serialization;
 using System.Runtime.Serialization;
 
 
@@ -7,7 +8,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// <summary>
     /// This is the full Person object that can be retrieved with all of it's data.
     /// This is the full Person object that can be retrieved with all of it's data.
     /// </summary>
     /// </summary>
-    public class Person : BaseItem, IItemByName
+    public class Person : BaseItem, IItemByName, IHasLookupInfo<Providers.PersonLookupInfo>
     {
     {
         public Person()
         public Person()
         {
         {
@@ -31,6 +32,11 @@ namespace MediaBrowser.Controller.Entities
         {
         {
             return "Person-" + Name;
             return "Person-" + Name;
         }
         }
+
+        public Providers.PersonLookupInfo GetLookupInfo()
+        {
+            return GetItemLookupInfo<Providers.PersonLookupInfo>();
+        }
     }
     }
 
 
     /// <summary>
     /// <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;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities.TV
     /// <summary>
     /// <summary>
     /// Class Episode
     /// Class Episode
     /// </summary>
     /// </summary>
-    public class Episode : Video
+    public class Episode : Video, IHasLookupInfo<EpisodeInfo>
     {
     {
         /// <summary>
         /// <summary>
         /// Gets the season in which it aired.
         /// Gets the season in which it aired.
@@ -41,7 +42,7 @@ namespace MediaBrowser.Controller.Entities.TV
         /// </summary>
         /// </summary>
         /// <value>The index number.</value>
         /// <value>The index number.</value>
         public int? IndexNumberEnd { get; set; }
         public int? IndexNumberEnd { get; set; }
-        
+
         /// <summary>
         /// <summary>
         /// We want to group into series not show individually in an index
         /// We want to group into series not show individually in an index
         /// </summary>
         /// </summary>
@@ -233,5 +234,21 @@ namespace MediaBrowser.Controller.Entities.TV
         {
         {
             return config.BlockUnratedSeries;
             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.Library;
 using MediaBrowser.Controller.Localization;
 using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
 using MediaBrowser.Model.Querying;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.TV
     /// <summary>
     /// <summary>
     /// Class Series
     /// Class Series
     /// </summary>
     /// </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> SpecialFeatureIds { get; set; }
         public List<Guid> SoundtrackIds { get; set; }
         public List<Guid> SoundtrackIds { get; set; }
@@ -222,5 +223,10 @@ namespace MediaBrowser.Controller.Entities.TV
         }
         }
 
 
         public string PreferredMetadataLanguage { get; set; }
         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 MediaBrowser.Model.Entities;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// <summary>
     /// Class Trailer
     /// Class Trailer
     /// </summary>
     /// </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; }
         public List<Guid> SoundtrackIds { get; set; }
 
 
@@ -105,5 +106,10 @@ namespace MediaBrowser.Controller.Entities
         {
         {
             return config.BlockUnratedTrailers;
             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;
 using System.Threading;
 
 
 namespace MediaBrowser.Controller.Library
 namespace MediaBrowser.Controller.Library

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

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

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

@@ -479,7 +479,7 @@ namespace MediaBrowser.Controller.Providers
 
 
                 case "Director":
                 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))
                             if (string.IsNullOrWhiteSpace(p.Name))
                             {
                             {
@@ -491,7 +491,7 @@ namespace MediaBrowser.Controller.Providers
                     }
                     }
                 case "Writer":
                 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))
                             if (string.IsNullOrWhiteSpace(p.Name))
                             {
                             {
@@ -516,7 +516,7 @@ namespace MediaBrowser.Controller.Providers
                         else
                         else
                         {
                         {
                             // Old-style piped string
                             // 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))
                                 if (string.IsNullOrWhiteSpace(p.Name))
                                 {
                                 {
@@ -530,7 +530,7 @@ namespace MediaBrowser.Controller.Providers
 
 
                 case "GuestStars":
                 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))
                             if (string.IsNullOrWhiteSpace(p.Name))
                             {
                             {
@@ -1195,7 +1195,7 @@ namespace MediaBrowser.Controller.Providers
         /// </summary>
         /// </summary>
         /// <param name="reader">The reader.</param>
         /// <param name="reader">The reader.</param>
         /// <returns>IEnumerable{PersonInfo}.</returns>
         /// <returns>IEnumerable{PersonInfo}.</returns>
-        private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
+        private IEnumerable<Entities.PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
         {
         {
             var name = string.Empty;
             var name = string.Empty;
             var type = "Actor";  // If type is not specified assume actor
             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(),
                 Name = name.Trim(),
                 Role = role,
                 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;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 

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

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

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

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

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

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

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

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

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

@@ -1,5 +1,6 @@
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using MediaBrowser.Controller.Entities;
 
 
 namespace MediaBrowser.Controller.Providers
 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
 namespace MediaBrowser.Controller.Providers
 {
 {
-    public class ItemId : IHasProviderIds
+    public class ItemLookupInfo : IHasProviderIds
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the name.
         /// Gets or sets the name.
@@ -34,13 +34,29 @@ namespace MediaBrowser.Controller.Providers
         public int? IndexNumber { get; set; }
         public int? IndexNumber { get; set; }
         public int? ParentIndexNumber { get; set; }
         public int? ParentIndexNumber { get; set; }
 
 
-        public ItemId()
+        public ItemLookupInfo()
         {
         {
             ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
             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>
         /// <summary>
         /// Gets or sets the album artist.
         /// Gets or sets the album artist.
@@ -53,14 +69,16 @@ namespace MediaBrowser.Controller.Providers
         /// </summary>
         /// </summary>
         /// <value>The artist provider ids.</value>
         /// <value>The artist provider ids.</value>
         public Dictionary<string, string> ArtistProviderIds { get; set; }
         public Dictionary<string, string> ArtistProviderIds { get; set; }
+        public List<SongInfo> SongInfos { get; set; }
 
 
-        public AlbumId()
+        public AlbumInfo()
         {
         {
             ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
             ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+            SongInfos = new List<SongInfo>();
         }
         }
     }
     }
 
 
-    public class GameId : ItemId
+    public class GameInfo : ItemLookupInfo
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the game system.
         /// Gets or sets the game system.
@@ -69,7 +87,7 @@ namespace MediaBrowser.Controller.Providers
         public string GameSystem { get; set; }
         public string GameSystem { get; set; }
     }
     }
 
 
-    public class GameSystemId : ItemId
+    public class GameSystemInfo : ItemLookupInfo
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the path.
         /// Gets or sets the path.
@@ -78,15 +96,57 @@ namespace MediaBrowser.Controller.Providers
         public string Path { get; set; }
         public string Path { get; set; }
     }
     }
 
 
-    public class EpisodeId : ItemId
+    public class EpisodeInfo : ItemLookupInfo
     {
     {
         public Dictionary<string, string> SeriesProviderIds { get; set; }
         public Dictionary<string, string> SeriesProviderIds { get; set; }
 
 
         public int? IndexNumberEnd { get; set; }
         public int? IndexNumberEnd { get; set; }
 
 
-        public EpisodeId()
+        public EpisodeInfo()
         {
         {
             SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
             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
 namespace MediaBrowser.Providers.AdultVideos
 {
 {
-    class AdultVideoMetadataService : MetadataService<AdultVideo, ItemId>
+    class AdultVideoMetadataService : MetadataService<AdultVideo, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 

+ 2 - 1
MediaBrowser.Providers/BaseXmlProvider.cs

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

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

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

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

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

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

@@ -17,7 +17,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.BoxSets
 namespace MediaBrowser.Providers.BoxSets
 {
 {
-    public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet>
+    public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo>
     {
     {
         private  readonly CultureInfo _enUs = new CultureInfo("en-US");
         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";
         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;
             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);
             var tmdbId = id.GetProviderId(MetadataProviders.Tmdb);
 
 
@@ -188,7 +188,7 @@ namespace MediaBrowser.Providers.BoxSets
             return DownloadInfo(tmdbId, preferredMetadataLanguage, cancellationToken);
             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);
             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
 namespace MediaBrowser.Providers.Folders
 {
 {
-    public class FolderMetadataService : MetadataService<Folder, ItemId>
+    public class FolderMetadataService : MetadataService<Folder, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 

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

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

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

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.Games
 namespace MediaBrowser.Providers.Games
 {
 {
-    public class GameMetadataService : MetadataService<Game, GameId>
+    public class GameMetadataService : MetadataService<Game, GameInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 
@@ -44,14 +44,5 @@ namespace MediaBrowser.Providers.Games
         {
         {
             return _libraryManager.UpdateItem(item, reason, cancellationToken);
             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
 namespace MediaBrowser.Providers.Games
 {
 {
-    public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemId>
+    public class GameSystemMetadataService : MetadataService<GameSystem, GameSystemInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 
@@ -44,14 +44,5 @@ namespace MediaBrowser.Providers.Games
         {
         {
             return _libraryManager.UpdateItem(item, reason, cancellationToken);
             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
 namespace MediaBrowser.Providers.Genres
 {
 {
-    public class GenreMetadataService : MetadataService<Genre, ItemId>
+    public class GenreMetadataService : MetadataService<Genre, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 

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

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

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

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

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

@@ -16,8 +16,8 @@ using System.Threading.Tasks;
 namespace MediaBrowser.Providers.Manager
 namespace MediaBrowser.Providers.Manager
 {
 {
     public abstract class MetadataService<TItemType, TIdType> : IMetadataService
     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 IServerConfigurationManager ServerConfigurationManager;
         protected readonly ILogger Logger;
         protected readonly ILogger Logger;
@@ -238,27 +238,6 @@ namespace MediaBrowser.Providers.Manager
 
 
         protected abstract Task SaveItem(TItemType item, ItemUpdateType reason, CancellationToken cancellationToken);
         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)
         public bool CanRefresh(IHasMetadata item)
         {
         {
             return item is TItemType;
             return item is TItemType;
@@ -278,7 +257,7 @@ namespace MediaBrowser.Providers.Manager
             // If replacing all metadata, run internet providers first
             // If replacing all metadata, run internet providers first
             if (options.ReplaceAllMetadata)
             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;
             var hasLocalMetadata = false;
@@ -326,7 +305,7 @@ namespace MediaBrowser.Providers.Manager
 
 
             if (!options.ReplaceAllMetadata && !hasLocalMetadata)
             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)
             if (refreshResult.UpdateType > ItemUpdateType.Unspecified)
@@ -367,14 +346,16 @@ namespace MediaBrowser.Providers.Manager
             return new TItemType();
             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)
             foreach (var provider in providers)
             {
             {
                 Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
                 Logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
 
 
+                id = id ?? item.GetLookupInfo();
+
                 try
                 try
                 {
                 {
                     var result = await provider.GetMetadata(id, cancellationToken).ConfigureAwait(false);
                     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\FFProbeHelpers.cs" />
     <Compile Include="MediaInfo\FFProbeProvider.cs" />
     <Compile Include="MediaInfo\FFProbeProvider.cs" />
     <Compile Include="MediaInfo\FFProbeVideoInfo.cs" />
     <Compile Include="MediaInfo\FFProbeVideoInfo.cs" />
+    <Compile Include="Movies\MovieDbTrailerProvider.cs" />
     <Compile Include="Movies\TrailerMetadataService.cs" />
     <Compile Include="Movies\TrailerMetadataService.cs" />
     <Compile Include="Movies\GenericMovieDbInfo.cs" />
     <Compile Include="Movies\GenericMovieDbInfo.cs" />
     <Compile Include="Movies\MovieDbSearch.cs" />
     <Compile Include="Movies\MovieDbSearch.cs" />
@@ -115,6 +116,7 @@
     <Compile Include="Music\ArtistMetadataService.cs" />
     <Compile Include="Music\ArtistMetadataService.cs" />
     <Compile Include="Music\AudioMetadataService.cs" />
     <Compile Include="Music\AudioMetadataService.cs" />
     <Compile Include="Music\LastfmArtistProvider.cs" />
     <Compile Include="Music\LastfmArtistProvider.cs" />
+    <Compile Include="Music\MovieDbMusicVideoProvider.cs" />
     <Compile Include="Music\MusicBrainzArtistProvider.cs" />
     <Compile Include="Music\MusicBrainzArtistProvider.cs" />
     <Compile Include="Music\MusicVideoMetadataService.cs" />
     <Compile Include="Music\MusicVideoMetadataService.cs" />
     <Compile Include="Music\MusicVideoXmlProvider.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.Net;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
 
 
 namespace MediaBrowser.Providers.Movies
 namespace MediaBrowser.Providers.Movies
 {
 {
@@ -29,7 +30,7 @@ namespace MediaBrowser.Providers.Movies
             _jsonSerializer = jsonSerializer;
             _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>();
             var result = new MetadataResult<T>();
 
 

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

@@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.Movies
     /// <summary>
     /// <summary>
     /// Class MovieDbProvider
     /// Class MovieDbProvider
     /// </summary>
     /// </summary>
-    public class MovieDbProvider : IRemoteMetadataProvider<Movie>, IDisposable, IHasChangeMonitor
+    public class MovieDbProvider : IRemoteMetadataProvider<Movie, MovieInfo>, IDisposable, IHasChangeMonitor
     {
     {
         internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1);
         internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(1, 1);
 
 
@@ -41,12 +41,12 @@ namespace MediaBrowser.Providers.Movies
             Current = this;
             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 ()
             where T : Video, new ()
         {
         {
             var movieDb = new GenericMovieDbInfo<T>(_logger, _jsonSerializer);
             var movieDb = new GenericMovieDbInfo<T>(_logger, _jsonSerializer);

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

@@ -29,17 +29,17 @@ namespace MediaBrowser.Providers.Movies
             _json = json;
             _json = json;
         }
         }
 
 
-        public Task<string> FindMovieId(ItemId idInfo, CancellationToken cancellationToken)
+        public Task<string> FindMovieId(ItemLookupInfo idInfo, CancellationToken cancellationToken)
         {
         {
             return FindId(idInfo, "movie", 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);
             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;
             int? yearInName;
             var name = idInfo.Name;
             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
 namespace MediaBrowser.Providers.Movies
 {
 {
-    public class MovieMetadataService : MetadataService<Movie, ItemId>
+    public class MovieMetadataService : MetadataService<Movie, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 

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

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

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

@@ -14,7 +14,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.Music
 namespace MediaBrowser.Providers.Music
 {
 {
-    public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumId>
+    public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 
@@ -102,23 +102,6 @@ namespace MediaBrowser.Providers.Music
             return updateType;
             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)
         private ItemUpdateType SetAlbumArtistFromSongs(MusicAlbum item, IEnumerable<Audio> songs)
         {
         {
             var updateType = ItemUpdateType.Unspecified;
             var updateType = ItemUpdateType.Unspecified;

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

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

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

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

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

@@ -14,7 +14,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.Music
 namespace MediaBrowser.Providers.Music
 {
 {
-    public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum>, IHasOrder
+    public class LastfmAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
     {
     {
         private readonly IJsonSerializer _json;
         private readonly IJsonSerializer _json;
         private readonly IHttpClient _httpClient;
         private readonly IHttpClient _httpClient;
@@ -30,11 +30,11 @@ namespace MediaBrowser.Providers.Music
             _logger = logger;
             _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 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)
             if (lastFmData != null && lastFmData.album != null)
             {
             {
@@ -45,7 +45,7 @@ namespace MediaBrowser.Providers.Music
             return result;
             return result;
         }
         }
 
 
-        private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumId item, CancellationToken cancellationToken)
+        private async Task<LastfmGetAlbumResult> GetAlbumResult(AlbumInfo item, CancellationToken cancellationToken)
         {
         {
             // Try album release Id
             // Try album release Id
             if (!string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Musicbrainz)))
             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
 namespace MediaBrowser.Providers.Music
 {
 {
-    public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist>, IHasOrder
+    public class LastfmArtistProvider : IRemoteMetadataProvider<MusicArtist, ArtistInfo>, IHasOrder
     {
     {
         private readonly IJsonSerializer _json;
         private readonly IJsonSerializer _json;
         private readonly IHttpClient _httpClient;
         private readonly IHttpClient _httpClient;
@@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Music
             _logger = logger;
             _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>();
             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
 namespace MediaBrowser.Providers.Music
 {
 {
-    public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum>, IHasOrder
+    public class MusicBrainzAlbumProvider : IRemoteMetadataProvider<MusicAlbum, AlbumInfo>, IHasOrder
     {
     {
         internal static MusicBrainzAlbumProvider Current;
         internal static MusicBrainzAlbumProvider Current;
 
 
@@ -27,9 +27,9 @@ namespace MediaBrowser.Providers.Music
             Current = this;
             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 releaseId = albumId.GetProviderId(MetadataProviders.Musicbrainz);
             var releaseGroupId = albumId.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
             var releaseGroupId = albumId.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
 
 

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

@@ -12,9 +12,9 @@ using System.Xml;
 
 
 namespace MediaBrowser.Providers.Music
 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>();
             var result = new MetadataResult<MusicArtist>();
 
 
@@ -39,7 +39,7 @@ namespace MediaBrowser.Providers.Music
         /// <param name="item">The item.</param>
         /// <param name="item">The item.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{System.String}.</returns>
         /// <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
             // They seem to throw bad request failures on any term with a slash
             var nameToSearch = item.Name.Replace('/', ' ');
             var nameToSearch = item.Name.Replace('/', ' ');

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

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

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

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

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

@@ -18,7 +18,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.People
 namespace MediaBrowser.Providers.People
 {
 {
-    public class MovieDbPersonProvider : IRemoteMetadataProvider<Person>
+    public class MovieDbPersonProvider : IRemoteMetadataProvider<Person, PersonLookupInfo>
     {
     {
         const string DataFileName = "info.json";
         const string DataFileName = "info.json";
         
         
@@ -40,8 +40,8 @@ namespace MediaBrowser.Providers.People
         {
         {
             get { return "TheMovieDb"; }
             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);
             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
 namespace MediaBrowser.Providers.People
 {
 {
-    public class PersonMetadataService : MetadataService<Person, ItemId>
+    public class PersonMetadataService : MetadataService<Person, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 

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

@@ -1,4 +1,5 @@
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 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.LiveTv;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using System.Collections.Generic;
 using System.Collections.Generic;

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

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

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

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

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

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

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

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.Studios
 namespace MediaBrowser.Providers.Studios
 {
 {
-    public class StudioMetadataService : MetadataService<Studio, ItemId>
+    public class StudioMetadataService : MetadataService<Studio, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         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.Configuration;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
@@ -8,12 +7,13 @@ using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Providers.Manager;
 using MediaBrowser.Providers.Manager;
 using System.Collections.Generic;
 using System.Collections.Generic;
+using System.IO;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.TV
 namespace MediaBrowser.Providers.TV
 {
 {
-    public class EpisodeMetadataService : MetadataService<Episode, EpisodeId>
+    public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 
@@ -76,22 +76,6 @@ namespace MediaBrowser.Providers.TV
             return _libraryManager.UpdateItem(item, reason, cancellationToken);
             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)
         protected override ItemUpdateType BeforeMetadataRefresh(Episode item)
         {
         {
             var updateType = base.BeforeMetadataRefresh(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
 namespace MediaBrowser.Providers.TV
 {
 {
-    public class SeasonMetadataService : MetadataService<Season, ItemId>
+    public class SeasonMetadataService : MetadataService<Season, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 

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

@@ -13,7 +13,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.TV
 namespace MediaBrowser.Providers.TV
 {
 {
-    public class SeriesMetadataService : MetadataService<Series, ItemId>
+    public class SeriesMetadataService : MetadataService<Series, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         private readonly ILibraryManager _libraryManager;
 
 
@@ -59,7 +59,6 @@ namespace MediaBrowser.Providers.TV
 
 
             if (dateLastEpisodeAdded != item.DateLastEpisodeAdded)
             if (dateLastEpisodeAdded != item.DateLastEpisodeAdded)
             {
             {
-                Logger.Debug("DateLastEpisodeAdded changed for {0}", item.Path);
                 updateType = updateType | ItemUpdateType.MetadataImport;
                 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;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using System.Xml;
 using System.Xml;
+using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
 
 
 namespace MediaBrowser.Providers.TV
 namespace MediaBrowser.Providers.TV
 {
 {
@@ -23,7 +24,7 @@ namespace MediaBrowser.Providers.TV
     /// <summary>
     /// <summary>
     /// Class RemoteEpisodeProvider
     /// Class RemoteEpisodeProvider
     /// </summary>
     /// </summary>
-    class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode>, IHasChangeMonitor
+    class TvdbEpisodeProvider : IRemoteMetadataProvider<Episode, EpisodeInfo>, IHasChangeMonitor
     {
     {
         internal static TvdbEpisodeProvider Current;
         internal static TvdbEpisodeProvider Current;
         private readonly IFileSystem _fileSystem;
         private readonly IFileSystem _fileSystem;
@@ -41,9 +42,9 @@ namespace MediaBrowser.Providers.TV
             get { return "TheTVDB"; }
             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;
             string seriesTvdbId;
             episodeId.SeriesProviderIds.TryGetValue(MetadataProviders.Tvdb.ToString(), out 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="seriesDataPath">The series data path.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task{System.Boolean}.</returns>
         /// <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)
             if (id.IndexNumber == null)
             {
             {

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

@@ -19,10 +19,11 @@ using System.Text;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using System.Xml;
 using System.Xml;
+using PersonInfo = MediaBrowser.Controller.Entities.PersonInfo;
 
 
 namespace MediaBrowser.Providers.TV
 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 readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(2, 2);
         internal static TvdbSeriesProvider Current { get; private set; }
         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 SeriesQuery = "GetSeries.php?seriesname={0}";
         private const string SeriesGetZip = "http://www.thetvdb.com/api/{0}/series/{1}/all/{2}.zip";
         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>();
             var result = new MetadataResult<Series>();
 
 

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

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

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

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

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

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Providers.Years
 namespace MediaBrowser.Providers.Years
 {
 {
-    public class YearMetadataService : MetadataService<Year, ItemId>
+    public class YearMetadataService : MetadataService<Year, ItemLookupInfo>
     {
     {
         private readonly ILibraryManager _libraryManager;
         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">
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
     <metadata>
         <id>MediaBrowser.Common.Internal</id>
         <id>MediaBrowser.Common.Internal</id>
-        <version>3.0.318</version>
+        <version>3.0.320</version>
         <title>MediaBrowser.Common.Internal</title>
         <title>MediaBrowser.Common.Internal</title>
         <authors>Luke</authors>
         <authors>Luke</authors>
         <owners>ebr,Luke,scottisafool</owners>
         <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>
         <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>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
         <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="NLog" version="2.1.0" />
             <dependency id="SimpleInjector" version="2.4.1" />
             <dependency id="SimpleInjector" version="2.4.1" />
             <dependency id="sharpcompress" version="0.10.2" />
             <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">
 <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
     <metadata>
     <metadata>
         <id>MediaBrowser.Common</id>
         <id>MediaBrowser.Common</id>
-        <version>3.0.318</version>
+        <version>3.0.320</version>
         <title>MediaBrowser.Common</title>
         <title>MediaBrowser.Common</title>
         <authors>Media Browser Team</authors>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
         <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">
 <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
     <metadata>
     <metadata>
         <id>MediaBrowser.Server.Core</id>
         <id>MediaBrowser.Server.Core</id>
-        <version>3.0.318</version>
+        <version>3.0.320</version>
         <title>Media Browser.Server.Core</title>
         <title>Media Browser.Server.Core</title>
         <authors>Media Browser Team</authors>
         <authors>Media Browser Team</authors>
         <owners>ebr,Luke,scottisafool</owners>
         <owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <description>Contains core components required to build plugins for Media Browser Server.</description>
         <copyright>Copyright © Media Browser 2013</copyright>
         <copyright>Copyright © Media Browser 2013</copyright>
         <dependencies>
         <dependencies>
-            <dependency id="MediaBrowser.Common" version="3.0.318" />
+            <dependency id="MediaBrowser.Common" version="3.0.320" />
         </dependencies>
         </dependencies>
     </metadata>
     </metadata>
     <files>
     <files>