瀏覽代碼

Programmatic provider id handling for xml and nfo persistence

softworkz 8 年之前
父節點
當前提交
bd4ffa898e
共有 37 個文件被更改,包括 196 次插入439 次删除
  1. 34 123
      MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
  2. 2 2
      MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
  3. 2 2
      MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs
  4. 2 2
      MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs
  5. 2 2
      MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs
  6. 5 5
      MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs
  7. 2 2
      MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs
  8. 2 2
      MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
  9. 2 2
      MediaBrowser.LocalMetadata/Parsers/SeasonXmlParser.cs
  10. 2 2
      MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs
  11. 4 2
      MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
  12. 4 2
      MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs
  13. 4 2
      MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs
  14. 4 2
      MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs
  15. 4 2
      MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs
  16. 4 2
      MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs
  17. 4 2
      MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs
  18. 4 2
      MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs
  19. 4 2
      MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
  20. 4 2
      MediaBrowser.LocalMetadata/Providers/SeasonXmlProvider.cs
  21. 4 2
      MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs
  22. 4 2
      MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs
  23. 9 112
      MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
  24. 22 130
      MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
  25. 1 1
      MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs
  26. 2 2
      MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs
  27. 1 1
      MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs
  28. 1 1
      MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs
  29. 4 2
      MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs
  30. 4 2
      MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs
  31. 4 2
      MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
  32. 4 2
      MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs
  33. 4 3
      MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs
  34. 4 2
      MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs
  35. 4 2
      MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs
  36. 28 5
      MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
  37. 1 4
      MediaBrowser.sln

+ 34 - 123
MediaBrowser.Controller/Providers/BaseItemXmlParser.cs

@@ -23,14 +23,18 @@ namespace MediaBrowser.Controller.Providers
         /// The logger
         /// The logger
         /// </summary>
         /// </summary>
         protected ILogger Logger { get; private set; }
         protected ILogger Logger { get; private set; }
+        protected IProviderManager ProviderManager { get; private set; }
+
+        private Dictionary<string, string> _validProviderIds;
 
 
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
         /// </summary>
         /// </summary>
         /// <param name="logger">The logger.</param>
         /// <param name="logger">The logger.</param>
-        public BaseItemXmlParser(ILogger logger)
+        public BaseItemXmlParser(ILogger logger, IProviderManager providerManager)
         {
         {
             Logger = logger;
             Logger = logger;
+            ProviderManager = providerManager;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -60,6 +64,22 @@ namespace MediaBrowser.Controller.Providers
                 ValidationType = ValidationType.None
                 ValidationType = ValidationType.None
             };
             };
 
 
+            _validProviderIds = _validProviderIds = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
+
+            var idInfos = ProviderManager.GetExternalIdInfos(item.Item);
+
+            foreach (var info in idInfos)
+            {
+                var id = info.Key + "Id";
+                if (!_validProviderIds.ContainsKey(id))
+                {
+                    _validProviderIds.Add(id, info.Key);
+                }
+            }
+
+            //Additional Mappings
+            _validProviderIds.Add("IMDB", "Imdb");
+
             //Fetch(item, metadataFile, settings, Encoding.GetEncoding("ISO-8859-1"), cancellationToken);
             //Fetch(item, metadataFile, settings, Encoding.GetEncoding("ISO-8859-1"), cancellationToken);
             Fetch(item, metadataFile, settings, Encoding.UTF8, cancellationToken);
             Fetch(item, metadataFile, settings, Encoding.UTF8, cancellationToken);
         }
         }
@@ -657,14 +677,6 @@ namespace MediaBrowser.Controller.Providers
                         break;
                         break;
                     }
                     }
 
 
-                case "TvDbId":
-                    var tvdbId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(tvdbId))
-                    {
-                        item.SetProviderId(MetadataProviders.Tvdb, tvdbId);
-                    }
-                    break;
-
                 case "VoteCount":
                 case "VoteCount":
                     {
                     {
                         var val = reader.ReadElementContentAsString();
                         var val = reader.ReadElementContentAsString();
@@ -679,95 +691,6 @@ namespace MediaBrowser.Controller.Providers
                         }
                         }
                         break;
                         break;
                     }
                     }
-                case "MusicBrainzAlbumId":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzAlbum, mbz);
-                        }
-                        break;
-                    }
-                case "MusicBrainzAlbumArtistId":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzAlbumArtist, mbz);
-                        }
-                        break;
-                    }
-                case "MusicBrainzArtistId":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzArtist, mbz);
-                        }
-                        break;
-                    }
-                case "MusicBrainzReleaseGroupId":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, mbz);
-                        }
-                        break;
-                    }
-                case "TVRageId":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.TvRage, id);
-                        }
-                        break;
-                    }
-                case "TvMazeId":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.TvMaze, id);
-                        }
-                        break;
-                    }
-                case "AudioDbArtistId":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.AudioDbArtist, id);
-                        }
-                        break;
-                    }
-                case "AudioDbAlbumId":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.AudioDbAlbum, id);
-                        }
-                        break;
-                    }
-                case "RottenTomatoesId":
-                    var rtId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(rtId))
-                    {
-                        item.SetProviderId(MetadataProviders.RottenTomatoes, rtId);
-                    }
-                    break;
-
-                case "TMDbId":
-                    var tmdb = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(tmdb))
-                    {
-                        item.SetProviderId(MetadataProviders.Tmdb, tmdb);
-                    }
-                    break;
-
-                case "TMDbCollectionId":
                 case "CollectionNumber":
                 case "CollectionNumber":
                     var tmdbCollection = reader.ReadElementContentAsString();
                     var tmdbCollection = reader.ReadElementContentAsString();
                     if (!string.IsNullOrWhiteSpace(tmdbCollection))
                     if (!string.IsNullOrWhiteSpace(tmdbCollection))
