diff options
Diffstat (limited to 'MediaBrowser.XbmcMetadata/EntryPoint.cs')
| -rw-r--r-- | MediaBrowser.XbmcMetadata/EntryPoint.cs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs new file mode 100644 index 000000000..a7015e41f --- /dev/null +++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs @@ -0,0 +1,110 @@ +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Plugins; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Logging; +using MediaBrowser.XbmcMetadata.Configuration; +using System; +using System.Linq; + +namespace MediaBrowser.XbmcMetadata +{ + public class EntryPoint : IServerEntryPoint + { + private readonly IUserDataManager _userDataManager; + private readonly ILogger _logger; + private readonly ILibraryManager _libraryManager; + private readonly IProviderManager _providerManager; + private readonly IConfigurationManager _config; + + public EntryPoint(IUserDataManager userDataManager, ILibraryManager libraryManager, ILogger logger, IProviderManager providerManager, IConfigurationManager config) + { + _userDataManager = userDataManager; + _libraryManager = libraryManager; + _logger = logger; + _providerManager = providerManager; + _config = config; + } + + public void Run() + { + _userDataManager.UserDataSaved += _userDataManager_UserDataSaved; + _libraryManager.ItemUpdated += _libraryManager_ItemUpdated; + } + + void _libraryManager_ItemUpdated(object sender, ItemChangeEventArgs e) + { + // TODO: Need a more accurate check here to see if xbmc metadata saving is enabled. + // This is probably good enough, but no guarantee + var userId = _config.GetNfoConfiguration().UserId; + if (string.IsNullOrWhiteSpace(userId)) + { + return; + } + + if (e.UpdateReason == ItemUpdateType.ImageUpdate) + { + var person = e.Item as Person; + + if (person != null) + { + var items = _libraryManager.RootFolder.RecursiveChildren; + items = person.GetTaggedItems(items).ToList(); + + foreach (var item in items) + { + SaveMetadataForItem(item, ItemUpdateType.MetadataEdit); + } + } + } + } + + void _userDataManager_UserDataSaved(object sender, UserDataSaveEventArgs e) + { + var userId = _config.GetNfoConfiguration().UserId; + if (string.IsNullOrWhiteSpace(userId)) + { + return; + } + + if (e.SaveReason == UserDataSaveReason.PlaybackFinished || e.SaveReason == UserDataSaveReason.TogglePlayed) + { + var item = e.Item as BaseItem; + + if (item != null) + { + if (!item.IsFolder && !(item is IItemByName)) + { + SaveMetadataForItem(item, ItemUpdateType.MetadataEdit); + } + } + } + } + + public void Dispose() + { + _userDataManager.UserDataSaved -= _userDataManager_UserDataSaved; + } + + private async void SaveMetadataForItem(BaseItem item, ItemUpdateType updateReason) + { + var locationType = item.LocationType; + if (locationType == LocationType.Remote || + locationType == LocationType.Virtual) + { + return; + } + + try + { + await _providerManager.SaveMetadata(item, updateReason).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error saving metadata for {0}", ex, item.Path ?? item.Name); + } + } + } +} |
