diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs
index 2177f90c2f..8e6ca44014 100644
--- a/MediaBrowser.Api/ApiEntryPoint.cs
+++ b/MediaBrowser.Api/ApiEntryPoint.cs
@@ -37,6 +37,8 @@ namespace MediaBrowser.Api
private readonly ISessionManager _sessionManager;
+ public readonly SemaphoreSlim TranscodingStartLock = new SemaphoreSlim(1,1);
+
///
/// Initializes a new instance of the class.
///
@@ -301,8 +303,9 @@ namespace MediaBrowser.Api
///
/// The device id.
/// The delete mode.
+ /// if set to true [acquire lock].
/// sourcePath
- internal void KillTranscodingJobs(string deviceId, FileDeleteMode deleteMode)
+ internal async Task KillTranscodingJobs(string deviceId, FileDeleteMode deleteMode, bool acquireLock)
{
if (string.IsNullOrEmpty(deviceId))
{
@@ -318,9 +321,29 @@ namespace MediaBrowser.Api
jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase)));
}
- foreach (var job in jobs)
+ if (jobs.Count == 0)
{
- KillTranscodingJob(job, deleteMode);
+ return;
+ }
+
+ if (acquireLock)
+ {
+ await TranscodingStartLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
+ }
+
+ try
+ {
+ foreach (var job in jobs)
+ {
+ KillTranscodingJob(job, deleteMode);
+ }
+ }
+ finally
+ {
+ if (acquireLock)
+ {
+ TranscodingStartLock.Release();
+ }
}
}
@@ -328,10 +351,11 @@ namespace MediaBrowser.Api
/// Kills the transcoding jobs.
///
/// The device identifier.
- /// The output path.
+ /// The type.
/// The delete mode.
+ /// if set to true [acquire lock].
/// deviceId
- internal void KillTranscodingJobs(string deviceId, string outputPath, FileDeleteMode deleteMode)
+ internal async Task KillTranscodingJobs(string deviceId, TranscodingJobType type, FileDeleteMode deleteMode, bool acquireLock)
{
if (string.IsNullOrEmpty(deviceId))
{
@@ -344,12 +368,32 @@ namespace MediaBrowser.Api
{
// This is really only needed for HLS.
// Progressive streams can stop on their own reliably
- jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase) && string.Equals(outputPath, i.Path, StringComparison.OrdinalIgnoreCase)));
+ jobs.AddRange(_activeTranscodingJobs.Where(i => string.Equals(deviceId, i.DeviceId, StringComparison.OrdinalIgnoreCase) && i.Type == type));
}
- foreach (var job in jobs)
+ if (jobs.Count == 0)
{
- KillTranscodingJob(job, deleteMode);
+ return;
+ }
+
+ if (acquireLock)
+ {
+ await TranscodingStartLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
+ }
+
+ try
+ {
+ foreach (var job in jobs)
+ {
+ KillTranscodingJob(job, deleteMode);
+ }
+ }
+ finally
+ {
+ if (acquireLock)
+ {
+ TranscodingStartLock.Release();
+ }
}
}
diff --git a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
index 8bc867a2e7..21ba47bd4d 100644
--- a/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
+++ b/MediaBrowser.Api/DefaultTheme/DefaultThemeService.cs
@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
@@ -86,6 +87,7 @@ namespace MediaBrowser.Api.DefaultTheme
public Guid UserId { get; set; }
}
+ [Authenticated]
public class DefaultThemeService : BaseApiService
{
private readonly IUserManager _userManager;
diff --git a/MediaBrowser.Api/Dlna/DlnaService.cs b/MediaBrowser.Api/Dlna/DlnaService.cs
index 9e6ca3aea9..fec6d698ae 100644
--- a/MediaBrowser.Api/Dlna/DlnaService.cs
+++ b/MediaBrowser.Api/Dlna/DlnaService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Dlna;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Dlna;
using ServiceStack;
using System.Collections.Generic;
@@ -42,6 +43,7 @@ namespace MediaBrowser.Api.Dlna
{
}
+ [Authenticated]
public class DlnaService : BaseApiService
{
private readonly IDlnaManager _dlnaManager;
diff --git a/MediaBrowser.Api/ItemLookupService.cs b/MediaBrowser.Api/ItemLookupService.cs
index e68aa73f6a..35b1b53851 100644
--- a/MediaBrowser.Api/ItemLookupService.cs
+++ b/MediaBrowser.Api/ItemLookupService.cs
@@ -6,6 +6,7 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
@@ -104,6 +105,7 @@ namespace MediaBrowser.Api
public string Id { get; set; }
}
+ [Authenticated]
public class ItemLookupService : BaseApiService
{
private readonly IProviderManager _providerManager;
diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs
index 0094282c8a..b95e18a0d9 100644
--- a/MediaBrowser.Api/ItemRefreshService.cs
+++ b/MediaBrowser.Api/ItemRefreshService.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Providers;
using ServiceStack;
using System;
@@ -30,6 +31,7 @@ namespace MediaBrowser.Api
public string Id { get; set; }
}
+ [Authenticated]
public class ItemRefreshService : BaseApiService
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index ad7da8e3c5..db6c6ce53e 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -1,11 +1,12 @@
-using System.Collections.Generic;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Dto;
using ServiceStack;
using System;
+using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -19,6 +20,7 @@ namespace MediaBrowser.Api
public string ItemId { get; set; }
}
+ [Authenticated]
public class ItemUpdateService : BaseApiService
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Api/Library/ChapterService.cs b/MediaBrowser.Api/Library/ChapterService.cs
index 72ffa3fca6..6b8dd18f10 100644
--- a/MediaBrowser.Api/Library/ChapterService.cs
+++ b/MediaBrowser.Api/Library/ChapterService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Chapters;
+using MediaBrowser.Controller.Net;
using ServiceStack;
using System.Linq;
@@ -9,6 +10,7 @@ namespace MediaBrowser.Api.Library
{
}
+ [Authenticated]
public class ChapterService : BaseApiService
{
private readonly IChapterManager _chapterManager;
diff --git a/MediaBrowser.Api/Library/FileOrganizationService.cs b/MediaBrowser.Api/Library/FileOrganizationService.cs
index 01531a7ae6..adf6a522b3 100644
--- a/MediaBrowser.Api/Library/FileOrganizationService.cs
+++ b/MediaBrowser.Api/Library/FileOrganizationService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.FileOrganization;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.FileOrganization;
using MediaBrowser.Model.Querying;
using ServiceStack;
@@ -78,6 +79,7 @@ namespace MediaBrowser.Api.Library
public bool RememberCorrection { get; set; }
}
+ [Authenticated]
public class FileOrganizationService : BaseApiService
{
private readonly IFileOrganizationService _iFileOrganizationService;
diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs
index 947da29fea..c3ef587685 100644
--- a/MediaBrowser.Api/Library/LibraryStructureService.cs
+++ b/MediaBrowser.Api/Library/LibraryStructureService.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using ServiceStack;
@@ -130,36 +131,11 @@ namespace MediaBrowser.Api.Library
/// true if [refresh library]; otherwise, false.
public bool RefreshLibrary { get; set; }
}
-
- [Route("/Library/Downloaded", "POST")]
- public class ReportContentDownloaded : IReturnVoid
- {
- [ApiMember(Name = "Path", Description = "The path being downloaded to.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string Path { get; set; }
-
- [ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string ImageUrl { get; set; }
-
- [ApiMember(Name = "Name", Description = "The name of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string Name { get; set; }
- }
-
- [Route("/Library/Downloading", "POST")]
- public class ReportContentDownloading : IReturnVoid
- {
- [ApiMember(Name = "Path", Description = "The path being downloaded to.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string Path { get; set; }
-
- [ApiMember(Name = "ImageUrl", Description = "Optional thumbnail image url of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string ImageUrl { get; set; }
-
- [ApiMember(Name = "Name", Description = "The name of the content.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
- public string Name { get; set; }
- }
///
/// Class LibraryStructureService
///
+ [Authenticated]
public class LibraryStructureService : BaseApiService
{
///
diff --git a/MediaBrowser.Api/Library/SubtitleService.cs b/MediaBrowser.Api/Library/SubtitleService.cs
index 62c7ac7c0a..4fc3e00c08 100644
--- a/MediaBrowser.Api/Library/SubtitleService.cs
+++ b/MediaBrowser.Api/Library/SubtitleService.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.MediaEncoding;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Subtitles;
using MediaBrowser.Model.Entities;
@@ -86,6 +87,7 @@ namespace MediaBrowser.Api.Library
public string Id { get; set; }
}
+ [Authenticated]
public class SubtitleService : BaseApiService
{
private readonly ILibraryManager _libraryManager;
diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs
index de01628f84..497f2d0a35 100644
--- a/MediaBrowser.Api/LiveTv/LiveTvService.cs
+++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.LiveTv;
@@ -267,6 +268,7 @@ namespace MediaBrowser.Api.LiveTv
public string UserId { get; set; }
}
+ [Authenticated]
public class LiveTvService : BaseApiService
{
private readonly ILiveTvManager _liveTvManager;
diff --git a/MediaBrowser.Api/LocalizationService.cs b/MediaBrowser.Api/LocalizationService.cs
index d3c47dfa1e..5696d8df75 100644
--- a/MediaBrowser.Api/LocalizationService.cs
+++ b/MediaBrowser.Api/LocalizationService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Globalization;
using ServiceStack;
@@ -42,6 +43,7 @@ namespace MediaBrowser.Api
///
/// Class CulturesService
///
+ [Authenticated]
public class LocalizationService : BaseApiService
{
///
diff --git a/MediaBrowser.Api/Movies/CollectionService.cs b/MediaBrowser.Api/Movies/CollectionService.cs
index b9e3888fda..19e47eb857 100644
--- a/MediaBrowser.Api/Movies/CollectionService.cs
+++ b/MediaBrowser.Api/Movies/CollectionService.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Dto;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Querying;
using ServiceStack;
using System;
@@ -45,6 +46,7 @@ namespace MediaBrowser.Api.Movies
public Guid Id { get; set; }
}
+ [Authenticated]
public class CollectionService : BaseApiService
{
private readonly ICollectionManager _collectionManager;
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index db02ed4280..f0bf22c5e1 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@@ -64,6 +65,7 @@ namespace MediaBrowser.Api.Movies
///
/// Class MoviesService
///
+ [Authenticated]
public class MoviesService : BaseApiService
{
///
diff --git a/MediaBrowser.Api/Movies/TrailersService.cs b/MediaBrowser.Api/Movies/TrailersService.cs
index 05e6a95774..b0ee6b6d57 100644
--- a/MediaBrowser.Api/Movies/TrailersService.cs
+++ b/MediaBrowser.Api/Movies/TrailersService.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using ServiceStack;
@@ -18,6 +19,7 @@ namespace MediaBrowser.Api.Movies
///
/// Class TrailersService
///
+ [Authenticated]
public class TrailersService : BaseApiService
{
///
diff --git a/MediaBrowser.Api/Music/AlbumsService.cs b/MediaBrowser.Api/Music/AlbumsService.cs
index 0732c951a8..34a933dee3 100644
--- a/MediaBrowser.Api/Music/AlbumsService.cs
+++ b/MediaBrowser.Api/Music/AlbumsService.cs
@@ -2,10 +2,10 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using ServiceStack;
using System;
-using System.Collections.Generic;
using System.Linq;
namespace MediaBrowser.Api.Music
@@ -15,6 +15,7 @@ namespace MediaBrowser.Api.Music
{
}
+ [Authenticated]
public class AlbumsService : BaseApiService
{
///
diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs
index f50c87f47a..ff029d5b52 100644
--- a/MediaBrowser.Api/Music/InstantMixService.cs
+++ b/MediaBrowser.Api/Music/InstantMixService.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Querying;
using ServiceStack;
using System.Collections.Generic;
@@ -33,6 +34,7 @@ namespace MediaBrowser.Api.Music
public string Name { get; set; }
}
+ [Authenticated]
public class InstantMixService : BaseApiService
{
private readonly IUserManager _userManager;
diff --git a/MediaBrowser.Api/PackageReviewService.cs b/MediaBrowser.Api/PackageReviewService.cs
index 94ff1b62e2..112a2c5cea 100644
--- a/MediaBrowser.Api/PackageReviewService.cs
+++ b/MediaBrowser.Api/PackageReviewService.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.Constants;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Serialization;
using ServiceStack;
@@ -96,6 +97,7 @@ namespace MediaBrowser.Api
}
+ [Authenticated]
public class PackageReviewService : BaseApiService
{
private readonly IHttpClient _httpClient;
diff --git a/MediaBrowser.Api/PackageService.cs b/MediaBrowser.Api/PackageService.cs
index b54b05fcf7..84b42baa38 100644
--- a/MediaBrowser.Api/PackageService.cs
+++ b/MediaBrowser.Api/PackageService.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Updates;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Updates;
using ServiceStack;
using System;
@@ -121,6 +122,7 @@ namespace MediaBrowser.Api
///
/// Class PackageService
///
+ [Authenticated]
public class PackageService : BaseApiService
{
private readonly IInstallationManager _installationManager;
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 9ff482a1ab..75e13f92c2 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -13,7 +13,6 @@ using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Library;
using MediaBrowser.Model.LiveTv;
using MediaBrowser.Model.MediaInfo;
using System;
@@ -1955,12 +1954,6 @@ namespace MediaBrowser.Api.Playback
/// The video request.
private void EnforceResolutionLimit(StreamState state, VideoStreamRequest videoRequest)
{
- // If enabled, allow whatever the client asks for
- if (ServerConfigurationManager.Configuration.AllowVideoUpscaling)
- {
- return;
- }
-
// Switch the incoming params to be ceilings rather than fixed values
videoRequest.MaxWidth = videoRequest.MaxWidth ?? videoRequest.Width;
videoRequest.MaxHeight = videoRequest.MaxHeight ?? videoRequest.Height;
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index fa78fa0205..8a65e2b565 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -66,7 +66,6 @@ namespace MediaBrowser.Api.Playback.Hls
return ProcessRequestAsync(request, isLive).Result;
}
- private static readonly SemaphoreSlim FfmpegStartLock = new SemaphoreSlim(1, 1);
///
/// Processes the request async.
///
@@ -82,6 +81,11 @@ namespace MediaBrowser.Api.Playback.Hls
var state = await GetState(request, cancellationTokenSource.Token).ConfigureAwait(false);
+ if (isLive)
+ {
+ state.Request.StartTimeTicks = null;
+ }
+
var playlist = state.OutputFilePath;
if (File.Exists(playlist))
@@ -90,7 +94,7 @@ namespace MediaBrowser.Api.Playback.Hls
}
else
{
- await FfmpegStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
+ await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
try
{
if (File.Exists(playlist))
@@ -99,6 +103,8 @@ namespace MediaBrowser.Api.Playback.Hls
}
else
{
+ await ApiEntryPoint.Instance.KillTranscodingJobs(state.Request.DeviceId, TranscodingJobType.Hls, FileDeleteMode.All, false).ConfigureAwait(false);
+
// If the playlist doesn't already exist, startup ffmpeg
try
{
@@ -116,7 +122,7 @@ namespace MediaBrowser.Api.Playback.Hls
}
finally
{
- FfmpegStartLock.Release();
+ ApiEntryPoint.Instance.TranscodingStartLock.Release();
}
}
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index 5bb6106860..0af336c55b 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -65,7 +65,6 @@ namespace MediaBrowser.Api.Playback.Hls
return GetDynamicSegment(request).Result;
}
- private static readonly SemaphoreSlim FfmpegStartLock = new SemaphoreSlim(1, 1);
private async Task