save person.xml

This commit is contained in:
Luke Pulverenti 2013-06-23 13:56:11 -04:00
parent d6cf7b51ac
commit 41f84fc6b2
6 changed files with 131 additions and 70 deletions

View file

@ -62,7 +62,7 @@
<Compile Include="Movies\MovieDbProvider.cs" /> <Compile Include="Movies\MovieDbProvider.cs" />
<Compile Include="Movies\MovieProviderFromXml.cs" /> <Compile Include="Movies\MovieProviderFromXml.cs" />
<Compile Include="Movies\OpenMovieDatabaseProvider.cs" /> <Compile Include="Movies\OpenMovieDatabaseProvider.cs" />
<Compile Include="Movies\PersonProviderFromJson.cs" /> <Compile Include="Movies\PersonProviderFromXml.cs" />
<Compile Include="Movies\TmdbPersonProvider.cs" /> <Compile Include="Movies\TmdbPersonProvider.cs" />
<Compile Include="Music\ArtistsPostScanTask.cs" /> <Compile Include="Music\ArtistsPostScanTask.cs" />
<Compile Include="Music\FanArtAlbumProvider.cs" /> <Compile Include="Music\FanArtAlbumProvider.cs" />
@ -79,6 +79,7 @@
<Compile Include="Savers\EpisodeXmlSaver.cs" /> <Compile Include="Savers\EpisodeXmlSaver.cs" />
<Compile Include="Savers\FolderXmlSaver.cs" /> <Compile Include="Savers\FolderXmlSaver.cs" />
<Compile Include="Savers\MovieXmlSaver.cs" /> <Compile Include="Savers\MovieXmlSaver.cs" />
<Compile Include="Savers\PersonXmlSaver.cs" />
<Compile Include="Savers\SeriesXmlSaver.cs" /> <Compile Include="Savers\SeriesXmlSaver.cs" />
<Compile Include="Savers\XmlHelpers.cs" /> <Compile Include="Savers\XmlHelpers.cs" />
<Compile Include="TV\EpisodeImageFromMediaLocationProvider.cs" /> <Compile Include="TV\EpisodeImageFromMediaLocationProvider.cs" />

View file

@ -199,7 +199,7 @@ namespace MediaBrowser.Providers.Movies
protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo) protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
{ {
if (HasAltMeta(item)) if (HasAltMeta(item))
return false; //never refresh if has meta from other source return false;
return base.NeedsRefreshInternal(item, providerInfo); return base.NeedsRefreshInternal(item, providerInfo);
} }

View file

@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using System; using System;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
@ -10,14 +9,14 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.Movies namespace MediaBrowser.Providers.Movies
{ {
/// <summary> class PersonProviderFromXml : BaseMetadataProvider
/// Class PersonProviderFromJson
/// </summary>
class PersonProviderFromJson : TmdbPersonProvider
{ {
public PersonProviderFromJson(IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager) internal static PersonProviderFromXml Current { get; private set; }
: base(jsonSerializer, logManager, configurationManager, providerManager)
public PersonProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager)
: base(logManager, configurationManager)
{ {
Current = this;
} }
/// <summary> /// <summary>
@ -31,32 +30,12 @@ namespace MediaBrowser.Providers.Movies
} }
/// <summary> /// <summary>
/// Gets a value indicating whether [requires internet]. /// Gets the priority.
/// </summary> /// </summary>
/// <value><c>true</c> if [requires internet]; otherwise, <c>false</c>.</value> /// <value>The priority.</value>
public override bool RequiresInternet public override MetadataProviderPriority Priority
{ {
get get { return MetadataProviderPriority.Second; }
{
return false;
}
}
// Need to re-override to jump over intermediate implementation
/// <summary>
/// Needses the refresh internal.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="providerInfo">The provider info.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
{
if (!item.ResolveArgs.ContainsMetaFileByName(MetaFileName))
{
return false;
}
return CompareDate(item) > providerInfo.LastRefreshed;
} }
/// <summary> /// <summary>
@ -67,22 +46,10 @@ namespace MediaBrowser.Providers.Movies
/// <returns>DateTime.</returns> /// <returns>DateTime.</returns>
protected override DateTime CompareDate(BaseItem item) 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; return entry != null ? entry.LastWriteTimeUtc : DateTime.MinValue;
} }
/// <summary>
/// Gets the priority.
/// </summary>
/// <value>The priority.</value>
public override MetadataProviderPriority Priority
{
get
{
return MetadataProviderPriority.Third;
}
}
/// <summary> /// <summary>
/// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
/// </summary> /// </summary>
@ -91,25 +58,42 @@ namespace MediaBrowser.Providers.Movies
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.Boolean}.</returns> /// <returns>Task{System.Boolean}.</returns>
public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) public override Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
{
return Fetch(item, cancellationToken);
}
/// <summary>
/// Fetches the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
private async Task<bool> Fetch(BaseItem item, CancellationToken cancellationToken)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
try var metadataFile = item.ResolveArgs.GetMetaFileByPath(Path.Combine(item.MetaLocation, "person.xml"));
if (metadataFile != null)
{ {
var personInfo = JsonSerializer.DeserializeFromFile<PersonResult>(Path.Combine(item.MetaLocation, MetaFileName)); var path = metadataFile.FullName;
cancellationToken.ThrowIfCancellationRequested(); await XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
ProcessInfo((Person)item, personInfo); try
{
new BaseItemXmlParser<Person>(Logger).Fetch((Person)item, path, cancellationToken);
}
finally
{
XmlParsingResourcePool.Release();
}
SetLastRefreshed(item, DateTime.UtcNow); SetLastRefreshed(item, DateTime.UtcNow);
return TrueTaskResult; return true;
}
catch (FileNotFoundException)
{
// This is okay - just means we force refreshed and there isn't a json file
return FalseTaskResult;
} }
return false;
} }
} }
} }

