aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorEric Reed <ebr@mediabrowser3.com>2013-06-18 15:28:18 -0400
committerEric Reed <ebr@mediabrowser3.com>2013-06-18 15:28:18 -0400
commitcc728d87c2507d5392686df6e18c7ad2ba5c45bd (patch)
tree1eee3719a4cd8abd78f422900620e62042161766 /MediaBrowser.Controller
parent90155278f8b4465a4b5eaf140c5e6e4905cc8dcf (diff)
parent5d8ed2c16fdeaec1344964778e98cadfaa9571b4 (diff)
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Drawing/ImageManager.cs21
-rw-r--r--MediaBrowser.Controller/Dto/DtoBuilder.cs30
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs45
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs65
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs16
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs24
-rw-r--r--MediaBrowser.Controller/Library/IDisplayPreferencesManager.cs28
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs21
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj2
-rw-r--r--MediaBrowser.Controller/MediaInfo/FFMpegManager.cs27
-rw-r--r--MediaBrowser.Controller/Persistence/IDisplayPreferencesRepository.cs2
-rw-r--r--MediaBrowser.Controller/Persistence/IItemRepository.cs98
-rw-r--r--MediaBrowser.Controller/Persistence/IUserDataRepository.cs2
-rw-r--r--MediaBrowser.Controller/Reflection/TypeMapper.cs47
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);
+ }
+ }
+}