Skip to content

Commit 4e92dc2

Browse files
committed
Filter invalid Providers
1 parent 3f790dc commit 4e92dc2

File tree

1 file changed

+51
-7
lines changed

1 file changed

+51
-7
lines changed

Jellyfin.Plugin.MediaSegmentsApi/Controllers/MediaSegmentsApiController.cs

+51-7
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.ComponentModel.DataAnnotations;
34
using System.Globalization;
5+
using System.Linq;
46
using System.Net.Mime;
57
using System.Threading.Tasks;
68
using MediaBrowser.Common.Extensions;
79
using MediaBrowser.Controller;
810
using MediaBrowser.Controller.Entities;
911
using MediaBrowser.Controller.Library;
12+
using MediaBrowser.Controller.Providers;
1013
using MediaBrowser.Model.MediaSegments;
1114
using MediaBrowser.Model.Querying;
1215
using Microsoft.AspNetCore.Authorization;
1316
using Microsoft.AspNetCore.Http;
1417
using Microsoft.AspNetCore.Mvc;
18+
using Microsoft.Extensions.Logging;
1519

1620
namespace Jellyfin.Plugin.MediaSegmentsApi.Controllers;
1721

@@ -23,20 +27,26 @@ namespace Jellyfin.Plugin.MediaSegmentsApi.Controllers;
2327
/// </remarks>
2428
/// <param name="mediaSegmentManager">MediaSegmentManager.</param>
2529
/// <param name="libraryManager">The Library manager.</param>
30+
/// <param name="segmentProviders">The Segment providers.</param>
31+
/// <param name="logger">The logger.</param>
2632
[Authorize(Policy = "RequiresElevation")]
2733
[ApiController]
2834
[Produces(MediaTypeNames.Application.Json)]
2935
[Route("MediaSegmentsApi")]
30-
public class MediaSegmentsApiController(IMediaSegmentManager mediaSegmentManager, ILibraryManager libraryManager) : ControllerBase
36+
public class MediaSegmentsApiController(IMediaSegmentManager mediaSegmentManager, ILibraryManager libraryManager, IEnumerable<IMediaSegmentProvider> segmentProviders, ILogger<MediaSegmentsApiController> logger) : ControllerBase
3137
{
3238
private readonly IMediaSegmentManager _mediaSegmentManager = mediaSegmentManager;
3339

3440
private readonly ILibraryManager _libraryManager = libraryManager;
3541

42+
private readonly IEnumerable<IMediaSegmentProvider> _segmentProviders = [.. segmentProviders.OrderBy(i => i is IHasOrder hasOrder ? hasOrder.Order : 0)];
43+
44+
private readonly ILogger<MediaSegmentsApiController> _logger = logger;
45+
3646
/// <summary>
37-
/// Plugin meta endpoint.
47+
/// Plugin metadata endpoint.
3848
/// </summary>
39-
/// <returns>The created segment.</returns>
49+
/// <returns>The plugin metadata.</returns>
4050
[HttpGet]
4151
[ProducesResponseType(StatusCodes.Status200OK)]
4252
public JsonResult GetPluginMetadata()
@@ -46,6 +56,8 @@ public JsonResult GetPluginMetadata()
4656
version = Plugin.Instance!.Version.ToString(3),
4757
};
4858

59+
_logger.LogInformation("Plugin metadata: {Json}", json);
60+
4961
return new JsonResult(json);
5062
}
5163

@@ -67,14 +79,40 @@ public async Task<ActionResult<QueryResult<MediaSegmentDto>>> CreateSegmentAsync
6779
var item = _libraryManager.GetItemById<BaseItem>(itemId);
6880
if (item is null || segment is null || providerId is null)
6981
{
70-
return NotFound();
82+
return NotFound(); // Item, segment, or providerId missing
7183
}
7284

73-
segment.ItemId = item.Id;
85+
var libraryOptions = _libraryManager.GetLibraryOptions(item);
7486

75-
var providerUID = providerId.ToLowerInvariant().GetMD5().ToString("N", CultureInfo.InvariantCulture);
87+
// Calculate provider UID from query parameter
88+
var providerUID = GetProviderId(providerId);
7689

77-
var seg = await _mediaSegmentManager.CreateSegmentAsync(segment, providerUID).ConfigureAwait(false);
90+
// Get the list of active provider UIDs, i.e. those not disabled in the library options.
91+
var activeProviderIds = _segmentProviders
92+
.Where(e => !libraryOptions.DisabledMediaSegmentProviders.Contains(GetProviderId(e.Name)))
93+
.Select(e => GetProviderId(e.Name))
94+
.ToList();
95+
96+
// Check for the specific provider
97+
if (!activeProviderIds.Contains(providerUID))
98+
{
99+
// Return a 404 response with a custom message for provider not found.
100+
_logger.LogError("Provider with id '{ProviderId}' not found.", providerId);
101+
return NotFound(new { Message = $"Provider with id '{providerId}' not found." });
102+
}
103+
104+
// Assign the item id to the segment
105+
var mediaSegment = new MediaSegmentDto
106+
{
107+
ItemId = item.Id,
108+
StartTicks = segment.StartTicks,
109+
EndTicks = segment.EndTicks
110+
};
111+
112+
_logger.LogInformation("Creating segment for item {ItemId} with provider {ProviderId}", item.Id, providerId);
113+
114+
// Create the segment using the provider UID
115+
var seg = await _mediaSegmentManager.CreateSegmentAsync(mediaSegment, providerUID).ConfigureAwait(false);
78116
return Ok(seg);
79117
}
80118

@@ -88,7 +126,13 @@ public async Task<ActionResult<QueryResult<MediaSegmentDto>>> CreateSegmentAsync
88126
public async Task DeleteSegmentAsync(
89127
[FromRoute, Required] Guid segmentId)
90128
{
129+
_logger.LogInformation("Deleting segment with id {SegmentId}", segmentId);
91130
await _mediaSegmentManager.DeleteSegmentAsync(segmentId).ConfigureAwait(false);
92131
Ok();
93132
}
133+
134+
private static string GetProviderId(string name)
135+
=> name.ToLowerInvariant()
136+
.GetMD5()
137+
.ToString("N", CultureInfo.InvariantCulture);
94138
}

0 commit comments

Comments
 (0)