View file

@ -21,11 +21,6 @@ namespace MediaBrowser.Providers.Movies
/// </summary> /// </summary>
public class TmdbPersonProvider : BaseMetadataProvider public class TmdbPersonProvider : BaseMetadataProvider
{ {
/// <summary>
/// The meta file name
/// </summary>
protected const string MetaFileName = "tmdb3.json";
protected readonly IProviderManager ProviderManager; protected readonly IProviderManager ProviderManager;
public TmdbPersonProvider(IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager, 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");
}
/// <summary> /// <summary>
/// Fetches metadata and returns true or false indicating if any work that requires persistence was done /// Fetches metadata and returns true or false indicating if any work that requires persistence was done
/// </summary> /// </summary>
@ -184,13 +192,6 @@ namespace MediaBrowser.Providers.Movies
{ {
ProcessInfo(person, searchResult); 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); Logger.Debug("TmdbPersonProvider downloaded and saved information for {0}", person.Name);
await FetchImages(person, searchResult.images, cancellationToken).ConfigureAwait(false); await FetchImages(person, searchResult.images, cancellationToken).ConfigureAwait(false);

View file

@ -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
{
/// <summary>
/// Class PersonXmlSaver
/// </summary>
public class PersonXmlSaver : IMetadataSaver
{
/// <summary>
/// Supportses the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
public bool Supports(BaseItem item)
{
if (item.LocationType != LocationType.FileSystem)
{
return false;
}
return item is Person;
}
/// <summary>
/// Saves the specified item.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
public void Save(BaseItem item, CancellationToken cancellationToken)
{
var builder = new StringBuilder();
builder.Append("<Item>");
XmlHelpers.AddCommonNodes(item, builder);
builder.Append("</Item>");
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);
}
/// <summary>
/// Gets the save path.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>System.String.</returns>
public string GetSavePath(BaseItem item)
{
return Path.Combine(item.Path, "person.xml");
}
}
}

View file

@ -83,12 +83,22 @@ namespace MediaBrowser.Server.Implementations.Providers
libraryManager.ItemUpdated += libraryManager_ItemUpdated; libraryManager.ItemUpdated += libraryManager_ItemUpdated;
} }
/// <summary>
/// Handles the ItemUpdated event of the libraryManager control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="ItemChangeEventArgs"/> instance containing the event data.</param>
void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e) void libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e)
{ {
var item = e.Item; 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))) foreach (var saver in _savers.Where(i => i.Supports(item)))
{ {
var path = saver.GetSavePath(item); var path = saver.GetSavePath(item);
@ -109,7 +119,6 @@ namespace MediaBrowser.Server.Implementations.Providers
} }
} }
} }
} }
/// <summary> /// <summary>