Skip to content

Commit 7b2fbc7

Browse files
thempcgauthier-th
authored andcommitted
feat: adding anime specific Sonarr/Radarr instance support
re #2876
1 parent 7b644b0 commit 7b2fbc7

20 files changed

Lines changed: 242 additions & 157 deletions

File tree

jellyseerr-api.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,9 @@ components:
467467
is4k:
468468
type: boolean
469469
example: false
470+
isAnime:
471+
type: boolean
472+
example: false
470473
minimumAvailability:
471474
type: string
472475
example: 'In Cinema'
@@ -492,6 +495,7 @@ components:
492495
- activeProfileName
493496
- activeDirectory
494497
- is4k
498+
- isAnime
495499
- minimumAvailability
496500
- isDefault
497501
SonarrSettings:
@@ -546,6 +550,9 @@ components:
546550
is4k:
547551
type: boolean
548552
example: false
553+
isAnime:
554+
type: boolean
555+
example: false
549556
enableSeasonFolders:
550557
type: boolean
551558
example: false
@@ -571,6 +578,7 @@ components:
571578
- activeProfileName
572579
- activeDirectory
573580
- is4k
581+
- isAnime
574582
- enableSeasonFolders
575583
- isDefault
576584
ServarrTag:
@@ -1135,6 +1143,9 @@ components:
11351143
is4k:
11361144
type: boolean
11371145
example: false
1146+
isAnime:
1147+
type: boolean
1148+
example: false
11381149
serverId:
11391150
type: number
11401151
profileId:
@@ -5743,6 +5754,9 @@ paths:
57435754
is4k:
57445755
type: boolean
57455756
example: false
5757+
isAnime:
5758+
type: boolean
5759+
example: false
57465760
serverId:
57475761
type: number
57485762
profileId:
@@ -5847,6 +5861,9 @@ paths:
58475861
is4k:
58485862
type: boolean
58495863
example: false
5864+
isAnime:
5865+
type: boolean
5866+
example: false
58505867
serverId:
58515868
type: number
58525869
profileId:
@@ -6505,6 +6522,9 @@ paths:
65056522
is4k:
65066523
type: boolean
65076524
example: false
6525+
isAnime:
6526+
type: boolean
6527+
example: false
65086528
responses:
65096529
'200':
65106530
description: Returned media

