1
1
using System ;
2
+ using System . Collections . Generic ;
2
3
using System . ComponentModel . DataAnnotations ;
3
4
using System . Globalization ;
5
+ using System . Linq ;
4
6
using System . Net . Mime ;
5
7
using System . Threading . Tasks ;
6
8
using MediaBrowser . Common . Extensions ;
7
9
using MediaBrowser . Controller ;
8
10
using MediaBrowser . Controller . Entities ;
9
11
using MediaBrowser . Controller . Library ;
12
+ using MediaBrowser . Controller . Providers ;
10
13
using MediaBrowser . Model . MediaSegments ;
11
14
using MediaBrowser . Model . Querying ;
12
15
using Microsoft . AspNetCore . Authorization ;
13
16
using Microsoft . AspNetCore . Http ;
14
17
using Microsoft . AspNetCore . Mvc ;
18
+ using Microsoft . Extensions . Logging ;
15
19
16
20
namespace Jellyfin . Plugin . MediaSegmentsApi . Controllers ;
17
21
@@ -23,20 +27,26 @@ namespace Jellyfin.Plugin.MediaSegmentsApi.Controllers;
23
27
/// </remarks>
24
28
/// <param name="mediaSegmentManager">MediaSegmentManager.</param>
25
29
/// <param name="libraryManager">The Library manager.</param>
30
+ /// <param name="segmentProviders">The Segment providers.</param>
31
+ /// <param name="logger">The logger.</param>
26
32
[ Authorize ( Policy = "RequiresElevation" ) ]
27
33
[ ApiController ]
28
34
[ Produces ( MediaTypeNames . Application . Json ) ]
29
35
[ 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
31
37
{
32
38
private readonly IMediaSegmentManager _mediaSegmentManager = mediaSegmentManager ;
33
39
34
40
private readonly ILibraryManager _libraryManager = libraryManager ;
35
41
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
+
36
46
/// <summary>
37
- /// Plugin meta endpoint.
47
+ /// Plugin metadata endpoint.
38
48
/// </summary>
39
- /// <returns>The created segment .</returns>
49
+ /// <returns>The plugin metadata .</returns>
40
50
[ HttpGet ]
41
51
[ ProducesResponseType ( StatusCodes . Status200OK ) ]
42
52
public JsonResult GetPluginMetadata ( )
@@ -46,6 +56,8 @@ public JsonResult GetPluginMetadata()
46
56
version = Plugin . Instance ! . Version . ToString ( 3 ) ,
47
57
} ;
48
58
59
+ _logger . LogInformation ( "Plugin metadata: {Json}" , json ) ;
60
+
49
61
return new JsonResult ( json ) ;
50
62
}
51
63
@@ -67,14 +79,40 @@ public async Task<ActionResult<QueryResult<MediaSegmentDto>>> CreateSegmentAsync
67
79
var item = _libraryManager . GetItemById < BaseItem > ( itemId ) ;
68
80
if ( item is null || segment is null || providerId is null )
69
81
{
70
- return NotFound ( ) ;
82
+ return NotFound ( ) ; // Item, segment, or providerId missing
71
83
}
72
84
73
- segment . ItemId = item . Id ;
85
+ var libraryOptions = _libraryManager . GetLibraryOptions ( item ) ;
74
86
75
- var providerUID = providerId . ToLowerInvariant ( ) . GetMD5 ( ) . ToString ( "N" , CultureInfo . InvariantCulture ) ;
87
+ // Calculate provider UID from query parameter
88
+ var providerUID = GetProviderId ( providerId ) ;
76
89
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 ) ;
78
116
return Ok ( seg ) ;
79
117
}
80
118
@@ -88,7 +126,13 @@ public async Task<ActionResult<QueryResult<MediaSegmentDto>>> CreateSegmentAsync
88
126
public async Task DeleteSegmentAsync (
89
127
[ FromRoute , Required ] Guid segmentId )
90
128
{
129
+ _logger . LogInformation ( "Deleting segment with id {SegmentId}" , segmentId ) ;
91
130
await _mediaSegmentManager . DeleteSegmentAsync ( segmentId ) . ConfigureAwait ( false ) ;
92
131
Ok ( ) ;
93
132
}
133
+
134
+ private static string GetProviderId ( string name )
135
+ => name . ToLowerInvariant ( )
136
+ . GetMD5 ( )
137
+ . ToString ( "N" , CultureInfo . InvariantCulture ) ;
94
138
}
0 commit comments