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.cs18
-rw-r--r--MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs20
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs21
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs32
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs5
-rw-r--r--MediaBrowser.Controller/Entities/IArchivable.cs8
-rw-r--r--MediaBrowser.Controller/Entities/IHasImages.cs6
-rw-r--r--MediaBrowser.Controller/Entities/IHasMediaSources.cs54
-rw-r--r--MediaBrowser.Controller/Entities/IHasOriginalTitle.cs8
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs6
-rw-r--r--MediaBrowser.Controller/Entities/ItemImageInfo.cs12
-rw-r--r--MediaBrowser.Controller/Entities/LinkedChild.cs1
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs4
-rw-r--r--MediaBrowser.Controller/Entities/MusicVideo.cs10
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs5
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs16
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs75
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs21
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>();