[skip ci] Feat: Add OPDS Configs to Server Settings tab (#945)

* Add OPDS config settings

* Address PR comments

* Update serverVersion for PREVIEW

* Add "opdsUseBinaryFileSizes" setting

---------

Co-authored-by: schroda <50052685+schroda@users.noreply.github.com>
This commit is contained in:
Shirish
2025-07-12 04:11:59 +05:30
committed by GitHub
parent 74f0fec02d
commit cdee6f4efa
6 changed files with 218 additions and 10 deletions

View File

@@ -32,6 +32,7 @@ import { MetadataUpdateSettings } from '@/modules/app-updates/AppUpdateChecker.t
import { ServerSettings as GqlServerSettings } from '@/modules/settings/Settings.types.ts';
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
import { useAppTitle } from '@/modules/navigation-bar/hooks/useAppTitle.ts';
import { SortOrder } from '@/lib/graphql/generated/graphql';
type ServerSettingsType = Pick<
GqlServerSettings,
@@ -57,6 +58,13 @@ type ServerSettingsType = Pick<
| 'flareSolverrSessionName'
| 'flareSolverrSessionTtl'
| 'flareSolverrAsResponseFallback'
| 'opdsUseBinaryFileSizes'
| 'opdsItemsPerPage'
| 'opdsEnablePageReadProgress'
| 'opdsMarkAsReadOnDownload'
| 'opdsShowOnlyUnreadChapters'
| 'opdsShowOnlyDownloadedChapters'
| 'opdsChapterSortOrder'
>;
const extractServerSettings = (settings: GqlServerSettings): ServerSettingsType => ({
@@ -82,6 +90,13 @@ const extractServerSettings = (settings: GqlServerSettings): ServerSettingsType
flareSolverrSessionName: settings.flareSolverrSessionName,
flareSolverrSessionTtl: settings.flareSolverrSessionTtl,
flareSolverrAsResponseFallback: settings.flareSolverrAsResponseFallback,
opdsUseBinaryFileSizes: settings.opdsUseBinaryFileSizes,
opdsItemsPerPage: settings.opdsItemsPerPage,
opdsEnablePageReadProgress: settings.opdsEnablePageReadProgress,
opdsMarkAsReadOnDownload: settings.opdsMarkAsReadOnDownload,
opdsShowOnlyUnreadChapters: settings.opdsShowOnlyUnreadChapters,
opdsShowOnlyDownloadedChapters: settings.opdsShowOnlyDownloadedChapters,
opdsChapterSortOrder: settings.opdsChapterSortOrder,
});
const getLogFilesCleanupDisplayValue = (ttl: number): string => {
@@ -430,6 +445,92 @@ export const ServerSettings = () => {
handleChange={(maxLogFolderSize) => updateSetting('maxLogFolderSize', maxLogFolderSize)}
/>
</List>
<List
subheader={
<ListSubheader component="div" id="server-settings-opds">
{t('settings.server.opds.title')}
</ListSubheader>
}
>
<ListItem>
<ListItemText
primary={t('settings.server.opds.binary_file_sizes.label.title')}
secondary={t('settings.server.opds.binary_file_sizes.label.description')}
/>
<Switch
edge="end"
checked={serverSettings.opdsUseBinaryFileSizes}
onChange={(e) => updateSetting('opdsUseBinaryFileSizes', e.target.checked)}
/>
</ListItem>
<NumberSetting
settingTitle={t('settings.server.opds.items_per_page.label.title')}
settingValue={serverSettings.opdsItemsPerPage.toString()}
dialogDescription={t('settings.server.opds.items_per_page.label.description')}
value={serverSettings.opdsItemsPerPage}
defaultValue={50}
minValue={10}
maxValue={5000}
stepSize={10}
showSlider
valueUnit={t('settings.server.opds.items_per_page.label.unit_other')}
handleUpdate={(value) => updateSetting('opdsItemsPerPage', value)}
/>
<ListItem>
<ListItemText
primary={t('settings.server.opds.enable_page_read_progress.label.title')}
secondary={t('settings.server.opds.enable_page_read_progress.label.description')}
/>
<Switch
edge="end"
checked={serverSettings.opdsEnablePageReadProgress}
onChange={(e) => updateSetting('opdsEnablePageReadProgress', e.target.checked)}
/>
</ListItem>
<ListItem>
<ListItemText
primary={t('settings.server.opds.mark_as_read_on_download.label.title')}
secondary={t('settings.server.opds.mark_as_read_on_download.label.description')}
/>
<Switch
edge="end"
checked={serverSettings.opdsMarkAsReadOnDownload}
onChange={(e) => updateSetting('opdsMarkAsReadOnDownload', e.target.checked)}
/>
</ListItem>
<ListItem>
<ListItemText
primary={t('settings.server.opds.show_only_unread_chapters.label.title')}
secondary={t('settings.server.opds.show_only_unread_chapters.label.description')}
/>
<Switch
edge="end"
checked={serverSettings.opdsShowOnlyUnreadChapters}
onChange={(e) => updateSetting('opdsShowOnlyUnreadChapters', e.target.checked)}
/>
</ListItem>
<ListItem>
<ListItemText
primary={t('settings.server.opds.show_only_downloaded_chapters.label.title')}
secondary={t('settings.server.opds.show_only_downloaded_chapters.label.description')}
/>
<Switch
edge="end"
checked={serverSettings.opdsShowOnlyDownloadedChapters}
onChange={(e) => updateSetting('opdsShowOnlyDownloadedChapters', e.target.checked)}
/>
</ListItem>
<SelectSetting<SortOrder>
settingName={t('settings.server.opds.chapter_sort_order.label.title')}
dialogDescription={t('settings.server.opds.chapter_sort_order.label.description')}
value={serverSettings.opdsChapterSortOrder}
values={[
[SortOrder.Asc, { text: t('global.sort.label.asc') }],
[SortOrder.Desc, { text: t('global.sort.label.desc') }],
]}
handleChange={(value) => updateSetting('opdsChapterSortOrder', value)}
/>
</List>
</List>
);
};