diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities')
19 files changed, 181 insertions, 151 deletions
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 902447999..100633d7f 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Controller.Persistence; -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -22,7 +21,8 @@ namespace MediaBrowser.Controller.Entities.Audio IHasLookupInfo<SongInfo>, IHasTags, IHasMediaSources, - IThemeMedia + IThemeMedia, + IArchivable { public string FormatName { get; set; } public long? Size { get; set; } @@ -172,16 +172,6 @@ namespace MediaBrowser.Controller.Entities.Audio } /// <summary> - /// Determines whether the specified name has artist. - /// </summary> - /// <param name="name">The name.</param> - /// <returns><c>true</c> if the specified name has artist; otherwise, <c>false</c>.</returns> - public bool HasArtist(string name) - { - return AllArtists.Contains(name, StringComparer.OrdinalIgnoreCase); - } - - /// <summary> /// Gets the user data key. /// </summary> /// <returns>System.String.</returns> @@ -239,7 +229,7 @@ namespace MediaBrowser.Controller.Entities.Audio { Id = i.Id.ToString("N"), Protocol = locationType == LocationType.Remote ? MediaProtocol.Http : MediaProtocol.File, - MediaStreams = MediaSourceManager.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), + MediaStreams = MediaSourceManager.GetMediaStreams(i.Id).ToList(), Name = i.Name, Path = enablePathSubstituion ? GetMappedPath(i.Path, locationType) : i.Path, RunTimeTicks = i.RunTimeTicks, diff --git a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs index a20f05323..56921409a 100644 --- a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; namespace MediaBrowser.Controller.Entities.Audio { @@ -9,10 +11,20 @@ namespace MediaBrowser.Controller.Entities.Audio public interface IHasArtist { - bool HasArtist(string name); - List<string> AllArtists { get; } - List<string> Artists { get; } + List<string> Artists { get; set; } + } + + public static class HasArtistExtensions + { + public static bool HasArtist(this IHasArtist hasArtist, string artist) + { + return hasArtist.Artists.Contains(artist, StringComparer.OrdinalIgnoreCase); + } + public static bool HasAnyArtist(this IHasArtist hasArtist, string artist) + { + return hasArtist.AllArtists.Contains(artist, StringComparer.OrdinalIgnoreCase); + } } } diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index e3f523b5a..dc3f13b01 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -120,16 +120,6 @@ namespace MediaBrowser.Controller.Entities.Audio get { return Parent as MusicArtist ?? UnknwonArtist; } } - /// <summary> - /// Determines whether the specified artist has artist. - /// </summary> - /// <param name="artist">The artist.</param> - /// <returns><c>true</c> if the specified artist has artist; otherwise, <c>false</c>.</returns> - public bool HasArtist(string artist) - { - return AllArtists.Contains(artist, StringComparer.OrdinalIgnoreCase); - } - public List<string> Artists { get; set; } /// <summary> diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 2b8145041..4185590ab 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; @@ -148,12 +149,15 @@ namespace MediaBrowser.Controller.Entities.Audio var totalItems = songs.Count + others.Count; var numComplete = 0; + var childUpdateType = ItemUpdateType.None; + // Refresh songs foreach (var item in songs) { cancellationToken.ThrowIfCancellationRequested(); - await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + var updateType = await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + childUpdateType = childUpdateType | updateType; numComplete++; double percent = numComplete; @@ -161,15 +165,22 @@ namespace MediaBrowser.Controller.Entities.Audio progress.Report(percent * 100); } + var parentRefreshOptions = refreshOptions; + if (childUpdateType > ItemUpdateType.None) + { + parentRefreshOptions = new MetadataRefreshOptions(refreshOptions); + parentRefreshOptions.MetadataRefreshMode = MetadataRefreshMode.FullRefresh; + } + // Refresh current item - await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + await RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false); // Refresh all non-songs foreach (var item in others) { cancellationToken.ThrowIfCancellationRequested(); - await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + var updateType = await item.RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false); numComplete++; double percent = numComplete; @@ -202,7 +213,7 @@ namespace MediaBrowser.Controller.Entities.Audio return i => { var hasArtist = i as IHasArtist; - return hasArtist != null && hasArtist.HasArtist(Name); + return hasArtist != null && hasArtist.HasAnyArtist(Name); }; } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 50a6dda30..dd6189bc5 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -239,6 +239,11 @@ namespace MediaBrowser.Controller.Entities get { return this.GetImagePath(ImageType.Primary); } } + public virtual bool IsInternetMetadataEnabled() + { + return ConfigurationManager.Configuration.EnableInternetProviders; + } + public virtual bool CanDelete() { var locationType = LocationType; @@ -717,7 +722,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="options">The options.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>true if a provider reports we changed</returns> - public async Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken) + public async Task<ItemUpdateType> RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken) { var locationType = LocationType; @@ -744,15 +749,16 @@ namespace MediaBrowser.Controller.Entities } } - var dateLastSaved = DateLastSaved; + var refreshOptions = requiresSave + ? new MetadataRefreshOptions(options) + { + ForceSave = true + } + : options; - await ProviderManager.RefreshMetadata(this, options, cancellationToken).ConfigureAwait(false); + var result = await ProviderManager.RefreshSingleItem(this, refreshOptions, cancellationToken).ConfigureAwait(false); - // If it wasn't saved by the provider process, save now - if (requiresSave && dateLastSaved == DateLastSaved) - { - await UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); - } + return result; } [IgnoreDataMember] @@ -1245,13 +1251,6 @@ namespace MediaBrowser.Controller.Entities { if (string.Equals(i.GetType().Name, info.ItemType, StringComparison.OrdinalIgnoreCase)) { - if (info.ItemYear.HasValue) - { - if (info.ItemYear.Value != (i.ProductionYear ?? -1)) - { - return false; - } - } return true; } } @@ -1461,7 +1460,8 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task.</returns> public virtual Task ChangedExternally() { - return RefreshMetadata(CancellationToken.None); + ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions()); + return Task.FromResult(true); } /// <summary> diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 0d9bb03ac..cffc0989a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -1135,10 +1135,7 @@ namespace MediaBrowser.Controller.Entities foreach (var child in LinkedChildren) { // Reset the cached value - if (child.ItemId.HasValue && child.ItemId.Value == Guid.Empty) - { - child.ItemId = null; - } + child.ItemId = null; } return false; diff --git a/MediaBrowser.Controller/Entities/IArchivable.cs b/MediaBrowser.Controller/Entities/IArchivable.cs new file mode 100644 index 000000000..575d203a7 --- /dev/null +++ b/MediaBrowser.Controller/Entities/IArchivable.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Entities +{ + public interface IArchivable + { + bool IsArchive { get; } + } +} diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 5aafc8eb3..00a42271b 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -184,6 +184,12 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <value><c>true</c> if [always scan internal metadata path]; otherwise, <c>false</c>.</value> bool AlwaysScanInternalMetadataPath { get; } + + /// <summary> + /// Determines whether [is internet metadata enabled]. + /// </summary> + /// <returns><c>true</c> if [is internet metadata enabled]; otherwise, <c>false</c>.</returns> + bool IsInternetMetadataEnabled(); } public static class HasImagesExtensions diff --git a/MediaBrowser.Controller/Entities/IHasMediaSources.cs b/MediaBrowser.Controller/Entities/IHasMediaSources.cs index 98d268298..17a147806 100644 --- a/MediaBrowser.Controller/Entities/IHasMediaSources.cs +++ b/MediaBrowser.Controller/Entities/IHasMediaSources.cs @@ -1,9 +1,6 @@ -using MediaBrowser.Controller.MediaEncoding; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Dto; using System; using System.Collections.Generic; -using System.Linq; namespace MediaBrowser.Controller.Entities { @@ -22,53 +19,4 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task{IEnumerable{MediaSourceInfo}}.</returns> IEnumerable<MediaSourceInfo> GetMediaSources(bool enablePathSubstitution); } - - public static class HasMediaSourceExtensions - { - public static IEnumerable<MediaSourceInfo> GetMediaSources(this IHasMediaSources item, bool enablePathSubstitution, User user) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (!(item is Video)) - { - return item.GetMediaSources(enablePathSubstitution); - } - - if (user == null) - { - throw new ArgumentNullException("user"); - } - - var sources = item.GetMediaSources(enablePathSubstitution).ToList(); - - var preferredAudio = string.IsNullOrEmpty(user.Configuration.AudioLanguagePreference) - ? new string[] { } - : new[] { user.Configuration.AudioLanguagePreference }; - - var preferredSubs = string.IsNullOrEmpty(user.Configuration.SubtitleLanguagePreference) - ? new List<string> { } - : new List<string> { user.Configuration.SubtitleLanguagePreference }; - - foreach (var source in sources) - { - source.DefaultAudioStreamIndex = MediaStreamSelector.GetDefaultAudioStreamIndex( - source.MediaStreams, preferredAudio, user.Configuration.PlayDefaultAudioTrack); - - var defaultAudioIndex = source.DefaultAudioStreamIndex; - var audioLangage = defaultAudioIndex == null - ? null - : source.MediaStreams.Where(i => i.Type == MediaStreamType.Audio && i.Index == defaultAudioIndex).Select(i => i.Language).FirstOrDefault(); - - source.DefaultSubtitleStreamIndex = MediaStreamSelector.GetDefaultSubtitleStreamIndex(source.MediaStreams, - preferredSubs, - user.Configuration.SubtitleMode, - audioLangage); - } - - return sources; - } - } } diff --git a/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs b/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs new file mode 100644 index 000000000..6f5cb59bc --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Entities +{ + public interface IHasOriginalTitle + { + string OriginalTitle { get; set; } + } +} diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index e99c11e87..727f756f1 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -30,7 +30,6 @@ namespace MediaBrowser.Controller.Entities public string[] IncludeItemTypes { get; set; } public string[] ExcludeItemTypes { get; set; } public string[] Genres { get; set; } - public string[] AllGenres { get; set; } public bool? IsMissing { get; set; } public bool? IsUnaired { get; set; } @@ -42,6 +41,7 @@ namespace MediaBrowser.Controller.Entities public string NameLessThan { get; set; } public string Person { get; set; } + public string[] PersonIds { get; set; } public string AdjacentTo { get; set; } public string[] PersonTypes { get; set; } @@ -66,6 +66,7 @@ namespace MediaBrowser.Controller.Entities public bool? HasParentalRating { get; set; } public string[] Studios { get; set; } + public string[] StudioIds { get; set; } public ImageType[] ImageTypes { get; set; } public VideoType[] VideoTypes { get; set; } public int[] Years { get; set; } @@ -80,13 +81,14 @@ namespace MediaBrowser.Controller.Entities MediaTypes = new string[] { }; IncludeItemTypes = new string[] { }; ExcludeItemTypes = new string[] { }; - AllGenres = new string[] { }; Genres = new string[] { }; Studios = new string[] { }; + StudioIds = new string[] { }; ImageTypes = new ImageType[] { }; VideoTypes = new VideoType[] { }; Years = new int[] { }; PersonTypes = new string[] { }; + PersonIds = new string[] { }; } } } diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs index 80aec6482..b36b818ff 100644 --- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs +++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs @@ -5,10 +5,22 @@ namespace MediaBrowser.Controller.Entities { public class ItemImageInfo { + /// <summary> + /// Gets or sets the path. + /// </summary> + /// <value>The path.</value> public string Path { get; set; } + /// <summary> + /// Gets or sets the type. + /// </summary> + /// <value>The type.</value> public ImageType Type { get; set; } + /// <summary> + /// Gets or sets the date modified. + /// </summary> + /// <value>The date modified.</value> public DateTime DateModified { get; set; } } } diff --git a/MediaBrowser.Controller/Entities/LinkedChild.cs b/MediaBrowser.Controller/Entities/LinkedChild.cs index 78e8e4959..949c9741b 100644 --- a/MediaBrowser.Controller/Entities/LinkedChild.cs +++ b/MediaBrowser.Controller/Entities/LinkedChild.cs @@ -11,7 +11,6 @@ namespace MediaBrowser.Controller.Entities public string ItemName { get; set; } public string ItemType { get; set; } - public int? ItemYear { get; set; } [IgnoreDataMember] public string Id { get; set; } diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index cfe008bd7..411004782 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -6,7 +6,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; @@ -15,10 +14,11 @@ namespace MediaBrowser.Controller.Entities.Movies /// <summary> /// Class Movie /// </summary> - public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping + public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle { public List<Guid> SpecialFeatureIds { get; set; } + public string OriginalTitle { get; set; } public List<Guid> SoundtrackIds { get; set; } public List<Guid> ThemeSongIds { get; set; } diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs index 771c62fd6..b2cad02de 100644 --- a/MediaBrowser.Controller/Entities/MusicVideo.cs +++ b/MediaBrowser.Controller/Entities/MusicVideo.cs @@ -48,16 +48,6 @@ namespace MediaBrowser.Controller.Entities } /// <summary> - /// Determines whether the specified name has artist. - /// </summary> - /// <param name="name">The name.</param> - /// <returns><c>true</c> if the specified name has artist; otherwise, <c>false</c>.</returns> - public bool HasArtist(string name) - { - return AllArtists.Contains(name, StringComparer.OrdinalIgnoreCase); - } - - /// <summary> /// Gets the user data key. /// </summary> /// <returns>System.String.</returns> diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 4c34460d7..b4e1d9d6e 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -15,11 +15,12 @@ namespace MediaBrowser.Controller.Entities.TV /// <summary> /// Class Series /// </summary> - public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>, IHasSpecialFeatures, IMetadataContainer + public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>, IHasSpecialFeatures, IMetadataContainer, IHasOriginalTitle { public List<Guid> SpecialFeatureIds { get; set; } public List<Guid> SoundtrackIds { get; set; } + public string OriginalTitle { get; set; } public int SeasonCount { get; set; } public int? AnimeSeriesIndex { get; set; } @@ -260,7 +261,7 @@ namespace MediaBrowser.Controller.Entities.TV progress.Report(percent * 100); } - await ProviderManager.RefreshMetadata(this, refreshOptions, cancellationToken).ConfigureAwait(false); + await ProviderManager.RefreshSingleItem(this, refreshOptions, cancellationToken).ConfigureAwait(false); progress.Report(100); } diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index 5f7ca3d3f..9be30273a 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.TV; +using MediaBrowser.Controller.Playlists; +using MediaBrowser.Controller.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using System; @@ -15,7 +16,13 @@ namespace MediaBrowser.Controller.Entities public Guid? UserId { get; set; } public static ITVSeriesManager TVSeriesManager; + public static IPlaylistManager PlaylistManager; + public bool ContainsDynamicCategories(User user) + { + return true; + } + public override Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query) { var parent = this as Folder; @@ -25,7 +32,7 @@ namespace MediaBrowser.Controller.Entities parent = LibraryManager.GetItemById(ParentId) as Folder ?? parent; } - return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager, CollectionManager) + return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager, CollectionManager, PlaylistManager) .GetUserItems(parent, this, ViewType, query); } @@ -45,6 +52,11 @@ namespace MediaBrowser.Controller.Entities return false; } + public override bool IsSaveLocalMetadataEnabled() + { + return true; + } + public override IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter) { var result = GetItems(new InternalItemsQuery diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 85c10c272..0e602dabe 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -5,7 +5,7 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.TV; using MediaBrowser.Model.Channels; using MediaBrowser.Model.Entities; @@ -18,7 +18,6 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MoreLinq; namespace MediaBrowser.Controller.Entities { @@ -32,8 +31,9 @@ namespace MediaBrowser.Controller.Entities private readonly IUserDataManager _userDataManager; private readonly ITVSeriesManager _tvSeriesManager; private readonly ICollectionManager _collectionManager; + private readonly IPlaylistManager _playlistManager; - public UserViewBuilder(IUserViewManager userViewManager, ILiveTvManager liveTvManager, IChannelManager channelManager, ILibraryManager libraryManager, ILogger logger, IUserDataManager userDataManager, ITVSeriesManager tvSeriesManager, ICollectionManager collectionManager) + public UserViewBuilder(IUserViewManager userViewManager, ILiveTvManager liveTvManager, IChannelManager channelManager, ILibraryManager libraryManager, ILogger logger, IUserDataManager userDataManager, ITVSeriesManager tvSeriesManager, ICollectionManager collectionManager, IPlaylistManager playlistManager) { _userViewManager = userViewManager; _liveTvManager = liveTvManager; @@ -43,6 +43,7 @@ namespace MediaBrowser.Controller.Entities _userDataManager = userDataManager; _tvSeriesManager = tvSeriesManager; _collectionManager = collectionManager; + _playlistManager = playlistManager; } public async Task<QueryResult<BaseItem>> GetUserItems(Folder queryParent, Folder displayParent, string viewType, InternalItemsQuery query) @@ -111,12 +112,21 @@ namespace MediaBrowser.Controller.Entities return GetResult(result, queryParent, query); } + case CollectionType.Books: + case CollectionType.Photos: + case CollectionType.HomeVideos: + case CollectionType.MusicVideos: + return GetResult(queryParent.GetChildren(user, true), queryParent, query); + case CollectionType.Folders: return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Games: return await GetGameView(user, queryParent, query).ConfigureAwait(false); + case CollectionType.Playlists: + return await GetPlaylistsView(queryParent, user, query).ConfigureAwait(false); + case CollectionType.BoxSets: return await GetBoxsetView(queryParent, user, query).ConfigureAwait(false); @@ -574,6 +584,11 @@ namespace MediaBrowser.Controller.Entities return GetResult(items, queryParent, query); } + private async Task<QueryResult<BaseItem>> GetPlaylistsView(Folder parent, User user, InternalItemsQuery query) + { + return GetResult(_playlistManager.GetPlaylists(user.Id.ToString("N")), parent, query); + } + private async Task<QueryResult<BaseItem>> GetBoxsetView(Folder parent, User user, InternalItemsQuery query) { return GetResult(GetMediaFolders(user).SelectMany(i => @@ -937,11 +952,6 @@ namespace MediaBrowser.Controller.Entities return false; } - if (request.AllGenres.Length > 0) - { - return false; - } - if (request.Genres.Length > 0) { return false; @@ -1047,11 +1057,21 @@ namespace MediaBrowser.Controller.Entities return false; } + if (request.PersonIds.Length > 0) + { + return false; + } + if (request.Studios.Length > 0) { return false; } + if (request.StudioIds.Length > 0) + { + return false; + } + if (request.VideoTypes.Length > 0) { return false; @@ -1571,12 +1591,6 @@ namespace MediaBrowser.Controller.Entities return false; } - // Apply genre filter - if (query.AllGenres.Length > 0 && !query.AllGenres.All(v => item.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))) - { - return false; - } - // Filter by VideoType if (query.VideoTypes.Length > 0) { @@ -1598,6 +1612,16 @@ namespace MediaBrowser.Controller.Entities return false; } + // Apply studio filter + if (query.StudioIds.Length > 0 && !query.StudioIds.Any(id => + { + var studioItem = libraryManager.GetItemById(id); + return studioItem != null && item.Studios.Contains(studioItem.Name, StringComparer.OrdinalIgnoreCase); + })) + { + return false; + } + // Apply year filter if (query.Years.Length > 0) { @@ -1614,7 +1638,22 @@ namespace MediaBrowser.Controller.Entities } // Apply person filter - if (!string.IsNullOrEmpty(query.Person)) + if (query.PersonIds.Length > 0) + { + var names = query.PersonIds + .Select(libraryManager.GetItemById) + .Select(i => i == null ? "-1" : i.Name) + .ToList(); + + if (!(names.Any( + v => item.People.Select(i => i.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) + { + return false; + } + } + + // Apply person filter + if (!string.IsNullOrWhiteSpace(query.Person)) { var personTypes = query.PersonTypes; @@ -1716,7 +1755,7 @@ namespace MediaBrowser.Controller.Entities var parent = user.RootFolder; - //list.Add(await GetUserView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); + //list.Add(await GetUserSubView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.LiveTvChannels, user, string.Empty, parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, user, string.Empty, parent).ConfigureAwait(false)); @@ -1725,7 +1764,7 @@ namespace MediaBrowser.Controller.Entities private async Task<UserView> GetUserView(string name, string type, User user, string sortName, BaseItem parent) { - var view = await _userViewManager.GetUserView(name, parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) + var view = await _userViewManager.GetUserSubView(name, parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) .ConfigureAwait(false); return view; @@ -1733,7 +1772,7 @@ namespace MediaBrowser.Controller.Entities private async Task<UserView> GetUserView(string type, User user, string sortName, BaseItem parent) { - var view = await _userViewManager.GetUserView(parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) + var view = await _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) .ConfigureAwait(false); return view; diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index d4507bc33..ba84beca3 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -24,7 +24,8 @@ namespace MediaBrowser.Controller.Entities IHasMediaSources, IHasShortOverview, IHasPreferredMetadataLanguage, - IThemeMedia + IThemeMedia, + IArchivable { public Guid? PrimaryVersionId { get; set; } @@ -420,12 +421,17 @@ namespace MediaBrowser.Controller.Entities return base.GetDeletePaths(); } - public virtual IEnumerable<MediaStream> GetMediaStreams() + public IEnumerable<MediaStream> GetMediaStreams() { - return MediaSourceManager.GetMediaStreams(new MediaStreamQuery + var mediaSource = GetMediaSources(false) + .FirstOrDefault(); + + if (mediaSource == null) { - ItemId = Id - }); + return new List<MediaStream>(); + } + + return mediaSource.MediaStreams; } public virtual MediaStream GetDefaultVideoStream() @@ -455,7 +461,7 @@ namespace MediaBrowser.Controller.Entities return result.OrderBy(i => { - if (item.VideoType == VideoType.VideoFile) + if (i.VideoType == VideoType.VideoFile) { return 0; } @@ -474,7 +480,7 @@ namespace MediaBrowser.Controller.Entities private static MediaSourceInfo GetVersionInfo(bool enablePathSubstitution, Video i, MediaSourceType type) { - var mediaStreams = MediaSourceManager.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }) + var mediaStreams = MediaSourceManager.GetMediaStreams(i.Id) .ToList(); var locationType = i.LocationType; @@ -551,7 +557,6 @@ namespace MediaBrowser.Controller.Entities return info; } - private static string GetMediaSourceName(Video video, List<MediaStream> mediaStreams) { var terms = new List<string>(); |
