Bläddra i källkod

add soundtracks to theme media result

Luke Pulverenti 11 år sedan
förälder
incheckning
9758adb8a5

+ 57 - 11
MediaBrowser.Api/LibraryService.cs

@@ -116,7 +116,7 @@ namespace MediaBrowser.Api
     /// </summary>
     /// </summary>
     [Route("/Items/{Id}/ThemeMedia", "GET")]
     [Route("/Items/{Id}/ThemeMedia", "GET")]
     [Api(Description = "Gets theme videos and songs for an item")]
     [Api(Description = "Gets theme videos and songs for an item")]
-    public class GetThemeMedia : IReturn<ThemeMediaResult>
+    public class GetThemeMedia : IReturn<AllThemeMediaResult>
     {
     {
         /// <summary>
         /// <summary>
         /// Gets or sets the user id.
         /// Gets or sets the user id.
@@ -435,11 +435,6 @@ namespace MediaBrowser.Api
 
 
             return items;
             return items;
         }
         }
-        
-        private int FavoriteCount(IEnumerable<BaseItem> items, Guid userId)
-        {
-            return items.AsParallel().Count(i => _userDataManager.GetUserData(userId, i.GetUserDataKey()).IsFavorite);
-        }
 
 
         /// <summary>
         /// <summary>
         /// Posts the specified request.
         /// Posts the specified request.
@@ -572,7 +567,9 @@ namespace MediaBrowser.Api
             return ToOptimizedResult(new AllThemeMediaResult
             return ToOptimizedResult(new AllThemeMediaResult
             {
             {
                 ThemeSongsResult = themeSongs,
                 ThemeSongsResult = themeSongs,
-                ThemeVideosResult = themeVideos
+                ThemeVideosResult = themeVideos,
+
+                SoundtrackSongsResult = GetSoundtrackSongs(request.Id, request.UserId, request.InheritFromParent)
             });
             });
         }
         }
 
 
@@ -650,8 +647,7 @@ namespace MediaBrowser.Api
             }
             }
 
 
             // Get everything
             // Get everything
-            var fields =
-                Enum.GetNames(typeof(ItemFields))
+            var fields = Enum.GetNames(typeof(ItemFields))
                     .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                     .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                     .ToList();
                     .ToList();
 
 
@@ -669,7 +665,7 @@ namespace MediaBrowser.Api
             };
             };
         }
         }
 
 
-        private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+        private readonly CultureInfo _usCulture = new CultureInfo("en-US");
 
 
         public object Get(GetYearIndex request)
         public object Get(GetYearIndex request)
         {
         {
@@ -687,11 +683,61 @@ namespace MediaBrowser.Api
                 .Select(i => new ItemIndex
                 .Select(i => new ItemIndex
                 {
                 {
                     ItemCount = i.Count(),
                     ItemCount = i.Count(),
-                    Name = i.Key == -1 ? string.Empty : i.Key.ToString(UsCulture)
+                    Name = i.Key == -1 ? string.Empty : i.Key.ToString(_usCulture)
                 })
                 })
                 .ToList();
                 .ToList();
 
 
             return ToOptimizedResult(lookup);
             return ToOptimizedResult(lookup);
         }
         }
+
+        public ThemeMediaResult GetSoundtrackSongs(string id, Guid? userId, bool inheritFromParent)
+        {
+            var user = userId.HasValue ? _userManager.GetUserById(userId.Value) : null;
+
+            var item = string.IsNullOrEmpty(id)
+                           ? (userId.HasValue
+                                  ? user.RootFolder
+                                  : (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)
+                .Select(_libraryManager.GetItemById)
+                .OfType<MusicAlbum>()
+                .SelectMany(i => i.RecursiveChildren)
+                .OfType<Audio>()
+                .OrderBy(i => i.SortName)
+                .Select(i => _dtoService.GetBaseItemDto(i, fields, user, item));
+
+            var items = dtos.ToArray();
+
+            return new ThemeMediaResult
+            {
+                Items = items,
+                TotalRecordCount = items.Length,
+                OwnerId = _dtoService.GetDtoId(item)
+            };
+        }
+
+        private List<Guid> GetSoundtrackSongIds(BaseItem item)
+        {
+            var hasSoundtracks = item as IHasSoundtracks;
+
+            if (hasSoundtracks != null)
+            {
+                return hasSoundtracks.SoundtrackIds;
+            }
+
+            return new List<Guid>();
+        }
     }
     }
 }
 }

