diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-10-04 13:04:18 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-10-04 13:04:18 -0400 |
| commit | fe2eb6cb01564662df01aef87afe2bff51971c1b (patch) | |
| tree | 60fa3d02315405f75e2ef14c53d4e37aeead0c38 | |
| parent | cbbb98416084f80ae4e311b69a63f59139584688 (diff) | |
fixes #573 - Support media info for intros
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/UserLibraryService.cs | 32 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/IIntroProvider.cs | 22 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Library/ILibraryManager.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.Model/ApiClient/IApiClient.cs | 5 | ||||
| -rw-r--r-- | MediaBrowser.Providers/MediaBrowser.Providers.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.Providers/RefreshIntrosTask.cs | 105 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/Library/LibraryManager.cs | 70 | ||||
| -rw-r--r-- | Nuget/MediaBrowser.Common.Internal.nuspec | 4 | ||||
| -rw-r--r-- | Nuget/MediaBrowser.Common.nuspec | 2 | ||||
| -rw-r--r-- | Nuget/MediaBrowser.Server.Core.nuspec | 4 |
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> |
