From 41f84fc6b27e54d5f15820e5086638fc65279c24 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sun, 23 Jun 2013 13:56:11 -0400 Subject: [PATCH] save person.xml --- .../MediaBrowser.Providers.csproj | 3 +- .../Movies/MovieDbProvider.cs | 2 +- ...erFromJson.cs => PersonProviderFromXml.cs} | 92 ++++++++----------- .../Movies/TmdbPersonProvider.cs | 25 ++--- .../Savers/PersonXmlSaver.cs | 66 +++++++++++++ .../Providers/ProviderManager.cs | 13 ++- 6 files changed, 131 insertions(+), 70 deletions(-) rename MediaBrowser.Providers/Movies/{PersonProviderFromJson.cs => PersonProviderFromXml.cs} (54%) create mode 100644 MediaBrowser.Providers/Savers/PersonXmlSaver.cs diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj index 06c9215210..ec0d0c2b90 100644 --- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj +++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj @@ -62,7 +62,7 @@ - + @@ -79,6 +79,7 @@ + diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 10234a0940..8fecf6f443 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -199,7 +199,7 @@ namespace MediaBrowser.Providers.Movies protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) { if (HasAltMeta(item)) - return false; //never refresh if has meta from other source + return false; return base.NeedsRefreshInternal(item, providerInfo); } diff --git a/MediaBrowser.Providers/Movies/PersonProviderFromJson.cs b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs similarity index 54% rename from MediaBrowser.Providers/Movies/PersonProviderFromJson.cs rename to MediaBrowser.Providers/Movies/PersonProviderFromXml.cs index 9829331ba8..7fe646c78c 100644 --- a/MediaBrowser.Providers/Movies/PersonProviderFromJson.cs +++ b/MediaBrowser.Providers/Movies/PersonProviderFromXml.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; using System; using System.IO; using System.Threading; @@ -10,14 +9,14 @@ using System.Threading.Tasks; namespace MediaBrowser.Providers.Movies { - /// - /// Class PersonProviderFromJson - /// - class PersonProviderFromJson : TmdbPersonProvider + class PersonProviderFromXml : BaseMetadataProvider { - public PersonProviderFromJson(IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) - : base(jsonSerializer, logManager, configurationManager, providerManager) + internal static PersonProviderFromXml Current { get; private set; } + + public PersonProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) + : base(logManager, configurationManager) { + Current = this; } /// @@ -31,32 +30,12 @@ namespace MediaBrowser.Providers.Movies } /// - /// Gets a value indicating whether [requires internet]. + /// Gets the priority. /// - /// true if [requires internet]; otherwise, false. - public override bool RequiresInternet + /// The priority. + public override MetadataProviderPriority Priority { - get - { - return false; - } - } - - // Need to re-override to jump over intermediate implementation - /// - /// Needses the refresh internal. - /// - /// The item. - /// The provider info. - /// true if XXXX, false otherwise - protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) - { - if (!item.ResolveArgs.ContainsMetaFileByName(MetaFileName)) - { - return false; - } - - return CompareDate(item) > providerInfo.LastRefreshed; + get { return MetadataProviderPriority.Second; } } /// @@ -67,22 +46,10 @@ namespace MediaBrowser.Providers.Movies /// DateTime. protected override DateTime CompareDate(BaseItem item) { - var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation,MetaFileName)); + var entry = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "person.xml")); return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue; } - /// - /// Gets the priority. - /// - /// The priority. - public override MetadataProviderPriority Priority - { - get - { - return MetadataProviderPriority.Third; - } - } - /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// @@ -91,25 +58,42 @@ namespace MediaBrowser.Providers.Movies /// The cancellation token. /// Task{System.Boolean}. public override Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) + { + return Fetch(item, cancellationToken); + } + + /// + /// Fetches the specified item. + /// + /// The item. + /// The cancellation token. + /// true if XXXX, false otherwise + private async Task Fetch(BaseItem item, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); - try + var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "person.xml")); + + if (metadataFile != null) { - var personInfo = JsonSerializer.DeserializeFromFile(Path.Combine(item.MetaLocation, MetaFileName)); + var path = metadataFile.FullName; - cancellationToken.ThrowIfCancellationRequested(); + await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); - ProcessInfo((Person)item, personInfo); + try + { + new BaseItemXmlParser(Logger).Fetch((Person)item, path, cancellationToken); + } + finally + { + XmlParsingResourcePool.Release(); + } SetLastRefreshed(item, DateTime.UtcNow); - return TrueTaskResult; - } - catch (FileNotFoundException) - { - // This is okay - just means we force refreshed and there isn't a json file - return FalseTaskResult; + return true; } + + return false; } } } diff --git a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs index 1b02aec3d2..fbf084218a 100644 --- a/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs +++ b/MediaBrowser.Providers/Movies/TmdbPersonProvider.cs @@ -21,11 +21,6 @@ namespace MediaBrowser.Providers.Movies /// public class TmdbPersonProvider : BaseMetadataProvider { - /// - /// The meta file name - /// - protected const string MetaFileName = "tmdb3.json"; - protected readonly IProviderManager ProviderManager; public TmdbPersonProvider(IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) @@ -71,6 +66,19 @@ namespace MediaBrowser.Providers.Movies } } + protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) + { + if (HasAltMeta(item)) + return false; + + return base.NeedsRefreshInternal(item, providerInfo); + } + + private bool HasAltMeta(BaseItem item) + { + return item.LocationType == LocationType.FileSystem && item.ResolveArgs.ContainsMetaFileByName("person.xml"); + } + /// /// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// @@ -184,13 +192,6 @@ namespace MediaBrowser.Providers.Movies { ProcessInfo(person, searchResult); - //save locally - var memoryStream = new MemoryStream(); - - JsonSerializer.SerializeToStream(searchResult, memoryStream); - - await ProviderManager.SaveToLibraryFilesystem(person, Path.Combine(person.MetaLocation, MetaFileName), memoryStream, cancellationToken); - Logger.Debug("TmdbPersonProvider downloaded and saved information for {0}", person.Name); await FetchImages(person, searchResult.images, cancellationToken).ConfigureAwait(false); diff --git a/MediaBrowser.Providers/Savers/PersonXmlSaver.cs b/MediaBrowser.Providers/Savers/PersonXmlSaver.cs new file mode 100644 index 0000000000..03b5353125 --- /dev/null +++ b/MediaBrowser.Providers/Savers/PersonXmlSaver.cs @@ -0,0 +1,66 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Entities; +using MediaBrowser.Providers.Movies; +using System; +using System.IO; +using System.Text; +using System.Threading; + +namespace MediaBrowser.Providers.Savers +{ + /// + /// Class PersonXmlSaver + /// + public class PersonXmlSaver : IMetadataSaver + { + /// + /// Supportses the specified item. + /// + /// The item. + /// true if XXXX, false otherwise + public bool Supports(BaseItem item) + { + if (item.LocationType != LocationType.FileSystem) + { + return false; + } + + return item is Person; + } + + /// + /// Saves the specified item. + /// + /// The item. + /// The cancellation token. + /// Task. + public void Save(BaseItem item, CancellationToken cancellationToken) + { + var builder = new StringBuilder(); + + builder.Append(""); + + XmlHelpers.AddCommonNodes(item, builder); + + builder.Append(""); + + var xmlFilePath = GetSavePath(item); + + XmlHelpers.Save(builder, xmlFilePath); + + // Set last refreshed so that the provider doesn't trigger after the file save + PersonProviderFromXml.Current.SetLastRefreshed(item, DateTime.UtcNow); + } + + /// + /// Gets the save path. + /// + /// The item. + /// System.String. + public string GetSavePath(BaseItem item) + { + return Path.Combine(item.Path, "person.xml"); + } + } +} diff --git a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs index 3c1a7aa1e9..395a4298b9 100644 --- a/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs +++ b/MediaBrowser.Server.Implementations/Providers/ProviderManager.cs @@ -83,12 +83,22 @@ namespace MediaBrowser.Server.Implementations.Providers libraryManager.ItemUpdated += libraryManager_ItemUpdated; } + /// + /// Handles the ItemUpdated event of the libraryManager control. + /// + /// The source of the event. + /// The instance containing the event data. void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e) { var item = e.Item; - if (ConfigurationManager.Configuration.SaveLocalMeta && item.LocationType == LocationType.FileSystem) + if (ConfigurationManager.Configuration.SaveLocalMeta) { + if (item.LocationType != LocationType.FileSystem) + { + return; + } + foreach (var saver in _savers.Where(i => i.Supports(item))) { var path = saver.GetSavePath(item); @@ -109,7 +119,6 @@ namespace MediaBrowser.Server.Implementations.Providers } } } - } ///