+ 1 - 0
MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs

@@ -85,6 +85,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
 
 
             if (!updateInfo.IsUpdateAvailable)
             if (!updateInfo.IsUpdateAvailable)
             {
             {
+                Logger.Debug("No application update available.");
                 progress.Report(100);
                 progress.Report(100);
                 return;
                 return;
             }
             }

+ 3 - 0
MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs

@@ -11,9 +11,12 @@ namespace MediaBrowser.Controller.Entities.Audio
     /// </summary>
     /// </summary>
     public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres
     public class MusicAlbum : Folder, IHasAlbumArtist, IHasArtist, IHasMusicGenres
     {
     {
+        public List<Guid> SoundtrackIds { get; set; }
+        
         public MusicAlbum()
         public MusicAlbum()
         {
         {
             Artists = new List<string>();
             Artists = new List<string>();
+            SoundtrackIds = new List<Guid>();
         }
         }
 
 
         public string LastFmImageUrl { get; set; }
         public string LastFmImageUrl { get; set; }

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

@@ -25,11 +25,6 @@ namespace MediaBrowser.Controller.Entities
     /// </summary>
     /// </summary>
     public abstract class BaseItem : IHasProviderIds, ILibraryItem
     public abstract class BaseItem : IHasProviderIds, ILibraryItem
     {
     {
-        /// <summary>
-        /// MusicAlbums in the library that are the soundtrack for this item
-        /// </summary>
-        public List<Guid> SoundtrackIds { get; set; }
-
         protected BaseItem()
         protected BaseItem()
         {
         {
             Genres = new List<string>();
             Genres = new List<string>();
@@ -43,7 +38,6 @@ namespace MediaBrowser.Controller.Entities
             Tags = new List<string>();
             Tags = new List<string>();
             ThemeSongIds = new List<Guid>();
             ThemeSongIds = new List<Guid>();
             ThemeVideoIds = new List<Guid>();
             ThemeVideoIds = new List<Guid>();
-            SoundtrackIds = new List<Guid>();
             LocalTrailerIds = new List<Guid>();
             LocalTrailerIds = new List<Guid>();
             LockedFields = new List<MetadataFields>();
             LockedFields = new List<MetadataFields>();
             Taglines = new List<string>();
             Taglines = new List<string>();

+ 5 - 1
MediaBrowser.Controller/Entities/Game.cs

@@ -1,13 +1,17 @@
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
+using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 
 
 namespace MediaBrowser.Controller.Entities
 namespace MediaBrowser.Controller.Entities
 {
 {
-    public class Game : BaseItem
+    public class Game : BaseItem, IHasSoundtracks
     {
     {
+        public List<Guid> SoundtrackIds { get; set; }
+        
         public Game()
         public Game()
         {
         {
             MultiPartGameFiles = new List<string>();
             MultiPartGameFiles = new List<string>();
+            SoundtrackIds = new List<Guid>();
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 17 - 0
MediaBrowser.Controller/Entities/IHasSoundtracks.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Entities
+{
+    /// <summary>
+    /// Interface IHasSoundtracks
+    /// </summary>
+    public interface IHasSoundtracks
+    {
+        /// <summary>
+        /// Gets or sets the soundtrack ids.
+        /// </summary>
+        /// <value>The soundtrack ids.</value>
+        List<Guid> SoundtrackIds { get; set; }
+    }
+}

+ 4 - 1
MediaBrowser.Controller/Entities/Movies/Movie.cs

@@ -11,13 +11,16 @@ namespace MediaBrowser.Controller.Entities.Movies
     /// <summary>
     /// <summary>
     /// Class Movie
     /// Class Movie
     /// </summary>
     /// </summary>
-    public class Movie : Video, IHasCriticRating
+    public class Movie : Video, IHasCriticRating, IHasSoundtracks
     {
     {
         public List<Guid> SpecialFeatureIds { get; set; }
         public List<Guid> SpecialFeatureIds { get; set; }
 
 
+        public List<Guid> SoundtrackIds { get; set; }
+
         public Movie()
         public Movie()
         {
         {
             SpecialFeatureIds = new List<Guid>();
             SpecialFeatureIds = new List<Guid>();
+            SoundtrackIds = new List<Guid>();
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 3 - 0
MediaBrowser.Controller/Entities/TV/Episode.cs

@@ -193,6 +193,7 @@ namespace MediaBrowser.Controller.Entities.TV
             return false;
             return false;
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsMissingEpisode
         public bool IsMissingEpisode
         {
         {
             get
             get
@@ -201,11 +202,13 @@ namespace MediaBrowser.Controller.Entities.TV
             }
             }
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsUnaired
         public bool IsUnaired
         {
         {
             get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; }
             get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; }
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsVirtualUnaired
         public bool IsVirtualUnaired
         {
         {
             get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
             get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }

+ 4 - 0
MediaBrowser.Controller/Entities/TV/Season.cs

@@ -149,21 +149,25 @@ namespace MediaBrowser.Controller.Entities.TV
             return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name;
             return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name;
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsMissingSeason
         public bool IsMissingSeason
         {
         {
             get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType<Episode>().All(i => i.IsMissingEpisode); }
             get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType<Episode>().All(i => i.IsMissingEpisode); }
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsUnaired
         public bool IsUnaired
         {
         {
             get { return Children.OfType<Episode>().All(i => i.IsUnaired); }
             get { return Children.OfType<Episode>().All(i => i.IsUnaired); }
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsVirtualUnaired
         public bool IsVirtualUnaired
         {
         {
             get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
             get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
         }
         }
 
 
+        [IgnoreDataMember]
         public bool IsMissingOrVirtualUnaired
         public bool IsMissingOrVirtualUnaired
         {
         {
             get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType<Episode>().All(i => i.IsVirtualUnaired || i.IsMissingEpisode); }
             get { return LocationType == Model.Entities.LocationType.Virtual && Children.OfType<Episode>().All(i => i.IsVirtualUnaired || i.IsMissingEpisode); }

+ 3 - 1
MediaBrowser.Controller/Entities/TV/Series.cs

@@ -11,9 +11,10 @@ namespace MediaBrowser.Controller.Entities.TV
     /// <summary>
     /// <summary>
     /// Class Series
     /// Class Series
     /// </summary>
     /// </summary>
-    public class Series : Folder
+    public class Series : Folder, IHasSoundtracks
     {
     {
         public List<Guid> SpecialFeatureIds { get; set; }
         public List<Guid> SpecialFeatureIds { get; set; }
+        public List<Guid> SoundtrackIds { get; set; }
 
 
         public int SeasonCount { get; set; }
         public int SeasonCount { get; set; }
 
 
@@ -22,6 +23,7 @@ namespace MediaBrowser.Controller.Entities.TV
             AirDays = new List<DayOfWeek>();
             AirDays = new List<DayOfWeek>();
 
 
             SpecialFeatureIds = new List<Guid>();
             SpecialFeatureIds = new List<Guid>();
+            SoundtrackIds = new List<Guid>();
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 5 - 1
MediaBrowser.Controller/Entities/Trailer.cs

@@ -1,4 +1,5 @@
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
+using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Runtime.Serialization;
 using System.Runtime.Serialization;
 
 
@@ -7,12 +8,15 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// <summary>
     /// Class Trailer
     /// Class Trailer
     /// </summary>
     /// </summary>
-    public class Trailer : Video, IHasCriticRating
+    public class Trailer : Video, IHasCriticRating, IHasSoundtracks
     {
     {
+        public List<Guid> SoundtrackIds { get; set; }
+        
         public Trailer()
         public Trailer()
         {
         {
             RemoteTrailers = new List<MediaUrl>();
             RemoteTrailers = new List<MediaUrl>();
             Taglines = new List<string>();
             Taglines = new List<string>();
+            SoundtrackIds = new List<Guid>();
         }
         }
 
 
         /// <summary>
         /// <summary>

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

@@ -90,6 +90,7 @@
     <Compile Include="Entities\GameSystem.cs" />
     <Compile Include="Entities\GameSystem.cs" />
     <Compile Include="Entities\IByReferenceItem.cs" />
     <Compile Include="Entities\IByReferenceItem.cs" />
     <Compile Include="Entities\IHasCriticRating.cs" />
     <Compile Include="Entities\IHasCriticRating.cs" />
+    <Compile Include="Entities\IHasSoundtracks.cs" />
     <Compile Include="Entities\IItemByName.cs" />
     <Compile Include="Entities\IItemByName.cs" />
     <Compile Include="Entities\ILibraryItem.cs" />
     <Compile Include="Entities\ILibraryItem.cs" />
     <Compile Include="Entities\ImageSourceInfo.cs" />
     <Compile Include="Entities\ImageSourceInfo.cs" />

+ 4 - 0
MediaBrowser.Model/Querying/ThemeSongsResult.cs

@@ -19,11 +19,15 @@ namespace MediaBrowser.Model.Querying
 
 
         public ThemeMediaResult ThemeSongsResult { get; set; }
         public ThemeMediaResult ThemeSongsResult { get; set; }
 
 
+        public ThemeMediaResult SoundtrackSongsResult { get; set; }
+        
         public AllThemeMediaResult()
         public AllThemeMediaResult()
         {
         {
             ThemeVideosResult = new ThemeMediaResult();
             ThemeVideosResult = new ThemeMediaResult();
 
 
             ThemeSongsResult = new ThemeMediaResult();
             ThemeSongsResult = new ThemeMediaResult();
+
+            SoundtrackSongsResult = new ThemeMediaResult();
         }
         }
     }
     }
 }
 }

+ 4 - 2
MediaBrowser.Providers/Music/SoundtrackPostScanTask.cs

@@ -60,17 +60,19 @@ namespace MediaBrowser.Providers.Music
             foreach (var movie in allItems
             foreach (var movie in allItems
                 .Where(i => (i is Movie) || (i is Trailer)))
                 .Where(i => (i is Movie) || (i is Trailer)))
             {
             {
+                var hasSoundtracks = (IHasSoundtracks) movie;
+
                 cancellationToken.ThrowIfCancellationRequested();
                 cancellationToken.ThrowIfCancellationRequested();
 
 
                 var tmdbId = movie.GetProviderId(MetadataProviders.Tmdb);
                 var tmdbId = movie.GetProviderId(MetadataProviders.Tmdb);
 
 
                 if (string.IsNullOrEmpty(tmdbId))
                 if (string.IsNullOrEmpty(tmdbId))
                 {
                 {
-                    movie.SoundtrackIds = new List<Guid>();
+                    hasSoundtracks.SoundtrackIds = new List<Guid>();
                     continue;
                     continue;
                 }
                 }
 
 
-                movie.SoundtrackIds = allAlbums
+                hasSoundtracks.SoundtrackIds = allAlbums
                 .Where(i => string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase))
                 .Where(i => string.Equals(tmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase))
                 .Select(i => i.Id)
                 .Select(i => i.Id)
                 .ToList();
                 .ToList();

+ 14 - 8
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -102,9 +102,14 @@ namespace MediaBrowser.Server.Implementations.Dto
 
 
             if (fields.Contains(ItemFields.SoundtrackIds))
             if (fields.Contains(ItemFields.SoundtrackIds))
             {
             {
-                dto.SoundtrackIds = item.SoundtrackIds
-                    .Select(i => i.ToString("N"))
-                    .ToArray();
+                var hasSoundtracks = item as IHasSoundtracks;
+
+                if (hasSoundtracks != null)
+                {
+                    dto.SoundtrackIds = hasSoundtracks.SoundtrackIds
+                        .Select(i => i.ToString("N"))
+                        .ToArray();
+                }
             }
             }
 
 
             var itemByName = item as IItemByName;
             var itemByName = item as IItemByName;
@@ -131,12 +136,9 @@ namespace MediaBrowser.Server.Implementations.Dto
                 //counts = item.ItemCounts;
                 //counts = item.ItemCounts;
                 return;
                 return;
             }
             }
-            else
+            if (!item.UserItemCounts.TryGetValue(user.Id, out counts))
             {
             {
-                if (!item.UserItemCounts.TryGetValue(user.Id, out counts))
-                {
-                    counts = new ItemByNameCounts();
-                }
+                counts = new ItemByNameCounts();
             }
             }
 
 
             dto.ChildCount = counts.TotalCount;
             dto.ChildCount = counts.TotalCount;
@@ -967,6 +969,10 @@ namespace MediaBrowser.Server.Implementations.Dto
             if (album != null)
             if (album != null)
             {
             {
                 dto.Artists = album.Artists;
                 dto.Artists = album.Artists;
+
+                dto.SoundtrackIds = album.SoundtrackIds
+                    .Select(i => i.ToString("N"))
+                    .ToArray();
             }
             }
 
 
             var hasAlbumArtist = item as IHasAlbumArtist;
             var hasAlbumArtist = item as IHasAlbumArtist;