fixes #573 - Support media info for intros

This commit is contained in:
Luke Pulverenti 2013-10-04 13:04:18 -04:00
parent cbbb984160
commit fe2eb6cb01
10 changed files with 242 additions and 16 deletions

View File

@ -58,7 +58,7 @@ namespace MediaBrowser.Api.UserLibrary
/// </summary>
[Route("/Users/{UserId}/Items/{Id}/Intros", "GET")]
[Api(("Gets intros to play before the main media item plays"))]
public class GetIntros : IReturn<List<string>>
public class GetIntros : IReturn<ItemsResult>
{
/// <summary>
/// Gets or sets the user id.
@ -552,7 +552,21 @@ namespace MediaBrowser.Api.UserLibrary
var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _dtoService.GetItemByDtoId(request.Id, user.Id);
var result = _libraryManager.GetIntros(item, user);
var items = _libraryManager.GetIntros(item, user);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields))
.Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
.ToList();
var dtos = items.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
.ToArray();
var result = new ItemsResult
{
Items = dtos,
TotalRecordCount = dtos.Length
};
return ToOptimizedResult(result);
}
@ -579,6 +593,13 @@ namespace MediaBrowser.Api.UserLibrary
return ToOptimizedResult(dto);
}
/// <summary>
/// Marks the favorite.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="itemId">The item id.</param>
/// <param name="isFavorite">if set to <c>true</c> [is favorite].</param>
/// <returns>Task{UserItemDataDto}.</returns>
private async Task<UserItemDataDto> MarkFavorite(Guid userId, string itemId, bool isFavorite)
{
var user = _userManager.GetUserById(userId);
@ -622,6 +643,13 @@ namespace MediaBrowser.Api.UserLibrary
return ToOptimizedResult(dto);
}
/// <summary>
/// Updates the user item rating.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="itemId">The item id.</param>
/// <param name="likes">if set to <c>true</c> [likes].</param>
/// <returns>Task{UserItemDataDto}.</returns>
private async Task<UserItemDataDto> UpdateUserItemRating(Guid userId, string itemId, bool? likes)
{
var user = _userManager.GetUserById(userId);

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Entities;
using System;
using System.Collections.Generic;
namespace MediaBrowser.Controller.Library
@ -14,12 +15,27 @@ namespace MediaBrowser.Controller.Library
/// <param name="item">The item.</param>
/// <param name="user">The user.</param>
/// <returns>IEnumerable{System.String}.</returns>
IEnumerable<string> GetIntros(BaseItem item, User user);
IEnumerable<IntroInfo> GetIntros(BaseItem item, User user);
/// <summary>
/// Gets all intros.
/// Gets all intro files.
/// </summary>
/// <returns>IEnumerable{System.String}.</returns>
IEnumerable<string> GetAllIntros();
IEnumerable<string> GetAllIntroFiles();
}
public class IntroInfo
{
/// <summary>
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
public string Path { get; set; }
/// <summary>
/// Gets or sets the item id.
/// </summary>
/// <value>The item id.</value>
public Guid? ItemId { get; set; }
}
}

View File

@ -48,6 +48,11 @@ namespace MediaBrowser.Controller.Library
/// <value>The root folder.</value>
AggregateFolder RootFolder { get; }
/// <summary>
/// Gets the person sync.
/// </summary>
/// <param name="name">The name.</param>
/// <returns>Person.</returns>
Person GetPersonSync(string name);
/// <summary>
@ -143,7 +148,13 @@ namespace MediaBrowser.Controller.Library
/// <param name="item">The item.</param>
/// <param name="user">The user.</param>
/// <returns>IEnumerable{System.String}.</returns>
IEnumerable<string> GetIntros(BaseItem item, User user);
IEnumerable<Video> GetIntros(BaseItem item, User user);
/// <summary>
/// Gets all intro files.
/// </summary>
/// <returns>IEnumerable{System.String}.</returns>
IEnumerable<string> GetAllIntroFiles();
/// <summary>
/// Adds the parts.

View File

@ -169,9 +169,8 @@ namespace MediaBrowser.Model.ApiClient
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <returns>Task{System.String[]}.</returns>
/// <exception cref="ArgumentNullException">id</exception>
Task<string[]> GetIntrosAsync(string itemId, string userId);
/// <returns>Task{ItemsResult}.</returns>
Task<ItemsResult> GetIntrosAsync(string itemId, string userId);
/// <summary>
/// Gets a BaseItem

View File

@ -87,6 +87,7 @@
<Compile Include="Music\MusicVideoXmlParser.cs" />
<Compile Include="Music\SoundtrackPostScanTask.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RefreshIntrosTask.cs" />
<Compile Include="Savers\AlbumXmlSaver.cs" />
<Compile Include="Savers\ArtistXmlSaver.cs" />
<Compile Include="Savers\BoxSetXmlSaver.cs" />

