Просмотр исходного кода

pull person sort order from tvdb/tmdb data

Luke Pulverenti 11 лет назад
Родитель
Сommit
bce86c5022

+ 6 - 1
MediaBrowser.Api/ItemUpdateService.cs

@@ -247,11 +247,16 @@ namespace MediaBrowser.Api
             item.PremiereDate = request.PremiereDate.HasValue ? request.PremiereDate.Value.ToUniversalTime() : (DateTime?)null;
             item.ProductionYear = request.ProductionYear;
             item.ProductionLocations = request.ProductionLocations;
-            item.AspectRatio = request.AspectRatio;
             item.Language = request.Language;
             item.OfficialRating = request.OfficialRating;
             item.CustomRating = request.CustomRating;
 
+            var hasAspectRatio = item as IHasAspectRatio;
+            if (hasAspectRatio != null)
+            {
+                hasAspectRatio.AspectRatio = request.AspectRatio;
+            }
+            
             item.DontFetchMeta = !(request.EnableInternetProviders ?? true);
             if (request.EnableInternetProviders ?? true)
             {

+ 15 - 8
MediaBrowser.Api/LibraryService.cs

@@ -681,6 +681,11 @@ namespace MediaBrowser.Api
             {
                 var album = originalItem as MusicAlbum;
 
+                if (album == null)
+                {
+                    album = originalItem.Parents.OfType<MusicAlbum>().FirstOrDefault();
+                }
+
                 if (album != null)
                 {
                     var linkedItemWithThemes = album.SoundtrackIds
@@ -744,17 +749,12 @@ namespace MediaBrowser.Api
                                   : (Folder)_libraryManager.RootFolder)
                            : _dtoService.GetItemByDtoId(id, userId);
 
-            while (GetSoundtrackSongIds(item).Count == 0 && inheritFromParent && item.Parent != null)
-            {
-                item = item.Parent;
-            }
-
             // Get everything
             var fields = Enum.GetNames(typeof(ItemFields))
                     .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                     .ToList();
 
-            var dtos = GetSoundtrackSongIds(item)
+            var dtos = GetSoundtrackSongIds(item, inheritFromParent)
                 .Select(_libraryManager.GetItemById)
                 .OfType<MusicAlbum>()
                 .SelectMany(i => i.RecursiveChildren)
@@ -772,7 +772,7 @@ namespace MediaBrowser.Api
             };
         }
 
-        private List<Guid> GetSoundtrackSongIds(BaseItem item)
+        private IEnumerable<Guid> GetSoundtrackSongIds(BaseItem item, bool inherit)
         {
             var hasSoundtracks = item as IHasSoundtracks;
 
@@ -781,7 +781,14 @@ namespace MediaBrowser.Api
                 return hasSoundtracks.SoundtrackIds;
             }
 
-            return new List<Guid>();
+            if (!inherit)
+            {
+                return null;
+            }
+
+            hasSoundtracks = item.Parents.OfType<IHasSoundtracks>().FirstOrDefault();
+
+            return hasSoundtracks != null ? hasSoundtracks.SoundtrackIds : new List<Guid>();
         }
     }
 }

+ 1 - 1
MediaBrowser.Api/UserLibrary/PersonsService.cs

