read 3d format from xml

This commit is contained in:
Luke Pulverenti 2013-06-26 12:08:16 -04:00
parent 934584313e
commit 6025a89235
17 changed files with 153 additions and 145 deletions

View file

@ -562,7 +562,7 @@ namespace MediaBrowser.Api
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo); var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);
var items = _itemRepo.RetrieveItems<Audio>(item.ThemeSongIds) var items = item.ThemeSongIds.Select(_itemRepo.RetrieveItem)
.OrderBy(i => i.SortName) .OrderBy(i => i.SortName)
.Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)) .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user))
.Select(t => t.Result) .Select(t => t.Result)
@ -602,7 +602,7 @@ namespace MediaBrowser.Api
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo); var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);
var items = var items =
_itemRepo.RetrieveItems<Video>(item.ThemeVideoIds) item.ThemeVideoIds.Select(_itemRepo.RetrieveItem)
.OrderBy(i => i.SortName) .OrderBy(i => i.SortName)
.Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)) .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user))
.Select(t => t.Result) .Select(t => t.Result)

View file

@ -399,7 +399,7 @@ namespace MediaBrowser.Api.UserLibrary
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo); var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);
var items = _itemRepo.RetrieveItems<Video>(movie.SpecialFeatureIds).OrderBy(i => i.SortName).Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)).Select(t => t.Result).ToList(); var items = movie.SpecialFeatureIds.Select(_itemRepo.RetrieveItem).OrderBy(i => i.SortName).Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)).Select(t => t.Result).ToList();
return ToOptimizedResult(items); return ToOptimizedResult(items);
} }
@ -420,7 +420,7 @@ namespace MediaBrowser.Api.UserLibrary
var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo); var dtoBuilder = new DtoBuilder(Logger, _libraryManager, _userDataRepository, _itemRepo);
var items = _itemRepo.RetrieveItems<Trailer>(item.LocalTrailerIds).OrderBy(i => i.SortName).Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)).Select(t => t.Result).ToList(); var items = item.LocalTrailerIds.Select(_itemRepo.RetrieveItem).OrderBy(i => i.SortName).Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)).Select(t => t.Result).ToList();
return ToOptimizedResult(items); return ToOptimizedResult(items);
} }

View file

@ -64,7 +64,7 @@ namespace MediaBrowser.Api
var video = (Video)item; var video = (Video)item;
var items = _itemRepo.RetrieveItems<Video>(video.AdditionalPartIds) var items = video.AdditionalPartIds.Select(_itemRepo.RetrieveItem)
.OrderBy(i => i.SortName) .OrderBy(i => i.SortName)
.Select(i => dtoBuilder.GetBaseItemDto(i, fields, user)) .Select(i => dtoBuilder.GetBaseItemDto(i, fields, user))
.Select(t => t.Result) .Select(t => t.Result)

View file

