diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index 297a13155..e90969655 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -4,6 +4,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Logging;
+using ServiceStack.Text.Controller;
using ServiceStack.Web;
using System;
using System.Collections.Generic;
@@ -21,7 +22,7 @@ namespace MediaBrowser.Api
///
/// The logger.
public ILogger Logger { get; set; }
-
+
///
/// Gets or sets the HTTP result factory.
///
@@ -143,7 +144,7 @@ namespace MediaBrowser.Api
{
if (!string.IsNullOrEmpty(parentId))
{
- var folder = (Folder) libraryManager.GetItemById(new Guid(parentId));
+ var folder = (Folder)libraryManager.GetItemById(new Guid(parentId));
if (userId.HasValue)
{
@@ -287,6 +288,20 @@ namespace MediaBrowser.Api
}) ?? name;
}
+ protected string GetPathValue(int index)
+ {
+ var pathInfo = PathInfo.Parse(Request.PathInfo);
+ var first = pathInfo.GetArgumentValue(0);
+
+ // backwards compatibility
+ if (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase))
+ {
+ index++;
+ }
+
+ return pathInfo.GetArgumentValue(index);
+ }
+
///
/// Gets the name of the item by.
///
@@ -294,7 +309,6 @@ namespace MediaBrowser.Api
/// The type.
/// The library manager.
/// Task{BaseItem}.
- ///
protected BaseItem GetItemByName(string name, string type, ILibraryManager libraryManager)
{
BaseItem item;
diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs
index 3eb0296fc..d0abd18c2 100644
--- a/MediaBrowser.Api/ConfigurationService.cs
+++ b/MediaBrowser.Api/ConfigurationService.cs
@@ -143,8 +143,7 @@ namespace MediaBrowser.Api
public void Post(UpdateNamedConfiguration request)
{
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var key = pathInfo.GetArgumentValue(2);
+ var key = GetPathValue(2);
var configurationType = _configurationManager.GetConfigurationType(key);
var configuration = _jsonSerializer.DeserializeFromStream(request.RequestStream, configurationType);
diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs
index 94d6e25b0..2383017c6 100644
--- a/MediaBrowser.Api/Dlna/DlnaServerService.cs
+++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs
@@ -120,8 +120,7 @@ namespace MediaBrowser.Api.Dlna
private async Task PostAsync(Stream requestStream, IUpnpService service)
{
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = pathInfo.GetArgumentValue(2);
+ var id = GetPathValue(2);
using (var reader = new StreamReader(requestStream))
{
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index f2586b043..f141d9df9 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -396,8 +396,7 @@ namespace MediaBrowser.Api.Images
public object Get(GetItemByNameImage request)
{
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var type = pathInfo.GetArgumentValue(0);
+ var type = GetPathValue(0);
var item = GetItemByName(request.Name, type, _libraryManager);
@@ -406,8 +405,7 @@ namespace MediaBrowser.Api.Images
public object Head(GetItemByNameImage request)
{
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var type = pathInfo.GetArgumentValue(0);
+ var type = GetPathValue(0);
var item = GetItemByName(request.Name, type, _libraryManager);
@@ -420,10 +418,9 @@ namespace MediaBrowser.Api.Images
/// The request.
public void Post(PostUserImage request)
{
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = new Guid(pathInfo.GetArgumentValue(1));
+ var id = new Guid(GetPathValue(1));
- request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue(3), true);
+ request.Type = (ImageType)Enum.Parse(typeof(ImageType), GetPathValue(3), true);
var item = _userManager.GetUserById(id);
@@ -438,10 +435,9 @@ namespace MediaBrowser.Api.Images
/// The request.
public void Post(PostItemImage request)
{
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = new Guid(pathInfo.GetArgumentValue(1));
+ var id = new Guid(GetPathValue(1));
- request.Type = (ImageType)Enum.Parse(typeof(ImageType), pathInfo.GetArgumentValue(3), true);
+ request.Type = (ImageType)Enum.Parse(typeof(ImageType), GetPathValue(3), true);
var item = _libraryManager.GetItemById(id);
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index b3610bc38..77f6dc103 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -824,7 +824,7 @@ namespace MediaBrowser.Api.Playback
{
get
{
- return false;
+ return true;
}
}
diff --git a/MediaBrowser.Api/PluginService.cs b/MediaBrowser.Api/PluginService.cs
index 62aa1e755..f9098f5bf 100644
--- a/MediaBrowser.Api/PluginService.cs
+++ b/MediaBrowser.Api/PluginService.cs
@@ -236,8 +236,7 @@ namespace MediaBrowser.Api
{
// We need to parse this manually because we told service stack not to with IRequiresRequestStream
// https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = new Guid(pathInfo.GetArgumentValue(1));
+ var id = new Guid(GetPathValue(1));
var plugin = _appHost.Plugins.First(p => p.Id == id);
diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
index 947b99d35..e3722b4a7 100644
--- a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
+++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
@@ -224,8 +224,7 @@ namespace MediaBrowser.Api.ScheduledTasks
{
// We need to parse this manually because we told service stack not to with IRequiresRequestStream
// https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = pathInfo.GetArgumentValue(1);
+ var id = GetPathValue(1);
var task = TaskManager.ScheduledTasks.FirstOrDefault(i => string.Equals(i.Id, id));
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index 51a7584b8..37553e4a4 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -449,8 +449,7 @@ namespace MediaBrowser.Api
{
// We need to parse this manually because we told service stack not to with IRequiresRequestStream
// https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs
- var pathInfo = PathInfo.Parse(Request.PathInfo);
- var id = new Guid(pathInfo.GetArgumentValue(1));
+ var id = new Guid(GetPathValue(1));
var dtoUser = request;
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 005f263f7..ff6e8e85b 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -301,7 +301,7 @@ namespace MediaBrowser.Controller.Entities
public override bool IsVisible(User user)
{
- if (this is ICollectionFolder)
+ if (this is ICollectionFolder && !(this is BasePluginFolder))
{
if (user.Policy.BlockedMediaFolders != null)
{
diff --git a/MediaBrowser.Controller/Entities/ISupportsBoxSetGrouping.cs b/MediaBrowser.Controller/Entities/ISupportsBoxSetGrouping.cs
index 0fd463155..fbe5a06d0 100644
--- a/MediaBrowser.Controller/Entities/ISupportsBoxSetGrouping.cs
+++ b/MediaBrowser.Controller/Entities/ISupportsBoxSetGrouping.cs
@@ -1,6 +1,4 @@
-using System;
-using System.Collections.Generic;
-
+
namespace MediaBrowser.Controller.Entities
{
///
@@ -10,10 +8,5 @@ namespace MediaBrowser.Controller.Entities
///
public interface ISupportsBoxSetGrouping
{
- ///
- /// Gets or sets the box set identifier list.
- ///
- /// The box set identifier list.
- List BoxSetIdList { get; set; }
}
}
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index e48b8d845..63690661a 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -4,13 +4,13 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
+using MediaBrowser.Model.Users;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Entities.Movies
{
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index b3774cfe0..2fa5fc6e1 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -25,12 +25,6 @@ namespace MediaBrowser.Controller.Entities.Movies
public List ThemeVideoIds { get; set; }
public List ProductionLocations { get; set; }
- ///
- /// This is just a cache to enable quick access by Id
- ///
- [IgnoreDataMember]
- public List BoxSetIdList { get; set; }
-
public Movie()
{
SpecialFeatureIds = new List();
@@ -40,7 +34,6 @@ namespace MediaBrowser.Controller.Entities.Movies
RemoteTrailerIds = new List();
ThemeSongIds = new List();
ThemeVideoIds = new List();
- BoxSetIdList = new List();
Taglines = new List();
Keywords = new List();
ProductionLocations = new List();
diff --git a/MediaBrowser.Dlna/DlnaManager.cs b/MediaBrowser.Dlna/DlnaManager.cs
index 31f1e0a88..2c22abd4d 100644
--- a/MediaBrowser.Dlna/DlnaManager.cs
+++ b/MediaBrowser.Dlna/DlnaManager.cs
@@ -132,61 +132,74 @@ namespace MediaBrowser.Dlna
{
if (!string.IsNullOrWhiteSpace(profileInfo.DeviceDescription))
{
- if (deviceInfo.DeviceDescription == null || !Regex.IsMatch(deviceInfo.DeviceDescription, profileInfo.DeviceDescription))
+ if (deviceInfo.DeviceDescription == null || !IsRegexMatch(deviceInfo.DeviceDescription, profileInfo.DeviceDescription))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.FriendlyName))
{
- if (deviceInfo.FriendlyName == null || !Regex.IsMatch(deviceInfo.FriendlyName, profileInfo.FriendlyName))
+ if (deviceInfo.FriendlyName == null || !IsRegexMatch(deviceInfo.FriendlyName, profileInfo.FriendlyName))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.Manufacturer))
{
- if (deviceInfo.Manufacturer == null || !Regex.IsMatch(deviceInfo.Manufacturer, profileInfo.Manufacturer))
+ if (deviceInfo.Manufacturer == null || !IsRegexMatch(deviceInfo.Manufacturer, profileInfo.Manufacturer))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.ManufacturerUrl))
{
- if (deviceInfo.ManufacturerUrl == null || !Regex.IsMatch(deviceInfo.ManufacturerUrl, profileInfo.ManufacturerUrl))
+ if (deviceInfo.ManufacturerUrl == null || !IsRegexMatch(deviceInfo.ManufacturerUrl, profileInfo.ManufacturerUrl))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.ModelDescription))
{
- if (deviceInfo.ModelDescription == null || !Regex.IsMatch(deviceInfo.ModelDescription, profileInfo.ModelDescription))
+ if (deviceInfo.ModelDescription == null || !IsRegexMatch(deviceInfo.ModelDescription, profileInfo.ModelDescription))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.ModelName))
{
- if (deviceInfo.ModelName == null || !Regex.IsMatch(deviceInfo.ModelName, profileInfo.ModelName))
+ if (deviceInfo.ModelName == null || !IsRegexMatch(deviceInfo.ModelName, profileInfo.ModelName))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.ModelNumber))
{
- if (deviceInfo.ModelNumber == null || !Regex.IsMatch(deviceInfo.ModelNumber, profileInfo.ModelNumber))
+ if (deviceInfo.ModelNumber == null || !IsRegexMatch(deviceInfo.ModelNumber, profileInfo.ModelNumber))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.ModelUrl))
{
- if (deviceInfo.ModelUrl == null || !Regex.IsMatch(deviceInfo.ModelUrl, profileInfo.ModelUrl))
+ if (deviceInfo.ModelUrl == null || !IsRegexMatch(deviceInfo.ModelUrl, profileInfo.ModelUrl))
return false;
}
if (!string.IsNullOrWhiteSpace(profileInfo.SerialNumber))
{
- if (deviceInfo.SerialNumber == null || !Regex.IsMatch(deviceInfo.SerialNumber, profileInfo.SerialNumber))
+ if (deviceInfo.SerialNumber == null || !IsRegexMatch(deviceInfo.SerialNumber, profileInfo.SerialNumber))
return false;
}
return true;
}
+ private bool IsRegexMatch(string input, string pattern)
+ {
+ try
+ {
+ return Regex.IsMatch(input, pattern);
+ }
+ catch (ArgumentException ex)
+ {
+ _logger.ErrorException("Error evaluating regex pattern {0}", ex, pattern);
+ return false;
+ }
+ }
+
public DeviceProfile GetProfile(IDictionary headers)
{
if (headers == null)
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index 91d0e15f8..0a350f517 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -497,9 +497,6 @@
Dto\UserItemDataDto.cs
-
- Dto\VideoStreamOptions.cs
-
Entities\BaseItemInfo.cs
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index 47e019051..0c5946d12 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -462,9 +462,6 @@
Dto\UserItemDataDto.cs
-
- Dto\VideoStreamOptions.cs
-
Entities\BaseItemInfo.cs
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index b6938b217..0e69bb91f 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -1316,24 +1316,6 @@ namespace MediaBrowser.Model.ApiClient
/// Task<QueryResult<BaseItemDto>>.
Task> GetPlaylistItems(PlaylistItemQuery query);
- ///
- /// Gets the url needed to stream a video file
- ///
- /// The options.
- /// System.String.
- /// options
- [Obsolete]
- string GetVideoStreamUrl(VideoStreamOptions options);
-
- ///
- /// Formulates a url for streaming video using the HLS protocol
- ///
- /// The options.
- /// System.String.
- /// options
- [Obsolete]
- string GetHlsVideoStreamUrl(VideoStreamOptions options);
-
///
/// Sends the context message asynchronous.
///
diff --git a/MediaBrowser.Model/Dto/VideoStreamOptions.cs b/MediaBrowser.Model/Dto/VideoStreamOptions.cs
deleted file mode 100644
index e9a83bd12..000000000
--- a/MediaBrowser.Model/Dto/VideoStreamOptions.cs
+++ /dev/null
@@ -1,158 +0,0 @@
-using System;
-
-namespace MediaBrowser.Model.Dto
-{
- ///
- /// Class VideoStreamOptions
- ///
- [Obsolete]
- public class VideoStreamOptions
- {
- ///
- /// Gets or sets the audio bit rate.
- ///
- /// The audio bit rate.
- public int? AudioBitRate { get; set; }
-
- ///
- /// Gets or sets the audio codec.
- /// Omit to copy the original stream
- ///
- /// The audio encoding format.
- public string AudioCodec { get; set; }
-
- ///
- /// Gets or sets the item id.
- ///
- /// The item id.
- public string ItemId { get; set; }
-
- ///
- /// Gets or sets the max audio channels.
- ///
- /// The max audio channels.
- public int? MaxAudioChannels { get; set; }
-
- ///
- /// Gets or sets the max audio sample rate.
- ///
- /// The max audio sample rate.
- public int? MaxAudioSampleRate { get; set; }
-
- ///
- /// Gets or sets the start time ticks.
- ///
- /// The start time ticks.
- public long? StartTimeTicks { get; set; }
-
- ///
- /// Gets or sets a value indicating whether the original media should be served statically
- /// Only used with progressive streaming
- ///
- /// true if static; otherwise, false.
- public bool? Static { get; set; }
-
- ///
- /// Gets or sets the output file extension.
- ///
- /// The output file extension.
- public string OutputFileExtension { get; set; }
-
- ///
- /// Gets or sets the device id.
- ///
- /// The device id.
- public string DeviceId { get; set; }
-
- ///
- /// Gets or sets the video codec.
- /// Omit to copy
- ///
- /// The video codec.
- public string VideoCodec { get; set; }
-
- ///
- /// Gets or sets the video bit rate.
- ///
- /// The video bit rate.
- public int? VideoBitRate { get; set; }
-
- ///
- /// Gets or sets the width.
- ///
- /// The width.
- public int? Width { get; set; }
-
- ///
- /// Gets or sets the height.
- ///
- /// The height.
- public int? Height { get; set; }
-
- ///
- /// Gets or sets the width of the max.
- ///
- /// The width of the max.
- public int? MaxWidth { get; set; }
-
- ///
- /// Gets or sets the height of the max.
- ///
- /// The height of the max.
- public int? MaxHeight { get; set; }
-
- ///
- /// Gets or sets the frame rate.
- ///
- /// The frame rate.
- public double? FrameRate { get; set; }
-
- ///
- /// Gets or sets the index of the audio stream.
- ///
- /// The index of the audio stream.
- public int? AudioStreamIndex { get; set; }
-
- ///
- /// Gets or sets the index of the video stream.
- ///
- /// The index of the video stream.
- public int? VideoStreamIndex { get; set; }
-
- ///
- /// Gets or sets the index of the subtitle stream.
- ///
- /// The index of the subtitle stream.
- public int? SubtitleStreamIndex { get; set; }
-
- ///
- /// Gets or sets the profile.
- ///
- /// The profile.
- public string Profile { get; set; }
-
- ///
- /// Gets or sets the level.
- ///
- /// The level.
- public string Level { get; set; }
-
- ///
- /// Gets or sets the baseline stream audio bit rate.
- ///
- /// The baseline stream audio bit rate.
- public int? BaselineStreamAudioBitRate { get; set; }
-
- ///
- /// Gets or sets a value indicating whether [append baseline stream].
- ///
- /// true if [append baseline stream]; otherwise, false.
- public bool AppendBaselineStream { get; set; }
-
- ///
- /// Gets or sets the time stamp offset ms. Only used with HLS.
- ///
- /// The time stamp offset ms.
- public int? TimeStampOffsetMs { get; set; }
- }
-}
\ No newline at end of file
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 36d22347f..bad17abae 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -135,7 +135,6 @@
-
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
index d92db34e3..6100e3f5d 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionManager.cs
@@ -167,18 +167,6 @@ namespace MediaBrowser.Server.Implementations.Collections
}
list.Add(LinkedChild.Create(item));
-
- var supportsGrouping = item as ISupportsBoxSetGrouping;
-
- if (supportsGrouping != null)
- {
- var boxsetIdList = supportsGrouping.BoxSetIdList.ToList();
- if (!boxsetIdList.Contains(collectionId))
- {
- boxsetIdList.Add(collectionId);
- }
- supportsGrouping.BoxSetIdList = boxsetIdList;
- }
}
collection.LinkedChildren.AddRange(list);
@@ -228,15 +216,6 @@ namespace MediaBrowser.Server.Implementations.Collections
{
itemList.Add(childItem);
}
-
- var supportsGrouping = childItem as ISupportsBoxSetGrouping;
-
- if (supportsGrouping != null)
- {
- var boxsetIdList = supportsGrouping.BoxSetIdList.ToList();
- boxsetIdList.Remove(collectionId);
- supportsGrouping.BoxSetIdList = boxsetIdList;
- }
}
var shortcutFiles = Directory
@@ -289,29 +268,40 @@ namespace MediaBrowser.Server.Implementations.Collections
public IEnumerable CollapseItemsWithinBoxSets(IEnumerable items, User user)
{
- var itemsToCollapse = new List();
- var boxsets = new List();
+ var results = new Dictionary();
+ var allBoxsets = new List();
- var list = items.ToList();
-
- foreach (var item in list.OfType())
+ foreach (var item in items)
{
- var currentBoxSets = item.BoxSetIdList
- .Select(i => _libraryManager.GetItemById(i))
- .Where(i => i != null && i.IsVisible(user))
- .ToList();
+ var grouping = item as ISupportsBoxSetGrouping;
- if (currentBoxSets.Count > 0)
+ if (grouping == null)
{
- itemsToCollapse.Add(item);
- boxsets.AddRange(currentBoxSets);
+ results[item.Id] = item;
+ }
+ else
+ {
+ var itemId = item.Id;
+
+ var currentBoxSets = allBoxsets
+ .Where(i => i.GetLinkedChildren().Any(j => j.Id == itemId))
+ .ToList();
+
+ if (currentBoxSets.Count > 0)
+ {
+ foreach (var boxset in currentBoxSets)
+ {
+ results[boxset.Id] = boxset;
+ }
+ }
+ else
+ {
+ results[item.Id] = item;
+ }
}
}
- return list
- .Except(itemsToCollapse.Cast())
- .Concat(boxsets)
- .DistinctBy(i => i.Id);
+ return results.Values;
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/BoxSetPostScanTask.cs b/MediaBrowser.Server.Implementations/Library/Validators/BoxSetPostScanTask.cs
deleted file mode 100644
index 86d88f7e0..000000000
--- a/MediaBrowser.Server.Implementations/Library/Validators/BoxSetPostScanTask.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Library;
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Server.Implementations.Library.Validators
-{
- public class BoxSetPostScanTask : ILibraryPostScanTask
- {
- private readonly ILibraryManager _libraryManager;
-
- public BoxSetPostScanTask(ILibraryManager libraryManager)
- {
- _libraryManager = libraryManager;
- }
-
- public Task Run(IProgress progress, CancellationToken cancellationToken)
- {
- var items = _libraryManager.RootFolder.RecursiveChildren.ToList();
-
- var boxsets = items.OfType().ToList();
-
- var numComplete = 0;
-
- foreach (var boxset in boxsets)
- {
- foreach (var child in boxset.Children.Concat(boxset.GetLinkedChildren()).OfType())
- {
- var boxsetIdList = child.BoxSetIdList.ToList();
- if (!boxsetIdList.Contains(boxset.Id))
- {
- boxsetIdList.Add(boxset.Id);
- }
- child.BoxSetIdList = boxsetIdList;
- }
-
- numComplete++;
- double percent = numComplete;
- percent /= boxsets.Count;
- progress.Report(percent * 100);
- }
-
- progress.Report(100);
- return Task.FromResult(true);
- }
- }
-}
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
index 62619a567..4206ccf59 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -45,6 +45,8 @@
"ButtonHelp": "Help",
"ButtonSave": "Save",
"HeaderDevices": "Devices",
+ "ButtonScheduledTasks": "Scheduled tasks",
+ "ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task. It can also be run manually here. To configure the scheduled task, see:",
"HeaderSupporterBenefit": "A supporter membership provides additional benefits such as access to premium plugins, internet channel content, and more. {0}Learn more{1}.",
"HeaderWelcomeToMediaBrowserServerDashboard": "Welcome to the Media Browser Dashboard",
"HeaderWelcomeToMediaBrowserWebClient": "Welcome to the Media Browser Web Client",
@@ -59,7 +61,7 @@
"ButtonCancelItem": "Cancel item",
"ButtonQueueForRetry": "Queue for retry",
"ButtonReenable": "Re-enable",
- "SyncJobItemStatusSyncedMarkForRemoval": "Marked for removal",
+ "SyncJobItemStatusSyncedMarkForRemoval": "Marked for removal",
"LabelAbortedByServerShutdown": "(Aborted by server shutdown)",
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
"HeaderDeleteTaskTrigger": "Delete Task Trigger",
@@ -71,8 +73,8 @@
"LabelFree": "Free",
"HeaderSelectAudio": "Select Audio",
"HeaderSelectSubtitles": "Select Subtitles",
- "ButtonMarkForRemoval": "Mark for removal from device",
- "ButtonUnmarkForRemoval": "Unmark for removal from device",
+ "ButtonMarkForRemoval": "Mark for removal from device",
+ "ButtonUnmarkForRemoval": "Unmark for removal from device",
"LabelDefaultStream": "(Default)",
"LabelForcedStream": "(Forced)",
"LabelDefaultForcedStream": "(Default/Forced)",
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 548ac07aa..fe5642dbc 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -209,7 +209,6 @@
-