瀏覽代碼

tv metadata fixes

Luke Pulverenti 11 年之前
父節點
當前提交
15046e5703

+ 5 - 5
MediaBrowser.Controller/Providers/BaseMetadataProvider.cs

@@ -233,27 +233,27 @@ namespace MediaBrowser.Controller.Providers
                 throw new ArgumentNullException("providerInfo");
             }
 
-            if (RefreshOnVersionChange && !String.Equals(ProviderVersion, providerInfo.ProviderVersion))
+            if (NeedsRefreshBasedOnCompareDate(item, providerInfo))
             {
                 return true;
             }
 
-            if (RequiresInternet && DateTime.UtcNow > (providerInfo.LastRefreshed.AddDays(ConfigurationManager.Configuration.MetadataRefreshDays)))
+            if (RefreshOnFileSystemStampChange && item.LocationType == LocationType.FileSystem && HasFileSystemStampChanged(item, providerInfo))
             {
                 return true;
             }
 
-            if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success)
+            if (RefreshOnVersionChange && !String.Equals(ProviderVersion, providerInfo.ProviderVersion))
             {
                 return true;
             }
 
-            if (NeedsRefreshBasedOnCompareDate(item, providerInfo))
+            if (RequiresInternet && DateTime.UtcNow > (providerInfo.LastRefreshed.AddDays(ConfigurationManager.Configuration.MetadataRefreshDays)))
             {
                 return true;
             }
 
-            if (RefreshOnFileSystemStampChange && item.LocationType == LocationType.FileSystem && HasFileSystemStampChanged(item, providerInfo))
+            if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success)
             {
                 return true;
             }

+ 11 - 8
MediaBrowser.Providers/Games/GameProviderFromXml.cs

@@ -72,15 +72,18 @@ namespace MediaBrowser.Providers.Games
 
             var metaFile = GameXmlSaver.GetGameSavePath(game);
 
-            await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
-
-            try
-            {
-                new BaseItemXmlParser<Game>(Logger).Fetch(game, metaFile, cancellationToken);
-            }
-            finally
+            if (File.Exists(metaFile))
             {
-                XmlParsingResourcePool.Release();
+                await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+                try
+                {
+                    new BaseItemXmlParser<Game>(Logger).Fetch(game, metaFile, cancellationToken);
+                }
+                finally
+                {
+                    XmlParsingResourcePool.Release();
+                }
             }
 
             SetLastRefreshed(game, DateTime.UtcNow);

+ 13 - 10
MediaBrowser.Providers/Movies/MovieProviderFromXml.cs

@@ -92,17 +92,20 @@ namespace MediaBrowser.Providers.Movies
 
             var path = MovieXmlSaver.GetMovieSavePath(item);
 
-            await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
-
-            try
-            {
-                var video = (Video)item;
-
-                await new MovieXmlParser(Logger, _itemRepo).FetchAsync(video, path, cancellationToken).ConfigureAwait(false);
-            }
-            finally
+            if (File.Exists(path))
             {
-                XmlParsingResourcePool.Release();
+                await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+                try
+                {
+                    var video = (Video)item;
+
+                    await new MovieXmlParser(Logger, _itemRepo).FetchAsync(video, path, cancellationToken).ConfigureAwait(false);
+                }
+                finally
+                {
+                    XmlParsingResourcePool.Release();
+                }
             }
 
             SetLastRefreshed(item, DateTime.UtcNow);

+ 11 - 13
MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs

@@ -93,20 +93,18 @@ namespace MediaBrowser.Providers.TV
 
             var file = item.ResolveArgs.Parent.ResolveArgs.GetMetaFileByPath(metadataFile);
 
-            if (file == null)
-            {
-                return false;
-            }
-
-            await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
-
-            try
-            {
-                await new EpisodeXmlParser(Logger, _itemRepo).FetchAsync((Episode)item, metadataFile, cancellationToken).ConfigureAwait(false);
-            }
-            finally
+            if (file != null)
             {
-                XmlParsingResourcePool.Release();
+                await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+                try
+                {
+                    await new EpisodeXmlParser(Logger, _itemRepo).FetchAsync((Episode)item, metadataFile, cancellationToken).ConfigureAwait(false);
+                }
+                finally
+                {
+                    XmlParsingResourcePool.Release();
+                }
             }
 
             SetLastRefreshed(item, DateTime.UtcNow);

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

