Skip to content

Commit d6d4124

Browse files
Merge pull request #1043 from MediaBrowser/dev
3.0.5557.0
2 parents d589e23 + aae750d commit d6d4124

File tree

597 files changed

+14206
-6002
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

597 files changed

+14206
-6002
lines changed

MediaBrowser.Api/ApiEntryPoint.cs

+22-5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ protected virtual void Dispose(bool dispose)
132132
/// Called when [transcode beginning].
133133
/// </summary>
134134
/// <param name="path">The path.</param>
135+
/// <param name="streamId">The stream identifier.</param>
135136
/// <param name="transcodingJobId">The transcoding job identifier.</param>
136137
/// <param name="type">The type.</param>
137138
/// <param name="process">The process.</param>
@@ -140,6 +141,7 @@ protected virtual void Dispose(bool dispose)
140141
/// <param name="cancellationTokenSource">The cancellation token source.</param>
141142
/// <returns>TranscodingJob.</returns>
142143
public TranscodingJob OnTranscodeBeginning(string path,
144+
string streamId,
143145
string transcodingJobId,
144146
TranscodingJobType type,
145147
Process process,
@@ -157,7 +159,8 @@ public TranscodingJob OnTranscodeBeginning(string path,
157159
ActiveRequestCount = 1,
158160
DeviceId = deviceId,
159161
CancellationTokenSource = cancellationTokenSource,
160-
Id = transcodingJobId
162+
Id = transcodingJobId,
163+
StreamId = streamId
161164
};
162165

163166
_activeTranscodingJobs.Add(job);
@@ -316,17 +319,26 @@ private void OnTranscodeKillTimerStopped(object state)
316319
/// Kills the single transcoding job.
317320
/// </summary>
318321
/// <param name="deviceId">The device id.</param>
322+
/// <param name="streamId">The stream identifier.</param>
319323
/// <param name="deleteFiles">The delete files.</param>
320324
/// <returns>Task.</returns>
321-
/// <exception cref="ArgumentNullException">deviceId</exception>
322-
internal void KillTranscodingJobs(string deviceId, Func<string, bool> deleteFiles)
325+
internal void KillTranscodingJobs(string deviceId, string streamId, Func<string, bool> deleteFiles)
323326
{
324327
if (string.IsNullOrEmpty(deviceId))
325328
{
326329
throw new ArgumentNullException("deviceId");
327330
}
328331

329-
KillTranscodingJobs(j => string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase), deleteFiles);
332+
KillTranscodingJobs(j =>
333+
{
334+
if (string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase))
335+
{
336+
return string.IsNullOrWhiteSpace(streamId) || string.Equals(streamId, j.StreamId, StringComparison.OrdinalIgnoreCase);
337+
}
338+
339+
return false;
340+
341+
}, deleteFiles);
330342
}
331343

