diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-10-10 12:55:07 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-10-10 12:55:07 -0400 |
| commit | 15046e5703dac844e536adf2b6da4f1fc4d74a22 (patch) | |
| tree | 8f5605943c6d39130e10ffe2811fdff75baf3b1f | |
| parent | 5897b2555fdf5826879c0f3b8660667c5079e2bd (diff) | |
tv metadata fixes
7 files changed, 109 insertions, 43 deletions
diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index ad6be9481..2d49708fe 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/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; } diff --git a/MediaBrowser.Providers/Games/GameProviderFromXml.cs b/MediaBrowser.Providers/Games/GameProviderFromXml.cs index f982e5658..6292cec46 100644 --- a/MediaBrowser.Providers/Games/GameProviderFromXml.cs +++ b/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); diff --git a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs index 9ae6cfa43..941706b30 100644 --- a/MediaBrowser.Providers/Movies/MovieProviderFromXml.cs +++ b/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); diff --git a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs index c7f85358c..9862f10fe 100644 --- a/MediaBrowser.Providers/TV/EpisodeProviderFromXml.cs +++ b/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); diff --git a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs index aeca42938..e34c41238 100644 --- a/MediaBrowser.Providers/TV/RemoteEpisodeProvider.cs +++ b/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; } diff --git a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs index 0d2360d5b..a921e2036 100644 --- a/MediaBrowser.Providers/TV/RemoteSeriesProvider.cs +++ b/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; } diff --git a/MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs index fc35e040d..c3766b9fe 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs +++ b/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>>(); |
