Przeglądaj źródła

fixes #573 - Support media info for intros

Luke Pulverenti 11 lat temu
rodzic
commit
fe2eb6cb01

+ 30 - 2
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);

+ 19 - 3
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; }
     }
 }

+ 12 - 1
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.

+ 2 - 3
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

+ 1 - 0
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" />

+ 105 - 0
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);
+        }
+    }
+}

+ 68 - 2
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>

+ 2 - 2
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" />

+ 1 - 1
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>

+ 2 - 2
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>