diff options
| author | Eric Reed <ebr@mediabrowser3.com> | 2013-06-18 15:28:18 -0400 |
|---|---|---|
| committer | Eric Reed <ebr@mediabrowser3.com> | 2013-06-18 15:28:18 -0400 |
| commit | cc728d87c2507d5392686df6e18c7ad2ba5c45bd (patch) | |
| tree | 1eee3719a4cd8abd78f422900620e62042161766 /MediaBrowser.Controller | |
| parent | 90155278f8b4465a4b5eaf140c5e6e4905cc8dcf (diff) | |
| parent | 5d8ed2c16fdeaec1344964778e98cadfaa9571b4 (diff) | |
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Drawing/ImageManager.cs | 21 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Dto/DtoBuilder.cs | 30 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 45 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 65 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Movies/Movie.cs | 16 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Video.cs | 24 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/IDisplayPreferencesManager.cs | 28 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ILibraryManager.cs | 21 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaBrowser.Controller.csproj | 2 | ||||
| -rw-r--r-- | MediaBrowser.Controller/MediaInfo/FFMpegManager.cs | 27 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Persistence/IItemRepository.cs | 98 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Persistence/IUserDataRepository.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Reflection/TypeMapper.cs | 47 |
14 files changed, 243 insertions, 185 deletions
diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs index 14994ac5ce..d6bc983c06 100644 --- a/MediaBrowser.Controller/Drawing/ImageManager.cs +++ b/MediaBrowser.Controller/Drawing/ImageManager.cs @@ -2,6 +2,7 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.TV; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; @@ -65,10 +66,7 @@ namespace MediaBrowser.Controller.Drawing /// </summary> private readonly ILogger _logger; - /// <summary> - /// The _kernel - /// </summary> - private readonly Kernel _kernel; + private readonly IItemRepository _itemRepo; /// <summary> /// The _locks @@ -78,13 +76,13 @@ namespace MediaBrowser.Controller.Drawing /// <summary> /// Initializes a new instance of the <see cref="ImageManager" /> class. /// </summary> - /// <param name="kernel">The kernel.</param> /// <param name="logger">The logger.</param> /// <param name="appPaths">The app paths.</param> - public ImageManager(Kernel kernel, ILogger logger, IServerApplicationPaths appPaths) + /// <param name="itemRepo">The item repo.</param> + public ImageManager(ILogger logger, IServerApplicationPaths appPaths, IItemRepository itemRepo) { _logger = logger; - _kernel = kernel; + _itemRepo = itemRepo; ImageSizeCache = new FileSystemRepository(Path.Combine(appPaths.ImageCachePath, "image-sizes")); ResizedImageCache = new FileSystemRepository(Path.Combine(appPaths.ImageCachePath, "resized-images")); @@ -437,14 +435,7 @@ namespace MediaBrowser.Controller.Drawing if (imageType == ImageType.Chapter) { - var video = (Video)item; - - if (video.Chapters == null) - { - throw new InvalidOperationException(string.Format("Item {0} does not have any Chapters.", item.Name)); - } - - return video.Chapters[imageIndex].ImagePath; + return _itemRepo.GetChapter(item.Id, imageIndex).ImagePath; } return item.GetImage(imageType); diff --git a/MediaBrowser.Controller/Dto/DtoBuilder.cs b/MediaBrowser.Controller/Dto/DtoBuilder.cs index 7fd188acb5..11cf5b1529 100644 --- a/MediaBrowser.Controller/Dto/DtoBuilder.cs +++ b/MediaBrowser.Controller/Dto/DtoBuilder.cs @@ -31,12 +31,14 @@ namespace MediaBrowser.Controller.Dto private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; private readonly IUserDataRepository _userDataRepository; + private readonly IItemRepository _itemRepo; - public DtoBuilder(ILogger logger, ILibraryManager libraryManager, IUserDataRepository userDataRepository) + public DtoBuilder(ILogger logger, ILibraryManager libraryManager, IUserDataRepository userDataRepository, IItemRepository itemRepo) { _logger = logger; _libraryManager = libraryManager; _userDataRepository = userDataRepository; + _itemRepo = itemRepo; } /// <summary> @@ -73,11 +75,6 @@ namespace MediaBrowser.Controller.Dto tasks.Add(AttachPeople(dto, item)); } - if (user != null) - { - tasks.Add(AttachUserSpecificInfo(dto, item, user, fields)); - } - if (fields.Contains(ItemFields.PrimaryImageAspectRatio)) { try @@ -91,6 +88,11 @@ namespace MediaBrowser.Controller.Dto } } + if (user != null) + { + AttachUserSpecificInfo(dto, item, user, fields); + } + AttachBasicFields(dto, item, fields); // Make sure all the tasks we kicked off have completed. @@ -109,7 +111,7 @@ namespace MediaBrowser.Controller.Dto /// <param name="item">The item.</param> /// <param name="user">The user.</param> /// <param name="fields">The fields.</param> - private async Task AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, List<ItemFields> fields) + private void AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, List<ItemFields> fields) { if (item.IsFolder && fields.Contains(ItemFields.DisplayPreferencesId)) { @@ -127,13 +129,13 @@ namespace MediaBrowser.Controller.Dto // Skip sorting since all we want is a count dto.ChildCount = folder.GetChildren(user).Count(); - await SetSpecialCounts(folder, user, dto, _userDataRepository).ConfigureAwait(false); + SetSpecialCounts(folder, user, dto, _userDataRepository); } } if (addUserData) { - var userData = await _userDataRepository.GetUserData(user.Id, item.GetUserDataKey()).ConfigureAwait(false); + var userData = _userDataRepository.GetUserData(user.Id, item.GetUserDataKey()); dto.UserData = GetUserItemDataDto(userData); @@ -443,9 +445,9 @@ namespace MediaBrowser.Controller.Dto dto.PartCount = video.AdditionalPartIds.Count + 1; - if (fields.Contains(ItemFields.Chapters) && video.Chapters != null) + if (fields.Contains(ItemFields.Chapters)) { - dto.Chapters = video.Chapters.Select(c => GetChapterInfoDto(c, item)).ToList(); + dto.Chapters = _itemRepo.GetChapters(video.Id).Select(c => GetChapterInfoDto(c, item)).ToList(); } } @@ -529,7 +531,7 @@ namespace MediaBrowser.Controller.Dto /// <param name="dto">The dto.</param> /// <param name="userDataRepository">The user data repository.</param> /// <returns>Task.</returns> - private static async Task SetSpecialCounts(Folder folder, User user, BaseItemDto dto, IUserDataRepository userDataRepository) + private static void SetSpecialCounts(Folder folder, User user, BaseItemDto dto, IUserDataRepository userDataRepository) { var rcentlyAddedItemCount = 0; var recursiveItemCount = 0; @@ -540,7 +542,7 @@ namespace MediaBrowser.Controller.Dto // Loop through each recursive child foreach (var child in folder.GetRecursiveChildren(user).Where(i => !i.IsFolder).ToList()) { - var userdata = await userDataRepository.GetUserData(user.Id, child.GetUserDataKey()).ConfigureAwait(false); + var userdata = userDataRepository.GetUserData(user.Id, child.GetUserDataKey()); recursiveItemCount++; @@ -767,7 +769,7 @@ namespace MediaBrowser.Controller.Dto { if (data == null) { - throw new ArgumentNullException(); + throw new ArgumentNullException("data"); } return new UserItemDataDto diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 6ae465aa7e..bd2f5ef712 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -273,7 +273,7 @@ namespace MediaBrowser.Controller.Entities { return Guid.Empty; } - + try { if (!ResolveArgs.IsDirectory) @@ -681,11 +681,6 @@ namespace MediaBrowser.Controller.Entities /// <returns>List{Video}.</returns> private IEnumerable<Trailer> LoadLocalTrailers() { - if (LocationType != LocationType.FileSystem) - { - return new List<Trailer>(); - } - ItemResolveArgs resolveArgs; try @@ -737,7 +732,7 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.ResolvePaths<Trailer>(files, null).Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(video.Id) as Trailer; + var dbItem = LibraryManager.RetrieveItem(video.Id, typeof(Trailer)) as Trailer; if (dbItem != null) { @@ -756,11 +751,6 @@ namespace MediaBrowser.Controller.Entities /// <returns>List{Audio.Audio}.</returns> private IEnumerable<Audio.Audio> LoadThemeSongs() { - if (LocationType != LocationType.FileSystem) - { - return new List<Audio.Audio>(); - } - ItemResolveArgs resolveArgs; try @@ -797,13 +787,13 @@ namespace MediaBrowser.Controller.Entities // Support plex/xbmc convention files.AddRange(resolveArgs.FileSystemChildren - .Where(i => string.Equals(System.IO.Path.GetFileNameWithoutExtension(i.FullName), ThemeSongFilename, StringComparison.OrdinalIgnoreCase) && EntityResolutionHelper.IsAudioFile(i.FullName)) + .Where(i => string.Equals(System.IO.Path.GetFileNameWithoutExtension(i.Name), ThemeSongFilename, StringComparison.OrdinalIgnoreCase) && EntityResolutionHelper.IsAudioFile(i.Name)) ); return LibraryManager.ResolvePaths<Audio.Audio>(files, null).Select(audio => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(audio.Id) as Audio.Audio; + var dbItem = LibraryManager.RetrieveItem(audio.Id, typeof(Audio.Audio)) as Audio.Audio; if (dbItem != null) { @@ -821,11 +811,6 @@ namespace MediaBrowser.Controller.Entities /// <returns>List{Video}.</returns> private IEnumerable<Video> LoadThemeVideos() { - if (LocationType != LocationType.FileSystem) - { - return new List<Video>(); - } - ItemResolveArgs resolveArgs; try @@ -866,7 +851,7 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.ResolvePaths<Video>(files, null).Select(item => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(item.Id) as Video; + var dbItem = LibraryManager.RetrieveItem(item.Id, typeof(Video)) as Video; if (dbItem != null) { @@ -896,13 +881,20 @@ namespace MediaBrowser.Controller.Entities cancellationToken.ThrowIfCancellationRequested(); - var themeSongsChanged = await RefreshThemeSongs(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + var themeSongsChanged = false; - var themeVideosChanged = await RefreshThemeVideos(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + var themeVideosChanged = false; - var localTrailersChanged = await RefreshLocalTrailers(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + var localTrailersChanged = false; - cancellationToken.ThrowIfCancellationRequested(); + if (LocationType == LocationType.FileSystem && Parent != null) + { + themeSongsChanged = await RefreshThemeSongs(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + + themeVideosChanged = await RefreshThemeVideos(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + + localTrailersChanged = await RefreshLocalTrailers(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + } cancellationToken.ThrowIfCancellationRequested(); @@ -1096,8 +1088,7 @@ namespace MediaBrowser.Controller.Entities parent = parent.Parent; } - //not found - load from repo - return LibraryManager.RetrieveItem(id); + return null; } /// <summary> @@ -1315,7 +1306,7 @@ namespace MediaBrowser.Controller.Entities var key = GetUserDataKey(); - var data = await userManager.GetUserData(user.Id, key).ConfigureAwait(false); + var data = userManager.GetUserData(user.Id, key); if (wasPlayed) { diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index ce36366b43..de965221b8 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.Progress; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Reflection; using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; using System; @@ -21,6 +22,15 @@ namespace MediaBrowser.Controller.Entities /// </summary> public class Folder : BaseItem { + private static TypeMapper _typeMapper = new TypeMapper(); + + public Folder() + { + ChildDefinitions = new ConcurrentDictionary<Guid, string>(); + } + + public ConcurrentDictionary<Guid, string> ChildDefinitions { get; set; } + /// <summary> /// Gets a value indicating whether this instance is folder. /// </summary> @@ -108,16 +118,14 @@ namespace MediaBrowser.Controller.Entities item.DateModified = DateTime.Now; } - if (!_children.TryAdd(item.Id, item)) + if (!_children.TryAdd(item.Id, item) || !ChildDefinitions.TryAdd(item.Id, item.GetType().FullName)) { throw new InvalidOperationException("Unable to add " + item.Name); } - var newChildren = Children.ToList(); - await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); - await LibraryManager.SaveChildren(Id, newChildren, cancellationToken).ConfigureAwait(false); + await LibraryManager.UpdateItem(this, cancellationToken).ConfigureAwait(false); } /// <summary> @@ -145,19 +153,18 @@ namespace MediaBrowser.Controller.Entities public Task RemoveChild(BaseItem item, CancellationToken cancellationToken) { BaseItem removed; + string removedType; - if (!_children.TryRemove(item.Id, out removed)) + if (!_children.TryRemove(item.Id, out removed) || !ChildDefinitions.TryRemove(item.Id, out removedType)) { throw new InvalidOperationException("Unable to remove " + item.Name); } item.Parent = null; - var newChildren = Children.ToList(); - LibraryManager.ReportItemRemoved(item); - return LibraryManager.SaveChildren(Id, newChildren, cancellationToken); + return LibraryManager.UpdateItem(this, cancellationToken); } #region Indexing @@ -652,7 +659,7 @@ namespace MediaBrowser.Controller.Entities var options = new ParallelOptions { - MaxDegreeOfParallelism = 50 + MaxDegreeOfParallelism = 20 }; Parallel.ForEach(nonCachedChildren, options, child => @@ -702,6 +709,9 @@ namespace MediaBrowser.Controller.Entities } else { + string removedType; + ChildDefinitions.TryRemove(item.Id, out removedType); + LibraryManager.ReportItemRemoved(item); } } @@ -716,11 +726,13 @@ namespace MediaBrowser.Controller.Entities } else { + ChildDefinitions.TryAdd(item.Id, item.GetType().FullName); + Logger.Debug("** " + item.Name + " Added to library."); } } - await LibraryManager.SaveChildren(Id, newChildren, CancellationToken.None).ConfigureAwait(false); + await LibraryManager.UpdateItem(this, CancellationToken.None).ConfigureAwait(false); //force the indexes to rebuild next time IndexCache.Clear(); @@ -848,9 +860,38 @@ namespace MediaBrowser.Controller.Entities /// Get our children from the repo - stubbed for now /// </summary> /// <returns>IEnumerable{BaseItem}.</returns> - protected virtual IEnumerable<BaseItem> GetCachedChildren() + protected IEnumerable<BaseItem> GetCachedChildren() + { + var items = ChildDefinitions.ToList().Select(RetrieveChild).Where(i => i != null).ToList(); + + foreach (var item in items) + { + item.Parent = this; + } + + return items; + } + + /// <summary> + /// Retrieves the child. + /// </summary> + /// <param name="child">The child.</param> + /// <returns>BaseItem.</returns> + private BaseItem RetrieveChild(KeyValuePair<Guid,string> child) { - return LibraryManager.RetrieveChildren(this).Select(i => i is IByReferenceItem ? LibraryManager.GetOrAddByReferenceItem(i) : i); + var type = child.Value; + + var itemType = _typeMapper.GetType(type); + + if (itemType == null) + { + Logger.Error("Cannot find type {0}. Probably belongs to plug-in that is no longer loaded.", type); + return null; + } + + var item = LibraryManager.RetrieveItem(child.Key, itemType); + + return item is IByReferenceItem ? LibraryManager.GetOrAddByReferenceItem(item) : item; } /// <summary> diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index 307fe19544..6e649fd656 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -68,7 +68,14 @@ namespace MediaBrowser.Controller.Entities.Movies // Kick off a task to refresh the main item var result = await base.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); - var specialFeaturesChanged = await RefreshSpecialFeatures(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + var specialFeaturesChanged = false; + + // Must have a parent to have special features + // In other words, it must be part of the Parent/Child tree + if (LocationType == LocationType.FileSystem && Parent != null) + { + specialFeaturesChanged = await RefreshSpecialFeatures(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false); + } return specialFeaturesChanged || result; } @@ -95,11 +102,6 @@ namespace MediaBrowser.Controller.Entities.Movies /// <returns>IEnumerable{Video}.</returns> private IEnumerable<Video> LoadSpecialFeatures() { - if (LocationType != LocationType.FileSystem) - { - return new List<Video>(); - } - FileSystemInfo folder; try @@ -133,7 +135,7 @@ namespace MediaBrowser.Controller.Entities.Movies return LibraryManager.ResolvePaths<Video>(files, null).Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(video.Id) as Video; + var dbItem = LibraryManager.RetrieveItem(video.Id, typeof(Video)) as Video; if (dbItem != null) { diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index ad4cb2d09d..ec7b712096 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -1,8 +1,7 @@ -using System.Collections; -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Resolvers; +using MediaBrowser.Controller.Resolvers; using MediaBrowser.Model.Entities; using System; +using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; @@ -24,7 +23,6 @@ namespace MediaBrowser.Controller.Entities public Video() { MediaStreams = new List<MediaStream>(); - Chapters = new List<ChapterInfo>(); PlayableStreamFileNames = new List<string>(); AdditionalPartIds = new List<Guid>(); } @@ -54,12 +52,6 @@ namespace MediaBrowser.Controller.Entities public List<MediaStream> MediaStreams { get; set; } /// <summary> - /// Gets or sets the chapters. - /// </summary> - /// <value>The chapters.</value> - public List<ChapterInfo> Chapters { get; set; } - - /// <summary> /// If the video is a folder-rip, this will hold the file list for the largest playlist /// </summary> public List<string> PlayableStreamFileNames { get; set; } @@ -139,7 +131,10 @@ namespace MediaBrowser.Controller.Entities var additionalPartsChanged = false; - if (IsMultiPart && LocationType == LocationType.FileSystem) + // Must have a parent to have additional parts + // In other words, it must be part of the Parent/Child tree + // The additional parts won't have additional parts themselves + if (IsMultiPart && LocationType == LocationType.FileSystem && Parent != null) { try { @@ -164,11 +159,6 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task{System.Boolean}.</returns> private async Task<bool> RefreshAdditionalParts(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true) { - if (!IsMultiPart || LocationType != LocationType.FileSystem) - { - return false; - } - var newItems = LoadAdditionalParts().ToList(); var newItemIds = newItems.Select(i => i.Id).ToList(); @@ -214,7 +204,7 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.ResolvePaths<Video>(files, null).Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version - var dbItem = LibraryManager.RetrieveItem(video.Id) as Video; + var dbItem = LibraryManager.RetrieveItem(video.Id, typeof(Video)) as Video; if (dbItem != null) { diff --git a/MediaBrowser.Controller/Library/IDisplayPreferencesManager.cs b/MediaBrowser.Controller/Library/IDisplayPreferencesManager.cs deleted file mode 100644 index f1d782b1d0..0000000000 --- a/MediaBrowser.Controller/Library/IDisplayPreferencesManager.cs +++ /dev/null @@ -1,28 +0,0 @@ -using MediaBrowser.Model.Entities; -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Library -{ - /// <summary> - /// Interface IDisplayPreferencesManager - /// </summary> - public interface IDisplayPreferencesManager - { - /// <summary> - /// Gets the display preferences. - /// </summary> - /// <param name="displayPreferencesId">The display preferences id.</param> - /// <returns>DisplayPreferences.</returns> - Task<DisplayPreferences> GetDisplayPreferences(Guid displayPreferencesId); - - /// <summary> - /// Saves display preferences for an item - /// </summary> - /// <param name="displayPreferences">The display preferences.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task SaveDisplayPreferences(DisplayPreferences displayPreferences, CancellationToken cancellationToken); - } -} diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 7e84350b37..6d6fab3bea 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -216,24 +216,9 @@ namespace MediaBrowser.Controller.Library /// Retrieves the item. /// </summary> /// <param name="id">The id.</param> - /// <returns>Task{BaseItem}.</returns> - BaseItem RetrieveItem(Guid id); - - /// <summary> - /// Saves the children. - /// </summary> - /// <param name="id">The id.</param> - /// <param name="children">The children.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task SaveChildren(Guid id, IEnumerable<BaseItem> children, CancellationToken cancellationToken); - - /// <summary> - /// Retrieves the children. - /// </summary> - /// <param name="parent">The parent.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - IEnumerable<BaseItem> RetrieveChildren(Folder parent); + /// <param name="type">The type.</param> + /// <returns>BaseItem.</returns> + BaseItem RetrieveItem(Guid id, Type type); /// <summary> /// Validates the artists. diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index ba9e9f5bde..f49221ce85 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -80,6 +80,7 @@ <Compile Include="Library\ILibraryPrescanTask.cs" /> <Compile Include="Library\IMetadataSaver.cs" /> <Compile Include="Localization\ILocalizationManager.cs" /> + <Compile Include="Reflection\TypeMapper.cs" /> <Compile Include="Session\ISessionManager.cs" /> <Compile Include="Drawing\ImageExtensions.cs" /> <Compile Include="Drawing\ImageHeader.cs" /> @@ -101,7 +102,6 @@ <Compile Include="Entities\Movies\BoxSet.cs" /> <Compile Include="Entities\Movies\Movie.cs" /> <Compile Include="Entities\Person.cs" /> - <Compile Include="Library\IDisplayPreferencesManager.cs" /> <Compile Include="Library\ILibrarySearchEngine.cs" /> <Compile Include="Library\ItemChangeEventArgs.cs" /> <Compile Include="Library\PlaybackProgressEventArgs.cs" /> diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs index 4b992fd81f..81ab155486 100644 --- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs +++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs @@ -1,7 +1,9 @@ -using MediaBrowser.Common.IO; +using System.Collections.Generic; +using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System; @@ -34,6 +36,7 @@ namespace MediaBrowser.Controller.MediaInfo private readonly IServerApplicationPaths _appPaths; private readonly IMediaEncoder _encoder; private readonly ILogger _logger; + private readonly IItemRepository _itemRepo; /// <summary> /// Initializes a new instance of the <see cref="FFMpegManager" /> class. @@ -42,13 +45,15 @@ namespace MediaBrowser.Controller.MediaInfo /// <param name="encoder">The encoder.</param> /// <param name="libraryManager">The library manager.</param> /// <param name="logger">The logger.</param> + /// <param name="itemRepo">The item repo.</param> /// <exception cref="System.ArgumentNullException">zipClient</exception> - public FFMpegManager(IServerApplicationPaths appPaths, IMediaEncoder encoder, ILibraryManager libraryManager, ILogger logger) + public FFMpegManager(IServerApplicationPaths appPaths, IMediaEncoder encoder, ILibraryManager libraryManager, ILogger logger, IItemRepository itemRepo) { _appPaths = appPaths; _encoder = encoder; _libraryManager = libraryManager; _logger = logger; + _itemRepo = itemRepo; VideoImageCache = new FileSystemRepository(VideoImagesDataPath); SubtitleCache = new FileSystemRepository(SubtitleCachePath); @@ -99,18 +104,14 @@ namespace MediaBrowser.Controller.MediaInfo /// Extracts the chapter images. /// </summary> /// <param name="video">The video.</param> - /// <param name="cancellationToken">The cancellation token.</param> + /// <param name="chapters">The chapters.</param> /// <param name="extractImages">if set to <c>true</c> [extract images].</param> - /// <param name="saveItem">if set to <c>true</c> [save item].</param> + /// <param name="saveChapters">if set to <c>true</c> [save chapters].</param> + /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> /// <exception cref="System.ArgumentNullException"></exception> - public async Task<bool> PopulateChapterImages(Video video, CancellationToken cancellationToken, bool extractImages, bool saveItem) + public async Task<bool> PopulateChapterImages(Video video, List<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken) { - if (video.Chapters == null) - { - throw new ArgumentNullException(); - } - // Can't extract images if there are no video streams if (video.MediaStreams == null || video.MediaStreams.All(m => m.Type != MediaStreamType.Video)) { @@ -122,7 +123,7 @@ namespace MediaBrowser.Controller.MediaInfo var runtimeTicks = video.RunTimeTicks ?? 0; - foreach (var chapter in video.Chapters) + foreach (var chapter in chapters) { if (chapter.StartPositionTicks >= runtimeTicks) { @@ -186,9 +187,9 @@ namespace MediaBrowser.Controller.MediaInfo } } - if (saveItem && changesMade) + if (saveChapters && changesMade) { - await _libraryManager.UpdateItem(video, CancellationToken.None).ConfigureAwait(false); + await _itemRepo.SaveChapters(video.Id, chapters, cancellationToken).ConfigureAwait(false); } return success; diff --git a/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs b/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs index 9774bb68e6..4d7345f489 100644 --- a/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs +++ b/MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs @@ -24,6 +24,6 @@ namespace MediaBrowser.Controller.Persistence /// </summary> /// <param name="displayPreferencesId">The display preferences id.</param> /// <returns>Task{DisplayPreferences}.</returns> - Task<DisplayPreferences> GetDisplayPreferences(Guid displayPreferencesId); + DisplayPreferences GetDisplayPreferences(Guid displayPreferencesId); } } diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs index bf3bc626af..534e64a3f0 100644 --- a/MediaBrowser.Controller/Persistence/IItemRepository.cs +++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs @@ -1,9 +1,10 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Persistence { @@ -21,36 +22,6 @@ namespace MediaBrowser.Controller.Persistence Task SaveItem(BaseItem item, CancellationToken cancellationToken); /// <summary> - /// Gets an item - /// </summary> - /// <param name="id">The id.</param> - /// <returns>BaseItem.</returns> - BaseItem GetItem(Guid id); - - /// <summary> - /// Gets children of a given Folder - /// </summary> - /// <param name="parent">The parent.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - IEnumerable<BaseItem> RetrieveChildren(Folder parent); - - /// <summary> - /// Retrieves the items. - /// </summary> - /// <param name="ids">The ids.</param> - /// <returns>IEnumerable{BaseItem}.</returns> - IEnumerable<BaseItem> GetItems(IEnumerable<Guid> ids); - - /// <summary> - /// Saves children of a given Folder - /// </summary> - /// <param name="parentId">The parent id.</param> - /// <param name="children">The children.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task SaveChildren(Guid parentId, IEnumerable<BaseItem> children, CancellationToken cancellationToken); - - /// <summary> /// Gets the critic reviews. /// </summary> /// <param name="itemId">The item id.</param> @@ -72,5 +43,70 @@ namespace MediaBrowser.Controller.Persistence /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> Task SaveItems(IEnumerable<BaseItem> items, CancellationToken cancellationToken); + + /// <summary> + /// Retrieves the item. + /// </summary> + /// <param name="id">The id.</param> + /// <param name="type">The type.</param> + /// <returns>BaseItem.</returns> + BaseItem RetrieveItem(Guid id, Type type); + + /// <summary> + /// Gets chapters for an item + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + IEnumerable<ChapterInfo> GetChapters(Guid id); + + /// <summary> + /// Gets a single chapter for an item + /// </summary> + /// <param name="id"></param> + /// <param name="index"></param> + /// <returns></returns> + ChapterInfo GetChapter(Guid id, int index); + + /// <summary> + /// Saves the chapters. + /// </summary> + /// <param name="id">The id.</param> + /// <param name="chapters">The chapters.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task SaveChapters(Guid id, IEnumerable<ChapterInfo> chapters, CancellationToken cancellationToken); + } + + /// <summary> + /// Class ItemRepositoryExtensions + /// </summary> + public static class ItemRepositoryExtensions + { + /// <summary> + /// Retrieves the item. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="repository">The repository.</param> + /// <param name="id">The id.</param> + /// <returns>``0.</returns> + public static T RetrieveItem<T>(this IItemRepository repository, Guid id) + where T : BaseItem, new() + { + return repository.RetrieveItem(id, typeof(T)) as T; + } + + /// <summary> + /// Retrieves the item. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="repository">The repository.</param> + /// <param name="idList">The id list.</param> + /// <returns>IEnumerable{``0}.</returns> + public static IEnumerable<T> RetrieveItems<T>(this IItemRepository repository, IEnumerable<Guid> idList) + where T : BaseItem, new() + { + return idList.Select(repository.RetrieveItem<T>).Where(i => i != null); + } } } + diff --git a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs index 1b4efc58b1..ad111f4ed4 100644 --- a/MediaBrowser.Controller/Persistence/IUserDataRepository.cs +++ b/MediaBrowser.Controller/Persistence/IUserDataRepository.cs @@ -27,6 +27,6 @@ namespace MediaBrowser.Controller.Persistence /// <param name="userId">The user id.</param> /// <param name="key">The key.</param> /// <returns>Task{UserItemData}.</returns> - Task<UserItemData> GetUserData(Guid userId, string key); + UserItemData GetUserData(Guid userId, string key); } } diff --git a/MediaBrowser.Controller/Reflection/TypeMapper.cs b/MediaBrowser.Controller/Reflection/TypeMapper.cs new file mode 100644 index 0000000000..d968a3b420 --- /dev/null +++ b/MediaBrowser.Controller/Reflection/TypeMapper.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; + +namespace MediaBrowser.Controller.Reflection +{ + /// <summary> + /// Class TypeMapper + /// </summary> + public class TypeMapper + { + /// <summary> + /// This holds all the types in the running assemblies so that we can de-serialize properly when we don't have strong types + /// </summary> + private readonly ConcurrentDictionary<string, Type> _typeMap = new ConcurrentDictionary<string, Type>(); + + /// <summary> + /// Gets the type. + /// </summary> + /// <param name="typeName">Name of the type.</param> + /// <returns>Type.</returns> + /// <exception cref="System.ArgumentNullException"></exception> + public Type GetType(string typeName) + { + if (string.IsNullOrEmpty(typeName)) + { + throw new ArgumentNullException(); + } + + return _typeMap.GetOrAdd(typeName, LookupType); + } + + /// <summary> + /// Lookups the type. + /// </summary> + /// <param name="typeName">Name of the type.</param> + /// <returns>Type.</returns> + private Type LookupType(string typeName) + { + return AppDomain + .CurrentDomain + .GetAssemblies() + .Select(a => a.GetType(typeName, false)) + .FirstOrDefault(t => t != null); + } + } +} |
