aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller/Entities')
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs34
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs5
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs5
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs121
-rw-r--r--MediaBrowser.Controller/Entities/Book.cs15
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs102
-rw-r--r--MediaBrowser.Controller/Entities/Game.cs11
-rw-r--r--MediaBrowser.Controller/Entities/GameSystem.cs5
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs23
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs5
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs4
-rw-r--r--MediaBrowser.Controller/Entities/MusicVideo.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Person.cs9
-rw-r--r--MediaBrowser.Controller/Entities/Photo.cs7
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs7
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs31
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs19
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs5
-rw-r--r--MediaBrowser.Controller/Entities/Trailer.cs4
-rw-r--r--MediaBrowser.Controller/Entities/User.cs20
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs10
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs27
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs23
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs6
24 files changed, 326 insertions, 176 deletions
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 43b980c20..766f1e5ed 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -27,9 +27,22 @@ namespace MediaBrowser.Controller.Entities.Audio
public long? Size { get; set; }
public string Container { get; set; }
public int? TotalBitrate { get; set; }
- public List<string> Tags { get; set; }
public ExtraType? ExtraType { get; set; }
+ /// <summary>
+ /// Gets or sets the artist.
+ /// </summary>
+ /// <value>The artist.</value>
+ public List<string> Artists { get; set; }
+
+ public List<string> AlbumArtists { get; set; }
+
+ /// <summary>
+ /// Gets or sets the album.
+ /// </summary>
+ /// <value>The album.</value>
+ public string Album { get; set; }
+
[IgnoreDataMember]
public bool IsThemeMedia
{
@@ -43,7 +56,6 @@ namespace MediaBrowser.Controller.Entities.Audio
{
Artists = new List<string>();
AlbumArtists = new List<string>();
- Tags = new List<string>();
}
[IgnoreDataMember]
@@ -92,14 +104,6 @@ namespace MediaBrowser.Controller.Entities.Audio
locationType != LocationType.Virtual;
}
- /// <summary>
- /// Gets or sets the artist.
- /// </summary>
- /// <value>The artist.</value>
- public List<string> Artists { get; set; }
-
- public List<string> AlbumArtists { get; set; }
-
[IgnoreDataMember]
public List<string> AllArtists
{
@@ -114,12 +118,6 @@ namespace MediaBrowser.Controller.Entities.Audio
}
}
- /// <summary>
- /// Gets or sets the album.
- /// </summary>
- /// <value>The album.</value>
- public string Album { get; set; }
-
[IgnoreDataMember]
public MusicAlbum AlbumEntity
{
@@ -173,9 +171,9 @@ namespace MediaBrowser.Controller.Entities.Audio
return base.CreateUserDataKey();
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Music);
+ return UnratedItem.Music;
}
public SongInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
index 98d1eb4ce..59481f5df 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
@@ -110,6 +110,11 @@ namespace MediaBrowser.Controller.Entities.Audio
return config.BlockUnratedItems.Contains(UnratedItem.Music);
}
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Music;
+ }
+
public AlbumInfo GetLookupInfo()
{
var id = GetItemLookupInfo<AlbumInfo>();
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index f6d1d32a4..02bcceada 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -138,6 +138,11 @@ namespace MediaBrowser.Controller.Entities.Audio
return config.BlockUnratedItems.Contains(UnratedItem.Music);
}
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Music;
+ }
+
public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
{
var items = GetRecursiveChildren().ToList();
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index ec688bd9f..5b0af42e8 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -24,6 +24,7 @@ using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
using CommonIO;
+using MediaBrowser.Model.LiveTv;
namespace MediaBrowser.Controller.Entities
{
@@ -34,6 +35,7 @@ namespace MediaBrowser.Controller.Entities
{
protected BaseItem()
{
+ Tags = new List<string>();
Genres = new List<string>();
Studios = new List<string>();
ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
@@ -103,7 +105,8 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
- public string Name
+ [IgnoreDataMember]
+ public virtual string Name
{
get
{
@@ -122,15 +125,24 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
+ [IgnoreDataMember]
public Guid Id { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is hd.
/// </summary>
/// <value><c>true</c> if this instance is hd; otherwise, <c>false</c>.</value>
+ [IgnoreDataMember]
public bool? IsHD { get; set; }
/// <summary>
+ /// Gets or sets the audio.
+ /// </summary>
+ /// <value>The audio.</value>
+ [IgnoreDataMember]
+ public ProgramAudio? Audio { get; set; }
+
+ /// <summary>
/// Return the id that should be used to key display prefs for this item.
/// Default is based on the type for everything except actual generic folders.
/// </summary>
@@ -149,6 +161,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
+ [IgnoreDataMember]
public virtual string Path { get; set; }
[IgnoreDataMember]
@@ -173,7 +186,7 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Id of the program.
+ /// If this content came from an external service, the id of the content on that service
/// </summary>
[IgnoreDataMember]
public string ExternalId
@@ -325,12 +338,14 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the date created.
/// </summary>
/// <value>The date created.</value>
+ [IgnoreDataMember]
public DateTime DateCreated { get; set; }
/// <summary>
/// Gets or sets the date modified.
/// </summary>
/// <value>The date modified.</value>
+ [IgnoreDataMember]
public DateTime DateModified { get; set; }
public DateTime DateLastSaved { get; set; }
@@ -407,6 +422,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name of the forced sort.
/// </summary>
/// <value>The name of the forced sort.</value>
+ [IgnoreDataMember]
public string ForcedSortName
{
get { return _forcedSortName; }
@@ -493,6 +509,7 @@ namespace MediaBrowser.Controller.Entities
return sortable;
}
+ [IgnoreDataMember]
public Guid ParentId { get; set; }
/// <summary>
@@ -559,6 +576,7 @@ namespace MediaBrowser.Controller.Entities
/// When the item first debuted. For movies this could be premiere date, episodes would be first aired
/// </summary>
/// <value>The premiere date.</value>
+ [IgnoreDataMember]
public DateTime? PremiereDate { get; set; }
/// <summary>
@@ -572,31 +590,35 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the display type of the media.
/// </summary>
/// <value>The display type of the media.</value>
+ [IgnoreDataMember]
public string DisplayMediaType { get; set; }
/// <summary>
/// Gets or sets the official rating.
/// </summary>
/// <value>The official rating.</value>
+ [IgnoreDataMember]
public string OfficialRating { get; set; }
/// <summary>
/// Gets or sets the official rating description.
/// </summary>
/// <value>The official rating description.</value>
+ [IgnoreDataMember]
public string OfficialRatingDescription { get; set; }
/// <summary>
/// Gets or sets the custom rating.
/// </summary>
/// <value>The custom rating.</value>
- //[IgnoreDataMember]
+ [IgnoreDataMember]
public string CustomRating { get; set; }
/// <summary>
/// Gets or sets the overview.
/// </summary>
/// <value>The overview.</value>
+ [IgnoreDataMember]
public string Overview { get; set; }
/// <summary>
@@ -609,37 +631,48 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the genres.
/// </summary>
/// <value>The genres.</value>
+ [IgnoreDataMember]
public List<string> Genres { get; set; }
/// <summary>
+ /// Gets or sets the tags.
+ /// </summary>
+ /// <value>The tags.</value>
+ public List<string> Tags { get; set; }
+
+ /// <summary>
/// Gets or sets the home page URL.
/// </summary>
/// <value>The home page URL.</value>
+ [IgnoreDataMember]
public string HomePageUrl { get; set; }
/// <summary>
/// Gets or sets the community rating.
/// </summary>
/// <value>The community rating.</value>
- //[IgnoreDataMember]
+ [IgnoreDataMember]
public float? CommunityRating { get; set; }
/// <summary>
/// Gets or sets the community rating vote count.
/// </summary>
/// <value>The community rating vote count.</value>
+ [IgnoreDataMember]
public int? VoteCount { get; set; }
/// <summary>
/// Gets or sets the run time ticks.
/// </summary>
/// <value>The run time ticks.</value>
+ [IgnoreDataMember]
public long? RunTimeTicks { get; set; }
/// <summary>
/// Gets or sets the production year.
/// </summary>
/// <value>The production year.</value>
+ [IgnoreDataMember]
public int? ProductionYear { get; set; }
/// <summary>
@@ -647,19 +680,35 @@ namespace MediaBrowser.Controller.Entities
/// This could be episode number, album track number, etc.
/// </summary>
/// <value>The index number.</value>
- //[IgnoreDataMember]
+ [IgnoreDataMember]
public int? IndexNumber { get; set; }
/// <summary>
/// For an episode this could be the season number, or for a song this could be the disc number.
/// </summary>
/// <value>The parent index number.</value>
+ [IgnoreDataMember]
public int? ParentIndexNumber { get; set; }
- [IgnoreDataMember]
- public virtual string OfficialRatingForComparison
+ public virtual string GetOfficialRatingForComparison(bool inherit)
{
- get { return OfficialRating; }
+ if (inherit)
+ {
+ if (!string.IsNullOrWhiteSpace(OfficialRating))
+ {
+ return OfficialRating;
+ }
+
+ var parent = DisplayParent;
+ if (parent != null)
+ {
+ return parent.GetOfficialRatingForComparison(inherit);
+ }
+
+ return null;
+ }
+
+ return OfficialRating;
}
[IgnoreDataMember]
@@ -1092,7 +1141,7 @@ namespace MediaBrowser.Controller.Entities
if (string.IsNullOrWhiteSpace(rating))
{
- rating = OfficialRatingForComparison;
+ rating = GetOfficialRatingForComparison(true);
}
if (string.IsNullOrWhiteSpace(rating))
@@ -1120,11 +1169,28 @@ namespace MediaBrowser.Controller.Entities
public int? GetParentalRatingValue()
{
+ var rating = CustomRating;
+
+ if (string.IsNullOrWhiteSpace(rating))
+ {
+ rating = OfficialRating;
+ }
+
+ if (string.IsNullOrWhiteSpace(rating))
+ {
+ return null;
+ }
+
+ return LocalizationManager.GetRatingLevel(rating);
+ }
+
+ public int? GetInheritedParentalRatingValue()
+ {
var rating = CustomRatingForComparison;
if (string.IsNullOrWhiteSpace(rating))
{
- rating = OfficialRatingForComparison;
+ rating = GetOfficialRatingForComparison(true);
}
if (string.IsNullOrWhiteSpace(rating))
@@ -1156,6 +1222,11 @@ namespace MediaBrowser.Controller.Entities
return true;
}
+ public virtual UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Other;
+ }
+
/// <summary>
/// Gets the block unrated value.
/// </summary>
@@ -1174,7 +1245,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- return config.BlockUnratedItems.Contains(UnratedItem.Other);
+ return config.BlockUnratedItems.Contains(GetBlockUnratedType());
}
/// <summary>
@@ -1308,15 +1379,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Adds a person to the item
- /// </summary>
- /// <param name="person">The person.</param>
- /// <exception cref="System.ArgumentNullException"></exception>
- public void AddPerson(PersonInfo person)
- {
- }
-
- /// <summary>
/// Adds a studio to the item
/// </summary>
/// <param name="name">The name.</param>
@@ -1873,5 +1935,24 @@ namespace MediaBrowser.Controller.Entities
DateLastSaved.Ticks.ToString(CultureInfo.InvariantCulture)
};
}
+
+ public virtual IEnumerable<Guid> GetAncestorIds()
+ {
+ return Parents.Select(i => i.Id).Concat(LibraryManager.GetCollectionFolders(this).Select(i => i.Id));
+ }
+
+ [IgnoreDataMember]
+ public virtual bool SupportsAncestors
+ {
+ get
+ {
+ return true;
+ }
+ }
+
+ public virtual IEnumerable<Guid> GetIdsForAncestorQuery()
+ {
+ return new[] { Id };
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs
index d31675baf..1b4904509 100644
--- a/MediaBrowser.Controller/Entities/Book.cs
+++ b/MediaBrowser.Controller/Entities/Book.cs
@@ -17,19 +17,8 @@ namespace MediaBrowser.Controller.Entities
}
}
- /// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
public string SeriesName { get; set; }
- public Book()
- {
- Tags = new List<string>();
- }
-
public override bool CanDownload()
{
var locationType = LocationType;
@@ -37,9 +26,9 @@ namespace MediaBrowser.Controller.Entities
locationType != LocationType.Virtual;
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Book);
+ return UnratedItem.Book;
}
public BookInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 05965e1b5..97016baff 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -28,7 +28,6 @@ namespace MediaBrowser.Controller.Entities
public List<Guid> ThemeSongIds { get; set; }
public List<Guid> ThemeVideoIds { get; set; }
- public List<string> Tags { get; set; }
public Folder()
{
@@ -36,7 +35,6 @@ namespace MediaBrowser.Controller.Entities
ThemeSongIds = new List<Guid>();
ThemeVideoIds = new List<Guid>();
- Tags = new List<string>();
}
[IgnoreDataMember]
@@ -151,7 +149,15 @@ namespace MediaBrowser.Controller.Entities
await LibraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
- await ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken).ConfigureAwait(false);
+ if (!EnableNewFolderQuerying())
+ {
+ await ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken).ConfigureAwait(false);
+ }
+ }
+
+ private static bool EnableNewFolderQuerying()
+ {
+ return ConfigurationManager.Configuration.MigrationVersion >= 1;
}
protected void AddChildrenInternal(IEnumerable<BaseItem> children)
@@ -196,21 +202,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
- public override string OfficialRatingForComparison
- {
- get
- {
- // Never want folders to be blocked by "BlockNotRated"
- if (this is Series)
- {
- return base.OfficialRatingForComparison;
- }
-
- return !string.IsNullOrWhiteSpace(base.OfficialRatingForComparison) ? base.OfficialRatingForComparison : "None";
- }
- }
-
/// <summary>
/// Removes the child.
/// </summary>
@@ -224,7 +215,12 @@ namespace MediaBrowser.Controller.Entities
item.SetParent(null);
- return ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken);
+ if (!EnableNewFolderQuerying())
+ {
+ return ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken);
+ }
+
+ return Task.FromResult(true);
}
/// <summary>
@@ -457,32 +453,25 @@ namespace MediaBrowser.Controller.Entities
{
BaseItem currentChild;
- if (currentChildren.TryGetValue(child.Id, out currentChild))
+ if (currentChildren.TryGetValue(child.Id, out currentChild) && IsValidFromResolver(currentChild, child))
{
- if (IsValidFromResolver(currentChild, child))
+ var currentChildLocationType = currentChild.LocationType;
+ if (currentChildLocationType != LocationType.Remote &&
+ currentChildLocationType != LocationType.Virtual)
{
- var currentChildLocationType = currentChild.LocationType;
- if (currentChildLocationType != LocationType.Remote &&
- currentChildLocationType != LocationType.Virtual)
- {
- currentChild.DateModified = child.DateModified;
- }
-
- await UpdateIsOffline(currentChild, false).ConfigureAwait(false);
- validChildren.Add(currentChild);
- }
- else
- {
- newItems.Add(child);
- validChildren.Add(child);
+ currentChild.DateModified = child.DateModified;
}
+
+ await UpdateIsOffline(currentChild, false).ConfigureAwait(false);
+ validChildren.Add(currentChild);
+
+ continue;
}
- else
- {
- // Brand new item - needs to be added
- newItems.Add(child);
- validChildren.Add(child);
- }
+
+ // Brand new item - needs to be added
+ child.SetParent(this);
+ newItems.Add(child);
+ validChildren.Add(child);
}
// If any items were added or removed....
@@ -508,7 +497,6 @@ namespace MediaBrowser.Controller.Entities
}
else
{
- await UpdateIsOffline(item, false).ConfigureAwait(false);
actualRemovals.Add(item);
}
}
@@ -519,6 +507,11 @@ namespace MediaBrowser.Controller.Entities
foreach (var item in actualRemovals)
{
+ Logger.Debug("Removed item: " + item.Path);
+
+ item.SetParent(null);
+ item.IsOffline = false;
+ await LibraryManager.DeleteItem(item, new DeleteOptions { DeleteFileLocation = false }).ConfigureAwait(false);
LibraryManager.ReportItemRemoved(item);
}
}
@@ -527,7 +520,10 @@ namespace MediaBrowser.Controller.Entities
AddChildrenInternal(newItems);
- await ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken).ConfigureAwait(false);
+ if (!EnableNewFolderQuerying())
+ {
+ await ItemRepository.SaveChildren(Id, ActualChildren.Select(i => i.Id).ToList(), cancellationToken).ConfigureAwait(false);
+ }
}
}
@@ -757,19 +753,16 @@ namespace MediaBrowser.Controller.Entities
/// <returns>IEnumerable{BaseItem}.</returns>
protected IEnumerable<BaseItem> GetCachedChildren()
{
- if (ConfigurationManager.Configuration.DisableStartupScan)
+ if (EnableNewFolderQuerying())
{
- return ItemRepository.GetChildrenItems(Id).Select(RetrieveChild).Where(i => i != null);
- //return ItemRepository.GetItems(new InternalItemsQuery
- //{
- // ParentId = Id
+ return ItemRepository.GetItemList(new InternalItemsQuery
+ {
+ ParentId = Id
- //}).Items.Select(RetrieveChild).Where(i => i != null);
- }
- else
- {
- return ItemRepository.GetChildrenItems(Id).Select(RetrieveChild).Where(i => i != null);
+ }).Select(RetrieveChild).Where(i => i != null);
}
+
+ return ItemRepository.GetChildrenItems(Id).Select(RetrieveChild).Where(i => i != null);
}
private BaseItem RetrieveChild(BaseItem child)
@@ -1182,7 +1175,8 @@ namespace MediaBrowser.Controller.Entities
{
User = user,
Recursive = true,
- IsFolder = false
+ IsFolder = false,
+ IsMissing = false
}).ConfigureAwait(false);
diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs
index ed3e85d58..e073d09f6 100644
--- a/MediaBrowser.Controller/Entities/Game.cs
+++ b/MediaBrowser.Controller/Entities/Game.cs
@@ -21,7 +21,6 @@ namespace MediaBrowser.Controller.Entities
RemoteTrailerIds = new List<Guid>();
ThemeSongIds = new List<Guid>();
ThemeVideoIds = new List<Guid>();
- Tags = new List<string>();
}
public List<Guid> LocalTrailerIds { get; set; }
@@ -35,12 +34,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
- /// <summary>
/// Gets or sets the remote trailers.
/// </summary>
/// <value>The remote trailers.</value>
@@ -105,9 +98,9 @@ namespace MediaBrowser.Controller.Entities
return base.GetDeletePaths();
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Game);
+ return UnratedItem.Game;
}
public GameInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/GameSystem.cs b/MediaBrowser.Controller/Entities/GameSystem.cs
index 35f7e3350..bc35c4738 100644
--- a/MediaBrowser.Controller/Entities/GameSystem.cs
+++ b/MediaBrowser.Controller/Entities/GameSystem.cs
@@ -50,6 +50,11 @@ namespace MediaBrowser.Controller.Entities
return false;
}
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Game;
+ }
+
public GameSystemInfo GetLookupInfo()
{
var id = GetItemLookupInfo<GameSystemInfo>();
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index 785e2fd2b..ac1fc4641 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
+using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Controller.Entities
{
@@ -69,12 +70,15 @@ namespace MediaBrowser.Controller.Entities
public string[] Studios { get; set; }
public string[] StudioIds { get; set; }
+ public string[] GenreIds { get; set; }
public ImageType[] ImageTypes { get; set; }
public VideoType[] VideoTypes { get; set; }
+ public UnratedItem[] BlockUnratedItems { get; set; }
public int[] Years { get; set; }
public string[] Tags { get; set; }
public string[] OfficialRatings { get; set; }
+ public DateTime? MinPremiereDate { get; set; }
public DateTime? MinStartDate { get; set; }
public DateTime? MaxStartDate { get; set; }
public DateTime? MinEndDate { get; set; }
@@ -101,9 +105,13 @@ namespace MediaBrowser.Controller.Entities
public LocationType? LocationType { get; set; }
public Guid? ParentId { get; set; }
+ public string[] AncestorIds { get; set; }
+
+ public LocationType[] ExcludeLocationTypes { get; set; }
public InternalItemsQuery()
{
+ BlockUnratedItems = new UnratedItem[] { };
Tags = new string[] { };
OfficialRatings = new string[] { };
SortBy = new string[] { };
@@ -113,6 +121,7 @@ namespace MediaBrowser.Controller.Entities
Genres = new string[] { };
Studios = new string[] { };
StudioIds = new string[] { };
+ GenreIds = new string[] { };
ImageTypes = new ImageType[] { };
VideoTypes = new VideoType[] { };
Years = new int[] { };
@@ -120,6 +129,20 @@ namespace MediaBrowser.Controller.Entities
PersonIds = new string[] { };
ChannelIds = new string[] { };
ItemIds = new string[] { };
+ AncestorIds = new string[] { };
+ ExcludeLocationTypes = new LocationType[] { };
+ }
+
+ public InternalItemsQuery(User user)
+ : this()
+ {
+ if (user != null)
+ {
+ var policy = user.Policy;
+ MaxParentalRating = policy.MaxParentalRating;
+
+ User = user;
+ }
}
}
}
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index 9317f688f..73fee254c 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -65,6 +65,11 @@ namespace MediaBrowser.Controller.Entities.Movies
return config.BlockUnratedItems.Contains(UnratedItem.Movie);
}
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Movie;
+ }
+
[IgnoreDataMember]
public override bool IsPreSorted
{
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index 1a8148edf..60642543f 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -159,9 +159,9 @@ namespace MediaBrowser.Controller.Entities.Movies
return itemsChanged;
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Movie);
+ return UnratedItem.Movie;
}
public MovieInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs
index b2cad02de..8a820b5ff 100644
--- a/MediaBrowser.Controller/Entities/MusicVideo.cs
+++ b/MediaBrowser.Controller/Entities/MusicVideo.cs
@@ -56,9 +56,9 @@ namespace MediaBrowser.Controller.Entities
return this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? base.CreateUserDataKey();
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Music);
+ return UnratedItem.Music;
}
public MusicVideoInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs
index 6c277da56..120a376d4 100644
--- a/MediaBrowser.Controller/Entities/Person.cs
+++ b/MediaBrowser.Controller/Entities/Person.cs
@@ -101,6 +101,15 @@ namespace MediaBrowser.Controller.Entities
return false;
}
}
+
+ [IgnoreDataMember]
+ public override bool SupportsAncestors
+ {
+ get
+ {
+ return false;
+ }
+ }
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/Photo.cs b/MediaBrowser.Controller/Entities/Photo.cs
index a3d892181..859d327b3 100644
--- a/MediaBrowser.Controller/Entities/Photo.cs
+++ b/MediaBrowser.Controller/Entities/Photo.cs
@@ -9,12 +9,10 @@ namespace MediaBrowser.Controller.Entities
{
public class Photo : BaseItem, IHasTags, IHasTaglines
{
- public List<string> Tags { get; set; }
public List<string> Taglines { get; set; }
public Photo()
{
- Tags = new List<string>();
Taglines = new List<string>();
}
@@ -70,10 +68,5 @@ namespace MediaBrowser.Controller.Entities
public double? Longitude { get; set; }
public double? Altitude { get; set; }
public int? IsoSpeedRating { get; set; }
-
- protected override bool GetBlockUnratedValue(UserPolicy config)
- {
- return config.BlockUnratedItems.Contains(UnratedItem.Other);
- }
}
}
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index 822f305ed..a55527f37 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -10,13 +10,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class Studio : BaseItem, IItemByName, IHasTags
{
- public List<string> Tags { get; set; }
-
- public Studio()
- {
- Tags = new List<string>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index 92ca9e970..86893f6d4 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -116,19 +116,6 @@ namespace MediaBrowser.Controller.Entities.TV
}
/// <summary>
- /// Our rating comes from our series
- /// </summary>
- [IgnoreDataMember]
- public override string OfficialRatingForComparison
- {
- get
- {
- var series = Series;
- return series != null ? series.OfficialRatingForComparison : base.OfficialRatingForComparison;
- }
- }
-
- /// <summary>
/// This Episode's Series Instance
/// </summary>
/// <value>The series.</value>
@@ -265,14 +252,28 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
+ public override IEnumerable<Guid> GetAncestorIds()
+ {
+ var list = base.GetAncestorIds().ToList();
+
+ var seasonId = SeasonId;
+
+ if (seasonId.HasValue && !list.Contains(seasonId.Value))
+ {
+ list.Add(seasonId.Value);
+ }
+
+ return list;
+ }
+
public override IEnumerable<string> GetDeletePaths()
{
return new[] { Path };
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Series);
+ return UnratedItem.Series;
}
public EpisodeInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 21b89d7a9..44bf1c6cc 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -6,6 +6,7 @@ using MoreLinq;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
+using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Controller.Entities.TV
{
@@ -88,19 +89,6 @@ namespace MediaBrowser.Controller.Entities.TV
}
/// <summary>
- /// Our rating comes from our series
- /// </summary>
- [IgnoreDataMember]
- public override string OfficialRatingForComparison
- {
- get
- {
- var series = Series;
- return series != null ? series.OfficialRatingForComparison : base.OfficialRatingForComparison;
- }
- }
-
- /// <summary>
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
@@ -234,6 +222,11 @@ namespace MediaBrowser.Controller.Entities.TV
return false;
}
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Series;
+ }
+
[IgnoreDataMember]
public string SeriesName
{
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index b23833845..420b3c313 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -333,6 +333,11 @@ namespace MediaBrowser.Controller.Entities.TV
return config.BlockUnratedItems.Contains(UnratedItem.Series);
}
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Series;
+ }
+
public SeriesInfo GetLookupInfo()
{
var info = GetItemLookupInfo<SeriesInfo>();
diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs
index 6ec512783..d37e2be93 100644
--- a/MediaBrowser.Controller/Entities/Trailer.cs
+++ b/MediaBrowser.Controller/Entities/Trailer.cs
@@ -97,9 +97,9 @@ namespace MediaBrowser.Controller.Entities
return base.CreateUserDataKey();
}
- protected override bool GetBlockUnratedValue(UserPolicy config)
+ public override UnratedItem GetBlockUnratedType()
{
- return config.BlockUnratedItems.Contains(UnratedItem.Trailer);
+ return UnratedItem.Trailer;
}
public TrailerInfo GetLookupInfo()
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index a9e314ede..3900f0805 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -58,6 +58,26 @@ namespace MediaBrowser.Controller.Entities
}
}
+ private string _name;
+ /// <summary>
+ /// Gets or sets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ public override string Name
+ {
+ get
+ {
+ return _name;
+ }
+ set
+ {
+ _name = value;
+
+ // lazy load this again
+ SortName = null;
+ }
+ }
+
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index a78beb645..b7946cb92 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -55,13 +55,21 @@ namespace MediaBrowser.Controller.Entities
}
}
+ protected override IEnumerable<BaseItem> GetEligibleChildrenForRecursiveChildren(User user)
+ {
+ var list = base.GetEligibleChildrenForRecursiveChildren(user).ToList();
+ list.AddRange(LibraryManager.RootFolder.VirtualChildren);
+
+ return list;
+ }
+
/// <summary>
/// Get the children of this folder from the actual file system
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
{
- return base.GetNonCachedChildren(directoryService).Concat(LibraryManager.RootFolder.VirtualChildren);
+ return base.GetNonCachedChildren(directoryService);
}
public override bool BeforeMetadataRefresh()
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index 5ee49ae5a..c5b65f5a8 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -6,6 +6,7 @@ using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Threading.Tasks;
+using System.Linq;
namespace MediaBrowser.Controller.Entities
{
@@ -24,6 +25,21 @@ namespace MediaBrowser.Controller.Entities
{
return true;
}
+
+ public override IEnumerable<Guid> GetIdsForAncestorQuery()
+ {
+ var list = new List<Guid>();
+
+ if (DisplayParentId != Guid.Empty)
+ {
+ list.Add(DisplayParentId);
+ }
+ else if (ParentId != Guid.Empty)
+ {
+ list.Add(ParentId);
+ }
+ return list;
+ }
public override Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
{
@@ -90,7 +106,9 @@ namespace MediaBrowser.Controller.Entities
CollectionType.Photos,
CollectionType.Playlists,
CollectionType.BoxSets,
- CollectionType.MusicVideos
+ CollectionType.MusicVideos,
+ CollectionType.Games,
+ CollectionType.Music
};
var collectionFolder = folder as ICollectionFolder;
@@ -121,6 +139,13 @@ namespace MediaBrowser.Controller.Entities
return standaloneTypes.Contains(collectionFolder.CollectionType ?? string.Empty);
}
+ public static bool IsEligibleForEnhancedView(string viewType)
+ {
+ var types = new[] { CollectionType.Movies, CollectionType.TvShows };
+
+ return types.Contains(viewType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
+ }
+
[IgnoreDataMember]
public override bool SupportsPeople
{
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index f5800ce81..5778396cb 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -120,26 +120,22 @@ namespace MediaBrowser.Controller.Entities
return await GetLiveTvView(queryParent, user, query).ConfigureAwait(false);
}
+ case CollectionType.Photos:
case CollectionType.Books:
case CollectionType.HomeVideos:
+ case CollectionType.Games:
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);
- case CollectionType.Photos:
- return await GetPhotosView(queryParent, user, query).ConfigureAwait(false);
-
case CollectionType.TvShows:
return await GetTvView(queryParent, user, query).ConfigureAwait(false);
@@ -1061,6 +1057,11 @@ namespace MediaBrowser.Controller.Entities
return false;
}
+ if (request.GenreIds.Length > 0)
+ {
+ return false;
+ }
+
if (request.VideoTypes.Length > 0)
{
return false;
@@ -1657,6 +1658,16 @@ namespace MediaBrowser.Controller.Entities
return false;
}
+ // Apply genre filter
+ if (query.GenreIds.Length > 0 && !query.GenreIds.Any(id =>
+ {
+ var genreItem = libraryManager.GetItemById(id);
+ return genreItem != null && item.Genres.Contains(genreItem.Name, StringComparer.OrdinalIgnoreCase);
+ }))
+ {
+ return false;
+ }
+
// Apply year filter
if (query.Years.Length > 0)
{
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 8beee79bf..62d1bc7a1 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -186,12 +186,6 @@ namespace MediaBrowser.Controller.Entities
public string ShortcutPath { get; set; }
/// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
- /// <summary>
/// Gets or sets the video bit rate.
/// </summary>
/// <value>The video bit rate.</value>