server/entity/MediaRequest.ts

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ export class MediaRequest {
171171
.leftJoin('request.media', 'media')
172172
.leftJoinAndSelect('request.requestedBy', 'user')
173173
.where('request.is4k = :is4k', { is4k: requestBody.is4k })
174+
.andWhere('request.isAnime = :isAnime', { isAnime: requestBody.isAnime })
174175
.andWhere('media.tmdbId = :tmdbId', { tmdbId: tmdbMedia.id })
175176
.andWhere('media.mediaType = :mediaType', {
176177
mediaType: requestBody.mediaType,
@@ -187,6 +188,7 @@ export class MediaRequest {
187188
tmdbId: tmdbMedia.id,
188189
mediaType: requestBody.mediaType,
189190
is4k: requestBody.is4k,
191+
isAnime: requestBody.isAnime,
190192
label: 'Media Request',
191193
});
192194

@@ -373,6 +375,7 @@ export class MediaRequest {
373375
? user
374376
: undefined,
375377
is4k: requestBody.is4k,
378+
isAnime: requestBody.isAnime,
376379
serverId: requestBody.serverId,
377380
profileId: profileId,
378381
rootFolder: rootFolder,
@@ -404,6 +407,7 @@ export class MediaRequest {
404407
.filter(
405408
(request) =>
406409
request.is4k === requestBody.is4k &&
410+
request.isAnime === requestBody.isAnime &&
407411
request.status !== MediaRequestStatus.DECLINED
408412
)
409413
.reduce((seasons, request) => {
@@ -478,6 +482,7 @@ export class MediaRequest {
478482
? user
479483
: undefined,
480484
is4k: requestBody.is4k,
485+
isAnime: requestBody.isAnime,
481486
serverId: requestBody.serverId,
482487
profileId: profileId,
483488
rootFolder: rootFolder,
@@ -558,6 +563,9 @@ export class MediaRequest {
558563
@Column({ default: false })
559564
public is4k: boolean;
560565

566+
@Column({ default: false })
567+
public isAnime: boolean;
568+
561569
@Column({ nullable: true })
562570
public serverId: number;
563571

@@ -820,7 +828,10 @@ export class MediaRequest {
820828
}
821829

822830
let radarrSettings = settings.radarr.find(
823-
(radarr) => radarr.isDefault && radarr.is4k === this.is4k
831+
(radarr) =>
832+
radarr.isDefault &&
833+
radarr.is4k === this.is4k &&
834+
radarr.isAnime === this.isAnime
824835
);
825836

826837
// Fallback for requesting anime if there is no default anime server
@@ -852,9 +863,9 @@ export class MediaRequest {
852863
if (!radarrSettings) {
853864
logger.warn(
854865
`There is no default ${
855-
this.is4k ? '4K ' : ''
866+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
856867
}Radarr server configured. Did you set any of your ${
857-
this.is4k ? '4K ' : ''
868+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
858869
}Radarr servers as default?`,
859870
{
860871
label: 'Media Request',
@@ -1077,7 +1088,10 @@ export class MediaRequest {
10771088
}
10781089

10791090
let sonarrSettings = settings.sonarr.find(
1080-
(sonarr) => sonarr.isDefault && sonarr.is4k === this.is4k
1091+
(sonarr) =>
1092+
sonarr.isDefault &&
1093+
sonarr.is4k === this.is4k &&
1094+
sonarr.isAnime == this.isAnime
10811095
);
10821096

10831097
// Fallback for requesting anime if there is no default anime server
@@ -1109,9 +1123,9 @@ export class MediaRequest {
11091123
if (!sonarrSettings) {
11101124
logger.warn(
11111125
`There is no default ${
1112-
this.is4k ? '4K ' : ''
1126+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
11131127
}Sonarr server configured. Did you set any of your ${
1114-
this.is4k ? '4K ' : ''
1128+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
11151129
}Sonarr servers as default?`,
11161130
{
11171131
label: 'Media Request',
@@ -1165,11 +1179,7 @@ export class MediaRequest {
11651179
let seriesType: SonarrSeries['seriesType'] = 'standard';
11661180

11671181
// Change series type to anime if the anime keyword is present on tmdb
1168-
if (
1169-
series.keywords.results.some(
1170-
(keyword) => keyword.id === ANIME_KEYWORD_ID
1171-
)
1172-
) {
1182+
if (this.isAnime) {
11731183
seriesType = sonarrSettings.animeSeriesType ?? 'anime';
11741184
}
11751185

@@ -1371,30 +1381,38 @@ export class MediaRequest {
13711381

13721382
switch (type) {
13731383
case Notification.MEDIA_APPROVED:
1374-
event = `${this.is4k ? '4K ' : ''}${mediaType} Request Approved`;
1384+
event = `${
1385+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
1386+
}${mediaType} Request Approved`;
13751387
notifyAdmin = false;
13761388
break;
13771389
case Notification.MEDIA_DECLINED:
1378-
event = `${this.is4k ? '4K ' : ''}${mediaType} Request Declined`;
1390+
event = `${
1391+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
1392+
}${mediaType} Request Declined`;
13791393
notifyAdmin = false;
13801394
break;
13811395
case Notification.MEDIA_PENDING:
1382-
event = `New ${this.is4k ? '4K ' : ''}${mediaType} Request`;
1396+
event = `New ${
1397+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
1398+
}${mediaType} Request`;
13831399
break;
13841400
case Notification.MEDIA_AUTO_REQUESTED:
13851401
event = `${
1386-
this.is4k ? '4K ' : ''
1402+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
13871403
}${mediaType} Request Automatically Submitted`;
13881404
notifyAdmin = false;
13891405
notifySystem = false;
13901406
break;
13911407
case Notification.MEDIA_AUTO_APPROVED:
13921408
event = `${
1393-
this.is4k ? '4K ' : ''
1409+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
13941410
}${mediaType} Request Automatically Approved`;
13951411
break;
13961412
case Notification.MEDIA_FAILED:
1397-
event = `${this.is4k ? '4K ' : ''}${mediaType} Request Failed`;
1413+
event = `${
1414+
this.isAnime ? 'Anime ' : this.is4k ? '4K ' : ''
1415+
}${mediaType} Request Failed`;
13981416
break;
13991417
}
14001418

server/interfaces/api/requestInterfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type MediaRequestBody = {
1212
tvdbId?: number;
1313
seasons?: number[] | 'all';
1414
is4k?: boolean;
15+
isAnime?: boolean;
1516
serverId?: number;
1617
profileId?: number;
1718
profileName?: string;

server/interfaces/api/serviceInterfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface ServiceCommonServer {
55
id: number;
66
name: string;
77
is4k: boolean;
8+
isAnime: boolean;
89
isDefault: boolean;
910
activeProfileId: number;
1011
activeDirectory: string;

server/lib/settings/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export interface DVRSettings {
7171
activeDirectory: string;
7272
tags: number[];
7373
is4k: boolean;
74+
isAnime: boolean;
7475
isDefault: boolean;
7576
externalUrl?: string;
7677
syncEnabled: boolean;

server/routes/service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ serviceRoutes.get('/radarr', async (req, res) => {
1919
id: radarr.id,
2020
name: radarr.name,
2121
is4k: radarr.is4k,
22+
isAnime: radarr.isAnime,
2223
isDefault: radarr.isDefault,
2324
activeDirectory: radarr.activeDirectory,
2425
activeProfileId: radarr.activeProfileId,
@@ -59,6 +60,7 @@ serviceRoutes.get<{ radarrId: string }>(
5960
id: radarrSettings.id,
6061
name: radarrSettings.name,
6162
is4k: radarrSettings.is4k,
63+
isAnime: radarrSettings.isAnime,
6264
isDefault: radarrSettings.isDefault,
6365
activeDirectory: radarrSettings.activeDirectory,
6466
activeProfileId: radarrSettings.activeProfileId,
@@ -87,6 +89,7 @@ serviceRoutes.get('/sonarr', async (req, res) => {
8789
id: sonarr.id,
8890
name: sonarr.name,
8991
is4k: sonarr.is4k,
92+
isAnime: sonarr.isAnime,
9093
isDefault: sonarr.isDefault,
9194
activeDirectory: sonarr.activeDirectory,
9295
activeProfileId: sonarr.activeProfileId,
@@ -137,6 +140,7 @@ serviceRoutes.get<{ sonarrId: string }>(
137140
id: sonarrSettings.id,
138141
name: sonarrSettings.name,
139142
is4k: sonarrSettings.is4k,
143+
isAnime: sonarrSettings.isAnime,
140144
isDefault: sonarrSettings.isDefault,
141145
activeDirectory: sonarrSettings.activeDirectory,
142146
activeProfileId: sonarrSettings.activeProfileId,

server/routes/settings/radarr.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ radarrRoutes.post('/', async (req, res) => {
2727
.filter(
2828
(radarrInstance) =>
2929
radarrInstance.is4k === req.body.is4k &&
30-
radarrInstance.isAnime === req.body.isAnime
30+
radarrInstance.isAnime &&
31+
req.body.isAnime
3132
)
3233
.forEach((radarrInstance) => {
3334
radarrInstance.isDefault = false;
@@ -96,7 +97,11 @@ radarrRoutes.put<{ id: string }, RadarrSettings, RadarrSettings>(
9697
// and are the default
9798
if (req.body.isDefault) {
9899
settings.radarr
99-
.filter((radarrInstance) => radarrInstance.is4k === req.body.is4k)
100+
.filter(
101+
(radarrInstance) =>
102+
radarrInstance.is4k === req.body.is4k &&
103+
radarrInstance.isAnime === req.body.isAnime
104+
)
100105
.forEach((radarrInstance) => {
101106
radarrInstance.isDefault = false;
102107
});

server/routes/settings/sonarr.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ sonarrRoutes.post('/', async (req, res) => {
2424
// and are the default
2525
if (req.body.isDefault) {
2626
settings.sonarr
27-
.filter((sonarrInstance) => sonarrInstance.is4k === req.body.is4k)
27+
.filter(
28+
(sonarrInstance) =>
29+
sonarrInstance.is4k === req.body.is4k &&
30+
sonarrInstance.isAnime === req.body.isAnime
31+
)
2832
.forEach((sonarrInstance) => {
2933
sonarrInstance.isDefault = false;
3034
});
@@ -91,7 +95,11 @@ sonarrRoutes.put<{ id: string }>('/:id', async (req, res) => {
9195
// and are the default
9296
if (req.body.isDefault) {
9397
settings.sonarr
94-
.filter((sonarrInstance) => sonarrInstance.is4k === req.body.is4k)
98+
.filter(
99+
(sonarrInstance) =>
100+
sonarrInstance.is4k === req.body.is4k &&
101+
sonarrInstance.isAnime === req.body.isAnime
102+
)
95103
.forEach((sonarrInstance) => {
96104
sonarrInstance.isDefault = false;
97105
});

src/components/RequestBlock/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ const RequestBlock = ({ request, onUpdate }: RequestBlockProps) => {
8787
tmdbId={request.media.tmdbId}
8888
type={request.type}
8989
is4k={request.is4k}
90+
isAnime={request.isAnime}
9091
editRequest={request}
9192
onCancel={() => setShowEditModal(false)}
9293
onComplete={() => {

src/components/RequestCard/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
337337
tmdbId={request.media.tmdbId}
338338
type={request.type}
339339
is4k={request.is4k}
340+
isAnime={request.isAnime}
340341
editRequest={request}
341342
onCancel={() => setShowEditModal(false)}
342343
onComplete={() => {

0 commit comments

Comments
 (0)