@@ -155,7 +155,7 @@ namespace MediaBrowser.Api.UserLibrary
         /// <returns>IEnumerable{PersonInfo}.</returns>
         private IEnumerable<PersonInfo> GetAllPeople(IEnumerable<BaseItem> itemsList, string[] personTypes)
         {
-            var people = itemsList.SelectMany(i => i.People.OrderBy(p => p.Type));
+            var people = itemsList.SelectMany(i => i.People.OrderBy(p => p.SortOrder ?? int.MaxValue).ThenBy(p => p.Type));
 
             return personTypes.Length == 0 ?
 

+ 16 - 5
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -483,6 +483,22 @@ namespace MediaBrowser.Controller.Entities
         [IgnoreDataMember]
         public Folder Parent { get; set; }
 
+        [IgnoreDataMember]
+        public IEnumerable<Folder> Parents
+        {
+            get
+            {
+                var parent = Parent;
+
+                while (parent != null)
+                {
+                    yield return parent;
+
+                    parent = parent.Parent;
+                }
+            }
+        }
+
         /// <summary>
         /// When the item first debuted. For movies this could be premiere date, episodes would be first aired
         /// </summary>
@@ -630,11 +646,6 @@ namespace MediaBrowser.Controller.Entities
         /// <value>The original run time ticks.</value>
         public long? OriginalRunTimeTicks { get; set; }
         /// <summary>
-        /// Gets or sets the aspect ratio.
-        /// </summary>
-        /// <value>The aspect ratio.</value>
-        public string AspectRatio { get; set; }
-        /// <summary>
         /// Gets or sets the production year.
         /// </summary>
         /// <value>The production year.</value>

+ 14 - 0
MediaBrowser.Controller/Entities/IHasAspectRatio.cs

@@ -0,0 +1,14 @@
+namespace MediaBrowser.Controller.Entities
+{
+    /// <summary>
+    /// Interface IHasAspectRatio
+    /// </summary>
+    public interface IHasAspectRatio
+    {
+        /// <summary>
+        /// Gets or sets the aspect ratio.
+        /// </summary>
+        /// <value>The aspect ratio.</value>
+        string AspectRatio { get; set; }
+    }
+}

+ 6 - 0
MediaBrowser.Controller/Entities/Person.cs

@@ -49,6 +49,12 @@ namespace MediaBrowser.Controller.Entities
         /// <value>The type.</value>
         public string Type { get; set; }
 
+        /// <summary>
+        /// Gets or sets the sort order - ascending
+        /// </summary>
+        /// <value>The sort order.</value>
+        public int? SortOrder { get; set; }
+
         /// <summary>
         /// Returns a <see cref="System.String" /> that represents this instance.
         /// </summary>

+ 7 - 1
MediaBrowser.Controller/Entities/Video.cs

@@ -14,7 +14,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// Class Video
     /// </summary>
-    public class Video : BaseItem, IHasMediaStreams
+    public class Video : BaseItem, IHasMediaStreams, IHasAspectRatio
     {
         public bool IsMultiPart { get; set; }
 
@@ -65,6 +65,12 @@ namespace MediaBrowser.Controller.Entities
             return GetPlayableStreamFiles(Path);
         }
 
+        /// <summary>
+        /// Gets or sets the aspect ratio.
+        /// </summary>
+        /// <value>The aspect ratio.</value>
+        public string AspectRatio { get; set; }
+        
         /// <summary>
         /// Should be overridden to return the proper folder where metadata lives
         /// </summary>

+ 10 - 1
MediaBrowser.Controller/LiveTv/ILiveTvService.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.LiveTv;
+using System.IO;
+using MediaBrowser.Model.LiveTv;
 using System.Collections.Generic;
 using System.Threading;
 using System.Threading.Tasks;
@@ -23,6 +24,14 @@ namespace MediaBrowser.Controller.LiveTv
         /// <returns>Task{IEnumerable{ChannelInfo}}.</returns>
         Task<IEnumerable<ChannelInfo>> GetChannelsAsync(CancellationToken cancellationToken);
 
+        /// <summary>
+        /// Gets the channel image asynchronous.
+        /// </summary>
+        /// <param name="channelId">The channel identifier.</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>Task{Stream}.</returns>
+        Task<Stream> GetChannelImageAsync(string channelId, CancellationToken cancellationToken);
+
         /// <summary>
         /// Gets the recordings asynchronous.
         /// </summary>

+ 1 - 0
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -89,6 +89,7 @@
     <Compile Include="Entities\GameGenre.cs" />
     <Compile Include="Entities\GameSystem.cs" />
     <Compile Include="Entities\IByReferenceItem.cs" />
+    <Compile Include="Entities\IHasAspectRatio.cs" />
     <Compile Include="Entities\IHasCriticRating.cs" />
     <Compile Include="Entities\IHasSoundtracks.cs" />
     <Compile Include="Entities\IItemByName.cs" />

+ 3 - 2
MediaBrowser.Controller/Providers/BaseItemXmlParser.cs

@@ -375,9 +375,10 @@ namespace MediaBrowser.Controller.Providers
                     {
                         var val = reader.ReadElementContentAsString();
 
-                        if (!string.IsNullOrWhiteSpace(val))
+                        var hasAspectRatio = item as IHasAspectRatio;
+                        if (!string.IsNullOrWhiteSpace(val) && hasAspectRatio != null)
                         {
-                            item.AspectRatio = val;
+                            hasAspectRatio.AspectRatio = val;
                         }
                         break;
                     }

+ 1 - 1
MediaBrowser.Providers/Movies/MovieDbProvider.cs

@@ -845,7 +845,7 @@ namespace MediaBrowser.Providers.Movies
                     //actors come from cast
                     if (movieData.casts != null && movieData.casts.cast != null)
                     {
-                        foreach (var actor in movieData.casts.cast.OrderBy(a => a.order)) movie.AddPerson(new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor });
+                        foreach (var actor in movieData.casts.cast.OrderBy(a => a.order)) movie.AddPerson(new PersonInfo { Name = actor.name.Trim(), Role = actor.character, Type = PersonType.Actor, SortOrder = actor.order });
                     }
 
                     //and the rest from crew

