11using System ;
2+ using System . Collections . Generic ;
23using System . ComponentModel . DataAnnotations ;
34using System . Globalization ;
5+ using System . Linq ;
46using System . Net . Mime ;
57using System . Threading . Tasks ;
68using MediaBrowser . Common . Extensions ;
79using MediaBrowser . Controller ;
810using MediaBrowser . Controller . Entities ;
911using MediaBrowser . Controller . Library ;
12+ using MediaBrowser . Controller . Providers ;
1013using MediaBrowser . Model . MediaSegments ;
1114using MediaBrowser . Model . Querying ;
1215using Microsoft . AspNetCore . Authorization ;
1316using Microsoft . AspNetCore . Http ;
1417using Microsoft . AspNetCore . Mvc ;
18+ using Microsoft . Extensions . Logging ;
1519
1620namespace 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