@ -663,7 +663,7 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.ResolvePaths<Trailer>(files, null).Select(video => 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 // Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = LibraryManager.RetrieveItem(video.Id, typeof(Trailer)) as Trailer; var dbItem = LibraryManager.RetrieveItem(video.Id) as Trailer;
if (dbItem != null) if (dbItem != null)
{ {
@ -724,7 +724,7 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.ResolvePaths<Audio.Audio>(files, null).Select(audio => 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 // Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = LibraryManager.RetrieveItem(audio.Id, typeof(Audio.Audio)) as Audio.Audio; var dbItem = LibraryManager.RetrieveItem(audio.Id) as Audio.Audio;
if (dbItem != null) if (dbItem != null)
{ {
@ -782,7 +782,7 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.ResolvePaths<Video>(files, null).Select(item => 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 // Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = LibraryManager.RetrieveItem(item.Id, typeof(Video)) as Video; var dbItem = LibraryManager.RetrieveItem(item.Id) as Video;
if (dbItem != null) if (dbItem != null)
{ {

View file

@ -1,22 +0,0 @@
using System;
namespace MediaBrowser.Controller.Entities
{
/// <summary>
/// Class ChildDefinition
/// </summary>
public class ChildDefinition
{
/// <summary>
/// Gets or sets the item id.
/// </summary>
/// <value>The item id.</value>
public Guid ItemId { get; set; }
/// <summary>
/// Gets or sets the type.
/// </summary>
/// <value>The type.</value>
public string Type { get; set; }
}
}

View file

@ -3,7 +3,6 @@ using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization; using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Reflection;
using MediaBrowser.Controller.Resolvers; using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System; using System;
@ -22,8 +21,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary> /// </summary>
public class Folder : BaseItem public class Folder : BaseItem
{ {
private static readonly TypeMapper TypeMapper = new TypeMapper();
/// <summary> /// <summary>
/// Gets a value indicating whether this instance is folder. /// Gets a value indicating whether this instance is folder.
/// </summary> /// </summary>
@ -118,12 +115,7 @@ namespace MediaBrowser.Controller.Entities
await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false); await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
await ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => new ChildDefinition await ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => i.Id), cancellationToken).ConfigureAwait(false);
{
ItemId = i.Id,
Type = i.GetType().FullName
}), cancellationToken).ConfigureAwait(false);
} }
/// <summary> /// <summary>
@ -161,12 +153,7 @@ namespace MediaBrowser.Controller.Entities
LibraryManager.ReportItemRemoved(item); LibraryManager.ReportItemRemoved(item);
return ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => new ChildDefinition return ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => i.Id), cancellationToken);
{
ItemId = i.Id,
Type = i.GetType().FullName
}), cancellationToken);
} }
#region Indexing #region Indexing
@ -729,12 +716,7 @@ namespace MediaBrowser.Controller.Entities
} }
} }
await ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => new ChildDefinition await ItemRepository.SaveChildren(Id, _children.Values.ToList().Select(i => i.Id), cancellationToken).ConfigureAwait(false);
{
ItemId = i.Id,
Type = i.GetType().FullName
}), cancellationToken).ConfigureAwait(false);
//force the indexes to rebuild next time //force the indexes to rebuild next time
IndexCache.Clear(); IndexCache.Clear();
@ -872,26 +854,20 @@ namespace MediaBrowser.Controller.Entities
/// </summary> /// </summary>
/// <param name="child">The child.</param> /// <param name="child">The child.</param>
/// <returns>BaseItem.</returns> /// <returns>BaseItem.</returns>
private BaseItem RetrieveChild(ChildDefinition child) private BaseItem RetrieveChild(Guid child)
{ {
var type = child.Type; var item = LibraryManager.RetrieveItem(child);
var itemType = TypeMapper.GetType(type); if (item != null)
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.ItemId, itemType);
if (item is IByReferenceItem) if (item is IByReferenceItem)
{ {
return LibraryManager.GetOrAddByReferenceItem(item); return LibraryManager.GetOrAddByReferenceItem(item);
} }
item.Parent = this; item.Parent = this;
}
return item; return item;
} }

View file

