Skip to content

Commit 81075e9

Browse files
feat: Add search integration to show Seerr results in Jellyfin search, updated config page slightly to organize settings more intuitively (v1.6.0.0)
1 parent 337554e commit 81075e9

6 files changed

Lines changed: 417 additions & 8 deletions

File tree

src/Jellyfin.Plugin.SeerrFin/Configuration/PluginConfiguration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class PluginConfiguration : BasePluginConfiguration
4949

5050
public bool QualityRecommendations { get; set; } = true;
5151

52+
public bool AddSeerrResultsInSearch { get; set; } = true;
53+
5254
public string DisplayCustomizationsJson { get; set; } = string.Empty;
5355

5456
public AdvancedSettings? Advanced { get; set; }

src/Jellyfin.Plugin.SeerrFin/Configuration/config.html

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@
679679
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 185.04 133.4"><defs><style>.cls-1{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" y1="66.7" x2="185.04" y2="66.7" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#90cea1"/><stop offset="0.56" stop-color="#3cbec9"/><stop offset="1" stop-color="#00b3e5"/></linearGradient></defs><title>Asset 4</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M51.06,66.7h0A17.67,17.67,0,0,1,68.73,49h-.1A17.67,17.67,0,0,1,86.3,66.7h0A17.67,17.67,0,0,1,68.63,84.37h.1A17.67,17.67,0,0,1,51.06,66.7Zm82.67-31.33h32.9A17.67,17.67,0,0,0,184.3,17.7h0A17.67,17.67,0,0,0,166.63,0h-32.9A17.67,17.67,0,0,0,116.06,17.7h0A17.67,17.67,0,0,0,133.73,35.37Zm-113,98h63.9A17.67,17.67,0,0,0,102.3,115.7h0A17.67,17.67,0,0,0,84.63,98H20.73A17.67,17.67,0,0,0,3.06,115.7h0A17.67,17.67,0,0,0,20.73,133.37Zm83.92-49h6.25L125.5,49h-8.35l-8.9,23.2h-.1L99.4,49H90.5Zm32.45,0h7.8V49h-7.8Zm22.2,0h24.95V77.2H167.1V70h15.35V62.8H167.1V56.2h16.25V49h-24ZM10.1,35.4h7.8V6.9H28V0H0V6.9H10.1ZM39,35.4h7.8V20.1H61.9V35.4h7.8V0H61.9V13.2H46.75V0H39Zm41.25,0h25V28.2H88V21h15.35V13.8H88V7.2h16.25V0h-24Zm-79,49H9V57.25h.1l9,27.15H24l9.3-27.15h.1V84.4h7.8V49H29.45l-8.2,23.1h-.1L13,49H1.2Zm112.09,49H126a24.59,24.59,0,0,0,7.56-1.15,19.52,19.52,0,0,0,6.35-3.37,16.37,16.37,0,0,0,4.37-5.5A16.91,16.91,0,0,0,146,115.8a18.5,18.5,0,0,0-1.68-8.25,15.1,15.1,0,0,0-4.52-5.53A18.55,18.55,0,0,0,133.07,99,33.54,33.54,0,0,0,125,98H113.29Zm7.81-28.2h4.6a17.43,17.43,0,0,1,4.67.62,11.68,11.68,0,0,1,3.88,1.88,9,9,0,0,1,2.62,3.18,9.87,9.87,0,0,1,1,4.52,11.92,11.92,0,0,1-1,5.08,8.69,8.69,0,0,1-2.67,3.34,10.87,10.87,0,0,1-4,1.83,21.57,21.57,0,0,1-5,.55H121.1Zm36.14,28.2h14.5a23.11,23.11,0,0,0,4.73-.5,13.38,13.38,0,0,0,4.27-1.65,9.42,9.42,0,0,0,3.1-3,8.52,8.52,0,0,0,1.2-4.68,9.16,9.16,0,0,0-.55-3.2,7.79,7.79,0,0,0-1.57-2.62,8.38,8.38,0,0,0-2.45-1.85,10,10,0,0,0-3.18-1v-.1a9.28,9.28,0,0,0,4.43-2.82,7.42,7.42,0,0,0,1.67-5,8.34,8.34,0,0,0-1.15-4.65,7.88,7.88,0,0,0-3-2.73,12.9,12.9,0,0,0-4.17-1.3,34.42,34.42,0,0,0-4.63-.32h-13.2Zm7.8-28.8h5.3a10.79,10.79,0,0,1,1.85.17,5.77,5.77,0,0,1,1.7.58,3.33,3.33,0,0,1,1.23,1.13,3.22,3.22,0,0,1,.47,1.82,3.63,3.63,0,0,1-.42,1.8,3.34,3.34,0,0,1-1.13,1.2,4.78,4.78,0,0,1-1.57.65,8.16,8.16,0,0,1-1.78.2H165Zm0,14.15h5.9a15.12,15.12,0,0,1,2.05.15,7.83,7.83,0,0,1,2,.55,4,4,0,0,1,1.58,1.17,3.13,3.13,0,0,1,.62,2,3.71,3.71,0,0,1-.47,1.95,4,4,0,0,1-1.23,1.3,4.78,4.78,0,0,1-1.67.7,8.91,8.91,0,0,1-1.83.2h-7Z"/></g></g></svg>
680680
</span>
681681
</button>
682-
<button type="button" class="bst-page-nav-btn" data-bst-panel="display">Display settings</button>
682+
<button type="button" class="bst-page-nav-btn" data-bst-panel="display">Settings</button>
683683
<button type="button" class="bst-page-nav-btn" data-bst-panel="advanced">Advanced</button>
684684
</nav>
685685