+ 6 - 2
MediaBrowser.Providers/Savers/XmlSaverHelpers.cs

@@ -301,9 +301,13 @@ namespace MediaBrowser.Providers.Savers
                 builder.Append("<Website>" + SecurityElement.Escape(item.HomePageUrl) + "</Website>");
             }
 
-            if (!string.IsNullOrEmpty(item.AspectRatio))
+            var hasAspectRatio = item as IHasAspectRatio;
+            if (hasAspectRatio != null)
             {
-                builder.Append("<AspectRatio>" + SecurityElement.Escape(item.AspectRatio) + "</AspectRatio>");
+                if (!string.IsNullOrEmpty(hasAspectRatio.AspectRatio))
+                {
+                    builder.Append("<AspectRatio>" + SecurityElement.Escape(hasAspectRatio.AspectRatio) + "</AspectRatio>");
+                }
             }
 
             if (!string.IsNullOrEmpty(item.Language))

+ 17 - 0
MediaBrowser.Providers/TV/TvdbSeriesProvider.cs

@@ -1056,6 +1056,23 @@ namespace MediaBrowser.Providers.TV
                                 break;
                             }
 
+                        case "SortOrder":
+                            {
+                                var val = reader.ReadElementContentAsString();
+
+                                if (!string.IsNullOrWhiteSpace(val))
+                                {
+                                    int rval;
+
+                                    // int.TryParse is local aware, so it can be probamatic, force us culture
+                                    if (int.TryParse(val, NumberStyles.Integer, UsCulture, out rval))
+                                    {
+                                        personInfo.SortOrder = rval;
+                                    }
+                                }
+                                break;
+                            }
+                        
                         default:
                             reader.Skip();
                             break;

+ 6 - 2
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -433,7 +433,7 @@ namespace MediaBrowser.Server.Implementations.Dto
             // Ordering by person type to ensure actors and artists are at the front.
             // This is taking advantage of the fact that they both begin with A
             // This should be improved in the future
-            var people = item.People.OrderBy(i => i.Type).ToList();
+            var people = item.People.OrderBy(i => i.SortOrder ?? int.MaxValue).ThenBy(i => i.Type).ToList();
 
             // Attach People by transforming them into BaseItemPerson (DTO)
             dto.People = new BaseItemPerson[people.Count];
@@ -760,7 +760,11 @@ namespace MediaBrowser.Server.Implementations.Dto
                 dto.ProductionLocations = item.ProductionLocations;
             }
 
-            dto.AspectRatio = item.AspectRatio;
+            var hasAspectRatio = item as IHasAspectRatio;
+            if (hasAspectRatio != null)
+            {
+                dto.AspectRatio = hasAspectRatio.AspectRatio;
+            }
 
             dto.BackdropImageTags = GetBackdropImageTags(item);