@ -136,7 +136,7 @@ namespace MediaBrowser.Controller.Entities.Movies
return LibraryManager.ResolvePaths<Video>(files, null).Select(video => 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 // Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = LibraryManager.RetrieveItem(video.Id, typeof(Video)) as Video; var dbItem = LibraryManager.RetrieveItem(video.Id) as Video;
if (dbItem != null) if (dbItem != null)
{ {

View file

@ -211,7 +211,7 @@ namespace MediaBrowser.Controller.Entities
return LibraryManager.ResolvePaths<Video>(files, null).Select(video => 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 // Try to retrieve it from the db. If we don't find it, use the resolved version
var dbItem = LibraryManager.RetrieveItem(video.Id, typeof(Video)) as Video; var dbItem = LibraryManager.RetrieveItem(video.Id) as Video;
if (dbItem != null) if (dbItem != null)
{ {

View file

@ -216,9 +216,8 @@ namespace MediaBrowser.Controller.Library
/// Retrieves the item. /// Retrieves the item.
/// </summary> /// </summary>
/// <param name="id">The id.</param> /// <param name="id">The id.</param>
/// <param name="type">The type.</param>
/// <returns>BaseItem.</returns> /// <returns>BaseItem.</returns>
BaseItem RetrieveItem(Guid id, Type type); BaseItem RetrieveItem(Guid id);
/// <summary> /// <summary>
/// Validates the artists. /// Validates the artists.

View file

@ -74,7 +74,6 @@
<Compile Include="Dto\SessionInfoDtoBuilder.cs" /> <Compile Include="Dto\SessionInfoDtoBuilder.cs" />
<Compile Include="Entities\Audio\MusicAlbumDisc.cs" /> <Compile Include="Entities\Audio\MusicAlbumDisc.cs" />
<Compile Include="Entities\Audio\MusicGenre.cs" /> <Compile Include="Entities\Audio\MusicGenre.cs" />
<Compile Include="Entities\ChildDefinition.cs" />
<Compile Include="Entities\Game.cs" /> <Compile Include="Entities\Game.cs" />
<Compile Include="Entities\IByReferenceItem.cs" /> <Compile Include="Entities\IByReferenceItem.cs" />
<Compile Include="Entities\MusicVideo.cs" /> <Compile Include="Entities\MusicVideo.cs" />
@ -83,7 +82,6 @@
<Compile Include="Library\IMetadataSaver.cs" /> <Compile Include="Library\IMetadataSaver.cs" />
<Compile Include="Library\ItemUpdateType.cs" /> <Compile Include="Library\ItemUpdateType.cs" />
<Compile Include="Localization\ILocalizationManager.cs" /> <Compile Include="Localization\ILocalizationManager.cs" />
<Compile Include="Reflection\TypeMapper.cs" />
<Compile Include="Session\ISessionManager.cs" /> <Compile Include="Session\ISessionManager.cs" />
<Compile Include="Drawing\ImageExtensions.cs" /> <Compile Include="Drawing\ImageExtensions.cs" />
<Compile Include="Drawing\ImageHeader.cs" /> <Compile Include="Drawing\ImageHeader.cs" />

View file

@ -54,9 +54,8 @@ namespace MediaBrowser.Controller.Persistence
/// Retrieves the item. /// Retrieves the item.
/// </summary> /// </summary>
/// <param name="id">The id.</param> /// <param name="id">The id.</param>
/// <param name="type">The type.</param>
/// <returns>BaseItem.</returns> /// <returns>BaseItem.</returns>
BaseItem RetrieveItem(Guid id, Type type); BaseItem RetrieveItem(Guid id);
/// <summary> /// <summary>
/// Gets chapters for an item /// Gets chapters for an item
@ -87,7 +86,7 @@ namespace MediaBrowser.Controller.Persistence
/// </summary> /// </summary>
/// <param name="parentId">The parent id.</param> /// <param name="parentId">The parent id.</param>
/// <returns>IEnumerable{ChildDefinition}.</returns> /// <returns>IEnumerable{ChildDefinition}.</returns>
IEnumerable<ChildDefinition> GetChildren(Guid parentId); IEnumerable<Guid> GetChildren(Guid parentId);
/// <summary> /// <summary>
/// Saves the children. /// Saves the children.
@ -96,39 +95,7 @@ namespace MediaBrowser.Controller.Persistence
/// <param name="children">The children.</param> /// <param name="children">The children.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
Task SaveChildren(Guid parentId, IEnumerable<ChildDefinition> children, CancellationToken cancellationToken); Task SaveChildren(Guid parentId, IEnumerable<Guid> children, 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);
}
} }
} }

View file

@ -523,12 +523,94 @@ namespace MediaBrowser.Controller.Providers
FetchFromStudiosNode(reader.ReadSubtree(), item); FetchFromStudiosNode(reader.ReadSubtree(), item);
break; break;
case "MediaInfo":
FetchFromMediaInfoNode(reader.ReadSubtree(), item);
break;
default: default:
reader.Skip(); reader.Skip();
break; break;
} }
} }
/// <summary>
/// Fetches from media info node.
/// </summary>
/// <param name="reader">The reader.</param>
/// <param name="item">The item.</param>
private void FetchFromMediaInfoNode(XmlReader reader, T item)
{
reader.MoveToContent();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "Video":
FetchFromMediaInfoVideoNode(reader.ReadSubtree(), item);
break;
default:
reader.Skip();
break;
}
}
}
}
/// <summary>
/// Fetches from media info video node.
/// </summary>
/// <param name="reader">The reader.</param>
/// <param name="item">The item.</param>
private void FetchFromMediaInfoVideoNode(XmlReader reader, T item)
{
reader.MoveToContent();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "3DFormat":
{
var video = item as Video;
if (video != null)
{
var val = reader.ReadElementContentAsString();
if (string.Equals("HSBS", val))
{
video.Video3DFormat = Video3DFormat.HalfSideBySide;
}
else if (string.Equals("HTAB", val))
{
video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
}
else if (string.Equals("FTAB", val))
{
video.Video3DFormat = Video3DFormat.FullTopAndBottom;
}
else if (string.Equals("FSBS", val))
{
video.Video3DFormat = Video3DFormat.FullSideBySide;
}
}
break;
}
default:
reader.Skip();
break;
}
}
}
}
/// <summary> /// <summary>
/// Fetches from taglines node. /// Fetches from taglines node.
/// </summary> /// </summary>

