add soundtracks to theme media result

This commit is contained in:
Luke Pulverenti 2013-11-12 10:36:08 -05:00
parent 8349b1f83a
commit 9758adb8a5
15 changed files with 125 additions and 31 deletions

View File

@ -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 = var fields = Enum.GetNames(typeof(ItemFields))
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>();
}
} }
} }

View File

@ -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;
} }

View File

@ -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; }

View File

@ -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>();

View File

@ -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>

View File

@ -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; }
}
}

View File

@ -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>

View File

@ -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; }

View File

@ -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); }

View File

@ -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>

View File

@ -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>

View File

@ -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" />

View File

@ -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();
} }
} }
} }

View File

@ -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();

View File

@ -102,9 +102,14 @@ namespace MediaBrowser.Server.Implementations.Dto
if (fields.Contains(ItemFields.SoundtrackIds)) if (fields.Contains(ItemFields.SoundtrackIds))
{ {
dto.SoundtrackIds = item.SoundtrackIds var hasSoundtracks = item as IHasSoundtracks;
.Select(i => i.ToString("N"))
.ToArray(); 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;