Skip to content

Commit ff469cb

Browse files
authored
feat(settings): add blocklist region and language options (#1802)
1 parent aef2481 commit ff469cb

8 files changed

Lines changed: 85 additions & 8 deletions

File tree

docs/using-seerr/settings/general.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ Set the default display language for Seerr. Users can override this setting in t
4040

4141
These settings filter content shown on the "Discover" home page based on regional availability and original language, respectively. The Streaming Region filters the available streaming providers on the media page. Users can override these global settings by configuring these same options in their user settings.
4242

43+
## Blocklist Region and Blocklist Language
44+
45+
These settings control the region and language used specifically for blocklist content scanning. The "Process Blocklisted Tags" job uses these settings to determine which content to scan for blocklisting, independent of the general Discover settings.
46+
47+
- **Blocklist Region**: The region used for blocklist content scanning. Leave empty to scan all regions.
48+
- **Blocklist Language**: The language used for blocklist content scanning. Leave empty to scan all languages.
49+
50+
These settings are separate from the general "Discover Region" and "Discover Language" settings, allowing you to blocklist content from specific regions/languages regardless of what users see in their Discover pages.
51+
4352
## Blocklist Content with Tags and Limit Content Blocklisted per Tag
4453

4554
These settings blocklist any TV shows or movies that have one of the entered tags. The "Process Blocklisted Tags" job adds entries to the blocklist based on the configured blocklisted tags. If a blocklisted tag is removed, any media blocklisted under that tag will be removed from the blocklist when the "Process Blocklisted Tags" job runs.

server/job/blocklistedTagsProcessor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import type {
1414
} from '@server/lib/scanners/baseScanner';
1515
import { getSettings } from '@server/lib/settings';
1616
import logger from '@server/logger';
17-
import { createTmdbWithRegionLanguage } from '@server/routes/discover';
17+
import { createTmdbWithBlocklistSettings } from '@server/routes/discover';
1818
import type { EntityManager } from 'typeorm';
1919

2020
const TMDB_API_DELAY_MS = 250;
@@ -65,7 +65,7 @@ class BlocklistedTagProcessor implements RunnableScanner<StatusBase> {
6565
}
6666

6767
private async createBlocklistEntries(em: EntityManager) {
68-
const tmdb = createTmdbWithRegionLanguage();
68+
const tmdb = createTmdbWithBlocklistSettings();
6969

7070
const settings = getSettings();
7171
const blocklistedTags = settings.main.blocklistedTags;

server/lib/settings/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ export interface MainSettings {
146146
discoverRegion: string;
147147
streamingRegion: string;
148148
originalLanguage: string;
149+
blocklistRegion: string;
150+
blocklistLanguage: string;
149151
blocklistedTags: string;
150152
blocklistedTagsLimit: number;
151153
mediaServerType: number;
@@ -410,6 +412,8 @@ class Settings {
410412
discoverRegion: '',
411413
streamingRegion: '',
412414
originalLanguage: '',
415+
blocklistRegion: '',
416+
blocklistLanguage: '',
413417
blocklistedTags: '',
414418
blocklistedTagsLimit: 50,
415419
mediaServerType: MediaServerType.NOT_CONFIGURED,

server/routes/discover.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ export const createTmdbWithRegionLanguage = (user?: User): TheMovieDb => {
4949
});
5050
};
5151

52+
export const createTmdbWithBlocklistSettings = (): TheMovieDb => {
53+
const settings = getSettings();
54+
55+
return new TheMovieDb({
56+
discoverRegion: settings.main.blocklistRegion,
57+
originalLanguage: settings.main.blocklistLanguage,
58+
});
59+
};
60+
5261
const discoverRoutes = Router();
5362

5463
const QueryFilterOptions = z.object({

src/components/LanguageSelector/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ interface LanguageSelectorProps {
3434
serverValue?: string;
3535
isUserSettings?: boolean;
3636
isDisabled?: boolean;
37+
fieldName?: string;
3738
}
3839

3940
const LanguageSelector = ({
@@ -42,6 +43,7 @@ const LanguageSelector = ({
4243
serverValue,
4344
isUserSettings = false,
4445
isDisabled,
46+
fieldName = 'originalLanguage',
4547
}: LanguageSelectorProps) => {
4648
const intl = useIntl();
4749
const { data: languages } = useSWR<Language[]>('/api/v1/languages');
@@ -151,7 +153,7 @@ const LanguageSelector = ({
151153
options.option?.value === 'server') ||
152154
value.every((v) => v.value === 'server')
153155
) {
154-
return setFieldValue('originalLanguage', '');
156+
return setFieldValue(fieldName, '');
155157
}
156158

157159
if (
@@ -160,11 +162,11 @@ const LanguageSelector = ({
160162
options.option?.value === 'all') ||
161163
value.every((v) => v.value === 'all')
162164
) {
163-
return setFieldValue('originalLanguage', isUserSettings ? 'all' : '');
165+
return setFieldValue(fieldName, isUserSettings ? 'all' : '');
164166
}
165167

166168
setFieldValue(
167-
'originalLanguage',
169+
fieldName,
168170
value
169171
.map((lang) => lang.value)
170172
.filter((v) => v !== 'all')

src/components/RegionSelector/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ const RegionSelector = ({
8989
};
9090

9191
return (
92-
<div className="z-40 w-full">
92+
<div className="w-full">
9393
<Listbox as="div" value={selectedRegion} onChange={handleRegionSelect}>
9494
{({ open }) => (
9595
<div className="relative">
@@ -131,7 +131,7 @@ const RegionSelector = ({
131131
leave="transition-opacity ease-in duration-100"
132132
leaveFrom="opacity-100"
133133
leaveTo="opacity-0"
134-
className="absolute mt-1 w-full rounded-md bg-gray-800 shadow-lg"
134+
className="absolute z-50 mt-1 w-full rounded-md bg-gray-800 shadow-lg"
135135
>
136136
<Listbox.Options
137137
static

src/components/Settings/SettingsMain/index.tsx

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ const messages = defineMessages('components.Settings.SettingsMain', {
3838
discoverRegionTip: 'Filter content by regional availability',
3939
originallanguage: 'Discover Language',
4040
originallanguageTip: 'Filter content by original language',
41+
blocklistRegion: 'Blocklist Region',
42+
blocklistRegionTip:
43+
'Region used for blocklist content scanning (independent of discover settings)',
44+
blocklistLanguage: 'Blocklist Language',
45+
blocklistLanguageTip:
46+
'Language used for blocklist content scanning (independent of discover settings)',
4147
blocklistedTags: 'Blocklist Content with Tags',
4248
blocklistedTagsTip:
4349
'Automatically add content with tags to the blocklist using the "Process Blocklisted Tags" job',
@@ -169,6 +175,8 @@ const SettingsMain = () => {
169175
discoverRegion: data?.discoverRegion,
170176
originalLanguage: data?.originalLanguage,
171177
streamingRegion: data?.streamingRegion || 'US',
178+
blocklistRegion: data?.blocklistRegion || '',
179+
blocklistLanguage: data?.blocklistLanguage || '',
172180
blocklistedTags: data?.blocklistedTags,
173181
blocklistedTagsLimit: data?.blocklistedTagsLimit || 50,
174182
partialRequestsEnabled: data?.partialRequestsEnabled,
@@ -189,6 +197,8 @@ const SettingsMain = () => {
189197
discoverRegion: values.discoverRegion,
190198
streamingRegion: values.streamingRegion,
191199
originalLanguage: values.originalLanguage,
200+
blocklistRegion: values.blocklistRegion,
201+
blocklistLanguage: values.blocklistLanguage,
192202
blocklistedTags: values.blocklistedTags,
193203
blocklistedTagsLimit: values.blocklistedTagsLimit,
194204
partialRequestsEnabled: values.partialRequestsEnabled,
@@ -379,6 +389,7 @@ const SettingsMain = () => {
379389
<LanguageSelector
380390
setFieldValue={setFieldValue}
381391
value={values.originalLanguage}
392+
fieldName="originalLanguage"
382393
/>
383394
</div>
384395
</div>
@@ -391,7 +402,7 @@ const SettingsMain = () => {
391402
</span>
392403
</label>
393404
<div className="form-input-area">
394-
<div className="form-input-field relative z-20">
405+
<div className="form-input-field relative">
395406
<RegionSelector
396407
value={values.streamingRegion}
397408
name="streamingRegion"
@@ -402,6 +413,44 @@ const SettingsMain = () => {
402413
</div>
403414
</div>
404415
</div>
416+
<div className="form-row">
417+
<label htmlFor="blocklistRegion" className="text-label">
418+
<span>{intl.formatMessage(messages.blocklistRegion)}</span>
419+
<span className="label-tip">
420+
{intl.formatMessage(messages.blocklistRegionTip)}
421+
</span>
422+
</label>
423+
<div className="form-input-area">
424+
<div className="form-input-field">
425+
<RegionSelector
426+
value={values.blocklistRegion}
427+
name="blocklistRegion"
428+
onChange={setFieldValue}
429+
regionType="discover"
430+
/>
431+
</div>
432+
</div>
433+
</div>
434+
<div className="form-row">
435+
<label htmlFor="blocklistLanguage" className="text-label">
436+
<span>
437+
{intl.formatMessage(messages.blocklistLanguage)}
438+
</span>
439+
<span className="label-tip">
440+
{intl.formatMessage(messages.blocklistLanguageTip)}
441+
</span>
442+
</label>
443+
<div className="form-input-area">
444+
<div className="form-input-field relative z-20">
445+
<LanguageSelector
446+
setFieldValue={setFieldValue}
447+
serverValue={data?.blocklistLanguage}
448+
value={values.blocklistLanguage}
449+
fieldName="blocklistLanguage"
450+
/>
451+
</div>
452+
</div>
453+
</div>
405454
<div className="form-row">
406455
<label htmlFor="blocklistedTags" className="text-label">
407456
<span>{intl.formatMessage(messages.blocklistedTags)}</span>

src/i18n/locale/en.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,10 @@
991991
"components.Settings.SettingsMain.apikeyCopied": "Copied API key to clipboard.",
992992
"components.Settings.SettingsMain.applicationTitle": "Application Title",
993993
"components.Settings.SettingsMain.applicationurl": "Application URL",
994+
"components.Settings.SettingsMain.blocklistLanguage": "Blocklist Language",
995+
"components.Settings.SettingsMain.blocklistLanguageTip": "Language used for blocklist content scanning (independent of discover settings)",
996+
"components.Settings.SettingsMain.blocklistRegion": "Blocklist Region",
997+
"components.Settings.SettingsMain.blocklistRegionTip": "Region used for blocklist content scanning (independent of discover settings)",
994998
"components.Settings.SettingsMain.blocklistedTags": "Blocklist Content with Tags",
995999
"components.Settings.SettingsMain.blocklistedTagsLimit": "Limit Content Blocklisted per Tag",
9961000
"components.Settings.SettingsMain.blocklistedTagsLimitTip": "The \"Process Blocklisted Tags\" job will blocklist this many pages into each sort. Larger numbers will create a more accurate blocklist, but use more space.",

0 commit comments

Comments
 (0)