View file

@ -573,7 +573,7 @@ namespace MediaBrowser.Server.Implementations.Library
Directory.CreateDirectory(rootFolderPath); Directory.CreateDirectory(rootFolderPath);
} }
var rootFolder = RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder)), typeof(AggregateFolder)) as AggregateFolder ?? (AggregateFolder)ResolvePath(new DirectoryInfo(rootFolderPath)); var rootFolder = RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)ResolvePath(new DirectoryInfo(rootFolderPath));
// Add in the plug-in folders // Add in the plug-in folders
foreach (var child in PluginFolderCreators) foreach (var child in PluginFolderCreators)
@ -598,7 +598,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// <returns>UserRootFolder.</returns> /// <returns>UserRootFolder.</returns>
public UserRootFolder GetUserRootFolder(string userRootPath) public UserRootFolder GetUserRootFolder(string userRootPath)
{ {
return _userRootFolders.GetOrAdd(userRootPath, key => RetrieveItem(userRootPath.GetMBId(typeof(UserRootFolder)), typeof(UserRootFolder)) as UserRootFolder ?? return _userRootFolders.GetOrAdd(userRootPath, key => RetrieveItem(userRootPath.GetMBId(typeof(UserRootFolder))) as UserRootFolder ??
(UserRootFolder)ResolvePath(new DirectoryInfo(userRootPath))); (UserRootFolder)ResolvePath(new DirectoryInfo(userRootPath)));
} }
@ -793,7 +793,7 @@ namespace MediaBrowser.Server.Implementations.Library
var id = path.GetMBId(type); var id = path.GetMBId(type);
var item = RetrieveItem(id, type) as T; var item = RetrieveItem(id) as T;
if (item == null) if (item == null)
{ {
item = new T item = new T
@ -1350,11 +1350,10 @@ namespace MediaBrowser.Server.Implementations.Library
/// Retrieves the item. /// Retrieves the item.
/// </summary> /// </summary>
/// <param name="id">The id.</param> /// <param name="id">The id.</param>
/// <param name="type">The type.</param>
/// <returns>BaseItem.</returns> /// <returns>BaseItem.</returns>
public BaseItem RetrieveItem(Guid id, Type type) public BaseItem RetrieveItem(Guid id)
{ {
return ItemRepository.RetrieveItem(id, type); return ItemRepository.RetrieveItem(id);
} }
private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>(); private readonly ConcurrentDictionary<string, SemaphoreSlim> _fileLocks = new ConcurrentDictionary<string, SemaphoreSlim>();

View file

@ -146,6 +146,7 @@
<Compile Include="MediaEncoder\MediaEncoder.cs" /> <Compile Include="MediaEncoder\MediaEncoder.cs" />
<Compile Include="Persistence\SqliteChapterRepository.cs" /> <Compile Include="Persistence\SqliteChapterRepository.cs" />
<Compile Include="Persistence\SqliteExtensions.cs" /> <Compile Include="Persistence\SqliteExtensions.cs" />
<Compile Include="Persistence\TypeMapper.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Providers\ProviderManager.cs" /> <Compile Include="Providers\ProviderManager.cs" />
<Compile Include="ScheduledTasks\ArtistValidationTask.cs" /> <Compile Include="ScheduledTasks\ArtistValidationTask.cs" />

View file

@ -24,6 +24,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
private readonly ILogger _logger; private readonly ILogger _logger;
private TypeMapper _typeMapper = new TypeMapper();
/// <summary> /// <summary>
/// Gets the name of the repository /// Gets the name of the repository
/// </summary> /// </summary>
@ -103,11 +105,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
string[] queries = { string[] queries = {
"create table if not exists baseitems (guid GUID primary key, data BLOB)", "create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB)",
"create index if not exists idx_baseitems on baseitems(guid)", "create index if not exists idx_TypedBaseItems on baseitems(guid)",
"create table if not exists ChildDefinitions (ParentId GUID, ItemId GUID, Type TEXT, PRIMARY KEY (ParentId, ItemId))", "create table if not exists ChildrenIds (ParentId GUID, ItemId GUID, PRIMARY KEY (ParentId, ItemId))",
"create index if not exists idx_ChildDefinitions on ChildDefinitions(ParentId,ItemId)", "create index if not exists idx_ChildrenIds on ChildrenIds(ParentId,ItemId)",
//pragmas //pragmas
"pragma temp_store = memory" "pragma temp_store = memory"
@ -132,27 +134,27 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
_saveItemCommand = new SQLiteCommand _saveItemCommand = new SQLiteCommand
{ {
CommandText = "replace into baseitems (guid, data) values (@1, @2)" CommandText = "replace into TypedBaseItems (guid, type, data) values (@1, @2, @3)"
}; };
_saveItemCommand.Parameters.Add(new SQLiteParameter("@1")); _saveItemCommand.Parameters.Add(new SQLiteParameter("@1"));
_saveItemCommand.Parameters.Add(new SQLiteParameter("@2")); _saveItemCommand.Parameters.Add(new SQLiteParameter("@2"));
_saveItemCommand.Parameters.Add(new SQLiteParameter("@3"));
_deleteChildrenCommand = new SQLiteCommand _deleteChildrenCommand = new SQLiteCommand
{ {
CommandText = "delete from ChildDefinitions where ParentId=@ParentId" CommandText = "delete from ChildrenIds where ParentId=@ParentId"
}; };
_deleteChildrenCommand.Parameters.Add(new SQLiteParameter("@ParentId")); _deleteChildrenCommand.Parameters.Add(new SQLiteParameter("@ParentId"));
_saveChildrenCommand = new SQLiteCommand _saveChildrenCommand = new SQLiteCommand
{ {
CommandText = "replace into ChildDefinitions (ParentId, ItemId, Type) values (@ParentId, @ItemId, @Type)" CommandText = "replace into ChildrenIds (ParentId, ItemId) values (@ParentId, @ItemId)"
}; };
_saveChildrenCommand.Parameters.Add(new SQLiteParameter("@ParentId")); _saveChildrenCommand.Parameters.Add(new SQLiteParameter("@ParentId"));
_saveChildrenCommand.Parameters.Add(new SQLiteParameter("@ItemId")); _saveChildrenCommand.Parameters.Add(new SQLiteParameter("@ItemId"));
_saveChildrenCommand.Parameters.Add(new SQLiteParameter("@Type"));
} }
/// <summary> /// <summary>
@ -210,7 +212,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
_saveItemCommand.Parameters[0].Value = item.Id; _saveItemCommand.Parameters[0].Value = item.Id;
_saveItemCommand.Parameters[1].Value = _jsonSerializer.SerializeToBytes(item); _saveItemCommand.Parameters[1].Value = item.GetType().FullName;
_saveItemCommand.Parameters[2].Value = _jsonSerializer.SerializeToBytes(item);
_saveItemCommand.Transaction = transaction; _saveItemCommand.Transaction = transaction;
@ -254,11 +257,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
/// Internal retrieve from items or users table /// Internal retrieve from items or users table
/// </summary> /// </summary>
/// <param name="id">The id.</param> /// <param name="id">The id.</param>
/// <param name="type">The type.</param>
/// <returns>BaseItem.</returns> /// <returns>BaseItem.</returns>
/// <exception cref="System.ArgumentNullException">id</exception> /// <exception cref="System.ArgumentNullException">id</exception>
/// <exception cref="System.ArgumentException"></exception> /// <exception cref="System.ArgumentException"></exception>
public BaseItem RetrieveItem(Guid id, Type type) public BaseItem RetrieveItem(Guid id)
{ {
if (id == Guid.Empty) if (id == Guid.Empty)
{ {
@ -267,7 +269,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
using (var cmd = _connection.CreateCommand()) using (var cmd = _connection.CreateCommand())
{ {
cmd.CommandText = "select data from baseitems where guid = @guid"; cmd.CommandText = "select type,data from TypedBaseItems where guid = @guid";
var guidParam = cmd.Parameters.Add("@guid", DbType.Guid); var guidParam = cmd.Parameters.Add("@guid", DbType.Guid);
guidParam.Value = id; guidParam.Value = id;
@ -275,7 +277,18 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
if (reader.Read()) if (reader.Read())
{ {
using (var stream = reader.GetMemoryStream(0)) var typeString = reader.GetString(0);
var type = _typeMapper.GetType(typeString);
if (type == null)
{
_logger.Debug("Unknown type {0}", typeString);
return null;
}
using (var stream = reader.GetMemoryStream(1))
{ {
return _jsonSerializer.DeserializeFromStream(stream, type) as BaseItem; return _jsonSerializer.DeserializeFromStream(stream, type) as BaseItem;
} }
@ -424,7 +437,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
} }
} }
public IEnumerable<ChildDefinition> GetChildren(Guid parentId) public IEnumerable<Guid> GetChildren(Guid parentId)
{ {
if (parentId == Guid.Empty) if (parentId == Guid.Empty)
{ {
@ -433,7 +446,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
using (var cmd = _connection.CreateCommand()) using (var cmd = _connection.CreateCommand())
{ {
cmd.CommandText = "select ItemId,Type from ChildDefinitions where ParentId = @ParentId"; cmd.CommandText = "select ItemId from ChildrenIds where ParentId = @ParentId";
cmd.Parameters.Add("@ParentId", DbType.Guid).Value = parentId; cmd.Parameters.Add("@ParentId", DbType.Guid).Value = parentId;
@ -441,17 +454,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
{ {
while (reader.Read()) while (reader.Read())
{ {
yield return new ChildDefinition yield return reader.GetGuid(0);
{
ItemId = reader.GetGuid(0),
Type = reader.GetString(1)
};
} }
} }
} }
} }
public async Task SaveChildren(Guid parentId, IEnumerable<ChildDefinition> children, CancellationToken cancellationToken) public async Task SaveChildren(Guid parentId, IEnumerable<Guid> children, CancellationToken cancellationToken)
{ {
if (parentId == Guid.Empty) if (parentId == Guid.Empty)
{ {
@ -483,13 +492,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
_deleteChildrenCommand.Transaction = transaction; _deleteChildrenCommand.Transaction = transaction;
await _deleteChildrenCommand.ExecuteNonQueryAsync(cancellationToken); await _deleteChildrenCommand.ExecuteNonQueryAsync(cancellationToken);
foreach (var chapter in children) foreach (var id in children)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
_saveChildrenCommand.Parameters[0].Value = parentId; _saveChildrenCommand.Parameters[0].Value = parentId;
_saveChildrenCommand.Parameters[1].Value = chapter.ItemId; _saveChildrenCommand.Parameters[1].Value = id;
_saveChildrenCommand.Parameters[2].Value = chapter.Type;
_saveChildrenCommand.Transaction = transaction; _saveChildrenCommand.Transaction = transaction;

View file

@ -2,7 +2,7 @@
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Linq; using System.Linq;
namespace MediaBrowser.Controller.Reflection namespace MediaBrowser.Server.Implementations.Persistence
{ {
/// <summary> /// <summary>
/// Class TypeMapper /// Class TypeMapper

View file

@ -210,9 +210,9 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
{ {
var allItems = sourceItems.ToList(); var allItems = sourceItems.ToList();
var localTrailers = allItems.SelectMany(i => _itemRepo.RetrieveItems<Trailer>(i.LocalTrailerIds)); var localTrailers = allItems.SelectMany(i => i.LocalTrailerIds.Select(_itemRepo.RetrieveItem)).Cast<Video>();
var themeVideos = allItems.SelectMany(i => _itemRepo.RetrieveItems<Video>(i.ThemeVideoIds)); var themeVideos = allItems.SelectMany(i => i.ThemeVideoIds.Select(_itemRepo.RetrieveItem)).Cast<Video>();
var videos = allItems.OfType<Video>().ToList(); var videos = allItems.OfType<Video>().ToList();
@ -222,8 +222,8 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
items.AddRange(themeVideos); items.AddRange(themeVideos);
items.AddRange(videos.SelectMany(i => _itemRepo.RetrieveItems<Video>(i.AdditionalPartIds)).ToList()); items.AddRange(videos.SelectMany(i => i.AdditionalPartIds).Select(_itemRepo.RetrieveItem).Cast<Video>());
items.AddRange(videos.OfType<Movie>().SelectMany(i => _itemRepo.RetrieveItems<Video>(i.SpecialFeatureIds)).ToList()); items.AddRange(videos.OfType<Movie>().SelectMany(i => i.SpecialFeatureIds).Select(_itemRepo.RetrieveItem).Cast<Video>());
return items.Where(i => return items.Where(i =>
{ {