@@ -120,7 +120,7 @@ namespace MediaBrowser.Providers.TV
         protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
         {
             // Don't proceed if there's local metadata
-            if (HasLocalMeta(item) && !ConfigurationManager.Configuration.EnableTvDbUpdates)
+            if (!ConfigurationManager.Configuration.EnableTvDbUpdates && HasLocalMeta(item))
             {
                 return false;
             }

+ 67 - 5
MediaBrowser.Providers/TV/RemoteSeriesProvider.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
@@ -162,7 +163,7 @@ namespace MediaBrowser.Providers.TV
             }
         }
 
-        protected override DateTime CompareDate(BaseItem item)
+        protected override bool NeedsRefreshBasedOnCompareDate(BaseItem item, BaseProviderInfo providerInfo)
         {
             var seriesId = item.GetProviderId(MetadataProviders.Tvdb);
 
@@ -180,16 +181,17 @@ namespace MediaBrowser.Providers.TV
 
                     if (files.Count > 0)
                     {
-                        return files.Max();
+                        return files.Max() > providerInfo.LastRefreshed;
                     }
                 }
                 catch (DirectoryNotFoundException)
                 {
                     // Don't blow up
+                    return true;
                 }
             }
-
-            return base.CompareDate(item);
+            
+            return base.NeedsRefreshBasedOnCompareDate(item, providerInfo);
         }
 
         /// <summary>
@@ -298,6 +300,66 @@ namespace MediaBrowser.Providers.TV
                     _zipClient.ExtractAll(ms, seriesDataPath, true);
                 }
             }
+
+            foreach (var file in Directory.EnumerateFiles(seriesDataPath, "*.xml", SearchOption.AllDirectories).ToList())
+            {
+                await SanitizeXmlFile(file).ConfigureAwait(false);
+            }
+        }
+
+        /// <summary>
+        /// Sanitizes the XML file.
+        /// </summary>
+        /// <param name="file">The file.</param>
+        /// <returns>Task.</returns>
+        private async Task SanitizeXmlFile(string file)
+        {
+            string validXml;
+
+            using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
+            {
+                using (var reader = new StreamReader(fileStream))
+                {
+                    var xml = await reader.ReadToEndAsync().ConfigureAwait(false);
+
+                    validXml = StripInvalidXmlCharacters(xml);
+                }
+            }
+
+            using (var fileStream = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
+            {
+                using (var writer = new StreamWriter(fileStream))
+                {
+                    await writer.WriteAsync(validXml).ConfigureAwait(false);
+                }
+            }
+        }
+
+        /// <summary>
+        /// Strips the invalid XML characters.
+        /// </summary>
+        /// <param name="inString">The in string.</param>
+        /// <returns>System.String.</returns>
+        public static string StripInvalidXmlCharacters(string inString)
+        {
+            if (inString == null) return null;
+
+            var sbOutput = new StringBuilder();
+            char ch;
+
+            for (int i = 0; i < inString.Length; i++)
+            {
+                ch = inString[i];
+                if ((ch >= 0x0020 && ch <= 0xD7FF) ||
+                    (ch >= 0xE000 && ch <= 0xFFFD) ||
+                    ch == 0x0009 ||
+                    ch == 0x000A ||
+                    ch == 0x000D)
+                {
+                    sbOutput.Append(ch);
+                }
+            }
+            return sbOutput.ToString();
         }
 
         /// <summary>
@@ -320,7 +382,7 @@ namespace MediaBrowser.Providers.TV
         /// <returns>System.String.</returns>
         internal static string GetSeriesDataPath(IApplicationPaths appPaths)
         {
-            var dataPath = Path.Combine(appPaths.DataPath, "tvdb");
+            var dataPath = Path.Combine(appPaths.DataPath, "tvdb-v2");
 
             return dataPath;
         }

+ 1 - 1
MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs

@@ -22,7 +22,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
 
         private readonly object _syncLock = new object();
         private Timer UpdateTimer { get; set; }
-        private const int UpdateDuration = 2000;
+        private const int UpdateDuration = 500;
 
         private readonly Dictionary<Guid, List<string>> _changedKeys = new Dictionary<Guid, List<string>>();