From b38f7c1c2ad6dc851fe466bfa7b5013fe08dcdc8 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:23:12 -0600 Subject: [PATCH] add missing settings --- .../migration.sql | 13 ++++ prisma/schema.prisma | 12 ++++ server/routes/users/[id]/settings.ts | 72 +++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 prisma/migrations/20251023152211_add_missing_settings/migration.sql diff --git a/prisma/migrations/20251023152211_add_missing_settings/migration.sql b/prisma/migrations/20251023152211_add_missing_settings/migration.sql new file mode 100644 index 0000000..96a9419 --- /dev/null +++ b/prisma/migrations/20251023152211_add_missing_settings/migration.sql @@ -0,0 +1,13 @@ +-- AlterTable +ALTER TABLE "user_settings" ADD COLUMN "disabled_embeds" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "disabled_sources" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "embed_order" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "enable_double_click_to_seek" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_embed_order" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_hold_to_boost" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_low_performance_mode" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "enable_native_subtitles" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "force_compact_episode_view" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "home_section_order" TEXT[] DEFAULT ARRAY[]::TEXT[], +ADD COLUMN "manual_source_selection" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "real_debrid_key" VARCHAR(255); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a09cdb2..4e49248 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -68,6 +68,7 @@ model user_settings { proxy_urls String[] trakt_key String? @db.VarChar(255) febbox_key String? @db.VarChar(255) + real_debrid_key String? @db.VarChar(255) enable_thumbnails Boolean @default(false) enable_autoplay Boolean @default(true) enable_skip_credits Boolean @default(true) @@ -76,9 +77,20 @@ model user_settings { enable_details_modal Boolean @default(false) enable_image_logos Boolean @default(true) enable_carousel_view Boolean @default(false) + force_compact_episode_view Boolean @default(false) source_order String[] @default([]) enable_source_order Boolean @default(false) + disabled_sources String[] @default([]) + embed_order String[] @default([]) + enable_embed_order Boolean @default(false) + disabled_embeds String[] @default([]) proxy_tmdb Boolean @default(false) + enable_low_performance_mode Boolean @default(false) + enable_native_subtitles Boolean @default(false) + enable_hold_to_boost Boolean @default(false) + home_section_order String[] @default([]) + manual_source_selection Boolean @default(false) + enable_double_click_to_seek Boolean @default(false) } model users { diff --git a/server/routes/users/[id]/settings.ts b/server/routes/users/[id]/settings.ts index 868e486..71437dd 100644 --- a/server/routes/users/[id]/settings.ts +++ b/server/routes/users/[id]/settings.ts @@ -12,6 +12,7 @@ interface UserSettings { proxy_urls: string[]; trakt_key: string | null; febbox_key: string | null; + real_debrid_key: string | null; enable_thumbnails: boolean; enable_autoplay: boolean; enable_skip_credits: boolean; @@ -20,9 +21,20 @@ interface UserSettings { enable_details_modal: boolean; enable_image_logos: boolean; enable_carousel_view: boolean; + force_compact_episode_view: boolean; source_order: string[]; enable_source_order: boolean; + disabled_sources: string[]; + embed_order: string[]; + enable_embed_order: boolean; + disabled_embeds: string[]; proxy_tmdb: boolean; + enable_low_performance_mode: boolean; + enable_native_subtitles: boolean; + enable_hold_to_boost: boolean; + home_section_order: string[]; + manual_source_selection: boolean; + enable_double_click_to_seek: boolean; } const userSettingsSchema = z.object({ @@ -32,6 +44,7 @@ const userSettingsSchema = z.object({ proxyUrls: z.array(z.string()).nullable().optional(), traktKey: z.string().nullable().optional(), febboxKey: z.string().nullable().optional(), + realDebridKey: z.string().nullable().optional(), enableThumbnails: z.boolean().optional().default(false), enableAutoplay: z.boolean().optional().default(true), enableSkipCredits: z.boolean().optional().default(true), @@ -40,9 +53,20 @@ const userSettingsSchema = z.object({ enableDetailsModal: z.boolean().optional().default(false), enableImageLogos: z.boolean().optional().default(true), enableCarouselView: z.boolean().optional().default(false), + forceCompactEpisodeView: z.boolean().optional().default(false), sourceOrder: z.array(z.string()).optional().default([]), enableSourceOrder: z.boolean().optional().default(false), + disabledSources: z.array(z.string()).optional().default([]), + embedOrder: z.array(z.string()).optional().default([]), + enableEmbedOrder: z.boolean().optional().default(false), + disabledEmbeds: z.array(z.string()).optional().default([]), proxyTmdb: z.boolean().optional().default(false), + enableLowPerformanceMode: z.boolean().optional().default(false), + enableNativeSubtitles: z.boolean().optional().default(false), + enableHoldToBoost: z.boolean().optional().default(false), + homeSectionOrder: z.array(z.string()).optional().default([]), + manualSourceSelection: z.boolean().optional().default(false), + enableDoubleClickToSeek: z.boolean().optional().default(false), }); export default defineEventHandler(async event => { @@ -83,6 +107,7 @@ export default defineEventHandler(async event => { proxyUrls: settings?.proxy_urls.length === 0 ? null : settings?.proxy_urls || null, traktKey: settings?.trakt_key || null, febboxKey: settings?.febbox_key || null, + realDebridKey: settings?.real_debrid_key || null, enableThumbnails: settings?.enable_thumbnails ?? false, enableAutoplay: settings?.enable_autoplay ?? true, enableSkipCredits: settings?.enable_skip_credits ?? true, @@ -91,9 +116,20 @@ export default defineEventHandler(async event => { enableDetailsModal: settings?.enable_details_modal ?? false, enableImageLogos: settings?.enable_image_logos ?? true, enableCarouselView: settings?.enable_carousel_view ?? false, + forceCompactEpisodeView: settings?.force_compact_episode_view ?? false, sourceOrder: settings?.source_order || [], enableSourceOrder: settings?.enable_source_order ?? false, + disabledSources: settings?.disabled_sources || [], + embedOrder: settings?.embed_order || [], + enableEmbedOrder: settings?.enable_embed_order ?? false, + disabledEmbeds: settings?.disabled_embeds || [], proxyTmdb: settings?.proxy_tmdb ?? false, + enableLowPerformanceMode: settings?.enable_low_performance_mode ?? false, + enableNativeSubtitles: settings?.enable_native_subtitles ?? false, + enableHoldToBoost: settings?.enable_hold_to_boost ?? false, + homeSectionOrder: settings?.home_section_order || [], + manualSourceSelection: settings?.manual_source_selection ?? false, + enableDoubleClickToSeek: settings?.enable_double_click_to_seek ?? false, }; } catch (error) { log.error('Failed to get user settings', { @@ -121,6 +157,7 @@ export default defineEventHandler(async event => { proxy_urls: validatedBody.proxyUrls === null ? [] : (validatedBody.proxyUrls || []), trakt_key: validatedBody.traktKey ?? null, febbox_key: validatedBody.febboxKey ?? null, + real_debrid_key: validatedBody.realDebridKey ?? null, enable_thumbnails: validatedBody.enableThumbnails, enable_autoplay: validatedBody.enableAutoplay, enable_skip_credits: validatedBody.enableSkipCredits, @@ -129,9 +166,20 @@ export default defineEventHandler(async event => { enable_details_modal: validatedBody.enableDetailsModal, enable_image_logos: validatedBody.enableImageLogos, enable_carousel_view: validatedBody.enableCarouselView, + force_compact_episode_view: validatedBody.forceCompactEpisodeView, source_order: validatedBody.sourceOrder || [], enable_source_order: validatedBody.enableSourceOrder, + disabled_sources: validatedBody.disabledSources || [], + embed_order: validatedBody.embedOrder || [], + enable_embed_order: validatedBody.enableEmbedOrder, + disabled_embeds: validatedBody.disabledEmbeds || [], proxy_tmdb: validatedBody.proxyTmdb, + enable_low_performance_mode: validatedBody.enableLowPerformanceMode, + enable_native_subtitles: validatedBody.enableNativeSubtitles, + enable_hold_to_boost: validatedBody.enableHoldToBoost, + home_section_order: validatedBody.homeSectionOrder || [], + manual_source_selection: validatedBody.manualSourceSelection, + enable_double_click_to_seek: validatedBody.enableDoubleClickToSeek, }; const updateData: Partial = {}; @@ -141,6 +189,7 @@ export default defineEventHandler(async event => { if (Object.prototype.hasOwnProperty.call(body, 'proxyUrls')) updateData.proxy_urls = createData.proxy_urls; if (Object.prototype.hasOwnProperty.call(body, 'traktKey')) updateData.trakt_key = createData.trakt_key; if (Object.prototype.hasOwnProperty.call(body, 'febboxKey')) updateData.febbox_key = createData.febbox_key; + if (Object.prototype.hasOwnProperty.call(body, 'realDebridKey')) updateData.real_debrid_key = createData.real_debrid_key; if (Object.prototype.hasOwnProperty.call(body, 'enableThumbnails')) updateData.enable_thumbnails = createData.enable_thumbnails; if (Object.prototype.hasOwnProperty.call(body, 'enableAutoplay')) updateData.enable_autoplay = createData.enable_autoplay; if (Object.prototype.hasOwnProperty.call(body, 'enableSkipCredits')) updateData.enable_skip_credits = createData.enable_skip_credits; @@ -149,9 +198,20 @@ export default defineEventHandler(async event => { if (Object.prototype.hasOwnProperty.call(body, 'enableDetailsModal')) updateData.enable_details_modal = createData.enable_details_modal; if (Object.prototype.hasOwnProperty.call(body, 'enableImageLogos')) updateData.enable_image_logos = createData.enable_image_logos; if (Object.prototype.hasOwnProperty.call(body, 'enableCarouselView')) updateData.enable_carousel_view = createData.enable_carousel_view; + if (Object.prototype.hasOwnProperty.call(body, 'forceCompactEpisodeView')) updateData.force_compact_episode_view = createData.force_compact_episode_view; if (Object.prototype.hasOwnProperty.call(body, 'sourceOrder')) updateData.source_order = createData.source_order; if (Object.prototype.hasOwnProperty.call(body, 'enableSourceOrder')) updateData.enable_source_order = createData.enable_source_order; + if (Object.prototype.hasOwnProperty.call(body, 'disabledSources')) updateData.disabled_sources = createData.disabled_sources; + if (Object.prototype.hasOwnProperty.call(body, 'embedOrder')) updateData.embed_order = createData.embed_order; + if (Object.prototype.hasOwnProperty.call(body, 'enableEmbedOrder')) updateData.enable_embed_order = createData.enable_embed_order; + if (Object.prototype.hasOwnProperty.call(body, 'disabledEmbeds')) updateData.disabled_embeds = createData.disabled_embeds; if (Object.prototype.hasOwnProperty.call(body, 'proxyTmdb')) updateData.proxy_tmdb = createData.proxy_tmdb; + if (Object.prototype.hasOwnProperty.call(body, 'enableLowPerformanceMode')) updateData.enable_low_performance_mode = createData.enable_low_performance_mode; + if (Object.prototype.hasOwnProperty.call(body, 'enableNativeSubtitles')) updateData.enable_native_subtitles = createData.enable_native_subtitles; + if (Object.prototype.hasOwnProperty.call(body, 'enableHoldToBoost')) updateData.enable_hold_to_boost = createData.enable_hold_to_boost; + if (Object.prototype.hasOwnProperty.call(body, 'homeSectionOrder')) updateData.home_section_order = createData.home_section_order; + if (Object.prototype.hasOwnProperty.call(body, 'manualSourceSelection')) updateData.manual_source_selection = createData.manual_source_selection; + if (Object.prototype.hasOwnProperty.call(body, 'enableDoubleClickToSeek')) updateData.enable_double_click_to_seek = createData.enable_double_click_to_seek; log.info('Preparing to upsert settings', { userId, updateData, createData: { id: userId, ...createData } }); @@ -174,6 +234,7 @@ export default defineEventHandler(async event => { proxyUrls: settings.proxy_urls.length === 0 ? null : settings.proxy_urls, traktKey: settings.trakt_key, febboxKey: settings.febbox_key, + realDebridKey: settings.real_debrid_key, enableThumbnails: settings.enable_thumbnails, enableAutoplay: settings.enable_autoplay, enableSkipCredits: settings.enable_skip_credits, @@ -182,9 +243,20 @@ export default defineEventHandler(async event => { enableDetailsModal: settings.enable_details_modal, enableImageLogos: settings.enable_image_logos, enableCarouselView: settings.enable_carousel_view, + forceCompactEpisodeView: settings.force_compact_episode_view, sourceOrder: settings.source_order, enableSourceOrder: settings.enable_source_order, + disabledSources: settings.disabled_sources, + embedOrder: settings.embed_order, + enableEmbedOrder: settings.enable_embed_order, + disabledEmbeds: settings.disabled_embeds, proxyTmdb: settings.proxy_tmdb, + enableLowPerformanceMode: settings.enable_low_performance_mode, + enableNativeSubtitles: settings.enable_native_subtitles, + enableHoldToBoost: settings.enable_hold_to_boost, + homeSectionOrder: settings.home_section_order, + manualSourceSelection: settings.manual_source_selection, + enableDoubleClickToSeek: settings.enable_double_click_to_seek, }; } catch (error) { log.error('Failed to update user settings', {