From 089891cab2cf93e06946d08ff121b7cb839d63f3 Mon Sep 17 00:00:00 2001 From: Martin Reitschmied Date: Sun, 5 Apr 2026 15:45:27 +0200 Subject: [PATCH] fix: resolve all ESLint errors failing CI Auto-fix prettier formatting issues and manually fix naming-convention, no-shadow, prefer-number-properties, no-await-expression-member, and no-control-regex lint errors. Co-Authored-By: Paperclip --- .storybook/main.ts | 11 +- CHANGELOG.md | 404 ++++++++---------- adonisrc.ts | 6 +- app/controllers/albums_controller.ts | 2 +- app/controllers/authors_controller.ts | 7 +- app/controllers/movies_controller.ts | 7 +- app/controllers/playback_controller.ts | 2 +- app/controllers/system_controller.ts | 1 - app/controllers/unmatched_files_controller.ts | 8 +- app/exceptions/handler.ts | 5 +- app/middleware/inertia_middleware.ts | 4 +- app/models/download_client.ts | 1 - app/models/movie_file.ts | 1 - .../download_clients/download_manager.ts | 8 +- app/services/indexers/indexer_manager.ts | 37 +- app/services/media/book_import_service.ts | 3 +- app/services/media/book_scanner_service.ts | 2 +- app/services/media/file_naming_service.ts | 1 + app/services/media/tv_show_scanner_service.ts | 2 +- app/services/tasks/folder_scanner.ts | 23 +- app/services/tasks/requested_search_task.ts | 22 +- ...6851410020_add_indexes_and_schema_fixes.ts | 8 +- ...0000_create_password_reset_tokens_table.ts | 7 +- ...000001_add_high_frequency_query_indexes.ts | 12 +- inertia/app.tsx | 5 +- .../library/delete-media-dialog.test.tsx | 7 +- .../library/download-progress-card.tsx | 25 +- .../library/media-image.stories.tsx | 10 +- .../components/library/media-image.test.tsx | 4 +- .../library/media-status-badge.test.tsx | 20 +- .../library/media-teaser.stories.tsx | 46 +- inertia/components/library/media-teaser.tsx | 30 +- .../components/library/similar-lane.test.tsx | 18 +- inertia/components/library/similar-lane.tsx | 6 +- inertia/components/media-gallery.tsx | 22 +- inertia/components/media-hero.tsx | 10 +- inertia/components/operation-tracker.tsx | 10 +- inertia/components/ui/breadcrumbs.tsx | 4 +- inertia/components/ui/button.stories.tsx | 12 +- inertia/components/ui/card.stories.tsx | 10 +- inertia/components/ui/input.stories.tsx | 2 +- inertia/components/ui/progress.test.tsx | 6 +- inertia/components/ui/sidebar.tsx | 2 +- inertia/contexts/active_downloads_context.tsx | 20 +- .../contexts/audio_player_context.test.tsx | 6 +- inertia/contexts/media_preview_context.tsx | 37 +- inertia/css/app.css | 38 +- ...{use-mobile.test.ts => use_mobile.test.ts} | 8 +- .../hooks/{use-mobile.ts => use_mobile.ts} | 0 inertia/pages/activity/queue.tsx | 36 +- inertia/pages/dashboard.tsx | 4 +- inertia/pages/library/album/[id].tsx | 17 +- inertia/pages/library/artist/[id].tsx | 4 +- inertia/pages/library/author/[id].tsx | 20 +- inertia/pages/library/book/[id].tsx | 26 +- inertia/pages/library/index.tsx | 4 +- inertia/pages/library/movie/[id].tsx | 23 +- inertia/pages/library/tvshow/[id].tsx | 347 ++++++++------- inertia/pages/search/discover.tsx | 27 +- inertia/pages/search/index.tsx | 321 ++++++++------ inertia/pages/settings/download-clients.tsx | 11 +- inertia/pages/settings/users.tsx | 11 +- inertia/pages/system/events.tsx | 6 +- ...es-bundle.test.ts => pages_bundle.test.ts} | 0 start/routes.ts | 5 +- tests/functional/controllers/api_keys.spec.ts | 21 +- .../controllers/app_settings.spec.ts | 12 +- tests/functional/controllers/authors.spec.ts | 4 +- tests/functional/controllers/backup.spec.ts | 3 +- .../functional/controllers/blacklist.spec.ts | 4 +- tests/functional/controllers/books.spec.ts | 4 +- tests/functional/controllers/calendar.spec.ts | 8 +- .../controllers/custom_formats.spec.ts | 25 +- .../controllers/download_clients.spec.ts | 8 +- .../controllers/import_lists.spec.ts | 8 +- tests/functional/controllers/indexers.spec.ts | 8 +- tests/functional/controllers/movies.spec.ts | 4 +- .../controllers/notifications.spec.ts | 13 +- tests/functional/controllers/playback.spec.ts | 4 +- .../controllers/quality_profiles.spec.ts | 4 +- tests/functional/controllers/queue.spec.ts | 4 +- .../controllers/recommendations.spec.ts | 3 +- tests/functional/controllers/rename.spec.ts | 21 +- .../controllers/root_folders.spec.ts | 8 +- tests/functional/controllers/system.spec.ts | 2 +- tests/functional/controllers/tags.spec.ts | 19 +- tests/functional/controllers/tv_shows.spec.ts | 4 +- tests/functional/controllers/webhooks.spec.ts | 8 +- tests/unit/services/folder_scanner.spec.ts | 15 +- tests/unit/utils/helpers.spec.ts | 7 +- vite.config.ts | 1 + vitest.config.ts | 1 + 92 files changed, 1126 insertions(+), 901 deletions(-) rename inertia/hooks/{use-mobile.test.ts => use_mobile.test.ts} (94%) rename inertia/hooks/{use-mobile.ts => use_mobile.ts} (100%) rename inertia/test/{pages-bundle.test.ts => pages_bundle.test.ts} (100%) diff --git a/.storybook/main.ts b/.storybook/main.ts index aab66a5..35d289e 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -2,20 +2,21 @@ import type { StorybookConfig } from '@storybook/react-vite' import { dirname, resolve } from 'node:path' import { fileURLToPath } from 'node:url' +// eslint-disable-next-line @typescript-eslint/naming-convention const __dirname = dirname(fileURLToPath(import.meta.url)) const config: StorybookConfig = { framework: '@storybook/react-vite', stories: ['../inertia/components/**/*.stories.@(ts|tsx)'], - viteFinal(config) { - config.resolve ??= {} - config.resolve.alias = { - ...config.resolve.alias, + viteFinal(viteConfig) { + viteConfig.resolve ??= {} + viteConfig.resolve.alias = { + ...viteConfig.resolve.alias, '~/': `${resolve(__dirname, '../inertia')}/`, '@/': `${resolve(__dirname, '../inertia')}/`, } - return config + return viteConfig }, } diff --git a/CHANGELOG.md b/CHANGELOG.md index a618f1e..fc93ce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,352 +2,322 @@ ## [1.23.0](https://github.com/Gitsack/hamster/compare/hamster-v1.22.0...hamster-v1.23.0) (2026-04-04) - ### Features -* add action buttons and bulk search to Missing Items tab ([ac3ee71](https://github.com/Gitsack/hamster/commit/ac3ee71351fb0563e7cf8691f225d12e87c60ede)) -* add action buttons to Missing Items tab ([e937e62](https://github.com/Gitsack/hamster/commit/e937e62e9dfc570dd3c2cf20527a9c069a2dd991)) -* add consistent empty state messaging across views ([4b51499](https://github.com/Gitsack/hamster/commit/4b51499cb84fce2f4b79c96d437fe7f86f65d768)) -* add consistent empty state messaging across views ([24ae038](https://github.com/Gitsack/hamster/commit/24ae03878bd05ccc1d6c3e39c2b2b60ebef14bde)) -* add global progress/toast feedback for bulk operations ([#67](https://github.com/Gitsack/hamster/issues/67)) ([c368ef1](https://github.com/Gitsack/hamster/commit/c368ef16bb60d83619950cdf7b41170161018c07)) -* add media-type grouping and filtering to direct indexer search results ([672bd8f](https://github.com/Gitsack/hamster/commit/672bd8f84be1909ab7c5a37ffa27437b8d2fdc8c)) -* add post-login dashboard with library stats and recent activity ([028b770](https://github.com/Gitsack/hamster/commit/028b770892d6c6313dc049049b3a5b2216dfb519)) -* add React error boundary for graceful error recovery ([6452bf0](https://github.com/Gitsack/hamster/commit/6452bf01ee3e1a80fd0191e39d1e910d7d8a6b4e)) -* add React error boundary for graceful error recovery ([6e780b2](https://github.com/Gitsack/hamster/commit/6e780b287d015dc1065b1c90e4aa3d1f134a1e77)) -* add search and status filter bar to library index page ([c63fa9b](https://github.com/Gitsack/hamster/commit/c63fa9b01ee74c84097fa12556bc3b4793dd7ff8)) -* add self-service password reset flow ([1543cd7](https://github.com/Gitsack/hamster/commit/1543cd76301f197958d8199a2c7a8640aa5f82f7)) -* add self-service password reset flow ([677ebf4](https://github.com/Gitsack/hamster/commit/677ebf4daf80f9effa24f36b625241074923fee3)) -* add SERVICE_HOST_MAP for Docker hostname resolution in local dev ([1579975](https://github.com/Gitsack/hamster/commit/1579975a4c3f8e0ba38c8696a849aa8b8c52a97d)) -* add show-more pagination for long lists on detail pages ([865c110](https://github.com/Gitsack/hamster/commit/865c110c4aca9b9ec4b0844b9cf79e7850fc2da8)) -* add show-more pagination for long lists on detail pages ([#63](https://github.com/Gitsack/hamster/issues/63)) ([865c110](https://github.com/Gitsack/hamster/commit/865c110c4aca9b9ec4b0844b9cf79e7850fc2da8)) -* add status filter bar to library index page ([1db09e8](https://github.com/Gitsack/hamster/commit/1db09e81f32dc5695ec4d5b1312b122ae3998fd9)) -* add tooltips to icon-only buttons on detail pages ([0d9b762](https://github.com/Gitsack/hamster/commit/0d9b7627c231e27bbd04cfa3733f797ae169b5e9)) -* add tooltips to icon-only buttons on detail pages ([09ef324](https://github.com/Gitsack/hamster/commit/09ef324331c7b8fada73e628b5cee99c0a485f41)) -* compact search result cards for better information density ([a4b0478](https://github.com/Gitsack/hamster/commit/a4b0478fa26b45abc1b5b17b9f97b8ad413833a4)) -* harmonize navigation with breadcrumbs across detail pages ([f3645ca](https://github.com/Gitsack/hamster/commit/f3645ca25ff6e0d433f01941ea5c6fe92a066227)) -* harmonize navigation with breadcrumbs across detail pages ([5013232](https://github.com/Gitsack/hamster/commit/5013232382e7ee644cdf18167dc4f8511df56fbd)) -* improve error messages for auto-download failures ([f18d0fb](https://github.com/Gitsack/hamster/commit/f18d0fb8690627c30c3c8051db7dc35cc3cbabd2)) -* improve search UX with debounced input, keyboard nav, and empty states ([2589314](https://github.com/Gitsack/hamster/commit/258931428dbe1939599100ca8dc425c36ae2abc6)) -* improve search UX with debounced input, keyboard nav, and empty states ([f85f138](https://github.com/Gitsack/hamster/commit/f85f138c4b16f924edeea0f276e50f0521b8f986)) -* show quality profile and root folder badges on album and book detail pages ([2b69cdd](https://github.com/Gitsack/hamster/commit/2b69cdd959638f9973fe66abfee81bea5408f83a)) -* show quality profile and root folder badges on album and book pages ([bf45fc6](https://github.com/Gitsack/hamster/commit/bf45fc6a786c091bacdfaf4cd3af96570a93aec1)) -* standardize deletion dialogs across all media types ([c00e57d](https://github.com/Gitsack/hamster/commit/c00e57d9ef90fddcc76df52e8cdda6c83fe02a11)) -* standardize deletion dialogs across all media types ([a347531](https://github.com/Gitsack/hamster/commit/a34753154d4eef6167a3b973a695a7498f5450de)) -* standardize metadata enrichment actions across all media types ([4bf2fa6](https://github.com/Gitsack/hamster/commit/4bf2fa6b28f1e298fc1786ebfcd709ad1a89cd63)) -* standardize metadata enrichment actions across all media types ([3912d61](https://github.com/Gitsack/hamster/commit/3912d61db412576f04aa43760530ad8f4e17ae59)) -* unify download button labels and promote browse releases across media types ([5935095](https://github.com/Gitsack/hamster/commit/59350954ffbd69a35120e3687bc7bc39ffe9a919)) -* unify download initiation UX across media types ([a3cafa1](https://github.com/Gitsack/hamster/commit/a3cafa1135382268708f852239024c7e372ef57e)) -* unify download initiation UX with manual search across all media types ([b0ee3cb](https://github.com/Gitsack/hamster/commit/b0ee3cbbc13e4b5ca2e412223b315a22d1b237a2)) -* unify download progress display across all detail pages ([93e6008](https://github.com/Gitsack/hamster/commit/93e60088726a85fdddaefdad6fce6c5f11b2b687)) -* unify download progress display across all detail pages ([93e6008](https://github.com/Gitsack/hamster/commit/93e60088726a85fdddaefdad6fce6c5f11b2b687)) -* unify download progress display across all detail pages ([1272e7d](https://github.com/Gitsack/hamster/commit/1272e7dea6cc2c3e4e5fd9c84feb7b575320f327)) - - -### Bug Fixes - -* add a11y improvements to search results tables ([3884915](https://github.com/Gitsack/hamster/commit/3884915bc75f970d9a5ee7957cb0c7d696698407)) -* add missing aria-labels to icon-only buttons ([52fde77](https://github.com/Gitsack/hamster/commit/52fde770d7ea21cd9d96051523ff4348adcea3ea)) -* add missing aria-labels to icon-only buttons across pages ([8b2e43d](https://github.com/Gitsack/hamster/commit/8b2e43d72f81fd721d96cfc3bd52035101354129)) -* clear stale search results, cap limit param, and use CardHeader for search results ([1c514a6](https://github.com/Gitsack/hamster/commit/1c514a68e259b922acec5e47f91316259fd6d98f)) -* create test user command ([325c39c](https://github.com/Gitsack/hamster/commit/325c39c8ca2258368666d910932a5e65dec8101d)) -* exclude test files from Inertia page globs ([78ca3f4](https://github.com/Gitsack/hamster/commit/78ca3f46a54e2ae8c758c1210bf1de9eb04528e0)) -* exclude test files from Inertia page globs to prevent runtime errors ([6a47829](https://github.com/Gitsack/hamster/commit/6a47829066b839d1d2ea43f04b59c80629c4c04a)) -* hide status filter on Music tab where artists lack status fields ([38f5e44](https://github.com/Gitsack/hamster/commit/38f5e4438a7e8274aca11bf33323f29aec029eb3)) -* resolve N+1 queries in controllers and add missing database indexes ([ce8ffe0](https://github.com/Gitsack/hamster/commit/ce8ffe0ef0eec1ace5eb70600378c8b87ad5c389)) -* use MediaStatusBadge consistently across all library views ([6d147b8](https://github.com/Gitsack/hamster/commit/6d147b8e2e2d086762bc910773934c6499819733)) -* use MediaStatusBadge consistently across all library views ([78cdaff](https://github.com/Gitsack/hamster/commit/78cdaff477c459d75406c5768003fa1170779c6b)) +- add action buttons and bulk search to Missing Items tab ([ac3ee71](https://github.com/Gitsack/hamster/commit/ac3ee71351fb0563e7cf8691f225d12e87c60ede)) +- add action buttons to Missing Items tab ([e937e62](https://github.com/Gitsack/hamster/commit/e937e62e9dfc570dd3c2cf20527a9c069a2dd991)) +- add consistent empty state messaging across views ([4b51499](https://github.com/Gitsack/hamster/commit/4b51499cb84fce2f4b79c96d437fe7f86f65d768)) +- add consistent empty state messaging across views ([24ae038](https://github.com/Gitsack/hamster/commit/24ae03878bd05ccc1d6c3e39c2b2b60ebef14bde)) +- add global progress/toast feedback for bulk operations ([#67](https://github.com/Gitsack/hamster/issues/67)) ([c368ef1](https://github.com/Gitsack/hamster/commit/c368ef16bb60d83619950cdf7b41170161018c07)) +- add media-type grouping and filtering to direct indexer search results ([672bd8f](https://github.com/Gitsack/hamster/commit/672bd8f84be1909ab7c5a37ffa27437b8d2fdc8c)) +- add post-login dashboard with library stats and recent activity ([028b770](https://github.com/Gitsack/hamster/commit/028b770892d6c6313dc049049b3a5b2216dfb519)) +- add React error boundary for graceful error recovery ([6452bf0](https://github.com/Gitsack/hamster/commit/6452bf01ee3e1a80fd0191e39d1e910d7d8a6b4e)) +- add React error boundary for graceful error recovery ([6e780b2](https://github.com/Gitsack/hamster/commit/6e780b287d015dc1065b1c90e4aa3d1f134a1e77)) +- add search and status filter bar to library index page ([c63fa9b](https://github.com/Gitsack/hamster/commit/c63fa9b01ee74c84097fa12556bc3b4793dd7ff8)) +- add self-service password reset flow ([1543cd7](https://github.com/Gitsack/hamster/commit/1543cd76301f197958d8199a2c7a8640aa5f82f7)) +- add self-service password reset flow ([677ebf4](https://github.com/Gitsack/hamster/commit/677ebf4daf80f9effa24f36b625241074923fee3)) +- add SERVICE_HOST_MAP for Docker hostname resolution in local dev ([1579975](https://github.com/Gitsack/hamster/commit/1579975a4c3f8e0ba38c8696a849aa8b8c52a97d)) +- add show-more pagination for long lists on detail pages ([865c110](https://github.com/Gitsack/hamster/commit/865c110c4aca9b9ec4b0844b9cf79e7850fc2da8)) +- add show-more pagination for long lists on detail pages ([#63](https://github.com/Gitsack/hamster/issues/63)) ([865c110](https://github.com/Gitsack/hamster/commit/865c110c4aca9b9ec4b0844b9cf79e7850fc2da8)) +- add status filter bar to library index page ([1db09e8](https://github.com/Gitsack/hamster/commit/1db09e81f32dc5695ec4d5b1312b122ae3998fd9)) +- add tooltips to icon-only buttons on detail pages ([0d9b762](https://github.com/Gitsack/hamster/commit/0d9b7627c231e27bbd04cfa3733f797ae169b5e9)) +- add tooltips to icon-only buttons on detail pages ([09ef324](https://github.com/Gitsack/hamster/commit/09ef324331c7b8fada73e628b5cee99c0a485f41)) +- compact search result cards for better information density ([a4b0478](https://github.com/Gitsack/hamster/commit/a4b0478fa26b45abc1b5b17b9f97b8ad413833a4)) +- harmonize navigation with breadcrumbs across detail pages ([f3645ca](https://github.com/Gitsack/hamster/commit/f3645ca25ff6e0d433f01941ea5c6fe92a066227)) +- harmonize navigation with breadcrumbs across detail pages ([5013232](https://github.com/Gitsack/hamster/commit/5013232382e7ee644cdf18167dc4f8511df56fbd)) +- improve error messages for auto-download failures ([f18d0fb](https://github.com/Gitsack/hamster/commit/f18d0fb8690627c30c3c8051db7dc35cc3cbabd2)) +- improve search UX with debounced input, keyboard nav, and empty states ([2589314](https://github.com/Gitsack/hamster/commit/258931428dbe1939599100ca8dc425c36ae2abc6)) +- improve search UX with debounced input, keyboard nav, and empty states ([f85f138](https://github.com/Gitsack/hamster/commit/f85f138c4b16f924edeea0f276e50f0521b8f986)) +- show quality profile and root folder badges on album and book detail pages ([2b69cdd](https://github.com/Gitsack/hamster/commit/2b69cdd959638f9973fe66abfee81bea5408f83a)) +- show quality profile and root folder badges on album and book pages ([bf45fc6](https://github.com/Gitsack/hamster/commit/bf45fc6a786c091bacdfaf4cd3af96570a93aec1)) +- standardize deletion dialogs across all media types ([c00e57d](https://github.com/Gitsack/hamster/commit/c00e57d9ef90fddcc76df52e8cdda6c83fe02a11)) +- standardize deletion dialogs across all media types ([a347531](https://github.com/Gitsack/hamster/commit/a34753154d4eef6167a3b973a695a7498f5450de)) +- standardize metadata enrichment actions across all media types ([4bf2fa6](https://github.com/Gitsack/hamster/commit/4bf2fa6b28f1e298fc1786ebfcd709ad1a89cd63)) +- standardize metadata enrichment actions across all media types ([3912d61](https://github.com/Gitsack/hamster/commit/3912d61db412576f04aa43760530ad8f4e17ae59)) +- unify download button labels and promote browse releases across media types ([5935095](https://github.com/Gitsack/hamster/commit/59350954ffbd69a35120e3687bc7bc39ffe9a919)) +- unify download initiation UX across media types ([a3cafa1](https://github.com/Gitsack/hamster/commit/a3cafa1135382268708f852239024c7e372ef57e)) +- unify download initiation UX with manual search across all media types ([b0ee3cb](https://github.com/Gitsack/hamster/commit/b0ee3cbbc13e4b5ca2e412223b315a22d1b237a2)) +- unify download progress display across all detail pages ([93e6008](https://github.com/Gitsack/hamster/commit/93e60088726a85fdddaefdad6fce6c5f11b2b687)) +- unify download progress display across all detail pages ([93e6008](https://github.com/Gitsack/hamster/commit/93e60088726a85fdddaefdad6fce6c5f11b2b687)) +- unify download progress display across all detail pages ([1272e7d](https://github.com/Gitsack/hamster/commit/1272e7dea6cc2c3e4e5fd9c84feb7b575320f327)) + +### Bug Fixes + +- add a11y improvements to search results tables ([3884915](https://github.com/Gitsack/hamster/commit/3884915bc75f970d9a5ee7957cb0c7d696698407)) +- add missing aria-labels to icon-only buttons ([52fde77](https://github.com/Gitsack/hamster/commit/52fde770d7ea21cd9d96051523ff4348adcea3ea)) +- add missing aria-labels to icon-only buttons across pages ([8b2e43d](https://github.com/Gitsack/hamster/commit/8b2e43d72f81fd721d96cfc3bd52035101354129)) +- clear stale search results, cap limit param, and use CardHeader for search results ([1c514a6](https://github.com/Gitsack/hamster/commit/1c514a68e259b922acec5e47f91316259fd6d98f)) +- create test user command ([325c39c](https://github.com/Gitsack/hamster/commit/325c39c8ca2258368666d910932a5e65dec8101d)) +- exclude test files from Inertia page globs ([78ca3f4](https://github.com/Gitsack/hamster/commit/78ca3f46a54e2ae8c758c1210bf1de9eb04528e0)) +- exclude test files from Inertia page globs to prevent runtime errors ([6a47829](https://github.com/Gitsack/hamster/commit/6a47829066b839d1d2ea43f04b59c80629c4c04a)) +- hide status filter on Music tab where artists lack status fields ([38f5e44](https://github.com/Gitsack/hamster/commit/38f5e4438a7e8274aca11bf33323f29aec029eb3)) +- resolve N+1 queries in controllers and add missing database indexes ([ce8ffe0](https://github.com/Gitsack/hamster/commit/ce8ffe0ef0eec1ace5eb70600378c8b87ad5c389)) +- use MediaStatusBadge consistently across all library views ([6d147b8](https://github.com/Gitsack/hamster/commit/6d147b8e2e2d086762bc910773934c6499819733)) +- use MediaStatusBadge consistently across all library views ([78cdaff](https://github.com/Gitsack/hamster/commit/78cdaff477c459d75406c5768003fa1170779c6b)) ## [1.22.0](https://github.com/Gitsack/hamster/compare/hamster-v1.21.2...hamster-v1.22.0) (2026-03-28) - ### Features -* add license and contributing ([f04255b](https://github.com/Gitsack/hamster/commit/f04255b5aea900affd9a48d13c0c4f37076899b6)) -* added different downloaders to UI ([4c89c8c](https://github.com/Gitsack/hamster/commit/4c89c8c4a9c22b27bdcd1eb53208509fd53d1566)) -* added genre tags for movie/show search ([4188a37](https://github.com/Gitsack/hamster/commit/4188a37e5e408531230167ab5a9bbfe9a2b61afb)) -* added gh actions for release and image push ([453ca8a](https://github.com/Gitsack/hamster/commit/453ca8a1a2a90d7b05a9bad43fe62d60d1b5854c)) -* added pgid puid ([d8dc7c1](https://github.com/Gitsack/hamster/commit/d8dc7c194071301a8a9f3ea7ceb4f3e41811537b)) -* added secure_cookies env ([6cf76d1](https://github.com/Gitsack/hamster/commit/6cf76d1c6d1ad2016135df5f9f1f8a60eda61588)) -* added shadcn ([b385ca4](https://github.com/Gitsack/hamster/commit/b385ca4a5a5746de9d00f412d8fb200ffa40b70a)) -* added trailers and more pictures to entry details ([7c110d7](https://github.com/Gitsack/hamster/commit/7c110d791dc2341b86f4262c42385cf5cb1b39cc)) -* added unified spinner component ([99ad097](https://github.com/Gitsack/hamster/commit/99ad097ca3caf98eb35558a766896e8de4ce49da)) -* added version to sidebar ([c96e2df](https://github.com/Gitsack/hamster/commit/c96e2dfff6e455ce5ad22d41d8a1274a19bbe2da)) -* added webhooks and other dl options ([9570aa6](https://github.com/Gitsack/hamster/commit/9570aa6cc9ed51f97c89d45918608d9a44dbc2e1)) -* album artist search ([ce46162](https://github.com/Gitsack/hamster/commit/ce46162e63655255e25116a56b759215cd22ccef)) -* better retries and blacklistings for failed downloads ([c4a2af1](https://github.com/Gitsack/hamster/commit/c4a2af1e2f2d6b08d246512cce773d087174b450)) -* better streaming service selection ([138761d](https://github.com/Gitsack/hamster/commit/138761d910ca889acbfdf2f8ecb2b676885a7be6)) -* different media types sorting ([5ecf6fb](https://github.com/Gitsack/hamster/commit/5ecf6fb925f55345625cbe54f0b32f5953510ad3)) -* directly access sabnzbd when deduplicating ([981ff75](https://github.com/Gitsack/hamster/commit/981ff753d1e90e7e1d79c957c169809e70f49de1)) -* docker, new quality profiles, dialog updates ([03d421b](https://github.com/Gitsack/hamster/commit/03d421b0208f491b9d1a69cf4359792bc252965f)) -* download processing management improvements ([b989573](https://github.com/Gitsack/hamster/commit/b9895733c68f94514518a16f799d1bf720680997)) -* further improved matching previously downloaded items ([ca146f6](https://github.com/Gitsack/hamster/commit/ca146f6c3f5e92b2028c56bea8115660485bcfdb)) -* general playback of items ([14add3a](https://github.com/Gitsack/hamster/commit/14add3ab473a2bdf75a52c2585b8855266284801)) -* home & getting started pages ([c1a92f1](https://github.com/Gitsack/hamster/commit/c1a92f125f911b57106cbbc9f5169516669d3268)) -* hw acceleration ([f6f8fc7](https://github.com/Gitsack/hamster/commit/f6f8fc7703706df27a2703c53d6561201dd2e285)) -* improved album and artist matching ([f8d5eec](https://github.com/Gitsack/hamster/commit/f8d5eec1e5383f94f0d39cd689793d24de93abe2)) -* initial music implementation ([7ea57d2](https://github.com/Gitsack/hamster/commit/7ea57d26a529ce43b86b715bc1e96374d4cca5c1)) -* library scan for files ([89b86ca](https://github.com/Gitsack/hamster/commit/89b86caa1253f073a12ecbd2c5403e6302de40e1)) -* make APP_KEY optional as docker variable ([263bd2e](https://github.com/Gitsack/hamster/commit/263bd2ea7dbdbb3413c60b49e78db729f161f03d)) -* more teasers open in sidebar ([de086b7](https://github.com/Gitsack/hamster/commit/de086b740580f49b0bfa9bf99791dd8659fecafc)) -* new download options / structure ([c0df269](https://github.com/Gitsack/hamster/commit/c0df269ea37426200e44fe1f94924744715d09b3)) -* new library system and cleanups ([913a749](https://github.com/Gitsack/hamster/commit/913a74922976a3f25d5449541c75289301b3535c)) -* new media hero structure ([1077065](https://github.com/Gitsack/hamster/commit/107706501ed2195194766ab58a3e09793693ea6c)) -* new media structure ([85cb00a](https://github.com/Gitsack/hamster/commit/85cb00a1ebe566b5968697cdc7b821c179ea6bf4)) -* new media types ([728faed](https://github.com/Gitsack/hamster/commit/728faed66f135ea3ada42bf7b8f039f8a02a9a27)) -* new size quality profile ([c069e95](https://github.com/Gitsack/hamster/commit/c069e95a4c24ab0870104299ea7ee30cc5830f09)) -* only one workflow file ([28aeeeb](https://github.com/Gitsack/hamster/commit/28aeeeba413691daccfa1ed4bd051cfa066c0f69)) -* quick view of personal streaming availability ([829a1dd](https://github.com/Gitsack/hamster/commit/829a1dd60c03ae088ad5ae5a897f1adb53b0b571)) -* renamed to hamster ([39b4105](https://github.com/Gitsack/hamster/commit/39b4105739b6cc64ff8abe4669268f5f7bcbf984)) -* scan download files and import ([e379520](https://github.com/Gitsack/hamster/commit/e379520d38a5da039c70a95340419e1b702cdd37)) -* scheduled metadata refresh, media hero, deduplicate action ([b087601](https://github.com/Gitsack/hamster/commit/b08760157c29c28d5e441c5dfa8fa68603c959f1)) -* search ([3d40efb](https://github.com/Gitsack/hamster/commit/3d40efb7e841ff980060f3a21962bfca65b84c09)) -* show more on discover lanes, media type query params ([b8a6939](https://github.com/Gitsack/hamster/commit/b8a6939f113277cc5b8513b16432bac8ec510550)) -* similar lane, discover improvements ([9ff81cf](https://github.com/Gitsack/hamster/commit/9ff81cfe5600629512c320029d99e861a598840f)) -* structural changes ([3907a72](https://github.com/Gitsack/hamster/commit/3907a72b0892a421d77f3d8b64e74e7e45927eb1)) -* trakt and justwatch integrations ([ebf06a8](https://github.com/Gitsack/hamster/commit/ebf06a81aec10c498410f4c93d40b797ffecef2c)) -* unified download dialog, search details sheet for movie and show ([d9cd167](https://github.com/Gitsack/hamster/commit/d9cd167d7f1eeb99dc3f3ef45b0160cf1047b9b9)) -* unified status badge ([a919d39](https://github.com/Gitsack/hamster/commit/a919d392e49bbbc572c36755653afa42f8df8255)) -* updated tv show fetching of tmdb data ([5d30808](https://github.com/Gitsack/hamster/commit/5d30808dc0d21cebfb1d65b8688abed6b34be9fd)) -* upgraded to new adonis and vite v7 ([fabb87e](https://github.com/Gitsack/hamster/commit/fabb87eea5d56a3ab58d3ace9ca10a788b573728)) -* use unified badges, click event fixes ([3d181fe](https://github.com/Gitsack/hamster/commit/3d181fedf9f8a24d5d846240925e01bd71c16164)) -* working download ([d4579d6](https://github.com/Gitsack/hamster/commit/d4579d67387d90f0593d868b339e054b31bc6e56)) - - -### Bug Fixes - -* adapted streaming loading debounce ([dfe68e1](https://github.com/Gitsack/hamster/commit/dfe68e1693d70f1862a3aa463705e0a40fc2bd11)) -* added different search way for movies ([934e86c](https://github.com/Gitsack/hamster/commit/934e86c0565adaf17bd0d7dc5505830c4f211881)) -* apostrophes in search queries ([f20860c](https://github.com/Gitsack/hamster/commit/f20860cbbff7e093c62ade84ee13f16425d9c1c8)) -* artists view, albums ([6486efa](https://github.com/Gitsack/hamster/commit/6486efa7d8d02a22497dc530bb01b5380ed142b4)) -* better download and sync to sabnzbd ([cebf877](https://github.com/Gitsack/hamster/commit/cebf8774135a41c11d945180f62ad10d0ffa961e)) -* bun lockfile ([f0f45fa](https://github.com/Gitsack/hamster/commit/f0f45fa938a31b03dc356d4bbbe7284a1f69f3ba)) -* chown only necessary folders ([c160d02](https://github.com/Gitsack/hamster/commit/c160d02588a6b160ee80b113fcc4c1fc6e1c1984)) -* consolidatet readme files ([524d199](https://github.com/Gitsack/hamster/commit/524d19981a3097699937a894445f31d8b94011c7)) -* correct appearing streaming badges ([425e973](https://github.com/Gitsack/hamster/commit/425e9732b62c6f4b2bc65caaa3b3c523ce3be424)) -* correct chown directories ([3dd8178](https://github.com/Gitsack/hamster/commit/3dd8178e440e9b8086e6988a4afb5dda75800044)) -* deduplicate download items that have already been downloaded ([f723050](https://github.com/Gitsack/hamster/commit/f723050a74e1a1d4008eb974e1333aeaf8f34824)) -* delete file on remove button for importing items ([052668f](https://github.com/Gitsack/hamster/commit/052668fb106aa6cb65edc533f16503ee23da8657)) -* different matching for deduplication ([520322e](https://github.com/Gitsack/hamster/commit/520322e069456db52725afb5444190f166a62266)) -* direct download ([cb4885f](https://github.com/Gitsack/hamster/commit/cb4885f7628a5c73b06beb1414589a4ff7e45c59)) -* docker folders ([2f9bfa0](https://github.com/Gitsack/hamster/commit/2f9bfa0ce66ff1c4b95acfd6f4dd578567ce99cb)) -* docker gh build guid ([5288c0c](https://github.com/Gitsack/hamster/commit/5288c0c94fd986b15b558880739b041d733fb2e4)) -* docker image size ([4efa872](https://github.com/Gitsack/hamster/commit/4efa872edd24c90f2fe00e1ec97ac2acd04849c0)) -* dont link to library entry after requesting from details ([6f30bca](https://github.com/Gitsack/hamster/commit/6f30bca07f76111ef14c0dd7ab881e53118849a1)) -* duplication check on adding items ([2c13b05](https://github.com/Gitsack/hamster/commit/2c13b05c793f9082a6f116c661bdc2e81d2afdcc)) -* dynamic imports ([ae19bb4](https://github.com/Gitsack/hamster/commit/ae19bb45233fbbd3a47b6a2e2adf33cd00978c3c)) -* error handling ([dad7edf](https://github.com/Gitsack/hamster/commit/dad7edf1a55099238aa6a3139b6965a3d9f165fe)) -* filesize maximum, original titles ([36cbdf2](https://github.com/Gitsack/hamster/commit/36cbdf2c3610bcaf2230d683a2b0620ffca2888c)) -* fixes for queue and activity tabs ([5ad4e0a](https://github.com/Gitsack/hamster/commit/5ad4e0a08c08a158744018b2ace475c7a56a7993)) -* handle stuck importing entries ([219c52e](https://github.com/Gitsack/hamster/commit/219c52e7c76c9986cc7a9c4a5756a58bd5b741ce)) -* lane refresh mid scroll ([ce8c941](https://github.com/Gitsack/hamster/commit/ce8c94109ba798bd66377ac32adb8795c174aef1)) -* lowercase github repo name ([79e7548](https://github.com/Gitsack/hamster/commit/79e7548ee6106997d29c8fabf3b460a09b40a4bb)) -* media-hero ([e84dd9b](https://github.com/Gitsack/hamster/commit/e84dd9b1c800062e6cbbf1027a64675e516d6327)) -* next fix for lane refresh bug ([963b8db](https://github.com/Gitsack/hamster/commit/963b8dbcfca888747fa1619302e290d46072dcf2)) -* null error ([47c30d5](https://github.com/Gitsack/hamster/commit/47c30d52adfc0b59ff9d534911ad28a06171bac2)) -* order of preloads in adonisrc ([d6e642a](https://github.com/Gitsack/hamster/commit/d6e642a5fe4c2f21af34e1b5ac325bac7523e96f)) -* promote a regular user to admin if last one ([85d79d0](https://github.com/Gitsack/hamster/commit/85d79d0188037cfc5eeb6dcd8ffca950beb03d57)) -* provenance for docker build and push ([ba9bd66](https://github.com/Gitsack/hamster/commit/ba9bd66f7e864c7d7156037d453f2363815a1b70)) -* show download matching ([977503b](https://github.com/Gitsack/hamster/commit/977503b55b23dcc327b2dff0083d7bed11c69c78)) -* streaming server matching, correct chowning ([d9e41c2](https://github.com/Gitsack/hamster/commit/d9e41c2055922fc9b510d61a494587149f3b5c1e)) -* tests ([51c0cc3](https://github.com/Gitsack/hamster/commit/51c0cc3f057a1621e02ce9fea66fa1e971341e9c)) -* tv show scanning for episodes ([65125bf](https://github.com/Gitsack/hamster/commit/65125bf4872dc4afbbfbe9a6a02c9969f9a7153f)) -* updated bun ([b69cdf3](https://github.com/Gitsack/hamster/commit/b69cdf3ba381366f16b7d6c7723ce42b2041d2d4)) -* updated bun lockfile ([3d6f94d](https://github.com/Gitsack/hamster/commit/3d6f94da4c7fd64ddabfc0515003e7939c06cbc4)) -* updated docker start interval to 2s ([a2364cd](https://github.com/Gitsack/hamster/commit/a2364cd0ee776084e4edfa12ab7a560458b16735)) -* updated lockfiles ([82616fc](https://github.com/Gitsack/hamster/commit/82616fc5268adb5b5cbb73d0685e50d62090c76e)) -* use amd64 platform ([b97286d](https://github.com/Gitsack/hamster/commit/b97286d7dad64a7e64180785c77bc44141bef3dc)) +- add license and contributing ([f04255b](https://github.com/Gitsack/hamster/commit/f04255b5aea900affd9a48d13c0c4f37076899b6)) +- added different downloaders to UI ([4c89c8c](https://github.com/Gitsack/hamster/commit/4c89c8c4a9c22b27bdcd1eb53208509fd53d1566)) +- added genre tags for movie/show search ([4188a37](https://github.com/Gitsack/hamster/commit/4188a37e5e408531230167ab5a9bbfe9a2b61afb)) +- added gh actions for release and image push ([453ca8a](https://github.com/Gitsack/hamster/commit/453ca8a1a2a90d7b05a9bad43fe62d60d1b5854c)) +- added pgid puid ([d8dc7c1](https://github.com/Gitsack/hamster/commit/d8dc7c194071301a8a9f3ea7ceb4f3e41811537b)) +- added secure_cookies env ([6cf76d1](https://github.com/Gitsack/hamster/commit/6cf76d1c6d1ad2016135df5f9f1f8a60eda61588)) +- added shadcn ([b385ca4](https://github.com/Gitsack/hamster/commit/b385ca4a5a5746de9d00f412d8fb200ffa40b70a)) +- added trailers and more pictures to entry details ([7c110d7](https://github.com/Gitsack/hamster/commit/7c110d791dc2341b86f4262c42385cf5cb1b39cc)) +- added unified spinner component ([99ad097](https://github.com/Gitsack/hamster/commit/99ad097ca3caf98eb35558a766896e8de4ce49da)) +- added version to sidebar ([c96e2df](https://github.com/Gitsack/hamster/commit/c96e2dfff6e455ce5ad22d41d8a1274a19bbe2da)) +- added webhooks and other dl options ([9570aa6](https://github.com/Gitsack/hamster/commit/9570aa6cc9ed51f97c89d45918608d9a44dbc2e1)) +- album artist search ([ce46162](https://github.com/Gitsack/hamster/commit/ce46162e63655255e25116a56b759215cd22ccef)) +- better retries and blacklistings for failed downloads ([c4a2af1](https://github.com/Gitsack/hamster/commit/c4a2af1e2f2d6b08d246512cce773d087174b450)) +- better streaming service selection ([138761d](https://github.com/Gitsack/hamster/commit/138761d910ca889acbfdf2f8ecb2b676885a7be6)) +- different media types sorting ([5ecf6fb](https://github.com/Gitsack/hamster/commit/5ecf6fb925f55345625cbe54f0b32f5953510ad3)) +- directly access sabnzbd when deduplicating ([981ff75](https://github.com/Gitsack/hamster/commit/981ff753d1e90e7e1d79c957c169809e70f49de1)) +- docker, new quality profiles, dialog updates ([03d421b](https://github.com/Gitsack/hamster/commit/03d421b0208f491b9d1a69cf4359792bc252965f)) +- download processing management improvements ([b989573](https://github.com/Gitsack/hamster/commit/b9895733c68f94514518a16f799d1bf720680997)) +- further improved matching previously downloaded items ([ca146f6](https://github.com/Gitsack/hamster/commit/ca146f6c3f5e92b2028c56bea8115660485bcfdb)) +- general playback of items ([14add3a](https://github.com/Gitsack/hamster/commit/14add3ab473a2bdf75a52c2585b8855266284801)) +- home & getting started pages ([c1a92f1](https://github.com/Gitsack/hamster/commit/c1a92f125f911b57106cbbc9f5169516669d3268)) +- hw acceleration ([f6f8fc7](https://github.com/Gitsack/hamster/commit/f6f8fc7703706df27a2703c53d6561201dd2e285)) +- improved album and artist matching ([f8d5eec](https://github.com/Gitsack/hamster/commit/f8d5eec1e5383f94f0d39cd689793d24de93abe2)) +- initial music implementation ([7ea57d2](https://github.com/Gitsack/hamster/commit/7ea57d26a529ce43b86b715bc1e96374d4cca5c1)) +- library scan for files ([89b86ca](https://github.com/Gitsack/hamster/commit/89b86caa1253f073a12ecbd2c5403e6302de40e1)) +- make APP_KEY optional as docker variable ([263bd2e](https://github.com/Gitsack/hamster/commit/263bd2ea7dbdbb3413c60b49e78db729f161f03d)) +- more teasers open in sidebar ([de086b7](https://github.com/Gitsack/hamster/commit/de086b740580f49b0bfa9bf99791dd8659fecafc)) +- new download options / structure ([c0df269](https://github.com/Gitsack/hamster/commit/c0df269ea37426200e44fe1f94924744715d09b3)) +- new library system and cleanups ([913a749](https://github.com/Gitsack/hamster/commit/913a74922976a3f25d5449541c75289301b3535c)) +- new media hero structure ([1077065](https://github.com/Gitsack/hamster/commit/107706501ed2195194766ab58a3e09793693ea6c)) +- new media structure ([85cb00a](https://github.com/Gitsack/hamster/commit/85cb00a1ebe566b5968697cdc7b821c179ea6bf4)) +- new media types ([728faed](https://github.com/Gitsack/hamster/commit/728faed66f135ea3ada42bf7b8f039f8a02a9a27)) +- new size quality profile ([c069e95](https://github.com/Gitsack/hamster/commit/c069e95a4c24ab0870104299ea7ee30cc5830f09)) +- only one workflow file ([28aeeeb](https://github.com/Gitsack/hamster/commit/28aeeeba413691daccfa1ed4bd051cfa066c0f69)) +- quick view of personal streaming availability ([829a1dd](https://github.com/Gitsack/hamster/commit/829a1dd60c03ae088ad5ae5a897f1adb53b0b571)) +- renamed to hamster ([39b4105](https://github.com/Gitsack/hamster/commit/39b4105739b6cc64ff8abe4669268f5f7bcbf984)) +- scan download files and import ([e379520](https://github.com/Gitsack/hamster/commit/e379520d38a5da039c70a95340419e1b702cdd37)) +- scheduled metadata refresh, media hero, deduplicate action ([b087601](https://github.com/Gitsack/hamster/commit/b08760157c29c28d5e441c5dfa8fa68603c959f1)) +- search ([3d40efb](https://github.com/Gitsack/hamster/commit/3d40efb7e841ff980060f3a21962bfca65b84c09)) +- show more on discover lanes, media type query params ([b8a6939](https://github.com/Gitsack/hamster/commit/b8a6939f113277cc5b8513b16432bac8ec510550)) +- similar lane, discover improvements ([9ff81cf](https://github.com/Gitsack/hamster/commit/9ff81cfe5600629512c320029d99e861a598840f)) +- structural changes ([3907a72](https://github.com/Gitsack/hamster/commit/3907a72b0892a421d77f3d8b64e74e7e45927eb1)) +- trakt and justwatch integrations ([ebf06a8](https://github.com/Gitsack/hamster/commit/ebf06a81aec10c498410f4c93d40b797ffecef2c)) +- unified download dialog, search details sheet for movie and show ([d9cd167](https://github.com/Gitsack/hamster/commit/d9cd167d7f1eeb99dc3f3ef45b0160cf1047b9b9)) +- unified status badge ([a919d39](https://github.com/Gitsack/hamster/commit/a919d392e49bbbc572c36755653afa42f8df8255)) +- updated tv show fetching of tmdb data ([5d30808](https://github.com/Gitsack/hamster/commit/5d30808dc0d21cebfb1d65b8688abed6b34be9fd)) +- upgraded to new adonis and vite v7 ([fabb87e](https://github.com/Gitsack/hamster/commit/fabb87eea5d56a3ab58d3ace9ca10a788b573728)) +- use unified badges, click event fixes ([3d181fe](https://github.com/Gitsack/hamster/commit/3d181fedf9f8a24d5d846240925e01bd71c16164)) +- working download ([d4579d6](https://github.com/Gitsack/hamster/commit/d4579d67387d90f0593d868b339e054b31bc6e56)) + +### Bug Fixes + +- adapted streaming loading debounce ([dfe68e1](https://github.com/Gitsack/hamster/commit/dfe68e1693d70f1862a3aa463705e0a40fc2bd11)) +- added different search way for movies ([934e86c](https://github.com/Gitsack/hamster/commit/934e86c0565adaf17bd0d7dc5505830c4f211881)) +- apostrophes in search queries ([f20860c](https://github.com/Gitsack/hamster/commit/f20860cbbff7e093c62ade84ee13f16425d9c1c8)) +- artists view, albums ([6486efa](https://github.com/Gitsack/hamster/commit/6486efa7d8d02a22497dc530bb01b5380ed142b4)) +- better download and sync to sabnzbd ([cebf877](https://github.com/Gitsack/hamster/commit/cebf8774135a41c11d945180f62ad10d0ffa961e)) +- bun lockfile ([f0f45fa](https://github.com/Gitsack/hamster/commit/f0f45fa938a31b03dc356d4bbbe7284a1f69f3ba)) +- chown only necessary folders ([c160d02](https://github.com/Gitsack/hamster/commit/c160d02588a6b160ee80b113fcc4c1fc6e1c1984)) +- consolidatet readme files ([524d199](https://github.com/Gitsack/hamster/commit/524d19981a3097699937a894445f31d8b94011c7)) +- correct appearing streaming badges ([425e973](https://github.com/Gitsack/hamster/commit/425e9732b62c6f4b2bc65caaa3b3c523ce3be424)) +- correct chown directories ([3dd8178](https://github.com/Gitsack/hamster/commit/3dd8178e440e9b8086e6988a4afb5dda75800044)) +- deduplicate download items that have already been downloaded ([f723050](https://github.com/Gitsack/hamster/commit/f723050a74e1a1d4008eb974e1333aeaf8f34824)) +- delete file on remove button for importing items ([052668f](https://github.com/Gitsack/hamster/commit/052668fb106aa6cb65edc533f16503ee23da8657)) +- different matching for deduplication ([520322e](https://github.com/Gitsack/hamster/commit/520322e069456db52725afb5444190f166a62266)) +- direct download ([cb4885f](https://github.com/Gitsack/hamster/commit/cb4885f7628a5c73b06beb1414589a4ff7e45c59)) +- docker folders ([2f9bfa0](https://github.com/Gitsack/hamster/commit/2f9bfa0ce66ff1c4b95acfd6f4dd578567ce99cb)) +- docker gh build guid ([5288c0c](https://github.com/Gitsack/hamster/commit/5288c0c94fd986b15b558880739b041d733fb2e4)) +- docker image size ([4efa872](https://github.com/Gitsack/hamster/commit/4efa872edd24c90f2fe00e1ec97ac2acd04849c0)) +- dont link to library entry after requesting from details ([6f30bca](https://github.com/Gitsack/hamster/commit/6f30bca07f76111ef14c0dd7ab881e53118849a1)) +- duplication check on adding items ([2c13b05](https://github.com/Gitsack/hamster/commit/2c13b05c793f9082a6f116c661bdc2e81d2afdcc)) +- dynamic imports ([ae19bb4](https://github.com/Gitsack/hamster/commit/ae19bb45233fbbd3a47b6a2e2adf33cd00978c3c)) +- error handling ([dad7edf](https://github.com/Gitsack/hamster/commit/dad7edf1a55099238aa6a3139b6965a3d9f165fe)) +- filesize maximum, original titles ([36cbdf2](https://github.com/Gitsack/hamster/commit/36cbdf2c3610bcaf2230d683a2b0620ffca2888c)) +- fixes for queue and activity tabs ([5ad4e0a](https://github.com/Gitsack/hamster/commit/5ad4e0a08c08a158744018b2ace475c7a56a7993)) +- handle stuck importing entries ([219c52e](https://github.com/Gitsack/hamster/commit/219c52e7c76c9986cc7a9c4a5756a58bd5b741ce)) +- lane refresh mid scroll ([ce8c941](https://github.com/Gitsack/hamster/commit/ce8c94109ba798bd66377ac32adb8795c174aef1)) +- lowercase github repo name ([79e7548](https://github.com/Gitsack/hamster/commit/79e7548ee6106997d29c8fabf3b460a09b40a4bb)) +- media-hero ([e84dd9b](https://github.com/Gitsack/hamster/commit/e84dd9b1c800062e6cbbf1027a64675e516d6327)) +- next fix for lane refresh bug ([963b8db](https://github.com/Gitsack/hamster/commit/963b8dbcfca888747fa1619302e290d46072dcf2)) +- null error ([47c30d5](https://github.com/Gitsack/hamster/commit/47c30d52adfc0b59ff9d534911ad28a06171bac2)) +- order of preloads in adonisrc ([d6e642a](https://github.com/Gitsack/hamster/commit/d6e642a5fe4c2f21af34e1b5ac325bac7523e96f)) +- promote a regular user to admin if last one ([85d79d0](https://github.com/Gitsack/hamster/commit/85d79d0188037cfc5eeb6dcd8ffca950beb03d57)) +- provenance for docker build and push ([ba9bd66](https://github.com/Gitsack/hamster/commit/ba9bd66f7e864c7d7156037d453f2363815a1b70)) +- show download matching ([977503b](https://github.com/Gitsack/hamster/commit/977503b55b23dcc327b2dff0083d7bed11c69c78)) +- streaming server matching, correct chowning ([d9e41c2](https://github.com/Gitsack/hamster/commit/d9e41c2055922fc9b510d61a494587149f3b5c1e)) +- tests ([51c0cc3](https://github.com/Gitsack/hamster/commit/51c0cc3f057a1621e02ce9fea66fa1e971341e9c)) +- tv show scanning for episodes ([65125bf](https://github.com/Gitsack/hamster/commit/65125bf4872dc4afbbfbe9a6a02c9969f9a7153f)) +- updated bun ([b69cdf3](https://github.com/Gitsack/hamster/commit/b69cdf3ba381366f16b7d6c7723ce42b2041d2d4)) +- updated bun lockfile ([3d6f94d](https://github.com/Gitsack/hamster/commit/3d6f94da4c7fd64ddabfc0515003e7939c06cbc4)) +- updated docker start interval to 2s ([a2364cd](https://github.com/Gitsack/hamster/commit/a2364cd0ee776084e4edfa12ab7a560458b16735)) +- updated lockfiles ([82616fc](https://github.com/Gitsack/hamster/commit/82616fc5268adb5b5cbb73d0685e50d62090c76e)) +- use amd64 platform ([b97286d](https://github.com/Gitsack/hamster/commit/b97286d7dad64a7e64180785c77bc44141bef3dc)) ## [1.21.2](https://github.com/Gitsack/hamster/compare/hamster-v1.21.1...hamster-v1.21.2) (2026-03-28) - ### Bug Fixes -* tests ([51c0cc3](https://github.com/Gitsack/hamster/commit/51c0cc3f057a1621e02ce9fea66fa1e971341e9c)) +- tests ([51c0cc3](https://github.com/Gitsack/hamster/commit/51c0cc3f057a1621e02ce9fea66fa1e971341e9c)) ## [1.21.1](https://github.com/Gitsack/hamster/compare/hamster-v1.21.0...hamster-v1.21.1) (2026-03-28) - ### Bug Fixes -* bun lockfile ([f0f45fa](https://github.com/Gitsack/hamster/commit/f0f45fa938a31b03dc356d4bbbe7284a1f69f3ba)) +- bun lockfile ([f0f45fa](https://github.com/Gitsack/hamster/commit/f0f45fa938a31b03dc356d4bbbe7284a1f69f3ba)) ## [1.21.0](https://github.com/Gitsack/hamster/compare/hamster-v1.20.3...hamster-v1.21.0) (2026-03-23) - ### Features -* download processing management improvements ([b989573](https://github.com/Gitsack/hamster/commit/b9895733c68f94514518a16f799d1bf720680997)) -* new media hero structure ([1077065](https://github.com/Gitsack/hamster/commit/107706501ed2195194766ab58a3e09793693ea6c)) -* scan download files and import ([e379520](https://github.com/Gitsack/hamster/commit/e379520d38a5da039c70a95340419e1b702cdd37)) -* upgraded to new adonis and vite v7 ([fabb87e](https://github.com/Gitsack/hamster/commit/fabb87eea5d56a3ab58d3ace9ca10a788b573728)) - +- download processing management improvements ([b989573](https://github.com/Gitsack/hamster/commit/b9895733c68f94514518a16f799d1bf720680997)) +- new media hero structure ([1077065](https://github.com/Gitsack/hamster/commit/107706501ed2195194766ab58a3e09793693ea6c)) +- scan download files and import ([e379520](https://github.com/Gitsack/hamster/commit/e379520d38a5da039c70a95340419e1b702cdd37)) +- upgraded to new adonis and vite v7 ([fabb87e](https://github.com/Gitsack/hamster/commit/fabb87eea5d56a3ab58d3ace9ca10a788b573728)) ### Bug Fixes -* added different search way for movies ([934e86c](https://github.com/Gitsack/hamster/commit/934e86c0565adaf17bd0d7dc5505830c4f211881)) -* apostrophes in search queries ([f20860c](https://github.com/Gitsack/hamster/commit/f20860cbbff7e093c62ade84ee13f16425d9c1c8)) -* delete file on remove button for importing items ([052668f](https://github.com/Gitsack/hamster/commit/052668fb106aa6cb65edc533f16503ee23da8657)) -* direct download ([cb4885f](https://github.com/Gitsack/hamster/commit/cb4885f7628a5c73b06beb1414589a4ff7e45c59)) -* filesize maximum, original titles ([36cbdf2](https://github.com/Gitsack/hamster/commit/36cbdf2c3610bcaf2230d683a2b0620ffca2888c)) -* fixes for queue and activity tabs ([5ad4e0a](https://github.com/Gitsack/hamster/commit/5ad4e0a08c08a158744018b2ace475c7a56a7993)) -* handle stuck importing entries ([219c52e](https://github.com/Gitsack/hamster/commit/219c52e7c76c9986cc7a9c4a5756a58bd5b741ce)) -* null error ([47c30d5](https://github.com/Gitsack/hamster/commit/47c30d52adfc0b59ff9d534911ad28a06171bac2)) +- added different search way for movies ([934e86c](https://github.com/Gitsack/hamster/commit/934e86c0565adaf17bd0d7dc5505830c4f211881)) +- apostrophes in search queries ([f20860c](https://github.com/Gitsack/hamster/commit/f20860cbbff7e093c62ade84ee13f16425d9c1c8)) +- delete file on remove button for importing items ([052668f](https://github.com/Gitsack/hamster/commit/052668fb106aa6cb65edc533f16503ee23da8657)) +- direct download ([cb4885f](https://github.com/Gitsack/hamster/commit/cb4885f7628a5c73b06beb1414589a4ff7e45c59)) +- filesize maximum, original titles ([36cbdf2](https://github.com/Gitsack/hamster/commit/36cbdf2c3610bcaf2230d683a2b0620ffca2888c)) +- fixes for queue and activity tabs ([5ad4e0a](https://github.com/Gitsack/hamster/commit/5ad4e0a08c08a158744018b2ace475c7a56a7993)) +- handle stuck importing entries ([219c52e](https://github.com/Gitsack/hamster/commit/219c52e7c76c9986cc7a9c4a5756a58bd5b741ce)) +- null error ([47c30d5](https://github.com/Gitsack/hamster/commit/47c30d52adfc0b59ff9d534911ad28a06171bac2)) ## [1.20.3](https://github.com/Gitsack/hamster/compare/hamster-v1.20.2...hamster-v1.20.3) (2026-02-25) - ### Bug Fixes -* media-hero ([e84dd9b](https://github.com/Gitsack/hamster/commit/e84dd9b1c800062e6cbbf1027a64675e516d6327)) +- media-hero ([e84dd9b](https://github.com/Gitsack/hamster/commit/e84dd9b1c800062e6cbbf1027a64675e516d6327)) ## [1.20.2](https://github.com/Gitsack/hamster/compare/hamster-v1.20.1...hamster-v1.20.2) (2026-02-25) - ### Bug Fixes -* different matching for deduplication ([520322e](https://github.com/Gitsack/hamster/commit/520322e069456db52725afb5444190f166a62266)) +- different matching for deduplication ([520322e](https://github.com/Gitsack/hamster/commit/520322e069456db52725afb5444190f166a62266)) ## [1.20.1](https://github.com/Gitsack/hamster/compare/hamster-v1.20.0...hamster-v1.20.1) (2026-02-25) - ### Bug Fixes -* deduplicate download items that have already been downloaded ([f723050](https://github.com/Gitsack/hamster/commit/f723050a74e1a1d4008eb974e1333aeaf8f34824)) +- deduplicate download items that have already been downloaded ([f723050](https://github.com/Gitsack/hamster/commit/f723050a74e1a1d4008eb974e1333aeaf8f34824)) ## [1.20.0](https://github.com/Gitsack/hamster/compare/hamster-v1.19.1...hamster-v1.20.0) (2026-02-25) - ### Features -* new size quality profile ([c069e95](https://github.com/Gitsack/hamster/commit/c069e95a4c24ab0870104299ea7ee30cc5830f09)) +- new size quality profile ([c069e95](https://github.com/Gitsack/hamster/commit/c069e95a4c24ab0870104299ea7ee30cc5830f09)) ## [1.19.1](https://github.com/Gitsack/hamster/compare/hamster-v1.19.0...hamster-v1.19.1) (2026-02-25) - ### Bug Fixes -* duplication check on adding items ([2c13b05](https://github.com/Gitsack/hamster/commit/2c13b05c793f9082a6f116c661bdc2e81d2afdcc)) +- duplication check on adding items ([2c13b05](https://github.com/Gitsack/hamster/commit/2c13b05c793f9082a6f116c661bdc2e81d2afdcc)) ## [1.19.0](https://github.com/Gitsack/hamster/compare/hamster-v1.18.0...hamster-v1.19.0) (2026-02-25) - ### Features -* directly access sabnzbd when deduplicating ([981ff75](https://github.com/Gitsack/hamster/commit/981ff753d1e90e7e1d79c957c169809e70f49de1)) +- directly access sabnzbd when deduplicating ([981ff75](https://github.com/Gitsack/hamster/commit/981ff753d1e90e7e1d79c957c169809e70f49de1)) ## [1.18.0](https://github.com/Gitsack/hamster/compare/hamster-v1.17.5...hamster-v1.18.0) (2026-02-25) - ### Features -* scheduled metadata refresh, media hero, deduplicate action ([b087601](https://github.com/Gitsack/hamster/commit/b08760157c29c28d5e441c5dfa8fa68603c959f1)) - +- scheduled metadata refresh, media hero, deduplicate action ([b087601](https://github.com/Gitsack/hamster/commit/b08760157c29c28d5e441c5dfa8fa68603c959f1)) ### Bug Fixes -* lane refresh mid scroll ([ce8c941](https://github.com/Gitsack/hamster/commit/ce8c94109ba798bd66377ac32adb8795c174aef1)) -* next fix for lane refresh bug ([963b8db](https://github.com/Gitsack/hamster/commit/963b8dbcfca888747fa1619302e290d46072dcf2)) +- lane refresh mid scroll ([ce8c941](https://github.com/Gitsack/hamster/commit/ce8c94109ba798bd66377ac32adb8795c174aef1)) +- next fix for lane refresh bug ([963b8db](https://github.com/Gitsack/hamster/commit/963b8dbcfca888747fa1619302e290d46072dcf2)) ## [1.17.5](https://github.com/Gitsack/hamster/compare/hamster-v1.17.4...hamster-v1.17.5) (2026-02-15) - ### Bug Fixes -* correct chown directories ([3dd8178](https://github.com/Gitsack/hamster/commit/3dd8178e440e9b8086e6988a4afb5dda75800044)) +- correct chown directories ([3dd8178](https://github.com/Gitsack/hamster/commit/3dd8178e440e9b8086e6988a4afb5dda75800044)) ## [1.17.4](https://github.com/Gitsack/hamster/compare/hamster-v1.17.3...hamster-v1.17.4) (2026-02-15) - ### Bug Fixes -* streaming server matching, correct chowning ([d9e41c2](https://github.com/Gitsack/hamster/commit/d9e41c2055922fc9b510d61a494587149f3b5c1e)) +- streaming server matching, correct chowning ([d9e41c2](https://github.com/Gitsack/hamster/commit/d9e41c2055922fc9b510d61a494587149f3b5c1e)) ## [1.17.3](https://github.com/Gitsack/hamster/compare/hamster-v1.17.2...hamster-v1.17.3) (2026-02-15) - ### Bug Fixes -* chown only necessary folders ([c160d02](https://github.com/Gitsack/hamster/commit/c160d02588a6b160ee80b113fcc4c1fc6e1c1984)) +- chown only necessary folders ([c160d02](https://github.com/Gitsack/hamster/commit/c160d02588a6b160ee80b113fcc4c1fc6e1c1984)) ## [1.17.2](https://github.com/Gitsack/hamster/compare/hamster-v1.17.1...hamster-v1.17.2) (2026-02-15) - ### Bug Fixes -* updated docker start interval to 2s ([a2364cd](https://github.com/Gitsack/hamster/commit/a2364cd0ee776084e4edfa12ab7a560458b16735)) +- updated docker start interval to 2s ([a2364cd](https://github.com/Gitsack/hamster/commit/a2364cd0ee776084e4edfa12ab7a560458b16735)) ## [1.17.1](https://github.com/Gitsack/hamster/compare/hamster-v1.17.0...hamster-v1.17.1) (2026-02-15) - ### Bug Fixes -* show download matching ([977503b](https://github.com/Gitsack/hamster/commit/977503b55b23dcc327b2dff0083d7bed11c69c78)) +- show download matching ([977503b](https://github.com/Gitsack/hamster/commit/977503b55b23dcc327b2dff0083d7bed11c69c78)) ## [1.17.0](https://github.com/Gitsack/hamster/compare/hamster-v1.16.0...hamster-v1.17.0) (2026-02-15) - ### Features -* better streaming service selection ([138761d](https://github.com/Gitsack/hamster/commit/138761d910ca889acbfdf2f8ecb2b676885a7be6)) -* quick view of personal streaming availability ([829a1dd](https://github.com/Gitsack/hamster/commit/829a1dd60c03ae088ad5ae5a897f1adb53b0b571)) - +- better streaming service selection ([138761d](https://github.com/Gitsack/hamster/commit/138761d910ca889acbfdf2f8ecb2b676885a7be6)) +- quick view of personal streaming availability ([829a1dd](https://github.com/Gitsack/hamster/commit/829a1dd60c03ae088ad5ae5a897f1adb53b0b571)) ### Bug Fixes -* adapted streaming loading debounce ([dfe68e1](https://github.com/Gitsack/hamster/commit/dfe68e1693d70f1862a3aa463705e0a40fc2bd11)) -* correct appearing streaming badges ([425e973](https://github.com/Gitsack/hamster/commit/425e9732b62c6f4b2bc65caaa3b3c523ce3be424)) +- adapted streaming loading debounce ([dfe68e1](https://github.com/Gitsack/hamster/commit/dfe68e1693d70f1862a3aa463705e0a40fc2bd11)) +- correct appearing streaming badges ([425e973](https://github.com/Gitsack/hamster/commit/425e9732b62c6f4b2bc65caaa3b3c523ce3be424)) ## [1.16.0](https://github.com/Gitsack/hamster/compare/hamster-v1.15.4...hamster-v1.16.0) (2026-02-14) - ### Features -* added trailers and more pictures to entry details ([7c110d7](https://github.com/Gitsack/hamster/commit/7c110d791dc2341b86f4262c42385cf5cb1b39cc)) -* different media types sorting ([5ecf6fb](https://github.com/Gitsack/hamster/commit/5ecf6fb925f55345625cbe54f0b32f5953510ad3)) -* more teasers open in sidebar ([de086b7](https://github.com/Gitsack/hamster/commit/de086b740580f49b0bfa9bf99791dd8659fecafc)) -* show more on discover lanes, media type query params ([b8a6939](https://github.com/Gitsack/hamster/commit/b8a6939f113277cc5b8513b16432bac8ec510550)) -* similar lane, discover improvements ([9ff81cf](https://github.com/Gitsack/hamster/commit/9ff81cfe5600629512c320029d99e861a598840f)) - +- added trailers and more pictures to entry details ([7c110d7](https://github.com/Gitsack/hamster/commit/7c110d791dc2341b86f4262c42385cf5cb1b39cc)) +- different media types sorting ([5ecf6fb](https://github.com/Gitsack/hamster/commit/5ecf6fb925f55345625cbe54f0b32f5953510ad3)) +- more teasers open in sidebar ([de086b7](https://github.com/Gitsack/hamster/commit/de086b740580f49b0bfa9bf99791dd8659fecafc)) +- show more on discover lanes, media type query params ([b8a6939](https://github.com/Gitsack/hamster/commit/b8a6939f113277cc5b8513b16432bac8ec510550)) +- similar lane, discover improvements ([9ff81cf](https://github.com/Gitsack/hamster/commit/9ff81cfe5600629512c320029d99e861a598840f)) ### Bug Fixes -* dont link to library entry after requesting from details ([6f30bca](https://github.com/Gitsack/hamster/commit/6f30bca07f76111ef14c0dd7ab881e53118849a1)) +- dont link to library entry after requesting from details ([6f30bca](https://github.com/Gitsack/hamster/commit/6f30bca07f76111ef14c0dd7ab881e53118849a1)) ## [1.15.4](https://github.com/Gitsack/hamster/compare/hamster-v1.15.3...hamster-v1.15.4) (2026-02-14) - ### Bug Fixes -* dynamic imports ([ae19bb4](https://github.com/Gitsack/hamster/commit/ae19bb45233fbbd3a47b6a2e2adf33cd00978c3c)) +- dynamic imports ([ae19bb4](https://github.com/Gitsack/hamster/commit/ae19bb45233fbbd3a47b6a2e2adf33cd00978c3c)) ## [1.15.3](https://github.com/Gitsack/hamster/compare/hamster-v1.15.2...hamster-v1.15.3) (2026-02-14) - ### Bug Fixes -* error handling ([dad7edf](https://github.com/Gitsack/hamster/commit/dad7edf1a55099238aa6a3139b6965a3d9f165fe)) +- error handling ([dad7edf](https://github.com/Gitsack/hamster/commit/dad7edf1a55099238aa6a3139b6965a3d9f165fe)) ## [1.15.2](https://github.com/Gitsack/hamster/compare/hamster-v1.15.1...hamster-v1.15.2) (2026-02-14) - ### Bug Fixes -* updated bun ([b69cdf3](https://github.com/Gitsack/hamster/commit/b69cdf3ba381366f16b7d6c7723ce42b2041d2d4)) +- updated bun ([b69cdf3](https://github.com/Gitsack/hamster/commit/b69cdf3ba381366f16b7d6c7723ce42b2041d2d4)) ## [1.15.1](https://github.com/Gitsack/hamster/compare/hamster-v1.15.0...hamster-v1.15.1) (2026-02-14) - ### Bug Fixes -* promote a regular user to admin if last one ([85d79d0](https://github.com/Gitsack/hamster/commit/85d79d0188037cfc5eeb6dcd8ffca950beb03d57)) +- promote a regular user to admin if last one ([85d79d0](https://github.com/Gitsack/hamster/commit/85d79d0188037cfc5eeb6dcd8ffca950beb03d57)) ## [1.15.0](https://github.com/Gitsack/hamster/compare/hamster-v1.14.0...hamster-v1.15.0) (2026-02-14) - ### Features -* structural changes ([3907a72](https://github.com/Gitsack/hamster/commit/3907a72b0892a421d77f3d8b64e74e7e45927eb1)) -* trakt and justwatch integrations ([ebf06a8](https://github.com/Gitsack/hamster/commit/ebf06a81aec10c498410f4c93d40b797ffecef2c)) +- structural changes ([3907a72](https://github.com/Gitsack/hamster/commit/3907a72b0892a421d77f3d8b64e74e7e45927eb1)) +- trakt and justwatch integrations ([ebf06a8](https://github.com/Gitsack/hamster/commit/ebf06a81aec10c498410f4c93d40b797ffecef2c)) ## [1.14.0](https://github.com/Gitsack/hamster/compare/hamster-v1.13.0...hamster-v1.14.0) (2026-01-27) diff --git a/adonisrc.ts b/adonisrc.ts index 62e5567..41d528f 100644 --- a/adonisrc.ts +++ b/adonisrc.ts @@ -3,7 +3,6 @@ import { indexEntities } from '@adonisjs/core' import { indexPages } from '@adonisjs/inertia' export default defineConfig({ - /* |-------------------------------------------------------------------------- | Commands @@ -106,10 +105,7 @@ export default defineConfig({ ], hooks: { - init: [ - indexEntities(), - indexPages({ framework: 'react' }), - ], + init: [indexEntities(), indexPages({ framework: 'react' })], buildStarting: [() => import('@adonisjs/vite/build_hook')], }, }) diff --git a/app/controllers/albums_controller.ts b/app/controllers/albums_controller.ts index e1a4bd8..fee9d73 100644 --- a/app/controllers/albums_controller.ts +++ b/app/controllers/albums_controller.ts @@ -563,7 +563,7 @@ export default class AlbumsController { limit: number } - if (trackId && !isNaN(trackId)) { + if (trackId && !Number.isNaN(trackId)) { // Search for specific track (might find a single or EP) const track = await Track.find(trackId) if (!track) { diff --git a/app/controllers/authors_controller.ts b/app/controllers/authors_controller.ts index 0517867..d5b18ed 100644 --- a/app/controllers/authors_controller.ts +++ b/app/controllers/authors_controller.ts @@ -205,7 +205,12 @@ export default class AuthorsController { await author.save() - return response.json({ id: author.id, name: author.name, requested: author.requested, monitored: author.monitored }) + return response.json({ + id: author.id, + name: author.name, + requested: author.requested, + monitored: author.monitored, + }) } async destroy({ params, response }: HttpContext) { diff --git a/app/controllers/movies_controller.ts b/app/controllers/movies_controller.ts index eabecf1..9d33aba 100644 --- a/app/controllers/movies_controller.ts +++ b/app/controllers/movies_controller.ts @@ -587,9 +587,7 @@ export default class MoviesController { const { default: IndexerModel } = await import('#models/indexer') const { default: ProwlarrConfig } = await import('#models/prowlarr_config') const directIndexers = await IndexerModel.query().where('enabled', true) - const prowlarrConfig = await ProwlarrConfig.query() - .where('syncEnabled', true) - .first() + const prowlarrConfig = await ProwlarrConfig.query().where('syncEnabled', true).first() const indexerNames = directIndexers.map((i) => i.name) if (prowlarrConfig) indexerNames.unshift('Prowlarr') @@ -610,8 +608,7 @@ export default class MoviesController { const profile = movie.qualityProfileId ? await QualityProfile.find(movie.qualityProfileId) : null - const allowedQualities = - profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] + const allowedQualities = profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] return response.notFound({ error: 'No releases matching quality profile and size limits', diff --git a/app/controllers/playback_controller.ts b/app/controllers/playback_controller.ts index d5e8ebf..ee0ad1d 100644 --- a/app/controllers/playback_controller.ts +++ b/app/controllers/playback_controller.ts @@ -562,7 +562,7 @@ export default class PlaybackController { return response.badRequest({ error: 'Invalid session ID' }) } - if (isNaN(segmentIndex) || segmentIndex < 0) { + if (Number.isNaN(segmentIndex) || segmentIndex < 0) { return response.badRequest({ error: 'Invalid segment index' }) } diff --git a/app/controllers/system_controller.ts b/app/controllers/system_controller.ts index caba285..94fa0e1 100644 --- a/app/controllers/system_controller.ts +++ b/app/controllers/system_controller.ts @@ -27,7 +27,6 @@ interface HealthResponse { } export default class SystemController { - private previousHealthStatus: Map = new Map() /** diff --git a/app/controllers/unmatched_files_controller.ts b/app/controllers/unmatched_files_controller.ts index 25feacb..7f014c2 100644 --- a/app/controllers/unmatched_files_controller.ts +++ b/app/controllers/unmatched_files_controller.ts @@ -186,9 +186,7 @@ export default class UnmatchedFilesController { * raw relativePath (which may be an absolute SABnzbd storage path). */ private async pruneStaleRecords(): Promise { - const files = await UnmatchedFile.query() - .where('status', 'pending') - .preload('rootFolder') + const files = await UnmatchedFile.query().where('status', 'pending').preload('rootFolder') if (files.length === 0) return @@ -236,7 +234,9 @@ export default class UnmatchedFilesController { if (staleIds.length > 0) { await UnmatchedFile.query().whereIn('id', staleIds).delete() - console.log(`[UnmatchedFiles] Pruned ${staleIds.length} stale records (files no longer on disk)`) + console.log( + `[UnmatchedFiles] Pruned ${staleIds.length} stale records (files no longer on disk)` + ) } } } diff --git a/app/exceptions/handler.ts b/app/exceptions/handler.ts index 0c80faf..12aee71 100644 --- a/app/exceptions/handler.ts +++ b/app/exceptions/handler.ts @@ -56,7 +56,10 @@ export default class HttpExceptionHandler extends ExceptionHandler { // Log API errors to stdout so they appear in docker logs if (ctx.request.url().startsWith('/api/')) { const err = error as any - console.error(`[API Error] ${ctx.request.method()} ${ctx.request.url()}:`, err?.message || err) + console.error( + `[API Error] ${ctx.request.method()} ${ctx.request.url()}:`, + err?.message || err + ) } return super.report(error, ctx) diff --git a/app/middleware/inertia_middleware.ts b/app/middleware/inertia_middleware.ts index 9d55c0e..f6875db 100644 --- a/app/middleware/inertia_middleware.ts +++ b/app/middleware/inertia_middleware.ts @@ -3,7 +3,9 @@ import type { NextFn } from '@adonisjs/core/types/http' import BaseInertiaMiddleware from '@adonisjs/inertia/inertia_middleware' import { readFileSync } from 'node:fs' -const packageJson = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8')) +const packageJson = JSON.parse( + readFileSync(new URL('../../package.json', import.meta.url), 'utf-8') +) export default class InertiaMiddleware extends BaseInertiaMiddleware { share(ctx: HttpContext) { diff --git a/app/models/download_client.ts b/app/models/download_client.ts index f1fde41..a85a581 100644 --- a/app/models/download_client.ts +++ b/app/models/download_client.ts @@ -83,5 +83,4 @@ export default class DownloadClient extends BaseModel { @column.dateTime({ autoCreate: true, autoUpdate: true }) declare updatedAt: DateTime | null - } diff --git a/app/models/movie_file.ts b/app/models/movie_file.ts index cc7c2c0..5e5bcbf 100644 --- a/app/models/movie_file.ts +++ b/app/models/movie_file.ts @@ -40,5 +40,4 @@ export default class MovieFile extends BaseModel { @column.dateTime({ autoCreate: true, autoUpdate: true }) declare updatedAt: DateTime | null - } diff --git a/app/services/download_clients/download_manager.ts b/app/services/download_clients/download_manager.ts index fc62b22..bae6d5a 100644 --- a/app/services/download_clients/download_manager.ts +++ b/app/services/download_clients/download_manager.ts @@ -2081,10 +2081,10 @@ export class DownloadManager { const sabConfig = await sabnzbdService.getConfig(config) if (sabConfig.completeDir) { // Check if the path is accessible locally - const fs = await import('node:fs/promises') + const fsModule = await import('node:fs/promises') let pathAccessible = false try { - await fs.access(sabConfig.completeDir) + await fsModule.access(sabConfig.completeDir) pathAccessible = true } catch { pathAccessible = false @@ -2121,10 +2121,10 @@ export class DownloadManager { try { const destDir = await nzbgetService.getConfigValue(config, 'DestDir') if (destDir) { - const fs = await import('node:fs/promises') + const fsModule = await import('node:fs/promises') let pathAccessible = false try { - await fs.access(destDir) + await fsModule.access(destDir) pathAccessible = true } catch { pathAccessible = false diff --git a/app/services/indexers/indexer_manager.ts b/app/services/indexers/indexer_manager.ts index a84dbf1..53b5a80 100644 --- a/app/services/indexers/indexer_manager.ts +++ b/app/services/indexers/indexer_manager.ts @@ -13,7 +13,10 @@ import { prowlarrService, type ProwlarrSearchResult } from './prowlarr_service.j * that can interfere with indexer text search (e.g. apostrophes, asterisks). */ function sanitizeSearchQuery(title: string): string { - return title.replace(/[^a-zA-Z0-9\s-]/g, '').replace(/\s+/g, ' ').trim() + return title + .replace(/[^a-zA-Z0-9\s-]/g, '') + .replace(/\s+/g, ' ') + .trim() } export type MediaType = 'movie' | 'tv' | 'music' | 'book' | 'other' @@ -366,22 +369,22 @@ export class IndexerManager { title: result.title, indexer: result.indexer, indexerId: String(result.indexerId), - size: result.size, - publishDate: result.publishDate, - downloadUrl: result.downloadUrl, - infoUrl: result.infoUrl, - grabs: result.grabs, - seeders: result.seeders, - peers: result.leechers, - protocol: result.protocol, - source: 'prowlarr' as const, - category: primaryCat?.name, - categoryId: primaryCat?.id, - mediaType: classifyMediaType(primaryCat?.id), - artist: result.artist, - album: result.album, - year: result.year, - quality: this.detectQuality(result.title), + size: result.size, + publishDate: result.publishDate, + downloadUrl: result.downloadUrl, + infoUrl: result.infoUrl, + grabs: result.grabs, + seeders: result.seeders, + peers: result.leechers, + protocol: result.protocol, + source: 'prowlarr' as const, + category: primaryCat?.name, + categoryId: primaryCat?.id, + mediaType: classifyMediaType(primaryCat?.id), + artist: result.artist, + album: result.album, + year: result.year, + quality: this.detectQuality(result.title), } }) } diff --git a/app/services/media/book_import_service.ts b/app/services/media/book_import_service.ts index 2d14e3c..b047705 100644 --- a/app/services/media/book_import_service.ts +++ b/app/services/media/book_import_service.ts @@ -61,7 +61,8 @@ export class BookImportService { console.log(`[BookImportService] Original output path: ${outputPath}`) if (download.downloadClientId) { - const DownloadClient = (await import('#models/download_client')).default + const DownloadClientModule = await import('#models/download_client') + const DownloadClient = DownloadClientModule.default const client = await DownloadClient.find(download.downloadClientId) if (client?.settings?.remotePath && client?.settings?.localPath) { const oldPath = outputPath diff --git a/app/services/media/book_scanner_service.ts b/app/services/media/book_scanner_service.ts index ab662f2..f1ee5d8 100644 --- a/app/services/media/book_scanner_service.ts +++ b/app/services/media/book_scanner_service.ts @@ -112,7 +112,7 @@ export class BookScannerService { const authorCount = groupedAuthors.size let authorIndex = 0 - for (const [_authorKey, authorData] of groupedAuthors) { + for (const [, authorData] of groupedAuthors) { authorIndex++ onProgress?.({ phase: 'metadata', diff --git a/app/services/media/file_naming_service.ts b/app/services/media/file_naming_service.ts index b2b1df3..b09a00c 100644 --- a/app/services/media/file_naming_service.ts +++ b/app/services/media/file_naming_service.ts @@ -68,6 +68,7 @@ interface BookNamingData { * │ │ └── 02 - Track Title.flac */ export class FileNamingService { + // eslint-disable-next-line no-control-regex private readonly illegalChars = /[<>:"/\\|?*\x00-\x1f]/g private readonly reservedNames = [ 'CON', diff --git a/app/services/media/tv_show_scanner_service.ts b/app/services/media/tv_show_scanner_service.ts index db51690..e15f402 100644 --- a/app/services/media/tv_show_scanner_service.ts +++ b/app/services/media/tv_show_scanner_service.ts @@ -111,7 +111,7 @@ export class TvShowScannerService { const showCount = groupedShows.size let showIndex = 0 - for (const [_showKey, showData] of groupedShows) { + for (const [, showData] of groupedShows) { showIndex++ onProgress?.({ phase: 'metadata', diff --git a/app/services/tasks/folder_scanner.ts b/app/services/tasks/folder_scanner.ts index 7f16520..b4a95d7 100644 --- a/app/services/tasks/folder_scanner.ts +++ b/app/services/tasks/folder_scanner.ts @@ -738,16 +738,10 @@ class FolderScanner { rootFolder: RootFolder ): Promise { // Parse TV pattern from folder name - const tvMatch = folderName.match( - /(.+?)[\s._-]*(?:S(\d{1,2})E(\d{1,2})|(\d{1,2})x(\d{1,2}))/i - ) + const tvMatch = folderName.match(/(.+?)[\s._-]*(?:S(\d{1,2})E(\d{1,2})|(\d{1,2})x(\d{1,2}))/i) if (!tvMatch) return null - const showTitle = tvMatch[1] - .replace(/\./g, ' ') - .replace(/_/g, ' ') - .replace(/-/g, ' ') - .trim() + const showTitle = tvMatch[1].replace(/\./g, ' ').replace(/_/g, ' ').replace(/-/g, ' ').trim() const seasonNum = Number.parseInt(tvMatch[2] || tvMatch[4]) const episodeNum = Number.parseInt(tvMatch[3] || tvMatch[5]) const yearMatch = showTitle.match(/\b(19\d{2}|20\d{2})\b/) @@ -873,7 +867,9 @@ class FolderScanner { // Fall back to folder name parsing ("Artist - Album" pattern) if (!artistName || !albumTitle) { - const musicMatch = folderName.match(/^(.+?)\s*-\s*(.+?)(?:\s+(?:CD|LP|EP|FLAC|MP3|WEB|Vinyl|\d{4}).*)?$/i) + const musicMatch = folderName.match( + /^(.+?)\s*-\s*(.+?)(?:\s+(?:CD|LP|EP|FLAC|MP3|WEB|Vinyl|\d{4}).*)?$/i + ) if (musicMatch) { if (!artistName) artistName = musicMatch[1].replace(/\./g, ' ').trim() if (!albumTitle) albumTitle = musicMatch[2].replace(/\./g, ' ').trim() @@ -886,9 +882,7 @@ class FolderScanner { } // Find or create artist - let artist = await Artist.query() - .whereILike('name', artistName) - .first() + let artist = await Artist.query().whereILike('name', artistName).first() if (!artist) { artist = await Artist.create({ @@ -1088,10 +1082,7 @@ class FolderScanner { return null } - private async findExistingTvShowByTitle( - title: string, - year?: number - ): Promise { + private async findExistingTvShowByTitle(title: string, year?: number): Promise { const normalizedTitle = title.toLowerCase().replace(/[^a-z0-9]/g, '') const shows = await TvShow.query() diff --git a/app/services/tasks/requested_search_task.ts b/app/services/tasks/requested_search_task.ts index 55cfea3..80bc62f 100644 --- a/app/services/tasks/requested_search_task.ts +++ b/app/services/tasks/requested_search_task.ts @@ -949,8 +949,7 @@ class RequestedSearchTask { ) if (!bestResult) { - const allowedQualities = - profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] + const allowedQualities = profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] return { found: true, grabbed: false, @@ -1038,8 +1037,7 @@ class RequestedSearchTask { ) if (!bestResult) { - const allowedQualities = - profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] + const allowedQualities = profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] return { found: true, grabbed: false, @@ -1176,8 +1174,7 @@ class RequestedSearchTask { ) if (!bestResult) { - const allowedQualities = - profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] + const allowedQualities = profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] return { found: true, grabbed: false, @@ -1258,8 +1255,7 @@ class RequestedSearchTask { ) if (!bestResult) { - const allowedQualities = - profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] + const allowedQualities = profile?.items.filter((i) => i.allowed).map((i) => i.name) ?? [] return { found: true, grabbed: false, @@ -1332,11 +1328,11 @@ class RequestedSearchTask { const tvShow = episode.tvShow const seriesType = tvShow.seriesType || 'standard' const alternateTitles = [ - ...(tvShow.alternateTitles || []), - ...(tvShow.originalTitle && tvShow.originalTitle !== tvShow.title - ? [tvShow.originalTitle] - : []), - ] + ...(tvShow.alternateTitles || []), + ...(tvShow.originalTitle && tvShow.originalTitle !== tvShow.title + ? [tvShow.originalTitle] + : []), + ] const airDate = seriesType === 'daily' && episode.airDate ? episode.airDate.toISODate() : undefined diff --git a/database/migrations/1766851410020_add_indexes_and_schema_fixes.ts b/database/migrations/1766851410020_add_indexes_and_schema_fixes.ts index 41c7eec..a19cb34 100644 --- a/database/migrations/1766851410020_add_indexes_and_schema_fixes.ts +++ b/database/migrations/1766851410020_add_indexes_and_schema_fixes.ts @@ -97,7 +97,9 @@ export default class extends BaseSchema { // ─── Fix download_clients type column to support torrent clients ─── // Knex enum() creates a CHECK constraint, not a native PG enum type. // Drop the old constraint and add an expanded one. - this.schema.raw('ALTER TABLE "download_clients" DROP CONSTRAINT IF EXISTS "download_clients_type_check"') + this.schema.raw( + 'ALTER TABLE "download_clients" DROP CONSTRAINT IF EXISTS "download_clients_type_check"' + ) this.schema.raw(` ALTER TABLE "download_clients" ADD CONSTRAINT "download_clients_type_check" @@ -188,7 +190,9 @@ export default class extends BaseSchema { }) // Restore original CHECK constraint for download_clients type - this.schema.raw('ALTER TABLE "download_clients" DROP CONSTRAINT IF EXISTS "download_clients_type_check"') + this.schema.raw( + 'ALTER TABLE "download_clients" DROP CONSTRAINT IF EXISTS "download_clients_type_check"' + ) this.schema.raw(` ALTER TABLE "download_clients" ADD CONSTRAINT "download_clients_type_check" diff --git a/database/migrations/1774000000000_create_password_reset_tokens_table.ts b/database/migrations/1774000000000_create_password_reset_tokens_table.ts index ac2188f..caa2c4b 100644 --- a/database/migrations/1774000000000_create_password_reset_tokens_table.ts +++ b/database/migrations/1774000000000_create_password_reset_tokens_table.ts @@ -6,12 +6,7 @@ export default class extends BaseSchema { async up() { this.schema.createTable(this.tableName, (table) => { table.uuid('id').primary().defaultTo(this.raw('gen_random_uuid()')) - table - .uuid('user_id') - .notNullable() - .references('id') - .inTable('users') - .onDelete('CASCADE') + table.uuid('user_id').notNullable().references('id').inTable('users').onDelete('CASCADE') table.string('token_hash').notNullable().unique() table.timestamp('expires_at').notNullable() table.timestamp('used_at').nullable() diff --git a/database/migrations/1774000000001_add_high_frequency_query_indexes.ts b/database/migrations/1774000000001_add_high_frequency_query_indexes.ts index ab16971..c2a0d34 100644 --- a/database/migrations/1774000000001_add_high_frequency_query_indexes.ts +++ b/database/migrations/1774000000001_add_high_frequency_query_indexes.ts @@ -2,18 +2,12 @@ import { BaseSchema } from '@adonisjs/lucid/schema' export default class extends BaseSchema { async up() { - this.schema.raw( - 'CREATE INDEX IF NOT EXISTS "movies_monitored_index" ON "movies" ("monitored")' - ) - this.schema.raw( - 'CREATE INDEX IF NOT EXISTS "movies_has_file_index" ON "movies" ("has_file")' - ) + this.schema.raw('CREATE INDEX IF NOT EXISTS "movies_monitored_index" ON "movies" ("monitored")') + this.schema.raw('CREATE INDEX IF NOT EXISTS "movies_has_file_index" ON "movies" ("has_file")') this.schema.raw( 'CREATE INDEX IF NOT EXISTS "episodes_requested_index" ON "episodes" ("requested")' ) - this.schema.raw( - 'CREATE INDEX IF NOT EXISTS "books_requested_index" ON "books" ("requested")' - ) + this.schema.raw('CREATE INDEX IF NOT EXISTS "books_requested_index" ON "books" ("requested")') this.schema.raw( 'CREATE INDEX IF NOT EXISTS "tv_shows_monitored_index" ON "tv_shows" ("monitored")' ) diff --git a/inertia/app.tsx b/inertia/app.tsx index 701034f..0533fee 100644 --- a/inertia/app.tsx +++ b/inertia/app.tsx @@ -29,7 +29,10 @@ createInertiaApp({ title: (title) => `${title} - ${appName}`, resolve: (name) => { - return resolvePageComponent(`./pages/${name}.tsx`, import.meta.glob('./pages/**/!(*.test|*.spec).tsx')) + return resolvePageComponent( + `./pages/${name}.tsx`, + import.meta.glob('./pages/**/!(*.test|*.spec).tsx') + ) }, setup({ el, App, props }) { diff --git a/inertia/components/library/delete-media-dialog.test.tsx b/inertia/components/library/delete-media-dialog.test.tsx index 9bc1c16..0de4de3 100644 --- a/inertia/components/library/delete-media-dialog.test.tsx +++ b/inertia/components/library/delete-media-dialog.test.tsx @@ -102,7 +102,12 @@ describe('DeleteMediaDialog', () => { const user = userEvent.setup() const onConfirm = vi.fn().mockResolvedValue(undefined) render( - + ) await user.click(screen.getByRole('button', { name: 'Delete File' })) diff --git a/inertia/components/library/download-progress-card.tsx b/inertia/components/library/download-progress-card.tsx index c9e6a46..d201aec 100644 --- a/inertia/components/library/download-progress-card.tsx +++ b/inertia/components/library/download-progress-card.tsx @@ -29,9 +29,8 @@ function formatEta(seconds: number | null): string { function DownloadItem({ download }: { download: ActiveDownloadInfo }) { const isImporting = download.status === 'importing' - const downloaded = download.size && download.remaining !== null - ? download.size - download.remaining - : null + const downloaded = + download.size && download.remaining !== null ? download.size - download.remaining : null return (
@@ -39,11 +38,19 @@ function DownloadItem({ download }: { download: ActiveDownloadInfo }) {
{download.title}
- + {isImporting ? 'Importing' : `${Math.round(download.progress)}%`}
@@ -55,7 +62,9 @@ function DownloadItem({ download }: { download: ActiveDownloadInfo }) { {downloaded !== null && download.size && (
- {formatFileSize(downloaded)} / {formatFileSize(download.size)} + + {formatFileSize(downloaded)} / {formatFileSize(download.size)} +
)} {!isImporting && download.eta !== null && download.eta > 0 && ( @@ -64,9 +73,7 @@ function DownloadItem({ download }: { download: ActiveDownloadInfo }) { {formatEta(download.eta)} )} - {download.downloadClient && ( - {download.downloadClient} - )} + {download.downloadClient && {download.downloadClient}} ) diff --git a/inertia/components/library/media-image.stories.tsx b/inertia/components/library/media-image.stories.tsx index 8493eb8..ffd53bd 100644 --- a/inertia/components/library/media-image.stories.tsx +++ b/inertia/components/library/media-image.stories.tsx @@ -117,7 +117,15 @@ export const SmallIconSize: Story = { name: 'Small Icon Size', decorators: [ (Story) => ( -
+
), diff --git a/inertia/components/library/media-image.test.tsx b/inertia/components/library/media-image.test.tsx index 3fd88cb..29077fe 100644 --- a/inertia/components/library/media-image.test.tsx +++ b/inertia/components/library/media-image.test.tsx @@ -49,9 +49,7 @@ describe('MediaImage', () => { }) it('applies custom iconClassName to fallback', () => { - render( - - ) + render() const icon = screen.getByTestId('fallback-icon') expect(icon).toHaveClass('h-24', 'w-24') }) diff --git a/inertia/components/library/media-status-badge.test.tsx b/inertia/components/library/media-status-badge.test.tsx index 9a97f97..6f5c139 100644 --- a/inertia/components/library/media-status-badge.test.tsx +++ b/inertia/components/library/media-status-badge.test.tsx @@ -13,20 +13,14 @@ describe('getMediaItemStatus', () => { }) it('returns downloaded even with active download', () => { - const result = getMediaItemStatus( - { hasFile: true }, - { progress: 50, status: 'downloading' } - ) + const result = getMediaItemStatus({ hasFile: true }, { progress: 50, status: 'downloading' }) expect(result).toEqual({ status: 'downloaded', progress: 100 }) }) }) describe('downloading status', () => { it('returns downloading with progress when active download exists', () => { - const result = getMediaItemStatus( - { hasFile: false }, - { progress: 45, status: 'downloading' } - ) + const result = getMediaItemStatus({ hasFile: false }, { progress: 45, status: 'downloading' }) expect(result).toEqual({ status: 'downloading', progress: 45 }) }) @@ -43,10 +37,7 @@ describe('getMediaItemStatus', () => { describe('importing status', () => { it('returns importing when active download has importing status', () => { - const result = getMediaItemStatus( - { hasFile: false }, - { progress: 100, status: 'importing' } - ) + const result = getMediaItemStatus({ hasFile: false }, { progress: 100, status: 'importing' }) expect(result).toEqual({ status: 'importing', progress: 100 }) }) @@ -113,10 +104,7 @@ describe('getMediaItemStatus', () => { }) it('importing download takes priority over requested', () => { - const result = getMediaItemStatus( - { requested: true }, - { progress: 100, status: 'importing' } - ) + const result = getMediaItemStatus({ requested: true }, { progress: 100, status: 'importing' }) expect(result.status).toBe('importing') }) }) diff --git a/inertia/components/library/media-teaser.stories.tsx b/inertia/components/library/media-teaser.stories.tsx index 141ab52..303fb1a 100644 --- a/inertia/components/library/media-teaser.stories.tsx +++ b/inertia/components/library/media-teaser.stories.tsx @@ -232,8 +232,16 @@ export const WithStreamingProviders: Story = { mediaType: 'movie', status: 'downloaded', streamingProviders: [ - { id: 8, name: 'Netflix', logoUrl: 'https://image.tmdb.org/t/p/original/pbpMk2JmcoNnQwx5JGpXngfoWtp.jpg' }, - { id: 337, name: 'Disney+', logoUrl: 'https://image.tmdb.org/t/p/original/7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg' }, + { + id: 8, + name: 'Netflix', + logoUrl: 'https://image.tmdb.org/t/p/original/pbpMk2JmcoNnQwx5JGpXngfoWtp.jpg', + }, + { + id: 337, + name: 'Disney+', + logoUrl: 'https://image.tmdb.org/t/p/original/7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg', + }, ], }, } @@ -249,11 +257,31 @@ export const ManyStreamingProviders: Story = { mediaType: 'movie', status: 'none', streamingProviders: [ - { id: 8, name: 'Netflix', logoUrl: 'https://image.tmdb.org/t/p/original/pbpMk2JmcoNnQwx5JGpXngfoWtp.jpg' }, - { id: 337, name: 'Disney+', logoUrl: 'https://image.tmdb.org/t/p/original/7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg' }, - { id: 9, name: 'Prime Video', logoUrl: 'https://image.tmdb.org/t/p/original/emthp39XA2YScoYL1p0sdbAH2WA.jpg' }, - { id: 350, name: 'Apple TV+', logoUrl: 'https://image.tmdb.org/t/p/original/6uhKBfmtzFqOcLousHwZuzcrScK.jpg' }, - { id: 531, name: 'Paramount+', logoUrl: 'https://image.tmdb.org/t/p/original/xbhHHa1YgtpwhC8lb1NQ3ACVcLd.jpg' }, + { + id: 8, + name: 'Netflix', + logoUrl: 'https://image.tmdb.org/t/p/original/pbpMk2JmcoNnQwx5JGpXngfoWtp.jpg', + }, + { + id: 337, + name: 'Disney+', + logoUrl: 'https://image.tmdb.org/t/p/original/7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg', + }, + { + id: 9, + name: 'Prime Video', + logoUrl: 'https://image.tmdb.org/t/p/original/emthp39XA2YScoYL1p0sdbAH2WA.jpg', + }, + { + id: 350, + name: 'Apple TV+', + logoUrl: 'https://image.tmdb.org/t/p/original/6uhKBfmtzFqOcLousHwZuzcrScK.jpg', + }, + { + id: 531, + name: 'Paramount+', + logoUrl: 'https://image.tmdb.org/t/p/original/xbhHHa1YgtpwhC8lb1NQ3ACVcLd.jpg', + }, ], }, } @@ -397,7 +425,9 @@ export const StreamingLoaderBadge: StoryObj = { render: () => ( <> - ← Matrix loading badge at actual size (20×20) + + ← Matrix loading badge at actual size (20×20) + ), } diff --git a/inertia/components/library/media-teaser.tsx b/inertia/components/library/media-teaser.tsx index 2f0efe9..1266fa9 100644 --- a/inertia/components/library/media-teaser.tsx +++ b/inertia/components/library/media-teaser.tsx @@ -102,7 +102,9 @@ export function MediaTeaser({ const wasVisibleRef = useRef(false) const loadingRef = useRef(false) const debounceRef = useRef | null>(null) - const [transition, setTransition] = useState<'pending' | 'loading' | 'fading-out' | 'fading-in' | 'idle'>('idle') + const [transition, setTransition] = useState< + 'pending' | 'loading' | 'fading-out' | 'fading-in' | 'idle' + >('idle') useEffect(() => { if (isLoadingProviders) { @@ -114,7 +116,9 @@ export function MediaTeaser({ wasVisibleRef.current = true setTransition('loading') }, 400) - return () => { if (debounceRef.current) clearTimeout(debounceRef.current) } + return () => { + if (debounceRef.current) clearTimeout(debounceRef.current) + } } if (!loadingRef.current) return @@ -138,7 +142,10 @@ export function MediaTeaser({ const t2 = setTimeout(() => { setTransition('idle') }, 500) - return () => { clearTimeout(t1); clearTimeout(t2) } + return () => { + clearTimeout(t1) + clearTimeout(t2) + } } // Loader was never shown (fast fetch) — go straight to fade-in or idle @@ -153,14 +160,10 @@ export function MediaTeaser({ const IconComponent = mediaType === 'movie' ? Film01Icon : Tv01Icon - const widthClass = - size === 'lane' ? 'w-[150px]' : size === 'small' ? 'w-32' : '' - const iconSize = - size === 'small' ? 'h-8 w-8' : 'h-12 w-12' - const titleSize = - size === 'small' ? 'text-xs' : 'text-sm' - const yearSize = - size === 'small' ? 'text-[10px]' : 'text-xs' + const widthClass = size === 'lane' ? 'w-[150px]' : size === 'small' ? 'w-32' : '' + const iconSize = size === 'small' ? 'h-8 w-8' : 'h-12 w-12' + const titleSize = size === 'small' ? 'text-xs' : 'text-sm' + const yearSize = size === 'small' ? 'text-[10px]' : 'text-xs' const maxProviders = 3 const visibleProviders = streamingProviders?.slice(0, maxProviders) ?? [] @@ -200,10 +203,7 @@ export function MediaTeaser({ {/* Hover gradient */}
{/* Status badge */} -
e.stopPropagation()} - > +
e.stopPropagation()}> ({ })) vi.mock('@/hooks/use_visible_watch_providers', () => ({ - useVisibleWatchProviders: () => ({ providers: {}, loadingIds: new Set(), observerRef: () => () => {} }), + useVisibleWatchProviders: () => ({ + providers: {}, + loadingIds: new Set(), + observerRef: () => () => {}, + }), })) vi.mock('@/components/ui/skeleton', () => ({ @@ -103,9 +107,7 @@ describe('SimilarLane', () => { }) it('renders nothing when tmdbId is null', () => { - const { container } = render( - - ) + const { container } = render() expect(container.innerHTML).toBe('') }) @@ -121,9 +123,7 @@ describe('SimilarLane', () => { it('renders nothing when fetch returns empty results', async () => { mockFetchSuccess({ results: [] }) - const { container } = render( - - ) + const { container } = render() await waitFor(() => { expect(container.querySelector('[data-testid="skeleton"]')).not.toBeInTheDocument() @@ -134,9 +134,7 @@ describe('SimilarLane', () => { it('renders nothing when fetch fails', async () => { mockFetchFailure() - const { container } = render( - - ) + const { container } = render() await waitFor(() => { expect(container.querySelector('[data-testid="skeleton"]')).not.toBeInTheDocument() diff --git a/inertia/components/library/similar-lane.tsx b/inertia/components/library/similar-lane.tsx index 8aee26c..1fa613a 100644 --- a/inertia/components/library/similar-lane.tsx +++ b/inertia/components/library/similar-lane.tsx @@ -29,7 +29,11 @@ export function SimilarLane({ mediaType, mediaId, tmdbId }: SimilarLaneProps) { const [loading, setLoading] = useState(true) const { openMoviePreview, openTvShowPreview } = useMediaPreview() - const { providers: watchProviders, loadingIds: watchProviderLoading, observerRef: watchProviderRef } = useVisibleWatchProviders(mediaType === 'movies' ? 'movie' : 'tv') + const { + providers: watchProviders, + loadingIds: watchProviderLoading, + observerRef: watchProviderRef, + } = useVisibleWatchProviders(mediaType === 'movies' ? 'movie' : 'tv') useEffect(() => { if (!tmdbId) { diff --git a/inertia/components/media-gallery.tsx b/inertia/components/media-gallery.tsx index 2cbf39f..8c6f5ae 100644 --- a/inertia/components/media-gallery.tsx +++ b/inertia/components/media-gallery.tsx @@ -15,7 +15,13 @@ function extractYouTubeKey(embedUrl: string): string | null { return match ? match[1] : null } -export function MediaGallery({ trailerUrl, images, title, className, children }: MediaGalleryProps) { +export function MediaGallery({ + trailerUrl, + images, + title, + className, + children, +}: MediaGalleryProps) { const [playingTrailer, setPlayingTrailer] = useState(false) const [activeIndex, setActiveIndex] = useState(0) const scrollRef = useRef(null) @@ -68,9 +74,10 @@ export function MediaGallery({ trailerUrl, images, title, className, children }: } const goToSlide = (direction: 'prev' | 'next') => { - const next = direction === 'next' - ? (activeIndex + 1) % totalSlides - : (activeIndex - 1 + totalSlides) % totalSlides + const next = + direction === 'next' + ? (activeIndex + 1) % totalSlides + : (activeIndex - 1 + totalSlides) % totalSlides scrollToSlide(next) } @@ -78,7 +85,12 @@ export function MediaGallery({ trailerUrl, images, title, className, children }: const onMouseDown = (e: MouseEvent) => { const el = scrollRef.current if (!el) return - dragState.current = { isDown: true, startX: e.pageX - el.offsetLeft, scrollLeft: el.scrollLeft, dragged: false } + dragState.current = { + isDown: true, + startX: e.pageX - el.offsetLeft, + scrollLeft: el.scrollLeft, + dragged: false, + } el.style.cursor = 'grabbing' el.style.scrollSnapType = 'none' } diff --git a/inertia/components/media-hero.tsx b/inertia/components/media-hero.tsx index 5fdb13c..654020e 100644 --- a/inertia/components/media-hero.tsx +++ b/inertia/components/media-hero.tsx @@ -38,20 +38,14 @@ export function MediaHero({
{children}
- {overview && ( -

{overview}

- )} + {overview &&

{overview}

}
{/* Media section: trailers and images */} {hasGallery && (

Media

- +
)} diff --git a/inertia/components/operation-tracker.tsx b/inertia/components/operation-tracker.tsx index 2d75593..6343de0 100644 --- a/inertia/components/operation-tracker.tsx +++ b/inertia/components/operation-tracker.tsx @@ -69,7 +69,10 @@ function OperationGroupCard({ > {allDone ? ( failed === 0 ? ( - + ) : ( ) @@ -101,10 +104,7 @@ function OperationGroupCard({ /> )} {op.status === 'error' && ( - + )} {op.label}
diff --git a/inertia/components/ui/breadcrumbs.tsx b/inertia/components/ui/breadcrumbs.tsx index 51a9282..987fad0 100644 --- a/inertia/components/ui/breadcrumbs.tsx +++ b/inertia/components/ui/breadcrumbs.tsx @@ -12,9 +12,7 @@ export function Breadcrumbs({ items }: { items: BreadcrumbItem[] }) {