@@ -966,6 +966,12 @@
966966
</label>
967967
</div>
968968
</div>
969+
</div>
970+
</div>
971+
972+
<div class="bst-section-container">
973+
<div class="bst-section-title">Tweaks</div>
974+
<div class="bst-card">
969975
<div class="bst-toggle-row">
970976
<div class="bst-toggle-copy">
971977
<label class="bst-toggle-label" for="qualityRecommendations">Quality recommendations</label>
@@ -1004,6 +1010,12 @@
10041010
</label>
10051011
</div>
10061012
</div>
1013+
</div>
1014+
</div>
1015+
1016+
<div class="bst-section-container">
1017+
<div class="bst-section-title">Hide unwanted content</div>
1018+
<div class="bst-card">
10071019
<div class="bst-toggle-row">
10081020
<div class="bst-toggle-copy">
10091021
<label class="bst-toggle-label" for="advHideRequestedMedia">Hide requested media</label>
@@ -1033,6 +1045,24 @@
10331045
</div>
10341046
</div>
10351047
</div>
1048+
1049+
<div class="bst-section-container">
1050+
<div class="bst-section-title">Search</div>
1051+
<div class="bst-card">
1052+
<div class="bst-toggle-row">
1053+
<div class="bst-toggle-copy">
1054+
<label class="bst-toggle-label" for="addSeerrResultsInSearch">Add Seerr results in Search</label>
1055+
<div class="bst-field-desc">Add Seerr movie/tv show results to Jellyfin search results to let you request specific content from Seerr.</div>
1056+
</div>
1057+
<div class="bst-toggle-actions">
1058+
<label class="bst-toggle">
1059+
<input id="addSeerrResultsInSearch" name="addSeerrResultsInSearch" type="checkbox" checked />
1060+
<span class="bst-toggle-slider"></span>
1061+
</label>
1062+
</div>
1063+
</div>
1064+
</div>
1065+
</div>
10361066
</div>
10371067

10381068
<div class="bst-page-panel" data-bst-panel="advanced">
@@ -2182,6 +2212,7 @@ <h3 id="bstCustomizeModalTitle" class="bst-modal-title"></h3>
21822212
document.querySelector('#discoverUsePosters').checked = config.DiscoverUsePosters !== false;
21832213
document.querySelector('#elegantFinFixes').checked = config.ElegantFinFixes === true;
21842214
document.querySelector('#qualityRecommendations').checked = config.QualityRecommendations !== false;
2215+
document.querySelector('#addSeerrResultsInSearch').checked = config.AddSeerrResultsInSearch !== false;
21852216
loadDiscoverReleaseTypes(config.DiscoverReleaseTypes || config.discoverReleaseTypes || []);
21862217
setAdvancedFormValues(loadAdvancedFromConfig(config));
21872218
document.querySelector('#advDeveloperMode').checked = config.DeveloperMode === true;
@@ -2216,6 +2247,7 @@ <h3 id="bstCustomizeModalTitle" class="bst-modal-title"></h3>
22162247
config.DiscoverUsePosters = document.querySelector('#discoverUsePosters').checked;
22172248
config.ElegantFinFixes = document.querySelector('#elegantFinFixes').checked;
22182249
config.QualityRecommendations = document.querySelector('#qualityRecommendations').checked;
2250+
config.AddSeerrResultsInSearch = document.querySelector('#addSeerrResultsInSearch').checked;
22192251
config.DiscoverReleaseTypes = getDiscoverReleaseTypesPayload();
22202252
config.Advanced = buildAdvancedPayload();
22212253
config.DeveloperMode = document.querySelector('#advDeveloperMode').checked;