332344
/// <summary>
@@ -335,7 +347,7 @@ internal void KillTranscodingJobs(string deviceId, Func<string, bool> deleteFile
335347
/// <param name="killJob">The kill job.</param>
336348
/// <param name="deleteFiles">The delete files.</param>
337349
/// <returns>Task.</returns>
338-
internal void KillTranscodingJobs(Func<TranscodingJob, bool> killJob, Func<string, bool> deleteFiles)
350+
private void KillTranscodingJobs(Func<TranscodingJob, bool> killJob, Func<string, bool> deleteFiles)
339351
{
340352
var jobs = new List<TranscodingJob>();
341353

@@ -516,6 +528,11 @@ private void DeleteHlsPartialStreamFiles(string outputFilePath)
516528
/// </summary>
517529
public class TranscodingJob
518530
{
531+
/// <summary>
532+
/// Gets or sets the stream identifier.
533+
/// </summary>
534+
/// <value>The stream identifier.</value>
535+
public string StreamId { get; set; }
519536
/// <summary>
520537
/// Gets or sets the path.
521538
/// </summary>

MediaBrowser.Api/BaseApiService.cs

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using MediaBrowser.Controller.Dto;
1+
using System.Threading.Tasks;
2+
using MediaBrowser.Controller.Dto;
23
using MediaBrowser.Controller.Entities;
34
using MediaBrowser.Controller.Entities.Audio;
45
using MediaBrowser.Controller.Library;
@@ -72,6 +73,29 @@ protected object ToOptimizedResultUsingCache<T>(Guid cacheKey, DateTime? lastDat
7273
return ResultFactory.GetOptimizedResultUsingCache(Request, cacheKey, lastDateModified, cacheDuration, factoryFn);
7374
}
7475

76+
protected void AssertCanUpdateUser(IUserManager userManager, string userId)
77+
{
78+
var auth = AuthorizationContext.GetAuthorizationInfo(Request);
79+
80+
var authenticatedUser = userManager.GetUserById(auth.UserId);
81+
82+
// If they're going to update the record of another user, they must be an administrator
83+
if (!string.Equals(userId, auth.UserId, StringComparison.OrdinalIgnoreCase))
84+
{
85+
if (!authenticatedUser.Policy.IsAdministrator)
86+
{
87+
throw new SecurityException("Unauthorized access.");
88+
}
89+
}
90+
else
91+
{
92+
if (!authenticatedUser.Policy.EnableUserPreferenceAccess)
93+
{
94+
throw new SecurityException("Unauthorized access.");
95+
}
96+
}
97+
}
98+
7599
/// <summary>
76100
/// To the optimized serialized result using cache.
77101
/// </summary>
@@ -88,9 +112,9 @@ protected object ToOptimizedSerializedResultUsingCache<T>(T result)
88112
/// Gets the session.
89113
/// </summary>
90114
/// <returns>SessionInfo.</returns>
91-
protected SessionInfo GetSession()
115+
protected async Task<SessionInfo> GetSession()
92116
{
93-
var session = SessionContext.GetSession(Request);
117+
var session = await SessionContext.GetSession(Request).ConfigureAwait(false);
94118

95119
if (session == null)
96120
{

MediaBrowser.Api/ConnectService.cs

+54-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
using MediaBrowser.Common.Extensions;
1+
using System;
2+
using MediaBrowser.Common.Extensions;
23
using MediaBrowser.Controller.Connect;
34
using MediaBrowser.Controller.Library;
45
using MediaBrowser.Controller.Net;
56
using MediaBrowser.Model.Connect;
7+
using MediaBrowser.Model.Dto;
68
using ServiceStack;
79
using System.Collections.Generic;
810
using System.Linq;
@@ -73,6 +75,28 @@ public class GetLocalUser : IReturn<ConnectAuthenticationExchangeResult>
7375
public string ConnectUserId { get; set; }
7476
}
7577

78+
[Route("/Connect/Supporters", "GET")]
79+
[Authenticated(Roles = "Admin")]
80+
public class GetConnectSupporterSummary : IReturn<ConnectSupporterSummary>
81+
{
82+
}
83+
84+
[Route("/Connect/Supporters", "DELETE")]
85+
[Authenticated(Roles = "Admin")]
86+
public class RemoveConnectSupporter : IReturnVoid
87+
{
88+
[ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "DELETE")]
89+
public string Id { get; set; }
90+
}
91+
92+
[Route("/Connect/Supporters", "POST")]
93+
[Authenticated(Roles = "Admin")]
94+
public class AddConnectSupporter : IReturnVoid
95+
{
96+
[ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
97+
public string Id { get; set; }
98+
}
99+
76100
public class ConnectService : BaseApiService
77101
{
78102
private readonly IConnectManager _connectManager;
@@ -84,6 +108,35 @@ public ConnectService(IConnectManager connectManager, IUserManager userManager)
84108
_userManager = userManager;
85109
}
86110

111+
public async Task<object> Get(GetConnectSupporterSummary request)
112+
{
113+
var result = await _connectManager.GetConnectSupporterSummary().ConfigureAwait(false);
114+
var existingConnectUserIds = result.Users.Select(i => i.Id).ToList();
115+
116+
result.EligibleUsers = _userManager.Users
117+
.Where(i => !string.IsNullOrWhiteSpace(i.ConnectUserId))
118+
.Where(i => !existingConnectUserIds.Contains(i.ConnectUserId, StringComparer.OrdinalIgnoreCase))
119+
.OrderBy(i => i.Name)
120+
.Select(i => _userManager.GetUserDto(i))
121+
.ToList();
122+
123+
return ToOptimizedResult(result);
124+
}
125+
126+
public void Delete(RemoveConnectSupporter request)
127+
{
128+
var task = _connectManager.RemoveConnectSupporter(request.Id);
129+
130+
Task.WaitAll(task);
131+
}
132+
133+
public void Post(AddConnectSupporter request)
134+
{
135+
var task = _connectManager.AddConnectSupporter(request.Id);
136+
137+
Task.WaitAll(task);
138+
}
139+
87140
public object Post(CreateConnectLink request)
88141
{
89142
return _connectManager.LinkUser(request.Id, request.ConnectUsername);

MediaBrowser.Api/Images/ImageService.cs

+17-14
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ public class GetItemImage : ImageRequest
5656
/// Class UpdateItemImageIndex
5757
/// </summary>
5858
[Route("/Items/{Id}/Images/{Type}/{Index}/Index", "POST", Summary = "Updates the index for an item image")]
59-
[Authenticated]
59+
[Authenticated(Roles = "admin")]
6060
public class UpdateItemImageIndex : IReturnVoid
6161
{
6262
/// <summary>
6363
/// Gets or sets the id.
6464
/// </summary>
6565
/// <value>The id.</value>
6666
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
67-
public Guid Id { get; set; }
67+
public string Id { get; set; }
6868

6969
/// <summary>
7070
/// Gets or sets the type of the image.
@@ -143,23 +143,23 @@ public class GetUserImage : ImageRequest
143143
/// </summary>
144144
/// <value>The id.</value>
145145
[ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
146-
public Guid Id { get; set; }
146+
public string Id { get; set; }
147147
}
148148

149149
/// <summary>
150150
/// Class DeleteItemImage
151151
/// </summary>
152152
[Route("/Items/{Id}/Images/{Type}", "DELETE")]
153153
[Route("/Items/{Id}/Images/{Type}/{Index}", "DELETE")]
154-
[Authenticated]
154+
[Authenticated(Roles = "admin")]
155155
public class DeleteItemImage : DeleteImageRequest, IReturnVoid
156156
{
157157
/// <summary>
158158
/// Gets or sets the id.
159159
/// </summary>
160160
/// <value>The id.</value>
161161
[ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
162-
public Guid Id { get; set; }
162+
public string Id { get; set; }
163163
}
164164

165165
/// <summary>
@@ -175,7 +175,7 @@ public class DeleteUserImage : DeleteImageRequest, IReturnVoid
175175
/// </summary>
176176
/// <value>The id.</value>
177177
[ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "DELETE")]
178-
public Guid Id { get; set; }
178+
public string Id { get; set; }
179179
}
180180

181181
/// <summary>
@@ -191,7 +191,7 @@ public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturn
191191
/// </summary>
192192
/// <value>The id.</value>
193193
[ApiMember(Name = "Id", Description = "User Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
194-
public Guid Id { get; set; }
194+
public string Id { get; set; }
195195

196196
/// <summary>
197197
/// The raw Http Request Input Stream
@@ -206,7 +206,7 @@ public class PostUserImage : DeleteImageRequest, IRequiresRequestStream, IReturn
206206
[Route("/Items/{Id}/Images/{Type}", "POST")]
207207
[Route("/Items/{Id}/Images/{Type}/{Index}", "POST")]
208208
[Api(Description = "Posts an item image")]
209-
[Authenticated]
209+
[Authenticated(Roles = "admin")]
210210
public class PostItemImage : DeleteImageRequest, IRequiresRequestStream, IReturnVoid
211211
{
212212
/// <summary>
@@ -318,7 +318,7 @@ private ImageInfo GetImageInfo(IHasImages item, ItemImageInfo info, int? imageIn
318318

319319
try
320320
{
321-
var size = _imageProcessor.GetImageSize(info.Path, info.DateModified);
321+
var size = _imageProcessor.GetImageSize(info);
322322

323323
width = Convert.ToInt32(size.Width);
324324
height = Convert.ToInt32(size.Height);
@@ -417,11 +417,12 @@ public object Head(GetItemByNameImage request)
417417
/// <param name="request">The request.</param>
418418
public void Post(PostUserImage request)
419419
{
420-
var id = new Guid(GetPathValue(1));
420+
var userId = GetPathValue(1);
421+
AssertCanUpdateUser(_userManager, userId);
421422

422423
request.Type = (ImageType)Enum.Parse(typeof(ImageType), GetPathValue(3), true);
423424

424-
var item = _userManager.GetUserById(id);
425+
var item = _userManager.GetUserById(userId);
425426

426427
var task = PostImage(item, request.RequestStream, request.Type, Request.ContentType);
427428

@@ -434,7 +435,7 @@ public void Post(PostUserImage request)
434435
/// <param name="request">The request.</param>
435436
public void Post(PostItemImage request)
436437
{
437-
var id = new Guid(GetPathValue(1));
438+
var id = GetPathValue(1);
438439

439440
request.Type = (ImageType)Enum.Parse(typeof(ImageType), GetPathValue(3), true);
440441

@@ -451,7 +452,10 @@ public void Post(PostItemImage request)
451452
/// <param name="request">The request.</param>
452453
public void Delete(DeleteUserImage request)
453454
{
454-
var item = _userManager.GetUserById(request.Id);
455+
var userId = request.Id;
456+
AssertCanUpdateUser(_userManager, userId);
457+
458+
var item = _userManager.GetUserById(userId);
455459

456460
var task = item.DeleteImage(request.Type, request.Index ?? 0);
457461

@@ -492,7 +496,6 @@ public void Post(UpdateItemImageIndex request)
492496
/// <param name="currentIndex">Index of the current.</param>
493497
/// <param name="newIndex">The new index.</param>
494498
/// <returns>Task.</returns>
495-
/// <exception cref="System.ArgumentException">The change index operation is only applicable to backdrops and screenshots</exception>
496499
private Task UpdateItemIndex(IHasImages item, ImageType type, int currentIndex, int newIndex)
497500
{
498501
return item.SwapImages(type, currentIndex, newIndex);

MediaBrowser.Api/ItemLookupService.cs

+5-14
Original file line numberDiff line numberDiff line change
@@ -200,24 +200,15 @@ public void Post(ApplySearchCriteria request)
200200
//}
201201
item.ProviderIds = request.ProviderIds;
202202

203-
var service = new ItemRefreshService(_libraryManager)
203+
var task = _providerManager.RefreshFullItem(item, new MetadataRefreshOptions
204204
{
205-
Logger = Logger,
206-
Request = Request,
207-
ResultFactory = ResultFactory,
208-
SessionContext = SessionContext,
209-
AuthorizationContext = AuthorizationContext
210-
};
211-
212-
service.Post(new RefreshItem
213-
{
214-
Id = request.Id,
215205
MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
216206
ImageRefreshMode = ImageRefreshMode.FullRefresh,
217207
ReplaceAllMetadata = true,
218-
ReplaceAllImages = request.ReplaceAllImages,
219-
Recursive = true
220-
});
208+
ReplaceAllImages = request.ReplaceAllImages
209+
210+
}, CancellationToken.None);
211+
Task.WaitAll(task);
221212
}
222213

223214
/// <summary>

0 commit comments

Comments
 (0)