@@ -776,30 +699,6 @@ namespace MediaBrowser.Controller.Providers
                     }
                     }
                     break;
                     break;
 
 
-                case "TVcomId":
-                    var TVcomId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(TVcomId))
-                    {
-                        item.SetProviderId(MetadataProviders.Tvcom, TVcomId);
-                    }
-                    break;
-
-                case "Zap2ItId":
-                    var zap2ItId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(zap2ItId))
-                    {
-                        item.SetProviderId(MetadataProviders.Zap2It, zap2ItId);
-                    }
-                    break;
-
-                case "IMDB":
-                    var imDbId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(imDbId))
-                    {
-                        item.SetProviderId(MetadataProviders.Imdb, imDbId);
-                    }
-                    break;
-
                 case "Genres":
                 case "Genres":
                     {
                     {
                         using (var subtree = reader.ReadSubtree())
                         using (var subtree = reader.ReadSubtree())
@@ -891,7 +790,19 @@ namespace MediaBrowser.Controller.Providers
                     }
                     }
 
 
                 default:
                 default:
-                    reader.Skip();
+                    if (_validProviderIds.ContainsKey(reader.Name))
+                    {
+                        var id = reader.ReadElementContentAsString();
+                        if (!string.IsNullOrWhiteSpace(id))
+                        {
+                            item.SetProviderId(_validProviderIds[reader.Name], id);
+                        }
+                    }
+                    else
+                    {
+                        reader.Skip();
+                    }
+
                     break;
                     break;
             }
             }
         }
         }

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs

@@ -9,8 +9,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
 {
 {
     public class BoxSetXmlParser : BaseItemXmlParser<BoxSet>
     public class BoxSetXmlParser : BaseItemXmlParser<BoxSet>
     {
     {
-        public BoxSetXmlParser(ILogger logger)
-            : base(logger)
+        public BoxSetXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs

@@ -20,8 +20,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
         private List<LocalImageInfo> _imagesFound;
         private List<LocalImageInfo> _imagesFound;
         private readonly IFileSystem _fileSystem;
         private readonly IFileSystem _fileSystem;
 
 
-        public EpisodeXmlParser(ILogger logger, IFileSystem fileSystem)
-            : base(logger)
+        public EpisodeXmlParser(ILogger logger, IFileSystem fileSystem, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
             _fileSystem = fileSystem;
             _fileSystem = fileSystem;
         }
         }

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs

@@ -10,8 +10,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
 {
 {
     public class GameSystemXmlParser : BaseItemXmlParser<GameSystem>
     public class GameSystemXmlParser : BaseItemXmlParser<GameSystem>
     {
     {
-        public GameSystemXmlParser(ILogger logger)
-            : base(logger)
+        public GameSystemXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs

@@ -16,8 +16,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
     {
     {
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
 
 
-        public GameXmlParser(ILogger logger)
-            : base(logger)
+        public GameXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 5 - 5
MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs

@@ -12,8 +12,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
     public class BaseVideoXmlParser<T> : BaseItemXmlParser<T>
     public class BaseVideoXmlParser<T> : BaseItemXmlParser<T>
         where T : Video
         where T : Video
     {
     {
-        public BaseVideoXmlParser(ILogger logger)
-            : base(logger)
+        public BaseVideoXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 
@@ -50,15 +50,15 @@ namespace MediaBrowser.LocalMetadata.Parsers
 
 
     public class MovieXmlParser : BaseVideoXmlParser<Movie>
     public class MovieXmlParser : BaseVideoXmlParser<Movie>
     {
     {
-        public MovieXmlParser(ILogger logger) : base(logger)
+        public MovieXmlParser(ILogger logger, IProviderManager providerManager) : base(logger, providerManager)
         {
         {
         }
         }
     }
     }
 
 
     public class VideoXmlParser : BaseVideoXmlParser<Video>
     public class VideoXmlParser : BaseVideoXmlParser<Video>
     {
     {
-        public VideoXmlParser(ILogger logger)
-            : base(logger)
+        public VideoXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
     }
     }

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs

@@ -12,8 +12,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
         /// </summary>
         /// </summary>
         /// <param name="logger">The logger.</param>
         /// <param name="logger">The logger.</param>
-        public MusicVideoXmlParser(ILogger logger)
-            : base(logger)
+        public MusicVideoXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs

@@ -11,8 +11,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
 {
 {
     public class PlaylistXmlParser : BaseItemXmlParser<Playlist>
     public class PlaylistXmlParser : BaseItemXmlParser<Playlist>
     {
     {
-        public PlaylistXmlParser(ILogger logger)
-            : base(logger)
+        public PlaylistXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/SeasonXmlParser.cs

@@ -7,8 +7,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
 {
 {
     public class SeasonXmlParser : BaseItemXmlParser<Season>
     public class SeasonXmlParser : BaseItemXmlParser<Season>
     {
     {
-        public SeasonXmlParser(ILogger logger)
-            : base(logger)
+        public SeasonXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 2 - 2
MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs

@@ -17,8 +17,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
         /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
         /// </summary>
         /// </summary>
         /// <param name="logger">The logger.</param>
         /// <param name="logger">The logger.</param>
-        public SeriesXmlParser(ILogger logger)
-            : base(logger)
+        public SeriesXmlParser(ILogger logger, IProviderManager providerManager)
+            : base(logger, providerManager)
         {
         {
         }
         }
 
 

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs

@@ -14,16 +14,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class BoxSetXmlProvider : BaseXmlProvider<BoxSet>
     public class BoxSetXmlProvider : BaseXmlProvider<BoxSet>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public BoxSetXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public BoxSetXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<BoxSet> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<BoxSet> result, string path, CancellationToken cancellationToken)
         {
         {
-            new BoxSetXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new BoxSetXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs

@@ -13,11 +13,13 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class EpisodeXmlProvider : BaseXmlProvider<Episode>
     public class EpisodeXmlProvider : BaseXmlProvider<Episode>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public EpisodeXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public EpisodeXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Episode> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Episode> result, string path, CancellationToken cancellationToken)
@@ -25,7 +27,7 @@ namespace MediaBrowser.LocalMetadata.Providers
             var images = new List<LocalImageInfo>();
             var images = new List<LocalImageInfo>();
             var chapters = new List<ChapterInfo>();
             var chapters = new List<ChapterInfo>();
 
 
-            new EpisodeXmlParser(_logger, FileSystem).Fetch(result, images, path, cancellationToken);
+            new EpisodeXmlParser(_logger, FileSystem, _providerManager).Fetch(result, images, path, cancellationToken);
 
 
             result.Images = images;
             result.Images = images;
         }
         }

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs

@@ -13,16 +13,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class FolderXmlProvider : BaseXmlProvider<Folder>
     public class FolderXmlProvider : BaseXmlProvider<Folder>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public FolderXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public FolderXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Folder> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Folder> result, string path, CancellationToken cancellationToken)
         {
         {
-            new BaseItemXmlParser<Folder>(_logger).Fetch(result, path, cancellationToken);
+            new BaseItemXmlParser<Folder>(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs

@@ -11,16 +11,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class GameSystemXmlProvider : BaseXmlProvider<GameSystem>
     public class GameSystemXmlProvider : BaseXmlProvider<GameSystem>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public GameSystemXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public GameSystemXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<GameSystem> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<GameSystem> result, string path, CancellationToken cancellationToken)
         {
         {
-            new GameSystemXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new GameSystemXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs

@@ -11,16 +11,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class GameXmlProvider : BaseXmlProvider<Game>
     public class GameXmlProvider : BaseXmlProvider<Game>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public GameXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public GameXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Game> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Game> result, string path, CancellationToken cancellationToken)
         {
         {
-            new GameXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new GameXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs

@@ -11,16 +11,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class MovieXmlProvider : BaseXmlProvider<Movie>
     public class MovieXmlProvider : BaseXmlProvider<Movie>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public MovieXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public MovieXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Movie> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Movie> result, string path, CancellationToken cancellationToken)
         {
         {
-            new MovieXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new MovieXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs

@@ -10,16 +10,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     class MusicVideoXmlProvider : BaseXmlProvider<MusicVideo>
     class MusicVideoXmlProvider : BaseXmlProvider<MusicVideo>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public MusicVideoXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public MusicVideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<MusicVideo> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<MusicVideo> result, string path, CancellationToken cancellationToken)
         {
         {
-            new MusicVideoXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new MusicVideoXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs

@@ -10,16 +10,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class PersonXmlProvider : BaseXmlProvider<Person>
     public class PersonXmlProvider : BaseXmlProvider<Person>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public PersonXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public PersonXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Person> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Person> result, string path, CancellationToken cancellationToken)
         {
         {
-            new BaseItemXmlParser<Person>(_logger).Fetch(result, path, cancellationToken);
+            new BaseItemXmlParser<Person>(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs

@@ -11,16 +11,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     class PlaylistXmlProvider : BaseXmlProvider<Playlist>
     class PlaylistXmlProvider : BaseXmlProvider<Playlist>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public PlaylistXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public PlaylistXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Playlist> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Playlist> result, string path, CancellationToken cancellationToken)
         {
         {
-            new PlaylistXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new PlaylistXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/SeasonXmlProvider.cs

@@ -14,16 +14,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class SeasonXmlProvider : BaseXmlProvider<Season>, IHasOrder
     public class SeasonXmlProvider : BaseXmlProvider<Season>, IHasOrder
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public SeasonXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public SeasonXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Season> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Season> result, string path, CancellationToken cancellationToken)
         {
         {
-            new SeasonXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new SeasonXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs

@@ -14,16 +14,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     public class SeriesXmlProvider : BaseXmlProvider<Series>, IHasOrder
     public class SeriesXmlProvider : BaseXmlProvider<Series>, IHasOrder
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public SeriesXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public SeriesXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Series> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Series> result, string path, CancellationToken cancellationToken)
         {
         {
-            new SeriesXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new SeriesXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs

@@ -10,16 +10,18 @@ namespace MediaBrowser.LocalMetadata.Providers
     class VideoXmlProvider : BaseXmlProvider<Video>
     class VideoXmlProvider : BaseXmlProvider<Video>
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
+        private readonly IProviderManager _providerManager;
 
 
-        public VideoXmlProvider(IFileSystem fileSystem, ILogger logger)
+        public VideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Video> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Video> result, string path, CancellationToken cancellationToken)
         {
         {
-            new VideoXmlParser(_logger).Fetch(result, path, cancellationToken);
+            new VideoXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 9 - 112
MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs

@@ -133,7 +133,7 @@ namespace MediaBrowser.LocalMetadata.Savers
         /// <param name="xmlTagsUsed">The XML tags used.</param>
         /// <param name="xmlTagsUsed">The XML tags used.</param>
         public static void Save(StringBuilder xml, string path, List<string> xmlTagsUsed, IServerConfigurationManager config, IFileSystem fileSystem)
         public static void Save(StringBuilder xml, string path, List<string> xmlTagsUsed, IServerConfigurationManager config, IFileSystem fileSystem)
         {
         {
-			if (fileSystem.FileExists(path))
+            if (fileSystem.FileExists(path))
             {
             {
                 var position = xml.ToString().LastIndexOf("</", StringComparison.OrdinalIgnoreCase);
                 var position = xml.ToString().LastIndexOf("</", StringComparison.OrdinalIgnoreCase);
                 xml.Insert(position, GetCustomTags(path, xmlTagsUsed));
                 xml.Insert(position, GetCustomTags(path, xmlTagsUsed));
@@ -145,7 +145,7 @@ namespace MediaBrowser.LocalMetadata.Savers
             //Add the new node to the document.
             //Add the new node to the document.
             xmlDocument.InsertBefore(xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes"), xmlDocument.DocumentElement);
             xmlDocument.InsertBefore(xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes"), xmlDocument.DocumentElement);
 
 
-			fileSystem.CreateDirectory(Path.GetDirectoryName(path));
+            fileSystem.CreateDirectory(Path.GetDirectoryName(path));
 
 
             var wasHidden = false;
             var wasHidden = false;
 
 
@@ -445,121 +445,18 @@ namespace MediaBrowser.LocalMetadata.Savers
                 builder.Append("<RunningTime>" + Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture) + "</RunningTime>");
                 builder.Append("<RunningTime>" + Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture) + "</RunningTime>");
             }
             }
 
 
-            var imdb = item.GetProviderId(MetadataProviders.Imdb);
-
-            if (!string.IsNullOrEmpty(imdb))
-            {
-                builder.Append("<IMDB>" + SecurityElement.Escape(imdb) + "</IMDB>");
-            }
-
-            var tmdb = item.GetProviderId(MetadataProviders.Tmdb);
-
-            if (!string.IsNullOrEmpty(tmdb))
-            {
-                builder.Append("<TMDbId>" + SecurityElement.Escape(tmdb) + "</TMDbId>");
-            }
-
-            if (!(item is Series))
+            if (item.ProviderIds != null)
             {
             {
-                var tvdb = item.GetProviderId(MetadataProviders.Tvdb);
-
-                if (!string.IsNullOrEmpty(tvdb))
+                foreach (var providerKey in item.ProviderIds.Keys)
                 {
                 {
-                    builder.Append("<TvDbId>" + SecurityElement.Escape(tvdb) + "</TvDbId>");
+                    var providerId = item.ProviderIds[providerKey];
+                    if (!string.IsNullOrEmpty(providerId))
+                    {
+                        builder.Append(string.Format("<{0}>{1}</{0}>", providerKey + "Id", SecurityElement.Escape(providerId)));
+                    }
                 }
                 }
             }
             }
 
 
-            var externalId = item.GetProviderId(MetadataProviders.Tvcom);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<TVcomId>" + SecurityElement.Escape(externalId) + "</TVcomId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.RottenTomatoes);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<RottenTomatoesId>" + SecurityElement.Escape(externalId) + "</RottenTomatoesId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.Zap2It);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<Zap2ItId>" + SecurityElement.Escape(externalId) + "</Zap2ItId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbum);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<MusicBrainzAlbumId>" + SecurityElement.Escape(externalId) + "</MusicBrainzAlbumId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbumArtist);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<MusicBrainzAlbumArtistId>" + SecurityElement.Escape(externalId) + "</MusicBrainzAlbumArtistId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.MusicBrainzArtist);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<MusicBrainzArtistId>" + SecurityElement.Escape(externalId) + "</MusicBrainzArtistId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<MusicBrainzReleaseGroupId>" + SecurityElement.Escape(externalId) + "</MusicBrainzReleaseGroupId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.Gamesdb);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<GamesDbId>" + SecurityElement.Escape(externalId) + "</GamesDbId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.TmdbCollection);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<TMDbCollectionId>" + SecurityElement.Escape(externalId) + "</TMDbCollectionId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.AudioDbArtist);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<AudioDbArtistId>" + SecurityElement.Escape(externalId) + "</AudioDbArtistId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.AudioDbAlbum);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<AudioDbAlbumId>" + SecurityElement.Escape(externalId) + "</AudioDbAlbumId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.TvRage);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<TVRageId>" + SecurityElement.Escape(externalId) + "</TVRageId>");
-            }
-
-            externalId = item.GetProviderId(MetadataProviders.TvMaze);
-
-            if (!string.IsNullOrEmpty(externalId))
-            {
-                builder.Append("<TvMazeId>" + SecurityElement.Escape(externalId) + "</TvMazeId>");
-            }
-
             var hasTagline = item as IHasTaglines;
             var hasTagline = item as IHasTaglines;
             if (hasTagline != null)
             if (hasTagline != null)
             {
             {

+ 22 - 130
MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs

@@ -25,19 +25,22 @@ namespace MediaBrowser.XbmcMetadata.Parsers
         /// The logger
         /// The logger
         /// </summary>
         /// </summary>
         protected ILogger Logger { get; private set; }
         protected ILogger Logger { get; private set; }
+        protected IProviderManager ProviderManager { get; private set; }
 
 
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private Dictionary<string, string> _validProviderIds;
 
 
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="BaseNfoParser{T}" /> class.
         /// Initializes a new instance of the <see cref="BaseNfoParser{T}" /> class.
         /// </summary>
         /// </summary>
         /// <param name="logger">The logger.</param>
         /// <param name="logger">The logger.</param>
         /// <param name="config">The configuration.</param>
         /// <param name="config">The configuration.</param>
-        public BaseNfoParser(ILogger logger, IConfigurationManager config)
+        public BaseNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
         {
         {
             Logger = logger;
             Logger = logger;
             _config = config;
             _config = config;
+            ProviderManager = providerManager;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -68,6 +71,24 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                 ValidationType = ValidationType.None
                 ValidationType = ValidationType.None
             };
             };
 
 
+            _validProviderIds = _validProviderIds = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
+
+            var idInfos = ProviderManager.GetExternalIdInfos(item.Item);
+
+            foreach (var info in idInfos)
+            {
+                var id = info.Key + "Id";
+                if (!_validProviderIds.ContainsKey(id))
+                {
+                    _validProviderIds.Add(id, info.Key);
+                }
+            }
+
+            //Additional Mappings
+            _validProviderIds.Add("collectionnumber", "TmdbCollection");
+            _validProviderIds.Add("tmdbcolid", "TmdbCollection");
+            _validProviderIds.Add("imdb_id", "Imdb");
+
             Fetch(item, metadataFile, settings, cancellationToken);
             Fetch(item, metadataFile, settings, cancellationToken);
         }
         }
 
 
@@ -760,14 +781,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                         break;
                         break;
                     }
                     }
 
 
-                case "tvdbid":
-                    var tvdbId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(tvdbId))
-                    {
-                        item.SetProviderId(MetadataProviders.Tvdb, tvdbId);
-                    }
-                    break;
-
                 case "votes":
                 case "votes":
                     {
                     {
                         var val = reader.ReadElementContentAsString();
                         var val = reader.ReadElementContentAsString();
@@ -782,127 +795,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                         }
                         }
                         break;
                         break;
                     }
                     }
-                case "musicbrainzalbumid":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzAlbum, mbz);
-                        }
-                        break;
-                    }
-                case "musicbrainzalbumartistid":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzAlbumArtist, mbz);
-                        }
-                        break;
-                    }
-                case "musicbrainzartistid":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzArtist, mbz);
-                        }
-                        break;
-                    }
-                case "musicbrainzreleasegroupid":
-                    {
-                        var mbz = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(mbz))
-                        {
-                            item.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, mbz);
-                        }
-                        break;
-                    }
-                case "tvrageid":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.TvRage, id);
-                        }
-                        break;
-                    }
-                case "tvmazeid":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.TvMaze, id);
-                        }
-                        break;
-                    }
-                case "audiodbartistid":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.AudioDbArtist, id);
-                        }
-                        break;
-                    }
-                case "audiodbalbumid":
-                    {
-                        var id = reader.ReadElementContentAsString();
-                        if (!string.IsNullOrWhiteSpace(id))
-                        {
-                            item.SetProviderId(MetadataProviders.AudioDbAlbum, id);
-                        }
-                        break;
-                    }
-                case "rottentomatoesid":
-                    var rtId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(rtId))
-                    {
-                        item.SetProviderId(MetadataProviders.RottenTomatoes, rtId);
-                    }
-                    break;
-
-                case "tmdbid":
-                    var tmdb = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(tmdb))
-                    {
-                        item.SetProviderId(MetadataProviders.Tmdb, tmdb);
-                    }
-                    break;
-
-                case "collectionnumber":
-                case "tmdbcolid":
-                    var tmdbCollection = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(tmdbCollection))
-                    {
-                        item.SetProviderId(MetadataProviders.TmdbCollection, tmdbCollection);
-                    }
-                    break;
-
-                case "tvcomid":
-                    var TVcomId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(TVcomId))
-                    {
-                        item.SetProviderId(MetadataProviders.Tvcom, TVcomId);
-                    }
-                    break;
-
-                case "zap2itid":
-                    var zap2ItId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(zap2ItId))
-                    {
-                        item.SetProviderId(MetadataProviders.Zap2It, zap2ItId);
-                    }
-                    break;
-
-                case "imdb_id":
-                case "imdbid":
-                    var imDbId = reader.ReadElementContentAsString();
-                    if (!string.IsNullOrWhiteSpace(imDbId))
-                    {
-                        item.SetProviderId(MetadataProviders.Imdb, imDbId);
-                    }
-                    break;
 
 
                 case "genre":
                 case "genre":
                     {
                     {

+ 1 - 1
MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs

@@ -12,7 +12,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 {
 {
     public class EpisodeNfoParser : BaseNfoParser<Episode>
     public class EpisodeNfoParser : BaseNfoParser<Episode>
     {
     {
-        public EpisodeNfoParser(ILogger logger, IConfigurationManager config) : base(logger, config)
+        public EpisodeNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager) : base(logger, config, providerManager)
         {
         {
         }
         }
 
 

+ 2 - 2
MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs

@@ -10,8 +10,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 {
 {
     class MovieNfoParser : BaseNfoParser<Video>
     class MovieNfoParser : BaseNfoParser<Video>
     {
     {
-        public MovieNfoParser(ILogger logger, IConfigurationManager config)
-            : base(logger, config)
+        public MovieNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
+            : base(logger, config, providerManager)
         {
         {
         }
         }
 
 

+ 1 - 1
MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs

@@ -9,7 +9,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 {
 {
     public class SeasonNfoParser : BaseNfoParser<Season>
     public class SeasonNfoParser : BaseNfoParser<Season>
     {
     {
-        public SeasonNfoParser(ILogger logger, IConfigurationManager config) : base(logger, config)
+        public SeasonNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager) : base(logger, config, providerManager)
         {
         {
         }
         }
 
 

+ 1 - 1
MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs

@@ -11,7 +11,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 {
 {
     public class SeriesNfoParser : BaseNfoParser<Series>
     public class SeriesNfoParser : BaseNfoParser<Series>
     {
     {
-        public SeriesNfoParser(ILogger logger, IConfigurationManager config) : base(logger, config)
+        public SeriesNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager) : base(logger, config, providerManager)
         {
         {
         }
         }
 
 

+ 4 - 2
MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs

@@ -13,17 +13,19 @@ namespace MediaBrowser.XbmcMetadata.Providers
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private readonly IProviderManager _providerManager;
 
 
-        public AlbumNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+        public AlbumNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<MusicAlbum> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<MusicAlbum> result, string path, CancellationToken cancellationToken)
         {
         {
-            new BaseNfoParser<MusicAlbum>(_logger, _config).Fetch(result, path, cancellationToken);
+            new BaseNfoParser<MusicAlbum>(_logger, _config, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs

@@ -13,17 +13,19 @@ namespace MediaBrowser.XbmcMetadata.Providers
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private readonly IProviderManager _providerManager;
 
 
-        public ArtistNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+        public ArtistNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<MusicArtist> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<MusicArtist> result, string path, CancellationToken cancellationToken)
         {
         {
-            new BaseNfoParser<MusicArtist>(_logger, _config).Fetch(result, path, cancellationToken);
+            new BaseNfoParser<MusicArtist>(_logger, _config, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs

@@ -15,12 +15,14 @@ namespace MediaBrowser.XbmcMetadata.Providers
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private readonly IProviderManager _providerManager;
 
 
-        public BaseVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+        public BaseVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken)
@@ -29,7 +31,7 @@ namespace MediaBrowser.XbmcMetadata.Providers
             {
             {
                 Item = result.Item
                 Item = result.Item
             };
             };
-            new MovieNfoParser(_logger, _config).Fetch(tmpItem, path, cancellationToken);
+            new MovieNfoParser(_logger, _config, _providerManager).Fetch(tmpItem, path, cancellationToken);
 
 
             result.Item = (T)tmpItem.Item;
             result.Item = (T)tmpItem.Item;
             result.People = tmpItem.People;
             result.People = tmpItem.People;

+ 4 - 2
MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs

@@ -14,19 +14,21 @@ namespace MediaBrowser.XbmcMetadata.Providers
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private readonly IProviderManager _providerManager;
 
 
-        public EpisodeNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+        public EpisodeNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Episode> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Episode> result, string path, CancellationToken cancellationToken)
         {
         {
             var images = new List<LocalImageInfo>();
             var images = new List<LocalImageInfo>();
 
 
-            new EpisodeNfoParser(_logger, _config).Fetch(result, images, path, cancellationToken);
+            new EpisodeNfoParser(_logger, _config, _providerManager).Fetch(result, images, path, cancellationToken);
 
 
             result.Images = images;
             result.Images = images;
         }
         }

+ 4 - 3
MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs

@@ -2,27 +2,28 @@
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Logging;
 
 
 namespace MediaBrowser.XbmcMetadata.Providers
 namespace MediaBrowser.XbmcMetadata.Providers
 {
 {
     public class MovieNfoProvider : BaseVideoNfoProvider<Movie>
     public class MovieNfoProvider : BaseVideoNfoProvider<Movie>
     {
     {
-        public MovieNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+        public MovieNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager) : base(fileSystem, logger, config, providerManager)
         {
         {
         }
         }
     }
     }
 
 
     public class MusicVideoNfoProvider : BaseVideoNfoProvider<MusicVideo>
     public class MusicVideoNfoProvider : BaseVideoNfoProvider<MusicVideo>
     {
     {
-        public MusicVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+        public MusicVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager) : base(fileSystem, logger, config, providerManager)
         {
         {
         }
         }
     }
     }
 
 
     public class VideoNfoProvider : BaseVideoNfoProvider<Video>
     public class VideoNfoProvider : BaseVideoNfoProvider<Video>
     {
     {
-        public VideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+        public VideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager) : base(fileSystem, logger, config, providerManager)
         {
         {
         }
         }
     }
     }

+ 4 - 2
MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs

@@ -13,17 +13,19 @@ namespace MediaBrowser.XbmcMetadata.Providers
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private readonly IProviderManager _providerManager;
 
 
-        public SeasonNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+        public SeasonNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Season> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Season> result, string path, CancellationToken cancellationToken)
         {
         {
-            new SeasonNfoParser(_logger, _config).Fetch(result, path, cancellationToken);
+            new SeasonNfoParser(_logger, _config, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 4 - 2
MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs

@@ -13,17 +13,19 @@ namespace MediaBrowser.XbmcMetadata.Providers
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;
         private readonly IConfigurationManager _config;
         private readonly IConfigurationManager _config;
+        private readonly IProviderManager _providerManager;
 
 
-        public SeriesNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+        public SeriesNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
             : base(fileSystem)
             : base(fileSystem)
         {
         {
             _logger = logger;
             _logger = logger;
             _config = config;
             _config = config;
+            _providerManager = providerManager;
         }
         }
 
 
         protected override void Fetch(MetadataResult<Series> result, string path, CancellationToken cancellationToken)
         protected override void Fetch(MetadataResult<Series> result, string path, CancellationToken cancellationToken)
         {
         {
-            new SeriesNfoParser(_logger, _config).Fetch(result, path, cancellationToken);
+            new SeriesNfoParser(_logger, _config, _providerManager).Fetch(result, path, cancellationToken);
         }
         }
 
 
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
         protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)

+ 28 - 5
MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs

@@ -27,8 +27,8 @@ namespace MediaBrowser.XbmcMetadata.Savers
     {
     {
         private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
         private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
 
 
-        private static readonly Dictionary<string, string> CommonTags = new[] {     
-               
+        private static readonly Dictionary<string, string> CommonTags = new[] {
+
                     "plot",
                     "plot",
                     "customrating",
                     "customrating",
                     "lockdata",
                     "lockdata",
@@ -428,6 +428,8 @@ namespace MediaBrowser.XbmcMetadata.Savers
         /// <returns>Task.</returns>
         /// <returns>Task.</returns>
         public static void AddCommonNodes(BaseItem item, XmlWriter writer, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepo, IFileSystem fileSystem, IServerConfigurationManager config)
         public static void AddCommonNodes(BaseItem item, XmlWriter writer, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepo, IFileSystem fileSystem, IServerConfigurationManager config)
         {
         {
+            var writtenProviderIds = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
+
             var overview = (item.Overview ?? string.Empty)
             var overview = (item.Overview ?? string.Empty)
                 .StripHtml()
                 .StripHtml()
                 .Replace("&quot;", "'");
                 .Replace("&quot;", "'");
@@ -572,6 +574,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(rt))
             if (!string.IsNullOrEmpty(rt))
             {
             {
                 writer.WriteElementString("rottentomatoesid", rt);
                 writer.WriteElementString("rottentomatoesid", rt);
+                writtenProviderIds.Add(MetadataProviders.RottenTomatoes.ToString());
             }
             }
 
 
             var tmdbCollection = item.GetProviderId(MetadataProviders.TmdbCollection);
             var tmdbCollection = item.GetProviderId(MetadataProviders.TmdbCollection);
@@ -579,6 +582,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(tmdbCollection))
             if (!string.IsNullOrEmpty(tmdbCollection))
             {
             {
                 writer.WriteElementString("collectionnumber", tmdbCollection);
                 writer.WriteElementString("collectionnumber", tmdbCollection);
+                writtenProviderIds.Add(MetadataProviders.TmdbCollection.ToString());
             }
             }
 
 
             var imdb = item.GetProviderId(MetadataProviders.Imdb);
             var imdb = item.GetProviderId(MetadataProviders.Imdb);
@@ -592,6 +596,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
                 {
                 {
                     writer.WriteElementString("imdbid", imdb);
                     writer.WriteElementString("imdbid", imdb);
                 }
                 }
+                writtenProviderIds.Add(MetadataProviders.Imdb.ToString());
             }
             }
 
 
             // Series xml saver already saves this
             // Series xml saver already saves this
@@ -601,6 +606,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
                 if (!string.IsNullOrEmpty(tvdb))
                 if (!string.IsNullOrEmpty(tvdb))
                 {
                 {
                     writer.WriteElementString("tvdbid", tvdb);
                     writer.WriteElementString("tvdbid", tvdb);
+                    writtenProviderIds.Add(MetadataProviders.Tvdb.ToString());
                 }
                 }
             }
             }
 
 
@@ -608,12 +614,14 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(tmdb))
             if (!string.IsNullOrEmpty(tmdb))
             {
             {
                 writer.WriteElementString("tmdbid", tmdb);
                 writer.WriteElementString("tmdbid", tmdb);
+                writtenProviderIds.Add(MetadataProviders.Tmdb.ToString());
             }
             }
 
 
             var tvcom = item.GetProviderId(MetadataProviders.Tvcom);
             var tvcom = item.GetProviderId(MetadataProviders.Tvcom);
             if (!string.IsNullOrEmpty(tvcom))
             if (!string.IsNullOrEmpty(tvcom))
             {
             {
                 writer.WriteElementString("tvcomid", tvcom);
                 writer.WriteElementString("tvcomid", tvcom);
+                writtenProviderIds.Add(MetadataProviders.Tvcom.ToString());
             }
             }
 
 
             if (!string.IsNullOrEmpty(item.PreferredMetadataLanguage))
             if (!string.IsNullOrEmpty(item.PreferredMetadataLanguage))
@@ -766,6 +774,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("audiodbartistid", externalId);
                 writer.WriteElementString("audiodbartistid", externalId);
+                writtenProviderIds.Add(MetadataProviders.AudioDbArtist.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.AudioDbAlbum);
             externalId = item.GetProviderId(MetadataProviders.AudioDbAlbum);
@@ -773,6 +782,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("audiodbalbumid", externalId);
                 writer.WriteElementString("audiodbalbumid", externalId);
+                writtenProviderIds.Add(MetadataProviders.AudioDbAlbum.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.Zap2It);
             externalId = item.GetProviderId(MetadataProviders.Zap2It);
@@ -780,6 +790,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("zap2itid", externalId);
                 writer.WriteElementString("zap2itid", externalId);
+                writtenProviderIds.Add(MetadataProviders.Zap2It.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbum);
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbum);
@@ -787,6 +798,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("musicbrainzalbumid", externalId);
                 writer.WriteElementString("musicbrainzalbumid", externalId);
+                writtenProviderIds.Add(MetadataProviders.MusicBrainzAlbum.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbumArtist);
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzAlbumArtist);
@@ -794,6 +806,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("musicbrainzalbumartistid", externalId);
                 writer.WriteElementString("musicbrainzalbumartistid", externalId);
+                writtenProviderIds.Add(MetadataProviders.MusicBrainzAlbumArtist.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzArtist);
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzArtist);
@@ -801,6 +814,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("musicbrainzartistid", externalId);
                 writer.WriteElementString("musicbrainzartistid", externalId);
+                writtenProviderIds.Add(MetadataProviders.MusicBrainzArtist.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
             externalId = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup);
@@ -808,24 +822,33 @@ namespace MediaBrowser.XbmcMetadata.Savers
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("musicbrainzreleasegroupid", externalId);
                 writer.WriteElementString("musicbrainzreleasegroupid", externalId);
+                writtenProviderIds.Add(MetadataProviders.MusicBrainzReleaseGroup.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.Gamesdb);
             externalId = item.GetProviderId(MetadataProviders.Gamesdb);
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("gamesdbid", externalId);
                 writer.WriteElementString("gamesdbid", externalId);
+                writtenProviderIds.Add(MetadataProviders.Gamesdb.ToString());
             }
             }
 
 
             externalId = item.GetProviderId(MetadataProviders.TvRage);
             externalId = item.GetProviderId(MetadataProviders.TvRage);
             if (!string.IsNullOrEmpty(externalId))
             if (!string.IsNullOrEmpty(externalId))
             {
             {
                 writer.WriteElementString("tvrageid", externalId);
                 writer.WriteElementString("tvrageid", externalId);
+                writtenProviderIds.Add(MetadataProviders.TvRage.ToString());
             }
             }
 
 
-            externalId = item.GetProviderId(MetadataProviders.TvMaze);
-            if (!string.IsNullOrEmpty(externalId))
+            if (item.ProviderIds != null)
             {
             {
-                writer.WriteElementString("tvmazeid", externalId);
+                foreach (var providerKey in item.ProviderIds.Keys)
+                {
+                    var providerId = item.ProviderIds[providerKey];
+                    if (!string.IsNullOrEmpty(providerId) && !writtenProviderIds.Contains(providerKey))
+                    {
+                        writer.WriteElementString(providerKey.ToLower() + "id", providerId);
+                    }
+                }
             }
             }
 
 
             if (options.SaveImagePathsInNfo)
             if (options.SaveImagePathsInNfo)

+ 1 - 4
MediaBrowser.sln

@@ -1,7 +1,7 @@
 
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
 # Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
+VisualStudioVersion = 14.0.25420.1
 MinimumVisualStudioVersion = 10.0.40219.1
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F0E0E64C-2A6F-4E35-9533-D53AC07C2CD1}"
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F0E0E64C-2A6F-4E35-9533-D53AC07C2CD1}"
 EndProject
 EndProject
@@ -65,9 +65,6 @@ EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing", "Emby.Drawing\Emby.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing", "Emby.Drawing\Emby.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
 EndProject
 EndProject
 Global
 Global
-	GlobalSection(Performance) = preSolution
-		HasPerformanceSessions = true
-	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
 		Debug|Any CPU = Debug|Any CPU
 		Debug|Mixed Platforms = Debug|Mixed Platforms
 		Debug|Mixed Platforms = Debug|Mixed Platforms