Feature/settings add flaresolverr (#568)
* [Codegen] Update to server changes * Set "dialogTitle" by default to "settingTitle" for "NumberSetting" * Add FlareSolverr to settings * [VersionMapping] Require server version "r1477" for preview * Replace static strings with translation keys
This commit is contained in:
@@ -88,7 +88,6 @@ export function ReaderSettingsOptions({
|
|||||||
{fitPageToWindowEligible && !fitPageToWindow && (
|
{fitPageToWindowEligible && !fitPageToWindow && (
|
||||||
<NumberSetting
|
<NumberSetting
|
||||||
settingTitle={t('reader.settings.label.reader_width')}
|
settingTitle={t('reader.settings.label.reader_width')}
|
||||||
dialogTitle={t('reader.settings.label.reader_width')}
|
|
||||||
settingValue={`${readerWidth}%`}
|
settingValue={`${readerWidth}%`}
|
||||||
value={readerWidth}
|
value={readerWidth}
|
||||||
minValue={10}
|
minValue={10}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ type BaseProps = {
|
|||||||
minValue?: number;
|
minValue?: number;
|
||||||
maxValue?: number;
|
maxValue?: number;
|
||||||
stepSize?: number;
|
stepSize?: number;
|
||||||
dialogTitle: string;
|
dialogTitle?: string;
|
||||||
dialogDescription?: string;
|
dialogDescription?: string;
|
||||||
dialogDisclaimer?: string;
|
dialogDisclaimer?: string;
|
||||||
valueUnit: string;
|
valueUnit: string;
|
||||||
@@ -57,7 +57,7 @@ export const NumberSetting = ({
|
|||||||
minValue,
|
minValue,
|
||||||
maxValue,
|
maxValue,
|
||||||
stepSize,
|
stepSize,
|
||||||
dialogTitle,
|
dialogTitle = settingTitle,
|
||||||
valueUnit,
|
valueUnit,
|
||||||
handleUpdate,
|
handleUpdate,
|
||||||
showSlider,
|
showSlider,
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ export const DownloadAheadSetting = () => {
|
|||||||
maxValue={MAX_LIMIT}
|
maxValue={MAX_LIMIT}
|
||||||
defaultValue={DEFAULT_LIMIT}
|
defaultValue={DEFAULT_LIMIT}
|
||||||
showSlider
|
showSlider
|
||||||
dialogTitle={t('download.settings.download_ahead.label.unread_chapters_to_download')}
|
|
||||||
dialogDescription={t('download.settings.download_ahead.label.description')}
|
dialogDescription={t('download.settings.download_ahead.label.description')}
|
||||||
dialogDisclaimer={t('download.settings.download_ahead.label.disclaimer')}
|
dialogDisclaimer={t('download.settings.download_ahead.label.disclaimer')}
|
||||||
valueUnit={t('chapter.title')}
|
valueUnit={t('chapter.title')}
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ export const GlobalUpdateSettingsInterval = () => {
|
|||||||
maxValue={MAX_INTERVAL_HOURS}
|
maxValue={MAX_INTERVAL_HOURS}
|
||||||
defaultValue={DEFAULT_INTERVAL_HOURS}
|
defaultValue={DEFAULT_INTERVAL_HOURS}
|
||||||
showSlider
|
showSlider
|
||||||
dialogTitle={t('library.settings.global_update.auto_update.interval.label.title')}
|
|
||||||
valueUnit={t('global.time.hour_short')}
|
valueUnit={t('global.time.hour_short')}
|
||||||
handleUpdate={updateSetting}
|
handleUpdate={updateSetting}
|
||||||
disabled={!doAutoUpdates}
|
disabled={!doAutoUpdates}
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ export const WebUIUpdateIntervalSetting = ({ disabled = false }: { disabled?: bo
|
|||||||
maxValue={MAX_VALUE}
|
maxValue={MAX_VALUE}
|
||||||
defaultValue={DEFAULT_VALUE}
|
defaultValue={DEFAULT_VALUE}
|
||||||
showSlider
|
showSlider
|
||||||
dialogTitle={t('settings.webui.auto_update.label.interval')}
|
|
||||||
valueUnit={t('global.time.hour_short')}
|
valueUnit={t('global.time.hour_short')}
|
||||||
handleUpdate={updateSetting}
|
handleUpdate={updateSetting}
|
||||||
disabled={disabled || !shouldAutoUpdate}
|
disabled={disabled || !shouldAutoUpdate}
|
||||||
|
|||||||
@@ -392,7 +392,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"time": {
|
"time": {
|
||||||
"hour_short": "h"
|
"hour_short": "h",
|
||||||
|
"minutes": {
|
||||||
|
"minute_one": "Minute",
|
||||||
|
"minute_other": "Minutes",
|
||||||
|
"value": "{{count}} $t(global.time.minutes.minute, lowercase)"
|
||||||
|
},
|
||||||
|
"seconds": {
|
||||||
|
"second_one": "Second",
|
||||||
|
"second_other": "Seconds",
|
||||||
|
"value": "{{count}} $t(global.time.seconds.second, lowercase)"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"update": {
|
"update": {
|
||||||
"label": {
|
"label": {
|
||||||
@@ -792,6 +802,42 @@
|
|||||||
},
|
},
|
||||||
"title": "Authentication"
|
"title": "Authentication"
|
||||||
},
|
},
|
||||||
|
"cloudflare": {
|
||||||
|
"flaresolverr": {
|
||||||
|
"enabled": {
|
||||||
|
"label": {
|
||||||
|
"description": "See <2>FlareSolverr</2> for information on how to set it up",
|
||||||
|
"title": "FlareSolverr enabled"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"session": {
|
||||||
|
"name": {
|
||||||
|
"label": {
|
||||||
|
"title": "FlareSolverr session name"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ttl": {
|
||||||
|
"label": {
|
||||||
|
"description": "FlareSolverr will automatically rotate expired sessions based on the TTL provided in minutes",
|
||||||
|
"title": "FlareSolverr session TTL"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"timeout": {
|
||||||
|
"label": {
|
||||||
|
"description": "How much time FlareSolverr has to handle the request",
|
||||||
|
"title": "FlareSolverr request timeout"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"label": {
|
||||||
|
"description": "The address of the FlareSolverr server",
|
||||||
|
"title": "FlareSolverr server url"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Cloudflare bypass"
|
||||||
|
},
|
||||||
"local_source": {
|
"local_source": {
|
||||||
"path": {
|
"path": {
|
||||||
"label": {
|
"label": {
|
||||||
|
|||||||
@@ -522,5 +522,12 @@ export const SERVER_SETTINGS = gql`
|
|||||||
|
|
||||||
# local source
|
# local source
|
||||||
localSourcePath
|
localSourcePath
|
||||||
|
|
||||||
|
# Cloudflare bypass
|
||||||
|
flareSolverrEnabled
|
||||||
|
flareSolverrUrl
|
||||||
|
flareSolverrTimeout
|
||||||
|
flareSolverrSessionName
|
||||||
|
flareSolverrSessionTtl
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -2502,7 +2502,7 @@ export type WebuiUpdateInfoFragment = { __typename?: 'WebUIUpdateInfo', channel:
|
|||||||
|
|
||||||
export type WebuiUpdateStatusFragment = { __typename?: 'WebUIUpdateStatus', progress: number, state: UpdateState, info: { __typename?: 'WebUIUpdateInfo', channel: string, tag: string } };
|
export type WebuiUpdateStatusFragment = { __typename?: 'WebUIUpdateStatus', progress: number, state: UpdateState, info: { __typename?: 'WebUIUpdateInfo', channel: string, tag: string } };
|
||||||
|
|
||||||
export type ServerSettingsFragment = { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string };
|
export type ServerSettingsFragment = { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string, flareSolverrEnabled: boolean, flareSolverrUrl: string, flareSolverrTimeout: number, flareSolverrSessionName: string, flareSolverrSessionTtl: number };
|
||||||
|
|
||||||
export type CreateBackupMutationVariables = Exact<{
|
export type CreateBackupMutationVariables = Exact<{
|
||||||
input: CreateBackupInput;
|
input: CreateBackupInput;
|
||||||
@@ -2834,14 +2834,14 @@ export type ResetServerSettingsMutationVariables = Exact<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type ResetServerSettingsMutation = { __typename?: 'Mutation', resetSettings: { __typename?: 'ResetSettingsPayload', clientMutationId?: string | null, settings: { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string } } };
|
export type ResetServerSettingsMutation = { __typename?: 'Mutation', resetSettings: { __typename?: 'ResetSettingsPayload', clientMutationId?: string | null, settings: { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string, flareSolverrEnabled: boolean, flareSolverrUrl: string, flareSolverrTimeout: number, flareSolverrSessionName: string, flareSolverrSessionTtl: number } } };
|
||||||
|
|
||||||
export type UpdateServerSettingsMutationVariables = Exact<{
|
export type UpdateServerSettingsMutationVariables = Exact<{
|
||||||
input: SetSettingsInput;
|
input: SetSettingsInput;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type UpdateServerSettingsMutation = { __typename?: 'Mutation', setSettings: { __typename?: 'SetSettingsPayload', clientMutationId?: string | null, settings: { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string } } };
|
export type UpdateServerSettingsMutation = { __typename?: 'Mutation', setSettings: { __typename?: 'SetSettingsPayload', clientMutationId?: string | null, settings: { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string, flareSolverrEnabled: boolean, flareSolverrUrl: string, flareSolverrTimeout: number, flareSolverrSessionName: string, flareSolverrSessionTtl: number } } };
|
||||||
|
|
||||||
export type GetSourceMangasFetchMutationVariables = Exact<{
|
export type GetSourceMangasFetchMutationVariables = Exact<{
|
||||||
input: FetchSourceMangaInput;
|
input: FetchSourceMangaInput;
|
||||||
@@ -2919,7 +2919,7 @@ export type GetCategoryMangasQueryVariables = Exact<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
|
||||||
export type GetCategoryMangasQuery = { __typename?: 'Query', category: { __typename?: 'CategoryType', mangas: { __typename?: 'MangaNodeList', totalCount: number, nodes: Array<{ __typename?: 'MangaType', unreadCount: number, downloadCount: number, artist?: string | null, author?: string | null, chaptersLastFetchedAt?: any | null, description?: string | null, genre: Array<string>, id: number, inLibrary: boolean, inLibraryAt: any, initialized: boolean, lastFetchedAt?: any | null, realUrl?: string | null, status: MangaStatus, thumbnailUrl?: string | null, title: string, url: string, lastReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestFetchedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestUploadedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, categories: { __typename?: 'CategoryNodeList', totalCount: number, nodes: Array<{ __typename?: 'CategoryType', default: boolean, id: number, includeInUpdate: IncludeOrExclude, includeInDownload: IncludeOrExclude, name: string, order: number, meta: Array<{ __typename?: 'CategoryMetaType', key: string, value: string }>, mangas: { __typename?: 'MangaNodeList', totalCount: number } }> }, chapters: { __typename?: 'ChapterNodeList', totalCount: number }, meta: Array<{ __typename?: 'MangaMetaType', key: string, value: string }>, source?: { __typename?: 'SourceType', displayName: string, iconUrl: string, id: any, isConfigurable: boolean, isNsfw: boolean, lang: string, name: string, supportsLatest: boolean, extension: { __typename?: 'ExtensionType', pkgName: string, repo?: string | null } } | null }>, pageInfo: { __typename?: 'PageInfo', endCursor?: any | null, hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: any | null } } } };
|
export type GetCategoryMangasQuery = { __typename?: 'Query', category: { __typename?: 'CategoryType', id: number, mangas: { __typename?: 'MangaNodeList', totalCount: number, nodes: Array<{ __typename?: 'MangaType', unreadCount: number, downloadCount: number, artist?: string | null, author?: string | null, chaptersLastFetchedAt?: any | null, description?: string | null, genre: Array<string>, id: number, inLibrary: boolean, inLibraryAt: any, initialized: boolean, lastFetchedAt?: any | null, realUrl?: string | null, status: MangaStatus, thumbnailUrl?: string | null, title: string, url: string, lastReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestReadChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestFetchedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, latestUploadedChapter?: { __typename?: 'ChapterType', chapterNumber: number, fetchedAt: any, id: number, isBookmarked: boolean, isDownloaded: boolean, isRead: boolean, lastPageRead: number, lastReadAt: any, name: string, pageCount: number, realUrl?: string | null, scanlator?: string | null, sourceOrder: number, uploadDate: any, url: string, manga: { __typename?: 'MangaType', id: number, title: string, inLibrary: boolean, thumbnailUrl?: string | null }, meta: Array<{ __typename?: 'ChapterMetaType', key: string, value: string }> } | null, categories: { __typename?: 'CategoryNodeList', totalCount: number, nodes: Array<{ __typename?: 'CategoryType', default: boolean, id: number, includeInUpdate: IncludeOrExclude, includeInDownload: IncludeOrExclude, name: string, order: number, meta: Array<{ __typename?: 'CategoryMetaType', key: string, value: string }>, mangas: { __typename?: 'MangaNodeList', totalCount: number } }> }, chapters: { __typename?: 'ChapterNodeList', totalCount: number }, meta: Array<{ __typename?: 'MangaMetaType', key: string, value: string }>, source?: { __typename?: 'SourceType', displayName: string, iconUrl: string, id: any, isConfigurable: boolean, isNsfw: boolean, lang: string, name: string, supportsLatest: boolean, extension: { __typename?: 'ExtensionType', pkgName: string, repo?: string | null } } | null }>, pageInfo: { __typename?: 'PageInfo', endCursor?: any | null, hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: any | null } } } };
|
||||||
|
|
||||||
export type GetChapterQueryVariables = Exact<{
|
export type GetChapterQueryVariables = Exact<{
|
||||||
id: Scalars['Int']['input'];
|
id: Scalars['Int']['input'];
|
||||||
@@ -3063,7 +3063,7 @@ export type GetWebuiUpdateStatusQuery = { __typename?: 'Query', getWebUIUpdateSt
|
|||||||
export type GetServerSettingsQueryVariables = Exact<{ [key: string]: never; }>;
|
export type GetServerSettingsQueryVariables = Exact<{ [key: string]: never; }>;
|
||||||
|
|
||||||
|
|
||||||
export type GetServerSettingsQuery = { __typename?: 'Query', settings: { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string } };
|
export type GetServerSettingsQuery = { __typename?: 'Query', settings: { __typename?: 'SettingsType', ip: string, port: number, socksProxyEnabled: boolean, socksProxyHost: string, socksProxyPort: string, webUIFlavor: WebUiFlavor, initialOpenInBrowserEnabled: boolean, webUIInterface: WebUiInterface, electronPath: string, webUIChannel: WebUiChannel, webUIUpdateCheckInterval: number, downloadAsCbz: boolean, downloadsPath: string, autoDownloadNewChapters: boolean, excludeEntryWithUnreadChapters: boolean, autoDownloadAheadLimit: number, extensionRepos: Array<string>, maxSourcesInParallel: number, excludeUnreadChapters: boolean, excludeNotStarted: boolean, excludeCompleted: boolean, globalUpdateInterval: number, updateMangas: boolean, basicAuthEnabled: boolean, basicAuthUsername: string, basicAuthPassword: string, debugLogsEnabled: boolean, gqlDebugLogsEnabled: boolean, systemTrayEnabled: boolean, backupPath: string, backupTime: string, backupInterval: number, backupTTL: number, localSourcePath: string, flareSolverrEnabled: boolean, flareSolverrUrl: string, flareSolverrTimeout: number, flareSolverrSessionName: string, flareSolverrSessionTtl: number } };
|
||||||
|
|
||||||
export type GetSourceQueryVariables = Exact<{
|
export type GetSourceQueryVariables = Exact<{
|
||||||
id: Scalars['LongString']['input'];
|
id: Scalars['LongString']['input'];
|
||||||
|
|||||||
@@ -115,7 +115,6 @@ export function Settings() {
|
|||||||
minValue={100}
|
minValue={100}
|
||||||
maxValue={1000}
|
maxValue={1000}
|
||||||
stepSize={10}
|
stepSize={10}
|
||||||
dialogTitle={t('settings.label.manga_item_width')}
|
|
||||||
valueUnit="px"
|
valueUnit="px"
|
||||||
showSlider
|
showSlider
|
||||||
handleUpdate={setItemWidth}
|
handleUpdate={setItemWidth}
|
||||||
|
|||||||
@@ -281,8 +281,7 @@ export function Backup() {
|
|||||||
minValue={1}
|
minValue={1}
|
||||||
maxValue={31}
|
maxValue={31}
|
||||||
stepSize={1}
|
stepSize={1}
|
||||||
dialogTitle="Interval"
|
valueUnit={t('global.date.label.day')}
|
||||||
valueUnit="Day"
|
|
||||||
showSlider
|
showSlider
|
||||||
handleUpdate={(interval: number) => updateSetting('backupInterval', interval)}
|
handleUpdate={(interval: number) => updateSetting('backupInterval', interval)}
|
||||||
/>
|
/>
|
||||||
@@ -294,8 +293,7 @@ export function Backup() {
|
|||||||
minValue={0}
|
minValue={0}
|
||||||
maxValue={1000}
|
maxValue={1000}
|
||||||
stepSize={1}
|
stepSize={1}
|
||||||
dialogTitle="Cleanup"
|
valueUnit={t('global.date.label.day')}
|
||||||
valueUnit="Day"
|
|
||||||
showSlider
|
showSlider
|
||||||
handleUpdate={(ttl: number) => updateSetting('backupTTL', ttl)}
|
handleUpdate={(ttl: number) => updateSetting('backupTTL', ttl)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -74,7 +74,6 @@ export const ExtensionSettings = () => {
|
|||||||
maxValue={20}
|
maxValue={20}
|
||||||
showSlider
|
showSlider
|
||||||
stepSize={1}
|
stepSize={1}
|
||||||
dialogTitle={t('settings.server.requests.sources.parallel.label.title')}
|
|
||||||
handleUpdate={(parallelSources) => updateSetting('maxSourcesInParallel', parallelSources)}
|
handleUpdate={(parallelSources) => updateSetting('maxSourcesInParallel', parallelSources)}
|
||||||
/>
|
/>
|
||||||
<MutableListSetting
|
<MutableListSetting
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation, Trans } from 'react-i18next';
|
||||||
import { useContext, useEffect } from 'react';
|
import { useContext, useEffect } from 'react';
|
||||||
import { List, ListItem, ListItemText, Switch } from '@mui/material';
|
import { Link, List, ListItem, ListItemText, Switch } from '@mui/material';
|
||||||
import ListSubheader from '@mui/material/ListSubheader';
|
import ListSubheader from '@mui/material/ListSubheader';
|
||||||
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
|
import { NavBarContext, useSetDefaultBackTo } from '@/components/context/NavbarContext.tsx';
|
||||||
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
import { requestManager } from '@/lib/requests/RequestManager.ts';
|
||||||
@@ -30,6 +30,11 @@ type ServerSettingsType = Pick<
|
|||||||
| 'basicAuthEnabled'
|
| 'basicAuthEnabled'
|
||||||
| 'basicAuthUsername'
|
| 'basicAuthUsername'
|
||||||
| 'basicAuthPassword'
|
| 'basicAuthPassword'
|
||||||
|
| 'flareSolverrEnabled'
|
||||||
|
| 'flareSolverrTimeout'
|
||||||
|
| 'flareSolverrUrl'
|
||||||
|
| 'flareSolverrSessionName'
|
||||||
|
| 'flareSolverrSessionTtl'
|
||||||
>;
|
>;
|
||||||
|
|
||||||
const extractServerSettings = (settings: GqlServerSettings): ServerSettingsType => ({
|
const extractServerSettings = (settings: GqlServerSettings): ServerSettingsType => ({
|
||||||
@@ -44,6 +49,11 @@ const extractServerSettings = (settings: GqlServerSettings): ServerSettingsType
|
|||||||
basicAuthEnabled: settings.basicAuthEnabled,
|
basicAuthEnabled: settings.basicAuthEnabled,
|
||||||
basicAuthUsername: settings.basicAuthUsername,
|
basicAuthUsername: settings.basicAuthUsername,
|
||||||
basicAuthPassword: settings.basicAuthPassword,
|
basicAuthPassword: settings.basicAuthPassword,
|
||||||
|
flareSolverrEnabled: settings.flareSolverrEnabled,
|
||||||
|
flareSolverrTimeout: settings.flareSolverrTimeout,
|
||||||
|
flareSolverrUrl: settings.flareSolverrUrl,
|
||||||
|
flareSolverrSessionName: settings.flareSolverrSessionName,
|
||||||
|
flareSolverrSessionTtl: settings.flareSolverrSessionTtl,
|
||||||
});
|
});
|
||||||
|
|
||||||
export const ServerSettings = () => {
|
export const ServerSettings = () => {
|
||||||
@@ -113,7 +123,6 @@ export const ServerSettings = () => {
|
|||||||
<NumberSetting
|
<NumberSetting
|
||||||
settingTitle={t('settings.server.address.server.label.port')}
|
settingTitle={t('settings.server.address.server.label.port')}
|
||||||
settingValue={serverSettings?.port.toString()}
|
settingValue={serverSettings?.port.toString()}
|
||||||
dialogTitle={t('settings.server.address.server.label.port')}
|
|
||||||
handleUpdate={(port) => updateSetting('port', port)}
|
handleUpdate={(port) => updateSetting('port', port)}
|
||||||
value={serverSettings?.port ?? 4567}
|
value={serverSettings?.port ?? 4567}
|
||||||
defaultValue={4567}
|
defaultValue={4567}
|
||||||
@@ -177,6 +186,82 @@ export const ServerSettings = () => {
|
|||||||
disabled={!serverSettings?.basicAuthEnabled}
|
disabled={!serverSettings?.basicAuthEnabled}
|
||||||
/>
|
/>
|
||||||
</List>
|
</List>
|
||||||
|
<List
|
||||||
|
subheader={
|
||||||
|
<ListSubheader component="div" id="server-settings-clouadflare-bypass">
|
||||||
|
{t('settings.server.cloudflare.title')}
|
||||||
|
</ListSubheader>
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemText
|
||||||
|
primary={t('settings.server.cloudflare.flaresolverr.enabled.label.title')}
|
||||||
|
secondary={
|
||||||
|
<Trans i18nKey="settings.server.cloudflare.flaresolverr.enabled.label.description">
|
||||||
|
See{' '}
|
||||||
|
<Link
|
||||||
|
href="https://github.com/FlareSolverr/FlareSolverr?tab=readme-ov-file#installation"
|
||||||
|
target="_blank"
|
||||||
|
rel="noreferrer"
|
||||||
|
>
|
||||||
|
FlareSolverr
|
||||||
|
</Link>{' '}
|
||||||
|
for information on how to set it up
|
||||||
|
</Trans>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Switch
|
||||||
|
edge="end"
|
||||||
|
checked={!!serverSettings?.flareSolverrEnabled}
|
||||||
|
onChange={(e) => updateSetting('flareSolverrEnabled', e.target.checked)}
|
||||||
|
/>
|
||||||
|
</ListItem>
|
||||||
|
<TextSetting
|
||||||
|
settingName={t('settings.server.cloudflare.flaresolverr.url.label.title')}
|
||||||
|
dialogDescription={t('settings.server.cloudflare.flaresolverr.url.label.description')}
|
||||||
|
value={serverSettings?.flareSolverrUrl}
|
||||||
|
handleChange={(url) => updateSetting('flareSolverrUrl', url)}
|
||||||
|
/>
|
||||||
|
<NumberSetting
|
||||||
|
settingTitle={t('settings.server.cloudflare.flaresolverr.timeout.label.title')}
|
||||||
|
settingValue={
|
||||||
|
serverSettings?.flareSolverrTimeout !== undefined
|
||||||
|
? t('global.time.seconds.value', { count: serverSettings.flareSolverrTimeout })
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
dialogDescription={t('settings.server.cloudflare.flaresolverr.timeout.label.description')}
|
||||||
|
value={serverSettings?.flareSolverrTimeout ?? 60}
|
||||||
|
defaultValue={60}
|
||||||
|
minValue={20}
|
||||||
|
maxValue={60 * 5}
|
||||||
|
stepSize={1}
|
||||||
|
showSlider
|
||||||
|
valueUnit={t('global.time.seconds.second_other')}
|
||||||
|
handleUpdate={(timeout) => updateSetting('flareSolverrTimeout', timeout)}
|
||||||
|
/>
|
||||||
|
<TextSetting
|
||||||
|
settingName={t('settings.server.cloudflare.flaresolverr.session.name.label.title')}
|
||||||
|
value={serverSettings?.flareSolverrSessionName}
|
||||||
|
handleChange={(sessionName) => updateSetting('flareSolverrSessionName', sessionName)}
|
||||||
|
/>
|
||||||
|
<NumberSetting
|
||||||
|
settingTitle={t('settings.server.cloudflare.flaresolverr.session.ttl.label.title')}
|
||||||
|
settingValue={
|
||||||
|
serverSettings?.flareSolverrTimeout !== undefined
|
||||||
|
? t('global.time.minutes.value', { count: serverSettings.flareSolverrSessionTtl })
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
dialogDescription={t('settings.server.cloudflare.flaresolverr.session.ttl.label.description')}
|
||||||
|
value={serverSettings?.flareSolverrSessionTtl ?? 15}
|
||||||
|
defaultValue={15}
|
||||||
|
minValue={1}
|
||||||
|
maxValue={60}
|
||||||
|
stepSize={1}
|
||||||
|
showSlider
|
||||||
|
valueUnit={t('global.time.minutes.minute_other')}
|
||||||
|
handleUpdate={(sessionTTL) => updateSetting('flareSolverrSessionTtl', sessionTTL)}
|
||||||
|
/>
|
||||||
|
</List>
|
||||||
<List
|
<List
|
||||||
subheader={
|
subheader={
|
||||||
<ListSubheader component="div" id="server-settings-misc">
|
<ListSubheader component="div" id="server-settings-misc">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"uiVersion": "PREVIEW",
|
"uiVersion": "PREVIEW",
|
||||||
"serverVersion": "r1462"
|
"serverVersion": "r1477"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user