View File

@ -0,0 +1,105 @@
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Providers
{
/// <summary>
/// Class RefreshIntrosTask
/// </summary>
public class RefreshIntrosTask : ILibraryPostScanTask
{
/// <summary>
/// The _library manager
/// </summary>
private readonly ILibraryManager _libraryManager;
/// <summary>
/// The _logger
/// </summary>
private readonly ILogger _logger;
/// <summary>
/// Initializes a new instance of the <see cref="RefreshIntrosTask"/> class.
/// </summary>
/// <param name="libraryManager">The library manager.</param>
/// <param name="logger">The logger.</param>
public RefreshIntrosTask(ILibraryManager libraryManager, ILogger logger)
{
_libraryManager = libraryManager;
_logger = logger;
}
/// <summary>
/// Runs the specified progress.
/// </summary>
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
{
var files = _libraryManager.GetAllIntroFiles().ToList();
var numComplete = 0;
foreach (var file in files)
{
cancellationToken.ThrowIfCancellationRequested();
try
{
await RefreshIntro(file, cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
_logger.ErrorException("Error refreshing intro {0}", ex, file);
}
numComplete++;
double percent = numComplete;
percent /= files.Count;
progress.Report(percent * 100);
}
}
/// <summary>
/// Refreshes the intro.
/// </summary>
/// <param name="path">The path.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
private async Task RefreshIntro(string path, CancellationToken cancellationToken)
{
var item = _libraryManager.ResolvePath(FileSystem.GetFileSystemInfo(path));
if (item == null)
{
_logger.Error("Intro resolver returned null for {0}", path);
return;
}
var dbItem = _libraryManager.RetrieveItem(item.Id);
var isNewItem = false;
if (dbItem != null)
{
dbItem.ResetResolveArgs(item.ResolveArgs);
item = dbItem;
}
else
{
isNewItem = true;
}
// Force the save if it's a new item
await item.RefreshMetadata(cancellationToken, isNewItem).ConfigureAwait(false);
}
}
}

View File

@ -1129,9 +1129,75 @@ namespace MediaBrowser.Server.Implementations.Library
/// <param name="item">The item.</param>
/// <param name="user">The user.</param>
/// <returns>IEnumerable{System.String}.</returns>
public IEnumerable<string> GetIntros(BaseItem item, User user)
public IEnumerable<Video> GetIntros(BaseItem item, User user)
{
return IntroProviders.SelectMany(i => i.GetIntros(item, user));
return IntroProviders.SelectMany(i => i.GetIntros(item, user))
.Select(ResolveIntro)
.Where(i => i != null);
}
/// <summary>
/// Gets all intro files.
/// </summary>
/// <returns>IEnumerable{System.String}.</returns>
public IEnumerable<string> GetAllIntroFiles()
{
return IntroProviders.SelectMany(i => i.GetAllIntroFiles());
}
/// <summary>
/// Resolves the intro.
/// </summary>
/// <param name="info">The info.</param>
/// <returns>Video.</returns>
private Video ResolveIntro(IntroInfo info)
{
Video video = null;
if (info.ItemId.HasValue)
{
// Get an existing item by Id
video = GetItemById(info.ItemId.Value) as Video;
if (video == null)
{
_logger.Error("Unable to locate item with Id {0}.", info.ItemId.Value);
}
}
else if (!string.IsNullOrEmpty(info.Path))
{
try
{
// Try to resolve the path into a video
video = ResolvePath(FileSystem.GetFileSystemInfo(info.Path)) as Video;
if (video == null)
{
_logger.Error("Intro resolver returned null for {0}.", info.Path);
}
else
{
// Pull the saved db item that will include metadata
var dbItem = GetItemById(video.Id) as Video;
if (dbItem != null)
{
dbItem.ResetResolveArgs(video.ResolveArgs);
video = dbItem;
}
}
}
catch (Exception ex)
{
_logger.ErrorException("Error resolving path {0}.", ex, info.Path);
}
}
else
{
_logger.Error("IntroProvider returned an IntroInfo with null Path and ItemId.");
}
return video;
}
/// <summary>

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
<version>3.0.218</version>
<version>3.0.219</version>
<title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
<dependency id="MediaBrowser.Common" version="3.0.218" />
<dependency id="MediaBrowser.Common" version="3.0.219" />
<dependency id="NLog" version="2.0.1.2" />
<dependency id="ServiceStack.Text" version="3.9.58" />
<dependency id="SimpleInjector" version="2.3.2" />

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
<version>3.0.218</version>
<version>3.0.219</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>

View File

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
<version>3.0.218</version>
<version>3.0.219</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
<dependency id="MediaBrowser.Common" version="3.0.218" />
<dependency id="MediaBrowser.Common" version="3.0.219" />
</dependencies>
</metadata>
<files>