aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorTim Hobbs <jesus.tesh@gmail.com>2014-03-13 06:26:20 -0700
committerTim Hobbs <jesus.tesh@gmail.com>2014-03-13 06:26:20 -0700
commit9e33966ee120134d89f7aa21204b7ffc814dd29a (patch)
tree297982b6cd4269ada15d93cec859b7cba27c0c1a /MediaBrowser.Controller
parentdd4a1ff4b50f58c27af223202454f80d45de4af1 (diff)
parentb7bcc2450694105de9f9fc8cc07d2cfc4d9d7c96 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Channels/ChannelItemInfo.cs67
-rw-r--r--MediaBrowser.Controller/Channels/IChannel.cs59
-rw-r--r--MediaBrowser.Controller/Channels/IChannelManager.cs12
-rw-r--r--MediaBrowser.Controller/Collections/CollectionCreationOptions.cs22
-rw-r--r--MediaBrowser.Controller/Collections/ICollectionManager.cs32
-rw-r--r--MediaBrowser.Controller/Dto/IDtoService.cs21
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs18
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs11
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicGenre.cs18
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs13
-rw-r--r--MediaBrowser.Controller/Entities/BasePluginFolder.cs15
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs70
-rw-r--r--MediaBrowser.Controller/Entities/GameGenre.cs17
-rw-r--r--MediaBrowser.Controller/Entities/Genre.cs18
-rw-r--r--MediaBrowser.Controller/Entities/IHasImages.cs6
-rw-r--r--MediaBrowser.Controller/Entities/IItemByName.cs38
-rw-r--r--MediaBrowser.Controller/Entities/LinkedChild.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Person.cs17
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs18
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs3
-rw-r--r--MediaBrowser.Controller/Entities/Year.cs29
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs13
-rw-r--r--MediaBrowser.Controller/Library/IUserManager.cs3
-rw-r--r--MediaBrowser.Controller/Library/TVUtils.cs160
-rw-r--r--MediaBrowser.Controller/LiveTv/ILiveTvManager.cs7
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvChannel.cs15
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj5
-rw-r--r--MediaBrowser.Controller/Net/IHttpResultFactory.cs12
-rw-r--r--MediaBrowser.Controller/Providers/DirectoryService.cs30
-rw-r--r--MediaBrowser.Controller/Providers/ILocalImageProvider.cs2
-rw-r--r--MediaBrowser.Controller/Session/ISessionManager.cs7
31 files changed, 490 insertions, 278 deletions
diff --git a/MediaBrowser.Controller/Channels/ChannelItemInfo.cs b/MediaBrowser.Controller/Channels/ChannelItemInfo.cs
new file mode 100644
index 000000000..496fbfbf4
--- /dev/null
+++ b/MediaBrowser.Controller/Channels/ChannelItemInfo.cs
@@ -0,0 +1,67 @@
+using MediaBrowser.Controller.Entities;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Channels
+{
+ public class ChannelItemInfo
+ {
+ public string Name { get; set; }
+
+ public string Id { get; set; }
+
+ public ChannelItemType Type { get; set; }
+
+ public string OfficialRating { get; set; }
+
+ public string Overview { get; set; }
+
+ public List<string> Genres { get; set; }
+
+ public List<PersonInfo> People { get; set; }
+
+ public float? CommunityRating { get; set; }
+
+ public long? RunTimeTicks { get; set; }
+
+ public bool IsInfinite { get; set; }
+
+ public string ImageUrl { get; set; }
+
+ public ChannelMediaType MediaType { get; set; }
+
+ public ChannelMediaContentType ContentType { get; set; }
+
+ public ChannelItemInfo()
+ {
+ Genres = new List<string>();
+ People = new List<PersonInfo>();
+ }
+ }
+
+ public enum ChannelItemType
+ {
+ Media = 0,
+
+ Category = 1
+ }
+
+ public enum ChannelMediaType
+ {
+ Audio = 0,
+
+ Video = 1
+ }
+
+ public enum ChannelMediaContentType
+ {
+ Clip = 0,
+
+ Podcast = 1,
+
+ Trailer = 2,
+
+ Movie = 3,
+
+ Episode = 4
+ }
+}
diff --git a/MediaBrowser.Controller/Channels/IChannel.cs b/MediaBrowser.Controller/Channels/IChannel.cs
new file mode 100644
index 000000000..ba1bd4083
--- /dev/null
+++ b/MediaBrowser.Controller/Channels/IChannel.cs
@@ -0,0 +1,59 @@
+using MediaBrowser.Controller.Entities;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Channels
+{
+ public interface IChannel
+ {
+ /// <summary>
+ /// Gets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ string Name { get; }
+
+ /// <summary>
+ /// Gets the home page URL.
+ /// </summary>
+ /// <value>The home page URL.</value>
+ string HomePageUrl { get; }
+
+ /// <summary>
+ /// Gets the capabilities.
+ /// </summary>
+ /// <returns>ChannelCapabilities.</returns>
+ ChannelCapabilities GetCapabilities();
+
+ /// <summary>
+ /// Searches the specified search term.
+ /// </summary>
+ /// <param name="searchTerm">The search term.</param>
+ /// <param name="user">The user.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task{IEnumerable{ChannelItemInfo}}.</returns>
+ Task<IEnumerable<ChannelItemInfo>> Search(string searchTerm, User user, CancellationToken cancellationToken);
+
+ /// <summary>
+ /// Gets the channel items.
+ /// </summary>
+ /// <param name="user">The user.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task{IEnumerable{ChannelItem}}.</returns>
+ Task<IEnumerable<ChannelItemInfo>> GetChannelItems(User user, CancellationToken cancellationToken);
+
+ /// <summary>
+ /// Gets the channel items.
+ /// </summary>
+ /// <param name="categoryId">The category identifier.</param>
+ /// <param name="user">The user.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>Task{IEnumerable{ChannelItem}}.</returns>
+ Task<IEnumerable<ChannelItemInfo>> GetChannelItems(string categoryId, User user, CancellationToken cancellationToken);
+ }
+
+ public class ChannelCapabilities
+ {
+ public bool CanSearch { get; set; }
+ }
+}
diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs
new file mode 100644
index 000000000..561ab555b
--- /dev/null
+++ b/MediaBrowser.Controller/Channels/IChannelManager.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Channels
+{
+ public interface IChannelManager
+ {
+ }
+}
diff --git a/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs b/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs
new file mode 100644
index 000000000..e147e0905
--- /dev/null
+++ b/MediaBrowser.Controller/Collections/CollectionCreationOptions.cs
@@ -0,0 +1,22 @@
+using MediaBrowser.Model.Entities;
+using System;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Controller.Collections
+{
+ public class CollectionCreationOptions : IHasProviderIds
+ {
+ public string Name { get; set; }
+
+ public Guid? ParentId { get; set; }
+
+ public bool IsLocked { get; set; }
+
+ public Dictionary<string, string> ProviderIds { get; set; }
+
+ public CollectionCreationOptions()
+ {
+ ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/Collections/ICollectionManager.cs b/MediaBrowser.Controller/Collections/ICollectionManager.cs
new file mode 100644
index 000000000..d7bc178ad
--- /dev/null
+++ b/MediaBrowser.Controller/Collections/ICollectionManager.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Collections
+{
+ public interface ICollectionManager
+ {
+ /// <summary>
+ /// Creates the collection.
+ /// </summary>
+ /// <param name="options">The options.</param>
+ /// <returns>Task.</returns>
+ Task CreateCollection(CollectionCreationOptions options);
+
+ /// <summary>
+ /// Adds to collection.
+ /// </summary>
+ /// <param name="collectionId">The collection identifier.</param>
+ /// <param name="itemIds">The item ids.</param>
+ /// <returns>Task.</returns>
+ Task AddToCollection(Guid collectionId, IEnumerable<Guid> itemIds);
+
+ /// <summary>
+ /// Removes from collection.
+ /// </summary>
+ /// <param name="collectionId">The collection identifier.</param>
+ /// <param name="itemIds">The item ids.</param>
+ /// <returns>Task.</returns>
+ Task RemoveFromCollection(Guid collectionId, IEnumerable<Guid> itemIds);
+ }
+}
diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs
index fd5ccac5b..606b51628 100644
--- a/MediaBrowser.Controller/Dto/IDtoService.cs
+++ b/MediaBrowser.Controller/Dto/IDtoService.cs
@@ -73,5 +73,26 @@ namespace MediaBrowser.Controller.Dto
/// <param name="owner">The owner.</param>
/// <returns>Task{BaseItemDto}.</returns>
BaseItemDto GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null);
+
+ /// <summary>
+ /// Gets the item by name dto.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="fields">The fields.</param>
+ /// <param name="user">The user.</param>
+ /// <returns>BaseItemDto.</returns>
+ BaseItemDto GetItemByNameDto<T>(T item, List<ItemFields> fields, User user = null)
+ where T : BaseItem, IItemByName;
+
+ /// <summary>
+ /// Gets the item by name dto.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="fields">The fields.</param>
+ /// <param name="taggedItems">The tagged items.</param>
+ /// <param name="user">The user.</param>
+ /// <returns>BaseItemDto.</returns>
+ BaseItemDto GetItemByNameDto<T>(T item, List<ItemFields> fields, List<BaseItem> taggedItems, User user = null)
+ where T : BaseItem, IItemByName;
}
}
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 73e276f3b..8eb6236d1 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -66,6 +66,24 @@ namespace MediaBrowser.Controller.Entities.Audio
/// <value>The artist.</value>
public List<string> Artists { get; set; }
+ [IgnoreDataMember]
+ public List<string> AllArtists
+ {
+ get
+ {
+ var list = new List<string>();
+
+ if (!string.IsNullOrEmpty(AlbumArtist))
+ {
+ list.Add(AlbumArtist);
+ }
+ list.AddRange(Artists);
+
+ return list;
+
+ }
+ }
+
/// <summary>
/// Gets or sets the album.
/// </summary>
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 11cf441f7..0a5d8eec0 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -1,12 +1,10 @@
using MediaBrowser.Common.Progress;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
@@ -17,9 +15,6 @@ namespace MediaBrowser.Controller.Entities.Audio
/// </summary>
public class MusicArtist : Folder, IMetadataContainer, IItemByName, IHasMusicGenres, IHasDualAccess, IHasTags, IHasProductionLocations, IHasLookupInfo<ArtistInfo>
{
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
public bool IsAccessedByName { get; set; }
/// <summary>
@@ -65,7 +60,6 @@ namespace MediaBrowser.Controller.Entities.Audio
public MusicArtist()
{
- UserItemCountList = new List<ItemByNameCounts>();
Tags = new List<string>();
ProductionLocations = new List<string>();
}
@@ -230,5 +224,10 @@ namespace MediaBrowser.Controller.Entities.Audio
return info;
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return inputItems.OfType<IHasArtist>().Where(i => i.HasArtist(Name)).Cast<BaseItem>();
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
index 5e1d4c3c9..bce9da4d1 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
@@ -1,7 +1,6 @@
-using System.Runtime.Serialization;
-using MediaBrowser.Model.Dto;
-using System;
+using System;
using System.Collections.Generic;
+using System.Linq;
namespace MediaBrowser.Controller.Entities.Audio
{
@@ -10,11 +9,6 @@ namespace MediaBrowser.Controller.Entities.Audio
/// </summary>
public class MusicGenre : BaseItem, IItemByName
{
- public MusicGenre()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
@@ -24,9 +18,6 @@ namespace MediaBrowser.Controller.Entities.Audio
return "MusicGenre-" + Name;
}
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
@@ -51,5 +42,10 @@ namespace MediaBrowser.Controller.Entities.Audio
return false;
}
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return inputItems.Where(i => (i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase));
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 923673bd8..23f8ac31a 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -125,6 +125,15 @@ namespace MediaBrowser.Controller.Entities
}
[IgnoreDataMember]
+ public virtual bool IsHidden
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ [IgnoreDataMember]
public virtual bool IsOwnedItem
{
get
@@ -1175,7 +1184,7 @@ namespace MediaBrowser.Controller.Entities
return GetImageInfo(type, imageIndex) != null;
}
- public void SetImagePath(ImageType type, int index, FileInfo file)
+ public void SetImagePath(ImageType type, int index, FileSystemInfo file)
{
if (type == ImageType.Chapter)
{
@@ -1330,7 +1339,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="images">The images.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
/// <exception cref="System.ArgumentException">Cannot call AddImages with chapter images</exception>
- public bool AddImages(ImageType imageType, IEnumerable<FileInfo> images)
+ public bool AddImages(ImageType imageType, IEnumerable<FileSystemInfo> images)
{
if (imageType == ImageType.Chapter)
{
diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
index 8f7071000..29d66718c 100644
--- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs
+++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Model.Entities;
-
+
namespace MediaBrowser.Controller.Entities
{
/// <summary>
@@ -8,18 +7,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public abstract class BasePluginFolder : Folder, ICollectionFolder, IByReferenceItem
{
- /// <summary>
- /// Gets or sets the type of the location.
- /// </summary>
- /// <value>The type of the location.</value>
- public override LocationType LocationType
- {
- get
- {
- return LocationType.Virtual;
- }
- }
-
protected BasePluginFolder()
{
DisplayMediaType = "CollectionFolder";
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 627f657ab..ee371680e 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -264,7 +264,7 @@ namespace MediaBrowser.Controller.Entities
[IgnoreDataMember]
public IEnumerable<BaseItem> Children
{
- get { return ActualChildren; }
+ get { return ActualChildren.Where(i => !i.IsHidden); }
}
/// <summary>
@@ -745,9 +745,9 @@ namespace MediaBrowser.Controller.Entities
var list = new List<BaseItem>();
- AddChildrenToList(user, includeLinkedChildren, list, false, null);
+ var hasLinkedChildren = AddChildrenToList(user, includeLinkedChildren, list, false, null);
- return list;
+ return hasLinkedChildren ? list.DistinctBy(i => i.Id).ToList() : list;
}
/// <summary>
@@ -905,13 +905,6 @@ namespace MediaBrowser.Controller.Entities
/// <returns>BaseItem.</returns>
private BaseItem GetLinkedChild(LinkedChild info)
{
- if (string.IsNullOrEmpty(info.Path))
- {
- throw new ArgumentException("Encountered linked child with empty path.");
- }
-
- BaseItem item = null;
-
// First get using the cached Id
if (info.ItemId.HasValue)
{
@@ -920,20 +913,19 @@ namespace MediaBrowser.Controller.Entities
return null;
}
- item = LibraryManager.GetItemById(info.ItemId.Value);
- }
+ var itemById = LibraryManager.GetItemById(info.ItemId.Value);
- // If still null, search by path
- if (item == null)
- {
- item = LibraryManager.RootFolder.FindByPath(info.Path);
+ if (itemById != null)
+ {
+ return itemById;
+ }
}
+ var item = FindLinkedChild(info);
+
// If still null, log
if (item == null)
{
- Logger.Warn("Unable to find linked item at {0}", info.Path);
-
// Don't keep searching over and over
info.ItemId = Guid.Empty;
}
@@ -946,6 +938,43 @@ namespace MediaBrowser.Controller.Entities
return item;
}
+ private BaseItem FindLinkedChild(LinkedChild info)
+ {
+ if (!string.IsNullOrEmpty(info.Path))
+ {
+ var itemByPath = LibraryManager.RootFolder.FindByPath(info.Path);
+
+ if (itemByPath == null)
+ {
+ Logger.Warn("Unable to find linked item at path {0}", info.Path);
+ }
+
+ return itemByPath;
+ }
+
+ if (!string.IsNullOrWhiteSpace(info.ItemName) && !string.IsNullOrWhiteSpace(info.ItemType))
+ {
+ return LibraryManager.RootFolder.RecursiveChildren.FirstOrDefault(i =>
+ {
+ if (string.Equals(i.Name, info.ItemName, StringComparison.OrdinalIgnoreCase))
+ {
+ if (string.Equals(i.GetType().Name, info.ItemType, StringComparison.OrdinalIgnoreCase))
+ {
+ if (info.ItemYear.HasValue)
+ {
+ return info.ItemYear.Value == (i.ProductionYear ?? -1);
+ }
+ return true;
+ }
+ }
+
+ return false;
+ });
+ }
+
+ return null;
+ }
+
protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemInfo> fileSystemChildren, CancellationToken cancellationToken)
{
var changesFound = false;
@@ -1106,5 +1135,10 @@ namespace MediaBrowser.Controller.Entities
return GetRecursiveChildren(user).Where(i => !i.IsFolder && i.LocationType != LocationType.Virtual)
.All(i => i.IsUnplayed(user));
}
+
+ public IEnumerable<BaseItem> GetHiddenChildren()
+ {
+ return ActualChildren.Where(i => i.IsHidden);
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs
index 3a3c575cd..825468954 100644
--- a/MediaBrowser.Controller/Entities/GameGenre.cs
+++ b/MediaBrowser.Controller/Entities/GameGenre.cs
@@ -1,16 +1,11 @@
-using MediaBrowser.Model.Dto;
+using System;
using System.Collections.Generic;
-using System.Runtime.Serialization;
+using System.Linq;
namespace MediaBrowser.Controller.Entities
{
public class GameGenre : BaseItem, IItemByName
{
- public GameGenre()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
@@ -20,9 +15,6 @@ namespace MediaBrowser.Controller.Entities
return "GameGenre-" + Name;
}
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
@@ -47,5 +39,10 @@ namespace MediaBrowser.Controller.Entities
return false;
}
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return inputItems.Where(i => (i is Game) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase));
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs
index c15ca0aa2..05442f2b7 100644
--- a/MediaBrowser.Controller/Entities/Genre.cs
+++ b/MediaBrowser.Controller/Entities/Genre.cs
@@ -1,6 +1,7 @@
-using MediaBrowser.Model.Dto;
+using MediaBrowser.Controller.Entities.Audio;
+using System;
using System.Collections.Generic;
-using System.Runtime.Serialization;
+using System.Linq;
namespace MediaBrowser.Controller.Entities
{
@@ -9,11 +10,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class Genre : BaseItem, IItemByName
{
- public Genre()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
@@ -23,9 +19,6 @@ namespace MediaBrowser.Controller.Entities
return "Genre-" + Name;
}
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
@@ -50,5 +43,10 @@ namespace MediaBrowser.Controller.Entities
return false;
}
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return inputItems.Where(i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase));
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs
index 8e66605dd..bac226369 100644
--- a/MediaBrowser.Controller/Entities/IHasImages.cs
+++ b/MediaBrowser.Controller/Entities/IHasImages.cs
@@ -62,7 +62,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="type">The type.</param>
/// <param name="index">The index.</param>
/// <param name="file">The file.</param>
- void SetImagePath(ImageType type, int index, FileInfo file);
+ void SetImagePath(ImageType type, int index, FileSystemInfo file);
/// <summary>
/// Determines whether the specified type has image.
@@ -129,7 +129,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="imageType">Type of the image.</param>
/// <param name="images">The images.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
- bool AddImages(ImageType imageType, IEnumerable<FileInfo> images);
+ bool AddImages(ImageType imageType, IEnumerable<FileSystemInfo> images);
/// <summary>
/// Determines whether [is save local metadata enabled].
@@ -180,7 +180,7 @@ namespace MediaBrowser.Controller.Entities
/// <param name="item">The item.</param>
/// <param name="imageType">Type of the image.</param>
/// <param name="file">The file.</param>
- public static void SetImagePath(this IHasImages item, ImageType imageType, FileInfo file)
+ public static void SetImagePath(this IHasImages item, ImageType imageType, FileSystemInfo file)
{
item.SetImagePath(imageType, 0, file);
}
diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs
index 1e83c7466..70d5b840f 100644
--- a/MediaBrowser.Controller/Entities/IItemByName.cs
+++ b/MediaBrowser.Controller/Entities/IItemByName.cs
@@ -1,7 +1,4 @@
-using MediaBrowser.Model.Dto;
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Collections.Generic;
namespace MediaBrowser.Controller.Entities
{
@@ -10,37 +7,16 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public interface IItemByName
{
- List<ItemByNameCounts> UserItemCountList { get; set; }
+ /// <summary>
+ /// Gets the tagged items.
+ /// </summary>
+ /// <param name="inputItems">The input items.</param>
+ /// <returns>IEnumerable{BaseItem}.</returns>
+ IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems);
}
public interface IHasDualAccess : IItemByName
{
bool IsAccessedByName { get; }
}
-
- public static class ItemByNameExtensions
- {
- public static ItemByNameCounts GetItemByNameCounts(this IItemByName item, Guid userId)
- {
- if (userId == Guid.Empty)
- {
- throw new ArgumentNullException("userId");
- }
-
- return item.UserItemCountList.FirstOrDefault(i => i.UserId == userId);
- }
-
- public static void SetItemByNameCounts(this IItemByName item, Guid userId, ItemByNameCounts counts)
- {
- var current = item.UserItemCountList.FirstOrDefault(i => i.UserId == userId);
-
- if (current != null)
- {
- item.UserItemCountList.Remove(current);
- }
-
- counts.UserId = userId;
- item.UserItemCountList.Add(counts);
- }
- }
}
diff --git a/MediaBrowser.Controller/Entities/LinkedChild.cs b/MediaBrowser.Controller/Entities/LinkedChild.cs
index cc5f7bf38..1ae04e40f 100644
--- a/MediaBrowser.Controller/Entities/LinkedChild.cs
+++ b/MediaBrowser.Controller/Entities/LinkedChild.cs
@@ -9,6 +9,10 @@ namespace MediaBrowser.Controller.Entities
public string Path { get; set; }
public LinkedChildType Type { get; set; }
+ public string ItemName { get; set; }
+ public string ItemType { get; set; }
+ public int? ItemYear { get; set; }
+
/// <summary>
/// Serves as a cache
/// </summary>
@@ -18,8 +22,8 @@ namespace MediaBrowser.Controller.Entities
public enum LinkedChildType
{
- Manual = 1,
- Shortcut = 2
+ Manual = 0,
+ Shortcut = 1
}
public class LinkedChildComparer : IEqualityComparer<LinkedChild>
@@ -35,7 +39,7 @@ namespace MediaBrowser.Controller.Entities
public int GetHashCode(LinkedChild obj)
{
- return (obj.Path + obj.Type.ToString()).GetHashCode();
+ return (obj.Path + obj.Type).GetHashCode();
}
}
}
diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs
index c1dc81136..1def47391 100644
--- a/MediaBrowser.Controller/Entities/Person.cs
+++ b/MediaBrowser.Controller/Entities/Person.cs
@@ -1,7 +1,7 @@
using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Dto;
+using System;
using System.Collections.Generic;
-using System.Runtime.Serialization;
+using System.Linq;
namespace MediaBrowser.Controller.Entities
{
@@ -10,19 +10,11 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class Person : BaseItem, IItemByName, IHasLookupInfo<PersonLookupInfo>
{
- public Person()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
/// <summary>
/// Gets or sets the place of birth.
/// </summary>
/// <value>The place of birth.</value>
public string PlaceOfBirth { get; set; }
-
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
/// <summary>
/// Gets the user data key.
@@ -62,6 +54,11 @@ namespace MediaBrowser.Controller.Entities
return false;
}
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return inputItems.Where(i => i.People.Any(p => string.Equals(p.Name, Name, StringComparison.OrdinalIgnoreCase)));
+ }
}
/// <summary>
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index 5c3946f9b..8271a3df2 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -1,7 +1,6 @@
-using System.Runtime.Serialization;
-using MediaBrowser.Model.Dto;
-using System;
+using System;
using System.Collections.Generic;
+using System.Linq;
namespace MediaBrowser.Controller.Entities
{
@@ -10,11 +9,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class Studio : BaseItem, IItemByName
{
- public Studio()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
@@ -24,9 +18,6 @@ namespace MediaBrowser.Controller.Entities
return "Studio-" + Name;
}
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
@@ -51,5 +42,10 @@ namespace MediaBrowser.Controller.Entities
return false;
}
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return inputItems.Where(i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase));
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index 1829e10c7..0290fa39a 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Providers;
+using System;
using System.Collections.Generic;
using System.Linq;
@@ -23,7 +24,7 @@ namespace MediaBrowser.Controller.Entities
{
var hasChanges = base.BeforeMetadataRefresh();
- if (string.Equals("default", Name, System.StringComparison.OrdinalIgnoreCase))
+ if (string.Equals("default", Name, StringComparison.OrdinalIgnoreCase))
{
Name = "Media Folders";
hasChanges = true;
diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs
index c6ca028ae..8deb930e8 100644
--- a/MediaBrowser.Controller/Entities/Year.cs
+++ b/MediaBrowser.Controller/Entities/Year.cs
@@ -1,7 +1,6 @@
-using System.Runtime.Serialization;
-using MediaBrowser.Model.Dto;
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
namespace MediaBrowser.Controller.Entities
{
@@ -10,14 +9,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class Year : BaseItem, IItemByName
{
- public Year()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
/// <summary>
/// Gets the user data key.
/// </summary>
@@ -51,5 +42,19 @@ namespace MediaBrowser.Controller.Entities
return false;
}
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ int year;
+
+ var usCulture = new CultureInfo("en-US");
+
+ if (!int.TryParse(Name, NumberStyles.Integer, usCulture, out year))
+ {
+ return inputItems;
+ }
+
+ return inputItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year);
+ }
}
}
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 747ae48ad..9bde9aa29 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -305,19 +305,6 @@ namespace MediaBrowser.Controller.Library
string FindCollectionType(BaseItem item);
/// <summary>
- /// Gets all artists.
- /// </summary>
- /// <returns>IEnumerable{System.String}.</returns>
- IEnumerable<string> GetAllArtists();
-
- /// <summary>
- /// Gets all artists.
- /// </summary>
- /// <param name="items">The items.</param>
- /// <returns>IEnumerable{System.String}.</returns>
- IEnumerable<string> GetAllArtists(IEnumerable<BaseItem> items);
-
- /// <summary>
/// Normalizes the root path list.
/// </summary>
/// <param name="paths">The paths.</param>
diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs
index 0502ec419..c3b0748cf 100644
--- a/MediaBrowser.Controller/Library/IUserManager.cs
+++ b/MediaBrowser.Controller/Library/IUserManager.cs
@@ -51,9 +51,8 @@ namespace MediaBrowser.Controller.Library
/// Refreshes metadata for each user
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="force">if set to <c>true</c> [force].</param>
/// <returns>Task.</returns>
- Task RefreshUsersMetadata(CancellationToken cancellationToken, bool force = false);
+ Task RefreshUsersMetadata(CancellationToken cancellationToken);
/// <summary>
/// Renames the user.
diff --git a/MediaBrowser.Controller/Library/TVUtils.cs b/MediaBrowser.Controller/Library/TVUtils.cs
index c64e4fa0c..7841a32ae 100644
--- a/MediaBrowser.Controller/Library/TVUtils.cs
+++ b/MediaBrowser.Controller/Library/TVUtils.cs
@@ -27,94 +27,94 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// A season folder must contain one of these somewhere in the name
/// </summary>
- private static readonly string[] SeasonFolderNames = new[]
- {
- "season",
- "sæson",
- "temporada",
- "saison",
- "staffel",
- "series",
- "сезон"
- };
+ private static readonly string[] SeasonFolderNames =
+ {
+ "season",
+ "sæson",
+ "temporada",
+ "saison",
+ "staffel",
+ "series",
+ "сезон"
+ };
/// <summary>
/// Used to detect paths that represent episodes, need to make sure they don't also
/// match movie titles like "2001 A Space..."
/// Currently we limit the numbers here to 2 digits to try and avoid this
/// </summary>
- private static readonly Regex[] EpisodeExpressions = new[]
- {
- new Regex(
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)[sS](?<seasonnumber>\d{1,4})[x,X]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
- RegexOptions.Compiled)
- };
- private static readonly Regex[] MultipleEpisodeExpressions = new[]
- {
- new Regex(
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[eExX](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})(-[xE]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled),
- new Regex(
- @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
- RegexOptions.Compiled)
- };
+ private static readonly Regex[] EpisodeExpressions =
+ {
+ new Regex(
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)[sS](?<seasonnumber>\d{1,4})[x,X]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})[^\\\/]*$",
+ RegexOptions.Compiled)
+ };
+ private static readonly Regex[] MultipleEpisodeExpressions =
+ {
+ new Regex(
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[eExX](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)[sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3})(-[xE]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )\d{1,4}[xX][eE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>((?![sS]?\d{1,4}[xX]\d{1,3})[^\\\/])*)?([sS]?(?<seasonnumber>\d{1,4})[xX](?<epnumber>\d{1,3}))(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})((-| - )?[xXeE](?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled),
+ new Regex(
+ @".*(\\|\/)(?<seriesname>[^\\\/]*)[sS](?<seasonnumber>\d{1,4})[xX\.]?[eE](?<epnumber>\d{1,3})(-[xX]?[eE]?(?<endingepnumber>\d{1,3}))+[^\\\/]*$",
+ RegexOptions.Compiled)
+ };
/// <summary>
/// To avoid the following matching movies they are only valid when contained in a folder which has been matched as a being season
/// </summary>
- private static readonly Regex[] EpisodeExpressionsInASeasonFolder = new[]
- {
- new Regex(
- @".*(\\|\/)(?<epnumber>\d{1,2})\s?-\s?[^\\\/]*$",
- RegexOptions.Compiled),
- // 01 - blah.avi, 01-blah.avi
- new Regex(
- @".*(\\|\/)(?<epnumber>\d{1,2})[^\d\\]*[^\\\/]*$",
- RegexOptions.Compiled),
- // 01.avi, 01.blah.avi "01 - 22 blah.avi"
- new Regex(
- @".*(\\|\/)(?<seasonnumber>\d)(?<epnumber>\d{1,2})[^\d\\]+[^\\\/]*$",
- RegexOptions.Compiled),
- // 01.avi, 01.blah.avi
- new Regex(
- @".*(\\|\/)\D*\d+(?<epnumber>\d{2})",
- RegexOptions.Compiled)
- // hell0 - 101 - hello.avi
-
- };
+ private static readonly Regex[] EpisodeExpressionsInASeasonFolder =
+ {
+ new Regex(
+ @".*(\\|\/)(?<epnumber>\d{1,2})\s?-\s?[^\\\/]*$",
+ RegexOptions.Compiled),
+ // 01 - blah.avi, 01-blah.avi
+ new Regex(
+ @".*(\\|\/)(?<epnumber>\d{1,2})[^\d\\]*[^\\\/]*$",
+ RegexOptions.Compiled),
+ // 01.avi, 01.blah.avi "01 - 22 blah.avi"
+ new Regex(
+ @".*(\\|\/)(?<seasonnumber>\d)(?<epnumber>\d{1,2})[^\d\\]+[^\\\/]*$",
+ RegexOptions.Compiled),
+ // 01.avi, 01.blah.avi
+ new Regex(
+ @".*(\\|\/)\D*\d+(?<epnumber>\d{2})",
+ RegexOptions.Compiled)
+ // hell0 - 101 - hello.avi
+
+ };
/// <summary>
/// Gets the season number from path.
@@ -151,8 +151,8 @@ namespace MediaBrowser.Controller.Library
/// <returns>System.Nullable{System.Int32}.</returns>
private static int? GetSeasonNumberFromPathSubstring(string path)
{
- int numericStart = -1;
- int length = 0;
+ var numericStart = -1;
+ var length = 0;
// Find out where the numbers start, and then keep going until they end
for (var i = 0; i < path.Length; i++)
diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
index ad42c5091..dddd26358 100644
--- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
+++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
@@ -138,13 +138,6 @@ namespace MediaBrowser.Controller.LiveTv
/// <param name="id">The identifier.</param>
/// <returns>Channel.</returns>
LiveTvChannel GetInternalChannel(string id);
-
- /// <summary>
- /// Gets the internal program.
- /// </summary>
- /// <param name="id">The identifier.</param>
- /// <returns>LiveTvProgram.</returns>
- LiveTvProgram GetInternalProgram(string id);
/// <summary>
/// Gets the recording.
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
index ff5d6a4d2..3e6832123 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
@@ -1,20 +1,13 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Dto;
using MediaBrowser.Model.LiveTv;
using System.Collections.Generic;
-using System.Runtime.Serialization;
using System.Linq;
namespace MediaBrowser.Controller.LiveTv
{
public class LiveTvChannel : BaseItem, IItemByName
{
- public LiveTvChannel()
- {
- UserItemCountList = new List<ItemByNameCounts>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
@@ -24,9 +17,6 @@ namespace MediaBrowser.Controller.LiveTv
return GetClientTypeName() + "-" + Name;
}
- [IgnoreDataMember]
- public List<ItemByNameCounts> UserItemCountList { get; set; }
-
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
@@ -119,5 +109,10 @@ namespace MediaBrowser.Controller.LiveTv
{
return "Channel";
}
+
+ public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
+ {
+ return new List<BaseItem>();
+ }
}
}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index ff446f2ef..16c54861e 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -68,6 +68,11 @@
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
+ <Compile Include="Channels\ChannelItemInfo.cs" />
+ <Compile Include="Channels\IChannel.cs" />
+ <Compile Include="Channels\IChannelManager.cs" />
+ <Compile Include="Collections\CollectionCreationOptions.cs" />
+ <Compile Include="Collections\ICollectionManager.cs" />
<Compile Include="Drawing\IImageProcessor.cs" />
<Compile Include="Drawing\ImageFormat.cs" />
<Compile Include="Drawing\ImageProcessingOptions.cs" />
diff --git a/MediaBrowser.Controller/Net/IHttpResultFactory.cs b/MediaBrowser.Controller/Net/IHttpResultFactory.cs
index b7dff96cd..f7984c32c 100644
--- a/MediaBrowser.Controller/Net/IHttpResultFactory.cs
+++ b/MediaBrowser.Controller/Net/IHttpResultFactory.cs
@@ -96,6 +96,18 @@ namespace MediaBrowser.Controller.Net
object GetStaticFileResult(IRequest requestContext, string path, FileShare fileShare = FileShare.Read, IDictionary<string, string> responseHeaders = null, bool isHeadRequest = false);
/// <summary>
+ /// Gets the static file result.
+ /// </summary>
+ /// <param name="requestContext">The request context.</param>
+ /// <param name="path">The path.</param>
+ /// <param name="contentType">Type of the content.</param>
+ /// <param name="fileShare">The file share.</param>
+ /// <param name="responseHeaders">The response headers.</param>
+ /// <param name="isHeadRequest">if set to <c>true</c> [is head request].</param>
+ /// <returns>System.Object.</returns>
+ object GetStaticFileResult(IRequest requestContext, string path, string contentType, FileShare fileShare = FileShare.Read, IDictionary<string, string> responseHeaders = null, bool isHeadRequest = false);
+
+ /// <summary>
/// Gets the optimized serialized result using cache.
/// </summary>
/// <typeparam name="T"></typeparam>
diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs
index 751de9fb4..9d41b6d25 100644
--- a/MediaBrowser.Controller/Providers/DirectoryService.cs
+++ b/MediaBrowser.Controller/Providers/DirectoryService.cs
@@ -1,6 +1,6 @@
-using System.Collections.Concurrent;
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Logging;
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -10,10 +10,8 @@ namespace MediaBrowser.Controller.Providers
public interface IDirectoryService
{
List<FileSystemInfo> GetFileSystemEntries(string path);
- IEnumerable<FileInfo> GetFiles(string path);
- IEnumerable<DirectoryInfo> GetDirectories(string path);
- FileInfo GetFile(string path);
- DirectoryInfo GetDirectory(string path);
+ IEnumerable<FileSystemInfo> GetFiles(string path);
+ FileSystemInfo GetFile(string path);
}
public class DirectoryService : IDirectoryService
@@ -50,31 +48,17 @@ namespace MediaBrowser.Controller.Providers
return entries;
}
- public IEnumerable<FileInfo> GetFiles(string path)
+ public IEnumerable<FileSystemInfo> GetFiles(string path)
{
- return GetFileSystemEntries(path).OfType<FileInfo>();
+ return GetFileSystemEntries(path).Where(i => (i.Attributes & FileAttributes.Directory) != FileAttributes.Directory);
}
- public IEnumerable<DirectoryInfo> GetDirectories(string path)
- {
- return GetFileSystemEntries(path).OfType<DirectoryInfo>();
- }
-
- public FileInfo GetFile(string path)
+ public FileSystemInfo GetFile(string path)
{
var directory = Path.GetDirectoryName(path);
var filename = Path.GetFileName(path);
return GetFiles(directory).FirstOrDefault(i => string.Equals(i.Name, filename, StringComparison.OrdinalIgnoreCase));
}
-
-
- public DirectoryInfo GetDirectory(string path)
- {
- var directory = Path.GetDirectoryName(path);
- var name = Path.GetFileName(path);
-
- return GetDirectories(directory).FirstOrDefault(i => string.Equals(i.Name, name, StringComparison.OrdinalIgnoreCase));
- }
}
}
diff --git a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs
index ec24e1d60..68afb84b8 100644
--- a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs
+++ b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs
@@ -23,7 +23,7 @@ namespace MediaBrowser.Controller.Providers
public class LocalImageInfo
{
- public FileInfo FileInfo { get; set; }
+ public FileSystemInfo FileInfo { get; set; }
public ImageType Type { get; set; }
}
diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs
index 892ec9345..ee29671c0 100644
--- a/MediaBrowser.Controller/Session/ISessionManager.cs
+++ b/MediaBrowser.Controller/Session/ISessionManager.cs
@@ -77,6 +77,13 @@ namespace MediaBrowser.Controller.Session
Task OnPlaybackStopped(PlaybackStopInfo info);
/// <summary>
+ /// Reports the session ended.
+ /// </summary>
+ /// <param name="sessionId">The session identifier.</param>
+ /// <returns>Task.</returns>
+ Task ReportSessionEnded(Guid sessionId);
+
+ /// <summary>
/// Sends the system command.
/// </summary>
/// <param name="sessionId">The session id.</param>