aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-10-04 13:04:18 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-10-04 13:04:18 -0400
commitfe2eb6cb01564662df01aef87afe2bff51971c1b (patch)
tree60fa3d02315405f75e2ef14c53d4e37aeead0c38
parentcbbb98416084f80ae4e311b69a63f59139584688 (diff)
fixes #573 - Support media info for intros
-rw-r--r--MediaBrowser.Api/UserLibrary/UserLibraryService.cs32
-rw-r--r--MediaBrowser.Controller/Library/IIntroProvider.cs22
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs13
-rw-r--r--MediaBrowser.Model/ApiClient/IApiClient.cs5
-rw-r--r--MediaBrowser.Providers/MediaBrowser.Providers.csproj1
-rw-r--r--MediaBrowser.Providers/RefreshIntrosTask.cs105
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs70
-rw-r--r--Nuget/MediaBrowser.Common.Internal.nuspec4
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
10 files changed, 242 insertions, 16 deletions
diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
index a43ed276d..9c6f5d826 100644
--- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
+++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
@@ -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);
diff --git a/MediaBrowser.Controller/Library/IIntroProvider.cs b/MediaBrowser.Controller/Library/IIntroProvider.cs
index 990fa933c..224ca2271 100644
--- a/MediaBrowser.Controller/Library/IIntroProvider.cs
+++ b/MediaBrowser.Controller/Library/IIntroProvider.cs
@@ -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; }
}
}
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 3419bf5e0..f930385d3 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -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.
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 4a459cac8..a42823630 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -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
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index f0d332e10..3690a1b80 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -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" />
diff --git a/MediaBrowser.Providers/RefreshIntrosTask.cs b/MediaBrowser.Providers/RefreshIntrosTask.cs
new file mode 100644
index 000000000..3ff2b40a6
--- /dev/null
+++ b/MediaBrowser.Providers/RefreshIntrosTask.cs
@@ -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);
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index d54bb94de..e9c824198 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -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>
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index e9af79efb..911f78a03 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -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" />
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 10caee574..bd03797fe 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -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>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 80e62afb2..3130718c9 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -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>