src/Jellyfin.Plugin.SeerrFin/Controllers/SeerrFinController.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ public ActionResult GetDisplaySettings()
180180
config.DiscoverUsePosters,
181181
config.ElegantFinFixes,
182182
config.QualityRecommendations,
183+
config.AddSeerrResultsInSearch,
183184
displayCustomizations = DisplayCustomizationsHelper.Resolve(config),
184185
advanced = AdvancedSettingsHelper.BuildFrontendPayload(config)
185186
});
@@ -421,6 +422,26 @@ private ActionResult<QueryResult<BaseItemDto>> DiscoverRow(
421422
int? limit) =>
422423
_discoveryService.GetDiscoverRow(GetUsername(userManager) ?? string.Empty, jellyseerrPath, mediaType, startIndex, limit);
423424

425+
[HttpGet("search")]
426+
[Authorize]
427+
public ActionResult<QueryResult<BaseItemDto>> Search(
428+
[FromServices] IUserManager userManager,
429+
[FromQuery] string? query,
430+
[FromQuery] string? language = null)
431+
{
432+
if (string.IsNullOrWhiteSpace(query))
433+
{
434+
return BadRequest(new
435+
{
436+
error = true,
437+
code = "missing_query",
438+
message = "Search query is required."
439+
});
440+
}
441+
442+
return _discoveryService.Search(GetUsername(userManager) ?? string.Empty, query, language);
443+
}
444+
424445
[HttpGet("genres/movie")]
425446
[Authorize]
426447
public ActionResult MovieGenres([FromServices] IUserManager userManager)

src/Jellyfin.Plugin.SeerrFin/Inject/seerrfin-tabs.css

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.seerrfin-movies-sections,
22
.seerrfin-tv-sections,
3-
.seerrfin-requests-sections {
3+
.seerrfin-requests-sections,
4+
.seerrfin-search-section {
45
--seerrfin-discover-backdrop-width: 20em;
56
--seerrfin-discover-portrait-width: 13.333em;
67
}
@@ -114,6 +115,15 @@
114115
gap: 0.75em;
115116
}
116117

118+
.seerrfin-search-section {
119+
margin-bottom: 1.5em;
120+
}
121+
122+
.seerrfin-search-subtitle {
123+
color: var(--secondaryTextColor);
124+
font-size: 0.85em;
125+
}
126+
117127
.seerrfin-view-more {
118128
background: none;
119129
border: none;
@@ -181,7 +191,8 @@
181191
}
182192

183193
.seerrfin-poster-section .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop),
184-
.seerrfin-grid-view .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop) {
194+
.seerrfin-grid-view .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop),
195+
.seerrfin-search-section .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop) {
185196
width: var(--seerrfin-discover-portrait-width);
186197
}
187198

@@ -284,6 +295,7 @@
284295
/* ElegantFin fixes */
285296
html.seerrfin-elegantfin .seerrfin-movies-sections .seerrfin-discover-card,
286297
html.seerrfin-elegantfin .seerrfin-tv-sections .seerrfin-discover-card,
298+
html.seerrfin-elegantfin .seerrfin-search-section .seerrfin-discover-card,
287299
html.seerrfin-elegantfin .seerrfin-movies-sections .seerrfin-box-card,
288300
html.seerrfin-elegantfin .seerrfin-tv-sections .seerrfin-box-card,
289301
html.seerrfin-elegantfin .seerrfin-grid-view .seerrfin-discover-card {
@@ -296,7 +308,8 @@ html.seerrfin-elegantfin .seerrfin-discover-card--backdrop {
296308
}
297309

298310
html.seerrfin-elegantfin .seerrfin-poster-section .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop),
299-
html.seerrfin-elegantfin .seerrfin-grid-view .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop) {
311+
html.seerrfin-elegantfin .seerrfin-grid-view .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop),
312+
html.seerrfin-elegantfin .seerrfin-search-section .seerrfin-discover-card:not(.seerrfin-discover-card--backdrop) {
300313
width: var(--seerrfin-discover-portrait-width) !important;
301314
}
302315

0 commit comments

Comments
 (0)