aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs17
-rw-r--r--MediaBrowser.Controller/Entities/BasePluginFolder.cs5
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs8
-rw-r--r--MediaBrowser.Controller/Entities/LinkedChild.cs9
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs12
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs9
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs9
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs1
-rw-r--r--MediaBrowser.Controller/Library/TVUtils.cs2
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj3
-rw-r--r--MediaBrowser.Controller/Playlists/IPlaylistManager.cs47
-rw-r--r--MediaBrowser.Controller/Playlists/Playlist.cs87
-rw-r--r--MediaBrowser.Controller/Playlists/PlaylistCreationOptions.cs20
-rw-r--r--MediaBrowser.Controller/Providers/BaseItemXmlParser.cs61
14 files changed, 279 insertions, 11 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 2bdbab084..a476f555f 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1006,6 +1006,18 @@ namespace MediaBrowser.Controller.Entities
private BaseItem FindLinkedChild(LinkedChild info)
{
+ if (!string.IsNullOrWhiteSpace(info.ItemName))
+ {
+ if (string.Equals(info.ItemType, "musicgenre", StringComparison.OrdinalIgnoreCase))
+ {
+ return LibraryManager.GetMusicGenre(info.ItemName);
+ }
+ if (string.Equals(info.ItemType, "musicartist", StringComparison.OrdinalIgnoreCase))
+ {
+ return LibraryManager.GetArtist(info.ItemName);
+ }
+ }
+
if (!string.IsNullOrEmpty(info.Path))
{
var itemByPath = LibraryManager.RootFolder.FindByPath(info.Path);
@@ -1028,7 +1040,10 @@ namespace MediaBrowser.Controller.Entities
{
if (info.ItemYear.HasValue)
{
- return info.ItemYear.Value == (i.ProductionYear ?? -1);
+ if (info.ItemYear.Value != (i.ProductionYear ?? -1))
+ {
+ return false;
+ }
}
return true;
}
diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
index fa2b49a60..b30bd81b9 100644
--- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs
+++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
@@ -7,11 +7,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public abstract class BasePluginFolder : Folder, ICollectionFolder, IByReferenceItem
{
- protected BasePluginFolder()
- {
- DisplayMediaType = "CollectionFolder";
- }
-
public virtual string CollectionType
{
get { return null; }
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 12afe26b6..2013b926c 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -38,6 +38,12 @@ namespace MediaBrowser.Controller.Entities
Tags = new List<string>();
}
+ [IgnoreDataMember]
+ public virtual bool IsPreSorted
+ {
+ get { return false; }
+ }
+
/// <summary>
/// Gets a value indicating whether this instance is folder.
/// </summary>
@@ -855,7 +861,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="includeLinkedChildren">if set to <c>true</c> [include linked children].</param>
/// <returns>IEnumerable{BaseItem}.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
- public IEnumerable<BaseItem> GetRecursiveChildren(User user, bool includeLinkedChildren = true)
+ public virtual IEnumerable<BaseItem> GetRecursiveChildren(User user, bool includeLinkedChildren = true)
{
if (user == null)
{
diff --git a/MediaBrowser.Controller/Entities/LinkedChild.cs b/MediaBrowser.Controller/Entities/LinkedChild.cs
index 1ae04e40f..c77fe18c4 100644
--- a/MediaBrowser.Controller/Entities/LinkedChild.cs
+++ b/MediaBrowser.Controller/Entities/LinkedChild.cs
@@ -18,6 +18,15 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
[IgnoreDataMember]
public Guid? ItemId { get; set; }
+
+ public static LinkedChild Create(BaseItem item)
+ {
+ return new LinkedChild
+ {
+ Path = item.Path,
+ Type = LinkedChildType.Manual
+ };
+ }
}
public enum LinkedChildType
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index 0d2be9f74..5e6bd9707 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Progress;
+using System.Runtime.Serialization;
+using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
@@ -58,6 +59,15 @@ namespace MediaBrowser.Controller.Entities.Movies
return config.BlockUnratedItems.Contains(UnratedItem.Movie);
}
+ [IgnoreDataMember]
+ public override bool IsPreSorted
+ {
+ get
+ {
+ return true;
+ }
+ }
+
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
{
var children = base.GetChildren(user, includeLinkedChildren);
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index cf39cda89..3977d869c 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -29,6 +29,15 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
+ [IgnoreDataMember]
+ public override bool IsPreSorted
+ {
+ get
+ {
+ return true;
+ }
+ }
+
/// <summary>
/// We want to group into our Series
/// </summary>
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 9c2ed27bb..27ca8b18d 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -39,6 +39,15 @@ namespace MediaBrowser.Controller.Entities.TV
DisplaySpecialsWithSeasons = true;
}
+ [IgnoreDataMember]
+ public override bool IsPreSorted
+ {
+ get
+ {
+ return true;
+ }
+ }
+
public bool DisplaySpecialsWithSeasons { get; set; }
public List<Guid> LocalTrailerIds { get; set; }
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index f8ca56fa8..34ca85d1d 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
-using MoreLinq;
using System;
using System.Collections.Generic;
using System.Linq;
diff --git a/MediaBrowser.Controller/Library/TVUtils.cs b/MediaBrowser.Controller/Library/TVUtils.cs
index 5e43eb644..541dfd226 100644
--- a/MediaBrowser.Controller/Library/TVUtils.cs
+++ b/MediaBrowser.Controller/Library/TVUtils.cs
@@ -303,8 +303,6 @@ namespace MediaBrowser.Controller.Library
}
else
{
- logger.Debug("Evaluating series file: {0}", child.FullName);
-
var fullName = child.FullName;
if (EntityResolutionHelper.IsVideoFile(fullName) || EntityResolutionHelper.IsVideoPlaceHolder(fullName))
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index aee118f9a..b4b7b3650 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -217,6 +217,9 @@
<Compile Include="Notifications\UserNotification.cs" />
<Compile Include="Persistence\IFileOrganizationRepository.cs" />
<Compile Include="Persistence\MediaStreamQuery.cs" />
+ <Compile Include="Playlists\IPlaylistManager.cs" />
+ <Compile Include="Playlists\Playlist.cs" />
+ <Compile Include="Playlists\PlaylistCreationOptions.cs" />
<Compile Include="Providers\DirectoryService.cs" />
<Compile Include="Providers\ICustomMetadataProvider.cs" />
<Compile Include="Providers\IExternalId.cs" />
diff --git a/MediaBrowser.Controller/Playlists/IPlaylistManager.cs b/MediaBrowser.Controller/Playlists/IPlaylistManager.cs
new file mode 100644
index 000000000..2923c11c5
--- /dev/null
+++ b/MediaBrowser.Controller/Playlists/IPlaylistManager.cs
@@ -0,0 +1,47 @@
+using MediaBrowser.Controller.Entities;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Playlists
+{
+ public interface IPlaylistManager
+ {
+ /// <summary>
+ /// Gets the playlists.
+ /// </summary>
+ /// <param name="userId">The user identifier.</param>
+ /// <returns>IEnumerable&lt;Playlist&gt;.</returns>
+ IEnumerable<Playlist> GetPlaylists(string userId);
+
+ /// <summary>
+ /// Creates the playlist.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task&lt;Playlist&gt;.</returns>
+ Task<Playlist> CreatePlaylist(PlaylistCreationOptions options);
+
+ /// <summary>
+ /// Adds to playlist.
+ /// </summary>
+ /// <param name="playlistId">The playlist identifier.</param>
+ /// <param name="itemIds">The item ids.</param>
+ /// <returns>Task.</returns>
+ Task AddToPlaylist(string playlistId, IEnumerable<string> itemIds);
+
+ /// <summary>
+ /// Removes from playlist.
+ /// </summary>
+ /// <param name="playlistId">The playlist identifier.</param>
+ /// <param name="indeces">The indeces.</param>
+ /// <returns>Task.</returns>
+ Task RemoveFromPlaylist(string playlistId, IEnumerable<int> indeces);
+
+ /// <summary>
+ /// Gets the playlists folder.
+ /// </summary>
+ /// <param name="userId">The user identifier.</param>
+ /// <returns>Folder.</returns>
+ Folder GetPlaylistsFolder(string userId);
+
+ }
+}
diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs
new file mode 100644
index 000000000..5ea535f4d
--- /dev/null
+++ b/MediaBrowser.Controller/Playlists/Playlist.cs
@@ -0,0 +1,87 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Querying;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+
+namespace MediaBrowser.Controller.Playlists
+{
+ public class Playlist : Folder
+ {
+ public string OwnerUserId { get; set; }
+
+ public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
+ {
+ return GetPlayableItems(user);
+ }
+
+ public override IEnumerable<BaseItem> GetRecursiveChildren(User user, bool includeLinkedChildren = true)
+ {
+ return GetPlayableItems(user);
+ }
+
+ public IEnumerable<BaseItem> GetManageableItems()
+ {
+ return GetLinkedChildren();
+ }
+
+ private IEnumerable<BaseItem> GetPlayableItems(User user)
+ {
+ return GetPlaylistItems(MediaType, base.GetChildren(user, true), user);
+ }
+
+ public static IEnumerable<BaseItem> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user)
+ {
+ return inputItems.SelectMany(i =>
+ {
+ var folder = i as Folder;
+
+ if (folder != null)
+ {
+ var items = folder.GetRecursiveChildren(user, true)
+ .Where(m => !m.IsFolder && string.Equals(m.MediaType, playlistMediaType, StringComparison.OrdinalIgnoreCase));
+
+ if (!folder.IsPreSorted)
+ {
+ items = LibraryManager.Sort(items, user, new[] { ItemSortBy.SortName }, SortOrder.Ascending);
+ }
+
+ return items;
+ }
+
+ return new[] { i };
+ });
+ }
+
+ [IgnoreDataMember]
+ public override bool IsPreSorted
+ {
+ get
+ {
+ return true;
+ }
+ }
+
+ public string PlaylistMediaType { get; set; }
+
+ public override string MediaType
+ {
+ get
+ {
+ return PlaylistMediaType;
+ }
+ }
+
+ public void SetMediaType(string value)
+ {
+ PlaylistMediaType = value;
+ }
+
+ public override bool IsVisible(User user)
+ {
+ return base.IsVisible(user) && string.Equals(user.Id.ToString("N"), OwnerUserId);
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/Playlists/PlaylistCreationOptions.cs b/MediaBrowser.Controller/Playlists/PlaylistCreationOptions.cs
new file mode 100644
index 000000000..1766ba75c
--- /dev/null
+++ b/MediaBrowser.Controller/Playlists/PlaylistCreationOptions.cs
@@ -0,0 +1,20 @@
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Playlists
+{
+ public class PlaylistCreationOptions
+ {
+ public string Name { get; set; }
+
+ public List<string> ItemIdList { get; set; }
+
+ public string MediaType { get; set; }
+
+ public string UserId { get; set; }
+
+ public PlaylistCreationOptions()
+ {
+ ItemIdList = new List<string>();
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
index 3cb90d360..06d738297 100644
--- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
+++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
@@ -1283,6 +1283,67 @@ namespace MediaBrowser.Controller.Providers
return new[] { personInfo };
}
+ protected LinkedChild GetLinkedChild(XmlReader reader)
+ {
+ reader.MoveToContent();
+
+ var linkedItem = new LinkedChild
+ {
+ Type = LinkedChildType.Manual
+ };
+
+ while (reader.Read())
+ {
+ if (reader.NodeType == XmlNodeType.Element)
+ {
+ switch (reader.Name)
+ {
+ case "Name":
+ {
+ linkedItem.ItemName = reader.ReadElementContentAsString();
+ break;
+ }
+
+ case "Path":
+ {
+ linkedItem.Path = reader.ReadElementContentAsString();
+ break;
+ }
+
+ case "Type":
+ {
+ linkedItem.ItemType = reader.ReadElementContentAsString();
+ break;
+ }
+
+ case "Year":
+ {
+ var val = reader.ReadElementContentAsString();
+
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ int rval;
+
+ if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
+ {
+ linkedItem.ItemYear = rval;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ reader.Skip();
+ break;
+ }
+ }
+ }
+
+ return string.IsNullOrWhiteSpace(linkedItem.ItemName) || string.IsNullOrWhiteSpace(linkedItem.ItemType) ? null : linkedItem;
+ }
+
+
/// <summary>
/// Used to split names of comma or pipe delimeted genres and people
/// </summary>