aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-06-17 16:35:43 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-06-17 16:35:43 -0400
commite677a57bf1cedc55214b0e457778311b8f1ea5ac (patch)
tree9c0b045279901f5dd4a866f46ce2d378a6d41d68 /MediaBrowser.Controller/Entities
parent95f471e8c3ab466488cc4c2fba1b15e14e00ee3c (diff)
switch to flat file storage
Diffstat (limited to 'MediaBrowser.Controller/Entities')
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs43
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs65
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs16
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs12
4 files changed, 84 insertions, 52 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 6ae465aa7e..2850d7092a 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
@@ -803,7 +793,7 @@ namespace MediaBrowser.Controller.Entities
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..ee717a1918 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -139,7 +139,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 +167,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 +212,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)
{