From 021aec7a6364cb746edaa0b587b38b783fb53935 Mon Sep 17 00:00:00 2001 From: Kevin O'Neill <26398311+KevinAllen4325@users.noreply.github.com> Date: Thu, 25 Dec 2025 18:58:06 -0600 Subject: [PATCH] Initial release v1.0.0 --- .env.example | 28 + .github/FUNDING.yml | 3 + .github/workflows/docker-publish.yml | 113 + .gitignore | 383 + Dockerfile | 359 + LICENSE | 674 ++ README.md | 683 ++ assets/screenshots/deezer-browse.png | Bin 0 -> 198855 bytes assets/screenshots/desktop-album.png | Bin 0 -> 122802 bytes assets/screenshots/desktop-artist.png | Bin 0 -> 150953 bytes assets/screenshots/desktop-audiobooks.png | Bin 0 -> 309569 bytes assets/screenshots/desktop-home.png | Bin 0 -> 152335 bytes assets/screenshots/desktop-library.png | Bin 0 -> 176919 bytes assets/screenshots/desktop-player.png | Bin 0 -> 60289 bytes assets/screenshots/desktop-podcasts.png | Bin 0 -> 159687 bytes assets/screenshots/desktop-settings.png | Bin 0 -> 51797 bytes assets/screenshots/mobile-album.png | Bin 0 -> 60227 bytes assets/screenshots/mobile-artist.png | Bin 0 -> 72900 bytes assets/screenshots/mobile-audiobooks.png | Bin 0 -> 86601 bytes assets/screenshots/mobile-home.png | Bin 0 -> 87302 bytes assets/screenshots/mobile-library.png | Bin 0 -> 81169 bytes assets/screenshots/mobile-login.png | Bin 0 -> 17164 bytes assets/screenshots/mobile-player.png | Bin 0 -> 64858 bytes assets/screenshots/mobile-podcasts.png | Bin 0 -> 76778 bytes assets/screenshots/mood-mixer.png | Bin 0 -> 101604 bytes .../screenshots/reddit post/desktop-home.png | Bin 0 -> 152335 bytes .../reddit post/desktop-podcasts.png | Bin 0 -> 159687 bytes .../screenshots/reddit post/mobile-home.png | Bin 0 -> 87302 bytes .../screenshots/reddit post/mobile-player.png | Bin 0 -> 64858 bytes .../screenshots/reddit post/vibe-overlay.png | Bin 0 -> 170851 bytes assets/screenshots/spotify-import-preview.png | Bin 0 -> 51409 bytes assets/screenshots/vibe-overlay.png | Bin 0 -> 170851 bytes backend/.dockerignore | 43 + backend/.gitignore | 21 + backend/Dockerfile | 65 + backend/docker-entrypoint.sh | 59 + backend/healthcheck.js | 24 + backend/package-lock.json | 5578 +++++++++++++ backend/package.json | 71 + .../20251130000000_init/migration.sql | 1128 +++ .../migration.sql | 12 + backend/prisma/migrations/migration_lock.toml | 3 + backend/prisma/schema.prisma | 926 +++ backend/seeds/createUser.ts | 49 + backend/src/config.ts | 110 + backend/src/config/swagger.ts | 103 + backend/src/index.ts | 300 + backend/src/jobs/queueCleaner.ts | 320 + backend/src/middleware/auth.ts | 205 + backend/src/middleware/errorHandler.ts | 11 + backend/src/middleware/rateLimiter.ts | 58 + backend/src/routes/analysis.ts | 293 + backend/src/routes/apiKeys.ts | 231 + backend/src/routes/artists.ts | 566 ++ backend/src/routes/audiobooks.ts | 907 +++ backend/src/routes/auth.ts | 532 ++ backend/src/routes/browse.ts | 377 + backend/src/routes/deviceLink.ts | 232 + backend/src/routes/discover.ts | 1793 +++++ backend/src/routes/downloads.ts | 588 ++ backend/src/routes/enrichment.ts | 293 + backend/src/routes/homepage.ts | 187 + backend/src/routes/library.ts | 3852 +++++++++ backend/src/routes/listeningState.ts | 108 + backend/src/routes/mixes.ts | 684 ++ backend/src/routes/notifications.ts | 711 ++ backend/src/routes/offline.ts | 286 + backend/src/routes/onboarding.ts | 475 ++ backend/src/routes/playbackState.ts | 149 + backend/src/routes/playlists.ts | 985 +++ backend/src/routes/plays.ts | 84 + backend/src/routes/podcasts.ts | 1560 ++++ backend/src/routes/recommendations.ts | 469 ++ backend/src/routes/releases.ts | 259 + backend/src/routes/search.ts | 432 + backend/src/routes/settings.ts | 73 + backend/src/routes/soulseek.ts | 193 + backend/src/routes/spotify.ts | 334 + backend/src/routes/systemSettings.ts | 712 ++ backend/src/routes/webhooks.ts | 231 + backend/src/services/audioStreaming.ts | 395 + backend/src/services/audiobookCache.ts | 416 + backend/src/services/audiobookshelf.ts | 335 + backend/src/services/coverArt.ts | 67 + backend/src/services/coverArtExtractor.ts | 75 + backend/src/services/dataCache.ts | 390 + backend/src/services/deezer.ts | 587 ++ backend/src/services/discoverWeekly.ts | 3122 +++++++ backend/src/services/discoveryLogger.ts | 226 + backend/src/services/downloadQueue.ts | 658 ++ backend/src/services/enrichment.ts | 664 ++ backend/src/services/fanart.ts | 214 + backend/src/services/fileValidator.ts | 175 + backend/src/services/imageProvider.ts | 421 + backend/src/services/itunes.ts | 339 + backend/src/services/lastfm.ts | 947 +++ backend/src/services/lidarr.ts | 2057 +++++ backend/src/services/musicScanner.ts | 766 ++ backend/src/services/musicbrainz.ts | 656 ++ backend/src/services/notificationService.ts | 225 + backend/src/services/openai.ts | 184 + backend/src/services/podcastCache.ts | 252 + backend/src/services/podcastDownload.ts | 441 + backend/src/services/podcastindex.ts | 94 + backend/src/services/programmaticPlaylists.ts | 3246 ++++++++ backend/src/services/rateLimiter.ts | 303 + backend/src/services/rss-parser.ts | 281 + backend/src/services/search.ts | 384 + backend/src/services/simpleDownloadManager.ts | 1684 ++++ backend/src/services/soulseek.ts | 1008 +++ backend/src/services/spotify.ts | 575 ++ backend/src/services/spotifyImport.ts | 2757 +++++++ backend/src/services/wikidata.ts | 164 + backend/src/tests/downloadDedup.test.ts | 1369 ++++ backend/src/utils/artistNormalization.ts | 168 + backend/src/utils/colorExtractor.ts | 235 + backend/src/utils/configValidator.ts | 132 + backend/src/utils/db.ts | 3 + backend/src/utils/discoverLogger.ts | 139 + backend/src/utils/encryption.ts | 100 + backend/src/utils/envWriter.ts | 104 + backend/src/utils/errors.ts | 124 + backend/src/utils/playlistLogger.ts | 299 + backend/src/utils/queryMonitor.ts | 32 + backend/src/utils/redis.ts | 30 + backend/src/utils/systemSettings.ts | 69 + backend/src/workers/artistEnrichment.ts | 371 + backend/src/workers/cleanupDiscovery.ts | 164 + backend/src/workers/dataIntegrity.ts | 384 + backend/src/workers/discoverCron.ts | 67 + backend/src/workers/enrichment.ts | 138 + backend/src/workers/index.ts | 268 + backend/src/workers/organizeSingles.ts | 265 + .../workers/processors/discoverProcessor.ts | 69 + .../src/workers/processors/imageProcessor.ts | 44 + .../src/workers/processors/scanProcessor.ts | 395 + .../workers/processors/validationProcessor.ts | 28 + backend/src/workers/queues.ts | 36 + backend/src/workers/trackEnrichment.ts | 260 + backend/src/workers/unifiedEnrichment.ts | 500 ++ backend/tsconfig.json | 16 + backend/tsconfig.production.json | 10 + docker-compose.dev.yml | 71 + docker-compose.prod.yml | 44 + docker-compose.server.yml | 177 + docker-compose.services.yml | 146 + docker-compose.yml | 257 + docs/FEATURES.md | 86 + docs/TESTING_CHECKLIST.md | 212 + .../production-cleanup-plan-f0350f33.plan.md | 153 + docs/frontend/DESIGN.md | 64 + docs/handoff/spotify-import-code-reference.md | 191 + docs/handoff/spotify-import-handoff.md | 194 + .../ENHANCED_MODE.md | 174 + .../audio-analysis-standard-mode/README.md | 443 + .../curated-vibe-mixes/IMPLEMENTATION.md | 107 + .../spotify-ui-overhaul/MODIFIED_FILES.md | 798 ++ .../vibe-matching-overhaul/README.md | 396 + .../vibe-matching/IMPLEMENTATION_PLAN.md | 571 ++ docs/scripts/predeploy-test.sh | 132 + docs/scripts/reset-analysis-for-new-moods.sql | 17 + docs/scripts/smoke.ts | 222 + docs/tests/checkVibeData.ts | 97 + docs/vibe-matching-research-review.md | 550 ++ docs/vibe-system.md | 651 ++ frontend/.dockerignore | 47 + frontend/.gitignore | 49 + frontend/Dockerfile | 75 + frontend/app/album/[id]/page.tsx | 219 + frontend/app/albums/page.tsx | 96 + frontend/app/artist/[id]/page.tsx | 235 + frontend/app/artists/page.tsx | 98 + frontend/app/audiobooks/[id]/page.tsx | 133 + frontend/app/audiobooks/page.tsx | 670 ++ .../app/audiobooks/series/[name]/page.tsx | 312 + frontend/app/browse/playlists/[id]/page.tsx | 490 ++ frontend/app/browse/playlists/page.tsx | 626 ++ frontend/app/device/page.tsx | 403 + frontend/app/discover/page.tsx | 133 + frontend/app/enhanced-vibe-test/page.tsx | 140 + frontend/app/favicon.ico | Bin 0 -> 25931 bytes frontend/app/globals.css | 548 ++ frontend/app/import/spotify/page.tsx | 1063 +++ frontend/app/layout.tsx | 75 + frontend/app/library/page.tsx | 495 ++ frontend/app/login/page.tsx | 410 + frontend/app/mix/[id]/page.tsx | 399 + frontend/app/onboarding/page.tsx | 1048 +++ frontend/app/page.tsx | 170 + frontend/app/playlist/[id]/page.tsx | 860 ++ frontend/app/playlists/page.tsx | 452 ++ frontend/app/podcasts/[id]/page.tsx | 166 + .../app/podcasts/genre/[genreId]/page.tsx | 193 + frontend/app/podcasts/page.tsx | 607 ++ frontend/app/queue/page.tsx | 360 + frontend/app/radio/page.tsx | 437 + frontend/app/register/page.tsx | 132 + frontend/app/releases/page.tsx | 290 + frontend/app/search/page.tsx | 252 + frontend/app/settings/page.tsx | 244 + frontend/app/setup/page.tsx | 42 + frontend/app/sync/page.tsx | 268 + frontend/assets/SpotIcon.png | Bin 0 -> 8369 bytes frontend/assets/icon-background.png | Bin 0 -> 3150 bytes frontend/assets/icon-foreground.png | Bin 0 -> 59723 bytes frontend/assets/icon-only.png | Bin 0 -> 59723 bytes frontend/assets/icon.png | Bin 0 -> 59723 bytes frontend/assets/splash-dark.png | Bin 0 -> 201191 bytes frontend/assets/splash.png | Bin 0 -> 201191 bytes frontend/components/DownloadNotifications.tsx | 471 ++ frontend/components/MetadataEditor.tsx | 328 + frontend/components/MixCard.tsx | 86 + frontend/components/MoodMixer.tsx | 635 ++ frontend/components/PWAInstallPrompt.tsx | 121 + frontend/components/PodcastPlayer.tsx | 439 + frontend/components/RemoveProgressButton.tsx | 81 + .../components/ServiceWorkerRegistration.tsx | 22 + .../activity/ActiveDownloadsTab.tsx | 180 + frontend/components/activity/HistoryTab.tsx | 269 + .../components/activity/NotificationsTab.tsx | 329 + frontend/components/layout/ActivityPanel.tsx | 273 + .../components/layout/AuthenticatedLayout.tsx | 175 + .../components/layout/BottomNavigation.tsx | 89 + frontend/components/layout/MobileSidebar.tsx | 222 + frontend/components/layout/Sidebar.tsx | 444 + frontend/components/layout/TVLayout.tsx | 317 + frontend/components/layout/TopBar.tsx | 335 + frontend/components/player/FullPlayer.tsx | 568 ++ .../components/player/HowlerAudioElement.tsx | 790 ++ .../player/KeyboardShortcutsTooltip.tsx | 68 + .../player/MediaControlsHandler.tsx | 15 + frontend/components/player/MiniPlayer.tsx | 796 ++ frontend/components/player/OverlayPlayer.tsx | 476 ++ .../components/player/PlayerModeWrapper.tsx | 11 + .../components/player/UniversalPlayer.tsx | 76 + frontend/components/player/VibeGraph.tsx | 198 + frontend/components/player/VibeOverlay.tsx | 761 ++ .../player/VibeOverlayContainer.tsx | 40 + .../components/player/VibeOverlayEnhanced.tsx | 531 ++ .../providers/AudioErrorBoundary.tsx | 52 + .../providers/ConditionalAudioProvider.tsx | 43 + frontend/components/ui/AudiobookCard.tsx | 122 + frontend/components/ui/Badge.tsx | 37 + frontend/components/ui/Button.tsx | 59 + frontend/components/ui/CachedImage.tsx | 24 + frontend/components/ui/Card.tsx | 42 + frontend/components/ui/ConfirmDialog.tsx | 131 + frontend/components/ui/EmptyState.tsx | 47 + frontend/components/ui/FormElements.tsx | 82 + frontend/components/ui/GalaxyBackground.tsx | 176 + frontend/components/ui/GradientSpinner.tsx | 53 + frontend/components/ui/HorizontalCarousel.tsx | 155 + frontend/components/ui/InlineStatus.tsx | 214 + frontend/components/ui/Input.tsx | 47 + frontend/components/ui/LoadingScreen.tsx | 20 + frontend/components/ui/MediaCard.tsx | 75 + frontend/components/ui/Modal.tsx | 73 + frontend/components/ui/PageBackground.tsx | 22 + frontend/components/ui/PagedGridCarousel.tsx | 172 + frontend/components/ui/PlayableCard.tsx | 211 + frontend/components/ui/PlaylistSelector.tsx | 204 + frontend/components/ui/RestartModal.tsx | 156 + frontend/components/ui/Skeleton.tsx | 85 + frontend/docker-entrypoint.sh | 30 + frontend/eslint.config.mjs | 18 + .../album/components/AlbumActionBar.tsx | 104 + .../features/album/components/AlbumHero.tsx | 167 + .../album/components/SimilarAlbums.tsx | 37 + .../features/album/components/TrackList.tsx | 254 + .../features/album/hooks/useAlbumActions.ts | 178 + frontend/features/album/hooks/useAlbumData.ts | 73 + .../features/album/hooks/useTrackPreview.ts | 176 + frontend/features/album/types.ts | 56 + .../artist/components/ArtistActionBar.tsx | 108 + .../features/artist/components/ArtistBio.tsx | 20 + .../features/artist/components/ArtistHero.tsx | 149 + .../artist/components/AvailableAlbums.tsx | 187 + .../artist/components/Discography.tsx | 56 + .../artist/components/PopularTracks.tsx | 180 + .../artist/components/SimilarArtists.tsx | 96 + frontend/features/artist/components/index.ts | 25 + frontend/features/artist/hooks/index.ts | 22 + .../features/artist/hooks/useArtistActions.ts | 131 + .../features/artist/hooks/useArtistData.ts | 82 + .../artist/hooks/useDownloadActions.ts | 103 + .../features/artist/hooks/usePreviewPlayer.ts | 182 + frontend/features/artist/index.ts | 26 + frontend/features/artist/types.ts | 59 + .../audiobook/components/AboutSection.tsx | 44 + .../components/AudiobookActionBar.tsx | 105 + .../audiobook/components/AudiobookHero.tsx | 147 + .../audiobook/components/ChapterList.tsx | 51 + .../audiobook/components/PlayControls.tsx | 87 + .../features/audiobook/components/index.ts | 23 + frontend/features/audiobook/hooks/index.ts | 20 + .../audiobook/hooks/useAudiobookActions.ts | 155 + .../audiobook/hooks/useAudiobookData.ts | 59 + frontend/features/audiobook/index.ts | 26 + frontend/features/audiobook/types.ts | 57 + .../discover/components/DiscoverActionBar.tsx | 123 + .../discover/components/DiscoverHero.tsx | 76 + .../discover/components/DiscoverSettings.tsx | 179 + .../discover/components/HowItWorks.tsx | 56 + .../discover/components/TrackList.tsx | 175 + .../discover/components/UnavailableAlbums.tsx | 161 + .../discover/hooks/useDiscoverActions.ts | 136 + .../discover/hooks/useDiscoverData.ts | 169 + .../discover/hooks/usePreviewPlayer.ts | 100 + frontend/features/discover/types.ts | 46 + frontend/features/discover/types/index.ts | 46 + .../features/home/components/ArtistsGrid.tsx | 87 + .../home/components/AudiobooksGrid.tsx | 71 + .../home/components/ContinueListening.tsx | 151 + .../home/components/FeaturedPlaylistsGrid.tsx | 104 + .../features/home/components/HomeHero.tsx | 35 + .../home/components/LibraryRadioStations.tsx | 498 ++ .../features/home/components/MixesGrid.tsx | 24 + .../features/home/components/PodcastsGrid.tsx | 82 + .../home/components/PopularArtistsGrid.tsx | 85 + .../home/components/SectionHeader.tsx | 40 + frontend/features/home/hooks/useHomeData.ts | 147 + frontend/features/home/types.ts | 72 + .../library/components/AlbumsGrid.tsx | 121 + .../library/components/ArtistsGrid.tsx | 122 + .../library/components/LibraryHeader.tsx | 24 + .../library/components/LibraryTabs.tsx | 56 + .../library/components/TracksList.tsx | 238 + .../library/hooks/useLibraryActions.ts | 146 + .../features/library/hooks/useLibraryData.ts | 64 + frontend/features/library/types.ts | 45 + .../podcast/components/ContinueListening.tsx | 140 + .../podcast/components/EpisodeList.tsx | 181 + .../podcast/components/PodcastActionBar.tsx | 98 + .../podcast/components/PodcastHero.tsx | 145 + .../podcast/components/PreviewEpisodes.tsx | 123 + .../podcast/components/SimilarPodcasts.tsx | 68 + frontend/features/podcast/components/index.ts | 24 + frontend/features/podcast/hooks/index.ts | 20 + .../podcast/hooks/usePodcastActions.ts | 108 + .../features/podcast/hooks/usePodcastData.ts | 139 + frontend/features/podcast/index.ts | 29 + frontend/features/podcast/types.ts | 73 + frontend/features/podcast/utils.ts | 45 + .../features/search/components/EmptyState.tsx | 21 + .../search/components/LibraryAlbumsGrid.tsx | 47 + .../search/components/LibraryPodcastsGrid.tsx | 62 + .../search/components/LibraryTracksList.tsx | 149 + .../search/components/SearchFilters.tsx | 77 + .../search/components/SimilarArtistsGrid.tsx | 72 + .../search/components/SoulseekSongsList.tsx | 146 + .../search/components/TVSearchInput.tsx | 94 + .../features/search/components/TopResult.tsx | 66 + .../features/search/hooks/useSearchData.ts | 47 + .../search/hooks/useSoulseekSearch.ts | 174 + frontend/features/search/types.ts | 69 + .../components/sections/AIServicesSection.tsx | 84 + .../components/sections/APIKeysSection.tsx | 319 + .../components/sections/AccountSection.tsx | 338 + .../sections/AudiobookshelfSection.tsx | 92 + .../components/sections/CacheSection.tsx | 331 + .../sections/DownloadPreferencesSection.tsx | 61 + .../components/sections/LidarrSection.tsx | 92 + .../components/sections/LinkDeviceSection.tsx | 52 + .../components/sections/PlaybackSection.tsx | 34 + .../components/sections/SoulseekSection.tsx | 101 + .../sections/StoragePathsSection.tsx | 45 + .../sections/UserManagementSection.tsx | 224 + .../settings/components/ui/ConnectionCard.tsx | 74 + .../settings/components/ui/SettingsInput.tsx | 63 + .../settings/components/ui/SettingsLayout.tsx | 127 + .../settings/components/ui/SettingsRow.tsx | 30 + .../components/ui/SettingsSection.tsx | 37 + .../settings/components/ui/SettingsSelect.tsx | 45 + .../components/ui/SettingsSidebar.tsx | 72 + .../settings/components/ui/SettingsToggle.tsx | 32 + .../features/settings/components/ui/index.ts | 9 + .../features/settings/hooks/useAPIKeys.ts | 91 + .../settings/hooks/useSettingsData.ts | 65 + .../settings/hooks/useSystemSettings.ts | 210 + .../features/settings/hooks/useTwoFactor.ts | 137 + frontend/features/settings/types.ts | 70 + frontend/healthcheck.js | 24 + frontend/hooks/useActivityPanel.ts | 51 + frontend/hooks/useCachedImage.ts | 42 + frontend/hooks/useDownloadStatus.ts | 127 + frontend/hooks/useImageColor.ts | 466 ++ frontend/hooks/useJobStatus.ts | 90 + frontend/hooks/useKeyboardShortcuts.ts | 139 + frontend/hooks/useMediaQuery.ts | 44 + frontend/hooks/useMediaSession.ts | 300 + frontend/hooks/useNotifications.ts | 234 + frontend/hooks/usePlayerMode.ts | 41 + frontend/hooks/useQueries.ts | 795 ++ frontend/hooks/useTVNavigation.ts | 287 + frontend/lib/api.ts | 1480 ++++ frontend/lib/audio-context.tsx | 28 + frontend/lib/audio-controls-context.tsx | 874 ++ frontend/lib/audio-hooks.tsx | 78 + frontend/lib/audio-playback-context.tsx | 121 + frontend/lib/audio-seek-emitter.ts | 24 + frontend/lib/audio-state-context.tsx | 737 ++ frontend/lib/auth-context.tsx | 166 + frontend/lib/download-context.tsx | 159 + frontend/lib/howler-engine.ts | 507 ++ frontend/lib/query-client.tsx | 90 + frontend/lib/toast-context.tsx | 151 + frontend/lib/tv-utils.ts | 141 + frontend/next.config.ts | 104 + frontend/package-lock.json | 7168 +++++++++++++++++ frontend/package.json | 46 + frontend/playwright.config.ts | 33 + frontend/postcss.config.mjs | 7 + frontend/public/assets/icons/icon-128.webp | Bin 0 -> 2556 bytes frontend/public/assets/icons/icon-192.webp | Bin 0 -> 3672 bytes frontend/public/assets/icons/icon-256.webp | Bin 0 -> 4932 bytes frontend/public/assets/icons/icon-48.webp | Bin 0 -> 1012 bytes frontend/public/assets/icons/icon-512.webp | Bin 0 -> 10068 bytes frontend/public/assets/icons/icon-72.webp | Bin 0 -> 1452 bytes frontend/public/assets/icons/icon-96.webp | Bin 0 -> 1906 bytes frontend/public/assets/images/LIDIFY-2.webp | Bin 0 -> 28334 bytes .../public/assets/images/LIDIFY-black.webp | Bin 0 -> 8148 bytes frontend/public/assets/images/LIDIFY.webp | Bin 0 -> 2232 bytes .../public/assets/images/Lidify__favicon.ico | Bin 0 -> 23976 bytes frontend/public/assets/images/SpotIcon.png | Bin 0 -> 8369 bytes frontend/public/assets/images/favicon-192.png | Bin 0 -> 6727 bytes .../public/assets/images/lidify_circular.webp | Bin 0 -> 11274 bytes frontend/public/manifest.webmanifest | 70 + frontend/public/sw.js | 90 + frontend/scripts/generate-pwa-icons.js | 66 + frontend/tailwind.config.js | 25 + frontend/tests/e2e/smoke.spec.ts | 54 + frontend/tsconfig.json | 34 + frontend/utils/cn.ts | 25 + frontend/utils/formatTime.ts | 55 + frontend/utils/imageCache.ts | 196 + healthcheck-prod.js | 22 + services/audio-analyzer/Dockerfile | 78 + services/audio-analyzer/analyzer.py | 1192 +++ services/audio-analyzer/requirements.txt | 13 + 439 files changed, 116588 insertions(+) create mode 100644 .env.example create mode 100644 .github/FUNDING.yml create mode 100644 .github/workflows/docker-publish.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/screenshots/deezer-browse.png create mode 100644 assets/screenshots/desktop-album.png create mode 100644 assets/screenshots/desktop-artist.png create mode 100644 assets/screenshots/desktop-audiobooks.png create mode 100644 assets/screenshots/desktop-home.png create mode 100644 assets/screenshots/desktop-library.png create mode 100644 assets/screenshots/desktop-player.png create mode 100644 assets/screenshots/desktop-podcasts.png create mode 100644 assets/screenshots/desktop-settings.png create mode 100644 assets/screenshots/mobile-album.png create mode 100644 assets/screenshots/mobile-artist.png create mode 100644 assets/screenshots/mobile-audiobooks.png create mode 100644 assets/screenshots/mobile-home.png create mode 100644 assets/screenshots/mobile-library.png create mode 100644 assets/screenshots/mobile-login.png create mode 100644 assets/screenshots/mobile-player.png create mode 100644 assets/screenshots/mobile-podcasts.png create mode 100644 assets/screenshots/mood-mixer.png create mode 100644 assets/screenshots/reddit post/desktop-home.png create mode 100644 assets/screenshots/reddit post/desktop-podcasts.png create mode 100644 assets/screenshots/reddit post/mobile-home.png create mode 100644 assets/screenshots/reddit post/mobile-player.png create mode 100644 assets/screenshots/reddit post/vibe-overlay.png create mode 100644 assets/screenshots/spotify-import-preview.png create mode 100644 assets/screenshots/vibe-overlay.png create mode 100644 backend/.dockerignore create mode 100644 backend/.gitignore create mode 100644 backend/Dockerfile create mode 100644 backend/docker-entrypoint.sh create mode 100644 backend/healthcheck.js create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/prisma/migrations/20251130000000_init/migration.sql create mode 100644 backend/prisma/migrations/20251225000000_add_missing_track_updated_at/migration.sql create mode 100644 backend/prisma/migrations/migration_lock.toml create mode 100644 backend/prisma/schema.prisma create mode 100644 backend/seeds/createUser.ts create mode 100644 backend/src/config.ts create mode 100644 backend/src/config/swagger.ts create mode 100644 backend/src/index.ts create mode 100644 backend/src/jobs/queueCleaner.ts create mode 100644 backend/src/middleware/auth.ts create mode 100644 backend/src/middleware/errorHandler.ts create mode 100644 backend/src/middleware/rateLimiter.ts create mode 100644 backend/src/routes/analysis.ts create mode 100644 backend/src/routes/apiKeys.ts create mode 100644 backend/src/routes/artists.ts create mode 100644 backend/src/routes/audiobooks.ts create mode 100644 backend/src/routes/auth.ts create mode 100644 backend/src/routes/browse.ts create mode 100644 backend/src/routes/deviceLink.ts create mode 100644 backend/src/routes/discover.ts create mode 100644 backend/src/routes/downloads.ts create mode 100644 backend/src/routes/enrichment.ts create mode 100644 backend/src/routes/homepage.ts create mode 100644 backend/src/routes/library.ts create mode 100644 backend/src/routes/listeningState.ts create mode 100644 backend/src/routes/mixes.ts create mode 100644 backend/src/routes/notifications.ts create mode 100644 backend/src/routes/offline.ts create mode 100644 backend/src/routes/onboarding.ts create mode 100644 backend/src/routes/playbackState.ts create mode 100644 backend/src/routes/playlists.ts create mode 100644 backend/src/routes/plays.ts create mode 100644 backend/src/routes/podcasts.ts create mode 100644 backend/src/routes/recommendations.ts create mode 100644 backend/src/routes/releases.ts create mode 100644 backend/src/routes/search.ts create mode 100644 backend/src/routes/settings.ts create mode 100644 backend/src/routes/soulseek.ts create mode 100644 backend/src/routes/spotify.ts create mode 100644 backend/src/routes/systemSettings.ts create mode 100644 backend/src/routes/webhooks.ts create mode 100644 backend/src/services/audioStreaming.ts create mode 100644 backend/src/services/audiobookCache.ts create mode 100644 backend/src/services/audiobookshelf.ts create mode 100644 backend/src/services/coverArt.ts create mode 100644 backend/src/services/coverArtExtractor.ts create mode 100644 backend/src/services/dataCache.ts create mode 100644 backend/src/services/deezer.ts create mode 100644 backend/src/services/discoverWeekly.ts create mode 100644 backend/src/services/discoveryLogger.ts create mode 100644 backend/src/services/downloadQueue.ts create mode 100644 backend/src/services/enrichment.ts create mode 100644 backend/src/services/fanart.ts create mode 100644 backend/src/services/fileValidator.ts create mode 100644 backend/src/services/imageProvider.ts create mode 100644 backend/src/services/itunes.ts create mode 100644 backend/src/services/lastfm.ts create mode 100644 backend/src/services/lidarr.ts create mode 100644 backend/src/services/musicScanner.ts create mode 100644 backend/src/services/musicbrainz.ts create mode 100644 backend/src/services/notificationService.ts create mode 100644 backend/src/services/openai.ts create mode 100644 backend/src/services/podcastCache.ts create mode 100644 backend/src/services/podcastDownload.ts create mode 100644 backend/src/services/podcastindex.ts create mode 100644 backend/src/services/programmaticPlaylists.ts create mode 100644 backend/src/services/rateLimiter.ts create mode 100644 backend/src/services/rss-parser.ts create mode 100644 backend/src/services/search.ts create mode 100644 backend/src/services/simpleDownloadManager.ts create mode 100644 backend/src/services/soulseek.ts create mode 100644 backend/src/services/spotify.ts create mode 100644 backend/src/services/spotifyImport.ts create mode 100644 backend/src/services/wikidata.ts create mode 100644 backend/src/tests/downloadDedup.test.ts create mode 100644 backend/src/utils/artistNormalization.ts create mode 100644 backend/src/utils/colorExtractor.ts create mode 100644 backend/src/utils/configValidator.ts create mode 100644 backend/src/utils/db.ts create mode 100644 backend/src/utils/discoverLogger.ts create mode 100644 backend/src/utils/encryption.ts create mode 100644 backend/src/utils/envWriter.ts create mode 100644 backend/src/utils/errors.ts create mode 100644 backend/src/utils/playlistLogger.ts create mode 100644 backend/src/utils/queryMonitor.ts create mode 100644 backend/src/utils/redis.ts create mode 100644 backend/src/utils/systemSettings.ts create mode 100644 backend/src/workers/artistEnrichment.ts create mode 100644 backend/src/workers/cleanupDiscovery.ts create mode 100644 backend/src/workers/dataIntegrity.ts create mode 100644 backend/src/workers/discoverCron.ts create mode 100644 backend/src/workers/enrichment.ts create mode 100644 backend/src/workers/index.ts create mode 100644 backend/src/workers/organizeSingles.ts create mode 100644 backend/src/workers/processors/discoverProcessor.ts create mode 100644 backend/src/workers/processors/imageProcessor.ts create mode 100644 backend/src/workers/processors/scanProcessor.ts create mode 100644 backend/src/workers/processors/validationProcessor.ts create mode 100644 backend/src/workers/queues.ts create mode 100644 backend/src/workers/trackEnrichment.ts create mode 100644 backend/src/workers/unifiedEnrichment.ts create mode 100644 backend/tsconfig.json create mode 100644 backend/tsconfig.production.json create mode 100644 docker-compose.dev.yml create mode 100644 docker-compose.prod.yml create mode 100644 docker-compose.server.yml create mode 100644 docker-compose.services.yml create mode 100644 docker-compose.yml create mode 100644 docs/FEATURES.md create mode 100644 docs/TESTING_CHECKLIST.md create mode 100644 docs/dev-notes/plans/production-cleanup-plan-f0350f33.plan.md create mode 100644 docs/frontend/DESIGN.md create mode 100644 docs/handoff/spotify-import-code-reference.md create mode 100644 docs/handoff/spotify-import-handoff.md create mode 100644 docs/implementation-summaries/audio-analysis-standard-mode/ENHANCED_MODE.md create mode 100644 docs/implementation-summaries/audio-analysis-standard-mode/README.md create mode 100644 docs/implementation-summaries/curated-vibe-mixes/IMPLEMENTATION.md create mode 100644 docs/implementation-summaries/spotify-ui-overhaul/MODIFIED_FILES.md create mode 100644 docs/implementation-summaries/vibe-matching-overhaul/README.md create mode 100644 docs/implementation-summaries/vibe-matching/IMPLEMENTATION_PLAN.md create mode 100644 docs/scripts/predeploy-test.sh create mode 100644 docs/scripts/reset-analysis-for-new-moods.sql create mode 100644 docs/scripts/smoke.ts create mode 100644 docs/tests/checkVibeData.ts create mode 100644 docs/vibe-matching-research-review.md create mode 100644 docs/vibe-system.md create mode 100644 frontend/.dockerignore create mode 100644 frontend/.gitignore create mode 100644 frontend/Dockerfile create mode 100644 frontend/app/album/[id]/page.tsx create mode 100644 frontend/app/albums/page.tsx create mode 100644 frontend/app/artist/[id]/page.tsx create mode 100644 frontend/app/artists/page.tsx create mode 100644 frontend/app/audiobooks/[id]/page.tsx create mode 100644 frontend/app/audiobooks/page.tsx create mode 100644 frontend/app/audiobooks/series/[name]/page.tsx create mode 100644 frontend/app/browse/playlists/[id]/page.tsx create mode 100644 frontend/app/browse/playlists/page.tsx create mode 100644 frontend/app/device/page.tsx create mode 100644 frontend/app/discover/page.tsx create mode 100644 frontend/app/enhanced-vibe-test/page.tsx create mode 100644 frontend/app/favicon.ico create mode 100644 frontend/app/globals.css create mode 100644 frontend/app/import/spotify/page.tsx create mode 100644 frontend/app/layout.tsx create mode 100644 frontend/app/library/page.tsx create mode 100644 frontend/app/login/page.tsx create mode 100644 frontend/app/mix/[id]/page.tsx create mode 100644 frontend/app/onboarding/page.tsx create mode 100644 frontend/app/page.tsx create mode 100644 frontend/app/playlist/[id]/page.tsx create mode 100644 frontend/app/playlists/page.tsx create mode 100644 frontend/app/podcasts/[id]/page.tsx create mode 100644 frontend/app/podcasts/genre/[genreId]/page.tsx create mode 100644 frontend/app/podcasts/page.tsx create mode 100644 frontend/app/queue/page.tsx create mode 100644 frontend/app/radio/page.tsx create mode 100644 frontend/app/register/page.tsx create mode 100644 frontend/app/releases/page.tsx create mode 100644 frontend/app/search/page.tsx create mode 100644 frontend/app/settings/page.tsx create mode 100644 frontend/app/setup/page.tsx create mode 100644 frontend/app/sync/page.tsx create mode 100644 frontend/assets/SpotIcon.png create mode 100644 frontend/assets/icon-background.png create mode 100644 frontend/assets/icon-foreground.png create mode 100644 frontend/assets/icon-only.png create mode 100644 frontend/assets/icon.png create mode 100644 frontend/assets/splash-dark.png create mode 100644 frontend/assets/splash.png create mode 100644 frontend/components/DownloadNotifications.tsx create mode 100644 frontend/components/MetadataEditor.tsx create mode 100644 frontend/components/MixCard.tsx create mode 100644 frontend/components/MoodMixer.tsx create mode 100644 frontend/components/PWAInstallPrompt.tsx create mode 100644 frontend/components/PodcastPlayer.tsx create mode 100644 frontend/components/RemoveProgressButton.tsx create mode 100644 frontend/components/ServiceWorkerRegistration.tsx create mode 100644 frontend/components/activity/ActiveDownloadsTab.tsx create mode 100644 frontend/components/activity/HistoryTab.tsx create mode 100644 frontend/components/activity/NotificationsTab.tsx create mode 100644 frontend/components/layout/ActivityPanel.tsx create mode 100644 frontend/components/layout/AuthenticatedLayout.tsx create mode 100644 frontend/components/layout/BottomNavigation.tsx create mode 100644 frontend/components/layout/MobileSidebar.tsx create mode 100644 frontend/components/layout/Sidebar.tsx create mode 100644 frontend/components/layout/TVLayout.tsx create mode 100644 frontend/components/layout/TopBar.tsx create mode 100644 frontend/components/player/FullPlayer.tsx create mode 100644 frontend/components/player/HowlerAudioElement.tsx create mode 100644 frontend/components/player/KeyboardShortcutsTooltip.tsx create mode 100644 frontend/components/player/MediaControlsHandler.tsx create mode 100644 frontend/components/player/MiniPlayer.tsx create mode 100644 frontend/components/player/OverlayPlayer.tsx create mode 100644 frontend/components/player/PlayerModeWrapper.tsx create mode 100644 frontend/components/player/UniversalPlayer.tsx create mode 100644 frontend/components/player/VibeGraph.tsx create mode 100644 frontend/components/player/VibeOverlay.tsx create mode 100644 frontend/components/player/VibeOverlayContainer.tsx create mode 100644 frontend/components/player/VibeOverlayEnhanced.tsx create mode 100644 frontend/components/providers/AudioErrorBoundary.tsx create mode 100644 frontend/components/providers/ConditionalAudioProvider.tsx create mode 100644 frontend/components/ui/AudiobookCard.tsx create mode 100644 frontend/components/ui/Badge.tsx create mode 100644 frontend/components/ui/Button.tsx create mode 100644 frontend/components/ui/CachedImage.tsx create mode 100644 frontend/components/ui/Card.tsx create mode 100644 frontend/components/ui/ConfirmDialog.tsx create mode 100644 frontend/components/ui/EmptyState.tsx create mode 100644 frontend/components/ui/FormElements.tsx create mode 100644 frontend/components/ui/GalaxyBackground.tsx create mode 100644 frontend/components/ui/GradientSpinner.tsx create mode 100644 frontend/components/ui/HorizontalCarousel.tsx create mode 100644 frontend/components/ui/InlineStatus.tsx create mode 100644 frontend/components/ui/Input.tsx create mode 100644 frontend/components/ui/LoadingScreen.tsx create mode 100644 frontend/components/ui/MediaCard.tsx create mode 100644 frontend/components/ui/Modal.tsx create mode 100644 frontend/components/ui/PageBackground.tsx create mode 100644 frontend/components/ui/PagedGridCarousel.tsx create mode 100644 frontend/components/ui/PlayableCard.tsx create mode 100644 frontend/components/ui/PlaylistSelector.tsx create mode 100644 frontend/components/ui/RestartModal.tsx create mode 100644 frontend/components/ui/Skeleton.tsx create mode 100644 frontend/docker-entrypoint.sh create mode 100644 frontend/eslint.config.mjs create mode 100644 frontend/features/album/components/AlbumActionBar.tsx create mode 100644 frontend/features/album/components/AlbumHero.tsx create mode 100644 frontend/features/album/components/SimilarAlbums.tsx create mode 100644 frontend/features/album/components/TrackList.tsx create mode 100644 frontend/features/album/hooks/useAlbumActions.ts create mode 100644 frontend/features/album/hooks/useAlbumData.ts create mode 100644 frontend/features/album/hooks/useTrackPreview.ts create mode 100644 frontend/features/album/types.ts create mode 100644 frontend/features/artist/components/ArtistActionBar.tsx create mode 100644 frontend/features/artist/components/ArtistBio.tsx create mode 100644 frontend/features/artist/components/ArtistHero.tsx create mode 100644 frontend/features/artist/components/AvailableAlbums.tsx create mode 100644 frontend/features/artist/components/Discography.tsx create mode 100644 frontend/features/artist/components/PopularTracks.tsx create mode 100644 frontend/features/artist/components/SimilarArtists.tsx create mode 100644 frontend/features/artist/components/index.ts create mode 100644 frontend/features/artist/hooks/index.ts create mode 100644 frontend/features/artist/hooks/useArtistActions.ts create mode 100644 frontend/features/artist/hooks/useArtistData.ts create mode 100644 frontend/features/artist/hooks/useDownloadActions.ts create mode 100644 frontend/features/artist/hooks/usePreviewPlayer.ts create mode 100644 frontend/features/artist/index.ts create mode 100644 frontend/features/artist/types.ts create mode 100644 frontend/features/audiobook/components/AboutSection.tsx create mode 100644 frontend/features/audiobook/components/AudiobookActionBar.tsx create mode 100644 frontend/features/audiobook/components/AudiobookHero.tsx create mode 100644 frontend/features/audiobook/components/ChapterList.tsx create mode 100644 frontend/features/audiobook/components/PlayControls.tsx create mode 100644 frontend/features/audiobook/components/index.ts create mode 100644 frontend/features/audiobook/hooks/index.ts create mode 100644 frontend/features/audiobook/hooks/useAudiobookActions.ts create mode 100644 frontend/features/audiobook/hooks/useAudiobookData.ts create mode 100644 frontend/features/audiobook/index.ts create mode 100644 frontend/features/audiobook/types.ts create mode 100644 frontend/features/discover/components/DiscoverActionBar.tsx create mode 100644 frontend/features/discover/components/DiscoverHero.tsx create mode 100644 frontend/features/discover/components/DiscoverSettings.tsx create mode 100644 frontend/features/discover/components/HowItWorks.tsx create mode 100644 frontend/features/discover/components/TrackList.tsx create mode 100644 frontend/features/discover/components/UnavailableAlbums.tsx create mode 100644 frontend/features/discover/hooks/useDiscoverActions.ts create mode 100644 frontend/features/discover/hooks/useDiscoverData.ts create mode 100644 frontend/features/discover/hooks/usePreviewPlayer.ts create mode 100644 frontend/features/discover/types.ts create mode 100644 frontend/features/discover/types/index.ts create mode 100644 frontend/features/home/components/ArtistsGrid.tsx create mode 100644 frontend/features/home/components/AudiobooksGrid.tsx create mode 100644 frontend/features/home/components/ContinueListening.tsx create mode 100644 frontend/features/home/components/FeaturedPlaylistsGrid.tsx create mode 100644 frontend/features/home/components/HomeHero.tsx create mode 100644 frontend/features/home/components/LibraryRadioStations.tsx create mode 100644 frontend/features/home/components/MixesGrid.tsx create mode 100644 frontend/features/home/components/PodcastsGrid.tsx create mode 100644 frontend/features/home/components/PopularArtistsGrid.tsx create mode 100644 frontend/features/home/components/SectionHeader.tsx create mode 100644 frontend/features/home/hooks/useHomeData.ts create mode 100644 frontend/features/home/types.ts create mode 100644 frontend/features/library/components/AlbumsGrid.tsx create mode 100644 frontend/features/library/components/ArtistsGrid.tsx create mode 100644 frontend/features/library/components/LibraryHeader.tsx create mode 100644 frontend/features/library/components/LibraryTabs.tsx create mode 100644 frontend/features/library/components/TracksList.tsx create mode 100644 frontend/features/library/hooks/useLibraryActions.ts create mode 100644 frontend/features/library/hooks/useLibraryData.ts create mode 100644 frontend/features/library/types.ts create mode 100644 frontend/features/podcast/components/ContinueListening.tsx create mode 100644 frontend/features/podcast/components/EpisodeList.tsx create mode 100644 frontend/features/podcast/components/PodcastActionBar.tsx create mode 100644 frontend/features/podcast/components/PodcastHero.tsx create mode 100644 frontend/features/podcast/components/PreviewEpisodes.tsx create mode 100644 frontend/features/podcast/components/SimilarPodcasts.tsx create mode 100644 frontend/features/podcast/components/index.ts create mode 100644 frontend/features/podcast/hooks/index.ts create mode 100644 frontend/features/podcast/hooks/usePodcastActions.ts create mode 100644 frontend/features/podcast/hooks/usePodcastData.ts create mode 100644 frontend/features/podcast/index.ts create mode 100644 frontend/features/podcast/types.ts create mode 100644 frontend/features/podcast/utils.ts create mode 100644 frontend/features/search/components/EmptyState.tsx create mode 100644 frontend/features/search/components/LibraryAlbumsGrid.tsx create mode 100644 frontend/features/search/components/LibraryPodcastsGrid.tsx create mode 100644 frontend/features/search/components/LibraryTracksList.tsx create mode 100644 frontend/features/search/components/SearchFilters.tsx create mode 100644 frontend/features/search/components/SimilarArtistsGrid.tsx create mode 100644 frontend/features/search/components/SoulseekSongsList.tsx create mode 100644 frontend/features/search/components/TVSearchInput.tsx create mode 100644 frontend/features/search/components/TopResult.tsx create mode 100644 frontend/features/search/hooks/useSearchData.ts create mode 100644 frontend/features/search/hooks/useSoulseekSearch.ts create mode 100644 frontend/features/search/types.ts create mode 100644 frontend/features/settings/components/sections/AIServicesSection.tsx create mode 100644 frontend/features/settings/components/sections/APIKeysSection.tsx create mode 100644 frontend/features/settings/components/sections/AccountSection.tsx create mode 100644 frontend/features/settings/components/sections/AudiobookshelfSection.tsx create mode 100644 frontend/features/settings/components/sections/CacheSection.tsx create mode 100644 frontend/features/settings/components/sections/DownloadPreferencesSection.tsx create mode 100644 frontend/features/settings/components/sections/LidarrSection.tsx create mode 100644 frontend/features/settings/components/sections/LinkDeviceSection.tsx create mode 100644 frontend/features/settings/components/sections/PlaybackSection.tsx create mode 100644 frontend/features/settings/components/sections/SoulseekSection.tsx create mode 100644 frontend/features/settings/components/sections/StoragePathsSection.tsx create mode 100644 frontend/features/settings/components/sections/UserManagementSection.tsx create mode 100644 frontend/features/settings/components/ui/ConnectionCard.tsx create mode 100644 frontend/features/settings/components/ui/SettingsInput.tsx create mode 100644 frontend/features/settings/components/ui/SettingsLayout.tsx create mode 100644 frontend/features/settings/components/ui/SettingsRow.tsx create mode 100644 frontend/features/settings/components/ui/SettingsSection.tsx create mode 100644 frontend/features/settings/components/ui/SettingsSelect.tsx create mode 100644 frontend/features/settings/components/ui/SettingsSidebar.tsx create mode 100644 frontend/features/settings/components/ui/SettingsToggle.tsx create mode 100644 frontend/features/settings/components/ui/index.ts create mode 100644 frontend/features/settings/hooks/useAPIKeys.ts create mode 100644 frontend/features/settings/hooks/useSettingsData.ts create mode 100644 frontend/features/settings/hooks/useSystemSettings.ts create mode 100644 frontend/features/settings/hooks/useTwoFactor.ts create mode 100644 frontend/features/settings/types.ts create mode 100644 frontend/healthcheck.js create mode 100644 frontend/hooks/useActivityPanel.ts create mode 100644 frontend/hooks/useCachedImage.ts create mode 100644 frontend/hooks/useDownloadStatus.ts create mode 100644 frontend/hooks/useImageColor.ts create mode 100644 frontend/hooks/useJobStatus.ts create mode 100644 frontend/hooks/useKeyboardShortcuts.ts create mode 100644 frontend/hooks/useMediaQuery.ts create mode 100644 frontend/hooks/useMediaSession.ts create mode 100644 frontend/hooks/useNotifications.ts create mode 100644 frontend/hooks/usePlayerMode.ts create mode 100644 frontend/hooks/useQueries.ts create mode 100644 frontend/hooks/useTVNavigation.ts create mode 100644 frontend/lib/api.ts create mode 100644 frontend/lib/audio-context.tsx create mode 100644 frontend/lib/audio-controls-context.tsx create mode 100644 frontend/lib/audio-hooks.tsx create mode 100644 frontend/lib/audio-playback-context.tsx create mode 100644 frontend/lib/audio-seek-emitter.ts create mode 100644 frontend/lib/audio-state-context.tsx create mode 100644 frontend/lib/auth-context.tsx create mode 100644 frontend/lib/download-context.tsx create mode 100644 frontend/lib/howler-engine.ts create mode 100644 frontend/lib/query-client.tsx create mode 100644 frontend/lib/toast-context.tsx create mode 100644 frontend/lib/tv-utils.ts create mode 100644 frontend/next.config.ts create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/playwright.config.ts create mode 100644 frontend/postcss.config.mjs create mode 100644 frontend/public/assets/icons/icon-128.webp create mode 100644 frontend/public/assets/icons/icon-192.webp create mode 100644 frontend/public/assets/icons/icon-256.webp create mode 100644 frontend/public/assets/icons/icon-48.webp create mode 100644 frontend/public/assets/icons/icon-512.webp create mode 100644 frontend/public/assets/icons/icon-72.webp create mode 100644 frontend/public/assets/icons/icon-96.webp create mode 100644 frontend/public/assets/images/LIDIFY-2.webp create mode 100644 frontend/public/assets/images/LIDIFY-black.webp create mode 100644 frontend/public/assets/images/LIDIFY.webp create mode 100644 frontend/public/assets/images/Lidify__favicon.ico create mode 100644 frontend/public/assets/images/SpotIcon.png create mode 100644 frontend/public/assets/images/favicon-192.png create mode 100644 frontend/public/assets/images/lidify_circular.webp create mode 100644 frontend/public/manifest.webmanifest create mode 100644 frontend/public/sw.js create mode 100644 frontend/scripts/generate-pwa-icons.js create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tests/e2e/smoke.spec.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/utils/cn.ts create mode 100644 frontend/utils/formatTime.ts create mode 100644 frontend/utils/imageCache.ts create mode 100644 healthcheck-prod.js create mode 100644 services/audio-analyzer/Dockerfile create mode 100644 services/audio-analyzer/analyzer.py create mode 100644 services/audio-analyzer/requirements.txt diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5acd897 --- /dev/null +++ b/.env.example @@ -0,0 +1,28 @@ +# Lidify Configuration +# Copy to .env and edit as needed + +# ============================================================================== +# REQUIRED: Path to your music library +# ============================================================================== +MUSIC_PATH=/path/to/your/music + +# ============================================================================== +# OPTIONAL: Customize these if needed +# ============================================================================== + +# Port to access Lidify (default: 3030) +PORT=3030 + +# Timezone (default: UTC) +TZ=UTC + +# Session secret (auto-generated if not set) +# Generate with: openssl rand -base64 32 +SESSION_SECRET= + +# DockerHub username (for pulling images) +# Your DockerHub username (same as GitHub: chevron7locked) +DOCKERHUB_USERNAME=chevron7locked + +# Version tag (use 'latest' or specific like 'v1.0.0') +VERSION=latest diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9133a2a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: Chevron7Locked +ko_fi: Chevron7Locked +#custom: ["https://example.com/donate"] diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..fa49a82 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,113 @@ +name: Build and Publish Docker Image + +on: + push: + tags: + - "v*" + workflow_dispatch: + inputs: + version: + description: "Version tag (e.g., v1.0.0)" + required: true + type: string + +env: + IMAGE_NAME: ${{ secrets.DOCKERHUB_USERNAME }}/lidify + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Free up disk space + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf /usr/local/share/boost + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Extract version + id: version + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT + else + echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + fi + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + push: true + tags: | + ${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }} + ${{ env.IMAGE_NAME }}:latest + cache-from: type=gha + cache-to: type=gha,mode=max + # Note: ARM64 removed due to QEMU emulation issues with npm packages + # Can be re-added when using native ARM64 runners + platforms: linux/amd64 + + create-release: + needs: [build] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Extract version + id: version + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT + else + echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + fi + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.version.outputs.version }} + name: Lidify ${{ steps.version.outputs.version }} + body: | + ## Quick Start + + ```bash + docker run -d \ + --name lidify \ + -p 3030:3030 \ + -v /path/to/your/music:/music \ + -v lidify_data:/data \ + ${{ secrets.DOCKERHUB_USERNAME }}/lidify:${{ steps.version.outputs.version }} + ``` + + Then open http://localhost:3030 and create your account! + + ## Android App + + Download the APK below and install on your device. + + ## Documentation + + See the [README](https://github.com/${{ github.repository }}#readme) for full documentation. + draft: false + prerelease: false + generate_release_notes: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4dab33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,383 @@ +# ============================================================================= +# LIDIFY MONOREPO - .gitignore +# ============================================================================= + +# ============================================================================= +# Environment Variables & Secrets +# ============================================================================= +.env +.env.* +!.env.example +*.local +.env.development.local +.env.test.local +.env.production.local +.env.local + +# ============================================================================= +# Dependencies +# ============================================================================= +# Node modules in all subdirectories +**/node_modules/ +node_modules/ +jspm_packages/ + +# Python virtual environments (for soularr, scripts) +**/__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +venv/ +env/ +ENV/ +.venv/ +**/.venv/ + +# ============================================================================= +# Build Outputs +# ============================================================================= +# Frontend (Next.js) +frontend/.next/ +frontend/out/ +frontend/build/ +frontend/dist/ + +# Backend (Node.js/TypeScript) +backend/dist/ +backend/build/ +backend/out/ + +# Mobile Application +mobile-application/build/ +mobile-application/dist/ +mobile-application/.expo/ +mobile-application/.expo-shared/ + +# Soularr +soularr/dist/ +soularr/build/ + +# General build outputs +**/dist/ +**/build/ +**/out/ +.next +.nuxt + +# ============================================================================= +# Logs +# ============================================================================= +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +pnpm-debug.log* + +# ============================================================================= +# Testing & Coverage +# ============================================================================= +coverage/ +*.lcov +.nyc_output +*.tsbuildinfo +.cache/ + +# ============================================================================= +# Cache Directories +# ============================================================================= +.cache +.parcel-cache +.eslintcache +.stylelintcache +.npm +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# ============================================================================= +# Docker & Containers +# ============================================================================= +# Don't ignore docker-compose.yml itself, but ignore local overrides +docker-compose.override.yml +docker-compose.local.yml + +# Docker volumes (if any are stored locally) +**/volumes/ +**/data/ + +# ============================================================================= +# IDEs & Editors +# ============================================================================= +# VSCode +.vscode/ +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace +.vscode-test + +# Claude Code +.claude/ +.claude/* +!.claude/commands/ + +# JetBrains IDEs (WebStorm, IntelliJ, etc.) +.idea/ +*.iml +*.iws +*.ipr + +# Sublime Text +*.sublime-workspace +*.sublime-project + +# Vim +*.swp +*.swo +*~ + +# Emacs +*~ +\#*\# +.\#* + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* + +# Windows +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db +Desktop.ini +$RECYCLE.BIN/ + +# ============================================================================= +# Runtime & Process Files +# ============================================================================= +pids +*.pid +*.seed +*.pid.lock + +# ============================================================================= +# Database Files (SQLite for local development) +# ============================================================================= +*.sqlite +*.sqlite3 +*.db +*.db-shm +*.db-wal + +# Prisma +**/prisma/dev.db +**/prisma/dev.db-journal + +# ============================================================================= +# Media & Large Files +# ============================================================================= +# Don't commit large music files (if any test files are added) +*.mp3 +*.flac +*.wav +*.m4a +*.ogg +*.opus + +# ============================================================================= +# Secrets & Key Material +# ============================================================================= +keystore.b64 +keystore.jks +*.keystore +*.jks + +# ============================================================================= +# Runtime caches (backend) +# ============================================================================= +backend/cache/ +backend/logs/ +backend/mullvad/ + +# ============================================================================= +# Test artifacts +# ============================================================================= +**/playwright-report/ +**/test-results/ + +# Don't commit large images (unless they're assets) +# *.jpg +# *.jpeg +# *.png +# *.gif + +# ============================================================================= +# Temporary Files +# ============================================================================= +*.tmp +*.temp +*.swp +*.swo +*.bak +*.old + +# ============================================================================= +# Package Manager Files +# ============================================================================= +# Yarn +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +yarn-error.log + +# NPM +npm-debug.log* + +# PNPM +pnpm-lock.yaml +.pnpm-debug.log* + +# ============================================================================= +# Mobile Specific (React Native / Expo) +# ============================================================================= +mobile-application/.expo/ +mobile-application/.expo-shared/ +mobile-application/android/app/build/ +mobile-application/ios/Pods/ +mobile-application/ios/build/ +mobile-application/*.jks +mobile-application/*.keystore +mobile-application/*.p8 +mobile-application/*.p12 +mobile-application/*.mobileprovision + +# Legacy native leftovers (web app is PWA-first) +frontend/android/ + +# ============================================================================= +# Postman (Keep collections, ignore environments with secrets) +# ============================================================================= +postman/*environment*.json +postman/*.local.json + + + +# BUT allow README.md files (case-insensitive) +!README.md +!readme.md +!Readme.md + +# ============================================================================= +# TypeScript +# ============================================================================= +*.tsbuildinfo +tsconfig.tsbuildinfo + +# ============================================================================= +# Miscellaneous +# ============================================================================= +.lock-wscript +lib-cov +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json +.grunt +bower_components +.serverless/ +.fusebox/ +.dynamodb/ +.tern-port +.docusaurus +**/.vitepress/dist +**/.vitepress/cache +.vuepress/dist +.temp +*.tgz +.node_repl_history + +# ============================================================================= +# Project Specific +# ============================================================================= +# Development scripts (keep locally, don't commit) +reset-and-setup.sh +organize-singles.sh + +# Backend development logs +backend/logs/ + +# Backend test cache directories +backend/cache/test-*/ + +# Backend duplicate/nested directories +backend/backend/ + +# Frontend Android build artifacts +frontend/android/build/ +frontend/android/app/build/ + +# Postman collections (removed from repo) +postman/ + +# Soularr config (removed from repo) +soularr/ + +# Legacy React Native files (if re-added) +/App.tsx +/app.json +/src/ + +# ============================================================================= +# IDE & Editor Settings +# ============================================================================= +.claude/ +**/.claude/ +.cursor/ +**/.cursor/ +.vscode/ +**/.vscode/ + +# ============================================================================= +# Android Build Artifacts (contains local paths) +# ============================================================================= +frontend/android/app/build/ +frontend/android/build/ +frontend/android/.gradle/ +frontend/android/app/src/main/assets/capacitor.config.json + +# ============================================================================= +# Capacitor Generated Files +# ============================================================================= +frontend/android/capacitor-cordova-android-plugins/build/ + +# ============================================================================= +# Cache Files (user-specific data) +# ============================================================================= +backend/cache/ +**/cache/covers/ +**/cache/transcodes/ + +# ============================================================================= +# VPN / Private Configs (NEVER commit these!) +# ============================================================================= +backend/mullvad/ +**/mullvad/ +*.conf +**/key.txt + +# Android signing +lidify.keystore +keystore.b64 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b38c8fb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,359 @@ +# Lidify All-in-One Docker Image (Hardened) +# Contains: Backend, Frontend, PostgreSQL, Redis, Audio Analyzer (Essentia AI) +# Usage: docker run -d -p 3030:3030 -v /path/to/music:/music lidify/lidify + +FROM node:20-slim + +# Add PostgreSQL 16 repository (Debian Bookworm only has PG15 by default) +RUN apt-get update && apt-get install -y --no-install-recommends \ + gnupg lsb-release curl ca-certificates && \ + echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \ + curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg && \ + apt-get update + +# Install system dependencies including Python for audio analysis +RUN apt-get install -y --no-install-recommends \ + postgresql-16 \ + postgresql-contrib-16 \ + redis-server \ + supervisor \ + ffmpeg \ + tini \ + openssl \ + bash \ + gosu \ + # Python for audio analyzer + python3 \ + python3-pip \ + python3-numpy \ + # Build tools (needed for some Python packages) + build-essential \ + python3-dev \ + && rm -rf /var/lib/apt/lists/* + +# Create directories +RUN mkdir -p /app/backend /app/frontend /app/audio-analyzer /app/models \ + /data/postgres /data/redis /run/postgresql /var/log/supervisor \ + && chown -R postgres:postgres /data/postgres /run/postgresql + +# ============================================ +# AUDIO ANALYZER SETUP (Essentia AI) +# ============================================ +WORKDIR /app/audio-analyzer + +# Install Python dependencies for audio analysis +RUN pip3 install --no-cache-dir --break-system-packages \ + essentia-tensorflow \ + redis \ + psycopg2-binary + +# Download Essentia ML models (~200MB total) - these enable Enhanced vibe matching +RUN echo "Downloading Essentia ML models for Enhanced vibe matching..." && \ + # Base embedding model (required for all predictions) + curl -L --progress-bar -o /app/models/discogs-effnet-bs64-1.pb \ + "https://essentia.upf.edu/models/feature-extractors/discogs-effnet/discogs-effnet-bs64-1.pb" && \ + # Mood models + curl -L --progress-bar -o /app/models/mood_happy-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/mood_happy/mood_happy-discogs-effnet-1.pb" && \ + curl -L --progress-bar -o /app/models/mood_sad-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/mood_sad/mood_sad-discogs-effnet-1.pb" && \ + curl -L --progress-bar -o /app/models/mood_relaxed-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/mood_relaxed/mood_relaxed-discogs-effnet-1.pb" && \ + curl -L --progress-bar -o /app/models/mood_aggressive-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/mood_aggressive/mood_aggressive-discogs-effnet-1.pb" && \ + # Arousal and Valence (key for vibe matching) + curl -L --progress-bar -o /app/models/mood_arousal-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/mood_arousal/mood_arousal-discogs-effnet-1.pb" && \ + curl -L --progress-bar -o /app/models/mood_valence-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/mood_valence/mood_valence-discogs-effnet-1.pb" && \ + # Danceability and Voice/Instrumental + curl -L --progress-bar -o /app/models/danceability-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/danceability/danceability-discogs-effnet-1.pb" && \ + curl -L --progress-bar -o /app/models/voice_instrumental-discogs-effnet-1.pb \ + "https://essentia.upf.edu/models/classification-heads/voice_instrumental/voice_instrumental-discogs-effnet-1.pb" && \ + echo "ML models downloaded successfully" && \ + ls -lh /app/models/ + +# Copy audio analyzer script +COPY services/audio-analyzer/analyzer.py /app/audio-analyzer/ + +# ============================================ +# BACKEND BUILD +# ============================================ +WORKDIR /app/backend + +# Copy backend package files and install dependencies +COPY backend/package*.json ./ +COPY backend/prisma ./prisma/ +RUN echo "=== Migrations copied ===" && ls -la prisma/migrations/ && echo "=== End migrations ===" +RUN npm ci && npm cache clean --force +RUN npx prisma generate + +# Copy backend source +COPY backend/src ./src +COPY backend/docker-entrypoint.sh ./ +COPY backend/healthcheck.js ./healthcheck-backend.js + +# Create log directory (cache will be in /data volume) +RUN mkdir -p /app/backend/logs + +# ============================================ +# FRONTEND BUILD +# ============================================ +WORKDIR /app/frontend + +# Copy frontend package files and install dependencies +COPY frontend/package*.json ./ +RUN npm ci && npm cache clean --force + +# Copy frontend source and build +COPY frontend/ ./ + +# Build Next.js (production) +ENV NEXT_PUBLIC_API_URL= +RUN npm run build + +# ============================================ +# SECURITY HARDENING +# ============================================ +# Remove dangerous tools and build dependencies AFTER all builds are complete +# Keep: bash (supervisor), gosu (postgres user switching), python3 (audio analyzer) +RUN apt-get purge -y --auto-remove build-essential python3-dev 2>/dev/null || true && \ + rm -f /usr/bin/wget /bin/wget 2>/dev/null || true && \ + rm -f /usr/bin/curl /bin/curl 2>/dev/null || true && \ + rm -f /usr/bin/nc /bin/nc /usr/bin/ncat /usr/bin/netcat 2>/dev/null || true && \ + rm -f /usr/bin/ftp /usr/bin/tftp /usr/bin/telnet 2>/dev/null || true && \ + rm -rf /var/lib/apt/lists/* + +# ============================================ +# CONFIGURATION +# ============================================ +WORKDIR /app + +# Copy healthcheck script +COPY healthcheck-prod.js /app/healthcheck.js + +# Create supervisord config - logs to stdout/stderr for Docker visibility +RUN cat > /etc/supervisor/conf.d/lidify.conf << 'EOF' +[supervisord] +nodaemon=true +logfile=/dev/null +logfile_maxbytes=0 +pidfile=/var/run/supervisord.pid +user=root + +[program:postgres] +command=/usr/lib/postgresql/16/bin/postgres -D /data/postgres +user=postgres +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=10 + +[program:redis] +command=/usr/bin/redis-server --dir /data/redis --appendonly yes +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=20 + +[program:backend] +command=/bin/bash -c "sleep 5 && cd /app/backend && npx tsx src/index.ts" +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +directory=/app/backend +priority=30 + +[program:frontend] +command=/bin/bash -c "sleep 10 && cd /app/frontend && npm start" +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=NODE_ENV="production",BACKEND_URL="http://localhost:3006",PORT="3030" +priority=40 + +[program:audio-analyzer] +command=/bin/bash -c "sleep 15 && cd /app/audio-analyzer && python3 analyzer.py" +autostart=true +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +environment=DATABASE_URL="postgresql://lidify:lidify@localhost:5432/lidify",REDIS_URL="redis://localhost:6379",MUSIC_PATH="/music",BATCH_SIZE="10",SLEEP_INTERVAL="5" +priority=50 +EOF + +# Fix Windows line endings in supervisor config +RUN sed -i 's/\r$//' /etc/supervisor/conf.d/lidify.conf + +# Create startup script with root check +RUN cat > /app/start.sh << 'EOF' +#!/bin/bash +set -e + +# Security check: Warn if running internal services as root +# Note: This container runs multiple services, some require root for initial setup +# but individual services (postgres, backend processes) run as non-root users + +echo "" +echo "============================================================" +echo " Lidify - Premium Self-Hosted Music Server" +echo "" +echo " Features:" +echo " - AI-Powered Vibe Matching (Essentia ML)" +echo " - Smart Playlists & Mood Detection" +echo " - High-Quality Audio Streaming" +echo "" +echo " Security:" +echo " - Hardened container (no wget/curl/nc)" +echo " - Auto-generated encryption keys" +echo "============================================================" +echo "" + +# Find PostgreSQL binaries (version may vary) +PG_BIN=$(find /usr/lib/postgresql -name "bin" -type d | head -1) +if [ -z "$PG_BIN" ]; then + echo "ERROR: PostgreSQL binaries not found!" + exit 1 +fi +echo "Using PostgreSQL from: $PG_BIN" + +# Fix permissions on data directories (may have different UID from previous container) +echo "Fixing data directory permissions..." +chown -R postgres:postgres /data/postgres /run/postgresql 2>/dev/null || true +chmod 700 /data/postgres 2>/dev/null || true + +# Clean up stale PID file if exists +rm -f /data/postgres/postmaster.pid 2>/dev/null || true + +# Initialize PostgreSQL if not already done +if [ ! -f /data/postgres/PG_VERSION ]; then + echo "Initializing PostgreSQL database..." + gosu postgres $PG_BIN/initdb -D /data/postgres + + # Configure PostgreSQL + echo "host all all 0.0.0.0/0 md5" >> /data/postgres/pg_hba.conf + echo "listen_addresses='*'" >> /data/postgres/postgresql.conf +fi + +# Start PostgreSQL temporarily to create database and user +gosu postgres $PG_BIN/pg_ctl -D /data/postgres -w start + +# Create user and database if they don't exist +gosu postgres psql -tc "SELECT 1 FROM pg_roles WHERE rolname = 'lidify'" | grep -q 1 || \ + gosu postgres psql -c "CREATE USER lidify WITH PASSWORD 'lidify';" +gosu postgres psql -tc "SELECT 1 FROM pg_database WHERE datname = 'lidify'" | grep -q 1 || \ + gosu postgres psql -c "CREATE DATABASE lidify OWNER lidify;" + +# Run Prisma migrations +cd /app/backend +export DATABASE_URL="postgresql://lidify:lidify@localhost:5432/lidify" +echo "Running Prisma migrations..." +ls -la prisma/migrations/ || echo "No migrations directory!" + +# Check if _prisma_migrations table exists (indicates previous Prisma setup) +MIGRATIONS_EXIST=$(gosu postgres psql -d lidify -tAc "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = '_prisma_migrations')" 2>/dev/null || echo "f") + +# Check if User table exists (indicates existing data) +USER_TABLE_EXIST=$(gosu postgres psql -d lidify -tAc "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'User')" 2>/dev/null || echo "f") + +if [ "$MIGRATIONS_EXIST" = "t" ]; then + # Normal migration flow - migrations table exists + echo "Migration history found, running migrate deploy..." + npx prisma migrate deploy 2>&1 || { + echo "WARNING: Migration failed, but database preserved." + echo "You may need to manually resolve migration issues." + } +elif [ "$USER_TABLE_EXIST" = "t" ]; then + # Database has data but no migrations table - needs baseline + echo "Existing database detected without migration history." + echo "Creating baseline from current schema..." + # Mark the init migration as already applied (baseline) + npx prisma migrate resolve --applied 20251130000000_init 2>&1 || true + # Now run any subsequent migrations + npx prisma migrate deploy 2>&1 || { + echo "WARNING: Migration after baseline failed." + echo "Database preserved - check migration status manually." + } +else + # Fresh database - run migrations normally + echo "Fresh database detected, running initial migrations..." + npx prisma migrate deploy 2>&1 || { + echo "WARNING: Initial migration failed." + echo "Check database connection and schema." + } +fi + +# Stop PostgreSQL (supervisord will start it) +gosu postgres $PG_BIN/pg_ctl -D /data/postgres -w stop + +# Create persistent cache directories in /data volume +mkdir -p /data/cache/covers /data/cache/transcodes /data/secrets + +# Load or generate persistent secrets +if [ -f /data/secrets/session_secret ]; then + SESSION_SECRET=$(cat /data/secrets/session_secret) + echo "Loaded existing SESSION_SECRET" +else + SESSION_SECRET=$(openssl rand -hex 32) + echo "$SESSION_SECRET" > /data/secrets/session_secret + chmod 600 /data/secrets/session_secret + echo "Generated and saved new SESSION_SECRET" +fi + +if [ -f /data/secrets/encryption_key ]; then + SETTINGS_ENCRYPTION_KEY=$(cat /data/secrets/encryption_key) + echo "Loaded existing SETTINGS_ENCRYPTION_KEY" +else + SETTINGS_ENCRYPTION_KEY=$(openssl rand -hex 32) + echo "$SETTINGS_ENCRYPTION_KEY" > /data/secrets/encryption_key + chmod 600 /data/secrets/encryption_key + echo "Generated and saved new SETTINGS_ENCRYPTION_KEY" +fi + +# Write environment file for backend +cat > /app/backend/.env << ENVEOF +NODE_ENV=production +DATABASE_URL=postgresql://lidify:lidify@localhost:5432/lidify +REDIS_URL=redis://localhost:6379 +PORT=3006 +MUSIC_PATH=/music +TRANSCODE_CACHE_PATH=/data/cache/transcodes +SESSION_SECRET=$SESSION_SECRET +SETTINGS_ENCRYPTION_KEY=$SETTINGS_ENCRYPTION_KEY +ENVEOF + +echo "Starting Lidify..." +exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf +EOF + +# Fix Windows line endings (CRLF -> LF) and make executable +RUN sed -i 's/\r$//' /app/start.sh && chmod +x /app/start.sh + +# Expose ports +EXPOSE 3030 + +# Health check using Node.js (no wget) +HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ + CMD ["node", "/app/healthcheck.js"] + +# Volumes +VOLUME ["/music", "/data"] + +# Use tini for proper signal handling +ENTRYPOINT ["/usr/bin/tini", "--"] +CMD ["/app/start.sh"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e62ec04 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..71bedf6 --- /dev/null +++ b/README.md @@ -0,0 +1,683 @@ +# Lidify + +[![Docker Image](https://img.shields.io/docker/v/chevron7locked/lidify?label=Docker&sort=semver)](https://hub.docker.com/r/chevron7locked/lidify) +[![GitHub Release](https://img.shields.io/github/v/release/Chevron7Locked/lidify?label=Release)](https://github.com/Chevron7Locked/lidify/releases) +[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) + +A self-hosted, on-demand audio streaming platform that brings the Spotify experience to your personal music library. + +Lidify is built for music lovers who want the convenience of streaming services without sacrificing ownership of their library. Point it at your music collection, and Lidify handles the rest: artist discovery, personalized playlists, podcast subscriptions, and seamless integration with tools you already use like Lidarr and Audiobookshelf. + +![Lidify Home Screen](assets/screenshots/desktop-home.png) + +--- + +## A Note on Native Apps + +I got a little ambitious trying to ship both a polished web app AND a native Android app at the same time. Turns out, trying to half-ass two things is worse than whole-assing one thing. + +Lidify's web app and PWA are the priority. Once the core experience is solid and properly tested, a native mobile app (likely React Native) is on the roadmap. The PWA works great for most cases for now. + +Thanks for your patience while I work through this. + +--- + +## Table of Contents + +- [Features](#features) + - [The Vibe System](#the-vibe-system) + - [Playlist Import](#playlist-import) +- [Mobile Support](#mobile-support) +- [Quick Start](#quick-start) +- [Configuration](#configuration) +- [Integrations](#integrations) +- [Using Lidify](#using-lidify) +- [Administration](#administration) +- [Architecture](#architecture) +- [Roadmap](#roadmap) +- [License](#license) +- [Acknowledgments](#acknowledgments) + +--- + +## Features + +### Your Music, Your Way + +- **Stream your library** - FLAC, MP3, AAC, OGG, and other common formats work out of the box +- **Automatic cataloging** - Lidify scans your library and enriches it with metadata from MusicBrainz and Last.fm +- **Audio transcoding** - Stream at original quality or transcode on-the-fly (320kbps, 192kbps, or 128kbps) + +

+ Library View +

+ +### Discovery and Playlists + +- **Made For You mixes** - Programmatically generated playlists based on your library: + - Era mixes (Your 90s, Your 2000s, etc.) + - Genre mixes + - Top tracks + - Rediscover forgotten favorites + - Similar artist recommendations +- **Library Radio Stations** - One-click radio modes for instant listening: + - Shuffle All (your entire library) + - Workout (high energy tracks) + - Discovery (lesser-played gems) + - Favorites (most played) + - Dynamic genre and decade stations generated from your library +- **Discover Weekly** - Weekly playlists of new music tailored to your listening habits (requires Lidarr) +- **Artist recommendations** - Find similar artists based on what you already love +- **Deezer previews** - Preview tracks you don't own before adding them to your library +- **Vibe matching** - Find tracks that match your current mood (see [The Vibe System](#the-vibe-system)) + +### Podcasts + +- **Subscribe via RSS** - Search iTunes for podcasts and subscribe directly +- **Track progress** - Pick up where you left off across devices +- **Episode management** - Browse episodes, mark as played, and manage your subscriptions + +

+ Podcasts +

+ +### Audiobooks + +- **Audiobookshelf integration** - Connect your existing Audiobookshelf instance +- **Unified experience** - Browse and listen to audiobooks alongside your music +- **Progress sync** - Your listening position syncs with Audiobookshelf + +

+ Audiobooks +

+ +### The Vibe System + +Lidify's standout feature for music discovery. While playing any track, activate vibe mode to find similar music in your library. + +- **Vibe Button** - Tap while playing any track to activate vibe mode +- **Audio Analysis** - Real-time radar chart showing Energy, Mood, Groove, and Tempo +- **Keep The Vibe Going** - Automatically queues tracks that match your current vibe +- **Match Scoring** - See how well each track matches with percentage scores +- **ML Mood Detection** - Tracks are classified across 7 moods: Happy, Sad, Relaxed, Aggressive, Party, Acoustic, Electronic +- **Mood Mixer** - Create custom playlists by adjusting mood sliders or using presets like Workout, Chill, or Focus + +

+ Vibe Overlay +

+

+ Mood Mixer +

+ +### Playlist Import + +Import playlists from Spotify and Deezer, or browse and discover new music directly. + +- **Spotify Import** - Paste any Spotify playlist URL to import tracks +- **Deezer Import** - Same functionality for Deezer playlists +- **Smart Preview** - See which tracks are already in your library, which albums can be downloaded, and which have no matches +- **Selective Download** - Choose exactly which albums to add to your library +- **Browse Deezer** - Explore Deezer's featured playlists and radio stations directly in-app + +

+ Browse Deezer +

+

+ Import Preview +

+ +### Multi-User Support + +- **Separate accounts** - Each user gets their own playlists, listening history, and preferences +- **Admin controls** - Manage users and system settings from the web interface +- **Two-factor authentication** - Secure accounts with TOTP-based 2FA + +### Custom Playlists + +- **Create and curate** - Build your own playlists from your library +- **Share with others** - Make playlists public for other users on your instance +- **Save mixes** - Convert any auto-generated mix into a permanent playlist + +### Mobile and TV + +- **Progressive Web App (PWA)** - Install Lidify on your phone or tablet for a native-like experience +- **Android TV** - Fully optimized 10-foot interface with D-pad/remote navigation +- **Responsive Web** - Works on any device with a modern browser + +

+ Mobile Home + Mobile Player + Mobile Library +

+ +--- + +## Mobile Support + +### Progressive Web App (PWA) + +Lidify works as a PWA on mobile devices, giving you a native app-like experience without needing to download from an app store. + +**To install on Android:** + +1. Open your Lidify server in Chrome +2. Tap the menu (⋮) +3. Select "Add to Home Screen" or "Install app" + +**To install on iOS:** + +1. Open your Lidify server in Safari +2. Tap the Share button +3. Select "Add to Home Screen" + +**PWA Features:** + +- Full streaming functionality +- Background audio playback +- Lock screen / notification media controls (via Media Session API) +- Offline caching for faster loads +- Installable icon on home screen + +### Android TV + +Lidify includes a dedicated interface optimized for television displays: + +- Large artwork and readable text from across the room +- Full D-pad and remote navigation support +- Persistent Now Playing bar for quick access to playback controls +- Simplified navigation focused on browsing and playback + +The TV interface is automatically enabled when accessing Lidify from an Android TV device's browser. + +--- + +## Quick Start + +### One Command Install + +```bash +docker run -d \ + --name lidify \ + -p 3030:3030 \ + -v /path/to/your/music:/music \ + -v lidify_data:/data \ + chevron7locked/lidify:latest +``` + +That's it! Open http://localhost:3030 and create your account. + +### What's Included + +The Lidify container includes everything you need: + +- **Web Interface** (port 3030) +- **API Server** (internal) +- **PostgreSQL Database** (internal) +- **Redis Cache** (internal) + +### Configuration Options + +```bash +docker run -d \ + --name lidify \ + -p 3030:3030 \ + -v /path/to/your/music:/music \ + -v lidify_data:/data \ + -e SESSION_SECRET=your-secret-key \ + -e TZ=America/New_York \ + --add-host=host.docker.internal:host-gateway \ + chevron7locked/lidify:latest +``` + +| Variable | Description | Default | +| ---------------- | ---------------------- | -------------- | +| `SESSION_SECRET` | Session encryption key | Auto-generated | +| `TZ` | Timezone | UTC | + +### Using Docker Compose + +Create a `docker-compose.yml` file: + +```yaml +services: + lidify: + image: chevron7locked/lidify:latest + container_name: lidify + ports: + - "3030:3030" + volumes: + - /path/to/your/music:/music + - lidify_data:/data + environment: + - TZ=America/New_York + # Required for Lidarr webhook integration on Linux + extra_hosts: + - "host.docker.internal:host-gateway" + restart: unless-stopped + +volumes: + lidify_data: +``` + +Then run: + +```bash +docker compose up -d +``` + +**Updating with Docker Compose:** + +```bash +docker compose pull +docker compose up -d +``` + +--- + +Lidify will begin scanning your music library automatically. Depending on the size of your collection, this may take a few minutes to several hours. + +--- + +## Configuration + +### Environment Variables + +The unified Lidify container handles most configuration automatically. Here are the available options: + +| Variable | Default | Description | +| --------------------- | ---------------------------------- | --------------------------------------------------------------------------- | +| `SESSION_SECRET` | Auto-generated | Session encryption key (recommended to set for persistence across restarts) | +| `TZ` | `UTC` | Timezone for the container | +| `LIDIFY_CALLBACK_URL` | `http://host.docker.internal:3030` | URL for Lidarr webhook callbacks (see [Lidarr integration](#lidarr)) | + +The music library path is configured via Docker volume mount (`-v /path/to/music:/music`). + +#### External Access + +If you're accessing Lidify from outside your local network (via reverse proxy, for example), set the API URL: + +```env +NEXT_PUBLIC_API_URL=https://lidify-api.yourdomain.com +``` + +And add your domain to the allowed origins: + +```env +ALLOWED_ORIGINS=http://localhost:3030,https://lidify.yourdomain.com +``` + +--- + +## Security Considerations + +### Environment Variables + +Lidify uses several sensitive environment variables. Never commit your `.env` file. + +| Variable | Purpose | Required | +| ------------------------ | ------------------------------ | --------------- | +| `SESSION_SECRET` | Session encryption (32+ chars) | Yes | +| `SETTINGS_ENCRYPTION_KEY`| Encrypts stored credentials | Recommended | +| `SOULSEEK_USERNAME` | Soulseek login | If using Soulseek | +| `SOULSEEK_PASSWORD` | Soulseek password | If using Soulseek | +| `LIDARR_API_KEY` | Lidarr integration | If using Lidarr | +| `OPENAI_API_KEY` | AI features | Optional | +| `LASTFM_API_KEY` | Artist recommendations | Optional | +| `FANART_API_KEY` | Artist images | Optional | + +### VPN Configuration (Optional) + +If using Mullvad VPN for Soulseek: +- Place WireGuard config in `backend/mullvad/` (gitignored) +- Never commit VPN credentials or private keys +- The `*.conf` and `key.txt` patterns are already in .gitignore + +### Generating Secrets + +```bash +# Generate a secure session secret +openssl rand -base64 32 + +# Generate encryption key +openssl rand -hex 32 +``` + +### Network Security + +- Lidify is designed for self-hosted LAN use +- For external access, use a reverse proxy with HTTPS +- Configure `ALLOWED_ORIGINS` for your domain + +--- + +## Integrations + +Lidify works beautifully on its own, but it becomes even more powerful when connected to other services. + +### Lidarr + +Connect Lidify to your Lidarr instance to request and download new music directly from the app. + +**What you get:** + +- Browse artists and albums you don't own +- Request downloads with a single click +- Discover Weekly playlists that automatically download new recommendations +- Automatic library sync when Lidarr finishes importing + +**Setup:** + +1. Go to Settings in Lidify +2. Navigate to the Lidarr section +3. Enter your Lidarr URL (e.g., `http://localhost:8686`) +4. Enter your Lidarr API key (found in Lidarr under Settings > General) +5. Test the connection and save + +Lidify will automatically configure a webhook in Lidarr to receive notifications when new music is imported. + +**Networking Note:** + +The webhook requires Lidarr to be able to reach Lidify. By default, Lidify uses `host.docker.internal:3030` which works automatically when using the provided docker-compose files (they include `extra_hosts` to enable this on Linux). + +If you're using **custom Docker networks** with static IPs, set the callback URL so Lidarr knows how to reach Lidify: + +```yaml +environment: + - LIDIFY_CALLBACK_URL=http://YOUR_LIDIFY_IP:3030 +``` + +Use the IP address that Lidarr can reach. If both containers are on the same Docker network, use Lidify's container IP. + +### Audiobookshelf + +Connect to your Audiobookshelf instance to browse and listen to audiobooks within Lidify. + +**What you get:** + +- Browse your audiobook library +- Stream audiobooks directly in Lidify +- Progress syncs between Lidify and Audiobookshelf + +**Setup:** + +1. Go to Settings in Lidify +2. Navigate to the Audiobookshelf section +3. Enter your Audiobookshelf URL (e.g., `http://localhost:13378`) +4. Enter your API key (found in Audiobookshelf under Settings > Users > your user > API Token) +5. Test the connection and save + +### Soulseek + +For finding rare tracks and one-offs that aren't available through traditional sources, Lidify has built-in Soulseek support. + +**Setup:** + +1. Go to Settings in Lidify +2. Navigate to the Soulseek section +3. Enter your Soulseek username and password +4. Save your settings + +Lidify connects directly to the Soulseek network - no additional software required. + +--- + +## Using Lidify + +### First-Time Setup + +When you first access Lidify, you'll be guided through a setup wizard: + +1. **Create your account** - The first user becomes the administrator +2. **Configure integrations** - Optionally connect Lidarr, Audiobookshelf, and other services +3. **Wait for library scan** - Lidify will scan and catalog your music collection + +### The Home Screen + +After setup, your home screen displays: + +- **Continue Listening** - Pick up where you left off +- **Recently Added** - New additions to your library +- **Library Radio Stations** - One-click radio modes (Shuffle All, Workout, Discovery, Favorites, plus genre and decade stations) +- **Made For You** - Auto-generated mixes based on your library +- **Recommended For You** - Artist recommendations from Last.fm +- **Popular Podcasts** - Trending podcasts you might enjoy +- **Audiobooks** - Quick access to your audiobook library (if Audiobookshelf is connected) + +### Searching + +Lidify offers two search modes: + +**Library Search** - Find artists, albums, and tracks in your collection. Results are instant and searchable by name. + +**Discovery Search** - Find new music and podcasts you don't own. Powered by Last.fm for music and iTunes for podcasts. From discovery results, you can: + +- Preview tracks via Deezer +- Request downloads through Lidarr +- Subscribe to podcasts + +

+ Artist Page +

+

+ Album Page +

+ +### Managing Podcasts + +1. Use the search bar and select "Podcasts" to find shows +2. Click on a podcast to see its details and recent episodes +3. Click Subscribe to add it to your library +4. Episodes stream directly from the RSS feed - no downloads required + +Your listening progress is saved automatically, so you can pause on one device and resume on another. + +### Creating Playlists + +1. Navigate to your Library and select the Playlists tab +2. Click "New Playlist" and give it a name +3. Add tracks by clicking the menu on any song and selecting "Add to Playlist" +4. Reorder tracks by dragging and dropping +5. Toggle "Public" to share with other users on your instance + +### Using the Vibe System + +1. Start playing any track from your library +2. Click the **vibe button** (waveform icon) in the player controls +3. Lidify analyzes the track and finds matching songs based on energy, mood, and tempo +4. Matching tracks are automatically queued - just keep listening +5. The vibe overlay shows a radar chart comparing your current track to the source + +**Using the Mood Mixer:** + +1. Open the Mood Mixer from the home screen or player +2. Choose a quick mood preset (Happy, Energetic, Chill, Focus, Workout) or create a custom mix +3. Adjust sliders for happiness, energy, danceability, and tempo +4. Lidify generates a playlist of matching tracks from your library + +### Importing Playlists + +**From Spotify:** + +1. Copy a Spotify playlist URL +2. Go to Import (in the sidebar) +3. Paste the URL and click Preview +4. Review the results - you'll see which tracks are in your library, which can be downloaded, and which aren't available +5. Select albums to download and start the import + +**From Deezer:** + +1. Browse featured playlists directly in the Browse section, or paste a Deezer playlist URL +2. The same preview and import flow applies +3. Explore Deezer's curated playlists and radio stations for discovery + +### Playback Settings + +In Settings, you can configure: + +- **Playback Quality** - Choose between Original, High (320kbps), Medium (192kbps), or Low (128kbps) +- **Cache Size** - Limit how much space transcoded files use + +

+ Now Playing +

+

+ Settings +

+ +### Keyboard Shortcuts + +When using the web interface, these keyboard shortcuts are available during playback: + +| Key | Action | +| ----------- | ------------------------ | +| Space | Play / Pause | +| N | Next track | +| P | Previous track | +| S | Toggle shuffle | +| M | Toggle mute | +| Arrow Up | Volume up | +| Arrow Down | Volume down | +| Arrow Right | Seek forward 10 seconds | +| Arrow Left | Seek backward 10 seconds | + +### Android TV + +Lidify includes a dedicated interface optimized for television displays: + +- Large artwork and readable text from across the room +- Full D-pad and remote navigation support +- Persistent Now Playing bar for quick access to playback controls +- Simplified navigation focused on browsing and playback + +The TV interface is automatically enabled when accessing Lidify from an Android TV device. Access it through your TV's web browser. + +--- + +## Administration + +### Managing Users + +As an administrator, you can: + +1. Go to Settings > User Management +2. Create new user accounts +3. Delete existing users (except yourself) +4. Users can be assigned "admin" or "user" roles + +### System Settings + +Administrators have access to additional settings: + +- **Lidarr/Audiobookshelf/Soulseek** - Configure integrations +- **Storage Paths** - View configured paths +- **Cache Management** - Clear caches if needed +- **Advanced** - Download retry settings, concurrent download limits + +### Activity Panel + +The Activity Panel provides real-time visibility into downloads and system events: + +- **Notifications** - Alerts for completed downloads, ready playlists, and import completions +- **Active Downloads** - Monitor download progress in real-time +- **History** - View completed downloads and past events + +Access the Activity Panel by clicking the bell icon in the top bar (desktop) or through the menu (mobile). + +### API Keys + +For programmatic access to Lidify: + +1. Go to Settings > API Keys +2. Generate a new key with a descriptive name +3. Use the key in the `Authorization` header: `Bearer YOUR_API_KEY` + +API documentation is available at `/api-docs` when the backend is running. + +--- + +## Architecture + +Lidify consists of several components working together: + +``` + ┌─────────────────┐ + │ Your Browser │ + └────────┬────────┘ + │ + ▼ +┌─────────────────┐ ┌─────────────────────┐ +│ Music Library │◄────────────►│ Frontend │ +│ (Your Files) │ │ (Next.js :3030) │ +└─────────────────┘ └──────────┬──────────┘ + │ + ▼ +┌─────────────────┐ ┌─────────────────────┐ +│ Lidarr │◄────────────►│ Backend │ +│ (Optional) │ │ (Express.js :3006) │ +└─────────────────┘ └──────────┬──────────┘ + │ +┌─────────────────┐ ┌──────────┴──────────┐ +│ Audiobookshelf │◄────────────►│ │ +│ (Optional) │ │ ┌───────────────┐ │ +└─────────────────┘ │ │ PostgreSQL │ │ + │ └───────────────┘ │ + │ ┌───────────────┐ │ + │ │ Redis │ │ + │ └───────────────┘ │ + └─────────────────────┘ +``` + +| Component | Purpose | Default Port | +| ---------- | ----------------------- | ------------ | +| Frontend | Web interface (Next.js) | 3030 | +| Backend | API server (Express.js) | 3006 | +| PostgreSQL | Database | 5432 | +| Redis | Caching and job queues | 6379 | + +--- + +## Roadmap + +Lidify is under active development. Here's what's planned: + +- **Native Mobile App** - React Native application for iOS and Android +- **Offline Mode** - Download tracks for offline playback +- **Windows Executable** - Standalone app for Windows users who prefer not to use Docker + +Contributions and suggestions are welcome. + +--- + +## License + +Lidify is released under the [GNU General Public License v3.0](LICENSE). + +You are free to use, modify, and distribute this software under the terms of the GPL-3.0 license. + +--- + +## Acknowledgments + +Lidify wouldn't be possible without these services and projects: + +- [Last.fm](https://www.last.fm/) - Artist recommendations and music metadata +- [MusicBrainz](https://musicbrainz.org/) - Comprehensive music database +- [iTunes Search API](https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/) - Podcast discovery +- [Deezer](https://developers.deezer.com/) - Track previews +- [Fanart.tv](https://fanart.tv/) - Artist images and artwork +- [Lidarr](https://lidarr.audio/) - Music collection management +- [Audiobookshelf](https://www.audiobookshelf.org/) - Audiobook and podcast server + +--- + +## Support + +If you encounter issues or have questions: + +1. Check the [Issues](https://github.com/chevron7locked/lidify/issues) page for known problems +2. Open a new issue with details about your setup and the problem you're experiencing +3. Include logs from `docker compose logs` if relevant + +--- + +_Built with love for the self-hosted community._ diff --git a/assets/screenshots/deezer-browse.png b/assets/screenshots/deezer-browse.png new file mode 100644 index 0000000000000000000000000000000000000000..9babab4fd1e06fe38b4e5197b2d99e1ad8943936 GIT binary patch literal 198855 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

p{Yy) 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

jZCe1y=p*q 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�I2BX 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 L{an^LB{Ts5tR*xv literal 0 HcmV?d00001 diff --git a/assets/screenshots/desktop-album.png b/assets/screenshots/desktop-album.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec044e0162421c4eb43c4ec89d5070eecf823f3 GIT binary patch literal 122802 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 !F87MZ9b(oPj<=Jji( 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ΠB`1#18ojzcDb!1w(CQAlZ0 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 z%0D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 JPDHLkV1n>|Xb%7Y literal 0 HcmV?d00001 diff --git a/assets/screenshots/desktop-audiobooks.png b/assets/screenshots/desktop-audiobooks.png new file mode 100644 index 0000000000000000000000000000000000000000..5fcb83850ea8f58eb9bb4177eb69737c51a98655 GIT binary patch literal 309569 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

AskMlTXKoZX82<_ac=}FhkbiD0{RCJ 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'RAKwrXoG_eRrFs(Gfp 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 z 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%0Ae4e>RzyFA|(&X2QmoSZuVY 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 z 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.q2z9u%Sb}-TOIUI&URt5xc-AbitH}_WAJM)W8k5 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

s7pqX?snOaF|cgwiuuiZ#?#nwy&u13AwF=COZ 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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/desktop-player.png b/assets/screenshots/desktop-player.png new file mode 100644 index 0000000000000000000000000000000000000000..25be9d3bf60de1f192028290ee2f9548306b6829 GIT binary patch literal 60289 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�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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/desktop-podcasts.png b/assets/screenshots/desktop-podcasts.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9b774d088e3640510cd8df442836744dccdbe3 GIT binary patch literal 159687 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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/desktop-settings.png b/assets/screenshots/desktop-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..12e9ff4d996da59c9b72651ec782505331f1613e GIT binary patch literal 51797 zcmaI6WmuI@^e#-NbclpBA|NGsBH z`2Ej&u5-O#&WE}7GqcyMwPsD-bI-(RYbp`oQRAVYpb)4i%j=?`V1Xzo=({-Rk0pV` zV)Q5|Xm{G``U-e>c$AcsgoK2T0e zR7WDp_>`QQfq{XBhUOU+l{hax78VvUF`1K-6C*Q=TX1Z4st*UpO9%H5;ir_O)Y|w@ zB%Pd~fT3u1L7Z1%oh%+M3~T}nRHP+)=~!qc@T81E9Z$g10k9)8{CIYLws`-*PDMc} zYG_D7>aLIb@UWbfl{xVD;eO@w{mH;h5sKU^I(+qLvRBsGp)d*_Rbj>_T!tZjZ|GK+ zmnppa&az)S+UWgFl1R_3bj++L5%YbxyFBi8(KKn!ponT+@cD!9ql`I?nFF`1I6X5H1OcHb$5Rj zms@;&ttG|%s>iC`|3wKhT4s3bS}Yt~*>xPQmTULCRq1H&C;=RPCQ7SmN=g99W%8y9 z;#`gPki#t0f5i%4gD9#E9U?r<7h<*BMEP;>T}DG8Gx~yg1|s@ZEBE^?(S>o_U}vw7 zF1|tiST-y+%&q>TGt4{QG`cK=hq2Zh^Q1|SP?u|}4823lc>P-`pFn*{h;PT#+R*nw z4ex^5@et#eJk6iug5uscd$@ZQerj!OY*dq5f7rRVvia2Xt@IT&7grd*yZ94=$eLMO-JclZ(#ugg(U3% zy?}Z&3hxsmbaRGAtR87=g5Z!LY83Qj2nrSxfbv8hM4^hVLFFa>9|6T~eP>yA;g{#^ z9`KnoqK-TX4dghh>{Fu>7{^BLPGdxs?Wfb6Es;@45&@3urIa890gM$Vh1|= zL@@r!h7pK@9TOn9TmsTJ3&v5K{S=kOH!3l?G>HA6C!avysPPl$W9Ffs>HO*YcG@ku zA!@kp!h0_#9mvs;+RxA26;6RS)~lLox89A4C8S>Yamp1;#|JCol{4D3gMVi3#~F3y zda9=!0vS2xiUt%ECNFz%=mLH)v8xiVgo8{)R&evcAKLU`VbLPdnjE1_o10Y(B7VIJ zt|WMxp9#pHex0z)$z+uVNr^0W_}y+u z94^lu{4-6mu0LJu)X_S&QBhZ0pWA7^(jmO<{8g2pZ>i0*MaxMWdYUKTG-W1xRYo)5 ziKe1h>@k$*&>n!%lAz9KSN;0)Ja)Cry+4-PS7}6cXj1a-n(}=;ATgjy^UQLxS;^*5 zh2rN2+xl?g5a;t$5zh&!D2^MS8XH`rqMGENZ!NV;zEQ_0>?3b|dmtSOhU@?fUoNYS z9Go2|M&X#|`_ls8Pcq3cwMu*$3TxO$hM34jhOM&ey{+mYauMUyuo~X4jlXEC(b6FN z)=fB?E&D9b=65MsrewF47JT3T+nuV==Jfnhu1WIDBKrM-N}x98yM!lv$W2)_F{9b% z^LB5U+iYg`ZwE(|vXP0}r>#QtkAi1argbhD?-Ift%k}Nv8nysN386<{6#J>C zHHVPc&_&l|76V6IU)%4G#7I@Lk&;>ym3rJw?`hWQHu%jhlMfbUete}I_clg7Ibb7N z#r}?;`x3)qv>ff}Zocd|g@X;VI@GHBc9|Vl79(HwUeoJye9<%IAECcYD$^Y#uZWl( zH}TjUS{!(ne|GZQ5S}xk}_~oupLp!V+ zhsZpHCh*RwSsU+X-I?tW5ycDjQiky7-|wBWx)VLte3!8tB!ZiBe&yn1cfFBAUpAOSfm&E?rPh`;VaV8P; zcI77ZgMF5_?qigy{Bigr>#rwT+M2?fSBYMPe~ej0!Yz&SK5#{2`GtWlBnMlmU0at# zm)74m2tCLCc93@QO1hxw#CDeg{O0KztQh^tV=MX=y+0?uHSx)gpp-X)q2&jSS;wj=z)2qVcLFZa21)weNELnO6H=mtC@rIkI`In=A61Cx4;CJbALw zcM*$^$B-`3?)Y1#F!j?)U$aT~LjiwVnk7RDtRIMDQH1q|taB#v_kne_jq}o(bIB6n z48L&gOf4Ly098W13>71}X8bBrZsU+pslc&0$P&Nlx>qP7R=+#>At=N$UrM~{3kh-A zWd+0ChW~o*&mFc4Pj3@`0SO|Z7l({1M*iCKO=205eJ;Ir4Xb&&p+5f{>$5amgtpa6LN`8y8V#K*n!OhJcMC2 z>^^4Cf;idScY1pB``1M|Pq$r1rf2i!G$X92mON#R(31WqUrN%TC6122IDM z`DoIABb%>W1tkhh)vL{0!=;C0Igk(~AY^+M?Mq(*I6zrv2;3aoP)0!g|2(m}aYhSs zq4JljMWpj#LTAX!rY$-N_V3aR0#(puAI#g8V z(SZ(ZruYQ?5aELel-KdWgQf!fXiPzxWj*DPtX?v2AL*fmY2Tk}o>^hw_$v0r#%brL z5eI@9ehwe`?z{97$iAqAlcxZ6hlYJ_X~3UoMC8p}^y`9D5T{{mq8E<16OloJag5I#r{;XDg(2m6FIVwQ=6DmFWl_() ztG(dKPIgHfG8Fz@ZK7mfDVOX?`E8YpO^Pb9bA)rD%O@SGWFO%g+&&T98Xu^sGXNkw zU_zNMx)FD%w?My_^|d4#CCMr_+UDqZ07b^xi|OKvo$LgWXc3Frnq;s>{OBY& zsmveu1)MQ1?OVP-DHjG*ynms^AEmcU-~~MS(p4p4x=kS|jZYR%z-b>@rwC}KCJB2e zc_C2+g0KxGF zR-Ob#YfGf4;?dB$G?@#qnvoq)pjhZP;we!Z6)QyR8?(MQ3IG<5#yTSKX_ zm4YjYWmL(fE1kE!5#>u6hQa;w+k%9?KnpZi!%{h!&DnArNy+TOmESB-=`+!z>Cd{`5%YkCt7_SU8PY`<@Sh=>tejTyssUa zMl*Wj*Vtb%X;vI>+|nmVk7>Xbu?3Hd9u)a>1ZGR1GBp{R&=I9ffDKVkqQ37dd{)5Iq!Y6Tu1RHuCyNRI-yL53*JB^WcW0UX7h{B%r zk^I)CD+b>_cM=2H9B2ES{<$ji`o&sE%9FEtgrX5msPJS`$*e@6Ng+h8bzqxJ1Gj$y3z=~^<0s}h6k z_Z)?{i5NY}O_(#}6aWz5;+?i*i%^M`(%AP5fR^QW`{I7Ru@!tS)r0#WwZYJukRf!(+8PJ4l{n z0cjIkTs>8bWE_p!721n6>_4#|mtA33#Tj{BSslA4Kq`w@YQ1DGHgB0%aHL3MBx5+6 z6ZkkUpFxyp^i_b_*q~UxUDWJS3WgS|r|1a{KBL%d`{If{tn3XA;yIs)1v^)|ka6|n z+ZFauJpsb2TyfQIx?DVk^Fy?yZno(hovn4o>YI^IRdWCw@1SO5{L-}NeOqP0O^Go3 z(1{LjTa9 z7wADarV0h{B?sn;+yb1H|M0Fc+I(>Qks=64yCdzmz7w*dc|JdKHRB}(@p0p17otN! zH@=j>5#^tjO7}2D!3LiUJpywXH2~FB?hi83OZC)J5%#b6KEIQ>fS+wPr=gau`lb$j z1#p7YiLvc{e2J58xF!*U?uIH3RpyIS+VlQpuOT^E!+x!X$a?>yzBr%{w~g*Pob9Ri z=ydBaF11Y(kKYcjd-!=1#H45D+HORqT0?l%r8oM&u@CDh7d=?FCr~lpuh=2?lZN&e zgi10cYTLe7^QvC5Mcn`ksAr1ZD5WT7m`-bi@tptIkzIYo*sMGls-{9kH=~`{ zDpx#&Fw+6j%7BBYu8F381)h0RBBW)qrv!u|@ z^t`d4_IqKC!jIAA)d|4Upv&I=hA^#e)$Aonvpf=q!+{b+yN2!#hB4rTEFfX63ViKC z_xwAcW9qIiHLe}|&I67xd|{Tk9bH59l5oG5;m0YKIi#lK11FhH#MkPoU4P&Y=WYBh zsPE89p-!ElH)8eUqvZ!h{ZYBpW#=f0FMlkIRzFB;8(dl(RGI*w$)9QJjSc6@Z2d^z z@Ak(upYU2wRP2%Gc2?GV^()ne(YHJrqS_T&`dYg|ZHY&5wLJb76v zWjyJZ{y_ct?G;j6Vr|{3!%p7t!tANffj%c%m84f;67^B+uAiyc-;Nhe; z3@UJ3Ey&EL?M=+r=!*H8jlOIY{-H**@Tgb|Zr0_#8O==wAWP#7HJI0d!FJ+m=#w;%lC-Z+CvchC4ClT?epNA+DgW;EO(kFcTZte} zA*aFEcU5zJHf7xz%915TOC|uP1TfIxGC?;GmwMB3s66Xj$HLJVDczMH=QWoLuD=pdDGI)7u9W{?7S`C$O^{atiAQVoAxgig?{(Y?ya=03 zy1Rkp_P}+g?QRC(t#k!t(!G0Mq%a5J4M}8;1&PTEhmUYv8dC$vu{0C0QNOGh3FO1@ zZ=Cz8MJXmKqkc=nF%l%{0B>Va)s;>ksWkymf89qFXz>nrY+r1oavAfwe~m6r=m~}e z)oOkm9!^fsbbK8Tp9a;mW>0vq({Ey1WXKt?q+hL@JMRK$&dfhCN^ct|k31~~N;5l9l8E7A z(S8m7g1p3z7E_ij{30SM{$=j_MXi%aX^eKFtMB?Ry=n1}LTZswuU=tDUo?VT2*C(? zBYZp~^x&g+PEC`IFK>sS+K>F8=PLk{enSZieGE)6(nh2a3ndS3A6|pnbKjW3g<$!= zwKN2m;~|ZdRF4v?BT%pEAB&qXMcGG5-rP?AZE?o4$B+fPoXq1Gp`$dGlRS!9YcM~u zkc*BFaW!YJAM-Vkgd_+`d6RdYwFb5|0m@r|nh`)59azk2wKMs zp!7gz9#xqOje~-6|M~Wx${xq&ho~mxn$rI*c=R^11{DSP-?n7^o4rc;^2x8ZD#q~- zB5F{jiE5CDQ$XIQyp)!bY%p>h=OE^>bQ!s0((l?V#EOj-QPIs;zzQ5b_V8{9a_1d9 zq6Yb>zYu#I3;^J!M;=XvqXuf}M9V}r?sF}cUT`SKs~5AW1i#KB{1)9zao#z~naF@B z40*s9jlg9Xssa%NsICBHHJ zK{-SnPkN3N(kG8?AJPYTaJRn-47yb<8;#&>H^N%dmL)LKAnh67rHmRRq6+E^p8G6w zUL#D6o@Nxk4wE{_SFzD{hj_g5DI4 zYE#$Ydqob~`qVm5Ab?>mu2`G=n`)q;0v?imSEiTAhgjlj-Nid~HS3y5we2eC$I-#~ z!RT7hy{*kml`oolr>V-kk|Lg)9avZb4dbg8kE=FZCvUcvtt;K~y`6{R8>s2h9emM$ z>qDNwQ25h#KmF3GSqsF%N$>1>Ma8D4A_dpMf~63_?Y9@V8#`>ZTFa3V$Y~?CUmNR@ zsOnXS<{guwtb92gruNZJQJ}jW4cA#p^-2`eQmLr}?V(`-YG2A9-Y(0ixOz_M@|yG4 zDB0q~d3#eM51#m@F;;=eg75*Xgy}HQ&#c5sZj8ucw%|CUV+stZ&b6x#|Yrs?Hrd#8q9>mnG5{@x4^SykIW6||veR;hGY zK$_juBp&Z}O3X>~lw(it)z_FKZgQ?)JI%$5+<#fx%AWr0WQpf?qk5R;gMZ)Svi{sw zQ*J-@JN@aTUycf}xS$@|t{#iPf^hfz8P*=<(j3mt`eNK1>7Y}v)##8g?9=zo3N8vH z_j9E%+f?D@=rfTB;1xk$N^jf6*{}WW71I+In3&`21^O@qh3~A|*FGQx@3Pz?F+!jl zH5t*n+*N=F;8GcZTZr30U`E6yzy4203n~el^4^#C$lNGfry)u=AL5 zS)Gk$B{^oiQ;+@52A`5#TP=`<%h*M(D2|a(GlmO?+PpZ+R;>md5DqYaAd>e*jaF*O zab~8l$|RP3>DH}p+uJg{t-CA380ec4%kd*cOj$lmfiJe7wQxLabWBeXZw!%4AMgv!YF( zwC7?lhm$mmq87~nynIlYQa3hj(sVxCt*c5=TO%NFHCw0N$Uo!K3&y%x42$ zr87%Q1p+?@u1nszkD){=hk*4+sYepIk^Msm%2s*wqI2Wo=PAwOJk@JUnt^@|huv{< z_!LX&*{MJ%A~Nj#3zmF0UWSof`w=8Nm%{NYxdSG43zNuXMM0UwKnH@=XWqXH_qD$w zc3jeT`XjX7(nXn=&CN!)HZ&#ghbi=!jUh=255rLp#2k`Im zYT@B++6VtwE9Z(T{t98+3@ddHH(970Jw;ga;-4r*(&l($gEuWq$th-b+zS*_lVmOs z$XQfbA*o~B1?^Uj(9^{hFypKYqORxHCC`+gstdpRm$+rx2vRL?@s8i|!8HOike?pF zN=-aO^Om^=S4+|E+n77iqvbuGhpQ`gldpHvO^CIZ(q1oOTbkBc?Fb5*zkkE*i+n3| zsWsWMl{!`L^N2Ntq}3P37>Tm1V6%Kcvp1TGHWwKA3ET@!x&``UUI`>SD& z+J|KUX{ZiQbSjTB;`xFw+xWXeD$m{}I8Rve87uBJtyhT(llO*0U9~6KnSS)Ip~CNo zNc3V;d-!YImEY}3meFDK+xMtY7_$p;edZjs z0xKyhB)j-X#h_U&tm;w`AhkjR0%jxjX zg%zC7D{>}h%p86P$eP|&d_2{zeWUO8F9rOX?u_esYnPyVxYanqQ=~T=N26>?p{8mV zG`;YN9^b=hAdzt%ILetV{V1TZk1MJfT?(C{QC!zjeAYjk;-&%=wx+*!<0P+v46G%M zAw0T`VODQ}2fBm3^>=BBwcdB*X1Uo=gW!_ZGVt5Wg5A{oo$;NI`F3>m$C={xUF^y= zR#ff%_G32nAXVgdA0MYN&Hwpw6oD^30jc|WpM5+MFoiYY)<7aHx|)DNA!0NcVvP0f z+tWZ#%9p$*5yXrLMYUX{kRli?(Sl@c#6lPWR@Ma39C0G(cw{0fE1DegM|R6 zN5JXk48W`j?3%!VA!_0a#DT=|9TZr9@qeU6T9DlTM~$7h*2vL*bMybL`|IviX-(j# z8dN86iOL9lX$8DLSRISg)u9^v<3SXW;%QE5t?$ku=ihR{@3^bLGNjlPtz$>UnUxZn z^O8Lj4-LPDvQwJe32RB8cez*r;}EKj1ZJ47@uAIoty+Hm4VewCruiNp==9q~tn$L`u^s`YcmGT>3&&Ec6L_eD6g`XL4YRNl1+;_ayx}D{FYn(>DyLVnu_?OKa3*S)ix6 z8aN$#*_e*jcpeu#j}okTg7s)L&BTbg>qY-a*S7u9$M#+iUq&wp7sndzk{Wo2GY_fR zk)P|nbFbYW>9ygd$-lp3IfH0JFm~ggOPzzp!{s#%Ka0QRRp`Gzv97PeEB3S)X<5s! zus<{^Q;#dLV$#*$e!Msk_c~`>FH;zYu19XL%5ru#5uogbFG^-TDgbLDgxo(dY5gXn zS8%Qr;uspL;AX0(bSiHzlQ;giYOHv1Z3P>xGqU0d8vWpJnmi!c8U9#1p0^y5*~kY3 ze$xRGYe)og*2A-?o|7#u;9BJTpt#>dP{mMo9mA(=(c26(M)^<*1$OL2;RM`fohIc~ z+Z`Bc;*Ey8hlicrE!4yFO*`!${tP9*iV-w1h|f*bn-Xzld1snw?0-0v9QIA*71T)0 z;HkYACaDqnZlS1vCsYk{v2{HP&=YJ{U`tn3vjf1imrcPo@au11M^&z2pG)mU@VQCu zJexFSr=QHfp%J9lyv;+pZ#sCItJ^&eoB9yunVdSca%7Ofg?qN+fKgn$7EiLd{ni@w zMh)v{tB%psC2cqZJCHrrr$6j?WG3(Jn^ZD2=J&~uOE)HT@^Mu18f1Y~@3_5=hSS5g zRP!^(M1Y>W(WPlr8C_ftQPGY}rN)|AeD`J{-i)8U+@uM5OFpl~Y07`agNezzm`3PX zVh3=N;ickl{}_`>J-poSip-G#RxN_tYlb6(N~1N~p#@|1PKRfIM&2A_vLK`YvTX6b zmWry;ZONw`C7~6_y^%u?k7Is7{-q%?(}m`@v40vnfvrThVW>9ipC%b9D69$0t9aoJ zilFsNl4a7D9Oqg5!o3vwqNvlLbK8QxkYu_R>E1cz$6%b&(N(<(>1ZS1mH>rWZy zY-z*BOXiVWe?L;fOV|XvBL0a9h1Q@V#;@$h=D)n3K(MJ%;4Soj_g{k@kG67G>+fFK zUr!*Dk;#=D>+K&pi?K3PTu+|PoFrPdKb{l+i`83ZU_Ud59z8|7XL=uSSQwoTPe(>^ z2%4!5(+Mr-jY4}QChL~Ho;^x4kFIngsq!i4>)0tW`CSj;zRt#FzrXs*q$Ce03>D>2 zr7{=(@{>*~>dK;q6!?KXGX)>o!TG)gK;Sx{m4yCS%S5 z?+K02Cl!P>fahJv6y$aGpqv5TqS|YU#&h&-?k2INp`0fN5c<5Yxz8Vle;f<1W8gfp z5l?59V5bX+mYwW#@yoj73b4X z@u%wVKs`lwRfHLR&wJ=t&gCaaqJ}>Z&|gR5M5Yc1)pG;i^%D0k&eu&Z`b3(XGN+2~ zZuWK~a{g39FV9eoEBwome(On)Tnm>mEU$M?53wdvqXrMD`Tb3MUU&A;TxU@6dBiDMRBWnwqlWwH(}WK6u8m*FT(tsA*X(DbgMn6d2eWBwu!;efT0X*76scUT$Hp>awr4$(fUA2 zOe_VcSy4Tl(b%2zT#NnY4ea|@Z0`D$ve*l*skdzz>w-`LRv+R1xYbq3&#HIjwK_qE zqx|`zEwoJ?a6zI)0KbE0|I-RrM}`4ME}RS{hV`{QK_}8x+GR{?3eb4Jrn93v)Aec# zzv6dqoL<^*SXkasF@@>$P4ne}Ws^)TxMvIT)-#qpe%)Y4z;WdKdH6*`cd1>Gc;$)X zALjgZ!!vRhE)RRBMlAY&&!n_|uDf~d@BFfxmo*N@h{5he_Tx=MT|OA9u;}du>0jiaCrnMpOKon{^9r3$ufp4=jFvObPKP3|YTfrz zUDFxj^(q{c-i*Ec@w#7Ni>^brII}#05Q;PBf$kw- zj|fS93#A0yjjj|)Eb~8x^%BTQewEKJaSe#UQri(3+0Ac!cVWP6=DE>M@67ByG#81b zCeaZvQVjt&*-(?rW%jrmav;SpJz|rsU6@cR=6sPm+rU19BkUiYe4e%`1|oZTB8JGRp4n8}w~>!WW?^u+jyKSd?~`aXG9HMeHzgz+XlU zRJMRF92q0e$g(KgZk;zUSa<0x=HAp3~P8u{Ve_y--G}7fCi1Bl>ts?m;~OdtOU6n z?vtLuu~1QDRe|#ENJNHD5-9Oi|8e>m7*b^7padhZXp_KO5w=t0@tH$Ysg;3^5X26V-64^`S5hc1 zahL`9Z>EdxhT<~bcDsbH|0J{UN7-%zcoj;J%}zyd3fMB#4#2i0C>NOrH?3iDhpaV7 zeh?blgrz441(u+=PTb#&!d|Wcz~Bsc{|VXb3Yy0X0f%2wL1+UK9?^XMv!<84paprU z3&VGUry(;oAM;LNPP3srOwA26$8$QYszF9P>U%`mbvKkt|GQeV$DPkE56O?6n@E97IX zy|;kq|D#qpoMH;p&4YYt^0wjQQLv!(u46`;s+B%57|@OfrwLUZd$k*?aU9?(16^td zBMbA<3-g7Ri43H&edv7r=kG{ypGRZ!#}mK$6!5D(Ztb%!+|;D2U^egOY(+rDEa zc*VZzM7R@jc+>E?B?CVjwWX;nuhwS0+At|5LJM>6cVaTQG5)~zSnUXlkbF} zN56s6q|IwRe=;;OvTTa{Yur(9NwL1ZmS<+l`Np|-hjVey-yX$2fq{v&Y=-&_+>|!< z2k@KUwh0bS5yy?jwywBkC>}N}xoY*A2W7|T2~_{^PaQ5peKZt}DpvsGRGNU7;XJUw zjflwKdT~GjSc#%$BKi-WTAptvL25~0p)!;ir)#OkW1k zX=)i_KX&*X-hS$ulLFHdH&tMlU%1j~%vb}k6Z=QC@R7z*xgNy2;ZDeTe7zFNjxX7Q zu}J)#%UJ`c4+23>q4QtJQY#M{7HdId9 z8n0RXi^HXLpLsHl+{$#$I#a5V!VLB8O3d@HH>hd?1fiF_l!di~p zfMI(Q;sS(_mzGSfgt=A-Yz~?}RzDW~eCs9Q5>N?Q$@(cLp)30s6(%ZG0LKpQMn*Cu z%BeE*Ei!R_o>E~jqomq~;8(*KZpqors7wjtvxG(kbLoN1onotrDO}i1?_6R0D}rWP zx=#(C%z8MU-F-zcf{5~bd-<3UkaA}`p_eR4^_$-ljEWiRE`|T>pvCXQ)76sJs2vh! z>hlF(x65U~Qx{s1Uq5GZe@s!@%C#a;%7-nN_Z{R>5+B{Z4M$Z+z|%`dy{2hNb|;QC zXe>1WtCrbkHKomBV=_QqD8*vVZZI(%HR!*-=q>ew3fyTx<;MG?0fKl)mpk0|jcx1| zybSl|+$GyGH>ZF#u`~n%RgP025uAVID5Pq3Y55hXWAFXHIM;V9ENEz}&|_RZzV*X> z`QMn#xIm>V^BWtpwQ#4FS#K%tmxdcu8cC+*P+){IOkcM`G=QC^LY7(R zxWPd-fu~&q0Xpq{xFATe)5}T2W33JR<)}9jm6RIEFnpx(pfgrkU{#bH0}j*Nbk571 zHR>bgVlX&QrjB)amhvwTGi|uO;-p3{p^C=vPd~DT5jJLkU{$1xIc)}4=B`7d6w<>E zm(j&n)7Yr1e;zQUcWHY`BuR?H#2Wp%#pYV66QVb3Kj!uxFPzs15bz2es!3|UR-1m- zwCnTNwVrDax16f*J!+eW3en2bGlt^UUzhvXfk*P2H+2hs9I8{=)t z$0mBat)?amU5qD9{urUkxTG)PcP1_xWzQul%W0oIYjBt&=gn*_VM(B3ROwvaq0Lmv z+7{zXbhaX4lhv7_rY%vgp1GTa;rCL(4d$a)fEF~a3prQD2lFXwZusxmoMLw^_WsVm z1ro-rgr)+8Vu0Te8 zDbrBn&$K$W@GoC3FDeu#b*gEMturrOlL1z%Pcf@h`=ArD{;4%KfzVFazLTm>=eGVu zyK(rqn=7`RlRk=V=dP$@6rG~?i+-mkc!33>LQ;G?R*tN8PA({smGbXfWyRNaf4?M_ zpH5P?C%B8WAA5VPhC<7s@(SbLSIdP zI`o9~8rgL(>zN$gSAS#p_PT2VO@@Vl?;KSBFYSpv2*9(2ZLMpR+mC;iBg*?-;pxFs zUFpS349N8GxurWg2@dYRtBP=$5%mh>ZSa10aN5+;+Up9<9*a~xdTD_8_eodcuFNbo z+WW+l261^IwFKGfUdgSoYusK@b{Y!={+SU6q-#>iog&|He+FqIcc^gZk7WSj-O!Km z#@jR381_!ul;ngGgXX7yxgAZ4LA)ZF$h@UOJNQ24K;5(XB_ZxsBdHDf_Hsz&ri3aW&z~$} zuW`m=KSqUdc3QqhZCL}#)=+8!PYsxR@3-m@14dm_Yu@h9;2Vs}S+%9esW$X`?Qa6? zr|tgI#*-@OUL~6n0Ui1?)XhiclK<%=k#iaQm*@vv79%KMu)`H1L!kZjhE**&in}v* z^l7$@9$J;q5h8OEB-lt6Uo%P2UwrfoA>&uO}Z<9&LV})el79fY%)gJo% z5*!5qYGVDs=+b>My##+Jm%c_z9-wecXlkB$DHgci>DRm*w3obHnD6Ua(6GBYLihR$ zwwFY=mwjMJ2$;6b)7Z5|-;GH9&zw8_?)1?;6Zw`g6#Blp( z8bIUrW7i3B^q7Yw17o6p(X2+_{L|-lfX>j1ijGvYj<=={&hm%~FKt|}5=yY42{(2% zwfU#nS2Nyx9x;;Y?N}K>;Ht2Y#iW8?)=~E0&(P1o#~*vD3Z!KhcFZsObh;s3?oQm~ zjW0}gTjDmPhuOpt$bl23@NcxnzF@Fmg)e?V|?(+kVCwt zfDbJxJQ7;+%7i&OO%0fZ#SuLw@)BXjDS%bAE}=^;jp1I+MZ;gmh5M@Lab~=Q8|Vre z>J~eEL@3^xA3Itui4>!B$PrcYyXCi8UXgsf;`_=F)Zq?|wqy~fcv`{dDy_n*q-_+7 z$s&*XIVQ=nbm)?}Lb)M{;|qzKDr>ELp5GX&Dv_vrrC*Ky=fO|cJBJ6Gy^ft29gy=I z7RTe!@ebVB+uvg}j>YGVkYERZu#Xxu4bJ${;qcXI@Z(d7dloo}yumCOEMNnmRlyCO z41)(7d0^5+LzYd(((8v%gd#CA6RzU~=ht=`qa1f2(2}A2kVN^2B`cd17s47L{vw|t zi|;Or1|Km}Wv^p`1CSo#05rSm0z*o7arUnVU5uIGBwrtNVX1#1Rd5qec37&bAuv?1 z3CK$Y$vh%~oKdi{+3;Cqvkm?rGBQBEEcp@7IRN2K>@W{n0B&+$Oq=;kh8U9if86lZ z2AZdlGc3TTbN)aI^Y%_hDsDU}4O6z$&uRq1$b#ji+~W93HBCL3+)1_r@RWWSWT`R$ z8Y+4wUw^3kP#Kwpx$p)TOKc=koyP!*D(MCxSoBwCC%(`G{4O-O@n|1@?>1#AAC0Z`+aJL6TFuZuws=#*a73v)F0yInIYS%^8WAt&Gjx zH4BV+DuHGC+#u9yEtS7{#Izcna%i;jC~Q9e$mIw7sr#hL|nY|l%<7F1^Hr~@)f_2@W)T)Jo`vs?ubs5_#JLs3VHHs7M)1#FB^-d zIgj~gmcq%L4)=yWQaJaY=snWoB6ODb{S|ZIF4^s?*T0hBCRdZgF|_Oz3=3~|A{(0P zD85F`JRsKV^1|!j=55feR&kn;f3eNk9tDa2Fl&laAP z0o`Y1D8@WTcP`T!;3SQD4 zS&B`3>j+Rt6U>RWDT0XRQH8~Q;zKk)Zj3mId#LmuB@ArE?OCY}6mJumn`0$Tp zgrS+fkrO<*5mI43aD3AwV0Q=$AnfiGFu{dOw%4L$4*1m-NN7Pk#-XPj11;Xp!VFf* z3^(-9Fu16k4gM|_-wFnuy)#{-%plR%sQIa=en!&6N2tB8<#FV=?w`7)uzl8z)?bZXDm`$Td5JIkXOq zgpanFSMD{{0ALtHk~|cV^`e9l(7+#6|0@t%$OoxdZv^F0JihgIZA(44+Cf0*4hhK ze1wM|25*aPjjXCwPv!x#M6VT-)JjNg?-lMsd*0!^8IsWZ59&Hm|K-M_+#|Q{+Wauk z{$b~ZSi0+^WJQ#nNtD}fH7nQ7tsr#aRR{n5psv!DZgJF9gbd4T4CjII7wtalTiYc; zPYLs*;Ob#}vpKPs3EjTqKeB!6qNMuAO_&<3%OH0ysF9cNn4bEyMX<4-SOBIX@kFHw zTDK=pdgd$}m4TC_uR{81BxACGu81S?PYeBXcG!%$s=AnhPpy#1c9t%xYjF)kC~K?a z#o~9UUUE%?yGI0-oPRzmd`>_gR{dsN0M?)1&p9uxH(b`awtr!I5`S<{zn{4Adl-qW zIypuYuv#q(Y%#Fa_RhWAwxB(3CAjbod!Kgl>SznO|=a=|LdF>Lw< zC-4#lvE$s1C$RcWC6qUc3JsQZQn-F`^Hb-+d*YJ1Po3|xDm-1L=}u{IlO-zNB}@~W z6sbh<4oJ|4d62RNt^X=P!b~K$%t?OWvN&%si1-96?xHTcj-YJ05 zg@5cYKTWNH9JSlK&I;zZ%k)aPQXsL&WH{@w|2SJXix5t^z9TXpYPk*w6hUV=i(Ay- zDF*{+=xS&;tcAu~_@2JSZBS4ohD15RW18*;1iI)y>HRm!ka(Nw&CT=Y5T60<**mG) z{;r>bEDnW*gN20#{ehJbK|E^g0pSo(rwyohdb zWuSH-I7SKbnJ>{IgfGB}&ApG`Pdav8viOIc(JT>k!1fHM%Eq7=`Xy-fqq!uyc zzYsk32*&storw#)hs! zS%obIgX^yl=gQspH&yQVQJ5A&ED3Vf@b7mUpYwe$zJ@Y=$$F$j9zldWW+P;UnKt)O z7>OaCXjN^jSn`GbB|y-EgL)s&-~W7}gFG@#n32Sje7pkZ3+Sq+%YYEFd5-!L%*j&O zQ$nor@G(DP9ft^x;s5qylDtaz>Ty?RyhDE&V_<+kAHEUw?BZHS@W2+-pY$up65)@I6hVuNXu*pHG3iqJtCOf zrxbB|=umSYyiN)Qbi69MF;*-=)KgoBqrE$-Azyw~jskIFus{#i-7D~<4h9tj3 z#8hS_q+BhpeM%uZ?MBC{OHXrNSm1Xl);&{h5#DTq)O6Bn`!x&wJFyWKGi%>(Qn4No zB)@7L($RKs*zLDo$_Ff|+2@b9ZZ_J4cS~RA!|qdGV=u2Rb(ZKKgu~Bv>Zw9?jX@Yu zjj>2WyvyFx65E&B_jSY(Qhk^5EZRiNGmK#udkxg9YF_!|m`j=*zVb52`J23R=qI!B zl%yaOI#k6v^S3?|rmdA7l7>0h4bZL3P+H*AVUD9n%&EdX0CTFq+&hiqYQ!NQHN}8w zz99?zUc!8sE45(QA}@^f#^4KxfK6% zc$J)h1DVR&sg~D2+lp=by?)+(vWeDZv$^_GTTYoBiUykQ@XjI$evFn5e_m$$>=(z1B%P*hdM1%`{ zydg*toEJWQQoG(IZdP#jV+)@J@_Zhqj`Pu2+z)+1J&Z|*G-1Q;H?#0gYSUYdY5yFh z*K-U_Md>&?5Liz&WWvmj$*h>(d*wj{*~e0xO)c!rz56?0kCle-6OK=yS@keyr6EO; zlnEUO(k=0q-_0HTNW3St&v8dn9+~6cDKto}0v&CU`i{@j$SA}U#6(kM;I2n`0dUDD z6}ggPH2ZpSu%nN?DH9|EcF-*RaB-4ML8CW4y#;ApQ>!k5n4FEmTi}jBz-@JnY;|v3 zRQ;qbBT|I+v*jiK5Xa~=Y! zAzo^V1U4+6)FIGKv>OaS)yUFqFSWO~%g`N)Pr&jD(BFqMzl5v4`biA$r~rj}4BLA? z?$yThF=ytRKWg#tC-p-qWYu8bWP|fw^EhAQ&g&63p>HgZmr$q7;tZFcC&#rqB(!ne(~(S zGyQ{z5^<9l7LsQ^*BiDp^Q|&%Er4lb)QmxG^3X>w1Y;FHogy`jSq+QOi<@GXryvN) zh7h>)*Z!849TK!uNk%bum>98JtB}Lu6w%dpzwtd^>5`Un*ICnjY#+gz%$Wc8vC4>! z&r7yK1}w!e9HDcNNYO^A*n#o&t@kn}XOU`&55*VA9EzyoyJCFPw-{x%HBq^>iQFV# z@U7ATwh+TJdkrD^xtQLt=O>a! z?i)MECZe}BjDK_o)9NF6Bw##-YDnt`&F8%1FbxP?v&=^Hwbzw$sR(A>56xR3i{@b- zu$73z_;ACXnw1j%uwO*Ww&JCOWtNJW;V*{IoVGbcs2uF}5So@`$F>U28y{*1K$QY6 zO2@;ksdeN;MG+Vcemy$>r3GB#B~P$Isu=imymZ{T(a);ofa-OmS5&pOHd1P~DRW0t zw_qAO-(uSNo5O$Y%C5mq8?s+cjW#RFk*d`jDKyJJm6XxwW6>^zct)&eV(RUv_$Fp9 zOjaPjt;9IWFnQW2?UWJ^7X7kyo?}GL$HFYg9VDc=0CqnsAO@xuB}N$~%GPvVor9uO z3wmfg=TSBb14@SeNC4hgAZ80G!K~3Kd=R$2-aR~=%KmqD^9ondQQTvtwEfL45}Jp0 zk^{Vn^U#pH$h*IZt>VBev^b`cl@FsP?OqjF{1#yR|NGY~R;1!zmI%Qkdvyz6)-qz@ zd&s-xvRM#=yQCIKuO2qRxp*zlpoC88nUCZe>)$=vMFp~WSANuds-W}M1ft9|?%b)u zMu0OtgLM2{OiPnD{@_Q&P9=S|p^*5|;5z}rR7MS8_1?5Hs}zryxWe5#S!mL(XUOzr zWAg)}UU$r%#i*sFblvM6902=3Gh0|Z$I}%_EzZ|`U-*8PkLIh(=d?qmzX$OprRe6WOUKOJb{4%?BL#`((N(51>C-~!s;z_y zZG#I+Tg3;aSMlK4=%3Nrg(;;4HwV;qBYzfxWY&`HvyNlRmsxtyr^TYMq(ueIt5w>2m?i-~a`3eCD$nq%fXxti4+=fGjqvvNeBIrN{ zEKYu#RrvID6i(b_cXgm6KbrkABZa=>g_SkeCscO`Ui{R6RRLMWqYhA!t1`zIFB_Yl zq(F~(Zhfwqm7`wKdBU1M#{28-TbFAruc1>nQ|j;}gWnE=Ygp%Lb|?L*zXt@@>=p+s z&t7Kc9JJBLSHwJNv!2Ro(cS|V^rH7w&<$rQ$WhYGpMNRVv_R7ODaZWFhu2YAF>xW` z?g7V@;H=}6-tF(HOTnNtGCfeM;IivdMI5*(qoHvb_j}n+5^0t=Kc7*V4uM6?)o)N| z;S=bNp*qzBwC}$K5iYNxsXyNH5p4LlYZS@p2VJ_pjYxO&AyZDiXC^b0@?M{1?UnNi z9(7bgso<_&fGMfbw513n9Z`g^TWEwV5AHiM6pLLLBG%*WAR? zOK-U#VY~A6?Sz^o-4OD*(SpiU$Q_u`cd8F}57FE1Y+#f*r&do{ zhUS)14}1O50gf4RO;s;RSSlUfnE@efxC17aS3xiHubdb3krh>GF7=4>qZp1&mfMY2 zQD-)d`MMH4Ga8;Mq<2u*X6sZ}N-I|kOj-N*H+QTh!QXJ-bo6fw|n}x z6?_oWxX>|L;7$Q%(gYwZFcocTv_Q2a$lFc%l_eUYO$SiI@tcXeQ;^XRd=$0;E_^_< zI|WnQ$%%zBWrZvHA?_yKgI1ED3jSY;3&@71YT4kP5ur|O|LOKkL03HWaM8cgfURP2 z!jWwM`!M{Nt+Rv6+QhoBn$;@szZO5>2Vz|M`Ut4TA$AJd(6FBGrDfH)dR7Ch z|LdpFW;5h73NLQjKJ8h6Bsog0`Q=b+iHtn-!?|%Wv_NOalPE4muvly3S3dtGhibah zd2wZ>-|pVe+J*}rb}PUCbxZ^(BG+|+pF${=Mwh}~Lzr9#63K3AYgqhQ$A4Fc7kjr7 zEvv{{8^Ip^cNB4Kz?U3S*|IXd>+~>}N2A*DE@P<6I$Gg)v?vXa%aRAPbfJYxN)}bw ziZm-wH5&IPVY9aU$^UVd+e@!jeV?MO@Jz^;XR%!h)LA5!5c$0iJ4_5cU4p=hUYjtS z2ve;7pXuS73iR(2}iP9bs0(JeOqC~iK(sQ4rFsH>E$wRkT+?ThwFW0w^+)Luj` zWo&YC6x;lKE*lY$jUdb+*?|B}4#_$Ai;Wa>6-aHZ^>Ba_eB+UH3`7-tdJRWTR^myR3euo; zlUe8=)EE~$ZGqHwZPNUh+0hM0B*)7YIRcu*drdf0u*OiMMrNCk{u$BKB!ajC1p}*ocp7h^DemA444&90?&&}_ zVk6--^uufe>ASH@&sC^HKGnD5DXuKy>VB8zcW(r6=ih?v_?gUzvaT1$vD|V(+_qV? ztb<3b{ls#amn~7xY+-f_+&(|G4Dfe-9ju0^J_G)c2xj@Ijaadr?cG z2MkZDt)D7M%(YwRTXlY#y?#U|RV`8P{cW0Kwmldj>aN=}b=7mekdz-eRI}$R@405) zS=wOYZ%$yMSf<`HBh5b^{^@lPLF}fRPi$wiJKSyoy+!Ll7Oo0Ds5h!SP5=@u>anP5 z_1pw_s599%ctRHnmLJD|R*$TIJk&BNOlBw(SNGUj-^c-o4m`A%>MnWn9*q2GBhY3u z3GrNlrfT0OG*+&;N~LS#ST1NZFp!c4Uw!EC@@#v6&EA%me-%khHzN%lV|79$I%ePL zje{EefwJBxQ@VQQJtKQj0aXQG{pI=7^f5p<{AgaIC1)imUc$#AK?1aYaHp{Kar2iZ z=N7>%r~S*f+3Dtt0Cpw889sIsK@$FZsBw_>tm7Qs0o7Dmr%TB|hisU@Peu`-R{r_p_I*SJpvXtKTiamZZ~o-p zxb&uc=3+=N!>Q!UdiT~=k1n3Ygl)s9=h;-n{rSN4zal2eb)SUHDSl~hG0hcGG4y+L zzCS}h9=aP_tYixr6mI%xeiUD+xkzPn?-2>fBSy~lPubBBPaOLx#XzVZEB}VYts0$_ zPSk@SdNMlxCBOJ#(X)U!U)F>ZGpEmw{Qa+r3jo8~QmrqN8YF#{f zsZlUy=yLhJv8m7VA_I^%)V1RTAj^;%MGlWVxv5FD2R*;2kvA!E0oyc9B!N(2Aqwse zDgF(G?tN!nF@o`{9zrNF6XYA`ijiWFuZpizwd92Cq3 zV3sIwf06LP%@odO;XFi(jgDSC3f!vu%6_u3Hn0Br>qqJpgbx?XnSlw$^T3%{1NARM zwSJh=g0fmtc4I~;^k)N0kRf;$cok%pY872kZWwX4Z>*;HWu*b#w>0i+R=!kAQ2dF> zUi)lEsABPQnh5e4|9^c)Baq?-2`Fq5k5RSHgY)rs?;dGFbt|d0^AUf0OR8{7FWizK zX|8j)JlVnW$@ewG_u{V$nlD%Z`lISrqL*|(^AHhN!yfg&UpvM>vd%C9pM4pE1(f}i z1f$a+&Wq3TiWadSztCImNvU(!kp|!BTjvODyw>|B7{ou|hIVETe@y52dEHnx_~hS6 zpb>N%_Wg&y%z4=bap)(}&vHk!UoU7AoiY7*BA`!T8*{Drds+J+ySq84`TZw=c}$DZ ze>WBdKAK-vvDW7~1+S90puXZu^C>ykMJj=Vbe!Rq4%kv?pGV*BD=E(ejndypr(!nZ zzYF3?1!|YBc@-Kcz6TtWtr@g2<(gI5hO5js3l$q?VNb1d5gQZULn+lPW^66Xto&FB zmm-glnV1@|mB5iv`Vl@%6i@+)tL(vY0Nc%~xmaEc=(TSi;{T$JiAB8sYjp?r-Px94 z_?(hBCK1fph$4w=gyE#GMlOO76VuqFp=y2?(6&;1pP+ZH6U>0WGAQ>!1su=*f|05P z>7~RFc8nUuL!7>6LbfT(C^5kn6Z-^vQz*xWC^v059r;y291O9ifHF9q^96kRpZ1W4 znAm7(!Ztmg2A9RO5;DX?NWLea*$Y-34Y{0ldy>Y!5-n-Y#&zUZ8hYvkO}2VE)#8a# zV07htMV)xRLYXh=`c>_TbVpa3PrrA-?%Pc7y=ni=OG@T(8}9n#h1JPQ^=~SNrA%2B zXYVL83VMH(tWhrF`bEgLQXMHp_^*TTz8MUJeE6>_2BpXFmY6Lo`DLB%2lWq84r$eat`u41vz1!vk8lC-mrC_GImWR zp>~Tdi-{&r>QaHD=26pH!?zW}wstN~`PHlMr;RRqUi^gFO&JbKh`ZnnR(B)Vd~SKU z#-ao0Xb?ruoz2cSxpZv=ioL#`Cn=%O1ep36b%-Q~1gIm$0os-`JDv znsWa*R66Sih?d##Os|!oGqQb?I?k-aIvDJZtNb&C0hM)+1>0sCY5@w|2=wC^FQg9# zdm-tGcT8#jl6?MtOSt^lOgL%l2p#cEe0zr0R&$p73S`eJmrECL#dWcy3K^1ZFZnt^ z__J=Wz8JE+T;*b)QBGC)2>IwP14jSXQ>qbXc}2;=sI!B2I{D_-?d*;6Ra4QGv3NiP zS1asN=_`o3FL*a)xGIo}Qo9&xjXjxmBHOpwCpPE9N?siD)*N%?Px%S|on|hf6jde( z_5(lhhAy5*L$65NPr=ifOK81&R4HV@?!e1^yyh+202R90|MaHW;swHv?{-OPgp$(o zygb4X$z|3I>kChtND0ojEKsNex8-5?zenoSoit$0(1#!_VV4^V76UPQz{R}#Gt?0* z6x_~(Sby#OY*zqM3Tq%+5(tFY)G$C>bZ6Rq5N5i90Hb5I?W#9mxhuavMZlh^cI969 z+Pf=aBPl9_WswxI(Q1yX5Th6QUO&}hqi5#pKw0@J7TAaFI89)DXn5ZB?G6;cc%kR{ zKWU}lbM^gf0AC|;zVjm*{(vOFW(Y0z>Y5iRILFLh^~wUjm5Sn7N30nz!1KPc>R>#f ztXjD6vvipi$b!AGl~b$qmF(Dl})SP;y6(_)L@h64*I9z509{tm~g^@(DY2 z=Rfve(Ie3P-MYwR|BfYjIrOWH*M~)NG#dMNQnHvo;zcl8;14iIq!&T@#hSM_qjAbD zr4>c1H%Q3_+|TmFX%?uYv^XcEOTN4xNoiD~L_%@+y>PRpS&DBr)NrF&HZN2PTVWWO zbH8{i#^KNZ!ITkbhvlf_jG$osL2oSpTMNKbV=f2b(>jzaqGVbeYoZ9qeT-!+#9F{h zO;%A3tfyraARY$lT%c@#?BPZ@+q|@IY=iMM!;F(8ebAjSW8__oTw+`V1iH&6D&Fw_ zw9@ILK|==w=!OOY?;FVx5RlRU$)%7T-2^Lf*H^EqK^Lf_d&pj8 zqvOhdAMspcNO{Y9g``Put`gCm7z-G?dW?~}B-cobZ%Q;(88bB}Yw+nxwD;{IeWi#Y zwMFxaVu_k#WbRlUWB;3Qyv0%r7jKanrY_H8%N_N8@jr>hKAGp#g}}g zYX&j1{>;Wfu9qL|lGhZph~} z@VaEuVkhAcALA=H4iGUM7d`uvt@rKyssiR9f-OYa{5V!FVJkWK{{`$JFE1`BwvaIss& zZ8JUh37fXu`5VbLE1zhmG#h@UGBv&Fwsqp&;)sligi8!*fapuo}&tE#kbioMIbBJB+?zP z-r+p9im#TcA?RVsZq>~0uMH|sd6xG`zS3zjs}&>`--^n~zO?ymZWcchYF7(tM|tFX9*`HL&a+ z3Vv+OlsKaY*kpjLhRtHWXSmT|)dox#$iUZ5FNIuncOrpOilVlb7&#oJxhf)I@klk;%(DP%t}mct z;pEJ%If z4#uh$QUq$uw=PUrl>RMm%rM}*rg${p7~gkXhwlmhcKAJeMXZAGjp&o$*mLcu{iE`+$Q}4(7M+i8Fl< zXPow@4CSj?!@Il%mPl{PUBAEaZ5}47V*j=#JVPX59^~a&wvr|qyT1(}7kVBm5d@=l z6Mcn>)KeG^Z(Qw+N3_9yeg%nJ@Xe%JEwgm#I$iSo!S(%qMVJFrV?W-qJoZB7ncn3c zijR{i!SkDd29oVTlM4TySZmZCErF%%zdghHL^e0^-MVPR2vq#yoX{JCte~DR8yj$4 z;+fA``DTFBy|NlGfS{7@;zg%fc}wbjf67IArnX9$@X|8{f2_D`xw9g?8w){btK-#Wtc2Nh2;c5Y*9D2RFpunA+RqRWn9_aiqihhZ`$uNfR9 z0g`MDX$t|xFzW~YH1{_xw+jJ$dWM|~m2{jf`wT0K9eWiwt~O%!KQiAGlNa4Q4fvC7 zVD}YAXyTTu27XepmcN3Z{JxdtrGoiQB=$YfFPx zxXyQ&=IT!|Z!%MH*XA?WRzA4u=Ag`;Y%A$1sAQLj(Cp_7_!y}7^W4X`66u#e#+Qu_ zxi1W`;Umy*%<%_9ylFTaz^sZAb86e;xSCLW;uE}%qi>T^eL1XzU70Ofe(-V1r5c|B zFOkjAYj51EuuzJEVHR$a_I5)mrx)%tLrJRyi8+mutQ0+rH{IvR)o(}XA{Y2K=W>Zv zofL8f`z%Asz(Ynw;D{ji#r$4pwRhEV1vskW{;|xkA?>vMKXHulCtM$JRsdvA3_7%Je+RqB7Ew;Ug^gkGQQ0 zcoz1e)8~4wjZJU+m(0eyXIK(VBOYEY3Y>qv^>vOsS{Vz0Rql8y`I<$=f#745GoN^y zEXa!~Lupp8KRVpsUn?cwxqW60c!|xQ#bU?<&L|)#XAGH~js)l_1M7Lj!KzF#27Wdw1aYaBDG-N@wdzl_#l&+&^9tw=oITO$(`4)6gSlqo$A6yR;M zwv#)Or6n*_{RnT%MZY~^$FG^NxRVu%7$~BI^7tU2J#t`gR!{At4q9dPp@MYaCg)qi12?A7ny^1|ApF8EUL+=-N&-^Nmfe>}4B!riO zqdl4{%q%5|VJdEJf6UYJ;Q0T9l*oeNv;ZHsyDd`Lt`FONVslec@Sd^+Shr=(B}fJ3 z@k2nnhcOi53R;v-H`9LMmtz{UuiQ!^vh;!p?`Q%U^Z@0DO44>Halo>@xN7f97KIgU zD@i(~C-?6B(mtYwj!mVYo4Dr{?-hMZ6|(Kberm(eV5?*!_F|&)K01C2StQ;gb<`&Nlc%95F=M+IQB*XN zo)XthxgV5%`N@JjbV=aLXZ-mFEGnyf`3Etf*#&Y;8%E4CEKbolzRHh6*#p9TKP*Uo zR$c!!G9j~1n5Xoc$o2MkbcUrZxpj}{)o0sNj?+`b@J?~hF0&&?!0A|)3_AXTMI<`0G-kr?xHzZxOKt!}fvfp}!= z_Q*n&On2jPuT9;o_53px>m+g2H^nzg&+M=CIDm<0$k&{IsuIvJW745N5~wh2^~=}O3I1xc#Qyv+OSUWX zox959Zu|3<@zoY-xH_zx@~uQSC8t4eittsPrX&RiZhZoxC{fTpUvy77epbdw-{KwZ z^1Q=eszL}RYy0)C8dx_F%GG;grnn$7->ATH^eUrZA;fa!Gbgy2w8Dvp#%222B|6U;yvKP+iu!2sPssza7lei^bXaT z+C+0T+e7)hhtd|lBMW8)AdsamL(J)b5;!KIR~3!cK#{`nVcj#Yp^s76 zY;fxY1Qyhf6jl8m6g$}>4={R)qAe zJE#-0$s388;H5i}N5Xnk6#9pKH4-;;UIqHo8^bj|BX*wg>C6n zq}=`VRzi*WfmPU(85Z5`=(o~uC}zGY<36E&!$Q&C(B#1p6KG~{Az`od$~|iw@brQ6V!?bc=`Z9|~z8FG?Af-|Ux2f_cjcyjo&_BaHsr zQ%tie2!k;L5EmOz&hy@sLuSB6T?RZXbg1_HgE;TJ;#kb`uq}QCxOOy6JPFYY{Dw=73akD>{l3Rf zfKX_=c|ri^!wXo;H@*{hS1{J@@__2&J4UTMYQRn3imdwQq^Actj!I+-6gYA%wIF-6 z@b-eI)K$cVmn;YIBgPoC*Qy#5QKHJ2u{Wu7e%e7#+8?Nz51ln!IGfuw0z0LLd~0L!Pm}>UQ*W*_ht@}CUYrcFRaLwUUtWu+90#W;Vo zE8bMF`-3VVJzQdrFRFt5_x^o7%VNt2cOgd{{$7|Lo=Ww2>QOcCb5i8a9;t%Du!%Te zUGlvYJ*EnOt7Sc4zB8FxR;SMyOd=BoUJZTQ{`-AA$$EKhPKM(u@i~gpECni=S{~zyXPNAD6fp$_5C#c9iK#?T@BL$ZY}YL z^2A%?HNvH3w&ba=OYMk_UXJ zKViohkryr!BU@O9V{APqB%+@04iHRLnUW+W|H86^zF!p8zceI|37`1s{}vGox)Y@N zx2Pkt!%xAaI`bV~P1+qz%zH07TSJ~4l2u`8G)yy{jL{a=Jlwk??a+VH+kob?NXTZ*ax^Vxo3W>ih9b2Y{cL%Tx`<1^Q-Vz3?hr7CDx z?`p$u@1eM-zGD#ceo3a7Yt7#$Hw}cHZUVA^p1+v@hfx@)T(FB&bem{EOUakiM02BV zhuXLhzj7C!Fpm^N8L=>7Rjq|21jthE(#>BOeYiFGYdO<1e%5{q-lQ$@IlM zuwq+RzfE0UtV4?+SE~ukXS)~g@!4Qw-(+5J^u$Hqk@O`0rnEra9zh_UyPFf214`+8 zmGFcwe+~!VhlM)^6dA3~&-l5LYT~B+q5nV}1jS1f4H4N%l(!{R&JhX9`8AKhB_Bug z`Hg3d8*}N6>bJGP0BLYyCREEW?@q00HY`u52J~8wQkoFZ ziNhin%mD(Esb7GA77!ulgdDMxL#5=P6<5b=rZSfoo*Aa#c9|>60<;$?oYOB&x`D=( z&1>EA5h2(t7FY6lnu{W`qxFN)SF9}*ocGt`aQKI1!?Bqg3~xAF;l;~WZV`xrHq6s>%4-Nv0WKc?v?JkWbnmOIt0Rm%knD5 z3P}d;dd0PH(B3*V3~~F>XV@|w#!TyFct%uRu zF?QxJM?$4p(e+tR>r}%?8xPXWvteAXlq_S2JO&&cIP^-(AVOFc*K}-{YZ%NGro5R3 z(rJcjLJEkgcULYD^D6VpEv`RT6nQl$w<~i%l%4$!Et4>x-y1t*ZG{7oRnEXfRc^B{6hbg!+*q=|NBv``k z7k==jud}BEA~2o|e^#3AR<22g^wByx|OJue3?3sF=H1o6&!a; z^TS=~8!g1G1VpHh!`1?B4YA&?DEOd zNi8|2^A{bnl!q83%I_T=HLF^+5lg3WN|u4~8K$H)v-pE1Kf2>CKB%OqKH8r zV-LSpF?!LkyVth+;v~F82z0^Qy=|eIXS(UG{6mRghQ(y?Lkz46)>iQpMNUmfhg9L( zDO{upu;mvEIM%I+uxOsmfv_c@SBs1w9<>l^@_R>Oo&}du^iopvbjA__1~nh0CC?d0 zU=JEQS+f8*e7otdeMZC(5Bht_nUu1*qjwq_gqMTWtW=XJ-u7K-r5(Fo6b~uO(tnLT zqpo*JHcxn|yEH>0J6?zaAKCx7MT&3Bz z3;UanwiwgE(%Gl8V(iL7JLv}?;cHj%q1^-j^$I)|Eu0sHfkWW+AD|cFNf@tZUKcSG>=9ecRxV# zwB?GByj^}k!7h;QA3RcxPFQQW0PWX9{T1t24jnVcLbxfp5gYdVS53Qi$@L zr8827M^Fhv$HL5p9lg>0psg5G&CV*Me=et*6CJ6&MC^Evnk0aLr}3Ao`Zfzvlf+Pe z6k+$uc*QBdsC?Q;gpv_W8FoNV5iad?8t_}vphsqnY`FqzTqS~g!9^jG%ki6gq>CgA%V~P4S z{(i2DvW$LzST`D<#Yrf`laKxVgGn9)64Yo&??jx({_>s5Bd+wol<(BCl>nQMCa-o8 zq*6+76i<<&VUa?O?=s%+8`?A-s`U|TVh5JHBPL_55&CC;RN$Y9b4FHGTrz8O$Xyh# zr_k8fBW*co7L!-6)iOR|+=r?7drLoUKkXO&7RoWqg@ffesHKHTdHmzbLOP@EPg!9KRPL0j0#J=w^j!e~oZnrrUDz_cO{L zs>6|&TkI|#ef+3*>Ha*Z{)#>n1Y!OPv@&8U?_z8c`;y18VQqdFl@<}j^hs)HOgx^c zGNtwmwM16nBtrp0)n|VaShhXVB4(^fNB8xG$$#-*_E%J9tnu`cc1`b+aWoCgpyq-O^K=z{lKvreIYy!sX zKmXZ0`hj6je*5WWXrOhxIUkwQS%HXvo?vJL8-WlZ?C8(PuDMXDCH}RGp}JHByHI?Y z?-MV~E3PQ&zf!zg^OET6SC;>X#m`DZ(Ly*d@;x{RlQCu*6BwD zS^fx@0bF~PDbSUxxN<8A=J+%$_&RuWcY6vxK?5{2qU8uXrADej)vOQ$Fq5!NUM0Ntk=3nS2 zoM_Utk)|iS3dNruj~YNCeZkihojoIznCD1bZIOJ>5$MSCkzP%KjpY1@{C$N1nq;cU zj&IGHsf_j)q%rTE{l~8Ua0Q-%dv7dCcGEbDQ}eqoS99{6;=82UoiWvI40lkC!4!}jAy{CmwhrhLQM!JBbgdgP`nigzB6cud5PazJ| zuTJ}}By6%1hVAjWq!{g)aOoq6RbbETnR?MGA8V}pabz*t zG7mz60f&-fU3dVd0mbMy7!<7`G43R#WmPyCo8%_-D2((!0>-s@SY<2~i)Y{RiQsR( z$9y)-nlP?iA`80=lA{=EB~yqHLdk!}@R8x9tGc2S8*o`psNzc@?lwF6D(+}g9*KNL za{~;2i9dVxd7Nbz~kf{N3(-t+ZJti(=uE^Se13NA zN@iFBp*4lRgNu5sY|!O;ZjCIAl_wA41?=>!Z9XuBi;2g4>98_Kb~U=H$sh6_TdGX% z8x&1{n}6~hDUGyCowl4TwJuQ!D~8;E3mfwTGt`-Ia*tkRf+DuA^3@FUywq6be2Cr2je-4IXDfiYIWEj|4Npt5f&N;ak&k(w$T$w(y7L51@gT$m*~Ex4>c| z|AU?qbnUCE#7I&bye9eW$XzY91zk(q0Zna#+^&kh|Ld2;7bJuP_TgP@u4#gJBYi#3 zalVTMtVBcGuNZPI_0KkQ!dOnRCaC}OaGaod*em&US35?h3W97!Z>JzJUM9!1dce2RMbp$g|#=tL%;ZGIFjJCRbs90hhZ9wAS> zB69s@3R_X5c%D#)f4tRmoCaJ<2^w#lKNqizq2R*=_tr zK^Oi>{^meKG^L-_nh+IR4C$Jp2POkKrr#ts;;-e|kFoQqPiqZv*BQpIS!F-mnzYdg zpl}NvyOMbQS;uN>&PcB}8{N!QGUxKe4t~hDSm=vBS^U0bP%~Ah5VeDvDZAnw{Bef5 zdT1rovj;4B2@<$trdbkMDdgRn43F9T7Q2aT28Y0i@j_?d$m=$Bpi-N)cji&(=y$*T zrctp3t9dmQi^(qTqFLs|Lk0EtM?}#+7vse16O?xg>19*CahtQ1|N6q+5}9g4{p^P% zn$Kq4BzU{sgKhayq`+(5!U~`na!!B~$!zcxGm*o?X-XjP-Z5AjGiZPKkO;!iD)fux zjdSs?Bvg~uvP`2h`ol93J!@6`K0%jWJtUS>7adDwdZlRP8nT*QCe@Ni4!uZwGmD+T zYRzDUl^Oh3K1UEGZ`ad-v7L^ULizeX4vil4@?o2Eu{7MueK7RXrH$z5 zsZTl$r|4}=(<#t&j&)YQ{WYXRN z^a(2I(!N!iUyu^QQD}ZMJtjDg>AHs7_I|3Ke?9Q0ZmtFk|n+e`P%EyLsNp*=i0J?-(h2+T<_K;nevEz3ebF{N2)eRtP_@= zm78uuLD#W#aE90rLC`iCK=DrXr<{nyWT-BotM%;;Vw6D2!2;i*V1h)a(Bi4_G@av$ zEBE=mPZqGYASvr#Cj4_7{~KTvG`8A~YdOuA&G>w@a~~gPXI_7czu1oJy|pe`kQ8D+h*6wNQSpaY>U zhYu*L*qNVA#sovIs!HGI%8MhH3Oo3`>jw||5R!n=$F=62!y%a82e+3WfTYn#*7N*- zN{Bi%0Q3!DYdy2ewQV4r*aVaM(OG{2AO$zI6cj>WM66Lt%OPHu^z3`kOI;TO2Rz1B zsTrl*Y_NhbL?PAH_oVDdiYP`=^zdYyHHc3}v!wCj&VYpyzQOi};7{>s6=e2}HvgK2 zN57l>m+wvw7z{BaV&Avwp2OxbFJ{5KlM(jgoLua&m=R_X$UZfdjB0>v-y}`jw(W*& z)`a5$-5ZhfGdb!>_DKUp2EWJY9TL)_jFo2b*iycYqOq?oe`+B$FUQk}$d0rryP4JP{7*?;uP}~V zvixBn?jd6IYzk4H(*cUPp;;4iJ@c2bNKqIfN~tI&gN%&N^{Q zc7jq0oFOFOu^MEDOQJ;jvL_d@gsb+CPuh$MYau$j^;rT6aa}>0yk!qD=rk2!azPN1 zejFEpA+VWf!LM~uRc&^gkv?nEG#)Oo1qFB}w-|1C4~L0pV=3I&{JyyPN?F*qGZiUX z56YcU#=kg7xAS@uV*IGt1OtS}T=r`pDvkBUI;|3P*#bq*(^bKaNXrmtO1CYNUFyKA z=+%njliI-r^$7*uqY0DgV%aj%V{9;%Y7{E3`a^RT8SG78>Qqim&e7$`pSe`o_aEyd zK1MT>)?3~hIFrzkxB?YvEU=@@BwHaYaP5=Y%VMtj9vJ@qJj|szB zSG!pDw)NsAoupG3N{c@frX;C(UWZG}ErS4+AuQ5mVLX-@#9Jz?SYR`(hfs`fPhiyP zWuU1oz(mt6AaFYW2cE%VySj^jARecIlB|$=zqu9{7Yp`;!G0Wk%q=A>>{9j1^l^%vO`}70xMBs zUmtn(-p*2jOYx3SR{_U&CQI8>PGrew$s5D9`=d9%^GH><+|qIB;16I3JjC~K(!~d+ zW@gU_KVZNxKM-jEz^2od1lYii;|0(WXz+0GH!^4ncBKUqR03bF>VXf;r8<720)^v^ zo+nQJngjca1WeVIiR*Cm+#C%TPc+PfZwJY6=k4$CXTjKLXb+2FU2uA6kS6%R66_k9 za!#`xN5#qT02a@sQ3V1(ermXlAQ(*FA~VhURr81l?D$LeNimrl;)==ziiYf%jeTSp6w1JI6~&2%`;q-ik^1$vDH=wHQL_IgI8LZ<8P-0Zr-HXeZ{-4& zthA!do_r2Iz?b2vng8B}#7(BV+wVdSW<$K4g+FlFDnSGuz;VL`IqG1YBZ?3xIT)}4 z7rev^dG3)`qX_d_u7}e&G$EbUO_ z2t?fP>M3lS8Wz~Vf73n;=?N8unSP};%O~iq3?DgwqQGcK2XuMp0HaDP3&=<>&u&Cv z1e}KGKXtDOCfZ^5@;`(tKm=&epfPP9^dKa%=%&H{Kb9egIQW(Lr;R{%n8v>#n|u^l zq#OmNKp>bS|3`~FSd6+1f&VXhINXt!rwlB2&JSh6P(v_Ay=6`Ogw&2PqhmEgX>;) z?EAga^LrRq?vLvNdq;PVW4Y&_KGWw@HU8N2WJr@YlWF^P_zsH&iBT5bTv1zuVz7mZ z^fQF>+PebuCy!BiEUKr0PLv6V!#})X0ja6+y9X=lV)}u*St!Z9<_VnwJ2cNbrZT6N z8Br+rU;<)8dKx*)UIUYRLUVkc+|<7WjX_yhP8#$YJr4$uSN2YYxF_PYCn8X^MK*(0 zn2p)Xs457g-Y-d;I$KMCf2~wWBrMu!Y|iKG&$+-!7;(kJeg=8NSvbfIU>DqLmXPdx z_gj01%;)1;u}QmT<^H)>1v6U0p0EWi!9(5*I|5f(AS~JpIzIJXoG*tG!s*+DeOvvu zIxQ_o8gR)A#UUgssJAa0VQU{82ltP-wJIB+)Ii4p7X%26sx{viFGLCa$LK$mqmphw zFWuJzW;EbDLvw%d>lpeSKI#iR$J;PQ%Kp6FX}-K=@kkS_w=eRV9dV?oYGDqMy9#Cx z`9savo7SoVPu*r5EEb;~)(YNsy7dwdFtnc;)yDiwM=lct@?Zs3mDmmYUAsJr9L?3i zc~RE_rFCyMH1}z0idm`T-s$FV>omy+>gX)ZR)+p-Cl&(fAMgOm?#uV2CWjJz_%Gir zAL#rsKywEG4sANM`P$?FM(PNfCSVB}?4wv0Z}ZdAqc^r<{dNZZqA{@nma5zgii8Nr zU3VbVqxv&c-y;5c~@{cLSV(YI(Cn+y>kagm92WF)RjMxrP*S$kR7~>+jze$Z%Hl|A?vo zQ|+u9V0>a<3?ra`gNPs#aVA*01E-LQ7gaD*v@S)nMC^aM+<>;;W*T(q>f$v2A8J`A zns-9bJPG~9&5p&e%YT|FKEg~zR=|Hxl&6vUQU8;yzCng&gkBs(;J>OA&4?%-0eD13 zXxQVlnYQ!Kp3~PK1-4}%GTB@!U!}VSFz7N$R`OJ=V60zTjNjZ(-d*b7)&N{PvPB|B z-ylH1I{0m?NfS}!V47b|irBr)L4bC~84UM}yuAxxthkZ~nr}7+AIZ8Fv^wV*#9iQx ze{%ioxtdfw>XFy==HztnvvmzVL_padP3ffj^4SsxJ_wtUSToIJWeEanMEVq{C2#Y8 z?j8cS!n7tY7I&<*pWbS%BhEv+VZQ0wB1=d`>_KonC@ahOSg6`@x4$tJ5XR83g($Tk zUd-f%inwUMH_dsrGlY7sD?zf<+}m)qon||YRO}x>-62f^!N2}W)htWTxM{kP=khl+ z7q6f+Drp@uC%6Vsdj|zpa$5ceK)a;Hu9%M!1UA1Dd@KDLwmmOJU0;2<7>D|^H(F+T z?*1cAm%rZoKIhTW-<^8TI-@;;JMK4a&_@l&&lPc&kopcpItZ4@r4f}CQu3`^idsr;cf9xfwL%8Xy_*n(52GtXN{uVPDYbfzMz;Dv&G%) z)#JnC!<1FL(BD&H?JYqaez;)1diVoR-sw;%PAdqCZ28&V|2r|)kD^Jrjv#j8 zXg1hM-x?>CAWV=*iL#Ho2r=DU-%VGxBE+QswBMO(gf6VSOaA-zjVzxq0RgzFUWh~b zL*pfpwc3QQh!)E^AM!H!Y!ZWd`IaE*MpXq+nCtu_d)Mc%PA(RX_-6|upCp0R%b{Pk zl)}dHmJ4lZX#qLEAnHk%=w82;`x$;m%Bl&B@$Cw+5Z5DO=%e%E9bhDyx){pcG4yp} zcua$O00er;Zp$DHtDe>XZu@^U>FB0%3?y)1D!^@Kcah?iAeuaUv|z?hwk0Tn8a7f1 z8#qdQh(4E!82;fNO0%8`f+G+{g5w*7^c$awR_JKC%Rxcqi0f*PaXoM!yh8Ocj1#SQ z`=!JesxppEagGvtO@M=1v!5&@GsPS*?J=nDlwpMkj59AX92$aO7lubJUmY3KCHdnj z&Lgj@8)cx=Cr)@Gm^nzpAEk(=dSv_21RUyO17@sVPw(6KVz31@J9AiA-r}OOpYyE6 zFH)$5>?3G2HBncJs1{VNulgPfb~gD59TsbT#mF!4Uri%6uy5H}P7Fl-drxlKGLQU! zGA&Xq-m}-qwSGSfz&$S4K+*eIZXV^^J=g4d>Mb6C`HXIn9P9K+1?VaLbtZAp??eA& zPp}MIQ}VcFbo4BW;oz2o{4T(0DP}%zb}>^q90aWhh$WfJBeZ~D6<6)tbmYZOlH~yd zF0IXt6Y_26sW4OyP*&!)nn!kz~O7eN|g$3gymz)??44WA7hcY`fVnMid8EItb^ zIHwqfXH=Mpt*nHu5dcSh&J*t~J3c}zIPrNAqGBEvD)_KvKCyg#8lzs0Zvjp$W#}eH z+u~CRYoOUh_|Cn0or}SG9Wqpm#IS%HOD-FiE|-}2-fsK^HfMt9fiTLOKYWLDjb#=yvfNX>V8@WH>_lj=Z^2wP}W_W@hT4gbYnuV;EnV-WX|{Cdfy zD166BYk`3W7A?5m^J4gHQeGXF3OfDub=amH@$_|v8qplsP-Fg6Ti8%zXt|e-bf)o4 z1wtiXHSXD`dE!33h2Q*%-;cI2VVy0+#8u7{1af))PPCAHTcznPvn&rIl3=Tivgmn+ z=w`b#|3!tFH+Hh|a{k(N445mv(8DrVDSRQI{+lzc_?}9`iCSwXU41682Idvh$5@I! zXOhKhc9d`e((yUWONUVTVSV)8Q$gxTi@wW@B17MM9dprk_V^rZbm`bZpe2b&iNtN; zcjeE<9Z{nn5^A(z0w{Z)JKJv)Qqyaht#j|YUs($3!jZlqmf0ns-H~~VE(7|~<@I|4 zo)a^og|*60xx+i2<)C^5UTyLlv)ivJ$8}GIpYZrdPpz(9efm~2pSkvHY@^VKyw{ni znNzLUmj!0`YG!)k!Hd7ZQ3j4KdBEyJSfRzGEI0}WX`CL8lwqW17St3IY(pI4) zi<*7Wve9Iem*~sOIKuv#bU?w!r;$Q5|N5y|;luHAXA<$nDY)_4YRwbRp+@5ddj}6! z0k>Nf>Mj?A#39pDIf*i+i&Y%66XetvkDrFLQVEDE+u zu+B5sawMfAAB6T<4ZZjM)Leln2bXAhQJ}fr2@fzKZN#ZyZ;_oDjm9ltqW;)tO6p9a z57rV`K*j9DW@TknINVJ>MP)S zRgxTXpYAjJXaMEuisHYDD*;L2f4y%{yX3$XV|b0eM!5b;}s97E!dpf=Nc16@E~V5tt{!PgiipISK>^|kDyq6@WnSLoTy`@x8a z+bK~P<}WT+C<47TvnfHk4g|~d-!RWH*s`EA8TkSEQ{gR9xC^xOHDn@}j8Vm5VdAg- z&%}rDW~JQd@f~pKm=b?5rGE8r`A4^yqv!OVTqUTy7HUE#H_EggZdUqY_@Gb?;%aLt z`zT|3p$gP5Kh6RZam+zJu!aZ(T7&13zVflQNC|#De^WmwQZylBD69u;RZdL(R{i?@ zrE12|>QY+jj?Mb;!i?M7fQx&6YqP2^D$SI$o%>X+uoHF@5@~Nq=cYemQL}{;N@#0> zfqWrKt}uk9outyKOadP(#WtGB&kJV`MfEe(9ky@yc|bAy0xO%}qT~fIS(IhUUvBmW zTxw1rc=}4vaLE4*5O16ZbACQdv|FRRTiufaPM_Ty5Zj0QWx*cX4DFtM z2K7r>gM-X_;1bk@>!J?~e>Y|hat8d=BuedeP=0kP!2TBV3;e1z(gni%wEJP&>zz$# z5@M@vQ*4mvPXj#Gx&H|`Q4wqhu!+F-V#u$%^Z?=zcot7=uQb);zgr4k$YI0op6A9J zjDIMgbZWq1*cLH@h7M~E{I9M_(4qxGszt%RDlZeLujd&`D7Kvi2oZ?ZVE_=!)l{JQ z5j)N+Xz*tcrHp;u)zCaRqXfve(}ke8s|^!KTCK5X67=9`2%DeN<8T@#?h?48hqJTE zp#Vp?OtvN~LNakF$Xmn2n}IG0wDN#NRN!(apj!lO9N%XaRj^_U|176QPJDK;)Y|rV z<}F&&91866{@bPdLA7V}VqS26&%2{^#P{Q!p1i#D*d z@+ZQU5G_MHVHL9TboEqEwL{X!wdEzlxL0$UB!&2dIa<@-KReWgJDvzQ4ZS2BDJ65& ziqQsRl{xPqCdOTHhk=}h6nuG@7i{^LlOAkAoFC)%aB9@XWz2FD-*uvMMj`8k_b}Ws zjEinUzx@?C?rJaTh4BR|D}^x?Wp)tz9GGXg0bZUmY&p+B*?^Q9`8D7yl0xNvY%u$< zu9h{`#uzq$$8d&1;EE*bD7IbIvsgb?)WL?U>WB;?xGoyjB>oPOe&6RFeGdp^pR(pk z(|(@E9T-I6}aDH?$7%MH&sk=AJis=Q{>%ijtx77Eqd?oO*z{gEjZ>+&RO6qWX#0T zrx3!u31)vOgS-@%=5n4mvQm)p`_Y^JcoPlmE?Nc#?rDVhrayO($dRu+3eg34e=ab5 z;<#uYk~9;UcrEifURXeftBgZc63)q0!LbpCWQK1V63G# z^&pTY(Ab_XYzW>~LfIG*mUcb(dF^w`0+qe_fGi>GBBf9ej|5}QgAMkr%A3u3OMF?F zEX@v{aBx%x;Vh)`*B*QD5Nj)*Z{;@nDLYDDu=WI|T$v|6HPzCJl|gTIgAAya(CO0! z@NH={KY$u5hfbaoleC^1O4Bbg6r7y->oYG0T1%3eH!Qokjl9igOb8tR8z1EYB_nuo zaHgbF0h-=XHTiwg0?OUg0#~7dDL~jFMDNOwy**rH6rd`Q)(0ecKYxxopth96E=n+; z$Mqju-p*&it*SqM$XULdvquL58^MW!3Padn)WfYy=VeJ`ll z0-2VEsE`mE+F&@~0yNOr>!my#=G$~uQ{WI|*eGfjeM?~{1p8)XSK*&z^ZuR0gU+?% zOK6=yn3%fhZEz#fBzFw|r%|$KM>=A!#WlSShXsIT_Mz~9A|7p@wte5MMV^4ORge!- z5IYqi&AVis8IYo1E&+Y#902Pu7|+1;oy>G!LzddSy?}@*mUlYB+MZ-s3mKUTVv#f@ zLQ{0F+6$mbv;V(+@%Ug-+$N>_Qm!klN(*p;~k^^=r@=*bG-f6{qW)Z?Vx~Q#^3_@oiQiRa-lf*8HiI)Nh=QmbbPOj#C7? zT~i)y>l>S0yN`X?0eZB5;ty4%DB9y@8d~Q-Y>M@P(R7TiQG#T_@3&NQD#rEWROq|0 zBVJQ1)BK9uk^==V&*?iSFMK7@l^*I!JlspFA`YO*r3# zcWPZk-5Yp+8pDRMAt%5BeEo?X4#+j)HtwiJ7=gaTg+|o5s3AL^xZ`6y-eNN~NUr;> z`@uC_$Sb05PZb$#{ea+Fj0I>*MT{&7JixA1LmILJ$G$k>Ixp?D#2RtT#n=!+fN8Mru0;qno-!t zaRT5}P^AQpf^(N(uJZ0t0t=tSNS?m^M74zie%{JXc6(&q5-0EiEmTjSc>oLt6myH>1zG|{wr6y&QwcVn-` z)3{^EkFSu1fQ8|v1+lH{c&bpsmTwQv%k1?Fi&^kRObrt1qzCfFZPa5^3ZsOmrDvXo z?XC_aF=53+un#z$@a#SvN zdoODok@fo#c`68|MKgAEAV^w6qZP#X*5N&*2#m*T)|o}6Sxne)^ERA*e!krPAD-jz?Wry+jVJWre)8cB7JEWYU19wFh*|wti}I|3l%koD zIjnsVN(r^ou=EXIab2bicT)O-{+?nxTw2;Ytd4fw7zuoZb)u8d^{F)4W3ub>Fy#bdye_^svU%S0?Rq2za+tE9^XPdHHZVaph|76Hoe-S|rP13aETI&wyP4 z<7wPguim}W$(=&ido5*@j+REqXB#o%>o{BGf90qRAyl0HjS^a(k2+y%ykxaFS=;|^ zI_CK2rQOKU6%0{+OPqvln_kDGf-C^r^ggHK_FDbZ8OnF@jh6habIiZ+dTU4QC*kP% z25}h(t)qTm`Wj%t$g=t5j2yiT%&eovG<|*W^yAcnEY`N>Q+HVNq&tj!IM1%~!Iy3W zJ1Mh&4aJxOyI67rT3riQ2^j$bo&vT&L!4KxAX{e zY`lUiAgR#ZZS5h(GX(L!KK5ps8spxF#B?sHZemEBgS@6c1+*}nN49|OV?&{t|GI3) zlMAk}FYj6%hx6R+C*JKhV0fOix(?@g+aGyc>q?MkrHa^V$u#b0CGIX_w3KAAq6dZh zc?R@;+Ou-53e9}pxU;~Jejm;^k|*+SP-!7tx56^dF;4m?IQHqOx|BWEedQDSItC^5 zIFnVm0MVSX+sFNr|KwSbM4Lc58(IwQtx5RyKZ6Tp>^yI-DMdFB#Vn?KH{7xbC91&2#M(Oyl)vbg?Nvhc{OMGW-KQ+iXZ z#u2bsBd&cq!Vx{IaRC#<3@KX3JoMa_Uk73br3Mp z1No6Suu@iM%4+58mSU{VvTTD!M|DKTsw@f`kG1Wi-%9~X6O$;%*p8(}*!p;i{HLfo zx!ZQX9E6SkM~mvvnhHR^IlYc#WxkFCac$GCx}bkx9fzG(=m^QlN7&SYb58Dqsy{D< z+pC!d!97-9n_}r7JwD+RX9t2C06ZROlnqlHFc&LYp3-bW^i@H*?F4gmkHEY=?d-vE zhf;A1xup95phciPtAa=Q;xxZy>f(Ie;qP{oXK#WEX%D*ABL4fpN5S1cb}>@wjZOJt zRY)=RTr&|d>lGN_*W4wi{Yw zlpXExxf3m5?yHfLxze6YGIq3vdEvV5AKl~~^lLki9wQphMBG+e@-WLC86Ydu~Na^=7aSDX__Njn1;;HVo!5hl7pmTmvpa`2oU8+d~&&I+U? zS?NTD1u{6uV-4BE{BHw(U7r2EzyE#a`zzp9W}7VN*Evd=9M4mB#A7?w*TijfFcUv5 zicD6$ql%WmvIC!OR1~xGCs%^*C3ynNGjh2%>IQq+2sF($hkVpf=H+{L1IF;%A$=;QD#h((Wg*aPkE8$DJ@0 zADO6&6nq|%EX0tJH0Its^G)Z>H7bqZwcJl;{nGnH@=qWYemx zR6>5V@&W{Gbfwcxg>>ZFR!}QSwik>mtdxM7X#8VXR4lhQ@@lMNq)NkAuW2vg1m^Ol z-VH2#gna+3Fv}tc7axL2Uvivh!+=pPUM!P42z(HOlHFWyj0mih$HHk-m| zaQKSBa)H9#;a6F7OVeJ8whv-P^fo!JJ*KVn`=wnSR5R00%#N#PpO(w4A@6Kb;&@cj zo`q;*58cl!-y?f@^!>a4v)$E$VUdQ)t2Z;j`!}?_n08y3w3x*LEJ}?vV2bplLs9=- zg3sM!Oga%@As~x5sf54LH8--^lE(hW)d1#s3u2whwh>5(;wGjrAS%N*9ZSw{@BjSW zKfir;%aFC?wB9r~35Wch5?j0uUP*C$4#FVGw`p)+AM$w(eZ`_Bd!XgSziBXc>E7P^ zOn>^Pka?Bfi-D-qOThUxL&MPwolk#SGo&)(?``~>A%4n~7b*s82uq|Yi8M1^7J>i` z6-f{iN7FBHZ8D>@Uk7{ilvFXgu6*215>{=;>3BFGDNzZ#h(I!@Km<3A-z&!19= z`PhRT_qJMbcpLfoF5aCRuQv|Yn3AE_v{KxGV&}@Y16VKpw7gEg%8SSX$N&)%3m)%9 zL#GK*^-;@PeX>R6aodJ(e&Y-bjn1aqNq*9`QHbx&*Y5s;S4xH zz-PM9*VO!~AO{W$%6lhY+|tU`%Te|=H`!E4iIxYbTmmCq5mt@H1d*nChhSXX;bCiJdR7>w1`{@*Or?fB5bOpuBD2FnZ;1TuUU)%;uAD?&IzwfA{P5i(z zR^k*iMsb_1Vmy)e%0Wx!c~} zl?Y@WO?Y-D!*8R-?ws19UhrYi@D-q>(J#f$;{|gA zPlWQ871%4v@w@n+_>N|P<6jU*Xw;-)rwfQ}lWjE)oXGjhB?tP;nfFMalqOldTVI(N z=AL>zwYDr(ow?*%fz-U`Bz8H<9>z1uOb3D3-y$8ki$UumX$(jP1g3CeX)@dW>EV{7=^ob9<`#9M;TmMQ2@w4ld{P2@T=!gg z_zEU8((+mpF9)Z3Lj27OIheG3%zLE#OZL}iFL;?)ijm>$6N8+y3{F$8-ZRc&-Dj6) zw|;qU3GkSX_uG>QmmqYa0w_7^u3SlYnKgjoP!lNJ?_{o3ZbC>bLHt|XMd3wfXQxFf z?+hR*MndZGEuQfgWLw3y`=?zIXw`dz%d(6Fxis+*;siN_|;x@W&s|6*k= znB;=EmHlbwnpJIlD;TSjq7j8>CF)!M zb&S@(-JBM8l;~yqmp{ij10N!{*4wbT2y+Q>%-X&XTQS?elDr7fS@*IM`?!a0c2%mssaKucHs0<#J565-Eof@Ev5H`ffDHm+@9Q?yb+YOJn(T! zP!PK|mb;|O`e*-0I`<-8oYE#IET$O2sTyU=;BCpGh`#Nc^PDooHaepRn{fZSD@4`lWau6dp;wW!1YUeaSrawh4QBs-h^`eag&3@^AW*ull=!}lc% zO-o^}COK`mvysalMpi|KlkzI`KjCLK;MI-)@KaoSE5jQ5mzrKr5RT7W`t6~@9}ssv0|Nsap8dNQ zDmwgv?}MK(5USW}46k0qegNSpu`4)hB`hjV=j|+js-6tn%VH&jzpO?){d)8bv!D|D zy)z$&ua+q5>#7n2mx9rZY%1k>~|3*C2JD5U>Io)U|f@-aexWY5b zPPlk)?aD$x@JdDK!9%U5@(0K(@J?Hz1w~(+Kv-tuhci{c` zzC$Bt&K{wm5jQSnPxO%H+Ke&AyQh(_|Ao3a)D}h8>7g~L01os$HfuLO>Oxp18q?_C zqUl9;9amkE9pV*<)u41le=E}ck)jH<7V`9!DUSE*BjFKL@vctXYsaYywmGP zVfSx7TJgqaG^O|pgUXyM0}Avbu$+yD681AWIecyDaCn#{aCG-&+~zhJe(O6j{d_5rAYcs z-^E;kNr_jupy0I#Kel0YxXEzdl3Pml_STg@$g2~iUsitzj*gwkQq`ev5M|ysTMsOV zXljgJX~-oVED~kI0S-ouZ!%IFeQBUz^@++Pj@?yj&>x2Z^|^Om5sCn596G}wwg%*J z0u$a#aQ>a6n|pVdT3o-e;k6FCZvK1nd*(}>q-UZ6s=(TvMPKGOM0*adzaOsc-oU%| zKrC;4@|bw)hRDB9L%EZOEm?n%e$r+Q@7vt6bMPbP+)F*SrPqvhPU9M3J*BTG9rL{2 z2QV;09}c|ExKt)aMh(260<%w~JT!vG;%hG1$2?4Cb0)rYlsB&Mq1Q#N>Ft@5*Oo{+ z$c5=^YZs#(UK?*VHcbnnz)X2JI`o*!=U5e|r**^?QJYTaQ#>%R1%3W7%{jqkqNb}= zR5yc0XZEwHTS8otJ$DB^dXvviog?&9{plV|#c7Kqf=LEM2|(OE6{f*q-_6yIfHY9Et^GG%(rjcU8 zuHwUlqYvKRJa92nvnK@AFBu-;x&6=^QZ3pL+GQ~iU9HhMZE=z7Sue~j$&8r~j0~Hd zgr=noMj-V+fRe^W8->$3(!1X5nL67%N*CBub~dLwGQch~=~Y z7RzG5R`F27;-#ow^>Zd=;mUaiS<#V<=}7#VPqA%CS#`6tXnPosWc54)>B|yG zdSSxx8Cc1~`JKcYL+Q^{sN6bM+!w0heMTNuXNfKt++7}8YJlnEK{dOZ6SG_4mudiy zg#2%{7-X8CJKrxbZ_8xep%tf_--d1fm2vVN_a`cZ?PC7x*<6}7@XMx$Hn)~U0nwBEp%wz> zclf^aFJKLrZA$G|)+szRKV@;|oSjLe2N-`fp(=$-=Vh>7O^xaeSOq@WnR|NJ^SU~q zl}3b?7?*HA%RAu(?8wXb_D4sSj$oW$3%0~jpT%YuWpR(D@k8EI$#4+++$d#w4eX_byX!}Ed+F;NOi47ot9@V#dKIJz99=P8S+R5) z1@su$>2-Fhzmy{=MFc14`Ks3;dU`yiqQ3x*j@*xgMVFc9P^8_zEHnTmY=%iR>j>xIwoA>N(V#X|Nm*#3!TcO?-obuq18dJg*H%c+l{)qh)a<>MW$r zhYP7chcXlchon+U&zZDy%0EAhlbSpskE_X>yP)(vJWy3DM_S7=AX}{HVH9An-6A&j z5!2=h$4B=Y3t2;1->BIVNQ_U;)k|V@Q@~tvf3to5?K)MR#K?^eqaRA(h%-V@-~ufH z)hAhDIxwjKUjn(Zh;rzx+bur4MPpG?IT&nC?G?qs;ewy}b;kN`znq_EAn2+1bKdpyKiep9h)_NE^~u%l)zs zE*;XH!;`b^>KIz=<`Y^EOVi4sMPnEeS2v9VWjqb*nUilF|J;9yu55^A;BsO~&Oz!o z&aQRXtiCbjsX*TE!ci+0?dLgVp#0896HMYd{s|IJBDy-pu8Ti~D?LDdqhLnH0wN{* z;ujdT3P9?oSFI4pMf9s-#je^~1g`*$zH(BtC$}KgBpW^m`A*W5DTcV}c4{iL!*-cS zz%H9!olH|Pcoo%NTpQ0x&-XwRlW_z(hgJ=M_+GYDipfy|M~R<>@fBP%*(sa_LFI2^&0s2PQ(iy^)Npk3rV(UVYDrtgDMe);qu~*8cE; zqgX~?)%5?p2FGpNa`G&=72$j>S6O#Z1x$(qKI-o4j-RzLNx&Jyd{ z)lx!yFkyxH?6q12U$LGQ{VhmKA@1W>eUXbqk(6grb1&|E@u1Eumn=hYnF6o){WG(o4dZk+KdA6>Sobe|33$ir4{P4EsY1FH%-FrzYLTHu1qF=HB+nN9Jme)JfbmSe zmkBQW)h;xpeM#?lU>iFX5^oK0wRPVT@3`v!(_tanD?Dyn_8bNxTpWF5mY+$Bd{t!) zMff2ePLGB>>oy>eetQ)gX4Y%9*B%@SmIZ}-&>P;UIM(3ZB_p%C>|n0|Lv}VJ5_@-h zq0@J%$S&x_$?^qtV+!qCkDFxd$;qJ|rb152YFw8ivp*>dR3b@cc65%_&J(1IqoLsZ zm~;nT6FZm)qd0khn4J5OZ<1LpF>w|?*;qqfW#ArY-Mfm4J|divmX~#rKcof!BeJUG zuV`JC5%AphC&)$Ms{dhw9If!&Fplu0v8Y6KOWU-9;w$LKlyKR^qPgaU)0?GF)^v^{ zvqpsRC8?u~A(w!VM(4@kD4-5}VgQa@xwiS)zxO73NXvc-$SLzMeaqP@kP@$TEwZb3YESNh(Cz8(g6nSjA5&c; zieLQ-Z_K{uD~Y_poymLcMY4&4c9rT_*wS6;twZsVFFZC9C~yOIqTLLQ*e!X3$2MXH z-guyMN&a#}hm7Il52B33ar-1>jmS3vr$!g8yQvp0SEOqGc2)+HaxVFN|p$ot<%G0spr%gnROBmV!gPNt!=aMAv?o z0xWREM8FPS0bw!SQN3cE>(?Kz9eRJ#B_or{QvC)lQCxzUzxiCr{LPKM3Wky zd^Py~y}#-MyUy& zG)*J5=oU8O?LWFv?agDHGn@T&)pMoYA$wIhAmA0dJJshj0h7G9nC60F0`_d(pb2c} z3H&|nS7BTk$k`qSTe;NK= zC*$`qR_MeO5Zk*m-KH|7N5fZ3RNHLZ+_=|JiP3>jJUFM8~t&>nCs4f zvexFpS9T!vQ`5n$)N7USci%rWoE0X{?E0f;9}UO7`rD>-_y-4a{Y_BTvH%G`F$!-v z+qHzOUlx6lKhNz0-{#0~kMx1>azi6%51D2j)GR<@sG;dEO)F~RkoD5u&h!X>2Kbek z9QdKmdyhdPM)-|LSl~$+;*LFFc_Iwb`zUXLQT}A+C#zJjoiQahk;Z1;HfYuV=Z~}W z=bcwyus+`ToL}p$QqMOq-~a_t_UBk394{@Jl2%WNkdNOp$rohwYDawqjNor%_Tq>Z4~-cedN@`r**$vi$WxEyVB0-a7cCbZci%;T^Iq zpY*N7+x?vi?ZeKiz#M>F2NL$%_^)p}-kBqLL$&0F)uLCZ!9Mw)Zv3W3sm;7GfI}ij zK#N{OzyU;x%n4@OV}CQ@u{ZPA=(>RVJDxy3@|!Yk8Pc~^C{?iqOI+?QpGGiatBcOH zaW5|dsm#R$>j5Rg{p96!ouQAZti#qY>(-SI{M?kR<1pL+ZtODf?Ucv<`>Ssc+bb<( z(C7k2wIih<%uGs1yM16~T>sNUI`{$#3=~UxZt4CK&weNTTOI{AQ&%!BcE`rd_mCUU za=Z(CtOznpG%PnrF~=MEMnG^HVgCBBQ%=v{rrX7gI%8P8WE-g!wwQ4*ejEwkqhv;} zaRJ-@?O691k;?8E-!Ib>Qh~Acj9K?L9}%=uiwpO^cL%CD)nL+KnIF#3V8t1#P;A}A zXgFt4g_Wa|JJwKb*Yb$bc{yxl}eh+vEVk8N8GQS)LmsjrY<~cf5 z?q6H~wJJj#SBS}N7-}_z;K!QUe2ZK}E?Fwcl~FQ|b`FTd~Xuoy*e814+Na5iNjfxX{^S zybb{oghhOGxFIKQYE=I$MM6*?u{7(*Ua8>9i#fuh&b7V-X8(xkfH0~BiOf?ISSH0q z+Bi?R8i9#6F=6yG*7Ki;vA{%AhoG&V6r0U#YSP#=E9Iz5+9+D9dT1Cg+RHG{ttU-3 zdVDLyo&D&%^wK`6Fq-3VuDpkQo<#=2|}q)g)8 zsHJz-YC+H>^(+0rgBs82A1Ds1s785pE+k<)^(yqcQNeKjc3dA(_JF~F|NUwxZCRr) zZH;K&{u=n;QO)nuQiCYJkzpDtg|BSYUTXx-P6`0lV-G!>Ja5v0;6~VDIcN!A=Fv6B z1~M<$zRi({^s^~Me~y31rII9|ru1Gq!{AZ9R(6t)ZKA=R(kEmNwc3l1i}KX<4FciX zJZ8|5=h|@GA5pkv{G()M@x!BJsn$}dK7auB>*~;qT!9=o`HeIMrpKdQYb=p6V%=S*RA^uhb;+ zpq|l_8A&gO+bnEEn?Fcmo?QF<@6odQslwU1{9UPa&O$oK-@HJFp9 z$R)i6`0782jMofogWi$^6yR1jEaY^s$5>f{X7WyBQtUPNVa8O@Ru^TqnxyBhd0yr1 zr<&r}#A|P>-n+y!Xw_0{4>mL#^3#4}Q9~!cH$6zWmVPf_f+9carK=l=tH>NOlb3_w zAM2L~(rLK97>OG!`p${+i{T*4iYg!z(V)vZYq}kMscf-~MRhm&vMkbt1m9qO18jB1 zmIY%kI9LCVZ{{~NfH9>>4QwcLjo638KyqPL)T}|A7;eNp;y^>3PU8QYK7N8oW1=Ci z`}#iHCgFjZ>nvj(3=E66nJXx0Ld3d~X9CK6;#lo^3wGED4ilzCa4SX}IBY?ip&h$V zc-b?vC^KL}RomcN+Su+K3g@}87I+2wt!6f1+^cM1Z?Yg?f_xt7t06_|%U(k+%0y6t zDoRjgJG&mQr|c2dH0JP3gw8vr@82lQX#f5~MO5ucvh=vwmISF>zrUxWYOYUiD!f={9VhyqC_1Q++N zriF`^4lcW~EY*-Ys2pVQE)6;V+N&It=M-&+h_wHpLWB)R1^r!Ev8p7wa>aWiJMcI1 z7r4{Rg{g*`x`-GTj@4Tc6iB`S*PqkDHZ<#FQcd7y6t6p>Qdaw*yCa+?5xN3VxmDry z|2_OFb0MS6(NHQ@TCLahyE_{Cq#~~JSQ~V{-29X-IcwiNMd0$+a-kB=g%BSn)DlZ2$c7~2 z?P~48K|y_vt2#iOuGJH=a>*xj){P}C3@!pr z?!A{FkdQI{>jW0(Ch~>}^iZd^*DNkhXQp-VIMhTqW~8}oqI#eWhL9z^Cik#4g*IPfR=s&`tZd-J{Y>urH1t}z;r1qOkn|Fv0iYRc<=@H`P( z8~Q_{EwYL0;nBsWitlgUb+~>m$kV-Pk!chU&s7ugIoG=8p5|YZC-18w%z4@?Vnalb ztx%Xy-sVXkqKdwh9TYK;p8ev;t@{^VzTA58yNBoU+e%&*+$RmZ10t37RBUB?qu;$Q zfj7Hg-pbpKUaKbXJP2Q&5Z3kd3AenAsj!%9_O@FOEHZdkN2SY)_#`@~&p49r-|w|$ zg22Q4UY^hM3$owJJvUjLaP}sPnDf;C&X3N?eJDTt-PR_p=||sgCd#UO39~7w z;yGWmAdDqv_3FRB7SG>$He|)qFAvP#PU}j4#kEqcJF%<3H2?dYSGJcwZw*n8D8IZf zT-(m-YWC|jy{~?*6e>#C^Y7a3a`Pp{%C~>Ke$o}R=}-7Q6KiX$o?9obJ-m4H=Ik9l zOFVY$^uGM+_!}qP5A|Hj=gWxoi+)CncG z>wJIT0~X+K=a;>^z~-R9(3Eh9TV$HoKI32h84P!lr%9HJuGxL{%8UBGx2eA3${TL% zIkxz(Obzf(0*{HN3{JqsX9AJT3NF_eIHUpJvk~$Nj*wOH$6HpYH3zRL^@kZPeVaAG%zLI$C*hQcp}fMnp6)FD^z#Lt6Jz7~yn4+&ZH!?RjH)di;R#irHdWKs_RhffbRZ>3P-rj6y zNnA}aTS`fGa#CANIcRWxpo(MZ=;vEXLtCckcvN6vVQFe>S4K-pQC`y2)Q*>>w6nG)1_i{##=@(D3KUCK zMmF)h5!(F!t*)fXlJ(ZelLdhEV#{@}7TZk?Ktb=jsN$BPvZ zN`~^tfg7ULx2lgW915zMfC&qqS05Ll5eO|hR?EMy;n1$I$=r@`KHjEGg)kp{Rtpza zpL&?DpLhq%;__mYxln|uX_2GVrfjE45J7;lG>FHwcF%~n*sNjdm4j!$g|xG8EPP61 z$B&u9hChZ@DbbgHEHJ5HM5mNyTwrXjSxb(fL2ac+TE1&#rNucv008IyNkl_(X@Q zR53_D!2<;cK^zKNP{G9y;9!zk)3mv1?@O(1y+1JTQ3@jcb8gZ$*FB(VnRFVOPD9ga zXgUpTj7~$7&}nEAIt@)?DQPg|+@6VZWH6HvVk|m>D#I+5Ez~ku<&tSYG3sep;oob{ zp=@yrav3Z|<)31dP@Ab#qz?5o&@$&{AxI@%sMoOQZe zy+eK_XGOtD6_L|f?gb)ue;hcKUKHz49JOR05OG~iSa}Ac(@JU!~#EK_K zO742%l4E0t2Vql~>BXS=GI;Wh`ZyQ9`DqxC!=);WRLNaJ8nX4IM&z0k=N&cKin13c zTqXy9J4r5P`u_GJhPtP59{|>3)AZ4;U6_>VU~CF{2a&F_qc`6&Fyeh z!~^Aelm_*AbVhRbXw*(0dlWzGP57)0Wr19Sd`S4zD452heUlzZ(_mR?Y|&67Nh2Y@ zK-r>`_(z4>n5j1)>Kr>7z5Lt5LPm4s^V|1f8qopYM8{ZPtP>m`=l`YIv-YtG1w^KX%3HQUm3>VFvG-V(9pR9qNQXzr|_vF`Y*A z;6|rmfsE0iHjHai$5@Lr$~YlN#>N&2l#7SK@I@bc-QSJUh-b$T-~2Snd2f=ZuWU`9 zytPQ9gp&k$qcW(5S@>m+aR$xp`(N&2gyW0BCk(ww(umGYL*0x2!PF>$j3CcW3rMU* z8YWJv`6Q|}`*NFzT+9$w@a*Pc?CuP%AHp8}IK{h9{O#_Sx2KW6@sl+8*XHe`_RgR` zp2mxB{cy5uhY7vH4Pt`K1De)e-e)MPY2<(KT5%}mHylYDVG2alymcVziupmwcRb0`Rp0XgBZO(OS0c{!K1P@Aa)GnJ!11=3I;PoqlHs%l^5 zNnA#4HU_iUR!qZ;>{HtIlq=>Z|UmN~Se{J~hGhw#6@I`%9ZZ?SN zn+=u#=Cy9ODCs+13t9DBlnUM0sCQ5(#Da0FmxjI_`X5>S+oAO)3jfABY@(pIUimjl zpkNI*Y|^J2yJdljwcO^djM_@fj0J2CnU$-t>oWBD#;%y4W+_|BO5V2L^|qmU05`$K>fTOY8O!YP6UuDt)9dE}6f<4%RUH11TmOXE(3yEN`pxJ%>C zzl4>>Prp7*n{Lx}($?x7LpLa2l`oMO1Aq55FeqKg;5ZIPFnM}m9~fuBFZMYjTI5+d z*TJvdv4mcjgrmTr>OACho8__Zb?k8AxtvGJ?Gak&IU2h6P|N* zpgEqRF1#|H!<_f>s;Ug9jZzm64-dW%>d3|}n6YCd3SQ?`8p4B~=(r8${Zbi|LtfMK z^!<`Fejaq}tAutq9`G{(zFOn(ascR!XFyJ2vduNft1nD2=)wMdaFU-R(1yx`!k}kB z8JK7gErYX}q0@qvT8D?87r^OFc#Z#D4EZ9|-GVLxUuD$O&vj}1w&@aG+(@AlpIwHI z(x7j=1mDm{^b7=rG4LwnaWm(jZy4uLPne;1jik*(DT#I{dKojh`8^Tdm{s53gj%;kp<4<8;#W$bjlD}1kK&z8PNg?>TD7|8Ma ziZn)OoNr{6;2dxkY$a-3LkXV2bV7eN^V`{LPciD~eU$7GO7IOjheh*#QfExeCeDGu z;>^%bsg32)lRl508t-SA(maB23<$EDm&Om>!^&9ai04l$QQAgg8mTtsT*E-snPNY( zCz%@9(B&R3H`T@~U4uXu`Rc?dgM3it2A}GB$VN{xP0T}o;3G1n9HTIZ8^I5=()i_p zDqk;fyuv-xLevYx_=X1=2k6K(a|1mtuRWp2DULoBhX$3fw==6@ougtI`$8E;!<sq7ilgllCc>0PQ$9poKZl7%7cxagxrarRE!e(s1+(Ox1p}Fpt>mM z^~A7AUBm8d6e|>J1J|OjW~n${cLL6bPHpgwBj$*n!7yZwfkw}uZ=juvI%9UXYr}kU z>AcW4j?603dW1Ri7sipAsOthV8yKcpX=FNIFJ`aoJf9$P$^{DZcg-}?EAI%dG!3dF zkSl{MR2qUEDYHqQQ;6N2DUG8V7oyc|!1x6>t>>jt)EYNKb(oy0RcMh>jBn(-8kp~5 zjD>HQ-Hj{MLDx`>YuL33_cV+$1nR<4`o@NJShhQgxRhfp5{5a)z<7}YtJ0ujxa_!6 zD{4jE5iRpcfa)l1qcg6N)iN6gZR6eA*k{@xMjODoMplLD7!8~kD%;i@%5;36BIX#- zQi5Yd7G2}R+OC1fuk1>#VUFlGTdItJ<9bd43s&mU`zTpJWev3fOC=$vZ+x<*6SxH6~E zF>FSmXQ1ak=&9x!m(8Uef0k7c*D)l${`)u%I2OAY<{JZb*NF2@R`v~E*UPnrU8C@m z%w&ZP5>Lu^6-(b>{-~3xA_F?8R~og?PcE5EyG*g#7%sO5_BMkwtS`{4XVhzrF0206 z!LCp;WqdWJVb&XHYN3a4aE98Ud*QRu0hXumGIza>#=HFOQ5jq2Vw8a(4P zF0WawZ%`Qk#?8#PAV4;l$LE{iA-f;A-)d$)IQ73Qj@ zG*V?yAA!_198BU=$IOmm!&+lj7YA+7gtTZGqpdL(u(bw|S8s}8E`G*jT!T5K!8>Uh zbhuS$H1tvYLF1c%JBq^Ol1o-7#kAkP*A?M4fm~M>q11$nV*NU0btu2#MbbLH5I;1?%W7hILhU_L=frLifsG2hHL0>l1-UgLUtLnv+Dn)z^`&-?;o z^D$2)p%hxbF>IM(K6jl`*Lc-Cs>8SjZNtFtX+szwca4O-cEUmJ0&Ovm>=6C|QP(&W zwFacI@EJ;Njy9wVG&90z@}^j6kj_x|jG8p~txL_5w>BI{Lnyx+T6zXUNj^t$d9~xG z6DD}IHRb2>v!A}6PI6992(CxWYJ@^KGx&3xQPefmH}ZL8aE>_sG@m&4(+E%t_0|-0 zCiLix1pm78wMOEDXe)tZVU}=gt{>nTwgyGKLK)PCu?>z9%^bf0tU^6zx0Bcf$@2{7 zqS<1DuA#QEkWisauet_vz96}!B=Uk=8G3Xi?W$VvQKFZuPIBx41bPYzs znga}`;hsJHV#zbiKB&6xylYS!p&@SWnL+uPIr7O=QL1Ncm9hp0VfC9Zy)K}JoHKr|&H+80L>qnlJ~?ZR%-xFoSM>}=%qNWIl4dlK zw#{47)LesVUlqImdkoU(U#JY+$cv|cfon`~4b_ISQA~brKr3*MT=z1t5K*WK>31Vj zNI(@4I;#$Oj+Prz&-RCyQCgu9vN0MTtrc$%wkDC z3DS_;OP_lNT|;rwn4B_7-{{ig=lP^Pwn?o4f@e?{tS@%b-~&5pXO~0Hl*Pv+V#Tqe zG~gP-)H`K}HU?&tng>_rh!JUS3}w?upsxg7w;~OyeO0f`0VNf5!{zabh zrTi~Rm6_LQ6qv^GxTP`DnJSeoc>otLRN{2G~gOs8LBqs zG>;ID>KdtMc)wufxpRJ@m4!2mCm-M(z2YNVyw{xKs|_4aj;*c{wbA9d*;bvFCYvjD z!P{d)&p^NI8OyHGgj|HKxv_Ow&8=Jd(KNoOX;2#kKC+j130a(*2F+~FEKCE+*lt6m zanLd&Y=iG;7v3b0J}~cvIK5xr630Mr zzA6pRth+|k#;QU6QyIFdWTj!ydIJeXwV~Apz0GPqQAWEJZFtu>^ru7O7(b413ondk zH18H@An^+eedF0lV~o;x>_r()8jYRDIo{0sE5>DKsaZ@Y%u_+fxAjH7q-kiW0cTKc z7-@_z&NV<{8)Ygj%M28u;JAfpJU%|6&^VlcW)fWN(JfpeaZneA-;FweI{>8NYK;S3 zgSNq0ESaC*g63wr8Z)okfQmGzcZrq!BL6fX{ib)%e8TmKS-&!)XtlvHa`%R>09tj8 zScM*fXUOf@tyR@8xOZ`$*TwH?l-k${erLmJ<5861YYm-8&Z0@RxYfPl+s0Cz@wRKA ztpanUHH}_PV-#&f&V0CsHeegfD48~z?CN5jfe^OB<0L+RpfW&k4CsOj)QT>CmqsWL zEj9#Z6j6p~gQmeT8e!nBt5B^SE~8s&%jam>HI#1kP}1+^p^Dh+%9WfYVy)q_P59=e zRvXPw8>7+!S7}I0heuIH)W$AV1_G#K%(?||3SrPSTuKS6SE)4~w^K`PEMBKw^Z$z_ zY0wM54MUsOpeRE3aZiJ$K}IZ6^!s(JHrk&U!n?j8go!VPL3?k-~6n+wCOU z=$&g&8_!V~JL&>0%_4Pe_+JBN6qSY)yrK+Uy(a$4T8nY;fu_Y92}W8x3I!jv$TT8V5*&8ym}K z>08nHo5WRgZ@PwkQ$gYH?K5SxLaq#)cvcx%sBMh;-+4?-DL7RAwn&>TT_1&m5IqAt zXR>%&$|Ijd5ojTl%r(?D4o(|eL0u!OH`wv6K5y63@e%JYJ3oBH>#8D+Z{`~~=AhD; zKp(Ur`DD!0Asvg2m{DjOI?76!5%Ni48rbM!^~sfLRT$I+z`e-Ch$D549@5|%C1H~` z-2TVZq(Nn@s*g4ree{f&PsY9Vj3ACt)+qURFDK0?i2AFb(hy~AQ)TR^45N!=Eh79S z;dJo{ig5Rzq?3E-B~2+%nc$>ximnlSV+~q_c6`uiTY*jaS_`hh*9SNCe8_b}o8=QQ zM$a^5aNlI4BF;f-E2m%_D!4Pp$#{&XE@zCxHpYvwZ&S zeAyP?WNUwOu|9bGC3u=@359tw8PR)t8-o3R=|UK$(l~qXcot=h`%rE4g*NDKs=UlI z;2PZ1u*#rcP!uo>tu9mz2518^G8qM~agf)fYanJZ^TbD21g{Po=BUfGjG8p?uBbH1}gXN61`5v~h53(`v&w zo8JE`VZF$z!#)R863VuXG^;g&C1q3wP2*VtiXgAJxt~Kj>Ka;!R>w%TrquX{x-;f+ z8VI8BUqDnT(o(q~RYY-6A)!DJ1w}w09a2O?K?<%wwES`2oALPVc<>%1q2P@-PVPdy zS%3RxHV`wK#=Oj!9OLdT+`>0Bqd~IAUrcv}ji@z11~ltmJ{NU-E>LgWp+sgis?w*P zYa}+V6cXoiS)Ygur{m|3pMKxjNZ%^0Y}6yE(rC!oFM0;K2)B4oPr&(iuV72!Ps}!$ zd*W|WETMQtAsRKK^rM{PGkCa4X!JU+@ej3vp0C<`0(}ZL$i+8lbPcL;4UK$J*EDjS zadIj=kKBE+EJ3ee6A>Tcmd(W)#BBqw0WyLOEm4e(|5;tvxNbHPkBA_H8oz(c>%uqL z>-?V$TElMhzQ@X=R_sCp-LSpcx(T1 zMyXm&t%iPAbou#Fowk66h`$yf5?`DDS`(j9#=q8d*B}``CNQ#ZOy3XN^N)~>`+Z|6 zpEwxq8UO=iKwtwG$}qQl%l+kZH7JK;xIe<5TBM_?^fo zD_4=>T-*_h;3D846=-C_;_Vo_K!b4HfsLjPb=N3s6lekAc}N0-BZWJl!|u7n2i2)V z&d>_cMT63@xLvf@F{$T%&RA(c6B$2pKFO7+eJ_=lNio~tXi*|g$Kjq58si6{kx!tB zjMM4#Wz<)O$Z!P{F5V+CZALk{ZD{ohO}3$a74K|oO;>gayo5#8iY+25zh)fgFC;=2 z(NLz0BV3_Hn9MW4hF#@?WH=j;sE~6c*C0?nMw%}g^n8?=Yg96XhNuu1I}dR2a*DTn zEH+q(F4v)QwcN*g9weH>j0nEoBWof=ktFIgQU02b9vW*M>3U%j8TdDOZ~%ZI*JwS1 zs?~;F?K#F?DivJvj6w#$fK+7|7Xm|aw|MyyOqj?96e%Up5F3t0^sh6D1&Lt!d1m6q z#Xa7)9yd~&kxG>sE#2#~x?Vs-GxDmT5uj&4bPbU)vQc~kMM!fE3yeMIQHNh0Wn7;O z^Gd_X5F5!aj_wyPe9YOWnqY@H#%3}qz z?x6ASw5IsJ{kzE|gKEiu7Hk8W=FPo_sivXjiKCIhaP7=6cIFq7H2KCC*@oEY_OCxA z6sL?tXXP6}JQ;7Z$d9s2PvKUGX`BB{>Y<@Ic~Q&KyfE#l>>0#CV6Yh&1&y`pjV^!C zU|_VLgjzaLKH;)NV0d-08{J|TJbXkr7!0Bj8HMFa_y!I$_K#W^!{Qd=B6wh)8~3K@_bBP;s`(I{iz14C#;Iyr4l$R{|XIh!1jBg92E zjF04kH)z>5zQ-CxXvj98dk00jaWFJA_ba(aqbr;&sDs9uPx-rZ-*1ShxApdCpJ*ht zE7+}HX>Xc0Im_mzj14e6oj@cbJmc<^$zbuY`${f8sJbv26(M_MUh*MQ3fVZ7YGY{X z4YoQ?jFyW&7Ejd*9{Yw4wmdFL4}Dt-`B)DP>Tj61f1fIE%HQ%*p&^B7$Tl=FO-mCo zJVT~2rISM@LyocA?dE3q*vL?ej5 zUep<~Z_wD9Yit6G;vBeO5^Up}U;Rd-p)6aD5{@wp!~XG9X}t4%0_An<5oGKv;0L~$ zjD@+x##d*9)dm!3h>hC2+D{J%?#7V#y$HY7Lk;|fM`2U-5yxZ%8#Ovgy}MaJL-fV- z%YJ=^L`KdhWMiu$RI-(qh47$dl zxW>WAAR8Mv3!X_&ZL9Qk8!pX5fH8T-?e^UkT%<}vo&hYFOD4mRTfDLMd2CT}Kp%_^ zz6f38aGJ3p-!QGTFLT5~U_8YpDmvn``2Nz`MaLB%#W`v#pR6poMr#|XT`KmP8pg4B z>}0?)luyXRdu-yve!E2_YV#%L$e;|Xreh3{ks;Fv&rm)A7e|^#fI-nPUJHyjj5nV_ zhS-2?1*`RIt~QK~;v97xs3CCyD$v=gZ?RQANMgr3%6aT({d-(vX!GPXROj=QPqrf) z8w4=e5DZt)L1y?{C!=8_jRL~Nz7PBzL@uaXeWKy6AvEY2N1`tj zgALgR=@_UWw`39dnk&prYOV)UmDtcR1CBgv%9+%?+Fb12f@>J>g^b~nRy>1>oXU)` zNp|5k2R0{zqv5_W%@BG6S_JP06;^+$&e*U9m1m4>9KRf)#xr(u3=cqo%^Tt)TCPNu zQJjtTJPn$^Y8nHPVg2Mtu*oZe3*GvjEfew>BZJJ6XANSV*{F=veN5tE!8M3GpCJtl z?#|njiZWT~pbmz)#)cFyywDIGtVPL&rieyB5*3eI-QJQ6)5(>{fackR^7>+Qj2EBT zT%;q|AR6uZ^^n+zGsGs1Txbl~AgeIMMbcr`BtCN*m1*V77Ic{G{AE=xWNcm67>u~Y z#dw-^@2?(*XTh*-NXEPH43Z%>OqNgHMm`z2 zh+N`&;WvEDio=xGua%9cIH;Qxqh?%GDt>MbRrzYR**h3eVnZvIp-)A2ftz6o4U!&2 zq*$N1&$YmmUPT5JEQk!;IoLLOsn_K3{>es5$3D3Q{DJ}Oq^!q_mQAj<53Lqxdt35*zPI)=c=mBum1(5D$R zjmRWUgvfB;P_>aO(aJ`FLw+%LjK!-*u|*_p7@k-1*a!}1W6*jOMF>h9^4hGXIS8H16X^C=-n(hs)4!t=;2-QpdCSm?8^Hk%w<(-aVLwRK%O@2Yu`XW=|G1rWa>K)^7I320#P%hvn-M-I$VkC9Z zhzjbA=xRT>XHfb2IA$6^L9XFp$ZQfDq$+4&8%iR991C*{ks;4er9m*{8sOp=Z|Bq6 z#uY{JLMf>JgD~ESegj*$3(;-mEbOR77!nABRa+P*CT@*QL>AE|pp`%?BZClzfHy`9 zgRvL-e!b_tcYSnqGt<^;d+xk>Gf#;`{C+<7zL7N9#YzNdkPEUQU?40Td?zKmDi%ds zGjwb)G>=FF<4N8x$b?n;>Ciz)hj$L4QrSR>5Hf(T4@d?AWE8l@f2FPXTN6ds;BO1K zP%2cKXZf#B|9-FbQ+<)O4HrI}K#>gQli(Wk4B-G=NP8JWj#W%4dfiJD*nl#yLFe%P z##G|DfH3!k@_Z!GI3QcA+bqD$!gVCgJ_ijr;C~}l1>nMy;eR4B!ru)#N87T|Mm$L} zNv7|zI>%7Y@HJ>NvH>!XOyCh915AW?_Y$*-+&SuZO?^b;T(g0q2A!{OR3HO zbnMRu&(C~DfsNScAB->#f}k8UFoRBylUn6(>w5}kJomDXEw0{V8o0{9vdp^0ykkT-8bZhX$`xd2m638u+@Rnb z5U*|g((=A>A!NuV0HpM`h1iNMIY!&np3EbT3Lc}2XFjjcH;6{C4bCOS>k|y)@40Az z4x_1MLC>5b7--yxK!ts-__xuX#ZKi`!LV2)GH4ofjiyM^*xe2J#Cry$bntpPKV44a zQ0ovdL<)(jZ5FFcB!-IueI_z0e7_Q!GY)D72_9f$Pi;9g;=wmsRnO|q_ypvR3>ii` z=zKzRO|RnMSjbiG5*TK+iUz|-YQ&&xC>rm8hLQm`c0wo^tT!~H7&a1=!bOOTrEwcb zL_**xO2!3d)qr8S_>2urceD>|rs}w$bKteK*3m40W)$6meE}NiS69vRC3T%^q@XyY zIB0N&=_!?7MOv>{lfG8#jVhbpf4^yPsDyZyy38ZdD%34#84YV1unoPa5j{gqgIv%x z?8Oc18wv-E0|Ew$NAL?!;c8F%g_804X@4H$^EnPlhqI1o92YbW(BYh;NF<{OjSU;d zC9vtv4&z82f)neVq|&_{+)ZxA_qWsg>rt=Qf9N}(SwxWvL}UVu0v3pdu27ndrYOC0 zB506|oxsMCglB`5sEBM34ylCU9BG5XdAf2hArmQK>dq&fr)Yh8e}4Wx9KXj|XcA-t z5!t}A;dz4qqH_*Jv9=H%4d~l%i5b~Y1Mp-(aa4KGO~Tb1QN8hXcQhVMhp$c#w};cm zhs!q)H9WfMDvsx)LA$VOpamVfS|hN5d=lWGXBaV~xSV2*L#qxb<30;qAd@)9Fl0dQ zTLFyLr`OnHAZ(EgiZuslQ%~|&S9JD^;eb3EP$Z4-PFUAqj$lB}8B88A9@4$Oo?Jdo z_p{TthlhvT+b{O7I``df&tdUwIOrFwEPOnv8PM2k?gj0NqG`k`<3br0VE_yW$st1AKrq|V{8ffdJd(U|oh-P0ae zPe|u^(P16Xo~raFgYoo5{dD_m|FC}0IjGm`2WuzWk0bSs%EGH$7>1!DN6aV8C?G>K z3Un0X=*am7WOK@FR#7_02wURf!f+84W*l?>I#SS@Z88=plpO>zcn@T*RV1sh;vgHC zb?pmHBNq+xT+-k}b46ytfv7}Qm;-1mZeA;Q_g9^2d8N}iJv%w69;}y_m%dx8zPW## zt2Y*aL&0d|QgMuy$UuW48GAy;u7VL=gQ32`Rm#`caC9gSnY0839@YCB+xh}bfP&Yp zyr6r~IdD()kBJSrORJ@Fb)|mxrdnNHKdYCQzAKm3JA>ZyK=3a!lS7&=C_c`Nl3e56 zY^`y$gN*Xh)ElfeA{&j!23A9X4Fsg_p^SV)K)ClH?n+56G=tDD3PLpR9QaO*gmA}; zE3w{?X4ue%AR0OjGV)x*`-ZMfV+6SqO&+WvCA3pNs0F`{@c zpdz)jMH%P7E5eIl96zS_bK0t{`MhE?3|*sLxR+8`UC16R>Rh7O3?C7lBb+2-yn2P(cuP&)7> z1bRxV591ua8#Z7Y0gj)@1{&zt7-CN*(3F~XJ{t6m)DsGZVS~AYwWrl4$ml(;m#^+d z{hFvJlB?wX$#`&|or-akU)16sTUfkGVaY&?Y_KjR8(+Py;avk{cs3Fp4bahuaFCDf z-<>`gE{gI9IY^tHL##XWe_a3@$SR2q`i9P{(MF_0K>;*>;TrUfcl5P^k1b5E1M#`n^GHH-%N)m<<*q|#(>9yQW$nI(U|LS97X47uqD~mYrIZ=B&OkA zgW@;n35U>e+#nlhK!h%G4&~Pu&LIk^NmAeV1UBd!s7A#$W=jr*0Gsv@O(O@5Ov#X@ zN0mIcu=B467;&x-(-@v^-++uB$cSiw4LHa2WNo=Kl97LbjlErjRTzWl943OiYcQMS zWE2TyL*W1(LCOaS5j{bX;}^etk-7!FV?ZL$Pm~Q*94UX14ZuO)(6AbAw1=sB$VWrn zhlJ2IToLLkPnrk9V6s`;el;B>G$I*r4MC$nxf@)qFRzb<3dDjU5S|a#9FB|mj1r2C z#0F%qdgVAr^T|5sA4ccL_HM>xf)V)m2hQOu4rK!Z88)l5X%<848kp|_*Pw4iS=XTK z1#;rS0>suDoBjR$`+mQxt|6nrG`juK_1U&)8fXjXxxQ{o~gl>E(=UI5K># z5d<{UFXDy(8KF7f02>HAH|Q{Yv|6E=JJym3A936>;NL}=D4oJfaVt!n$K$cF#$NQQa?&Y@z( zz#1cs6`(=y$-HZ*OOOpF6T*QV2RL!#H?IbxQ7vSYB;*s2aXr4gt(J!Hl48&BaCikG zb`U!|AJ7Lrb`u@mH?ZZo2C5B_^nQ&(-*~r&`!1xm*907Vg*h2-NF-3{+|(N_6NW1) z-#32Dz=muyT;xSD8lngW<%>?W4pVGcMvP&E-R0TahwD*y-Zj9+_08b+pqy=j4FtAg zEVO6a)bkHJPJs@`22F!iD5PYB^$7(u$Oh>MY|IISKm6Q(3+FDp+pVoP zvWx}C-%*x}M%Ip@V$~VNLW3p&aqs9r(RtJ9+}=(4!89-u%Z;8Sl+oSg;Ob!QFb-}m z_{sBx!_OgtK1iVEu=R$oLlq5y1D>NR6lpO$8B}=QCq$ZYU(5$^kjDPYZ{)&w#*A=I zIQZvSjrz}=Wf2aaQ4rFhvA)c*f`k%8^RTN_o|zJq=Nw@Tib)@L>Q@1cKvoo7quUiU z9)|VuSz5R_)h3gEPgcL9TKKNX&A5-3?N27%N-d1_NAj?iutEidedv=yMLOpjhuCNu zbd8tEH7GFRJ|#*pu-grMc;((r@M~lA4tjx=Nhvm|c;8SqevA{#d_YFnCuK#h5jTyB zsWYTO4iF3(IEY6=<4@MkG(^2B4C5anm?>*2X%qSqL?6n6$xj8PL$nf21~y3w)nwUB zn+0JIbZN0{Go?YS$QCn@hLN&@q9}s)J)*rR+9QUdi0VVndzSlnJYHMqdGFEd{d=AH zbAR)^?>YC}Ya!WcZzwd7Q*5b`O3BDZx86*~D%LfyII7RZ;>~KJpB&83Z!|Hkp4uAe za%Helm8!Gb=vNgM)&2lyRO*94y_b%sjca(mQIB=&3z?u3YtPr>@y15KwM#DuvXxG2 zp*@P#=Igt+4T2VpSpyf_HhmaFX$Ua6Rttg zH7Jh_$eB?DHkb>dq-^DH(V%T;G?-D?0ikQ~1+#_P$Xa6%PqsQ6z+$t75stwI?4n<9 zVQ%QCH)_;Jm6%3j-e;qptR+Ut8qi3zVjcP5&D{sVQh7eueb`SgRg*aXLJp5wJZe!3 zYY2sgc8*Jc#+t4-qz)(x5@lKF88RXQq1J#{hq^PpY+#vRH9nXuU49yje2jiHLS!Xp|IF+(MaV>DWDPTK2o2X+I^JDmgfh%)D!ic z$_pDI7trE_$i^jb4YDCxwU*(U26UW4gKT)NfiPT?$hgM1Z&)r?5fQFI(K8&^KvO{;wCu1OT_j9A>Ry6a@tT2yuE8%6 zJzIz88)lJaoI|?|T*L7VXr^z3V_7rN@I}Y)GZJI=%nUrtxTqvEH(3^&8@9$vS-NfR9`6V1SEh)YR4^|wPMXwHa=|B@H6W>h-t8T zJ)AOdfDOoGl(5_&8_XvxHAsfz8oqC6;d!<+K>~;`P7QKrfM_xd6BkP8RoNOfmU?QK zQ|KGoHiQg{8H55DGtkI~Y*CIiI7NpN`?U@lW*=shM5ZuA4cgw?YV`&Ulo|(D>-9z# zRE!$!Mt!9;j4VUropdu0G!o^C>bQ1yX{55NpikC!s5)a|M;vju4kbFrF)ka&u7U^c z7?un@7P@B8fX1na@(p5fob2a@M+YL33@lD1Dr4&i#fA~q=o`~A3c~QDe1oH+AOjJ) z27`<+PfSMxa_C?}@#Ga79vTqQ2zohn4yDr`NDUe!4o-FYwOXgU)!nEK8ohEa71{ToQOu)&<7;Lye4DsZrl;q^~Q26Y_I zui0lF_v36HLesMAE+5#(vZWp<7NZ6YnK;H-g@gm!lx+wKQ)H&8h8ZPiG763?#kxa@ z_2mpSEL~`jJd*%E>mU>6wS$IQSZoBF!!D4(_-8f14nQO5q_CIn#CAuk^~hQyT}!m$ z8=YhuAjD$nZ`NF0}#J}bj+iEs@)mbKYK8qq{qG^&BH5hyfr4T}ch&?_5_V7^-KR2wyUQ6CMv z0Y0JK)<3dVm+>yT#{ODoon^ek^$lU;>;6xw-1zu~Ur&BM_=TPUG}b~g2nOl!bfOM3 z`zKnwdX|7t#KR7LaNft+zBsxO`L&XU4G3T$rD!DL}v zPKX8x0vNK)cboM-SkMYmKtmFXkRe0mt^9ywAR=W7T*9MX5+%ij37-w1@xjNbkIoYg zLNw?ZYfhyR?HcqA8*~bu!*S`5@I~)X!)9h^EIg}!wuH}y@{?2f9WHDp6ItItwIOii z1PtFd=pCd3?}$c2=up<7MU(JOk4$D4LF3klT4TO58g?*Ft_R9%KqJu^$m^iGfw?@n z+`x4W?(U0r#5KAGW!YF9XXE=+KlRg^MI!|?=outqN~tl;HP{?3I8-l$c-}MZlR`G^ zq>o6~uwThwT*Ku;a1k^#8!~MmR@H^OvXG zwWiQG_W4xz%OH5+mt&9pKJ^R8_&)XeG2f@2tp&kHpL|sfQXl;q?Hj&lkc%^IEFX0y z9kUX%8{!+2^#;AeAtMS6!eJExpu-*X zBs4^WuHlY(4L0iou#pne7!3N=!RBVCno?v8GsR(GUBichjZVSog05>E23b0oQv?m| z8n0HrUHkEcpVroZ#%D+zy%ZE1@C_VV#EK11dV3@qIVYni5edCe zJ|IBjR#Y1r4NCW3aW-w#z%@!$z|kI+3%ewn1I*UI$VMx(-s~7O{Be!w`hpv2A^RS- z@4lK14TtKfkd5EId=#Z9j`-S|pz${R0{ZcV&wvK%3_$}8NBHg3PdJ)y6Aiis>7Zv= zGOSPdI#b$okqtS2OExqaS;Ir-Y)TS}%_#g%T9P4b&^I8>2G9`AaE-`>k^>u)a`J{Z zCD?NfkTD&N`HgO`H-v4V_N)$oLnS|IY}BL%&6kU#RJ3a#rdtI!a{FQXf(o?IH*`+1 zX#9w|L&D~_8ja^eH0T;=IL1H&M-yl)`?ZFGVyb5-Eh;h=Juw?6G6Y2?HbtMlS>5ajOl1VM8mB%QiEZu*XY+|2o&eo zTFu^QSa0_`jTTP8_VEV4hr)F}aWNZRa`xSK-~IRBH)P{1ENbjrqw(aIA2mc@zVMlL zjo{H^RYE!M`_#9XaQtJS(7-#DYX}<7k#y?}c_bO^nFtq)KqJCCm|^(Q(z6X`uv#{b z7b!4&xwat!9ZFrCZ;u zZ$iV-sD;a;hq={KZ{A14uSK~%I^pcAbeQWKU_;x+SE*mrnCK6wPX&#&w^4>Z_00wx z5pcyt*1a2@2BF*e3CO4hi>lJyO`#tHmh2FnFz zkxh=5Wq^iZgIq8?&xmvl-!~HOoIXzGnIi2PM8oaB&JTvo-d4ZAIcyGlE4^lBX{p%k zHG0M5x-CNe<3H6jxXxE}4JFNnmbMM(gO5M@tR#aQFJVQYk!n|^^NJyjSEU!*P8l?o zi3Y@+GG$z2ayUaAgCZN#4TNk!J{wRLWGvZg!_O!ugC&vGEOq24`+4IcSKStl(&B zA4T7Ib~2w>(~!ADB6(g$U_nGta+Jr0f}?mmBy1Qw2!@g-0|6!wX2E`7hHSt!fCj)| zz2Mpg*Jrzijl6k|L?WsT)vm##N;KxTTBFvm(HO`TYjtR=(HP|_l}vq}`2;b&)Nq|5 z$~HnU_KkvTeED?H^e!NZ6J8BWJ3lPk?pHUMqwd}oMJKxD$yLd zARAbiC!*2F>qo@DM&nt!#snK$^R4oFan$X|S(9ci->Y{Ut!%u|Oht50q6fa1PA0VP zewGcmM*Ofi$2JzjYNJ%LY^<4pI5Oe)EkK6n8)_bgH>Tk@24!eC3!$G$NQei#O8bVL z!74Kp%S9-weZ%mb**G9cVu&+uIXVO%5bW|Z_Igkl5IY>*DP zNSIBuYXA=ZMT=N(9HYrFo}n@d_w_x4WY{>|1RVwMS1x7eDGD2_kYWRpdc!ye;Gk#l zF4}xBSL<8XkTj%RBbQNRNJJ?o@z2rlXYJs@-DI}{jT?!E`)93H9hKwh{IJ^|;BuwT zpk42+BnzvpluyQNK=_~+ZUz~?Z2%10NzoYvhd^+kWr&(3Ev{m4@2a z6;J>b(k3=*X-{+5030V<-%#a-#)DNT$uM8qfd#9fYp~jYz=n~shA2345oly0T*D!O zE52*oNHnI}Mo{mq#|v_K0cMk9NOYx$i(Qv`M8k(eT^yT$2*p2f4Ja_=5heIKu5ngWUzlR*-L>@=wPKWZEyGJYq!92L@1Wb-1nm{8TXBH(Wy7G z#xsh_H8}7240S)dGu%6tL9&nTrNA{Vo9P=l6;WtpBG8yAP7VYbH~OwYIuiA6y;X^q z@?~^TM!j4y9gi1^xgHaWhehhccVC0vedoo%qr>qf>l*uwxkg;-P*xjhUX~&ShaKR+ zbIH~U{Hv!XZA0!gi$ErcG7aA`uoyC?i_W3DP@!+=S`;J*8^_CXyp?-DA+VurgO~J< zxyFQV_y@H?+ciTYe8sNtH|Vj&%mC1Z1QbMbU(HP_sF?cHFCX(T?}zV14p zL2Z8+xP4ce25Sx4hU*&8B5k9j=P6Z=ajHaO=`JulQ(0JBLN%#;Iron}t{s0L-Vl!(OgjO2?Chbg5Fz-*!24TPySflA%3A z8nyjm!W$PgoglA=632*WJno)jBN|$uBib{lN!vK?%&D$H({NqG<`IvJ!&Ea@NZ8Sr zqa5FW%2IELCdn{hNTAg4?t#e@xB3(t7OOnh5Zo4x27N=VLI0Et(X*Niiw3C)Ho7gC zL^4PS8!}A3v|1{aDwmXVAOpJY)FIe#$q;EUbM4c1LskgQEaurq$16) zGmcOPmA1itiuDc1JRUVUszKYJYf$8Z+W#=la;9&rk&UwSRJ3Ol!3A$LrDU%4Tu5_2Mkk(azxa%4T9l&hA9oz!}4Ug;d(|?|AcI~iA1>Y zG|ooBjLO+k)Z8KlwgD=zOp+m3AVfByxUR7T+c0#vqGilR!^MJV{8KTZjEzZjo7qZ9 z$XG2TJJN;4_WstWxs=TomkzkxqH#4Q^aKe=k@lh?L#Gs%kJsG!>e01ET)T!-Z9Lx7 zx`1@Jo^gbD2LICO9R>{ghLQCQq!Yi^_@D<};Z+!(ZpYj9d0_t!T0Nybj?-+cUBa9K zl@%Ej$v_i4+>8Qu5jG&W1~Y==8|H~*WTMdU^*4sW#kvLrG|Xj8{b6RcQYsaa=%p6d z)0_4-e>I$6gZ8-mDumK)g%ZZlI|-%WHQ~bIvHjX>+v9BDFn{VNIl-eT^w4h_DS04c9e9AsV2;CquYEptpc9 za#9NCWHE3yopVCz8Xg+HXY8v3(r6q;G;B^`y@7jyP;y@odIsgzp{{G3ZF?Bebcm}& zpt1DN&`7u=8bpJxfeNFSU9BjU3I&XCE#=CEN-Df#S86b5v^5!M&u;CM&Sr}1G2HVp z*L`vOI;&>`o1B7o!nE>E!Ywyuy9Urua?#L4Op<||Ln@%(?#3^B|HP=MVMChECTEfi z1DKBn$siY$heo>Ku>m?n<}tJk>O>32SVqxhC~RY_h>Vc#mqwt0{T(`%5Rr+*7ZXag z(aWtPkyH#D=}M)X$!99*VPam7ZS^y)UjBlsAR*(!)W%$TDZjK-p2J;2)0bXu$@nla zJ_KgjxGv?LXp43YpfNTgs*b@&?e>k}LBh=@5=RIbs0a-jf|02=3>WkbA!9l848PVm zi)ciUv7a=AMq}TXy6yJe8jVGdjg!%oTlkIvDiEG)=s9Ab17t9x%wQwhHJFmfhPDPO z`X$kLZK+Zy6e`fVS}I5u#Y{f8nl4xM$&~i`-0r)~Z3`J-wm?Hc2K6nzX9L%E)zrO1GY2FndghZVpe8U9eHgNBnyAVr0iK?A?< zlTRo#j&RvP!J+9ugmN4Mq3clhj>G+!8S9Bh;+<$ z4T!EmGzyE0mDa`WXZL(h{jGnX`UVduG9GS8m!aAF<0e4^>qkF^;R?W^cX(h~QE}!6 zz0qiN#ZgDy{zd!Q?FVeFA-esW_OsW$N7qoE@xd+K_ElGFHsBY+#p4%uZ@kpH1~yqV zWDEvulr$U6Dkn=5KG-jzYcQceh79c*^bL-7>jv3%L^K+r3}hc6mJ{S)Mj3jCps|hG zq69EPG)kHBQf?)`R9Wwc&2(}0BpzEh98@UvgP>MU=bF$;JQlwIeOaY<_1RX+rj*wL zhYLOt4bJC5C2BP38ZUipa{EWW;)s6moUFceCf@k)&1&^&d9>MIY-4N(PXAMZ9>3>r{~MjE~m4w*yi$3h^(t3FAF5y{ZC zhEyA_Yh(z9eKK4`qhWnRJugX%v8h04iFqT0yazG=W&#af)C=&*m-FK4j@H|eV zarq5ZjEiM}Myu6q72+p~XNWF1qSE9Zherl`uUg^iWNaaKjy#+C6H3Xf7_{3lp6Ui4~>DA#b=uxMb!9LE59 z=*HeHU+QCTySA^K`dqGle0_idrh@#$s~|XPR2$)({OzDc4*l zt^qc#0UBVV6-1!nUXc>*8gbt>WVYS&>Zlzj)qz_56ayL`JjX2Xn4H(JJrwDqm>rfO zwfgch5{d%i7i>aR0lkh-L*@|ALI31~n=KkoY9BfbGPbZE7*IKA@4fea^9h3nWYJJ; z*tx7@SKIlXLE*K}Mpk6=fvbPv8uk-h*GO=2rU_4X4T;@oB$SPLUvv#Wqa0>?DFzMnN1juMK*-SR zubg?r{yLRFC^QZe5e=OZ?)_|8q<1*SxW=by+sz7>#lx{pJV!<~u#Z9GZS_9gH~B$h z@V2&|y+!!3vTbh%4V6=THb93CP~m(tC0!%DzDbnj$yZhzSm+$&A{q_&j;DyaGvRSz zTtlIOF)k&bQIe;0-dqq@u2l6|w^17Z?W>GlR2wn^MsptlL)z7GkO6>VgE2I08CvCl z2A}8}ly(jJhD8HM(4-2{m+EkwB?YL>42MmiF>ME+p`S%>D+(5oPi)nSy`DE{C~iJ# zi@GXFy}qAzp1qZlPir*x4$+94D7}L!SSUDdJ0?E2 zu&@wcSm^O5yl6VF+o^x-8VJ`lh=!|s-#-HHz#DX-;i3WgJAAjS|9M$S4`D3pV)Yes zE*>w428C^Vt4*(iiv=|OYhfis!>|D~-0S;Kv{d+HAb59vx(1|=D}u_Y{^~+E9vkc(JEbP93VOfR70_qMI4e6!0Z0PS<@$qoaysrALk%{yTQZd6d zAdLp3KJnk9F_n(X3fX)P3eh+smW0yr+pfAHWaDzxbQOAqq?28C+IeoL9d=k~;G44%Z4eD{3R6|wTdk&UQr$&cXngwc)9N@%xdE$?_q@1)3^B38uTf}V zyj^sCHHAlmhMkE~t<@6pBg7wonkcB@{RWK%x`t)Ly~f|_L@bICLb5i+HAJfKiY^Mt zm?4l6?HY{Pt}!Ls6AhA~FIqZ1y`IYf&qE9vmlxs+jlItoCJ0A38}RVCx!r-rPIEi# zu*1%+7e9P=`*O}OzbYUZXc4YKg|oKl8sZgyk#=4o&Qx&}N0-qtGvgS7Wd&ar#0L`< z6(8IOqYqX@UBQM~P}aa=1dR_i1cSZniXs*)U_r5C0Y$+Fdjkt%N3o%Z2nynh=iHJr zcWx$YIsZ(u&i5tjm;7?>|Nd{8x1SGd*BDfDNVqluOrZ$j^zNyr)}C;G0~#u*SJ0@8 ztN6Af2Z76w>vs5xAFpp;T9vTcv~sB`_lS!S?xR@bHR^qS;0sxH=?5wsHJmu!4ct zl|8P!-sKwL0+o$2zx(A17YyoHyhUl*Y9&Rw05&?n!NY;jWDSJW&ZZ)4rzvoF|V z1sm<3zIB+r?_8tp(0Iiz&mSx|Jqapos z*AO>PTrbxU9He6}Y_M`1e)**!LumB+W%~5wQ)U~Y1D=Yfy63+8wj&p@{2n}{j<0)hWnP!< zn|y+9>jgVfCDewV+}POjSv(ePE1|KAg*r$#lyHcSuszXU#aIq0*HE3?pun3uga^s^ z7ig@m{EPNv{Ok47l@dFzg8_c=>ZRO^m}s2Uhls|3lbv6$vVlC~X!cs$Ws$U!G;0Bk z;^K;Hd?fFR7AirD^I8;y&! zcr>&(i=0EgAu`MgYPKi!21VJ1!a<>!gT`vihPQ;x(ReuBaTh4vrNe(ry4YFXd%%qt zF_MCzl){q@e#U4%!ZdM zX>pc#NQOKkl6#`qn7M;6PiftoQ|K9sA_HJ}G9a<>ASSSHYtX=38KoQ6IFyaz5E(Aj zSUZG0SGR&%WT;{#K4c#O87niZ&@TtJSctgNhG>Mngi zG^nz~m0O|7>o0$F>903lc>aki;{jUSEXxQ5&`5CKTAns0udCZCI{YaHKLf^WHs~5w zZ`C|wDe{cSHI_(**ofq2lF#xCk+F;QjCM>0*7*HD|H2P2)HgN7)>BY%z?ln@QTL45`|Cdc6eb%}NfCR#~WfDz{#1EA1b zw++gbM8oGAy&EhVlP5576uHT`pOrQRg$kGkl^i#jw~eUO4bcdEL-|IqI(ccPXM~<3 z*YLY4QHBVS5oQ{CMGJ=V3`a)Mc8(zxMkK?r!T$$k8xVi1?WH&{T+vI{%C{?3g7(CX zqR2P=O(8HE(a>wHdTEeVXoPG~ukE~V5C1mzZ2%igATuJ;AsP_&?-~OQE00Ez_MWh* z#^k<@Q74DL~x|#~m>l0T*%KL|I0tB6GG2g6i4E{yy7KRn%u1CfD$2AkzRF zzJH=zgK=QghqaHMi+Qdg%||1KV~;Xx*|wxC9U7To12Sx2!=~|t-Zc*BQ@yP09pqf& z>67|QO*$nU!;!I26z=Et!vdp$5ak+8*@nb^s487?dlEd;7Z+4}n#wwc*bo^}3aWZW zlx9S}(UfgK^>H@N-l!~5ahZlpBg!?@q%@eu+y;fH{bSddqH+7lK)x(J8YMCWwlFE# zfN!utNe9ygWrzV3s8#mH6YCl`9n>QlDF)Om7*#Y{S6MW8HF}6o5fhP9eRdS%Y>D84bO&0V;^N3M+a z)-^f~jZPosQ0Tl9)^m1k+NA|!OTv+53r_a|AN-}4SvLLk*Na%;hzsVt7Z(lLhH_DH zQDY;ZN}o;a8sT+uj4FNMhF)vz87&^u76r1|M%bcoJD8}CLNcH*)mV>RgR*4szPYEe z^3Tx#dxnP@XuLLo_I>R$H7Vz}EeI)9ENqFoRc3oDV1u^NU!1ze-aV?501aF7y7h!X zYAh#lXwWrUa1E=qeX%dkmBA>RhUO*f8jAWSEZ0y>CC_k@Yjkw&M_-kk1{Ar*CS(YV zt-ypL%r?Y^8^iHjR>^QVsB2IFM(i3a6f?V9WVp{K@C{c9-CyG|av+g`aP^F>92q3S zlhK-z5%*DI*9bF>(M-#<-@C>#(~n->N_%~?CFJEBBRe>kAPe=rp=84@k&fs%$4?TCT_d)Q&0RyLA-OKf zQ}_IE>#ZN{^s!t6yS99TQ`>!9ca5dlo)MQbNJgm8HOja}3DE!EnLn&+d>@>$ zWX$sn^;$#EkmMUt|5f8Cv17aG;Ty zWFbk|q}c8&ZKA_mgK%7VmZ2rjupH$+u9JWKpiaT}B(q>JAfUw-r34wCjT#*1yguJG za0{{xhlcdlS0Nfxxie60#xFPL_#`^zO=C%>(c~HGv&J%H$Tor&#Wg7EplJ0x!SJSW zWZ)XCLo^6(;f`>$y#bANGGT&0|HB3a=PVmX(KT3}XeV?H!v_9|raj@&JA+^ljg`DZ zWjJ@zgsH|F#^YcbEo&LxH5NE)Bf|zxo(=z~Hbs{@@UBtv5FAxD%-*ftZNr)5^U&A@ zWQZoWg~s0TDUz{FG9WchB10J{Ekk4^JQ&_L#D@APO|Ahls;=R>uF#RSY@->gH@>)WSehF$(jsANK-X~NuS`%q8gz}-p82aSqJ)~)4JQrCmO;aT;n7&Y zS((O1=Xpra`^ekIMdt-}k+S_S#D0dvi*qieVk+EstB$2#t)G8ahH07Z_*HE@G)w;AQkq8}7^awB-(Qq&7 zxHJ5%&36r*W0P`lp7%&bnVB5Yc0|2zuzY^LTbXj@>0>jxlF&A9Mb~w$lcDXwGb|ar zL8e7I*^^;+gwzH-s(MY?02*x+zk1NS~b~lve zzB%=--FcLPYe0sKrO-1<;~C-Xj8@e%Bf9E^M?s8|=a6wo^N8P?iUM{^MCO&7Qve>6Jkn?}yJq?Y&3i zd}kV0PHK~R1V+U*@S+O22H#=1#%Fg!w|;(?ouSL`xzO0L?iy@$sL7}2e7xK~>##gz4GTWqZk|^Lf!@I_Ef6T9t0cYigjrC4DE7+~k zuxnz`K-bl+cl;>4c&v~JT%%}DRZTd&ZPYriOeR5w(6DS!?o7D7=WADgOxO6Nc53Px z&NC?Q7FxVscQCOyNMi+?2egXzY^@xqpTMXK)|d6Kfhyq@wg)lrt_O7(zoM@RHbQ7YNF` zMj2E$UPTL*jPV%jG}CQa>ctn|5*F|l@G$tXImaY@d$>)OCYb zU4!kkQ=D(aC9f;KT&%fr~8)W;AN1G2$;&^+IS!B4f9l zTo8>EXk@o_Zz@tWBc(GAvOzR%M-Yv6K1P?eNbuL!P8#MwBlE3^F^{WGD(&;Klij5; z*hPsIxrSFg-H3)pAa?V-d=IzqKrzJfm6laTM4yuNb-7ed3$pu-XS zMu-M8MqAhr8qPC>#*P4zUg@isf3V3Urdyx6)1+Y~KsY;p~L z4wPrZNMr~NqxbEe(?Y{?Av6H`Q@?!SePih*b8`8q&%cxE4TdKJ;oKw6J$THG1~e!l zcRJ}XQm$bGXf*5UBS{8lYK^+x%P}mHfDK^YDQ(3(zYu6J+qixS-Pu8!7I2LdRt7Ag zCK`=LdvaB`yTPXvWtn7mPRSq~AFx@8;qb1JO?_i#aYG}o8hW)2io`nD)HTv;{V3~s z+qjMGm*Z2@-ia9z5E)SBG{Z9#QLd3`&IVIqxdza1*~ZX!Qal^u)2VTV5T~_S5+gzV zyAh4CaST4%-*T4CHRij9^br$Eu48_@+ntPH3TO{HgWLv$E6qq(lZc7(?m0G?IbVOVH~e$Yun6vJ}AFv%Y2ZD>&XB_;wDt!!aymc3*g)CYhgs*Cd0%8cS{gYvEs z?(xXhB|@WguCe1Czg$zpp!Z313Sihw17xJ?w?dW-9JSgwNmw8q?lJZaB^$5}f1T@P z3btX{02&7yIx3=RNOF%g9yaEP8OlsF#v>cfmByg3G1qu)XRFDrM_hXQGpc)KWTQXn zZri=7(_!}{Nx{ajlXLA6(69~4J|%3UkJ@;;v0^sbXt^O*1XSMA?LLa6#V(moip7hq zXNZl9H0T=CzqFdeRgDmpnkdac>fZb5AK+rHYoz%nw*Fza^!pe#w%q&V%<8FLM>(h^ zV@Fjq=6go$8mfoNHPS`3D3EDUd@sdjqw)^Lm?01Ggf#QP^Np@SF7RrkV@x*iyBrZd z->6kXxsEwa7cZQ$ar-XJIR`sqPpYdpYEr-}QtZ8gBm``n?_Fb;61IUq&GL;AHfHHf zC;lxMrEs0wdTq`vWd#j)hu?TkwM}u|m3a41KlfJI#_TazALeH#O${qu?3j`b=()%4 zzV(9_FMz*!EkAeNtvtn_Eg2mX(on;QW1_G+P2A2tx{7locJsZFBQ(ogGpr627 zN;Z-VRq;OP=#)f*x_%c-{Y%qc3e)Hh#+_C|E;Q}01GKugth7u$G)1q6V{yBj0UAO! zv_?s}Mwo55JU{XcN>oIiQQ8Aap`0QamW@zLJO=>`gGN-*XgM~#tY0Ls3@_F|Gg)NGFgCZMVXW>>8=nx-<4R?z*9}T_$xnO`o0^rEtQAgwQv0c%g-|lUrg-`Rq zF2D6T*B;~?IpdH#7QOZ^^scc_D>IAS#vALS^-z8f7&H&7z8i9Amy~6q@Pf zMp5J%uC`(Gje%uD?!iM5fJBZ#g z`Shc60)1M`HMDlrv!QIm!O@_=GbnExlx%}|1hVHA1Jek|pb|)AYylQR;oKHMJv2-< z&?lB{I5v#r92G(&!%3KZnEZo`ObeS5ahZe0SvIV|pf1;Fjyf7oqyNy!(MR3Iw;<90?M7!Hu^X{0LMCwc?B`vPa1 znzW-h4{)CM!9~?&DY~pDL^P_tp)pvw27;<(pbTw~q9ZN6Zz$VfcrF-_%QUJrji3q| zkfCVkqlEKAOQ7K^8$R1`Y#hMamkDx#LoqxUArAo=L$Sda*&rJJpvH4t!}8_HkZa7& zHJ-N1QZbZvyB}xE?%THu-O{&PhvFO0g|CKGlL1Ow2F6+{2+6K3%znY{U45s$TP4L#+vJ68^)x2350-4iBrvAP0q% zXw1qpj89l?;qDW!U|il0z6RqcZj=plSl=KY6z(O!5g3SR1E{ey;^F+mnF!9!M1xEW z8GIcE(U5J-$~CSs749~&3XjHxt^2m&m;PZ+5~p9}rCa#g6B^4Hw};)Fv~e8fYPjBs zg9CTzqkMq}4&+!aT?3g0o0HXhgmN1tTelh>IZ8koYWR8y&GR z4I^b5J32PhJDKkp&6SPXu3ov#Hk64n7bO`A;~nmZ+ZVY|)>oBl@MqqoO2*J!g9>1`Z1OiR*WOv5)QNqVa(YYYcqgNX(=9R^5GR7#(d zX*$YlDoK@fJ~rY$iiu`2Y{kli&oXo$L!&6Zk3uw*Z8$c} zb=jtT^eg_s!^O~##2p~_7&E+c1m4kzMyvzox(0U%wky=~U;Q5(*%>^(jmb6gG_!-J zX^DfG9C|3v7&LawIE&*zPSx-YiK?MlaYOe!R7nRgjGSngvA5!+^MWNxSNdG^^{|H` z+XzP4!cK~1LyxLyIJM;*s%^L)tfbxvWXMqeM7@*9Gk9#Fqs9iwsPD6pPHkg}nzFG! zz=$>QISBoO2NW0w53&(y9vWl+TneYncY*4z7l)1kALfK0pH z!y@Q~_UgvdH{JB~tq1S@f_SnsqJ z(kE`ad|#vU9=Ks6FAN*42`Wan2n7kYRHW$dJKsl6T;+8Y2Dy z8kRGQMdR=q^uQ5kXjJ~?)p4Jn{@o9Z+ikOZ0(%$sDhEV^VtEtQ&7zmIdiOm5DkfH- z}{MH>DYPuvw(J%7J@xU4ow%tzscvee^cW#JlB|%Pk(D z1RMurkH=Ov+PFJ|9y20;W6}GDd1Urs z^Nd-UMp7l?Kjj*#Y=GtI_^WSILN;o#H;+EW`vKjks;kEEgbfZ1w2@iaNG^IJ@D{VH{5;0-49zhOv8eGclN#IX%4m) ztphH)((0p$$PgNpT*LjD_CBKGS)!ptMbMr|rIX8}r*f9zmDai^Sv0RJ$TPynEt=~Z z>Y~^d#oNX{@{RfGOKf2VRSg4)lbLA9F~o+Z@hA;#)YS(p_Qz}MV}9~kVdmi2VU)tP z+9U%6Zu+>%mw&Il z_CDuy+O?(NboIJ?fZnE72O8*G3Xr(RCMuxu3k({!-EXadoZfcq2t~7D*Tc+KL?fI7 zaz`gh);H)HkaY_*k`Z|8G<2pB=^0BW%{4+@ce6dpWda9%!$gGO94f4LSm)sTtVG|4 zLIXVLM%nI!lk(Ae=t@+!Z_MwiR6&T)XB&ppnS^6}fitaap%$~p#jkWrAVZ@8+bEP; z3B0N+3Ju(qX0y2EBuEg=u~k0x}R}1937md|f(~X3XzU zp8Nf>q&A7vjrr}}d`{@VK?Ezf@K&g2Uyb0u>y3gLw93|iVc8HeI*n`8lHu#&81Rkz zH32jYdj5a9HT^tWXy`L0VQS?gWNhOwl`bOZ5Qd}|9a1~fKz_t!5=6DAC6a4ym0T8;wf2yPedh^3tvW zHnJq6G}cF^NEFhuxrRG_of)Le&omq|k`cZUvs|FLrV-LKB3#2;-{sXpX?dP&hgf`39b-xs~cd$iI_7w;k;T@ra{p)=o_r&a_-euHXJf=3@m*k0up}&!<@s< zIu^SI$$+NHUF=%i{j_d{?I6S%$@Lgj7K+P(axz#EI7~r98pr?|@&fJ`nuDD|r_<}B zvLU4nF^guq-E5Tm{eG{uyA^_r-R9(eGk(Poc62zI9F72nHI1wSgLMrNdlc`GlyB=L z=k7HR!XmrHj(TyAA@;6D4RkdOVr@t@MZfwpYIR{IzM@aJcyF=5nR{`}4{( zKD)16e&8edl~2CeeX!j7Oa7E6-@Ffd3o{M6hFjO5*SW4CWWYGc#$3&eSB!7SjiQc4 zLvysw02*4PfD1*n$V&aj(0tTD2iAga?`&<~sFqxi4*3Ed@^Y?_ZTHKPRJ5e-CH~Qo z%9p58?hpE1nUl@Q%e0ai6pJJ48n>Y#ti02)0F7hEDAqM_R%xZHKUrJ*aP@;V(GPM6 zE3WeY)F1NxezC&QTM^t=<$`k zvyJl6eP+M{PgyGC@b;jwWU0%RyUbc-g#^$w<^j&GP2)uC86z?9MzmIdE7 zaC0APuB&td#jY?AjN8_iw{Ba~dNBE3evUb!X_JKd@a6sC?*YImBQRI!*ej0u9^x3-)kZHW%`p#q;FP-_$WE!%kwiI2%_l!u_ARF`z#$3@iyo>{} z7!BJ8QCFz9-FFCDiBl3Qwzd+&hTP05a+y=v=@tw9&3qz}@1nE?6~rRi&1St_Z;P5u z3|7Gfz`&^@W7lq-hH30%)lV(m?er*?4O<4gXx242MwzXM!Zq+2+hF@rzHrmi$%DoDu%I`oTx6in?qBcHH{I-3PCn`A+4aPoKRDWJtW<`o?6T z?^nKAE9)T!^U9qh>J;eXc&7e~^mkPfY}KIGMR4K!~a z1wq$%<;6!n1qQ)0uip8nscDE~yam@#&;9#hL1XXb)pzBYUz@53*s;pT(TxW?1>u0AH;B>m18l5{w; zDbJjKo_&edvu8%101aK#5Dt`Uywmy%WJr^}Ii7KjUklZ;f3@!#EN(!Wic@Zj8qXf< z8)RdBE*cc(Wt_2zmtF8{Zd>cB@PpzwjH6#dN>Qt1i`XiaI+AWy`kAHmls>cY?sfaZ zMLx!>uBDcjcbZO3Wq3H1j*f<0+U2>13AY}K02)uVMBlGUf}vdF*;gO=#nd!_g|xSE z{_^i7Ck0UV;%rRvo%D^T&o=Hp02K(OP?3=oG*lf_&^XX!d}%Tb*~8YS0xe>E;<^Uw zp`LG8zffB@qH+%U2H9Yo3=OOp;=#~_f-E3tAV!rN1I@gk5y*NknMrMKw9O1j8W;aA zbgx}c$bru5)*C{G=#>}meAHcEx_72A`Xo@IXFM(+gO|iLR2}r}{qeXW<2+sQ!rp(X zYDDK6Gro~h)eW^?l#?n8l*#y`SSlxN0UDYqx&}>Q76tC}-#WQan1{mHP8W5~-Uhq_ zvNI-~@^v?Emb)8Eh6REF&&V_rc@(oer6EG$$-KgDRS{uxjkl}S>JRtG8JVZB@UV1fJ*3h2;s*8w8e2;mPh>QJsB9mLD4!iMOb z7p1bL(oij;p~Sg1iey0V9DXfiNXq$j{7I0ZguSJ?0zXsoR;YO+6uJghw1W)j)Vww& zedd@9GmewFhUJK!LD%5GM8^~yv$kw&92`>FLM$hc)2x*=)y@;9JQiOw~Q=ykqp__;<3fmJqt4HGT4d( z3&gp$;WTlLV%h+Bc*q|;m6R6r&Tx1*);!WR{A|N@jZk+U+BL*CP$?HY{s={`Yphr_ zAa`|-H0=M_F#2vKx%X46(HMOhmp;WjIFh}V(&*s$G(&Si@o#q5nMC9oDN2n?B)Fw# z*ande`UW+}HRu7ZYkQd_v_%BUn*1`Jcq zfmbY3;4d9z)7lz}GF(ktU?wHK9ZpI|X+PIsuFqPzH29x|+U%7pjgAq>=!ju#$b|wox6Ii!^gRMc-q)wlD2g?thq4;% zXjq(-((PeAU6>q}u%DIjN&#rh%Qc{5^97JWg-S`vazTa1%0644c6ce#frNZ3B}zZ6xU* zotezeJ)3jp9)wFw_^b_e&ygCnD+|+WKU8Nwa{>@44Jx_Kd$AXiHRZyt{Zvt?v6}Uo z%gf4lL(N|*w0i$4oT06joAMvV6`B~9x4G%zJ*@PeY5ks+!bhN zBcfO!Gg@(TO3j9sROQ!rGC5skV7Q|JYA)0oBiqU|hv)}25ua!4kKc?*jN)qBf&))u z3MpH=2B_0Rp(lha%S(X{@wl;?+j+<~N!(h8T=e8p%osRo4wkRFTWSoA1_E@jGGX?= znNX;O#q;4u@=P-<+M8zbmpw{fuOw8#smtgHv@gE1Do3?eNOHg88~tMn|H+m ze_poYF;9S{R+wL^T@gm<+xLLKfwU9&%~Eik3>$<)EQEjXtBW%*4jET1J55A7YFu18 zx295lt;`Fqq_rGpW!U?sTz>%qa0QT(7blv|tDxATLZ<=?C3`y!s5ez&mT z^moqLQscMD znOjZnTV`=6xklvlBDR2Tj#t_$}O*-e3ha^nNj9yuUR$-8GfgG{+naR zNH_9)xZ`u}NLqa#Eu(9Uv^kNKYoYi=_BWR;Zf5XfIO08)#yE6Ap<+j31=w?o%<|D6o83sztT?|AnJr-I4Cl^Xp1OjKw`6K1toaQHc-*? zQ2qAS)d9M2>Q)9T!v(51(uGj2WFer-Ee3^Wi> zc`5;A#w?4(Yj*L){W5uHzs;AV{lY=oaZQnhgth{1e?DC~Q}33rs?yDGXHO->Fn`E(A=LYm?qO=Sg7!lVFY7NP zs9utub_rY^p8kE;Udg6THnb(9dk1Vr@uRWdW_8eTGnn7q*x!>X8YM_(5`JHg9Nq7xt*dV&yH%w3PjJrQ za)y^{S?A_TboVg~o^j9%wxihU=5Yi<@~~IMnygI7O5SX3Ccf{$Cbc6nFz-mgzN&Nr zKG0e_Olf%eY2-y)-!oWvX{d8p_-Tk*wGGX&3-r`|a5W_3<$G9psZIVwW0~nR^LmF` zRt!){09TFm0@TYmzvW&Qbv?3RrruOI6)DRS27W$0&Ttp4Z_Rif?uJ zow5@WFSI;blAx#uy;%Z;gy;gVQHS<%uV{KMir731{Oice;UHkl-1`!~Cm{Z&nc`F@ z$4i~WHi7SF-CN=h_t`Zm$0YGxZ4Qk>Sn%)F;`#O)^`UWU(KrUMQ+awi;HwVUdPLQ2 z&E4vfS3S+@q@bn`=JtUS9w`ziC##os9YPJf?mkj67sCQeYysV^u zGUYgNxbxSEhAZn?ThgnpnWnkl?#vzlMR(?K3;ysf@nqlkVxk~7H>$rd2b5`!MZ1_G z8hg`RB;|(>;Mc_O*lUH+9%Q|-3}BQ;*&`=s+uZG)D)9O2A7HG*{# z8G`SsoPA3ZJ^8U7`3r*{njJ+mzdzl`cZIg}|62;3B_lMcF1U-ou08r# zcXU}V6CUi1@u~P-b{<#xksQ%Mw8gsvl`pP>Y7X;)c$Gm8%p60i85hy|HbQuG5y~~% zWaIsj4rnLyM27@vd3GI^@{@7}x^HTNB)>;viR4jCR1Xaldae3p5LAI%8E6LwcX;1S zpVuwLwO%Ls`sZPDo2>>nC@Va}f46Wus zH%-G_m7B+WM<5hz#e8VJz242nsM<@CyI}H2yc#}Eljb5O#ehb=Mi=8e2&Oj2WM$m< zMeF*SRPLN<6D3GGeKCyqpj(kJpesn~Uw0!j4p>=VKrUeO#yG^W$IY%`C61QXM?BR^ zd!jq8k&KEgK!Q8)2K*$YJSl#RakJ8s{WMU6I(~dT!Ko+PAGq#VeoQv(?oURxO`$Nu z*Y4dtKm+gOiT9CgR(c|&;I>nZABAMSJ;L9Mcs)^VK6ER<6iyN$vCQt(7UUw;)o(yH zTCHRN6NzGlWzv)SSP)pc$+V-01TdWmGHwY+8WYFn!hRkqA);Opha{TTTQ?SJb_=3V zS@xQKv4{=&4t#e+9=Hju33B0W@?a)b zXPsOEhim>7svTu>b=+!87(DSQi2tT%KG!kPkIq~Iw#(QE2;*ZgH@f}^F<;4|KM*-4 zi#*;}e(83b+ha}N&D#oh6eJxy7LISc`Bu>WtnvasL0=x0ROSr4?9Y;Jgqt$9Xr3Q* zTT%Hwe$DV1x`VZy>pFoVy9H=ThmVp7aYlz_5wDh_MS`QmLz=%KcWD|+3@RLsC#TPS z<@_Vf;uU3ohx8Q^F7I#v_dNTzBs#X+`49^)Cb8#vJX=n5ad2qM=c2SGMR$uVX0F5`$llC69hHa;~Q`Z5JRss=I{LC2smJ-`_j`o^0$fB}c(x(+y{#JZ70LDx)lP?@fdn_TQL(uI-I zpxPD^aucAq-pd+k*zsh5X98h@x%*ULKD4rW^b42uWp{f2%_N{6_lv<_nYvCC%vF;K zre6MeolP+p<;3Rx$u985x^~FR(uSZp`_H@_yaNQRgH{W)`PvkxTr%g@BBK|K)TCX2 zLK5+T_TcS8^;)epdr`!IXSX{#;p&(1K!w99N1O2C=pnvFnf(o7vEv#R2+Rf+_(8Cf z-!6cA#M%jHky9u-u?EM^+8n28LtRVH{Bg{Mo7lf@0M3##B(1+iXP2z(+d^BNuy}_C z3J?)=sa%g5%?K*<;9VKd@S6`b;`u|RkHI-_Z6~xU>_6nA+=~9tc6&S^@oyl zfG2jHp4whp@}cjqtzW;81zk14UA(@Hzs z#`e-z_y?e?svY^$J_X+oAyR5oL0(eiN>dN=`4rNECCY8h14e?7utB?aLZ--bP^D;U7Et7P^x z(*)IGbz^g2rT$IChm?yI^Fm~|-C`(O*pi@t?UR#Uk#%x^_*gy%x5^tj4P2C8 zIO65d!N}snHjD{`ugJP7O?!@anCw#mH=KIa+*{KklSo@KVC`2aU$6lTE~(V_ybE%Z z>pfr^USpNV>!|NCknGJg+#VZO1F~aAR6z&Zdi-N0nIO zK{6FEZeRV5+aYo%cA@%RDdbE=A`h?NY}z;_?5uQgdXG$CmXq8_P{fQ zOBEM#&RxX^fVg|2R#wnml^wlawIK0`T&MzTw>D^zJ-p&E?cTZvxHOS-&3=;l;yR{| zRU7SUVIj;tDh$fg)qY93_zc@0mtmvn@#NH7nG9{tR@~PoAUizV$!#*X1Dsr}MOS#d zi@CNgwYfpqq_1L2YkJch@5eQtp1U2ti!7+)M5kA)?Kmko%gD|}A`xJlhHZv*5GCz# z>KjxRzYy<~w&S8n_Nv>MG(TW!pko58tZE?1?HsOSL+%O}$+XLyV`7gSC+Le?R3JMA z17nec{Cdmisd~!nqvC)wg%lO zb}|TLU;g1QPZ-3vz62UK`Z&T#XfD!sIOP0YVQvyN$%|CcC0skHS`QGyIv*i2EtrSJn0b|;B zS>q3saLuo0LUNS*b4=sWB}e{~z;gXx)(waWWK1(yV$^loV!=2W@*z-6UgSh&+WS6EW$w*OQG%3GEA< zRstQod6kUIW^HxZIs`BAlh9R0fn%)d*)XF`m|m0-;ClciDJ!0t5xY$Ka2=ztW%a#7^&5&2A8({eam}u4ig;75%*upb4at`N(Pog4U+NB3naF1^ zk@N-I-L0zA>qDMRnhA_HYc$yaH-gYywQM45iGJ=jTWL+U zHCc&n-xK*{eJ64INnD&i1Acm-GDqBYal5w3u=siWy#FZO&M1W z9t?E!ozNA>F)l%0Zrm(wm2c8>{htH6D+dLzC$i?~Cw7L~Or(4SdhbIEOO@fA)bi7l z^*L|-H|^W_>fi)f*N-N3rplWc#g)iMNYTuhNfA`3BVK267*0)$Svo|CQjnwB;o=1JDmJL0 zMv+qRAM$M|cQ&ufb$o?(rbu)DEtf@1iGswB-@Hlz@&HwZ)A89EB!Afqg2GKaZ6d$bo@b*sMIjlG6UkFahe&llIc7ywrpz*HEgoM zGyK}ZZMdl9c*6JyhHZWNbAkNqj9L zoI(#3P?2--Z*OJLoO4RJBtg$kGmojwRxl2Ng{o8l7I5iV{O6#GqddF#*V05|D$BNV zt}|U*YPQ&xIRKWvWaZY+X$&bE;WUaN$rz~fx~r*uW5A|un=hpvketfJmWi)9lNUVK zS&|LL*Ywnb3A(6kY6(e_MWsMvJfOf<$)GWHFcOl3k!djqsZ?e*MVeCl@Li53tmp$N zK3Zg{X>aMQ$rr0QQm5WVCF@zFVA`htBu192%eEz{zQdtx%Ckkf3|g%UDqiZZ;Ug;g z1hmxwn>E_fi^80Ksx7pBm+pg|TWC8{&TKcm^%V5s?Y;LM z{oHtWo8h+#p(Iqn2X3il1wr=D$6zl~yVi$}(g@>qM?Hy%@U8MVJi5dr-9+zzkkoB} z2_V1&P7j@X8exg9>?{)6=W~=3)it*|87w_i#5wL)zVD>Zd4Mk(6@Ng}YT!T_O;kNp zqZyFJBq)%hLY&jAU6Rc3V48Fil#}hVCep${cde65- zv1s{Mz^URXJ7@1LoQP(W492Gti#3{Pi0lc29ly_Njjj5SfoksIVI;_TcV!gRz>&2g zD_R0=ysDpmVVMv(_8%ucC;C_Q&8kSI<`lvYcDhIllU-XmH6SSBi-SNYtByQ8pl8fr zgU2PNldd)=tB%cEbK4QBmB}mE5&F>Put1x!N)FgFdDGnQwac{tBmo5Uq6OQMiu@ci zdN=jGWN%`J8>2Q%F-hpJ;atk0)wpcjOqXahHSY3~$kXHY2S&s@{VxxFC9i$NGGF*? z#g!*W-(j&l0N0p#C_^nSJGrJoA~7{Dj2}+ zYc@|y{@6`3d&#uD{IO%h`W*DvJRK++aiFcY$2ho_|HhgS9jB)y+lBEH!2PLX^x z262XwBWbObL*Jw#(v9QkzdnKi;1!IWn>>phe|mbl7>&EY^67Z6Ie7+|?ZHLGv!L-) zvTUU?H4U2Yh!d4<@hxVvGxuHMmNmd=nE|Vs6(k;ojNwFYT|ExCnZXxRGb_@sBVEEi zJ#p$YywCbOs5>ya7xnS&Wtj}N`X+%q2A5)^de0jwS_iD?1{Sb=GP%5j5S>RjmTWMM zy5#F5&=tin{3CJEfbKxW@4A}!(dzopMLk_GGnI3gb~{DGQVC7rH!>gG#|j;2fStPKBkIlh^Yb_^(_&!OE#DsAx+rew=85VG~Sg#&znHZF-la>d*`4=fodb%b|(aQ6a zjFhfKJo^Jk?L+w@z&aeTQXh~V>Ua0>t00KF1gXE)%Gy()<5Ja(8HAI}Iyfj<;faE&WBVp$s=!E+ z1UwbUby!X_pg_j%D$q*3^a3>G4@4sTC3wYk`XLB^U5(;Rl!1BYpd^U&&mRq{OsDH@ z9a0TV%i*f!+UXwX=^T{UiA?vwh%IKn%)ju+Dg}-$y^{J+=c(*c+2yb5(mtiG3$w(Y zU#y*XCT?B7iA*>e_TL7(=`Pg+l!=?)_qYJXcA5Z3Yc|Z2jka}MH)bBKlE|*5GU>>I z*l`P~jjVt=08#~V)_@uqN$CY@M!Xliwz$|kv%x=bGh>g8e{0(UP356pXvV3fGFz*^ z-P5B>r)Kv8tebznbZPRh>=Jgt+d03I%UpR8kbE|6Tf~dEf$gDq!?off_e?9M@$m?3 zZ=vx@AlWwgZP26W^SrRLaV5c>ga28dixwgJPJ|jeJLTq8@fyU62oJ_&jyY;>mh@&q zAN){pwvT28lu>=+VUmJUvswc)hS4h2p7%)9uZop~6|%yL_1-2o+e$s#V^B7=JfU%} zEQ<@@; zUV;4b3M%fN2Dzg&tsR~5V-`gomF#QB44#yjKF_yguJT1Pk9Hmg^PTFv2`eVlR;GVO z-3Y;d+lx*g-xw&cg&)LDFF>Rm!3r14{i8!tpU)uG#fXpoX*#@^+17uy;FSii^eg&; zf(O;FtO?i{p0zwz7I4a1a~1MMzg2f|%ftzp=!w7Axx0rg)zc?oC^i0fuwz$wP<0X* zv(n=p>s!2cXL(TgH*knOZo9B3;xkc4I$H-nLZr{b{g40ag_|i0Qo8Mj0ZR4zu)o2C z>{dVyesA{+!PMOvuuiuF0=lmEdy#?TM&7GI#&+#tZg?WZ{JPiS8@3+n=FOzd^hbzL zHJ+2X_qMuO?1L@$Z8vefiWTK}WX0almaIx+2)TbnLOMC=5!Iukh4P8Zx8!QT^yJ+; z&WI|{xnf@mVYICj&8MT?WzBh*z=9`xK$8)i( zLVcs~JgdaocdF3Iv?9az8$;SqY&Y=-hO+V;w}`Vlv=51w#9i~2H61d+x{}`fR8E_9 z$kUwYV`FE9H-&6K!vMRen9GUn{2}GJYEGju(WKdq_Y-WF1zbFiW{5|pRgnN6$A3qE zzfm>bRFs3A^;Hbpyf%2#+AmMnhOakUm_FHgAxg>~+$MYH8S7r#3D%2SX0AO}wx$vL zFq}k8lg!pRefY_@h1~PtSG-zjJUqSR_~yzqN`K8H22RnjtS4#uG-Ov-u7(Ip z<3`y#1I3s=Ri{1EX*N=OuF*ag@Xq7sC!NgqljrooAId+)2E{S2Ih}SBwjADV4jm8k zk*B#Fa%-YS`aUz@kBW=PpQLCr_xQ3U%2OUi^wT|N^pTQ37OG5}BEA#f-x~jZ^=KZ3 zfc*M#3;B7=28A4mrGqh)K4`)A#VB;F;6mQuxe44Z%>2dcozF{q+C9w~J-j}QKi`%_JWYL` zrl{Shu>#&L{XB>1tDRBxdo7x~<|d`{Mq|UP49~J2vY{_kfvmf^LB8`Y`b+m;;Y(Z- zwt7ZS?2jff3N}Q1T|xx;jLL40nEV?cyA2Y*Fh_ zCq_RSZI?7M^Cyd{nDl3yMfIv@>1yDHLQI%NNhQ%Te`62h-}AuZEVQfB z$6#6lYE)K;$BS#Q0#DCX&UC&9ilxD=XjLb1BwK!$H#%P@y#aj{eGGPM*+z`fwl~NyUDT(c`a4gVyqFeNE9T7hx%g|a80g`|@D|M$$N;R#y1yjVd}p(W{;tq_TqQ-q&7T46qXL|0|f;uDxoGOsx$6(kQWBL85B$ zn9$NxR06h+(UaWk(yEv$*vDzpzG;7Xyetg|zJC~^*rPX;Qw8xjga>c2X+kmI&K;z_ zYm)BIPFa)K^k3J5rDjjgmw^vGl9kgv>P4ul=_*yjlK>`^GO6ZO>gUCWtMFYtiY7uu zdO|Mk6O5?ls`W*25YeZ{`M4tc&IsTtoLLdIA$4AVRZN)s>VqAzvfr6v$?B{A_u~-< zc=4#$`u<;R%M427P9pwH@}D3zcM@8i6sr3f9=GGGzXKkqu1@P z7HsRtszZ~|Mg1W+p}N#KqJIEAhGF_QrT%k&iumCV|BQNnyMz0DEBB$|6JDWiUQtmP zwGf%xI6VBa7uQb&x#5V<7qst5fagC7y?Ddr9`JEGGf ztjMgolTKrv9r5S-5j={Th^(Ry#l$TUj8oN3GN#YG_|=tY#OFCZ0#Nb(yEas71!HQX zJ$-TM<7vH~&l;KUC_Vpfh~vmW3c>)kz^X6(D&=5MIXIk@a`%8XJQfyn4_fxC(Q3pU zXt>;l_BOxDJr6twJN8*IV@f!-0~$)dG@Zc3>V*Hlu7>phe_6rz_itY;fT0R?rCR`9 z&Vk-NUcSbF6IZy}2JLiJB2O&TOv6FLK`HvFrH^YaA1vegQ8`}B@Sno^5DA+vnQzl% zn^G4XLNK^U5Ukswk;F!LDhj2%($2K=nqWm^4>lQM?*ELnW?7Z51eV3bzpK~bxM&q6 zRPi6l0A?a``8-1;a4MlNSp!@>*v_ReNsMe48wrd{C7}HRQVwQ!C5~#kbiEYI1&U-B z&V}>xuY3t=x(OpohA&e%v=x_=mx)y%mrY`>z{8_;M(KWH6@>X=i&JBYNQzsl&Y^w= zhVVfL-#~#a){ACRrO412m_#mz_`>U)awm?@z>)ClK6#&RIO^vZ7!1B#NryED3NP){ zL(M^cnF;s~#s`_qiCJe)fb72(?S#DJwTl=;O$SrDv7aK@3%8C7YkdM5QA4GE2F#UDq^*l?S3&iFeDfs`yVe`dJ2KJ#=iG5G-?A>W{_Y|3_>7)~xsP8#% zD@M;0;Laq@gcwhGwZAcY=@)+Lrz<&5j2#)lQU6Zr45#&@CyAzd-X~pDD6kw{S1)s$ zdV5^)BySx;l6T5n-;3Hf=h<8H@_Rrb3Kgf}&|Y&g|Y>t5=C;l)~d zZnIMoo7WK0YP{{>abJbe1Y;#e<363x-kPIkzGPp_!~SYxs47iNt-6D1+l*A? zB?<{yvn0N0{>*m9<>*e2l>-IYTc2w~GGU*Q)y$@+J;ZJm>W5wu3{9wOMSDC$eZEsD z|BPa}W00!=;g32~ZIGa-EYb6~k_DO>3D8X3eRoq5!?vn7<`Uc*{~WJG=VF?=sjo)q z*slfBK=d1+-B6nkdx2)lT^fdXvh6Sx1xd4~T0t|cWxtm~=6h9RDf(FY;c0<@SVi*) zJPx}h4$Q<2`655sVc>CmS2c`(6a~yPgG9 zcb?@i;em>UL_fARri|Vry`tV@#Z$~E2j{%vBcoRx6YVMS_y$g__Gn_L0xq)6sFleg z5r#T+)K>s}S$=$YMZULgSuD10_05<>XzWPwaFI$`qCLLn8+B^*m8F zOz!e*9Qy4grMPt|*ETT^PUhoCj1}kpOJpM;U4X*?3`m+{%WKz@ysm3#kUlMBvPw?X z0#(z5;mICaLa!?WM4&;ka0ko*9WNO@vIj}-$f9p2c6cEh-xj!dyHN{;Gu1h&K7ovgR_+2j zV*|c&`^~H(*N+;%y*k?GYFsFOiDuT){K}RC%9hc8^o8%lGq$R_mR0*^{(!QUOeBkL zi4Xq6AViCC3)A1Tl56{FaMw(UI+Y|H#6)l7(h@K{NS}M&Dc41r6uKj|l{Qehvv&d& zpfr}inRw0K_Eli1ze=T0#wZ`$s-Vr>HsS+8U)gSX+P_>d zLl`fO$H&iVe?_%0bfB(jv5!r7!zs`OP(e-cXj^bf3rFd0J)pwnA>XZE?f`;PhdyqV zOrp1@Bgi;_W#vV~Yn`WS6uym83y?q^1z`eTvfs*=ctOq}{1P$HRCS?CuzG-m*e>!5 zuwd#ysd@j4Dqp8zC<>^^s@}zeplbrVlWjg7C{p#D7$);ej1=Riq@ke@RCdhL55A|T z#cQ=Y?HqZ7*LsM^b|e2U>h`;kqrRjX;k>fUheQb&Qa+H0H+Xgpo@wN z5`iX8Nh2x;gA=6_(zJS)gE!o2Yxa?Xs zPAaymw)ZATt88vkSMv9;o}?9UIYhT7A*>SYx>+yt?q-bvjLT~Q1+J<70oCQ@C5KQ- z|4A>yP?@97PxC3wqqC8sj4I9+N7E zH{vijG$Fm&kr-9ft=nx{!79v!x&?GSOBHN7ts){`h);czIHjHltZwKER8t?s_*|CX z`{g&O(>Y&UAFtlWs<`ziE0W)T10pn$;|8(=clxQv{yS40y0g#oyC1 z7iA?@9(jUm=={gE-txx^QyG&dUL{RP52xlSK8%&pOtp`$@S9!_ra%A)c}JWMr9RXY zuns<{FD;1fX&xTY7~s)3UDI5gev@}kp8S$jW)BR;Hs&lgbnFP`dr0E>LywpluWrdL z1<4Dom|J{kQMd-L8cVWr4g-90&zmOA!%fQG#YleDu(En#KttsESBT>d-MH?!B!ttM z<&A^Hf~^ljpF(oeE5W=;7BPq&LE%u*{qmd~C~!IH52#Syy@&IHxUB!`M!kJGd2}X zh1Q*mBScT~&{D=k3$EtnnX3l_WQdj=LK|2eXa198gHNHsmc^ zX2e&G#F9tI7;5Q*Mr*L@^g^XfxLss_Nl?Zwwl4W!FO@M!c+bEz!wAo#g$k+INA#9{ z0sIrzy_6z7@!T}CmG)JMgwNA_HR?E@y{;3jB4D@np@|_M&5({qopXD^D^>TPrnrHF zw)TYIlc2$j+JMq4Z7MD6ODiIerj%_IDb9p2CdWTx$sVnnldes{>p2A2!`4=O`1T>T{Fw7O$Z-Qr_K9J~TF`7B zep=CqAB&;?N}$@%d;Z(J7L6U>&%G%QS=IU+Lsfnew_25&vFZJ*AN_r$IS#(Y_XEni zI}0xpGy%N6`;&SVe>LZ;y{iI0gDUaG$Ud!K{JRekJ5hZbx9e6>c=dlgq#JZTCraPB zAE0z_oxT?O7M%FTlRJ<%UU#@5QqSC#%^~PfC8iwt{dcVo1Kh6&mY1cF3hDudrNcOh z)v7Qg^cN>2te1hLMc;qV!P>e1;_KV`ET?t2^BJx6H`(n4@ZNr4elu+^+PT$>y!-Drs6pCAj@7dT6=0ghNG%%o03Xv1sD#ov#FoT}O}t$M1UO z=;VohppOIrH`&W_x_<@N<6cJtUOMxnZaYcS;C|!<27d4+PeOZ;DV?YzP~--~28q># zSUx4~^mwAGxj@Qou9MAOf`$BD0_-cbu6aS!CgF3)ub8plS>ki=M;*-0Yn^Cg{O&2S z@@f1jvV@H9FX!)5f41Z_ylnYtpm;NY_o0JA-)ErNL=1GaXDr%mNAsIg?cs)CbnbVt zLcjy277?rR9Cc>7>3pTYh(z8&RP0A>(ljkykqHoi4i!jdj{4lwA!zlp$8qR(p$_-p z`c>#boh#{kRDR6!TZc#oRI*V>NMv1g@(xCcAry&?r~J*WcQP+Y#Oq~CUpkeOL;8fk z-63da#}ay`XjRRCQRPO>P*=}^>xmx`<=8PfMfwMkoq_A{{fEYn8sY(`qsJdOM=6(ej>lKb!~b6(8FB3VkP$Q~nI(Te0PJ23N=c7u)oAo$W^TD<#hTCiwsX zMcpILbjFo*j#{USw*^(K9JpDHjhtJzV-+sQkdXHYUJG!}*2hyALAkY7u^G+ZI`~)Y z^vo{E4meZcsR*%-pTBK^aNN|}DynXk~yq_m2A+qhB%1kvVHReBk3F{bRiJ3nnN1U@Z94 zQ_OwqOnaw_aix0ck4g<0Sq?!jt~RCO(_5GHJuS9bBtk5a(0gsn|MMF2sgQcD(78&5 zkr|Rot|B`-U)(!AKlSzbDB~|#gA^+m%BJ6?x zH)XQ8_ZsYq*QU<%=lq~0C!z0MO{~Bx?2YmoD@9v!>%&{zgK`2(db6Yufa%<%62IwO z_O3T%^hLL3^a?QHSZloe=4acOSlU;H9nE{?IRrGjdXoHUsO697^FcJ*};ZWnkPL~F8-1G}Bo5ioa`UL5Y)Yv7W&_{y=V0^cyEprYt=28C{XAQ?25HVx zL}ju7RLaiA1r?V#&O#$Z%0aqm;x^IydXoiN#Y{Mv{(n~Z)CbcBbD+49CaQ^x$=kTewzzq3(?8ej(*XS2cj0MuaB%-Ob4r9mMCbzWRVerBMc#EG*Yv1KP@=-bvAhJhduDt~)b=|xe(=uz` zKz7nINzy8|xX1|l*MzfhCSt_V;~-O-K}jl^WIo$GYB**qSZ_CAy7nVLkAO>ssId{h zl}8J$E4>IPu-1E)TA#JW?;>-Bb1frT|Ey#19BFfyNVN}xNSLjG>ff~RgSBeOB z?fVJB4?u@F;GDI#i~RSsI--cN?Q{S#mZC!dT(s5erD#dfVHGZ#(L}VRH>-~%C%jz7 zQQ5OB63y?f;*Lj|&$U(mYJ4DneU`T*Rvf>G7murW-OJosY3Pg^=!9cNY2hd|ay?<5 zpQn%CyY-ggQ0220ssUSs9_%iCyg$?K?+ErZvjd$vPSxdTh1D(JP=)ZX=1ZfA>$hFz z)78IU#V?HD+2x}N;(c?v%s8w*1#xI?gn>V-PE~cZA zEbFBTBu!j`E`92^CmD_TuQtR%|BhBJqEcqQ49(sYL4%R=4a0lG9zc5h=qq!MjobDeTXahqLs$rN8(Y|`6b`P0sJ$+m|Kj< zz70buv`p|DDs#^_+$Z(rRRcp?N#G>6eA9yGp>GAP^`i|K_VH6x-|Y+G_7+3)Np3-E z)7pv%IlMQ8ozzGFi?46TAC0l2jX?idM3Gf=+&)JX~Lnn`8sKIfP?Mh%_uDAGer|-d0g8lBy8Go zF4(%gO~x35-tdSTs{T>!0t3o<;S=`nSYeY)8}!s@WFwdLJJ2kz)$j4^8=s8TQD1QT znM7cgdBAZfZSM2mmXtS4!PHCB<-}(sx{w>}R#L>4ZtMP#advL-nmCG}r<&R%b8~T2 zznIjfIYGpYo`E5{nlDsJ?etN`mzI^;bNa`gJY(X=fxVhUSH4T|7bWfe0}Vz?rOSMZ zuzyaG#)yOpzT?HW1Wbg79Cy)!pxldI&-v?lVfTxNUJQ#v!W<{rQRkV4yAYyL)-TYE zPLNk;3015?$q1+$w;rQ+atuVSWMn9G7D*PRp^$*j0@bh=#eYj=^);C7o4f>G%@DcF zs*D_{f`b`fIt4qHJ*9uk-QGG76NrPp19CxM;=bqE=c2UeVDytQn!f#W%%7#RuaTy{X|~L>ZO1fSKM1J2jl}3yK%F=jPiDF{Oydul(8R}S*=5<* z=Uih&8iSyYCx`0w#43eqwc{ei2w9VaZ3A~Va+KfV`Gt3DN*Z3d`X$F+0uN=<64X<-JyiW?E zb%cP7H(aNd_>DtA!0Z1;L0w^JbewZ#x_Ljp?EM-=I%s|y%Bz?AXQ-<$Dzy&>(L+so z;~NtSK&U9mQDRK?NwO(HOuy=)?t?#jGUyGoVF3aSW*3SFiWErpG>eM9q2ep~KmZbl zED7iNALMe+Ayi3T&a25@uWtw)U4F3Qr?t9jEv|93g-OPx3m%mQh!dc$Ub|2!B&kG)U5!7~g7I^R@t0Ir{tIKEnR=&aXyyH%97g1f(R|XNNzCIAz=`+L zC!Tju$NfJgbJ;TYV9YvW80ZL2{Wt3x%&IR-TTR{7d@Pv$OGv+`S}0&VqcQ+xY9a6} zk)p_B^d~#NXYILpmtZ5}A#W7${H$FVtHV9s9Gl3t&sqF&0#90Shd=i7TcUlUyqTk^ zrt;3NV1jy?8eYiGR^p7gbChJdi)cn(m=Ert9VahstB2s<`)k&)&_9A6=L5g9o~mu~ z3t9XMg-{^Lb|&Iq`Mhv2muKxha4INK^kd>5Tu(S1f&N3HV%f8Xo*^qlkI zoPAw8*52o=d+oeeU;t`)^U0Al-p$mF#h+CK)PChzPUZ)&lZk3wpsBsz&?JyXwMrF* zqEuR_kXrS=S1#(3WCP4J%|aKtKapo+8wQQUwpe5PDn-zIr5Q}MH?r8+^FKskV8&H7 zPsa_|Kj!UC{WjmJ#oinz0UCxZxwH6~ybF<+7-+PP*zNualx|p&2pJB;(&^XdpvfG_=qw;+T!QGmH zX_x6ICNq{r?#>PKOCd5HZ#Bdjc>-KU>Qf0WiiQGwFBe;^=<<_ru-zR7?wsRa=$Ms+ROcRA?PLVqRUtYvE;hxRXPa!nv>OtIAp zS9MVjp{cKA&Cl#O?167EYy&H9@DMG5(r{HBmqE1NB56PmVi{-AaUg{^j%(OG~)rm*e$x%A0jav1XE4hBEZD@GVBoh<3@ zjpBePm(`C;+7EofWD65NLV?6Ue?(~&pH}8X)v18UTvsHa3M|2A26<~eD(`%LZ5&Nn zv2SXXGMeX?3_X0w>fmbOmRuCk*g4b=6O3dzA;_B_OXc1<3B!xkiYV%<9tKE3SbcPX zRXzeDa+%nHI|}rhgvz@zJ=CZ4$VB80g!4_q(J(_nu5tbLuDASuc~P9bceG8k@TcZ> z|43%??OZrP2YzSF&t)t(duN3-`Qf!sSwi)(5Mj!b6r7TR`ISgd?5YKgOQk} zvb8`9N*a7cY0Novw$Po>@oW7P32{7RKUwChfCz>n_Rktj>4lkVD)5#;mHRlz@)4)_ z58kgy*|&ayHA8c>pnrHnh(LR`fW6dE2h)Xa%iQ~B6$FdS|150iwU3j)!{s9ZukNcY zs^O|lj@E9$tw)K&0QFn28bI@=2URf&iXg*B+Z6}+0|Vi|-#X0za1|K;2L@UFgyDc2vvBUL^*FCK&*W%mEli&KdxZ(mLA z-0L=uXa<}GxX_j$#YiUX$2y}EW4N|2({Jn0bNm(&`M&dP%_;|5l-ON+xs@OckHbPI zCf#ASllrfpoPV^<43u<$aKL`|M+E)`FCz-?mbpi}vv9EHL1>g@o{KnDSq>h4OH9osp+i*;<2VBVq4M^!NRA8xzj%2We`DtAY@*_ktC3-rsZc+K+&x*>) zp*^sW+vLd9n@M)3-mogY&WD%AX{p1mgZWRfaEj(N(9^WBo3PC4d%IHzYkwxbiBL4>=w44_!&(}`?B@aldSUKiwOO#j!+Wk6I%ch^o}@a1Mu z!KP>JT^dU78AY5DE1%Njwgqdd8agl-x|NAy_pDkpX0<_Nb-$=YripEHpAjr_qr@`r zEv>MA;xsGda$QgnEpi8lIo1LmSt~t=AH-46&WZQp^@&doz&oDSyvyMVgF0zG2AXx? zt2{8>GJ&9!6|J$wANDNhq64|=nD<}iq{rT}VcT?b=;D?YJ(QbdId8ZvxxBHFIM0Ck zGF-`JDeJC@lc9Y~|VF7CHD+2x~MI06ZcG z9<2Z{q21_R!fEGSmaPoVw$(qYI20GHue{!U+U3R1Jbi7=Tu@PM{(!IamHG4yEp3zi z?yw&>zKVl0mQYpShnw~vmp)*-uJ~6)oMWw3D#0HjafWRZX0#kBq?2nhKr2PBxzrA0 z-{2c^x67(4by+dt5B4^_exLk3S09*tTSL|3;rTMrL*tepR>zY>bhFCV!k-DmD$aOF zTxMWN_#W%2W*?)G2r-*sRWDsr*kc)nf3oFjwoCCXv<$n| zjs>be2h)~{Ehc(s4`a^#&Qg0pqQCzenH%TEL1 zi6bq>osF^D9$Z+Z_8a)pjEc5j=WGIQXjxu(MB7rwsIz&{6Ux7uW43^Ynm`N4fNr5iBE1!WP^FP98)3`21QS;@vY&bM zN)XmVPD5b?8jsDXe>yTl0sxh~2KHWi4 zu%tF4_mJG95N2J@#mA8jw^VjTdArSahPdIgOSj^K%tP@VK?~rH?6=Zn_Oi*1z;p<- zQX7k2_iS0qw;hqU8VAT^+z=-b^f*~x?sXBZ9N)m2bYqZDWV;In79L>{gj4K{Craeu)J}G&&{a2D)=R45}7`=V& zKg9eG+5hi@56fCRqif6&v2}0A9V(q27~6Ww)gk#|8OSvD#=oPX%Dt87r(Yt*wB|I*Rq+b){J z>5M?rC>vf*4*s1KeWZ<*tEtWWPG3cSXoQStB&BhmLCyP_*nmU2Eh@;1;%tve`;+?o ze0GLEBP*C{nK4p75oFC;HJ1P`ZU#Q0&xP#j9;|*Ny#D79 z;da$XrRXNg%|8`U5zP4Yi*pf(;Q}Oa90BBj&Zf1V*aW4P|>|%r&mEtF7?G=xONv`RE$K6}dANRclw< zgt+lX9oqS;*cRMJOpYxCD9XM<^$=g_vudZ6sFLh=;w9ce)w%$$&;t>Qr>#Qns_^dV zC$_sboA|!P>@}dsVgCdl4C^ha`0#|W(Aw~(H7zW_)A=YF*(SW=+l+fQk%1|XmV)Tr z1E()q#+xoBZeupav(ORt|A!IC;{a-rXC(d6HV||HPP5L@IR-n*t^{LaDdB5l!?cY~iWXi^y zdiJyHC2sv!_?q}gQZw~YCoQ-de}ZsDs>OYHol1@DQcI*84py7KJ(;qa5t{Ai-kt#KD9n3@v4<{x7sp!JqZ^~-TaYnOD#$s$jUgdC zS%NgQ;C&xp`_WYmUb6eFQV$anF8|UqEzy%xT|^BU3m7Ng&b|D~G=Nv>W|L3QeLJF5 z5{Z7h{``P8qk|&%cMpP6q`%#iPV#;`^T>Wo+Bv@oa~wfD;ewu@WrMKLOHw^-i>4g! zuEK`XBdX~lEmBht%g#oJ1e##!mSY+B{SGUw-c zNvkxv#{Yh{J5B5xueASOFt_gM$abg!*99NBj%g;MM63iG`$o*z0tE66g5poZk)J?f z5DSFw$v>KX3zx0NXQ*dwvZL^fZ@`SFt!g_V{u(}gtbDc>4P*;%Miq8%cKA1nDaZJ^ zjN3Xb_UGWBnpu>EFWr62syL0$@%AhopG9J@^5*Yn0W#hkD{xX5si8m;Tgf{TheHMk zSoB$t^8GOBF9@;J7k*bMxM5F#&S$gDlf6ARPnbL~ivG3TRK9)%-FJQA?59^%BEo;? z#tWbPi|mMy9GW9u0Zt^8(gDQA+MWi6w9<$}!INU-*u1T*R8f=_xOiXtrdqm22>1ZP zQ5{e=|ES_U+bRH8QQrlju%a*aCB5=Wx*>611)XlulQ}|9KtR-fQErh=M(I=CYR@&> z9=S!lwS}qirRtSRz7W~`AM9YD51y(hU9t80taI4*dQ6slb~354YWuQ z;vx~%QPhV=nGX(}Tw9xN7(>eg&IVa$M6uUOzB#V3eOc&k^VmwKBGyXx%^Y$}u3Y}J zabe9)d<^t~R*gJrxz88ozaUrB2(WWf(Wvd4sILHvz^;6uuxE(G4VZU;`mZp*L?`iTa4W-4qI9zXKcyhP(AtIt(}k-IBCOwc z@y?$XnvsyvR|B8SHgB|=k&a0aV3KKVM9lm|O~X_IaWfK50s)@)zc;h5bzKnn*tcdn z;G=e3&~*m%C?W1`wIXoR_9@cAO<GeYh(7SdmFp z)SO8&+dIB>=D#{MsuFM1@#mlXd9Jmnl*8IcIv>jQaLcM8lUO%@-5G%D{;)M;;XfPF zy7SR*;^pGU)%?pK^r%fT8_8%{;wyEn+XNs%ToaHS)vPzdJ8py^a>jxXxiHI3@Ha5C zmyisAPP!2`ke{2_eFU!ShD=#)aybLJ5LWizO|g&QOsGOrY&XBBy5TBQkULZta`$l# zqKEP>f+ll-R{h$M@tkK_LR;&xM=3lDw-u;X;a#xH!tn}3+{Hbx_{6^h(pmN_J*2uf z=9%lqDAlx(MG7M0HWcl>aToGX9??L9Ds-uNTRtU*z2vkww19=~yPHiNts zN$?9w=iDF9L0|E@R8$wj-(G+$eK{p;+c!Zr>R(2BF#$YeB3%{~RaNo4uPW_C?akxw zwdL4kz*Og;&;^M2$0}|gr)-8vG{yTrzPf2_cRTGy|~l0)}>Bt!EpDn*FRtp=Crix8cs3 z8jEC&5t7WeEfOR<2i?y@!hukx{j&8Rx!q{WpMgUV)vb2GvrI#x{X)3|+@%u6w5&P6|Fs>-WjpWz zqNk~rW&1?gK+n$E&Hl$R({hRcJaOkL^w-5^@1@rjd2o;5g^Ig`j`cZ#5@= zX@|TIftm$Hvp1&{g8MaA^m)(7vjMCZd7x8trvg zb3yO-@9`Wvs=6ZAZ3+dKm%L;m6$hB_FVFSI?OCfJ@^_}f=EpE$iJ!z`WRX)(Gr)qUVp-OJH0f- zF_L{M@9VdzdO;x{Bd&KCFRcZLx%s^5pS@2veWP;x@Nw!=hkR%Bq6dcLEx} zxl2er?Xn5p0);Mjf^uT)#a#j~LCKA^GdcA65J8yfo{MCDk^4a;VB~5r6a15_T)VC2 z8^xj=P1S3E1_P6!NxH6JxUbOkaxMpT*oc*dMQh}{7tgs@H<-HHT91`4SWjK5A&G1M zjx=fd1~`9n?L4%$j&wgdPeJ5@tO~|Y0rK`{X`M|feaCXxX#cWWQr}wkI{DEKm3bk@ zb#^5#ZiM9!pB!S|`LyT0w6=l$uw=UUT7C|(cZ22WUdf8}5#07ux?5%InzeP9rig+L zt$5(RF|A&t752-a59IQ|VQ{+xypaQ>2Y8Gi9jl#(X{+#~!p#~1nKB=;By?DeI7OUk z+0~%6XK6_!B-Dg`Z{d&?h@MEhGd%JqE>LahyFkqEl^)}h9grOMUUugshj4pc3dAV& z3B8h8pfP^puKPzqU2hwrgG-*cO0FTmD-EO;YMXX-Ih z3^YoahAACcr(GyMElmH);bo(w&R_*iQ~Rg@1u2>$g%IKZY%XeLDRk)6Pg)FsBSSe+t*DV+k)JL$A%8|d@B5EE(Hxm}w8lCN z4;-c?a3Gz*lfoiult6a2iJ8@@9NS`yk4G@vBCL@Co@F(l619p8ch9rk7t86CWC5+JGVV<7VCge6 zSF|q&I#=IXalwQY^(~T+$f{|t!a8)Kwu^mmr)88AJn|PVe9IQLgsA7`y8Q#jr}Nm+ zs}OQ6EUL5hnsK*psrX2yU6f?@7LKRMY6#KMl{I38C>ovqyM8{hxS=%S;tBo0D;g%j zbPnnc28w||1!95IY>+vr=~gfH!RS5rT(<`cZ0|4sK<7B-`I}WnPdd^;1mn6+@xs?z zb*7v0e@}_hgXBA;f9TQ0RAOn%OPV4q$icn3VLlu0>2pT0!m z$n{{yIX4YCo(xY*h_-{QzxKhM_8K5A-Fu$pDtblTn&ztCOz;b<0nBg|hg~#*lslSDys>Rf zG8it367TJL=?b}z+yvn*d{1UD=?U*eqj>Po7$Nnr3p-SEkGhl7JM=cEdor$}AGB&KETOHI`UvbYrVQMB#5Qual> zKs`!jrK@OxQk*WN(P~Vjm|gb2l65is|3rI*3Gyat^d44vk@V>#3fohZ6`1+$c&e_h z;XMZtkXb-I`n%3TuWbpsBF6qqgxXJK46EIfIUX#rT`&medFpD*oSY3Ha2NWz^%=Qm zf-D(e1=ScdB3Lbri}H#fQKOXG7|0JNhjfI~;{Q|oL$v(;u)&Kg9HHH%X3MXNJv)=2 zXhNH5IetcMr2)ahX{3r9Qi~hZlK|-qUv#|$Z5rv2Q)yXpR6^D;Kxo9N4hw~2`32@5 zmR&o?I)}rht*lGZgofP1T2j9$m*9OEJb2|7u1<%XP2D-Qao8Y-5deou#Bt40!sx^@ z9o;IJV@+LtPX&P~wyvb8(<+gyLG~_2OTqr(u_X>?;_EdznP4@GB?N=*#t$CBq=+d! z@sDa!FR(~tOc2vzC{(>lhGU8IRCqnn5FA;R%#HDyE3WM3fxz)mL)xuokTohbkK#KD zFDb6ULe!IXau@5RLR8VB*6WR^f1rC`wCrCxJ8zAGJX=P>AqOYzMK)}yVoAJ?CEWk) zH{=V+5-z{BMxrD+|u^*bHo-q(eARYM4nd@*gO42BJkpFG{!+`YS6{TBn!U zMNjC>1c=NZzH=7;Mub?zDI@Bn$b{#)Od5i{KdLAqy765vx#IF!L=Kv6so)%x0pEV{ zeIM3s%F;M`?7K3BScO30W19au^YIb1aR;vgT{s_N^G8s4c#1_SZ~&G43o|t4o~t5k z2Tt0thu6(+=V8|6Hhvaje*QEfE+n-z&)fhxMf6nrPjvY*Ibf&%Vxv?>fG}KD7rJ-p zYwbm$(-8NP1}&1^iS`Q3vxCmk1nyz(DWB~?TpGw}E7O?DrTMlVD*Uf_quF!K(KW>Dfs1+(t?uc^ZTQIj*J z&9`46;cy0Nm89WglfPWKiU0NY(cSzQVyRwa?l(_;A*n_ru;b@=`Y-O7G|ULFIb#T! zkcUX*ZPB?pLf#=YVmOz1;6_}B#M}1UEcoxzKk8m)v?1|suvca@T&t)2xzp_R7MM$1 zA$L^k*aW2~)leC}*JEArqSvvEn);#$2nv+Il{s>$BKu!Vc+XOY{ZBvyGvPqB2y^O) zhPv%GPB-BxUGda5zF{m|>o&$*x3-%#t0irt3yp|k@re4u%wz2YK|aj!Bge+CW`n2T zpdZo*uSq}C%g(X>n*GopFwy5?dHB)@*F$htZ3wHwz@AmG&r?4A%a17SXAFn#E?XlX zd^der%Byx2)twRK&S-MvsYQbU)y?~9kD#Q#pnNU3Q9vs_xf4Jdp?(OKNpA=&AAec& zud}<8+HLiT0o3mIQP|?NG{oewnGI2dXhvq<#zlE)3<;t>$d(C zOs-=y>cQp%pd_WAZ;vwSP2_Ye9~9PkS9)xZA%N|&t4Tb(<0P=!iBV% zQU`_@X<=5$e|T|ZotynErfcvd>ENI5n4lWJ{6MK^loNwDv83+63l3AlaMqkB{sI)@ zbWnWm8BWaK(L`M@Xt16pN!(=r@y6kvsaVGs>dJlQ`1!fm$#^|E9R@y|JMn2hCO+^ELua9L!sZz zFs$FWwoWk%Z77He9IGjEt113 z4$62rv*;bNq6qTjD)!!(c5JDiPshNDy9^P6EA=66B!KMQl*Nm9 zQj0a#pnhmNbbiU&Z{~hsJYEpp*+17PP4`;lCP!pkw4wj~%-a`7>Ka_?YHv+iTRRx# zK3`><9_N2AvlZzMQ_gw8!POM_J`O$BkTeNou(}=h!t^rBQF%;*mG^6@Hb#NPIQ_i^ zghn<1g>e*8znZz=&%#k8wHMjy5e&`mu6YsbQH$5_6lvyvsq=2E?ITaLNJZdDIVl=2h^w>vjjxWj;3#Wc98Yc3C$A$f+ zV|@4tjkpmrHNrcdEHEV~#c_mR%{kR648GI-;Tz{d6XvEZHf5z5&U%m)5)tJU$LNjL5V{Y{sY{Zcrg@Z9rY zPJGl<|7P!{jG_Hz)DNM4P)(^;57Ws)<+t;t`J2(hMepkK6X}Xgw%$#>K3JZ=X0ZR( zbB~SUL6+HWqDo7VH7lV2>*j>!XFs{B>*ebZV_Oww$|BTg3WU@VdGEJ|8QRTlF;Z%} zo=9b;Y{~0pmd_1~UhpE^X8&ENXD##tKlI-f;VdC{gl z*Yu#XlyRtz9Z-xB-nihMJ}Z^XBX+O#4C=5F$3wAF%t5_}TY>d$BzhM%a&0f`M{u8K zo%xUAHp;|)K{|e`vzH1NV<`;)p{z>98$9Wwbp)m~V1z796Y#7=Vi>tTImJy0F|8F{ zdjbhho1Fx;$ha$igC{<7pc=0hNgT4bUdN#amSoP{gnfy^$0Yj#>TUJG&U>$ZK=ocH z6Is3Fq(($|fSZ{BW~Pp*+Fu}J0>~Pa$SdZ_e8t#%z5TJXuas~qxw!o<)Q$3;7Ch!! z04${5Ix(Kfm3-zonUCM8MM6&oO=RLw`l^)VZdF~X>0Vi1-o{Cht{X0tga86lscrn4 zbDr$PVrvoUBLx}oO*ZqCBWRuBOu+eyRugQ6AyAW!;}&oL65+hyXzX08LYEzU+X0j0 zNt`Uk7=947HDYzu2xBPY>T=Beh@My)Pkecw(!|@Xq?q;DC?w?Z@$oNpuaiL71Q(g`U0rT zN!g@IIF3|Fjs`PoRAN0%ua8oOEG2-_OSGzppyx-EA{&M+XKZ9j@osF|D;#0YvDjff zAPD-GRImd#@9p2uCP=}SW~Zu5$$~Jk=WRDuuV6b=uFSyFz8DewQh8<|mMa;W=N*JI g!<+($5V`tBWYa*Jr5VtgkAc3_m35Tr6l@~@4>#lXA^-pY literal 0 HcmV?d00001 diff --git a/assets/screenshots/mobile-artist.png b/assets/screenshots/mobile-artist.png new file mode 100644 index 0000000000000000000000000000000000000000..7edaac2ca173ed93468fa3304edbc57c83e2e79c GIT binary patch literal 72900 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

    ^b=Otw9Z^*#cd#pJ5 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 IM6N<$g7xn4N&o-= literal 0 HcmV?d00001 diff --git a/assets/screenshots/mobile-audiobooks.png b/assets/screenshots/mobile-audiobooks.png new file mode 100644 index 0000000000000000000000000000000000000000..f886336e7a96be16303bef70247389c7a7f70564 GIT binary patch literal 86601 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≀w5*U*BQ$ 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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/mobile-home.png b/assets/screenshots/mobile-home.png new file mode 100644 index 0000000000000000000000000000000000000000..7b72fd6b613de627270ead0ed3a7f277c12c1df3 GIT binary patch literal 87302 zcmV)GK)%0;P)1vN)OhFuGM4K(eu1)7?fTTC+u zMMJ;8zkN~)JWNC^EGmT{BV_?JCMG1~g@wk(#&JUm+CxKIOg?QM3iasRY&{Fl&CNt86&ei) z3M3zIZ*A7q);l{pdU|9Q#L&W~x}Jr+ zS4hE$UZrzKsUi#-(p59eWbV)$LJv;p0 zsa#QwMniBmVTH~aAA4nvhb2Z~b4H#F3cZe**q{#Pyl9J2MAM;dY(k5DX?0s-a=oc& zyoWu!bqw&+fXl6}+@(Q`Wh4V1X`!T4N)r}=j!bU9>}V<~7o*n#0xf=5pufXKr`r77 za68V39<&x1e4oQfdU)^7pPP0i5D%iLZF8VN52>uX(XI1`$?@Zhio-Kw8acI&c&5%| zacO+Qi%Dj+$mSMwzmc%h1`kPMZlNqs)8p4cO;MhNK=0?SvAdny5{pWfOY^dY$h2D; zQm5MHhEeEhVbjiSrpCb@E?uC8x+NoiMp(fPjiYlAZ>?nK5Y(UK00B|KNklV&xQF)G$owJ3CvMFbThxKO6H84M_*LIZ+|y3vhG<3ho;T%ov8U!ZGW zz<1C`5H}_<^&~kn`LNs=H9u^6ayquXx&Jxm%uJHY1_lNO1_lNO1_lNO1_lNO{vi%< z0kc{_@B^%ll{cDR9gnY0N8YOS*RXAy4;Zj*`vB{jApoj7PrRTo;2X z8ql#iP#E=aZWe|&wg_XdnK%YrG{$CKfXdii8}kd6mJ9PH32mSST}6%q+-?PEzu1|p zmXWKoT5)cH>{$$(?FIofSqEUy*ePuIN39CRex)|4E(QvS?16`D(-hyY$x|GB%2zM~sCe+1w?=6Ve~fxKIqA5`I}63ga0G>4Uc08i>rl z-(O`Rq}&j^c961C(IPb#ky`C6jf=E&FiYb&S!X@N>}hIEZRTF6n)k9fVd1G5$49x4 z4FcH%Eo=wb{?qFRbN+PumubM0i!hRa$LB|8C>1kz<6pS zM>Y8bnFT7EufmO^9G4q-^C5`5`E%ZoweyMR=*@_up@rd(&KPHAO`#F6ErIg8tTp^{ zR47D>3vL!ckdWpR{9ywX%u>Tw(M*4&zU@txo6mddQ9Egr*0}#73xMmu7g!a63Uj$7 z=u8@Pj(p14>S#VltQeb`rZ((yFAkN*Ggd0lccgc(&+(Xthki3^NWi|gH6({#`*MXT zx|?MbPo2RmEW#dnlO=#>dg(kLt8$WO;bZ@FB0m(x;|@nV^3u0mbq8+PzO!CHAwfM>boO1%9z zxyjd0V&lu+okSYy5hNAKgM*279wi#Nmb9JRBKPUN#j`d;xUah##9=RJulQM7b(?78*|~?o>ESdM!rS&Q_rhy9Ql}(A+O?1 zR*|Hvqh~zT&5JBaZ__!c`(saUe6f?x+R=%c+967yHe|TcLDVoy!)IX}H9~f`i8PQ| zss^GHa#-HH{hFka_2h}05X&HTZ8n=%lTVpY9%4nZj&7D~6v&P&UFsHn@PTFl1tf-x ztSvN1C~h%@%#?CFsWr?AWtA?UIBZp&P)IjSh?tbf`E_+3GgN&}iLu&q>7e9?~7s=L8!3u(~7 zYZ*`ZTV*I$JHC5!8u(8c-29RaRzzHNoJh-3ltxmU#+*7#qJ|z}TB+#Vr*T2`$zOIw z(D2U`@s-n=G@Q25aHur!XLqAym2ei$l~MuM@ompJe~`cV7(D>Kj&3jD>Bs2in^&(7 zB|el!oN#W5*z+hCHRAu9?B3+>oGYfvpDqM<>=PBk73u+5DUG?JY&u&*@!Lwn*Dt){ zB1($m1}e}Vm51*lrPSoHNOh7lJ((G|KcX}ep(L#!A2q&55BNKEKO4x3!n`P*ONV0T z?8qmn7-%FBSdKu|((8duP-bIyv+_!p*La;Yj@k^-Ma_jD1b0J`)S+`z8F~izPME`m zEOutxlVZPpGPN}06QL1{%vGjr|Dfkod1X9}$@Mmdr^x<5DcuA!1ZoMxx;P{Lfd-Vvy( zK24DvI`tvICAmb2m@T9+Q^A=)%{rF`w+eWI6%k%3FCLID9p1Ovou}{4K(jUw#B}b7)=HoRgywA{J7k2rIV zW-0bBxkQQC7p#U{phIwSN*gUHu)|;z^QHvUoP8|mwGDW}73}jV8Tk2R>Cc2LB*DI4 z*vLYwA))bdXnJsH$C9)i-LwQal!gWf?EfiU9O{~a6oo<*@|x=X<#j5rE7Ex~p0d$gj4xyKQKXZbU7dqXuC(V&^-Q zlfr^bbQeoI!w7?74iXakDHbl+8sD?dhi_(@e$=|Mlti_1rnC69#8Zu(31e zew|on)ZD2CeWGwHFyK-eK9h$KO+DGeN(nUkS_do*4!Yn>A3#Xga)8i`h_W7s(?V7)8trh?P0N_pQN3fmVTlwM) zHubFKgAr_OD1%?ysKMr{IfJ#+p+TaWG*}yDS}Flvw}D*@6#8b||aFp~xeX^@Zx z32BhHDvdL&-Pbye8~oUdy)woD7yv<_3;h4dT{>!-PMCO*3#)?x2=g^4CeP+HD6d7H z&FbVO$C1gbPVt$81q`i$adom~xDKs>|Fnh{{4AuI21Rh4>a^fxA^C8yzORFGKFproe#>)?z}fUC((6oLBn6lJ??B$MSI&9UzO`}UU-eThq*a(iFf2)_M=|@m}4o5KosX_D7$@b7h z5;~z3(e-v2bWsb888z4)W@tmqQIJZZe&GaZ&{?8YV7gB1FsCO2?@Au4}CSCt?& z@Hj!VC#sQ}V|!5-l^Hb%{XQZyC}n)P8JP|{HF~&dq&dOLJr%b{zeEhM_u*E7DQdIe z_vjX>VP;SRLg3C{n@_w@cvFNbct?n}Ss36O>T7WrU{AMBDBqS-Nbd|DWBNpB>&l%4>USo_K z=WyTWd~;{c%=^A~zB|u(X3pHN?~F;+;c624vKNXDD^PeWy3 zUZo2HSv9zEeCR%Xtp7i{@f!1!5vo89&raf@-x}A{@U2g1DHnXtPgnwUbv>p zgUAQE|AX%S$kQQf{JL#4MN|WMO*Oo0&z)kxuA}PHIX6;|`Q-;j=jhB@m9siEXF!&w zpP5pk@1!L}jmMZ;U-EuLm$0V!thCpHKk?T(cg4ky8|C=)p$$ZRtx*fAR70c+xUTl!wo37^kkM}*5G$(;Lxi9qwUV0Ux2Kh1=a9zIpPc4T7%cFw1at=3|Mws zpi~O6t1Afo&$GkhZ;X|8_3lz{&>wjE-*>e01l0f!4*E}e$4Os%xnHUD?PcEXystVj z_MPXBldq^6Xu;R@<99tes8oY~&nMuW{P*cKr3hd9r8}Z;^6z(+-OV#ojYQS>8OlGq zIdXGly>d^db7)z;YE7rJZR|Tw8fjZq$>1&$PdY2J6m+$R1lhPOGyDums)56!Ua4zP zsU6X#ZShK5qxRIV z(ayuFp+CtmTV_P(01e%qFh9iY!*<$UGujYV4R!qzx^~W-8TGo989%5wx+UzTZS+~p zUfDG+>&@gSg{YARQ4PD!{y(HpBUx?ZNLe$7Cje0WG zFr=x*FLJABp4&g~-#^gDwx;1!<7|KKvF$~RalSuy_rk*P8yJonuMfI^y(y(N9l?sC zCFrh~-kg@gTl}l(!tgr??`y=-!vhASg#W2nv;;5QLzY~(TGg+A3<;|73Pd3OJT)-P z9^*HxeGvCh)VNz1(lHb@FrggXUi<}W@c#qHT}X}UF-nCY9Yaxr%h10-4gNdnmvio_yR{!xyce-c8=xK@r$f#^lXT^%y1>ppR#0AOzzP5^VD3 z6{H5b!0zs!d}L!8dfY#h+|a(;zkhaTpUCw7saS3KHbVOnhnH*>1zoa=wvjY6HL3?7 zd1{>K`v)FyQ16`=o7GQ6+4uSfxo@KH#j}s4<|;?O3U&15AT@aZiRXY`k&=q%>QJ@g z5vWm@kF(AL-TSw&@vMTC{n5c{%3X2AQu!?TBp_s^d!XXCY7k(fJqF{c3hl$nwx_yo_?X0@! z9?qMa?Vj$b>gDRq>+0P*x|uY8W+KC&#;VXY#*IfdA})R(i#=B#e?KGKgRSkIaB72{ z*^C8J+dHPH8Zg3&W4!23d2^b())%Sq{dOHE?UN_}Tn`34due)LbMwZh##X9E6)Pl4 zjo^1>mNj`*)QsV&Mjm$&7eG~GhF#DEwdEe}SV&AG!1xrcpc=qqpVJim8FfPBs8Q^l z^wW^&Po%_&;vbd>>_G!qYHaN%YquQ7l>NNxs{Q1e>r4*2Sv5I4AJgl$q>=1gkf#RG zBsVm!WdKyTz@?6G^oTMDr5Jwt^F{lhJYI3{at#XKK$nLi)932 zUVVlbH#QxguXUw{om|djX=mEjJ7;fb=b?5tZRvB9S;ok0x3SgP&1M%iH~ZRcM5!U5 z#^BtDP(w`F0c!A?sv&Q&{hn*Z#+^&#W#EYLV5I%N|Edo`4feb?(thmY77nV0#{9k3 z-ON+;H+viM;qH6;qiXog<+X*%BbA3yy_FF-+Iargt}vo>c%UsR6FaV3G0}QYwW6m} zj`Y&Z2ET9XA$zc`opnw%M5*zkXXVDq=(t16HQ0qXKXq}zasn&Ibg9JzI`u9@3z+fq z!n@Nb2@q_|BBUmHe;=)FZDNd7Ru>;*V+so4jg(8k625F6NMG;7}@brriofEHzHqQ&4XyA5Ps$I}0wR z=e}eeuc|f`$+Gk(s^JpRUsMh15lcz~u5-BtsDXA*4d#I84*+jy3x98&hB)D$%#9nU z!EF~y{dsB#^AqM8Kd=Ft%Lo5+r|hQ!Qqs-f(O_)~Y(n@9Ov1NW;a zp%{OEO#8_@-b2KhVH5KS^#HtW=s!@g?DVaByccfd;P=U_$EsML&V)sRwn zY7qX(cU_neEM|}^ijRu|v6^yKND6H|uztnLRfO${ zoOx;}UTjbu^V`TXE=EI%`9|x0`AJ)WeqsHJl`Gn)8o1BLcQWE{2Gh+tFaxSVc4Bk+ zn^u2s2ZsG~H5l-a@lTmsq3jTWYJeKLa7qI8>`x8;YP@_*dY8W0X z6J^FQRfEuYeNPP_Y$Jc^wG>q2(s_Ni+E%6-xMt7@QUe*o*uA(v>^QG?>Q6qhtw;^&<$CX84F76IyA1r`tA}Ah6P_iJM_-{V9XCP^-cGj_)WBZxz%t7W zPAGWbfw47tYH*Bq5P;XYH%w|UiI`kh^p}tR`iTNH*o$e0Q$>GZPS~4%;q4+dq|MFc zWe$NM`~z!V59%|n8nh-S2Z8?6!L>-2{#nib?LT|>54m#Sd`49GTQ4)j@JTcsL=`AxQ(O554bEs-8R%%*kBWBiW)7m--~NetuEi2E9TOlItt zB=~;hw_?w}>i!W}a}2*E%z)2obs49Ip{H`sL`7Cy34CiBGE7=V#y0<1)GJHA=C9-J z)js3Y_^ZHj1K;Y`7#;iyHH`cYs%`N%!0S(}`z3!kiT^v>7&=BmHEN6|YHHM|sZpb* zMva;pHH4_CQ6qwy8Z{#LJJgsb_3@S6GB^Ps27w^B&#OqV|GLfs%p;IM#F=5S0ntUS z2JAf)6PX^a2GBK-t^pNv4MNv|O&;tTl3_#Zt6>LqcNzBc{?&*G6ZW%SjYJvdgAm?!~rXr9{a&_h)vsT3Ptx&WyRCjQ{69nuD>}oEmOCue|(1I4~P?GMMQr;ZZdcj|yDmU=ks-=Fn6*YoaN+WJX#k4gI&dTyUN}uo~Z|;}Z+On#d?x=N0x>XbLtPo;OPI=en z)X=7kV6+1m?Qo!qK?AH40V;rn%?Gdm6%goncg^RMx_cBC8GXlOHIc(870`O;-zz}!hx zIu=L?Vv%Z&l58XdLtt@cD7~67C=M4{e&FM%T*Df!q+Enx_j=fI=8rG(+LU zkb;h;(-GoIvwBga@7q8Ff5Y@X+Dt_AW&){TEZQ$7w<5jFF@m7asMC~wx%f|5<%Gu79~H)ys?$UhGiGc*pZP4Ob&$$W+cHc zQso@Iv@tbOR~8xAKlDSVeJSzU+UE-tY1&32LIWD(=-z1Xw24l4ni!}}i!d!RiQl}N z&1(};6vZK1#l4GwWTnosppZpS7qip78yABX6aucR5|BbjH!+B*VXze{D(=LOnD~)| zX()m#?GU0XrQjc+i$SP(-<-B5&zI}eBA)x+yDxq~)F0>Gd2cKnf^RhW4TGE72?nxG zg%)~;;d%xt3cbT}4L20mKx?2i4@?BhI@30;h>xi#*UPG`~=)h^v7A&dhsqjZqDGZE4Fkmizs_p<=i^GK*+d zvRUR4k3R5fQB?a@EdFS{FBYG)qV&_}`MVoYt8KQz1L2UlJ2|~)UKVB) z6n?|tCfTUp3j#w%kOU|xo5`mnSrI7KleeYPW^yD+ybBM%uF2L*lEw3O<JPn+f5V#(2mai#7rs9e4g`(Yp5u$O+yLf7SWiz>wev;+Q*R{>$tvru>UnC7#ckLhnH6&99 z{v{e~yFz$4pw%E3 z5~^#AFOS>JNM@_KjYbr;%6ET8<;zid5{*wwLV|2FZq5h>=45P%J1`-1xUR8t#1+@? z)x|gJ!I>R2649EZnR>DUG~O9B9!h;VDrlgB=zS+Apm5GI6fXV>jocs5@J$ygQ1r^n zz1ngO4<%k_+3U<+3Tw4mYt^7J=T%KXnLE~*9Ucw`v@XkTA<%y?G1)!j3SjuC;YDPi0ki~V4 zbcxRi6!+?JUB)%(XPmCF1eZ9^}Gl}h!!dbXt5;)ND6)3d*bKi`SR^r3*_J=*{RJq%%5eHm+b;?X zpn<=~VB&-;3GT&dIw#4(XvFSkth}1(?7G!ty;ks;ZFK9?GGJJweNXRf`NXQB_ za@N#cgA>1N$jepfLve_4t%fdC6^H;B*lYJB?tQ!UNa9u!cm`Y}=RToyBjj;A^UXd; z=VBTi5S5?Y77&mW6#hL1B`Qv~a$P^a5FuyCq9T(EBXR-PaJ@i1*RUzd(KUP%eLrPl zH1aj^9Sjrt(Wib_a-4QyaX~OxQ1BhE7AMp|>NddwruyEN`dpIf7gWJ@3=sO{!;r5rqrM`w<{ynrrCi8pH=0@*0gpxkHmcRtkx37i=)ngx!=%VgefR zTVBmR6bBuuG%hflZqo(>iBy<{1;y$$GNsU z2Ar2!MT5#sxCRDx)4(7e`rRtIz@UHx7X$^vKuo#@L^Q~TD}@6M4sro;r`ZOWfNSKp z3rdc?hROw{fS|n@PAIU;61xm=!Cpgzthb>c$2OUv@^-lLg1E{Bx=)P^o?`sQgoOmf zUV~`BE3m;{xn0eAGh8;v4ANmgljI%0psa^iMd~{kIv5NykW>;5Sf4D%FwZN2#YILz zacpDA|73(T1q@^mq8i2|87deUwj4I>ClsPVD(riA7lQ1g477Me zc5`Z}2dZ4?S?s8qpUL%5-Ayj_5$X$a$kL4@GA0n-tSTlJ!82C9SA0n**&`GhO??r< zWF3hD-8Nj~htOy}qfzWeT>86fC(JYC8s-}Tjn!FjjR1z${4-#{$Zg4jMJ--_mc|Ac zHBzks9f#%@Y@C&dh}{W3k<`0JCL-UqYcH`h#sLi_?FSVjJ*@c|rwLGkIH@&3M`ak?L2Kj#@i!a?{+mJtUM+Vf6jT^XK5^6OSk=J}0#X zdyfXLA*EA{C5^;4B~m)u%EhN=62(_EBpkyic=ArQ(N-f%`D9OMyghM#VQ)yzaUnEB z1anG`afxeq=~)3ER2uOPZLFS0W(tvO7#mvLGBnIJy2xOhatkbD$tLp~A|7$dHBJ~t z@Ql=%N};wma*0B0yog3BF*+_3CNfD0CeR;3ax6+K8s!!m)E3V>Mym}x#Dtd``v7FG zJ-7xvNiTk((@H)89(aVlRAST^OlXX_77bbw@epf_e7?mGF_>_{MTupS+60E75#Fov za3FHwZox!$N21ko$e43oT;t8|N#q&1y3hyRh(?A(_amHvKX!QpG3b~%z0{gM(`lr$bOoFtoaBKtyXALPDFwElDSFP@82FX_8T2 zYeIpFz8`67jFy!ekNgr;Tu85WDB-zLunU@1(g|dU1l9!%YEK8FwAjWyx`qg0S|UmB zRhii@)SWD%!oV@iHU7r`d(gjB4QkFhThF+n*6`=d$8@{UI>W@hsy!+Z6i{Jc2#c6d zAc7Ua1v|6RHm7wY(#}G7t#Rh`!p=NTpLN2?&}X#?8|4)2=mIoIC$y}tC6Ab8fP*$G zJj*p|7#FmwIL6&wLxz#>OUx_Up2TCD>soo%Ts`AQ5eTxk6gET@!)}`@j}R!CFOylNEBXpQ9|KLQ$p4U zvdx1i` za{WTHk>eFc-AQq!$~*!pQaVC3c)zE%3pBmwX@l{H1KsEuU?3t7)c-<*j)6{dLC>J< zN15|?Jx8I_V2sIHfChcSUYFR{NGvL}XQ*7F^GHX!M}UU)+*!+>5&b8}XdR6<5_n-0 zG?+xJD#K1AArygUVA@~{Lum{GQm$dBNGh7#y8snQ6bk3s|5hA3&pxLIWh2USTt0UQcBvF+C&3SU;h(3C_2HhJOP9aa;kj z2<<{IOGL(+L@R$2LqQQb23!MwCW%E2cRkTHcQv(n&yWBa0II)Z6iek$A=Y4 zQrA|iAR3AzSXrY+nPt{nq>u)ff%Rr&BM#!Wi9^aL2v8F_@RK`UHj7zVnG0VEXDF-S(Pm`q?8z6PivwKEj9}Mbi28Wp@7hl z(ZE?dqQNqhiKJD>(CZN2$LXAYVT8!=3kkS}mR)OTH0%Bu|6E&LZTHkR3M>fGUyiQ zsjk~DD=21c+jhFgiY{BW?c28P0&r04)z{s&UGPm;pGxB;uJ9NGG)%9+s1!QJi%X~J z7tMJFU85bwOdENGYxG(q-z#ob3g<(=V2eS5%+0lkrUPDq5%bA)&bYm=QQKB%DgZ{! zT6M+KigSfYmwOy^7r_Jdz&Tevb>Bz1Q1ly@>O(y=4!Y|0dk-pwliU5duPHIktat9B zxCYVC>s9HA#dy;-ijBkTOvRn_Ot@rOvG~qyy&qN>f`*k>Ub*D(-+rO%3@XPpOfWnT zP_nE2fd`ug27Up72aMV?>=eQ}gVBO(w9x@H2!`?8!0YwyVy_+xyImL{X!I{nI^Ao) z+F?t+40t`Uyu9mrSKYR0qDz*}0vdfMmY1B**m&m(F1Zl8MvzG`(k~EKc#KRaiUqBM zPW(b_ObF?H&^;<0dRi_oe^M+xEwB7O=R)clFUsZ1rPuw-|DIz&9FH$<5)iY;?2Zi6Boqs0eLgzf`9}8*HF=tYv?73GL5rx`Y*sDfc;5H zBgwJ>g3OZjPE_{Y))#W_=f1%QK*phi?xef|G-}*Jb0G>`!}JNghvAP(_$avQAaRfr zx6*@?B;yaNaL>EOcX6=}-z(|yUMLCarP4c>d`f?OAC93LlwbWtLoy6{duO*EKGf;{pY49|sc zS9pwY4N{;g3XuR`e{FI;CDR@+mrD(`O z?vNvXxoeQ^7#a|Uv3WN2LU zIcCTZ|HC2v+`kb}wr#7pKAw!Z^4=&({T~9?pkELUhA7816eW~ok*c7$YQ4KGU%!BI zxm3JW5x)>Td>LBsWcb43UP{DaxQ0wnYrrG2v4O@a*Jx%3BXf-mjqA=09=&-@x>$)O zWAwIgOZ-7TbNRYUh{ytFHPO#-4Fe6O70f0u4b4TiR$bU- zq?~?VhK6VisYSyTy!wn1y|4Hmh*v(z&|o4V7Bys`*2pAikPX6MNlx=fcTy6_B*`ad zDg{Bn_gI^F?-LtC&6)Oa4F@zjx1xpvjx3l?&y<0jo#AlPsS8mu)avOsaK^QN}}C*8T!9KO17 z!v?$L^|SPF3g<0c$IAoZ2;pOz?}Ccf7 zMufak@rQ9WI^ZXTSs0T|Yb2`(z_Bb^z3nFF;2I+N_2&X2;`(f$O;+dIat)vpV3eW( zEb{(k`Gt!Y_X@9+3|Tm>-j=v%-tbXM}!NvaA1`IJhX;B9Eiz*qrabSpAv_9IEB-JUuEUWy$s7SSZgTTXkmpi zmrfBl2H-G+doh%Fucx9yqXEOfAYkA{*{)&T1FR$W3L1jSMS?9{p^%H3mPH*dVl?|6 zPbDcpB-vnYuS=LwTHe<{m(2wYq!Z(RyfWd?vaha6S4YY(I1TqTip_{DGkz27PT!<9jgB=jRh! z853+dRYtv91FZ$u&{YP>P$CybBGF{%d;7xOExZEFm(Z@ExG=)J<5P#||F{M?s1xZc zmQH#^L&q@h=_4I>0E?I{+t+ByHNXu=)EWU81{B7>{7T2D$3*~zUa+#h2+4qJK&&+k z&)~BHwpRp<7_ykaOJeNUa18e~La)F`%b-)#KA*~FD)b32ok6tJH590oT0`X$v&zUT zJ+EL&t>`gk#Q=F3#V4BL!jloYMvh-}*w`VPcUYu3>5SH5g;82mA|Ls#VR!}`{Gx$l zbefD>RC6J3nVvyLI8rUw8eoX7p}2rHpJ$&v&s^U#px2w8)GSOkUl`Nng70g^B%-4&xudC0-N}d?VR|7hfO*#Z&4*kQ$28i?A%TsOXAXlvVNN(t}_xQ81*3 zP?471u=F5k8z`102M^2M1d+{6=r`!O;xqYoon|M~wTMqLZ<*QMLVi5+pGn(AIsFVJ z+b`BDT`=%zP5tF{)ro#pGHK%he;4O;*dXtCy~{n|0R>b4%`PH)=OyH1EY9>aO?x3PF*a zFFki~t8k!Ful6vykuNU2JXvYR#p3a1J_QC95V9Grp;98(02-_^41(%*2sE}m@2$$T z9t7S9ecM5>hT;9dTgz*uwIEbcZEQzN3 zO1sAHH7le54JN;3+wWMuY}Gbw+wLqNH*YNXrlX%%pt03jwmZx<%8qSYXT~eI=xq9q zy?h;5ptEE$Fp{5hHVt&x*A2rd*~@0RwXAmx#X--_S+22ntdZu2yM|=Fs)uHHst+z! z2crZH{abG6MmeZIxRqNPoN9xM4=1C~k=AeI zRjYBLRE@QMHLneWXx-~-NaPx*g{t~2k8vvN@4sii6hGdKwRS$!HLlHYjYNb-t+l$~ z+a2fb!m;nZeRH9Fp54gb4xthEV7z{!1QMe)&Str&hwXK0K; z(uTdMIPA)%0kDoaC*K(x_*MEDqkJY4jeVkTNL)kojmMk|LC@WLqjToB9An}S8iTVr z$PC}SdDdi3f!Tzkfo9u#`{s?+m_mbLqDO}Y`9kqAy21pB1IcI(22O|^0}@nU zhJpl*pOLD?WM9T))0I{<{E-; z(1da>dnW@}z&aQj<`f!eqBeL5-O4~?=(3*oga)0cnn0sayzaex*#sI9D9~Z)DaV*t z22z3sUv<6M#RQKvhzC?GhK9w^P$y`7@wTD2=+o3vr0HvDt#wh;%n2HYs-G+I4jLE- zJTR!*)d`KDYKH2yttS<4BsxYCYw-P~nz$|@*FbJtj^n&rD7S3=%*F35d(|;ZPN{T* z1rUD8dbcp%WN6$48W>w@)favHW9z1mdZ~0hp@Q)NDmuvFBh+D_X^c&V#%0VgE&GlH z4Z$}gt|9uyV{RFutZz9)9G7w*+)>*dp&&F6eIgFI^7zM<3^X3I$>jN|Dc68qJoMs2 zgJOZ%g*idv;UF;$f&vK{O(t^JNPmKP8jUYrGNEuZXjS!-O#4d_*FTfJ*;*?nAVQhEAf^dZXMOGp?f;U;IRf@=hgTsmBeEWOeXBDeHRbH zGmh7AwLUh_E44E2H!V;wq1;d~3TQA$oH~+iDi>R;io#}}cWCSI3s}SrV`F*qSZfvc z{5+vSu5qkpz(geb8iH>~&>(tv2{ed{%w6%E#T)}sB|?bY3W@{`T9?q(9WdS0d4RV|83yXaU8@MCe>E%<~&uP1NjO=gETg6dl_x}LDFAeRK|!(7g_wN-&EK&6Rv?{ z1CcBUKtzj(%;bD$w9qWV;5@KzW8v zyg<@N)R69dVp+rTqnfsb@KSpSd&rhZ!XB|k$}<$6lV(39fmfu3JI)(?KZ|*Tf`CIR zxodFEv9AF%B$}5C95O7B?S|vJ=QRp^F9SKJgQKyJ&=4JC_nv1vfT|bxws_{wC)EzX z2!il%z2e1b7O0dSd`8)yoP-9&8ma#;0C_-$zW~Xemdr+DksTLXaF(RDYcGR5#h4Eb zD1E=@a*Z?(bjrUv1t*dKMkW`0M_hD`53gt%Avk8c2KNlP+PxPl*X*Zf?Oq-oEaPm5 zej)CG5*J8ftdWT5NPjkQ?`I?zYYNvQ+@V}!B`N*1tPJD$Pp%<8Z4q4~mtl&2ih&A>JXykSZfeYz3_W=sYb9c`LvSviLZ?3yr-zgFA)zS@%7-5Z{Zj zBVOA()*#QA^?Bw!We^{9kbg`|nVd5H>%NA_5Jw|70}DbTCkZg*F$PZggLfh#iwmUe zSc610feO(vDE*^jXnZ2!wbL98TA@IXKu6*m3lwK8&Ort-!O4(5Cz%tCG!=8k8n-jz zjI5bN9)0qeL<~JymW>796Bl%v(eaAE#4YX_ncktL%D;Sf4q-7($GrN@-r3`}4Mag0 zu#zGXAXhHb1&k^I64J17qauxpl!9u(jnxOx4d{Xg@Bw@m0s?q|Tqlnj6Qj-SBehZx zq~I*~r*N?_KF^z_DeCdeHH?PVFL3FTIlgj?EgLiIO2dTnU&*fI;7ojM3*A zS~s{-ErVrtVa*-B;q>aftIrcSU?maHxW1CC zP*2`&LgVvcfkNUPNgx4(TwsJ4JykrcViAv@AY=1&XBi$3{b2Onzfc^)IkS2~ zmGhMI2uq1wwy>e`3iLeC>Uw2pR1}&rmSH#$gm} z(QLze;xltnhC)F(ejyn{lLn`7hvTP*sAqIyA&%iZw}mlX-)-cIP|zxb4ku$c)dU%I9qzCwPbggI7ZgrlWnx!ml7-#g;QG~hzcCAQ#w485b}|Br+|!L?AqqY0Fe z46^YcCsrq4V3Y>Guo>qOYt4*xnpPwu4Gq=Z{+k7kOFwlal9=H;26~hXW5T-qz=1h~ z8rP50FH%mRe$SvJV?bQ@>psis*bXP<+~`OU89~m#?M{$ztI8Z(OhrTWeYdZEU9ak| z>E(HQ7vJLOSik-cs(0(L^A}d+<%(E8ly3mLH`?#Y0p-6f?uLT`R}#z;KBS?T(e>40k=>GlIZ}Azo}hYH>}Bj z!%ciq-cs43k>)?u(pASc{UJ1Fbb?@e1zBmNQ=t}c6lty+bLTD~JZ9v4KC#|)?cY-^ zKWdZ)&B}|Ps=4mYjXB>$g+p@$)w5BcnMvxQ|7F9>`jXb{Kl1U~vr;fDjfdg1AWH>g z(J*j9k-{<8>Imc505C=(qf}r5BZmkIrbB)x|C?OYnF%0)OoK+LX69*0>)2>$fQ&*a zFw&|#LRHN+C?y#*P!lFlk%9}YB+l{dS28N|VCVY;r=$W^hGK;#4G*x9C8J4ll4v4_ zfdZ9M4_0$1-y?2`VUH6__Lym^nxZ8=4(%bSpDK11roV zo=s8+Xmlv?tm}aGhBFuj)GE6OM(P(N=@=4>bdiV(R!j!v$iD#C2@1FX4p_5401Tu7 z4yFPFeqp3zE(QhIuvTVYalJdDW7PDNOdzFSXjM~fXZ8(Sj0M*MNb05l7G+|;zz~|P zV#(~$(3lz+xWFv?3{P*d?P237huvc(kAfa+Ll(^=|U6VPR z5Ca$^^co~lrC|UGC1wMYAQQNTt1$%KZ^h;$5u%il+*%8^w%hUh_uyU8g3e|H@5^B%=DWWQnYu2Mt=CmIYG zh6ICG2#t=BTmu!!M4(76xN>SuMg`Ys{f=j(Vmi!*ftiFE#o!sN3LDCl=^`}O2tw3e z@5cdUKvFz(2Ipv|2deb2ou*!I!eVJXhMFW85($J5y9PpY4c9}xK50XzCnhFTJx+7Y zr3Y1yKOq>kFuY`0ufjdst#1wWbeSHmSntCyY+v5a zyGW)c3*J=(78y7&P=|Aki~C&lIN|#EYS8dJ-}_|Si`uVk`>yYWq4%k__GtfBNNZXO zN#9UWGu&@gca2lm90fw;#8i~N#&6^JYO{IcP5eB0`VcpE-1zXc{xyz2#EV)22Ll_W zf>Znr*RY6)aIihF!a=W#9pvK?$~{)+Z8yA4XgsutiQ9z6w-uKaFPF6a1Q-rj498u#DM`us{K%=pjfY?p>=KPZ6>BfiigvN~zS6lTP@l)PaBoC107FdZs zgM+jiJoW>3vZ8r2~JoB?xXfBIWNw%{19$de~K$T=r z8eC&?-{B*tz3Ug(6||2RU68i#*XG$;v<&}Oacf49nvw9 zaPszvO0Hr3h%o5&sD?pzU?obnk;`B95GU`w6ODGe?M)4$W4lilHzlDhxqVZ%J zP;;@spfsFNywis#RdFv))ZiMgsn57hvt3(!?}6WL`$zh!4XrJs^}W8%g~2gOTthmB zbPZPQoQ;xlD&h_0^WrPE3+81FJT*e?)&tkx!GHyg6ofKGd9)1lvCP?}}F!+`L_D)$T}(Q80aoHiZly*O&U zg81&Uw8t=X859fuM6Y3`F#r%jU=1P7Gf*WKg?AVd4utGASd%EH-Td26Deg9_d4}vU z%3T9Ypg4}{_Oo2_Gj~aZJe7#3)N9D-;ByiHf6#9keEQG)XYB3|AVLmD%;CFQ8 z%_qb(*yWaiDUrs&(B~4w97@RLH*8h=J>X^u5)jBxQN=OXGf3Y_Ib)C;qd1Ibdk6Pk zcfHE=Ws)-6l!da$Vo_uxuHnldM#aRa6cZMM7{nl%C`mF^HeY49*|AvFxT3~6g!sWvu+H|n(ZeX=B8!GN)ykAMf>Mlqlo z;39Q*`HbrXL)J+~sm6qDuw}r{?mLf7$bWP z`Mmp7V~46np(NIfpt6N*sZc~fhN^~NUj-pfF@j2l(G2vy&8%tw47-nO#NJQYkKsLr zRg8YsP=>PCAOsjjP~?zvB^vdVq-2c+Tfrg^?(!MeDH^mHB*AcDNMVo;BO4qP8cLw9 z!N21L;bK)WLeZdLjM|TZ5Hc9WYshEbqZ(kMa1pP*7bXA(ZnLhcnxQ&TM$`;Z4PX)a zi}<{e?(<}(QZP3(LuV-T80s&O&@l@cZgmwAc?__D8_}a0;076SqaqnJ#<1k{60U{I5oW~G_n9Le_K{W7uNi}4zI68G1zP`og6k}Qx1C2^C z%~@mX*8D>GAJy5kLf7OWA&(KTQVpbIiegNu80b74SvB+%@A4XGZ5!(MZ_R5w#DKO6 z;_5MsYOwZcz%VhwV<;%17ffC?3LI$c0@E3KjE!`jDab{N1{i#y@F{~C3NB`aa}6WPWY{v|JPW>WIF9iNRE2^-%dXtdT+Rgkd&t<(^FyLv1K6Mp*V_Kr3*Ca>1cekp>#4%L@f)u!NDi z@bmzGqFC5@3H@gZx=$Bi1c8zlKkvY6@HVP}Gl^*sD~5T2m?;TgA?U4S01ZClI=~1$ zhWnNbkA&3>LV;Vs02<|m0xUZAVz42+Vr(?)Bz1^lKsEI9?yhSP3})S@qg-Gd964Gr z%bYcQp0F1XzO$$Gj5TLa6d*XivMJE)HReLq9JD# zO_+kXaTyEtAc1!?c2+htDv0~Fl0Y+DD`D{1o?GQLfz;(SgpM2Ffi13mvNdDDQ3}PuOGZi+8l5h~;}KRqaa+x(bfZE8;rZy9mrTvP zBvcF`q-PDK)(o+sq04ZJ;iEPdG#Uy8bGj7`ovZT4fQsO~Vi!u34XYY~W>gg}yHlqQ zWkSIK3ocYO`U~as7>wqebqoJxJ5NmAYt+o4nsM44dxnoy<<%8ir#J_UgPO(2VWg zYxvMv3FGF|i|I*DZk+D=c6k^M-J3p5f8X0{)BNw7&K)Hiv0^X;4QfU|8jPl5yc&K7 z(J+y|%4z-~{n{!S^AU*PQq`bLj9gp2acju2>E-0(kmJf5xNo^U ze{KF{c|Iw_r`>0-{rs{!|HJ&_^8Am3SHCQee@Op9m*=i6@^8L7vRFJnuv~t=6stxV z#4nT;&CvKo+qs3x6oqlz<9;xE&y>)1OYKe`Cq&L?gi1|zSm#rJNZTNi1)J;QkXBx#efpE^H|zCeaK~8SrJ^C8fnFTLa6?8O z-!_i=Y9#UsNKlo5_zXK8=WW_L$A@*^sVYe%l2L}Jt|456x#JTmpftN}E#7b2Ppmyt zY(nFvwfKTp!00u9e?xx<12P-NIBIop4ZhfFoE0b6c!!63JNo($6C|T zqlc}j&r4Kc0F9Z~j{}W9AFRdCU!v-Gm;*QGu_xJQP)_d`!D>T6Llo{gTyL!CIfmjU zu!bwVWg8h0ae4v}99H7M?oM+S5kkZ@3<;&?XMKJ|Lb++}IcD1cWE;7Lzu6vk-m&(~ zEwr?0T|?;j9|@(_oBN>qKazE<{Pp_v!`6w|8*6dyjdcPpa)Z1idKW(fet&%9F4Y?D zi*yt$y|PZ+v7$@f?bSL4Hfi8OsWk)%NL}x)(XBVIgv4)XIHfe+5E>4nfy3H(#nDTg zf?w2rNqaY}KmkH%U}x-iG^{A;#J~wYQ^OT1m!@b_H3{4F&(`ko?!-J9Jjh8 zl;O2K1VPY127mV$Fmpk=o_1J+qvQ&L20od(WD|a!sbi@I!JA2lYA%tD3s8+~=sZJ< z2l<3Wo<)B-00s!~Fxs*B-dhalaQoe%!vZc^BA@^nylE4P;ufZ7aNXo%oH^hoALD*L zL!pz}D4olGw5CoNi<(raG4%E4?}+>(8ipD}W%mO5xQih6Wh*y}Fx)T~apOME1r>o8j-Vwb=i3J%RA5h$L zwbFGGfkL?8zFI<&>m=3YK1Cn`Li#8?p<`U*v1@=0`o30qnEB$}wV#)WXZ-USiuO85 zwTCR_U&exR%e#~bt(U{8?{mQ=mGMr+Lb3^75*60~7Ru^X)2e2N0=HW$9-(J(T)m$Q zj9aS^wRMJ?P3XNQp{R~w@QmPfw8De4=zj`t=lZe#gQ1FJ)Rb2KqibN3B}Zn-bSFBK z)N>MvEH$BsV;JRd$8y4INB|I_LI#?IB3=>lDW5f{!KiV8DgyzkCmJ!i<+C;}++gDl z!H9*>@v~!Lq@W=+hG7YTtXq}U?i^&GlfV#!;3dA$ajv?3E)%$Y{vs?avIglt)&=4q0tI;9>&!7&Qas}RS^(;81 z7Y8jGif3s3LS4J6U)S8AH0>N0_t>P>3k`MQ5#zx@lS#xgD2RE4AcQ;FDx(p2%xCS( zS9OaM&6i4~1*p)YVUqa8?=tuW(_t1P!6G8CL3K(f>VNo;W|q_!VM)hD8q7lOzcEgAXY z9D@}ob5a!zDC~WotO$2{E$^qxF2Vr~{>3$z3%`YT4A0)&P`k#7!X^~F{@C*D8O(z~ zfvBjo*AJ&t@(8X9Ii#F&D~UKLKUqv~3;QZa|V{52&r8Kl#PToW2BpdpEc=#XYiC?+|9t+9({vl?+t zwdqQ~TTO_L)8lfYG8(F7Fef4>v}*_;%!Rrht>vuuEiZf7XWf_Z`qXr%CIdlA2VYq40|<(5muV#jF=w-FK@?Rb|YG-&^!axqDqBwJ}O z078IkNST2qGN7THml*C42O300#PLTxvbac+&+g9db7mcCys|o*&CYY2rP=J-iG;@d z=KTu}X0uoR^a`2G2%AvsKdKB*Z9t49SA~Ni^E&}kaGhwTs$zN5oRqKm|!3-rV`WUfe%VBL`pAmjaipFofQdZ z>E%SPgA<*lYx*^J%|H0aiC=Z*4+~Zq!h{n74Z~`8naKbeh0GQ|di`7CFb#GMu(G3} zaJFH5%UOHp!jbmQvq0lWd~_i`v|;wp3Nsl(grcyu21_C*6w?!0$5b;>+Z(ghDPs9VL|fnKPxmG>+%m51l#lvXnzE@oNpS3q-SPbQ3fxc}7LoU^K`o zW?h9Pz$_XC4azMWHe5K^*>u&<8_oNXc80|FZSAM2FZAMCLq)?@9izMI8idAZM#G-{ zAk)TZGysjEcm~((**n|lbHCO&(m1-IkeR+&tud6wej#Wmzjx?_!cEJCl%b^#WQdf@ zXmq*wzk*Xq6^-^{N5|JLx3mo(l{!et5*Y@e;VM*^UBmS3Eomf1qj5J0d?1$`q@K~Z ziV`HXW>K~iMnQ^aJJu$gm8+YxS0Vu_cz_T-q1e=!)~*7L7UUAU<$wo$i~n+sxYzKl zan`IBLc=dZGx3%-+6_rL8{^@qkiE0fosj z+Fji<#!+8SG~}Gs@E=nkp%5X227IAd-0POmABvUH`L2Ptgba}bbpel5jQ{ANSe`y) z*MLI0hL#HPjNtM!K?B9+?tO_L29Zh-EKOOcbLDjO`y)+VLsrK3HRDfRk?HUtAK_g? z97CDg;-1kMk214yu8kf6yI>HRHoxl3Ky3{LRHIa7kaNtUKQvlQL(Lxba19C)^UQ?l zG8%Qn1w}=YP%53QD*3~$$u;CSmsg-d;~5k~Ty$5PA|o0+uOWURbDtW|Fs?>3%j_6} zhJ26VT|-BO8}tl_;iwS}SO-i)F0V?fOF{{*bLUX&f_LRQnz)4Il#s5Wu3!}&cr%EZ zFe72`jJhTikRhAOhZsiS$KV3ud3s<6~5wQ&e6*6WL>gO7jyuzvRnL5mX(J^=w9*yAjl1lR! zrss*9xKJI##K(8`u2@HHAc%$v0Xd=+Zcfl4iWHGjP*GfQjk`1myR_0cUvMH4tsDP{ zf8ag>DL-|~J)sB8jn-pZRe-dgRl&%G|nAk#uoL9z{oan-js+MgX61CDAF@1hxkUFB^n{b@YvBcN>O

    m8X;PGbL6TmFP$nBVKj(?&-%hZ#+uc|LEc3XUKP!<~t8LJ`r9Rm$HnuT{^`LC4T* zPg(}lV8b{U*IRcD$=-L^2B!{uV~xS6LAftM>^JWw`(U z*Fp{pO>w3P+zc#>)Lfrqs zOAhKq#gkAFq5eX&;HsFFfFcqpDEI@#9|ut+;M!uKRuGI;Vh(C9Vo*?HEFxV9B1M#d zAjSyZ^k5OhH}jqD>$tntYSON{UuZIUJ2QFaefGVXNsJXM)_vmJWrADl%>DjDVv&=`o)OGIM#Dr$4k#X-GV?4d=rG7V!Sicl2C9~`7LErT$Lt|)` z40VjgR0(LX&MY=sDa67w&Ebin(X2^-sxcZJjUa6hKH5$28 zjYxfzv7ieZtd)rB7PBI!{&Npu*lSewEhepEf z-f8{LHm!SxcsR$FcA-HUydhqc(SDyrY)*Kq5BIY&bse){Dc(?q%PFQ6W75IMdsMMgt!k8W4h@ zQar1SJ%k1e(9i~kpn?3f_Z8QUs-fvKDqEd<(cAea$2=^c;dfp)MFNe2Z6BDKU-qHn zX^YT+raR8Gwq^}{;yaF|(lx}?3qsf9FIbVhqVSQ-vqw|N^Hq#TuN8_H%P1yaXT=oB zWb*1$4-E`1!vlnrg*T&B1|nKvT4?OW*V{PeZXG~edVPb@2yp%@J0BG^aw?_?6qM43 zj;)`-_JT9ts~uIIubOoDEh8cocCOjcfr+=ITM&YKUV^U**f zk+U<1wLrsmY@v0?CPGINgHGQ{syjJbrj(++T%`)BzRnOdkT+V6#vty&M~Dbc6wtnD zftu%PIoKl?k6Z^D2o*xwzZRiHO$bB-4a_%$ek|rjO<2ZTz=jg!@tl5(*9b=*+@^O)OBmZ$_Q~IPd1{4Y)>7GzSO}^xZQvUvfZ202*LpZtKu6 zrABv)2xfm0!Xgo-J3kJ*B)gzy+~r6L)e*iBG$_1yFGNqTwGB*zv4}HQAS_%lOI`8B zEZzxp9+%YQky?hXKPSV#$dGkq@obe$3Y05k)Qgl*GUBx&Afa+cpB0WqN6XOA)&EKb zL|@$@zE;>k#0_ZNT5(W{o!5fuMrw78(z+$5vXdItsOa>a98tT5&aL}S3-v5he z2#ts;qM<>kpnaHlSU%`vtfKt{>kd_iY{#*I#w095S;Nu;nSlF`raW!5VB&(JGW@+1 zYxBg=z=Gnwf9EP`(e+5LRZSqF^P;Lokn@9DL5ap%LskY%pJj2uMc%A>`*1ZqkY>(mBpF_z57MIEB0dZ z3W{(N>%Pq@G{T*~XNg@{G&Zjkc2ov^twCvlaB%3a6Fb#Ic*@99j`sTW01C?F9hAFu zJ_4`dh-llkRatRcvdJV15R&&Uf{3CJh6e80u8Z%)k^)xl5wddyN!+U}2}FY#GEY5atA4`C zYH%XadadQ(0PN@)!YptKK|lV4zl-rX&#szhzuovh(a7iXM(cFV_v?MP`^O*ZH}Nx^ z@id~3<1B@Z!}#L&@ANI{y5Z({&X4@p|H(jPjlV*<9+CG^zhcE=(YNHLsm@Si#Tui} zAwOWx|1DWB)_3;n*aiRy0HP?RWej2?>lnr=){xL@HM}>&C6|B6&g8?Lv}zik>!Yk( z$N>NV0000000000004l;r5IqcbH=P~17R4J+{U5qA4%zu!5$pQAV`KR8Vtq3)S(_6 zB-NEvUHg6~yRJz)bdg=E=X8>6Ct#e% z@Av5f`u+WbN;gVMHU4}4>Tg|ppp^VKl(!`KYt)D3H>Bi`w?iu_DO01Qq@<*zq@<*z zq@<*zq=ZnbS1p$d!C4N@+*b8p`M1o2gW;>Lu4`JI&@^4|z8W6e?rby{j%oDF zAaVlJh~v01Q?>xLI*A>qAV$pd7^7`T7&-B*rff40j?cPUeT}`n`d;ox_w0DP{ZMxr zW)KASWfu9pleXzNzVDBN&IQsu`A(%a~E+jz!aV&^}-|!Lz}s??Til@132aga6WPv8<83e zfgw|au%}?_^thwNT{{5147%HXboPAjLCqn$RYN}7g|vN3Ab z_3e~PH8^*;7~n8+aTH8QHA1OILTV5f7oxE}rKL867fUm+{T94Pb79ADi{AajVVUh^ z8MLsa7(p=ZwcC^Xr$_fsj37+CC{Q*7W!c5;?X7Sm5$Di>iNW)c5F^1UHW;}Pf~6YM z>CMg8t8Msv;l)aeKT_9ZSBkUkvO}G?P7nyszMR^anSdBRQo|pclgVsyKKq<_b{H7S zCQy%CvCF4W!*&7(@F+^i4fcF6Kt`pv2Mj9xyhM3qUoAW+d_?1bZBQA zO^(BziRJoZhyWc3R1(u1lN@1cd!GEvsnaluS3^DMJDgikLsk?HO=Y_QH$*5q&}+DX zgOJTe65_B@BlEtcY3jKZWivcHTZ%zrNv;Dn?DDC1bwmpUsjqdY3ppMtn?bEyO(rNO zrs+FT03CuaW5ejRd!z=c$ka~l)T2*435r+aV1K{qMp0}nDvIaEaSS^+m$3mk2G;}j zfeqN4NrRVaTw>Zc+1IZrVOz>37-}ms*6PTT+>m-#@8&f`!{O0-V=BvvvI#1?SF=eY zZaKaQ6?{1%MjL9p3En424M1ujG<>tA6w1T>e!sbIIgtZ3@`~bG7M)8sWDQ|#K0wPM zt_8V~Bv3-)vi|F}fd#C)LT- zY&OI72}iYt8PsR=;06}Cphl9fBqeA^-}{E)E5&iIN%YVAebAK-vA$MJmX+i#doV+PMLlSz)9rM1se=6J zl^ukBtQ3bzvsSI{prW|3&siqbFndPNko82WLHIp{h-vhSRO6s2K}Bg=JaR1rg$*?> zWoiIUa>)Kd2&lom`AQAxg;ZnuT2_=?7rUVp#S3jcGuE|uOamLnBV4d{hlfuO4xhq{ zZWq6{5^2p1?S)blGNEd<%Dw8&q}6ByP($FF)ucv4h6brYZg}CichYO0o)oA?MgP#; zmug_1%VxvLE6Ql$hBI=wSh_K1&)HnAY>*oEGB&bo`pyQV20b6f#l&*0qb=1~Tf>{h|CaHCVub*w6PmEFp2b=GLaP$SF4_=#z>+b5)k zA1u`HXcg2qPEL=oTCNns(@!ryb(;H-gLZwFQy)s#C~r|w2#O7`bYn1|vpJV)>?$q@0LrK<6&k^Sl2K8o!+Z zjrH6Y+l!$N&}d7KviYQB0m9H7Ret_;{1^eMpy4m}he)Dx1?ReSCWw{y{GEFpxx zdpEnP&>$RFF2?3nG%py0{Xb|N9IqAkzpm$UY1)S4EFXh|Hpdx{J&M2~Y>00ZfBaZm z6EvtExOl+(!}s3z??77_2YPU)?0imy0#vx>d&Y2M;zds=maZ9^kdU%0O(l(ijpL41 zQ>&EBv}hQPbS)I5bcHMLMA5gt&URmOGlBJqyW3zr0U8oQA?(*sWf}+`yN$-~{}4mN zuiz5(>i&8>K3_)AAR2X|!J=0}4)rPuRHtzaY~u&m@X@%tqi28((9uIdRHX%I6w3DJ z+)QwBE^PiYXFM+@F{BIW0aCV^M+nvF7JNhy38!E@2^dRkK*kUoW`I#z*Y%L{uyABz zOhfNVI55`e^{`qc7akfHN~=rTOVmn(3I#14sdKr|uI|OBrryVvSyA3D*XwP%Mz`$( z4Gu(o+u(5xqCqx_Ri4@?DV>3hKG*;m4}b6kn1_Y~G^RdAL&0d0WISbK$TCDRQ`08Z z|Eg6p^Laa}r8FH9EL0@b5o9qxkNul(Af^VkQwfIz4V|tr7R6lSbr*7bC4~lp#$!RD zuC8z(w|n?uX=!zJHE1-145!d6Z2*m_^}2Mhj?--yvb2r8pF4Z#Q5?@U>Tr#sS5sgc zmmQ8aL_M-`uj)$gp*KL|xJ)#rehp@Rq~$aJ2?jN7YXX60z%w$LGHwm9p-EwZpYT6M zYYDi^wCGu*5(xz%$rvPqwxR3MD9~WsaPg&cd30w9XuRWcO?>0%;;d9{b`R0fqOyd7 zRru}O3d!i~Y~_GP{6x^8j}(?^8>OFUH40=y!2vV|Eo{}j0~*4Hq>Z~i(V%fCGyuo> zdAsan_?bTj(ZuRzW`IU)7!99{Sb0*1Kt`&}L*;opRW{2J7>O3)!;@Z7iPXpfm=X== zjeGzVQK(=sQ4WSH?J!%Y7mHm?HF_PK8)uL5ZgydIb&xiW8oxK2SFPVU?N|!>D9>-s zGM@4#+M=D!ID8{lL)cJgbPLP0jpiP=Az~W?Hd;+tpIj1+j&B>RD2yD;qhJGY01d}k zTc3jFMqjbRLPkPq$TNJ)NLx}oKt=_oL0J{EmWo6t^=Jf-OJQN)$P*2bin2p&1dunv za?ufm1&wI7a4@m`diSDt?z+2(oQ;)t3$qIgu#H_Wh_1jdP)rmXp+J>IuKcrFy}H82 zcP|Gv;$N1bib5kxG}=2*k!VoEwt=+q6b-Q6|El7sM9~2nd7uH!ghs7e253AlCo@l) zR@2hL3Joo3!89l{rA1RI4PG*tjOu7+m2KcHMc?3WA2NvEhJ*ESnTgC^}w2 zAsTF8nMJ9hkA|?Ze{x4Q2nUyJK%?o{^^GZ|QTMR6knwz=;ggZEQ#ysw7RWHcg;_TE zDFqm5%WDHPB+ub#Vt z#$X0|!?TP7Hg0xqIz;2x0UDxAXp|}o8NO*eiy2tIS7_C|Br7#8T1}fY7?rYZp`wJf zNJ>v?5(oK#Nz0TDcBoMi-zbmTGo*XQbUdPK3*dKRZM(Y*;i#X>)1jbX7ExmX&H*+Q z8o~yBBUm(&tt%zGU_doSrOmyq++r>dF5U_oS>Vu;ib6E}AX;=48&%gg4Txa$NCx## zDgh19;~amP@-)itJOgC>Cm1LUc~ip^&I`K}lLf_&>X>fW`FyRy6p}LZ2>fI44a||4 znVx=LQqo|<8YvlUjc8|MhsYOW6A>+GxIC!gy13xgi;adNV|D=-bg)Z26NtG1q9|+1 zEa(UYCcV&VUU|CU6@um2##a1|7`(9jPdS2Go+ULDvv8d^S2LDdHNv`x}hQ zfkyAn$-p&4?^B~2Xyi%8P(2wMbiHA7f^rhpCv_g6GHhG5t{E$8*sLvP#Y$?LmSmse zO-dnrs9|RYoZ;q4Ny%uVBSWX?8Ikei#KeSgI6f9FR06c)0zfkGiZx*H4p%Ff zZ?sy>AheA@(Xg;YBOHJ7T`Ehnxl_u$UjrKz#RlG4Q84pv3mIhNF^9T*^TCkW2GO_! z8ND8D`V$L&5R0M4*p_A2@@CmeMTiDR z98rc1+-hO6QO*nxza)u{GKwPLz%Ir?CAf%AjA65u&30UTJ;8+nLy-Xi4HOT?(OEVp zja4CI7Ax6MP~u^~0xjUm^NwZ-)SlmL#J?bAP!4Xg*tFsMf2aA(Hpm4DdEy(LQs-{J z=dl4YaL((G`+KK%3n)e$H!3898tz*K3=fWJyT==v7sBBF;cOc%X|O z@{R%!f(4-o1*5Px^lY=HwAyXXy{dcb*p+s+a-V^PG_cDKY@^9TI&IVzrNMGughX2P z;Skpl+bH#SzJKov8u3q4Q>Ri^ew`f2tjkLp!^18FPY(@hI#Xdik%*~lw)*f4Qbx^4 z8J1~Qk|-yYNHU$5eH-zK%EErqHo2k~`L;2tsVE1Z5Uz0)bbI1(JiC2pWShHi;m#Sn zm}D$b%%OsYupxL*9Cw5Q5npbyTyO-97SLFBI1=4j-@xMKq#eY4$YNZ!)T8aZw+hRA|f$RTMTUner&e;2#eRao+E69LIOE z7>}>v3%bjag60HdFjin1iZX&Xbzf?Vh+G6lhW-lrjYQA^uz+{kEo9NoMs9tpy1(}5 z8ig#cIQ6PJPi@2VjVmyLx66*}!O?Lq_lX8{gQFV{5BEUh;pFyu>h?4)z7bE3V5v4_ z8qe#AxQ1nTWN4|BotXwOGhD7F(6owxfDz4Ln4V10Ur10=qKRgkiRWyLrb|K3I^bjC zU<_>3vu#?ht9I`^iUAH*P*jKpTi2yk$jhZZ89|*Cc%{_kBulZuG)n!o5nr#C>dPWv zp@48%Q3|-%90fUax3=~^JC1Dw3S}Evus}5Gj?YGmHOR}Na+>F)xaM-m;hw4Pm76vSXyB^X z|CCdP5g*Cm%gFy{2qhRqBVpN^n1;rrfk(jx9?n;cXf%m=D4W-)nMm81fFaLgJ3yn!j@FACMCzDj zg=i?ZINL84SykMVuWIH6BzmBNw|DnHbHc=@Qx!LU)nAxF|7jXA9}KY!2>xJ|m20R< zVPLJANzcqNot7=D%o9L0gpOp|wuXwieoJZTDz(RnBg$@@lss!E?b!gEhrB4xq6RNQYA2wBLGc6q+rM4cx)K>fWCl zi$sIZVf_8ZXO8cTDc%xxn2pLP&VoYPgqA$q#`hi!cvrasy@5CKD|R7ZV_eYiYYIhZf|vk| zKy$xqgts=GS0Z)9OLAq44J@A9tIf^L{nFk>oGbeH`bmKwfkQb>Ap;^DM5Em*s7}RW zS4UBQXuiPa2f;CL*j|tw~k~2@h5} zmXD$xnd5)q^PDkjWdrV!ubF8ukf>_V#D) zI(L2BUyLg+`V`NPz%;})l%AT#qvRCNqlas?={K3Ak)EF;8c?E!$(L!83srvdYB~S- zylE*c(PoTRe76=!PDIBHB>dNP)M41fYoO7@D!#FL)TM(k zaB?Bf;kcmDctk_8Xb@TBI45Xu9;&YKS7Lz>)4=6w2XSNl%NGnez94j973;J+Zfk&s zqW7kc#d$Kp4MJs8hJly44a0>1)pkC zk}xG}@X4TUB=A@aIaHqGOaffY&wuPWov73V}1YRD**u;GX=*58mdK6$G>>J_PJjF256*(#e1=Ma^eCF_pVvw zFjQ5OhwIyuuU>}|mv>yQzrJXuA!z)oYfwUmpdp??{Y~5Xv?g+galF+SA-VKr7!uk; zB&=XTsD(C=K(I-%I+#O3qP7}kY)WjRl#<0mWedXSj4U zdhPf7JTp#Qw=Ej`XpG6mY*|13K7W7D#L#P(p1oRRUBLhvWP^RTWWbdTclmR<6q6qR zM6sM~q@UzZSknkDA!}_$fd+K? z_O0SW@wWI-JHPy${shs+t^F(N8ZsQ3N_~zn;~lx>=JnS}6^%(Wd@vM_U3pmFtj0w( z#KP5TIuen$njiRcmy8b~8yxQ7W(9_z{vp&rCMmyqTo8S-Y%m8xH=bKG_T=B1RnT*; z(c?0n7ccM#GzJ5baTr2^dJy{Pbu z4coHqRLVAyr*!h?Zu07~A&hj2HFYVp%iHq@tMG7sU#lq^94o(VAryU(F)u0yA7~qM z2ckxHsuDUCgn|tE7W779nw{XbTFMF<`g0^h(D)GMp~1t_(wtYR;R}=e-F_rGMx#1^ zjU1yH%a{Pg$}Ut2`VQJ@P+YdLE{MemHYl77PVwfqImCm{haMVkwVWnwEZ(8SQ$)iN zGz5(IjxNuEhFYQ6?K;lg_J-MLm_(zuQL%C2(c<~&WA!M6f(KJ@>(mO}ZVjR+Xw)By z&O--iAcbYIixqQx!USMLh#(rTzy;ZuvxT{uoX2UV3O` z<_G26&v6JC~{w5)(w32teA0P0c}+i~~VKrn@{-G!{R~)61oZ zMu}KxtK<^!LNz)tss`;2$wZ}c)#zI-djo82ykpiNc>=|rq5;DT@;9BE8<25dd;kYG z55M0(JYbV~4PTIqKk*6Q>DV3_UL3m7ozJ6G{ZM17<@zYjz|nXdKnXG(6*4eSZdB7% znetc%3KC?{o48@91QeTG3s}}ekb)GO^ek;mMxsPx&OkJP+$7XSOKtDFy#cN!b3ws) z!E0FX2!Wg;Xom0udJGzlL`tGSL&=c3nBQkxG#beq?W#|IqAn#5Im78^NCwexEX#Jf z77L*$ZrET0A!G&TVeRue0#Sm&hy2)%YhVL(pqc>}@)w@mW9Xd6UsW?u=D4}R?|Wp5 z#ypxFoGxli*EHBC$(CaNoH)A`NuydSRb{UmYMi@-Ldj4xwis*THzs0ZG|-FXAo}Jy z%=IWf8uJ{2C8Zn)Z7-wF1s{w7arV*h0W!3k_EGcjAQbutra&BiK=ZotN`{}oE*OpC zmBbp>kyr03)j)3Xu}5+Gj>YN&*|4lu515##cQ$M`Srm-pF&vPMW1?|GI8fmF^{{qtSpr!M#;_29s`?ka1otGJ_=>gv07>ZwMQ< zC9<(m0Us7f7oAWW%f^kz2G291-}-QSOD}Tc?%RN&7AhT?M`%PM)hGB9C1bKi?urJB zo0N@m2J<-@g)(Ifml%aglYJALhSxtN8Xg%;X%v8RJXVgohuLC*Fytm3nIPjS9wo5U zY%eb@vzkFaf(j>%8^~Ws6&yDe1ZJjcZdaaAkc=<+Zh2C4-(@yI~Y3vj?* z{c-j3WiDr$W(7JFnIlJ8^+aRZp?F~Mt{x>BU)3h6TkuL}wf?Cj?7t8D%tr%!fvQL{ z94o~|H1Gg47>K@6HRf2kvC>{%4g{8?h(IwJ3=Vil6JA$NbJNa%)5229fJ-4AA8A(} zcuN`qIGZx_zQ>&`|HHx}{B^!O@M zH-(0@fhHdxg>;5krvp*@sAF%>9+ntH7rdj~cF{09$44dPuGQM57`%zytDv1`R_vZ_ zp+s)C9I|2CPTx*#xWjwBqJ|n?RW#p`2CN1f$AII8ct|#D-8SrodByG;S}9jAQz=LX zLk=cC`|FiTWcK0ge{8z?qCqSKjcSl@@K`kh12j}NJllVS2H$^f{er1O34#r% zhR?>6($_!`>$XQn8m1Bq2M|a z=w9@6v0Hh9N=7PY){bEY(vnM$4a??i7jjk`Z8ch|2k}Q3>WFM;5NQ@P)Szw%Blwa@ zO095%@|R~s!?}e!vP}~iQNy~={rWqwc!?3O&xzUE&Q=P0lx80!pE_hPSqTLeO2>Lu z3Za6A)-_9ML1SG#3VZqKDz>iJ$@9kaj$0$>}?k44Lrq=m;UUP(zf_ z{s_lpo2RGE#iB7_?n-NPG($P6DH*&m`Ydz_M+KD)Q;L?ozGZ?B%7z+B9mm4<; z)IdW;1H-~n%|IMVGRCLXrd8f#a_0XoS(T zdX`gkon82i;wF8{-86%EJ+ZnS-$3>42wprM9A>vG!U3mZIo*Oiu2`83({iy8+2{xxFlouEdeCY`%Wm{dv|?|LYYmKd z<^K8udXakd`R5y{Zg!_)W=r!&p_8iNw@*|xBC!?a!XNR!ck?r#F zzlItKEs_fr8f>g)w0nXeREwY_M8N=1Y@gtCBT$e4LaBgpZ_ds*3|*f{QDz-1*W)m_ zdM-wHc;w{NH{zkyP9&~P?}!?6*bt3aG@IXj_c15&I-TM0^bnLlUlv*m6*R=|j-J7= z2vW&VD~J{QwpCb9Sqw`_M5={9vbH@oddOr78itaMy80AFLtP3rqjrv>mu*!*7+8C_ z1r&Il+3R7N%IKKyd}f;6(rj^Pe5w>0nW}2+($y_04ygdKeVN-eQC2f(E_HGo1`Q7H8t40Un?hX18NitOA6iN1sAU zOb-pyYHU=cp8qV>9A)#M+P&6`f{os`+@8s*u~GbW~5 zYtyCB^^8#xDAZP5Gz>$^p}r9dy+{hScO}xR&ZY z{p|c=K%sDPIK)j2@h6DEd`4SiO&F&~YkR0+M1ci*o6j;$NC;0K2pbE{UF+ZGTsC@m zW6`88bQys91{y3IO^(WD$LX!JBzl(;HVSYlZjR!h;Z{i>`v;~)J%9#HF@Zgxk5aQu z8%q`JUJtWD9b>0z7}C}=D(}#-?5AgKyH180)1!Z0l{}IWG<-H#4K0_`D2Mtdrd0<- z1S0Ee*$g!z1}?l!k+3-Wa)@20i(W*dJR2Iz&E=)wG7h(TXb^{Y57pk4k|*sj1edZ5 zG!Rx$Gk^s<+@sM&2NlM>{BiRD76Lj8-8Q^;fxRjzp~HkY^wCf2pA{#p066-rep$7y zZA+sK!y1S;3Y*(*)6{l2!qIh`DYEZN!%=?a1)*9MwNO~S1y*Y~fNvZ@G61BYv61Q_ z_A_S7UH_x1LDQ&mGZK7^h79Gz%E?$6rx@{Cf8UPGY_Sr?jc_P)@y@b3ebB0|6b(qQ z;j4y^hA~^UvCaRAJ(4jX7eWRbt+?xF$OnUtXuEm%8^j^XjlQHKiU6ZN8V&Ou>2pU9 z+K176v%Of=`0nDDKT@h1X2073)sziaG0>g6N6ib9f4A2CUvMi#qZAu-Vq3^U-M&wl^4!MwpX{!qm~QXu41|>Vk$=%H_!W03(XUg6~d% z0)5II=%{RM?kF2w9ogu6Y_Qw1z2W64dA-T$6lw+zwo!Z>RM_wDTRhA57izHYRI1rE z{*$ivPzp8iB|@F#jA$qs(*wg>uVpA(bSPxPmksno#DdsC9ZzDHR|)+#(ID-SV6y_m zf-m#Y2utrZE#OIt@|2p_^2*yw&Fc$H1p^JCLc#FSfQg)(N87&*uTRLv;QV5g&r>>1 zhr_+&Xfq#;B4gnXFL=${Ui}x1LsO|M*_1Kh^}!ViH67?-ryT{3=i#ws4-?y~Y7y`q*z9$BhJ*gK;HCRipTAW#jCp}#>jW~+JO zou(qNoj#ZbgZ_kQ@K)Pv4@V=g(ZmInMgz>>5ss5nhNC!(z(^FyObDv6P&B?E8oZnJ z{Kv4pkMk-UJ{<)ZkdRiJS#azw*+3NxNLZ2gH4?Siilc6bsb`TM3anl$795Ucpp1HJ z-<}bTKQXUS+n1Mq_&z#!f(C51ir2J1AsLf>SGVZ3lUz|UCZo|+$_GM@tV++?7%Q$A z6}cFb!~+V_mah^Gx)eR(=%F!d?^SA5(a=d7qM^}+nymDr2^ugQMS(;NUtp^+536u! zH$RAS*gQ&Onsa!Hcw@0sUithtf(Ac2dmnQUR8jz+>+OeVxZyEC<1C|Ez`Ul|IytAO3umLhuSR`CjzqMq}sSa#w{z z>!D@ty`fFB5i2noX!N`MkQYF?81g&A!LUv=I7&|ABYnzZGn9+^4?sifp=YFmH?GzZ zFG4hMS1Tg1ZJC_f*y>sZIn*WrN2*6QQZ{CN>BoPzHHDqL9A#zUei)?oALe+h82zQ zrv8Y}##~L5P;d$78TtM;Lmy3oL35K=+5pk!i|?TtqYLfBQA9?=A=)e~k>LYP6^;Qe z6pg{<7gs<7cmNGK6)zV=IDWaR-0&@G50$nOzFhIAF??*z=$gW|=Z?rM#R^Ubbop!7vF z9*f3iBEz2~8e*(#1YQ5LBVasLHG)fsLkF-Xfp9U0Ut#3jxJT|(J4c5p+C^ojK7G$F# zZ1nO+LIxiNjoO7=yU)6^`?y$w?BnSCTB+#%dUh~+Xr+{9k2T&9YD_Hf+V$aBQ#5?R z&@U8?Oj^nC(2%2R$Xy@F26sgw)1^O&C8ktko)N(1HiJs0CyK(D4DGr54u#PwRfAXk z9f6G|jKTpthNJIs{!zbk(yT8MjR97Gs%qqb#<5QG;0`+m8xn7daGX&<#2g2u(Vn;z zeXi@@Ft^d-46v;2>E_+KC{=?lE5+F^@R1Ux2Qi$l{1CBqku^+Z^G&lrsW?m&YX%7kjnyGdb5=6wezualuC)E=n@ zi=9J_HLj@|vdoEaoDQ#t!}B4N6{4}&iE=KRBO17yipF~cLk*(g8>uKTP0^}3X9Dq+ zOcA>gMkU2a6!Audr`*=^{*XD@xZwE(3!4~PK!bl~Iop!p`-Ye^|Nh13nj9z@Z5F-oMSVCRE!Wov(da_azy_U$qLHh~<`o|ew&x3q zhhiaZHU&e>Dt5`nIQrb`Sr(6#;1{M)83h-LMxAW%;8V-Q03ZtGoeuuQaddu=SplbX zH?y-B%F}FrjDu01jVaY28tFI^P}e5dSPjMv%zODI4UUqpRRdZG(b|SI<%Nwvpyc`; zzpgPC8UP~@qG(K#p{n6~lrP&XZC$+hk+N|;5{ZC8Ne&TlNS&iTJpKCmbirusp=0vg zbtnZYhHv=F@MQyZ)JTW86RUMsAq!SP*nm>#f*sqoKnh$6>2XMg;=x`UX1p%3!oJn8 z(MhqaooZ3hNNsV>A7fSM!p@3Dxk}UamWN!{>o9xkERyTAxebrQ(F@>G zDX40c%cSF>_JDomw)sU1$CK{=g4Ezpwbsdzplkt*Y!#|8+ck;UA*ZpojwvKe0W;5- zT*pH`_~2E_Jv3yNkH*(iHr$uGXe81^!#(TD97g^wpn+{(*{mce)2fk~b)Yz6?w7$WTrrU3GsEe76)~$m!+igKB zUY|wo?(XEx*g+E|FzaGPf6g*VIGBU_4#hhpPcV#FzzZmq5MAA*7K~>!eH|+SHrXp0 z@&cs-20-GG2!joUXtMJfpK&&{?d7c>@b04lE*ORqjW)<28ZSn4C%g)VpwVt;+Nh!) zf{xKoqtWRpcM&fZjg^Z*y_JFi4fAM%40(PeY!C{XewKivTPvQmObdsYp%EJ?l0oA^ zHzu_xmbMy|I~gV(96>Z-9UM(+*;lV}wu9f|6trjC+tp%dBAZRW_ul-=zInB0!((G| zSc63hUiijGgQc#3N{1&q)g46xcfQ>_MpDpFj#$xH@zNP1Vo2w8ddh2M#?9nHhEg#B z2A>ESCn3pGPOnJ@*kB3NZMIS~4uQrg+8d~t3mSV1B!m66{8>)oP@*yIQOL$b4(k~R z!C<)ELXFf)Nn;Ioh=zQ)owCrx#})dz>s^j~m7hs4nn%y2Vt>;zP1C_BU_oi>ZE2x= z4eR4k@tWVb7lFMHzd)gI=pYZ!fGK&d8_^{Ot1cQwmia5gScx96-)Ys$O?a$6s9PdI zMj(vs_HPVBv$Kx#x5r3$x*=%biHgP{yhsTiX%Mx<}u z>DYP7wEHcQ4@`%zt@W=kUu;@^2P-)csiHai4R;?Rsj>S77mY1Fgp5EmQk^MxooBm zM#v{aZk}k!RkUavAckmAHNJ;C(SldBxrZCrkXrePPJ-bxjxH@$HQFdT*cxm!j7cs4 zin39n`yc}f1>;dX6!ob><8-C`)v}zkR;7~5Q9~*}?|Z?i?hZU_HDp`r!&(2f(T(Vz zsk5dWqf#D!0vcMd#BoI}Y`z8u#xIi0P+TBl-US(B$z&KafWf5djTbxY@JiAA5ph(K zoWzov*d$}g7_ZGWJyD*S)uBvC2Dwl&LdZ};5P_(W0W`k;5?nwyhz2!7WMe2*4Yi@{ z^IBT$N%;WQ&G%h2s*F9SVhysvC6U5|3kOW24t^nK*l(M-?SE!U_PQQ<_TI{quQ(Gd`?4|7m0wE-sTKl8+2F;&6_QLQ z&KXgi0gSlr0jdEsVnl-uCAbW|ApFRz0kl#c5)iZTs6Q6K0W^eg)f|UDfCoO)-bOj4yBiVQmEl2nMsw6 zt;s+%Qi_Gc@gTJT?`#qWP-4VnH5kj3lXCPZV<;P&G?uTD{0UcQg2ajrhRJInoL!%6 zyv}=36b}nQ!>fX}<;!{?Hy&4`Y_I`KN)VbX8jZ|xzN>YO ztIm5cg5jIW2F$1xr0?1x8)@DNhHnT*9j7Ql0$qUNBxk+z#TUFt^m9=0{5kem=V-i0 zLd&VuDykY%S!9XHc*aoU2_D4_Ea@5OQT+DWIxo9dE|p_(oK{^+mosG}D;M3vPvew9 zIUWcA5g7thV}Bhixef(~o3yWntBYlfCXZm1zK zC{$xeG+4!u1CSu(bg11~*}<`3G-9}piH`CR4J~xNHyMcP4Iu>`NJsU8Mm|(E_?>Q% ze@JxP3j$+O%o7l3$G6|+8jUM4vQez1Jcq(V$m@w?{MGTNp`o+And(F!ind)QS!Sc9 zT24kjdw)NYWiLOS!T zD1cMU$b?r}{oscd$kIj$mwinuc2mXB;Ozg!1VY*HO$uO#SmZ2gG$0%3pnW}pX3%7* z6RM%O{U$AWmc342e0g~AHKxSQ7mEg)uNAF^*50E{aiNCNL~XM0MZr)b5%QILQ4|o+ zQ1`*#>j5IWV*$w*0HfCFx@hcTj%UrO9kY(|R5G+7QdW;5T;Lri7-HFK^|S5m57Dk6 z8r5U~6vgFaV=0-$Ck7jeMmCYgH?n0TtYr|lxRKf1Sw%B1`^Iq%h8lCq2F&lbia$9x z!Ig4wykr?q8H8el=W7mi0}QVte=>w(KsgSgP4ra`4oAGs(t^>*)Gw}7HHzfI4>#oD z$aN~R8;}()zx)LrjM6cnFr>nMWEk?pc_37Dkg8Y~G=kQEJq|R^&c1MJmVmLn|MSm| zgI~qJFF6+w{!@4QLTlb!O3v6)yY@myIRZ4^U(+`-T@HtltDux+q@f1v-bxRK;Gls5 zq|)VTjEnyO2aN&~3+~{`@>_50t{L;7F(DePb4enLGS_)w5Az&!6YRUoj4&(WdKC;P zMVm3mDadF?;a7kLT+ZpDca#S?0w}WKs5kNA4Id7SW$|owO(#TkaHAkfVHgk-VZ+y( z@pRWQUnNB`fbvC)j7XsIymeNrSv{<(Enq(nCksm@{%wILp`mS5*P|q=@nDz@w=6sf z?s5eKWB2{-jrX;K4v)gLHDHuc(SWm2gmhvI{S%Z&42*?IT}KJbi1ymapYh z@LTc*tLYvV*Olm%QHt1FPButJ!A)hM!hGlm8^p-BBOelFguj4a81zUctjrf$e)#xW&C{B$go%I z9!y#dP+c;a?3UPc#cRH+xqL($qX7*;63Pna0Qt#s$Q>-#$`*1F6h8q4nZOgyk;`F7 z)KE5f`2k7>%v+1F#Vf~uhn4cLk4+>M*jQ6m{r1RGEOJQ9oYIO-Pfk+S3D*KUr+ovEtlN-^xbQ%z4qP&V?KZX9|BhG)Z_kYwF~-91F3od+6Ul(IU&NN~X) zrYAiFrOZ{TA^juA-T!(6lA&lIZfWMqS$qDT0;g>FTIk>zXz0<-X`oSGO7NNf>NcHH zUYNr0u+M|E)d4;Li4O0i>d>zYMk^JDquWQrtfUzFW~SqUb&crao#+QvGv_l*hg`nD z#DRV9E`N9{R9rhUBKKAMR}YBF)52$B^azdT4=0ujyi_&JumcJL4fYF_b3mh3#x0;> zztJ8On8^?>kjoEyqaIr}u=`(jSPgY=x zZ&B1rg_WS&4KSu8Qz`I(WQ8w$t@9a#;Du!nh%Z26X|}GPXd1{Wzgwe$x;W!SfB_;% z#vD)YFA<00(1o(*0Jbo2-nl(q!6u#s@HP&zv5 zg8*$lhuDycv4!8W9M1+u@NGA7jf+X5A<9$_aV}d+NXU!WL_mtXYmCi*Ri$HfhItU0 z$MT?q2Cno$2-C=P0~$vv1?NcBQxHDX>v)T&1AMBx-DZi#G6pmfQ&zmNgFU}ker4x$ zj0Zq~5JTq2Fr456=E`6qsCa`6(FGW}IQMASuiR4cn2vLM=gV!IhVi2bzssmc0Lmhk zzhsO0W}yKzvWPYb2X0g4W}Z!h9B>ZHlct`t(o=q7e+F{t0VP zH1za>_V5t7YadCeta+3B_->i5%1-6&LYcV-&xs!nh(R6~?5sd(7Ko$HZB!M{a^`Kq}l@iEiI5-C*CNwfrpz-GBLZ{!~ zK}bp#?`QLecf!Su1fjT?!6JvXHLq(+#-{uYyapwY`8GSJ92t3{edSY@{$dcb<^l1o+us~r?^935IR0!7~8v)TE8EO?Ef$tTM07DQ-VU&v0#l)cI%^Q2T!S&q(YnBVC zYtP@pBjyx_k>7v?#uJ*!TNcPKE-AyR-{2?HeI7S*4-Wv zX!yYu)qy$tMi>*EFEE@{@i7|K7g<=Jo@M}m_KGG)#nFG>jcFZcJ%=b z{rdg#`LdvqEmQ8F*uf?Xa6m*8@u;AI`TB7=Hz}e3I;uwFe7mH_vC%X9`e)ik9vYhG zszWk3Kh^O&_vbE<%b+*gc720TQTtn&BNjjFb;SHx!|AzBJc@%Kj*#a z4M!9IrQ-b)@(5TsJQ?0M+?4C{MJy;uRk(DZ=cd+Z4w8{#;uUD*oxE#+4UI5$B{im8 z$4w&A?16(`tJXd$F-&E&p@lL{S|xwY=Ogoc)miG6mM{7Tk8@=PTLBwt8X2J@87K&T zp{$KZg9;OrW%>y;J_|lG&r)UuG*Ha=VKFBgfJD-ixoyG0^=68@@6H_!cA$7#o*YjG z-$jzvc=Om!{;d-GU>An1hYA~F61_5J*J^x+J9^nTgu<+ekb#T^W%6cD?{TxB61K3b z5sfxG-<>2HMYNGGC$>>@>~w5VQ+FH&D!ik<0qCu7fB~zzB?Qq2vy=l?H9D0i&_EDt zo~OYLU4uypbi+4-29gzR-vb$V>rF!kil^nN*c?rwyN|%jE7(p&_fs^a!AsAwAPN$9 zjg1Gy;i3@TFlsm&N(_NJ@Cv!7-CPas^dM-o1dY5%-Z0pxnr)~{5Gd^oJ!6@( z+a($ltwZTxb+n=a6E1;GiD>|lr;q=8roNv)%p|_B!6)%h%iyH_)f;@Ats?&K{x8tb z07RwX$;0e}|1)Gb*`jS|o|3Fet7ngBP)%rnnGjUGJQsdnI8c!94YI==1uWD_biX&x&GeM#Do*DMh=mOQr9b}uAEPnZSPeJ9S&h@X^Nlu*Ey<%HYZoJX1`g9qYS5Bm zD7k>}o4hcWZ?+|!K~*vU2Fbup#vOr1qWoD4 z99ZE!BhWLxIWVy)GkXJpjNj(7H#fhr)-|VPP&Y!x2X^Z@`5Nb@Hn5qjKK9t|75y~) zko{%F^#)hdiOpm1k}z9k!)?wbN8e~H%FZmVG-#upye~rnACUOQp`g)1%o+9E*#>;5 za?K;6K}hWJuNDnGb!oD_-#$Sq939dUC>s)!4WOW8;K}o0ckc->oGicjwoXLSCO!>F z2K3vFJOd27h~!Gs*aauxpCZCFfo?+50}K&*{yyIGScEAS(L?2RX+1F8Q^KL4Ygxx5 z+J?030gX|vj|8P5Xz)j5QPAVr%8Ckatd-AkId?BJ|tpN-fT886xtpOcoRi9+9-Vs>o*kI$ZTmuHSDO zfgJoZjk55H`;{dF*Qv*RUgse($`Y zcU0MOL(p(!C>m@W>_KC*U6Bj^@M2WjHHm{%r^Ch#H>B{|R1zVmkU@w{tjg0SAR@xI zQ&1sU%aq^o$WDj+QyuqK*mVV9fDByl4Ap8B0~wH_@j1{ahFr!9FmzwhalTY4HDDYC zsc2Fj4d)sZ(eNiJ^*Np#_1C7MXv9GVrLG}QAcJglQ@RsNM(OaNORiH7*HJG2^$#r>B8{>!G^=Ke4ZGj71r4l1hJD#{+jVPAi9xP}lFwubUt+OrE zfw0~_QesoyLJ-Q@SO=}rSlxBr{IDIj-o~mDH%wHp-INX zp+rT{ID-@onRb^pQ9K+Pn%s&~5@>Myp4ic#!WGHj51-UAbiMm(#tpwj+~Ug~2>(}T z^ofQJC+ZldmbPKW#3Y6q+z^yh6a!Afj;ncLKQM5HsM&`&+W0?lgCb3D;ptx+FBg(;&(T38&&W(emt)?G@G>w3!!M4Eo(IC4y zF$`X;gMy5Obb8%mLmkTi(HLRfs_)_Y3p8v&!^bd(2@|8>7|KRQ=2NPZHqw(CwkNIC z92=!J?ZJ^jHY^%cp^veI(f|c7eTRm|875BY@_0(44W0!XYQ@WC=Bb0TUw{2|xkMqf z9(MU}rKDtTcA>lrKd-b5O2@$T8d|^n+DBLVlsiwL(K_n0nxSAcgbgTf;#DA2d@lbf z5semVwNi;>K>b=nRq8Xi)cgdZZK!F09t8uILA6Op!J*MZVb#Pd&xWG0#3n3Bbq!9? zlZ`YSg`p>c&wyx%X&^({iH4e&%!G>tHw#`Zpt}dxj6+#6p4M@pQ9dOYPU1vO6Ss8l zab1=e=D`HXP&P`mgodgHJOm6*opD0GT@o%l82GHVk&`NU^NAX0Y-}*7fNLzJ?zP?{ zIl!QjOok!GkuXyMKj~efVJ4^CBUsRYXW(R{dvNh^w{WwjLdM^saoF#jULhMM91XRM zt62Tmv*DUICIv8o5R_!#f+UGOa)6Ya_(8eg=^a`Kq1wD(aIR4`@vCc3hi1IVD=mxJ zXc$i5A|(r=lij+KL75$?m_w}`XwWiPtNMjx+|MG1f&`$Jji=ElL@sYt9Th^e3nknZ z2-R#0P_)}>8&ruu!iK&0q%XvRU^rsrrB-5+qG&`JvkN8EIP4rf=g``d3w8}|RLQ0U+$<98%u;m|mC`pe>1E>OkpqZ~NtvDp3 zFJzP;!qKoG5D5Or<*-<@A(1GmAw*+jb|vi&X18cZ>Yph~2A*t@1GbT}=5u}d_} z;2y3aU|<4eaR)LkfA~&V*o5Qh=HdKg)Iar>(I1%IiDa0dm(3yd1RK^hN_^n*V+bl+ za1B13SvWT6E_i5`f*qeu%mwhv62%sEo zphAWh$iR(`jyuw4Y<8@#SEq``<>do6lf@Qq(Wfl9CC;7;kH$Gm8+P(`WL`oEZ1@>r za|9P{)cPgw8h^?}&5tNv?U(uOnSRg^fOwK4N{~9Jgh5w&dJZb`+Hu>^;-lHM5)(Zk z=@L7Of8aL44;P*cSLS$R8Mub+b0#SQMlWGrNSR>3b!qLjZFn{wA)*ng`>+P2J$bR; zzRPksN0IQy<+6&6oP2v1hm(W`t9;;|c>ztPIL{Rao_qut*kJmDr@*gkq+BUXKla)q z+{h9P^O6cC7*Pt=HdLO8O*D9^ZSYdHU-Y+U$RSJEunac+W2jibCTHh8Wo6O~H`BqLc1gG{A*xJ2x++=;Gr-bU*v$TwP&xfB%!bxo4jbG_|@D zG)A>ZR+_v9jq_YfqDjgo8SVq9(5FvrqZOIgAl5Qcw@a`pKD!gGUXySFu?){^otHN{n1IrycQ)Vxld{vn|h1})fy(vYf&O|@ZC}^ zL;C|OpQ6#Jh|Ejs1PAcl-!DdAIwEA~h|n{R+c*L|cbCm$U>OP;)v9@2stya5jgnlC z&BNdAH(%Rt9{>hRM(5j(Hi*J6D7&=Dys(Pjy?vNy4;Ka!orxW?r~h1pAXKm@z8=5W zU^^-oYLLfa^Ab;K8<~1uA z53^|3Q8^-XDCy&@w$bP2HH&!MvU*MlA-ZGrD{u|3L@>U-7=RIKP{kRU#a9l+1|WJ^ z_+bm7DbKVo^8^(0zmZI}RaAlY2fj|9-fOSD_S$Q&z4qE`uf6u#Yp=cb+H0@9_S$Q& zz4rQ@y>oeS8j9lZjUe3Eh4~-cDCi)J;>LwA6ck@*9jgJ0E_{Gh6hu)`!G$7SbSMmpI&0nFo~B$$R0Gdb*EWmUV%k<*91=joE~;9(V{ywma(3XS z9m=--Rw%~o3#&!67-nbb!?+chzAH3l+CJY@*Bi4Ri7+pvydQW+CVWJb3ly02=1UZ zqJi6}G0o1>Z?KCh^)x)r*pHmSBbyuc0eCGxm`hwfq{YAa3#C^=_^o=$hO9$ad;84I znfN_-YH-5uR%+atiDR3P*GIlT}~?Q8^_^*GE&}qm$RyVw>l#kiO>{5 z=c7fFXw|4!&YW-~fegf4nwX+3k4pux-aPI9~tE4okq4FjMuk;BG zL9rXMaHj?pRcd&7{J&vvCZKapYEXBay3?PUnjq7GVd{=`IUZp>NRk?25;qFGAqnh& zjOsKD1L2^`3mPiCsxzq}oQed}RiPiK1_*r^9#mv#OUtq(IdHeBM!1{QPz^fLrYErN z_RZ^*I^U$m%jP1-o0Q-v?Xd9VK=TbceUIdaqdGmPK=yzdfOils&LbLrFN&p9%ZFza z`6bpHObDvcwj0|1DMG&V!I&QDemq*~k{W7Fe;y{_at&{cd=)fR!w&CPme#_g#L*6o2dE9ds=e0jd8&qy%~)DP|+5dR7FgF1c{ z+MeZ`l7H$BbA87$!7vQNFbu;m48t%C!!QiPFwCrA_ReotaQf(Qw-1E+oc%ifQ6;CJ zT?{9+qBZPQ+}7ucCf*y3ew>HX&nE7wTbEiiEgus>yu6lw=a$n)k2B=uH>$=yCwnxX zN@Z8=6t~X_qg+a*)^9Cmq349q6;2-=_0m>R-fv*M{*y^Gmof_%Qkq}33a!T-r;iZl z7)I>--tyyNW*sIqPXBN4lNqpC5{OqXt=ciy(7U*tK0?Z={w&ZB5u9~_crc^wD)n#C zy11M^I=uYRVZ=ERibv`9Cp9i^&!jhEM$e@$UmEy+7xe<;QIBD$>)kR#7!Jl;B8*PU z5IvMN`8VnR{kMy;SgdXBHBN8BM^nRj4)Lg!$_`;Xx0LEnU0My%v+&S?8FONyExnLF zBFvcC!|A)mygB^))l9S)|NcV2Xi02%nB8F7VZzdlVHk#C7=~dOhGCd*?A=j{gD?~Y zP~%_BZrp<466y}Rhi=DJA7f)gY~@#eCbqA<^v z4R?6FS3F2br{em-S>H%J$f^+zlF(PQZQJn6DHHmV)Ycp8Dpb6q0001#UB-LP{eztE zmL0h4>wXZA`I?YevplDES0m?48}K3}GC{pW(vno(tz6aOGy*NFtr0 zR*Q}zdC3&*uoq6r zp4*@deJq*gaGiw-AA{`?jhClQ2&d|O4+!cMqQx7f z->G=eFl(Ao!qG6w<#PYg0HCJxijf*`qAn_7ckynD!XV6Ax&kZ#GB-bbxC;tu&T*z=8o=iVi^1Q}^g`wKaCM*_0%>vD74ACFbX-s8p z+df$sPp7xqTNSsFGU7qQY^p!3Kx6TgoyiTTrDw(8hr|2-owtWK{n0REi zm#j|CV4cutT&dD*=fu@wFspW>3e?n06geo)bof-;U%>TWFz7YYs1`{WSJOjd2}eWM zD1&7B890U&wmnW1RBXFoR|pMc8}XoF)&g??jVC1&s!`0j>`kC4rN9s$5jLDV3<^i% z;hVMq^B|bDN3N%3qMx6NE5eyb$8w27V}Twq#>V()BpOSUc#=|zlcB7=G)-DDp0z2U zK=Gh~OtfVJ4e`SYHGvM~+=QpWD?6bD?w<5{<@~ zTDkgk5Fu0cZa=x$ZF|bo6J#4Pp9&2+(+Wem_j)Jd?Jm<;0joqlI|WlG%ZR#_$%Y+rbi65FMHU8pr1| zNO5AcC}D8!mFIfi5LO98!wo^h1sd*}?a_HC*&Ci=sa;SuQ*cNQ#(~CYGK59qf`=yL0;Z|Higpv*zf?`I7 zBrw?!jfT3!%PLLhvviy41=HISz$C=nn9x96?yp>Jm&95KG+YL!5$QE#Cp29q79=gZ z?G@;I5FfFiA#w=kEB#Oc4X>PpT*go;pyj1npT;85P`e=wECHKqJyG&9#0iyBcoGj9 z#^fZ6QeSh8b?cf68cRCm8o+>j0~ekRP1!>@KwZ;V&_FR#vw#MF_hUiBnV0c(K}F-U zf<{D76!TRy%mku=3I#$M%D?Mep^(LWJZ2X1TxA(l)@J=asRSr4G*}B}B{XD}d3YDU z0M&cTXh8ERD(uY%T5WZxP!LdXG#U*|!S3rLTsSVtpF8LQWkEMII`=i;Gk8?V+gw3+ zTx1?;&=E(=3l%7(fx?)PO62!qGtL`3OtAuzElPUV*SeO8SJ> zpydWV4IS0VkO5@@tJi@}L^qUzO3(q#j<4{8%80#IVi9c5#)JlWYcg4@9gP~gR4xs1 zL+~QA@xDZc@Qve$zICIuZEj~Y^d*|C2Q+Z8bf$-X3q@Qv)zgjVrGZC-xshnp5pW{+ zP~@FlL*yq4qRqwS^}I&X=!X#^EG{$}ZwLrsYM|lVvDjtmU%Kd!?b%X703vYAja#;? zEKwO7i3WNV!?Xm^*b^G$D(Fnhg1QB*ef~B0XpBXov2bi+LOVL9eZ~O3p<-`ck@a?6 z$EViXSy`SSo}^+!gT1W|AG3glObZ}a{IqH*C+(|1FGjmG%9Uj~Nj;-MO)}`d(iTeu z8kQS^Ms5k)-2E0nbT-7J*oB`VHs$SXzO62iaIl!rfPe-XPPFyqGKCFinS3b*sae?( z4eGf{9iGE_M?)>Ahi_TGEa$8ocr@7Z(0jRzdMFypnIc2p@JAH*dut;jXp*9{kuv&- z26n)mTOR{7SmV-ZGU@}o6x-|@Z|5Q{3*GqOZ|q;N*zcjiGm6s$#tC%Q&s6;z0v-=O z8etH)7*kXa%!_T5AxQ!93V%c#qvI)5u6x{%*c=Nun;+ao|hmYUpui0*%vr4^~&@(jo@$YUVoMDF1iC(~pkSrcxTU^2lXWu$Ra zxx_&-@_SuSga4j>{K?+6CYT5xB@GkrK zaZKT};V=1qjn^a*8pobkY^LzCljHj}kQO!!G=-<$$^%g-jSO4P!N{`V?FJ;*Qfxei z9PHh!al+L{hjQ0yYwtiaahhin`?v&gE(uT(K64HNn%|IYe9W_nebmQv9*DQ2G9`)u zr;O8cTybpGpAa#{=aSG%-; zk*AS|{`VijT|nlslGS5#-KhV1N72kW<3n9pyWTVqR|gWMs-%`c9#_Yc&NDfu2r54k zGbvi3?R?Lb+Yh4@r;tirY3!(c2^w=7Bfvp;(YKCkl2NI_z-8HSS$;h&7NTMp ze2EyVQr6kVK3X9~Y6Sl1I7RqE2{7VJZ3VXmNR5b*5M-Q7g|Ff@U_xMMFJG2ugoosn zGEPSLLTUd{HZf(S4TOs4-&C`vhe^J;+4CCtYj4xN`Tj5U8e%+2zCsV^h|G`j!)v^HHzzRY zHT<_u4uXL19uA5B-NAk9!)qW`U0kZ8WeLM;cxZ1`a;ciub$AUI{rg@cgyA****o9R zHp)1TH+OZ{CU5e>H@+Gu!-V8rAP~KSz%FzK655qGl1mx|MYoZp7owvbCbkwrv6~8F z7Z&HAy82=jwc?7Cs!)-Dh{(#Y3`*BJW=F|OLDv_4f6tTaEw-jLi|v$t@9uf7Y0_Sk zPrkq3^Ly@^|As7BcGER1ZTq>#e`VQs4W@n9*rZ+0HSn|dUE{y8?7IfjzH8j?u3`B< zyyN~4f5X0OY-ry#?swPN^LNU=YwWwmU$pNU_q%IY{uj%hAHcqA?CUSuca3{a1+f0d zO=}DNhg@UpgTGH)!x*7o0!RZGMj9*4u>bUN#f{y*Uw zoxU^2-+bZ3$&(WkqXR=j7cXAah6di>Ti4*Sr9;kG@Gf{<;CK{&f!NBUBUoH2Qb6BJYdZv0*iO3M;j3?|RHe60;$0peW(Wuth z{E@fbHOMX6+uJ1)r{leoFSG-YiG%P9rag2GacV)I3o2bzy{arO1BmWisY}NoayjVr_SX?gUf+iXz{V!0kJU?~nrNO}~faB$}l2s5XS|_~FmS{kM5JN)=2IBXWG_}ArEJ!;c zG`uGPjmZn6U;lVO6u(}W&Cd1@_dhzc2d>d3gaSd*a(9xT%9 zuN5Wd8qWpB*Bx=&-WdlRWAe*)-Wi-496U8R2s93eEY}cyPA`imE)xwC??A|To}m$R zE1`RFj(c+r+*1Y&91BRL9cCMH+3)}6iw8t;w7-8LH8L_X{OHiGyN2vnf{+_%EG`oW zmpB@*51^q}>(H=wP%weu8W_QhpU(v*Zk!LqV9a}?W6xihym0N>my?rMu3Q;B1vFs7 zf+Wg<81hB{hm!`c_RYBlp~3!exS&UFajj#gvQi8oQ82+C6SEDU)8W4`?h~caa(Q@! z)PHa{U4xj90}8AV*i^$+;lyoJP(prJ1>8fcW3s|YCFIt^ok z8&51F!$9NwxPpLE_MQ)nuO3=Dr?u_2q$`t?7e=mKOZFzO!E)bu=bbChoqa$+vLQhJ zaM<;?Ba{$BgS{=>D3*GoV%u)dD+_VI>d!pmSJTd{=FzCmMVrde$VQ`Y9+#y96RA`= zRlEi?io59=R*(BGGJ@5rQbPQwmS}gbnyZ#_)oL{dH0nIVL}N4;&;#YZ@j$L`{YFVS z(Yc!$N1J8pok5AkR?lhvZ0s8938xnZ!lLSSH%NbTzQ zF!Im^@{QCko#h3E00T#Z69N*j=6H!5J=Pou!FLQaKt>%JecqCyPu#vS5l|H1(RXMm zu{*v29X~aAp_tF-3!}wcue~?)Qd(mu(#<+{nP@J;Wkigj31=oNw zVeJ`b)Z@t@Zn#vYk`%~A7<=t`((M2>c&oBfiI1d~OVnyd} zQVS;-wVG(09H01O-7`KuaeL{;`1twp@jn30%8A_>stC^F@L=j%K3^;%g)bL+dy~Dr z`Tmy%PoEJ5uBEI*fh-%*SwjmQ$r|mr8P&EW5HyM zQ-}^(iMs*DV z@uY@^cgsS#lhBB03=PrBq!JM@WSOJE>f}$P zhEt~-A6csuWr-*GhMngc=vW{DA54r1gB~|Cjhlz+(CF*?WB#>2=Kq+V$JW=^H{bV1 z-#j(xwtriRNDK+aWGas~S?nLi=+)huERK#A%TLHG3H6DZD;x8Xt=j>o%(+*2@Xsn-GT3cJgX0*^4-~IhxeCLtk5kjN4A7~(u6ei0#+9{%Lm`a@% z=oN-SUXTGcK*v_D5qA(es?`T1EEY6`hmRH6|K+3CPHV@{96#Q3yyr|$&zUo4d@ALf2(Uq5kb4v+=N8Iu!UuqcRdynrU!hA6q#X8>T^Qj1LS9;gk)UV%yng!djZ_S#|dL zQ=^5Pj%QU*f(_z=%K*bpEnkDYrzdl16B;mx)ir9cN4u-*OKVH3=vT*Bg~Ry0t?MDH zBM^whVmi`{;?hLQdCK)zFZ`>Ggvkfym&J;Wf7R<@YtG zF`3-@4-?Itz|jXauhA4LY3K|IV{11;4x>|42ppT;Dj1@Xj!@@ZCJ*{GoU62X|< z`i}|VTytZ{q@#Y1#~(-I@MqLbbjXm8=b`F}*@b>+VPToL;Xf^if)}^JD)%VR`X+hhH z9`d;&T(Mklex%6JupraQDzW(uAU!VWAwN=O3+S98y zuCIM?V|9N1`X#F${_{H^J!p%)$^I$#@+!xImoAt>(h4#tErc%4XX zXnS+A{PWEwT5CVy?dj?1tJ7DnUcP*Fa=1K4uRga0G_*^bc_U1NI^f45zNc4LzjB6FJ(PF6wz78pwY8`FmRkKE?$Lq_LIaAqUb-6%BprnUl8q;<+%+_B z1hxS<&}?1T$O=M&k4r4HWjrd&Nd-AUMr!wVw)oi5%Q9yJ(h`1$!vi6%fenqbL7RCx z4+J#MrMO0bMuR-2=@0P}MUmg|?(}rmGzn~!^xT}0TNuK=0S0nVv?R2F+ndl>io`u* zH^%zb#y)uMGyi9IuCK1r==Dzc)3q^2XzaDyKev%u8LB;CB1{{a%B>U?yq?gg3Zq2Nxjxr z*FL`fNqFq~$9+%3HO9tP2#u%5E_yzmzvCGjyLJ1}owgR{_mH1s!B)Q{4X0{o@I;hi z$_c7q(JSodVDP~!rG=1r}-#8i2jIPhr4_%Ff z11sM%Mk|OXo3!#5EzwHi87bM!otBzLoRi^=g(F^5h?eA$m-c_c%Hqf|y_3Evj5~_qYrSDqxAwf`@$l$NIH{_#Sv!_UCK>2(UCzj+3{Rj~(EM##q2JXsT zgV4}Ba&EoXo$Ga1?WO9>LZwo%wm->IPZm#(@>#Y@BI*zFg{Nx&_zQjW+XQI~1?XpDuoBa#FJo-z&fkuO^i4O=fbolD@boV7Bp*+=ixL?<+ zZi9i`2<9PB>eyf+$U1Dab8}k=mY^+e{-Lf=*IdsfN-huHypZ?*Jj2JrRFH@qPijZy!Dh9$a8(H2ytJen>1e?-COx z8IR5AxeXEuBZVZnaxZ~UFEWl>+it-b4o!<<{Qd5dj>V+4!~IH<~zpQij0b5yk7& z==44bjUbmyZ>2@PDRsv)i*kUmyu)YbL z&K4y4HdkcBG#oGuQIZ)N!s!ApmSb-Iq+sO|{fr=ZG&Uy$tElq2268Kgh9n+2W;yVf zPoQ$w;RAxTVzpjzseBs`9HHS(2-YLVtPgw-GVrKl;Np9$_>03Qrh^6=L7)NKu=`D~#@5_(FF|!w z006WQK@rWe3AS_ySKIkDo`v!}RAK=AGGwsPcr4WH$<2r16+oj>ISMok+n8hiusGe- z-L(kAC|($$wos~3!HebFqY+?aD5QWATWT;$X;!{4n>Imw@FZk`VhQ1aRS7`;5%v&AEHbHW8k2hp@DD& z7qkb|dp@z;YNCOTQ^9(Uh?+?tvcMj)eiw!*^@VcWBelUs>+2dMM#fv^sY>Nx(>6ZR zY1E3s`K3#j3i;yjLaG4UD2~>p8{49>&dDIxfC8J*__^u16hj`KW_TTO4S_@?C@821 zkUR=BPROdXk!W}T5pe}V|(SYC@BMSx^jdPkNKG>U70T^$O6yOP0 zD5e;;@llY-AT)j}7KU^B@CaukSYPwn9*tma32-#F&P1CgBTb_diX|D9uFqg-kae)j zo=+!}5rTH8`5g72mik+qnGE^eeASUw!3L_oc}Q0&M^A2;eYn1KL3vssjxJ zj++hYFV8n- zp8Edq5ubSM@Ucqe$;uJQ0?WWAUMXRas{~oeD?n%j>@@I--_yJmy}o>_3n*wvoD7qV zw1dzfZJ_btBxv-Zw#jKT>NBhzcDmPF!I z&{CgkFljvNFxklXvj!RrDColvALq%&hmFu^a?Ub4H#--j+-zZLE|)K+?y?Q+VCafz zx9;xlkpc{ZOk<>&%DL;R8|#g2192pVlX+ntw;E2fHFf-1A|vXPxbfC9c!|)EX@~+y z1Xb2ljh;-JJx!zb79-DyVf2b69O?LroN9Z|NslI|g4K|K9JBEphy3y=V3D>O7&nEevx1xBvgY9h_MpFH_V74lWTnVAxC4VK~QTllj{tZ;&YK0 z68D*@1$y=0;AB8uUESTUAk*mn?Kh+wc_w0GWHiVtrw+vSA~frNdlsMShfR!DQk7#d!N2H5y38o}`F_p>2>?zx3lDsKptvvc~Q zUM)?Q(Uj(9W+F3l)w#L3SZ>br-yI&e*|X~0X2(!97Cy2W+Rqr%^^}NaRfaxEqz9@n z4FipaNlr6QZZ=jrF&7CF8ox}977FG5%Y0PA*X~!)nrJ`;WUS}Skg|j6wOfEA7`RDg z@&>li)bJ$hMVg@!5^xN|H6*Bp2GUWy=`l4S)0bABZ_oh6D0ywZu+gqeJ~n$iOX24( z->CQ^!Kz&!pBz`J`r@2pCN>jM^vFzUuKH*jv~#%G!o?6aOB#k$-o^b44UL758X9Sp zJBh)D@8Xb|Yc%w$fBMuy&Qhri*MM!zEKDsFM^BZ>FMb0KSfN+YaWo1fumRtwD{ky$ zQht4XX{o`t+nPOorz^_A!04aNNJ%n(;zX=0*N_lIWLe8*WMTtz@>15thr2Fb_S!^7 z_Ms!vkuyFm3+Ldn2)2sq)qzI&jfn{2$_zszpvPwBa=DqNpL;$sG1=IlgLYMi%M;CH z5?MZV!VJWp_Cfsqj4Geu8AC&jbDW(Y92zcd2Cw@9s<3m8xrLrnsnnIXFkJ2CmO<+7 zx&(E1Q<{NTQe<%Ci;N9-lc(}*wv8sA+=MsI-)kMApgD#+g7N!%SFM~c#gsw28b6gbJiz0%1@OQqiUDj4> ztN!{YY1ez3WxxE+`OZ1t`KZJT0h@3QmTdZNDD^P}H8{YIHk$G8`hTcpj899pB<<~~ zrTv|q?ZGc7k^ydTYVbX91-w|?LT8)lW$tir-5Br-%DY8tNVI!M0voDQF3PfP&DJTj z9L6)h9x3}uRT{kkoKYC?0B^ezwnNDTAG)>}l-rIDp4P+G$ll9$F7(~pV~QHp4?}O1 z5KZ$8em*5qrjSa~la#liPH^$Adcx>>{p2@?K_m6jQ1)bjwj5%;qGJ3!A%k6cROXNZH7JkGhJ4J1_l7M6XRn{R8PJfh6~-RDhzQIPO|qa@ zBQuH^myHK>|B~b=g1IgRM9Unb4&(M4P z>`7fME(}=}+-PHixm4kWh<>W3Bc^(uU~8pDd)?|@lJEHpAa~;E=(i`o$dwNW%%c3p zMT3Ze1X~`&$fT(m;3nw?8JFcunkxCZv+;jelW68;P&UFt=XmOms3A59g(v45nBi3O2cx=zf{ngApW9goh_OVN3=+nZh-Bcl zI<>wQi&4ojWl^Zy0OU}+@Rgt%zC9uMsaD^dM6j_$DkcvSLF^heY}@Y-$q;T-jW*xg zy(4tMsPP8K0csrNogchh_y$df?$)CGcSn>% zkl7_?fe|UgwC$8eT`4H$#Y10a3TL>7O#)PI2H0RWk`h1(+=(5@Mrt^ipSAz^rM{If z_AiaRvT&(Kv32|#a7;JiKq9Wr&8eGTQPO2P1tt4Bwt*sY@9&e1Se4S+KPc@(eekYX@E zH@3fIJ}KSt=Kp0;x`z_9B7nXpr%>2nnkma98%?eT4>wydFc#Bn#tfQgU`Qg1kSCcn zq1<}I=;Y;t{GKv82(!8~cLjr820aDHaaI(Pn3}svo$r&dD5#l67=$hv2tn6C9dbRS z$(iB18VpuS2=c0TS?6yxHu7So6x0ZS7WCAP1D$tmJ%>E&6i745GkbetF<(tnQ>G^| zc;(I~VR(4>MzWoq%p;q1P@HNCXVq$88fC6RB6{?xvl98a`u^PxXF?Hz-A9hv~= z0clCwf=Z_>%cA;x?ACG*z2u!DwMJ($d~-k06H%EJ0TLkwglQYcC(pmAt+)sS@2+aA z5!fFfk}?4>il`A4rqN`G%@Mgwc{V#aO1eM<8OeVLRcd@{rz=? zh!F-iD3r*#(M#=mky<0su5}BwgY~o;Q3F06oP|a=bU;)F58Q(sRo~dzlhblH^D8xyLkYN{yWOGym5De;Sj zFHqw#dXQ?g``-2i=h%FJHM)HCZqKAILkBKj#&5{mX#nXXq)k8xV#Vnx49(I!_bujU zIndX6etDX@rc;~SOuC`q!J=T$8qjnMehgWx zuqh!)P(zA_sEUv~Uz{5_`VJ>f)BQ?7M3FlO@+N(ACJp`~n1WHDQl=-)6Ix|ava z|57#lZO5vCotHoj|K&o)nJuFCI58ugSy~21fb{7R1|_F;934^r0n8FS2VNrRwM6!W zWnx(i>VGmQ^k|cxjcHx0h8eedA@?kCLO0?E!2D3QQCNR(a!HjQHZ)NLP7QE_2!b$q z^Wc>gi zuF8UNM~#msEMflVnq{q$gVadC5VEs@;JZ6itVRG+LebHbLj zSUk+8V;50e+n$c0X@x`8Jx#rafuA}+L*gDKnO&FjNHU~g+|7BQM$T1A9`NK*ao2T+ zOSty%mR=fmJ#QuKmEco(UI{LBzF5qAK;g+FFJEM9ueDMGSF2&zhGBvlBpetv3a}>7 znMyDjoSUL@4R{@FERPWis4>);YT#B!eF9qDyJQNd_`Tc|1o7Z$ghWFS6A73U1L?NL z(ok%hRO9-tRm0zD;7~X-Jw5Nd=xlrWK~9Y#Z0OA4FQ5jvQ6*zC%j&Z*PoGUd1EK(A zV|#0M0F7H?4#q0{ls2U1yI=-zO#LOpo%tI6Y(UY5nb;rB9+{DF&MSFtX}t90?oQ5g zhw}?cc(+W{D3x6A25;B9vxJ`x=c``6;N{EP+XZjCoGn+yR%*b(6bwzXO>@$MDzP@h zffQ^$1wtyJgs?i5sKB5k!3?ICEb15TQZ@Q(xpjZ=iXll2d0v;OQ1$VG%ZaK zVO4x?u#ir3H1uDoMk`k5m!>nBoa-K;VM4jE31(nuH~r;yhSly8X=`)MQ`}y+BrS@TWXv&Y&b4{I7a7K>(bXS1^Ua4d*!qgiIgB7ZT;AdFSws}plU0hbVSHE`$UkXo0%2IBdQ79auHKBf~s$R3(9vL~`_NT!$o z;*yz?MS;>p9Gn^~v-TnNhxB>yFMN$=4hgf%SVQKXr*pHH(+F@Bd6$~yrR~jlf+NY1 zz)%&8U`P@&UuK4)vk;9~(f#a=*7o%c0`lvx$3Ok_YZD(D%n7^xd}pHr4b&Denkx?m}-C-L=D>UkG?b2uoyMMlPcLR z)%KY|TmC8~%Nm%WT4HU|rZiz0AP4=pPK_&A{1=@=Z~tM>Zuk8_cVY4(%5t`Hn6 zalMbTMdtNzYH%d#K>RbAJg0`Uyflqsh57keSQcdCYFAv>sT7|XHv)-{LghYWDZ*4E zmsbLy#tJBrf6Chllh4sN=&j_uNVwz@R@~AsHhA_>2V1CC-CVAaL(7ug91KcRTw{o+ zVIoy$sH)!EL&HRjZv<4hRw|+2VNzC=Nmamypc?$wX0m~!@9Ov`bc)d$66*k|S&R&R zXJPhIpD;m2)dDq$8-QqA6S63oRLjO4m8lPJ|B%)Wzy0>xSzP1#|CB@Vv9a~d_V%G$ zy?5{n_cWbGK7o)~%FjSP8USi=6~V*VKxPdwBg8ro@`*b6gY$*g8Y}#cTSbD~nx-1C zSnYc4;N)I}q*Cc;3DmG6;T>A|$FH13QEw#@|m8@!u;GmT6QHY!(U|xB|4U zLzl#!B+t`OCv^yvNjVbSedPeaj1&o1N=XIzsR!b+r5R$-fK}ntq21+!8gXS5mickIaBur>Yu;o)KSPFzsAnQ8aq-?G{4tFJCD zWnaxU0o2I8zrD5fC51qj)0m#an88EN3IEJCaO20s8MT$g<0sVrVFMWfE%4&3K{M*j zeyzrn+uo7BUcsFBT<#UOdd2ge%2mtRe2Em~fpCrtN=n%sX4F{Ub-hx#1fQeyKpDP9 z-Yt9O0suFoP%VHOO{#%_g=A~+Lk)X^3WIbCBA7`w-=Epj1iZrvN;P6|p6dWfaP(aa z1S|u&Txr!r4Z+0ZWQzXMoEo~yYcd!$*hG0+|p!0VWW zHJKfvnP5$wH)H3%=ue~?X9UIuzQ=xWcG1u9&o723-8iBaywLHg>lVU0SZ1_nJdmw= zgA3I{YNwjdhXq~Ad$2RZr`~6GuIAx?6!OIx56(umkjoZ95Z4I`SyyUSjVRV}R5d|0 zBuO@5PiRyb=}iTbF&ekW_yArEB1+Dv;j0FYz6(dx)`%MFx@J#~Okk9()M|MYO(s8+ z$IAiQF@;cqBOd46u(Y6sAAlJfA7XsM=~4GJI#Ue*V)J(_nnJ7T4J1Qmw(|MI#mq)J zcG)S=in2518N%jfVGSTd0>=~2vy^+qVp+5EKspNGA_6}ePVUKB&7NHIJ2W*%JkIyo z*rX1ro8kBMwgew>ukUR`k!)KKagmR#DC(XpjRZ&f5EHQ9Mm|NoV(z`7Ak~5e*~6L$ zu@Dd{kObT%#IOWeXrjhIG%g0g3r!sZH88Oe$qQV$_E;!-VSpx85>%_f-HaMFeFR!_#DN7E;xoX5iY_2W>9&u3zlUCO^ZvXIZG_QxN z(Sd3-uR+{js~x$%)sI6=98qx)WIprFVg~VX&-=LQEPuCw_v%PJZ1|X7~_&j(6Z|XevdbBAO-HvT16nr70;9@gYM_MHJB%5Zg}4lAID# zlBOHBjR~(oKEXhw7^8q^MiQYZ;1v=?)le}skkzlLUbvUi{IXD?Uln+ZoAqIvit7{v3w_{-g z;P$)yQ`8#9XleS*fgHnMvq+$2)PQ+sei_ur%rBuZBb{dbcUmz|_wNYsGSX>qn4c`5 zIi3ik(g9#h_(fMouq)Nj474>+G)?A;h4O4O+JgnJ8}M%c8- zU{|Uk2(m${F*Rk_rcVunEyEGiiH^)2g@s}2CUKh*l*D>JWkCr;H5?4V_pq!1=+T*K zT<>qMzX@N`@4vnPA)O{wAl2B|THK_*r0E!P^7G3anG0CnSl+-B;E-Kmc9)}-8VDQl zQEdBpOVNR*S8_2z!VQshgcqowf`oL6jj5Dgz+d1X{xSa=>Ml?uL6rW&y= z9WBNqFd=*uc>zzH79t)^LswCj#wq|J7%D=cgn<70399|rbxVbR37M+~IN`e+Av#8W z??5#~QC?r2x_Wh8n?u}HuMJoyMWTifGU#<}2rCntWpYIUNE)_IBIG0lP-lH(eui6r zFr>Y&;nSp9HSoFxL1r+RY-GN9?J7c_w1(E{Z$}V?A>6P6C+>bz9fr$zH4tmWjZL5q zdEd63BmL92Lorf}1|+%)^&42QMAJuCFVXbY8%l%sluG;Kqx&m;m-fGAe`rO>=6;cS6h!;Z0-~|PAOFpjyG*N9xAJ*g`n^uLQKyU+3>!1eK zyP6>sh#VcLMvHO2>2HQ88<)v*U|IOg`%?lW6TwZHnu5e>3NIA~_jvZ&$sC2Fw zE!j&PcstdQkP@xoQmO9}YT}x}-aw;qS4@MI1f4Byic_ zZU(UevZ1OC)JO;_tIQy3j6I9FD@@s+4V|0}-NvX9gq}ze9NI**(TYZ!j<3CHB#=@~ znNwFKl8wm;T>*?BUwf9wYt>Z45^HP`R857)0gDoJ9KivQg`IO8W={%4jlcf>Hlop{ zm?U|5mcvO5(P*Q%Rw&Y5^zZvGdIztl}QJ2yA8 z-iNI9^FMhr0`(1_{oK!1D8QZ~pPLeT0zeH}Zlp$BGSnnxS;qhse;UN3bxA&fY$Suy zm^d~jjDb=?s_|<4Z3mkDy|$_`BpTYP4cS<`3QVoSrr1G;5DGcYhA6EPFtNdb)4xGj zySjdL{rL_2(8+Af1DUI9aQonba?zk1ivPXWw~1?Xz~1{Gy&rg#;bGj~eDh7VkGJo; z@4ovVe)z##?zrW_JMOymuDkBKAk`JOaG% z!ZWPFHwSim?UYUJ;NN@`pQKOS|L6P_xC(4N3BDueDD1QW!$IV-|zW7cUP+>lL@oLdMr%Xz=HjV37C{}rLoCsnhyq^ z9Yt@|7PJMedVUJc^)${2r2Rv#5g0q?D;*C>;BGEW8WZSoqD76ip92ykR-EpL9vX6R zCLDa|tzk;fTR`anN{#>;L5W6C%-5u3bJ3H5nS6;cblE@u{KF4V-#B&ZBG6bCJS@sJ zf<+%)zj4qksy>Zu12g^jxZe8B3)S0RNYqCq))y3v7epl{!ZjXCOam#a$5$psfuAQ+ z?@3KPawOGCKf)aVbwG;0fUY=fz>fxIv`pR=@rCq7#IAH;RSF`&0l=;OCfGFl)1)Z1@-lbQ3Yvf zqvO~DFNN0Sd3Pp9G_@m|tXn(!=AQaQpmR_CJy8IIB_8)Ynd&1W)oRk;Q$IdF7a6Pp z!32rMgEp?$pQjK+;6$2CAVdp7Y1j!gLeN+CD`m=WSAa%d4fGl&VA0!f1LY|G3ftVn z-(Ii5K@AQqKhd5|=V%N~kGyQ1~?h#!o%*2sE!CfpS(Ohwz4w) z4aAj_@%oMRQE7>keyogIxe{3XjsXFMuCbPFAet~Jd^2*4*ST!Ar`B;tF+o;Hk6(f% zwAM%sjYU17CufUgvS6?@*3{toclHt&ui&y}pl<0?O7RBnCTz|!h`H2M^Nz@x3xvky ziKGbxiis?2P0YE5czZYuG-8Xj%MM%lyZ{fhW&BaoO3^U(0fKclWT<fERw7JI)8b80~(sIOiax7J684f-rdQO$iv{vK2YLJ zZ{&RV(U>I~vMyhq$Qimkn|pa;=mJAyga6yG`49vLt@z_i&U`eM{kv<}7!VMafvyoZ zHa#8J?P;?}o0_|1LL)esVANdW6rq8rvgEEo?F%cESXfe6xP72HA+~VssQTtxg-u1O z)Ou@gwb$)d)r5qig!Xfzqvr%Op{5NAp*4&&08nYLYCX#?g))3@FLu6p^5#oG^b8z@U3382vpW-GR z4Rj5^WV>ftns!f1U6Sf?z93m-1t(}{Xs&?)Vl9+YH*TQqx|FW5OrJ^tMNf%itkoL( z!PdMzqX}=U^{SKV-llci+%DBUSlPtTsBH>Q7#$cL9WAt4*CnIzied(#!DVGxgNYR@ zm`ssOgvWC>pn*63T*U-|jR&!twNLaM42XWj3N%7_0oD5K-|{V0S1fet8)6U-PF?)@ zmk)ov0W2Db3kT_L9Nn^J4OnsHb{1!xY-ni6$jivMgk{MwmY6a$rY;Okq-0#y(3sL( z14AGl8W09;M^1>j#?kq?MnIO~QOE2axw%{Q$dXgG;3y4&Yy_mCT&F)@O4qPHsi&*S zsuQM;j@a13_O>q7J2*M%E#J1SU7ehqyj8tz*zIk)b6Y}nVI@czRLjG|!@~0h67^3W z**MP0ID(Hq%Oy2YBgBfZvLfJdwM7J5Vrm8Vn84D|sm?lUUw5#uHOQJK74LR#vB?S zp8jwta}5)(W=4SxypOk|qa(Sgs7M{`X>qw#uh-kGPWD`?fN2!n8L>H`y|z|Wdt8(5 zZQ;7G*ur{!eW~9yj!>q-iX^2NQs_%GT%5)hQUB$1z5mAEWtKH za*Yu`84iYqDE|4Y5iCp^%?KKB2_`JX?Z>vqHDK9kG&qP2bRte-<*hw6Obm^w3xEPh zVY;_-RrJsVM`O+@w2|XMOAZG^gIps3?0le?VP+hkIkB+2afj8^`* zt!o@!TGxmyO@rz;CU$h(S=1e-!^_MzzdGzPn_Yj@dcDJ5uX=0Hky2+Tf!hN08ZfL+-Z3lZ{~c&SVT5if5g*T4}Z31_jrvBoD|4Lo9Y zD0)uRgym>(iSr_fFZqCIm7zg&0F7lKxyEx^K+&!EAv|NLFM8E=E0G%kTAB7daD4y6Tl;F-@j9A0Ajn^~CDS!rV z!BSug`eheZCrdwpMlbV-7NOS+L|g{5NQivv*;7$D1_Xx8$HhH33%=6R(BN)p=rI@w zos3SjT4*BIfNh}O#YYU9YjBg$=6)#Vv4N4$xFduX3Zw+qJ^5gn`NQL>sHkvOv`e17 z-HOy@XU&j*W`n!Nr@mC<#?rY4WHmusVn4wB%uSoa*M;4Mbn`Am5cdvM9adG3+S)wq zcDV-KwY9?_Lv_2yRJA(1DWNbnv9x|*J{qOu8pt7l1`~C#K`VfUPyQwfl#UY+Q#cwJ zDH4H=kjffBqZdNX>G-vQg$_Y%0V6%4StJvQ+rGnStc?2=6bP;}am-ebVvK<#k#df2 zkNes$91Yk82ZJnQ0$HdZ4GzTIioY$(W$^n3p%GFGB@hiiAfCyuJs!#F+|=DJN!`tE zk0RT#TTyUc@Gw8uKnL5Bx`qkTt=qNz%GKJb2~Gw0lrhCHe->szX;i zZnvD-O8ftCXJc`2rs;v~-*Eo5wsU?o^eoLVQOBxju4b;+Q)%mUGL37RuDt6EF0LX0<-!tZ#B$TX z2__5(C}cJI;9}^)zEQ);Xdn<=6PO7fv2?V>h{ZQ`YO8ritK@(xTZHvUGIr{*0|pD#lV)uvZZCmA)%Dzf3+m=Ni;P0T`^3ft-?AMylRqLK^xo(BL%x_-OBQ)FSATltfQ1ZDEL8ON@NQ9Oa?1+~J-R84BW&&r2`NWw)LI+bf zl8xgopz%?!9}OMq8b8hM)79+jAnn5gKOLPDyyO*7>e85)&xY?kZ_7h;jpuzS#(XmD z6hS0srPEo_CgIs2)ibRql!eaEH6VVz-!(9BG?pOQ&;pMRuA%D)BQyjsVUrEC=(E|Y zz(8@`p?m|DRoQ(?ohTS(g^&=8*D?}O1`@sc;7W@kcjaAa%u<>n!`F^Y)7(CnM zj*fPS(a{gpxv(<1YE^>)?NkoOa-cD_ZyEh9R_HMABs4nvr~GNCZ?1vCRy47qY1U%i z2d*856dxIi#)jg~_Dp-ain^hS_O@v|Y8wbL3O~w6Onk-`OXC{B`}fu0PNk9#UBoqm z02$uS^rLYF%i@Y3Ez>)SMFC&++Sg_f46Vu`_W5betis{eKh%L#6w66g$OICI4eB-H z*#`N@GM&xm8hplFqq>y0Uw9#%C$FhT^dY|%*B4M&p{wG1v@9IB?6^+CDu-hz-?gp9 zD6~d9qL0;`Ju7D57^tuaN%uyt0vaV{y-+6x<{I}dTed>i0p9={81b0keU8}_!a|c6 zES`1{8}W-UyTIeNpm+ibzMED((x$u@oX+mXO-{M3NbzLak!tvhq5;_ncMX`v61oQ8 z1R5PW(z+8sgF?lO-2juY_bHdK^^Og%q*e}K&q1ZHxtJD+GRH)*&Yn*mqI#Q03yy$| z-+=}~14>rDYt3^9YZ~i(f972hr5W5j$TS!l2sd;#&rV9weH-v>)nYz(HQ)liQHDZ9 z++M@ILr}ECShnHB{aCv$6jhnup?#C$v1)Pq?x7*q(ETp4eKI=wBry4ylYxO;qhlG^ zz>72QW`B}>`!L=2ElWeQo?wchi3W@T;zz_S+8=-6-yQ?k`9L&y3uSDqR+63Fh$c=* zk-HU-f_@b3R8EGrKF>9l{SVg&KA zLO7)SARQNko*A67*C1BS7)7B>QHO^QoI{U1;4rb+K&HVKCL)7{7;YO7z#!LPXylc0 zQ^BdM1D2XM^dDJFjuDte0}Kq`;PSgGkJSy494&R};@8({we=F)v-f~8x%%v$IJU9- zWIJE^D8APx3MeoQW*Z&-{rfsrV1?52`*JxNF}{J5z^6a~jr2Q0wTsTByb1Kf_TZ& zXL%bbMb{5_z~^ZRXdG7_QP@$VP+VIq8nG01D7BUC?V|%v;yM!=1O+F9Yy&%4p@V37 zjNR?W<%}>h=jTieQgJ8}#2*=CoM1v6|wVh8`8(UbAy7C_Vv#AV$NIqbN^_TIg z7LKeSHm>qqgUA3(N5DoJvkZOdTt{0--|)lL$qL^?P)bf~&OutaWjwR#tgylE2Sb*3 z=U1dR)e3u@%Mx}CT?R8bo5+=bi&ve@mGfC!|a0W!u0xQRw-YAP(K ze*@2_tX{ctImqCHmTX`I89;+J)6ailgPzLMmm)X8kV@51f`<$1A$~6y7d22`^R`KC z&F`IQGZ^qXm}2o(LQ}%=@87J+r>sPL2k_(O>YDY8wiaT4;XxC*!F`G!=-FVIfPxs`)yA@(g#mL z1GeJn=3)^E$qr@LuEz2Daok;wyF_`jl}|LsZN$hSkVnvdo>5ro+up5k2PB-#HF!^L zX+38H?UO~jMqor~h&lPuiDPdIXPW^n=~8o3a#fGnV6J=Tz)9i2*>-bdQ*BeLc&HBV zNPVliwJblsr6)g!(1093WBCd{8WS9in;82$`%`>wp%uJtr;UsJ?E}evI>_cF>l9#;(VjI#b|7)IM6PB(Ad`0&L6cjB$$nO{l2+{GFZQBMDk2Sx6i@R;Jz`z z`%qG1lJJN;?mFFo=T8jyI)fOzOkqPz7ItC>UIVDTYB;oFE_KZRO_sPxnOdr7piH~V ztFgWbK_(7v;qf>(HKw=2KkR`%WA}Ro&{$H}fSSGD{Swd^v^+P`W?*Q1`M?j#K~dl` zocOUXukmP~T!oFYS4V!V!;xZ1O<0~hfZNPhuTFgSSzhpF6kud!Eb9|lTXUXRzb0o( zVb)H(&LlT0KB*+DaA!>E;jHn})Wb>R@ks?S@iDI@9eyooV<}7{bl2b!MfU z;7vIxTX)4T%h|OnH*)98C1Edb-5R#>3H%R|7JU%{Webic?Dm~$x7sB+k!si^?2ap< zJ2;%(<###D(WDLd2|@z`7)#0R@jahj)Teq$&AvCrGfw4H9&kW2e-ILRjq^Oo@-LsR*yukLSFr7_EkBM(dux>ePJJM^|?&Q$eW zI@l`h{{dtii3J+ysjn>`8R>JorTw)wywjqo;#~c+D?tWx4UPuuXeT%#lC~yituMhl zmXoszlS;PW)m3<(Omciq{S)i!OH*Su7UZnKp7`}N6s9fyAAvE@HXMKPcJ484m0=hc z=A;8-sxg|y#28~{u_qzYNmeqnni7Ph1Z>bjTTz^0piovfiDi_s;)c^AC+fV+(*llT zVo$|@Q`<&YYYihLnu9nqH5k0aEE+W|bP0d?yx(al*ii-1r{!DV901Z?G2+01Rdv`Mc*QCPoO2`T37VC+6odDZez@y8;cPvCh%1v)gu; zqx4R0iQQgz*_J|vhC>fD%5yg48c=Z6h?fl0z@P@7kTL2tI5^11{fijvD%N`e1Rp*k zStMyE&{)-=FwgjM^Ie0q^+|VdoOILl_MnH#zS82&Y1%`>Zc5z<2HeNT>1O=CGs^k+ zNbVI|hl`BIZUh-XgT%s3M3<~zlBcb=AmKVv=^0Cqj;hGuC_)}PeMx!yUM;q{HEF-B z)7do0Hlx+HYfNZQHm023=deTwPu2eK-dC%hRjK;F!vVc(^pt@CvCx2XKgUt~^4$<# zqFa(0WGHCBDn_58-pRt!{1Wv0!srd7ODkNXyv%N|w_CTAIc%2PLZeZ;MPn)F2UC$?|LtF?MP%1YdUk&ULS z?zwUW8Z>dj&_D%`24v$i6*}r1)zwWJt4*h^Ye#htWJJ1a2WrhV;Fqq^AmcVtU1a%R z6kze@irb8zGxbBSs#NcPM_8y;{pVEYlAk_~kb(xjm44|rhDMJPZj9yYmwunP?pi_v zTA2a)22-`JyuPkMQ(gA(o+nD^(pGKKnaXsUGFz6vI)+9Tz1UBxQ1L^m z18@RWe~D^{2%r~X5y5^{c?G*GV_t#ZCh}&_(Piv85_65;C&sRymCKQW(N zzp$88%@t zwuA?1ybEE+F#0E9cdb4QG!Sm2(O{-=@}-j-bB*li9!bnCl4O~kR$tRaTFINaKG&SD zyX(=Wrbk;9G}sg>?L%v7I`*)wz8-ZF^QjWAz6efotm%nkPa_e(ehaIbhah#A9W^*n zYs8pmM`^-rZFT1TYUKy}EBY&jR6`XiweX2b-H-G4XizF3m8znmUsc7<6%DE(dI^mV zZb_lhBpM_03k%oXFg8JGd`oap!$OzIJxJMA1#&m$8ql_2x;d$lc{xCzy2y*+@UTDZ zt*xvbM(4y+!*@lFwA4yMcwgA)m4rarHv-^7(aBAB4d@EdY;I&yPOI;fOOkR$*N>~Y z1npIs`m!nI8f=j#vGJuzgJeYd(r)1^~@A7NZ5a}4%f)|;Rk{h8E#k2OecPW{`QE0AC{8WU#MTwqRZP5_cbB7iS5)`S9$ z1ZsLF5`g75OyYBa_%HFnsi_x8j0_s@WEpvmAq$#`t>6F`Y;_-Aa#(kR21~o%hWdv# zq-4)UbZ4{W7PMbtvuNgCrEGF|{;J@G3t!_)z>|k?7=-*#lnx@kI$BiKV@cN-nOIt4 zXb>4#Ks+(OltQB_b9`L2nveR-H&4%XMjLRxnIJ_QL6&L<5vM2$!9b7?%YuNH5QWyd zy81RgV2diSwEpgqtI8t!7f*LP{b&Td*0 z2v(F73CA?`*4!MRVX|v%rV@=_S8dT1nowEFqRqSPU%3Wkyu?7b^4EB|_@IW+2qwPrlf-U+ zC!N`yTqDQBEtnfB3iHjwl~Qw!U|fv`$oNlU4XCqkg(8u@zQsj+MIx+&LQe<`Us#qP zcMn)ByWFRcS>X?AHg?cfG{_Ayh>b_iU{Wog?SjQ17$zbp^0aA*$8y4&7q6?{Hh&;qJE1?hbmf15fs?7O&UsuC2vi-_BO;JD;sY zqjzb3^m-{57yxk5~s5d*m_hDGN1={y5Nx z9FD~zzDNk1w26LEsE`Hk)=D?FJW{=DJztRyL*Lp2*T{;2Nl?6fb^e06Ajf(A(V1OtJMB zk0+$^EUV8M_jrD3Q{!b$ZH{|taDs27(0FR>_px3KdJ!8-u#JC+M*C%(;2O$uubN+E z;R6{<{ru7HXtz&{`g~Ep^6)#uLO_-VDve>UeZV`=GBESk9?Hr8%r&4x9t?^H6N>>4 z>UsvSbT|;ebLjqH0%xWgc23Y?`aN`KY7RLco!Yzi)QL%i6O`NMO$xlEG$n{K>P>o6Jr>UWd)I*Wc|H*Kc|5X*gpa>Cb(PXg9}aO& zb;09#g^PJeZ;z1(4eUwko&Wv%-s@;I18{uQJCTV-_92apy9QK>ajpx$%d$`zCav?RNXJ5ljEEMZYGx-CIAy_Q5{^IRiyPr~aJ!S5*! zJzL{B+bE9*U1x#>8AKm(86?}7v` zRl-jukk1=pY_RMqY|f2#v*nO*MW~<_Mdl8wOp{38XQ}NmR2<|9jbHF3GbU!D9%vDF zOl^b)mditP#U9V$8Ba|ep>fR^#TqDJMr_LiGe(u0o7iadjaYyIOT({f1 z3xUSzH{O`Mi~fX{s5Lhvxx z!=E5D%#B#i!}TpT9`FR@6Py_Eh~{SmUk@h;2e?M{3C#V}o|?RP@x&W{P#$}UIGEmI zp-NCF1f;VXw_L6)B1dz>67cNEhZHi%NA!lh`n9;t?ix93Puvfkyr{KDYIyF>>(AiLCt=FOMmJVeP zG$t%ives7{>hbRX)-`eojhw%Cy@6OH9`#*}ghFC~$AOQ;5RCdG-E@%rp-@=gbuq+u ziIP7S<%c^%{>cbqBd|=ye-~>&mE2*^nbQ5{Xpe%%V&ncEbEvV=Q|ft!6Yd)qxt`cr zt}*BlF|oi)r;2QoZ@lsH%Ts@#ccN$e3Es?e6xQu$h1oRi`n-N7%Z{gaD2Y~B#K9Jh z9z(s%Ld#lkZ>Z_sw~Pj?;cRHeB_o_r0gb{w<|2d!=V23xn}Baje7i6) zhE4O>@(Obs>D97Mh{4|OsB)lMG>ZKj><%n4(4oprq0X4)Pjgw@oVd?Cph5=BrU2qC{D@;`=R=%&O%&CSi>NGy6>iiE(9KyyNy-$M`;Mv(bU^yC!sYhav9aR{v1sfO87`E#os4GL+9?J1xk zbOao1lM0d>+t7=>w7q7@4U&3X+LpHy8pUcxhzmx6h;zRh4T=G1EGlRu*^w28={|p+ z;K<*iq$D00RYo)BM@Cpk^i-jO2C8?LTk8#0ou*n>U$3i2r5#&+S^FA}k%ME#d(XNT z2!d%n`2o=Ig(D%E(C7+Wg^Dkb*`#ipa3)b=4Y^V>+3o$&yY`O(_#tj<+U*Bg=c+*i7beLc_^E^&StCqy`U$ zHn@iDiGRSp^H?XqP*ncId5BztS`@Is`Xx(aBg#I<5r&3V>(CiYsQYRvEJNCJR1`u+ zjq);0<}Y#u-PzxI=69%0^C0hwVI;#>BLWMjKLk#~g70D|e1#Oj09dpSxgdsd*&XYa z1h9h1*Y&tYI=90{Tmx4xyUbOc*x+h*nYoUkR}UOVyrH1sV`vNoU+4Jyuot1tJ!~lg z8>gmD6B?j^p<%5C8V#(ppw-HppQ8Xr99#W5s zj?)bsjyl90@{A_}G$3^+&ON^pHwS9Ez15I zR(4KuvU+xw-~Za&6B@B7Cf7ot&aNY3-!Bm<40{NV41~mvm>7x1A{J*Xd?XgCr~w-> zAr*!K3x-Da&;8#jzs|fL8CcLyL6V-K6RxkfN6apu(bq_5G(Iyl-rXpUk9U~c23lV9 z7TI)2K|DFNC-+@2fTzJ!VzAa*H6=O+#y7nEsTL)jEs_PH0Ao5QTX?Y%&x7)H)vvbH zl~4^T^(UMwtm-IxbaqJ?%adGAX^!*O| zyF&$OlUr*Z%$c=g!w_&30CwRW1wx1{qVy{zyUOJk)sLE z0*r5558D74OxqY54JgR0t!pSLsjFVjwbGEDRNMHw&!i(a>gxU{mPdq9uZ0S}^(q-&f^Y8_s+v3TQw?WIFQH-9nyMd|i&9KJ~Dy)$$? z^WGO<+;{JNUtnGNzE4kgJ$h=2&AeWoO#i6ULONXu_7P~T?e-KJ-euFEV1q_Y3o_pc zJFZWeje8y{r@qqqN~@{W^m4uRpjLPApw(nO*xK5P1Dy|&&Lf}X$&)~X9t;g80D>lE z31p4;y zc#DJt7Hcri_&;0&%I`ReA;eI`lQ?^}&m&_d_UKVxq))sVbFnoyS41Mm?;B5?bf~^F_I}M7gUiF5o7~}K|hr&{rb+Y@668rFw1-c4GNe@YW~}a0&J5{p#e5l@xkFy z0!TvJ=NNTggR%E z44gan3W{875Y?lcfGwRmAz3Pk?Swtk|L$rx#bIO0x#WwQas~reg*Tq8NWoP-%vF_F zl@lG{+pw{x)uTByZ)dahWz3 zICqMITwEL%_^{J!+1+JCj^{3~7o|mmD|18!mdTji4A;mW=R>+EZ}#!#qkU)l1hI`f z?B{zpm(ar@1Kd$C;qmW3i*HG-&Z%R^>c716PJG-c{b+JH&^tk(;gI^%u5lMj2T2pK zTl(M45{a$jv6galN_OZ685(B7Lp^pL{sBsueKd@X{`wr#ELxQ@TCb5tV|4z85yYa` z=Oock{RIq;daaw_8f(Vg-WFf9D=ZEkbhkMDKL2nS1LmT?rE~bvTBozNWv_P_rjbq@ z7)X)<{pYa;Q!{TC1(&(;ZQuBij}wQ2J(y{0>}d=HT>GDK1?gL7BT~^+>yE1^3m{^R zl)iH~tOi2E2-8Su`iUeNaE&*wUYmC$^7Q?}9ZO_8Nj^z)cCIcRHxnDgS7{} z?X@kAO1oD=TawPA5SUf;Ke-0<(Ee`UQOvdVc*cEZ0ce~694{XTESg}SnF@87ayRa-OuuGPa>i1+gdJzHvW8_c#>Rf7+Mn-$j-O|jMpvT&+ZY*JC`hBBF|Cl*vR34rv(DdrmR4!t zPvWkvwTU1KyRjFVyej?ysjUivRdA)4LbrH*0n(mYDEni(Na_dwFDoeSSZ1OAc)|T-|)6~9S#w~BQ-{qoJ3GiT00 zL}*)kdmqr=*S>uS8}g}7eZ||GR=2M{F1o`;;!uMc6E7zwEVMNQ-driR^=v$RXJdzY ztsm6rym$=TZo69sj;!hE*mE(uap#?mmQeR*g6DogY7!pi>FMv)@E9~-bkZ9@o%kHQ#DwjDpcW%YKcx%x_EmAWcdHNXpk zm8v0dEveQHNb$kmUPg_h$D(U?@9s#xJ{VSaxAYu@NMGzrzyf7O8-wK|It$WOo(fRI z6DGa24QIVA{AuH|qZP+b2w~h|Z+^O!iX!uhd$~Q2@A~%#siSLL+2>_V-6qs6x}eMGCsb*l~4fZsnx`uma6`)i8P| z5?Hqh#aP z@46)^23Ek@(9XOPH4NRr8%}dWHPAH4uyaOZ-+y5wtfGM9Qp!<2|NZj<`ps9vKH$}k=#ERlO8Ma29*F4O*<5qazIsM-RRUkxgs!QO)Uq<2mp8SJbT3vNMlZ}gU(v3LY4>5-*3Y$qJ2~tATaDW&Z_UZGA zgV`F48+D$ty!NN?_wGwtwF>PxE^jAx570~zvk`#2-_}EJC~}F z&eZ%)QKQZ!{Bjx;3hy>wfXuxgL0;J~i3LtR4um7dghF7O@@RyAqZ)>}obLx;kQ_y= zXfR{C-#?wS0+K=5VK=`z#i&8`O>7biuJx4K>en~8yk4)%8+7FRb#gVM;Jt`E{wMNc z1TdkzdoVaYm_rRkB5D9SH4N`ptYW>7x8T&j{G0Y$^V6oVsxv{=pO|IJmZQJMjiEbtpOEhY*CxX*SM@{I=QM0$H-fOeD8|Gj(SyXN3469j13%{GlZGuCg z70J=VJ>%EO%%B(U3b>)!8U%wFF_Mj#$#l-MaJ8cU{PC|HF=~JQgfo}X7$*7t7R=bj zAe;JGG>@{2GiDGqGk9gRUK$1V{G@|sL3RZPD^D>MU*BhxvsDe)uyq45Bj z7@A+h4QjYS4V@G^=+Ti+{|g^){-;^sZyGE+tNw}^1DC(!->y(5hn9WE@1NK0ch2?) z>5G{Q8=d8h8czDs>8D5N#eV@``$`W@!@}gI%pe97R%DC(8aCY@sxiaVdkY;Ih3_9N z8zFk=P}yq$3Ci&zSY>PQPek&?S!iVJ@Xz*_&vceAT(~gk)T(I(%UShsAy3cpye()Z zo#PC6S!|ZVDhEq+!^_U#fW=`09Q@uJhOcG4=ZudT>o%P|t1c}_H41*?nn&_E1OYL= zl6S@^2tz>-W$ZMNt613uY&?Sqzw;)!L~5Iqf}SIn^7|VJ^ZzDUCTZMZix6Z-_Blp` zQ{;llygxJ?Va?!8oH4&w|Fk4Y)?;wE2bAa)UiV`b~;8JNs7^q%`nQk@p;T zjs;+Zv7sY;33$8WX+OEL*Pxl{Q%NVC&AP9g8LLl1MvMsqdrE(v+;R!BNA)Y{y zGGCxe$4^pV2_k_6ZCc&|9|*gfv-j3}XIms>X3wEONt8@hrmcYvaQb_Vi^sQmepc$b z{t&zfmJZJWe!}d7eD989v)lX&TRY^bSZ!Bco*ve>H>2(~?!M;drUq0QE*!=(5C-aH z4+hKF|DlCGH^;QH9TH|d_vFge{iDlzGQ2mg%Z7!A%1hzFc!*8xA&pZ>ZXYCxCJHcZ z$)+xu!)%yrmbtV~FhvCsNUsYAbV#DaAy0B9MH}R25ThPU`)C{rQ?yh#RgguOa#32Y zhwe45I1Cs;g=N51RzcExl3^683sQGMD)J5qDv5AZ6)27bzfHxA40d4^Ob;?#h9>cm zqXG_uyC4MygsY-JVO%OYA_)|!=vYd$ghO2R?u^NM69yhohC$*BaT#<}7$}S^gRUOB zznUDSi>^bpfofzN835{ab^cpDAec)-a&zqS=SWsiJ3Vq`C`*{Sr8dgL-Xb9EQxJKMeYh z!JWZ!7&x}xQ)~@`Giqy8c2pKf=ASW*75!#1$$QPSZSwQG-#v43=axyMz`#zf!MTWIgNvI6A5REa0)tbbf|2K@L1aic zWWu0>1S4QXkzib}z~SQ|!C0WbV~b+8b+bk>04vqnB7Yp8ILV@Np2GB_B4S%W+w+A~74 z2G=4O5aGLoYvdwbgQWNd#K;Jlqb!m^U=SKmaMrl}rfAoII2}X=j~dK1hhtRcymcXYx-%^HhQ14>ZZ;0mT9#5JHLvIdQ^On%VN85uZ8Fz7(<4v!kxcn+0l z><4CzFPUp3s(A6b1|Lr3FU4JB`K&>f!QtRF4RMRDYH%*XvxWp@(?6W87 z2n}V1vRmX7&_bFV5kqkenKgJVlro1j4gZkDHE?5L13RC$Zmu9}h%bj^4K;<*j%^iL z0}7g<$hyYLvj#Sa#?OJDHM(iRH6HA6E?U#RIdEO8FWh8%{!87ibPR@v9)AvHwOIpN zU}JTz5uQMo&l)^waLbT`vcg7u){s)>t~c|n0R^lMBhm2TFc!(ME7P$BFdWCZ(ZM>b zl8$Ylq4BK2U1Rli4GstWFB~wO;I`_lAtlLVSz|@6A!jJ_a3skZ*IUI_=ThcUr&Y9e zRoC#6gNjC4$r{Wxpu6d<$F{xgz4_DW)N%&{urYAz)#{85dJfP?Rh1twB5M>R7()Jw zv0Pn)gCXu#kTs&}8qoRGHT1-F4XTEQ(J|9*+0M+%E=xLSw!vIuE^BZ!@ch!BZ@jlp z2j;Xta6v}bnRF+0tzMxo(+y~3!?T7?JF9pJB34+}faJixf~*ly*SPlF>Kah;x(4A9 z=otjZF4mA*)P}LExCTQ*wqORkhTR}8$Q3FB1Pl`?!*VD4wOUQfW*zbqx&e)}nl;$` zH7aZ9%VrH6SDrQEqsF!8S=Z1b>Kd$4u4D~%PX2lVgXxBHsB7@9V~z$H0&Ux!F{l^| zJf?lXQQxm!ovztF7}$VDO351h9Litn*GQH%APs; zyMw;CplwTJ4%dCFRt6Si8>(xN!A14|#kl)As>l!3p*N|MCS6zc=jZoJxGtn}E z2Dt`9BgQqz4!{M}>G%6%%bj*QAOllaZ=T|q+YN#P_tG_H4Ckz)0%>4AOkjlfYmiR9 z{g57<;Xxi+Hfs#P|->A{7%#?Kf~e&!!l;b_dI(Ctcp zJjUc?+OmBzAh$o8q4=)RoS(Y>^xWRF^z(m`c~5roa7ov|Kl#eLKi)gdLy7w}_&F4o zHI|#9EZ?tju62#*tU>jz5gSdIZrD}Nq5Le^U=cJph7uak6j8%*t!bqNGWwQ}h8ITY zNfM3OPpYB;=~2C*q|Xn&5O-f^?xnur*sOtDVAcpZhk|V-bq$8cn(G>ROkD%RNpCw7 zuLh+JUjSplHPRsi%4~)rG#ywdXAJtK3dk6nf{nKa1E4{cp`bx@EV>54arVRZ3-{^z z=aq+a=&bS*9(T51cqm8O{A}ZuT<-gW$M9NxkEecx*Y2!!Ump7L|Fw6`%*Rf@ zKlnn2zTW%pfqm4vpZ0r&k42|fl;Y~fr5`c!=n>Z%Ou=}nkh5^_TC+#A53>|Yen&76mMuBGy zPrqhvdsyH6Ec4OU@!lJ{{`+%}>0f7_&go~AF=#A#3Zn|{0Z{&@-ezDfN2B~a!ilflF1~ZLLFdN3r5OWRY8ypR27DFx9aom2(u2@cY0s)QQU`&M% zKA;FX0?;_#dl|o-2${cTo`Pv?yz(6!tFGajhKVXdqgV*)*TBAL8g?zEnZZd^iJ?4e_^$EpLJajMDBHF*a2=~; z+hb?H>h51%>%m59{TUjNibf$YYk&h?=(D|VemZ{fRNQ_)pbG(HzQ~b4iO8V8AAFIA zHUR{4jYM?~9M{;dfo*;L8v2LgSZsV)XxL$O4I`r}o2sW$wNi$wd^3qBU_yX`(D4dhg%gmW zps{(p@f}_^#E$&$2ZECC4}eDUx(4<&^=l9p>#J+%Xt!(t3m=VunJeCgjH*g%grm5s zQ=3&gLS`sQ>KY_;YE-7B7HXlGq2SbfrGhE!lnP$)Gn5BfLXVz3mwDiw9}f0j(RJ7c z;)dX4DcsBm=)g4Q(P%e{YSw6Ck9Lh4Fi$D{J=d5OvwSsLqL~L^IFowSaq(z8*9Ass zMD~X2NxQt5We^y#pF>%HzsCCO8lzD`K|_o${EU1f0*$hkN?94HMhF_xHF(KOo*(hi zumA)`lX|UI7iUpW43)DOu{Wa^dW*^$^L*q3*Z&Lq9Lj&JUjx!rG?cmqxrQA)d4*ai zn0J+w+FHUjq`wtg%_gmxP!WJGC&WcAPeb6^ffd&q_ zx5vimSy?#dnfRkB<`_`u=TI(UzXpDwbL-d8|8xzb0qq31MlUF97zh~wZGpQ9vIa*( zHf-QgyDp+s$SM z*t($*o4Q`)^)=R5*AP3Q(JmB>Qpx1~8ocIpDRo&9CGvVJ!_>JsGHXPYy!>~+Gs>p3 zb!T#Qnw~za_}t*=NxDYCcMa&wcvGP9`VplKJoeFe{WZ@pU>&(I*Wfdh{QvzLI4|F* z;M6=GlelZJehqQWYR$+5_G>J2=2hATj-_E%;i+pkgy_p^)*w6-*T{hmV&nDuW@zNb zM|$q{*G~GUG_khumk4u*#0 zqJfUkdRF16TAY0yqCle7H3$v(!b2i!Kgx|evNZnUqeVQ zmrWmxpneT$8%*3Z!akyurbB296$dQEV>$a*s%X4Auq8W?8bhIczi1d!12YtFK)I*j z3HAXVuu_Ln7Suaq2b0~V~x}kC%FFO-2`|uE4uusazp>gO;fW`iPy;_4V)3Sty!p5X$ z6>WlpXAK!cDRp3gnU){X^#IpczODiN zqg}7|Mwe;THXdGempE zC}MRDV&kycjz#17L%7BvTa_n%K&kH-?TU4!Woq@3F&vt$YHDOS#?F;?J*C-Qx=v_T zyR23lqKg1hvIY%;$$GqqjK~?vzpP(lJ?m@Gs~qAQhwl#G7-2YL2;d zzlMrO^123gZ2zf#jllIau4ih3CEmk$bhT*i$ z8s@O+TJg#>XCp0FqNXkAf)~6sG_tPof4|0(>xL2;Fpg&6x}gB$P!1;XF_f0Cm%77h zmuf(xR&HbJsyQX3510p`0WDkz{<0=>jrhJ{;$zu<4Wi>e)vuxRq!Csu7Xkv;n+vNA zo6XtG1Y)ki&!KQM@Q-(Drg`O#sSOQlIBeqtn}UXyG2|J#^dVmwlBZBk#ow%J(Cwo2 zYy6YzhBoKYhS;Fyj#2T}D6behFbttv4m~nh*7!6qYxtMSk!;lJ?W)t$v~Jrp+uf_P zLnkZP&_-I?m;WEo4x3QK^-%Qi>!JMLud%{)Lx~L%(ZO|#7){7A7H23Q1ZIu976z0j zZhqqO+Lf9o++|5=D65i@%4*dn6qPj~KAzCa@PEI?D%TBd&dpza=U`-D0~JJu>Kc<& zkkX5;fem^BTf6`U%Nn6kRMqnR8U)A1>(}^$y|c+_7zUznLR&>_8wATPbCxW#;s$KF zLN4HAa0|}Bmg|uEG1%?1Q&Uw+RK0IPvZ6oIr-?Ok^PU%YZfHJM-bHo{5F?+5Qj-<9 zqd<+=j?rDTqkr$6|0E^ZYv6FZxrRShw_jtixdsTy2Ed^P6!3Qx%3k{GspG8I@;sFCxyE|)P*yhA;I3h@;gBMq zz4pb+jF@fQHQ-ewhVyR#Cjyef4Z4#UbNe;)e2t>HM$V2{4r>~|qT2}yY*`Fk zjLn$p8o1)6y&se--_crwNUSyPbic-;a}5+X4U+;_<8O+!sR&9qXhw6xmto>f=TkaL zm1jMkl535ZyVAHSyqGq{ zo`DwJH)cU!A@;P(l0i{RdWrLFi7L+SGr&Nb-HA|y10Z6Q{QF!tMJQW6xG%7207FZxxya@%? zX^3$e&Yu9-?9$l9Av42~4hHlyjq)uG;y>JI*Z7BJ8ilE+0bzgvex{L`&C`&X##b7` z@LrTe!8JEc!-ual1PEiibvr^D8;MKqnnt1jmWF4+2u4Vw&n~%X8hTE{WJ!GfE4h)< zsLZ(Hu4xqR$1&9G#-=+anm$VD1fh0eH$x` zMGAm0L>ea7S2Fs}WoGBQNW#EM%K9EjE7sWi0GfvQLovC&3J*#(ekdPF%125opV>q9zaqtfLSCRX8_IG9i#0^s|s!h&);r4dX)J@R$sj*t8c)=SX_}_#Py1%9(>M@>;k86# zc%2k?wJCBXjV%{QS?NxW8wz)Hp|}R!rSb~|3CSh<0xr|J%scoM+}%Gr9!0`L*Q^tS z<`ZNmn}zu^`+L?zLQxb&Q4~c{6h%?K46$38Xjq!d(miKpC?g~EKeH1HUlTJgBIiQz zW=!Ao{{DQD_H`!Kh+SdMN0U#D*d3N;_!Yeq2c`?tuvM_cVk+m9Y3BOuythP|@n%fl zbbqwQ%iLGTvHIt=M&GvU53K>tYz;}&9~Kii|EpT~vLI#W%IJhOz&Unn+BNQ+%@?HM z(JkV}+C0UAaki3htxudS}IkysPbrnn#@SNM^W@9iq?4>)8RSfj~Pc)Qngj-;b3dM*1~^cxfs{VCw}!6|S<&alj7&Vrs_tMdIdyMw0tUGaZCkqg znOj+S zuW_3}5h@3xay*wcEK%QhYit~KRklWqxccMu@wzmmAGx4S>AUisE4X97@`1unHnd|1 zus1TnmNZS9{`OW*3#F`myFvIYKnJzB%Dq8@Ku;)@~0 zQ!WHGhEGa=|7t(2xGzuh*Oiz5hny3{!$V?}3-R)>{j|4iW literal 0 HcmV?d00001 diff --git a/assets/screenshots/mobile-library.png b/assets/screenshots/mobile-library.png new file mode 100644 index 0000000000000000000000000000000000000000..bfca73b4896862302cc9a28a7fd0183143621a43 GIT binary patch literal 81169 zcmagEWl$VU6E2D_y0|VL+;wqZJOuaP&f*e0XmEFTcL>1=?kd*FYv!4rj#5*R2cm<};o#taiV89saBv79I5?y@RK)){JTR0cI5+mYs$gF_E}!v5Mpg8;bti6X9SKg5)Py#L1m*rGZgnU=865RpkX8s zN=Jst`hiqfOpK9=h@Jv>XK%l2VH+$c&^WOQk(6O3LuI4F>0jPcR8$m`SNt)z`B|CA zK=C6)Lwf|ak=->XrL0;$x>`H8t*EW9rmnWOu~pO$i*FnmT|0omU_#Om6$2x7X6~xN zg}JqDeSQ6@os-W>(psjLom0PRt&{)VKZMo|eJk&F@%UnHZay(NWoQlktSq$n`~2^} z`>d8xZ$JO!)~S-|EhP@-;_j)q>K?sxWs;N7tZ&mh_@VX$I=Wj8=OG`-AH{ zpR%7n9MY#_>VJCW(J`PuZRBW7Hb#->R=%}y>N{5Aog*%$7 zi-``0ROT1tTM7yEAJ-fCB(%KRHR4c)I4|go}Qj==5^lm{<@#q-KiML%t*@` zUV9lCU%Y$C^mFh@ue~X4=skaaXl%);=^EHPoyhV%87Od668x$w{=9y!BP)3N_Wt&~ z8PPV!0Z|q*v@0|X{LwqLSQXi_avWu;Bx>iIZ|qd&W4QPuuX_I}-BBkbvDh)MVa6oVMozPXRsdS)i~JyVA5?H80eps|l@Mr0|3U^zv^j=Ak_tmaZpD#w#}8!@u+(g= zjE{}xR$w1HxBSH+Tb;-U$xCgo(kD@Z_E}<>Crf0FCmw~z$3n;J1$ESb)zPyaff_6k z^*nFU2Ev3f?2)nyjpPD*5_4Hi0Ub@#_8Gk(i6|5x zZODXOXAxB=@mny6G=aCic!wp9u6N3b#`?qZ9JV zmfF8^Oot+X7px^C--6Hq;^Boow7V9O6v|HiPr$)Di&8k4A|m-{UTU`a8r8M`^5OKL58;FO4=}a~JSdaSHt%5pb|0l)h+Y9+97xCd?jg%rh z#36;$k$kyY?pkUEZeIJsOP%2)zHUgetWv_Rh}V9rkJ9q{JNSf}!N!#GEdpjbEL$mW z?O>)?0Q#d5D!lssH*Did=A%FGbE#aUajl~iASINW$vDunUcTJhSzK74czHK(F@mG5 ze^1vbI|-E1wp-WL*hEl`+rX(jRs`UmZN%AFNQ!OpguZzhjJOAk{Q*RGg3N=cxg%77^xGexk0>cS7V zrNXO-LJeU2${)`z3RS)^&^6X$(IY36uc=0bqZp{Ke09p2n0w|FgCSC|b7@Av#Q6=B zgf!}RF^lds;&PC19_jaJL>4V|ZC9*HAkNQ9)x9;N8%n>C2<1~-DAg(p-@wn7khI$Y zelah?$Ra0abWpC zG3P&(g|~M|0x_OXN`ooJ`bA!jZ=4R+k9Q@h`5KMaTYpNdr59I5%T!*W6|=sVfI=;a z&1tYsYQW~sNh#Y^+(Z1^ZS$Wh01`wVOgqmEQ^#ib*H`U;ZBOa(#YxS;p@dml@CXjE zRJaVd(A>l=a$33*(xs9Nv6GcQ=i^F;zm zf{Z;LS}HI#suCBv^591rQw9j-qw%z{-jN;KyVb^t+;exkq(mYj-;Ozn!Y>=q(#cEU zd_{pahRhxNDmq|7$-8wjL5+l_t39?YhC{jX#-n~EITd|5TYhHO2i~rf0B8AvZbV~0 z1I8YWP%puRnd`0*S8#kmg4smLp`}+ze#q~d-MxZ#a6m*c`n(S`E}7Gq9fdZeJY|36 zASNMFWL9~19Nsy;{uSDt$pYTFg%Nwv3#XR&UF;$S_PtpHEt$tdf2m}P*En7(G38|S zGphm(?mFd4*4>|UmDM9U6GKrz$ofGi+bhS@|9Sut-;S?$OGEj$*N-oM#+VsHaR9RI zt8kx~V^ht?R9~HahVA3{-xNjiK`~Q&w!!7(N)wH9SL8oVbRlKo4;~20cpiJsKHRSe zrb~$$m;@yMYNYlW!mRsKMW0%BC(KH7r6PBCs6O$lRnfea3H)ofW8#mhh{ZBZ~qoc_4q}uq<5jd^q z@2U`LS@=Uu1UxF)0P2jl*6JvAFu-|iEWUX+-gn_OvVA|ZUA$FK^2DU_6s)`#QEeNA;mh3_p#k0KXl_M)rI76d`TIH;{3 zo=0BZNtxpbf>#ejhq_4h+lT;OkWSIC2m3KufwQLaU3)kvd59<)4DSE5AmU1Re9J1c zQb(d{v)`jh+xk^f4@njJx-Y*b4ZF7j_fxXS@I!Sbu~uj8FLpV7}e@@HR0L^4kWNB!f z-IX}aL0-os+Qnek%KHmU8)EWL8#u5o5is)9m5&9}lYj)YYAlg-;VZ|NZ1FNs(R>Z_ zeyqX8(%0l#AumHpVfYjYs|DTu73Zj!_Wd%d*uNSX=pC4;f#h{oBKPfMk@)tpp4*>){RT2t^_4YS#m{gna#n8Lj@g~?7#*gJ3mKCDhbdnzeI!j zdS$uaXGd_ z*Ee7)^*S8L^31;Afze~4IA%1O8iqJwJbGQlNEnnH4>Dl%J@hcmP*EycC^aK| zBQ66qIP#OfNeEvxjHsv+L>rq_3C~ni9Rs7b%BTh;Qv;xCPswVbPW^_uNVGPZpZ(|G zw<^aAz0e#~4mtO_hir|9zZG}ETpSwIz#bW(;)dwir@1a-d*mMhV?{Q);Jy%_5V0KW zqg?t@z-A0kVuqpub*ZazSu&;;!~s73#oqm9^_K1?p6|<73o6B-5C0XZh4@w)}(qvU57^CN7>=gkeYV5C6vez?=<$(YkK-~31w zCF1*(H_Y-yKp zEXK4E?;HG&o>mHa0$awbc6(0A6v3DO=D7K}_i2sq_f}Ou*2{rq0{g3r7B40)BQ-Ci ztNSl1EPjc3#z7O`iypYQyc?ECzBm|y8^4~K?Oy+FKl>FPpY=CChRR+JeBE%rcHZz@ z<+~#^xvOZh9_4$POHl~&9bRNx+S7_tXy-b8sje!vTQ(O1V4_{|LYHedeNm0g>Z<3M z5US>7*U)Z-H{@`>B1@kONXO#eQy=XFGp%Vk7s_h_No8$Iv)EE$8Qn3wVj7rl0=ewU z?y^pra6^@#-ECVqkujVARk0qsD%VJylA!>n+}$*Dd5g$;(7aA&Cnn9>f=nzl-gA*- zO)~%eCr8CdZ=CbjN2#oqo96mCu4F|ZvMeynq_DCG2kt)tjtRhs6 zP=kuY2MR(MAWHA$UFzBK@_WxjR=x-moWVD&(knF!V(A644@YDlBmX z4Dez%81d#SlPE{`2HJm!hRowBSo~?y=JRC>_*#b*Nl}C@o|6|4> zv#GFMqHx9Om>IB!((_ix6phdkaWX`~^T?eh{&$kQ6$r`{hMP5cn~_TQ@ED+R2M(W! zr~StpK_C)HUjh8LbHKr>k*+-TscJq2-hhQn&VJrJOlgCo%or+z3$z~<5^)j;lz}Gdfm1FY_Dc94y%MVz9a!;iCM0 zB!{mMfxIr^6JiB4=qNV37_Z?!DGlc?W!uWhv z$?ZMjA`Vv%oZJh8UkYM&yCm))!JGk17sPC-#?5rvSr_bg3t!?H&%dATej_H!#>~@v z-Sd0WS z(+cra^y%Nvh1@fQ-WX;E)$YaF42V#4XFlt!NG~-9BB$;)A@C0@!u3fCEU@WBZy%5! z^ti;iJKHQ&gjFUO08Q1$O{aO!W$N=h=jjQ?n7!d>FxX6BSS9* z-6%t1Y;ul-vt472HXZ#>N2ycNXm*_TwXj08+T3n>e)4x&X`Kx?t@71z`%gjM(MV5q zfRnx0J{QNskO)u%NllU5?x~R}Jn2mX6}d%#aw%%S{OUx(Bsxxi37qo$n_;0G?#eBZ zfS9?n8q!N)0R#KU$tYYHh5KV?udMTIzlai11>(N-5%1-SyOl^`?_2IW?$Ysw{uzE& z(2+qD>cXEQN#LD|pYQXnG*8cb{`oflf;=#KR})BwjEBS=v`#3F2Od*FtgZQXMpqfs z?n&}7`{$kWAKs)2EDr5_%Z{51{tCpA`aW_`!$%u?oyW@lum2~a_L}}ve38atG(POZ z4em<3{0DF?1#dsTCE>~#htYYVo$5zvX|#H<>DLu2_-1|e)uPlWkY$6}SQ|Wko};^I zU2wn5C9Gep_$cpqQy$pv)HUoqenV9)XM;Axa|5%GiW!W?+9Sqs3cqkAa&GW*2~w- zi`+@o>H}CNUxsHX(qi223b`-0>f&s{!e!YO_n7Bd_{o*(U#b^hb4WrTc~o_f?i~}6 z&CjwiXL8`kaR-ug)oWf-6QUu&T8XXMuFOH6+dqGOFvRT%XCEH^wE5h4T68Gst^Er1 zM*lZ_M|4LxWeC-qdb|j~5GrM2JF((r2KOA*+QbmC6RdDRRAojg)E=8-u-LxQ^&idl z@va~h1J3Q>_45rMhD#hHSvs9Vkze~~NN@OoGOpd<2Wog8$Tt<=016a5Tr`00CIe}y zXchondaMEgj6T-ry9PqC;uFx+44IBW98P1H(NxwUHrGdyQ~Z3v@F{lj<~2XRfK2E@ z`>HpvfE}#Wu?5~+TC>4O)uk>d3rt;*Tu+>ga`&&l`l5Os$eGTmA~8|m{KBRe7VwJ- zWvJ7R?e$5|SdwVr!Na%do3{yvYwuL-Lgs9^GS6$0R-Yot6U+V&Q>$K$II8^J#A?2S zn;+LrYYpZs&IK{ok-AaKJy$8e673~N_&*5zJ#1&slmoC{S|Y~Ft8y$?wcGDroyvqZ zP0I>`ceNb~tFQWb$nh8NuZiqVoerZfe>-U_(hAo~%`68hvm}w# zYwS@gch1ypIGt^NbqRQ?UIS6=N+EKSYLbM;B|L(*IQJ+QE{T9x5_a0TWBTsa<6uCY z{J%aC!%}$slgX%frmu)J^#fe7jlF>x`0{prLGxGSn5AGJIVic@@^+ie!Dod~DlQf* zq|Clv$Tbq}=YIo^-wnhJZ3RCf?s5N;=nf(6Upi9JM%Kewza1>D&d|jdu%nKM4S6;# zs}T1pUPEMk{`~KgR@(a4OMDwU$#*6jU0R8gL1Cn$cgHXijL`t$4**ry6u`jf<5Ev8 z8VAIM1t}5xW23j9jawAo2fYHX(a+U9Uws}TyXu)C{>Niu7W29W_TP;j z&H4%Npq`j zpI4igqL0CpI?#@IvD8iPG(wb?cSn=K-9QXOXB68IneRj9QSSY92GTOg1s}%?*{k); z*Z@&Uv(7-Um}UU0zYj_@`f*>lh`l6D>w@cFN+zh4fTc`z-zf;8uNH@gdXtlYNlQ(Y zf(N8cU}IF0noRR2ph(g_3L?9-FZS4w*|1n2?C|%-Q}tPOIsg2|Y`e(c$z-yVWAWC^ z`7hWXGK;Lbv{;AlFg*oge;-m5)&gGNdprSx&wx zkGhp#g(xC9zSY1nVVkjGU_l7(U&-#D)`a>yr|r42gPlx_!D6_rfcE4#?U0p{rUb?{ z5eRa%yXB%QU2~S9hl51c>m%80P)vty)w>NSt*v$>}>E zhraEx+x{&4*Z+jW+Jrr@P@kGyWbW^RUq|iJxW?43{$K7Y;^cm|U|P}oh>mxB>U=2w z!uzm5%${7<;^Du_BqT&IjI$hJzhXIYrL2u*-ba9!Mn#f(LY>bm|VtWP-TE zoS~H)QI0i6(P=1|KvQ{D-Fo|=v0&aOnTaAJCI8(5P==LQl2fzxcbatC+4}SP^I*zI zCT?Mb=+Nq~nt>0Hz5664~3!&wwEZbv$qE4F{9+3K2tp~6d5nb~}G8BG7@ zvx~kG+_(4GW#pYti$!fyP18eZ{_Og=c&%2^0k49UkPSkYQHc9N2Vu^u=ip|q{^Rjf zK7{4N&i>gjnem|0?eUoh*pA&9%qlsdCB+tdMk6A?{~&u&)zqI{ZT>scU6EWh2QLP) zk_D1HfK}F)k1RzYxt3(F_QNg>dkrRWZMMi%+Tr!e(PNYW+}!TGWJ`vs_qt>l#B)l6 zvALl0IJK@iV6g0mO&kZdaUu#CAiBiQ@%g_)rKd<_?t}aBb;^{kXD?#}COFUH92c9v zwf^uNsieghoCG%A=g(Lz6~>56Pdum4V&C<|Oaef~{e6wYl8`!CKvZ2WCj+~Tmi`z;-{Ji)65@WqR|v{KkR-hmO7!jCSM#Jz z6A}J|&S~N=O+bw9oP|VCK4s<1Ya&_J388@&a^yvSJXOwic_+Y^h znjN$<{fM}T-OK$UgON7gTCiJkCMRwOCsje+Z3Y9*QaZ%PbOv9-5LSqXpoth=GVid| zUd`Tx3%)iIvZ=wq)cXib1pM|d8|5PFFYd!DxhiOyKm8j3{ztI}KZedcR-4#@T&Dg37iz{de9!XCY$WaLURFO_z(Vq+ES6rVcL%XNsdtKGQryQ3qJRV!}iYjsg)@oc9}Z_C;qORt^)Lpj(E88LbH|>(e*&5LmvKj-_wOfyGq4(l9 zn2c|g7v8|g^lb`Z$4_852~N0rN3&g0kRl?|K$KhtVM&in(Fb-=Q&shO;= zXULA(U3|1!9b34FKr3Vekr5IFZFzZ{tKzPrh(?*x@I*}AkaFt6kMz7LC#Fa={nJ;K z2eli*gGQM19{_ucVS>{-;_{&WtO0dlw{lBTNz7$C;Vw7HCAj5x^OAn9M+xy$NpGp> zE6R(nG?S^PJHmptWCC6J&~|;9_8DV=xyzuj-=_w_9^d>U0=W*oAW@bA?7F-2ysO$c&m(m2U?43p#;4;99|I<890zor0sh)kFpXpWDa_th? z?8`%eFkHSn-Y6 zpx#P&l-ho2j=2y@O`o!6Jf%|;t|Fxs>J6E@GjBBjd!QGChDh@`?`pLn6_QQ=>7)b9 z^QbLqjt6I_#A?kW2xq4Uo2!#>CxDe+PC-)ry`$;|ZT5pWyZv1Lv4riUrjfD)C#9d@9^!`@s_`+1L&U?5tiIDWb4WL^SiS>`DIow5Ai-2&#U z^n!B~`|^eWvc0=rC9_ue(R}wG7T(~42Q;SuqnC=*Zf0Qj^ei#0pmZL^r?bxjhASwe^BN% zY4aTW9-&nrCceC<741F@y?YP#)XCqYzBhc>Y2!&^9|$U|)P=wYtB?K3eeboeE6vv4{-a@In`B&d z#fU0Fc<{iE;0!Sp5sg$!AcAlZJ_}SKq4=7yIm;y180*&nW4XlRAa?|hM3gX*iC_5T z({3{(wt65G=^xX)<{&%v-5-pP4rkMv7US+i(8(cpr@8>9C&ie zb2jbNVSCrTzw&C`{YXz_OKd-RsP{=S{bB|+P@#qKE444Q9nHlv3(s@Ul`K9v(6~z zTBb%quB5)GIarcX!sM81mC)3_B`AC?1(dDi_OrelYM6xSdDEo`y|APAzVBao@k9hl zJgPIe?|ErN>TZp9zsObGGRAwp+@1I|fo>X-b6;xjn4Z~Nmn~e&NB#ur3MRki%)G1Y zC{!HbnNA8l$t0T>&`&70EIFj2lmHmwW^kP`&y4-4=@|eKcV9OoQiO#>c^jRJxs0S8_*4A^p#eAEkgBf43DPG#(F# z)%KMcKY=L%{g%R2a;fEeYx592$L#$X2> zU^##ei2w)$Cn8fEoSe%g;00#xqgAs&Mhx=IyI4PfhNP@V37XuCp zQbViYQ`?2-t(-8^{3`(i>1J@7&fU`Lnuv=}@It8&#uHd$7C|!Tn@vqJs5wglnEp%I(Pi9{;Ji@O$WF@CW+&J_6v?BCgeE8c?r!wEmo75MA}3#aon4L9BhUZUabeHq$b3fLKT_=e`=>=ovi4y6iH%9g zUahsD?PenAFBH0?GrO93QQ&glyQl#CR-~=&&z%JmmQw!b0D<7HEDqW5v ztIcFLCi8-DFa7wC_PtMD5op}aLv>tw=qx~R^NEC1sR>i-nD=kse_7Us7z;y5U)NOS z-}Z(=?e++~Q*){Yu{ z(immIlmh*$Wbf}5jsf3ER-Fs`hg-(=>rFL}Uu;e!Ii!>9pex@DMmbJ6h7{efXSqjh z`;D|ntaE1mQ2rFAk%KTd8Vy%pN5LUyrmOoE!<#VD7^a-@>9{n9ATxCz%)k}``) zYgmRv!0#>MV;y-{yrdNrcbMHv&dgI#TnwoH!G)1hJHtNX`qE-n87_C4bU6@TsvK5f+JK&GB3 zr-n{ea#4ni@KzGXQ5LU$jk;1c^Fli&s`+P1z!Xdj28E51|aioQ02GTV+4xnWnM{E%sz<-IPq z`M36~>~~t*f#4`e(&^r1x+yNNn&fXhaH-((%VLYgjChJKxKXARJp=tkO%>u(!;)iIzW8=!cNM)6-Yr zG(m<_vvGs2fOvc{N~Kw`oFCcW&l`@$tvWmZ3Kkl#`g>5eba^a-|C9_NI-93=*Ni?O zcwf==(8W}tNY~mgW%Ivo3^h*4Lm6Wte#|)mK#qc7mBiyaxOyG-ioBBWrA=iZiXf(d}G*`rA zbdkwFwXJqiu+l6La3KRxGUn<1TQa8gk!Q6(Y(IjEA~}_ojr{w&@rqR7f#2_KV_qpJ zRLg%a)!aRf4sBoFP>liU?@O_JZ%=epRTb`G5$5Jf2xwda1#Et^!hzh~wuM%FmD;Kd z{toelGI2Ina<>OLsyig~6_|+rPF0Y*gTe9fvKLgk>C)n2lmPy0_~2ylpnVFSs-pQN zcdne7ifC1ygpj2fdb{AdkNxZ!iy(!HsFu1ZC@qZr+tuyeH_Iu<1i=1gVTrXPA7Xlb zL<>sl-9<6oCLlGde4P%46pdtBrGWX*>yn$A|^UIj$x9vIA!eia1r zL*p?Ln{hB;1`%mnA>|&xaq?~3k(eAjw4mC48 z=>Ik4exx;~9e7X36Ok*z0TeTx;IM7Hhxbx_E-G1uTjiceqxB&boc4vG7YEih-vMVJ=t^JAGLwr9xWN;+3Wn7Oqqy?AL>nQ7E~{Aq zJ#a}C&k|I&sr>#kCl_j;+K-~!H{J8Os?g9KoU2!y@4|MGeVE(ZwW7lCMxkGTY<=}o zp1>({=A&Q~86~4oXqVi1v_)Zq{efbC*Mx-E252=B$H@B^X900VFjM?WC2y$JauMPy zigL{@HJkT8Q{2)B%3C_jSjtY~q#)^*U}|4mvP4g%wL?jMpBF2A2*iW0gAgw$s)m=xE2KJ>*@Q2xWdziEQ;ldJWgOv>q|)9 zI9V()_)p5^ZEZgR>7(PP`{wVD^B*+$>|^nn*#}4$bni0yqXq?x6r_!f(N++uBxz9el4cOfW_UTh#~B`LvSX*VROT1e9^BqXXp zCXvi|;gn+8%hS{8hf~qUh&$j)x=4eGpeR}mH1ma)S@f?GP+GaLTg7jZs8W?)z^7#DGiAtvG-4hY7b0-h)1O1|6CZ->t)2xA_ zRD2D^qIwmet>iDh);_Ga;lG~Stl)vUxTF2XT~ujY9!#(*Tx^pE!c?M5x^d$fHehhL zP5<=?W3J@Q%yVw9BaUvCrEDRJ)Q%NlPD3z}zqnrs%Un8d%*1~3%_d2tj8vSE z!m)nTA$gR#?rhV;B7O}G9lpA9yKa2j!ACi!NU86NBr9ea4tI_cC-*2A)CSTH zdMzX{+fgb3)A|EeZOJP57D{I1vT&97Kw@7t)k z!yAEd>T8>ubvj-j*Wwvnmhpd6l4mj*U~Hn9bOm?JVD-J^)Cddm@aP1%d+|5arK*!S zmw3uqDgQC`D52ItZYr*%J|4lwDGM=)8R)B=L;nO0C|pXVb}HT^l&UdOz#)~I3zI@+ zK;@v@Q5p}NtMj{mn-LQ7;oV0GX^9i(y-}&ZH}22b7CRC;>gL^QLL|AMY%Sq)w({BF z2#;`X5q^Any7Qz=l5im^EJCq{Bt>4+?X_n~P@EUM-#)5Jyj)KbOT64JqDZ`6Za!~+ zVUP&8H%jT7|C`^ML8QYfu<2J(L}Th=u;Ze?W9!mMZE+~OKQ=*N9yV4BsBm$8W^ZeF z$KKIH#=Lb(;P>7*xxW!rxo*WoKj_U9Q6K@i)hrEpCMqqvEBVuXe8-r3kXjg5m3V)- znSYiq=}(Xd5O4|s2pg%*y8aHm-|}ln?5DSNIg{{Se5-3N9neOwSo`;VbvK@NITf#A z(x*9p01&)C^7(B)-{LXHi!k(!b*?)qO&SnRhTQ@*jlUJxcn`kKe5l-vUNc!h_^ z&!u>C5888?FAs0?&$6yap#8%c72>~`#8a zC}h68mbKe%lhbXHPPOc>USHOCe`pQ+Ol0JRhD|Ac*bBABq2}gW&_)7*#|jO`>6Z@2 zp=*ctmcz3|d;yQUUE>Mz^767*v}P6`TneuqJRI%%wYqM$f&gg4?K{$28;PDmR_O9o z%oBtqeAxr)RT^AH0<)_Rv({-KE41W7sitg*WM{F$K@tEc-cXJZ$(*KET!^Fduw+Lm z|2IW`-KPu8$JgV1esm$ZKdL@&_3DH`UT%G{P=>s4{po(gkCV}5!`}28&v0n?M)ysN zj`iT2S_STb=e}os4q@E-I4jxvbnW#)1|U4wmO3mFw`t_wSpgMA5)Q{ynn9ia0GpAq zYHoY1ImL5%nfVM`f_N4l(&oo^ju{|&61^!&B-}Y|pH3u)%}Th`XvR;#BMqZ2nR0cN zg=+FQXzcXI+GP zmw>Ec{wbPnk>RglEnwoiASWPn+>(n@HQ?+`bc$iKgyYE-<%{fw3Nc+f$F|S**Zaag zz(V4#+2B6FGV(Aq94w=mlo;IIwrkm_G}jlt#pJRPupigP_S)u=(vE3^$Rqctlx@%G zuRWZHjD?B$Y;z(33xesCRH_6H&K0KqRgH%Ch((c51?bzmdBDVqz1gceaN@N-Q1jXxUAdO-io;mj1_a=r>fjLv#MmLFR-ErJ1 zdV&O!Y?WBdWQF1%FuFP!Z(IbFUfC(zkr&6WT0gF1i#|$Ku$?9Zo>5ZZfd#chT6=za z>~{VWrw^SRkUMrj>M}ERsaHHY)jvix)jNR0fWu`m&zX{MMn~o-3`HPf8gf9TelOA} zyGvWc=x`A7hx9sWSEox`+d&1v%5!&0JCdFbw)X#FJG`ZmQWf{qf=ChCKQ5MeDm4YN z`d3D6EPd29xyCMgMhuog;f6G2dhWEa25+o6rlp2l-m)>whz{U^LpvdTfs0GX=>Ht} z;*~r>VbB;rI``nFrdlGSpr%U`LuvP+UmE{o_6oCROS$YCV?>zXQhU<9i0d1ZlgHs^x!7d`V~u#SWQV3S zPYJ0_7yg(el>F@^-^H^>L425KH)OSTSY*Ig67_0y2J*(xWTu&G-|msuXa|ypgFF?H z?HMLr;m|{>5zIw_kHqCUl)lGB&w_-Q@k&K_C%Rr_`I?~F^k-ubHvy);MP7gQcH&|+ zK_QNyUS52e?8@~d6|F2{Q^?3?Z^hOJI|Z(0Qm~GFtw(EVgZ9Vk6kF|GeJS4rq&U%v z6cv+_wEBa;Y!c)9fB!o0IYHYSCoT1k>%7#{-hN_>-L66u@X=#z2sq>it(k*k!8752 zgh%dZZRXtn?t^R4uz({q8cDVmCQzKySEJ+l3-aKq>2`c&)+nhu?G?{A8N5%Y8j7^) z1{NP!1yDj`Hd2(XSZ-2l)9Tz}f@tvu)pw+85HNIIaUD!~DgBhks4JLA%avBS1ZBz) zT4_)!F8;t{a9kDD&#hCt1OdchR$=IEal_X86B*QyUCBZk2lB0-AghI~AO0Gln2?hE zrPF_gqIL$1d8K!YtW}J8TB7m;4I4AMw6*enIomR;$FU>(6wInS{h@NyB^}Sx$PUGZ zJ=k0alJLO&5Za(%%(!Iy*H?h~f>Nq)o1xRqzAn3FEQV1ByRVAA&qSXZAIwT}R3Oe) zQpH%a|>aK@HnpjhTy|Z~KcN_F?6)A9| z@UICU(`WQ`rNfVDFvzX=HezP*Cd9$$9tz@S%(Et94sZZ;KYqa^At1ja6YhyXDy9)X zzmwr=>*EQciYsq&4BhYf;CpBPXY(k~X@Ftu&fN zD(jSkOp-2hQ-VnpsE{VC=C&slZRYf#{d^?M$|5dq?{}q?lF)`v2@M+)GI}^sqj`^J zmBC7-DcQ9;%J&~qUvB__w6xiOmcI{6bw1)La*m_PSiSbQSE(gx-lD4So8H_O{@M^( z`9$6_njf(Ci%SUfyM6apX{tI~!8f$pr#ZcGoX4$ey(+aRY#>?~vJgegxEuu!i#lX? zm9$%3;HK}y74k%GJXBsgHjP?CopiWpl8=DXPrDGI{h<}tI(A(WQ3&rwYX9~})X32T zo916TI@c1AV1P-_mf{8+_Nilg;eeN)cAKAUw#Ks5pnLg;sxFZ>ATv~c|r(PIL*iILm31(;GL zzfvpBvW4bDHABLWU)<1t$q-J3e^xi!59lA`8JRz6H3o!6rhcIk5E{XO0p z)IOhbS4LVxb$FG%ZY8hs@)w*3VbQ#_a z8%UrDKxZDL5j73srPDPM7}FJ2c#5t5O64UHe3cSp(6ry(`Ii>VQXce zgA8B_E8RWGwWD>#zeH`rQ}HJ74ac-Xe_x)h#=IL(U$5T81C9(~JGEFxG=rfd-78Fl z%!lAafuAz2RqF9el^*>3Oe%fSEiQ;@8F5j`KxCjhS;e}3YI{QC5bpd>bN}*uNLuwz zg^Hw*vy`Dllr@+IDnw&UMn8{5;DUH@Gw^r%NI&!MD0+f9Qua?@e#LOU+1JHC=c52E zN}w`Ad9l~!l+KX=LD8bd%vj*5yYy1lrkaoY$ zN(x$WcG%c+wJ2Kk#wVYkgjs}>&M(&Hu@ZrVYCr7muYvNee_-+5@jhwdNiKZU-SChE z5Fvg?BCYN`qhl->OKCBy4imJ-2L~) zeiF}sF5MP-bX+K87oo|Gg`C0J&n`pMw8@pizyL?=kD(xlEhN0Aix>L4gMXYb4tAF? zC|UCV0hB;%zn&&yKlR~8mswBqrSc&GjXJ+qlwOh35$%iyqKPLJBrI6nx)abC|H}_B ztvxStvr&l}2rm9?jfw7On+p zeJvjv8dq_ttU7TpP`5W4WZCrF#cI+t53WOs4>}f>OKfMkA;BGya6u!E{Pi37*C@|= zqhd5H2II+?Iz>ao9whLQ6CH3K?D8za0cFa+rsbzW!xX{>@~DA)l2Yw$C>ESybNRE? zmS`-K`B0#s;6$ll!h-DgR5En2 z3M7$CF$G1Du;IPEqGv^fSCwRx!jZiCD<5{+c+%0{cyI4ud~h%(VrT$qx-7r&)1#$- zP4_+V#PcC;1gl|kGLS_Lmp}ii?Tzs0yk``L!{kxJ{Dy5QcMBSX$>8y_qTR{!yj=&2M5gg@kWNjh65t-AW<9PDPjdZ{v7#SIEsx?h+T@rl z?GFz4@O_re8Y@|nu;_vB2pHWgTWDN z3(QXzV5zrBF=?E4TG6n#H=YO=)9#mHQ9)z(U$Pr3PoN4LrV<%mqEvjSJ{leRUYbrS zd%Z%`aJdhaWFiV7BM2-w7h%$N<>9-IMu;2l1vZ$x9v(Iat?g||BuI^S14iVad&Nh4 zJ{}+1;3JuYkCt)xV*v->-II`cn7_93B<8V$;joho2b0suskja0LKgY#eT`G*DX{VH z>Pu(C>*qu(z^ z{dWF_Jko~cR4$Nnfy9SOrV$O7{sleq1ge+~Bg2!5ka0hNNQFYsP&pc?BPbtoZPTA;#&W+{`46X~c8)PB%A~&ph6~cf(E5) z1{?j(Nj@x!!9=V^KqI(Nj~cssyPId8Qm%Yrivuz^|1hU`uRNdu6=gJ#xKKA6)A@X* zS8iJYD^?>4t&QnJj&dMtnnQ)MaiN<<-^6F4DH&BTgbh4s^K_V@?Kp|eJfP`7o@uI9 zAeYuImA^0%Xy8M{Zuq!9rC&=8U7EuGe!ewlfz;GvOWPnC>w-?$Ed&@Patg+6G=DkR9IFhhM)RT&*6Mq;bm{1nh ziyY8DEW3g|Yy{anUW5tlHU}dr*Q`yaTplj)Qq|Ci6$D7Q^`^BnT}!$0RII233Hg;t zN;|BPuQa5q!M`I4Ghk)qp?{eOJ}N;Eo5Xs#Vgfb zxlB>yPzf2%hWpS^qwGTlr==9?l+g4-fe!C%7#Yc2LP2IgOK|9Qktt;i8NqB+J6=;X z_Ijf%iSit)QKxWSbuTJYv^1|*WtP`s}qjNb!VXdbV1kI23wD zK{}Ur&Dt7r%w$gEBAw_phldq5LfG&|Xm@8)v@BUl0ATx$O8cJ}jhJ+yY($b=>-@<8 zOQh{`vW#sU6^oLqVQmmKqMB^;YIpj5LeZn6(WsxX8_?s0+fYv^YBn~pBxlT^jE6CKGD)Pyu!0q7uRH~hwv;Vo6jo^mra4ENU^e(a30WcA0I5~+BvDO$ zX>EmCr^UMj`@@mW=6ju$ zGQ37q-G(>4W=^!yE01GEBZLf2pfIZu9%NHEtRc#EAz`CO{W15}@e&%^@Den5sW5-N zqb!F7^&HD5*K6uH`GGdvU55e@51eH{aOAdCl(a;IiCe>dkJ1D*4kp9BX+k-eccGq8aG?Xx7@b+0Z_5&jm<{)#Pjgig zN(dZtlN6Vk4ZyJCb>Gk+VxUSo(JNM;AxhM2BwVO6esy_cgX;ozic+{D3mYM&fJf+r zl5fUEtKDy9X%6`2DXj?(55$l*b~IVb$t1$X@ki)0j*nW~bjb3grUMmNFx47~k`n2R zK57^J0cgl>oS~4UZehD-=0YibiFx7iaa23Ss`rF@1j% zde#i6tu|(h!*(y^2}RhL$0D$S*9d__*7F{-4S)hw?1noHo4GcJZMssO7WpK%SI4H| zt#0XUb=E}c(PM$)v(LUjp9vs$!3Iyo1Az|PxN&FNN|XT&d%?o6=of?p&^Q?Nz`=)V zbG56Yp|xwVxx2Y}Mx&I+wq{Z=T&1nUl?^>1p`bDvXnz(qpu?@GVbQRD7htR^8=>pv z^EIzuwe#gojScU5;XTf~fTcw~(_H=PTmKA=<{N!{Vz1xM_?m0}?4tFtbW1sW$eTf1 zA1M}}i-6-Z*vQ0j}`vyBTWHL)w&6z3SG={?gWYF;%PAp_N9UP7ZWC$8$6yUhz zY|0bQCyY?4Q~9vd%S#khNGPSJ4)$e^f)({Tg~;J!lY(@o(_HTpaYK^)Fy_;rlP@Z^9*_$%UfG-n$zGkGALm^om5+1-Vm)ujZez&i`;iO zn6DWVo>7zzDd3Ea+4wbr3QjLlyd$b?_+CKoi=HnU1dZ+?VhI@~kb$Ib9r0Is(686~ zS)LdRDOyRa+ofane4C&F84AP)=u@s&KOlB|cHGHYIjJW}lO)wNM4MgT+EPEshQngQ z)K%uLqaGn51Pvdc7#hS3n9z)Z&S1)R$Ck;!;Hqu`^j#ZXqLj#RHUbzodBa?j328%~ zct-0ePB|JZpy6Clp|GmgaKVOgQF>@TaB;qDEFZeMLPm)Vo2*f|7QIPxa6`_w*wX)* znmm>W9Tq&ydF0#Kl#Evi8A1k9J|u9oKw~YU!-X#)ZX}I5KhmjuXE^ME1|b79_70{@ zAR|Pzt5E|okklxG$nqHkjjit$3{5EWUIREBjIf!9%i-`E#lr^rgo9qWlCjp{3+Hw8 z*Iy49*I&OO=k4o+3x8ZbC~VoNK67Ac#gYgMI`^>gBtZcvT+W7rfv8VL7=b?1(O%K# z+a;&S-*~HEQ&|a=6emUo5yQy%_EVFx(K#We=2W+9^#;Z68fZjGE@Rx$h@S7gSj7iaczz|MAmmTP|ych8c>XVXD4Np}e2RZ75tIeCR%0#1bobJdx}64GzHI zAbNlXr?C-N9$@ntCG36RAx;7ceZFI2znP_~7%8j-Sa>j(SeKAnQs(iQ+8Ah4ev#y?+NxP*{P& zFXzJ0@TlRfjo#8f)C+IU(6HK-!@C-$^8Qd$=xbDbD3bD|5dlWfhJ*|j2_LuLvL1m& zuo}8pH`D|cVZ!E6cskKKmh;>mo?jtogoGk&7#dE7CX{h8F0xT?%wO#O^f7m>Tg_;s zR2)C)N%vdyVQ_y==x--daB2-T;g=mRId))Bpw|1`;&%N383Sm9N!= z61J6V;Be_E1zE^A=lb;<&nK+ikWo}Rbd}N-CfdV-m|t|(nVAR~;NkoJ8jQ$JXmv?- zGWDMtESwGCkg$=#L#*36KqDdnB{+?o+Ld%N-lI#7*(?Q&JzF7zRB{R%A#4a6*ZgA> z`lfd^wyG|)>@`YL`B1%92Pro-2nc`y8K#XJg$yVWv2xzH9@-knrmyZqy+i?tz=u7l zq&elBjp$bbMOPL%0~;=#x#9xa!wEx*$m*9Zw^zDq7w zu%W?(0)`Fe9SuyVkP-X4KrN{#BZ>s;hMmL>m51Nx z%4~FSw=}k6h5!^M*bNcecJPxeODNC1`oWBg4>`E&r*Cl^Ut}>mLGc(eXS*_$e-pj+ z4rNboLavf$UW2(nEG~^2yV~mF^00CBKk9@6Mm1_U8YU;h;3$`_a?E651D~O2u-f;{ z0v*Z*K$z*!`|ZE+cAlZlmQfgXCkjRJbNo^eYZYTU{q;KMvDxI~Syp&1cGv}kTMvq62LmvG^U&>Kf1 z8axyY*f?{Cwzc0SP4Wc_Y}6%Wcr>i5;lOZ_13E}7kfCUtdFG{PziY20-PXQ%ebot- zYYmPA6cE;~nG5YAXf!Qe<8iPaoC<{maO$q0TV zzLL%N7f31eJI#8wBoeTY2VP^zs4!ViwD2$1GOE)+Jl!f3-wJImUh8Bi7+fdSYm^0U z5;#t0>JGZ}(wir5zWHY8IP*+c30bS0zNj_8ETK@13L8kUfDX5{tfRv(Z)6bVP@_U_ zH67WJp?UJj3wPaPGysLkJ~jjmT^~=!OQvj+QG)($YD87K&0mO7ca-Rjr=mkXXuQrP zkJmqb{o{{6es*AR@WP2+j4Wu#c0M9nq1i%`prJ%?aX2cB3=X7dcv(;M-((bnqIuZ0 zrQ=oKAkvj6&H2ROK!go=IQ&wWm^9V!01oJ|cgHto6yyq(Zo-DHM5&umqk<9;!SMoMyzs)a zx4l2eDz)B;2rzXq&=%1-VZAJ91dSHksZ^L04`z2QEy0J$yN%u2UzcR^X!xkn+6rxL zZ1}F%f)avmzWH>3Sa4E2phF@@7i>rs3mJ|MW5e2^iiY|PXF*$ihECyWRA;(g``<;> zP&Dq6M|0drLx*M)$RJ*vM2>-(Ib#Ds#@wBE z-ueFE_Op&Zg+0mlq%eVuy+iah!V)%UcqONa5MG`R&j&#RvmqI!skf2%_v0s!;rd;U zjo;E?7F5}AvaF)_1;t`&YU&Bq6jDAUa^Ok3d(?0U6?XA$qwbmwt+|b6E?i&384P~v z@QRcyP+Z;|HF(MtJW!FOV*L&YEZ1Cp*FCE%xJFu-`w0u6;a`gqViNg8LKZ6?k%$jQ z@0?RIC{gC-?i@%B5664Y+P=N-_&uRVUVp)g*Zo-HM7KOySYZqWG&sGxkXw^zWw?yu zDp<)Vg?~R?m>c(orE5)OoZ*|HDvt$P;Lyk9q)_qp+s{4swh2CfLjs2w4hbB7JjLly z%GMAe!!^nq?S_%TU6F7(rK1bkmM$0f*_u$K@8nArLF4jUc}JRv#Q^lTy2v8Z59P4s zYQcrWv-7Fc>};G0MA(>t4Mbz(&VlIQaD13E9*2$E>iTVm9I>~&PJGYad?Cx%UPnV9 z(VLe=3eW%v4yP<(W4e8-;o0z=P?PzL788n`3H4gAYjR=g39xwa#f_&on=DrW5UMwqjg(2ih<%^tWi( ze#0#u6f8Kg7?APe22_0d>8JO7_St8jBH+-#v7l~LyQJnfKm#aTkpda6QEn;4%d&}F ze#jMdth4bFTl$*S@KHmsV25zz!UnY~TSDSBu4ZvrHW9=UVR;*$-<0R8@#I%qUw^%| zHGbU0IBYPSk^>E`Pw=2KW1oCITm2+AyS4VomtTIl72e5qk?g{9B;t}!7)TWg)|-5W zFu+YNq<@mh{SlTOOc&bjYFIjPQNxbbrp6hqYuB1}^1{he2r@P|6^jo|(6PBmT5)Vp z#ai5e2}vn79BXKFqoz#&c^VnshPp%4A+xdL=buMcHK8aO5;l-P;lqZaf!SEe%KMtj zt4onQXz+hQ?R7X^bjtgy;1WdWpkqeIx2o0g@%iW&XrPB*{^pxc#)BYWjODB9RxbC= zd>}w|iMC19P&6z;v>FU|h#VUB(a_+pYiE?Y^*zG8tIknGLG$UPIYnamgCF1^447oCdGFVzmWg`5A`c4!Y-V2!bTGuNFOe2$ir(|eP~4A^~Zqn%RCjvwvhE z7j2D|6~1C^XE`ET;gFk0!$%E`H)pmzfMQ;Q!<*0xw03QM_gX_=!b(Wh(yjP%)ukAy-egDWo9-HFdojeW>0#x!1-)pAV)!zgl0Q*@A{e z4XH_VhL38sz}#WJ$vkLKxgyyuqwA}xENW%M@t6xvkvMSg^~1g6v58D>Owo{_5x?Xt z_GP*3@t4?gV|?rDtsl1HdxvCmAE3%-rv;63jSW4W90lHWnwro^wAb)5GJMe3-sC`A zcK>rjYjUe=ici|*dQr$QFfMvP1shK`v!VTsu5K$)4m`M4r5xq9<$;=7uiTBU>CLz} zRDA|RDIG)u7n-`|bKIt|@q1CDDWjy*<#o39%;uSLVGRx2iaZqiA{hj<$dBoxOM2!d zeW&#$SXz*oAA9-rS6_eq-It?-FTKQMza!2+`kY(#3>di|AIjv7m9Kkzriiqz4~=!^XC~%x%~R8{#Pq zQ41YS`*|4{wm!+H6qi&wVm78fPu;=(zJ`XCt>!h%jCwTSB7Il-nR`ad>xCpMN^Cm~ zYlhOB_ySrY6Q}g;$>tl0J5KBif>=OCdHHqp^4vfwHQ2xRw&VNGIrYYPW_CXM%}_5r zb^fdDNwb`cB4|tt4;CmK8t6~au&7aJs~1`i8QbezYzGYU8fW);EG%fq2^My%B@;6m z^gtiG4>A;sD@=`XW21o$!QfDt*JBfVq#vq{a*qaNcr;pe59Jhf2#wD_PkkRZ~+~oBhRGQS7hTYS@Q}S_9oBR7heSglE_5gcEZ5+>+a|cf{6<=<2m!8 zpfPyMM1Oa%{ls(LkI(0xeSIK45!QUda-B%x_!=5Wpzw$w?thg~R@z!-aK4lNL^|2N z-PsIIl}E#?xpXx&p8J%b0S!vUBMy!hzd@aHc&&g{GAyYa<=YzF;zM_9*^e3?oN8<3 zd3FSi9Vt+j3=QG~cb*Q7TMZ2xoKN3FHYuk^Mn=m^h5SlBsDGC7Bn_Klb~T_T=fA#hmWP&BCFAwz2v>uS_hX97%G`WjI3zoN0*5@MWP_bf0p;DR+Df`$#FK!#{E zjYdaDMvGatJIL#z=Gv~1vJ1~wUsW@)iHQqQJU%$w8w-*i4Z;SE(pl#D4AU@=4lyYE zes6-&*RX^Q(1>GgkxMErtH@cqHT5-G(b%bt+SQv33mKdZPD5l|m>RI)sRJka+0eKW zG#~>mOdgF^Hn5`Djb=0;12oW|bjtlQl#W%edy4%70U^OPLKO`H22n%NfQyl5Mh%UT zk#c2)*%e7GPjpZofkrI$#Vqsx0AMf`O%3-ZV}^!hlow`(2BN7{ijMgJ`sB-*f!-j@ zgpDw0gc7~6LP4x3f(_ppZ#5jPXiV48=-=TV>r#h?SPcytt-DXR?ES~tT(~ZX(J(YN zC7;y5cmy&W8WuKw%SN}3&#Md#Di@ouVPy0i)dU6)&jv?lN|b}92d9^uw=guof~Cg_ zi)^V?PCqj;!l`KRC{`qD$lOj?r)ed-t#q?M{)?^It*uXTQTg&y@e4Calug*-9lDkVYa5p~zegVk~W+)bCHEm7)J8Xc($*w+m?o-VtH7Yo~4V9o_XlyWn!-b7d zxE?opx|9uPM4Lv~G-4pdLT=t=bOwzA3!DXwYphJU+D66Aht|-z|NfCtG78s7v7D_G zvnxqi;wnuq8BmPqhJUsf4``%@;~8Z`(Gas?frBYMA3yr)!!zG}IWxq<`PqPMq5~#dDS|@?$`Kcxlo{|j~aaN$_g5^XWM9N)M5sAZW1!KH;=aJ#pzob0!9lPbu?Vi zc*MenpaB@l1z7j~;r4vN^!w;~zOwvI#c$WZE ztk_-+G6);e54}~s7w|AN(x5@maCoGPm6dXOw2}?>A}r!WDKg~k-~9n-Kn4wrVbG9t z!ZDj0n3?fxJWN7iny5(j+sFhFT@%dvfGK+m>qyqUE;UXj_W}t;qnQoNYny0T#cF5G zXY_GNud6wsI5hmY37Nz`Of{fk83ioPdql&AHbaro;m6q~Yvc1a&UQezI1QUr-fd{O zJ%@X^>47{Pc0aNsXcY3W!FO^iGck06->n)o)R=;XdQTz4&?puw74ph*rP^=ryOHuU z6atN;qLG^&c0q$}$7fkIFU!~*8z$(`b@R!97pmYy`CG6DOYeGdeZ6uu`zZKzYmN%N zez$ndDjJ10wuF>k7hL#~)h|}_`$76nD3`Mu%;%b#(jiw)ODHUl9 zba64+EpvZE{Xw_9?3scQwt`;QqwM<`cvXvl@oR zXNm@F7#fe%T&T$=_PC)GXE%Bd)!LQh!d5-RjrtTot6WVstz12ZkkL^zvaq31L+5>7 zT`b>oPgxhGbCYieG+^WY`|swEPH3^XUL?2NpDyM5Wt(978S>u6h^%S^jofSjGV*ma zqH7v7j17E-ztJ7nw?iv=OpH7gobL1TOzGBQGjSdFN}4DUpRjMwkCps_YT9}mYO)F(2I z8w7=7x~ymvK?4~c$m1akQR?x+?%72e?CnGin6QdfDiiKaF#{l)=l%KOm2|SP`68Kt z5A_N~+8PKnOqNfOPbh{)oeeSy!GN6=Bz8D3>I>z$%d@@?1@RCnIylb@DC9qHX??X= zOfya*Boz4~3=KB$EH7)&xZBVu^6iZlmmyc6 zb_#PJzYYq923-7d|NR7ynK1-NVR>0>ESnD|lKJRzdb!L$EnUY2r@HSo$V zLdN1^8)$6T*0_M7S09Iv0U&Oznn#11MGOrZq=x5V;$*qJ4FwKYzzP}`H1Hri>uA76 zt%3y&Y-VlEe2C_Tp`lc8Z+%}5D7g2bbgbn?Ilyk6rBbCLXqd`^1{npdUS0fonW!O> zSV2aqEHBG?)>K5^!r2uh!vXu!hr;4RtMh1_civdkP&8hUa@A!Nfdev@L4&9bakCPL!)tH$j+f5<>G3k z60MXfl1uChDJmM~MJu2&iVfAahWxHFHb!T2E)faBxQrkl4j6i6c4&VxQ-zHjY$zIN zoP;trM?TSI@<^hFn9wm4O$`*|{7r&rGTA#{TuJi}NE0-$xaCpg;XoEUXnZ)^!Qs## zXtafff#G9@D^JeiXz7EV;JO+d(ingKO$``E2A?-Haz;G-m z8ny(M_J&yv+`OMr-c+6#6c#c%iN-pm2?k=Fu+fT!piaG^GI_kTEd_yRX`M=BHRb@>jt>MX5T_4F^gI6={P`%PKY zdWJ)TjKU&=hcsl=(Ga)s*>~T4_Zj!^zu)*y(D)8G6pg)QjO|F9?uFs#L2mT5Mutx+ zzOB*O3T0iKA7}_0{J5+t3KcZIrn6+4qC^eJC!<10d9+f=MJx01fUlKKXgJodZ~yKF z4GA0A4c)CinW3S@#=|UAqVGA=P@_Ct%O~vXlr1D8pixLBqZNmO5@IZ(w5J0&gyUPi zDXpPVSS+-GM&EXfh7;)oI2!w)oNmBXbdv9pg9cYkxxxx8-B_GCxW(&bec|>qfHZ*l1qr)MixooxQU8%u= zhlUNhp}X$-54)j|VQlo(qedTC`2Ax6L(b-bwFOv^knzORFY@3(B$V$E5L|&8&>)}i zM>Vf(JV)HHtRiUar`tFk3>&h~Y>#A(V*-$^Jt{+AVsAW>fCPTdF?>9nv>0gY+M$gUUpK0v~;F`6DJFXJKy7*UV$>Tr6z zm{Fn!WCVetA!dULR-EYk(98gH%E6(I1|IZfL1Q2{*qdE0uF&m@Rq`uA0yfNTxZ#@n zTk#My;6vo;SQ0d<$u>q_ZGNyHIXMeB{3H$IqE?zfhIblpAxn}-4^O}N95zF=`RRL~ zy$2f71hoQ%f<=29fFWL#MUS5$Lt|?4@R05(%0bA`r~w%^CLiMA7qR*NIODWD^`}2X zgRHvqe>jGMmoSy3HXwP72pi0s;J-P;ZbX!_b-YwXz9x)maUc^?6vAEX)z8>GQA0Bd z9Z@un=xs1*cy4TM#yqH&D7GP>S&iXDak-Mq<=JVtvQh|QS>l&i3pF-8VMFO~h+u(V zHtS(~4rwt#eX#7=$vh&XWVb~~C2o?xHs2-Qa zR|p%G=|#k>8triz7835|PZKms`3PZyepgSoY^Q+P2!n=nxsZ_|>!D|af|sp2X+|R& zJ-+YrWs2q~e;4KkWs~$amep;jr?CgpPsYab!`^q?Wq7bFwy@C#8pnG3c|jj^I0s75 z@KNIw%O=R)Brn_U*ghIWjZcB&GhOD&lN;r#03l>38pz;)4i#jW)wq;=g3nNOhmT^F zk|dNKKV!r111Rz?w4=rAN>OtNq7c!r!T+*9|NK))$!J7lMCt|kvx|I_i%AC512*#O z#&UGgF(+&&8j6J~4jKbw4x7y5(9kVrwRD|0|BhmGpi<0dllk@Xav3_-0iebNuGEoX zpM@G%)7E1L&a_=LP8Tph!_W8wjOKlXTjyzj24pOV?Uc6W=3|f93TVE2zV!N}avPD? z4+@9UVE|b^A!x|AE>T0>Xb)sKENVSbC)>oUwRZJMWtScPKNZqxLE|T7gP)3N2^&BC z^g|7eYb4B%C>J73NoA3t+I%d`7SeL?avT|EQ#8mZnn^ghGUM!4UdqWRiW_=W85*hM z&$?tNN&%EC;x)82o-K?j0Qa}bq4^8H=4iyDA`Dl9HeMqS5EeMJIj$wE1LG`Twt|EY z8pkdmDPA!e&pq)rJFVa?NhCBdHeo~aiRuAE!{pE~tDz<|)Z;=%_^56=UbI6kXc!oc zuh~*6P|aJAS2`6n5<1^g!-jcK$t&fbe)yrZm_66fxYasPX#^NcD|zN(Dr3fmt50;V@}aTZ@L7qz=uo9nNR~$n*`jnoqct=} zejklAgSOt6+Kfcd5H`YX?0Z=EplE1>ZMXb2mt#cPVN0WUHjUs=p*Nl>jOgMLx4JL0TG&2&~CmL>eeOsd?Ft@v<_w0pO@u(7bY+p`h=6U(oa8>Km*Bq z;$r%KnfZ5(b`b~#IFagCU&Z>v{mIf#Yp@Zp+TAh=3Xn3QaPa4&HO#1i@vsJsvD7iA zoVERy&oi-Tk&bJL(luRK;a`9!u>L_lsre3%N4jWew6l86fgxOQ`GFJ2(DK9$s-5h% zj=kA}23lBnZi5ZoUZm|UCCaA~L9Ucp87_wqC5#QgK#f6ze4R1t25PAK3fQ1gX-SAPy2AvHa9*zJ1 zr6}tPgX(9w^!5`fElr!4Bq1Jy0<%!43K>8D#CI*`uRoNWon5TTr0s{k5lFif5ysQ7Vt1bVYj_{2(Rt@1fD~fz$rX zpDTcuZ)+0;z)<(eq49#t4XbhY%`WAF+p&fQY|yiscG!RvwV#55^*Q(% zHLjSSl6+DdbM2mbZc^6H?$tVFCC10rKllhfub#W!x4;(SJg`{weCnw^Gczj$IInGC;sd#dBJm=9E z7(D;A+i!pB`1OhiD}$D?qLwFM)Y|2(Xfz8l5NOcxYD34m!88jM8ZAt|3wpA+3@34+ zNYOY%3R&3LG%{3d=e6;nqM#%g8=ed|vUaKKcOBSsDIJcmd&QP`4Q_7FCX;_tqh=JZ zPM|S7x|~LmQWOf)&lpif;~f^aEoE7#ydqzLpuuk!c~Yl9LYVCoIJvRQu(^%nj-w~a zZ`nWgmiKSF_qH2vyYb$^!eVYdYAIz#mcPDq%k2+7bxXV~>7<4Pk5RsV^*e|UCc?w- zpds}%f7Zi_M$p!)qg?k>(QtIwVc`P%X|J?sLgPo!SU8<`C(#;gRJXy?PY=~kJpboid5%|qf&Y_aLaOVSX(qgEwFR7{UVr z1AF?0D8Ft*!$Jlvu+gHR(N<4zCvu6_s(RB)l8D=C8ZfxjW+)t7YBo&ADjT371_D=l z^W>Dy`+QCtV46NSKWikT9yD~}+JUx8UeQ2ZTD&S1++4p)#TKIt-B81XqZ8W=k80_v zWR#4FFMva|RVaYPK7auV8U*a?Ud+?cs!D?C55oj|iG%}wuS^IO+))5VaD-%(UthRY zBO^MHo9&ITF9#!Y0n1{S2^3;6MoAC=A>#haFMRb%g$?;yh2qHoCmz};-=Qrj6n^t@ z`RJx*oB|Y_E^2@UGBkMI3HOsu2Nuw<8GQ>kAAZP!&iZ_tT9%kW2TWifrMS&y{U!>a zVQ+9mHn4^a4OhAPRw!auII|l@2l=HlRs(&m_2QV6tDy18CxXToiieaQg?$eqU=Run z4Mem6jjyT@0vW`MFklE3(&-W;MDhS5GKr$0Em1{-L6w0hH&#Q(y1HeIE;Bq!*pRrO zXt;%P-0>aA*pPKQRI+AUD15KjUOBiHHF|X6nyKCnZL}J4xhd zi>M)Fd}MG`lPJ#>L)P5POS6JZ0vh>PzplrV?PLW8E}rH$_<=iYSm0QzK!!-rVDaOa z4a?6a$wxuZ+dC^0Lk$h{7RrVT4scK#S+QSYMQm|4y*bcm&xN8(-5{D>Afb8W6yt)M z;c<**6Lk9FH#;9>j z14AbS(r#(fYM@<&48nwR!GqH*MsvtGR!>EPm#QH%96WRa@sxgokIBgsh#gN@B_f0n zKj6Y;6UeY-Yno6jpU8?vm|#;tjyf7W&6O*+#>EEihyNc9L~&61qFN%Kz(;OgoJEyU z62arEOh#)FjT}HhpNqTv8GQfYa8HkooaoJ6hQ>rjXME|qq6Z{qcry6tvP(4CFE8YZ zC614;kB-PV&SsZ^_^@}vs|uu;gz^SudKS;R6` zLI!fa69t?q$N&s|8StFFxzW&oi(jcbm(a$_Fbv14NwAcL9*u5PicJfl4h=RCs4h$j zL%UMzLI@-kstb*AD%09v8_iA^-DyJ?B2rrEqKg)<^@5_fP^2oj5XOa|vnc99@v`*! zzAyjzlX`b*THkX?Cha(CpLxH_e>rLz45f&k-l)!j#@+q>qvL~{prLHINuu<#HecTY z4d9q>yoP@uJVVF;jZf)>P@s@%{7dCrENOetiDjT1C}XEws`MhZVQe5pLwP7;22k^o zynXgVps>><%L_ai<&|lv?AXVYH2n@k|`_V^`A+wyh2q&_V2{cGG{-x3d z<-(7bK!&-7_YJO4>9W|yB9{XMG8hFx!Um}+cLv@%F9}@ zHT*lap-^z|6oK?V*4)dQ63AR0cK6#yBok{S3fB9gi%~6dpkjYNXDPrG`)K_`Mpa}r zi4$PhR6tBaT*E!I(a7Mkwe$9zl)AXaT>oe)pBjaZ@%k!!S}cK#kGHlh&fyy$iC%m4 zO;)gdD%0Q}i1-)*IDKqg0X+l9)WnfX$~_>k1#bffv~( zsVY2pFvMYCqv>n|5|EIgXxInuh+dcnt9XBr`Y?|mBb_<>v5e)s`V(Xv9BfPB^uv$h z8DH~I6^fcy)G{DM1Us9It^I4|Cy;@mBPNavFC4=upJL)oMX-=dz%W2SgGz&0IY>8f zOX|lNi8o*&TzE40vOY)2B)>1_p%CYAOHnwvd=l!2= zO4Y{36peH`mCujqkjsxhK?XnhL&*5z+pjefWuhr#bP5J!a0wbRfby@E5GX9k&@omn zx#JhNx>UoHksn~YLqWrZ6MNC&GJeKMijQPmM^F=G6{(5Ux)w~dIN|HA6N*M4!IBN> zY_#jhM%12+?sYXxYjA+}2ghquHLW~1bofIhGcyF3>N0z*1kogHFc&n44d56>zz|7H zapkL`f$r99V@qrTK?YjsG>yj6GE>F!w~mcwQYnon<#c`@@rSbnZu7nE!$ZhG_=T*e zJ=_2dNjK2P>KVk7OHfuE!|&@SSlD1|NQQ4}jLHK!6P2>Tp=9V=K?B7q_HebK5t;Hi zIXPLLgcV*4qwoRZ*3vKyD;jQ*Jo4Gb(Ik}b?sDmB;sGU}FsQmuSy}^)WrB&y(D(!? z8xSD@MM4U1`W1;58X+5s#@g~N!k29%I(wjH2{&F=FbzZFEr};hM&wHQ30xy1WMp_K zdwxkX;nz1dxNm%N$iKkB!N&)nu{X7`A!x9*s0I@Rw#$)AP&zDH#U_LdPNy*shO(hQ z+e9#Fc_=EYWD^wzQHSMcAIB7A@qpwc1K=Uq$s#h#5DKI?;jm|Uie1>=8ev31zqi5L zkt~CET|(oEW>a%d(hM6@1&!C4p7Z%v5>T{oUFL!Z6eJU>Tbdgjq@lJ{Ei6*1GGpTw z?yl)YSOJU!frE&GYwSXXu<^o5vx;k^&fYqf&Ez!IE0=StTbug}`}+%fXn*gM!^4+1 z4&S43cDOfApxc&|Xw%3&5HzBZOHfZM`7|tA%8s=aC}T>6D3vBrh?8SgDh3A+Z>>z? z70d#bh>~{gtTV$wiyY7hgbn>lJPtx`U`^F(lY<9Q$dh4g48z44p~81G!bi))Rd?bE zs;)8S-c)-)kn!^C`-5xC7inyO24bVfy=qTX;1~$NgI9j=y0#Sp5NuRi5v97!XSXch z!smn(H0x{w&sbSuJ8IAn?cy3#D4-$5K!^rIZ?6vyjtiz-GH}z}5H!GdjRa;BZVy^| zk9cxP%IPqxfuWbU#~6p+0mGFiC>5YsP$5VleO9~(G-5Id7zC_oaT91LIROFQI6VF9Jvrh($i`UBnr5OED6_|^aS6{1EgVNoamCJ4 z1e$HcU;w8;SifT+&|Ncz6e1C1BwJaAJtD_(p@VCE)+MKO<;K~u-WB;x>v0MjYU?^0 zy|R-dd-tu&yk8mS9=xu;FkV$OK9TGLRp)x-xk&-FNl${m4WO|tU>F+W6IJsUMZ-Sc z2;+&KDH?HPf(=B3K9zSeTgxvJ5n@O6il~6O)dO$qG_7;<9)ki9N)4XO%}xMx_HJ zDM(C0hD4LlHT<|MCtp?dx!D@XQjN~7yksojp>bKHODgHl^X`7Ol>TIMbFY@kT{~3- z4RVdWS`9G76QZyoQat*bkg*|qB{WTvU(6XA1`A|3G>i?nm~XrQ8jx|}88)MSew#Ej zK6du(L@tYKlZEA~W4b zkyh^-_yw*Zrh$`j0*A5DC;$246^aHqDR`7YBd)eV458I2i;pB-tpq00jJ`fswBB$% zHzY2geT>$F8b|yNfJpCx#E5c${EQ6%(WXYXRFc2<>+39W-e-%}Ypxw!yr$M)R5X^w zGjs|@PXfCT!{C-2l@yaK6bML1IW4A;gWl3w746U<*H8h5W*WP=#x8^~e|S~U7`=14 zU|q*Nx&wH0#?N+D+^Weg=O29V!83fcC4Y)Ulb^n|Z~_{0kxNuk&_G9`NrqFUu|!36 zoga{CzSu^fXas#iiI%0HK^P&suzcc-eFJnD8h|lk!Ni9Xo5&*ydtD=Tb}V+4OVds_ zaifb(4bukYD?7U?8Fe<3uH`bIA*qH26H&1zny4g#fk2cV+g8&sFpxP2$tPOYV1j&w zGEct?wM>JjqC7tjC9_hzj@>(xH4~SF;~s%V;F#Z#O=%D4j^i3K3thH!A+J3!{V1-n z7rA8VXc|XH&6;ZuC5i?^JOk9%nn5JUH$(~ED+AbuAVG>Dt|4vkz#5Q;d`7`Q*#?~QVeDUppuAhrsvdXX^eJ<{t$e^%b0visE6lic!zS5t7 zjUb^85~6`A47cWDa0FJu2pX=N5sJ5lh9kr7$djRP7!vK%d3?t_(mh>9$f)f>2DZ%; z7uSpZlR^gdidn`QFFlw>0{dj2&~lnb?=97vbr4VjmefR4R?jLd+oD;d;l$7|FvLC@ zE2|W|$=uBJ#Dt(Bd`yFeO4vAfjac&0?DlpY$pigXSGN#TIDmucXsmU;WL=i?()6>f z0otY%Wb7{?b#w-K*uEua{ikHf&laAdX z!N7rGuiYJ4^9m?XWfqqO2A%fH6hN9zY8kpYLZ6sM5<6v(ATK{D0+05!oQN%TIhuTE zpRR6inQN@HOv5arVb9vSu(CE6AIQEtoy}M?GM{<((S~P3vy9hfR|Sfvo_gxD&t~U& zU*G0&3BYlA~GELB`92GI(> zfo*_Bs$O?!G!23l9h}f5Xsn_wP91<1Fq8~+3n7D)d|+5aJ6y*;fq8-WloLG)L*YAFM@=MQN~bT!;uMR!Ne_KQ$|pvySmb_ zsJ>AJjVff2f?nLKBFGRG~644Z?2JxSYcMUcmV0KkX5j6@m4}cKKXH>6h z887VY?tq3ylMAB85(^eUL+VG{EvxXjp?Kx1rwLp0=K0X`E#}ZzHv+i zT(9P#+|)08540@-O)43SgpPqp$sU9axk-uA7bqH5nrQpNq6He3idEWFMub4)F~Lq; zJn^Z9-)dOLS^`G~ zM%Zq)h6d(=Xj-6=o7w`2yd-FT2$AtpGY+xEmz8d2Cc7KB?}cari7a%v5j_VFC!#nb_FZ|12U{gF*J5}>s10u zmW~$#pc+?Z-d<5O_$qAB{CIi)#$SF}?C+nVLLTpr%K%LsNhPbMaXi_E_l(do^coe{ z7=R4W&=x3UkXsrWfB_n`IdF|W3n-w$tAd~&!J%*U9=-~TMPt1bT_m7Pf=0A*)}g`07em{acSK0FidyeUB421A z$vJj*(FM^CXbc6}Y3yR6Fs*3Z0~#S4L=^TEyLPd^G*?^LUahAli*Sm2kp4Dnkz-Ri zrwYL^+eleF>4yyKag`Am7#q$tB&Lv>8XDdWfYoSq*+7(x&L^*4ZC0-4bYea3(D6tb9qvrVYY!l12)>>u!>}*%{5H=y5me^SJ9Aw zLjF1Z?zx#l;oKcBh<4G>l8LSy$Yi36q&!oD^*WE9*Ks^)&Gto(Q3)9{@v=G{S5{xM-muwxNlr6|dekoNY7~ zB-fY_*T6L1K36E*bH76aY1@m%*_2Av{{Hdt1?+1L)0kqFR6KI5N?{c~mT*IIOF7S| zRLnNG0%5~8T@v3gG$6xSgArkG6$mf+z?Ui(QcSL)VG38Q{kunnvyJ_+=Ob6hY+;)v zjC*{sX6xRkrWAmwQb0tZN(mA@nX}gMf*84}Z6IeG1_HKWMT&m1;?M}$*llP)(IlgA z@7r%PmU0iS;ozY2#k1!>xu`0ZSQlG|3+SkgjTVpjKfTw1F_!mfDASk)4Ml-5b`E8O z)PfJ7p_N2xd~x}wM}y0=;foaiO^SxWah0Lr*zl`Qyl(yn>yj?xxk1OSz4s7LH4^i< z*sN*`Y#lTNj#{y=jAO`Lrz`T{fZ#&!Y8%csJQ^BLjF%Ng|4NbF|mXGad&{eXfl(?tg&TI730TXM8Mg~nNi zAnnkE4x(fP2SYa zEDciOH?+r6pIvQMi~I^Wj=z3$VCYTj)=@(vPze$EWgvLyI;7Z{)_(JGn~~w!Fbs?k zj^C6k$ddzKa3K@K+H(!LOqPf0#89nbBPXZg%k1iAVjDL@!`Nt{p_7IyW1(yC#?U~s z^h7-fs2z=Yfdw)&*)TPvuK^m<{6wbj5j5_dS0t=K)_{!_rgRt^%iB*sjcaJ*ekgM6 zN@ToziyY60D;yQ)7L&?`<`*)1kA|qA(OTo&7EtWf=bv(S$hbSE5l>1ljdLIXwDxSn zBw+YGhRH!sPRe4;)$?Ps|g#-8;w=qLZ%IuZ*8F=;?>YVAql>C^=tr#p#dBZ z?cy3cb;eL~=kA@(F;U}=Z|*3}%m@`GZG@0)Y}`^sZ@jU*{rpFV)i+qk@Le_XA1LjU zj1Z5sxJF!E118ipDx@255laj!8W_kC*KpaUC&JgPa`!LS566SD2{@8I-8f@dSTr#- zTn>7Yx=gv)gbdI)W6R!aQ;J3@F0;JSps_fpL|8!axrQVb+~xrRc{J?TMuwuXYuZ`D zH8MPXBDa{&-uvje!pw9Fi-v(ARn9hZRwc46FU@~@sDnJm8%_w!_A=@lp`#pmMClqA zGQ4jvGgRtVp~7bUBBq9dhLYiB#^7E#-OYb>m^CW8qQ&4C(jxYzwq3k@$;vAiWSpp? z7E$&G_Z1Dbjdf9JE*^lzK$6vcXB7xebB!ewT81|cE`6)8xLm`t0UGSelbNAW&V1pS zJMN_;>KubZO@qf{ED*|Ajm-uNs~g1OwUL+!*Ri}f*yPH zY=0@n?Be_DQ$;p?`Q80A22$yNjfQ)aT>u)up%ci%0!7J)wTz?U>?1LRoNL58lTa5} zIPCPfN5>b3j0~&;wb0PnAkqtU6-wt;D<`gn*H!yihG%1)jiyVo+MwqOnxf+_o*?c^ zjtz+?9uGr9<=FrY$HophW+_w1PGri9nF;0r7Vd`(BwRSxSb609`NziN@zk|<(&}PA z%HQovFs=8}|Iek=F))r0jnY-(8b*fPEApa==y1qJTr&+HNc>x$d8l{Tm$>wPCQ!Qw z92&`?Gd3C%Z}$v4PC=q!>fJXq6b$y(kdRUpQ!mNH;Val=A~h~RglJf%f}u*|6+0U?6rdwOY6Am@w$c=>4s~0 z0f$Ee9CVg2!6c|Kj~q5^giX-k7?QOHAridxIfb)}R;kL#fn?hSTm3k>Xqx1oWeXr} z2nG2T=*_2t3^v?oLjy2G)gp+Lbg4WeY@_397LE_kMmreJH+<>=8@{!nXsi|E>1<|# zU9c8&1sHkM0t!fo?DdiNzx?u%^G^)kdFP9(^H2X#hx}NYJUy5Oc*q^oV0}ScrJey9 zu%Yh~6|#*uV4%3%I>`VHZycQNQZmdqIAXTW-lGvy0E3vB26yudclAb2g=*p(^6VR9 zgR@`mb3L%ZxU0H`scxsSfo9v)jt27a1gUE@7K(G}Y?ci-i718XZ1#!WHa576b{=^D z{fF;+_^GEJIe+28Qsh5XvPDK~1V!o-PQ6GeVxmA68`y-N5Ds6tDjQ*g-1kNe4diTN zSjOsDxDlce#PB3Ebi>VlFy1CKaOhca4YMe_&_lzVi>=^;RSDpDS(iHS(OJpixpZyb^E`<7&Bv!eMB5 z*RXxuJR0sE+6HS?h6Z$FmO!&mRE7$X%p{~land=Vrz8ap#cDRV;J_^K4nrf}!>nOy zxc*v*Mi@|hNa?6k+>4bczUzfRW0pnM1tyZ`+0G zZalOD8MobbTca!S_A={+l7(tOiE&~S7EK%z!t3X5dUZHr!HI9aqCDp2`(>FL!7*9Cm zP&F3j`WC03W!+l2vY2}|+j!v_$Z)P<;#;4*aNF&-pYH-0#s+ABhXxcMPXY%=A1sV0 z5ONtA?Lk97@MQS;8|E1L^rT4=P{g3CTQ@Ce*pm4X!AaL9$({2|;pI zNffSuMkn4M{{uGSfPt<8j?z`bQC;y`8IyoA?&0ukpjC%Qdwav%hI0@^t?`MXFjH#I{p5Ph}!Nx;Dq-*LO9UavQrKCB=P|SOWvkg0aKxvOBoxk>zhWVPY z6N~GTw}98Op#dg|SgYNoUK5VVpGq>Y)_BV`N)RG{gZg@+13`r}REFupc;e8gJ2cwI zQ`*rWv2<+ML9(${islOPERhNkWmO*9=M*ABaq`gl?s$gxjl31F_PF;J68bPKE~CL4 zhbIBqCm|NTx#1+EXn~SJ5^A0yZw)%o;M7oJXq-+ml#QYlu-g2K^=TH$OfS$N*>I{m z+u#(*(nb%51LG;@8y*i$HlpQe9+a6WCl+s=WuR4h>YOTjgKIp}6X~jYQ!>bAX{dm~ z6?Kl8r)EcI53TkIk=aZEW#vM_uEouJ-~jOY87j z+$xg35Db2$8gXEdYnVFO;5C%-;UJMbC6-h)BnvguKndN9*m4c#Xu!oOn4$5PY(U0U z@gX*?XHY(wu0Xn>G46|3z_4V)w5`@*rHWyJdmO1!EDv2}vmb4hFIFn~+4*KuVe)Ma zwDZJC{MAVt8p;AOq!W$dPSZG=Z2WfehF^XlzabV-k;Fm67CqTqF$@Vbs83vha@zVC zzhy&96zK{^Nj0L<*3iZVI+BGtg>Wo|+cjCv;fLmZSM;-DUqY72%Lec1`Ye0K0#gSX zjTa*)qGZZkLkda@BV0C%9Q~FJ*W_}^MyC`G$BoPs7BtK>VxU46>d|m%=qV>75{X&5 zL8fuV7118u!CmsuPBfN&SKGkh^HD$iYVpL-s74c+Y?f?;WIeNCXt)YR-z-E-zA5VN1>d5eF1H7a}nxE=Rlw{-7jqE7(|{oNJ`T zhGrN(ckn|de&pRK@X{odQw4CKp(U&g@FUPr&(KWcG|UkGCqbnq56I!t$G;@QM6|9_ zFocbJR^h|hhJD$0NG;#+Xq?~Kd1Rq4+Ik`pLn)){Yb`XS@fAc)fqI9W%s1@jbB&`7 zE;s$tf8IHSqQ6mcTS0?RLVE8kX#^=6|BE!^SN6_kHEJk|x zI6I?%_n|F65NI$oWO{tFLa7ZBHoFjE(wmG1&56?}Lze-hmeAJq!T*GuPw^o%JaUvf z)u0V))>si13mob+Xz@t(8%&ON$Ew>nJ_Z_T3YUR?c|s$>jMn#u$A|NygBDaKDhDQP ztlyBXIHpuE8eQ)Q~M3Jyk9D0f%KMD|+@T zs!?!OKI0WH_GM^rmh$cB=O=T~$?4wP`zg-}=3R52V_)HSpH5$Fv`_Bl0UFw2 z*P*tIAJ;0IfC63v9|(*PE6#7u9zT7t^P03nyXqxLg3kPXOmd=ZW;%rp`ndIY>&X+M z;R?HImtUV>?P9fIZuG+Jwf(y-esf}tL@``zz1pyu&$zGFx<|1tHUI%Klnbcab%`lr zuYrP;itq4gQ5K{J_puK^@;ISI75%+?G9z%G=db7%sT@~imzQ6&ICCs)2q?Nz0-ai+=wAkg#i4h!F%937VYJZ~MP8hRV?gM#02(Osf+P?WutB)R z2K1Fs#A!k2_U`i8Whuk$VJlyD;KhlC1cn3{TBwg0L$y@o1{oTX^00aYhQI+N9O&>| zq)?8tV5M{{3$K4bdExUCU&cn3?Y_LqIM^U--jUxY8cnFukbpwY+K`Nj4zshd!G>lg zRCJ~%?dKIa@2U!=-~wnc3Vb*ioub0d#OGA1i=d{A?Gn>nSy|el-v@Bq;1P6uaC4Cj zyRyp(h^USpg29UY%n=tkS1*hP4j9N-crL{RIU+;Z;H)IeGhhK?S{`DoD;{ZzQgaAn z3n*?zN5j{u1+6Es=MVE0sPN=B7zEE~h}V#VO=46r9heD}KPx-Ph0@V{@?-uqXCHf?(6^tZg{fNm&UM+J4n~%S;Lr=$Ot#b;pJIaBa2x-L zVpk=w&NB-$X%U0T7p@R$9Pu$@N~)lwqyB=ViXV*|4Hva+l?&rWuE*UN-1k@Ua2k@* z2IJ0)QdmiVq`KfH_8$E@@uNpIG8l+jWNI#D^zWB={8x$xP98r$e?M@}D-94?-JnNQ zm|~3drDtz+OzMFM1_J-~fBbfQd!r|c1`hJ_NmIvUI5+718xw($5u{tOjj7iRP(**o z-K}1}PC|KyYVM z$t_&Unrn!-0Q}XH@l`^4ZOP5usQqI48_(@I8N)+Qsn=ty!FXS4HNLmo6rudq$r6}& zgueG^^ozAZ+8s3hS!=upzxs%+@dpTfrMd_2?)UX&G6W(1r=%wyU-VRc?q9VA4vDI# zUVUYa537s0>Qw}t`#X;0x)V(aUKDQVgf00};cQJdpE;uEPmgqFvE03-H`2AjV7Q|@ z`mld1C8rKTT+{lnx-i#Y+l5n>_T)?X+cjP;=5#E?gf#WYV9!ESFO|5`y`5VxRFOi0 zp32==32TVBnZP2(hi7W0$=2x1D#E}Co}1`Z6qpQ?fZf8IPqst5q6m6ettb~s8x;ZO zNgHCsT_3MPzdVO!Lb+#_DPD*XOOodLk5Y-AQZg#CpvXXlh?@Zf71h#AdTfnF@W1k4 z3e-d8UfRCqesvTDCZm7q_PK4>eAE%1Nmqts^@(k}Zz_Gc3RJ32e2S7&hB$HMRwqYf zjrMf)%(go|JfoM(mv&D;@N7_be5 zSe*33!;>Sfm&(wm0XM{YP~pymSj2TwkB(`n;g<$FgK0_C3&1H={{-uo^_bA-fHL%H zObKF*rd)5h1Mg9jAoVyob=HUxC+D&?<`3Wl7s(n}=A9wLVx&cAF`wX1 zy96S-JrXySa(oNA>n@4iRZNnm{=^xapqr`Q^toH{KM#KjuuCN&CU)(~QR9FZ)sM6Qfmg9Tm0fzqB%-^}$R z=x)bBi=RK-rwym`a^SQlPna=biGz``hOP-Je7E(~{pc#%>6F`oBnz}7*&3XjHftn_ zi#2E*0H>rigcy^qgLEK?QW>+x7eV_TtPzQufhQErLq=|5*skcds5jGl?x7rzhP2`G zg(K1w11ul|f0vg$3?+F#I#4({bsaQGT&w}IISc~{YqW(}l60LDxiVpmhtoz-SVP23 z-?MxY9#f^6+As{R`Q}US;Y|t#jVLf0%-__nHp<=Z+=n1o!iE@n2p-9S!pUi~Mv}N# zBbd@3_&Gx_AZM?iy4# zw{a%dN^%On3jHY_oJcGPu_Wo*m`Yx+#l^L-u&}VOu(0^d-ubgM41{6)PR*nrz(p5V zadXNCaCQ?M&)HE50S&ihXxHM>r6R;32-QtUK|%)CbjskGp?Hf!N8d|qwFbc}2)*X{ z!5wYd8=i-Ud-IPw0000000000%Zsx{tucH2K>KgJ42NAdPdrMft^95Nyf-|#=FQap zCmvmOYrj34=6f>5^2F_RMv3*>|B=G}Xz1ODx#5s(t9-8hX1jKC%%hPjDZEQQwdeIp zi1sdHuj5p|Nj-j|b}}|QUsSvVdKWy23v@zTWNonTA7vFjWLf#(cfg* zp!;dhoqtYY2~rk++0*e)=^y_1jQWsq)#ofbw0eQ2Z1BW1achs|QP?Q$rUj*F^U5Ac zo@oc>?0G9|blH#6d|=xPIyIaqsO<+Y&iu`#bBm)2d z007`Ek;i}wRhD{)29Mb3aU~?<2V&flIoL{fE*_0z+RDF`-L?4NpH+~Ek+#`e|kg29$4wBBG*rcY~?G_BK9Pfk5q?@9L@7xkf%HaXgG8A@A zks;2R@@!)&s{!cDz}jq-(;LLl^`kgw)Ub%AF$#m^ke(~gt$?r=mfJc|j0(=c9+5Hd^G?g*MBeKHunlgdcimu(^0?l`{|k6U%@*KhKU~FBtx~NVjf8wEu@@uB7-XDSC{LJmS~w?$I4THTh*q8Z z^`vzpj)=IwwWCPabjRncL6Xej0(DA(tr`hAfzBa7Kp}d|?Z?NqL(t!w|KtUL7Sfi8 zE;*F4W+20!LT-%4)JEfR6!gyyX{a_p4R`@CXFM}G4A46H6SGZBy$5YMw6H}8x7(u0b3ybCn;P+6ct zccd>va07iG(v2430hb0t+YDnh7>S7V&>APy(4^gzC^@5GL(oVkkr%n;i7@L9&pliN zR2FU+fDCESLSSS6@Q}&4oGc#Nwkqt2PEdsk85meh?@k#1Mlz#XG00Fsjerr+Z&{j* zD8XSt1{7YbDlX|B^X5&D#cc6)&BHisLs4qjc`)2Xvu2~R^ zVb&A9Xpqb@V#vTij7A(T1yMkXbIzQ=AV(vL6{hI4+fL?IMzZg|ZS2129_qcom>|JD zSF@Ern${mb?$7%VJBKhE8VxC^x=%Vm=Y(`{!n*rzBs5AG88acGfq6P#ISO=KmjTIrNgVn8BQ|^2^nqN-(zW=b( zsj5a}|KMMAg31LIk^$AG zw4gRf@*FMS!N&biBsp}R0=K}Xi6p!T4dF%L5FlhB(QFvc6XM7OV6+CKq2KrVy+OCa zL2N#sr;Qaj9=9rvy+c!fBLAxYRr_=qHX5@-yZ>S^^(U@BID)Uyv73cL17NULFE{Yu zzjbnQCvxLTaMU5vM3`e3%taLUKrTEcU>GzY@j?lWye6XuG~B*F9UQf~Z3iX;ba1$G zdlr@0PeBk&XMZ2)qY35~u7yD=mtuoO_43lo+BVQ2?d}!|<_CfVUz&|=-F+v*x|!4K z)|v~FLBpg%qf~W3VvLLNOa&5ARM1H7DzNwgSq;^jpHG(K<$?h54sE4o%^c9suNAh`MA4WCBw7!6R&E3hi!ZsM z=oF_}R>W$o?1I@@*_QD&*x87qK?cLYf7{X<>Y8A5_VbN9~dqg zjKTK2nn9Td>^{ugS@&YGT#Ww)8t2dca+T}OW=(@eP|YUO5#$5)H|vJ1hNbUZf(uHF z{RswRYlF==BeKm3$ym1InGNj8SDd5KRHMOcOu+`*jXar+Xd?9I&tDZcLpu}&szE5q zxOPzrySuy8$9z6lZtKx_u{gb)Okg`+^wkV#}Hs~@ACKpa^Xscm%N=z`jdH#<)i6lJHN?X|I6C1Lo3|h=aKE-E{t&p?v$|nTI z*}jNyK&!1w`<;p3iN(c1Z@68g->rF z!(nU&L{0FclITi_b%3(DfCjl6 zPNkSiYcyh^4OEhEi<@yKbd>ka;$fhGawr6b2-8`pRlU(K7mLMbpFLTgF9tnDAT`cqON4KQq#RZ3W32^ca~awF>@b^|R-tu?#0 zvfDZOfX1ne_bO;Pr3bfB&nC@nY^GK=Y~! zM|zYXp`~(SF@y^Ya!NZLt77#0ntV}9AH9iaW1;V;0f7r~IJBh*5Ck6hBUcg_VKj=} zk?*;6$aU$j)WVvAMTNu}(NvOrTC;~A4O`OO`b1WfV*vzUz-SbV*C|jKDL}zs01eEj z+v^WU&YO=u{`T2&F^Bn7o~l-}Rj?u2LPTM}<^rtHNPs~l*_sXidj3Q)Xl(*yMcFhP zu^<|_aF3aogk(-~@fWT;X_lbT9>8kUSuV^*3y}(Y9IzZC(Bb5hQEhLCs(3tH=K?tg zdPZOzmti=-1+68hkZ=)TqsC6CbXC*yJ>Q?c_>Ra}E)cudv$kskjk>#LL;s$t$;Dgqr(?!e) zf1#V9rJ$1BG#WejqJT~Y3m++BBV){l%T~jwROq~yM6t9B+b*SO`4O0aMyS|$u*!=A z3N{%mj!Vp1V#tt|B>krHJij-e55F9P3@j);A6rS}iDH-Dt1}cqK1@u@{)gC%8dV!y z)NQ$1kt>$@st5uYpn}RqBpM(ix9y=qX{E7|d zXz0t<3Hcfho#d$y8eoHxU&O{v8m~fx1`rF)$*;GV3!y@TvC9pMppd$ur&OOZ8%nvZ zkH~#KUtnYYbTRb2=@4cF9!DK+M~z(Ar*v@%NYG$c);2an%ZXg6w$}t6ip_u+1v&0# z*hrSTEzCWZgQIpaQ|Y!4WTavQl6-4|y^@OK(B#8-5E?w;cyS;}(CJ9_)BqP-4S5JQ zGIHii9~@1FWjSZ92qeRJGZ#N0BR2LXza0{)Vu@&vZn>9bw}i=FaD} zl`4wk&tC;`VabF12Z1yRv}DncnoK%iOfkH+8E7Y!86Hd^x-djzpo<_A!=R?(EYht! zg1D+^BE|iKE?v73{}{jLoVmG^!Cz=>{mzffd&w&g?x*LRd(OEx=}bD)z$kX9nobC` z*f?Ygm9(_`F)Qp*@ILqHh$Q6L6JprgklB##9tuR6jE3&sKvepFSlaf+6~yxr9GZsJ z6HCuzBP!$tw`QNvcxyDCegb#$>vx~@tsb$`uUdFO7=lcvn$Rfoq1fQ`h{|JVG{k89 zx8a8F1C94s#NCS&PS|FsGJE>P*S0Z&WcyoPR;xk*CsLj{%120N2B4ucG6Ez@a|j%J z30*&mztWr=u-`_3naJ2<+=x9Y=goMMSFOh?9(EbLhDX;utgGRKFUFWdY zR-r)p1v8M>w#ZGO<^gey1cOa8k#stPj5ne2n0kc8Y%m(EX#SA{5yC|V7yFbpr$q5d zqK45>G(is>ZoF2zg5JRits4$85v({IUo#jarer>ZyIk}~)6pkieD=i;gTa?(V1bRk zS+z_A8VkoL9#Kl2jfM~vsflbTbciF)2IHX_*+97QW{&YnqM>W*80I7zct{r4;4x^H zNo7(+)mBazz{nRe6eI{5LWi2eVzdbiJQP^`!cGMZ92A!-J0k80Z__J0%cBRC&+bIP zP;}sw07LG|TF3)#LI(*SXi~dl)xv!BLqg*_>$_irEQ<1$iKND4v3s_g&mSE{snbNP z0bi5!CW;L(fs4+6A8x#YU)+~|KhO{~cp@TXXfzUKSDCt|h#_6e$Ff$j59}r@6-U1r^`Jz5s zIIc}A5e^}RhYCrV233dWpn|6)EU_6`g^2aqrelp4R&!UKzR)8+qo#_8BfXEMY=tKDwMWF*5}kWtVgMj%B7 zPgyF$2Ex&9h0#FckE~T0OuLobgSnKa079GzPE7_~Nhxo_V65k@W|*T4`@eqj1IYN* zLc8>QvY45(S=l(bnapNhsRT5nwF9CXhZ#^J!VoGn5;)aE>d{6OA6FqGW-8=KCp?%8 z?%>(J9P#h66kXSB2OLYP!oTPiI;+8Cq%<2q0~t|fiMu;2?(LYK zRx%GYOYyECP@&;S&Qp>}QDrNn2T-C1Z-(xr;deiL3Nq%4`K%Mp<{fL{I5oesSj-nj zsVV+MW+LQCq`PZMC|*U2N1>$T=Hq+8lP6DttT`OFQusu&!Suyc z3T7pRl!OerCZi390XAAOG+69-A~Y_$4f+@D(U2?n+!BVm+oOk&B)bw;L)b_l5(7m| zOb8B9-tC|y|GfVhk>Rg*Jq_teqX!?^MTGCQat$N7(-<0j0V3d zUK$%EBet|an+?H1_io@?C*#Ed&|n4CemAY64lVu^avN+m7!Bfr$hagn$fan1LXsqy zbZ@j9IQ~?SV2tZtcr$o@cT@fBbIbK=Vd&ZD z(zi zJ9le@hBSi2xWHemt-DuUA-X6pM4Zu`Zi5XP4M>wAD^s^P|E;49()!*!kGt9IsBfNI zy-^pv8jT*fHK(l%@?2bVt!&G`AU4!SO_c6rI3h4sRwKny84%DB`4#dg(Q0~$HBe4@ zbkBNPK8S1vuD_|@O@-NB=-+sL^A2?Qq31Mriif*pqvi=3ozMUp7rZ!kx3Ps)Z^1qH=wshV16FQ~|T zc2z{l;=sw*8IJ69gGNKGNtDgQ3kB-g(pEx8rtt-A>2^>Z_pB$`;5>`I1C)sdRSQ-F z@c|8edzd|CG$a&-(kYz^XLG@lxob+XL6VZ1Ncz9f$AJ_I*0zz`xo5NS^6^*SUKOto zSllf9C&q%0KT3qz@FUCRWDbXN7y1(in{7C@=Xv;B&-NX}8s!V_6pFTGh$2q`B+`zG zMmaR>#RpX0H1S)2n)}|%NaWr0*eYjp;pSvQ~u(Cl=4W68zpQDC2 zYMbVul4UlPJg0k{C z&tM1LmQ@|^<+?))4j|iY_p`&4iZ+A|@+k$a)vT4k5UT;bzCvS#2^ZqXxX4HDwL1UW zx1#qhu2eNGYA6RG1Ol{XG&CK_4nYTw|R!b@s?WIthSTQNKHNxV}X;E7Buj#;F%PCR@k`D+{QBj zgKozLQ;?jNC=%37rM;q5xn7I_G(uPnzd5;ELOv$2u5BB&iSJw)oyp-MEJaqMye2&} z(W?%W4v{z&10tA+svB6AqB_P&Q3?W*2>^*ecE5^_I`uY>bf~Qnwk)6#Ag9qoe#0EK z8sosM6bg+#%`~lHtBW?326$rcLsm!j8FF;CP)MA>hJN{M=)1Q`5t$-D_pN@dMO zKDhyuprN^d1pyf=t8qxDxESk&O`xH`U^FBJLAeQjL)X_dA|!!h5Cp-n+i08yLAEzO z9hqj2@>+eo4$WSxJ*|Qj*}PiVAT*+-N<74hl2jz2B_l-e+qt+1A6dEd=-%|>E!ZG1 z@J)I^aFpkYpPsd11+q%p9t z-X@)ERj3UXsR%4rLMFYJMg+4ZR)#~-9HRkgBs3V21O!n;g+!`K_g6{z31~nd<6_6D zm5$DewUg4mUIGtJZ z#zldR!_Rp3QwZ6?DFqh2>=j_JJ4tF21y~6vWK}_Yb^43i(dgE4Z8f5YaW=rrwPytZ z&044J(V(!sJtj1U*4UhOTSJ7YgTfZ#PXHx9owA||4N*=5Akn9uv*1vYKSGaLkM2pY z-U1CK9~F;}4QUbv2O^<@NfA8qYL&FS;Kai_Hv5q!-)H;#j)SCE*|6=f zj_|^sbY>IVupPZYal*5J4U$yeB7=cT>o6X1yuXoMR%B6Y3=Q2htjLh(MCG+>2H9+u zT2hdAXt&zk0>al(cSOzeEpyNqUm`*chSS05GzT`sT`>znMlNYF3b8~-T8a2blPh@| zfr0R>V`D=@4w7n$K3_ z8{GZbezR^M2(6b(wwnhU2GF>fxi!0-kWdlLSP_mm$cNNwPLn~1G>F6n6lN#^oNac*Miv~%Tm2e!E8_l zp2LZitB6?*nWd^Wa*YOvpcq4J264fVm~-uEtg$Hp&n8jU?c3zt!C48fkxS#5gO&r&15o}J3vFtQ1m8Y z>`usoiwBmc7gijXpjLsyYTT7po8L&S#a08D7Rn*|!dxpms=nZxd0ff~rC)gI93?NzLC z_mrcN;QR^HOYyD>K!fV482w0^4e}>Zrj*gZ!6GtnMK)tgbU%fZ=U*3%_ik_B`-)~L zYFn0C%>PwJR5k4IA=^Z! z#c0T?BW*ThV;&`4VWXOSwbyM-P3y7%G6)Uiz_Ptwt1uj6drdGN z@^5KNX}Re=Kc2VqoO6PzD#QKBbSl9{SVegl_(?l2S!H&Rv;zWEiA0D!nyt}z%q)AF z7&iFY<;um1`gV6b%Dm?I6fg)whrOMR-bi2=-2|fH+11r(==;`-^x9mxBhaw^1jQqT zBaY>0dVE~Edq-fwm-c*7+L-TiD;hR8wMQsw=E~EyyGPlu+3S5V)KBp!L>APxjyXil z3?)7UG`@PeesV%9j+8z&K;y}WtLC53?KR$YtCdXT;m|RXCj-lBEP*l$TXbw^mUm2Wi<1f5q9L!#Hav8RM1pTE#&M8h@za`JmgS zuz{$KcfH-6UY9_0bkhq=o$KuCV%&}Lu7()6E1=N4)p7xEf`-rm7z0ymDGoO7u`yei zva|J{{K?&*(xjF)2z}96jk{&h2NP^GdVz*SnqO@{-BL6p{@9?UzVR_FK2J|RteXTO zqeg=XSVkX#f}3^Ko?#VJ?}Dg7)vzH}15g|pXbz9^uNk_cfZ>-VL1G^?@*vL3GWUb% zpzzY~lBTC*Twjm-k?-fA(e*l@(fMOIvh%Fl1Pw~%pyBn>q8MT`{0p@j(WjqYTozT< zg$yeN<4(U{hc^fr!Uecuhk&t2XEtM}z7;^eo!?%%DG`^r)mzFw}U{59a*GEi8nVVA(pj0R+g=df&`#@dm3 z6SL)@dX&ev8|_v(X(lPtT+_q;H1tC_nfepIC?Y>>wZmV3=3**hha|Z1D9XC&!9mhW zQas5+_3${mmo$Y+cg85g=@c6sIY9pGrss*6hwb)a&`_x_sXK<1j2aCC#$Xha-}I#H zm8NM@vtgIB$)z{H)v!|{ZjVo7jmCphwYd8|8ocGHpz-DxUjW3;o*ccn$rC*F`OelB zQOGgnFw&E+w(8@;8=G#@Rb^*JtUob5UyvaT%-DDbn^Aicc&^!a{8;0iiZ+d;Ed70E zK&O7yFN3n0PAAkveN1`2kDsYU#4%>L@?mjsaF8NumOW&)e*LgUW8ir*15Zu#>g;A0 zZFEMkF}mPIyz=IP0K|{Ip2}fi$q+cYkU{P$fv72Q^jaON7)gr6cBEo95~ZVaH1FTe zOQ4}U&$~nObeBih66n$r?w#Cwwm0b1U=M(A(C6EX@!k{AkS31f;|(O_eDT4GfFTpR zYp>YOE`dV6+?*?H=nw2JO^yv0XXtL{_dUv^#TxJVep#huDGgnDKd%m}q!mmjlh`ZL z7(YLqgnghO;=pzUZGU{&k6K0X_aTbJktTFpa0*i5=*K2QcZRHCB59|cOtw6?`Pd{6#+tKkSW*t3Z!!I=$o31pf zW&@j{WazAmvH==1GI(CGnKMV>@;CQ0oq|Ifs}W2jN%6yebWlwt@Cedm+6Rq(9Oi%_ z`t>j@N8=G=gV}iUB*~&qryk-D)ozSVZ#)*9NEmu`M(LBHW;+;OWZmqHsyQOo*nRC{ z=x9(w@j!}(vcUyikGrqQR_FjB#ZsxiwVEDNG`DkoZnR+Cg6-o{*=d#g>kA%kL#-2R ztJ|ATDQU3~B1%JPwKSYj+=!-kSw@j*Pn!`pM$5nX!GjLGg@N@o#yGik+ zIKXgttYswE@W4ai=<&nuEo9KKaZ4W$0}K@mG=*|S<7PCt> zbEY<$WmxK3gDRM!i6{zVDqeZ)`!FMD{LBnoPAKZ9;!g@<(KKmBc@$-y$M(~xJI*f0 zpdq0KEj=TKFypU&Ca`MFkm{4YJvo%K*g@M8<K;2izstk>Tp+hhZD{HmYBWexgpGk!AH{LE*D-Jq9KSJtf0qKWXb-U9R>45-Y%O;l zlFL!7S#Rv^ypNu2P}4fuA~pR2?{d7it*56gOFZDhS#n)PLsmsA8;rSWQeK_aH53gb zWPpY`8?_s?8eBySb6AbPzc^iiM&Jj62HGd&tkEDQ4TBs$BAFTKUz;%06dK}YD>*Q1 z6rG}I=e{o-k;`b6KZHNl)^?d9$$2OUO;8MJ2GbDY~1yHdGw}yahWmU6hnry z8EP~{homfhRUWhwf(_Q+-_G~R-4UC1mo|4^tBpe~9GYLaJ2v_52@*Vkm5$h|#`L1RJi z0Udt3>k@Nlu*_Lck%t2rdrQV_Vr|8$Q5VDXwE3CL!*?2wYc-CVaUKMI6|~EwEo@++ ztw)&zq2E8uBii-o78P`8^C=mXq}ghBo*ZyVX~>F*Mo>_6($=WgxqU7+Lt>5d@#rEO zv3`w$L^}$ZcI|c24pt+}S~hWgv%c&q9y@Y-Nenu6EJzGGvl@p+@G**GATdR;qksO{ zo!oh?s@d7^_5hUo|D$!~LybHGX$FwT+k(cMTkG3fjr9*?Yc}x{Yl4Ov8Mi*c#Tr-* zgNB+71{xVM5NO{R5QA}#=VW5wB40S zS&x^TWoa`rB~VK30AdNz6AZxPHRg8}4P-Od0a7^PSWJg{7KuVf{kP^_w5HC%l40G6 zTRE@NELL9#8`Al!6-%uC+GiV2HjdXDl5t`Mgp5}N4N4fxNCJjM3!NmdtBQs=6dQ?( z?6y5TW9M8g8k_41O-+XruUq{8t;QXF0u+pUkXK$SDU&o7G$>|h{+iS4)%WvuaZpk# z#mR)s(MFNqZnx5AyTER=LChTM;kq^*7RETHlBJXXU^izphF40~~}bz!8^ z;n2Wptbe?>wX(9hw!FeF)FNu&t4rd2UgWE>0!&Dk%Sy@1?CC`qDrCs~tDQhGWH>Zd z6pbU$sDDy#NxN<(Y%I(%>i=A)B?C{2>Nnf1g3*nCHXdchMvRe&Jd%+zobU{OBO<@e z>GCP17px?L#T-nUMYByJJ0A6Jf4m(_!Ar|_*G?LSK4e2dGOJ=4 zK$l528k;N2TYK*sGC*c=kyo3XXJus(JnVLYx@;2fphJxW4I@G0U5f@-ST*jflYO^l z<7H(-4AuW_HMlyRC4PC3l)jH!Nk~Q8*T33eL!Am9Wj`v@127=e!Kr0B9|0)?&&G_V>Njq}qnWv?+5v^*l3(S_e1e0mf5Ssn`|!iPs7QlvPe z-c55iWyWsEvv;iqSJ6NPBDL8V8Gjy`NWz@TSC}3!#L=(6xZxJ4r);Qz_ z=df7YD7y)ZvVe5c73)y6)WNT?`Sg-OV|#WyhHWXW`#jbjGuBuR(t~85G=mYR_pd05 zgAg<*dl?z4F{R>__a(ZnQaJtsDq{p}j|b(g7uOg!w6eI^SX|+0oCq&yXbo*~ZIyz#T`@1x#KWMW zb8Hq3scMk(T1o{atOmh}L&Lln2^ufX;Vb^BjzA;yi6i?!K=F%dv;5~78W;`G=o5hM z)6791kD`&s@;F9=IPVsL4;n4{!P3)DFJsAC1r7Kx#zPR<-EHoH|9oXlV!%OTTWVj{(Z9&&XX)p&is zEc~b$_nhxQtRnc)9r;%Shbz#{6_9HOc6BXUJM6h z*ajXhXkAYY7b!}bqPS@nH5>MfzlBGPHNK=NG!BAz&`0DYDHYC~-VB?h@Wms74U?|) z_xmW9U{oLUV{h0jyqq|+8MM4#X~BU7H5-(?&@FU~a?cyZ=l=D};6oMcy}1$;H$Nh9xM?#RZT#L=xJhoLXppxq zE^L`olwOgBV6*@Dri2rijx}M7e`{$~OJ55Z3zvY{?L--Mx7}M~>CQq2UAaHYX)GFO zy{@@EqSbg-g+c7+K3o|4Ai+i=yRaxJ6NMmZSElhRp7aq(iadST7t7&ilsB3|(2jy6 zJB`Mj^B)Bb4Khqe52*N2+~r?kbI6guw4lU<9j1+ldkdSf0-aov$&>KcHgXuyFX zLmdqF=DFwp@YCOsD|&K!SJK&pwAM$Ak?W zcp#Z%5%M?ftOhqZ?NzOQf0E~l5T!6^I>cyXez%zx2OVb2g4Wq>Jm_UVnn1LUH7J5pv#{((txbM*$zlUE zD1d$Nu|02%-y&$(o@J!5hF!U&tznR1-w%8Lx7E0-v!n{iKL|2o20Nw_-fX62D1Cp2 zAb|K`6o+L}K1MwQ?Is(J?zn%MGyADLKoKC5A)P}h)AgJDbN zZt~UL-18`U_{rKH=TiWN4D)9)%$%Mkhk0|*dUtB<=eevw_+2w~{{_xy@p*id+4y7wA+6I2~?DW~E&p-a@ z!)|28-zBh&_BF2n4n+DPWMg|n-O^jc+G1yYQtge#{C@Sq1A9k<4< zNGP!PEo8`ezw+)L=Tl$+PB>Xld4Q$$S@T65`Ridc@Pn;20r1Zi9zyN!K&3H zhD}=SH1(JvAN}z8v&)^6A8v1--3l3}CP$&yYluUk3y|dH{5hw4ltIROB~(x{2u;l< z4yKU{G1yK#22m%FfKUV&)@t0&Wi?)?4TsVJC9bpFu~7r@AkQ&xHY<+aWr4gDH5ok) zAvji@Jk?<~iKzZ&{-G6)ohRVbs8eAQGVCtX$KQVZ!4_ettJzDGtH*w-v}3R_0|UMA zcxGeV&-Z=PZxQ=JMWRubX}Mo9PS|j|H>T4(OartZ`95p_251<;N8E1uK{u^}G?gF6 zKmKxZ`T1Au?FJfJ`8qc%UoYv}k~vs1m#eQ%&XQ&po4SZa%*G5@5um9@9v}=7im82| zC3ATwNse-IeLH8Y;TpNz#?jiPqdSzlu)-}%QDAH&u=Nz9AzcG+)5p3X6 zwge5GS5rQg2sd?Sa%E#{d(V);nhA4mfk0-GS7pO=0@)nbW~;76RKw**j5P*SImK%D zpbAkGU8{R>X~ zCq8Svdu6Awek5Aob8>P{Z*H%3KV56>wb$OeyhSwIX#ep3;h^*Lw{0XeI%YLkDWhIv zB&|t*cKFRBHW1Xkp^PvxxV(`%*WyhLGQDkxTB%{o%a$NeAsaUjmk}J?t+|LSUN0P#i=e^xgqN2DfE2fRic}YU-!uo*wuk1se*fc4%Y~xU zq8};^1A|o<&Q8LnsT&b+xG?<7iwh@maEEq<@&QTK6nNnEF%2CjmCE;O@IT!hoPORKT<(pKq`IMb`fpTU(J?Vn&djtERC-r-NIdXZ4(Kl&dqIn&@K9b!PU z6_J939BD`y70qqF|IxXpG;Hnh^K-~xCsP@X`wXF`g*x)L@NqKI80WyD4;vaQE3jc` zI8U03v@j|t&qc$D8L-H@!&sw4TI&R3PS=%^t}nrX%*OuZ=ODp2D`=QlhY9OpY=rhV z_{ArFpd6=OFTcZNopTF zgv>p?j`*5}RHdNA-kM<2Ma?FclsG~5G&i+m7{o`!mME6^jIPB58I}lff)W~M7rsN9 z?O1@(V3m1WX8!bnM-7Aqd7X15uzcv9ki@z%zL^DNI2u?D-_jzgH5^Xm)ALjV4~{2v zhgPFx8PI3w6BrwBe95vp`xpt(fDO(ql(xdS+}{s2teTv81_j2`9gUMfqh24LzWsn^ z8?>*{;2Jbq-KG@@_hDnu?$z4wKKS*yVR6fyQmKMp!fqgta8f*o0S!)xm4FM5KrJ|I0ote?l&WdbZf)Sv#t*=4 z(vZ9jvTqW6LWSx5j0R!oxp)!=Qbyx;GVZd6Qe(B9qi0AI+@oEd0ga-gabh&!Qf#=y z+2C=Tfp?K{@(xRhprc^{vr#aIa#Cl=l=Y+8%d=dswZX#Z_|VXx^(xi=DGsG`-D|X) zr=Pyxv(78Fq_~y!I)os{gHDQyxD;q2Rs=EwA{v4X@2%8W8oxa`4EFbm#rD=jN8S`C z75wHfRAg{+_?1Tyw7B`&8AiiPg+aqM-86a75NL!_nU|Rw*ucI35x&RSK=_l7#FM%q z3n))(%w+tJR-<8PlrZ8n3B6Zy97j}-d#phiYK^0D_^rCF$;Y%4o0a4^X_AfK;!cD z5gOY}ng84-7SKb146FvCwdjYKePFo6Yz9$>ITV%zwH7U$lvgP%FO(`(pxI~EP_t`c zD51tRp#~92-y;o{PiWNnA5rZW3a<+dT#AV(hs7t$`{ko|e2K3T;YN~8D@cjZrj90N z0(JeA5dn><&BhX5U;83%VmKz_J1M)FoHUJCLuecyTQ79oQWP||#g&jjr~z^E4PH+^ z%2X_Bk{r`f*z+0FLD1oBME4{LF`R{rh8Bbo8l2Ld_fVRk@mcDOmO#TgultO~GQ39L zggh55$GkI2gV_oxf(@`>)2s?+WMhNMz9Z0}dXEKoY$gi5)JC&oVJLXOMvtZ5`tSGq zn2jDg@@*6}0#D+_~QU>s~K~nNT2Rl~P zGn#N9HndR&Y~*EE0**V6H9AaS_3jC1*p3F)as84Q!^cXP@mNy3(QsutuqN{vRd*z) zT&~c%`%l42m5Ow%M!5_%Es%f<$mq4$52ar{tRD7Fo4qY>G0 zb4ve<)#$wR?iN!Fij1LPG@g0pOGL!+x@E(+v@b=WNa^T4O=hy)pM6m_mNP)CuCWR; z46pGgEDFc%KDQ0|6LK0jlp6M=e|T6W)~HuE^j(s8!Uai3CcrcFiX})@O|gkx=oy9K z1QUyR?6hhyyJ5M>VeNW)tFd5BV=dvo;40+R5QW_QL=wT1-EjmPtjV*-co(^d$Co2v zfzB`*Lc_X2KCM}1gUdY9L?=yyTgP&d<-o5&208IfpY#YEURv&wM^W?{8k$p2E{5sRJqz=+F<%w`3PBaYtDc*ZO^D+ zyu?;t>DB858k`KI_}0J9hM&$`V1Xj#N@WnHs%9p_ z2BVSP1qnJ+y||6xBfOkFYC}h7cKp93kDiDNbca^s!)GqH-Y7mpTL_IW4GkO$MuW`x zXn!r_UPThgO=8j#6=*%DTlRz z)!5>6Pf|mrx^n8CULTqT5goer8n4Vv>hH6mCM6tmHC~=n>WVbv1Rlmlcbp7@N^e)#K#Dg44fz!>8P~k%C^OgI;h^E)Cg4C}I2?_;wi>UzaY-wH zz?SXTD68>|hl$t>Cxcj{;C_H$z-&bkM6@jh+TfSp$Z$5ik)4x!UE2biJ zx!#i%)BJmNi|@*4peNYE0w|mSOLAR086!0O59qXlhO@v+(PKGl)Yut~y1a=c%7?w- zaA-!u%*Ludz+tCf#D!j5^j5Y}8o1c@E;FyX-VF;8q5m3_Ik_jMHX1A^n-wiILPMQM z8j1I49;Ftd*Aix9VfnH71)JXbI3*j_8@51!IzA*a_I%UcKqL24G9{7oR1s+GBd&={ zrm$YQ7i&s+x#?Pds-=70WCH6;B`e1WG?+GD`b^{Wc$jUI(13~}7ZhyxHLQlv&_fS2 zIzpq@!B{vNEEu|RG{Ho?huzRS+eTJOE;AEw!PWWjo{=Mg(*A4~`aD0u#ozwipy4Ql z4^NAnAiFvln@Dd+bH&D&n~kBkwKc8fvq-$58HirrW&SBG&a~-hxEsjIkR&*?ceG|i zN6k)}=9WMaAY)F2Y54+^eE$LFK@|jAX_RS?W;!c!LyT59HEiGKoeFYlVMh) z(XkSq?x58n4jn>oc4jlgeF`iia9o6=$O4jswYNr0rlm5mM$-s66ry)-#*@ zKy0g-%J-L1ddNU*`d!rQDcc}6qRb0xu}B#pA*QA-Z>Aa1nvh7mKvTyo)|_+=cSP$t z8wxpm+CiY9u971r#THu`4$Q_h>$sum7746hUT(c^enY$RYAB6t*ClK~irA<+8pVu8 z`Oh4RLeh%W{NR;24rqV`heCi7bC~fO z{?VKK{o;seGhUhkad9O>k@x5IC)zg}%tu^sDR~Of`r}M&CFtPK+*Bx=>6q+UHv^C2 z&6ypN6tnchr;uf_*^6SsDMS-=EUyU~Bh)q3qM&(_*6r_;>e2iqsK9DqD?Cfdiw6r# zk<3P*aa*Y2;%zs%3ec!|)$q%`9##V|yzfemv|(r%Nq=E61Xs}uI7((Xz(T5q3Sz`e zmpn^rZc=~$a|?|<*Zq)lB2u)?72;!=456WXdD8rRQkEAlinD7A9YD1Ks0 z5*moEiE@@`LsavjuI!XAyN&|^CM zM&d#kO++0Lp`wi($gI;P_zE&`+(e2<* zm^;s+Z3G((dNf~N4K!pmvLXQCR%leVN;ak!SilFyLb4DedlTd1>3`aLAJ>9r7(S*5 zA#d=$>>bG1!bWKhHPyrroQwvJ#J)y$!&U%wGSV6;JC25Xh_yALl`>}vG=xTsuUf|J zobeaz%#KAX;ZU^fk2=Fjl_F!~adTu-PH3G%eE4C|XcBMAKzwF~BBOyE7k46zi|O6l zCCg~w;FMsa*lZ)K{%duHy_Sv2S87;|)x72E7suYdP#fuBsKb`M&t}38^reZn%mojtW-m&3lkEzU z81Y&;c??tvr?vSyn{&n8riK(O^`?Mq&3} zI|wTPQW*>sL-e4b$*&(}G{S0V_*F5kqj6>tjDtP-ga60V4ZZ;lFW2#Me*=UEu8Klk z+X^xe?~>4fjR;1=e(c&8&1zhAYAs87^=ln-D8n8#H}$f~0~Mn~Xl!fw|Qj-@q*%y;$vYp?NgZzDStlfc*j3(jmb zFgp4>GbVl9K{-zr!k*CjL- zk$;Yl*$1tHg^*4-seZYXcm6NwRJv6kb2EA6ZwkiTb4hDxQ z-~cnwu`WaEh$X&U})f57ANdc)CtLMg4a#hnb=LtIIt*K75t4Q>1p4Y*LW zAtk$0q+?R5nY^eghoS1W=6{OY*4&IbxNu=Ll2oE)eTpd06dY-zs~D73J;k2TKue3M zxf2@hd3+&qLxXt-jMp0$Qob{wI6Na_Q3T0QbzQ@7Ejk$4sYInuD)U*KyKAfQ4b|kM z`ORrkvgi;cygKw<9k1%j7Q^FC-Fd=|fBCIht;Rb2K{aIEWfy`K zPjfjJ+>LGQmL06RZH$Wo^D-Ic;;rTAfz^DL-Jd3g6)=Jx* zrf{?q(ssO?E@vZr%7v#q#=0zmBe#xyT+4Nt{2I;Y2~rL0@14f% zU5-6ZL`HOyB(afQn!@B+jK;K?4YL}&YyzW_UAl@5)%bvhjf2{q`mYHB-RQ!p1Ajo6 z(d`k7wk!Z0_V6v%QBl%sUt91yar;1YA?DnZXwKS#9@+aajQ{B*o}lnRWd$CRH#Oz$`3rV+%)I13<3@tqBwIA zo1&<#u@Z?%)1l!{1)>o|py;QVvDiy!+}~5HFJ(0Hjv1*Q!z_U`G3$g&NTx$RZf>?k z`~Uhish{sLchJw~%WgqxV~KJw5gK;QY=A=|BGnU1jtywk+g*~O_!M$p$Sb|-Y^c;5 z4ZgU^i0{Ce5#gJ83~F3ts{t1=%fT#1*}#CY>$wU2)z3cp*`?U;U$LWtQs@vIN_L12 z&wV-_xzbm*#M)PB(JW&JE&Glqj>a(^o(VMa_{hi*+)$)Gw3no3OG{=Yzc^1#5 z2OZ%R>?Sr@l=5cq%i1CyG+0|yaEuM91{!?HUIqgPirknAl5eRq){gRbA8VklZ!mz} z=r(FCuOPOcI4iTk zj3vEELPIKmMt5ND#A-H(HRMxT4Lr(fLPJP#UUEMcayS|l6G%w?ek36OYTGe1)S9vEr!O46=4ix7`hwUQO^P-yVmT(0 z{DyqVt(q4mb9WMJaNg7+NT8RD4dp~lLc^|pmsqKAh>lFfGjRhgUf6*{X$?&6t0o&} z0mjf0=ZeFvgOZS9$!*?sNWealOb)=F-8>SH%kvumt3PA=kZ%}VjsxfF&RZbw~6#tK}g zUW~P;?G{aDHS+2xxjE+-(+tNw?+b$lxpgJ742=j$f(&WirLnhAW<%)BY&53Ni#_?W zZ$IN}s-<8fGNKAGI4uhWDsaIG5$W}er@{P*t7xG_i$RoY^5oYY>zrtGt>5ZE$EqX- z+-?XGKe-cIP6pqNa=#dmcUNNF6!Rz;4rAn&dC=441DEz(x!Za^(uE5$U;@2wTs&v; z6~!NDtVM-8%RbR0+Bb_LjwN+fAW7w4PLXqzqgjy=20;gAgNFbk-ZC81{oHz=jix5C zhL+B{2PCNkFv>Nuq6ZsohlGR)o8j^h($*R7Xm!Y*0u8enLSsW@BpDZ(7KyxuRLR3A z{`bU*VhxrRyv3|er-!^kJ31v|Ar!U(Dr7D|!wz4%k1yj}lsY|M&uc2(B!fuQ(bzmr zL;i%ZQX1Js&PZkoCX(E8geF|d+>Cl?dcX6+J@Y2_M!9k?4IM|r+=#9mi3wF|mD7+c zXuw8QBV(oZz1pBnKD68J(Yk%Z1D66IRdr#qav4Z5B=S&XySOS6iI9U>12!0Rojul& z*1~9zB?k>5A-M|~)8V8b1Vqpt8IO#H_al(|TgvNtKxr3wQDP0a zpc6Z2^~_0(sUiw)l2Qo8pU7C`;dsEnpHy!%t5fQsQJCSw@`6KvBu^qfPO}8bbCTb_ z7Hfg!B{Xtnsb;c0cpn>MHAAvaF}k~CbSQ-}UPtVQiRatw#tiK|J3p^rG*a(Xb;Di} zSel4Kxl}mAv1IAq8kG}{N-sAolGcq1PUPeA3JQ!3 zAaU~n5iYf>$S^j%AA4$#n?gg1#Z*-MtHm?c5BLiooIiUQAxn;3xc}hdU}w#eVL6SK zdcy)kaO6$m{wrVc4+&dL?gTV)=k>Fa2;o|nupTn@6N;AIPH0@Q)h~nc-CCnHR1Dhh zV?jFoFfe?R@GD$(7pI=YMUF+W7S*R*Ro=^GjK+VVc|$@vIPi)M`Wz9H%Kn1{Smb_+ z^x6*2fHlWikA5c)mFCr-V*WHwEcNvfEUllfq;GKZI{}B%Xe0St%Gg1C++N6N%x*Qr z$)CR8&d`;Hfd_d!^-(MOVU5oxnPJi=E7K6;`^6>|U=7=(3IYV-O92t5jH9$Qfzs@9= zF`J=dZbr=>tG;qCBsz?SqQkIdG9pmLUOGTwga$*S@(D<>Mx!xk!@{6D=+uTFLa0G? z&(N|Q_R$c|Vt3_}cLIP{IsTE(XYseU({n$?mmg$Bkmxa|now*!YkO2Ycb|MEnt#aj zuuV5hMneN6@+qU;{cLAPNP(97@2{L**mtqrarAu?7-y<0L&gT-4OCjv)$v%2&h4KX zjVaoE7Cq7w7gP?LZTFr^jk-YJc0!x=`trX*JA#L}5gN5N;ReOS1uGi{3-aWa z8ts?&S^s`DjgC}zPd+ib02$~HQ2YfZ&ptZ$pXt#LlFLY4hY=haH^~VMu>l#Z-!+ds zESzJ5@HFxokwGLhV|y*wfD7Ay{=v%mnfMYK?*|$b7%LQx42vb`g@^s2wt$@%8B=H$ zzjGTzPk5*S9EGFZlUI-GTS;2q)x@o0QIx_Bz12+uLnEfWX8m6Gn*NEI3&vi1jI()N z&(S-O@J_j2d1~boXs`z&iO+qT74})-xPgYw{1^}SZ~MV#`nl20bD{A4Nzoq}g9C?f z%swXz&V~Orvi#qYJPKrt50T})VsR?$5e*$n$A^a^12llchhw}>nF(oHHf%KTD?cZD zCYQ5m?&VKQbf$>2rdJ!2!P&4$s=K>&c;FZpF{t_|U}Cqp6w#3tY+x~(tv1!5eFoO) zq|_|zAl9g!y!zq^M)?E?fFdol@kLru7H&Al;jpK8WjIdf{!=}mrED`JNe%=qa>VFg zM)vrDt)Y_g3*ccpXXQnALX%sM!v@9$KeKsZ-%LgW!3K@)t*#1c-0J1C_qr z=lUGF(^%tnh8FP{PDjneos5X@>D>sAQV)6XF}h8vx$e~%UHhhS%?<=?zSgm8vqQZG zc+_`|34~wqX-Y9GT8v;iP~w13NHzcMZw4mg|)xB4jHFkSedD5ii| zgXT9p9$y<@sw;z$#TU)4U^hPEdr4x$_Ck40%Q=7sIB5O)yVN99Yn#unm> zUJmYP@Ws$giw_#Vb9XkaZCp_p*2s#XXd`UsKQP2`z-gfB2X-yf*bx=2KZ^VT5~VUY zUPLHZpI8F=wI~L^f~9u)wLYkvO1Bi_MJO(XOzUr&AfWg zxnJibr%!}!i$)GF9B@NZD9u=6gODgQY-zB7ESB0)uoH`h;8q8CJHqUW%+1?cF9f3x z+Xie3#Q|=FH85^aa7^}UYn@*@1RO50=&#VG=ZZI4+iRxHOjKdVuOT#oE!6li|6}&Y z>JJ2oq+nV+lIFBa+#xR+7J&B9kFG02fKsob9aYH+Z1I?Ef1}1|BD1icx7kcadE>+2<)h2O{Nb)Z zt%@7_(hQrS*8wq<7oj%_4JdB`gHmeN8{KY)aq^WW#wa)2Dlp!~h}Y_u4tN@p#DKjh zggDM-c|c24Hh@-$hq6Iy3V*@`WFz*@vB1~agu`_n6!z-y0ky|aRvAgzi|15lLlL)( zNlBmn@p4BQ9tH6Vwn~M_!MZ3wLN)F8B*Vplk$gUq{nM$&^BA}bU*iEwS|{Eb6IB>7 z9LyOlK#vebfoh08ni+AByJBs-)cvd5SlVNQ!FEaaq0m8T*IQrq;xhCzEH{^6dd#>h&CeRI~1~B5hB^s%e zOslRh3-L^dkOCmnvEhK*neC|T?T7*v8}R7ZxN#imeMeLc7H%jhI7KWJu5+UPCFe!Q z({W`nF;M*U8ADaeLeI;0n5^ui=J7sr0I^9fEi|^ofMK z1;&_Kr_uclKa>&BHQdm>VyCdu(EZU{*HI(?6EJp22o?(?N-cO{ib0`z6nlrB2Ekz6 zGSN*3=K??p4>UjY2cPTvr#GrJfF}tNk60q?yY{Wabi|>5k|2u`ZyIhOOT8}8vU$32 zPeTKV|LFrwhv5N9?4~wlD%$&w`0W9o`#>yy7}U9;W?e#cpkQV6u&P}Un8m4gx^!5Z zq-oqs=UTb7l|u8k5-S2vujB=3A_XLIQhLA-D>(PC5j{t-2p7)IoK>5L0 zc8q`;ei`6N81$1rXTzZsedfWb1}Arkgyru{!Xh-rmiL{R&003Vj4-48nS}!iLy#*m zZ0(0eB4+43vZE1wY^=5m%&NFMilFCcgeGK76Kk#&6-{SZ0Lhz+o!?rWV!ipMSj@6o zBSVt5t^{tnObwh-$=pPma`GuSC_}PB5$)w>UAh!HE|rL5z!c6N-g_DM17F@j^iE#NRaXX;*qu_E&=Xk0F`s9ya;>`2!uI+*LCx> zMFZ;F1gGxCQKWWLM^z1wD6yGM_s*+Xk=_cA2W#d|T*d`s!nGYbB&E(u=dWD%P4~Q3 z*v_;v=`8c|od(XR`JGn8!~BV^tMKCIpDA==`{<#V7d6op%CI9B$=+TjM*mZy9Ga5e zV5r{t1w4k=@0+iw)DV`aR-g_Tm3Rz>U^rkyDk+TM!z3k$G2f#myyE)1U}zS zMSa~-WyA2x?;#Eh=5j32*AT!6b1?8UE{TWtHEON%Zv9oK`-(x(r29~NiV8D zsl((V1V26f^m|fy88yE8`EN%L_+bPwJcS&JSJC|p&TFy3+XBx2^vggg2Dy9vC|qon zoRs$sC6pW-lVVGR8VNXKKB(7ntN7@6Gc;3B<1#nabwjOB5+1i;#80mMN{mP~xLl1_ z+DYMJ{)D*`+i9E5s1^wDw8qAIgZ&0d=yUMA-A*?PZ#tbW{gf6Vz1jsfycU`*_C?Q! zV_BM+k@T>ie)9e9N5%`vSCpSUJ&Ye(nU8uNsnLP~7hbey#MX#Y7uMCCd`gT(eo5!>web zLOZ9`>^%9BoMKo-QNRwNhY`dXnfh=oxiB{v)9*t@Y_{r~;=y_0z6oGR&c=R7Q*e9)3oktgL zv@n67T7}4>eRWbVn^^ZxN4jYsIlZ6P$YvpwJQf6JcHe($yg5)?>&exronk5QsqU@ z3|`w6c*qvk$-ss)#Ih(Ul6qB++$c-Oo){E8C}vVjH{3E%>=Zs|azL9#p&A3&lq!ix zgz&dOr30VS3<*bZyO8$lH*q%FwLVs)B@yc!a{$V_{#(ZUPu zK#gXbZAodyLhJ1}d#%lURl|nnXET;>hfuY68(;0JIZ%n6VXzynS&XFL`efv*Q3 zRVf=TcU_ka7!W0jgCFn!xmB6^a!Y$buHAgo=#XVg60nu#a+yr4iKEe8WIO|NGC!NoXg=~; zwl#bP*ekaLFU%2@+89FlU8+A5Q8lAqH3qdjp&MQ$G>_Y}WbXy9rnI`V-~C8P`l znXgKh)u80aH=EsVFAs35oz7ubTJ8F3UNUp#^Rx5$3<0OPpIgbzKK)20YCcl&AeO_= zdi~0TM9vOhojX(w5G?45?!K_)nx1z-V!@rk4Be#4Jc(%q#rwmQ>k!1B=+CtnJr-xM z7tw*&J8kzn zMz^T@4AvBW2vi@nV$8gd)pg*?3cxTpvuWLKsj-GVsdXEz^H#bITJ208S0gXcAu}4A zD>FBnTOr~G2|uAoVRnu^(Ay+XT0ujAdZgV5(iZ_Ua6_qasDV;!ZJq=IeSB1@99x9g z6faTVpG}q6Nx6<0Y@m19Lk-j18}xCK;)#)ry<@!NZx5-(9hjz<1z&|$bIImgIaiv6 z*6PEmE%{b3pGq1eazaa(a%7`+{#)z3-OLiC9K({At_iw91wD|Dxp@vUljkxyc#)N; z8YEHDwWdf30`f(Kwnq9MO@&FaDiv`AG(?IfH(?G=%?Z+P)NtOYl z!cWJ&Eg8U!d)ExhE#3oOMk&9zwYZvIZR2S&UGi|t4`u*aB~G{Fv+Y8o$@E$YH4z0t8PtJ zZZP7YN$1aGwch^o$200I`t{?1x}xfQTqzh+EKzC#X?a zyw!ej^|obOn4^ijnHQ0%*&5U+?MVpxI?Dkw=~lZ@Y*iW3sAdoip@oZc4ke5lP=cqY zb5vLyezBPvuy%f=x{-LiAl$G%imC=a=n*`zfWtj%aOrs*6smqOUaG`^847Cd6kaqu zH3mm=d&g~!K*9&F+<^F8)fW8s^Mc|8gI7F9_VJ}Pa>&y`X%uio&$n5|lS}7V5SV)* zr03KRWI*gZh}|oKN0KHh4B5A?5k_|^<&YYt8t}s4 z2SG3IXas%vlX{$RNpoCfTkZQL4y0`@^J9q`*b zMO21(kahMa&9UJiU2mkf@>P)4QSvNK2Fj30!;Ys}2BOE8jlJJt?W55`M1Dvh7ejQ$WQ zx~Ys|EHx#<3{5`1yL13Z&s5qg;*yXdhk*^oI9B=H>^D;F!0ni&$09=<)zw*k08WUg z$*kBL&ek`Bm=V1mj0Am4pxM#TjFZY{81iDFM~#>`pwlW0@?x#4(jQjbXK3W&lK5$5 zkM7>65saYSQ8+bt^ox2Wb;lmfch6kjCqSNE`Ej&@nqVuwoO>C*_OtK zY!M^@Uf6EdEPr~ddb*XxHLX^m2RHiTR`WdX4B;J(81a;5&U+%%IAn}msBr`}r0;6` zq9GQ)A> zBcx*+H)T#HU~_xveAWCC;S>eKf()7Op&tr0L`jYlL$`8--=@GeCgW-xRczOi&VfzG zL*p@hEFXhI&a=r&x*?)6xgqeEgX#U{YE$k;hUDmDiE_q?`Wwk60$Bcqd1#vGW(v5~fX)INLS3|5F> zzzpqBs3j3%m_0FS_$)gXfSAzpgaZw?pl}MkPO0AI?r z)BVY_>032CO8Z8y8iv%HFdb(IONGJ_LO+=Yl0ja(AqJ_14?+#q3-6FZjF(aSV54t& za!M11!wjRwljYO5u{aeNIgB1kjnnJ#@GNyF?T%oFhC=*J&a$R)3E>jmSej^Pfm~!w z5sVtP2ux>TELMh-3%NU)ye%>A%il0ONJ;pMgd+a_>r=%R2SrbC5{gBP%GPqM^DEa8 zWAd)reK+48kl2|EQ|v(lWeIS!KrVppZ#A(1I;bw(;8rz5_+bRe9>t@N+uT*l14g^U zlsHG~GxP&%QGVZKBb*urk2ckg_`~flpy9V~_xSr7JEmywf(V;d$HL#}Vfy*ep@@gr5^9T< zfovEz3~Ete%*loyx*3(9F*P$aDqq8n{Eh^7A>2bY4dPf?%vd5xpK5IGx6`< z{v91)c;+M@J>NMlyG_)f5)Txvlaid-fBq-gYOc- zz55yN7%%WI8arPj7$0K9g1bCNOO6KzGl-)Q&$ z=lc_k!Er16M_N8Ua|`2SYhQl%EEvNvj_b!V{v*DI9sdI3^Ue8(y(^2AA&8;`kzd|f z1b)Rakn=|dE>a?7yhSzzt`WSPgV);Nm0v-SpWy`R_a_55bAroUdLlf}HE5sroL%~! zS7g|0gp_x9XOIj*5JJj4ylbxvNpT}gxs?#%oIx^F5l-IWTYquYG8lQpU(UBu@(#*# z4I{2Cp8D>0-WQ^IlR6Y}Pv6bk{jbK7&U`%n~`p*$bf6B?8rTN!@i_H zCz!d$quVxPZInhx{%(ZLEj+|MN8>k!zIC-9kB{8L{>Ab$AAiRC#Rl7cE;8Z$(5o>4 zY52feWKnM3vF*sBql;JD_EVC^ALtU1l`4dv#Y;T%`Hwe5?){=~D#cy8@YDM+NW%x- z*~EL><~8;1b>*uM_w`)zU}sDnIn`xIMtLo<8r+d%U*=ixSS329`!&jnW}Hz(I1 zwZBlKcAF-Ze2=SssU}!Jo+o6v7nV$OoQb3DB~EP74{7im7dqESxW-dew~@QX8w)_6 zr_^*0qQILW5E|Q?yB*iS@q}y820!p2dQUC4FQQHPPQ`Mi`9pkvt^t}4-L8R|M8r@c z-GCvuNYyRHKNgC3qE*aL5qIh&jmPlzCJ&}ukfaI83Q_gviP8Ez45Ktnd4WLC*kMoK zEja|KC7o-0P#FvW*Ky8%G^{g^dOlc-Yzp{YO|pOx3b0+ULYz8D<2?@JUu{o319^<50&aWQODMlcmuq~m9bBchvL*TejJog7 zHPmYNifWIdG%AkrK_$lL6f5Q*3nEUnM^R?TuEBM74LYyyfDQIq!!@YRuA$x$lj4Kp z8dyAvfgZ@@E&7nlvQu2Zr|mXegZ+ns^`h4CsN+$&kL>VbIWnOOB3`uoCeQB-ufh7iTlce0GU;Q1U!sxnB1;$^EO!}a-)2^hBdLA z6h4GOJhf}wV0X74q8C*dfyXt(ZIvz1m(L!|Ylwte;1Z|ULz<|g^Z{rXt|58-uyHQ8 z#e1BN)FlYH2Fj@p^aSHf)SYX<`|hjm$n}`WbFKkt_>ymE;^}gYcu{Yg#z5J?c%`AF zT;tI;bwZcoT;m1byGRtcF7987wsc$cOyw8ltWT?yE=Cx+2E1zO zH8_s-8l0;CW-sLC`HzxP3ZLQ_o>hp9@u*jTIoTG~Ihoy%X$3muAeEh%-CI zQeMMgPkYiIFbcwN#TW21(DE{Q>Et2s5A}R02#|#cL|nV$+?mFFzZQxBJcBIk8S>cT ze%+94_5aNPiEdun)_=5QQk@8X+iFN&l}Q zH@SvYg3EswRtYY-j)~nZ-?{yUZ(KfodYz~5)UB8*zH2_9lull?+;!-g2p!{iS9(@BN#QW`a#myt@iYL$Bg_AI5OD~917$LzU zv~uA{dGpA^H)C<$9wCdiTjFNh@ZJ-FIPbTYBH}bBK)kgk&T}FKaS7rw035O^zwH`4 zlU7I`p~X?OFbMLLc8!(qq`(o{F1!#w@=nMw2c)4}AWm}v#L)tAk_Nj5h@%GL*b?!m z@7FH=Zmw~2bH|QF5SIbq@K{Qy@n{}>H_uZF^XLEu| zXDj6fPYt|H!kT29Ae{GLwin+r;(JD1`5QRuj+|iT(U~sHpFh1%HS3phjq+d4<_eV% ze?=O}x>$2!9^%A#k2buzKxEJbM_RnTk{2AsD|ML7Z1s>Fqzu-_EctU6snA+sunT>X z(8hy?DNsEHs-{2Y6$K2VcNO$~z|(dKPc1cB?xFvinpHLR`&zl}zpHhoMCMqsPano%Kj z4yvPUYlaqvdKtQ)FqEOf1g14j*b zbfICWK`TPTs|&n9%0vwhsyd;80pypd2!sLpK1}pMc;t~Rjxrf@4f%z2(OL@w1)+tZ zUL0B(D26z2wT3vD5Q-@d;%y28NRkC@O?jBg@W3q#gdq&CI3R$u!tja%?=~#M6oy+F zxFk~;fFTToDGpFq8!ZglWOfaJhZzHID1$@mf&csVWL)M*YJqL&;>l&f=KLQ#(S%WtXHl{E-I4~d= z=^i*Z%fQat26>fuGUOvluxnhyun@S0OfEHYFtB%FA$AQW9t_tB16;#

    -GPX%)g zCY}!F9Nd7yxS(kKFfFTVsFzYSs2CO}yT+8vHGFL70@r{b&YL%cV=eB;59=;kM6U( zcA3i>d^))2eKz*!@~XAQdXbogz9p>ZtA8Xg*qjkATBUNBB4 zlcsqZczA5MsMx*%MVd9_bq(ele}7#gIBQ(}w`UFPez`MuVbTcB8ax+)#ZXz+_`Wx5 zKuDp!y2e9E^7b3p$>w6Q+s?K+>2xP+QZU?S$bEA9l5R3s6lJavSl5V=olButvaInB z)-|AizOErRjo_?-jm=)gSpy2JYe0%1YbYOaS;KbU`afit&33C}rPGV^3(NBrLImB& z4m2VIy9UI&26j&WR$b%jf4r^{oaRGd1UxiF6<`vwf*F7p_~x-h98X(?->jY za6z_nEKU#^$#%QmvY_;iwUEiLR=g*0BWNhA3=A%7xblNBDXeS6MkQRyq1a6y z8O=_rQ*9w-bkYl%Xfz*I)g{A^Mu@A1`sfg3jghWv;F*88uEBxfxyDeRp-fc(hCur@ zfUz#k8r^w=iuPpv;TjF28;#S|oph%KJhJUMAc9}=|@9J$m<#u_@Jy26OAY1 zS=X3ko-rAeHRRRMEkl#ZI4h`Ye2-0GY%pC4GF&t$NWQ4i>~yS_HNTQgo;I7=PAY{# zCA>Rhh|%D(M(}4S@*H~Qc-A#s*YNNdJZn%mw(rv9y6Yi9UE}+%0mbJUL@aB}bgNzM zbh0~EHfaD27>AWkrScWdHKr0l{TkeW;^r*BMx(9){VR11M#tcF4L)nsv=g;aG@8{`Ysa$M<}Id4 z$p9NxI?JPx=<0H5OBydK0QwI~Me*5Dg{{4a$2^NBMmR9}+aa(w^_>DgXDg z#@}Dpz|K5lxVlDSZAJ^0vF@`CmA;Eycp;72`Ql)t-+ioIgR9hX80^^XPA#x2$ z{2RC9>dCr(&+f}Q^hWbxee$(iX5M^h($%%EXrISoZykJq7wa|r=sUQ7qj`p)aqH{v zja9#f?rwjwu8~L-w0=}zS%bL-V?vxY{AkoMd@L_ma1GN$v3$n@9C9?`BG-UokJBqu zet7iS!LvH_)#2w?zd*jV@ysL@q2j%(UOD_cb{+k`_G~Qn)4^v~LQfyQJ#PIPAR{1a zK*G8PrmY)VKiY6@gAFKyXN>}8BnykJCbC90H9uEcNO!D-`LZE%4fvb@jc>FM-qWvo zL3{KSVxUun;J8G{I8$-DO*0En*uQ0(|=?RknujG{44bq(FyM0E|SikU2I zN$MH`(@1JU*@CPA4UjdOo%H-dDto)x?97+u7D{s|6wIyG322C1g94$GCw|i2g=uJ? zA3yQI5nhO&4u1S2iEi9=__h~Bk1@0WjhKtZIMp@Wydmt@aOD_D(JVyAtJSzRct?qt+_%1W<9rCB2`oS_g7bm;5DkMZzr^5yY?wn3yJ zenONI?HR(vhcW0X03kr*f84KugQTj#eB&J9qhM^u4O3j#NF*v80jhGDqC`dcqXsYp zXoUK9jbygfYGrpZoWL#8EBSo7Wm)qD9u3bi#98Ayd`E|19&n5wf6_kFVG9n`lO7t> zFQ{EW_~N~v4xYuUc@5C`-}h@^_e&S>;Uo>iCTN_CCzBo-{0Xl~&NP%Yt$4YjoH8_C zCiRS9*Z4%{8b&p3)!QU$G@Dt>W9M3Re4^5nx`sGwe5E~ue-2So*I^k?1C(o@KKvXn z!TCof{bl%0$xbb9H*}~CL6=n0T zo)Kk8*Fa$--E5=cb<6Ff;+3|VO-y0i{nj9Z)R^eID9E~-P77*_uqb?9lrg)@7M6vH9Rml-^dxoc+GGa8ltS>Xd*PU z{hXpi`11Lel#GF0gQ-5BGVArG>6SIDmf6G*(|28i3ggEcx8d%CGdg90WK!JUiEkY~ z!?^|w<3aMHFOgA&{t`T94Ei;CE24bXIEU=%Ff@AW8my?nqXCh3>55&hv>|tm;JOCX zw5(=5TZd)PdRNP-wyLdqHyX353N(gXUn3@6UjzEz_iOOeS5emJMPmx$K0z^MXn=&M zqAbmHKXXjDu{c0qbjwb-zZ8aUra0RFa0%jmDOd-0qp7Bs38kOciBQV;XXX0vXL# zwgogWoXq9(%Zq3eo#D}t_J-bZq)HVv~VcBZ={(8;zV%n1Tjzjk`7# zr7*N>_~M3HC9_skMdvd4`82vWT09!Qx(43?cwv2wLC-_M-ct+R+KT(oAkky0CuwX`8i84ZZw-|-hx*X~8Cj zg&$A^b&a9~jhQt?nXtK*jhlz6Ye1*Bfkt|{w45nrN{d!1wX$NI=o(j6ZK(E0JbrEU zRnj3!zIMpxYu9IO`tX|Ud(<@^Ju`ymq5K>D8rb{j*I=$;8ac_rH0hZ%CZ_#s7@6P@~phB5p&Ua zqjE$bdFlbTPL9VE4d|%{^z-(6laJQ;n%5}QHAc8!BOWgs#d6ZXBUij@2>La)@Qy_) znn1P2u+>nbxS;xYnl{0OA+KxrU1Ku)avUN+oMEnk+XDz3elo^*eU0FL4UhrpCI%8) zw#pkFQTW!-%2I7Z+~ox{2G1Jooi}dDqP5G%(Q3gUlGimT8hQr<2_D6&1PwjT(73im zV#hVv>>0k~HMZ+(Ffye58Xg<9n&W}dyS@gIt@Wo$!{-`5^qVzYTfnJ|_0D2x!tWXr zmI*K@9ENy?lC_B*iqov|)EU<_U?2L`^+KV5xr+|HVIOg&&=JWRquQ_GKi6Q2^=tTT zV`^XPNBegGjXVBK)uzo$i0w7gQ>qkzb(da%!37f(sJ5#<8jTqOLKT{Th@E9ObT&@Zd;l!AcS` z2pF<+Ud3n1H|FP-mrLLRb&P0qA`I8y*oZDKr#iN2$m<#qrY7VO{32Vh3l%bo$X(;Y z`WpS8hjK#Jplq!5an9>H@eFg0{groCA# zPi#BkOtCV1$}uljwkk{Z_Jnzv5;1S2DJ7(a!_nw$#Sryt`0x-e|HrS&GdgvR>;Cn+ z#-yaK!BHVvH`LXh6Bslo8vVHj#9SkvD@SJw(e3htv#ml~g-EWfTxP3VwTR;=o`6S4 zJ%tt%zF$KmJ)mF1BV%$b`!)K@8tyJ%hnnmz8|O}3mFHZ8nTFgoLM|G_HrNd1@|<&7 zt}?M*zRbP?WQ0`vRL+U4)zolhyEvivrJkypMR~u5eBDsqHO9MN0|#lp26K(zYp+3j z*iTqVVdiWDk}eJjCSAk z_-}lM^3T>aSigoWYw+u9@UB7ekgNc>QCTNo(D@0sq-@}Tg5SC%S1?b7fyT0ZMI-_? z?4?{S8dgK0Xd%j|Vmbvh0@e-XIyJS?%*c%csAhwiO02-h8 zU8Av7&K2|FZ6{yLVd@%LDqfx|!#se7J%J<7#zZ2>HG;2)GCFmQ(OqAI@*!V0G{M6$ z)w9}gLI4I^zTU48j|QEhG`6FTLuM#*c6oMovpB1Eqropo8`@)01Dj~w& zd=BNofY$dCd+U39>t*}*HOlSsdSmZ*G8&@mp&Sdd#xI;}G#b&&<`qk8k??fRaWgcSuzyGCUA&mYg>UMRDSuj8B1VM&>wC(E6>Se|^4OH;$My~fxTcu%W_)(vBjVej2w#doS_AA6n1v7Fa=Q}&t$ z;ok7PhTLuQ8ugslMVkK`+OpSPU6GwtjVMQahogOqUP3P(iX8*J<#{p><&57$nV)#B zfgj9cpu7@94D>>gZ0Ir{D@C3oUc@^!qwh3LR14(!6b6Ll)2>Rx`qSGxJV?NIoyuDNLu+J4db=506{%ld&V$i?_-l zi;#S!pd7?h@T?l7p=wYMqImWiq`hje=O7{g^cw6%iQv=!qYM*rV~jF5LI@#*5JCtc zgb+f=7d!XQ;x-J2ar}`mUJT;6gL?;oqjYG7K)~1GtUy2@2xmC53GY7oP)ah~nx*f$ zR{n5FN+C=AGl@Q6Tbq}!K|)4Jk|arz{9nN}F5u>64-l6-M$KdfU^ZzO*&IT~jK;Wi zPksbxB@bNYcu+z{&ZcTBGRJLu^nM9x4O`vGS2Y{ft6X&xY9IY42pD>W1}#o_$HfWJ+^~LqcGj@0@s>GPAasF zS`?&)tc(OOCDFT>#_}i)yqgU!aII;;(E@s0jx)g0L0C&0?}JEVY0N$PMz(rORjicO zg4=5aX^Y*+#$tu-CZIuN@p_)dy~Oghgkxej1}7r64JPa*Pg+E@%h|cCX9; zsH&W{5b@$4yBy|Nn>C`Z<^^(U));__6%xcW^ZgY)Ku|^b-w{(9$-lMD9g-wTl0WU6 zvFp=76vtoC2%^NnSrRD`OCn;?jTVAah*3Z*WhL5U##3mwFvU<)0zs35p?D+UQ6 zQqZMAkSZBes)M2u(9!R`%Tv&b%f*Vk5Bzd>FZb)aclq9X=?{L2q9}@@D2k#eit^v^ zsz1%%9(YfyWj;`WG{|Ws) z$`jeI&tjBOam*v3==@F^$%I@|goehF7PZv`7P--$HdF(qR6o zH1bnPW2rR23Z!8i<-DRlN<-$?Lf*=Z-^lxoG=9Jn>O`agS>WeUHwYemrrGh6{U;AD z2f^Sa@!(6>%z72PA!o$Byp3oHCD~W+mRqIT(OU0?( z^HGTVZlr;0GZja&9P9A{c?CDf^C1>c;L=QO-@P>WYM#75hSN61#|Vzg34%6DrB=gD!A541yitvn| zCnz#; z_K=D+{80l|RzZZQC&aglj@kLLCkDT?v#>qw68B(tS5WY2-yN-y<*K@TRAz(q>#lX;$) zg*5GJC@L11Krg%Jr*?}psNg!r(y01E{aFKQFgHGM*1&-8e?j6PSKv_qJPQ;SGKb#= z`qX9(7$s|@d|1V>rkaIcYo_+ldZ;f>vWD;D<9>3)d0i%O)&OhDh!-Y(*I9!X!cRUH ziIk1FMm@uJP#FA-ro;(zrdmC(@w&UJ#&l1c$}3dU(KI z9AX_3B*Fdo_5f=~-F4+$Q&$77{t$$?$`K23a5F?IcIo9Ja!vr|(QLzVetY)R} zzMue+1}_F%V9fHavC}h$iA$aB*Cma>FtyTncn;rCKG64qvZF83Kmy_P;;^)Hso<=9 zy5#V~@Tx5+Hho`!t@$-H@91LS3KBN#E@9U$4Ec`$4y7TEWI5u|E0N}hJsvf;@-VCV z^-04wPSKigv-Cq6qmcI?Pr^w0D`Xv{@rIPuz=`1>gd{W$({9`|J~;sjdVe1PHOPuprNs6|}Li9spQaI2e4; zJx6dFZ|0uyPg7M_5gQAOl#~<~goTfbMMp<>lZQowhlK~m0poz~?(PHx1UNW22=KuW zVqzyJCpI>=)zvjqQ&VdvCkqP;QBl!fM<-97JW*Fyzq-24%E|&HU%iy3XM2FPyMO3x zsV7B8_viFn*V5_x&s9~=l<(gc&dx8K9gOboj%a9Tq+UB^WPV6V&r~HRQ!z1RS2D`{ z;Dsb7adJYM8mq6Z&SSGHIlh*LkaE+}aYlrPWrW+4k|F_mse9vkrl#&MAfG)RkRiil zG)$h6k}9!bdG?%SW`xnvYny7wkdkUHRHCpRa6WuUZEC7ipNrMn))tH${v;4*39cO^Yz2RNYt2;^*`f;51l z9U#x>fC_seentXnY%EeC2N5+BdO=N1X+k+YO93s*_2oV*GhMQzzObb9%+z?e*i#`^ z8Z0d8-k)pl6EcsxJtP!$un7QT860|DOHNsJENW?hU04f7ug^%el7RJTcEvv}XYTe+ zFL&IGkCX+#ZD?vFQ+lUr=0eILZ>jWn>-z5QxDPC(uKJW_ITs6y9*dMRkwjWE6v;o3 zOnP^BLHZ&?&K|Ax(jv{@WWIp-*GH_|&E}PvvWCJ$Qc|xlABV@!EfN8U+*87v7_10K z6%)r0dU}Q6R|LFZten{!OxGT%Z|Cig;*0TAQYPJ32q7Xy!9rTdWhT~*E7sQ!CRKL4 zDJmqNR{l;*Of62d^CQtdq@>x^eWcU{_5o-G3#Zw9-DERfPc0UiXY|wISXaM(6zUPT zS`pSM;`R3rS9kPiBsB9mRQd&lP`nIqdq&J}mOPUuvT$^zTKRKh?$ca7nn}Yuu(*%c zyM3gk%=+sNZ|2l$oobh-KxaJrxi6Lu3Tx-9rJNcTGXm@S`1q#@mi}Y!EN!IuvqC}L ztWGQ}nW5(ja=IQ12bn}~yZMRXp)~XVVkNCIubnBB9_y#)4KQ--1b1kDwlhuC+xsD% z_<5$$x8WzXg8t9*v?2oAOPaK@59IXBRfe^$@cZ9D@V2aJjDkUaHL^| z6Nik>%~kDw8k4pv7rcm+oviio7Yqj*6p;_wIcZ>i7yo;{mDOikME(f#fntPsJ_}6^ z`JKs~L(DWKdknybnq+E628z*w7|k>^9mE;{<;`a|jcXRIK73gu5CYaI3RDG0PNnX{ z`nJ(tfS+Jjp7RE*MP(P}NBdj=_CXxOC}i3FSK2xM9t1Z!)9%T=4il|6fHX7-NgU2L zwUghuao_F8%gwZ_QC+8poI&4w+kioZR=fcN+qerT*7ty2WOPnvlMDePOExeB?RqC~ z;Dv#08zmz0t@ zmd95vXah_@E7C4l)w%zkN2{(ALw^4w$icGdqXL>^ecH_CFTJ!P)37&TSl$4&?SKt2 z*QM`L!d+(8{#yaFa zmMj*3e_m=q!@Yp`kARug#t9%R%_3Xm9F7)*G%9-oPZZ%7@k)mwS^1r*NLiP_udcp1 z@mBs1*p5~6<<|3~Rp%brZleNza*+NPq+Z|A`Y?2x2Dm33xi~QpkL)0O$T;Pp2p6(6 zN|M5qQ3`>y$J6@A@6!P8`99?#AAH?zg#Ag=yQN9!9?luGWo`*^znUj z%&k~d8+CJy6B)~xISz(&Wq~QF;=KSp`iuA!eklxNS|0_lhZIfTy6%Z?pdb_#dSDGu z-NQB-f(Z?mNaQ*ZLWSP{SD8=yZ>^|3H9+WiSt$(HXcm~5oZK7G`+T1j+;rMEd&tY= zA!Mr7C~=1oi(ygii@RE3=7sBl*aFpc`M>uDhoCJgThQU@sU7a`Vsjc^m^u&t2gmVYuEE0uU4g8X#RB|pK;B;X+`ROFmt)25kx@0x zk%kr48$eAElTsljRCbVoE)aLRPV8f!V)TTB2o6o#3~=JSKevjV5HlDWX0!q@-$(Vx zcHP&rPUrr)*Ysa!!r#zGpz#z2Zg5zG1<)bku5Ty!#Nvm5dcL6L&gBGS}3^QDp zuuSqb?^Smq?dyayB5ggR znlILC(=v#xy6tB7-KO8M`EDayG!#ZM-VZKg; z>)+#^rL)^{t%ABd`Rg7$1NPfi*+s4-X`Rsa^SpoZm;CZy1nW*#-+iW;%8xWYS^;Wa zzzJ{%7sPNEs0Ob=i3Kt2QW&K=8Rru~JM~^X`eivj?Sw>pDo!_SaJYo|E*p!{4s<9~ zaB7}}gf6Br6%wYnR(X$07>FHj8(laZ9g1U)G->ZA>EnZ8vOfSq3L`iAB@5D4ETCNE z%)Yq}Ei;pXXzPHgqKCeonDz+$=Wa%XqJ|}w)Hau}P=$Cd=uHt*X;h!(wij-TOnev5 zl&!S)qpSWe0q?7qLT@EOay?`u+}t1{^`oeF_DqW|q@$3FUK1 zVMH+m;b}~%cBwXi+Opv{-wlccq?Nbez0HiikW;A3=vktP<@M&jh#aoPdkq0oWO_<1 zedlr^KMlXKNX!`ooO1~B#Qhf@K_T`53CQzz^G6!Mch%qx7*DbmSvFIC9Ih7tT6L{T zN?T1uLf0e=>9Upa=M0cJ&=w-MMvkT(E0E)85K=v4|GM?nt6^Ap7|w9Bro ziN){>jfWk{;2azJ+pK-qFm&D(hCeP7n47Q4(y1DphQ_up#4e3_D~Q4It{R3CtGk~W zd1p=SFi$Cu3yBt+V~H1Imtfv*LEmUzb6|@$31+1tYi9X7ZXSz?_K!gy4ntFsG{;%o zLKx+Guwmwe`5misxEN%Fk#yX9>>cx!%#~NOXmwk1@PU_u^+C}E!U27&k&F-w2)r+)>iPXGbzNj=8 z!`p^-%>gmIsu(M~Ntsk6V>80;s9;sf};XDNq)&rbOvhS*3QZsV^@cHAVB!QsrE&jvTL?7&>R0I%TWXcjc2H)vQgYWdvW$va1yA3rV!I zU3&#crZ*`JK+(*fn9(P{_I><(pB4gtf=k9>l4fHZMS}LZi+@BRTx z<{(qRaY2@{pY%s1sfAA28Wu>Kl6;U$r%`nkq!2mnhOaFcK$9v2GY!H-_(Vj%tg~4I zSq;YVY0C@;yZVgb@qU>fkV%ov9XXxKzF1~3I@b=qI*4cnCyO(;g^9NEVcXb(HxXuv zt9|TNP@y%{iWC)XNgqXh-?`tv0!|T1D`uf-)UlP2eUm(_s&u-;J%Jfkmj%43qZ1Gk zbpSssldB#kQm5QUeOJMR_yR?f#OiMBPElpp^AV-y9b;<@igH^QNVE93ING zOR@H_jGaOVlBnN}fGG<-_HK7H)`FDM)h1Jr7~~=ze6N5;kHFUt*=XLVGNTv;gz~;H zsX;8=c4yRI@X(gOETq-}97?W_6E;Qph@`oUGuN2tYc)WBl+uPH{0?p7W?TjhkjhPXb+{W}3s zGfz)xL+pc={J$o+5or%H_c`2b$5G>N!%MaPeuq?*(P?#;#iK6mV6Sq4%1t6_4ke+H7e3I4mj&tuf5wC8?!}W~!|^rySbms! zK`D$_9->s)w_$zd{%Db+RIaph@3ExBN<^tvGoFyiGcYtp6H?uIPM`z&%tC344t!%@ z-nVr6EoIwoP=at4NCJkv_DO*Zwj!|W?dRs1haiuAoN15B>$67J28~p&9HC(S?wo0- zX_V3GCt)pzI25BBN``}bw@J+pn+ z^@->^JvbT52fzhZ!K7(}FH>@E_vdh&N~ar13<5@9VR$8ZU;*Sd+^CB8J)$X;VTaO*6Tv;Ilt8mD9VY?6qK-8}5i`;MpIIEsXc z2NlcB$5EoC)8WPFR~YT~maQ|ZLNt{g=yj6k3}}|?21^J<^+7}RSGY;Z^a=`=m4sr9 zuiOX%qP6qgv|{86!Q-WFvKTRvHkFGU#830TJ=2}%Kb78=Ov}o>;Y%;=bVyf$^x?n| zcCcu@AVfxa-jPyHyTG#;so!uo_8n*-OT-HW#QRBOc$s-5pr zr=7pd6PBgxQ!YR~T!wIJ_$IuQM(m_;-TL5pdR)Z`Bl?B4XW1&mM=tm zp9|tX&Z3z1Nd3NEoW6VdCSf|a2CEb>w}plg*Zj0Xg)j_FlzDDGBc%~oS)rLOscW%7 z1yn(`%bm}T6=ikT31;wjmfCm@i{0Zp!8!Wfq``Sy6;)&?d{<07o|~9tRS@l;o2sTX zoL76%rzq8|2|_NI!sEwOrJWY2mHdxvlqD#b3UyB32{t8bwdbMHS&7^jbh2FFbzf&U z0(IIKFBK4=0@2MK3q_W^f}D4Q7*Xgiheq|K=E_y4_fZ)9_3PKn!QqwIbIk79%i}S2 z%UfQU1&Ut<^9b&vjmb}}2g0ImVI@+TepM24l&GCDs4#;k#+v}8THRK*1)yLJFCYy& zraxHp$K1Eenf&WVpv(Wn-^sjkB*xQg{G961H*y6W=t>2EY zO(Xb$sf1adb5$dG`bXtN+ERDV?oFA2>>R&Xg;3l)xnhRO)Q=1X)CA7@_Zq459N{rKj&tx^^rdPZT5>QF2- zA7i(PjoDDu0BIG2SA0x|ChCj|0gJnj7o%qsC`gTkO|AJlaG;|A2_b=mI0US}ZX5e9 zoZ3#5WjGGU|1S53E};QNd+u2bMq%utCJJ<@`5>G_9gMigdg6C9SV4Y|o0XBMi<2e)dh zTe`wO(DbG~Pt&&K5Q1FgNXJlb6QF1mGvftdx3%tgV)!5dVl0;I%eyFS#c^GAJ(BOe zcoIXTh@ub`;w5M*7=|a4@rdfyA0Y)~#s^9^i3rXpy$du-K|h4J!D)9Ogrn=+B>?7J zWKN5&G#JjlNXrF1T%Jm;3tUW}JuZ$Q!~7jJqo;3J^+q#7_M#Pq<4CH!yZMevCQ6uS z_q~IS4bfl>OawA}vLr}5O@k)E^bz#I)lOc1iz^Czi%uk2Kw8i+L&Z6WKFA%M3|1#E^SLp@VIl`{hmi5VueKbCu-y?)SKa>)3kHiUSigO-N!^>Gj$1+)i~D zVGd>!JBnA(h0%EicQi93a1?8i)(g7zb84l>dkIi0Kq|X|7iklq?~R~&r}A|FjS>DG zb_p(1wCq=7*~{7r=QDAEp3B(PQ2C3H7uN1KCa#>|o>G|unTeYO9bAHS(3;gpKz}nV z>tIofFqofAaYC9dGAE(^CH#Et_Cm)#_g_h1ZGFjltDUGS82o$UEpnLluU(25_oBx8 z=fTD-hI0nqm$4aiH!;onI?uoSDDx?6b{Im^x8+Qv7v_OPE~j2{4^|kf!2gc(7Uiry zwSJc8oVa_;)NL^P5b)Ixh+E}uB(j}fHBD3+chVcyu*5&kP-W^)IeQCOM&~jyb?e2a zBLFH^D-R$l9TCoUN-HRtmX0VEmFw1WR{`X~P!u)@sL!bdFzhrCCQCLzO%!-=&tqcv)_Jv~4Ctm|Vg9z2g^x&hnKfUv$Ys z18{MJEuzi%Pd}zS(I-P`G`rX51y$xW1!@#y+Z5mk?D2~&8WCY%hEi)IANL*$4=`{ z2dYUPV*2?lk{{7r0IKe~9l)tDWmv4B_o{XdV1s4!=D;4S7t+8%TxukSl&Ag9m_g z#uo_=TXW6r>+*!mu~$2DKjE>sgL}=pvKQ8_(uWJqGfykq&IaU}k-yY{LUwWO+9Kx+ zMXSvXX3Z4MrLYk$R8oVIM2&4};@&lQ2+&HNzcSu)`?5^Chll>0s&Xf#7CAyNRce|IbOk;g7BkGSey zeWbg*)M})Gbs0^2dU+mrZlpy*4tL4>kM5)^U!>#KpSN7TUw`fr`!guDPV~0dwS!^o zen^?)whX~7Pz!Bg9x-~{W?ndYZB1wUXZ~Odm_~Lm@C>Ju|Fi(I%c8Iw^5uA`Tg&*) zH^~R99lvdE^yG}%)%-*PSL=k$irRgZIS~+giZCFeFyzJ-cihs6UX$`gFXhkj=kL~` z^B>$LpB3DR;>S&$hDb~FDMz&(zhPKB2x~D}+vIE$;4~2#v~mgl`fa=Gw1NBHYs+W4~i92vKcMf3WEBY@1Tw5@sI8ECSVSh@{2*SBa?cp@z6D(eLI|f#nq( z18lebL0v4+wD6L^qFdasz~j=~&jV^9CuhUI$ZYZ@6nbwT1ln3?2gmByr-gki)#TLjkAePkCsWEyEyDRMV^% zq}e=kkXy=GSxeA{>(I3Ft$0@_=OdAKa^|4UG7V3^yvHzGj?b)sf8{ESxvV}uM|0X6 z9rVGM>4M!7*V=l=;Xw9}CxkQ7Z2?iEX}=+?_f$E{TK_>68)kEB^LYi-4E0e-zw zQpQyupwVMOHy&aVOc{C_LKS)zGA8ox9k+hc^QJVQKv-7^@1vzMRmWwdwWsut3OEEG z_nq96bs{B$F7cN1&)AY3F9}UsJR}u~wW{i#_1tqw)^3|Q5d6WW*7dPLf zO+0+6#4x~C>+FghoA_op!tx8EWHkeT9qp*1tR5lPY2E1YAX2W8G`U~in*2HkMxpxz zN4SO>myuKX*BRz$CQvCwL`1OXLv`Y-$KIUHvK0R@9VMPh2 zRXw2@S$~RPNfkP1=!={k1gbD5`Pjtv%EgZTch+}IECrc#Z|?XWqz}ufX7p#x`mE3H zAs*fO%T0Mhobe_6*q{zwo{hwZJ&d?|2``D)oGwDw z%8;X2DH32ft|vg12PXRb#C-r6Y<5wJnb-Xx)-X$qs^HUau zzdBzS;Fi`gM}#qFg~%7q2B$n$ain^FqAzu!DL3}o@gLc_wcrUxfTo<4Xz*_Gm$zs2 zQkvUXA>`c)3EtQzKFd z6>DD+k+!GX(b{{_KglO;B}Qnx=W0m?npGP9HM|oG2*gZ>JP8`(rhhy8JSbAeEThA*IWRWcn%5ASwflwJ_J@} zqWP-f?@;-Z!M4h}@EuTwu6GA6TV88q-yu51(-FR9L-X*;Z0576^G7XPO72^xYiZzj z(Bz+Znl%cxSKpm5OHslzf43U3Fxvg5f6`+6WDg|}png5*`$E!@o=3R@NLYk-iEYVK zDvZfr7VKwdu{03nCLHK59M!iHY9U}~LRg7y$Hl_$HQwij6Q2-!RdUKFyFS_4pSZ{I z&&_+4Ar4X%j0hI`us9x&S}!SQ9((d*E&!#XXlYANrkQW7GeILya3!b90wwE*Q$hGO zupHjJd(OkQ0U-0S_cT&#H}jcNKH=Dr=JEraRe4P3va_)(xQf%Pd*ldEu`X12r;SXA z94Nu@42=X!Zx}!$`C~*DRz#eW$mhsjjmI+08B$=d5kyMU8_l*f+0fkW_B`i+bEyZI zV0>sxKOK=7S4`aoVDT6JsZZP%y5Q%_*CC6Tw(@~)_`+jnlK#pmTCS2l;TKWJsb!#l zD4#z~YmB=co?l?ZVhoM^^9g4p^pZr;=47H{?lSGr!K(dPu`g|!$=`rP6lqRT%#ZTv z1J5GT8g&U~SZgRAjmHUv&{hIIw5XGb3oscL*Sl3&drCW}OpDP@|F{kPwUsfmM?MC# z$gefa-&=pM$P^=kq_#Kag&vgteg4%}!cm*4-knK2(mN z-dUu3%XydQ7<=GGxGqF_I!QogaPJm$sOfpq+`~t^ZB-?%#|4mzUl9woack7+RU1tb zF7S=1@pcAy;8Vh}x=6S!GK)=HG$;`jiwxCfWS=%!G}l?Gh}_*&4Xs?p$dHxlhiR8T zeYhqPZ>woKYrTSn`f+?H=P^rm@$DoDGI#8@?dic!ZE(p$U>jW=-GnfFb~45nMW>%) zrCeF}BEjIZ9la71JxnX(?L0YaoIv%=bG0Th2&s_oENL8^5m=nxeDc9ck;CkPfTg$9 zdt(*@m&h!b3skTge{Nu6AUQvtTZzRW22n+iF;W%-zAz`{p9C9=lii=b!6MsmlC_C)1^@qN^ei)c6(&bJ({KMJ%~EqBUw$uSwh{^wG8{$^ z*`!I{UPnvM{<^rQG4rrO%$bn*M9<-d%0QR=B-x_`bWI#IB(#9(|0@zx&zIOu)N;RO z{qXbWi~OoGE6EM6h)oV;_+1A2lc4jGoy3++wPPO~IoU5+5}ns|)q^p4XyhmC-0qkx zptf{U9#6-RCX{dd$~L3<@XYt&cOE5xE&Hr&%_KgC%5vN{PhFJwrDMuRxq%$g36MVJ zCj-W^T|Q#*-?UDW`Xi;CsS3g`;=#8=3LLMeA;ALZH~g{y{mT6=ir{;(XEWZiOWTI_ z&@DFkUAFWU2(RetMY!&f{69)JzngsMtDC`Lno)w$nt6f=JSIphX2jRjzi3{f ziW%aHb`79Kd5ws5U=LC$u)l~$7@zQa`KAxdO|aXCn0%q|a#saD#p2W}GW~kT6QeuR zV|M=Aq^>h~d!p!Na^phu?{u_MAE`8l_z9KJSoLKK@P|-2SQThptA=WleV{ZLX>TtM zgjuRHr)LyR5UhX2evD)HdEBHkzgv>Z;wkd-YFr`t1ERP88huIOsb+cdQM2#da3u2d z_K{rF#b{DvaA|G&2gL8)M$u=GgDh%(za}~6a-Sl(rMTc7)RYgm!wG-aYk7VrRK@yJ zHVFN!_q9dA-e33b|rFyv}ah`67o{Vx}7CQ`7lP)n@Wq9#{+D%{|^1arKa z-&6oc%21N+&-{?!!M$DSc;jnG8t=*vM920#F-ho6iUA;|9v`T6bQr-qrlD(q<3 z0U|Pa#|Vi7D}xFGpA-aQBh6$1nm91{f4ePNeY=#8Q+yAQi@NVuoHK{^)mU@`sZ>@~ zS$ZrgCJ0S|6hUF6@oQi(y+V6eWu3D|<*^PhlF6gvppvg_nZ~OF+zg5{|KAq)COZP4 z{EQHvd6?yFLm+3&*I#nE-N6|lMC76#0yGOjgoxne+!rnH_h@wbUrSM1wDin-gj2(V zGQ~Uw4q!U7emMTwx7q5|B>FfIstDKCySS;{Wp8>vnO1L?43;poP7FPuF6Lq@x;c=$ zn)E*mdw9M|DGF~0*?78Wt9zrnS(*IiNLNfsr6D)hW%@=-OFcGz#5S4(FEe)8#5;07 zUMY85?J_m(?zClAR}StNILOSjU1Ob*H?bY4ok?}0oi1B@Nb(gqK&52*~od2+bR2Y-={xQiTe|^%|>jAJ1&-H!e(=0$%JzGy2QZQLgWBTq~l>O zdFHA~Y*&Emi=Qyl+SwWl$U9TTxeJFjuG#pv%F4Tzy!c=X!D&kGkD@~yZLE9jCjB36 z2U*t6!U1bDLq!jo(~+3!5qS#m0!@k7q31#!8ktgt$n0{Yk=C-V5z~BI8u+~h;1w;N zPUXt?T@q10QPVAcD^^P&XsdZi^nx_UIWq_5=vttIgPHwo#aCw5#qyS!^{Yad5h?TX z1Cdbya7PJwKtJ1EZ(o|Q{o-S)5XA12pPFl=sf^vohH4zhAtL@!R+fwU=BI5p*0G(; zLn5{&^e%jU)_@Ze3eJn5uv*E2#a$O)o~*tdE|!D6QGgx0!VJG2BMNn3Ng7EK zpOD2URzIzb!NCF`&^q{gcn|Lk=lgR_Nr6Q;!NVt=VpT#SpPom+ie|LZJ^p&J`AjjFG`I!2EmBaty`*~4 zFZPp#SObFSZqMcSM;C)Bg6`sA9;jh@gAAae@1RpB_^${|)Nc5(BrJ9J8(`|%A4CAx zEk^80=09yGr?5z$4EiEIp~u2ESlr%$GQwjoMTd^{WV}G?uZ#1W!(>b6?IP3p#)P^@ z3Y>AHw$8I;?Vbursx%0_!{!wv9a$|5Qf_g;jIF&aez)dde3LeV|6+Q^!$Kmtft4+y z0=L#SG4lEEwRw?R8ZB`?je36JGu#33vyW;ac*`O;#iPe;wbtT$(KGmpr!$6bnJT+8 z983*HXUdMa!@;9PH8V;ywLT)&-p*3521@ZyM(YoC2Nx*n14EQvYX8G?`gTNCP9C{a zKJj5$G|aDK>2R{NRHvbgsJn`5Csq&G6&2t@axkh<{o*-W)mnBl!!IXK*eRR%w(0VR zclV^GJ-Ye+{GxWg&*ulU%8+cC7kh#6XwGGgxmPcAy+<7Oz_}Den^~pJ^l+Ar4O0`k zc{X;#o`SX?G0#Sb9P*46a@E})A-Ajz`iTu6V3YhKXQ>Bpb!CD`%E@E!%gr6^?H82^ z1I*0DZkyLd6ikVL zV`4q~X_Rs&yNCv*$fR#_Qz3=Atp{W7$^;7bijj%;G?yFM^mj6xe;vgcM{#Cf~m)+iS4-_VWoj$lN}F`W)a39 zS5?SxJou3^h^V-D!WcJ9=SX5|Wz>$LD$mjqFbb>cDNrn$XnL9*_9E(qr6z)%mxTwi z347iP<-+hnN^MD1x;@ns1nwJU7TU%fsE5WR`6L#SQ5q8kCA|Lv`UA>4$r)CP{T{*( zbJ7M5fV2Ddllv_%3P+1xLqIPQ+ua&O$o&Jqi>(Ix`{hvm7{*G=InOW z|B@x{)!9c;v&^J2SAHfhf&O=PSx=c;9{(tb7F9a4^|a+{sk ztUtkP!m}^(1<@9xdan?iUe5qUsoWk8t{5qXU!>7sgZ#(YTOfs?9CId}5-TT&eCoqJ z%eRjqMnmHPp%oCPqWTYdtXb!?60@u(laKvas&XOVWu$4kUNhl_{J7{9szGu6@DtjN z$ygUE&xqX$4g3q?2oNyhz1Qm__NtWkWWYU`bD z@`z>O3EzU{Ft&4-_pyCc-&?3`Uv^&ZJ{HBlAGXRYgc8R5kq=~63*@DR(KC|3kNrYREa%_UYQju~>C2!6*<)FEGA{BKocOE@=ouGaSE^Q?y^ z8E~_^-F{y5IcK<2i74fXnH3IbY$>phQ6egpgFRviV)kZMESI?`2)j8D)|mD^C(v8f z!`eG%(Pnn%I;-r8CTvG?Fh5XyJ^qtsbd57}7$xr+JK_7>&RdPtG1~yV9CC+Y=hIv5 zIUWwHP5Fx=lG_sNKlpEg!S4^8EA79Hf31eCsi(b5gM)HyleeGx9!&lD-SR}=G54e^ z{-8wEx!mXR@t(VavI;7q693K<8<~01C^p4BFh~1 zFJ;(VGwvVcv3o|O+%3{!gdXw&Wm^-noCQ8?J=gsYBL$L_SiGSO6XNFFTB~{5+E+^= zUxzf?8Ys!!x07If)5%l7xpr%DgrA@_YtxK~;8Hj-#Bj!NZWi#@v7^kPqbF?VVgI(L zS=VP8!KEIBDDqVRSuKhHREpHplXy=Pb2V`fs?BXn#hE=^I8@@Ky|0MY~h zq$jx~^|LiYb}|z+FV|__DZT8T1^PMCVHNhXHFYn$QU2rq!#91|eY?<0eSSEOHfO}o zE8(I2D?2|MXR_!oBSs^r(lIn7b|kl64g3014HH#`@XYfOh;80M9o%w8iJe!Kn}1(1 z>6`yp)z=TrI@i=sIM=+Y?$cc`RAQ*FH-`MM6Pavk6>fiN-x3A%@BB!*w#p;a8l;~5VC+rfH9$7&- zb}*geNjV6$b#5_-;?z{EV zrl&O+@P~lp3z|-$Z~I~0P7|sQKKoLbx509uh&e~#7gO-V?uIew0&(Q$e}xmh!wf)%%CPCALg?-3riMfmY1ZbUP~KN|oHUFh5bne3H^SE|$L53*vJ$n-kSIRgQ3& zX#X8r>RjaE_bcnzI4p|fE4YP72h_$2;aaWIVon8)*^u*6psxrma}?HlNXK*lk@Edj z;3|jps_#}lGVW$G6M%uOQCUTZOu4kH{;3?-_n61Qf>Ihf`C`_Z)(bb&Rq^g9!~9ga zc$@RXl?FM+@UCOxg@O3+`o_vYu1PG8l(odCti`%XbuO|jFkmzqjSzVhtBhs()?VFaHF3wh@-_DsA2Y2_r z0#)fcK=M|#W@gFqRyDa_uD=VJJ+2rBx@Mj1o&uBjue%%9X2}}RI#I8KXOFAi*o_0c zwXhn``&PX^LD4Rt68jbCx&i#U``Ihd{%iO=P&EO}*THzGKckgCgY^}=--9bx4Snqt zLb+=%?_?;vLRow{8`05!cY?d($Eh39Vy=qLY*}^x^F=w5Da@AJvMPtpOT zMc-~xj{mMyU0y08=l!oWVy$VCo zIeIUK3yo(}#-6*R9WOjG=9iNm&n3@{#|5MyzR1S|GNCM(JwfHoaZ~CSvDJmOO>A){ z+#f8YJDi9%fXk~ndIVj=M77%i_LA@*(X4_t_-W3g*-knakI^WHS%QQ<)_nCsGrL!S z6n6ww9KKL6^l)4>VHPcVlEl@ZX#OKUy8W5D9EEbDy2X6&yP(fbBd~J}In=F*PYb9{ zF-Yu_BNJ{V$`_Yp$;qO3VFhvBqMtCU+mI ze|4qK1gwDf)d*6Z z%~9)HgmOm&GMUqLvl;I=7nw=rpQxZ9-3_|FcD4dcJT`5SKfSO|E1IN8R~a*m`d52A zpsS1CA|JxCB0oQ&H}3&F=@1vXy&>HF=ZOZaL&BG{dVw+1VKY|!UPc5K*1@XSGbhyr zT87k{l7;WTm4Zi~?i=!HvXE}dwSKqvOPDGMl;Y=Zt*V=>`3@&YrTh`knUuLFf4sz5 zCd>qR7ytE@uWF!}rW5|yR%Vv)`E?9!OkP@OTv^(xQi)edUjf!!)1;=73nxo7joE4={QN{amW4+Mfk;`)cNOzA((*S77L>$Yu`6Fyc{*U%Nm~c2M=7 zyA=ci9ceP|pD!lMpMP@FnpsuueqYoTV(~zNN(r#$vN9KqL}<26)QEHI^VwooK{;2) zjrwI`UU?=_?s_!x{-REI5@)gEdU}-_1x;Z1IC8j3JIr=fP>Vg~x9~8+Dk!+D>EfwPq1*(1^MX~qQHp-Z6MbXk25#-^ zcuq5ZVlDan9bfF=5DiRM;Tb>eoG)J z>5(}s=@+660}Qep3E3=|1w)s{r?-^IaEi~hkqj|; zSH`Ue)6X>fWsBALG=L$Tw4nTCv7-RFUukZjC2dd7SFVzvI}%}A>Y$qpMh@pf^MlR? zV`Pq{+sM`wIJ7r*+;<@?_O<2Ay$qEhs%}#n7zYAuG04duJj~>T3J9N4X zoQqJed!M$L>k|ikSyU zw_l1?;5x1QCeWmhCmt!kP9PldC?lTYXT`c`CA=ZAZP#gnsk&+Jt@fNmzV7r;G>lt37O4oDG#M#JeQa2-j`utz#SeExamd z4L7*fyR%#4ek(Ch#m~NgB8n$9cU0MTEOR3{wd0U^7y;h&H7|Hp;qsP9U*J1a1k%JQ z`>s7p>9enM7^}qod;7ZL*Kr$+^c5Q4<8OV|wr<=0ed|Y+m;C#h^&RCp!yDVHJhSl( zf`7hk-p&JOpN$J!2U767_&DlTqh@8EME#i9-#<38dLC&y{yN-ymv)%mBPSW`>RmKP zTLD2tS27&{!`ZVyMRX{d8}g>;Rd9W0`07GuRp+q2T|xU__X!z~d7)d<4EQ{>M*L;G;1!5ASXZ!$>w#++nFmr^3zxfggXky!+M|ZGtYKkHXU=gSjz^ zYe!ichO|*w-e4hyR@T*qC@XLuwTG>7I>S<-R9=UA97SVSPXHvPltCcDtQ?pg?X-^CPHD#L(wO)LW#U3@QqO|g zizul%|Lf-UYv_m8=16bIK8J{kCHFb3-@@WfDJjTgIpjVo?Y3HX|ne8%YRzb1c|Jee5 zuK=JQ=gwnmG!1V$StYeh`tOvL@5HVxd6BW{XXm9C?*7dQt0uD9&YUk`@!Sh&Y@_W$ zmUBC2xwF51cX`FdTI+{JP=Utk;{CUNm0)#bnu~%_d=IdZw1v*cm04%IRE(IDd6%$hH5;$wS;7|7 zT&wkX_FQX^MhTWC294T_|Myp{mo^Y6;;;&UrIiIF%Sz*_RH>RviIws zDZqPa*|u6fG2`$>z=J1XV1vxrYN$r2(Ee}lZm=*gv@|~W7k&HI4KB`dW1Ab2KuH6h zu9==(d8z@lRin}`$*|=-*;v08&cPZ{pad#>1QlMzLJ?HWM5BL5n zFUe$*HM26A%zQ~ARg`4Vkb%fhP*7-JWF^(0pkRPdP;d}L*nbqRMT8|NC|D>J1r4cx zO(G%|LPACuSU3U#y6sLR?(ZkB<)=Y$6~L4UmXxV`m!<5#iU-Apt%)J{~a!_w}&(14W)6}n} z@8TbtA**N_9$WB9L`gzczpZB?Fg&ZWzL$tt*xfg=sG>cmsJXL$QcPN>{>NbV;PlMm zdU95Ed2JULzqpW?8Z8q$B&n2{lmAE8SV>hU7r%6BP8|g`bzDk0kc?`4X2~ZgB{IIK zxntz;Rw6)=qv_R$n_hJDFKnY3b?hoE#Jt6$8Jg4-O7By6o;Y`qWyVH8wSIa&i_H6;~SE zt=B{@m8BlGf?Iu878Vv}3ktQJgF8cJXuo*<%&P8<969gO8BJ-yB2>D#xEPGb49kgu`Uf(#>)5fXF6UFL;6xX`zlN9kBA+hpkDC4NQ!BA ztzTqt+HQ#Aj{5GD4uUMsRAfsrBMQ{Z646`3!q_r8(s!3a(e*Bx$Kb5a!Ci!?L_yenl*} zBkPwZOi0;ki%R$feUi?mb))4JLr6+MWtAf%pedeCL8v7IYm*8EcH#XhcZ#>v`$Dbg z591fM*q>LoQi%o+3W`_+#iHdDKCU~m{Zi13J)5eUt?}rH-f2aDOMryjX)=h7H$9c6 zw~5+C^%=%;>!o3B1?Pa}n3)!k1dEr|Pvj0MhI?dY_z9z!=usJFEa?1$_40oMNm;+q zT)*;{bM`2a=L5DU6X?_x1-(_tMTxJ<&?0fpZ+{K&9@k_ClluIJy$mwRCK)P0= zY(EzB^{TM8Tk>>hP-unrAnV23EFR9M^x(}hlqxB|NezYo9yw z^~$j9f67ZgB*EBoHY~@|0R9vt<7_GCR+@^1{dz@B4YdcK#2()9EtlSz10yOMLX3JJ zE$xcTb7B8X@ZkJCPEkSopB8(U^e!+WMi>E2;dSs4M+c94vMP%k7)|u^i+n?)csxK1 z2xo&?EcX9jxnVx%Ctr3r2Rk`~V%A2M`j$AzXMi`|<}$Targvb}lLaLM?ZKhy(buEP zcfZ$Vj3bi+CF#}OsE~gt`GZ{b}iu?e3Qx(511DP zcKr`ooUK}8RWT8Rp%Bp%uri{-a0wAUCn!^(yPi5(lU2vj|64Y?Y~*Ww*a~ zH+fx^v(;#fJ9TIfgfEL=G>%pw%@|C`(;3u${72UG(#%fiTa>aRVV2+pqcO+oqHKqHrx8E2k$ zl(R-+Mjf;^WwaT`O#|BHLDr^t*A9nw?*(Bg3k+wI<_dzE6-7UA2HYFU_ZX8BOf3hI{>V3T)cFU~06!2ZB` z;zSjDzc1)f;O9QUz z_e-oEh+)>VUzoS6pR?`N1YQUSW=Xzg1L@np-O+Ep`9E~aabAP!r*Ky%jNBLzQ$x#7xQ#Q`Ni(eNWi3d1P zz|`nI3CP^VFBS4uE|y0|h~X|_?);fQMgkVf6wg$)f@6?akcv+Lf+OjBnM3lU0QwC0 z)>K53-v7Jxz9lNU#j?mT$-3bL>($UXJq)1WvjE&5NEx+FBQYgv2~qV55;H5Vlif=` z2~M4W*!ZXr<9vD>7Dscw+5j&H^x*N0qL)g(-acy}eJwM~FVL@?95!kl7;XIhYwD<1 zyOUlRy}N8xEZnfRDUYlqEP;rzCxU3g_uA$nKZxHi4o#awA}`t)+cjI4V@^OK6tITn zNE42swTRyPY~2LU&HIOMBD;$959r|f_c&xdE7;ok4FpiVoJ&5xEP@?|CeE1i!~-77 z$JCaX+%Fy6>~rwO3it|Cdi6-T_Z*F`7mgjz@#2$X8@J|o^#4<}f>SDnM-DONx{UPUcVVuBSFv`H zXH^L|=CNF#T9pk)AaT$uoTV3?G^m(<^){~^E25WajyT%({2VpeE%)?OND?U=RSku@ zw7>my|3`bm_QQ+F`ktDlfkX^afsS<^z-_VDhnf%O$+j87TMc63&P?e4Q@p9!?TE?s zL?8G={d1gp?-~(K=zfxY{s<3u<5j0SpJ2>gKSZ>-mOdGO%~E=6gW;tf2AMh+cX_uc zW?k?i-ywq6MZ=Fg_tdqV^TzUypWe+wXIxB1s9>~QHFk4ZWl31xr9t~W-Vq>=I7opx zg>hfc_vw)R-9KC!VjmTeNa&W4L((!Pl;#mNxM;fbCB^?6n-kjSq`TTs6>%7Q`jBpi zn4J%Vxz^OPDbRELpx9ehjO(u%ZbD>kB|*#Cp&@Gze2w0B|9+}fWx@j*M|NpTQIiq4 zNOgjXjSD9S4al0&f<5|!`V7%M2a&B~kyDY9OjDf>PWYxsK*4zi{;E7?5Ebogx08Xk z;s_ePPb$ckAt{KI8`FkMN1QB$_Q1D)`YabDlp)qS9x)nI<&$I{DG_V&7hl<(DQX<` zSvcLB*I#Tri^%TE(MVBnrl1-KDLWjQPXqc`cI!_P;Q>VrEO9})Ar$h{cnzL-+F%uL zJ@M!AQd4QwA8FdZOyDVGxF!#6zrad`w$19m6LO7OiaaND?Ma|99ZtkFnGt+7f5+it zAx0)%?^dyZ+8iYMeVovE;X=Bqqm~33aNQr+AUgPg2CKR#N=YQe#3SB$n;+Q3lCORM z=$2KURrG<*qm&9_ORV(^^q528;j3i8coU)vPu9>6pwXi%32p8n504E}D3X58GSoHm zdwqB~-Zv_~qtTOVbPntAC#K1%V3WPSpGbLBKhe}w+X}}@!)O1vxdFewT)l75)g4v@ zxkLgc5eu5bh-L!FG3xrvmQRk5h&9uirG>J;EbE}@_4bplXw^&WZamV z4I{vhx4;yLc78d!!4wycnpBf{TA>*+ggdL~Whv+ zL`C08QQzAP6hmt^3MAflL4z3N&b@e#yyL8;=7gK0(#x8q&(StTnBQU9)}^kF#_x?d zq4Fj!=J(dey^18~UfP5Zaq=Wq+O`1n_-a#sf>iY9Jvz}|kKC>wV9E*(yuc=?>}iC( zbZ7}UHeVO{vZxZ+k=2W6Dx4jnew$|KGRc{oo7OD>Pioscv<`clt!a)i)8`!0cjj2Qw?mWIA_ulz@afkau-y*QpN2~{b;#R_IqoD4eyLAzM9 z;6wt@jSiMH5ig8SiA1I=4ofwY*84pE$q14j+1?5F=lu*q5u z!rK0=szpf#^0Reg1Igw!u;&bLL8JEwvVDOBZ04M+19yl7K;@}fK}Ab!#J>LxisIeB?CJvmvrn`5a}pY(GIsnMDgt4g0!bCEn* zSp_~f`M7!bZ;Sn+n6^xYyNQ6i7HUfXmdlqr|H+dxzj#c0l~>t+oF!bnE^ee4p_$kC z)Du5D&R{+k5`znP6fr@3C%5D1`wT19<@4%eX)bumH0<);(^n5O%-PkUB>3Rp{eIVM zE%MorV?AKYY^}rI{0i^J91d9)5+{%x5kd2jW1yNlnHumVDQ)Ci7o8<)0865bEHF;? zYyPuf?~qlvi&!X6@fR{1d}MWPakNh#VpL&oT^NGLRgPAcyot|#OeyDO3-56DwM{Hi z#y6Hh`h`5gRof12EQF{6hs%qpHs1>FG*@uW%YH9ZQ3-i?+&t%Vi*MY4aKwR<5ZSX_ z8sEnGC;T3zM%($n`-}1BfK_%H&uIoQ>h~)ekgUos5AFzxjSe9pkaTv~O%QjYER$YQ zyB6y_h(J|JgDEArY_TD<58>Y7wPFd3>XV{RSMsI3l$js7?3RC!!w}Eioy*muEhL0? zz}L_3l9o3ZSl>Yk>bc!wx4N5e`%n#_IfOR@xDf?Vd3YNuZ2yDNP^g0tDI5520D1|3 zC=%yyGzGg{31S6(pDl}W6li~*h8WcPIHk08FwqLRH)#!*w?!yUofP#fPdq<*@GdE|SN;g4xVLS9lUXru z7AO9FgHQic|FSG)QhcP7x3|=n^TSNLV&eh7CrVpM`BK<3f4CC9|3`z5*A%MGUITx# zDcu+fY#uG!;#NEbIV*(S{BEAY?N12C`_ab?yd5l`N;c(JfSX@t+XamT8VQS8*cj0~ z6h4-ZqI6`=@1nH2w59@$%I@y2bk7ps0nG}msuUrTs>4tp8cX?l+~H7G;Gc@YOwJQa zw5F!c!pqa;V==O(?@@!5bK!$QPRx_EaVnQq5oDnOL^gx6Lv>rJKpJXk*Ztq>`^)<{ zZ}H*9LvkA0U%>IMWKLippBv4zFV-BgFyeCxJRN``5}l z&rqlqG$4y3Uo0MCxn=BNa?8^XGSC&yWx{F@#w_im7Y)~bsm?xqIo5m|D@c0Or7>xE zmVI+=?KHbPTR&UZM#4|kC>#2_MN&ayl{VO`?L|$&kRY==EWh61i3GjV7%!IK(qCAm zA%qa0L@eBy^2!x3aDDI4-Ga@^w#uEMVA{QlUiH&)2BU5%yquDEzBqui07YC}hwceZ zTFu;z`odNH--hq=fMu5j%SzK0S;cM->r3v^_YcSND;XLY85nFcjpUaQ-Yf~Np)?<(maY$q?^x0ca zD&u3xg7Y63RCg~B+e5^~7iU}6*FJ>{9p63v;zFdtThGlf+Fsq>ULB*$YRCTBWH7LR zP^VU=w-qyZ&IgMeMzw?bU*xnH_;@-`u@oez1{liXJM6H?ciwVL1Uyd$4IvKop}R<~ zlADsp#nOHCWQF`by|m-a2xXwggHere9+`0I%&uK8_w+Z4aLN@PB}>PH-ub@0Ubtwu z-B?`ulo_9&?e{ic78j-&Q&fc%I_S(f)9~qfYtyf%VzFlGL+p9sdF#(}lWVo4j;ZNH zq@J{}%OW8ynj1v=o?R4e)4}IVbJL%O*JOkNoR7kcQzg&F#6pW6yqW+-Vo0cQ^VS#B zlwmJx|1}N4d&W<&vyH3C&_T-;iSFX@w`FVz{4giM{=PqxNl*f^6n(8uH?JXt5$13H zb^2ZoQ*R5gzh}R}g(gWag24$dAGwIuS(m_8my5mUN}9+W<08>ol9xFD4W zH{q{qo-~?uo-#00gs2$ks8aQ(Kpm^{uCXXkmnQt~^ln35GP{`faLF$@+=84F0dm0b>v zbNY!b3gpxqmrfZ8@^@hdj|t#{)<5}uBAB3GsP*7Y4i$g>HEE_-H3fPN z_KtM;1Rob=9K|1J(=o)MZD&}e*6@HRLyq!IzfQ8Xqe=Q*F!Kizu2cibPdx(s;HI!( zPy2JEr=(~1L!orFXEXcv=08x8sre&@U%Fy66}HJ5AA98>uO~ZQapkusmf-wjrQ*pz zTD|=^I8;~H^L%rK{!(J%g;D^M^W9DZu2Xh{hHCuJEwx;+p>Y}3IlD9jntMzK z_VT9`u&p48rdTXSr4A!r2}SemZ#2>k6omiH3<28zKhfp3`Z!m{#F!ARqWpRMi0y$nNz!OlLvSd?ibZZPJ}O>GQMeo_|&vsdrS zPJUQ9XfcQY))G|!8ch|CPX;I{lSZ6#bVAA4vs`Wt-koedu-7r!IPFpZy|h~jXDD0p zHEu*lZxH`dp*<8}SYrKKzHz*$|32DWU+h9&#TcckDpd5zgK05Ff2ymsca`rX!(XAM z5`{@Bhr21rnh#hjX zJrdYY=gk$If6h}G@Ch6-N$5smD>~Q!;9=xed0p8;Scb<(;Jx@95ma-ZFTqgM&QO~t zUt(yJ#*8t5Nv*2g(cd6%$+U~Y0rc!6^~kJnNCUIZp&pDeMwgy1vIG&H4E+6jRkyXC zt2elYD?VAIHt02y)^6}LVXd=56zyCj*7}(CJaw#0pJ%7^*}u{8F2_Rfq+=h7$Prrs zE=gKZ!kn!diKF`C0}qUPYTp<03TxR%*N?g?GwF3d(t!}a?dLr8q&Z;a>kLL!&7k&$Pz(=Mm z{C)WEqDDdMOSB+dXS~DLC)vu7zNk=+JV~@oVHD66#s>93SOxUs!dzH6CFAEWpV_cV z_E%wF9y$qEy?ps|Mf?Pl*t{2czHX7g@)U=$UmdZ8PRR;E~b>~s6aP7z5^*z z=MbgVmgl#%gT*BJxI6`6wjog<`K@ARMn5wL)jdVOxIz+%6eM6u7zZSa{W%yt7uG#{ z0rO7)6Spv>K+kU(#Zp?&2xa6~LJO}+ZWhSOWix%h0Y9Vr;2=t581te-S>h!G0{JQ% z-BGy|8muPOEYI4@K9LU3-Cc}ltu)-6UJtsk@Jq4&YSiAT-R^|H6;EEmI2KQA89n^{ zd!c#%9wHF6M|4s3{wuQYM9oy$t_mG}o|15u-(AnQ#kDoc63S1?jG(KD>~=TfSl~w` z-!sd6o3a{g8?+(nr!k%VPDEnrxu69fNqG3tMJ zoK<>CWj}xu;wkQy-dJ4@J1FF-~w%W|Ehg0ull=B$KMY8;OZ!gw*()4vN zFLsMj^f36$0;6U~!|ULzuM&~sKG49j_W)IfGyZAOS5ef(gY=*h%BhE4*=Pk%>LA4bJuSA zUhbhKtD&Rn;lH{7cYCHI9V(oY)69QRALWFuez4*0pUXL#8d@O&A5lB|7yhXFa$bEf zwb^E_udnN=3+HAN5|fkXJ>?eh{J!g#nSbK%j7E}e!);F9q=d6Sthg;{S?cI_k^o6eKSlvUMB(?Ud93S3KpM?KT-8MwN*S#=X@u``&wXw;gS!2vnN+y55 zOscs3R2($KsT0Cxf+o+kEczNjn23ekK$dYj;0cI2Z;*>O9m0OY`cp3)o7%LLh*`An zn`P@eTH|x+xU?-+v&nLt72FP2!IrDp!mqT{!uHfLmpW1y>;g>Ir{?^PUAEf~{r!C} z=Cje}*27tFM{qyqt63dauj6|5dUl?12u+&9R@*LzKu^bJ2+i}`QJ1qVIe_ucm7)-= zhh5I&jENjkDo4f+sn);)zBDD4ZoVr$Jnz56oV4X{*J9r!g&73nHG+s*p{H7UlV&B- zLL6yKHUrbmJ7V!R`p}@-lGpdC-j~<4zbaHusiXmfVYd|8qhF^b-ym%f`CD=kIU1)6 zjaHbqufjV;kC~-`1)e<=WSV|(Y{YRR?3Ile0(B1q8{p2>vK=l zG@=opbr-=P4Owe8D(ebb(9c0X($;zp@RkbSlx0xpMS291)g&&+)nV=9Cq(NeRQ3b<3pUe6 zfaUkd|Cayhw08(XY^C%|E;$sqN-sY@I;O(GXBS=-O%KwKRd+=q%!1?c8MEbVmMg(~ zX}9R;f6QvpL25Ki4pX&Va~L^s4F};5V_S4h2LGrnj3eqb!nqlJ7)FLGG}?M$5z51L zOE2XOBF>sA%gsu@3I0+Rs`j?HKdM}ot1L$4=3;lTJ=7f;*$~;_=6>8tJUT5c7s}8T;rw++~V=imd8?y;BFqvO(5@pw;5K-I{uec zik4yS8jeNHH>n6=v?j5lyJ4f*{LSDD!GKl2zg}QKWBdGe$o zTvC6I`2|RLq$}mb1o!vA--ec}U?q!Qo7r4sPubsNz-fXESS|ptFQRnje?C=o#7B77 zYLJXkr?CC8qm?T{Vj-kV46RNHQ(Roa!egZoY6y`I6*$TP8o~PyUpEodUK# zSrnxgpjv(k-XxqJjLRPhuS8l0NXce~5{ZmbxIMwE*bjzjdc zoE2ITEL7-UI5=+b^+_k)dC-FD8s8FD@q`AgN%FxXKxFa?-sEnG!S zn|R{Z+@_{BktPFMqzhFi9zG*&BvPa=vCyV}nkMo>IE56>)wfptvk6yM91Th)i-lr1 z>pLl}B@#b(M#+g;luG zUOv3vulZ|D&%p&(j5$16?VJ5#b=m?EARuqhcb`mMonMT?B(eDHq$BQID2Jt|?bw0P z4I?NeY6l~@W9D~6{MelLU3};sjxdiy*5U0!}N% z#nTU;hxmAabl&PseN03R;y`>7S%b?#h4W8-jphLF_q@`ugRuUDQx4FLuo86wSj>^c z-b;rmHQG5cab&BeYt^+1F0)`wvTy~J6+IVhkTG7G8N97n@yP_H%8Wsdv|-q8DT!{9 zLh<{Aiobk`@3-4=?^NSL-IS;R0zjQwGjX>-j)QWm;Pp}vOP9&HnH$qcP9Yf-abb}8 z^U+gx!%o-fE{BFVq*Dz%W*IdOciO8Axefq=!rbo~_MDm308X%%N#@!XY7P`n^2cp^ zok;AFd&0V+{q+=7^Erds1(iRDzR=M~r(**@N99$E-@HZ&mqAPt_kLqt@Ydap^4 z9iqZa=DNQ3Z(ZuyEf+<%!#_$Q{s;aJnzBqXDbD0YjNg{UZ#_Le@yo)ZzD1co_lr!! zx0oWuCl%0sasEZbcXt#>Cl5*3d^*s9eTYkOCZ9Tdo)r-~_6eweSC@4_eVKZO*$gGsz9b- zJoCeOqsi516hIxi%VAu=k6w|I`^+Bh*m6!@Qv+d{04l9Pde!~ue~4RlS{Iiv?XkN) zSm+;eeWRPWKu+6}8ZjErRa@|axo)CvCNnNun3>NgFR&EDL9%$zYqZwFb8t^5u);{IYQ}0x)cc1?I)bxZ#_}>+lL#sC2Owg9yW3GYm(62Vqb|#}mrr4e z0-g5QBR(nm!yYX93J2b#L;l9YgiM=4DQ7;k0ME}CnnDfi*R!)&wzU%2!35@}3NqbS zVnIND9RxhJ-RUiNUEb!thnI4l2H^F1gS;OSln=wz?6YQ?21RLX^sRiUWjkFy&v#23 zeEG3_j@t@#EbI;}4pyd(CIV?y!*(iVpO-`5eLQ(^;zq>?99Cmq3RSCMOPww*#U8dD zKv!{t+PB~275sDP>i(rVpAvxw(H5Hc$F5;SOcD_Ga)`eAzK?GxmkM=>7?pZsWH%34 z9X32+^Jf~!Z@;TPYA+av%-RQjDR~oyBj%!+x)t8@rRu7#HqOC@61C~UumH3)HJe4S zJ;bOk6}cr%Ta>7(ihWN8ckCx$AB5;B_4}n=V>XO4$q+Wo=#T6@&%c3!V941w;k@md zUc?jAzbiJX*`3Zd2rVo^uK;VEe@bJa@yULB6QwVf9$ce^P?O> zhZjJ;n+M|`A$3~I%gdIe36Y7}#~QI^=i;L}IMFZNe*ybiUM!(*6H zFKugB4d-*;+O zjvJTc_%Ibf6QbRIG?pFaf8`a zM#d@!A?J6KlFXYxb`v!Pf>)}|TwU|Vv&O{IBuGd+)U0EV!+L;~NrD_|;e1Q@_8Cre z{CiT_)0Xef(>k9hP>waTA!sJK3vEmkHzpe|;xrKyb|XH4rbfIH1wFVK z&tz^=Khj0T%Fu(&(nHplZxsL#xD=smt5oF-a3DgL=PfZSruA&3(}7iGjn84 z(f_P<18Fz0&f&r~!AeQ>{i4DQv~MMwqz6-*sItN<>=2rmpS?3B0*H9?rO^!=5*8`G zvCoJ5Ro}krdnaFSo4pTLQ053hsFClGV5wecAPiYTl7`hI%71(sgi|Vq{SDWu*0baopz*D9IE9LJM8% zj^ovlXhnpKt|P5AIb=SgM%_dM)-hWjLK5t8=V{hyU*me{%=Xvp+J9rdKcu7G#ntZ3 zCSl@mQPF+i{?{M8F;B*i08RLqU@2i$VPS*c+DxR>U{?wcOP~w;eok-T=}+x{39V%F zt-J1O9HtOHVP^y%TJU1HCom}^)l52=dSdjbS$(s&ojP&SZ&UlU=D^-76!K{kQO?Zg z;Ns%&EKA#Ufg;8RQCh?rmaBLwM5nmcl689DTqL~|r7}>LlzejniddVqIZMcmsJn}%vx66TH89h8Q$GK z{>OWR(1DWnZ@=CyPVi*+(Z+raa(wj-M2p~4>XV679^+z7*QpK)Wxfv*g)y@LLtbE% zCN4hKDAvh z$P!L|^nHAUf-!XC+TzLhOQjT7Hjp-8rH*~QV-)mvey31=>GIGo_vj_k+>nEC<*E0D zY5#Zk0&nK{?A_V(GbNK-khZti@ihDNw6?Y>oM00dH|&|{B4P^V=2#@WZ>;8TOegDD zF+wH!`}zRPn3o|hYD`O;SGWV-k-Y9PEE{7RU3ag)%!I1nM-mu0xlQ3f(zdYOuD;Z{ zStMT|dFZOJ?vcCz>Xp1mm>_$%9yoScBQtP(4{X`D`nvwRK*D=J2hJ^a?IuM;eEIhu zvt9vMb}c$#-y9F|Y7JZ({1P8S{hYn}-n(hVno#R>8cUkE9b*N;t(jgZ(7)ZFU;!!6 zWbGru$`kCPSD^?rqmW2y)HqNV1cZe>f_Vag`7wb;$zd~>C?r*}DLdE=w?#W{vw7@) zNZalfDNy8eM5rr*T5dCB>Zr?at=mEhE@f6409S*vPei2vC9fo7L4`u-nsG!}N5eV} zQS>;i#P~&_H6@hK_G}_aZib6-L~JX_zO_PA2H1%>OJF%eZ{s!AyOOgnb*Z+c;?b@$ z#~io596jDQ(bP`?H}2>&!*k;l=MT~`V%kGk6M&d+!&c?Wnca!30~t#y<;Se}x5Ur| zHaz)gPtNC34sGl_;PdndNaW7nU$r!pQT3t`7U@LkB*g}ZqfB`#q69`HRbxcA%QgS; zT)DtLc(WgXRY=2#C{8{En)halB4<1JGs|rkz%o=4I2c(!y=m5ndPTEyP`L*Nn|F$7 zf6^5EMr&>0)YQtSgl!bgkPm!O-Z@4)N+zJpixpnyB=31u_nP7lvH z1Y>rFyiHA(C%v1T0H(;)ylvEz-FrYvWPeiKxd1BWo#k2A`JZ!b9vcd?X^Ah0~(fb_Y zJU;icN%Kkf+XM21oojwn3SRj@Fq^npPnX{36Ic+%*IF$`24pv}TjZ#{IH@u&S&uf; zY-}{R)#$Q)3P_D+f~@RXYgw3eYXP7DVRz&h!duTHtqu#^P9^UCOJWOqalL4$@5uBO z_uKpsAI^Rj9hgU&^f)nN5>+FLOYKvtnmSX71_ei8$#FzXC`lANPDwEV1IChGo#Q*~ z-~8YD2EI}69fBlEpobr2t`9@yhP95D=LG47Qk8L@CG{@K(p=o6Nh0&O^oAGVp@?Cf z>UCwvH#|wCbvbK9|J;X&r1Q!y)$6&MCK7f3uS1O1-qBhc6@uo_Ctq7pFSYn=73h)% zpU0bpc#IhMOcxOrwbUs=`z2TNs5E`fdy%t7Hu=V4c~d>Lc(0I63cL7Sl@?z(NE(>N zYz)Q}m6Aob{}pCaYG=F8WRsW}^cx z4JsEnYg}F;vH~url~T=ogjESI65_v5)9ck~`HmdqPdRA#t_-*tU})0AuE> z*?{hrWeOa3+L3vf1pXtxes&L5pNcVd+^h(#YGh4nSc30e7qy{`^EPvs1G1N z%-wl95QR);DPAay4y^a?buX2;!UcxH&8^8YV9vyVj0%!WoJ+*vd4da^udbp+KV7Tr z2chCqmW9K|P{gHqcC?fDX{=Pm_@4FId$Z24S~jXV@JBsjpVoK=80l4I&RP7mdw^r~ z65TsFfD^d~>>M1}1(4e$HF1kLtDTxfU_?oAgIMU(zBNL&w#0v^GuhA%OH&5}uIg{8 zD`>vp;2u12nmT05h!S^v`#4M^NJ60Dec~ld!@tqxw`#ORHe&naD29avd8Q}*__6Gj zWQ(?JF%TRQm!&*&+}hpe6+*!^JXwFZbeUs0RqK0YvM4{2gvPhVG?H}rBB}^6ynw3B z)+V@SHO`@fKx%*ZJ{;FmQ=9QaABD8G)?pu^es$!R_#A3iHWrV#+h_e+ zjorqV4f8$`MtmfqeJ@_TX!k%wDRmxwPP?CMx}uR`B~seB8Iq%LnaROLk<|_N&&N4M z>}9jNMF}AiQYXr{az2#B!TUCOL%@|)^KIv}>iz<%+>jC7eE}Xxu0&gBt(CzAh5`Ps zeNLmdImC`%ZJ!k++&w4Uzk0GP>1QZ3VUe{~x5)Akr|{^%7r*pV$u%se%wdw9?nyjR zsSsi~?*ia`ekeD@3@!~`HmM+fMrfh*LC?gqMyor1^l&{%ztW-oNoB$C<13LgOBkPt zq`uSi-1uMWvgIO!uir~wBVV$TVndPcuO z*G?t~?h9N>SRlfC{WubfaWD?T8ZMD9!p4KR(AnWn)o;!Fv1~3OvA&sqn4~4`>+EY~ z%vC>U%bKT;AShY5b|;e*x*b!VaZdmEBk_t+aUb_9uQ{G2@3Z8cMTW<#Br4B-itRJ- zZCR#ll~=&l5N1HjFA<8)E{mf;%$rk_*@u61a)y z+At2g3`hSn(}!b$p?cMNa}$q#aftY!`%}e9DAG&%t{H-y8*6VZz)FJ5k#vAo1Ui#T4#eQ%&8M^u5 zJ>C+O@E)-

    {RL*6@RM*agaStY=)iD@dr( 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 Eg6hZ}`Tzg` literal 0 HcmV?d00001 diff --git a/assets/screenshots/mood-mixer.png b/assets/screenshots/mood-mixer.png new file mode 100644 index 0000000000000000000000000000000000000000..15fadcb916c99554cbe454d21a8a18d6c764c8ef GIT binary patch literal 101604 zcmZsBWl&sAv@PyKa2ebkf(#xUf(D0Sa0xb8a19VVK!PMV!F>iF+?@~{26sXrSkR#1 z^1b)x{QtYu)3tl|+I#m})p0s+UIXxecqk|+05w%5JrooyBnk@pJ`Vcxmk=UJ zhUX57j;4X~a~B;Q9TNkSh=_=gkdT0YfP{pEl9Cb+509LjoSK@NjEwB49)*#SiI0yT z2m}fX3!|f9U}Ix*aB#4)vT|~9v9q%au%Iw7FmQ8o3knK9Jw0KeWAO6wGBY#3d@0CH zM2L=#gO7twOG|@^g@=oQK}Sa~ARs`5gN2QT&Ckz|jfRGgflZ2s#YqUDWnf~Up~S`| zB%`Eep`l`=r{QL0V#dW4;9{c$(y%hp3-WQ{;uDjR60zaqaWT>Jv9nOq(os{8QR3s$ zvtm*Z5zteTV`2kXs7Qrg@)8pgaL@xOh|p+>2r!ABf2Uv~BjN;-5fYOD(9qEFDd~Zv z{9N3G_&6^)n9wjt`B~`bsEB|h#FPxoyo^*d_R*&_yAH?ZY~m9mXoI^Y;pz) z2K0xAzbj8q0BR;wGynrD`wMbv|NcK*fT1$$|(L&!bP z+Xz$1uOwZ7fK0@4x%AD_<}qLTw6TenKi><))ao#D+1w*#D95(ioG7TEn@#im3#U#Z z{>+V~iLpAAxt{W!Mk6Z?!F)fwts0c^pSRP9uajQ|a9*MCt3mchi-?T#e}v!$1OJn(|0jkdRe%Ytiyc1- zYFwV0lDvWc^3keB)vOL#^cKR;Ce?^JUJE)K#s}0KWG>{4l_Vn8?I2JZh$|G=QzDZu zql^9YfJyjJbuuL72C8Vr*l_T8gY{}B-948C^*O5k@3zTNC`6;}%SX}9z5`3xO{cQu z{ii=fg&Gz*MzDwf_}xb4Wj)?`>A0M9cjVkd)KzAQsV|KEtb9pD>JBce|T*<+>{bJX6*4838TJ*6^{ znmH|}f?8Dq)&Ky7|C__39oh=PO>UzcHS@nTx^{!E^>(8s z*P@J>J!fV8_2n&pfEb^Gb7(_PHP}pcXzT)qIFA3s_5b^oIfrJ(6k0Q#H?o*d%+;}#~QWwyO<4%p}s?F;^_{shDVk4wW)b}P|0j^X1UQNEg2V!{5 zBwTA~p+-DUz35FmCmT)HWuLxrk!Jm+Hy-gj%3b?7D@PW_F)ONNIy7`ciQlyBqG%0& z_jbC_!oVb6FTVPaL4&yDNV#OB@5A~@lt0rx&!yojudF(1srklIXyk3rxSi1GJAt&% zUY;qeiWAjeaZ)OlTyWu;Zs9n1)vb{LiMJ>6kfAe@H>=Wj^wZ0Ki^dHck9~Sp>E%xd zD(8>erk0cH#CAjM4eA(VM(wQJ?|HU1lj*06DK`FnrEQY?p7C({%eVs!X#j7kw*M&L zCTyyC)9k{~Ow%vs3@^B0MOJ|%HhazQOevho>eHtn zz2nNilcR3Rz7p{8*hrd;aSqC62Inaue7!vR$RRs$rWlOHh=7T79carfJDy>4K!5SX z#y|YZkH4lrUeg8)Ubyn6A?tYsj+-f0%~$XPzj$V2Zi=nCS0JKa|9=DaB_7e8;o&rg zWa1vPsmA{_8j&Qu2z@^jwlUO}cqs zNDRL{GiB6D*t_^$q#Tx#{n`9OPGfNp6fkEdMAeBOT7mfc61uTGNg%5V>1Qr}6iE%Z zZ2fRp8?(E`G+mtD>Hv?ATvR(WWODZsm!@j>P`2_NOCy-2JGIydL95 z4}6_TCXcn@{@MBC5JlR$Th)bh@(Qg;mk0;b> zDA*r)s^rZVGPrtuoF0Op65=a<0UNQ}0jRT|4`=REi!3FXYI+$_3+T}D_{$MS902k4 z_yUBxsHk+|hCL+S&a3R!DY#cmb4BE!q)8QO7{RFGlZoy(1ZG;_gm2LhE8)Sp z6;$|fH-EElV7Qk;R@$Tz*K+pq`|`~C@7A-B5F5MWj$K+6HBH`yR6Q}C_mi;b_e;S32LoByK5(-eKv*{ZoVm=c3r-hjJYz#O_QDU+ zE@&LdtIOsX_NsfdBmy*|^RnPi5b zn}F|wk|IwdMJMZwL+78T3tmrmS8b)p4V529`iV%0p12`*Gstv|jPz&INQ-|p`eB1v zr3YY`FO_Pfbty#9@eO~CF;rC=jvHqUDMc;^$%KD)mwiwd;j*_TP9eIGwjw$AQyw8` zXF6^+N#pM2b@ish+H5`{;t99H<>qayYj2lILky*(my3xjepCDvW;o#KkqiUn92Pun zni+h4#sGW?op$*)~aV%PAN zs2KI_Xt#YTB~uW52NNPCgAu4=24~`i$9W&~h$aweWl1!Ep~{0N=X@*@6kzY@!3*H8<>fq>`nLY#{<&8n;2#Z6q@y`T~NU-b>hI=KGV8>P{Pi zZ~Jjx814#K^=x0m4dgsr>c{5_>^R9QGFACU54rmOlbO7oQea5CRnw_^H*jp#R5-Xf zgR8BpZmtt?no5!E#J;$_A#Oy;6s3?pwG1^R)}s|iu00-l#%`DC5OZS>4sA z6hpezrrE#|2`!j3JJT%nNDt~e1@E^w^HG@)eQ|>3a)hHHDTN$obyL@07mD4#kW_wL zE0)+rPq?)_*^8ae0PAkRBLE$aVC7O5pqpHbx)GQV8X>qe5VaU+eWN-%KI}#v0Lw5r z^n!{<474>zxAk!sL7@ImS{%@WVM}x9duh1Dzaz}yRuqN_BXmz-VM>n?Cz=|xfYT0s z6_I=J;kfi%g|_^SIM#d&w(=p1(CV;GQAn2o#%(8ZSA#hOtIR{tvaB3rMy^6*u01QI zGZTS?Fz0QEzlAU-SMnvp-qL0!m|Fbxf-;MxUNrkS1F-85*R3Si376KEa1gDLw_oV* z(VA*R@G9laeFC{Bp^s+(R)zs!L9RSoMp0RL6-{5NS^RE zRjbs*kocwwF?IySxA%{1$DgRg7-0o#=wkchNdH-S6|f{eb5t67n-&L$IZ4=j1h!A0 z!+w(vw6-$p1;gc^X1r_VmjbV9svmwi!r2Ny_QnbfN*~#n#d+ba&&%k>A~k}wgp^U%X?p61?8i8Uf~1)%bQB)`^&Tf z^}cA83Fy&E`r6D3DzDS?IlP!!WsgAYi-JVKPwyaRSk0!2u}7T)L@ZPmlYl6sjtLcz zBbOCrHNrg4oFshS)ZaP-1%CDtl{YAcBSQVGxi9%Wg{fZxYb8SSO9lXO)nv7 z-!KX}JRf)_UHiKLq1Nk`E7;Y|vfX(|Doh{xQc@b0x=SS%K&2o zNsokSp$)7Ol;yR5chG#{6R5!ZZ~Y*b=J>UNa10Ux%wH_k9z6&14?_;d7MWi2DUd8c z%x56=M`1ghb zi}Gbj|9eaU!G#{MqDv|4Y~&Z5$F;TeO9s>m#w2P7D4L)+WZeT&L1PI``bR)bIvylm zfCP|I49wco0pIm`s2sR`v6u=j+#YFM_fy85&M z-Ne9UG;(tnekDE)(gC5=@wlWZke(!MqTw>SnPxMk??2BJ22zc9WGuexVIrYrL>-v$ zNen5HkVvF*v8qG`$IPsx2Unn4qwAvAGPi%{uk-~Hi4uWOcv9_T7CCwy;#9r>L;yWN z*X2UV6U9Y_s=~E>?Ucx-HJI4-Z#k@Il4vz`A`p_CQl9f)=YO>y>vTu#c#){I8`ROs z@6fR5V%^Z((v%XM*tVuToNT23_IX|I;~$Y;X8uLzqWJoe3^M$qhP!-gN@VL)jMYe& zO!>d3IwmRc>*)i8G4l7P@_OQbLJ_y$eCQ?}u+qNvDv1k3@eF5<=Wx*weqbs}AWG~p zUqF1}kS;Np#eH~Yrh+v2N4~^pDWS$o8Cct1)#4O70Z&~!!(~^!c`EBooljjOD#QG= zIzEAKTy|2+t&1-)imLuau>bCW+U-J)TUb8)EP4?^IUD?@fX*}Xqzdw=lJ`Hmsu@RpE_^i7k8wm!-$hJ8lT zT@Qn=nY6xIR=Mb`?$ z(hLAdy&>-KK!CbIt;B?96)?>yVY(~ostPp-IP`pdfEnE!d5-+;*X1a9Im z9}wKB?|0VJpJSoz$l*QqWtYMcKTNyvx@+_M&U$GkcGA3`Cbmf+w6*W_oZ~~!M|X%i zPDvy?vBA5ZE!T+y*O>7xg0)Fy(RxP)gpIG1qyn$oZ3Lw2?q;UGP6InLL-VI9CbXZFO2)Yja0Kp^;+2lnR_gBjrE&^P=UY zulTlcPm5|YPtA`&k2@eIy_GQ8_?@a$S2%Kgcw^)7$Z+(d_3=q#(@9Rh?Wtg_LCM9qJ06d&UB--EQHOF@hb)~o7a(*zxPzIbROa47i6~)1 zrL*Wan!rzjm8L(m%opT!gvH;U=OTCwF%Jv)E(FN3e^QvGQMjv8wNX?s*cLZxJ0BC) z{oLzQywyCu$gR(o_HRXiL=#t+HZ~lOpN5=4BjdAK^Z}pM44Q?_9{cGVhf1;a9bH?} zEsCAEXHDh~{+1v+-oN%Glrx%8!uig`V-AO#gz2kOLUwW_)84FkXWZmuvo{XqgC-7* zKN3`*S!%nKnv%^m<%3w8+P*TsZc%kLhd+iK+LpVvzEk2lzS+NdczF2YGI2c%oTh)% z&}c+whYn|g!?PA#7J^(-B){$*HLhgRY5q*f3VIh#V#A%xalU_c8XDKJcg4aBj~dOn zRlv#Y^$yXE+|`2;{#1u1=*ArKs-+h6XE;H=Y}YyoLK=MkY+^mR)*v1f%3Sev%R)E8 zf4?_t$H;t*I9eE1Ms&Okkd~3eb`O=5kdSas9@iDtn|gM~1Qx_}=R0Wm?=x{^^Xc6< zI5DHu6yWcBF};0hYNACVkhbvWpecDhAH*NLr4J^sh(LOmfQGH7fX0v_O$TN=g%E?u z%A}^j%s)_rxMwL_t15lbzilWBLK93oTt$j3Ba!$=FD(bX?So9{@f81X+L@j%@LXna zU(dj%E=>+9YEp9;%Kl|6+t*k;_oZ=im67M9L{ z7|fqt7rIcaDZU;?fr+=oBoMEpb+Zys)mzVx>6&y9QUtCGrr+>#+H_+=TkNMEnjz=d2EM@MuVotk)La+Zl3a7d#JzLY1 zj5Nx0g2Wlq_y6X&OI!J>)R0NzCs_;JHfiTW&u0F@;}VjehSalkc2z9^eS;>N=2$wp zzH#c~6{VFV!|tw?80>i|?iDR;6mS1jVq$lQ3XoDxaH{()=h#A(qKK6tP0CzfI)Z*^m-B9y{5!800tYB{HL&c;TSjuzn> zfA_`2GtpICx;6obA$oh!9#X@n#e(*{bp8|p)k`d^c6~bvP z`qid}L0W2jQ(u;vY8ofy@{^qM0dK%n3LVBxeP>&OZu<)e6~RJ6^5aOa(0#^5LB;C?6m-Z%D$_h*tX9p(PPScMd$#eL zT{h(2CHx^(&`1|<^Bi7ZBY-2mQFiaDC-{<0P(5?G?dq22(oBx&V7`jb)}=Qi{mH_5 zMTqFcS>P>({jQgc|uS=7`q$vL|GW{I9de9ngqp3h3{pPOm;y{4Be@fi|8RD(0nd zd-%3VNQEAA!NcEJ)_Krye|8fhP8IpM3v#KR%SwVo411fW+vw{i3Jpp4d_l4wPX)+_ zY`oi))OXerO&l2n`PmGLz^BE9Vq>ng$G{%USdH?L6}UaP26&*^|32& z;@zHQg(n!t#tqlX=dA=X6@a`7K(w1? z_Tr)Z+d2T+yn4#$3PtFrn!_)5C-h=-A&;%f-yOE-rQhDmu{V`<9xH>0D9K~gq}u574t~R` zog@(3XR0A~p+T{q=V1z1!Wv zkF?K!S_YH80PvD{g5Wo@X6=J#CsrPTEqPGBhUFKV1X2?3eLc_5cax;U@}KQDodR-# z2bxzbzJ6IhaQAE5gh1L=^_PGjCNb3&%@o1?ST!YofQ4praiqP)NQ_H+lcmm2KGoa6 zUuNlRPy3OY`U_=pZ6^q)m#=#~B;R`fesd<;O8X1PsD7A|m`^SzWt=t>S$h?j?F=v@ z7Ym9oPYU8=OhGB_vDD*++YO%Es;Fw+vNVX~65Aa1*OoKJ*+xP1zpUbbZhQ?ZxZvag z$4x)qudF>jT(yUIC)h#Sw~sXO-0DxIF8ck34?{auq5stldV&8^BS<&XLb&tLXywel zVNQ#(Gf9W~PMH~`WT8myxnCv(iz3Y%cVebxIEXhL+U^5oaL;DxWeV#yf65sXEX;J$ zd!0|V2G|nd zm8_9doI~IBSPtS6mEII_nQ@-n`4ey#{PgE0eR4EV1PTSLOhL{{pen;v-#*EISJ*gM zpIMgQw&5SRoRe1%Ld)f9WvW+x7aL4bn}MG6nFkC zC6dg!;3STJE9E+|H#fh_P%9)Qs>X*S;v?_D@Zs2E? zqN1XUqO%)v`tL40_Mo>-)76?#*^|(sj%xzm=ENRnPW$4mhV=WGm>T5OvW-d8GwfET zve+%z#=s#pgqM7JgtSKO6^M-|TK2djQl02@01JJSFO|GoD^kyK+%M9jyq^LxTQ?0O zCkbL&W80;cQ3*5o@e&@oD78^0g5>$s9)Ipd@qJPryOqyQOhisD$u7Pvak{)MDl8~ zsw}RLIKO!_@>jHWkuSJ$irUZQQ_)`n!K8tB>nA!|hQdy2+s9^`lV#`8PAm3$Vd(f!v1~BUnK5A$C_j8IL3&PzTpXle z(J`sKQ988|Lg_qZi1?-WI+;jcE0+H?sfv@VGE>n=TU4R0$b?Yc9#ub(^QVH|I6ABq z7Ya19T$MNTB0@INjSRA-R&(3J9WFM3u5(6u({#|YvWp6KNAwEsnG1YclR!`6Vos{? z5x6`vfm)Kzyc~h|y=c_G2K;-LOQL!rvbA**RrIcXUt=LwwTb!_lPnJ-=kD8{^ zf#3+!_`)7pT&n_ujlQhxBgo*+Oh~M@^G6a~Y|s$UI94Z=*mAz;{?eJ>xVE)6UBj!r zFsnKgzk9E{zfpvVFQUP;b9S_npq{N(R32dpdx!Qp0M`fw>YZBR-Ul)bCWh6S;J2b9 z4fiChBnd^!qCiGH#GxX{eD|#dJ^lRap-3S9srUn==|#9JE|%%zhWo#lVy*07)NM~? zY{$=`VUX6~eV$MmCz^<~^V?yDjc<+d$H6>7iP5a*g$l>ZLvYtd4CJ1r&-k@8b5iN` z!l~s^&}^OWZk&o@yM=#4L5lu%zYdWZ`l6gL=Je=VNMBaGCsdkl<%GFS{8(rB(isrsFeZa=ZDx-8wTJdec5RfrgcH!ZJJtGlw1PY*@ zEz>}B(hI~#=t-APlMpE6mqax0koEE44APh0d>ZX82sW2ojGhNqFtcpx+0r6PZ3 zsJji&?zVvjmicIfvFh765~0&icj%sNsi74CdG!@#em^)IbEKF(GRb!AnmGPJo6aoT zebJ-a=uD=v0?QMslX?!l?bqWZY`s9puRBJ)55B*>5R5fGa>$H`e=>JlT~^`of&LS0 zZo0@R$Et?kOV>X36Tr+Z_F`2q(~r;3>y4iesF-X7^#Ojw3Udn0U=2O(5l9JIvAl0q z^PaB+6?EQte&;uxYY<)_Nz`W<_4b060bN5+h#~fpTr)jEj_Yu^1WH!veiULs5w9}N z1vpqNR1p}HKlHoQ<~`$noB@sBhc6~9JW2V$Cn|YhsB1hmY^waSwH&_JBwojIh>VV+=dKyLzZk=G9F!RRE6f-EKYv>qzVt(a8R2h75DY zig5p&QLDJz61e@G_eS}wxFfbW(R9Tz3LNoZ^t2>5aQ{GNvJt>o+b%{9?LK*d3zd|p z?HgREv3$DvY{}2x6@2ynV2L(XR)yt00a2`NHEy0g07OWt0LKe{;$5%z#urTwCewkE z)m|X3{PrPkV9ee|?%KWZ$^Me%RnB-?n{10eBZsLQ#Xz<3r1THkMf*D(OoWQ;tQbV@ zS0W8V8{N~#t0Ug7)Z1BjgJ>IJ&~QiTMpX{g!mRCG+Xzhh1kgTvjVM1V_6P+Yf2sSN zJF94va|OXy3{1PW(N!D*OOEONT56GqdxZ~)tt#N`D&Ec-XEeaWWcE-#s^RxM+3rVL z?qASEqdFzh1uVq*yR!!YhR}bUN6UzgSk0QI-er}lK42_+TVmulV;e0_)*6kiPU;V) zG>Mg%pF_(0&dA$tevS>MkMRibu9Qe^15SmIgdrfy8E>eY_F%t3KN|7K2StH=t!{j< zqTBIcucN=m?o46Un7(pi>>CX9=}NFcaz{hE^a`O?4I!$&2b`lu>%HzhPGv4`8GHV< zt`*?>2fI{o|M@$x;-uZ#F_Q|D?(Xmz7+t}wEz&J5cV4II)11GQU%>yoPpZS}#)9dRk#Gs= zBz905%6@QBt#JaHZS>y%eH|4+`Hg$8HNZO;kF`oM>fF)Lze)FNt-aqCzSl1Cm4dbF zTTC+cNaJ{7B$X7qXRI?r9JCDfMg`58y%y_LrInH%moa*we6s}+@q|iROPX#kXkN{i zj~!k^JM(I`#KbR+lhV2n_YC7IY}p+FY(YRCO}mFQllJAOzwZ{cQa~(apY9$>M!w*| zMs4{?!CvQ7HVU2z+aKd1@!D0)vdaP?R*5!AiM;hL@ZhELM(11K=`al`rfS{4$)q~R zI~?)RbOETY&uOH}2U;jr9P*TDGY(B(V47Ul4DgDwDDa3}AE4~Fq=r5L={sfHf;VX1 zQyU&|Ms@b~D_%~ZO;5dwhn#x_0t_zlXQpEunayF*3W;~q_#VfD@veELN_3wp#|X1a z&A3|oVpk#Be~FON37~w!_weS@dNg}&0`Lw|@kk|ZWeCaw1~O}D5d%5!JK6p?&AALi z>mTk&vv)nUFD^L47jO@cgEqCE4UZBP3)F&`CzVA= z6b`gAv@7)Ky*H?1^fglPf-e0@auGG<{IhWO7Rn~(BL zK;x9Q(v`KIC35CZMXSpEF>&bhC{xt|csS}Q=KZCJV#^F^y@XC+HYglax*Q`|4VrTT zlO9IZmfF|v*e6z8Z}B}Q=;t`wdNSL-OI%$JY@x`{ptV}v)r#C5=?KTS`(%Ac?;qQaQ$3HE-y5HqcfFj+sRBg>OY2o1GNISAhpq< zI!(gvM%P!=w(!p^!aDls=!PtSNGAD)nI6vO6@MFCx+K|eHZ@V-ndA{#Zmva$7R1d- z!{9Px2D;VR3g$t1?MRto3wt~q>+T{9I(-qSXm$K?`4h(9a70$Sku9vXB1-lMSi8pr zE1-%z&XQ5;+}R&I)gcJD>?+eeeX88+>;6?;9oi z`yeuPqV(Z*s~9Y5nRGyWHzUmJdq7tD;5(3rj1o40J9%HsG4q&%l@tnYomQ~7t~T*D zeGPu3pI^5-&>@`#lPG~n4OX14S~*F=l`3O2Bisg>kFGi@pe7%!QxjcL?>K3kngr#? zIT;v?HWxoCvo1{84fHLaRV@B3xLjs$Zkpz<6Kz^LT?rWiUsTJ`5wB&loGKUSP<8I3 zYS%*7Yb?VNHU07NOqH*r?;{a^-m_-GZV`MN=<*#k-Pt<1DG&e7*k;hS$mR z!}O5Og>t*Vk-XvA7Zx|SAOaiJ z?#XH;%9JY2iURFBY-ioB84f{8HzrY_&^l=KV9+)8&dSaO2}#BK`0dZigq3w~TE@3f z96WV-lanxzO}^WG)vve*_mUWp=W&Px?m?xH_>DfG1?fB_gZE&-3?I!$gB%<|sxkj- z{QJqDIU@DJg0`oQxc=}P+w~EKLfF&dOOKu~L`oEhb>R&r(c!uDJHp7u=gP#>ll2ts zyt3tx2s*87cU-#O8#Sf7lI~e1sy|x(gJ;ul9TA66WRM@vo%}U@mkg0JasjtE_dpC5 zVqNHCQi`Y-iir2T8IJuMRXNMJb}_y(8PJ)dK(SwCb+|5sgA7s}BM~1?OcXQJtrEwV zsgM{8jNu4-IzzgtqFOA$xf82nZvv>SqTNEh%YuP_p-e6N{X!oi_a@?E9xTs^(ZG(e zzCa_l9F~B?fAcUw_Uohi@Ubmz(T=D+^WV2$zF@E>fPIxHwjq&}Vh|q_ojv+_-Uci+ zvD}JXDs1Nae8>ha>@N6<8_qmcY5g8v`(yod)ql<<@bEQJy4;NT?_jpV5!=6MR~R|f-AHY zL=|mqS{40KK5E>W#Yh3zuAK9lSp8vZ!ANqQ8oYD4K!tpE5|#cjDoji0L^Od?*fwYF zOj2WLS!xf0t+X>1-^Xf~Q#o)xRuvL@;4Fu4m8eGAyy1@^o2BA7w7K7jY0h6}&#-8s2o{ys@#EeQ?E0AlM-MwIYLnR?4;fWc2{u9f1BA zM_Ows9mSXX4HN`$w0Y#}a;4P$^`Z}fZC~(ob~Ze_^2%~DF!XU} zjZy5muzv-|N9Rc(JKi<8ucp*bocDHO*CH?c17An^+xan|A>Uuw#Jw37Xx%!iGH&;P z2E63`+ySgj^ETiXVWY7Cm}#g~B~>3(=jbW7CCncNn2nAQ$s}gU?}_6D2>vj?%$ZY~ zQ3NaM=y9PyfTg6$wSc4+92A*&n{FtS(D!FPFKg zN0rOk^>KYvVKjmK^iMsDDz$DH&~%YUxXsq5hXKp&aRqJ`VtNoZikL|Mo_Z+~+Tmr| zw!~%`q|x0!;hYfhi3Ex- zBqeVTA#cR4XuN~V!S05d*Awi0 zd@B|Vw;C0yGX3)WCn*Uw(~7H=D}jstu#^dA>wg@gKa1st&T9P7qBo!?!N)1+#lEwh zEsVU;(LlElFDlbltG#I$9Mnp~%K$|8IDUCL!4c90j5VS$Kmk$ey@g2Q!I*0HVz~{w z2mp6fK~tt<@JQm|AH)k}FnrZ&@-WbARB)BvG!BJilYbcE_-mpcEz}+*sg7L_YGg88 zR@MfBXpp9M%|wDcWzd}a;PPZqF7@X9ja+Jm=wwlLFtzjVLx*T{6oWw894+sYZb2x+ zsL8*xH0N$&sMYv3P?-t+O{P}{bSE5nI5;OlX@O=48lMb`WSVP3O2@)Bi1Cs%isnE{M#hMM^dqyY^&#vI*tREbd`z za|pnJRvZ53niTc#tUnlwaY4MevSRiCaD+)V6TY3TK?DYpwE@{OL$XLM`#Pz9iuz5V$sW26AcS^|t#Y!)&{09L$dWprSoTV~>;3rq<4c)&k1#AB z=Ns*idYWHY3ko)#47I*Cz~;$3jglQ9tt%QoDC`G8wOaNw#SpIB%kxX!Q^kKz3BDK_ ze4to*8pvLht^XU=VO*3urf@Z4q*M5AfKeXwQNFLHlMEb$pyA#L4$BVTllKleQXe!g z8UQMR^$Q~rl~TZ(wzUioxRZoPqLTKL|1KVwrMq-Dnlb^D9S8dIF`;%SWW{jmkDleU z|4$k>^Mj@BfXY#Q<>>dgl+TX4`ABFR96gr)jj zLAP+xx)PJI$oli)x;)&80-0k(&APHMSnKO@Ia{9^uj2oE*_;ne)D^UoYb4ND0Rm|; z2>l^Sv2!L$acAiN2I?sazV)g=8dv=Fu8NkkqbWVSurASF0zI%bYRjx+uK1L_S)f*D z(@Q{vmq+soBGp%uF_Tp_KZ{2%A8V)jd|8+sieJFrMefnZ0FeJSM4}Pc>$gkGpMp8S z7t3tKJ^{ZI|2E4iAsDW`UiB?c=z^4H^N5U5kvBK_Rv4Bjuwzmr7FIp3!DeX2WdOGf zgUsI#&ir@^(PWDt`0w~3(51pqTBQoO!3&pFK5-V>s&G>1yuuDUFc3n6CF*dr9-r_2 z5$bA4Is5*%)}C!aa?WnIiB3?sdgZ`w_JdXYxGAZ<7EWk#AH26(%QNv2NSSCi`w$en zuGQ@8%C@82IZ{+h;rFp>>TSEMkA%l}GnUfv0bpU$Qe(gskaeMOi^B@AY%%Ju{}QVI z{k~x^K}ipt@9bnMUY(wFEKvn>k&8kDLFI$H!9lOAxv)t;~E`$y>6S7%C*efbCaL4`ijwy3Qg$){? z|9exkoIR0m037HMbWXDo9)3M+s@}*L5fK^lMo#N8(tyo@$CRw|quQ}=nN|i=8;eN_ zP?W6ITf4fxgE#W8O5SQl|W6-7Iw&?I$!Zmh+{y$2(N3+$Rj8bp1x2;8$sKSh)3?%d!H+ z*}y(dEzQx1#E+%W^*~XXxWiUwvctIhui66&>Vss~sig1s^yL;G zEJh+6Kh>5pp6&hF+Nxe;V))I?Vjx_|(yF4NsjsL!8jJU^1V1Q`JR-mGbdhNeJvdYM z)YM5dC$43eH(QXu1>wk{Pm@$~Lm2(^xpG$99j@jI!516Dz}sf;tSPm8M?J^XyN?+c zco;|Qsva(ZIsBOvW)n6RS)bt)=#-Sk4-rwQE%*?daebCLkanJN zteWqY#ZxvH7)syoPV53!Ca>nRR{xL_KuFSL^N@8v5#}Q3dA=kmvy>EdI@R!|IT6>1 z)ath{!456)1Xe9pH8n~`vIAk0^(y0+BqEV;!yl&Ydjr4|g__f@?)Wx@$*}bf@}B@G z8l?6uDBBg;#R3a>g)HkF-Wd4ysWYbTTJdUg9|uA6qmfYxVO-PUg2X`j`aR3w)?J!z zd~uM_dT2~ORV@W3a&xHBOqyQHMv=_hi-4QF9si(->0dY`(V(~9jJ&fR2kLKQeLPdd zBN2l?yVaCVU&E`^J4`k4!m09}op8EjVX>}P@$KXcNm;s{PtJUOqCU>A<_xx^cl^lW zc7r0o1L;IPT^}Uo?qvIL<_7nr2i?~?teGMIy{shGQH{?F6fvcYuA<07Qw6Ts4m4;E zHfy&i|6F@V=hm`XoxHKXAU5}K#OGefu2ECTaCRX2S|_JyM2Wc#9i{NmJea%tRd}w^ z7=6-9bSZmlzS0@}&BS>5k(QkrW1hhs)EWfar{=oAJN;ie$s+#^sYC!=eh zMYJBEh!Ig{r`UQ_%XNm=idWzAMz^EMf#0iaZdVcQi?uAJ=7Ymby)GUY=I}(2boJnZ zP4{C|tuF@5aHl<4HKSn2Ai{(+@YY#u1YGqKutNb|v}s(8k>RUwf^gCs7RCyv1Wet` zSZ1}0%0-0cMZ5laH?KhMXJh&z(iX;qVM1rU!~$!Tjy1hYqdOHxqEJZ2g|kU}WsNAj zQ(*k1$p(|K&KuF1mm&il2_bn${~l#YzkrHO&Nz3**^u2)I|*+_0m{Y+p1hf1+$m62 zp@6Zj?&$-A_)S4{XcylY+~l#VWu8*)Qi1|)&dm#YOJO^{I!j3~Ih%8|Jac+VGecLI zY^Xp*^dSmZ{$~%DDQ+-zGN4F3^o0|N*+ZI{T5&9RKqR>97We(}%^F?1@7e+Ii$w&d z-76}cuc7VZ#^U+EiS2>bmejgxL64Uz3bVOe@x6|zQZr9v5&>O%ymR9}V>)M$%@b6p@4`Rw@nnI9BfemfeMR6pVDEG%|@E z)S^R2kJ*NKOt(eSJ~pI(za@X77<{mq!>o(517^g0V}N&MIqT@uFFi)8%`UZeetLUL z0re}lucr1*fxI@M>oWORhFx?-Xxiq;rwStIU{mZ)+DPfx^>0ol%tb>;+4G5i0xf9e z?O;VQVlMQ&++J?Ua8zI``Wb2GHL&t|aCw|`C1pno7nYcOeAgI>!&+|dT@cNkXw3)M z83OCq^+6RNXrW}R!PJ;6`jN1^{1wLTG}mpSRd_V)#paASp4zc``4Y|w=vzNlih>pJ ze^~kse=7g~eLJH=HpeKNP}U)2@0HE5H*worB6}a3tWx$khjVbUBU>W##xWwJgo?yF z^LswO$M0Ww-LL!kyq?$dx~`WKDxyzM=f}@*=8q_!C`;eN&mT97ht9vfbajr$%32cu zxkaNAA)=ET*1;NZ`tG0U$>A-}G=^>n`e5%#7eU3%Uec4m;Naysp5~s5?si)3d=+a| zLv3nRlV2iDteaYg=(2~4_l)oQ6 z54ZLB<_5YtPUZ&F0OHFup%UHD@;WCAnZ_FHdi9&0w+;RpLOK=hy!-&lL>tWAa&x(? zo40n2ybU00$kkL`%z5%UVUD7-{?^smfsY?s&aIYoS`@PXVgnN__c<$zXrBv78=>nY znr11urqe4CSQ8yac)Al$;qGF!3YI!_f?DiQZl#V!_o?$`YFrk*`StRjKZM_JA!(N$ zmGg&d&S*dT0C&maha%weU+(@I^!3pziG2LJ)P^2TkEa7N!EG>9^-HnMA6(&iF!04j zeSLk$?cuj53OvJVPXx?6y50twN6=(77?;MK34&75w4yElx&&1QZxS%yNSzRz7UYDp zy}>diawS`5YS-j7aHgpyx-;aj=%JyE_!td+Yl}dmX6EOM=Wjh{_+(k5wexHT?SA`2)*rdA zlOvoEC6IV=GHXTmxqAh?2F{|d*3&rpqQY3{eGP_*DspqoC^-*HIxK!c?esf*2ayK+ zi^?5x#-CZHJ-BvpvWDYKaCs(Xyghl{uT~H?iJBBx2|EBOyY|3q+XeP0%;x83YR{A! zyx!~Hwz+;QlS!#)=W%@HTjfU{Ufb_b5>a{xwlO*x9B4No*r%YZthou7SzQ#Q%mdaP zVZnP8z3Rvrc2XAuBLjZ~)g@#AzjJ0f?8tGxIJzuW)qd&cY+Xs&Ob;VyoCA%#x^2J1sGedY3idK z5A!jnttpB`KF{wqCP}pd0#9EjMgSc;pJ1gas*3NY9BkZsFz2O_w)=sM+Zd%1H z$&tpHhzoW#CQxKBG)?|jR9FwyQ{Z|g!k6@#2pFhydb`aq`^EX|Kf{}i#Y?w7BTuVq z<{iJXf(fTN%`JH8&6HtniDa8xyQX}+=hr@e7F@NcaF*uJ6v2^7U+23k>#Aud?;_8C z>g54%piYPtcZxb%Q1Rs_6YW?m@6QpZPWA@Atr>O~Q93OzQO-m^$voNojQALsfm*1+ z9A#G`jO3n{3|#n)NN#+#uME2IwutyTTNP&3Gl14uP(z5JY}RBOWbro0RkoGX`!M$D zcG=`;i37JWT~=TO5wKz1N*tnbHvUADj%c39y)hyk(8~z(;GbpjGR4$*Q`A5Gd`bUT z&eycjWpjo<5AgGI&OZE8s7t@7K9eFz7i}c@L$gdTLnf%)Yfkyfc8-&Ew2Rbhu+OAM5%UkQgtzm=;%mKWl6SOz6n zDX#ozZOz1%4A?w1Q8@|hy*+E$n?%?jt&C+X-$?0mBJjD5YAO@j;<5C~a|2t}(sC&^_kwWHA1xhKyZL8;XwME0++fp#T+etFp{?U`D|`!6OXoZ{3E z3eQs&g-QRK>-eFysb#qIbR%kp|GKBbgyPvmVM zqo?Y+E!maT7=#B7PXPc7`0vRo6v{OrA@H_V|9F}y;O%tCNMR4T$n3_heclE?6$3`aObIZv%%OkI zULVC+jPtWq;qh@!OIT?A*MJXr9dZr`A8@#uWA;mZ*tXe|Zf(rGOAlM2_u>eG%|dbwdinAn4?kKn8o_66 zSY05x~hxGvM)CB))s>ILzlX}M9cU4D~!Ax`DUk2@z01pE+E=l?w3D&{{aho$lT z*CTy?=1@wzcS5%Nk$CYjf~3{N`p2 zSI(QlUi|m+id^R}6<@P1do;tvCGlq&Yq|D!9M)Xm^~5@>O!bVtaoJj8qT4MNC#QSF zRfJ)DL^+h|PX&pHn~B}LoP}A{OfOFRq+dlNrcP*-f&ow?1{Y^J;+sZ8%u z`rLaaYv}7k%vGHF)28dfHzE7fS;i_&sjL;_p5BY|@;f{&EXCKE4oz1*Nf3vK7I!XN z4i)u;yDr_9i(M1Q(`36t0?IvO!B{V)7yz-rdBnt5%$Q^>%)Zv3+cTLJ@LK(I^il7l zs$iS>M}AX?DWSiQRDs|C$~yo;S2y^3Z15l@i1)3)A@&=a%R}Lb*gRe~pt@0h1nQls z2BVfA(Wf}8PH>2HtvdJ@UH~y$8G-Sj@y0}i)wh_zEanLj;_cVB5w^Ais6JB$mdhQfwirI*PY=C`(XuzF!j{S3K0(N(4C{wEH=r-wa z>5sqLbfiOPe*O57mE#r6@$luAt}ICmj2{+0kU4!e{;fZD$h;Mkr*%}mfUo+ZJae@|)(5Bych zlVsZKzm~3jpox9?Elufe)DVuM2S?xVO5IQL3{mp5X+cO?ICsRneT@?~TR*n!kP4*c z7fkV-J}MYEO&iz$SSJoLFgjU_d4sYp27XpjB&;feycVda?|;Sq7#3%%tWVd}B|W~| zEYha^`MAIbY0iN(CtJ*dcemC{_Yi_&JAP^B8|OaiGEXvGWx1&;b~((t-t#b^m8EV0 ztLA@Hw0gi&x{d_b&!aZ05a1Jb;f;%S#VaX{o7Bhbmyap-NIW*v9emI#FAY8>?TcNHmcgG~H-r#2e$)_UG9zJq&tqYRn$l9LixAmG$teONX6^3HR}ZU=`AnJ5r_9AL3^L56T*X+#@*+xuff_~aN2UE zZu>nZiT#D)LyR2;G{xRFMf?rq0P8wIZ(84^X~;1z+E

    ;K~{mR{91djT8gDw}0QO>c_=-@#PKp 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 z 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�CnQh>^?lBIF06nD5;eP7b}xXZewuRhX_4Q{ph zB6-OpbRGZI>4WPX5mzDJCx-^-!H<re?l~JHgtv9 zar`j?iuibX0P;rk2g4L259sw23xaP4a6sWfP9OP92AR{=3si^nR}NL?;Ojh0)-K;V zW1dl(1tiReo=HVD(I=Lh9r?5gnOd^@zI?q(Xh@RkwbFl|qxOS>`0rs72XRG)0~ee|F+AN`4!fv4G$A}X+dB!=W`OSLh_l^f`%BkT8jg=8HRYY=i0S5*?yp(k%szBD4ZgZ_zDlp{Y~pqbvu~gY8eDb)V#75;y#+@Az$(=Ebb29<^W&JPGCQcqxV@%d>5aTC3X{x zvq)oYkuLbS6zrlwu!vtr+1%h}2ga}Il3=%FE90#-}VV2{e-=fHmPzRYXQ`Lz6&VsxY~O(n8sVWBu#X2UF5~ zb6wIWLxB9-+vmsp`H`Qf1lnUES5vp$H>^^T-ln4w!eaPi+yhxd>~$sb>` zKb17-H=f2yazOd&s}OTj`-fyd&?Kk=mI}5NuIQDh#XTKTdMd7^=<%Q;pB#15X<~^3 z(>5nw1YcWP>tjc22#xL^0MbI#& z{0dpbgE#&dVjvh-1u$Tj;jLu(bpNwB%&I=ItWz~UPwq#+;$CU9e>iw(^q%lmOITMG z84;S|_i;8D|25V;qA=EXYfr|`k?jkx0mRXKdN?5>bAjK@zEPG)bDk^1rN*q$TFK!C z8#YBbF^k7YztfMg9_XtbR-q(Sg|QS`HbSadPN!L(u<8VE6AMn3^zg=R&D$L`jBBEAZ7{R+(gX(b}Gncv_Joc23_J4Nx{ zdB@*8*)oe1=eNgMD-b)M{#d~dat~oh=xqkHa4EywFeX#I-DqFs-g{nAl!tc zx%vx2|JD#jf?FCMjpUt$WVIHSL4@AvQtkEyzJ^1OV z-v1hs=OG^RU*zqfb_p@q`!{4IJ8N+drZs5Kd`|n0Y>1eUH`Zq6+?@y9)XWA9Eh%Ij zU!iF>nsQp$puoDo)YrP@k;(F<hrL` z7J=%-+BOph(?(5x{eiijXY$$I=}Bv6PtadswyhGOl*Bras%5jX3fHx1iKvy4NGXR1 z2Qeq6D&ET_EVht@Kgf=6+g%2}|31}Ji#yXTtrs+Hx+aYIU3EzU-90^({HK0L2=wl2 zh*7g?J$o2*W88K9e-vGZJDYDC{Z&g_ikhw1r6@Ius9CjAYSeB>)vS@%o-IXDw20YK zvG+>EiWs%`u9Xm@wKuhEfBF7^yw{cYdfxlF&$-WiPTzAUClTj~+Qk35_Dlso|J*^3 zy9E3qn&uCN7d5)=6Qlqp)Rx5VbYx5@%-S!u%UMv^v;l5I=ux6rF}+`fi8oPM$oP0Q zNVR|qygb^wKD0-QDI9_d)l~meuLiorR1@xy;u{_YP?v?8w-u2SbhD9gj@z0z>L-LR zy7R=^X&(b`bQ3?11B?3wk}e*1Hk&3{W7}j5%KHP#7AiS!sPnEaIqx7`zIrlde|Wa= zXI%1jGMb35Vhk)&{XSP4cZ9lZ$p1w_Ht=onmpS$L<7Diu6D;L;SZUr8?_+ind1W|+ z_KF1R7EC{BcaVyE`)KUkq`lP}j_<639s@;6kN5u#ZHZf{N4@EVhDXcMR`E$!-=B*F zt$?YFQ4~pQ{<>YReooprtM%z0KKnyCqe6h)<=?+(7T`%R_^6w7dnsaUgx;u}NC`45%%hz1s>vD(_huSNdy|3UtOFxjX+M_V8-X_1Y(x=#Gy zOmAl~ZNvJarjUTZF@T|!Wz~;mZr)-+#!Q(Oe6WZEsMaX#Atn66huGd-nQBssx z+(fY5^|ogPsL$o#miqRle@%(RF zTRHZ-*RFo>`1wF5v;(tst@!QO(uC$dr%n~PM~l~pN3@`3=R?v-*RV89rSU@Q;pMB! zkt2cr23YR`&+T9K4rh`#Z%0(#DGLI^3m8TL&~*cx&&&0x$#?fQkH}& zM_-982W*U=GV$Ebv~t*ab)MNlvDE1>;p3QqtUNybGFZ|d2kuArl=h(W`Z-Y7z;4A= z4p!FeaLJ0tAnt6&z3xHO79WmTsqZirv@{}4yrf?P{M?{A8!lb|b%`wn%EJidKV3NQ zqFXvBTp^Pp!{+v|4)T@@RS&+7e!a5enJH1b-ES-G5Qn%|kY7X9zq#x;E4#?DeJ!D| zni8Mx>%{kpmcotVwsE9pI88VR8aWl-SfZicd?Zu}8DsL+HV?`-?yu4n1erw7RK1@& zx~4_Z;pj`+kX0u*2Sz-Qt0q3?m5hXU^Q?^;cddK@Zs=&oy;L1Zy^F}ykjtHxqry=j zYzSf+s$V6KZB3blfKXTn{3A27Sk?96sit3tU)+Jui{oJPICf`*)_Wro#9QRyN9#aDL0-2e=fgdT2l}yGik~~7f9o)3* zT4qb6Z5&J1G{*gktR z+*4wXHyMoYv%1uQ`tdRo^3y-q?r%Oh{wRIiuOKm9zCT|haWvgVI%)>1Ydy8*&57mt zdDyzo*qB8;2Ml>!K_ZIBOCa9Zm9k=Lor{p$? zx7jCs0|w6Q*9Nm=(Jq8R<8gJy6DmikXd1B6KvS+2Ue_lBmmj7#myxov?@Iz-90P3> zh8Oi#?Y)Kxus%T-2ei_jCg_F1+DTOvB(ekS0**h)#)9JpAi@gnrmQ;?l(*p{ijCFA z#X16R36 zRSt+WK9G5)x3$_Gq9a3Jn5MFd#BMZH@TCuLT;*E-Zrtc$|DpwECg>2q?sZt`|LF-B z0P}z%8FdF^>L+s9xk)#|{}+k!%t_qdue20u?ChzjyW?|e7RQdAOrvSj4>P7B_vbV{ z%~zcy9$k(vNWl^=NK(~98H6MXvq$+b8;*7Uc(RY**edF1m_C@SCF<6Nn5 z5`*xnw~Kp&BMAa63EuVBa1@oFZm}GQPn>>7@TJ5(jW-o?2xsCsUBTmt(M|{cRUhA; zh4O7f{&jm7^~fHz!P!V2fpuVV^tUo&accjXqqe7tA5*HB4L*E%)KH6i_WrPlf7Z`- zy`i>c+QL@e{^&ZCVWMV#5>|JgbR7g?KfI1I1i0tMJoaaJ7a5@v6Wb3rU@AKDvMK$b zCp;-(_djEow4*G9C7)&B2@m|jwq_Q`x>w~YA(?gWLIBBrQ#(Rw(`8K=JR7t{W~xg6 zOgs3gIM8034-$M`^|RWx0MZu>mjb?}m+9Xm-0BG+Q3RXY&bP0Vzk5xA*pC z@0J{$0+t z2&6I26+Fv#=-{*muXrQ~y0r|KZ=^&DH(d!@qU_{R!`_fB3>!5^1CnfpP& z*FCdzS`w*Ef&XRMi=q* zpoi&4S92*R?Tt!nZBz|;E}wi5iPd{-uo0v1RbLh)8{e=Gnm?oEU;DP6LVvqbftRWK zO(jfXQXCZ~hrLxB)!kucIHyjMYm=b3WIMldHJ#&1`D!t;v4m_rIf;{@KXm zzve&E-wG7jQjX&%*o?BVlleo#vnFvbdeL6-uu3`8t_qeNXER{N^pywmDL)Cb5^Pf# z5N2|a;xYTZ5n6otLqcbwPW9YtFJK<@6)7t_Zi*rw3CPq_sPKi^yKOZLtkq%dW^*!9 z>aS;ZJPK-DB&J`&-?8OLaSe~`Xe$TYg{s7S4eBJ8S`xwl-=wdT79gZXW$bUJH`Zp< zQ(?x9tqll|3y?0=cQqadZG?C9ul!XH1aqmjVOw$9^>M~DSxo+{;5kt(%~GWd?Os{w zOXR8jnQ^QF9#ZBr8}j+2*W=U7Nbt^0=P8yAs2^1~HO+CL5l7lo4D;4^1_J^f)P-ha zF!ob9_o>VB7f(?0{p)rAMQCuqX4ieZYKDd<5(5=SZV|2As2j5jwuzK8hrLS4fWOhY z8c{MQugtgVn>?*UDYr0s=0Ao042mY?`+aEfOA(qi5>e;0=!g54eCYbFU9i_tyJ<28=4svmb97 zG7uVDMwGBj=R^YogESM?JHP3~c~LW*cA^8cBuU5b9T{~1S$zZl-_&%)7D!U_6BSO1 zX8hU3dWox}ht~7G`lV6(v{`b18pkX@T7jGa1#A)gA{Xl|##gxLv{cwfZxvdUf-i_C zL>pE0giOD2wRtH$cf-1-yxZ6{`gAYh3q=kM?o|#ZZT{dxPw^UtEMKYW8=t`tk>C0$oeFjuMILAMF{k%mSs!=u&RwaymWj zJ-w*+7mL6FZ4I74;s*D|{O1mHON0m>|5v`epu58$0n>O&v=uQ;0sTH$HBek*>t^P^ ztfGg)lC>|XW(ZA@0s?+}lXg!P5K>Nc3n4r|jFQvMUKY^i+sO_L_G=C5i2n{wm)PtF zGf$KOu?UlHo&2f&%x&zw#MkLzaC>o!X{M6|7AJGQ?BT($C=5we>_}L||7vkXh>id7 z-UMJC)a7ngu1@^F+ZmL=rbC=XOfOd^QCq4)-ONcJU+~pKmR$x*fH{&S%D|Um$j`>G zU`H-t1MD75+K3DuPsJ@)_92<7$f|71{rsaM0dtRI^WaGNDo^v9`ZMhp>wP4lRM;VW zuLaf9nT%OxFyC6{GQX9rftf&GEbW0O&El@&Ld`Ta0sUponQUhnfD#CRmK$xyv%9LBB0p>-ALomt z6RY+PMiqMoL$em9GspnZD9lgBA4v0$n=_Ltul4wd`F0uS>uaw#druEW?Ku4fB}FN9 zI?E53<2naYe*024lh0AsAGI>-vTFHD?|xe0A_b*@psds7dutI#&p8;OIZ1;=hqE*? z>jyBS8p)2`m0U!$iHY2c-5^+!<3Bf}ku|ZMK0kKkc^% zFqPyiyv-OJOzivF$%o;qNQQT;o9YT<_L-c8eU-bGh4eB)Za4&k9yKkWwo%hO8!j=q zs7i2ej8}3c9AH*h4TgS%yf}zfm16HJHMzy{Jny9*)^xt7g@bjP^K{VSnThI2MSAZ8I8Ex*T^#ui46v zJs)<}Ko6jMlOPj6a!=6O(^X}1r%%TetG4m|QeQ~K7yrk9-Jra`CCMhP2tOP1JCmhW zf_r$G#BmCPg;yb9XeS5kx2tg{(ZEFu^YK<)7see*D7LLJ$BbjxdyBf|3=@y zn0!}`a8sC>MUYt)up{X8tlXsU6yGAm!3M`^tk5qdZUZbR{!&Y(}?H+eKGTEMl~%pbvc2?q|Z)S~hG zS1Hca;Gi;{WVM{4@&fA)aV&<7aI$4SQ59o+!9Rw9d7z!WfjN@V!IA}y`|dW3l=*t# z6kpRBeSsSs&^D8=B*V`;#2$(9Qv!-JEdvuAX|J5O)GqJNf`zjb&NfGbo}4EqLjsQK z%B2*c^Q$xuWKX$}t-e&pQk7+zsQPj}0+)0D2fIDHK5w9Cj1z_E+83(9cKlR}D1&I8 zx)-!pr0I`$%N&ej!B%^vXn5U51kT)Kl?S0iS?uYoO%gLzFw<)s+4+~ws76M_UEdtv z#DB*Amty;1084cXQ%XLX>+Xg4iv<*#>D>Vv|Bc5Ov{PD60`H zN}y$r9|nwF?am(l5gL_qv@U&wrn=NeIh_G0^6_G5No%1eTve@@fuw5nhrWeHmR8sC z6(&0_8@DB0$lxG%hMVl11}?L0JLDw`xXu_KOck15HE3>RND@0q^DywKJUjl3cf@`hzc#1;D>f zA$x}rrdHPc`xyAXFeO*9)(n-~{qmK^J8fbqpSHlewe<$xSRMGta2Rvk@U8Cwze|H~ zVPZ`pJ8T3imzKR61a0e1C)Ih*^ z;7?ke?dBpV7-aIX**qNU^daPhs1(o@{iy9Q)v?G{;@sdo=9IE~Lx!c?fN zk@5~Av0Tx>=aO6B%j-UWWM)P#tI~yDOC6JyUaV7)t&*|LLk9%m!p{TwDG+Md(Iomio8?w;#sFT&AyE*wRRbPrFQZzY2H14CW^XkI~$Pon*+F0urqh&`Z(f{Bi(78Q;*57%FBp2XsQmB+yaPR2ty|D69gTJ>^Lw45PkGt!J)V_a)+n01vy z6kc@(bWGckMYG>%;(gCv2M*+nyu)e&DWontw2pPorO~vDb7%$G6&=-{4r;q@RV9N} zKrLaG-4r$6Q8DB*`e^5ibu`TU={N3Sbk=~wbQqTsxS&GJ`$|>MKOAP z19rHVgel&}%*Mh-7l}k`9-bK4X>^)9WWZ<-J}IzBqsaxcz(?3H;E9D}y+4t+pMvxv z>+ku%c(dv9o{DME;g}`h%B)HE^}5y5ff8z`64L9u0PU4J_nd&^ohp}_(LoLZo&aif z;=K|b4qs3UP6nr#p5?9(8LW(jgTXC#G^`_AP2XI+yLwjgZ}19?uOmabG3sBtM2v^H z)$=hwY~Sz`a9?6>Fb5uBu8lZ z#RG?W^DXb?RW|(P3^G|kN=8mj#{cMivPAT%xF1wT(XNO4ucjaUy`W%7|6b>Fbfo%7 zsMgXG#zK9m%tI$NY(4G!5*;&cJlV`=Sp8mF##;_IoHc7mnq`hT&**)sNtNOjbQU5; zIe!{-_2PG5+>3h7UU=|Uf_mzk(bU9g)4PEJUB+A>D1B$-X5d_a_&_fy7wkE>Q)L9r zGLf679)`Di%)5e*jdT`T#3Om+x;0z`n(9)BHIz zqCd7S>7POi4{uErG*=GJfMT$0uYAGtc!6MQU6t}K60@77JIo@E7bLbFDYZG*_Nw>* z4k*v0H{ zC@EJV=J#iv6qALGs|xqO%S}n>3>mqzmE^Ux$w_N;QpTMyE=*+uI6x?8riTHI|Lg-W z8PrAv6N{w8#e;2gqohWQXX;CqGA<7bzBkU40c~9(zY$p0m{#;fFS9jAo!fQjKG_%< z%Kt`AtX5|wy8wA%9MEj4KOj7tBU7lMS)cYQ-fSvDs|Ta8Rs@bxvUT2?A)PmA%1PE} zk~>yzNf$Dy0Ey0IdMu^f#q0raSq`J)9QE7L3O4C+7V6yi12XsKm~W&OJ?;ip=Z6$0 zN_be7$9WfJ7UEFq^^AhW2Y4{GHz7QEgEb0NKtO#h9Dv%uRd=tz^!m7mJ{Gp|n&g#= z8RU@oXWI4Sni)0E4ZLKdOf)c@q+dqEgFza`>f0JtqenA}US~V)p!Z&^tHI`N?>R!a zvlMuu;myba)TCQs;J+1olQ}I)yEG#$^?W}AV-&tN6ybJ}2?EnNYWt$h?mzkPt-O!Y z3nBW+7Tp(kv5|3kqcqv9-g_6&LunI7-X>sEfUcuoC_2EDkscWa+YcDfSFiTE!Kwm@ zhnGs`*VG=wk=EH+o3fU< zLSUd$dTQP}ju)98H}H=8#1j-ekPNoHwGcae@ayJ-B|@TN+%z%!YSJSY`&8lQQw;4Z z37wR$56>BB9~m(TMtznnRpaPo6hj#LwV7Y;B`tIfz4>Ie54~PnCdixk`lp8-r`M5Q z40s{=_CU$(OkFwrA|+azc2G;FG-GnFac;Eve)|cSUs)SkqUBp^1W_(ENin)NLsjO~ z=I?Ka?Kgt#>8x;>8!N1$=8c=O*U7x6GJBW*L9K{3R{p_#)_sExBrCa8zQp zfl5A1vt%+-;5PbTgR&n~$UKpYPP~xic>pua1zmtDD7YKU6HF>UssF=rC^q0znnJb` z+=02`*c+_z=1No_Sl|E)_(4@xwuuT24|fO?chckYX;6^0%sM_IJioj%_LS?h_&+WO z#5?R`)baxU9BwXCp>e!GXn*V@&*-8TYwhzc#mvKgO6=Gb`Ln--TdD9KBs;k-2osi;Jd->HMpxVKhj2431o{m%YWXJY8SIVmCzM`=n}uPRL*ouWv02KF@J#OrG^k9OG#szIBkBFK7XO%C z*0Zo_OnR=xb~EHg^~@_ZT`HDn zM4q~${N?X6y?(DXjCNR!?Wm4~@|0`MU@!kR38&jQ`fiS#RO0&-lGS)-f~)mc$iad$ z6LmN7#phdzNUZTNdP}+bD_AsEc#QejdVe7I2WFDX<@TkNOu7b<`L6bxxV{=lJw;*d z4>|?Dl;KzwqE-BNgXKRDBZk!0-tqpX%qHG@jtK41csoEOhcbwd9e1U1Om0PAb`Y`V zYj^KBcrnUnBaW)YE^d8lza1Y5!%@VkT8B*%v-0yKxKLVfb@(9m$3d4tgnWXh&5BDfM!QsRav-t%J;mn<9T3#A8X~809D;3|YcNZ^%`+OaF$RoCJ zxlX=Pf}Q~8eQ*t!L23EW#L@o@$1~&?D+DiEYc9;AHFCM61)Gh{uue(G$3oTv3*|4F-V_>h4$of%e2t469=_cM zN=5dKr5dO(P1i#5-+eWSrj}_YHm6n`R`{mKxO;lMebkK9bK0GOZm10E@px)~+`n79 zTx9%6tua|=smyl1wd-EaZ!47(b#?n2JBXlAoq^TFnr2XP^?)t@=w4CM59Qz?M2X2j zExRS6;rU_hLLpo5qJ}ai@7p^r6bUPq5f5nz`_F&ff4IhCkmINEU-iqt#o*82i_{rJ zx5DMc92aj*VjHrix`M@=yV-!6ICA7N8V%obnngQ_Ww#W)Q{u@6^~w&EXSuwk?toIX zmOsq;#n7kT^!cXdHz{62cVE(n5g^O}hBWXg+ znTb1FtDU9oG(TgbdE2;NyWPy-QYBNn%OLu%<=;lvPy;*b#DEn2INiSU*Vq6$RX>K@ zu}0}31E0wbQE>%a=at`+WJPPWZ$;()oMd=DE(>b)oM|VA-{o!!>)nmkF=?h$CvCtqBzJVH0_32T=!l^>n;+EBld!^0DW)U)92Z?Ho%QD#m? zIOXy6iUf0^bqKj351#A#6G2a!7t_S>D2FQ2SjGmt(=n^pPNYDBYp~9^((YdU0Pg`t z3ub6bd`s`bl6kWtcC)kFcgGnwbK-d$ImL3GJ=WI2u zYr=@X`Pp9=2}*vE7SJoz!?Q%NC)maFBi-d~7C9vWmihJCp@peiUwiP;?W;R`q6Ze;A1+jA64WI**%_^Ye!H7sY~$no5CW>wPK?N<>}+KKs^6cTvFUuJf7gAw>4eZM#Qf57u0rQ{$N-M zm-9PsR469e!T6|9PnZm9OSipy+SjD^YKXuC4N3S~1MVD;1nC`Sa1HmPjXdq&6uf^e zwSLrYzu3v;Wf%ppg>7n@S%i8!?eep3(G-PBSO{nx|N8(Uu?PGrCNIR9c|>Z#>e7|P zU%;nNBV2()s_SOe3vX*c?mw)?kIJ%P8x-U8&<*z?s#|59Hcg$31d!8J&mBI-e_%U8 zDoo|Ucsur!$eu2IivK4{Dw)hpt|;_vi#faHz}nMQ7W{J*XTU!P&VN0yjL+z}M!O4( zEh6pUVSqj6S&y{0E4laO-*>Ot24BfEr=6{{eh~j}PvSJQU108GUS-GA1Wmy%TAkm2 znsrw36@dlUL-v3mU%kSjw%@6)A+ZSz_oyAlni}2CBHXCm_6=^aP3{YAM5i{Ypb)i( zheK@P&n0+Ls9&TfH>7tFU!O_6=D5vIXjSS4u25A0w5XFjNG>S8XSjKOq=e7aX)?$8 zT(8dL8a@`I{Q)(MttCHaqSPqUK79Th`OX9WAcdp4nkNS9XiNQOLkgAbt9eQmVS&&R zvOpLzfQf}Y&(&8O{>3uljU~=Qg&ynex~V7p)ZP?xA;jM+AYM5c z2S;{0ln$3Vb$8qPYVsjeOg{v#a}T2P&cn+(Im#&n{bxg*7uD@p_PC9y6sgkrxZzrGmP*%-ohSORzx-;6O zq^5d%Zylw{9o-%FH|PpbD>G{`?W6&$`3GfDX-)2T4eM1JSogeA*sA)2qNP`eKR%!HZk1}8E@AXvg1FMU~dj7>_I{pbJQoS z&*WYxu;JL#LKgT)o(xCNZsq#Xoln1}H`Z489xLt?M4y^@y*n?f*TCnwIX(-P6XmcW zY*4ZvfIzen+iy&RoX_iA&yFS*%dg+eKbmMYN%+L#wG?4w;1~T1ou=rszDt!9!vIK~ zexWP^hl3;U6_KfbPsoDFC3TsekRds`#BrV%jyeOB z#cipusfAzO|5@yxa+P(e7IezKm-YTbY6bS;+Zt&s-yww|6T1LQ~P_zbR63?_Wtx-e7n4o8rSs{psS43_yGh7@&8*N#8d%sJR`6t;PFN zx%~zek4=MY`#$l8V+$_Y2a+$uBCtb0VS-hYr zuF&g)sLd=B6~(52#1h3WC3QZ1gfrsNGh8Q~`YUV)I-oYSzPx%sjgq;1xdwuIl%28h zI!(aAT!ZA!9WG}+u`rT&n)M6KlGA79SWDPAdAQ|i9eeVx5oz}Id)D+|2wT|WH<@zI zfNRho+Gu%`s?hf9CQIsJc>q0`;WjdC4>}s^UGIv}KGYm7Utv%{td&40RwTE+4A1!c zHLdU3@kG@?FSnj^(nz8&HCBJRmimih#NV5QKX@q{-2`jDzLZ(z2i!Wm>?c`x-zWJ4 zDb89{%(rX5s5LymTh#Q24tptVttgt*dw03eskVlg#f(*~Gc>16tqskW+e*0H&v;y6 zH+xqjM0B9#-|dA+=?(0`(r0JHgHhdkV_Pqe|MadEElf@mHxGjJbe#@F!^m_Dw~`yJ zEY2$8wkGJrggpT3*CKwXWZSrw>WDJ$4ZN7Z7@RshCzb^-$buDAR8BTHqL=;1el1pw zojr}bE5LKRlUlKoV!#)r^k!{BJdUq~#Obi71L~!Fl|Xfx4=`0}&a_xW@jcl72>bzM zd28ecMK#lmsd)?f`|R3ljIUkMeaSspcAvtZ9#=ZgzK4z4w;~M;%C9)!DZYMcvtb^9 zd<1W&mn+j%V``gyFM5q^#;x0B(9D8Lk-ePxAL`+;9-Ig8lpO0$5ffYvk!&m&>NEeq zRO9A=2@B`xt_wtsdpS1&UtSQqe$*j5^weeETSx^vTaxw^a%CpX>S%HKw70E58}kmI zuo0}a2TZWNsQPRzm4?~%Ln#&)U6n9nR(zsgQ)0OjySOl`ID<#Is;c;)`GH+uGQx@K z8IDx3nG<%%I9P6<(Bv6)L zZT>p8wn9*;-PUM09Lw>@0-C{x>J=Ad3{+UzLrnm)ARj%QWjYoCh+-z9R&Nc82F;`wqtV(DP zmTpU$ym%|uye;o(gtPWJe4a)s2rYFi!%1a_5BvGL@)gI(>rEM-hb`npH}#YrMeR~L zz|eme30}sdriDHvmcK&-qPKx8>i8r&)+k{F+eO({@~9DIIUfek0U)6&>|I3A>nG)c zoPu{h2ykJ>1gy4lE_`AN<0BnVN{6S zLE1Tmcb)Q{Jgm%{DNm2qjMurNt+4{%!Pg<2la*AKrnXyxzM5E4SI9Mg0&}(8YWZ_n zqygi)dTl@hFc$LRCP*#*hhq zX*Yd((Y5>jd?&hC8w>vxyr9y^jjs8eSk(ACjehhNXfu5u2x%z1ErC$-ww{VzEo6W0gjIZxQiw-@syi(SpTUTy*~;4{{NX8Z- zMglcJ4=jR~uhTBDxP6pIaDMWnR)7uh)q(psH}%HUr_t2!aS#k?(4vNN@(2(n}qG<&&i29HkOD62gp~emo!t2myfn6@AOZ91Dfk^#(?95l^5gZ zpWEQKm26}@f?z-EZ{iadKN%f=vucHT1x~HkUr9BP!B$6WUacr|{0$h`rc};`g{Tx#dm!GZwAF%d`Qt-tv0J2yB~ptu4iwWjZU+@6 zdIJ}2GR22r8>H)gt)=!`fSw{V*MCYMCCAx*glj_{F+z3kk=@|f!N;=Rw(+_zo~_iKE|v6FunyNMn#JsP z^ld7!iqGZ-V3umCsmMzcu68B0=QNV(1FU;gjns5ns-wP~Qn))|gS6iW)kv*O>wf0_ zO_%hI?K-(oVs?TG&D4^7udlk&J1qm#zqQyKGs`(HF`|{t3GH{YoAYGpIOC;Eh(dXI zPc6A{`gK*O}3K})s@;xd~w*=5cb3pVE`kG=?C5TkFN}G z`AKnT>T*PL9#wsvf!RuXTDYqLU<1sKW3bhMDI_FY^>O5*d`)#wPd)a*#AEVl`pI@- z{BSOX(e9f$n%&1LDJ2tbF*4%-bO`(1&_(UwktW&$vwsAc;^rE-(u-NfC^{_&+C<`&|OPZY&173_5Q)d?DjYYy~M zjlZUZDs7DsCV6Qvo^dUe7J}Osa1QbXYz*DQ)`R{Ea>G%Sy|ZT^1+$9ck=O9Ej;RkO zl?RXRi4hjZKoMrX96&S>>KEa4p*bZBo_Q79j$AFHbI|^T&Gt($NfE`*Zx^oRmfAeU;GGOD_A(YWG})%oLW)xT!E=n0R%rOtQw>-drA_Mk7z;;c4~4`qV5 z8|V`ndUG^0yYW#2zyRS|BB)n?TvQ)Mvy405*;`;4-vc)B)=-I38Pqr#u3F9$2sT~C zPmkTBYxb$rQ|EzUI#i@qFFlRInHHBHxl zv9x*wN51%)KU+%OLgQ97EjyDHDo=tFfjuPPdG-|7F_p^lhWRARV9=*d&`36F@< zBk&rmFoz4-#X}s~VYoBu?36Uz&&1mezpJyZEDNdweY_KU+sNzUr9KUCpTj?WL^ z?MR-f&~l*_49GJRzr@xk5*_DV*ywwK``7~V;T7WDjq)q073Q$n6NO<`@o&PR1|Jo> zxX@PZUp&1SYN|Dy5h}5JaB`GPu@WfcT=jCc@Btpq0nZ3y9SCRHZZyZ??P7#}d0+Xl z6TEF(^FpD3z#^>)eQk4piBn@Anp@>Nq^a};j<>xqG2`!==sVeO zUBrkVFcrZ%tZRK$l6=lGr#StyACQoEC((w*X_LFiuTFVc)!aN@w2JdvIUmGZF{FZh zn_l#D65VU(%g2{E69>BQkDVmTsH9bdari+@Pvt|#NXgrpZ17+1Hc}Ji*Fx)m*=?9F zQhc%V>PK4&>;;BkLleYet8D4=Rys%e^+mTHjqdXAYDN#Cx!VKpTJVhh8J%!rN-1Ue zZ-9>wbvJ=6EH#}>K&*`-{=-)J!w18AVPN}yjx7ghz5C^P)KjzXuvX%d(C^wrneuly zSC8sIhY9Q6+(ZR$?3!i%y)WPalw}{a^7iQ6Tpz%AseBm;KuDqQ-@d^lP{}4aus%hj z+$uw8PMAHO^dZ<>xA~$U;(B`;iMTsYX+y|->q_m6K7J_u?hCf={iw>Jvb1-CLnX&c zhFSQZEM#S<(+ts8Or{yxOyOVk#-&bFH*SB{7Ci>P_opfQ4?ec1n&}$;hDKaZ2pahU z-#J)r{4q*kkXs+Vg&_<4Fn7AEAy}>SNzr@tJTEW$3+g^ajsf#DabCneuer;l;+v_@ zg%eyPSKk5{lB$200&Kp|f8?Ai5Uo;ba7JnD{%*apumJs@yOOPRwX3<5T76Ueo!QZ! z8A;6Y4$N;PTaEUeGqnjTt)4^p{XkoL<)S=|G40>>nL|60M~a@nw>eE`ZLNK01oZkS zpGeC;62KSx6uBlE$Mjc;(e#c|bZrr~oGO=CzP~c$k{t5u{UCad!g=VSR_VnNZc>xK z{Ds*5pq3foWP$Ul<}I|+tl#L4GQG_;JgFy%;j3hJ1E&0{cQVaYPPo{o8fJ)HYoziB zvH6MS8>-aKiTx+SjQ0+qz6SoBNb1>AOuu`4_PUv`Ef@E8Uhxf7Xd}lw-V%LN%er;y z3)sx!Y9q>^Q^(3UQW-K$imvnm#*pA{PV`Nl%5SOaaTe3{*&keR)xpka>03n$S_s64 zCS#$&$Rbkfepb8xly;K<-dZ_?qSHLz$s7p}kd_5RF59|Z2zec3&o9Keu6C2;uh zG1wG+QQsatBX9Bdt0{{V%&tHqHy4tAdqTA}Cs~TIo0(o1Qu|py;1x|&=-G3Ll}V{G zXfONxm-^{(pL#6+6{ai^6nxG}5yOk8)_5So-cpFTK^!UAxRKcr(2gE13vy;5s#cex z+@UE7*9UZTM#>Om4u$+5Hcan63FcOxknAEA5m!0d2DxDDi@=ZuO_>LZ>MX&@d;!&hXFL$SCc)+At zGWblNv&Y{^rqJ?^dkW-o-g)2$gxnbs7cs2_Hh*Umd|Z5k>KX$8dpSqb{Q=AugC#88 zqutfbF&WLB!Vzn*B=J^UEjZhWdN|RXu~;Nq=6xtm=qckXJ&TzLC@=4e2c&rRB?4&n z{$ONiH}SqJ!pRS{_2Ak8+;uPu!RjV#ya!zv((hZ)?2UmEHl@$B?Q8HJ)a3lX9`#@? zoCnTLwZl=H588M?Q8LMque~S)_+wNf?Ca;KovDvYTgu-VPFX(m0OWL){qHUX^8JF> z`W6buIdBASn-mBnrth^w8TMKh9$(NonG~e0S#}Q=^tJCSo_I+{u7AmktjCJD5TGYW zc@?GgI!cVxTscG=>b2Q>aLtPBS-17p<1e=57h;Zss2Q18s1IqWZA5fe#ZBUyj_tYg zi-{N4jZ7+4GLAqI0SLcw(iqEX;VxCOJ7A_+pJ-+4l-GFZ zxuEBkHq~G1BxQ38=)}&@!BwY;wz-6b=S59=LIfo7A#NGMjs2MDz<(pV0XJzrxwgEd zg-AUc?UJG)uL4%^-oKe{pR75xAqXFEkS0C|SY5!-v8}eCF7-`#sAO$7QG}bsG;nsH5!e{XC9l20OBUmmC|&#szke;nsE-*$6i8 z)*>KVr@iWRD!DIoP}7xlloo20kz(@@tlB(4x+poon09PJWvC*yw9&c3xivq+(2W|2 z9FrW=prsgn1k!#TU~L)^Ba?Gf%W2w1AdzkO(F&L*w zEB%xCh39L|$&`bG8>CtiYjkVC8ix&|(t`axro2IEtR&VTdw=O;n_<|T^52?`m-9nk zoBz%|*B)z|Q9`!{YGX&KyiHp334v?Qq{Rr}_B)Y}1)>Ek!?zk>hd3^q}y<0TZ<_mTeqKG+n$X>Zh&9gjAPR#4wnNbthVgw}9WY*Z7#?^^x9&28XX~f!Jz_gv)cW!rJ^C2T*ny{8qb7`Qk+SnRGvP`VvDh{P*$%@NX*Z99@NjfpdBj%+(L4v8dZ zCcv?DGS#B-rgfReSLC7K9^Uj=43BwUcXT$um^Q zOGhU_H9+l55o^ctSUZ9QO@UOr2^)MHJ9eI$k()An-MV!h8a_JttBh-xk3Mq!>(_;~ zsKhks9~tl15QlVY#WBb!nlyj+8nH&8S%oI+0BhSf*(juWH6$rmWhANQC)~W+3f*%X zmj)qISkv6vZeVRyGwIeKI5tK{#?{>KMkVqF?sE_lb`;x!c*$d2%U-R> z7n&I{sAZE*9Pks?9M$qzBhk=6MaP7l&E%cQALKE7HHtQ9X@ zKVejIYXV@P1lB+`$F;~mO+h!KRqY;sn^sqQY1V==upyIf2DQA1G_kF7iD$ufw0Lr{ zlese%BzAp`10UktT4GVe2d;D+N_@o=)=7Frw$pKu@xyeX#SOhJLFAZQ)5tlQmP<>Q zqPPUjPH+rzf>;}MgOC%@G~nP_0qwJL%sqE)jCRe;ny_Y-Mj@{oy{?*H`!dEMuRIdC zH5@zJnzhDjJ)rhB;Vc-23^fyVYco@hx@54iI1BL?*Q~NUg&|0~wJa7AS+V^|tO*zj ziCD31MZ#Ovchj!jmsVDkXr?rBARQ0>P z8geCYSBLzTum*FsVq?Lrtw7qiBI4Fis-+ax=(b3+pf267SKH{`JrcciVGUPlWpOi& zH3BgD?eCnrtRoFiDaF5G|@~Rjbwus z+^y-$`XSIQN}4pc(yydnQlnN%xxM7!i8Ud+0@0iX3-MNLv)zwj4s|dcC z2tJ5tf>9Ykf)7yyK@_4AgMzk3%Xon)5fvG1lLsC3K@9p5#0yw$71T^hz0_#DRijl5 z8ZBx|6_YfmAd;a%eDg`gwe~uD*6h7kqU9Yj>(CNb6qBsm(orYp1sc zu-5BiZ8JWI8Fl~ZStyBJ3vdf=jeZSiOWj%-Yw4p8TL`Zm72O*25N=IS3t;3N zXF@IjX$#Lnwph6aKulQ^x_t@o`pWNZ}&Ot6e_l zxbvYtqx_iTyjz1j{}{`Z5>>TleF`|ERa?;{BqkqWhjvjXSVQL$f>@JZ1J`c#v346o zLqOMg)AeT~)}Y=m!%XDQcwAH?)&kgM*G~Vgm_ft5ArbqZ4FnDojM&26R+sh<+gJ>~zx+FJf;RL4@D0&dGwmHvv7 z>GC<{rSaVU%{BVyM{0Lt+1vKT+^BIUia>0XCH0a?p>~NZ4hhGxp5;TuTR%&szsimjp{B0 zu4yl1inFJev8La8aaApNwMzaaYv*?U;y8c{f&1M>uO@!!@0Fir_=i4dxx$#YR*w8QwL(>U;1{5?={u}8xpL|FvPaH zTT^BpLHu5^TW*aq&zuEUb>kyA$7T)1|84z!j5S`kD&f9nmp^B$S-Q+bH(|31ZcWPI zT)RQUsqYW{Z}Z|vMrLH%INNj@lCh|{$PY!by$%7I0cjG+R$5srubG)tl>4qn*Z;`c znvb23O*?hG>nPv0R{qqQvW0Ztby=xf8$VwI+cSChRX?U+)et-48a~^a4}#q5g=c69 zYr;fT#kIBH5Nn%1+`MG0t;wxX7lT_9)}jv9esklmI8;6G_)Z^Ef75>c9M^p4ZvzxO zL_eYoP~-Ly_4g~EhOFiwq1B`K)GVg&TccBBU`ymkZcQ7^t`TYs*$`MY^iaL+W_{B^ zM@Q_|9%?6~yc%MOv9$EuFWmUikA8IH3t$@LJD8upQ0aw?=X*DuZ#59n1htS~{M>!y z`=XGhdWc)AVGU2b#GjM}z6ho?*ck9@H|yr%j_+!uSBwqUuP#`L=6ywp#JA-f+ajp8$Tc>`>yYnY(61>9t7l1D@@H<3PqzP_TRU}fYipy^FF*S?s>)C@ zU`LQ|Z7Z*>d5&Q$E~JraGHFvvR6rWICamGfkO#d3aczIMZ`Npo#I@aD2CRMk7NBOX zUGkn0?C_7Dw}t}@>h`z(`lmmWYShIFQE^3WZca@CHFv$dc7VJNtm!F`&|P5-{rz~E z0vc*k?Z~TYc57N&L&06yCK_8+!diAZ>E_4ufq}+v3HJde?3a{c#i}w;3DIxKH)(h#J+n6_P=!v4U4ytTByZTaMub>c0l|@lQrkj;{ZKwKa6D z|L8Pi`B5OI%P8w%IWmv1w8k7x)S(>AQZet=#yG=(MC(*cDMYp&x%T@Vplt_O>*2$u z<=58xSc{LPVsHPKzYU9PG;0RizQOa?{$oZk_U`=e@L9)tg4TDgU-q*^=2+BY#y&^p znyF^D#yQCSKGt@1+ghX=tL3BZ?IS^LfNDo@YuYnH&nBd?wiX$c+KhI4iW-Av$AV8o zsXU07)>3J;X7J!&=wnxxFzEC}qLEb)DUp{c!ZQQY>Rg*z8hHBT)Iws{0^Y8DAI6T> z?wx#gR`p28glqT~Z~WfJc+$td_dEj)MOCT`x}v^1)RMqPEnWTMji8TRd#l)PrzWXm z#@+dTIRDz&nYs)Iu?%HaY|CiYY#Y1wv2X=g#I{3RY|>wbmVdpKD_r_+rzm z*L&27t(k(}eeDMIMKGVaxx1gM731O?wJx3;<}ScqyU@M^@` z+9g2ES|fABuRhkU3q^W>@mF{=TeNG~&ToVzAT#1DEU!iN_V;gZd1-AeVyzdjCa_fu zUftcUum))tWWd_Gme#~IWPqA#bw#$QHWjGWWQ6(0s?0>QCbTgJ)j?V6gmM98DKJfu z;)H38h=4r(N1uB&q1IvW0|A;#OYeNIZQT^OHbuu~x(y0Ojln{s5o+9FiB48mOt$1| z6hU|!7kDkA8j5AM6JAcEt)$m0&@t5%v#e95rJWRH?kiQ)npYlYTH7`C>(T`oX0~g` zmC=@J99;X4No1>uevP|E;MV{(&Om2t5_P7VGF1OR zYis4FQn@Z_G{;vqY(>(PUn&~5vIi?%Z05R|8Ml@R8#Vr(o@$M?h_xMYO;|e(vTbqG zNWj|eYTvEtrtHnH2LWpd*EVm~_pqh?<`MT~=n={vpvb_GL+qG|R z;(M+eYj=11SX&NmEgCiycs0m&4F#PFYuXEGx8|DrBUvb%)?R2o6G5s4t^sBcYO+kT zkWwoq(bi~n7)wY&Ef7Hx)nZM>u_M?zY{5{s z$gu|rM4PI52OHvA#2Q6(0Bb-*_bAY;q8f5jH=?ZpYAn{~+O7SA%crmRvG%QB2Cc2F z{qvW<{9f>CfBDMApTyZmDuEg*H;E1pLA8T}yFWD6Xx4Tstf4F9BH|Mv;nk?F%o=M^ zZTs#5wMcPo?UlsYD+AP|MJ8iGbC8K!8>^sJam_pn6?i7DL6K|`Y_wls3L-L%=umwH zV-t?zsW+=F9nXzqOP&*Xb4rqDvjn!YY)Ljl4GE|*QOs2n4Pnq}$g@~gI-9yRmIfl4 zwWtE!SXjAMF9|7j4YeH7?5o`MSjpODxO}=YkuJbqk|a|@Jz~09k!_=k6q_~99)L9O zjTG3lzV^�%_0G@|u2PL^dQz=1L|_14B=t-at{*M7Sl@qVZ;?r6{Y9l_$TpR<
    V6uBG$;Yh_xR4TErUY(CrRljat)# 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
    Kk16DS2 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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/reddit post/mobile-home.png b/assets/screenshots/reddit post/mobile-home.png new file mode 100644 index 0000000000000000000000000000000000000000..7b72fd6b613de627270ead0ed3a7f277c12c1df3 GIT binary patch literal 87302 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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/reddit post/mobile-player.png b/assets/screenshots/reddit post/mobile-player.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b4e49095d1c7551b7373bf2b0fa1aee543bc2f GIT binary patch literal 64858 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
      a3bU1CW-2ih_aybpZsd8FCB;o9(*mfVFyL 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эKHi94_lV5^6_2 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/dev/null || true && \ + rm -f /usr/bin/nc /bin/nc /usr/bin/ncat /usr/bin/netcat 2>/dev/null || true && \ + rm -f /usr/bin/ftp /usr/bin/tftp /usr/bin/telnet 2>/dev/null || true + +# Use non-root user +USER node + +EXPOSE 3006 + +# Health check using Node.js (no wget needed) +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD ["node", "healthcheck.js"] + +# Use tini for proper signal handling +ENTRYPOINT ["/usr/bin/tini", "--", "docker-entrypoint.sh"] +CMD ["npx", "tsx", "src/index.ts"] diff --git a/backend/docker-entrypoint.sh b/backend/docker-entrypoint.sh new file mode 100644 index 0000000..bca58fb --- /dev/null +++ b/backend/docker-entrypoint.sh @@ -0,0 +1,59 @@ +#!/bin/sh +set -e + +# Security check: Refuse to run as root +if [ "$(id -u)" = "0" ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════════╗" + echo "║ FATAL: CANNOT START AS ROOT ║" + echo "║ ║" + echo "║ Running as root is a security risk. This container must ║" + echo "║ run as a non-privileged user. ║" + echo "║ ║" + echo "║ Do NOT use: ║" + echo "║ - docker run --user root ║" + echo "║ - user: root in docker-compose.yml ║" + echo "║ ║" + echo "║ The container is configured to run as 'node' user. ║" + echo "╚══════════════════════════════════════════════════════════════╝" + echo "" + exit 1 +fi + +echo "[START] Starting Lidify Backend..." + +# Docker Compose health checks ensure database and Redis are ready +# Add a small delay to be extra safe +echo "[WAIT] Waiting for services to be ready..." +sleep 3 +echo "Services are ready" + +# Run database migrations +echo "[DB] Running database migrations..." +npx prisma migrate deploy + +# Generate Prisma client (in case of schema changes) +echo "[DB] Generating Prisma client..." +npx prisma generate + +# Generate session secret if not provided +if [ -z "$SESSION_SECRET" ] || [ "$SESSION_SECRET" = "changeme-generate-secure-key" ]; then + echo "[WARN] SESSION_SECRET not set or using default. Generating random key..." + export SESSION_SECRET=$(node -e "console.log(require('crypto').randomBytes(32).toString('base64'))") + echo "Generated SESSION_SECRET (will not persist across restarts - set it in .env for production)" +fi + +# Ensure encryption key is stable between restarts +if [ -z "$SETTINGS_ENCRYPTION_KEY" ]; then + echo "[WARN] SETTINGS_ENCRYPTION_KEY not set." + echo " Falling back to the default development key so encrypted data remains readable." + echo " Set SETTINGS_ENCRYPTION_KEY in your environment to a 32-character value for production." + export SETTINGS_ENCRYPTION_KEY="default-encryption-key-change-me" +fi + +echo "[START] Lidify Backend starting on port ${PORT:-3006}..." +echo "[CONFIG] Music path: ${MUSIC_PATH:-/music}" +echo "[CONFIG] Environment: ${NODE_ENV:-production}" + +# Execute the main command +exec "$@" diff --git a/backend/healthcheck.js b/backend/healthcheck.js new file mode 100644 index 0000000..2fa64b6 --- /dev/null +++ b/backend/healthcheck.js @@ -0,0 +1,24 @@ +// Minimal health check script - no external dependencies +const http = require('http'); + +const options = { + hostname: 'localhost', + port: 3006, + path: '/health', + method: 'GET', + timeout: 5000, +}; + +const req = http.request(options, (res) => { + process.exit(res.statusCode >= 200 && res.statusCode < 400 ? 0 : 1); +}); + +req.on('error', () => process.exit(1)); +req.on('timeout', () => { + req.destroy(); + process.exit(1); +}); + +req.end(); + + diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..c22d6c7 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,5578 @@ +{ + "name": "lidify-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lidify-backend", + "version": "1.0.0", + "license": "GPL-3.0", + "dependencies": { + "@bull-board/api": "^6.14.2", + "@bull-board/express": "^6.14.2", + "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@prisma/client": "^5.22.0", + "@types/bull": "^3.15.9", + "@types/fluent-ffmpeg": "^2.1.28", + "@types/node-cron": "^3.0.11", + "@types/qrcode": "^1.5.6", + "@types/speakeasy": "^2.0.10", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", + "axios": "^1.6.2", + "bcrypt": "^5.1.1", + "bull": "^4.16.5", + "connect-redis": "^7.1.0", + "cors": "^2.8.5", + "date-fns": "^4.1.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-rate-limit": "^8.2.1", + "express-session": "^1.17.3", + "ffmpeg-static": "^5.2.0", + "fluent-ffmpeg": "^2.1.3", + "fuzzball": "^2.2.3", + "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", + "music-metadata": "^11.10.0", + "node-cron": "^4.2.1", + "p-queue": "^9.0.0", + "podcast-index-api": "^1.1.10", + "qrcode": "^1.5.4", + "redis": "^4.6.10", + "rss-parser": "^3.13.0", + "sharp": "^0.34.5", + "slsk-client": "^1.1.0", + "speakeasy": "^2.0.0", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/express": "^4.17.21", + "@types/express-session": "^1.17.10", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^20.10.4", + "prisma": "^5.22.0", + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.0.tgz", + "integrity": "sha512-X999CKBxGwX8wW+4gFibsbiNdwqmdQEXmUejIWaIqdrHBgS5ARIOOeyiQbHjP9G58xVEPcuvP6VwwH3A0OFTOA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@bull-board/api": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-6.15.0.tgz", + "integrity": "sha512-z8qLZ4uv83hZNu+0YnHzhVoWv1grULuYh80FdC2xXLg8M1EwsOZD9cJ5CNpgBFqHb+NVByTmf5FltIvXdOU8tQ==", + "license": "MIT", + "dependencies": { + "redis-info": "^3.1.0" + }, + "peerDependencies": { + "@bull-board/ui": "6.15.0" + } + }, + "node_modules/@bull-board/express": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-6.15.0.tgz", + "integrity": "sha512-c/nnxr5evLNgqoSSEvTwPb+6WaTB3PN3Bq2oMTBtwCUJlZr+s1UX7gx0wVIYHjeZyUdYR7fX7hhh2cRLO5vqeg==", + "license": "MIT", + "dependencies": { + "@bull-board/api": "6.15.0", + "@bull-board/ui": "6.15.0", + "ejs": "^3.1.10", + "express": "^5.2.0" + } + }, + "node_modules/@bull-board/express/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/express/node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@bull-board/express/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@bull-board/express/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@bull-board/express/node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@bull-board/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@bull-board/express/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/express/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@bull-board/express/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@bull-board/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@bull-board/ui": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-6.15.0.tgz", + "integrity": "sha512-bb/j6VMq2cfPoE/ZiUO7AcYTL0IjtxvKxkYV0zu+i1pc+JEv3ct4BItCII57knJR/YjZKGmdfr079KJFvzXC5A==", + "license": "MIT", + "dependencies": { + "@bull-board/api": "6.15.0" + } + }, + "node_modules/@derhuerst/http-basic": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.4.tgz", + "integrity": "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw==", + "license": "MIT", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^2.0.0", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@ffmpeg-installer/darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-arm64/-/darwin-arm64-4.1.5.tgz", + "integrity": "sha512-hYqTiP63mXz7wSQfuqfFwfLOfwwFChUedeCVKkBtl/cliaTM7/ePI9bVzfZ2c+dWu3TqCwLDRWNSJ5pqZl8otA==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "license": "https://git.ffmpeg.org/gitweb/ffmpeg.git/blob_plain/HEAD:/LICENSE.md", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/darwin-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/darwin-x64/-/darwin-x64-4.1.0.tgz", + "integrity": "sha512-Z4EyG3cIFjdhlY8wI9aLUXuH8nVt7E9SlMVZtWvSPnm2sm37/yC2CwjUzyCQbJbySnef1tQwGG2Sx+uWhd9IAw==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "license": "LGPL-2.1", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@ffmpeg-installer/ffmpeg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz", + "integrity": "sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg==", + "license": "LGPL-2.1", + "optionalDependencies": { + "@ffmpeg-installer/darwin-arm64": "4.1.5", + "@ffmpeg-installer/darwin-x64": "4.1.0", + "@ffmpeg-installer/linux-arm": "4.1.3", + "@ffmpeg-installer/linux-arm64": "4.1.4", + "@ffmpeg-installer/linux-ia32": "4.1.0", + "@ffmpeg-installer/linux-x64": "4.1.0", + "@ffmpeg-installer/win32-ia32": "4.1.0", + "@ffmpeg-installer/win32-x64": "4.1.0" + } + }, + "node_modules/@ffmpeg-installer/linux-arm": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm/-/linux-arm-4.1.3.tgz", + "integrity": "sha512-NDf5V6l8AfzZ8WzUGZ5mV8O/xMzRag2ETR6+TlGIsMHp81agx51cqpPItXPib/nAZYmo55Bl2L6/WOMI3A5YRg==", + "cpu": [ + "arm" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-arm64/-/linux-arm64-4.1.4.tgz", + "integrity": "sha512-dljEqAOD0oIM6O6DxBW9US/FkvqvQwgJ2lGHOwHDDwu/pX8+V0YsDL1xqHbj1DMX/+nP9rxw7G7gcUvGspSoKg==", + "cpu": [ + "arm64" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-ia32/-/linux-ia32-4.1.0.tgz", + "integrity": "sha512-0LWyFQnPf+Ij9GQGD034hS6A90URNu9HCtQ5cTqo5MxOEc7Rd8gLXrJvn++UmxhU0J5RyRE9KRYstdCVUjkNOQ==", + "cpu": [ + "ia32" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/linux-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz", + "integrity": "sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A==", + "cpu": [ + "x64" + ], + "hasInstallScript": true, + "license": "GPLv3", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@ffmpeg-installer/win32-ia32": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-ia32/-/win32-ia32-4.1.0.tgz", + "integrity": "sha512-FV2D7RlaZv/lrtdhaQ4oETwoFUsUjlUiasiZLDxhEUPdNDWcH1OU9K1xTvqz+OXLdsmYelUDuBS/zkMOTtlUAw==", + "cpu": [ + "ia32" + ], + "license": "GPLv3", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@ffmpeg-installer/win32-x64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ffmpeg-installer/win32-x64/-/win32-x64-4.1.0.tgz", + "integrity": "sha512-Drt5u2vzDnIONf4ZEkKtFlbvwj6rI3kxw1Ck9fpudmtgaZIHD4ucsWB2lCZBXRxJgXR+2IMSti+4rtM4C4rXgg==", + "cpu": [ + "x64" + ], + "license": "GPLv3", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", + "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", + "license": "MIT" + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "devOptional": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", + "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", + "license": "MIT", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", + "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", + "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", + "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", + "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", + "license": "MIT", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/inflate/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@tokenizer/inflate/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, + "node_modules/@types/bcrypt": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bull": { + "version": "3.15.9", + "resolved": "https://registry.npmjs.org/@types/bull/-/bull-3.15.9.tgz", + "integrity": "sha512-MPUcyPPQauAmynoO3ezHAmCOhbB0pWmYyijr/5ctaCqhbKWsjW0YCod38ZcLzUBprosfZ9dPqfYIcfdKjk7RNQ==", + "license": "MIT", + "dependencies": { + "@types/ioredis": "*", + "@types/redis": "^2.8.0" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/fluent-ffmpeg": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.28.tgz", + "integrity": "sha512-5ovxsDwBcPfJ+eYs1I/ZpcYCnkce7pvH9AHSvrZllAp1ZPpTRDZAFjF3TRFbukxSgIYTTNYePbS0rKUmaxVbXw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/ioredis": { + "version": "4.28.10", + "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", + "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-cron": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz", + "integrity": "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==", + "license": "MIT" + }, + "node_modules/@types/qrcode": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.5.6.tgz", + "integrity": "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/redis": { + "version": "2.8.32", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz", + "integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/speakeasy": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/speakeasy/-/speakeasy-2.0.10.tgz", + "integrity": "sha512-QVRlDW5r4yl7p7xkNIbAIC/JtyOcClDIIdKfuG7PWdDT1MmyhtXSANsildohy0K+Lmvf/9RUtLbNLMacvrVwxA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/swagger-jsdoc": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", + "integrity": "sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==", + "license": "MIT" + }, + "node_modules/@types/swagger-ui-express": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", + "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/serve-static": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base32.js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", + "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==", + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bull": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/bull/-/bull-4.16.5.tgz", + "integrity": "sha512-lDsx2BzkKe7gkCYiT5Acj02DpTwDznl/VNN7Psn7M3USPG7Vs/BaClZJJTAG+ufAR9++N1/NiUTdaFBWDIl5TQ==", + "license": "MIT", + "dependencies": { + "cron-parser": "^4.9.0", + "get-port": "^5.1.1", + "ioredis": "^5.3.2", + "lodash": "^4.17.21", + "msgpackr": "^1.11.2", + "semver": "^7.5.2", + "uuid": "^8.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0" + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-redis": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-7.1.1.tgz", + "integrity": "sha512-M+z7alnCJiuzKa8/1qAYdGUXHYfDnLolOGAUjOioB07pP39qxjG+X9ibsud7qUBc4jMV5Mcy3ugGv8eFcgamJQ==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "express-session": ">=1" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cron-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "license": "MIT", + "dependencies": { + "luxon": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", + "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", + "license": "MIT", + "dependencies": { + "ip-address": "10.0.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ffmpeg-static": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.3.0.tgz", + "integrity": "sha512-H+K6sW6TiIX6VGend0KQwthe+kaceeH/luE8dIZyOP35ik7ahYojDuqlTV1bOrtEwl01sy2HFNGQfi5IDJvotg==", + "hasInstallScript": true, + "license": "GPL-3.0-or-later", + "dependencies": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/file-type": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.1.1.tgz", + "integrity": "sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz", + "integrity": "sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuzzball": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fuzzball/-/fuzzball-2.2.3.tgz", + "integrity": "sha512-sQDb3kjI7auA4YyE1YgEW85MTparcSgRgcCweUK06Cn0niY5lN+uhFiRUZKN4MQVGGiHxlbrYCA4nL1QjOXBLQ==", + "license": "MIT", + "dependencies": { + "heap": ">=0.2.0", + "lodash": "^4.17.21", + "setimmediate": "^1.0.5" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "license": "MIT" + }, + "node_modules/helmet": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", + "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "license": "MIT", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ioredis": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", + "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "1.4.0", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ioredis/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.8.tgz", + "integrity": "sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/music-metadata": { + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-11.10.3.tgz", + "integrity": "sha512-j0g/x4cNNZW6I5gdcPAY+GFkJY9WHTpkFDMBJKQLxJQyvSfQbXm57fTE3haGFFuOzCgtsTd4Plwc49Sn9RacDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.0", + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "file-type": "^21.1.1", + "media-typer": "^1.1.0", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/music-metadata/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/music-metadata/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, + "node_modules/node-cron": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", + "integrity": "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-queue": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.0.1.tgz", + "integrity": "sha512-RhBdVhSwJb7Ocn3e8ULk4NMwBEuOxe+1zcgphUy9c2e5aR/xbEsdVXxHJ3lynw6Qiqu7OINEyHlZkiblEpaq7w==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/podcast-index-api": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/podcast-index-api/-/podcast-index-api-1.1.10.tgz", + "integrity": "sha512-xOK8yN7Nn31IUGdA3wIzuDDGJCAIBOqv+steapUDTps4QNs5o8QOT8K0udXJKEpJr39TKy04zsaJuEmU6ofYJA==", + "license": "MIT", + "dependencies": { + "got": "^11.6.0" + } + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/redis": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.1.tgz", + "integrity": "sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==", + "license": "MIT", + "workspaces": [ + "./packages/*" + ], + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.6.1", + "@redis/graph": "1.1.1", + "@redis/json": "1.0.7", + "@redis/search": "1.2.0", + "@redis/time-series": "1.1.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-info": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redis-info/-/redis-info-3.1.0.tgz", + "integrity": "sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.11" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/rss-parser": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", + "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "license": "MIT", + "dependencies": { + "entities": "^2.0.3", + "xml2js": "^0.5.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/slsk-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/slsk-client/-/slsk-client-1.1.0.tgz", + "integrity": "sha512-gnDt4FCyiweLeJRCPy+ANKIrn4ey2E+cE4uj0mqjQHlPjXtBIOglFXoDSNDxnACZFub+E0zXrYxCFyB8vabu2A==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.6" + } + }, + "node_modules/slsk-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/slsk-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/speakeasy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", + "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", + "license": "MIT", + "dependencies": { + "base32.js": "0.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strtok3": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", + "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "license": "MIT", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-jsdoc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz", + "integrity": "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", + "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.1.0", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/token-types/node_modules/@borewit/text-codec": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", + "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.15.26", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", + "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "license": "MIT", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..fa97158 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,71 @@ +{ + "name": "lidify-backend", + "version": "1.2.0", + "description": "Lidify backend API server", + "license": "GPL-3.0", + "repository": { + "type": "git", + "url": "https://github.com/Chevron7Locked/lidify.git" + }, + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc", + "start": "node dist/index.js", + "db:migrate": "prisma migrate deploy", + "db:studio": "prisma studio", + "seed:user": "tsx seeds/createUser.ts", + "test:smoke": "tsx scripts/smoke.ts", + "sync": "tsx src/workers/sync.ts" + }, + "dependencies": { + "@bull-board/api": "^6.14.2", + "@bull-board/express": "^6.14.2", + "@ffmpeg-installer/ffmpeg": "^1.1.0", + "@prisma/client": "^5.22.0", + "@types/bull": "^3.15.9", + "@types/fluent-ffmpeg": "^2.1.28", + "@types/node-cron": "^3.0.11", + "@types/qrcode": "^1.5.6", + "@types/speakeasy": "^2.0.10", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", + "axios": "^1.6.2", + "bcrypt": "^5.1.1", + "bull": "^4.16.5", + "connect-redis": "^7.1.0", + "cors": "^2.8.5", + "date-fns": "^4.1.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-rate-limit": "^8.2.1", + "express-session": "^1.17.3", + "ffmpeg-static": "^5.2.0", + "fluent-ffmpeg": "^2.1.3", + "fuzzball": "^2.2.3", + "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", + "music-metadata": "^11.10.0", + "node-cron": "^4.2.1", + "p-queue": "^9.0.0", + "podcast-index-api": "^1.1.10", + "qrcode": "^1.5.4", + "redis": "^4.6.10", + "rss-parser": "^3.13.0", + "sharp": "^0.34.5", + "slsk-client": "^1.1.0", + "speakeasy": "^2.0.0", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^5.0.1", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.2", + "@types/express": "^4.17.21", + "@types/express-session": "^1.17.10", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^20.10.4", + "prisma": "^5.22.0", + "tsx": "^4.7.0", + "typescript": "^5.3.3" + } +} diff --git a/backend/prisma/migrations/20251130000000_init/migration.sql b/backend/prisma/migrations/20251130000000_init/migration.sql new file mode 100644 index 0000000..27f848c --- /dev/null +++ b/backend/prisma/migrations/20251130000000_init/migration.sql @@ -0,0 +1,1128 @@ +-- CreateEnum +CREATE TYPE "DiscoverStatus" AS ENUM ('ACTIVE', 'LIKED', 'MOVED', 'DELETED'); + +-- CreateEnum +CREATE TYPE "ListenSource" AS ENUM ('LIBRARY', 'DISCOVERY', 'DISCOVERY_KEPT'); + +-- CreateEnum +CREATE TYPE "AlbumLocation" AS ENUM ('LIBRARY', 'DISCOVER'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "role" TEXT NOT NULL DEFAULT 'user', + "onboardingComplete" BOOLEAN NOT NULL DEFAULT false, + "enrichmentSettings" JSONB, + "twoFactorEnabled" BOOLEAN NOT NULL DEFAULT false, + "twoFactorSecret" TEXT, + "twoFactorRecoveryCodes" TEXT, + "moodMixParams" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserSettings" ( + "userId" TEXT NOT NULL, + "playbackQuality" TEXT NOT NULL DEFAULT 'original', + "wifiOnly" BOOLEAN NOT NULL DEFAULT false, + "offlineEnabled" BOOLEAN NOT NULL DEFAULT false, + "maxCacheSizeMb" INTEGER NOT NULL DEFAULT 10240, + + CONSTRAINT "UserSettings_pkey" PRIMARY KEY ("userId") +); + +-- CreateTable +CREATE TABLE "PlaybackState" ( + "userId" TEXT NOT NULL, + "playbackType" TEXT NOT NULL, + "trackId" TEXT, + "audiobookId" TEXT, + "podcastId" TEXT, + "queue" JSONB, + "currentIndex" INTEGER NOT NULL DEFAULT 0, + "isShuffle" BOOLEAN NOT NULL DEFAULT false, + "updatedAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PlaybackState_pkey" PRIMARY KEY ("userId") +); + +-- CreateTable +CREATE TABLE "SystemSettings" ( + "id" TEXT NOT NULL DEFAULT 'default', + "lidarrEnabled" BOOLEAN NOT NULL DEFAULT true, + "lidarrUrl" TEXT DEFAULT 'http://localhost:8686', + "lidarrApiKey" TEXT, + "openaiEnabled" BOOLEAN NOT NULL DEFAULT false, + "openaiApiKey" TEXT, + "openaiModel" TEXT DEFAULT 'gpt-4', + "openaiBaseUrl" TEXT, + "fanartEnabled" BOOLEAN NOT NULL DEFAULT false, + "fanartApiKey" TEXT, + "audiobookshelfEnabled" BOOLEAN NOT NULL DEFAULT false, + "audiobookshelfUrl" TEXT DEFAULT 'http://localhost:13378', + "audiobookshelfApiKey" TEXT, + "soulseekUsername" TEXT, + "soulseekPassword" TEXT, + "spotifyClientId" TEXT, + "spotifyClientSecret" TEXT, + "musicPath" TEXT DEFAULT '/music', + "downloadPath" TEXT DEFAULT '/downloads', + "autoSync" BOOLEAN NOT NULL DEFAULT true, + "autoEnrichMetadata" BOOLEAN NOT NULL DEFAULT true, + "maxConcurrentDownloads" INTEGER NOT NULL DEFAULT 3, + "downloadRetryAttempts" INTEGER NOT NULL DEFAULT 3, + "transcodeCacheMaxGb" INTEGER NOT NULL DEFAULT 10, + "downloadSource" TEXT NOT NULL DEFAULT 'soulseek', + "soulseekFallback" TEXT NOT NULL DEFAULT 'none', + "updatedAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "SystemSettings_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Artist" ( + "id" TEXT NOT NULL, + "mbid" TEXT NOT NULL, + "name" TEXT NOT NULL, + "normalizedName" TEXT NOT NULL DEFAULT '', + "summary" TEXT, + "heroUrl" TEXT, + "genres" JSONB, + "lastSynced" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "lastEnriched" TIMESTAMP(3), + "enrichmentStatus" TEXT NOT NULL DEFAULT 'pending', + "searchVector" tsvector, + + CONSTRAINT "Artist_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Album" ( + "id" TEXT NOT NULL, + "rgMbid" TEXT NOT NULL, + "artistId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "year" INTEGER, + "coverUrl" TEXT, + "primaryType" TEXT NOT NULL, + "label" TEXT, + "genres" JSONB, + "lastSynced" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "location" "AlbumLocation" NOT NULL DEFAULT 'LIBRARY', + "searchVector" tsvector, + + CONSTRAINT "Album_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Track" ( + "id" TEXT NOT NULL, + "albumId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "trackNo" INTEGER NOT NULL, + "duration" INTEGER NOT NULL, + "mime" TEXT, + "searchVector" tsvector, + "filePath" TEXT NOT NULL, + "fileModified" TIMESTAMP(3) NOT NULL, + "fileSize" INTEGER NOT NULL, + "bpm" DOUBLE PRECISION, + "beatsCount" INTEGER, + "key" TEXT, + "keyScale" TEXT, + "keyStrength" DOUBLE PRECISION, + "energy" DOUBLE PRECISION, + "loudness" DOUBLE PRECISION, + "dynamicRange" DOUBLE PRECISION, + "danceability" DOUBLE PRECISION, + "valence" DOUBLE PRECISION, + "arousal" DOUBLE PRECISION, + "instrumentalness" DOUBLE PRECISION, + "acousticness" DOUBLE PRECISION, + "speechiness" DOUBLE PRECISION, + "moodHappy" DOUBLE PRECISION, + "moodSad" DOUBLE PRECISION, + "moodRelaxed" DOUBLE PRECISION, + "moodAggressive" DOUBLE PRECISION, + "moodParty" DOUBLE PRECISION, + "moodAcoustic" DOUBLE PRECISION, + "moodElectronic" DOUBLE PRECISION, + "danceabilityMl" DOUBLE PRECISION, + "moodTags" TEXT[], + "essentiaGenres" TEXT[], + "lastfmTags" TEXT[], + "analysisStatus" TEXT NOT NULL DEFAULT 'pending', + "analysisVersion" TEXT, + "analysisMode" TEXT, + "analyzedAt" TIMESTAMP(3), + "analysisError" TEXT, + "analysisRetryCount" INTEGER NOT NULL DEFAULT 0, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Track_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TranscodedFile" ( + "id" TEXT NOT NULL, + "trackId" TEXT NOT NULL, + "quality" TEXT NOT NULL, + "cachePath" TEXT NOT NULL, + "cacheSize" INTEGER NOT NULL, + "sourceModified" TIMESTAMP(3) NOT NULL, + "lastAccessed" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "TranscodedFile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Play" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "trackId" TEXT NOT NULL, + "playedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "source" "ListenSource" NOT NULL DEFAULT 'LIBRARY', + + CONSTRAINT "Play_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Playlist" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "mixId" TEXT, + "name" TEXT NOT NULL, + "isPublic" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "spotifyPlaylistId" TEXT, + "spotifyPlaylistUrl" TEXT, + + CONSTRAINT "Playlist_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "HiddenPlaylist" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "playlistId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "HiddenPlaylist_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PlaylistItem" ( + "id" TEXT NOT NULL, + "playlistId" TEXT NOT NULL, + "trackId" TEXT NOT NULL, + "sort" INTEGER NOT NULL, + + CONSTRAINT "PlaylistItem_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PlaylistPendingTrack" ( + "id" TEXT NOT NULL, + "playlistId" TEXT NOT NULL, + "spotifyArtist" TEXT NOT NULL, + "spotifyTitle" TEXT NOT NULL, + "spotifyAlbum" TEXT NOT NULL, + "albumMbid" TEXT, + "artistMbid" TEXT, + "deezerPreviewUrl" TEXT, + "sort" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PlaylistPendingTrack_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SpotifyImportJob" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "spotifyPlaylistId" TEXT NOT NULL, + "playlistName" TEXT NOT NULL, + "status" TEXT NOT NULL, + "progress" INTEGER NOT NULL DEFAULT 0, + "albumsTotal" INTEGER NOT NULL, + "albumsCompleted" INTEGER NOT NULL DEFAULT 0, + "tracksTotal" INTEGER NOT NULL, + "tracksMatched" INTEGER NOT NULL DEFAULT 0, + "tracksDownloadable" INTEGER NOT NULL DEFAULT 0, + "createdPlaylistId" TEXT, + "error" TEXT, + "pendingTracks" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "SpotifyImportJob_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Genre" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "Genre_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TrackGenre" ( + "trackId" TEXT NOT NULL, + "genreId" TEXT NOT NULL, + + CONSTRAINT "TrackGenre_pkey" PRIMARY KEY ("trackId","genreId") +); + +-- CreateTable +CREATE TABLE "SimilarArtist" ( + "fromArtistId" TEXT NOT NULL, + "toArtistId" TEXT NOT NULL, + "weight" DOUBLE PRECISION NOT NULL DEFAULT 1.0, + + CONSTRAINT "SimilarArtist_pkey" PRIMARY KEY ("fromArtistId","toArtistId") +); + +-- CreateTable +CREATE TABLE "OwnedAlbum" ( + "artistId" TEXT NOT NULL, + "rgMbid" TEXT NOT NULL, + "source" TEXT NOT NULL, + + CONSTRAINT "OwnedAlbum_pkey" PRIMARY KEY ("artistId","rgMbid") +); + +-- CreateTable +CREATE TABLE "DownloadJob" ( + "id" TEXT NOT NULL, + "correlationId" TEXT, + "userId" TEXT NOT NULL, + "subject" TEXT NOT NULL, + "type" TEXT NOT NULL, + "targetMbid" TEXT NOT NULL, + "status" TEXT NOT NULL, + "error" TEXT, + "lidarrRef" TEXT, + "lidarrAlbumId" INTEGER, + "metadata" JSONB, + "attempts" INTEGER NOT NULL DEFAULT 0, + "startedAt" TIMESTAMP(3), + "completedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "discoveryBatchId" TEXT, + "triedReleases" TEXT[] DEFAULT ARRAY[]::TEXT[], + "releaseIndex" INTEGER NOT NULL DEFAULT 0, + "artistMbid" TEXT, + "cleared" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "DownloadJob_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ListeningState" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "kind" TEXT NOT NULL, + "entityId" TEXT NOT NULL, + "trackId" TEXT, + "positionMs" INTEGER NOT NULL DEFAULT 0, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ListeningState_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DiscoveryAlbum" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "rgMbid" TEXT NOT NULL, + "artistName" TEXT NOT NULL, + "artistMbid" TEXT, + "albumTitle" TEXT NOT NULL, + "lidarrAlbumId" INTEGER, + "downloadedAt" TIMESTAMP(3), + "folderPath" TEXT NOT NULL DEFAULT '', + "weekStartDate" TIMESTAMP(3) NOT NULL, + "weekEndDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "status" "DiscoverStatus" NOT NULL DEFAULT 'ACTIVE', + "likedAt" TIMESTAMP(3), + "similarity" DOUBLE PRECISION, + "tier" TEXT, + + CONSTRAINT "DiscoveryAlbum_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DiscoveryTrack" ( + "id" TEXT NOT NULL, + "discoveryAlbumId" TEXT NOT NULL, + "trackId" TEXT, + "fileName" TEXT NOT NULL, + "filePath" TEXT NOT NULL, + "inPlaylistCount" INTEGER NOT NULL DEFAULT 0, + "userKept" BOOLEAN NOT NULL DEFAULT false, + "lastPlayedAt" TIMESTAMP(3), + + CONSTRAINT "DiscoveryTrack_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LikedTrack" ( + "userId" TEXT NOT NULL, + "trackId" TEXT NOT NULL, + "likedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "LikedTrack_pkey" PRIMARY KEY ("userId","trackId") +); + +-- CreateTable +CREATE TABLE "DislikedEntity" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "entityType" TEXT NOT NULL, + "entityId" TEXT NOT NULL, + "dislikedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "DislikedEntity_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CachedTrack" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "trackId" TEXT NOT NULL, + "localPath" TEXT NOT NULL, + "quality" TEXT NOT NULL, + "fileSizeMb" DOUBLE PRECISION NOT NULL, + "cachedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "lastAccessedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CachedTrack_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AudiobookProgress" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "audiobookshelfId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "author" TEXT, + "coverUrl" TEXT, + "currentTime" DOUBLE PRECISION NOT NULL DEFAULT 0, + "duration" DOUBLE PRECISION NOT NULL DEFAULT 0, + "isFinished" BOOLEAN NOT NULL DEFAULT false, + "lastPlayedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AudiobookProgress_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Audiobook" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "author" TEXT, + "narrator" TEXT, + "description" TEXT, + "publishedYear" INTEGER, + "publisher" TEXT, + "series" TEXT, + "seriesSequence" TEXT, + "duration" DOUBLE PRECISION, + "numTracks" INTEGER, + "numChapters" INTEGER, + "size" BIGINT, + "isbn" TEXT, + "asin" TEXT, + "language" TEXT, + "genres" TEXT[], + "tags" TEXT[], + "localCoverPath" TEXT, + "coverUrl" TEXT, + "audioUrl" TEXT NOT NULL, + "libraryId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "lastSyncedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Audiobook_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "podcast_recommendations" ( + "id" TEXT NOT NULL, + "podcastId" TEXT NOT NULL, + "recommendedId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "author" TEXT, + "description" TEXT, + "coverUrl" TEXT, + "episodeCount" INTEGER NOT NULL DEFAULT 0, + "feedUrl" TEXT, + "itunesId" TEXT, + "score" DOUBLE PRECISION NOT NULL DEFAULT 0, + "cachedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "expiresAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "podcast_recommendations_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Podcast" ( + "id" TEXT NOT NULL, + "feedUrl" TEXT NOT NULL, + "title" TEXT NOT NULL, + "author" TEXT, + "description" TEXT, + "imageUrl" TEXT, + "localCoverPath" TEXT, + "itunesId" TEXT, + "language" TEXT, + "explicit" BOOLEAN NOT NULL DEFAULT false, + "episodeCount" INTEGER NOT NULL DEFAULT 0, + "lastRefreshed" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "refreshInterval" INTEGER NOT NULL DEFAULT 3600, + "autoRefresh" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Podcast_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PodcastEpisode" ( + "id" TEXT NOT NULL, + "podcastId" TEXT NOT NULL, + "guid" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "audioUrl" TEXT NOT NULL, + "duration" INTEGER NOT NULL DEFAULT 0, + "publishedAt" TIMESTAMP(3) NOT NULL, + "episodeNumber" INTEGER, + "season" INTEGER, + "imageUrl" TEXT, + "localCoverPath" TEXT, + "fileSize" INTEGER, + "mimeType" TEXT DEFAULT 'audio/mpeg', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PodcastEpisode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PodcastSubscription" ( + "userId" TEXT NOT NULL, + "podcastId" TEXT NOT NULL, + "subscribedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PodcastSubscription_pkey" PRIMARY KEY ("userId","podcastId") +); + +-- CreateTable +CREATE TABLE "PodcastProgress" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "episodeId" TEXT NOT NULL, + "currentTime" DOUBLE PRECISION NOT NULL DEFAULT 0, + "duration" DOUBLE PRECISION NOT NULL DEFAULT 0, + "isFinished" BOOLEAN NOT NULL DEFAULT false, + "lastPlayedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PodcastProgress_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PodcastDownload" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "episodeId" TEXT NOT NULL, + "localPath" TEXT NOT NULL, + "fileSizeMb" DOUBLE PRECISION NOT NULL, + "downloadedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "lastAccessedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PodcastDownload_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DiscoverExclusion" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "albumMbid" TEXT NOT NULL, + "artistName" TEXT, + "albumTitle" TEXT, + "lastSuggestedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "expiresAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "DiscoverExclusion_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserDiscoverConfig" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "playlistSize" INTEGER NOT NULL DEFAULT 40, + "maxRetryAttempts" INTEGER NOT NULL DEFAULT 3, + "exclusionMonths" INTEGER NOT NULL DEFAULT 6, + "downloadRatio" DOUBLE PRECISION NOT NULL DEFAULT 1.3, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "lastGeneratedAt" TIMESTAMP(3), + + CONSTRAINT "UserDiscoverConfig_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UnavailableAlbum" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "artistName" TEXT NOT NULL, + "albumTitle" TEXT NOT NULL, + "albumMbid" TEXT NOT NULL, + "artistMbid" TEXT, + "similarity" DOUBLE PRECISION NOT NULL, + "tier" TEXT NOT NULL, + "weekStartDate" TIMESTAMP(3) NOT NULL, + "previewUrl" TEXT, + "deezerTrackId" TEXT, + "deezerAlbumId" TEXT, + "attemptNumber" INTEGER NOT NULL DEFAULT 0, + "originalAlbumId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "UnavailableAlbum_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DiscoveryBatch" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "weekStart" TIMESTAMP(3) NOT NULL, + "targetSongCount" INTEGER NOT NULL, + "status" TEXT NOT NULL DEFAULT 'downloading', + "totalAlbums" INTEGER NOT NULL DEFAULT 0, + "completedAlbums" INTEGER NOT NULL DEFAULT 0, + "failedAlbums" INTEGER NOT NULL DEFAULT 0, + "finalSongCount" INTEGER NOT NULL DEFAULT 0, + "logs" JSONB, + "errorMessage" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "completedAt" TIMESTAMP(3), + + CONSTRAINT "DiscoveryBatch_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ApiKey" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "key" TEXT NOT NULL, + "name" TEXT NOT NULL, + "lastUsed" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ApiKey_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DeviceLinkCode" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "usedAt" TIMESTAMP(3), + "deviceName" TEXT, + "apiKeyId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "DeviceLinkCode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Notification" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "type" TEXT NOT NULL, + "title" TEXT NOT NULL, + "message" TEXT, + "metadata" JSONB, + "read" BOOLEAN NOT NULL DEFAULT false, + "cleared" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); + +-- CreateIndex +CREATE INDEX "PlaybackState_userId_idx" ON "PlaybackState"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Artist_mbid_key" ON "Artist"("mbid"); + +-- CreateIndex +CREATE INDEX "Artist_name_idx" ON "Artist"("name"); + +-- CreateIndex +CREATE INDEX "Artist_normalizedName_idx" ON "Artist"("normalizedName"); + +-- CreateIndex +CREATE INDEX "Artist_searchVector_idx" ON "Artist" USING GIN ("searchVector"); + +-- CreateIndex +CREATE UNIQUE INDEX "Album_rgMbid_key" ON "Album"("rgMbid"); + +-- CreateIndex +CREATE INDEX "Album_artistId_idx" ON "Album"("artistId"); + +-- CreateIndex +CREATE INDEX "Album_location_idx" ON "Album"("location"); + +-- CreateIndex +CREATE INDEX "Album_title_idx" ON "Album"("title"); + +-- CreateIndex +CREATE INDEX "Album_searchVector_idx" ON "Album" USING GIN ("searchVector"); + +-- CreateIndex +CREATE UNIQUE INDEX "Track_filePath_key" ON "Track"("filePath"); + +-- CreateIndex +CREATE INDEX "Track_albumId_idx" ON "Track"("albumId"); + +-- CreateIndex +CREATE INDEX "Track_fileModified_idx" ON "Track"("fileModified"); + +-- CreateIndex +CREATE INDEX "Track_title_idx" ON "Track"("title"); + +-- CreateIndex +CREATE INDEX "Track_searchVector_idx" ON "Track" USING GIN ("searchVector"); + +-- CreateIndex +CREATE INDEX "Track_analysisStatus_idx" ON "Track"("analysisStatus"); + +-- CreateIndex +CREATE INDEX "Track_bpm_idx" ON "Track"("bpm"); + +-- CreateIndex +CREATE INDEX "Track_energy_idx" ON "Track"("energy"); + +-- CreateIndex +CREATE INDEX "Track_valence_idx" ON "Track"("valence"); + +-- CreateIndex +CREATE INDEX "Track_danceability_idx" ON "Track"("danceability"); + +-- CreateIndex +CREATE UNIQUE INDEX "TranscodedFile_cachePath_key" ON "TranscodedFile"("cachePath"); + +-- CreateIndex +CREATE INDEX "TranscodedFile_trackId_quality_idx" ON "TranscodedFile"("trackId", "quality"); + +-- CreateIndex +CREATE INDEX "TranscodedFile_lastAccessed_idx" ON "TranscodedFile"("lastAccessed"); + +-- CreateIndex +CREATE UNIQUE INDEX "TranscodedFile_trackId_quality_key" ON "TranscodedFile"("trackId", "quality"); + +-- CreateIndex +CREATE INDEX "Play_userId_playedAt_idx" ON "Play"("userId", "playedAt"); + +-- CreateIndex +CREATE INDEX "Play_trackId_idx" ON "Play"("trackId"); + +-- CreateIndex +CREATE INDEX "Play_source_idx" ON "Play"("source"); + +-- CreateIndex +CREATE INDEX "Playlist_userId_idx" ON "Playlist"("userId"); + +-- CreateIndex +CREATE INDEX "Playlist_spotifyPlaylistId_idx" ON "Playlist"("spotifyPlaylistId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Playlist_userId_mixId_key" ON "Playlist"("userId", "mixId"); + +-- CreateIndex +CREATE INDEX "HiddenPlaylist_userId_idx" ON "HiddenPlaylist"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "HiddenPlaylist_userId_playlistId_key" ON "HiddenPlaylist"("userId", "playlistId"); + +-- CreateIndex +CREATE INDEX "PlaylistItem_playlistId_sort_idx" ON "PlaylistItem"("playlistId", "sort"); + +-- CreateIndex +CREATE UNIQUE INDEX "PlaylistItem_playlistId_trackId_key" ON "PlaylistItem"("playlistId", "trackId"); + +-- CreateIndex +CREATE INDEX "PlaylistPendingTrack_playlistId_idx" ON "PlaylistPendingTrack"("playlistId"); + +-- CreateIndex +CREATE INDEX "PlaylistPendingTrack_albumMbid_idx" ON "PlaylistPendingTrack"("albumMbid"); + +-- CreateIndex +CREATE INDEX "PlaylistPendingTrack_artistMbid_idx" ON "PlaylistPendingTrack"("artistMbid"); + +-- CreateIndex +CREATE UNIQUE INDEX "PlaylistPendingTrack_playlistId_spotifyArtist_spotifyTitle_key" ON "PlaylistPendingTrack"("playlistId", "spotifyArtist", "spotifyTitle"); + +-- CreateIndex +CREATE INDEX "SpotifyImportJob_userId_idx" ON "SpotifyImportJob"("userId"); + +-- CreateIndex +CREATE INDEX "SpotifyImportJob_status_idx" ON "SpotifyImportJob"("status"); + +-- CreateIndex +CREATE INDEX "SpotifyImportJob_createdAt_idx" ON "SpotifyImportJob"("createdAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "Genre_name_key" ON "Genre"("name"); + +-- CreateIndex +CREATE INDEX "TrackGenre_genreId_idx" ON "TrackGenre"("genreId"); + +-- CreateIndex +CREATE INDEX "SimilarArtist_fromArtistId_idx" ON "SimilarArtist"("fromArtistId"); + +-- CreateIndex +CREATE INDEX "OwnedAlbum_artistId_idx" ON "OwnedAlbum"("artistId"); + +-- CreateIndex +CREATE UNIQUE INDEX "DownloadJob_correlationId_key" ON "DownloadJob"("correlationId"); + +-- CreateIndex +CREATE INDEX "DownloadJob_userId_status_idx" ON "DownloadJob"("userId", "status"); + +-- CreateIndex +CREATE INDEX "DownloadJob_status_idx" ON "DownloadJob"("status"); + +-- CreateIndex +CREATE INDEX "DownloadJob_discoveryBatchId_idx" ON "DownloadJob"("discoveryBatchId"); + +-- CreateIndex +CREATE INDEX "DownloadJob_correlationId_idx" ON "DownloadJob"("correlationId"); + +-- CreateIndex +CREATE INDEX "DownloadJob_startedAt_idx" ON "DownloadJob"("startedAt"); + +-- CreateIndex +CREATE INDEX "DownloadJob_lidarrRef_idx" ON "DownloadJob"("lidarrRef"); + +-- CreateIndex +CREATE INDEX "DownloadJob_artistMbid_idx" ON "DownloadJob"("artistMbid"); + +-- CreateIndex +CREATE INDEX "ListeningState_userId_idx" ON "ListeningState"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ListeningState_userId_kind_entityId_key" ON "ListeningState"("userId", "kind", "entityId"); + +-- CreateIndex +CREATE INDEX "DiscoveryAlbum_userId_weekStartDate_idx" ON "DiscoveryAlbum"("userId", "weekStartDate"); + +-- CreateIndex +CREATE INDEX "DiscoveryAlbum_downloadedAt_idx" ON "DiscoveryAlbum"("downloadedAt"); + +-- CreateIndex +CREATE INDEX "DiscoveryAlbum_status_idx" ON "DiscoveryAlbum"("status"); + +-- CreateIndex +CREATE UNIQUE INDEX "DiscoveryAlbum_userId_weekStartDate_rgMbid_key" ON "DiscoveryAlbum"("userId", "weekStartDate", "rgMbid"); + +-- CreateIndex +CREATE INDEX "DiscoveryTrack_discoveryAlbumId_idx" ON "DiscoveryTrack"("discoveryAlbumId"); + +-- CreateIndex +CREATE INDEX "DiscoveryTrack_userKept_idx" ON "DiscoveryTrack"("userKept"); + +-- CreateIndex +CREATE INDEX "DiscoveryTrack_lastPlayedAt_idx" ON "DiscoveryTrack"("lastPlayedAt"); + +-- CreateIndex +CREATE INDEX "LikedTrack_userId_idx" ON "LikedTrack"("userId"); + +-- CreateIndex +CREATE INDEX "LikedTrack_likedAt_idx" ON "LikedTrack"("likedAt"); + +-- CreateIndex +CREATE INDEX "DislikedEntity_userId_entityType_idx" ON "DislikedEntity"("userId", "entityType"); + +-- CreateIndex +CREATE UNIQUE INDEX "DislikedEntity_userId_entityType_entityId_key" ON "DislikedEntity"("userId", "entityType", "entityId"); + +-- CreateIndex +CREATE INDEX "CachedTrack_userId_idx" ON "CachedTrack"("userId"); + +-- CreateIndex +CREATE INDEX "CachedTrack_lastAccessedAt_idx" ON "CachedTrack"("lastAccessedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "CachedTrack_userId_trackId_quality_key" ON "CachedTrack"("userId", "trackId", "quality"); + +-- CreateIndex +CREATE INDEX "AudiobookProgress_userId_lastPlayedAt_idx" ON "AudiobookProgress"("userId", "lastPlayedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "AudiobookProgress_userId_audiobookshelfId_key" ON "AudiobookProgress"("userId", "audiobookshelfId"); + +-- CreateIndex +CREATE INDEX "Audiobook_title_idx" ON "Audiobook"("title"); + +-- CreateIndex +CREATE INDEX "Audiobook_author_idx" ON "Audiobook"("author"); + +-- CreateIndex +CREATE INDEX "Audiobook_series_idx" ON "Audiobook"("series"); + +-- CreateIndex +CREATE INDEX "Audiobook_lastSyncedAt_idx" ON "Audiobook"("lastSyncedAt"); + +-- CreateIndex +CREATE INDEX "podcast_recommendations_podcastId_expiresAt_idx" ON "podcast_recommendations"("podcastId", "expiresAt"); + +-- CreateIndex +CREATE INDEX "podcast_recommendations_expiresAt_idx" ON "podcast_recommendations"("expiresAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "Podcast_feedUrl_key" ON "Podcast"("feedUrl"); + +-- CreateIndex +CREATE UNIQUE INDEX "Podcast_itunesId_key" ON "Podcast"("itunesId"); + +-- CreateIndex +CREATE INDEX "Podcast_itunesId_idx" ON "Podcast"("itunesId"); + +-- CreateIndex +CREATE INDEX "Podcast_lastRefreshed_idx" ON "Podcast"("lastRefreshed"); + +-- CreateIndex +CREATE INDEX "PodcastEpisode_podcastId_publishedAt_idx" ON "PodcastEpisode"("podcastId", "publishedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "PodcastEpisode_podcastId_guid_key" ON "PodcastEpisode"("podcastId", "guid"); + +-- CreateIndex +CREATE INDEX "PodcastSubscription_userId_idx" ON "PodcastSubscription"("userId"); + +-- CreateIndex +CREATE INDEX "PodcastSubscription_podcastId_idx" ON "PodcastSubscription"("podcastId"); + +-- CreateIndex +CREATE INDEX "PodcastProgress_userId_lastPlayedAt_idx" ON "PodcastProgress"("userId", "lastPlayedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "PodcastProgress_userId_episodeId_key" ON "PodcastProgress"("userId", "episodeId"); + +-- CreateIndex +CREATE INDEX "PodcastDownload_userId_idx" ON "PodcastDownload"("userId"); + +-- CreateIndex +CREATE INDEX "PodcastDownload_lastAccessedAt_idx" ON "PodcastDownload"("lastAccessedAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "PodcastDownload_userId_episodeId_key" ON "PodcastDownload"("userId", "episodeId"); + +-- CreateIndex +CREATE INDEX "DiscoverExclusion_userId_expiresAt_idx" ON "DiscoverExclusion"("userId", "expiresAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "DiscoverExclusion_userId_albumMbid_key" ON "DiscoverExclusion"("userId", "albumMbid"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserDiscoverConfig_userId_key" ON "UserDiscoverConfig"("userId"); + +-- CreateIndex +CREATE INDEX "UnavailableAlbum_userId_weekStartDate_idx" ON "UnavailableAlbum"("userId", "weekStartDate"); + +-- CreateIndex +CREATE INDEX "UnavailableAlbum_userId_weekStartDate_attemptNumber_idx" ON "UnavailableAlbum"("userId", "weekStartDate", "attemptNumber"); + +-- CreateIndex +CREATE INDEX "UnavailableAlbum_originalAlbumId_idx" ON "UnavailableAlbum"("originalAlbumId"); + +-- CreateIndex +CREATE UNIQUE INDEX "UnavailableAlbum_userId_weekStartDate_albumMbid_key" ON "UnavailableAlbum"("userId", "weekStartDate", "albumMbid"); + +-- CreateIndex +CREATE INDEX "DiscoveryBatch_userId_weekStart_idx" ON "DiscoveryBatch"("userId", "weekStart"); + +-- CreateIndex +CREATE INDEX "DiscoveryBatch_status_idx" ON "DiscoveryBatch"("status"); + +-- CreateIndex +CREATE INDEX "DiscoveryBatch_createdAt_idx" ON "DiscoveryBatch"("createdAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "ApiKey_key_key" ON "ApiKey"("key"); + +-- CreateIndex +CREATE INDEX "ApiKey_key_idx" ON "ApiKey"("key"); + +-- CreateIndex +CREATE INDEX "ApiKey_userId_idx" ON "ApiKey"("userId"); + +-- CreateIndex +CREATE INDEX "ApiKey_lastUsed_idx" ON "ApiKey"("lastUsed"); + +-- CreateIndex +CREATE UNIQUE INDEX "DeviceLinkCode_code_key" ON "DeviceLinkCode"("code"); + +-- CreateIndex +CREATE INDEX "DeviceLinkCode_code_expiresAt_idx" ON "DeviceLinkCode"("code", "expiresAt"); + +-- CreateIndex +CREATE INDEX "DeviceLinkCode_userId_idx" ON "DeviceLinkCode"("userId"); + +-- CreateIndex +CREATE INDEX "Notification_userId_cleared_idx" ON "Notification"("userId", "cleared"); + +-- CreateIndex +CREATE INDEX "Notification_userId_read_idx" ON "Notification"("userId", "read"); + +-- CreateIndex +CREATE INDEX "Notification_createdAt_idx" ON "Notification"("createdAt"); + +-- AddForeignKey +ALTER TABLE "UserSettings" ADD CONSTRAINT "UserSettings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PlaybackState" ADD CONSTRAINT "PlaybackState_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Album" ADD CONSTRAINT "Album_artistId_fkey" FOREIGN KEY ("artistId") REFERENCES "Artist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Track" ADD CONSTRAINT "Track_albumId_fkey" FOREIGN KEY ("albumId") REFERENCES "Album"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TranscodedFile" ADD CONSTRAINT "TranscodedFile_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Play" ADD CONSTRAINT "Play_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Play" ADD CONSTRAINT "Play_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Playlist" ADD CONSTRAINT "Playlist_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "HiddenPlaylist" ADD CONSTRAINT "HiddenPlaylist_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "HiddenPlaylist" ADD CONSTRAINT "HiddenPlaylist_playlistId_fkey" FOREIGN KEY ("playlistId") REFERENCES "Playlist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PlaylistItem" ADD CONSTRAINT "PlaylistItem_playlistId_fkey" FOREIGN KEY ("playlistId") REFERENCES "Playlist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PlaylistItem" ADD CONSTRAINT "PlaylistItem_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PlaylistPendingTrack" ADD CONSTRAINT "PlaylistPendingTrack_playlistId_fkey" FOREIGN KEY ("playlistId") REFERENCES "Playlist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SpotifyImportJob" ADD CONSTRAINT "SpotifyImportJob_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TrackGenre" ADD CONSTRAINT "TrackGenre_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TrackGenre" ADD CONSTRAINT "TrackGenre_genreId_fkey" FOREIGN KEY ("genreId") REFERENCES "Genre"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SimilarArtist" ADD CONSTRAINT "SimilarArtist_fromArtistId_fkey" FOREIGN KEY ("fromArtistId") REFERENCES "Artist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SimilarArtist" ADD CONSTRAINT "SimilarArtist_toArtistId_fkey" FOREIGN KEY ("toArtistId") REFERENCES "Artist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "OwnedAlbum" ADD CONSTRAINT "OwnedAlbum_artistId_fkey" FOREIGN KEY ("artistId") REFERENCES "Artist"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DownloadJob" ADD CONSTRAINT "DownloadJob_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DownloadJob" ADD CONSTRAINT "DownloadJob_discoveryBatchId_fkey" FOREIGN KEY ("discoveryBatchId") REFERENCES "DiscoveryBatch"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ListeningState" ADD CONSTRAINT "ListeningState_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DiscoveryAlbum" ADD CONSTRAINT "DiscoveryAlbum_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DiscoveryTrack" ADD CONSTRAINT "DiscoveryTrack_discoveryAlbumId_fkey" FOREIGN KEY ("discoveryAlbumId") REFERENCES "DiscoveryAlbum"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LikedTrack" ADD CONSTRAINT "LikedTrack_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LikedTrack" ADD CONSTRAINT "LikedTrack_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DislikedEntity" ADD CONSTRAINT "DislikedEntity_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CachedTrack" ADD CONSTRAINT "CachedTrack_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CachedTrack" ADD CONSTRAINT "CachedTrack_trackId_fkey" FOREIGN KEY ("trackId") REFERENCES "Track"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AudiobookProgress" ADD CONSTRAINT "AudiobookProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastEpisode" ADD CONSTRAINT "PodcastEpisode_podcastId_fkey" FOREIGN KEY ("podcastId") REFERENCES "Podcast"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastSubscription" ADD CONSTRAINT "PodcastSubscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastSubscription" ADD CONSTRAINT "PodcastSubscription_podcastId_fkey" FOREIGN KEY ("podcastId") REFERENCES "Podcast"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastProgress" ADD CONSTRAINT "PodcastProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastProgress" ADD CONSTRAINT "PodcastProgress_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "PodcastEpisode"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastDownload" ADD CONSTRAINT "PodcastDownload_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PodcastDownload" ADD CONSTRAINT "PodcastDownload_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "PodcastEpisode"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DiscoverExclusion" ADD CONSTRAINT "DiscoverExclusion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserDiscoverConfig" ADD CONSTRAINT "UserDiscoverConfig_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UnavailableAlbum" ADD CONSTRAINT "UnavailableAlbum_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ApiKey" ADD CONSTRAINT "ApiKey_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "DeviceLinkCode" ADD CONSTRAINT "DeviceLinkCode_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + diff --git a/backend/prisma/migrations/20251225000000_add_missing_track_updated_at/migration.sql b/backend/prisma/migrations/20251225000000_add_missing_track_updated_at/migration.sql new file mode 100644 index 0000000..b03e406 --- /dev/null +++ b/backend/prisma/migrations/20251225000000_add_missing_track_updated_at/migration.sql @@ -0,0 +1,12 @@ +-- Add updatedAt column to Track if it doesn't exist +-- This handles databases that were created before this column was added to the schema + +DO $$ +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_name = 'Track' AND column_name = 'updatedAt' + ) THEN + ALTER TABLE "Track" ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP; + END IF; +END $$; diff --git a/backend/prisma/migrations/migration_lock.toml b/backend/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..fbffa92 --- /dev/null +++ b/backend/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma new file mode 100644 index 0000000..75cecd7 --- /dev/null +++ b/backend/prisma/schema.prisma @@ -0,0 +1,926 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id @default(cuid()) + username String @unique + passwordHash String + role String @default("user") // user, admin + onboardingComplete Boolean @default(false) // Tracks if user completed setup + enrichmentSettings Json? // JSON settings for metadata enrichment + twoFactorEnabled Boolean @default(false) // 2FA enabled flag + twoFactorSecret String? // TOTP secret (encrypted) + twoFactorRecoveryCodes String? // Recovery codes (encrypted, comma-separated hashed codes) + moodMixParams Json? // Saved mood mix parameters for "Your Mood Mix" + createdAt DateTime @default(now()) + + plays Play[] + playlists Playlist[] + listeningState ListeningState[] + downloadJobs DownloadJob[] + spotifyImportJobs SpotifyImportJob[] + settings UserSettings? + playbackState PlaybackState? + likedTracks LikedTrack[] + dislikedEntities DislikedEntity[] + cachedTracks CachedTrack[] + audiobookProgress AudiobookProgress[] + podcastSubscriptions PodcastSubscription[] + podcastProgress PodcastProgress[] + podcastDownloads PodcastDownload[] + discoveryAlbums DiscoveryAlbum[] + discoverExclusions DiscoverExclusion[] + discoverConfig UserDiscoverConfig? + unavailableAlbums UnavailableAlbum[] + apiKeys ApiKey[] + deviceLinkCodes DeviceLinkCode[] + hiddenPlaylists HiddenPlaylist[] + notifications Notification[] +} + +model UserSettings { + userId String @id + playbackQuality String @default("original") // original, high, medium, low + wifiOnly Boolean @default(false) + offlineEnabled Boolean @default(false) + maxCacheSizeMb Int @default(10240) // 10GB default + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +model PlaybackState { + userId String @id + playbackType String // track, audiobook, podcast + trackId String? // For music tracks + audiobookId String? // For audiobooks (audiobookshelfId) + podcastId String? // For podcasts (format: podcastId:episodeId) + queue Json? // JSON array of track IDs + currentIndex Int @default(0) + isShuffle Boolean @default(false) + updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([userId]) +} + +model SystemSettings { + id String @id @default("default") + + // === Download Services === + // Lidarr + lidarrEnabled Boolean @default(true) + lidarrUrl String? @default("http://localhost:8686") + lidarrApiKey String? // Encrypted + + // === AI Services === + // OpenAI (for future AI features) + openaiEnabled Boolean @default(false) + openaiApiKey String? // Encrypted + openaiModel String? @default("gpt-4") + openaiBaseUrl String? // For custom endpoints + + // Fanart.tv (for high-quality images - optional) + fanartEnabled Boolean @default(false) + fanartApiKey String? // Encrypted + + // === Media Services === + // Audiobookshelf + audiobookshelfEnabled Boolean @default(false) + audiobookshelfUrl String? @default("http://localhost:13378") + audiobookshelfApiKey String? // Encrypted + + // Soulseek (direct connection via slsk-client) + soulseekUsername String? // Soulseek network username + soulseekPassword String? // Soulseek network password - Encrypted + + // Spotify (for playlist import via URL) + spotifyClientId String? + spotifyClientSecret String? // Encrypted + + // === Storage Paths === + musicPath String? @default("/music") + downloadPath String? @default("/downloads") + + // === Feature Flags === + autoSync Boolean @default(true) + autoEnrichMetadata Boolean @default(true) + + // === Advanced Settings === + maxConcurrentDownloads Int @default(3) + downloadRetryAttempts Int @default(3) + transcodeCacheMaxGb Int @default(10) // Transcode cache size limit in GB + + // === Download Preferences === + // Primary download source: "soulseek" (per-track) or "lidarr" (full albums) + downloadSource String @default("soulseek") + // When soulseek is primary and fails: "none" (skip) or "lidarr" (download full album) + soulseekFallback String @default("none") + + updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) +} + +model Artist { + id String @id @default(cuid()) + mbid String @unique + name String + normalizedName String @default("") // Lowercase version for case-insensitive matching + summary String? @db.Text + heroUrl String? + genres Json? // Array of genre strings from Last.fm/MusicBrainz + lastSynced DateTime @default(now()) + lastEnriched DateTime? + enrichmentStatus String @default("pending") // pending, enriching, completed, failed + searchVector Unsupported("tsvector")? + + albums Album[] + similarFrom SimilarArtist[] @relation("FromArtist") + similarTo SimilarArtist[] @relation("ToArtist") + ownedAlbums OwnedAlbum[] + + @@index([name]) + @@index([normalizedName]) + @@index([searchVector], type: Gin) +} + +model Album { + id String @id @default(cuid()) + rgMbid String @unique // release group MBID + artistId String + title String + year Int? + coverUrl String? + primaryType String // Album, EP, Single, Live, Compilation + label String? // Record label (from MusicBrainz) + genres Json? // Array of genre strings from Last.fm + lastSynced DateTime @default(now()) + location AlbumLocation @default(LIBRARY) // LIBRARY or DISCOVER + searchVector Unsupported("tsvector")? + + artist Artist @relation(fields: [artistId], references: [id], onDelete: Cascade) + tracks Track[] + + @@index([artistId]) + @@index([location]) + @@index([title]) + @@index([searchVector], type: Gin) +} + +model Track { + id String @id @default(cuid()) + albumId String + title String + trackNo Int + duration Int // seconds + mime String? + searchVector Unsupported("tsvector")? + + // Native file system fields (required for self-contained system) + filePath String @unique // Relative path: "Artist/Album/track.flac" + fileModified DateTime // mtime for change detection + fileSize Int // File size in bytes + + // === Audio Analysis (Essentia) === + // Rhythm + bpm Float? // Beats per minute (e.g., 120.5) + beatsCount Int? // Total beats in track + + // Tonality + key String? // Musical key (e.g., "C", "F#", "Bb") + keyScale String? // "major" or "minor" + keyStrength Float? // Confidence 0-1 + + // Energy & Dynamics + energy Float? // Overall energy 0-1 + loudness Float? // Average loudness in dB + dynamicRange Float? // Dynamic range in dB + + // Mood & Character (basic/estimated) + danceability Float? // 0-1 how suitable for dancing + valence Float? // 0 (sad) to 1 (happy) - ML in Enhanced mode + arousal Float? // 0 (calm) to 1 (energetic) - ML in Enhanced mode + + // Instrumentation + instrumentalness Float? // 0-1 (1 = no vocals) - ML in Enhanced mode + acousticness Float? // 0-1 (1 = acoustic) + speechiness Float? // 0-1 (1 = spoken word) + + // === Enhanced Mode: ML Mood Predictions === + moodHappy Float? // ML prediction 0-1 (probability of happy) + moodSad Float? // ML prediction 0-1 (probability of sad) + moodRelaxed Float? // ML prediction 0-1 (probability of relaxed) + moodAggressive Float? // ML prediction 0-1 (probability of aggressive) + moodParty Float? // ML prediction 0-1 (probability of party/upbeat) + moodAcoustic Float? // ML prediction 0-1 (probability of acoustic) + moodElectronic Float? // ML prediction 0-1 (probability of electronic) + danceabilityMl Float? // ML-based danceability (more accurate than basic) + + // Mood Tags (derived from ML or heuristics) + moodTags String[] // ["aggressive", "happy", "sad", "relaxed"] + + // Genre (ML classification from Essentia, backup to Last.fm) + essentiaGenres String[] // ["rock", "electronic", "jazz"] + + // Last.fm Tags (user-generated mood/vibe tags) + lastfmTags String[] // ["chill", "workout", "sad", "90s"] + + // Analysis Metadata + analysisStatus String @default("pending") // pending, processing, completed, failed + analysisVersion String? // Essentia version used + analysisMode String? // 'standard' or 'enhanced' + analyzedAt DateTime? + analysisError String? // Error message if failed + analysisRetryCount Int @default(0) // Number of retry attempts + updatedAt DateTime @updatedAt + + album Album @relation(fields: [albumId], references: [id], onDelete: Cascade) + plays Play[] + playlistItems PlaylistItem[] + trackGenres TrackGenre[] + likedBy LikedTrack[] + cachedBy CachedTrack[] + transcodedFiles TranscodedFile[] + + @@index([albumId]) + @@index([fileModified]) + @@index([title]) + @@index([searchVector], type: Gin) + @@index([analysisStatus]) + @@index([bpm]) + @@index([energy]) + @@index([valence]) + @@index([danceability]) +} + +// Transcoded file cache for audio streaming +model TranscodedFile { + id String @id @default(cuid()) + trackId String + quality String // original, high, medium, low + cachePath String @unique // Relative path in transcode cache + cacheSize Int // File size in bytes + sourceModified DateTime // For invalidation + lastAccessed DateTime @default(now()) // For LRU eviction + createdAt DateTime @default(now()) + + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + + @@unique([trackId, quality]) + @@index([trackId, quality]) + @@index([lastAccessed]) +} + +model Play { + id String @id @default(cuid()) + userId String + trackId String + playedAt DateTime @default(now()) + source ListenSource @default(LIBRARY) // LIBRARY, DISCOVERY, or DISCOVERY_KEPT + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + + @@index([userId, playedAt]) + @@index([trackId]) + @@index([source]) +} + +model Playlist { + id String @id @default(cuid()) + userId String + mixId String? + name String + isPublic Boolean @default(false) + createdAt DateTime @default(now()) + + // Spotify import metadata + spotifyPlaylistId String? // Original Spotify playlist ID + spotifyPlaylistUrl String? // Original Spotify URL for re-import + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + items PlaylistItem[] + pendingTracks PlaylistPendingTrack[] + hiddenByUsers HiddenPlaylist[] + + @@unique([userId, mixId]) + @@index([userId]) + @@index([spotifyPlaylistId]) +} + +// Track which users have hidden which shared playlists +model HiddenPlaylist { + id String @id @default(cuid()) + userId String + playlistId String + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + playlist Playlist @relation(fields: [playlistId], references: [id], onDelete: Cascade) + + @@unique([userId, playlistId]) + @@index([userId]) +} + +model PlaylistItem { + id String @id @default(cuid()) + playlistId String + trackId String + sort Int + + playlist Playlist @relation(fields: [playlistId], references: [id], onDelete: Cascade) + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + + @@unique([playlistId, trackId]) + @@index([playlistId, sort]) +} + +// Tracks from Spotify imports that haven't been matched to local library yet +// These are automatically added to the playlist when the matching track is downloaded +model PlaylistPendingTrack { + id String @id @default(cuid()) + playlistId String + spotifyArtist String // Original artist name from Spotify + spotifyTitle String // Original track title from Spotify + spotifyAlbum String // Original album name from Spotify + albumMbid String? // MusicBrainz album ID if resolved + artistMbid String? // MusicBrainz artist ID if resolved + deezerPreviewUrl String? // Deezer 30s preview URL for playback while pending + sort Int // Position in original playlist + createdAt DateTime @default(now()) + + playlist Playlist @relation(fields: [playlistId], references: [id], onDelete: Cascade) + + @@unique([playlistId, spotifyArtist, spotifyTitle]) // Prevent duplicates + @@index([playlistId]) + @@index([albumMbid]) + @@index([artistMbid]) +} + +// Spotify Import Jobs - tracks import progress and state +model SpotifyImportJob { + id String @id + userId String + spotifyPlaylistId String + playlistName String + status String // pending, downloading, scanning, creating_playlist, completed, failed, cancelled + progress Int @default(0) // 0-100 + albumsTotal Int + albumsCompleted Int @default(0) + tracksTotal Int + tracksMatched Int @default(0) + tracksDownloadable Int @default(0) + createdPlaylistId String? + error String? + pendingTracks Json // Array of pending track objects + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([userId]) + @@index([status]) + @@index([createdAt]) +} + +model Genre { + id String @id @default(cuid()) + name String @unique + trackGenres TrackGenre[] +} + +model TrackGenre { + trackId String + genreId String + + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + genre Genre @relation(fields: [genreId], references: [id], onDelete: Cascade) + + @@id([trackId, genreId]) + @@index([genreId]) +} + +model SimilarArtist { + fromArtistId String + toArtistId String + weight Float @default(1.0) + + fromArtist Artist @relation("FromArtist", fields: [fromArtistId], references: [id], onDelete: Cascade) + toArtist Artist @relation("ToArtist", fields: [toArtistId], references: [id], onDelete: Cascade) + + @@id([fromArtistId, toArtistId]) + @@index([fromArtistId]) +} + +model OwnedAlbum { + artistId String + rgMbid String + source String // lidarr, manual, native_scan + + artist Artist @relation(fields: [artistId], references: [id], onDelete: Cascade) + + @@id([artistId, rgMbid]) + @@index([artistId]) +} + +model DownloadJob { + id String @id @default(cuid()) + correlationId String? @unique // UUID for reliable webhook matching + userId String + subject String // artist name or album title + type String // artist, album + targetMbid String // artist MBID or release group MBID + status String // pending, processing, completed, failed, exhausted + error String? // error message if failed + lidarrRef String? // Lidarr's downloadId from webhook + lidarrAlbumId Int? // Lidarr's internal album ID for retry/cleanup + metadata Json? // additional metadata (downloadType, rootFolderPath, etc.) + attempts Int @default(0) // Number of download attempts + startedAt DateTime? // When download was initiated (for timeout tracking) + completedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + discoveryBatchId String? // Links to Discovery Weekly batch if part of discovery + + // Release iteration tracking (for exhaustive retry) + triedReleases String[] @default([]) // GUIDs of releases we've tried + releaseIndex Int @default(0) // Current position in release list + artistMbid String? // Artist MBID for same-artist fallback + cleared Boolean @default(false) // User dismissed from history + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + discoveryBatch DiscoveryBatch? @relation(fields: [discoveryBatchId], references: [id], onDelete: SetNull) + + @@index([userId, status]) + @@index([status]) + @@index([discoveryBatchId]) + @@index([correlationId]) + @@index([startedAt]) + @@index([lidarrRef]) + @@index([artistMbid]) +} + +model ListeningState { + id String @id @default(cuid()) + userId String + kind String // music, book + entityId String // artist/album/book ID + trackId String? // current track/chapter + positionMs Int @default(0) + updatedAt DateTime @updatedAt + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([userId, kind, entityId]) + @@index([userId]) +} + +model DiscoveryAlbum { + id String @id @default(cuid()) + userId String + rgMbid String + artistName String + artistMbid String? + albumTitle String + lidarrAlbumId Int? + downloadedAt DateTime? + folderPath String @default("") + weekStartDate DateTime // When it was added to discovery + weekEndDate DateTime @default(now()) // When it expires + status DiscoverStatus @default(ACTIVE) + likedAt DateTime? // When user liked it + similarity Float? // Similarity score from Last.fm (0-1) + tier String? // high, medium, low, wild + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + tracks DiscoveryTrack[] + + @@unique([userId, weekStartDate, rgMbid]) + @@index([userId, weekStartDate]) + @@index([downloadedAt]) + @@index([status]) +} + +model DiscoveryTrack { + id String @id @default(cuid()) + discoveryAlbumId String + trackId String? + fileName String + filePath String + inPlaylistCount Int @default(0) + userKept Boolean @default(false) + lastPlayedAt DateTime? + + discoveryAlbum DiscoveryAlbum @relation(fields: [discoveryAlbumId], references: [id], onDelete: Cascade) + + @@index([discoveryAlbumId]) + @@index([userKept]) + @@index([lastPlayedAt]) +} + +model LikedTrack { + userId String + trackId String + likedAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + + @@id([userId, trackId]) + @@index([userId]) + @@index([likedAt]) +} + +model DislikedEntity { + id String @id @default(cuid()) + userId String + entityType String // track, album, artist + entityId String // trackId, albumId, artistId + dislikedAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([userId, entityType, entityId]) + @@index([userId, entityType]) +} + +model CachedTrack { + id String @id @default(cuid()) + userId String + trackId String + localPath String + quality String // original, high, medium, low + fileSizeMb Float + cachedAt DateTime @default(now()) + lastAccessedAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + track Track @relation(fields: [trackId], references: [id], onDelete: Cascade) + + @@unique([userId, trackId, quality]) + @@index([userId]) + @@index([lastAccessedAt]) +} + +model AudiobookProgress { + id String @id @default(cuid()) + userId String + audiobookshelfId String // The audiobook ID from Audiobookshelf + title String // Cached for display + author String? // Cached for display + coverUrl String? // Cached for display + currentTime Float @default(0) // Current playback position in seconds + duration Float @default(0) // Total duration in seconds + isFinished Boolean @default(false) + lastPlayedAt DateTime @default(now()) + updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + // Note: No foreign key to Audiobook - progress can exist before audiobook is cached + + @@unique([userId, audiobookshelfId]) + @@index([userId, lastPlayedAt]) +} + +// ============================================ +// Cached Audiobooks (from Audiobookshelf) +// ============================================ + +model Audiobook { + id String @id // Audiobookshelf item ID + title String + author String? + narrator String? + description String? @db.Text + publishedYear Int? + publisher String? + + // Series info + series String? + seriesSequence String? + + // Media info + duration Float? // seconds + numTracks Int? + numChapters Int? + size BigInt? // bytes + + // Metadata + isbn String? + asin String? + language String? + genres String[] // array of genres + tags String[] // array of tags + + // Files + localCoverPath String? // local cached cover image path + coverUrl String? // original Audiobookshelf URL + audioUrl String // Audiobookshelf streaming URL + libraryId String? // Audiobookshelf library ID + + // Timestamps + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + lastSyncedAt DateTime @default(now()) + + @@index([title]) + @@index([author]) + @@index([series]) + @@index([lastSyncedAt]) +} + +model PodcastRecommendation { + id String @id @default(cuid()) + podcastId String // The source podcast ID (from Audiobookshelf) + recommendedId String // Unique ID for the recommended podcast + title String + author String? + description String? @db.Text + coverUrl String? + episodeCount Int @default(0) + feedUrl String? + itunesId String? + score Float @default(0) // Relevance score + cachedAt DateTime @default(now()) + expiresAt DateTime // When this recommendation expires (30 days from cache) + + @@index([podcastId, expiresAt]) + @@index([expiresAt]) // For cleanup of expired recommendations + @@map("podcast_recommendations") +} + +// ============================================ +// NEW: Independent Podcast System (RSS-based) +// ============================================ + +model Podcast { + id String @id @default(cuid()) + feedUrl String @unique + title String + author String? + description String? @db.Text + imageUrl String? // Original feed image URL + localCoverPath String? // Local cached cover image path + itunesId String? @unique + language String? + explicit Boolean @default(false) + episodeCount Int @default(0) + lastRefreshed DateTime @default(now()) + refreshInterval Int @default(3600) // seconds (1 hour default) + autoRefresh Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + episodes PodcastEpisode[] + subscriptions PodcastSubscription[] + + @@index([itunesId]) + @@index([lastRefreshed]) +} + +model PodcastEpisode { + id String @id @default(cuid()) + podcastId String + guid String // RSS GUID (unique per feed) + title String + description String? @db.Text + audioUrl String // Direct MP3/audio URL from RSS + duration Int @default(0) // seconds + publishedAt DateTime + episodeNumber Int? + season Int? + imageUrl String? // Episode-specific image URL + localCoverPath String? // Local cached episode cover + fileSize Int? // bytes + mimeType String? @default("audio/mpeg") + createdAt DateTime @default(now()) + + podcast Podcast @relation(fields: [podcastId], references: [id], onDelete: Cascade) + progress PodcastProgress[] + downloads PodcastDownload[] + + @@unique([podcastId, guid]) + @@index([podcastId, publishedAt]) +} + +// User podcast subscriptions +model PodcastSubscription { + userId String + podcastId String + subscribedAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + podcast Podcast @relation(fields: [podcastId], references: [id], onDelete: Cascade) + + @@id([userId, podcastId]) + @@index([userId]) + @@index([podcastId]) +} + +// Listening progress for podcast episodes +model PodcastProgress { + id String @id @default(cuid()) + userId String + episodeId String + currentTime Float @default(0) // seconds + duration Float @default(0) // seconds + isFinished Boolean @default(false) + lastPlayedAt DateTime @default(now()) + updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + episode PodcastEpisode @relation(fields: [episodeId], references: [id], onDelete: Cascade) + + @@unique([userId, episodeId]) + @@index([userId, lastPlayedAt]) +} + +// Downloaded episodes for offline playback +model PodcastDownload { + id String @id @default(cuid()) + userId String + episodeId String + localPath String // Where the file is stored locally + fileSizeMb Float + downloadedAt DateTime @default(now()) + lastAccessedAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + episode PodcastEpisode @relation(fields: [episodeId], references: [id], onDelete: Cascade) + + @@unique([userId, episodeId]) + @@index([userId]) + @@index([lastAccessedAt]) // For cache cleanup +} + +// ============================================ +// Discover Weekly System +// ============================================ + +// Album exclusion tracking - prevents suggesting the same album for 6 months +model DiscoverExclusion { + id String @id @default(cuid()) + userId String + albumMbid String // MusicBrainz release group ID + artistName String? // For display purposes + albumTitle String? // For display purposes + lastSuggestedAt DateTime @default(now()) + expiresAt DateTime // 6 months from lastSuggestedAt + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([userId, albumMbid]) + @@index([userId, expiresAt]) +} + +// User configuration for Discover Weekly +model UserDiscoverConfig { + id String @id @default(cuid()) + userId String @unique + playlistSize Int @default(40) // 5-50, increments of 5 + maxRetryAttempts Int @default(3) // 1-10, how many times to retry finding replacements + exclusionMonths Int @default(6) // 0-12, months to exclude albums after download (0 = no exclusion) + downloadRatio Float @default(1.3) // 1.0-2.0, multiplier for albums to request vs target songs + enabled Boolean @default(true) + lastGeneratedAt DateTime? + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} + +// Unavailable albums (recommended but not found in Lidarr) +model UnavailableAlbum { + id String @id @default(cuid()) + userId String + artistName String + albumTitle String + albumMbid String + artistMbid String? + similarity Float // Similarity score from Last.fm (0-1) + tier String // high, medium, low, wild + weekStartDate DateTime // When it was recommended + previewUrl String? // 30-second preview from Deezer + deezerTrackId String? // Deezer track ID for preview + deezerAlbumId String? // Deezer album ID for preview + attemptNumber Int @default(0) // 0 = original, 1 = first replacement, 2 = second replacement, etc. + originalAlbumId String? // References the original album's ID if this is a replacement + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([userId, weekStartDate, albumMbid]) + @@index([userId, weekStartDate]) + @@index([userId, weekStartDate, attemptNumber]) + @@index([originalAlbumId]) +} + +// Batch tracking for Discovery Weekly generation +model DiscoveryBatch { + id String @id @default(cuid()) + userId String + weekStart DateTime // Week this batch is for + targetSongCount Int // Target number of songs to find + status String @default("downloading") // downloading, scanning, completed, failed + totalAlbums Int @default(0) // Total albums queued for download + completedAlbums Int @default(0) // Albums successfully downloaded + failedAlbums Int @default(0) // Albums that failed to download + finalSongCount Int @default(0) // Final number of songs in playlist + logs Json? // Structured logs for debugging [{timestamp, level, message}] + errorMessage String? // Summary error message if failed + createdAt DateTime @default(now()) + completedAt DateTime? + + jobs DownloadJob[] + + @@index([userId, weekStart]) + @@index([status]) + @@index([createdAt]) +} + +// ============================================ +// API Keys for Mobile/External Authentication +// ============================================ + +model ApiKey { + id String @id @default(cuid()) + userId String + key String @unique // 64-character hex string + name String // Device name: "iPhone 14", "Android Tablet" + lastUsed DateTime @default(now()) + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([key]) + @@index([userId]) + @@index([lastUsed]) +} + +// Temporary device link codes for QR login +model DeviceLinkCode { + id String @id @default(cuid()) + code String @unique // 6-digit alphanumeric code + userId String // User who generated this code + expiresAt DateTime // 5 minutes from creation + usedAt DateTime? // When the code was used + deviceName String? // Name of device that used the code + apiKeyId String? // The API key created when code was used + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([code, expiresAt]) + @@index([userId]) +} + +// ============================================ +// Enums +// ============================================ + +enum DiscoverStatus { + ACTIVE // Currently in discover folder + LIKED // User liked, will be moved to permanent + MOVED // Already moved to permanent library + DELETED // Week ended, was not liked +} + +enum ListenSource { + LIBRARY // From permanent /music folder + DISCOVERY // From /music/Discover, not yet liked + DISCOVERY_KEPT // Was discovery, user liked it +} + +enum AlbumLocation { + LIBRARY // In /music + DISCOVER // In /music/Discover +} + +// ============================================ +// Notifications System +// ============================================ + +model Notification { + id String @id @default(cuid()) + userId String + type String // system, download_complete, playlist_ready, error, import_complete + title String + message String? + metadata Json? // { playlistId, albumId, artistId, etc. } + read Boolean @default(false) + cleared Boolean @default(false) + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@index([userId, cleared]) + @@index([userId, read]) + @@index([createdAt]) +} diff --git a/backend/seeds/createUser.ts b/backend/seeds/createUser.ts new file mode 100644 index 0000000..55e919b --- /dev/null +++ b/backend/seeds/createUser.ts @@ -0,0 +1,49 @@ +import bcrypt from "bcrypt"; +import { PrismaClient } from "@prisma/client"; +import * as readline from "readline"; + +const prisma = new PrismaClient(); + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +function prompt(question: string): Promise { + return new Promise((resolve) => { + rl.question(question, (answer) => resolve(answer)); + }); +} + +async function main() { + const username = await prompt("Username: "); + const password = await prompt("Password: "); + const role = await prompt("Role (user/admin) [user]: "); + + if (!username || !password) { + console.error("Username and password required"); + process.exit(1); + } + + const passwordHash = await bcrypt.hash(password, 10); + + const user = await prisma.user.create({ + data: { + username, + passwordHash, + role: role || "user", + }, + }); + + console.log(`\nCreated user: ${user.username} (${user.role})`); + rl.close(); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/backend/src/config.ts b/backend/src/config.ts new file mode 100644 index 0000000..e77e590 --- /dev/null +++ b/backend/src/config.ts @@ -0,0 +1,110 @@ +import dotenv from "dotenv"; +import { z } from "zod"; +import { validateMusicConfig, MusicConfig } from "./utils/configValidator"; + +dotenv.config(); + +// Validate critical environment variables on startup +const envSchema = z.object({ + DATABASE_URL: z.string().min(1, "DATABASE_URL is required"), + REDIS_URL: z.string().min(1, "REDIS_URL is required"), + SESSION_SECRET: z + .string() + .min(32, "SESSION_SECRET must be at least 32 characters"), + PORT: z.string().optional(), + NODE_ENV: z.enum(["development", "production", "test"]).optional(), + MUSIC_PATH: z.string().min(1, "MUSIC_PATH is required"), +}); + +try { + envSchema.parse(process.env); + console.log("Environment variables validated"); +} catch (error) { + if (error instanceof z.ZodError) { + console.error(" Environment validation failed:"); + error.errors.forEach((err) => { + console.error(` - ${err.path.join(".")}: ${err.message}`); + }); + console.error( + "\n Please check your .env file and ensure all required variables are set." + ); + process.exit(1); + } +} + +// Music config - will be initialized async +let musicConfig: MusicConfig = { + musicPath: process.env.MUSIC_PATH || "/music", + transcodeCachePath: + process.env.TRANSCODE_CACHE_PATH || "./cache/transcodes", + transcodeCacheMaxGb: parseInt( + process.env.TRANSCODE_CACHE_MAX_GB || "10", + 10 + ), +}; + +// Initialize music configuration asynchronously +export async function initializeMusicConfig() { + try { + musicConfig = await validateMusicConfig(); + console.log("Music configuration initialized"); + } catch (err: any) { + console.error(" Configuration validation failed:", err.message); + console.warn(" Using default/environment configuration"); + // Don't exit process - allow app to start for other features + // Music features will fail gracefully if config is invalid + } +} + +export const config = { + port: parseInt(process.env.PORT || "3006", 10), + nodeEnv: process.env.NODE_ENV || "development", + // DATABASE_URL and REDIS_URL are validated by envSchema above, so they're guaranteed to exist + databaseUrl: process.env.DATABASE_URL!, + redisUrl: process.env.REDIS_URL!, + sessionSecret: process.env.SESSION_SECRET!, + + // Music library configuration (self-contained native music system) + // Access via config.music - will be updated after initialization + get music() { + return musicConfig; + }, + + // Lidarr - now reads from database via lidarrService.ensureInitialized() + lidarr: + process.env.LIDARR_ENABLED === "true" + ? { + url: process.env.LIDARR_URL!, + apiKey: process.env.LIDARR_API_KEY!, + enabled: true, + } + : undefined, + + // Last.fm - ships with default app key, users can override in settings + lastfm: { + // Default application API key (free tier, for public use) + // Users can override this in System Settings with their own key + apiKey: process.env.LASTFM_API_KEY || "c1797de6bf0b7e401b623118120cd9e1", + }, + + // OpenAI - reads from database + openai: { + apiKey: process.env.OPENAI_API_KEY || "", // Fallback to DB + }, + + // Deezer - reads from database + deezer: { + apiKey: process.env.DEEZER_API_KEY || "", // Fallback to DB + }, + + audiobookshelf: process.env.AUDIOBOOKSHELF_URL + ? { + url: process.env.AUDIOBOOKSHELF_URL, + token: process.env.AUDIOBOOKSHELF_TOKEN!, + } + : undefined, + + allowedOrigins: + process.env.ALLOWED_ORIGINS?.split(",").map((o) => o.trim()) || + (process.env.NODE_ENV === "development" ? true : []), +}; diff --git a/backend/src/config/swagger.ts b/backend/src/config/swagger.ts new file mode 100644 index 0000000..2cd938d --- /dev/null +++ b/backend/src/config/swagger.ts @@ -0,0 +1,103 @@ +import swaggerJsdoc from "swagger-jsdoc"; +import { config } from "../config"; + +const options: swaggerJsdoc.Options = { + definition: { + openapi: "3.0.0", + info: { + title: "Lidify API", + version: "1.0.0", + description: + "Self-hosted music streaming server with Discover Weekly and full-text search", + contact: { + name: "Lidify", + url: "https://github.com/Chevron7Locked/lidify", + }, + }, + servers: [ + { + url: `http://localhost:${config.port}`, + description: "Development server", + }, + ], + components: { + securitySchemes: { + sessionAuth: { + type: "apiKey", + in: "cookie", + name: "connect.sid", + description: "Session cookie authentication (web UI)", + }, + apiKeyAuth: { + type: "apiKey", + in: "header", + name: "X-API-Key", + description: "API key authentication (mobile apps)", + }, + }, + schemas: { + User: { + type: "object", + properties: { + id: { type: "string" }, + username: { type: "string" }, + role: { type: "string", enum: ["user", "admin"] }, + createdAt: { type: "string", format: "date-time" }, + }, + }, + Artist: { + type: "object", + properties: { + id: { type: "string" }, + mbid: { type: "string" }, + name: { type: "string" }, + heroUrl: { type: "string", nullable: true }, + summary: { type: "string", nullable: true }, + }, + }, + Album: { + type: "object", + properties: { + id: { type: "string" }, + rgMbid: { type: "string" }, + artistId: { type: "string" }, + title: { type: "string" }, + year: { type: "integer", nullable: true }, + coverUrl: { type: "string", nullable: true }, + primaryType: { type: "string" }, + }, + }, + Track: { + type: "object", + properties: { + id: { type: "string" }, + albumId: { type: "string" }, + title: { type: "string" }, + trackNo: { type: "integer" }, + duration: { type: "integer" }, + filePath: { type: "string" }, + }, + }, + ApiKey: { + type: "object", + properties: { + id: { type: "string" }, + name: { type: "string" }, + lastUsed: { type: "string", format: "date-time" }, + createdAt: { type: "string", format: "date-time" }, + }, + }, + Error: { + type: "object", + properties: { + error: { type: "string" }, + }, + }, + }, + }, + security: [{ sessionAuth: [] }, { apiKeyAuth: [] }], + }, + apis: ["./src/routes/*.ts", "./src/config/swaggerSchemas.ts"], +}; + +export const swaggerSpec = swaggerJsdoc(options); diff --git a/backend/src/index.ts b/backend/src/index.ts new file mode 100644 index 0000000..c44602c --- /dev/null +++ b/backend/src/index.ts @@ -0,0 +1,300 @@ +import express from "express"; +import session from "express-session"; +import RedisStore from "connect-redis"; +import cors from "cors"; +import helmet from "helmet"; +import { config } from "./config"; +import { redisClient } from "./utils/redis"; +import { prisma } from "./utils/db"; + +import authRoutes from "./routes/auth"; +import onboardingRoutes from "./routes/onboarding"; +import libraryRoutes from "./routes/library"; +import playsRoutes from "./routes/plays"; +import settingsRoutes from "./routes/settings"; +import systemSettingsRoutes from "./routes/systemSettings"; +import listeningStateRoutes from "./routes/listeningState"; +import playbackStateRoutes from "./routes/playbackState"; +import offlineRoutes from "./routes/offline"; +import playlistsRoutes from "./routes/playlists"; +import searchRoutes from "./routes/search"; +import recommendationsRoutes from "./routes/recommendations"; +import downloadsRoutes from "./routes/downloads"; +import webhooksRoutes from "./routes/webhooks"; +import audiobooksRoutes from "./routes/audiobooks"; +import podcastsRoutes from "./routes/podcasts"; +import artistsRoutes from "./routes/artists"; +import soulseekRoutes from "./routes/soulseek"; +import discoverRoutes from "./routes/discover"; +import apiKeysRoutes from "./routes/apiKeys"; +import mixesRoutes from "./routes/mixes"; +import enrichmentRoutes from "./routes/enrichment"; +import homepageRoutes from "./routes/homepage"; +import deviceLinkRoutes from "./routes/deviceLink"; +import spotifyRoutes from "./routes/spotify"; +import notificationsRoutes from "./routes/notifications"; +import browseRoutes from "./routes/browse"; +import analysisRoutes from "./routes/analysis"; +import releasesRoutes from "./routes/releases"; +import { dataCacheService } from "./services/dataCache"; +import { errorHandler } from "./middleware/errorHandler"; +import { + authLimiter, + apiLimiter, + streamLimiter, + imageLimiter, +} from "./middleware/rateLimiter"; +import swaggerUi from "swagger-ui-express"; +import { swaggerSpec } from "./config/swagger"; + +const app = express(); + +// Middleware +app.use( + helmet({ + crossOriginResourcePolicy: { policy: "cross-origin" }, + }) +); +app.use( + cors({ + origin: (origin, callback) => { + // For self-hosted apps: allow all origins by default + // Users deploy on their own domains/IPs - we can't predict them + // Security is handled by authentication, not CORS + if (!origin) { + // Allow requests with no origin (same-origin, curl, etc.) + callback(null, true); + } else if ( + config.allowedOrigins === true || + config.nodeEnv === "development" + ) { + // Explicitly allow all origins + callback(null, true); + } else if ( + Array.isArray(config.allowedOrigins) && + config.allowedOrigins.length > 0 + ) { + // Check against specific allowed origins if configured + if (config.allowedOrigins.includes(origin)) { + callback(null, true); + } else { + // For self-hosted: allow anyway but log it + // Users shouldn't have to configure CORS for their own app + console.log( + `[CORS] Origin ${origin} not in allowlist, allowing anyway (self-hosted)` + ); + callback(null, true); + } + } else { + // No restrictions - allow all (self-hosted default) + callback(null, true); + } + }, + credentials: true, + }) +); +app.use(express.json({ limit: "1mb" })); // Increased from 100KB default to support large queue payloads + +// Session +// Trust proxy for reverse proxy setups (nginx, traefik, etc.) +app.set("trust proxy", 1); + +app.use( + session({ + store: new RedisStore({ + client: redisClient, + ttl: 7 * 24 * 60 * 60, // 7 days in seconds - must match cookie maxAge + }), + secret: config.sessionSecret, + resave: false, + saveUninitialized: false, + proxy: true, // Trust the reverse proxy + cookie: { + httpOnly: true, + // For self-hosted apps: allow HTTP access (common for LAN deployments) + // If behind HTTPS reverse proxy, the proxy should handle security + secure: false, + sameSite: "lax", + maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days + }, + }) +); + +// Routes - All API routes prefixed with /api for clear separation from frontend +// Apply rate limiting to auth routes +app.use("/api/auth/login", authLimiter); +app.use("/api/auth/register", authLimiter); +app.use("/api/auth", authRoutes); +app.use("/api/onboarding", onboardingRoutes); // Public onboarding routes + +// Apply general API rate limiting to all API routes +app.use("/api/api-keys", apiLimiter, apiKeysRoutes); +app.use("/api/device-link", apiLimiter, deviceLinkRoutes); +// NOTE: /api/library has its own rate limiting (imageLimiter for cover-art, apiLimiter for others) +app.use("/api/library", libraryRoutes); +app.use("/api/plays", apiLimiter, playsRoutes); +app.use("/api/settings", apiLimiter, settingsRoutes); +app.use("/api/system-settings", apiLimiter, systemSettingsRoutes); +app.use("/api/listening-state", apiLimiter, listeningStateRoutes); +app.use("/api/playback-state", playbackStateRoutes); // No rate limit - syncs frequently +app.use("/api/offline", apiLimiter, offlineRoutes); +app.use("/api/playlists", apiLimiter, playlistsRoutes); +app.use("/api/search", apiLimiter, searchRoutes); +app.use("/api/recommendations", apiLimiter, recommendationsRoutes); +app.use("/api/downloads", apiLimiter, downloadsRoutes); +app.use("/api/notifications", apiLimiter, notificationsRoutes); +app.use("/api/webhooks", webhooksRoutes); // Webhooks should not be rate limited +// NOTE: /api/audiobooks has its own rate limiting (imageLimiter for covers, apiLimiter for others) +app.use("/api/audiobooks", audiobooksRoutes); +app.use("/api/podcasts", apiLimiter, podcastsRoutes); +app.use("/api/artists", apiLimiter, artistsRoutes); +app.use("/api/soulseek", apiLimiter, soulseekRoutes); +app.use("/api/discover", apiLimiter, discoverRoutes); +app.use("/api/mixes", apiLimiter, mixesRoutes); +app.use("/api/enrichment", apiLimiter, enrichmentRoutes); +app.use("/api/homepage", apiLimiter, homepageRoutes); +app.use("/api/spotify", apiLimiter, spotifyRoutes); +app.use("/api/browse", apiLimiter, browseRoutes); +app.use("/api/analysis", apiLimiter, analysisRoutes); +app.use("/api/releases", apiLimiter, releasesRoutes); + +// Health check (keep at root for simple container health checks) +app.get("/health", (req, res) => { + res.json({ status: "ok" }); +}); +app.get("/api/health", (req, res) => { + res.json({ status: "ok" }); +}); + +// Swagger API Documentation +app.use( + "/api/docs", + swaggerUi.serve, + swaggerUi.setup(swaggerSpec, { + customCss: ".swagger-ui .topbar { display: none }", + customSiteTitle: "Lidify API Documentation", + }) +); + +// Serve raw OpenAPI spec +app.get("/api/docs.json", (req, res) => { + res.json(swaggerSpec); +}); + +// Error handler +app.use(errorHandler); + +app.listen(config.port, "0.0.0.0", async () => { + console.log( + `Lidify API running on port ${config.port} (accessible on all network interfaces)` + ); + + // Enable slow query monitoring in development + if (config.nodeEnv === "development") { + const { enableSlowQueryMonitoring } = await import( + "./utils/queryMonitor" + ); + enableSlowQueryMonitoring(); + } + + // Initialize music configuration (reads from SystemSettings) + const { initializeMusicConfig } = await import("./config"); + await initializeMusicConfig(); + + // Initialize Bull queue workers + await import("./workers"); + + // Set up Bull Board dashboard + const { createBullBoard } = await import("@bull-board/api"); + const { BullAdapter } = await import("@bull-board/api/bullAdapter"); + const { ExpressAdapter } = await import("@bull-board/express"); + const { scanQueue, discoverQueue, imageQueue } = await import( + "./workers/queues" + ); + + const serverAdapter = new ExpressAdapter(); + serverAdapter.setBasePath("/api/admin/queues"); + + createBullBoard({ + queues: [ + new BullAdapter(scanQueue), + new BullAdapter(discoverQueue), + new BullAdapter(imageQueue), + ], + serverAdapter, + }); + + app.use("/api/admin/queues", serverAdapter.getRouter()); + console.log("Bull Board dashboard available at /api/admin/queues"); + + // Note: Native library scanning is now triggered manually via POST /library/scan + // No automatic sync on startup - user must manually scan their music folder + + // Enrichment worker enabled for OWNED content only + // - Background enrichment: Genres, MBIDs, similar artists for owned albums/artists + // - On-demand fetching: Artist images, bios when browsing (cached in Redis 7 days) + console.log( + "Background enrichment enabled for owned content (genres, MBIDs, etc.)" + ); + + // Warm up Redis cache from database on startup + // This populates Redis with existing artist images and album covers + // so first page loads are instant instead of waiting for cache population + dataCacheService.warmupCache().catch((err) => { + console.error("Cache warmup failed:", err); + }); + + // Podcast cache cleanup - runs daily to remove cached episodes older than 30 days + const { cleanupExpiredCache } = await import("./services/podcastDownload"); + + // Run cleanup on startup (async, don't block) + cleanupExpiredCache().catch((err) => { + console.error("Podcast cache cleanup failed:", err); + }); + + // Schedule daily cleanup (every 24 hours) + const TWENTY_FOUR_HOURS = 24 * 60 * 60 * 1000; + setInterval(() => { + cleanupExpiredCache().catch((err) => { + console.error("Scheduled podcast cache cleanup failed:", err); + }); + }, TWENTY_FOUR_HOURS); + console.log("Podcast cache cleanup scheduled (daily, 30-day expiry)"); +}); + +// Graceful shutdown handling +let isShuttingDown = false; + +async function gracefulShutdown(signal: string) { + if (isShuttingDown) { + console.log("Shutdown already in progress..."); + return; + } + + isShuttingDown = true; + console.log(`\nReceived ${signal}. Starting graceful shutdown...`); + + try { + // Shutdown workers (intervals, crons, queues) + const { shutdownWorkers } = await import("./workers"); + await shutdownWorkers(); + + // Close Redis connection + console.log("Closing Redis connection..."); + await redisClient.quit(); + + // Close Prisma connection + console.log("Closing database connection..."); + await prisma.$disconnect(); + + console.log("Graceful shutdown complete"); + process.exit(0); + } catch (error) { + console.error("Error during shutdown:", error); + process.exit(1); + } +} + +// Handle termination signals +process.on("SIGTERM", () => gracefulShutdown("SIGTERM")); +process.on("SIGINT", () => gracefulShutdown("SIGINT")); diff --git a/backend/src/jobs/queueCleaner.ts b/backend/src/jobs/queueCleaner.ts new file mode 100644 index 0000000..672fcc9 --- /dev/null +++ b/backend/src/jobs/queueCleaner.ts @@ -0,0 +1,320 @@ +import { prisma } from "../utils/db"; +import { getSystemSettings } from "../utils/systemSettings"; +import { + cleanStuckDownloads, + getRecentCompletedDownloads, +} from "../services/lidarr"; +import { scanQueue } from "../workers/queues"; +import { simpleDownloadManager } from "../services/simpleDownloadManager"; + +class QueueCleanerService { + private isRunning = false; + private checkInterval = 30000; // 30 seconds when active + private emptyQueueChecks = 0; + private maxEmptyChecks = 3; // Stop after 3 consecutive empty checks + private timeoutId?: NodeJS.Timeout; + + /** + * Start the polling loop + * Safe to call multiple times - won't create duplicate loops + */ + async start() { + if (this.isRunning) { + console.log(" Queue cleaner already running"); + return; + } + + this.isRunning = true; + this.emptyQueueChecks = 0; + console.log(" Queue cleaner started (checking every 30s)"); + + await this.runCleanup(); + } + + /** + * Stop the polling loop + */ + stop() { + if (this.timeoutId) { + clearTimeout(this.timeoutId); + this.timeoutId = undefined; + } + this.isRunning = false; + console.log(" Queue cleaner stopped (queue empty)"); + } + + /** + * Main cleanup logic - runs every 30 seconds when active + */ + private async runCleanup() { + if (!this.isRunning) return; + + try { + // Use getSystemSettings() to get decrypted API key + const settings = await getSystemSettings(); + + if (!settings?.lidarrUrl || !settings?.lidarrApiKey) { + console.log(" Lidarr not configured, stopping queue cleaner"); + this.stop(); + return; + } + + // PART 0: Check for stale downloads (timed out) + const staleCount = + await simpleDownloadManager.markStaleJobsAsFailed(); + if (staleCount > 0) { + console.log(`⏰ Cleaned up ${staleCount} stale download(s)`); + this.emptyQueueChecks = 0; // Reset counter + } + + // PART 0.25: Reconcile processing jobs with Lidarr (fix missed webhooks) + const reconcileResult = + await simpleDownloadManager.reconcileWithLidarr(); + if (reconcileResult.reconciled > 0) { + console.log( + `✓ Reconciled ${reconcileResult.reconciled} job(s) with Lidarr` + ); + this.emptyQueueChecks = 0; // Reset counter + } + + // PART 0.5: Check for stuck discovery batches (batch-level timeout) + const { discoverWeeklyService } = await import( + "../services/discoverWeekly" + ); + const stuckBatchCount = + await discoverWeeklyService.checkStuckBatches(); + if (stuckBatchCount > 0) { + console.log( + `⏰ Force-completed ${stuckBatchCount} stuck discovery batch(es)` + ); + this.emptyQueueChecks = 0; // Reset counter + } + + // PART 1: Check for stuck downloads needing blocklist + retry + const cleanResult = await cleanStuckDownloads( + settings.lidarrUrl, + settings.lidarrApiKey + ); + + if (cleanResult.removed > 0) { + console.log( + `[CLEANUP] Removed ${cleanResult.removed} stuck download(s) - searching for alternatives` + ); + this.emptyQueueChecks = 0; // Reset counter - queue had activity + + // Update retry count for jobs that might match these titles + // Note: This is a best-effort match since we only have the title + for (const title of cleanResult.items) { + // Try to extract artist and album from the title + // Typical format: "Artist - Album" or "Artist - Album (Year)" + const parts = title.split(" - "); + if (parts.length >= 2) { + const artistName = parts[0].trim(); + const albumPart = parts.slice(1).join(" - ").trim(); + // Remove year in parentheses if present + const albumTitle = albumPart + .replace(/\s*\(\d{4}\)\s*$/, "") + .trim(); + + // Find matching processing jobs + const matchingJobs = await prisma.downloadJob.findMany({ + where: { + status: "processing", + subject: { + contains: albumTitle, + mode: "insensitive", + }, + }, + }); + + for (const job of matchingJobs) { + const metadata = (job.metadata as any) || {}; + const currentRetryCount = metadata.retryCount || 0; + + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + metadata: { + ...metadata, + retryCount: currentRetryCount + 1, + lastError: + "Import failed - searching for alternative release", + }, + }, + }); + + console.log( + ` Updated job ${job.id}: retry ${ + currentRetryCount + 1 + }` + ); + } + } + } + } + + // PART 2: Check for completed downloads (missing webhooks) + const completedDownloads = await getRecentCompletedDownloads( + settings.lidarrUrl, + settings.lidarrApiKey, + 5 // Only check last 5 minutes since we're running frequently + ); + + let recoveredCount = 0; + let skippedCount = 0; + + for (const download of completedDownloads) { + // Skip records without album data (can happen with certain event types) + if (!download.album?.foreignAlbumId) { + skippedCount++; + continue; + } + + const mbid = download.album.foreignAlbumId; + + // Find matching job(s) in database by MBID or downloadId + const orphanedJobs = await prisma.downloadJob.findMany({ + where: { + status: { in: ["processing", "pending"] }, + OR: [ + { targetMbid: mbid }, + { lidarrRef: download.downloadId }, + ], + }, + }); + + if (orphanedJobs.length > 0) { + const artistName = + download.artist?.name || "Unknown Artist"; + const albumTitle = download.album?.title || "Unknown Album"; + console.log( + `Recovered orphaned job: ${artistName} - ${albumTitle}` + ); + console.log(` Download ID: ${download.downloadId}`); + this.emptyQueueChecks = 0; // Reset counter - found work to do + recoveredCount += orphanedJobs.length; + + // Mark all matching jobs as complete + await prisma.downloadJob.updateMany({ + where: { + id: { + in: orphanedJobs.map( + (j: { id: string }) => j.id + ), + }, + }, + data: { + status: "completed", + completedAt: new Date(), + }, + }); + + // Check batch completion for any Discovery jobs + // Use proper checkBatchCompletion() instead of manual logic + const discoveryBatchIds = new Set(); + for (const job of orphanedJobs) { + if (job.discoveryBatchId) { + discoveryBatchIds.add(job.discoveryBatchId); + } + } + + if (discoveryBatchIds.size > 0) { + const { discoverWeeklyService } = await import( + "../services/discoverWeekly" + ); + for (const batchId of discoveryBatchIds) { + console.log( + ` Checking Discovery batch completion: ${batchId}` + ); + await discoverWeeklyService.checkBatchCompletion( + batchId + ); + } + } + + // Trigger library scan for non-discovery jobs + const nonDiscoveryJobs = orphanedJobs.filter( + (j: { discoveryBatchId: string | null }) => + !j.discoveryBatchId + ); + if (nonDiscoveryJobs.length > 0) { + console.log( + ` Triggering library scan for recovered job(s)...` + ); + await scanQueue.add("scan", { + type: "full", + source: "queue-cleaner-recovery", + }); + } + } + } + + if (recoveredCount > 0) { + console.log(`Recovered ${recoveredCount} orphaned job(s)`); + } + + // Only log skipped count occasionally to reduce noise + if (skippedCount > 0 && this.emptyQueueChecks === 0) { + console.log( + ` (Skipped ${skippedCount} incomplete download records)` + ); + } + + // PART 3: Check if we should stop (no activity) + const activeJobs = await prisma.downloadJob.count({ + where: { + status: { in: ["pending", "processing"] }, + }, + }); + + const hadActivity = + cleanResult.removed > 0 || recoveredCount > 0 || activeJobs > 0; + + if (!hadActivity) { + this.emptyQueueChecks++; + console.log( + ` Queue empty (${this.emptyQueueChecks}/${this.maxEmptyChecks})` + ); + + if (this.emptyQueueChecks >= this.maxEmptyChecks) { + console.log( + ` No activity for ${this.maxEmptyChecks} checks - stopping cleaner` + ); + this.stop(); + return; + } + } else { + this.emptyQueueChecks = 0; + } + + // Schedule next check + this.timeoutId = setTimeout( + () => this.runCleanup(), + this.checkInterval + ); + } catch (error) { + console.error(" Queue cleanup error:", error); + // Still schedule next check even on error + this.timeoutId = setTimeout( + () => this.runCleanup(), + this.checkInterval + ); + } + } + + /** + * Get current status (for debugging/monitoring) + */ + getStatus() { + return { + isRunning: this.isRunning, + emptyQueueChecks: this.emptyQueueChecks, + nextCheckIn: this.isRunning + ? `${this.checkInterval / 1000}s` + : "stopped", + }; + } +} + +// Export singleton instance +export const queueCleaner = new QueueCleanerService(); diff --git a/backend/src/middleware/auth.ts b/backend/src/middleware/auth.ts new file mode 100644 index 0000000..44dd4f1 --- /dev/null +++ b/backend/src/middleware/auth.ts @@ -0,0 +1,205 @@ +import { Request, Response, NextFunction } from "express"; +import { prisma } from "../utils/db"; +import jwt from "jsonwebtoken"; + +// JWT_SECRET is required - SESSION_SECRET is used as fallback since docker-entrypoint.sh generates it +const JWT_SECRET = process.env.JWT_SECRET || process.env.SESSION_SECRET; + +if (!JWT_SECRET) { + throw new Error( + "JWT_SECRET or SESSION_SECRET environment variable is required for authentication" + ); +} + +declare global { + namespace Express { + interface Request { + user?: { + id: string; + username: string; + role: string; + }; + } + } +} + +export interface JWTPayload { + userId: string; + username: string; + role: string; +} + +export function generateToken(user: { id: string; username: string; role: string }): string { + return jwt.sign( + { userId: user.id, username: user.username, role: user.role }, + JWT_SECRET, + { expiresIn: "30d" } + ); +} + +export async function requireAuth( + req: Request, + res: Response, + next: NextFunction +) { + // First, check session-based auth (primary method) + if (req.session?.userId) { + try { + const user = await prisma.user.findUnique({ + where: { id: req.session.userId }, + select: { id: true, username: true, role: true }, + }); + + if (user) { + req.user = user; + return next(); + } + } catch (error) { + console.error("Session auth error:", error); + } + } + + // Check for API key in X-API-Key header (for mobile/external apps) + const apiKey = req.headers["x-api-key"] as string; + if (apiKey) { + try { + const apiKeyRecord = await prisma.apiKey.findUnique({ + where: { key: apiKey }, + include: { user: { select: { id: true, username: true, role: true } } }, + }); + + if (apiKeyRecord && apiKeyRecord.user) { + // Update last used timestamp (async, don't block) + prisma.apiKey.update({ + where: { id: apiKeyRecord.id }, + data: { lastUsed: new Date() }, + }).catch(() => {}); // Ignore errors on lastUsed update + + req.user = apiKeyRecord.user; + return next(); + } + } catch (error) { + console.error("API key auth error:", error); + } + } + + // Fallback: check JWT token in Authorization header + const authHeader = req.headers.authorization; + const token = authHeader?.startsWith("Bearer ") ? authHeader.substring(7) : null; + + if (token) { + try { + const decoded = jwt.verify(token, JWT_SECRET) as JWTPayload; + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + select: { id: true, username: true, role: true }, + }); + + if (user) { + req.user = user; + return next(); + } + } catch (error) { + // Token invalid, continue to error + } + } + + return res.status(401).json({ error: "Not authenticated" }); +} + +export async function requireAdmin(req: Request, res: Response, next: NextFunction) { + if (!req.user || req.user.role !== "admin") { + return res.status(403).json({ error: "Admin access required" }); + } + next(); +} + +// For streaming URLs that may use query params or need special handling +export async function requireAuthOrToken( + req: Request, + res: Response, + next: NextFunction +) { + // First, check session-based auth (primary method for web) + if (req.session?.userId) { + try { + const user = await prisma.user.findUnique({ + where: { id: req.session.userId }, + select: { id: true, username: true, role: true }, + }); + + if (user) { + req.user = user; + return next(); + } + } catch (error) { + console.error("Session auth error:", error); + } + } + + // Check for API key in X-API-Key header (for mobile/external apps) + const apiKey = req.headers["x-api-key"] as string; + if (apiKey) { + try { + const apiKeyRecord = await prisma.apiKey.findUnique({ + where: { key: apiKey }, + include: { user: { select: { id: true, username: true, role: true } } }, + }); + + if (apiKeyRecord && apiKeyRecord.user) { + // Update last used timestamp (async, don't block) + prisma.apiKey.update({ + where: { id: apiKeyRecord.id }, + data: { lastUsed: new Date() }, + }).catch(() => {}); // Ignore errors on lastUsed update + + req.user = apiKeyRecord.user; + return next(); + } + } catch (error) { + console.error("API key auth error:", error); + } + } + + // Check for token in query param (for streaming URLs from audio elements) + const tokenParam = req.query.token as string; + if (tokenParam) { + try { + const decoded = jwt.verify(tokenParam, JWT_SECRET) as JWTPayload; + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + select: { id: true, username: true, role: true }, + }); + + if (user) { + req.user = user; + return next(); + } + } catch (error) { + // Token invalid, try other methods + } + } + + // Fallback: check JWT token in Authorization header + const authHeader = req.headers.authorization; + const token = authHeader?.startsWith("Bearer ") ? authHeader.substring(7) : null; + + if (token) { + try { + const decoded = jwt.verify(token, JWT_SECRET) as JWTPayload; + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + select: { id: true, username: true, role: true }, + }); + + if (user) { + req.user = user; + return next(); + } + } catch (error) { + // Token invalid, continue to error + } + } + + return res.status(401).json({ error: "Not authenticated" }); +} diff --git a/backend/src/middleware/errorHandler.ts b/backend/src/middleware/errorHandler.ts new file mode 100644 index 0000000..3dde8b1 --- /dev/null +++ b/backend/src/middleware/errorHandler.ts @@ -0,0 +1,11 @@ +import { Request, Response, NextFunction } from "express"; + +export function errorHandler( + err: Error, + req: Request, + res: Response, + next: NextFunction +) { + console.error(err.stack); + res.status(500).json({ error: "Internal server error" }); +} diff --git a/backend/src/middleware/rateLimiter.ts b/backend/src/middleware/rateLimiter.ts new file mode 100644 index 0000000..f14e47e --- /dev/null +++ b/backend/src/middleware/rateLimiter.ts @@ -0,0 +1,58 @@ +import rateLimit from "express-rate-limit"; + +// General API rate limiter (5000 req/minute per IP) +// This is for a single-user self-hosted app, so limits should be VERY high +// Only exists to prevent infinite loops or bugs from DOS'ing the server +export const apiLimiter = rateLimit({ + windowMs: 1 * 60 * 1000, // 1 minute + max: 5000, // Very high limit - personal app, not a public API + message: "Too many requests from this IP, please try again later.", + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + skip: (req) => { + // Never rate limit streaming or status polling endpoints + return req.path.includes("/stream") || + req.path.includes("/status") || + req.path.includes("/health"); + }, +}); + +// Auth limiter for login endpoints (20 attempts/15min per IP) +// More lenient for self-hosted apps where users may have password manager issues +export const authLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, // 15 minutes + max: 20, // Increased from 5 for self-hosted environments + skipSuccessfulRequests: true, // Don't count successful requests + message: "Too many login attempts, please try again in 15 minutes.", + standardHeaders: true, + legacyHeaders: false, +}); + +// Media streaming limiter (higher limit: 200 streams/minute) +export const streamLimiter = rateLimit({ + windowMs: 1 * 60 * 1000, // 1 minute + max: 200, // Allow 200 stream requests per minute + message: "Too many streaming requests, please slow down.", + standardHeaders: true, + legacyHeaders: false, +}); + +// Image/Cover art limiter (very high limit: 500 req/minute) +// This is for image proxying - not a security risk, just bandwidth +export const imageLimiter = rateLimit({ + windowMs: 1 * 60 * 1000, // 1 minute + max: 500, // Allow 500 image requests per minute (high volume pages need this) + message: "Too many image requests, please slow down.", + standardHeaders: true, + legacyHeaders: false, +}); + +// Download limiter (100 req/minute) +// Users might download entire discographies, so this needs to be reasonable +export const downloadLimiter = rateLimit({ + windowMs: 1 * 60 * 1000, // 1 minute + max: 100, + message: "Too many download requests, please try again later.", + standardHeaders: true, + legacyHeaders: false, +}); diff --git a/backend/src/routes/analysis.ts b/backend/src/routes/analysis.ts new file mode 100644 index 0000000..0cb9d89 --- /dev/null +++ b/backend/src/routes/analysis.ts @@ -0,0 +1,293 @@ +import { Router } from "express"; +import { prisma } from "../utils/db"; +import { redisClient } from "../utils/redis"; +import { requireAuth, requireAdmin } from "../middleware/auth"; + +const router = Router(); + +// Redis queue key for audio analysis +const ANALYSIS_QUEUE = "audio:analysis:queue"; + +/** + * GET /api/analysis/status + * Get audio analysis status and progress + */ +router.get("/status", requireAuth, async (req, res) => { + try { + // Get counts by status + const statusCounts = await prisma.track.groupBy({ + by: ["analysisStatus"], + _count: true, + }); + + const total = statusCounts.reduce((sum, s) => sum + s._count, 0); + const completed = statusCounts.find(s => s.analysisStatus === "completed")?._count || 0; + const failed = statusCounts.find(s => s.analysisStatus === "failed")?._count || 0; + const processing = statusCounts.find(s => s.analysisStatus === "processing")?._count || 0; + const pending = statusCounts.find(s => s.analysisStatus === "pending")?._count || 0; + + // Get queue length from Redis + const queueLength = await redisClient.lLen(ANALYSIS_QUEUE); + + const progress = total > 0 ? Math.round((completed / total) * 100) : 0; + + res.json({ + total, + completed, + failed, + processing, + pending, + queueLength, + progress, + isComplete: pending === 0 && processing === 0 && queueLength === 0, + }); + } catch (error: any) { + console.error("Analysis status error:", error); + res.status(500).json({ error: "Failed to get analysis status" }); + } +}); + +/** + * POST /api/analysis/start + * Start audio analysis for pending tracks (admin only) + */ +router.post("/start", requireAuth, requireAdmin, async (req, res) => { + try { + const { limit = 100, priority = "recent" } = req.body; + + // Find pending tracks + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "pending", + }, + select: { + id: true, + filePath: true, + }, + orderBy: priority === "recent" + ? { fileModified: "desc" } + : { title: "asc" }, + take: Math.min(limit, 1000), + }); + + if (tracks.length === 0) { + return res.json({ + message: "No pending tracks to analyze", + queued: 0, + }); + } + + // Queue tracks for analysis + const pipeline = redisClient.multi(); + for (const track of tracks) { + pipeline.rPush(ANALYSIS_QUEUE, JSON.stringify({ + trackId: track.id, + filePath: track.filePath, + })); + } + await pipeline.exec(); + + console.log(`Queued ${tracks.length} tracks for audio analysis`); + + res.json({ + message: `Queued ${tracks.length} tracks for analysis`, + queued: tracks.length, + }); + } catch (error: any) { + console.error("Analysis start error:", error); + res.status(500).json({ error: "Failed to start analysis" }); + } +}); + +/** + * POST /api/analysis/retry-failed + * Retry failed analysis jobs (admin only) + */ +router.post("/retry-failed", requireAuth, requireAdmin, async (req, res) => { + try { + // Reset failed tracks to pending + const result = await prisma.track.updateMany({ + where: { + analysisStatus: "failed", + }, + data: { + analysisStatus: "pending", + analysisError: null, + }, + }); + + res.json({ + message: `Reset ${result.count} failed tracks to pending`, + reset: result.count, + }); + } catch (error: any) { + console.error("Retry failed error:", error); + res.status(500).json({ error: "Failed to retry analysis" }); + } +}); + +/** + * POST /api/analysis/analyze/:trackId + * Queue a specific track for analysis + */ +router.post("/analyze/:trackId", requireAuth, async (req, res) => { + try { + const { trackId } = req.params; + + const track = await prisma.track.findUnique({ + where: { id: trackId }, + select: { + id: true, + filePath: true, + analysisStatus: true, + }, + }); + + if (!track) { + return res.status(404).json({ error: "Track not found" }); + } + + // Queue for analysis + await redisClient.rPush(ANALYSIS_QUEUE, JSON.stringify({ + trackId: track.id, + filePath: track.filePath, + })); + + // Mark as pending if not already + if (track.analysisStatus !== "processing") { + await prisma.track.update({ + where: { id: trackId }, + data: { analysisStatus: "pending" }, + }); + } + + res.json({ + message: "Track queued for analysis", + trackId, + }); + } catch (error: any) { + console.error("Analyze track error:", error); + res.status(500).json({ error: "Failed to queue track for analysis" }); + } +}); + +/** + * GET /api/analysis/track/:trackId + * Get analysis data for a specific track + */ +router.get("/track/:trackId", requireAuth, async (req, res) => { + try { + const { trackId } = req.params; + + const track = await prisma.track.findUnique({ + where: { id: trackId }, + select: { + id: true, + title: true, + analysisStatus: true, + analysisError: true, + analyzedAt: true, + analysisVersion: true, + bpm: true, + beatsCount: true, + key: true, + keyScale: true, + keyStrength: true, + energy: true, + loudness: true, + dynamicRange: true, + danceability: true, + valence: true, + arousal: true, + instrumentalness: true, + acousticness: true, + speechiness: true, + moodTags: true, + essentiaGenres: true, + lastfmTags: true, + }, + }); + + if (!track) { + return res.status(404).json({ error: "Track not found" }); + } + + res.json(track); + } catch (error: any) { + console.error("Get track analysis error:", error); + res.status(500).json({ error: "Failed to get track analysis" }); + } +}); + +/** + * GET /api/analysis/features + * Get aggregated feature statistics for the library + */ +router.get("/features", requireAuth, async (req, res) => { + try { + // Get analyzed tracks + const analyzed = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + bpm: { not: null }, + }, + select: { + bpm: true, + energy: true, + danceability: true, + valence: true, + keyScale: true, + }, + }); + + if (analyzed.length === 0) { + return res.json({ + count: 0, + averages: null, + distributions: null, + }); + } + + // Calculate averages + const avgBpm = analyzed.reduce((sum, t) => sum + (t.bpm || 0), 0) / analyzed.length; + const avgEnergy = analyzed.reduce((sum, t) => sum + (t.energy || 0), 0) / analyzed.length; + const avgDanceability = analyzed.reduce((sum, t) => sum + (t.danceability || 0), 0) / analyzed.length; + const avgValence = analyzed.reduce((sum, t) => sum + (t.valence || 0), 0) / analyzed.length; + + // Key distribution + const majorCount = analyzed.filter(t => t.keyScale === "major").length; + const minorCount = analyzed.filter(t => t.keyScale === "minor").length; + + // BPM distribution (buckets) + const bpmBuckets = { + slow: analyzed.filter(t => (t.bpm || 0) < 90).length, + moderate: analyzed.filter(t => (t.bpm || 0) >= 90 && (t.bpm || 0) < 120).length, + upbeat: analyzed.filter(t => (t.bpm || 0) >= 120 && (t.bpm || 0) < 150).length, + fast: analyzed.filter(t => (t.bpm || 0) >= 150).length, + }; + + res.json({ + count: analyzed.length, + averages: { + bpm: Math.round(avgBpm), + energy: Math.round(avgEnergy * 100) / 100, + danceability: Math.round(avgDanceability * 100) / 100, + valence: Math.round(avgValence * 100) / 100, + }, + distributions: { + key: { major: majorCount, minor: minorCount }, + bpm: bpmBuckets, + }, + }); + } catch (error: any) { + console.error("Get features error:", error); + res.status(500).json({ error: "Failed to get feature statistics" }); + } +}); + +export default router; + + + + + diff --git a/backend/src/routes/apiKeys.ts b/backend/src/routes/apiKeys.ts new file mode 100644 index 0000000..52fdf34 --- /dev/null +++ b/backend/src/routes/apiKeys.ts @@ -0,0 +1,231 @@ +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import crypto from "crypto"; + +const router = Router(); + +// All API key routes require authentication (session-based) +router.use(requireAuth); + +/** + * @openapi + * /api-keys: + * post: + * summary: Create a new API key for mobile/external authentication + * tags: [API Keys] + * security: + * - sessionAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - deviceName + * properties: + * deviceName: + * type: string + * description: Name of the device (e.g., "iPhone 14", "Android Tablet") + * example: "iPhone 14" + * responses: + * 201: + * description: API key created successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * apiKey: + * type: string + * description: The generated API key (64-character hex string) + * example: "a1b2c3d4e5f6..." + * name: + * type: string + * example: "iPhone 14" + * createdAt: + * type: string + * format: date-time + * message: + * type: string + * example: "API key created successfully. Save this key - you won't see it again!" + * 400: + * description: Invalid request + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.post("/", async (req, res) => { + try { + const { deviceName } = req.body; + + if (!deviceName || deviceName.trim().length === 0) { + return res.status(400).json({ error: "Device name is required" }); + } + + // Use req.user.id (set by requireAuth middleware) - supports both session and JWT auth + const userId = req.user?.id || req.session?.userId; + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + + // Generate a secure random API key (32 bytes = 64 hex chars) + const apiKeyValue = crypto.randomBytes(32).toString("hex"); + + const apiKey = await prisma.apiKey.create({ + data: { + userId, + name: deviceName.trim(), + key: apiKeyValue, + }, + }); + + console.log(`API key created for user ${userId}: ${deviceName}`); + + res.status(201).json({ + apiKey: apiKey.key, + name: apiKey.name, + createdAt: apiKey.createdAt, + message: + "API key created successfully. Save this key - you won't see it again!", + }); + } catch (error) { + console.error("Create API key error:", error); + res.status(500).json({ error: "Failed to create API key" }); + } +}); + +/** + * @openapi + * /api-keys: + * get: + * summary: List all API keys for the current user + * tags: [API Keys] + * security: + * - sessionAuth: [] + * responses: + * 200: + * description: List of API keys (without the actual key values for security) + * content: + * application/json: + * schema: + * type: object + * properties: + * apiKeys: + * type: array + * items: + * $ref: '#/components/schemas/ApiKey' + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.get("/", async (req, res) => { + try { + // Use req.user.id (set by requireAuth middleware) - supports both session and JWT auth + const userId = req.user?.id || req.session?.userId; + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + + const keys = await prisma.apiKey.findMany({ + where: { userId }, + select: { + id: true, + name: true, + lastUsed: true, + createdAt: true, + // Don't return the actual key for security! + }, + orderBy: { createdAt: "desc" }, + }); + + res.json({ apiKeys: keys }); + } catch (error) { + console.error("List API keys error:", error); + res.status(500).json({ error: "Failed to list API keys" }); + } +}); + +/** + * @openapi + * /api-keys/{id}: + * delete: + * summary: Revoke an API key + * tags: [API Keys] + * security: + * - sessionAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * description: The API key ID + * responses: + * 200: + * description: API key revoked successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * example: "API key revoked successfully" + * 404: + * description: API key not found + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.delete("/:id", async (req, res) => { + try { + // Use req.user.id (set by requireAuth middleware) - supports both session and JWT auth + const userId = req.user?.id || req.session?.userId; + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + const keyId = req.params.id; + + // Only allow users to delete their own keys + const deleted = await prisma.apiKey.deleteMany({ + where: { + id: keyId, + userId, + }, + }); + + if (deleted.count === 0) { + return res + .status(404) + .json({ error: "API key not found or already deleted" }); + } + + console.log(`API key ${keyId} revoked by user ${userId}`); + + res.json({ message: "API key revoked successfully" }); + } catch (error) { + console.error("Delete API key error:", error); + res.status(500).json({ error: "Failed to revoke API key" }); + } +}); + +export default router; diff --git a/backend/src/routes/artists.ts b/backend/src/routes/artists.ts new file mode 100644 index 0000000..651da6a --- /dev/null +++ b/backend/src/routes/artists.ts @@ -0,0 +1,566 @@ +import { Router } from "express"; +import { lastFmService } from "../services/lastfm"; +import { musicBrainzService } from "../services/musicbrainz"; +import { fanartService } from "../services/fanart"; +import { deezerService } from "../services/deezer"; +import { redisClient } from "../utils/redis"; + +const router = Router(); + +// Cache TTL for discovery content (shorter since it's not owned) +const DISCOVERY_CACHE_TTL = 24 * 60 * 60; // 24 hours + +// GET /artists/preview/:artistName/:trackTitle - Get Deezer preview URL for a track +router.get("/preview/:artistName/:trackTitle", async (req, res) => { + try { + const { artistName, trackTitle } = req.params; + const decodedArtist = decodeURIComponent(artistName); + const decodedTrack = decodeURIComponent(trackTitle); + + console.log( + `Getting preview for "${decodedTrack}" by ${decodedArtist}` + ); + + const previewUrl = await deezerService.getTrackPreview( + decodedArtist, + decodedTrack + ); + + if (previewUrl) { + res.json({ previewUrl }); + } else { + res.status(404).json({ error: "Preview not found" }); + } + } catch (error: any) { + console.error("Preview fetch error:", error); + res.status(500).json({ + error: "Failed to fetch preview", + message: error.message, + }); + } +}); + +// GET /artists/discover/:nameOrMbid - Get artist details for discovery (not in library yet) +router.get("/discover/:nameOrMbid", async (req, res) => { + try { + const { nameOrMbid } = req.params; + + // Check Redis cache first for discovery content + const cacheKey = `discovery:artist:${nameOrMbid}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(`[Discovery] Cache hit for artist: ${nameOrMbid}`); + return res.json(JSON.parse(cached)); + } + } catch (err) { + // Redis errors are non-critical + } + + // Check if it's an MBID (UUID format) or name + const isMbid = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test( + nameOrMbid + ); + + let mbid: string | null = isMbid ? nameOrMbid : null; + let artistName: string = isMbid ? "" : decodeURIComponent(nameOrMbid); + + // If we have a name but no MBID, search for it + if (!mbid && artistName) { + const mbResults = await musicBrainzService.searchArtist( + artistName, + 1 + ); + if (mbResults.length > 0) { + mbid = mbResults[0].id; + artistName = mbResults[0].name; + } + } + + // If we have MBID but no name, get it from MusicBrainz + if (mbid && !artistName) { + const mbArtist = await musicBrainzService.getArtist(mbid); + artistName = mbArtist.name; + } + + if (!artistName) { + return res.status(404).json({ error: "Artist not found" }); + } + + // Get artist info from Last.fm + const lastFmInfo = await lastFmService.getArtistInfo( + artistName, + mbid || undefined + ); + + // Filter out generic "multiple artists" biographies from Last.fm + // These occur when Last.fm groups artists with the same name + let bio = lastFmInfo?.bio?.summary || null; + if (bio) { + const lowerBio = bio.toLowerCase(); + if ( + (lowerBio.includes("there are") && + (lowerBio.includes("artist") || + lowerBio.includes("band")) && + lowerBio.includes("with the name")) || + lowerBio.includes("there is more than one artist") || + lowerBio.includes("multiple artists") + ) { + // This is a disambiguation page - don't show it + console.log( + ` Filtered out disambiguation biography for ${artistName}` + ); + bio = null; + } + } + + // Get top tracks from Last.fm + let topTracks: any[] = []; + if (mbid || artistName) { + try { + topTracks = await lastFmService.getArtistTopTracks( + mbid || "", + artistName, + 10 + ); + } catch (error) { + console.log(`Failed to get top tracks for ${artistName}`); + } + } + + // Get artist image + let image = null; + + // Try Fanart.tv first (if we have MBID) + if (mbid) { + try { + image = await fanartService.getArtistImage(mbid); + console.log(`Fanart.tv image for ${artistName}`); + } catch (error) { + console.log( + `✗ Failed to get Fanart.tv image for ${artistName}` + ); + } + } + + // Fallback to Deezer + if (!image) { + try { + image = await deezerService.getArtistImage(artistName); + if (image) { + console.log(`Deezer image for ${artistName}`); + } + } catch (error) { + console.log(`✗ Failed to get Deezer image for ${artistName}`); + } + } + + // Fallback to Last.fm (but filter placeholders) + if (!image && lastFmInfo?.image) { + const lastFmImage = lastFmService.getBestImage(lastFmInfo.image); + // Filter out Last.fm placeholder + if ( + lastFmImage && + !lastFmImage.includes("2a96cbd8b46e442fc41c2b86b821562f") + ) { + image = lastFmImage; + console.log(`Last.fm image for ${artistName}`); + } else { + console.log(`✗ Last.fm returned placeholder for ${artistName}`); + } + } + + // Get discography from MusicBrainz + let albums: any[] = []; + if (mbid) { + try { + const releaseGroups = await musicBrainzService.getReleaseGroups( + mbid + ); + + // Filter albums - only show studio albums and EPs + // Exclude live albums, compilations, soundtracks, remixes, etc. + const filteredReleaseGroups = releaseGroups.filter( + (rg: any) => { + // Must be Album or EP + const isPrimaryType = + rg["primary-type"] === "Album" || + rg["primary-type"] === "EP"; + if (!isPrimaryType) return false; + + // Exclude secondary types (live, compilation, soundtrack, remix, etc.) + const secondaryTypes = rg["secondary-types"] || []; + const hasExcludedType = secondaryTypes.some( + (type: string) => + [ + "Live", + "Compilation", + "Soundtrack", + "Remix", + "DJ-mix", + "Mixtape/Street", + ].includes(type) + ); + + return !hasExcludedType; + } + ); + + // Process albums with Deezer fallback + albums = await Promise.all( + filteredReleaseGroups.map(async (rg: any) => { + // Default to Cover Art Archive URL + let coverUrl = `https://coverartarchive.org/release-group/${rg.id}/front-500`; + + // For first 10 albums, try Deezer as fallback if Cover Art Archive doesn't have it + // (to avoid too many requests) + const index = filteredReleaseGroups.indexOf(rg); + if (index < 10) { + try { + const response = await fetch(coverUrl, { + method: "HEAD", + signal: AbortSignal.timeout(2000), + }); + if (!response.ok) { + // Cover Art Archive doesn't have it, try Deezer + const deezerCover = + await deezerService.getAlbumCover( + artistName, + rg.title + ); + if (deezerCover) { + coverUrl = deezerCover; + } + } + } catch (error) { + // Silently fail and keep Cover Art Archive URL + } + } + + return { + id: rg.id, // MBID - used for linking + rgMbid: rg.id, // Release group MBID - used for downloads + mbid: rg.id, // Fallback MBID + title: rg.title, + type: rg["primary-type"], + year: rg["first-release-date"] + ? parseInt( + rg["first-release-date"].substring(0, 4) + ) + : null, + releaseDate: rg["first-release-date"] || null, + coverUrl, + owned: false, // Discovery albums are never owned + }; + }) + ); + + // Sort albums + albums.sort((a: any, b: any) => { + // Sort by year descending (newest first) + if (a.year && b.year) return b.year - a.year; + if (a.year) return -1; + if (b.year) return 1; + return 0; + }); + } catch (error) { + console.error( + `Failed to get discography for ${artistName}:`, + error + ); + } + } + + // Get similar artists from Last.fm and fetch images + const similarArtistsRaw = lastFmInfo?.similar?.artist || []; + const similarArtists = await Promise.all( + similarArtistsRaw.slice(0, 10).map(async (artist: any) => { + const similarImage = artist.image?.find( + (img: any) => img.size === "large" + )?.[" #text"]; + + let image = null; + + // Try Fanart.tv first (if we have MBID) + if (artist.mbid) { + try { + image = await fanartService.getArtistImage(artist.mbid); + } catch (error) { + // Silently fail + } + } + + // Fallback to Deezer + if (!image) { + try { + const deezerImage = await deezerService.getArtistImage( + artist.name + ); + if (deezerImage) { + image = deezerImage; + } + } catch (error) { + // Silently fail + } + } + + // Last fallback to Last.fm (but filter placeholders) + if ( + !image && + similarImage && + !similarImage.includes("2a96cbd8b46e442fc41c2b86b821562f") + ) { + image = similarImage; + } + + return { + id: artist.mbid || artist.name, + name: artist.name, + mbid: artist.mbid || null, + url: artist.url, + image, + }; + }) + ); + + const response = { + mbid, + name: artistName, + image, + bio, // Use filtered bio instead of raw Last.fm bio + summary: bio, // Alias for consistency + tags: lastFmInfo?.tags?.tag?.map((t: any) => t.name) || [], + genres: lastFmInfo?.tags?.tag?.map((t: any) => t.name) || [], // Alias for consistency + listeners: parseInt(lastFmInfo?.stats?.listeners || "0"), + playcount: parseInt(lastFmInfo?.stats?.playcount || "0"), + url: lastFmInfo?.url || null, + albums: albums.map((album) => ({ ...album, owned: false })), // Mark all as not owned + topTracks: topTracks.map((track) => ({ + id: `lastfm-${mbid || artistName}-${track.name}`, + title: track.name, + playCount: parseInt(track.playcount || "0"), + listeners: parseInt(track.listeners || "0"), + duration: parseInt(track.duration || "0"), + url: track.url, + album: { title: track.album?.["#text"] || "Unknown Album" }, + })), + similarArtists, + }; + + // Cache discovery response for 24 hours + try { + await redisClient.setEx( + cacheKey, + DISCOVERY_CACHE_TTL, + JSON.stringify(response) + ); + console.log(`[Discovery] Cached artist: ${artistName}`); + } catch (err) { + // Redis errors are non-critical + } + + res.json(response); + } catch (error: any) { + console.error("Artist discovery error:", error); + res.status(500).json({ + error: "Failed to fetch artist details", + message: error.message, + }); + } +}); + +// GET /artists/album/:mbid - Get album details for discovery (not in library yet) +router.get("/album/:mbid", async (req, res) => { + try { + const { mbid } = req.params; + + // Check Redis cache first for discovery content + const cacheKey = `discovery:album:${mbid}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(`[Discovery] Cache hit for album: ${mbid}`); + return res.json(JSON.parse(cached)); + } + } catch (err) { + // Redis errors are non-critical + } + + let releaseGroup: any = null; + let release: any = null; + let releaseGroupId: string = mbid; + + // Try as release-group first, then as release + try { + releaseGroup = await musicBrainzService.getReleaseGroup(mbid); + } catch (error: any) { + // If 404, try as a release instead + if (error.response?.status === 404) { + console.log( + `${mbid} is not a release-group, trying as release...` + ); + release = await musicBrainzService.getRelease(mbid); + releaseGroupId = release["release-group"]?.id || mbid; + + // Now get the release group to get the type and first-release-date + if (releaseGroupId) { + try { + releaseGroup = await musicBrainzService.getReleaseGroup( + releaseGroupId + ); + } catch (err) { + console.error( + `Failed to get release-group ${releaseGroupId}` + ); + } + } + } else { + throw error; + } + } + + if (!releaseGroup && !release) { + return res.status(404).json({ error: "Album not found" }); + } + + // Get the artist name and MBID from either release-group or release + const artistCredit = + releaseGroup?.["artist-credit"] || release?.["artist-credit"]; + const artistName = artistCredit?.[0]?.name || "Unknown Artist"; + const artistMbid = artistCredit?.[0]?.artist?.id; + const albumTitle = releaseGroup?.title || release?.title; + + // Get album info from Last.fm + let lastFmInfo = null; + try { + lastFmInfo = await lastFmService.getAlbumInfo( + artistName, + albumTitle + ); + } catch (error) { + console.log(`Failed to get Last.fm info for ${albumTitle}`); + } + + // Get tracks - if we have release, use it directly; otherwise get first release from group + let tracks: any[] = []; + if (release) { + tracks = release.media?.[0]?.tracks || []; + } else if (releaseGroup?.releases && releaseGroup.releases.length > 0) { + const firstRelease = releaseGroup.releases[0]; + try { + const releaseDetails = await musicBrainzService.getRelease( + firstRelease.id + ); + tracks = releaseDetails.media?.[0]?.tracks || []; + } catch (error) { + console.error( + `Failed to get tracks for release ${firstRelease.id}` + ); + } + } + + // Get album cover art - try Cover Art Archive first + let coverUrl = null; + let coverArtUrl = `https://coverartarchive.org/release/${mbid}/front-500`; + if (!release) { + coverArtUrl = `https://coverartarchive.org/release-group/${releaseGroupId}/front-500`; + } + + // Check if Cover Art Archive actually has the image + try { + const response = await fetch(coverArtUrl, { method: "HEAD" }); + if (response.ok) { + coverUrl = coverArtUrl; + console.log(`Cover Art Archive has cover for ${albumTitle}`); + } else { + console.log( + `✗ Cover Art Archive 404 for ${albumTitle}, trying Deezer...` + ); + } + } catch (error) { + console.log( + `✗ Cover Art Archive check failed for ${albumTitle}, trying Deezer...` + ); + } + + // Fallback to Deezer if Cover Art Archive doesn't have it + if (!coverUrl) { + try { + const deezerCover = await deezerService.getAlbumCover( + artistName, + albumTitle + ); + if (deezerCover) { + coverUrl = deezerCover; + console.log(`Deezer has cover for ${albumTitle}`); + } else { + // Final fallback to Cover Art Archive URL (might 404, but better than nothing) + coverUrl = coverArtUrl; + } + } catch (error) { + console.log(`✗ Deezer lookup failed for ${albumTitle}`); + // Final fallback to Cover Art Archive URL + coverUrl = coverArtUrl; + } + } + + // Format response + const releaseMbid = release?.id || null; + + const response = { + id: releaseGroupId, + rgMbid: releaseGroupId, + mbid: releaseMbid || releaseGroupId, + releaseMbid, + title: albumTitle, + artist: { + name: artistName, + id: artistMbid || artistName, + mbid: artistMbid, + }, + year: releaseGroup?.["first-release-date"] + ? parseInt(releaseGroup["first-release-date"].substring(0, 4)) + : release?.date + ? parseInt(release.date.substring(0, 4)) + : null, + type: releaseGroup?.["primary-type"] || "Album", + coverUrl, + coverArt: coverUrl, // Alias for compatibility + bio: lastFmInfo?.wiki?.summary || null, + tags: lastFmInfo?.tags?.tag?.map((t: any) => t.name) || [], + tracks: tracks.map((track: any, index: number) => ({ + id: `mb-${releaseGroupId}-${track.id || index}`, + title: track.title, + trackNo: track.position || index + 1, + duration: track.length ? Math.floor(track.length / 1000) : 0, + artist: { name: artistName }, + })), + similarAlbums: [], // Similar album recommendations not yet implemented + owned: false, + source: "discovery", + }; + + // Cache discovery response for 24 hours + try { + await redisClient.setEx( + cacheKey, + DISCOVERY_CACHE_TTL, + JSON.stringify(response) + ); + console.log(`[Discovery] Cached album: ${albumTitle}`); + } catch (err) { + // Redis errors are non-critical + } + + res.json(response); + } catch (error: any) { + console.error("Album discovery error:", error); + res.status(500).json({ + error: "Failed to fetch album details", + message: error.message, + }); + } +}); + +export default router; diff --git a/backend/src/routes/audiobooks.ts b/backend/src/routes/audiobooks.ts new file mode 100644 index 0000000..b44f1c9 --- /dev/null +++ b/backend/src/routes/audiobooks.ts @@ -0,0 +1,907 @@ +import { Router } from "express"; +import { audiobookshelfService } from "../services/audiobookshelf"; +import { audiobookCacheService } from "../services/audiobookCache"; +import { prisma } from "../utils/db"; +import { requireAuthOrToken } from "../middleware/auth"; +import { imageLimiter, apiLimiter } from "../middleware/rateLimiter"; + +const router = Router(); + +/** + * GET /audiobooks/continue-listening + * Get audiobooks the user is currently listening to (for "Continue Listening" section) + * NOTE: This must come BEFORE the /:id route to avoid matching "continue-listening" as an ID + */ +router.get( + "/continue-listening", + requireAuthOrToken, + apiLimiter, + async (req, res) => { + try { + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json([]); + } + + const recentProgress = await prisma.audiobookProgress.findMany({ + where: { + userId: req.user!.id, + isFinished: false, + currentTime: { + gt: 0, + }, + }, + orderBy: { + lastPlayedAt: "desc", + }, + take: 10, + }); + + // Transform the cover URLs to use the audiobook__ prefix for the proxy + const transformed = recentProgress.map((progress: any) => { + const coverUrl = + progress.coverUrl && !progress.coverUrl.startsWith("http") + ? `audiobook__${progress.coverUrl}` + : progress.coverUrl; + + return { + ...progress, + coverUrl, + }; + }); + + res.json(transformed); + } catch (error: any) { + console.error("Error fetching continue listening:", error); + res.status(500).json({ + error: "Failed to fetch continue listening", + message: error.message, + }); + } + } +); + +/** + * POST /audiobooks/sync + * Manually trigger audiobook sync from Audiobookshelf + * Fetches all audiobooks and caches metadata + cover images locally + */ +router.post("/sync", requireAuthOrToken, apiLimiter, async (req, res) => { + try { + const { getSystemSettings } = await import("../utils/systemSettings"); + const { notificationService } = await import("../services/notificationService"); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res + .status(400) + .json({ error: "Audiobookshelf not enabled" }); + } + + console.log("[Audiobooks] Starting manual audiobook sync..."); + const result = await audiobookCacheService.syncAll(); + + // Check how many have series after sync + const seriesCount = await prisma.audiobook.count({ + where: { series: { not: null } }, + }); + console.log( + `[Audiobooks] Sync complete. Books with series: ${seriesCount}` + ); + + // Send notification to user + if (req.user?.id) { + await notificationService.notifySystem( + req.user.id, + "Audiobook Sync Complete", + `Synced ${result.synced || 0} audiobooks (${seriesCount} with series)` + ); + } + + res.json({ + success: true, + result, + }); + } catch (error: any) { + console.error("Audiobook sync failed:", error); + res.status(500).json({ + error: "Sync failed", + message: error.message, + }); + } +}); + +/** + * GET /audiobooks/debug-series + * Debug endpoint to see raw series data from Audiobookshelf + */ +// Debug endpoint for series data +router.get("/debug-series", requireAuthOrToken, async (req, res) => { + console.log("[Audiobooks] Debug series endpoint called"); + try { + const { getSystemSettings } = await import("../utils/systemSettings"); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res + .status(400) + .json({ error: "Audiobookshelf not enabled" }); + } + + // Get raw data from Audiobookshelf + const rawBooks = await audiobookshelfService.getAllAudiobooks(); + console.log( + `[Audiobooks] Got ${rawBooks.length} books from Audiobookshelf` + ); + + // Find books with series data + const booksWithSeries = rawBooks.filter((book: any) => { + const metadata = book.media?.metadata || book; + return metadata.series || metadata.seriesName; + }); + + console.log( + `[Audiobooks] Books with series data: ${booksWithSeries.length}` + ); + + // Extract series info from all books (first 20) + const allSeriesInfo = rawBooks.slice(0, 20).map((book: any) => { + const metadata = book.media?.metadata || book; + return { + title: metadata.title || book.title, + rawSeries: metadata.series, + seriesName: metadata.seriesName, + seriesSequence: metadata.seriesSequence, + // Also check if there's series in the top-level book object + bookSeries: book.series, + }; + }); + + // Get a full sample of one book with series (if any) + let fullSample = null; + if (booksWithSeries.length > 0) { + const sampleBook = booksWithSeries[0]; + fullSample = { + id: sampleBook.id, + media: sampleBook.media, + }; + } + + res.json({ + totalBooks: rawBooks.length, + booksWithSeriesCount: booksWithSeries.length, + sampleSeriesData: allSeriesInfo, + fullSampleWithSeries: fullSample, + }); + } catch (error: any) { + console.error("[Audiobooks] Debug series error:", error); + res.status(500).json({ error: error.message }); + } +}); + +/** + * GET /audiobooks/search + * Search audiobooks + */ +router.get("/search", requireAuthOrToken, apiLimiter, async (req, res) => { + try { + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import("../utils/systemSettings"); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json([]); + } + + const { q } = req.query; + + if (!q || typeof q !== "string") { + return res.status(400).json({ error: "Query parameter required" }); + } + + const results = await audiobookshelfService.searchAudiobooks(q); + res.json(results); + } catch (error: any) { + console.error("Error searching audiobooks:", error); + res.status(500).json({ + error: "Failed to search audiobooks", + message: error.message, + }); + } +}); + +/** + * GET /audiobooks + * Get all audiobooks from cached database (instant, no API calls) + */ +router.get("/", requireAuthOrToken, apiLimiter, async (req, res) => { + console.log("[Audiobooks] GET / - fetching audiobooks list"); + try { + // Check if Audiobookshelf is enabled first + const { getSystemSettings } = await import("../utils/systemSettings"); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json({ + configured: false, + enabled: false, + audiobooks: [], + }); + } + + // Read from cached database instead of hitting Audiobookshelf API + const audiobooks = await prisma.audiobook.findMany({ + orderBy: { title: "asc" }, + }); + + const audiobookIds = audiobooks.map((book) => book.id); + const progressEntries = + audiobookIds.length > 0 + ? await prisma.audiobookProgress.findMany({ + where: { + userId: req.user!.id, + audiobookshelfId: { in: audiobookIds }, + }, + }) + : []; + const progressMap = new Map( + progressEntries.map((entry) => [entry.audiobookshelfId, entry]) + ); + + // Get user's progress for each audiobook + const audiobooksWithProgress = audiobooks.map((book) => { + const progress = progressMap.get(book.id); + + // Cover URL: if we have localCoverPath or coverUrl from Audiobookshelf, serve from our endpoint + // The /audiobooks/:id/cover endpoint will find the file on disk even if localCoverPath isn't set + const hasCover = book.localCoverPath || book.coverUrl; + + return { + id: book.id, + title: book.title, + author: book.author || "Unknown Author", + narrator: book.narrator, + description: book.description, + coverUrl: hasCover + ? `/audiobooks/${book.id}/cover` // Serve from local disk + : null, + duration: book.duration || 0, + libraryId: book.libraryId, + series: book.series + ? { + name: book.series, + sequence: book.seriesSequence || "1", + } + : null, + genres: book.genres || [], + progress: progress + ? { + currentTime: progress.currentTime, + progress: + progress.duration > 0 + ? (progress.currentTime / progress.duration) * + 100 + : 0, + isFinished: progress.isFinished, + lastPlayedAt: progress.lastPlayedAt, + } + : null, + }; + }); + + res.json(audiobooksWithProgress); + } catch (error: any) { + console.error("Error fetching audiobooks:", error); + res.status(500).json({ + error: "Failed to fetch audiobooks", + message: error.message, + }); + } +}); + +/** + * GET /audiobooks/series/:seriesName + * Get all books in a series (from cached database) + */ +router.get( + "/series/:seriesName", + requireAuthOrToken, + apiLimiter, + async (req, res) => { + try { + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json([]); + } + + const { seriesName } = req.params; + const decodedSeriesName = decodeURIComponent(seriesName); + + // Read from cached database + const audiobooks = await prisma.audiobook.findMany({ + where: { + series: decodedSeriesName, + }, + orderBy: { + seriesSequence: "asc", + }, + }); + + const seriesIds = audiobooks.map((book) => book.id); + const seriesProgressEntries = + seriesIds.length > 0 + ? await prisma.audiobookProgress.findMany({ + where: { + userId: req.user!.id, + audiobookshelfId: { in: seriesIds }, + }, + }) + : []; + const seriesProgressMap = new Map( + seriesProgressEntries.map((entry) => [ + entry.audiobookshelfId, + entry, + ]) + ); + + const seriesBooks = audiobooks.map((book) => { + const progress = seriesProgressMap.get(book.id); + + return { + id: book.id, + title: book.title, + author: book.author || "Unknown Author", + narrator: book.narrator, + description: book.description, + coverUrl: + book.localCoverPath || book.coverUrl + ? `/audiobooks/${book.id}/cover` + : null, + duration: book.duration || 0, + libraryId: book.libraryId, + series: book.series + ? { + name: book.series, + sequence: book.seriesSequence || "1", + } + : null, + genres: book.genres || [], + progress: progress + ? { + currentTime: progress.currentTime, + progress: + progress.duration > 0 + ? (progress.currentTime / + progress.duration) * + 100 + : 0, + isFinished: progress.isFinished, + lastPlayedAt: progress.lastPlayedAt, + } + : null, + }; + }); + + res.json(seriesBooks); + } catch (error: any) { + console.error("Error fetching series:", error); + res.status(500).json({ + error: "Failed to fetch series", + message: error.message, + }); + } + } +); + +/** + * OPTIONS /audiobooks/:id/cover + * Handle CORS preflight request for cover images + */ +router.options("/:id/cover", (req, res) => { + const origin = req.headers.origin || "http://localhost:3030"; + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + res.setHeader("Access-Control-Max-Age", "86400"); // 24 hours + res.status(204).end(); +}); + +/** + * GET /audiobooks/:id/cover + * Serve cached cover image from local disk (instant, no proxying) + * NO RATE LIMITING - These are static files served from disk with aggressive caching + */ +router.get("/:id/cover", async (req, res) => { + try { + const { id } = req.params; + const fs = await import("fs"); + const path = await import("path"); + const { config } = await import("../config"); + + const audiobook = await prisma.audiobook.findUnique({ + where: { id }, + select: { localCoverPath: true }, + }); + + let coverPath = audiobook?.localCoverPath; + + // Fallback: check if cover exists on disk even if DB path is empty + if (!coverPath) { + const fallbackPath = path.join( + config.music.musicPath, + "cover-cache", + "audiobooks", + `${id}.jpg` + ); + if (fs.existsSync(fallbackPath)) { + coverPath = fallbackPath; + // Update database with the correct path + await prisma.audiobook + .update({ + where: { id }, + data: { localCoverPath: fallbackPath }, + }) + .catch(() => {}); // Ignore errors if audiobook doesn't exist + } + } + + if (!coverPath) { + return res.status(404).json({ error: "Cover not found" }); + } + + // Verify file exists before sending + if (!fs.existsSync(coverPath)) { + return res.status(404).json({ error: "Cover file missing" }); + } + + // Serve image from local disk with aggressive caching and CORS headers + // Use specific origin instead of * to support credentials mode + const origin = req.headers.origin || "http://localhost:3030"; + res.setHeader("Cache-Control", "public, max-age=31536000, immutable"); + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Cross-Origin-Resource-Policy", "cross-origin"); + res.sendFile(coverPath); + } catch (error: any) { + console.error("Error serving cover:", error); + res.status(500).json({ + error: "Failed to serve cover", + message: error.message, + }); + } +}); + +/** + * GET /audiobooks/:id + * Get a specific audiobook with full details (from cache, fallback to API) + */ +router.get("/:id", requireAuthOrToken, apiLimiter, async (req, res) => { + try { + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import("../utils/systemSettings"); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json({ configured: false, enabled: false }); + } + + const { id } = req.params; + + // Try to get from cache first + let audiobook = await prisma.audiobook.findUnique({ + where: { id }, + }); + + // If not cached or stale, fetch from API and cache it + if ( + !audiobook || + audiobook.lastSyncedAt < + new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) + ) { + console.log( + `[AUDIOBOOK] Audiobook ${id} not cached or stale, fetching...` + ); + audiobook = await audiobookCacheService.getAudiobook(id); + } + + // Get chapters and audio files from API (these change less frequently) + let absBook; + try { + absBook = await audiobookshelfService.getAudiobook(id); + } catch (apiError: any) { + console.warn( + ` Failed to fetch live data from Audiobookshelf for ${id}, using cached data only:`, + apiError.message + ); + // Continue with cached data only if API call fails + absBook = { media: { chapters: [], audioFiles: [] } }; + } + + // Get user's progress + const progress = await prisma.audiobookProgress.findUnique({ + where: { + userId_audiobookshelfId: { + userId: req.user!.id, + audiobookshelfId: id, + }, + }, + }); + + const response = { + id: audiobook.id, + title: audiobook.title, + author: audiobook.author || "Unknown Author", + narrator: audiobook.narrator, + description: audiobook.description, + coverUrl: + audiobook.localCoverPath || audiobook.coverUrl + ? `/audiobooks/${audiobook.id}/cover` + : null, + duration: audiobook.duration || 0, + chapters: absBook.media?.chapters || [], + audioFiles: absBook.media?.audioFiles || [], + libraryId: audiobook.libraryId, + progress: progress + ? { + currentTime: progress.currentTime, + progress: + progress.duration > 0 + ? (progress.currentTime / progress.duration) * 100 + : 0, + isFinished: progress.isFinished, + lastPlayedAt: progress.lastPlayedAt, + } + : null, + }; + + res.json(response); + } catch (error: any) { + console.error("Error fetching audiobook__", error); + res.status(500).json({ + error: "Failed to fetch audiobook", + message: error.message, + }); + } +}); + +/** + * GET /audiobooks/:id/stream + * Proxy the audiobook stream with authentication + */ +router.get("/:id/stream", requireAuthOrToken, async (req, res) => { + try { + console.log( + `[Audiobook Stream] Request for audiobook: ${req.params.id}` + ); + console.log(`[Audiobook Stream] User: ${req.user?.id || "unknown"}`); + + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import("../utils/systemSettings"); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + console.log("[Audiobook Stream] Audiobookshelf not enabled"); + return res + .status(503) + .json({ error: "Audiobookshelf is not configured" }); + } + + const { id } = req.params; + const rangeHeader = req.headers.range as string | undefined; + + console.log( + `[Audiobook Stream] Fetching stream for ${id}, range: ${ + rangeHeader || "none" + }` + ); + + const { stream, headers, status } = + await audiobookshelfService.streamAudiobook(id, rangeHeader); + + console.log( + `[Audiobook Stream] Got stream, status: ${status}, content-type: ${headers["content-type"]}` + ); + + const responseStatus = status || (rangeHeader ? 206 : 200); + res.status(responseStatus); + + // Set content type - ensure it's audio + const contentType = headers["content-type"] || "audio/mpeg"; + res.setHeader("Content-Type", contentType); + + // Set other headers + if (headers["content-length"]) { + res.setHeader("Content-Length", headers["content-length"]); + } + if (headers["accept-ranges"]) { + res.setHeader("Accept-Ranges", headers["accept-ranges"]); + } else { + res.setHeader("Accept-Ranges", "bytes"); + } + if (headers["content-range"]) { + res.setHeader("Content-Range", headers["content-range"]); + } + + res.setHeader("Cache-Control", "public, max-age=0"); + + // Clean up upstream stream when client disconnects (e.g., skips track, closes browser) + res.on("close", () => { + if (!stream.destroyed) { + stream.destroy(); + } + }); + + stream.pipe(res); + + stream.on("error", (error: any) => { + console.error("[Audiobook Stream] Stream error:", error); + if (!res.headersSent) { + res.status(500).json({ + error: "Failed to stream audiobook", + message: error.message, + }); + } else { + res.end(); + } + }); + } catch (error: any) { + console.error("[Audiobook Stream] Error:", error.message); + res.status(500).json({ + error: "Failed to stream audiobook", + message: error.message, + }); + } +}); + +/** + * POST /audiobooks/:id/progress + * Update playback progress for an audiobook + */ +router.post( + "/:id/progress", + requireAuthOrToken, + apiLimiter, + async (req, res) => { + try { + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json({ + success: false, + message: "Audiobookshelf is not configured", + }); + } + + const { id } = req.params; + const { + currentTime: rawCurrentTime, + duration: rawDuration, + isFinished, + } = req.body; + + const currentTime = + typeof rawCurrentTime === "number" && + Number.isFinite(rawCurrentTime) + ? Math.max(0, rawCurrentTime) + : 0; + const durationValue = + typeof rawDuration === "number" && Number.isFinite(rawDuration) + ? Math.max(rawDuration, 0) + : 0; + + console.log(`\n [AUDIOBOOK PROGRESS] Received update:`); + console.log(` User: ${req.user!.username}`); + console.log(` Audiobook ID: ${id}`); + console.log( + ` Current Time: ${currentTime}s (${Math.floor( + currentTime / 60 + )} mins)` + ); + console.log( + ` Duration: ${durationValue}s (${Math.floor( + durationValue / 60 + )} mins)` + ); + if (durationValue > 0) { + console.log( + ` Progress: ${( + (currentTime / durationValue) * + 100 + ).toFixed(1)}%` + ); + } else { + console.log(" Progress: duration unknown"); + } + console.log(` Finished: ${!!isFinished}`); + + // Pull cached metadata to avoid hitting Audiobookshelf for every update + const [cachedAudiobook, existingProgress] = await Promise.all([ + prisma.audiobook.findUnique({ + where: { id }, + select: { + title: true, + author: true, + coverUrl: true, + duration: true, + libraryId: true, + localCoverPath: true, + }, + }), + prisma.audiobookProgress.findUnique({ + where: { + userId_audiobookshelfId: { + userId: req.user!.id, + audiobookshelfId: id, + }, + }, + }), + ]); + + const fallbackDuration = + durationValue || + cachedAudiobook?.duration || + existingProgress?.duration || + 0; + + const metadataTitle = + cachedAudiobook?.title || + existingProgress?.title || + "Unknown Title"; + const metadataAuthor = + cachedAudiobook?.author || + existingProgress?.author || + "Unknown Author"; + const metadataCover = + cachedAudiobook?.coverUrl || existingProgress?.coverUrl || null; + + // Update progress in our database + const progress = await prisma.audiobookProgress.upsert({ + where: { + userId_audiobookshelfId: { + userId: req.user!.id, + audiobookshelfId: id, + }, + }, + create: { + userId: req.user!.id, + audiobookshelfId: id, + title: metadataTitle, + author: metadataAuthor, + coverUrl: metadataCover, + currentTime, + duration: fallbackDuration, + isFinished: !!isFinished, + lastPlayedAt: new Date(), + }, + update: { + title: metadataTitle, + author: metadataAuthor, + coverUrl: metadataCover, + currentTime, + duration: fallbackDuration, + isFinished: !!isFinished, + lastPlayedAt: new Date(), + }, + }); + + console.log(` Progress saved to database`); + + // Also update progress in Audiobookshelf + try { + await audiobookshelfService.updateProgress( + id, + currentTime, + fallbackDuration, + isFinished + ); + console.log(` Progress synced to Audiobookshelf`); + } catch (error) { + console.error( + "Failed to sync progress to Audiobookshelf:", + error + ); + // Continue anyway - local progress is saved + } + + res.json({ + success: true, + progress: { + currentTime: progress.currentTime, + progress: + progress.duration > 0 + ? (progress.currentTime / progress.duration) * 100 + : 0, + isFinished: progress.isFinished, + }, + }); + } catch (error: any) { + console.error("Error updating progress:", error); + res.status(500).json({ + error: "Failed to update progress", + message: error.message, + }); + } + } +); + +/** + * DELETE /audiobooks/:id/progress + * Remove/reset progress for an audiobook + */ +router.delete( + "/:id/progress", + requireAuthOrToken, + apiLimiter, + async (req, res) => { + try { + // Check if Audiobookshelf is enabled + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfEnabled) { + return res.status(200).json({ + success: false, + message: "Audiobookshelf is not configured", + }); + } + + const { id } = req.params; + + console.log(`\n[AUDIOBOOK PROGRESS] Removing progress:`); + console.log(` User: ${req.user!.username}`); + console.log(` Audiobook ID: ${id}`); + + // Delete progress from our database + await prisma.audiobookProgress.deleteMany({ + where: { + userId: req.user!.id, + audiobookshelfId: id, + }, + }); + + console.log(` Progress removed from database`); + + // Also remove progress from Audiobookshelf + try { + await audiobookshelfService.updateProgress(id, 0, 0, false); + console.log(` Progress reset in Audiobookshelf`); + } catch (error) { + console.error( + "Failed to reset progress in Audiobookshelf:", + error + ); + // Continue anyway - local progress is deleted + } + + res.json({ + success: true, + message: "Progress removed", + }); + } catch (error: any) { + console.error("Error removing progress:", error); + res.status(500).json({ + error: "Failed to remove progress", + message: error.message, + }); + } + } +); + +export default router; diff --git a/backend/src/routes/auth.ts b/backend/src/routes/auth.ts new file mode 100644 index 0000000..1463d34 --- /dev/null +++ b/backend/src/routes/auth.ts @@ -0,0 +1,532 @@ +import { Router } from "express"; +import bcrypt from "bcrypt"; +import { prisma } from "../utils/db"; +import { z } from "zod"; +import speakeasy from "speakeasy"; +import QRCode from "qrcode"; +import crypto from "crypto"; +import { requireAuth, requireAdmin, generateToken } from "../middleware/auth"; +import { encrypt, decrypt } from "../utils/encryption"; + +const router = Router(); + +const loginSchema = z.object({ + username: z.string().min(1), + password: z.string().min(1), +}); + +// Use shared encryption module for 2FA secrets +const encrypt2FASecret = encrypt; +const decrypt2FASecret = decrypt; + +/** + * @openapi + * /auth/login: + * post: + * summary: Login with username and password + * tags: [Authentication] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - username + * - password + * properties: + * username: + * type: string + * password: + * type: string + * format: password + * responses: + * 200: + * description: Login successful + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 401: + * description: Invalid credentials + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +// POST /auth/login +router.post("/login", async (req, res) => { + try { + const { username, password } = loginSchema.parse(req.body); + const { token } = req.body; // 2FA token if provided + + const user = await prisma.user.findUnique({ where: { username } }); + if (!user) { + return res.status(401).json({ error: "Invalid credentials" }); + } + + const valid = await bcrypt.compare(password, user.passwordHash); + if (!valid) { + return res.status(401).json({ error: "Invalid credentials" }); + } + + // Check if 2FA is enabled + if (user.twoFactorEnabled && user.twoFactorSecret) { + if (!token) { + return res.status(200).json({ + requires2FA: true, + message: "2FA token required", + userId: user.id, // Send userId for next 2FA request + }); + } + + // Check if it's a recovery code + const isRecoveryCode = /^[A-F0-9]{8}$/i.test(token); + + if (isRecoveryCode && user.twoFactorRecoveryCodes) { + const encryptedCodes = user.twoFactorRecoveryCodes; + const decryptedCodes = decrypt2FASecret(encryptedCodes); + const hashedCodes = decryptedCodes.split(","); + + const providedHash = crypto + .createHash("sha256") + .update(token.toUpperCase()) + .digest("hex"); + + const codeIndex = hashedCodes.indexOf(providedHash); + if (codeIndex === -1) { + return res.status(401).json({ error: "Invalid recovery code" }); + } + + hashedCodes.splice(codeIndex, 1); + await prisma.user.update({ + where: { id: user.id }, + data: { twoFactorRecoveryCodes: encrypt2FASecret(hashedCodes.join(",")) }, + }); + } else { + // Verify TOTP token + const secret = decrypt2FASecret(user.twoFactorSecret); + const verified = speakeasy.totp.verify({ + secret, + encoding: "base32", + token, + window: 2, + }); + + if (!verified) { + return res.status(401).json({ error: "Invalid 2FA token" }); + } + } + } + + // Generate JWT token + const jwtToken = generateToken({ + id: user.id, + username: user.username, + role: user.role, + }); + + res.json({ + token: jwtToken, + user: { + id: user.id, + username: user.username, + role: user.role, + }, + }); + } catch (err) { + if (err instanceof z.ZodError) { + return res.status(400).json({ error: "Invalid request", details: err.errors }); + } + console.error("Login error:", err); + res.status(500).json({ error: "Internal error" }); + } +}); + +// POST /auth/logout - JWT is stateless, logout is handled client-side +router.post("/logout", (req, res) => { + // With JWT, logout is handled by client removing the token + // No server-side session to destroy + res.json({ message: "Logged out" }); +}); + +/** + * @openapi + * /auth/me: + * get: + * summary: Get current authenticated user + * tags: [Authentication] + * security: + * - sessionAuth: [] + * responses: + * 200: + * description: Current user information + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +// GET /auth/me +router.get("/me", requireAuth, async (req, res) => { + const user = await prisma.user.findUnique({ + where: { id: req.user!.id }, + select: { + id: true, + username: true, + role: true, + onboardingComplete: true, + enrichmentSettings: true, + createdAt: true, + }, + }); + + if (!user) { + return res.status(404).json({ error: "User not found" }); + } + + res.json(user); +}); + +// POST /auth/change-password +router.post("/change-password", requireAuth, async (req, res) => { + try { + const { currentPassword, newPassword } = req.body; + + if (!currentPassword || !newPassword) { + return res + .status(400) + .json({ error: "Current and new password are required" }); + } + + if (newPassword.length < 6) { + return res + .status(400) + .json({ error: "New password must be at least 6 characters" }); + } + + // Verify current password + const user = await prisma.user.findUnique({ + where: { id: req.user!.id }, + }); + + if (!user) { + return res.status(404).json({ error: "User not found" }); + } + + const valid = await bcrypt.compare(currentPassword, user.passwordHash); + if (!valid) { + return res + .status(401) + .json({ error: "Current password is incorrect" }); + } + + // Update password + const newPasswordHash = await bcrypt.hash(newPassword, 10); + await prisma.user.update({ + where: { id: req.user!.id }, + data: { passwordHash: newPasswordHash }, + }); + + res.json({ message: "Password changed successfully" }); + } catch (error) { + console.error("Change password error:", error); + res.status(500).json({ error: "Failed to change password" }); + } +}); + +// GET /auth/users (Admin only) +router.get("/users", requireAuth, requireAdmin, async (req, res) => { + try { + const users = await prisma.user.findMany({ + select: { + id: true, + username: true, + role: true, + onboardingComplete: true, + createdAt: true, + }, + orderBy: { createdAt: "asc" }, + }); + + res.json(users); + } catch (error) { + console.error("Get users error:", error); + res.status(500).json({ error: "Failed to get users" }); + } +}); + +// POST /auth/create-user (Admin only) +router.post("/create-user", requireAuth, requireAdmin, async (req, res) => { + try { + const { username, password, role } = req.body; + + if (!username || !password) { + return res + .status(400) + .json({ error: "Username and password are required" }); + } + + if (password.length < 6) { + return res + .status(400) + .json({ error: "Password must be at least 6 characters" }); + } + + if (role && !["user", "admin"].includes(role)) { + return res.status(400).json({ error: "Invalid role" }); + } + + // Check if username exists + const existing = await prisma.user.findUnique({ + where: { username }, + }); + + if (existing) { + return res.status(400).json({ error: "Username already taken" }); + } + + // Create user + const passwordHash = await bcrypt.hash(password, 10); + const user = await prisma.user.create({ + data: { + username, + passwordHash, + role: role || "user", + onboardingComplete: true, // Skip onboarding for created users + }, + }); + + // Create default user settings + await prisma.userSettings.create({ + data: { + userId: user.id, + playbackQuality: "original", + wifiOnly: false, + offlineEnabled: false, + maxCacheSizeMb: 10240, + }, + }); + + res.json({ + id: user.id, + username: user.username, + role: user.role, + createdAt: user.createdAt, + }); + } catch (error) { + console.error("Create user error:", error); + res.status(500).json({ error: "Failed to create user" }); + } +}); + +// DELETE /auth/users/:id (Admin only) +router.delete("/users/:id", requireAuth, requireAdmin, async (req, res) => { + try { + const { id } = req.params; + + // Prevent deleting yourself + if (id === req.user!.id) { + return res + .status(400) + .json({ error: "Cannot delete your own account" }); + } + + // Delete user (cascade will handle related data) + await prisma.user.delete({ + where: { id }, + }); + + res.json({ message: "User deleted successfully" }); + } catch (error: any) { + console.error("Delete user error:", error); + if (error.code === "P2025") { + return res.status(404).json({ error: "User not found" }); + } + res.status(500).json({ error: "Failed to delete user" }); + } +}); + +// POST /auth/2fa/setup - Generate 2FA secret and QR code +router.post("/2fa/setup", requireAuth, async (req, res) => { + try { + const user = await prisma.user.findUnique({ + where: { id: req.user!.id }, + select: { username: true, twoFactorEnabled: true }, + }); + + if (!user) { + return res.status(404).json({ error: "User not found" }); + } + + if (user.twoFactorEnabled) { + return res.status(400).json({ error: "2FA is already enabled" }); + } + + // Generate secret + const secret = speakeasy.generateSecret({ + name: `Lidify (${user.username})`, + issuer: "Lidify", + }); + + // Generate QR code + const qrCodeDataUrl = await QRCode.toDataURL(secret.otpauth_url!); + + res.json({ + secret: secret.base32, + qrCode: qrCodeDataUrl, + }); + } catch (error) { + console.error("2FA setup error:", error); + res.status(500).json({ error: "Failed to setup 2FA" }); + } +}); + +// POST /auth/2fa/enable - Verify token and enable 2FA +router.post("/2fa/enable", requireAuth, async (req, res) => { + try { + const { secret, token } = req.body; + + if (!secret || !token) { + return res + .status(400) + .json({ error: "Secret and token are required" }); + } + + // Verify the token with the secret + const verified = speakeasy.totp.verify({ + secret, + encoding: "base32", + token, + window: 2, + }); + + if (!verified) { + return res + .status(401) + .json({ error: "Invalid token. Please try again." }); + } + + // Generate 10 recovery codes + const recoveryCodes: string[] = []; + const hashedRecoveryCodes: string[] = []; + + for (let i = 0; i < 10; i++) { + // Generate 8-character alphanumeric code + const code = crypto.randomBytes(4).toString("hex").toUpperCase(); + recoveryCodes.push(code); + // Hash the code before storing + hashedRecoveryCodes.push( + crypto.createHash("sha256").update(code).digest("hex") + ); + } + + // Encrypt the hashed codes for storage + const encryptedRecoveryCodes = encrypt2FASecret( + hashedRecoveryCodes.join(",") + ); + + // Encrypt and save the secret + const encryptedSecret = encrypt2FASecret(secret); + await prisma.user.update({ + where: { id: req.user!.id }, + data: { + twoFactorEnabled: true, + twoFactorSecret: encryptedSecret, + twoFactorRecoveryCodes: encryptedRecoveryCodes, + }, + }); + + // Return the plain recovery codes to the user (only time they'll see them) + res.json({ + message: "2FA enabled successfully", + recoveryCodes: recoveryCodes, + }); + } catch (error) { + console.error("2FA enable error:", error); + res.status(500).json({ error: "Failed to enable 2FA" }); + } +}); + +// POST /auth/2fa/disable - Disable 2FA +router.post("/2fa/disable", requireAuth, async (req, res) => { + try { + const { password, token } = req.body; + + if (!password || !token) { + return res + .status(400) + .json({ error: "Password and current 2FA token are required" }); + } + + const user = await prisma.user.findUnique({ + where: { id: req.user!.id }, + }); + + if (!user) { + return res.status(404).json({ error: "User not found" }); + } + + // Verify password + const validPassword = await bcrypt.compare(password, user.passwordHash); + if (!validPassword) { + return res.status(401).json({ error: "Invalid password" }); + } + + // Verify 2FA token + if (user.twoFactorSecret) { + const secret = decrypt2FASecret(user.twoFactorSecret); + const verified = speakeasy.totp.verify({ + secret, + encoding: "base32", + token, + window: 2, + }); + + if (!verified) { + return res.status(401).json({ error: "Invalid 2FA token" }); + } + } + + // Disable 2FA + await prisma.user.update({ + where: { id: req.user!.id }, + data: { + twoFactorEnabled: false, + twoFactorSecret: null, + twoFactorRecoveryCodes: null, + }, + }); + + res.json({ message: "2FA disabled successfully" }); + } catch (error) { + console.error("2FA disable error:", error); + res.status(500).json({ error: "Failed to disable 2FA" }); + } +}); + +// GET /auth/2fa/status - Check if 2FA is enabled +router.get("/2fa/status", requireAuth, async (req, res) => { + try { + const user = await prisma.user.findUnique({ + where: { id: req.user!.id }, + select: { twoFactorEnabled: true }, + }); + + if (!user) { + return res.status(404).json({ error: "User not found" }); + } + + res.json({ enabled: user.twoFactorEnabled }); + } catch (error) { + console.error("2FA status error:", error); + res.status(500).json({ error: "Failed to get 2FA status" }); + } +}); + +export default router; diff --git a/backend/src/routes/browse.ts b/backend/src/routes/browse.ts new file mode 100644 index 0000000..012baf2 --- /dev/null +++ b/backend/src/routes/browse.ts @@ -0,0 +1,377 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { spotifyService } from "../services/spotify"; +import { deezerService, DeezerPlaylistPreview, DeezerRadioStation } from "../services/deezer"; + +const router = Router(); + +// All routes require authentication +router.use(requireAuthOrToken); + +/** + * Unified playlist preview type + */ +interface PlaylistPreview { + id: string; + source: "deezer" | "spotify"; + type: "playlist" | "radio"; + title: string; + description: string | null; + creator: string; + imageUrl: string | null; + trackCount: number; + url: string; +} + +/** + * Convert Deezer playlist to unified format + */ +function deezerPlaylistToUnified(playlist: DeezerPlaylistPreview): PlaylistPreview { + return { + id: playlist.id, + source: "deezer", + type: "playlist", + title: playlist.title, + description: playlist.description, + creator: playlist.creator, + imageUrl: playlist.imageUrl, + trackCount: playlist.trackCount, + url: `https://www.deezer.com/playlist/${playlist.id}`, + }; +} + +/** + * Convert Deezer radio to unified format + */ +function deezerRadioToUnified(radio: DeezerRadioStation): PlaylistPreview { + return { + id: radio.id, + source: "deezer", + type: "radio", + title: radio.title, + description: radio.description, + creator: "Deezer", + imageUrl: radio.imageUrl, + trackCount: 0, // Radio tracks are dynamic + url: `https://www.deezer.com/radio-${radio.id}`, + }; +} + +// ============================================ +// Playlist Endpoints +// ============================================ + +/** + * GET /api/browse/playlists/featured + * Get featured/chart playlists from Deezer + */ +router.get("/playlists/featured", async (req, res) => { + try { + const limit = Math.min(parseInt(req.query.limit as string) || 50, 200); + console.log(`[Browse] Fetching featured playlists (limit: ${limit})...`); + + const playlists = await deezerService.getFeaturedPlaylists(limit); + console.log(`[Browse] Got ${playlists.length} Deezer playlists`); + + res.json({ + playlists: playlists.map(deezerPlaylistToUnified), + total: playlists.length, + source: "deezer", + }); + } catch (error: any) { + console.error("Browse featured playlists error:", error); + res.status(500).json({ error: error.message || "Failed to fetch playlists" }); + } +}); + +/** + * GET /api/browse/playlists/search + * Search for playlists on Deezer + */ +router.get("/playlists/search", async (req, res) => { + try { + const query = req.query.q as string; + if (!query || query.length < 2) { + return res.status(400).json({ error: "Search query must be at least 2 characters" }); + } + + const limit = Math.min(parseInt(req.query.limit as string) || 50, 100); + console.log(`[Browse] Searching playlists for "${query}"...`); + + const playlists = await deezerService.searchPlaylists(query, limit); + console.log(`[Browse] Search "${query}": ${playlists.length} results`); + + res.json({ + playlists: playlists.map(deezerPlaylistToUnified), + total: playlists.length, + query, + source: "deezer", + }); + } catch (error: any) { + console.error("Browse search playlists error:", error); + res.status(500).json({ error: error.message || "Failed to search playlists" }); + } +}); + +/** + * GET /api/browse/playlists/:id + * Get full details of a Deezer playlist + */ +router.get("/playlists/:id", async (req, res) => { + try { + const { id } = req.params; + const playlist = await deezerService.getPlaylist(id); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + res.json({ + ...playlist, + source: "deezer", + url: `https://www.deezer.com/playlist/${id}`, + }); + } catch (error: any) { + console.error("Playlist fetch error:", error); + res.status(500).json({ error: error.message || "Failed to fetch playlist" }); + } +}); + +// ============================================ +// Radio Endpoints +// ============================================ + +/** + * GET /api/browse/radios + * Get all radio stations (mood/theme based mixes) + */ +router.get("/radios", async (req, res) => { + try { + console.log("[Browse] Fetching radio stations..."); + const radios = await deezerService.getRadioStations(); + + res.json({ + radios: radios.map(deezerRadioToUnified), + total: radios.length, + source: "deezer", + }); + } catch (error: any) { + console.error("Browse radios error:", error); + res.status(500).json({ error: error.message || "Failed to fetch radios" }); + } +}); + +/** + * GET /api/browse/radios/by-genre + * Get radio stations organized by genre + */ +router.get("/radios/by-genre", async (req, res) => { + try { + console.log("[Browse] Fetching radios by genre..."); + const genresWithRadios = await deezerService.getRadiosByGenre(); + + // Transform to include unified format + const result = genresWithRadios.map(genre => ({ + id: genre.id, + name: genre.name, + radios: genre.radios.map(deezerRadioToUnified), + })); + + res.json({ + genres: result, + total: result.length, + source: "deezer", + }); + } catch (error: any) { + console.error("Browse radios by genre error:", error); + res.status(500).json({ error: error.message || "Failed to fetch radios" }); + } +}); + +/** + * GET /api/browse/radios/:id + * Get tracks from a radio station (as playlist format for import) + */ +router.get("/radios/:id", async (req, res) => { + try { + const { id } = req.params; + console.log(`[Browse] Fetching radio ${id} tracks...`); + + const radioPlaylist = await deezerService.getRadioTracks(id); + + if (!radioPlaylist) { + return res.status(404).json({ error: "Radio station not found" }); + } + + res.json({ + ...radioPlaylist, + source: "deezer", + type: "radio", + }); + } catch (error: any) { + console.error("Radio tracks error:", error); + res.status(500).json({ error: error.message || "Failed to fetch radio tracks" }); + } +}); + +// ============================================ +// Genre Endpoints +// ============================================ + +/** + * GET /api/browse/genres + * Get all available genres + */ +router.get("/genres", async (req, res) => { + try { + console.log("[Browse] Fetching genres..."); + const genres = await deezerService.getGenres(); + + res.json({ + genres, + total: genres.length, + source: "deezer", + }); + } catch (error: any) { + console.error("Browse genres error:", error); + res.status(500).json({ error: error.message || "Failed to fetch genres" }); + } +}); + +/** + * GET /api/browse/genres/:id + * Get content for a specific genre (playlists + radios) + */ +router.get("/genres/:id", async (req, res) => { + try { + const genreId = parseInt(req.params.id); + if (isNaN(genreId)) { + return res.status(400).json({ error: "Invalid genre ID" }); + } + + console.log(`[Browse] Fetching content for genre ${genreId}...`); + const content = await deezerService.getEditorialContent(genreId); + + res.json({ + genreId, + playlists: content.playlists.map(deezerPlaylistToUnified), + radios: content.radios.map(deezerRadioToUnified), + source: "deezer", + }); + } catch (error: any) { + console.error("Genre content error:", error); + res.status(500).json({ error: error.message || "Failed to fetch genre content" }); + } +}); + +/** + * GET /api/browse/genres/:id/playlists + * Get playlists for a specific genre (by name search) + */ +router.get("/genres/:id/playlists", async (req, res) => { + try { + const genreId = parseInt(req.params.id); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + + // Get genre name first + const genres = await deezerService.getGenres(); + const genre = genres.find(g => g.id === genreId); + + if (!genre) { + return res.status(404).json({ error: "Genre not found" }); + } + + const playlists = await deezerService.getGenrePlaylists(genre.name, limit); + + res.json({ + playlists: playlists.map(deezerPlaylistToUnified), + total: playlists.length, + genre: genre.name, + source: "deezer", + }); + } catch (error: any) { + console.error("Genre playlists error:", error); + res.status(500).json({ error: error.message || "Failed to fetch genre playlists" }); + } +}); + +// ============================================ +// URL Parsing (supports both Spotify & Deezer) +// ============================================ + +/** + * POST /api/browse/playlists/parse + * Parse a Spotify or Deezer URL and return playlist info + * This is the main entry point for URL-based imports + */ +router.post("/playlists/parse", async (req, res) => { + try { + const { url } = req.body; + if (!url) { + return res.status(400).json({ error: "URL is required" }); + } + + // Try Deezer first (our primary source) + const deezerParsed = deezerService.parseUrl(url); + if (deezerParsed && deezerParsed.type === "playlist") { + return res.json({ + source: "deezer", + type: "playlist", + id: deezerParsed.id, + url: `https://www.deezer.com/playlist/${deezerParsed.id}`, + }); + } + + // Try Spotify (still supported for URL imports) + const spotifyParsed = spotifyService.parseUrl(url); + if (spotifyParsed && spotifyParsed.type === "playlist") { + return res.json({ + source: "spotify", + type: "playlist", + id: spotifyParsed.id, + url: `https://open.spotify.com/playlist/${spotifyParsed.id}`, + }); + } + + return res.status(400).json({ + error: "Invalid or unsupported URL. Please provide a Spotify or Deezer playlist URL." + }); + } catch (error: any) { + console.error("Parse URL error:", error); + res.status(500).json({ error: error.message || "Failed to parse URL" }); + } +}); + +// ============================================ +// Combined Browse Endpoint (for frontend convenience) +// ============================================ + +/** + * GET /api/browse/all + * Get a combined view of featured content (playlists, genres) + * Note: Radio stations are now internal (library-based), not from Deezer + */ +router.get("/all", async (req, res) => { + try { + console.log("[Browse] Fetching browse content (playlists + genres)..."); + + // Only fetch playlists and genres - radios are now internal library-based + const [playlists, genres] = await Promise.all([ + deezerService.getFeaturedPlaylists(200), + deezerService.getGenres(), + ]); + + res.json({ + playlists: playlists.map(deezerPlaylistToUnified), + radios: [], // Radio stations are now internal (use /api/library/radio) + genres, + radiosByGenre: [], // Deprecated - use internal radios + source: "deezer", + }); + } catch (error: any) { + console.error("Browse all error:", error); + res.status(500).json({ error: error.message || "Failed to fetch browse content" }); + } +}); + +export default router; diff --git a/backend/src/routes/deviceLink.ts b/backend/src/routes/deviceLink.ts new file mode 100644 index 0000000..85a45af --- /dev/null +++ b/backend/src/routes/deviceLink.ts @@ -0,0 +1,232 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import crypto from "crypto"; + +const router = Router(); + +// Generate a random 6-character alphanumeric code +function generateLinkCode(): string { + const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; // Exclude similar looking chars + let code = ""; + for (let i = 0; i < 6; i++) { + code += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return code; +} + +// Generate API key +function generateApiKey(): string { + return crypto.randomBytes(32).toString("hex"); +} + +// POST /device-link/generate - Generate a new device link code (requires auth) +router.post("/generate", requireAuthOrToken, async (req, res) => { + try { + const userId = req.user!.id; + + // Delete any existing unused codes for this user + await prisma.deviceLinkCode.deleteMany({ + where: { + userId, + usedAt: null, + }, + }); + + // Generate a unique code + let code: string; + let attempts = 0; + do { + code = generateLinkCode(); + attempts++; + if (attempts > 10) { + return res.status(500).json({ error: "Failed to generate unique code" }); + } + } while ( + await prisma.deviceLinkCode.findUnique({ + where: { code }, + }) + ); + + // Create the code with 5-minute expiry + const expiresAt = new Date(Date.now() + 5 * 60 * 1000); + const linkCode = await prisma.deviceLinkCode.create({ + data: { + code, + userId, + expiresAt, + }, + }); + + res.json({ + code: linkCode.code, + expiresAt: linkCode.expiresAt, + expiresIn: 300, // 5 minutes in seconds + }); + } catch (error) { + console.error("Generate device link code error:", error); + res.status(500).json({ error: "Failed to generate device link code" }); + } +}); + +// POST /device-link/verify - Verify a code and get API key (no auth required) +router.post("/verify", async (req, res) => { + try { + const { code, deviceName } = req.body; + + if (!code || typeof code !== "string") { + return res.status(400).json({ error: "Code is required" }); + } + + // Find the code + const linkCode = await prisma.deviceLinkCode.findUnique({ + where: { code: code.toUpperCase() }, + include: { user: true }, + }); + + if (!linkCode) { + return res.status(404).json({ error: "Invalid code" }); + } + + if (linkCode.usedAt) { + return res.status(400).json({ error: "Code already used" }); + } + + if (new Date() > linkCode.expiresAt) { + return res.status(400).json({ error: "Code expired" }); + } + + // Generate API key for this device + const apiKey = generateApiKey(); + const createdApiKey = await prisma.apiKey.create({ + data: { + userId: linkCode.userId, + key: apiKey, + name: deviceName || "Mobile Device", + }, + }); + + // Mark the link code as used + await prisma.deviceLinkCode.update({ + where: { id: linkCode.id }, + data: { + usedAt: new Date(), + deviceName: deviceName || "Mobile Device", + apiKeyId: createdApiKey.id, + }, + }); + + res.json({ + success: true, + apiKey, + userId: linkCode.userId, + username: linkCode.user.username, + }); + } catch (error) { + console.error("Verify device link code error:", error); + res.status(500).json({ error: "Failed to verify device link code" }); + } +}); + +// GET /device-link/status/:code - Poll for code usage status (no auth required) +router.get("/status/:code", async (req, res) => { + try { + const { code } = req.params; + + const linkCode = await prisma.deviceLinkCode.findUnique({ + where: { code: code.toUpperCase() }, + }); + + if (!linkCode) { + return res.status(404).json({ error: "Invalid code" }); + } + + if (new Date() > linkCode.expiresAt && !linkCode.usedAt) { + return res.json({ + status: "expired", + expiresAt: linkCode.expiresAt, + }); + } + + if (linkCode.usedAt) { + return res.json({ + status: "used", + usedAt: linkCode.usedAt, + deviceName: linkCode.deviceName, + }); + } + + res.json({ + status: "pending", + expiresAt: linkCode.expiresAt, + }); + } catch (error) { + console.error("Check device link status error:", error); + res.status(500).json({ error: "Failed to check status" }); + } +}); + +// GET /device-link/devices - List linked devices (requires auth) +router.get("/devices", requireAuthOrToken, async (req, res) => { + try { + const userId = req.user!.id; + + const apiKeys = await prisma.apiKey.findMany({ + where: { userId }, + orderBy: { lastUsed: "desc" }, + select: { + id: true, + name: true, + lastUsed: true, + createdAt: true, + }, + }); + + res.json(apiKeys); + } catch (error) { + console.error("Get devices error:", error); + res.status(500).json({ error: "Failed to get devices" }); + } +}); + +// DELETE /device-link/devices/:id - Revoke a device (requires auth) +router.delete("/devices/:id", requireAuthOrToken, async (req, res) => { + try { + const userId = req.user!.id; + const { id } = req.params; + + const apiKey = await prisma.apiKey.findFirst({ + where: { id, userId }, + }); + + if (!apiKey) { + return res.status(404).json({ error: "Device not found" }); + } + + await prisma.apiKey.delete({ + where: { id }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Revoke device error:", error); + res.status(500).json({ error: "Failed to revoke device" }); + } +}); + +export default router; + + + + + + + + + + + + + + + diff --git a/backend/src/routes/discover.ts b/backend/src/routes/discover.ts new file mode 100644 index 0000000..145717b --- /dev/null +++ b/backend/src/routes/discover.ts @@ -0,0 +1,1793 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { lastFmService } from "../services/lastfm"; +import { startOfWeek, endOfWeek } from "date-fns"; +import axios from "axios"; +import fs from "fs"; +import path from "path"; +import { config } from "../config"; + +// Static imports for performance +import { discoverQueue, scanQueue } from "../workers/queues"; +import { getSystemSettings } from "../utils/systemSettings"; +import { lidarrService } from "../services/lidarr"; + +const router = Router(); + +router.use(requireAuthOrToken); + +// GET /discover/batch-status - Check if there's an active batch being processed +router.get("/batch-status", async (req, res) => { + try { + const userId = req.user!.id; + + // Find any active batch for this user + const activeBatch = await prisma.discoveryBatch.findFirst({ + where: { + userId, + status: { in: ["downloading", "scanning"] }, + }, + include: { + jobs: { + select: { + status: true, + }, + }, + }, + orderBy: { createdAt: "desc" }, + }); + + if (!activeBatch) { + return res.json({ + active: false, + status: null, + progress: null, + }); + } + + const completedJobs = activeBatch.jobs.filter(j => j.status === "completed").length; + const failedJobs = activeBatch.jobs.filter(j => j.status === "failed" || j.status === "exhausted").length; + const totalJobs = activeBatch.jobs.length; + const progress = totalJobs > 0 ? Math.round(((completedJobs + failedJobs) / totalJobs) * 100) : 0; + + res.json({ + active: true, + status: activeBatch.status, + batchId: activeBatch.id, + progress, + completed: completedJobs, + failed: failedJobs, + total: totalJobs, + }); + } catch (error) { + console.error("Get batch status error:", error); + res.status(500).json({ error: "Failed to get batch status" }); + } +}); + +// POST /discover/generate - Generate new Discover Weekly playlist (using Bull queue) +router.post("/generate", async (req, res) => { + try { + const userId = req.user!.id; + + // Check for existing active batch + const existingBatch = await prisma.discoveryBatch.findFirst({ + where: { + userId, + status: { in: ["downloading", "scanning"] }, + }, + }); + + if (existingBatch) { + return res.status(409).json({ + error: "Generation already in progress", + batchId: existingBatch.id, + status: existingBatch.status, + }); + } + + console.log(`\n Queuing Discover Weekly generation for user ${userId}`); + + // Add generation job to queue + const job = await discoverQueue.add({ userId }); + + res.json({ + message: "Discover Weekly generation started", + jobId: job.id, + }); + } catch (error) { + console.error("Generate Discover Weekly error:", error); + res.status(500).json({ error: "Failed to start generation" }); + } +}); + +// GET /discover/generate/status/:jobId - Check generation job status +router.get("/generate/status/:jobId", async (req, res) => { + try { + const job = await discoverQueue.getJob(req.params.jobId); + + if (!job) { + return res.status(404).json({ error: "Job not found" }); + } + + const state = await job.getState(); + const progress = job.progress(); + const result = job.returnvalue; + + res.json({ + status: state, + progress, + result, + }); + } catch (error) { + console.error("Get generation status error:", error); + res.status(500).json({ error: "Failed to get job status" }); + } +}); + +// GET /discover/current - Get current week's Discover Weekly playlist +router.get("/current", async (req, res) => { + try { + const userId = req.user!.id; + + const weekStart = startOfWeek(new Date(), { weekStartsOn: 1 }); // Monday + const weekEnd = endOfWeek(new Date(), { weekStartsOn: 1 }); // Sunday + + // Get all discovery albums for this week with their tracks + const discoveryAlbums = await prisma.discoveryAlbum.findMany({ + where: { + userId, + weekStartDate: weekStart, + status: { in: ["ACTIVE", "LIKED"] }, + }, + include: { + tracks: true, // DiscoveryTrack records (trackId is just a string, not a relation) + }, + orderBy: { downloadedAt: "asc" }, + }); + + // Get unavailable albums for this week (show full replacement chain) + const unavailableAlbums = await prisma.unavailableAlbum.findMany({ + where: { + userId, + weekStartDate: weekStart, + }, + orderBy: [ + { originalAlbumId: "asc" }, // Group by original album + { attemptNumber: "asc" }, // Then sort by attempt number + ], + }); + + // Build track list from DiscoveryTrack records (the actual selected tracks) + const tracks = []; + + for (const discoveryAlbum of discoveryAlbums) { + // If we have DiscoveryTrack records, use them (the actual selected tracks) + if (discoveryAlbum.tracks && discoveryAlbum.tracks.length > 0) { + // Fetch all tracks in one query using their IDs + const trackIds = discoveryAlbum.tracks + .map(dt => dt.trackId) + .filter((id): id is string => id !== null); + + if (trackIds.length > 0) { + const libraryTracks = await prisma.track.findMany({ + where: { id: { in: trackIds } }, + include: { album: { include: { artist: true } } }, + }); + + // Create a map for quick lookup + const trackMap = new Map(libraryTracks.map(t => [t.id, t])); + + for (const dt of discoveryAlbum.tracks) { + const track = dt.trackId ? trackMap.get(dt.trackId) : null; + if (track) { + tracks.push({ + id: track.id, + title: track.title, + artist: discoveryAlbum.artistName, + album: discoveryAlbum.albumTitle, + albumId: discoveryAlbum.rgMbid, + isLiked: discoveryAlbum.status === "LIKED", + likedAt: discoveryAlbum.likedAt, + similarity: discoveryAlbum.similarity, + tier: discoveryAlbum.tier, + coverUrl: track.album?.coverUrl, + available: true, + }); + } + } + } + } + + // Fallback: No DiscoveryTrack records or no valid trackIds, find ONE track from library + if (tracks.filter(t => t.album === discoveryAlbum.albumTitle).length === 0) { + const album = await prisma.album.findFirst({ + where: { + title: discoveryAlbum.albumTitle, + artist: { name: discoveryAlbum.artistName }, + }, + include: { + artist: true, + tracks: { take: 1, orderBy: { trackNo: "asc" } }, + }, + }); + + if (album && album.tracks.length > 0) { + const track = album.tracks[0]; + tracks.push({ + id: track.id, + title: track.title, + artist: discoveryAlbum.artistName, + album: discoveryAlbum.albumTitle, + albumId: discoveryAlbum.rgMbid, + isLiked: discoveryAlbum.status === "LIKED", + likedAt: discoveryAlbum.likedAt, + similarity: discoveryAlbum.similarity, + tier: discoveryAlbum.tier, + coverUrl: album.coverUrl, + available: true, + }); + } else { + // Album not in library yet (downloading/pending) + tracks.push({ + id: `pending-${discoveryAlbum.id}`, + title: `${discoveryAlbum.albumTitle} (pending import)`, + artist: discoveryAlbum.artistName, + album: discoveryAlbum.albumTitle, + albumId: discoveryAlbum.rgMbid, + isLiked: discoveryAlbum.status === "LIKED", + likedAt: discoveryAlbum.likedAt, + similarity: discoveryAlbum.similarity, + tier: discoveryAlbum.tier, + coverUrl: null, + available: false, + isPending: true, + }); + } + } + } + + // Get the list of successfully downloaded album MBIDs from discoveryAlbums + const successfulMbids = new Set(discoveryAlbums.map(da => da.rgMbid)); + + // Filter unavailable albums: + // 1. Remove albums that successfully downloaded (have DiscoveryAlbum record) + // 2. Remove albums that the user now owns (in Album table) + const filteredUnavailable: typeof unavailableAlbums = []; + for (const album of unavailableAlbums) { + // Skip if this album successfully downloaded this week + if (successfulMbids.has(album.albumMbid)) { + continue; + } + + // Skip if album exists in user's library by artist+title (normalized match) + const normalizedArtist = album.artistName.toLowerCase().trim(); + const normalizedAlbum = album.albumTitle.toLowerCase() + .replace(/\(.*?\)/g, "") // Remove parenthetical content + .replace(/\[.*?\]/g, "") // Remove bracketed content + .trim(); + + const existsInLibrary = await prisma.album.findFirst({ + where: { + OR: [ + { rgMbid: album.albumMbid }, + { + title: { contains: normalizedAlbum, mode: "insensitive" }, + artist: { name: { contains: normalizedArtist, mode: "insensitive" } }, + } + ] + } + }); + + if (existsInLibrary) { + continue; // User already owns this album, don't show as unavailable + } + + filteredUnavailable.push(album); + } + + // Format unavailable albums + const unavailable = filteredUnavailable.map((album) => ({ + id: `unavailable-${album.id}`, + title: album.albumTitle, + artist: album.artistName, + album: album.albumTitle, + albumId: album.albumMbid, + similarity: album.similarity, + tier: album.tier, + previewUrl: album.previewUrl, + deezerTrackId: album.deezerTrackId, + deezerAlbumId: album.deezerAlbumId, + attemptNumber: album.attemptNumber, + originalAlbumId: album.originalAlbumId, + available: false, + })); + + try { + console.log(`\nDiscover Weekly API Response:`); + console.log(` Total tracks: ${tracks.length}`); + console.log(` Unavailable albums: ${unavailable.length}`); + if (unavailable.length > 0 && unavailable.length <= 20) { + console.log(` Unavailable albums with previews:`); + unavailable.slice(0, 5).forEach((album, i) => { + console.log( + ` ${i + 1}. ${album.artist} - ${album.album} [${ + album.previewUrl ? "HAS PREVIEW" : "NO PREVIEW" + }]` + ); + }); + if (unavailable.length > 5) { + console.log(` ... and ${unavailable.length - 5} more`); + } + } + } catch (err) { + console.error("Error logging discover response:", err); + } + + res.json({ + weekStart, + weekEnd, + tracks, + unavailable, + totalCount: tracks.length, + unavailableCount: unavailable.length, + }); + } catch (error) { + console.error("Get current Discover Weekly error:", error); + res.status(500).json({ + error: "Failed to get Discover Weekly playlist", + }); + } +}); + +// POST /discover/like - Like a track (marks entire album for keeping) +router.post("/like", async (req, res) => { + try { + const userId = req.user!.id; + const { albumId } = req.body; + + if (!albumId) { + return res.status(400).json({ error: "albumId required" }); + } + + // Find the discovery album + const discoveryAlbum = await prisma.discoveryAlbum.findFirst({ + where: { + userId, + rgMbid: albumId, + status: "ACTIVE", + }, + }); + + if (!discoveryAlbum) { + return res + .status(404) + .json({ error: "Album not in active discovery" }); + } + + // Mark as liked (entire album will be kept) + await prisma.discoveryAlbum.update({ + where: { id: discoveryAlbum.id }, + data: { + status: "LIKED", + likedAt: new Date(), + }, + }); + + // Remove discovery tag from the artist in Lidarr + // This prevents the artist from being deleted during cleanup + console.log(` Removing discovery tag from artist: ${discoveryAlbum.artistName}`); + + // If artistMbid is a temp ID, we need to search Lidarr by artist name instead + if (discoveryAlbum.artistMbid && !discoveryAlbum.artistMbid.startsWith("temp-")) { + await lidarrService.removeDiscoveryTagByMbid(discoveryAlbum.artistMbid); + } else { + // Search Lidarr for the artist by name and remove tag + try { + const lidarrArtists = await lidarrService.getArtists(); + const lidarrArtist = lidarrArtists.find( + a => a.artistName.toLowerCase() === discoveryAlbum.artistName.toLowerCase() + ); + + if (lidarrArtist) { + const tagId = await lidarrService.getOrCreateDiscoveryTag(); + if (tagId && lidarrArtist.tags?.includes(tagId)) { + await lidarrService.removeTagsFromArtist(lidarrArtist.id, [tagId]); + console.log(` Removed discovery tag from ${lidarrArtist.artistName} (found by name)`); + } + } else { + console.log(` Artist ${discoveryAlbum.artistName} not found in Lidarr (may have been removed)`); + } + } catch (e: any) { + console.log(` Failed to remove discovery tag: ${e.message}`); + } + } + + // Find the actual Album record and create OwnedAlbum so it appears in library immediately + // Match by artist name + album title since rgMbid may differ between DiscoveryAlbum and scanned Album + const dbAlbum = await prisma.album.findFirst({ + where: { + OR: [ + { rgMbid: albumId }, + { + title: { equals: discoveryAlbum.albumTitle, mode: "insensitive" }, + artist: { name: { equals: discoveryAlbum.artistName, mode: "insensitive" } }, + }, + ], + }, + include: { artist: true }, + }); + + if (dbAlbum) { + // Update album location to LIBRARY so it appears in owned view + await prisma.album.update({ + where: { id: dbAlbum.id }, + data: { location: "LIBRARY" }, + }); + + // Create OwnedAlbum record if doesn't exist (makes it appear in "Owned" filter) + await prisma.ownedAlbum.upsert({ + where: { + artistId_rgMbid: { + artistId: dbAlbum.artistId, + rgMbid: dbAlbum.rgMbid, + }, + }, + create: { + artistId: dbAlbum.artistId, + rgMbid: dbAlbum.rgMbid, + source: "discovery_liked", + }, + update: { + source: "discovery_liked", + }, + }); + console.log(` ✓ Added liked album to library: ${dbAlbum.artist.name} - ${dbAlbum.title} (matched from discovery)`); + } else { + console.log(` [WARN] Could not find scanned album for: ${discoveryAlbum.artistName} - ${discoveryAlbum.albumTitle}`); + } + + // Retroactively mark all plays from this album as DISCOVERY_KEPT + // Note: This requires getting tracks from the album first + const tracks = await prisma.discoveryTrack.findMany({ + where: { discoveryAlbumId: discoveryAlbum.id }, + select: { trackId: true }, + }); + + const trackIds = tracks + .map((t) => t.trackId) + .filter((id): id is string => id !== null); + + if (trackIds.length > 0) { + await prisma.play.updateMany({ + where: { + userId, + trackId: { in: trackIds }, + source: "DISCOVERY", + }, + data: { + source: "DISCOVERY_KEPT", + }, + }); + } + + res.json({ success: true }); + } catch (error) { + console.error("Like discovery album error:", error); + res.status(500).json({ error: "Failed to like album" }); + } +}); + +// DELETE /discover/unlike - Unlike a track +router.delete("/unlike", async (req, res) => { + try { + const userId = req.user!.id; + const { albumId } = req.body; + + if (!albumId) { + return res.status(400).json({ error: "albumId required" }); + } + + const discoveryAlbum = await prisma.discoveryAlbum.findFirst({ + where: { + userId, + rgMbid: albumId, + status: "LIKED", + }, + }); + + if (!discoveryAlbum) { + return res.status(404).json({ error: "Album not liked" }); + } + + // Revert status back to ACTIVE + await prisma.discoveryAlbum.update({ + where: { id: discoveryAlbum.id }, + data: { + status: "ACTIVE", + likedAt: null, + }, + }); + + // Remove OwnedAlbum record if it was from discovery_liked + await prisma.ownedAlbum.deleteMany({ + where: { + rgMbid: albumId, + source: "discovery_liked", + }, + }); + + // Revert plays back to DISCOVERY source + const tracks = await prisma.discoveryTrack.findMany({ + where: { discoveryAlbumId: discoveryAlbum.id }, + select: { trackId: true }, + }); + + const trackIds = tracks + .map((t) => t.trackId) + .filter((id): id is string => id !== null); + + if (trackIds.length > 0) { + await prisma.play.updateMany({ + where: { + userId, + trackId: { in: trackIds }, + source: "DISCOVERY_KEPT", + }, + data: { + source: "DISCOVERY", + }, + }); + } + + res.json({ success: true }); + } catch (error) { + console.error("Unlike discovery album error:", error); + res.status(500).json({ error: "Failed to unlike album" }); + } +}); + +// GET /discover/config - Get user's Discover Weekly configuration +router.get("/config", async (req, res) => { + try { + const userId = req.user!.id; + + let config = await prisma.userDiscoverConfig.findUnique({ + where: { userId }, + }); + + // Create default config if doesn't exist + if (!config) { + config = await prisma.userDiscoverConfig.create({ + data: { + userId, + playlistSize: 10, + maxRetryAttempts: 3, + exclusionMonths: 6, + downloadRatio: 1.3, + enabled: true, + }, + }); + } + + res.json(config); + } catch (error) { + console.error("Get Discover Weekly config error:", error); + res.status(500).json({ error: "Failed to get configuration" }); + } +}); + +// PATCH /discover/config - Update user's Discover Weekly configuration +router.patch("/config", async (req, res) => { + try { + const userId = req.user!.id; + const { playlistSize, maxRetryAttempts, exclusionMonths, downloadRatio, enabled } = req.body; + + // Validate playlist size + if (playlistSize !== undefined) { + const size = parseInt(playlistSize, 10); + if (isNaN(size) || size < 5 || size > 50 || size % 5 !== 0) { + return res.status(400).json({ + error: "Invalid playlist size. Must be between 5-50 in increments of 5.", + }); + } + } + + // Validate max retry attempts + if (maxRetryAttempts !== undefined) { + const retries = parseInt(maxRetryAttempts, 10); + if (isNaN(retries) || retries < 1 || retries > 10) { + return res.status(400).json({ + error: "Invalid retry attempts. Must be between 1-10.", + }); + } + } + + // Validate exclusion months + if (exclusionMonths !== undefined) { + const months = parseInt(exclusionMonths, 10); + if (isNaN(months) || months < 0 || months > 12) { + return res.status(400).json({ + error: "Invalid exclusion months. Must be between 0-12.", + }); + } + } + + // Validate download ratio + if (downloadRatio !== undefined) { + const ratio = parseFloat(downloadRatio); + if (isNaN(ratio) || ratio < 1.0 || ratio > 2.0) { + return res.status(400).json({ + error: "Invalid download ratio. Must be between 1.0-2.0.", + }); + } + } + + const config = await prisma.userDiscoverConfig.upsert({ + where: { userId }, + create: { + userId, + playlistSize: playlistSize ?? 10, + maxRetryAttempts: maxRetryAttempts ?? 3, + exclusionMonths: exclusionMonths ?? 6, + downloadRatio: downloadRatio ?? 1.3, + enabled: enabled ?? true, + }, + update: { + ...(playlistSize !== undefined && { + playlistSize: parseInt(playlistSize, 10), + }), + ...(maxRetryAttempts !== undefined && { + maxRetryAttempts: parseInt(maxRetryAttempts, 10), + }), + ...(exclusionMonths !== undefined && { + exclusionMonths: parseInt(exclusionMonths, 10), + }), + ...(downloadRatio !== undefined && { + downloadRatio: parseFloat(downloadRatio), + }), + ...(enabled !== undefined && { enabled }), + }, + }); + + res.json(config); + } catch (error) { + console.error("Update Discover Weekly config error:", error); + res.status(500).json({ error: "Failed to update configuration" }); + } +}); + +// GET /discover/popular-artists - Get popular artists from Last.fm charts +router.get("/popular-artists", async (req, res) => { + try { + const limit = parseInt(req.query.limit as string) || 20; + + const artists = await lastFmService.getTopChartArtists(limit); + + res.json({ artists }); + } catch (error: any) { + console.error( + "[Discover] Get popular artists error:", + error?.message || error + ); + // Return empty array instead of 500 - allows homepage to still render + res.json({ artists: [] }); + } +}); + +// DELETE /discover/clear - Clear the discovery playlist (move liked to library, delete the rest) +router.delete("/clear", async (req, res) => { + try { + const userId = req.user!.id; + + console.log(`\n Clearing Discover Weekly playlist for user ${userId}`); + + // Get all discovery albums for this user + const discoveryAlbums = await prisma.discoveryAlbum.findMany({ + where: { + userId, + status: { in: ["ACTIVE", "LIKED"] }, + }, + }); + + if (discoveryAlbums.length === 0) { + return res.json({ + success: true, + message: "No discovery albums to clear", + likedMoved: 0, + activeDeleted: 0, + }); + } + + const likedAlbums = discoveryAlbums.filter((a) => a.status === "LIKED"); + const activeAlbums = discoveryAlbums.filter( + (a) => a.status === "ACTIVE" + ); + + console.log( + ` Found ${likedAlbums.length} liked albums to move to library` + ); + console.log(` Found ${activeAlbums.length} active albums to delete`); + + // Get system settings for Lidarr + const settings = await getSystemSettings(); + + let likedMoved = 0; + let activeDeleted = 0; + + // Process liked albums - move to library + if (likedAlbums.length > 0) { + console.log(`\n[LIBRARY] Moving liked albums to library...`); + + for (const album of likedAlbums) { + try { + // Find the album in the database by matching artist + title + const dbAlbum = await prisma.album.findFirst({ + where: { + title: album.albumTitle, + artist: { name: album.artistName }, + }, + include: { artist: true }, + }); + + if (dbAlbum) { + // Update album location to LIBRARY + await prisma.album.update({ + where: { id: dbAlbum.id }, + data: { location: "LIBRARY" }, + }); + + // Create OwnedAlbum record if doesn't exist + await prisma.ownedAlbum.upsert({ + where: { + artistId_rgMbid: { + artistId: dbAlbum.artistId, + rgMbid: dbAlbum.rgMbid, + }, + }, + create: { + artistId: dbAlbum.artistId, + rgMbid: dbAlbum.rgMbid, + source: "discover_liked", + }, + update: {}, // No update needed if exists + }); + + // If Lidarr is enabled, move the album files to main library + if ( + settings.lidarrEnabled && + settings.lidarrUrl && + settings.lidarrApiKey && + album.lidarrAlbumId + ) { + + try { + // Get album details from Lidarr + const albumResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/album/${album.lidarrAlbumId}`, + { + headers: { + "X-Api-Key": settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + + const artistId = albumResponse.data.artistId; + + // Get artist details + const artistResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/artist/${artistId}`, + { + headers: { + "X-Api-Key": settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + + // Update artist's root folder path to main library if in discovery + if ( + artistResponse.data.path?.includes( + "/music/discovery" + ) + ) { + // Move artist to main library path + await axios.put( + `${settings.lidarrUrl}/api/v1/artist/${artistId}`, + { + ...artistResponse.data, + path: artistResponse.data.path.replace( + "/music/discovery", + "/music" + ), + moveFiles: true, + }, + { + headers: { + "X-Api-Key": + settings.lidarrApiKey, + }, + timeout: 30000, + } + ); + console.log( + ` Moved to library: ${album.artistName} - ${album.albumTitle}` + ); + } + } catch (lidarrError: any) { + console.log( + ` Lidarr move failed for ${album.albumTitle}: ${lidarrError.message}` + ); + } + } + + likedMoved++; + } + + // Mark as MOVED in discovery database + await prisma.discoveryAlbum.update({ + where: { id: album.id }, + data: { status: "MOVED" }, + }); + } catch (error: any) { + console.error( + ` ✗ Failed to move ${album.albumTitle}: ${error.message}` + ); + } + } + } + + // Process active (non-liked) albums - delete them + if (activeAlbums.length > 0) { + console.log(`\n[CLEANUP] Deleting non-liked albums...`); + + const checkedArtistIds = new Set(); + + for (const album of activeAlbums) { + try { + // Remove from Lidarr if enabled + if ( + settings.lidarrEnabled && + settings.lidarrUrl && + settings.lidarrApiKey && + album.lidarrAlbumId + ) { + + try { + // Get album details to find artist ID + let artistId: number | undefined; + try { + const albumResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/album/${album.lidarrAlbumId}`, + { + headers: { + "X-Api-Key": settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + artistId = albumResponse.data.artistId; + } catch (e: any) { + if (e.response?.status !== 404) throw e; + } + + // Delete album from Lidarr + await axios.delete( + `${settings.lidarrUrl}/api/v1/album/${album.lidarrAlbumId}`, + { + params: { deleteFiles: true }, + headers: { + "X-Api-Key": settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + console.log( + ` Deleted from Lidarr: ${album.albumTitle}` + ); + + // Check if artist should be removed too + if (artistId && !checkedArtistIds.has(artistId)) { + checkedArtistIds.add(artistId); + + try { + const artistResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/artist/${artistId}`, + { + headers: { + "X-Api-Key": + settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + + const artist = artistResponse.data; + const artistMbid = artist.foreignArtistId; + + // Check if artist has any NATIVE library content (real user library) + // This is more reliable than checking Album.location which can be wrong + const hasNativeOwnedAlbums = + await prisma.ownedAlbum.findFirst({ + where: { + artist: { mbid: artistMbid }, + source: "native_scan", + }, + }); + + // Check if artist has any LIKED/MOVED discovery albums + const hasKeptDiscoveryAlbums = + await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid: artistMbid, + status: { + in: ["LIKED", "MOVED"], + }, + }, + }); + + // Only remove artist if they have no native library content and no kept discovery albums + if ( + !hasNativeOwnedAlbums && + !hasKeptDiscoveryAlbums + ) { + await axios.delete( + `${settings.lidarrUrl}/api/v1/artist/${artistId}`, + { + params: { deleteFiles: true }, + headers: { + "X-Api-Key": + settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + console.log( + ` Removed artist from Lidarr: ${artist.artistName}` + ); + } else { + console.log( + ` Keeping artist in Lidarr: ${artist.artistName} (has library or kept albums)` + ); + } + } catch (e: any) { + // Artist might have other albums + } + } + } catch (lidarrError: any) { + if (lidarrError.response?.status !== 404) { + console.log( + ` Lidarr delete failed for ${album.albumTitle}: ${lidarrError.message}` + ); + } + } + } + + // FALLBACK: Direct filesystem deletion (in case Lidarr's deleteFiles didn't work) + // Try to delete files directly from the discovery folder + try { + const discoveryPath = path.join(config.music.musicPath, "discovery"); + // Try common folder structures: /discovery/Artist/Album or /discovery/Artist - Album + const possiblePaths = [ + path.join(discoveryPath, album.artistName, album.albumTitle), + path.join(discoveryPath, album.artistName), + path.join(discoveryPath, `${album.artistName} - ${album.albumTitle}`), + ]; + + for (const albumPath of possiblePaths) { + if (fs.existsSync(albumPath)) { + fs.rmSync(albumPath, { recursive: true, force: true }); + console.log(` Direct deleted: ${albumPath}`); + break; // Stop after first successful delete + } + } + } catch (fsError: any) { + console.log(` Filesystem delete failed for ${album.albumTitle}: ${fsError.message}`); + } + + // Delete DiscoveryTrack records first (foreign key to Track) + await prisma.discoveryTrack.deleteMany({ + where: { discoveryAlbumId: album.id }, + }); + + // Remove from local database + const dbAlbum = await prisma.album.findFirst({ + where: { + title: album.albumTitle, + artist: { name: album.artistName }, + location: "DISCOVER", + }, + include: { tracks: true }, + }); + + if (dbAlbum) { + // Delete tracks first + await prisma.track.deleteMany({ + where: { albumId: dbAlbum.id }, + }); + + // Delete album + await prisma.album.delete({ + where: { id: dbAlbum.id }, + }); + } + + // Mark as DELETED in discovery database + await prisma.discoveryAlbum.update({ + where: { id: album.id }, + data: { status: "DELETED" }, + }); + + activeDeleted++; + } catch (error: any) { + console.error( + ` ✗ Failed to delete ${album.albumTitle}: ${error.message}` + ); + } + } + } + + // ALSO clean up "extra" downloaded albums that didn't make the final playlist + // These are in DownloadJob but not in DiscoveryAlbum + // IMPORTANT: Skip any albums where the artist has LIKED content (even if MBID doesn't match) + if (settings.lidarrEnabled && settings.lidarrUrl && settings.lidarrApiKey) { + const completedJobs = await prisma.downloadJob.findMany({ + where: { + userId, + discoveryBatchId: { not: null }, + status: "completed", + }, + }); + + // Get all DiscoveryAlbum for this user (including ones we just processed) + const allDiscoveryAlbums = await prisma.discoveryAlbum.findMany({ + where: { userId }, + select: { rgMbid: true, artistName: true, albumTitle: true, status: true }, + }); + const discoveryMbids = new Set(allDiscoveryAlbums.map(da => da.rgMbid)); + + // Build a set of liked artist names (case-insensitive) for extra protection + const likedArtistNames = new Set( + allDiscoveryAlbums + .filter(da => da.status === "LIKED" || da.status === "MOVED") + .map(da => da.artistName.toLowerCase()) + ); + + // Find completed jobs that didn't make the playlist AND aren't from liked artists + const extraJobs = completedJobs.filter(job => { + // If MBID matches a discovery album, not an "extra" + if (discoveryMbids.has(job.targetMbid)) return false; + + // If this job's artist has any LIKED albums, don't clean it up + const metadata = job.metadata as any; + const artistName = metadata?.artistName?.toLowerCase(); + if (artistName && likedArtistNames.has(artistName)) { + console.log(` Skipping ${metadata?.albumTitle} - artist ${metadata?.artistName} has liked albums`); + return false; + } + + return true; + }); + + if (extraJobs.length > 0) { + console.log(`\n[CLEANUP] Found ${extraJobs.length} extra albums to clean from Lidarr...`); + + for (const job of extraJobs) { + const metadata = job.metadata as any; + const albumTitle = metadata?.albumTitle || job.subject; + const artistName = metadata?.artistName; + + // Double-check: also check by artist name + album title for LIKED status + const isLikedByName = await prisma.discoveryAlbum.findFirst({ + where: { + userId, + artistName: { equals: artistName, mode: "insensitive" }, + albumTitle: { equals: albumTitle, mode: "insensitive" }, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + if (isLikedByName) { + console.log(` Skipping ${albumTitle} - marked as LIKED`); + continue; + } + + if (job.lidarrAlbumId) { + try { + // Get artist ID before deleting album + let artistId: number | undefined; + try { + const albumResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/album/${job.lidarrAlbumId}`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + artistId = albumResponse.data.artistId; + } catch (e) { + // Album might not exist + } + + // Delete album from Lidarr + await axios.delete( + `${settings.lidarrUrl}/api/v1/album/${job.lidarrAlbumId}`, + { + params: { deleteFiles: true }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log(` Cleaned up extra album: ${albumTitle}`); + + // Check if artist should be removed too + if (artistId) { + // Check if artist has any liked albums by NAME (more reliable than MBID) + const hasLikedByArtistName = await prisma.discoveryAlbum.findFirst({ + where: { + artistName: { equals: artistName, mode: "insensitive" }, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + if (hasLikedByArtistName) { + console.log(` Keeping artist: ${artistName} (has liked albums)`); + continue; + } + + const artistMbid = metadata?.artistMbid; + if (artistMbid && !artistMbid.startsWith("temp-")) { + // Check if artist has native library content + const hasNativeLibrary = await prisma.ownedAlbum.findFirst({ + where: { + artist: { mbid: artistMbid }, + source: "native_scan", + }, + }); + + if (!hasNativeLibrary) { + try { + await axios.delete( + `${settings.lidarrUrl}/api/v1/artist/${artistId}`, + { + params: { deleteFiles: true }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log(` Removed extra artist from Lidarr: ${artistName}`); + } catch (e) { + // Artist might have other albums + } + } + } + } + } catch (e: any) { + // Ignore - might already be removed + if (e.response?.status !== 404) { + console.log(` Failed to clean up ${albumTitle}: ${e.message}`); + } + } + } + } + } + } + + // Clean up unavailable albums for this user + await prisma.unavailableAlbum.deleteMany({ + where: { userId }, + }); + + // === PHASE 1.5: Clean up failed artists from Lidarr === + // Get all failed download jobs for this user and remove their artists from Lidarr + if (settings.lidarrEnabled && settings.lidarrUrl && settings.lidarrApiKey) { + console.log(`\n[CLEANUP] Checking for failed artists to remove from Lidarr...`); + + const failedJobs = await prisma.downloadJob.findMany({ + where: { + userId, + status: "failed", + discoveryBatchId: { not: null }, + }, + }); + + // Group by artist + const failedArtistMbids = new Set(); + const artistNames = new Map(); + + for (const job of failedJobs) { + const metadata = job.metadata as any; + if (metadata?.artistMbid) { + failedArtistMbids.add(metadata.artistMbid); + artistNames.set(metadata.artistMbid, metadata.artistName || "Unknown"); + } + } + + // Remove failed artists that don't have native library content + for (const artistMbid of failedArtistMbids) { + try { + // Check if artist has any NATIVE library content (real user library) + const hasNativeOwnedAlbums = await prisma.ownedAlbum.findFirst({ + where: { + artist: { mbid: artistMbid }, + source: "native_scan", + }, + }); + + if (hasNativeOwnedAlbums) { + console.log(` Keeping ${artistNames.get(artistMbid)} - has native library content`); + continue; + } + + // Check if artist has any LIKED discovery albums + const hasLikedDiscovery = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + if (hasLikedDiscovery) { + console.log(` Keeping ${artistNames.get(artistMbid)} - has liked discovery albums`); + continue; + } + + // Find and remove from Lidarr + const searchResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/artist`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + + const lidarrArtist = searchResponse.data.find( + (a: any) => a.foreignArtistId === artistMbid + ); + + if (lidarrArtist) { + await axios.delete( + `${settings.lidarrUrl}/api/v1/artist/${lidarrArtist.id}`, + { + params: { deleteFiles: true }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log(` ✓ Removed failed artist from Lidarr: ${artistNames.get(artistMbid)}`); + } + } catch (e: any) { + // Ignore errors - artist might already be removed + } + } + + // DON'T delete download jobs immediately - scanner needs them to identify discovery albums + // They will be cleaned up by the data integrity worker after 30 days + // Only delete FAILED jobs (they won't help with matching anyway) + await prisma.downloadJob.deleteMany({ + where: { + userId, + discoveryBatchId: { not: null }, + status: "failed", + }, + }); + } + + // === PHASE 2: Clean up orphaned discovery records === + // These are Album/Track records with location="DISCOVER" that weren't linked to a DiscoveryAlbum + // This can happen if downloads failed or playlist build failed + console.log(`\n Cleaning up orphaned discovery records...`); + + // Find all DISCOVER albums that don't have a corresponding DiscoveryAlbum record + const orphanedAlbums = await prisma.album.findMany({ + where: { + location: "DISCOVER", + }, + include: { artist: true, tracks: true }, + }); + + let orphanedAlbumsDeleted = 0; + for (const orphanAlbum of orphanedAlbums) { + // Check if there's a DiscoveryAlbum record for this + // Include MOVED status because liked albums are marked MOVED during clear + const hasDiscoveryRecord = await prisma.discoveryAlbum.findFirst({ + where: { + OR: [ + { rgMbid: orphanAlbum.rgMbid }, + { + albumTitle: orphanAlbum.title, + artistName: orphanAlbum.artist.name, + }, + ], + status: { in: ["ACTIVE", "LIKED", "MOVED"] }, // Keep if active, liked, or moved to library + }, + }); + + // Also check if there's an OwnedAlbum record (user liked it) + const hasOwnedRecord = await prisma.ownedAlbum.findFirst({ + where: { + rgMbid: orphanAlbum.rgMbid, + }, + }); + + if (!hasDiscoveryRecord && !hasOwnedRecord) { + // Delete tracks first + await prisma.track.deleteMany({ + where: { albumId: orphanAlbum.id }, + }); + // Delete album + await prisma.album.delete({ + where: { id: orphanAlbum.id }, + }); + orphanedAlbumsDeleted++; + console.log( + ` Deleted orphaned album: ${orphanAlbum.artist.name} - ${orphanAlbum.title}` + ); + } + } + + if (orphanedAlbumsDeleted > 0) { + console.log( + ` Cleaned up ${orphanedAlbumsDeleted} orphaned discovery albums` + ); + } + + // Clean up orphaned artists (artists with no albums) + const orphanedArtists = await prisma.artist.findMany({ + where: { + albums: { none: {} }, + }, + }); + + if (orphanedArtists.length > 0) { + const orphanIds = orphanedArtists.map((a) => a.id); + + // Delete artist relations first (SimilarArtist records) + // Note: SimilarArtist uses fromArtistId/toArtistId field names + await prisma.similarArtist.deleteMany({ + where: { + OR: [ + { fromArtistId: { in: orphanIds } }, + { toArtistId: { in: orphanIds } }, + ], + }, + }); + + await prisma.artist.deleteMany({ + where: { id: { in: orphanIds } }, + }); + console.log( + ` Cleaned up ${orphanedArtists.length} orphaned artists` + ); + } + + // Clean up orphaned DiscoveryTrack records (tracks whose album was deleted) + const orphanedDiscoveryTracks = await prisma.discoveryTrack.deleteMany({ + where: { + trackId: null, // Track was deleted but DiscoveryTrack record remains + }, + }); + + if (orphanedDiscoveryTracks.count > 0) { + console.log( + ` Cleaned up ${orphanedDiscoveryTracks.count} orphaned discovery track records` + ); + } + + // Clean up old DiscoveryAlbum records that are DELETED or MOVED (older than 30 days) + const thirtyDaysAgo = new Date(); + thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); + + const oldDiscoveryAlbums = await prisma.discoveryAlbum.deleteMany({ + where: { + userId, + status: { in: ["DELETED", "MOVED"] }, + downloadedAt: { lt: thirtyDaysAgo }, + }, + }); + + if (oldDiscoveryAlbums.count > 0) { + console.log( + ` Cleaned up ${oldDiscoveryAlbums.count} old discovery album records` + ); + } + + // === PHASE 3: Tag-based Lidarr cleanup === + // Only remove artists that have the "lidify-discovery" tag + // This is the ONLY reliable way to identify discovery artists + // User's pre-existing library is NEVER touched (no tag = safe) + let lidarrArtistsRemoved = 0; + if (settings.lidarrEnabled && settings.lidarrUrl && settings.lidarrApiKey) { + console.log(`\n[LIDARR CLEANUP] Tag-based cleanup (lidify-discovery tag)...`); + + try { + // Get all artists with the discovery tag + const discoveryArtists = await lidarrService.getDiscoveryArtists(); + console.log(` Found ${discoveryArtists.length} artists with discovery tag`); + + for (const lidarrArtist of discoveryArtists) { + const artistMbid = lidarrArtist.foreignArtistId; + const artistName = lidarrArtist.artistName; + + if (!artistMbid) continue; + + // Double-check: if artist has LIKED albums, remove tag but don't delete + // (This is a safety net - the like endpoint should have already removed the tag) + const hasKeptDiscovery = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid: artistMbid, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + if (hasKeptDiscovery) { + // Remove the tag but keep the artist + console.log(` Keeping ${artistName} - has liked albums (removing tag)`); + await lidarrService.removeDiscoveryTagByMbid(artistMbid); + continue; + } + + // Artist has discovery tag AND no liked albums = safe to delete + try { + const result = await lidarrService.deleteArtistById(lidarrArtist.id, true); + if (result.success) { + lidarrArtistsRemoved++; + console.log(` ✓ Removed: ${artistName}`); + } + } catch (deleteError: any) { + console.log(` ✗ Failed to remove ${artistName}: ${deleteError.message}`); + } + } + + console.log(` Tag-based cleanup complete: ${lidarrArtistsRemoved} artists removed`); + } catch (lidarrError: any) { + console.log(` Lidarr cleanup failed: ${lidarrError.message}`); + } + } + + // === PHASE 4: Trigger library scan to sync database with filesystem === + console.log(`\n[SCAN] Triggering library scan to sync database...`); + try { + await scanQueue.add("scan", { + userId, + musicPath: config.music.musicPath, + }); + console.log(` Library scan queued successfully`); + } catch (scanError: any) { + console.log(` Library scan queue failed: ${scanError.message}`); + // Non-fatal - continue with response + } + + console.log( + `\nClear complete: ${likedMoved} moved to library, ${activeDeleted} deleted, ${orphanedAlbumsDeleted} orphans cleaned, ${lidarrArtistsRemoved} Lidarr artists removed` + ); + + res.json({ + success: true, + message: "Discovery playlist cleared", + likedMoved, + activeDeleted, + orphanedAlbumsDeleted, + lidarrArtistsRemoved, + }); + } catch (error: any) { + console.error("Clear discovery playlist error:", error?.message || error); + console.error("Stack:", error?.stack); + res.status(500).json({ + error: "Failed to clear discovery playlist", + details: error?.message || "Unknown error" + }); + } +}); + +// GET /discover/exclusions - Get all exclusions for current user +router.get("/exclusions", async (req, res) => { + try { + const userId = req.user!.id; + + const exclusions = await prisma.discoverExclusion.findMany({ + where: { + userId, + expiresAt: { gt: new Date() } // Only active exclusions + }, + orderBy: { lastSuggestedAt: "desc" }, + }); + + // Return exclusions with names + const mapped = exclusions.map((exc) => ({ + id: exc.id, + albumMbid: exc.albumMbid, + artistName: exc.artistName || "Unknown Artist", + albumTitle: exc.albumTitle || exc.albumMbid.slice(0, 8) + "...", + lastSuggestedAt: exc.lastSuggestedAt, + expiresAt: exc.expiresAt, + })); + + res.json({ + exclusions: mapped, + count: exclusions.length, + }); + } catch (error: any) { + console.error("Get exclusions error:", error?.message || error); + console.error("Stack:", error?.stack); + res.status(500).json({ error: "Failed to get exclusions", details: error?.message }); + } +}); + +// DELETE /discover/exclusions - Clear all exclusions for current user +router.delete("/exclusions", async (req, res) => { + try { + const userId = req.user!.id; + + const result = await prisma.discoverExclusion.deleteMany({ + where: { userId }, + }); + + console.log(`[Discovery] Cleared ${result.count} exclusions for user ${userId}`); + + res.json({ + success: true, + message: `Cleared ${result.count} exclusions`, + clearedCount: result.count, + }); + } catch (error) { + console.error("Clear exclusions error:", error); + res.status(500).json({ error: "Failed to clear exclusions" }); + } +}); + +// DELETE /discover/exclusions/:id - Remove a specific exclusion +router.delete("/exclusions/:id", async (req, res) => { + try { + const userId = req.user!.id; + const { id } = req.params; + + const exclusion = await prisma.discoverExclusion.findFirst({ + where: { id, userId }, + }); + + if (!exclusion) { + return res.status(404).json({ error: "Exclusion not found" }); + } + + await prisma.discoverExclusion.delete({ + where: { id }, + }); + + res.json({ + success: true, + message: "Exclusion removed", + }); + } catch (error) { + console.error("Remove exclusion error:", error); + res.status(500).json({ error: "Failed to remove exclusion" }); + } +}); + +// POST /discover/cleanup-lidarr - Remove discovery-only artists from Lidarr +// This cleans up artists that were added for discovery but shouldn't remain +router.post("/cleanup-lidarr", async (req, res) => { + try { + console.log("\n[CLEANUP] Starting Lidarr cleanup of discovery-only artists..."); + + const settings = await getSystemSettings(); + + if (!settings.lidarrEnabled || !settings.lidarrUrl || !settings.lidarrApiKey) { + return res.status(400).json({ error: "Lidarr not configured" }); + } + + // Get all artists from Lidarr + const lidarrResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/artist`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 30000, + } + ); + + const lidarrArtists = lidarrResponse.data; + console.log(`[CLEANUP] Found ${lidarrArtists.length} artists in Lidarr`); + + const artistsRemoved: string[] = []; + const artistsKept: string[] = []; + const errors: string[] = []; + + for (const lidarrArtist of lidarrArtists) { + const artistMbid = lidarrArtist.foreignArtistId; + const artistName = lidarrArtist.artistName; + + if (!artistMbid) continue; + + try { + // Check if this artist has any NATIVE library content (real user library) + // This is more reliable than checking Album.location which can be wrong + const hasNativeOwnedAlbums = await prisma.ownedAlbum.findFirst({ + where: { + artist: { mbid: artistMbid }, + source: "native_scan", + }, + }); + + // Check if artist has any LIKED/MOVED discovery albums + const hasKeptDiscoveryAlbums = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid: artistMbid, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + // Check if artist has any ACTIVE discovery albums (current playlist) + const hasActiveDiscoveryAlbums = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid: artistMbid, + status: "ACTIVE", + }, + }); + + if (hasNativeOwnedAlbums || hasKeptDiscoveryAlbums) { + // This artist should stay in Lidarr + artistsKept.push(`${artistName} (has native library or kept albums)`); + continue; + } + + if (hasActiveDiscoveryAlbums) { + // This artist has a current discovery album, keep for now + artistsKept.push(`${artistName} (has active discovery)`); + continue; + } + + // This artist has no library albums and no active/kept discovery albums + // They should be removed from Lidarr + console.log(`[CLEANUP] Removing discovery-only artist: ${artistName}`); + + await axios.delete( + `${settings.lidarrUrl}/api/v1/artist/${lidarrArtist.id}`, + { + params: { deleteFiles: true }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 30000, + } + ); + + artistsRemoved.push(artistName); + console.log(`[CLEANUP] ✓ Removed: ${artistName}`); + + } catch (error: any) { + const msg = `Failed to process ${artistName}: ${error.message}`; + errors.push(msg); + console.error(`[CLEANUP] ✗ ${msg}`); + } + } + + console.log(`\n[CLEANUP] Complete:`); + console.log(` - Removed: ${artistsRemoved.length}`); + console.log(` - Kept: ${artistsKept.length}`); + console.log(` - Errors: ${errors.length}`); + + res.json({ + success: true, + removed: artistsRemoved, + kept: artistsKept, + errors, + summary: { + removed: artistsRemoved.length, + kept: artistsKept.length, + errors: errors.length, + }, + }); + } catch (error: any) { + console.error("[CLEANUP] Lidarr cleanup error:", error?.message || error); + res.status(500).json({ + error: "Failed to cleanup Lidarr", + details: error?.message || "Unknown error", + }); + } +}); + +// POST /discover/fix-tagging - Fix albums incorrectly tagged as LIBRARY that should be DISCOVER +// This repairs existing bad data caused by scanner timing issues +// IMPORTANT: Does NOT touch albums that user has LIKED (discovery_liked) or native library +router.post("/fix-tagging", async (req, res) => { + try { + console.log("\n[FIX-TAGGING] Starting album tagging repair..."); + + // Get all discovery artists (from DiscoveryAlbum records) + const discoveryArtists = await prisma.discoveryAlbum.findMany({ + distinct: ['artistMbid'], + select: { artistMbid: true, artistName: true }, + }); + + console.log(`[FIX-TAGGING] Found ${discoveryArtists.length} artists with discovery records`); + + let albumsFixed = 0; + let ownedRecordsRemoved = 0; + const fixedArtists: string[] = []; + + for (const da of discoveryArtists) { + if (!da.artistMbid) continue; + + // Check if artist has ANY protected content: + // 1. native_scan = real user library from before discovery + // 2. discovery_liked = user liked a discovery album (should be kept!) + const hasProtectedContent = await prisma.ownedAlbum.findFirst({ + where: { + artist: { mbid: da.artistMbid }, + source: { in: ["native_scan", "discovery_liked"] }, + }, + }); + + if (hasProtectedContent) { + // Artist has protected content - don't touch their albums + console.log(`[FIX-TAGGING] Skipping ${da.artistName} - has protected content (${hasProtectedContent.source})`); + continue; + } + + // Also check if artist has any LIKED discovery albums (double-check) + const hasLikedDiscovery = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid: da.artistMbid, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + if (hasLikedDiscovery) { + // User liked albums from this artist - don't touch + console.log(`[FIX-TAGGING] Skipping ${da.artistName} - has LIKED discovery albums`); + continue; + } + + // This artist has NO protected content - they're purely an ACTIVE discovery artist + // Fix any of their albums that are incorrectly tagged as LIBRARY + const mistaggedAlbums = await prisma.album.findMany({ + where: { + artist: { mbid: da.artistMbid }, + location: "LIBRARY", + }, + }); + + if (mistaggedAlbums.length > 0) { + // Update all these albums to DISCOVER + const updated = await prisma.album.updateMany({ + where: { + artist: { mbid: da.artistMbid }, + location: "LIBRARY", + }, + data: { location: "DISCOVER" }, + }); + + // Remove incorrect OwnedAlbum records (but not protected ones) + const removed = await prisma.ownedAlbum.deleteMany({ + where: { + artist: { mbid: da.artistMbid }, + source: { notIn: ["native_scan", "discovery_liked"] }, + }, + }); + + albumsFixed += updated.count; + ownedRecordsRemoved += removed.count; + fixedArtists.push(da.artistName); + + console.log(`[FIX-TAGGING] Fixed ${updated.count} albums for ${da.artistName}`); + } + } + + console.log(`[FIX-TAGGING] Complete: ${albumsFixed} albums fixed, ${ownedRecordsRemoved} OwnedAlbum records removed`); + + res.json({ + success: true, + albumsFixed, + ownedRecordsRemoved, + fixedArtists, + }); + } catch (error: any) { + console.error("[FIX-TAGGING] Error:", error?.message || error); + res.status(500).json({ + error: "Failed to fix album tagging", + details: error?.message || "Unknown error", + }); + } +}); + +export default router; diff --git a/backend/src/routes/downloads.ts b/backend/src/routes/downloads.ts new file mode 100644 index 0000000..899aaca --- /dev/null +++ b/backend/src/routes/downloads.ts @@ -0,0 +1,588 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { config } from "../config"; +import { lidarrService } from "../services/lidarr"; +import { musicBrainzService } from "../services/musicbrainz"; +import { simpleDownloadManager } from "../services/simpleDownloadManager"; +import crypto from "crypto"; + +const router = Router(); + +router.use(requireAuthOrToken); + +// POST /downloads - Create download job +router.post("/", async (req, res) => { + try { + const { + type, + mbid, + subject, + artistName, + albumTitle, + downloadType = "library", + } = req.body; + const userId = req.user!.id; + + if (!type || !mbid || !subject) { + return res.status(400).json({ + error: "Missing required fields: type, mbid, subject", + }); + } + + if (type !== "artist" && type !== "album") { + return res + .status(400) + .json({ error: "Type must be 'artist' or 'album'" }); + } + + if (downloadType !== "library" && downloadType !== "discovery") { + return res.status(400).json({ + error: "downloadType must be 'library' or 'discovery'", + }); + } + + // Check if Lidarr is enabled (database or .env) + const lidarrEnabled = await lidarrService.isEnabled(); + if (!lidarrEnabled) { + return res.status(400).json({ + error: "Lidarr not configured. Please add albums manually to your library.", + }); + } + + // Determine root folder path based on download type + const rootFolderPath = + downloadType === "discovery" ? "/music/discovery" : "/music"; + + if (type === "artist") { + // For artist downloads, fetch albums and create individual jobs + const jobs = await processArtistDownload( + userId, + mbid, + subject, + rootFolderPath, + downloadType + ); + + return res.json({ + id: jobs[0]?.id || null, + status: "processing", + downloadType, + rootFolderPath, + message: `Creating download jobs for ${jobs.length} album(s)...`, + albumCount: jobs.length, + jobs: jobs.map((j) => ({ id: j.id, subject: j.subject })), + }); + } + + // Single album download - check for existing job first + const existingJob = await prisma.downloadJob.findFirst({ + where: { + targetMbid: mbid, + status: { in: ["pending", "processing"] }, + }, + }); + + if (existingJob) { + console.log(`[DOWNLOAD] Job already exists for ${mbid}: ${existingJob.id} (${existingJob.status})`); + return res.json({ + id: existingJob.id, + status: existingJob.status, + downloadType, + rootFolderPath, + message: "Download already in progress", + duplicate: true, + }); + } + + const job = await prisma.downloadJob.create({ + data: { + userId, + subject, + type, + targetMbid: mbid, + status: "pending", + metadata: { + downloadType, + rootFolderPath, + artistName, + albumTitle, + }, + }, + }); + + console.log( + `[DOWNLOAD] Triggering Lidarr: ${type} "${subject}" -> ${rootFolderPath}` + ); + + // Process in background + processDownload( + job.id, + type, + mbid, + subject, + rootFolderPath, + artistName, + albumTitle + ).catch((error) => { + console.error( + `Download processing failed for job ${job.id}:`, + error + ); + }); + + res.json({ + id: job.id, + status: job.status, + downloadType, + rootFolderPath, + message: "Download job created. Processing in background.", + }); + } catch (error) { + console.error("Create download job error:", error); + res.status(500).json({ error: "Failed to create download job" }); + } +}); + +/** + * Process artist download by creating individual album jobs + */ +async function processArtistDownload( + userId: string, + artistMbid: string, + artistName: string, + rootFolderPath: string, + downloadType: string +): Promise<{ id: string; subject: string }[]> { + console.log(`\n Processing artist download: ${artistName}`); + console.log(` Artist MBID: ${artistMbid}`); + + // Generate a batch ID to group all album downloads + const batchId = crypto.randomUUID(); + console.log(` Batch ID: ${batchId}`); + + try { + // First, add the artist to Lidarr (this monitors all albums) + const lidarrArtist = await lidarrService.addArtist( + artistMbid, + artistName, + rootFolderPath + ); + + if (!lidarrArtist) { + console.log(` Failed to add artist to Lidarr`); + throw new Error("Failed to add artist to Lidarr"); + } + + console.log(` Artist added to Lidarr (ID: ${lidarrArtist.id})`); + + // Fetch albums from MusicBrainz + const releaseGroups = await musicBrainzService.getReleaseGroups( + artistMbid, + ["album", "ep"], + 100 + ); + + console.log( + ` Found ${releaseGroups.length} albums/EPs from MusicBrainz` + ); + + if (releaseGroups.length === 0) { + console.log(` No albums found for artist`); + return []; + } + + // Create individual album jobs + const jobs: { id: string; subject: string }[] = []; + + for (const rg of releaseGroups) { + const albumMbid = rg.id; + const albumTitle = rg.title; + const albumSubject = `${artistName} - ${albumTitle}`; + + // Check if we already have this album downloaded + const existingAlbum = await prisma.album.findFirst({ + where: { rgMbid: albumMbid }, + }); + + if (existingAlbum) { + console.log(` Skipping "${albumTitle}" - already in library`); + continue; + } + + // Check if there's already a pending/processing job for this album + const existingJob = await prisma.downloadJob.findFirst({ + where: { + targetMbid: albumMbid, + status: { in: ["pending", "processing"] }, + }, + }); + + if (existingJob) { + console.log( + ` Skipping "${albumTitle}" - already in download queue` + ); + continue; + } + + // Create download job for this album + const now = new Date(); + const job = await prisma.downloadJob.create({ + data: { + userId, + subject: albumSubject, + type: "album", + targetMbid: albumMbid, + status: "pending", + metadata: { + downloadType, + rootFolderPath, + artistName, + artistMbid, + albumTitle, + batchId, // Link all albums in this artist download + batchArtist: artistName, + createdAt: now.toISOString(), // Track when job was created for timeout + }, + }, + }); + + jobs.push({ id: job.id, subject: albumSubject }); + console.log(` [JOB] Created job for: ${albumSubject}`); + + // Start the download in background + processDownload( + job.id, + "album", + albumMbid, + albumSubject, + rootFolderPath, + artistName, + albumTitle + ).catch((error) => { + console.error(`Download failed for ${albumSubject}:`, error); + }); + } + + console.log(` Created ${jobs.length} album download jobs`); + return jobs; + } catch (error: any) { + console.error(` Failed to process artist download:`, error.message); + throw error; + } +} + +// Background download processor +async function processDownload( + jobId: string, + type: string, + mbid: string, + subject: string, + rootFolderPath: string, + artistName?: string, + albumTitle?: string +) { + const job = await prisma.downloadJob.findUnique({ where: { id: jobId } }); + if (!job) { + console.error(`Job ${jobId} not found`); + return; + } + + if (type === "album") { + // For albums, use the simple download manager + let parsedArtist = artistName; + let parsedAlbum = albumTitle; + + if (!parsedArtist || !parsedAlbum) { + const parts = subject.split(" - "); + if (parts.length >= 2) { + parsedArtist = parts[0].trim(); + parsedAlbum = parts.slice(1).join(" - ").trim(); + } else { + parsedArtist = subject; + parsedAlbum = subject; + } + } + + console.log(`Parsed: Artist="${parsedArtist}", Album="${parsedAlbum}"`); + + // Use simple download manager for album downloads + const result = await simpleDownloadManager.startDownload( + jobId, + parsedArtist, + parsedAlbum, + mbid, + job.userId + ); + + if (!result.success) { + console.error(`Failed to start download: ${result.error}`); + } + } +} + +// DELETE /downloads/clear-all - Clear all download jobs for the current user +// IMPORTANT: Must be BEFORE /:id route to avoid catching "clear-all" as an ID +router.delete("/clear-all", async (req, res) => { + try { + const userId = req.user!.id; + const { status } = req.query; + + const where: any = { userId }; + if (status) { + where.status = status as string; + } + + const result = await prisma.downloadJob.deleteMany({ where }); + + console.log( + ` Cleared ${result.count} download jobs for user ${userId}` + ); + res.json({ success: true, deleted: result.count }); + } catch (error) { + console.error("Clear downloads error:", error); + res.status(500).json({ error: "Failed to clear downloads" }); + } +}); + +// POST /downloads/clear-lidarr-queue - Clear stuck/failed items from Lidarr's queue +router.post("/clear-lidarr-queue", async (req, res) => { + try { + const result = await simpleDownloadManager.clearLidarrQueue(); + res.json({ + success: true, + removed: result.removed, + errors: result.errors, + }); + } catch (error: any) { + console.error("Clear Lidarr queue error:", error); + res.status(500).json({ error: "Failed to clear Lidarr queue" }); + } +}); + +// GET /downloads/failed - List failed/unavailable albums for the current user +// IMPORTANT: Must be BEFORE /:id route to avoid catching "failed" as an ID +router.get("/failed", async (req, res) => { + try { + const userId = req.user!.id; + + const failedAlbums = await prisma.unavailableAlbum.findMany({ + where: { userId }, + orderBy: { createdAt: "desc" }, + }); + + res.json(failedAlbums); + } catch (error) { + console.error("List failed albums error:", error); + res.status(500).json({ error: "Failed to list failed albums" }); + } +}); + +// DELETE /downloads/failed/:id - Dismiss a failed album notification +router.delete("/failed/:id", async (req, res) => { + try { + const { id } = req.params; + const userId = req.user!.id; + + // Verify ownership before deleting + const failedAlbum = await prisma.unavailableAlbum.findFirst({ + where: { id, userId }, + }); + + if (!failedAlbum) { + return res.status(404).json({ error: "Failed album not found" }); + } + + await prisma.unavailableAlbum.delete({ + where: { id }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Delete failed album error:", error); + res.status(500).json({ error: "Failed to delete failed album" }); + } +}); + +// GET /downloads/:id - Get download job status +router.get("/:id", async (req, res) => { + try { + const { id } = req.params; + const userId = req.user!.id; + + const job = await prisma.downloadJob.findFirst({ + where: { + id, + userId, + }, + }); + + if (!job) { + return res.status(404).json({ error: "Download job not found" }); + } + + res.json(job); + } catch (error) { + console.error("Get download job error:", error); + res.status(500).json({ error: "Failed to get download job" }); + } +}); + +// PATCH /downloads/:id - Update download job (e.g., mark as complete) +router.patch("/:id", async (req, res) => { + try { + const { id } = req.params; + const userId = req.user!.id; + const { status } = req.body; + + const job = await prisma.downloadJob.findFirst({ + where: { + id, + userId, + }, + }); + + if (!job) { + return res.status(404).json({ error: "Download job not found" }); + } + + const updated = await prisma.downloadJob.update({ + where: { id }, + data: { + status: status || "completed", + completedAt: status === "completed" ? new Date() : undefined, + }, + }); + + res.json(updated); + } catch (error) { + console.error("Update download job error:", error); + res.status(500).json({ error: "Failed to update download job" }); + } +}); + +// DELETE /downloads/:id - Delete download job +router.delete("/:id", async (req, res) => { + try { + const { id } = req.params; + const userId = req.user!.id; + + // Use deleteMany to handle race conditions gracefully + // This won't throw an error if the record was already deleted + const result = await prisma.downloadJob.deleteMany({ + where: { + id, + userId, + }, + }); + + // Return success even if nothing was deleted (idempotent delete) + res.json({ success: true, deleted: result.count > 0 }); + } catch (error: any) { + console.error("Delete download job error:", error); + console.error("Error details:", error.message, error.stack); + res.status(500).json({ + error: "Failed to delete download job", + details: error.message, + }); + } +}); + +// GET /downloads - List user's download jobs +router.get("/", async (req, res) => { + try { + const userId = req.user!.id; + const { status, limit = "50", includeDiscovery = "false", includeCleared = "false" } = req.query; + + const where: any = { userId }; + if (status) { + where.status = status as string; + } + // Filter out cleared jobs by default (user dismissed from history) + if (includeCleared !== "true") { + where.cleared = false; + } + + const jobs = await prisma.downloadJob.findMany({ + where, + orderBy: { createdAt: "desc" }, + take: parseInt(limit as string, 10), + }); + + // Filter out discovery downloads unless explicitly requested + // Discovery downloads are automated and shouldn't show in the UI popover + const filteredJobs = + includeDiscovery === "true" + ? jobs + : jobs.filter((job) => { + const metadata = job.metadata as any; + return metadata?.downloadType !== "discovery"; + }); + + res.json(filteredJobs); + } catch (error) { + console.error("List download jobs error:", error); + res.status(500).json({ error: "Failed to list download jobs" }); + } +}); + +// POST /downloads/keep-track - Keep a discovery track (move to permanent library) +router.post("/keep-track", async (req, res) => { + try { + const { discoveryTrackId } = req.body; + const userId = req.user!.id; + + if (!discoveryTrackId) { + return res.status(400).json({ error: "Missing discoveryTrackId" }); + } + + const discoveryTrack = await prisma.discoveryTrack.findUnique({ + where: { id: discoveryTrackId }, + include: { + discoveryAlbum: true, + }, + }); + + if (!discoveryTrack) { + return res.status(404).json({ error: "Discovery track not found" }); + } + + // Mark as kept + await prisma.discoveryTrack.update({ + where: { id: discoveryTrackId }, + data: { userKept: true }, + }); + + // If Lidarr enabled, create job to download full album to permanent library + const lidarrEnabled = await lidarrService.isEnabled(); + if (lidarrEnabled) { + const job = await prisma.downloadJob.create({ + data: { + userId, + subject: `${discoveryTrack.discoveryAlbum.albumTitle} by ${discoveryTrack.discoveryAlbum.artistName}`, + type: "album", + targetMbid: discoveryTrack.discoveryAlbum.rgMbid, + status: "pending", + }, + }); + + return res.json({ + success: true, + message: + "Track marked as kept. Full album will be downloaded to permanent library.", + downloadJobId: job.id, + }); + } + + res.json({ + success: true, + message: + "Track marked as kept. Please add the full album manually to your /music folder.", + }); + } catch (error) { + console.error("Keep track error:", error); + res.status(500).json({ error: "Failed to keep track" }); + } +}); + +export default router; diff --git a/backend/src/routes/enrichment.ts b/backend/src/routes/enrichment.ts new file mode 100644 index 0000000..4ec57a7 --- /dev/null +++ b/backend/src/routes/enrichment.ts @@ -0,0 +1,293 @@ +import { Router } from "express"; +import { requireAuth, requireAdmin } from "../middleware/auth"; +import { enrichmentService } from "../services/enrichment"; +import { getEnrichmentProgress, runFullEnrichment } from "../workers/unifiedEnrichment"; + +const router = Router(); + +router.use(requireAuth); + +/** + * GET /enrichment/progress + * Get comprehensive enrichment progress (artists, track tags, audio analysis) + */ +router.get("/progress", async (req, res) => { + try { + const progress = await getEnrichmentProgress(); + res.json(progress); + } catch (error) { + console.error("Get enrichment progress error:", error); + res.status(500).json({ error: "Failed to get progress" }); + } +}); + +/** + * POST /enrichment/full + * Trigger full enrichment (re-enriches everything regardless of status) + * Admin only + */ +router.post("/full", requireAdmin, async (req, res) => { + try { + // This runs in the background + runFullEnrichment().catch(err => { + console.error("Full enrichment error:", err); + }); + + res.json({ + message: "Full enrichment started", + description: "All artists, track tags, and audio analysis will be re-processed" + }); + } catch (error) { + console.error("Trigger full enrichment error:", error); + res.status(500).json({ error: "Failed to start full enrichment" }); + } +}); + +/** + * GET /enrichment/settings + * Get enrichment settings for current user + */ +router.get("/settings", async (req, res) => { + try { + const userId = req.user!.id; + const settings = await enrichmentService.getSettings(userId); + res.json(settings); + } catch (error) { + console.error("Get enrichment settings error:", error); + res.status(500).json({ error: "Failed to get settings" }); + } +}); + +/** + * PUT /enrichment/settings + * Update enrichment settings for current user + */ +router.put("/settings", async (req, res) => { + try { + const userId = req.user!.id; + const settings = await enrichmentService.updateSettings(userId, req.body); + res.json(settings); + } catch (error) { + console.error("Update enrichment settings error:", error); + res.status(500).json({ error: "Failed to update settings" }); + } +}); + +/** + * POST /enrichment/artist/:id + * Enrich a single artist + */ +router.post("/artist/:id", async (req, res) => { + try { + const userId = req.user!.id; + const settings = await enrichmentService.getSettings(userId); + + if (!settings.enabled) { + return res.status(400).json({ error: "Enrichment is not enabled" }); + } + + const enrichmentData = await enrichmentService.enrichArtist(req.params.id, settings); + + if (!enrichmentData) { + return res.status(404).json({ error: "No enrichment data found" }); + } + + if (enrichmentData.confidence > 0.3) { + await enrichmentService.applyArtistEnrichment(req.params.id, enrichmentData); + } + + res.json({ + success: true, + confidence: enrichmentData.confidence, + data: enrichmentData, + }); + } catch (error: any) { + console.error("Enrich artist error:", error); + res.status(500).json({ error: error.message || "Failed to enrich artist" }); + } +}); + +/** + * POST /enrichment/album/:id + * Enrich a single album + */ +router.post("/album/:id", async (req, res) => { + try { + const userId = req.user!.id; + const settings = await enrichmentService.getSettings(userId); + + if (!settings.enabled) { + return res.status(400).json({ error: "Enrichment is not enabled" }); + } + + const enrichmentData = await enrichmentService.enrichAlbum(req.params.id, settings); + + if (!enrichmentData) { + return res.status(404).json({ error: "No enrichment data found" }); + } + + if (enrichmentData.confidence > 0.3) { + await enrichmentService.applyAlbumEnrichment(req.params.id, enrichmentData); + } + + res.json({ + success: true, + confidence: enrichmentData.confidence, + data: enrichmentData, + }); + } catch (error: any) { + console.error("Enrich album error:", error); + res.status(500).json({ error: error.message || "Failed to enrich album" }); + } +}); + +/** + * POST /enrichment/start + * Start library-wide enrichment (runs in background) + */ +router.post("/start", async (req, res) => { + try { + const userId = req.user!.id; + const { notificationService } = await import("../services/notificationService"); + + // Check if enrichment is enabled in system settings + const { prisma } = await import("../utils/db"); + const systemSettings = await prisma.systemSettings.findUnique({ + where: { id: "default" }, + select: { autoEnrichMetadata: true }, + }); + + if (!systemSettings?.autoEnrichMetadata) { + return res.status(400).json({ error: "Enrichment is not enabled. Enable it in settings first." }); + } + + // Get user enrichment settings or use defaults + const settings = await enrichmentService.getSettings(userId); + + // Override enabled flag with system setting + settings.enabled = true; + + // Send notification that enrichment is starting + await notificationService.notifySystem( + userId, + "Library Enrichment Started", + "Enriching artist metadata in the background..." + ); + + // Start enrichment in background + enrichmentService.enrichLibrary(userId).then(async () => { + // Send notification when complete + await notificationService.notifySystem( + userId, + "Library Enrichment Complete", + "All artist metadata has been enriched" + ); + }).catch(async (error) => { + console.error("Background enrichment failed:", error); + await notificationService.create({ + userId, + type: "error", + title: "Enrichment Failed", + message: error.message || "Failed to enrich library metadata", + }); + }); + + res.json({ + success: true, + message: "Library enrichment started in background", + }); + } catch (error: any) { + console.error("Start enrichment error:", error); + res.status(500).json({ error: error.message || "Failed to start enrichment" }); + } +}); + +/** + * PUT /library/artists/:id/metadata + * Update artist metadata manually + */ +router.put("/artists/:id/metadata", async (req, res) => { + try { + const { name, bio, genres, mbid, heroUrl } = req.body; + + const updateData: any = {}; + if (name) updateData.name = name; + if (bio) updateData.summary = bio; + if (mbid) updateData.mbid = mbid; + if (heroUrl) updateData.heroUrl = heroUrl; + if (genres) updateData.manualGenres = JSON.stringify(genres); + + // Mark as manually edited + updateData.manuallyEdited = true; + + const { prisma } = await import("../utils/db"); + const artist = await prisma.artist.update({ + where: { id: req.params.id }, + data: updateData, + include: { + albums: { + select: { + id: true, + title: true, + year: true, + coverUrl: true, + }, + }, + }, + }); + + res.json(artist); + } catch (error: any) { + console.error("Update artist metadata error:", error); + res.status(500).json({ error: error.message || "Failed to update artist" }); + } +}); + +/** + * PUT /library/albums/:id/metadata + * Update album metadata manually + */ +router.put("/albums/:id/metadata", async (req, res) => { + try { + const { title, year, genres, rgMbid, coverUrl } = req.body; + + const updateData: any = {}; + if (title) updateData.title = title; + if (year) updateData.year = parseInt(year); + if (rgMbid) updateData.rgMbid = rgMbid; + if (coverUrl) updateData.coverUrl = coverUrl; + if (genres) updateData.manualGenres = JSON.stringify(genres); + + // Mark as manually edited + updateData.manuallyEdited = true; + + const { prisma } = await import("../utils/db"); + const album = await prisma.album.update({ + where: { id: req.params.id }, + data: updateData, + include: { + artist: { + select: { + id: true, + name: true, + }, + }, + tracks: { + select: { + id: true, + title: true, + trackNo: true, + duration: true, + }, + }, + }, + }); + + res.json(album); + } catch (error: any) { + console.error("Update album metadata error:", error); + res.status(500).json({ error: error.message || "Failed to update album" }); + } +}); + +export default router; diff --git a/backend/src/routes/homepage.ts b/backend/src/routes/homepage.ts new file mode 100644 index 0000000..3f0e8b2 --- /dev/null +++ b/backend/src/routes/homepage.ts @@ -0,0 +1,187 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { redisClient } from "../utils/redis"; + +const router = Router(); + +// All routes require auth (session or API key) +router.use(requireAuthOrToken); + +/** + * GET /homepage/genres + * Get top genres from user's library with sample albums + */ +router.get("/genres", async (req, res) => { + try { + const { limit = "4" } = req.query; // Get top 4 genres by default + const limitNum = parseInt(limit as string, 10); + + // Check Redis cache first (cache for 24 hours) + const cacheKey = `homepage:genres:${limitNum}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(`[HOMEPAGE] Cache HIT for genres`); + return res.json(JSON.parse(cached)); + } + } catch (cacheError) { + console.warn("[HOMEPAGE] Redis cache read error:", cacheError); + } + + console.log( + `[HOMEPAGE] ✗ Cache MISS for genres, fetching from database...` + ); + + // Get all albums with genres (excluding discovery albums) + const albums = await prisma.album.findMany({ + where: { + genres: { + isEmpty: false, // Only albums with genres + }, + location: "LIBRARY", // Exclude discovery albums + }, + select: { + id: true, + title: true, + year: true, + coverUrl: true, + genres: true, + artistId: true, + artist: { + select: { + id: true, + name: true, + }, + }, + }, + }); + + // Count genre occurrences + const genreCounts = new Map(); + for (const album of albums) { + for (const genre of album.genres) { + genreCounts.set(genre, (genreCounts.get(genre) || 0) + 1); + } + } + + // Get top genres + const topGenres = Array.from(genreCounts.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, limitNum) + .map(([genre]) => genre); + + console.log(`[HOMEPAGE] Top genres: ${topGenres.join(", ")}`); + + // For each top genre, get sample albums (up to 10) + const genresWithAlbums = topGenres.map((genre) => { + const genreAlbums = albums + .filter((a) => a.genres.includes(genre)) + .slice(0, 10) + .map((a) => ({ + id: a.id, + title: a.title, + year: a.year, + coverArt: a.coverUrl, + artist: { + id: a.artist.id, + name: a.artist.name, + }, + })); + + return { + genre, + albums: genreAlbums, + totalCount: genreCounts.get(genre) || 0, + }; + }); + + // Cache for 24 hours + try { + await redisClient.setEx( + cacheKey, + 24 * 60 * 60, + JSON.stringify(genresWithAlbums) + ); + console.log(`[HOMEPAGE] Cached genres for 24 hours`); + } catch (cacheError) { + console.warn("[HOMEPAGE] Redis cache write error:", cacheError); + } + + res.json(genresWithAlbums); + } catch (error) { + console.error("Get homepage genres error:", error); + res.status(500).json({ error: "Failed to fetch genres" }); + } +}); + +/** + * GET /homepage/top-podcasts + * Get top podcasts (most subscribed or most recent episodes) + */ +router.get("/top-podcasts", async (req, res) => { + try { + const { limit = "6" } = req.query; // Get top 6 podcasts by default + const limitNum = parseInt(limit as string, 10); + + // Check Redis cache first (cache for 24 hours) + const cacheKey = `homepage:top-podcasts:${limitNum}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(`[HOMEPAGE] Cache HIT for top podcasts`); + return res.json(JSON.parse(cached)); + } + } catch (cacheError) { + console.warn("[HOMEPAGE] Redis cache read error:", cacheError); + } + + console.log( + `[HOMEPAGE] ✗ Cache MISS for top podcasts, fetching from database...` + ); + + // Get podcasts with episode counts + const podcasts = await prisma.podcast.findMany({ + take: limitNum, + orderBy: { createdAt: "desc" }, // Most recently added + select: { + id: true, + title: true, + author: true, + description: true, + imageUrl: true, + _count: { + select: { episodes: true }, + }, + }, + }); + + const result = podcasts.map((podcast) => ({ + id: podcast.id, + title: podcast.title, + author: podcast.author, + description: podcast.description?.substring(0, 150) + "...", + coverArt: podcast.imageUrl, + episodeCount: podcast._count.episodes, + })); + + // Cache for 24 hours + try { + await redisClient.setEx( + cacheKey, + 24 * 60 * 60, + JSON.stringify(result) + ); + console.log(`[HOMEPAGE] Cached top podcasts for 24 hours`); + } catch (cacheError) { + console.warn("[HOMEPAGE] Redis cache write error:", cacheError); + } + + res.json(result); + } catch (error) { + console.error("Get top podcasts error:", error); + res.status(500).json({ error: "Failed to fetch top podcasts" }); + } +}); + +export default router; diff --git a/backend/src/routes/library.ts b/backend/src/routes/library.ts new file mode 100644 index 0000000..34a0c12 --- /dev/null +++ b/backend/src/routes/library.ts @@ -0,0 +1,3852 @@ +import { Router, Response } from "express"; +import { requireAuth, requireAuthOrToken } from "../middleware/auth"; +import { imageLimiter, apiLimiter } from "../middleware/rateLimiter"; +import { lastFmService } from "../services/lastfm"; +import { prisma } from "../utils/db"; +import { getEnrichmentProgress } from "../workers/enrichment"; +import { redisClient } from "../utils/redis"; +import crypto from "crypto"; +import path from "path"; +import fs from "fs"; + +// Static imports for performance (avoid dynamic imports in hot paths) +import { config } from "../config"; +import { fanartService } from "../services/fanart"; +import { deezerService } from "../services/deezer"; +import { musicBrainzService } from "../services/musicbrainz"; +import { coverArtService } from "../services/coverArt"; +import { getSystemSettings } from "../utils/systemSettings"; +import { AudioStreamingService } from "../services/audioStreaming"; +import { scanQueue } from "../workers/queues"; +import { organizeSingles } from "../workers/organizeSingles"; +import { enrichSimilarArtist } from "../workers/artistEnrichment"; +import { extractColorsFromImage } from "../utils/colorExtractor"; +import { dataCacheService } from "../services/dataCache"; + +const router = Router(); + +const applyCoverArtCorsHeaders = (res: Response, origin?: string) => { + if (origin) { + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + } else { + res.setHeader("Access-Control-Allow-Origin", "*"); + } + res.setHeader("Cross-Origin-Resource-Policy", "cross-origin"); +}; + +// All routes require auth (session or API key) +router.use(requireAuthOrToken); + +// Apply API rate limiter to routes that need it +// Skip rate limiting for high-traffic endpoints (cover-art, streaming) +router.use((req, res, next) => { + // Skip rate limiting for cover-art endpoint (handled by imageLimiter separately) + if (req.path.startsWith("/cover-art")) { + return next(); + } + // Skip rate limiting for streaming endpoints - audio must not be interrupted + if (req.path.includes("/stream")) { + return next(); + } + // Apply API rate limiter to all other routes + return apiLimiter(req, res, next); +}); + +/** + * @openapi + * /library/scan: + * post: + * summary: Start a library scan job + * description: Initiates a background job to scan the music directory and index all audio files + * tags: [Library] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * responses: + * 200: + * description: Library scan started successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * example: "Library scan started" + * jobId: + * type: string + * description: Job ID to track progress + * example: "123" + * musicPath: + * type: string + * example: "/path/to/music" + * 500: + * description: Failed to start scan + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.post("/scan", async (req, res) => { + try { + + if (!config.music.musicPath) { + return res.status(500).json({ + error: "Music path not configured. Please set MUSIC_PATH environment variable.", + }); + } + + // First, organize any SLSKD downloads from Docker container to music library + // This ensures files are moved before the scan finds them + try { + const { organizeSingles } = await import("../workers/organizeSingles"); + console.log("[Scan] Organizing SLSKD downloads before scan..."); + await organizeSingles(); + console.log("[Scan] SLSKD organization complete"); + } catch (err: any) { + // Not a fatal error - SLSKD might not be running or have no files + console.log("[Scan] SLSKD organization skipped:", err.message); + } + + const userId = req.user?.id || "system"; + + // Add scan job to queue + const job = await scanQueue.add("scan", { + userId, + musicPath: config.music.musicPath, + }); + + res.json({ + message: "Library scan started", + jobId: job.id, + musicPath: config.music.musicPath, + }); + } catch (error) { + console.error("Scan trigger error:", error); + res.status(500).json({ error: "Failed to start scan" }); + } +}); + +// GET /library/scan/status/:jobId - Check scan job status +router.get("/scan/status/:jobId", async (req, res) => { + try { + const job = await scanQueue.getJob(req.params.jobId); + + if (!job) { + return res.status(404).json({ error: "Job not found" }); + } + + const state = await job.getState(); + const progress = job.progress(); + const result = job.returnvalue; + + res.json({ + status: state, + progress, + result, + }); + } catch (error) { + console.error("Get scan status error:", error); + res.status(500).json({ error: "Failed to get job status" }); + } +}); + +// POST /library/organize - Manually trigger organization script +router.post("/organize", async (req, res) => { + try { + + // Run in background + organizeSingles().catch((err) => { + console.error("Manual organization failed:", err); + }); + + res.json({ message: "Organization started in background" }); + } catch (error) { + console.error("Organization trigger error:", error); + res.status(500).json({ error: "Failed to start organization" }); + } +}); + +// POST /library/artists/:id/enrich - Manually enrich artist metadata +router.post("/artists/:id/enrich", async (req, res) => { + try { + const artist = await prisma.artist.findUnique({ + where: { id: req.params.id }, + }); + + if (!artist) { + return res.status(404).json({ error: "Artist not found" }); + } + + // Use enrichment functions + + // Run enrichment in background + enrichSimilarArtist(artist).catch((err) => { + console.error(`Failed to enrich artist ${artist.name}:`, err); + }); + + res.json({ message: "Artist enrichment started in background" }); + } catch (error) { + console.error("Enrich artist error:", error); + res.status(500).json({ error: "Failed to enrich artist" }); + } +}); + +// GET /library/enrichment-progress - Get enrichment worker progress +router.get("/enrichment-progress", async (req, res) => { + try { + const progress = await getEnrichmentProgress(); + res.json(progress); + } catch (error) { + console.error("Failed to get enrichment progress:", error); + res.status(500).json({ error: "Failed to get enrichment progress" }); + } +}); + +// POST /library/re-enrich-all - Re-enrich all artists with missing images (no auth required for convenience) +router.post("/re-enrich-all", async (req, res) => { + try { + // Reset all artists that have no heroUrl to "pending" + const result = await prisma.artist.updateMany({ + where: { + OR: [{ heroUrl: null }, { heroUrl: "" }], + }, + data: { + enrichmentStatus: "pending", + lastEnriched: null, + }, + }); + + console.log( + ` Reset ${result.count} artists with missing images to pending` + ); + + res.json({ + message: `Reset ${result.count} artists for re-enrichment`, + count: result.count, + }); + } catch (error) { + console.error("Failed to reset artists:", error); + res.status(500).json({ error: "Failed to reset artists" }); + } +}); + +// GET /library/recently-listened?limit=10 +router.get("/recently-listened", async (req, res) => { + try { + const { limit = "10" } = req.query; + const userId = req.user!.id; + const limitNum = parseInt(limit as string, 10); + + const [recentPlays, inProgressAudiobooks, inProgressPodcasts] = + await Promise.all([ + prisma.play.findMany({ + where: { + userId, + // Exclude pure discovery plays (only show library and kept discovery) + source: { in: ["LIBRARY", "DISCOVERY_KEPT"] }, + // Also filter by album location to exclude discovery albums + track: { + album: { + location: "LIBRARY", + }, + }, + }, + orderBy: { playedAt: "desc" }, + take: limitNum * 3, // Get more than needed to account for duplicates + include: { + track: { + include: { + album: { + include: { + artist: { + select: { + id: true, + mbid: true, + name: true, + heroUrl: true, + }, + }, + }, + }, + }, + }, + }, + }), + prisma.audiobookProgress.findMany({ + where: { + userId, + isFinished: false, + currentTime: { gt: 0 }, // Only show if actually started + }, + orderBy: { lastPlayedAt: "desc" }, + take: Math.ceil(limitNum / 3), // Get up to 1/3 for audiobooks + }), + prisma.podcastProgress.findMany({ + where: { + userId, + isFinished: false, + currentTime: { gt: 0 }, // Only show if actually started + }, + orderBy: { lastPlayedAt: "desc" }, + take: limitNum * 2, // Get extra to account for deduplication + include: { + episode: { + include: { + podcast: { + select: { + id: true, + title: true, + author: true, + imageUrl: true, + }, + }, + }, + }, + }, + }), + ]); + + // Deduplicate podcasts - keep only the most recently played episode per podcast + const seenPodcasts = new Set(); + const uniquePodcasts = inProgressPodcasts + .filter((pp) => { + const podcastId = pp.episode.podcast.id; + if (seenPodcasts.has(podcastId)) { + return false; + } + seenPodcasts.add(podcastId); + return true; + }) + .slice(0, Math.ceil(limitNum / 3)); // Limit to 1/3 after deduplication + + // Extract unique artists and audiobooks + const items: any[] = []; + const artistsMap = new Map(); + + // Add music artists + for (const play of recentPlays) { + const artist = play.track.album.artist; + if (!artistsMap.has(artist.id)) { + artistsMap.set(artist.id, { + ...artist, + type: "artist", + lastPlayedAt: play.playedAt, + }); + } + if (items.length >= limitNum) break; + } + + // Combine artists, audiobooks, and podcasts + const combined = [ + ...Array.from(artistsMap.values()), + ...inProgressAudiobooks.map((ab: any) => { + // For audiobooks, prefix the path with 'audiobook__' so the frontend knows to use the audiobook endpoint + const coverArt = + ab.coverUrl && !ab.coverUrl.startsWith("http") + ? `audiobook__${ab.coverUrl}` + : ab.coverUrl; + + return { + id: ab.audiobookshelfId, + name: ab.title, + coverArt, + type: "audiobook", + author: ab.author, + progress: + ab.duration > 0 + ? Math.round((ab.currentTime / ab.duration) * 100) + : 0, + lastPlayedAt: ab.lastPlayedAt, + }; + }), + ...uniquePodcasts.map((pp: any) => ({ + id: pp.episode.podcast.id, + episodeId: pp.episodeId, + name: pp.episode.podcast.title, + coverArt: pp.episode.podcast.imageUrl, + type: "podcast", + author: pp.episode.podcast.author, + progress: + pp.duration > 0 + ? Math.round((pp.currentTime / pp.duration) * 100) + : 0, + lastPlayedAt: pp.lastPlayedAt, + })), + ]; + + // Sort by lastPlayedAt and limit + combined.sort( + (a, b) => + new Date(b.lastPlayedAt).getTime() - + new Date(a.lastPlayedAt).getTime() + ); + const limitedItems = combined.slice(0, limitNum); + + // Get album counts for artists + const artistIds = limitedItems + .filter((item) => item.type === "artist") + .map((item) => item.id); + const albumCounts = await prisma.ownedAlbum.groupBy({ + by: ["artistId"], + where: { artistId: { in: artistIds } }, + _count: { rgMbid: true }, + }); + const albumCountMap = new Map( + albumCounts.map((ac) => [ac.artistId, ac._count.rgMbid]) + ); + + // Add on-demand image fetching for artists without heroUrl + const results = await Promise.all( + limitedItems.map(async (item) => { + if (item.type === "audiobook" || item.type === "podcast") { + return item; + } else { + let coverArt = item.heroUrl; + + // Fetch image on-demand if missing + if (!coverArt) { + console.log( + `[IMAGE] Fetching image on-demand for ${item.name}...` + ); + + // Check Redis cache first + const cacheKey = `hero-image:${item.id}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + coverArt = cached; + console.log(` Found cached image`); + } + } catch (err) { + // Redis errors are non-critical + } + + // Try Fanart.tv if we have real MBID + if ( + !coverArt && + item.mbid && + !item.mbid.startsWith("temp-") + ) { + try { + coverArt = await fanartService.getArtistImage( + item.mbid + ); + } catch (err) { + // Fanart.tv failed, continue to next source + } + } + + // Fallback to Deezer + if (!coverArt) { + try { + coverArt = await deezerService.getArtistImage( + item.name + ); + } catch (err) { + // Deezer failed, continue to next source + } + } + + // Fallback to Last.fm + if (!coverArt) { + try { + const validMbid = + item.mbid && !item.mbid.startsWith("temp-") + ? item.mbid + : undefined; + const lastfmInfo = + await lastFmService.getArtistInfo( + item.name, + validMbid + ); + + if ( + lastfmInfo.image && + lastfmInfo.image.length > 0 + ) { + const largestImage = + lastfmInfo.image.find( + (img: any) => + img.size === "extralarge" || + img.size === "mega" + ) || + lastfmInfo.image[ + lastfmInfo.image.length - 1 + ]; + + if (largestImage && largestImage["#text"]) { + coverArt = largestImage["#text"]; + console.log(` Found Last.fm image`); + } + } + } catch (err) { + // Last.fm failed, leave as null + } + } + + // Cache the result for 7 days + if (coverArt) { + try { + await redisClient.setEx( + cacheKey, + 7 * 24 * 60 * 60, + coverArt + ); + console.log(` Cached image for 7 days`); + } catch (err) { + // Redis errors are non-critical + } + } + } + + return { + ...item, + coverArt, + albumCount: albumCountMap.get(item.id) || 0, + }; + } + }) + ); + + res.json({ items: results }); + } catch (error) { + console.error("Get recently listened error:", error); + res.status(500).json({ error: "Failed to fetch recently listened" }); + } +}); + +// GET /library/recently-added?limit=10 +router.get("/recently-added", async (req, res) => { + try { + const { limit = "10" } = req.query; + const limitNum = parseInt(limit as string, 10); + + // Get the 20 most recently added LIBRARY albums (by lastSynced timestamp) + // This limits "Recently Added" to actual recent additions, not the entire library + const recentAlbums = await prisma.album.findMany({ + where: { + location: "LIBRARY", + tracks: { some: {} }, // Only albums with actual tracks + }, + orderBy: { lastSynced: "desc" }, + take: 20, // Hard limit to last 20 albums + include: { + artist: { + select: { + id: true, + mbid: true, + name: true, + heroUrl: true, + }, + }, + }, + }); + + // Extract unique artists from recent albums (preserving order of most recent) + const artistsMap = new Map(); + for (const album of recentAlbums) { + if (!artistsMap.has(album.artist.id)) { + artistsMap.set(album.artist.id, album.artist); + } + if (artistsMap.size >= limitNum) break; + } + + // Get album counts for each artist (only LIBRARY albums) + const artistIds = Array.from(artistsMap.keys()); + const albumCounts = await prisma.album.groupBy({ + by: ["artistId"], + where: { + artistId: { in: artistIds }, + location: "LIBRARY", + tracks: { some: {} }, + }, + _count: { id: true }, + }); + const albumCountMap = new Map( + albumCounts.map((ac) => [ac.artistId, ac._count.id]) + ); + + // ========== ON-DEMAND IMAGE FETCHING FOR RECENTLY ADDED ========== + // For artists without heroUrl, fetch images on-demand + const artistsWithImages = await Promise.all( + Array.from(artistsMap.values()).map(async (artist) => { + let coverArt = artist.heroUrl; + + if (!coverArt) { + console.log( + `[IMAGE] Fetching image on-demand for ${artist.name}...` + ); + + // Check Redis cache first + const cacheKey = `hero-image:${artist.id}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + coverArt = cached; + console.log(` Found cached image`); + } + } catch (err) { + // Redis errors are non-critical + } + + // Try Fanart.tv if we have real MBID + if ( + !coverArt && + artist.mbid && + !artist.mbid.startsWith("temp-") + ) { + try { + coverArt = await fanartService.getArtistImage( + artist.mbid + ); + } catch (err) { + // Fanart.tv failed, continue to next source + } + } + + // Fallback to Deezer + if (!coverArt) { + try { + coverArt = await deezerService.getArtistImage( + artist.name + ); + } catch (err) { + // Deezer failed, continue to next source + } + } + + // Fallback to Last.fm + if (!coverArt) { + try { + const validMbid = + artist.mbid && !artist.mbid.startsWith("temp-") + ? artist.mbid + : undefined; + const lastfmInfo = + await lastFmService.getArtistInfo( + artist.name, + validMbid + ); + + if ( + lastfmInfo.image && + lastfmInfo.image.length > 0 + ) { + const largestImage = + lastfmInfo.image.find( + (img: any) => + img.size === "extralarge" || + img.size === "mega" + ) || + lastfmInfo.image[ + lastfmInfo.image.length - 1 + ]; + + if (largestImage && largestImage["#text"]) { + coverArt = largestImage["#text"]; + console.log(` Found Last.fm image`); + } + } + } catch (err) { + // Last.fm failed, leave as null + } + } + + // Cache the result for 7 days + if (coverArt) { + try { + await redisClient.setEx( + cacheKey, + 7 * 24 * 60 * 60, + coverArt + ); + console.log(` Cached image for 7 days`); + } catch (err) { + // Redis errors are non-critical + } + } + } + + return { + ...artist, + coverArt, + albumCount: albumCountMap.get(artist.id) || 0, + }; + }) + ); + + res.json({ artists: artistsWithImages }); + } catch (error) { + console.error("Get recently added error:", error); + res.status(500).json({ error: "Failed to fetch recently added" }); + } +}); + +// GET /library/artists?query=&limit=&offset=&filter=owned|discovery|all +router.get("/artists", async (req, res) => { + try { + const { + query = "", + limit: limitParam = "500", + offset: offsetParam = "0", + filter = "owned", // owned (default), discovery, all + } = req.query; + const limit = Math.min(parseInt(limitParam as string, 10) || 500, 1000); // Max 1000 + const offset = parseInt(offsetParam as string, 10) || 0; + + // Build where clause based on filter + let where: any = { + albums: { + some: { + tracks: { some: {} }, // Only artists with albums that have actual tracks + }, + }, + }; + + if (filter === "owned") { + // Artists with at least 1 LIBRARY album OR an OwnedAlbum record (liked discovery) + where.OR = [ + { + albums: { + some: { + location: "LIBRARY", + tracks: { some: {} }, + }, + }, + }, + { + // Include artists with OwnedAlbum records (includes liked discovery albums) + ownedAlbums: { + some: {}, + }, + albums: { + some: { + tracks: { some: {} }, + }, + }, + }, + ]; + } else if (filter === "discovery") { + // Artists with ONLY DISCOVERY albums (no LIBRARY albums) + where = { + AND: [ + { + albums: { + some: { + location: "DISCOVER", + tracks: { some: {} }, + }, + }, + }, + { + albums: { + none: { + location: "LIBRARY", + }, + }, + }, + ], + }; + } + // filter === "all" uses the default (any albums with tracks) + + if (query) { + if (where.AND) { + where.AND.push({ name: { contains: query as string, mode: "insensitive" } }); + } else { + where.name = { contains: query as string, mode: "insensitive" }; + } + } + + // Determine which album location to count based on filter + const albumLocationFilter = filter === "discovery" ? "DISCOVER" : filter === "all" ? undefined : "LIBRARY"; + + const [artistsWithAlbums, total] = await Promise.all([ + prisma.artist.findMany({ + where, + skip: offset, + take: limit, + orderBy: { name: "asc" }, + select: { + id: true, + mbid: true, + name: true, + heroUrl: true, + albums: { + where: { + ...(albumLocationFilter ? { location: albumLocationFilter } : {}), + tracks: { some: {} }, + }, + select: { + id: true, + }, + }, + }, + }), + prisma.artist.count({ where }), + ]); + + // Use DataCacheService for batch image lookup (DB + Redis, no API calls for lists) + const imageMap = await dataCacheService.getArtistImagesBatch( + artistsWithAlbums.map((a) => ({ id: a.id, heroUrl: a.heroUrl })) + ); + + const artistsWithImages = artistsWithAlbums.map((artist) => { + const coverArt = imageMap.get(artist.id) || artist.heroUrl || null; + return { + id: artist.id, + mbid: artist.mbid, + name: artist.name, + heroUrl: coverArt, + coverArt, // Alias for frontend consistency + albumCount: artist.albums.length, + }; + }); + + res.json({ + artists: artistsWithImages, + total, + offset, + limit, + }); + } catch (error: any) { + console.error("[Library] Get artists error:", error?.message || error); + console.error("[Library] Stack:", error?.stack); + res.status(500).json({ + error: "Failed to fetch artists", + details: error?.message, + }); + } +}); + +// GET /library/enrichment-diagnostics - Debug why artist images aren't populating +router.get("/enrichment-diagnostics", async (req, res) => { + try { + // Get enrichment status breakdown + const statusCounts = await prisma.artist.groupBy({ + by: ["enrichmentStatus"], + _count: true, + }); + + // Get artists that completed enrichment but have no heroUrl + const completedNoImage = await prisma.artist.count({ + where: { + enrichmentStatus: "completed", + OR: [{ heroUrl: null }, { heroUrl: "" }], + }, + }); + + // Get artists with temp MBIDs (can't use Fanart.tv) + const tempMbidCount = await prisma.artist.count({ + where: { + mbid: { startsWith: "temp-" }, + }, + }); + + // Sample of artists with issues + const problemArtists = await prisma.artist.findMany({ + where: { + enrichmentStatus: "completed", + OR: [{ heroUrl: null }, { heroUrl: "" }], + }, + select: { + id: true, + name: true, + mbid: true, + enrichmentStatus: true, + lastEnriched: true, + }, + take: 10, + }); + + // Sample of failed artists + const failedArtists = await prisma.artist.findMany({ + where: { + enrichmentStatus: "failed", + }, + select: { + id: true, + name: true, + mbid: true, + lastEnriched: true, + }, + take: 10, + }); + + res.json({ + summary: { + statusBreakdown: statusCounts.reduce((acc, s) => { + acc[s.enrichmentStatus || "unknown"] = s._count; + return acc; + }, {} as Record), + completedWithoutImage: completedNoImage, + tempMbidArtists: tempMbidCount, + }, + problemArtists, + failedArtists, + suggestions: [ + completedNoImage > 0 ? `${completedNoImage} artists completed enrichment but have no image - external APIs may be failing or rate limited` : null, + tempMbidCount > 0 ? `${tempMbidCount} artists have temp MBIDs - Fanart.tv won't work for them, relies on Deezer/Last.fm` : null, + statusCounts.find(s => s.enrichmentStatus === "pending")?._count ? "Enrichment still in progress - check logs" : null, + statusCounts.find(s => s.enrichmentStatus === "failed")?._count ? "Some artists failed enrichment - may need retry" : null, + ].filter(Boolean), + }); + } catch (error: any) { + console.error("[Library] Enrichment diagnostics error:", error?.message); + res.status(500).json({ error: "Failed to get diagnostics" }); + } +}); + +// POST /library/retry-enrichment - Retry failed enrichments +router.post("/retry-enrichment", async (req, res) => { + try { + // Reset failed artists to pending so worker picks them up + const result = await prisma.artist.updateMany({ + where: { enrichmentStatus: "failed" }, + data: { enrichmentStatus: "pending" }, + }); + + res.json({ + message: `Reset ${result.count} failed artists to pending`, + count: result.count + }); + } catch (error: any) { + console.error("[Library] Retry enrichment error:", error?.message); + res.status(500).json({ error: "Failed to retry enrichment" }); + } +}); + +// GET /library/artists/:id +router.get("/artists/:id", async (req, res) => { + try { + const idParam = req.params.id; + + const artistInclude = { + albums: { + orderBy: { year: "desc" }, + include: { + tracks: { + orderBy: { trackNo: "asc" }, + take: 10, // Top tracks + include: { + album: { + select: { + id: true, + title: true, + coverUrl: true, + }, + }, + }, + }, + }, + }, + ownedAlbums: true, + similarFrom: { + where: { + weight: { + gte: 0.1, // Only show 10%+ similarity (Last.fm match score) + }, + }, + take: 10, + orderBy: { weight: "desc" }, + include: { + toArtist: { + select: { + id: true, + mbid: true, + name: true, + heroUrl: true, + }, + }, + }, + }, + }; + + // Try finding by ID first + let artist = await prisma.artist.findUnique({ + where: { id: idParam }, + include: artistInclude, + }); + + // If not found by ID, try by name (for URL-encoded names) + if (!artist) { + const decodedName = decodeURIComponent(idParam); + artist = await prisma.artist.findFirst({ + where: { + name: { + equals: decodedName, + mode: "insensitive", + }, + }, + include: artistInclude, + }); + } + + // If not found and param looks like an MBID, try looking up by MBID + if ( + !artist && + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test( + idParam + ) + ) { + artist = await prisma.artist.findFirst({ + where: { mbid: idParam }, + include: artistInclude, + }); + } + + if (!artist) { + return res.status(404).json({ error: "Artist not found" }); + } + + // ========== DISCOGRAPHY HANDLING ========== + // For enriched artists with ownedAlbums, skip expensive MusicBrainz calls + // Only fetch from MusicBrainz if the artist hasn't been enriched yet + let albumsWithOwnership = []; + const ownedRgMbids = new Set(artist.ownedAlbums.map((o) => o.rgMbid)); + const isEnriched = artist.ownedAlbums.length > 0 || artist.heroUrl !== null; + + // If artist has temp MBID, try to find real MBID by searching MusicBrainz + let effectiveMbid = artist.mbid; + if (!effectiveMbid || effectiveMbid.startsWith("temp-")) { + console.log( + ` Artist has temp/no MBID, searching MusicBrainz for ${artist.name}...` + ); + try { + const searchResults = await musicBrainzService.searchArtist( + artist.name, + 1 + ); + if (searchResults.length > 0) { + effectiveMbid = searchResults[0].id; + console.log(` Found MBID: ${effectiveMbid}`); + + // Update database with real MBID for future use (skip if duplicate) + try { + await prisma.artist.update({ + where: { id: artist.id }, + data: { mbid: effectiveMbid }, + }); + } catch (mbidError: any) { + // If MBID already exists for another artist, just log and continue + if (mbidError.code === "P2002") { + console.log( + `MBID ${effectiveMbid} already exists for another artist, skipping update` + ); + } else { + console.error( + ` ✗ Failed to update MBID:`, + mbidError + ); + } + } + } else { + console.log( + ` ✗ No MusicBrainz match found for ${artist.name}` + ); + } + } catch (error) { + console.error(` ✗ MusicBrainz search failed:`, error); + } + } + + // ========== ALWAYS include albums from database (actual owned files) ========== + // These are albums with actual tracks on disk - they MUST show as owned + const dbAlbums = artist.albums.map((album) => ({ + ...album, + owned: true, // If it's in the database with tracks, user owns it! + coverArt: album.coverUrl, + source: "database" as const, + })); + + console.log( + `[Artist] Found ${dbAlbums.length} albums from database (actual owned files)` + ); + + // ========== Supplement with MusicBrainz discography for "available to download" ========== + // Always fetch discography if we have a valid MBID - users need to see what's available + const hasDbAlbums = dbAlbums.length > 0; + const shouldFetchDiscography = effectiveMbid && !effectiveMbid.startsWith("temp-"); + + if (shouldFetchDiscography) { + try { + // Check Redis cache first (cache for 24 hours) + const discoCacheKey = `discography:${effectiveMbid}`; + let releaseGroups: any[] = []; + + const cachedDisco = await redisClient.get(discoCacheKey); + if (cachedDisco && cachedDisco !== "NOT_FOUND") { + releaseGroups = JSON.parse(cachedDisco); + console.log(`[Artist] Using cached discography (${releaseGroups.length} albums)`); + } else { + console.log(`[Artist] Fetching discography from MusicBrainz...`); + releaseGroups = await musicBrainzService.getReleaseGroups( + effectiveMbid, + ["album", "ep"], + 100 + ); + // Cache for 24 hours + await redisClient.setEx(discoCacheKey, 24 * 60 * 60, JSON.stringify(releaseGroups)); + } + + console.log( + ` Got ${releaseGroups.length} albums from MusicBrainz (before filtering)` + ); + + // Filter out live albums, compilations, soundtracks, remixes, etc. + const excludedSecondaryTypes = [ + "Live", + "Compilation", + "Soundtrack", + "Remix", + "DJ-mix", + "Mixtape/Street", + "Demo", + "Interview", + "Audio drama", + "Audiobook", + "Spokenword", + ]; + + const filteredReleaseGroups = releaseGroups.filter( + (rg: any) => { + // Keep if no secondary types (pure studio album/EP) + if ( + !rg["secondary-types"] || + rg["secondary-types"].length === 0 + ) { + return true; + } + // Exclude if any secondary type matches our exclusion list + return !rg["secondary-types"].some((type: string) => + excludedSecondaryTypes.includes(type) + ); + } + ); + + console.log( + ` Filtered to ${filteredReleaseGroups.length} studio albums/EPs` + ); + + // Transform MusicBrainz release groups to album format + // PERFORMANCE: Only check Redis cache for covers, don't make API calls + // This makes artist pages load instantly after the first visit + const mbAlbums = await Promise.all( + filteredReleaseGroups.map(async (rg: any) => { + let coverUrl = null; + + // Only check Redis cache - don't make external API calls + // Covers will be fetched lazily by the frontend or during enrichment + const cacheKey = `caa:${rg.id}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached && cached !== "NOT_FOUND") { + coverUrl = cached; + } + } catch (err) { + // Redis error, continue without cover + } + + return { + id: rg.id, + rgMbid: rg.id, + title: rg.title, + year: rg["first-release-date"] + ? parseInt( + rg["first-release-date"].substring(0, 4) + ) + : null, + type: rg["primary-type"], + coverUrl, + coverArt: coverUrl, + artistId: artist.id, + owned: ownedRgMbids.has(rg.id), + trackCount: 0, + tracks: [], + source: "musicbrainz" as const, + }; + }) + ); + + // Merge database albums with MusicBrainz albums + // Database albums take precedence (they have actual files!) + const dbAlbumTitles = new Set( + dbAlbums.map((a) => a.title.toLowerCase()) + ); + const mbAlbumsFiltered = mbAlbums.filter( + (a) => !dbAlbumTitles.has(a.title.toLowerCase()) + ); + + albumsWithOwnership = [...dbAlbums, ...mbAlbumsFiltered]; + + console.log( + ` Total albums: ${albumsWithOwnership.length} (${dbAlbums.length} owned from database, ${mbAlbumsFiltered.length} from MusicBrainz)` + ); + console.log( + ` Owned: ${ + albumsWithOwnership.filter((a) => a.owned).length + }, Available: ${ + albumsWithOwnership.filter((a) => !a.owned).length + }` + ); + } catch (error) { + console.error( + `Failed to fetch MusicBrainz discography:`, + error + ); + // Just use database albums + albumsWithOwnership = dbAlbums; + } + } else { + // No valid MBID - just use database albums + console.log( + `[Artist] No valid MBID, using ${dbAlbums.length} albums from database` + ); + albumsWithOwnership = dbAlbums; + } + + // Extract top tracks from library first + const allTracks = artist.albums.flatMap((a) => a.tracks); + let topTracks = allTracks + .sort((a, b) => (b.playCount || 0) - (a.playCount || 0)) + .slice(0, 10); + + // Get user play counts for all tracks + const userId = req.user!.id; + const trackIds = allTracks.map((t) => t.id); + const userPlays = await prisma.play.groupBy({ + by: ["trackId"], + where: { + userId, + trackId: { in: trackIds }, + }, + _count: { + id: true, + }, + }); + const userPlayCounts = new Map( + userPlays.map((p) => [p.trackId, p._count.id]) + ); + + // Fetch Last.fm top tracks (cached for 24 hours) + const topTracksCacheKey = `top-tracks:${artist.id}`; + try { + // Check cache first + const cachedTopTracks = await redisClient.get(topTracksCacheKey); + let lastfmTopTracks: any[] = []; + + if (cachedTopTracks && cachedTopTracks !== "NOT_FOUND") { + lastfmTopTracks = JSON.parse(cachedTopTracks); + console.log(`[Artist] Using cached top tracks (${lastfmTopTracks.length})`); + } else { + // Cache miss - fetch from Last.fm + const validMbid = + effectiveMbid && !effectiveMbid.startsWith("temp-") + ? effectiveMbid + : ""; + lastfmTopTracks = await lastFmService.getArtistTopTracks( + validMbid, + artist.name, + 10 + ); + // Cache for 24 hours + await redisClient.setEx(topTracksCacheKey, 24 * 60 * 60, JSON.stringify(lastfmTopTracks)); + console.log(`[Artist] Cached ${lastfmTopTracks.length} top tracks`); + } + + // For each Last.fm track, try to match with library track or add as unowned + const combinedTracks: any[] = []; + + for (const lfmTrack of lastfmTopTracks) { + // Try to find matching track in library + const matchedTrack = allTracks.find( + (t) => t.title.toLowerCase() === lfmTrack.name.toLowerCase() + ); + + if (matchedTrack) { + // Track exists in library - include user play count + combinedTracks.push({ + ...matchedTrack, + playCount: lfmTrack.playcount + ? parseInt(lfmTrack.playcount) + : matchedTrack.playCount, + listeners: lfmTrack.listeners + ? parseInt(lfmTrack.listeners) + : 0, + userPlayCount: userPlayCounts.get(matchedTrack.id) || 0, + album: { + ...matchedTrack.album, + coverArt: matchedTrack.album.coverUrl, + }, + }); + } else { + // Track NOT in library - add as preview-only track + combinedTracks.push({ + id: `lastfm-${artist.mbid || artist.name}-${ + lfmTrack.name + }`, + title: lfmTrack.name, + playCount: lfmTrack.playcount + ? parseInt(lfmTrack.playcount) + : 0, + listeners: lfmTrack.listeners + ? parseInt(lfmTrack.listeners) + : 0, + duration: lfmTrack.duration + ? Math.floor(parseInt(lfmTrack.duration) / 1000) + : 0, + url: lfmTrack.url, + album: { + title: lfmTrack.album?.["#text"] || "Unknown Album", + }, + userPlayCount: 0, + // NO album.id - this indicates track is not in library + }); + } + } + + topTracks = combinedTracks.slice(0, 10); + } catch (error) { + console.error( + `Failed to get Last.fm top tracks for ${artist.name}:`, + error + ); + // If Last.fm fails, add user play counts to library tracks + topTracks = topTracks.map((t) => ({ + ...t, + userPlayCount: userPlayCounts.get(t.id) || 0, + album: { + ...t.album, + coverArt: t.album.coverUrl, + }, + })); + } + + // ========== HERO IMAGE FETCHING ========== + // Use DataCacheService: DB -> Redis -> API -> save to both + const heroUrl = await dataCacheService.getArtistImage( + artist.id, + artist.name, + effectiveMbid + ); + + // ========== ON-DEMAND SIMILAR ARTISTS FETCHING ========== + let similarArtists: any[] = []; + const similarCacheKey = `similar-artists:${artist.id}`; + + if (artist.similarFrom.length === 0) { + // Check Redis cache first (24-hour cache) + const cachedSimilar = await redisClient.get(similarCacheKey); + if (cachedSimilar && cachedSimilar !== "NOT_FOUND") { + similarArtists = JSON.parse(cachedSimilar); + console.log(`[Artist] Using cached similar artists (${similarArtists.length})`); + } else { + // Cache miss - fetch from Last.fm + console.log(`[Artist] Fetching similar artists from Last.fm...`); + + try { + const validMbid = + effectiveMbid && !effectiveMbid.startsWith("temp-") + ? effectiveMbid + : undefined; + const lastfmSimilar = await lastFmService.getSimilarArtists( + validMbid, + artist.name, + 10 + ); + + // Fetch images in parallel (Deezer only - fastest source) + const similarWithImages = await Promise.all( + lastfmSimilar.map(async (s: any) => { + let image = null; + try { + image = await deezerService.getArtistImage(s.name); + } catch (err) { + // Deezer failed, leave null + } + + return { + id: s.name, + name: s.name, + mbid: s.mbid || null, + coverArt: image, + albumCount: 0, + ownedAlbumCount: 0, + weight: s.match, + }; + }) + ); + + similarArtists = similarWithImages; + + // Cache for 24 hours + await redisClient.setEx(similarCacheKey, 24 * 60 * 60, JSON.stringify(similarArtists)); + console.log(`[Artist] Cached ${similarArtists.length} similar artists`); + } catch (error) { + console.error(`[Artist] Failed to fetch similar artists:`, error); + similarArtists = []; + } + } + } else { + // Use enriched data from database + console.log( + `[Artist] Using ${artist.similarFrom.length} similar artists from database` + ); + + // Format similar artists with coverArt and album counts + const similarArtistIds = artist.similarFrom.map( + (s) => s.toArtist.id + ); + + console.log( + `Fetching album counts for ${similarArtistIds.length} similar artists...` + ); + + // Count TOTAL albums in discography (from Album - enriched MusicBrainz data) + const discographyCounts = await prisma.album.groupBy({ + by: ["artistId"], + where: { artistId: { in: similarArtistIds } }, + _count: { rgMbid: true }, + }); + const discographyCountMap = new Map( + discographyCounts.map((ac) => [ac.artistId, ac._count.rgMbid]) + ); + console.log( + `Discography counts: ${discographyCountMap.size} artists have albums` + ); + + // Count albums USER OWNS (from OwnedAlbum - tracking table) + const userLibraryCounts = await prisma.ownedAlbum.groupBy({ + by: ["artistId"], + where: { artistId: { in: similarArtistIds } }, + _count: { rgMbid: true }, + }); + const userLibraryCountMap = new Map( + userLibraryCounts.map((ac) => [ac.artistId, ac._count.rgMbid]) + ); + console.log( + `User library counts: ${userLibraryCountMap.size} artists are owned` + ); + + // Use DataCacheService for batch image lookup + const similarImageMap = await dataCacheService.getArtistImagesBatch( + artist.similarFrom.map((s) => ({ + id: s.toArtist.id, + heroUrl: s.toArtist.heroUrl, + })) + ); + + similarArtists = artist.similarFrom.map((s) => { + const albumCount = discographyCountMap.get(s.toArtist.id) || 0; + const ownedAlbumCount = userLibraryCountMap.get(s.toArtist.id) || 0; + const coverArt = similarImageMap.get(s.toArtist.id) || s.toArtist.heroUrl || null; + + return { + ...s.toArtist, + coverArt, + albumCount, + ownedAlbumCount, + weight: s.weight, + }; + }); + } + + res.json({ + ...artist, + coverArt: heroUrl, // Use fetched hero image (falls back to artist.heroUrl) + albums: albumsWithOwnership, + topTracks, + similarArtists, + }); + } catch (error) { + console.error("Get artist error:", error); + res.status(500).json({ error: "Failed to fetch artist" }); + } +}); + +// GET /library/albums?artistId=&limit=&offset=&filter=owned|discovery|all +router.get("/albums", async (req, res) => { + try { + const { + artistId, + limit: limitParam = "500", + offset: offsetParam = "0", + filter = "owned", // owned (default), discovery, all + } = req.query; + const limit = Math.min(parseInt(limitParam as string, 10) || 500, 1000); // Max 1000 + const offset = parseInt(offsetParam as string, 10) || 0; + + let where: any = { + tracks: { some: {} }, // Only albums with tracks + }; + + // Apply location filter + if (filter === "owned") { + // Get all owned album rgMbids (includes liked discovery albums) + const ownedAlbumMbids = await prisma.ownedAlbum.findMany({ + select: { rgMbid: true }, + }); + const ownedMbids = ownedAlbumMbids.map(oa => oa.rgMbid); + + // Albums with LIBRARY location OR rgMbid in OwnedAlbum + where.OR = [ + { location: "LIBRARY", tracks: { some: {} } }, + { rgMbid: { in: ownedMbids }, tracks: { some: {} } }, + ]; + } else if (filter === "discovery") { + where.location = "DISCOVER"; + } + // filter === "all" shows all locations + + // If artistId is provided, filter by artist + if (artistId) { + if (where.OR) { + // If we have OR conditions, wrap with AND + where = { + AND: [ + { OR: where.OR }, + { artistId: artistId as string } + ] + }; + } else { + where.artistId = artistId as string; + } + } + + const [albumsData, total] = await Promise.all([ + prisma.album.findMany({ + where, + skip: offset, + take: limit, + orderBy: { year: "desc" }, + include: { + artist: { + select: { + id: true, + mbid: true, + name: true, + }, + }, + }, + }), + prisma.album.count({ where }), + ]); + + // Normalize coverArt field for frontend + const albums = albumsData.map((album) => ({ + ...album, + coverArt: album.coverUrl, + })); + + res.json({ + albums, + total, + offset, + limit, + }); + } catch (error: any) { + console.error("[Library] Get albums error:", error?.message || error); + console.error("[Library] Stack:", error?.stack); + res.status(500).json({ + error: "Failed to fetch albums", + details: error?.message, + }); + } +}); + +// GET /library/albums/:id +router.get("/albums/:id", async (req, res) => { + try { + const idParam = req.params.id; + + // Try finding by ID first + let album = await prisma.album.findUnique({ + where: { id: idParam }, + include: { + artist: { + select: { + id: true, + mbid: true, + name: true, + }, + }, + tracks: { + orderBy: { trackNo: "asc" }, + }, + }, + }); + + // If not found by ID, try by rgMbid (for discovery albums) + if (!album) { + album = await prisma.album.findFirst({ + where: { rgMbid: idParam }, + include: { + artist: { + select: { + id: true, + mbid: true, + name: true, + }, + }, + tracks: { + orderBy: { trackNo: "asc" }, + }, + }, + }); + } + + if (!album) { + return res.status(404).json({ error: "Album not found" }); + } + + // Check ownership + const owned = await prisma.ownedAlbum.findUnique({ + where: { + artistId_rgMbid: { + artistId: album.artistId, + rgMbid: album.rgMbid, + }, + }, + }); + + res.json({ + ...album, + owned: !!owned, + coverArt: album.coverUrl, + }); + } catch (error) { + console.error("Get album error:", error); + res.status(500).json({ error: "Failed to fetch album" }); + } +}); + +// GET /library/tracks?albumId=&limit=100 +router.get("/tracks", async (req, res) => { + try { + const { albumId, limit = "100" } = req.query; + const limitNum = parseInt(limit as string, 10); + + const where: any = {}; + if (albumId) { + where.albumId = albumId as string; + } + + const tracksData = await prisma.track.findMany({ + where, + take: limitNum, + orderBy: albumId ? { trackNo: "asc" } : { id: "desc" }, + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + }, + }, + }, + }, + }, + }); + + // Add coverArt field to albums + const tracks = tracksData.map((track) => ({ + ...track, + album: { + ...track.album, + coverArt: track.album.coverUrl, + }, + })); + + res.json({ tracks }); + } catch (error) { + console.error("Get tracks error:", error); + res.status(500).json({ error: "Failed to fetch tracks" }); + } +}); + +// GET /library/cover-art/:id?size= or GET /library/cover-art?url=&size= +// Apply lenient image limiter (500 req/min) instead of general API limiter (100 req/15min) +router.get("/cover-art/:id?", imageLimiter, async (req, res) => { + try { + const { size, url } = req.query; + let coverUrl: string; + let isAudiobook = false; + + // Check if a full URL was provided as a query parameter + if (url) { + const decodedUrl = decodeURIComponent(url as string); + + // Check if this is an audiobook cover (prefixed with "audiobook__") + if (decodedUrl.startsWith("audiobook__")) { + isAudiobook = true; + const audiobookPath = decodedUrl.replace("audiobook__", ""); + + // Get Audiobookshelf settings + const settings = await getSystemSettings(); + const audiobookshelfUrl = + settings?.audiobookshelfUrl || + process.env.AUDIOBOOKSHELF_URL || + ""; + const audiobookshelfApiKey = + settings?.audiobookshelfApiKey || + process.env.AUDIOBOOKSHELF_API_KEY || + ""; + const audiobookshelfBaseUrl = audiobookshelfUrl.replace( + /\/$/, + "" + ); + + coverUrl = `${audiobookshelfBaseUrl}/api/${audiobookPath}`; + + // Fetch with authentication + console.log( + `[COVER-ART] Fetching audiobook cover: ${coverUrl.substring( + 0, + 100 + )}...` + ); + const imageResponse = await fetch(coverUrl, { + headers: { + Authorization: `Bearer ${audiobookshelfApiKey}`, + "User-Agent": "Lidify/1.0", + }, + }); + + if (!imageResponse.ok) { + console.error( + `[COVER-ART] Failed to fetch audiobook cover: ${coverUrl} (${imageResponse.status} ${imageResponse.statusText})` + ); + return res + .status(404) + .json({ error: "Audiobook cover art not found" }); + } + + const buffer = await imageResponse.arrayBuffer(); + const imageBuffer = Buffer.from(buffer); + const contentType = imageResponse.headers.get("content-type"); + + if (contentType) { + res.setHeader("Content-Type", contentType); + } + applyCoverArtCorsHeaders( + res, + req.headers.origin as string | undefined + ); + res.setHeader( + "Cache-Control", + "public, max-age=31536000, immutable" + ); + + return res.send(imageBuffer); + } + + // Check if this is a native cover (prefixed with "native:") + if (decodedUrl.startsWith("native:")) { + const nativePath = decodedUrl.replace("native:", ""); + + const coverCachePath = path.join( + config.music.transcodeCachePath, + "../covers", + nativePath + ); + + console.log( + `[COVER-ART] Serving native cover: ${coverCachePath}` + ); + + // Check if file exists + if (!fs.existsSync(coverCachePath)) { + console.error( + `[COVER-ART] Native cover not found: ${coverCachePath}` + ); + return res + .status(404) + .json({ error: "Cover art not found" }); + } + + // Serve the file directly + const requestOrigin = req.headers.origin; + const headers: Record = { + "Content-Type": "image/jpeg", // Assume JPEG for now + "Cache-Control": "public, max-age=31536000, immutable", + "Cross-Origin-Resource-Policy": "cross-origin", + }; + if (requestOrigin) { + headers["Access-Control-Allow-Origin"] = requestOrigin; + headers["Access-Control-Allow-Credentials"] = "true"; + } else { + headers["Access-Control-Allow-Origin"] = "*"; + } + + return res.sendFile(coverCachePath, { + headers, + }); + } + + coverUrl = decodedUrl; + } else { + // Otherwise use the ID from the path parameter + const coverId = req.params.id; + if (!coverId) { + return res + .status(400) + .json({ error: "No cover ID or URL provided" }); + } + + const decodedId = decodeURIComponent(coverId); + + // Check if this is a native cover (prefixed with "native:") + if (decodedId.startsWith("native:")) { + const nativePath = decodedId.replace("native:", ""); + + const coverCachePath = path.join( + config.music.transcodeCachePath, + "../covers", + nativePath + ); + + // Check if file exists + if (fs.existsSync(coverCachePath)) { + // Serve the file directly + const requestOrigin = req.headers.origin; + const headers: Record = { + "Content-Type": "image/jpeg", + "Cache-Control": "public, max-age=31536000, immutable", + "Cross-Origin-Resource-Policy": "cross-origin", + }; + if (requestOrigin) { + headers["Access-Control-Allow-Origin"] = requestOrigin; + headers["Access-Control-Allow-Credentials"] = "true"; + } else { + headers["Access-Control-Allow-Origin"] = "*"; + } + + return res.sendFile(coverCachePath, { + headers, + }); + } + + // Native cover file missing - try to find album and fetch from Deezer + console.warn( + `[COVER-ART] Native cover not found: ${coverCachePath}, trying Deezer fallback` + ); + + // Extract album ID from the path (format: albumId.jpg) + const albumId = nativePath.replace(".jpg", ""); + try { + const album = await prisma.album.findUnique({ + where: { id: albumId }, + include: { artist: true }, + }); + + if (album && album.artist) { + const deezerCover = await deezerService.getAlbumCover( + album.artist.name, + album.title + ); + + if (deezerCover) { + // Update album with Deezer cover + await prisma.album.update({ + where: { id: albumId }, + data: { coverUrl: deezerCover }, + }); + + // Redirect to the Deezer cover + return res.redirect(deezerCover); + } + } + } catch (error) { + console.error( + `[COVER-ART] Failed to fetch Deezer fallback for ${albumId}:`, + error + ); + } + + return res.status(404).json({ error: "Cover art not found" }); + } + + // Check if this is an audiobook cover (prefixed with "audiobook__") + if (decodedId.startsWith("audiobook__")) { + isAudiobook = true; + const audiobookPath = decodedId.replace("audiobook__", ""); + + // Get Audiobookshelf settings + const settings = await getSystemSettings(); + const audiobookshelfUrl = + settings?.audiobookshelfUrl || + process.env.AUDIOBOOKSHELF_URL || + ""; + const audiobookshelfApiKey = + settings?.audiobookshelfApiKey || + process.env.AUDIOBOOKSHELF_API_KEY || + ""; + const audiobookshelfBaseUrl = audiobookshelfUrl.replace( + /\/$/, + "" + ); + + coverUrl = `${audiobookshelfBaseUrl}/api/${audiobookPath}`; + + // Fetch with authentication + console.log( + `[COVER-ART] Fetching audiobook cover: ${coverUrl.substring( + 0, + 100 + )}...` + ); + const imageResponse = await fetch(coverUrl, { + headers: { + Authorization: `Bearer ${audiobookshelfApiKey}`, + "User-Agent": "Lidify/1.0", + }, + }); + + if (!imageResponse.ok) { + console.error( + `[COVER-ART] Failed to fetch audiobook cover: ${coverUrl} (${imageResponse.status} ${imageResponse.statusText})` + ); + return res + .status(404) + .json({ error: "Audiobook cover art not found" }); + } + + const buffer = await imageResponse.arrayBuffer(); + const imageBuffer = Buffer.from(buffer); + const contentType = imageResponse.headers.get("content-type"); + + if (contentType) { + res.setHeader("Content-Type", contentType); + } + applyCoverArtCorsHeaders( + res, + req.headers.origin as string | undefined + ); + res.setHeader( + "Cache-Control", + "public, max-age=31536000, immutable" + ); + + return res.send(imageBuffer); + } + // Check if coverId is already a full URL (from Cover Art Archive or elsewhere) + else if ( + decodedId.startsWith("http://") || + decodedId.startsWith("https://") + ) { + coverUrl = decodedId; + } else { + // Invalid cover ID format + return res + .status(400) + .json({ error: "Invalid cover ID format" }); + } + } + + // Create cache key from URL + size + const cacheKey = `cover-art:${crypto + .createHash("md5") + .update(`${coverUrl}-${size || "original"}`) + .digest("hex")}`; + + // Try to get from Redis cache first + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + const cachedData = JSON.parse(cached); + + // Check if this is a cached 404 + if (cachedData.notFound) { + console.log( + `[COVER-ART] Cached 404 for ${coverUrl.substring( + 0, + 60 + )}...` + ); + return res + .status(404) + .json({ error: "Cover art not found" }); + } + + console.log( + `[COVER-ART] Cache HIT for ${coverUrl.substring(0, 60)}...` + ); + const imageBuffer = Buffer.from(cachedData.data, "base64"); + + // Check if client has cached version + if (req.headers["if-none-match"] === cachedData.etag) { + console.log(`[COVER-ART] Client has cached version (304)`); + return res.status(304).end(); + } + + // Set headers and send cached image + if (cachedData.contentType) { + res.setHeader("Content-Type", cachedData.contentType); + } + applyCoverArtCorsHeaders( + res, + req.headers.origin as string | undefined + ); + res.setHeader( + "Cache-Control", + "public, max-age=31536000, immutable" + ); + res.setHeader("ETag", cachedData.etag); + return res.send(imageBuffer); + } else { + console.log( + `[COVER-ART] ✗ Cache MISS for ${coverUrl.substring( + 0, + 60 + )}...` + ); + } + } catch (cacheError) { + console.warn("[COVER-ART] Redis cache read error:", cacheError); + } + + // Fetch the image and proxy it to avoid CORS issues + console.log(`[COVER-ART] Fetching: ${coverUrl.substring(0, 100)}...`); + const imageResponse = await fetch(coverUrl, { + headers: { + "User-Agent": "Lidify/1.0", + }, + }); + if (!imageResponse.ok) { + console.error( + `[COVER-ART] Failed to fetch: ${coverUrl} (${imageResponse.status} ${imageResponse.statusText})` + ); + + // Cache 404s for 1 hour to avoid repeatedly trying to fetch missing images + if (imageResponse.status === 404) { + try { + await redisClient.setEx( + cacheKey, + 60 * 60, // 1 hour + JSON.stringify({ notFound: true }) + ); + console.log(`[COVER-ART] Cached 404 response for 1 hour`); + } catch (cacheError) { + console.warn( + "[COVER-ART] Redis cache write error:", + cacheError + ); + } + } + + return res.status(404).json({ error: "Cover art not found" }); + } + console.log(`[COVER-ART] Successfully fetched, caching...`); + + const buffer = await imageResponse.arrayBuffer(); + const imageBuffer = Buffer.from(buffer); + + // Generate ETag from content + const etag = crypto.createHash("md5").update(imageBuffer).digest("hex"); + + // Cache in Redis for 7 days + try { + const contentType = imageResponse.headers.get("content-type"); + await redisClient.setEx( + cacheKey, + 7 * 24 * 60 * 60, // 7 days + JSON.stringify({ + etag, + contentType, + data: imageBuffer.toString("base64"), + }) + ); + } catch (cacheError) { + console.warn("Redis cache write error:", cacheError); + } + + // Check if client has cached version + if (req.headers["if-none-match"] === etag) { + return res.status(304).end(); + } + + // Set appropriate headers + const contentType = imageResponse.headers.get("content-type"); + if (contentType) { + res.setHeader("Content-Type", contentType); + } + + // Set aggressive caching headers + applyCoverArtCorsHeaders(res, req.headers.origin as string | undefined); + res.setHeader("Cache-Control", "public, max-age=31536000, immutable"); // Cache for 1 year + res.setHeader("ETag", etag); + + // Send the image + res.send(imageBuffer); + } catch (error) { + console.error("Get cover art error:", error); + res.status(500).json({ error: "Failed to fetch cover art" }); + } +}); + +// GET /library/album-cover/:mbid - Fetch and cache album cover by MBID +// This is called lazily by the frontend when an album doesn't have a cached cover +router.get("/album-cover/:mbid", imageLimiter, async (req, res) => { + try { + const { mbid } = req.params; + + if (!mbid || mbid.startsWith("temp-")) { + return res.status(400).json({ error: "Valid MBID required" }); + } + + // Fetch from Cover Art Archive (this uses caching internally) + const coverUrl = await coverArtService.getCoverArt(mbid); + + if (!coverUrl) { + // Return 204 No Content instead of 404 to avoid console spam + // Cover Art Archive doesn't have covers for all albums + return res.status(204).send(); + } + + res.json({ coverUrl }); + } catch (error) { + console.error("Get album cover error:", error); + res.status(500).json({ error: "Failed to fetch cover art" }); + } +}); + +// GET /library/cover-art-colors?url= - Extract colors from a cover art URL +router.get("/cover-art-colors", imageLimiter, async (req, res) => { + try { + const { url } = req.query; + + if (!url) { + return res.status(400).json({ error: "URL parameter required" }); + } + + const imageUrl = decodeURIComponent(url as string); + + // Handle placeholder images - return default fallback colors + if ( + imageUrl.includes("placeholder") || + imageUrl.startsWith("/placeholder") + ) { + console.log( + `[COLORS] Placeholder image detected, returning fallback colors` + ); + return res.json({ + vibrant: "#1db954", + darkVibrant: "#121212", + lightVibrant: "#181818", + muted: "#535353", + darkMuted: "#121212", + lightMuted: "#b3b3b3", + }); + } + + // Create cache key for colors + const cacheKey = `colors:${crypto + .createHash("md5") + .update(imageUrl) + .digest("hex")}`; + + // Try to get from Redis cache first + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log( + `[COLORS] Cache HIT for ${imageUrl.substring(0, 60)}...` + ); + return res.json(JSON.parse(cached)); + } else { + console.log( + `[COLORS] ✗ Cache MISS for ${imageUrl.substring(0, 60)}...` + ); + } + } catch (cacheError) { + console.warn("[COLORS] Redis cache read error:", cacheError); + } + + // Fetch the image + console.log( + `[COLORS] Fetching image: ${imageUrl.substring(0, 100)}...` + ); + const imageResponse = await fetch(imageUrl, { + headers: { + "User-Agent": "Lidify/1.0", + }, + }); + + if (!imageResponse.ok) { + console.error( + `[COLORS] Failed to fetch image: ${imageUrl} (${imageResponse.status})` + ); + return res.status(404).json({ error: "Image not found" }); + } + + const buffer = await imageResponse.arrayBuffer(); + const imageBuffer = Buffer.from(buffer); + + // Extract colors using sharp + const colors = await extractColorsFromImage(imageBuffer); + + console.log(`[COLORS] Extracted colors:`, colors); + + // Cache the result for 30 days + try { + await redisClient.setEx( + cacheKey, + 30 * 24 * 60 * 60, // 30 days + JSON.stringify(colors) + ); + console.log(`[COLORS] Cached colors for 30 days`); + } catch (cacheError) { + console.warn("[COLORS] Redis cache write error:", cacheError); + } + + res.json(colors); + } catch (error) { + console.error("Extract colors error:", error); + res.status(500).json({ error: "Failed to extract colors" }); + } +}); + +// GET /library/tracks/:id/stream +router.get("/tracks/:id/stream", async (req, res) => { + try { + console.log("[STREAM] Request received for track:", req.params.id); + const { quality } = req.query; + const userId = req.user?.id; + + if (!userId) { + console.log("[STREAM] No userId in session - unauthorized"); + return res.status(401).json({ error: "Unauthorized" }); + } + + const track = await prisma.track.findUnique({ + where: { id: req.params.id }, + }); + + if (!track) { + console.log("[STREAM] Track not found"); + return res.status(404).json({ error: "Track not found" }); + } + + // Log play start - only if this is a new playback session + const recentPlay = await prisma.play.findFirst({ + where: { + userId, + trackId: track.id, + playedAt: { + gte: new Date(Date.now() - 30 * 1000), + }, + }, + orderBy: { playedAt: "desc" }, + }); + + if (!recentPlay) { + await prisma.play.create({ + data: { + userId, + trackId: track.id, + }, + }); + console.log("[STREAM] Logged new play for track:", track.title); + } + + // Get user's quality preference + let requestedQuality: string = "medium"; + if (quality) { + requestedQuality = quality as string; + } else { + const settings = await prisma.userSettings.findUnique({ + where: { userId }, + }); + requestedQuality = settings?.playbackQuality || "medium"; + } + + const ext = track.filePath ? path.extname(track.filePath).toLowerCase() : ""; + console.log(`[STREAM] Quality: requested=${quality || 'default'}, using=${requestedQuality}, format=${ext}`); + + // === NATIVE FILE STREAMING === + // Check if track has native file path + if (track.filePath && track.fileModified) { + try { + // Initialize streaming service + const streamingService = new AudioStreamingService( + config.music.musicPath, + config.music.transcodeCachePath, + config.music.transcodeCacheMaxGb + ); + + // Get absolute path to source file + // Normalize path separators for cross-platform compatibility (Windows -> Linux) + const normalizedFilePath = track.filePath.replace(/\\/g, '/'); + const absolutePath = path.join( + config.music.musicPath, + normalizedFilePath + ); + + console.log( + `[STREAM] Using native file: ${track.filePath} (${requestedQuality})` + ); + + // Get stream file (either original or transcoded) + const { filePath, mimeType } = + await streamingService.getStreamFilePath( + track.id, + requestedQuality as any, + track.fileModified, + absolutePath + ); + + // Stream file with range support + console.log(`[STREAM] Sending file: ${filePath}, mimeType: ${mimeType}`); + + res.sendFile(filePath, { + headers: { + "Content-Type": mimeType, + "Accept-Ranges": "bytes", + "Cache-Control": "public, max-age=31536000", + "Access-Control-Allow-Origin": + req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + "Cross-Origin-Resource-Policy": "cross-origin", + }, + }, (err) => { + // Always destroy the streaming service to clean up intervals + streamingService.destroy(); + if (err) { + console.error(`[STREAM] sendFile error:`, err); + } else { + console.log(`[STREAM] File sent successfully: ${path.basename(filePath)}`); + } + }); + + return; + } catch (err: any) { + // If FFmpeg not found, try original quality instead + if ( + err.code === "FFMPEG_NOT_FOUND" && + requestedQuality !== "original" + ) { + console.warn( + `[STREAM] FFmpeg not available, falling back to original quality` + ); + const fallbackFilePath = track.filePath.replace(/\\/g, '/'); + const absolutePath = path.join( + config.music.musicPath, + fallbackFilePath + ); + + const streamingService = new AudioStreamingService( + config.music.musicPath, + config.music.transcodeCachePath, + config.music.transcodeCacheMaxGb + ); + + const { filePath, mimeType } = + await streamingService.getStreamFilePath( + track.id, + "original", + track.fileModified, + absolutePath + ); + + res.sendFile(filePath, { + headers: { + "Content-Type": mimeType, + "Accept-Ranges": "bytes", + "Cache-Control": "public, max-age=31536000", + "Access-Control-Allow-Origin": + req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + "Cross-Origin-Resource-Policy": "cross-origin", + }, + }, (err) => { + // Always destroy the streaming service to clean up intervals + streamingService.destroy(); + if (err) { + console.error(`[STREAM] sendFile fallback error:`, err); + } + }); + return; + } + + console.error("[STREAM] Native streaming failed:", err.message); + return res + .status(500) + .json({ error: "Failed to stream track" }); + } + } + + // No file path available + console.log("[STREAM] Track has no file path - unavailable"); + return res.status(404).json({ error: "Track not available" }); + } catch (error) { + console.error("Stream track error:", error); + res.status(500).json({ error: "Failed to stream track" }); + } +}); + +// GET /library/tracks/:id +router.get("/tracks/:id", async (req, res) => { + try { + const track = await prisma.track.findUnique({ + where: { id: req.params.id }, + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + }, + }, + }, + }, + }, + }); + + if (!track) { + return res.status(404).json({ error: "Track not found" }); + } + + // Transform to match frontend Track interface: artist at top level + const formattedTrack = { + id: track.id, + title: track.title, + artist: { + name: track.album?.artist?.name || "Unknown Artist", + id: track.album?.artist?.id, + }, + album: { + title: track.album?.title || "Unknown Album", + coverArt: track.album?.coverUrl, + id: track.album?.id, + }, + duration: track.duration, + }; + + res.json(formattedTrack); + } catch (error) { + console.error("Get track error:", error); + res.status(500).json({ error: "Failed to fetch track" }); + } +}); + +// DELETE /library/tracks/:id +router.delete("/tracks/:id", async (req, res) => { + try { + const track = await prisma.track.findUnique({ + where: { id: req.params.id }, + include: { + album: { + include: { + artist: true, + }, + }, + }, + }); + + if (!track) { + return res.status(404).json({ error: "Track not found" }); + } + + // Delete file from filesystem if path is available + if (track.filePath) { + try { + + const absolutePath = path.join( + config.music.musicPath, + track.filePath + ); + + if (fs.existsSync(absolutePath)) { + fs.unlinkSync(absolutePath); + console.log(`[DELETE] Deleted file: ${absolutePath}`); + } + } catch (err) { + console.warn("[DELETE] Could not delete file:", err); + // Continue with database deletion even if file deletion fails + } + } + + // Delete from database (cascade will handle related records) + await prisma.track.delete({ + where: { id: track.id }, + }); + + console.log(`[DELETE] Deleted track: ${track.title}`); + + res.json({ message: "Track deleted successfully" }); + } catch (error) { + console.error("Delete track error:", error); + res.status(500).json({ error: "Failed to delete track" }); + } +}); + +// DELETE /library/albums/:id +router.delete("/albums/:id", async (req, res) => { + try { + const album = await prisma.album.findUnique({ + where: { id: req.params.id }, + include: { + artist: true, + tracks: { + include: { + album: true, + }, + }, + }, + }); + + if (!album) { + return res.status(404).json({ error: "Album not found" }); + } + + + // Delete all track files + let deletedFiles = 0; + for (const track of album.tracks) { + if (track.filePath) { + try { + const absolutePath = path.join( + config.music.musicPath, + track.filePath + ); + + if (fs.existsSync(absolutePath)) { + fs.unlinkSync(absolutePath); + deletedFiles++; + } + } catch (err) { + console.warn("[DELETE] Could not delete file:", err); + } + } + } + + // Try to delete album folder if empty + try { + const artistName = album.artist.name; + const albumFolder = path.join( + config.music.musicPath, + artistName, + album.title + ); + + if (fs.existsSync(albumFolder)) { + const files = fs.readdirSync(albumFolder); + if (files.length === 0) { + fs.rmdirSync(albumFolder); + console.log( + `[DELETE] Deleted empty album folder: ${albumFolder}` + ); + } + } + } catch (err) { + console.warn("[DELETE] Could not delete album folder:", err); + } + + // Delete from database (cascade will delete tracks) + await prisma.album.delete({ + where: { id: album.id }, + }); + + console.log( + `[DELETE] Deleted album: ${album.title} (${deletedFiles} files)` + ); + + res.json({ + message: "Album deleted successfully", + deletedFiles, + }); + } catch (error) { + console.error("Delete album error:", error); + res.status(500).json({ error: "Failed to delete album" }); + } +}); + +// DELETE /library/artists/:id +router.delete("/artists/:id", async (req, res) => { + try { + const artist = await prisma.artist.findUnique({ + where: { id: req.params.id }, + include: { + albums: { + include: { + tracks: true, + }, + }, + }, + }); + + if (!artist) { + return res.status(404).json({ error: "Artist not found" }); + } + + + // Delete all track files and collect actual artist folders from file paths + let deletedFiles = 0; + const artistFoldersToDelete = new Set(); + + for (const album of artist.albums) { + for (const track of album.tracks) { + if (track.filePath) { + try { + const absolutePath = path.join( + config.music.musicPath, + track.filePath + ); + + if (fs.existsSync(absolutePath)) { + fs.unlinkSync(absolutePath); + deletedFiles++; + + // Extract actual artist folder from file path + // Path format: Soulseek/Artist/Album/Track.mp3 OR Artist/Album/Track.mp3 + const pathParts = track.filePath.split(path.sep); + if (pathParts.length >= 2) { + // If first part is "Soulseek", artist folder is Soulseek/Artist + // Otherwise, artist folder is just Artist + const actualArtistFolder = + pathParts[0].toLowerCase() === "soulseek" + ? path.join( + config.music.musicPath, + pathParts[0], + pathParts[1] + ) + : path.join( + config.music.musicPath, + pathParts[0] + ); + artistFoldersToDelete.add(actualArtistFolder); + } else if (pathParts.length === 1) { + // Single-level path (rare case) + const actualArtistFolder = path.join( + config.music.musicPath, + pathParts[0] + ); + artistFoldersToDelete.add(actualArtistFolder); + } + } + } catch (err) { + console.warn("[DELETE] Could not delete file:", err); + } + } + } + } + + // Delete artist folders based on actual file paths, not database name + for (const artistFolder of artistFoldersToDelete) { + try { + if (fs.existsSync(artistFolder)) { + console.log(`[DELETE] Attempting to delete folder: ${artistFolder}`); + + // Always try recursive delete with force + fs.rmSync(artistFolder, { + recursive: true, + force: true, + }); + console.log(`[DELETE] Successfully deleted artist folder: ${artistFolder}`); + } + } catch (err: any) { + console.error(`[DELETE] Failed to delete artist folder ${artistFolder}:`, err?.message || err); + + // Try alternative: delete contents first, then folder + try { + const files = fs.readdirSync(artistFolder); + for (const file of files) { + const filePath = path.join(artistFolder, file); + try { + const stat = fs.statSync(filePath); + if (stat.isDirectory()) { + fs.rmSync(filePath, { recursive: true, force: true }); + } else { + fs.unlinkSync(filePath); + } + console.log(`[DELETE] Deleted: ${filePath}`); + } catch (fileErr: any) { + console.error(`[DELETE] Could not delete ${filePath}:`, fileErr?.message); + } + } + // Try deleting the now-empty folder + fs.rmdirSync(artistFolder); + console.log(`[DELETE] Deleted artist folder after manual cleanup: ${artistFolder}`); + } catch (cleanupErr: any) { + console.error(`[DELETE] Cleanup also failed for ${artistFolder}:`, cleanupErr?.message); + } + } + } + + // Also try deleting from common music folder paths (in case tracks weren't indexed) + const commonPaths = [ + path.join(config.music.musicPath, artist.name), + path.join(config.music.musicPath, "Soulseek", artist.name), + path.join(config.music.musicPath, "discovery", artist.name), + ]; + + for (const commonPath of commonPaths) { + if (fs.existsSync(commonPath) && !artistFoldersToDelete.has(commonPath)) { + try { + fs.rmSync(commonPath, { recursive: true, force: true }); + console.log(`[DELETE] Deleted additional artist folder: ${commonPath}`); + } catch (err: any) { + console.error(`[DELETE] Could not delete ${commonPath}:`, err?.message); + } + } + } + + // Delete from Lidarr if connected and artist has MBID + let lidarrDeleted = false; + let lidarrError: string | null = null; + if (artist.mbid && !artist.mbid.startsWith("temp-")) { + try { + const { lidarrService } = await import("../services/lidarr"); + const lidarrResult = await lidarrService.deleteArtist(artist.mbid, true); + if (lidarrResult.success) { + console.log(`[DELETE] Lidarr: ${lidarrResult.message}`); + lidarrDeleted = true; + } else { + console.warn(`[DELETE] Lidarr deletion note: ${lidarrResult.message}`); + lidarrError = lidarrResult.message; + } + } catch (err: any) { + console.warn("[DELETE] Could not delete from Lidarr:", err?.message || err); + lidarrError = err?.message || "Unknown error"; + } + } + + // Explicitly delete OwnedAlbum records first (should cascade, but being safe) + try { + await prisma.ownedAlbum.deleteMany({ + where: { artistId: artist.id }, + }); + } catch (err) { + console.warn("[DELETE] Could not delete OwnedAlbum records:", err); + } + + // Delete from database (cascade will delete albums and tracks) + console.log(`[DELETE] Deleting artist from database: ${artist.name} (${artist.id})`); + await prisma.artist.delete({ + where: { id: artist.id }, + }); + + console.log( + `[DELETE] Successfully deleted artist: ${artist.name} (${deletedFiles} files${lidarrDeleted ? ', removed from Lidarr' : ''})` + ); + + res.json({ + message: "Artist deleted successfully", + deletedFiles, + lidarrDeleted, + lidarrError, + }); + } catch (error: any) { + console.error("Delete artist error:", error?.message || error); + console.error("Delete artist stack:", error?.stack); + res.status(500).json({ + error: "Failed to delete artist", + details: error?.message || "Unknown error" + }); + } +}); + +/** + * GET /library/genres + * Get list of genres in the library with track counts + */ +router.get("/genres", async (req, res) => { + try { + // Get artist names to filter them out of genres (they sometimes get incorrectly tagged) + const artists = await prisma.artist.findMany({ + select: { name: true, normalizedName: true }, + }); + const artistNames = new Set(artists.flatMap(a => [ + a.name.toLowerCase(), + a.normalizedName?.toLowerCase(), + ].filter(Boolean))); + + // Get genres from TrackGenre relation (most accurate) + const trackGenres = await prisma.genre.findMany({ + include: { + _count: { + select: { trackGenres: true }, + }, + }, + }); + + const genreMap = new Map(); + + // Add track genre counts (excluding artist names) + for (const g of trackGenres) { + if (g.name && g._count.trackGenres > 0) { + const normalized = g.name.trim(); + // Skip if it matches an artist name + if (normalized && !artistNames.has(normalized.toLowerCase())) { + genreMap.set(normalized, g._count.trackGenres); + } + } + } + + // Fallback: Get genres from Album.genres JSON field if no TrackGenres + if (genreMap.size === 0) { + const albums = await prisma.album.findMany({ + where: { + genres: { not: null }, + }, + select: { + genres: true, + _count: { select: { tracks: true } }, + }, + }); + + for (const album of albums) { + const albumGenres = album.genres as string[] | null; + if (albumGenres && Array.isArray(albumGenres)) { + for (const genre of albumGenres) { + const normalized = genre.trim(); + // Skip if it matches an artist name + if (normalized && !artistNames.has(normalized.toLowerCase())) { + genreMap.set( + normalized, + (genreMap.get(normalized) || 0) + album._count.tracks + ); + } + } + } + } + } + + // Convert to array and sort by count + const genres = Array.from(genreMap.entries()) + .map(([genre, count]) => ({ genre, count })) + .sort((a, b) => b.count - a.count) + .slice(0, 20); // Top 20 genres + + res.json({ genres }); + } catch (error) { + console.error("Genres endpoint error:", error); + res.status(500).json({ error: "Failed to get genres" }); + } +}); + +/** + * GET /library/decades + * Get available decades in the library with track counts + * Returns only decades with enough tracks (15+) + */ +router.get("/decades", async (req, res) => { + try { + // Get all albums with year and track count + const albums = await prisma.album.findMany({ + where: { + year: { not: null }, + }, + select: { + year: true, + _count: { select: { tracks: true } }, + }, + }); + + // Group by decade + const decadeMap = new Map(); + + for (const album of albums) { + if (album.year) { + // Calculate decade start (e.g., 1987 -> 1980, 2023 -> 2020) + const decadeStart = Math.floor(album.year / 10) * 10; + decadeMap.set( + decadeStart, + (decadeMap.get(decadeStart) || 0) + album._count.tracks + ); + } + } + + // Convert to array, filter by minimum tracks, and sort by decade + const decades = Array.from(decadeMap.entries()) + .map(([decade, count]) => ({ decade, count })) + .filter(d => d.count >= 15) // Minimum 15 tracks for a radio station + .sort((a, b) => b.decade - a.decade); // Newest first + + res.json({ decades }); + } catch (error) { + console.error("Decades endpoint error:", error); + res.status(500).json({ error: "Failed to get decades" }); + } +}); + +/** + * GET /library/radio + * Get tracks for a library-based radio station + * + * Query params: + * - type: "discovery" | "favorites" | "decade" | "genre" | "mood" + * - value: Optional value for decade (e.g., "1990") or genre name + * - limit: Number of tracks to return (default 50) + */ +router.get("/radio", async (req, res) => { + try { + const { type, value, limit = "50" } = req.query; + const limitNum = Math.min(parseInt(limit as string) || 50, 100); + const userId = req.user?.id; + + if (!type) { + return res.status(400).json({ error: "Radio type is required" }); + } + + let whereClause: any = {}; + let orderBy: any = {}; + let trackIds: string[] = []; + let vibeSourceFeatures: any = null; // For vibe mode - store source track features + + switch (type) { + case "discovery": + // Lesser-played tracks - get tracks the user hasn't played or played least + // First, get tracks with NO plays at all (truly undiscovered) + const unplayedTracks = await prisma.track.findMany({ + where: { + plays: { none: {} }, // No plays by anyone + }, + select: { id: true }, + take: limitNum * 2, + }); + + if (unplayedTracks.length >= limitNum) { + trackIds = unplayedTracks.map(t => t.id); + } else { + // Fallback: get tracks with the fewest plays using raw count + const leastPlayedTracks = await prisma.$queryRaw<{ id: string }[]>` + SELECT t.id + FROM "Track" t + LEFT JOIN "Play" p ON p."trackId" = t.id + GROUP BY t.id + ORDER BY COUNT(p.id) ASC + LIMIT ${limitNum * 2} + `; + trackIds = leastPlayedTracks.map(t => t.id); + } + break; + + case "favorites": + // Most-played tracks - use raw query for accurate count ordering + const mostPlayedTracks = await prisma.$queryRaw<{ id: string; play_count: bigint }[]>` + SELECT t.id, COUNT(p.id) as play_count + FROM "Track" t + LEFT JOIN "Play" p ON p."trackId" = t.id + GROUP BY t.id + HAVING COUNT(p.id) > 0 + ORDER BY play_count DESC + LIMIT ${limitNum * 2} + `; + + if (mostPlayedTracks.length > 0) { + trackIds = mostPlayedTracks.map(t => t.id); + } else { + // No play data yet - just get random tracks + console.log("[Radio:favorites] No play data found, returning random tracks"); + const randomTracks = await prisma.track.findMany({ + select: { id: true }, + take: limitNum * 2, + }); + trackIds = randomTracks.map(t => t.id); + } + break; + + case "decade": + // Filter by decade (e.g., value = "1990" for 90s) + const decadeStart = parseInt(value as string) || 2000; + const decadeEnd = decadeStart + 9; + + const decadeTracks = await prisma.track.findMany({ + where: { + album: { + year: { + gte: decadeStart, + lte: decadeEnd, + }, + }, + }, + select: { id: true }, + take: limitNum * 3, + }); + trackIds = decadeTracks.map(t => t.id); + break; + + case "genre": + // Filter by genre (matches against album or track genre tags) + const genreValue = (value as string || "").toLowerCase(); + + // Strategy 1: Check trackGenres relation (most reliable) + const genreRelationTracks = await prisma.track.findMany({ + where: { + trackGenres: { + some: { + genre: { + name: { contains: genreValue, mode: "insensitive" } + } + } + }, + }, + select: { id: true }, + take: limitNum * 2, + }); + trackIds = genreRelationTracks.map(t => t.id); + + // Strategy 2: If not enough, check album.genres JSON field with raw query + if (trackIds.length < limitNum) { + const albumGenreTracks = await prisma.$queryRaw<{ id: string }[]>` + SELECT t.id + FROM "Track" t + JOIN "Album" a ON t."albumId" = a.id + WHERE a.genres IS NOT NULL + AND EXISTS ( + SELECT 1 FROM jsonb_array_elements_text(a.genres::jsonb) AS g + WHERE LOWER(g) LIKE ${'%' + genreValue + '%'} + ) + LIMIT ${limitNum * 2} + `; + const newIds = albumGenreTracks.map(t => t.id).filter(id => !trackIds.includes(id)); + trackIds = [...trackIds, ...newIds]; + } + + console.log(`[Radio:genre] Found ${trackIds.length} tracks for genre "${genreValue}"`); + break; + + case "mood": + // Mood-based filtering using audio analysis features + const moodValue = (value as string || "").toLowerCase(); + let moodWhere: any = { analysisStatus: "completed" }; + + switch (moodValue) { + case "high-energy": + moodWhere = { + analysisStatus: "completed", + energy: { gte: 0.7 }, + bpm: { gte: 120 }, + }; + break; + case "chill": + moodWhere = { + analysisStatus: "completed", + OR: [ + { energy: { lte: 0.4 } }, + { arousal: { lte: 0.4 } }, + ], + }; + break; + case "happy": + moodWhere = { + analysisStatus: "completed", + valence: { gte: 0.6 }, + energy: { gte: 0.5 }, + }; + break; + case "melancholy": + moodWhere = { + analysisStatus: "completed", + OR: [ + { valence: { lte: 0.4 } }, + { keyScale: "minor" }, + ], + }; + break; + case "dance": + moodWhere = { + analysisStatus: "completed", + danceability: { gte: 0.7 }, + }; + break; + case "acoustic": + moodWhere = { + analysisStatus: "completed", + acousticness: { gte: 0.6 }, + }; + break; + case "instrumental": + moodWhere = { + analysisStatus: "completed", + instrumentalness: { gte: 0.7 }, + }; + break; + default: + // Try Last.fm tags if mood not recognized + moodWhere = { + lastfmTags: { has: moodValue }, + }; + } + + const moodTracks = await prisma.track.findMany({ + where: moodWhere, + select: { id: true }, + take: limitNum * 3, + }); + trackIds = moodTracks.map(t => t.id); + break; + + case "workout": + // High-energy workout tracks - multiple strategies + let workoutTrackIds: string[] = []; + + // Strategy 1: Audio analysis - high energy AND fast BPM + const energyTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + // High energy with fast tempo + { AND: [{ energy: { gte: 0.65 } }, { bpm: { gte: 115 } }] }, + // Has workout mood tag + { moodTags: { hasSome: ["workout", "energetic", "upbeat"] } }, + ], + }, + select: { id: true }, + take: limitNum * 2, + }); + workoutTrackIds = energyTracks.map(t => t.id); + console.log(`[Radio:workout] Found ${workoutTrackIds.length} tracks via audio analysis`); + + // Strategy 2: Genre-based (if not enough from audio) + if (workoutTrackIds.length < limitNum) { + const workoutGenreNames = [ + "rock", "metal", "hard rock", "alternative rock", "punk", + "hip hop", "rap", "trap", "electronic", "edm", "house", + "techno", "drum and bass", "dubstep", "hardstyle", + "metalcore", "hardcore", "industrial", "nu metal", "pop punk" + ]; + + // Check Genre table + const workoutGenres = await prisma.genre.findMany({ + where: { + name: { in: workoutGenreNames, mode: "insensitive" }, + }, + include: { + trackGenres: { select: { trackId: true }, take: 50 }, + }, + }); + + const genreTrackIds = workoutGenres.flatMap(g => g.trackGenres.map(tg => tg.trackId)); + workoutTrackIds = [...new Set([...workoutTrackIds, ...genreTrackIds])]; + console.log(`[Radio:workout] After genre check: ${workoutTrackIds.length} tracks`); + + // Also check album.genres JSON field + if (workoutTrackIds.length < limitNum) { + const albumGenreTracks = await prisma.track.findMany({ + where: { + album: { + OR: workoutGenreNames.map(g => ({ + genres: { string_contains: g }, + })), + }, + }, + select: { id: true }, + take: limitNum, + }); + workoutTrackIds = [...new Set([...workoutTrackIds, ...albumGenreTracks.map(t => t.id)])]; + console.log(`[Radio:workout] After album genre check: ${workoutTrackIds.length} tracks`); + } + } + + trackIds = workoutTrackIds; + break; + + case "artist": + // Artist Radio - plays tracks from the artist + similar artists in library + // Uses hybrid approach: Last.fm similarity (filtered to library) + genre matching + vibe boost + const artistId = value as string; + if (!artistId) { + return res.status(400).json({ error: "Artist ID required for artist radio" }); + } + + console.log(`[Radio:artist] Starting artist radio for: ${artistId}`); + + // 1. Get tracks from this artist (they're in library by definition) + const artistTracks = await prisma.track.findMany({ + where: { album: { artistId } }, + select: { + id: true, + bpm: true, + energy: true, + valence: true, + danceability: true, + }, + }); + console.log(`[Radio:artist] Found ${artistTracks.length} tracks from artist`); + + if (artistTracks.length === 0) { + return res.json({ tracks: [] }); + } + + // Calculate artist's average "vibe" for later matching + const analyzedTracks = artistTracks.filter(t => t.bpm || t.energy || t.valence); + const avgVibe = analyzedTracks.length > 0 ? { + bpm: analyzedTracks.reduce((sum, t) => sum + (t.bpm || 0), 0) / analyzedTracks.length, + energy: analyzedTracks.reduce((sum, t) => sum + (t.energy || 0), 0) / analyzedTracks.length, + valence: analyzedTracks.reduce((sum, t) => sum + (t.valence || 0), 0) / analyzedTracks.length, + danceability: analyzedTracks.reduce((sum, t) => sum + (t.danceability || 0), 0) / analyzedTracks.length, + } : null; + console.log(`[Radio:artist] Artist vibe:`, avgVibe); + + // 2. Get library artist IDs (artists user actually owns) + const ownedArtists = await prisma.ownedAlbum.findMany({ + select: { artistId: true }, + distinct: ['artistId'], + }); + const libraryArtistIds = new Set(ownedArtists.map(o => o.artistId)); + libraryArtistIds.delete(artistId); // Exclude the current artist + console.log(`[Radio:artist] Library has ${libraryArtistIds.size} other artists`); + + // 3. Try Last.fm similar artists, filtered to library + const similarInLibrary = await prisma.similarArtist.findMany({ + where: { + fromArtistId: artistId, + toArtistId: { in: Array.from(libraryArtistIds) }, + }, + orderBy: { weight: "desc" }, + take: 15, + }); + let similarArtistIds = similarInLibrary.map(s => s.toArtistId); + console.log(`[Radio:artist] Found ${similarArtistIds.length} Last.fm similar artists in library`); + + // 4. Fallback: genre matching if not enough similar artists + if (similarArtistIds.length < 5 && libraryArtistIds.size > 0) { + const artist = await prisma.artist.findUnique({ + where: { id: artistId }, + select: { genres: true }, + }); + const artistGenres = (artist?.genres as string[]) || []; + + if (artistGenres.length > 0) { + // Find library artists with overlapping genres + const genreMatchArtists = await prisma.artist.findMany({ + where: { + id: { in: Array.from(libraryArtistIds) }, + }, + select: { id: true, genres: true }, + }); + + // Score artists by genre overlap + const scoredArtists = genreMatchArtists + .map(a => { + const theirGenres = (a.genres as string[]) || []; + const overlap = artistGenres.filter(g => + theirGenres.some(tg => tg.toLowerCase().includes(g.toLowerCase()) || + g.toLowerCase().includes(tg.toLowerCase())) + ).length; + return { id: a.id, score: overlap }; + }) + .filter(a => a.score > 0) + .sort((a, b) => b.score - a.score) + .slice(0, 10); + + const genreArtistIds = scoredArtists.map(a => a.id); + similarArtistIds = [...new Set([...similarArtistIds, ...genreArtistIds])]; + console.log(`[Radio:artist] After genre matching: ${similarArtistIds.length} similar artists`); + } + } + + // 5. Get tracks from similar library artists + let similarTracks: { id: string; bpm: number | null; energy: number | null; valence: number | null; danceability: number | null }[] = []; + if (similarArtistIds.length > 0) { + similarTracks = await prisma.track.findMany({ + where: { album: { artistId: { in: similarArtistIds } } }, + select: { + id: true, + bpm: true, + energy: true, + valence: true, + danceability: true, + }, + }); + console.log(`[Radio:artist] Found ${similarTracks.length} tracks from similar artists`); + } + + // 6. Apply vibe boost if we have audio analysis data + if (avgVibe && similarTracks.length > 0) { + // Score each similar track by how close its vibe is to the artist's average + similarTracks = similarTracks + .map(t => { + if (!t.bpm && !t.energy && !t.valence) return { ...t, vibeScore: 0.5 }; + + let score = 0; + let factors = 0; + + if (t.bpm && avgVibe.bpm) { + // BPM within 20 = good match + const bpmDiff = Math.abs(t.bpm - avgVibe.bpm); + score += Math.max(0, 1 - bpmDiff / 40); + factors++; + } + if (t.energy !== null && avgVibe.energy) { + score += 1 - Math.abs((t.energy || 0) - avgVibe.energy); + factors++; + } + if (t.valence !== null && avgVibe.valence) { + score += 1 - Math.abs((t.valence || 0) - avgVibe.valence); + factors++; + } + if (t.danceability !== null && avgVibe.danceability) { + score += 1 - Math.abs((t.danceability || 0) - avgVibe.danceability); + factors++; + } + + return { ...t, vibeScore: factors > 0 ? score / factors : 0.5 }; + }) + .sort((a, b) => (b as any).vibeScore - (a as any).vibeScore); + + console.log(`[Radio:artist] Applied vibe boost, top score: ${(similarTracks[0] as any)?.vibeScore?.toFixed(2)}`); + } + + // 7. Mix: ~40% original artist, ~60% similar (vibe-boosted) + const originalCount = Math.min(Math.ceil(limitNum * 0.4), artistTracks.length); + const similarCount = Math.min(limitNum - originalCount, similarTracks.length); + + const selectedOriginal = artistTracks.sort(() => Math.random() - 0.5).slice(0, originalCount); + // Take top vibe-matched tracks (already sorted by vibe score), then shuffle slightly + const selectedSimilar = similarTracks.slice(0, similarCount * 2) + .sort(() => Math.random() - 0.3) // Slight shuffle to add variety + .slice(0, similarCount); + + trackIds = [...selectedOriginal, ...selectedSimilar].map(t => t.id); + console.log(`[Radio:artist] Final mix: ${selectedOriginal.length} original + ${selectedSimilar.length} similar = ${trackIds.length} tracks`); + break; + + case "vibe": + // Vibe Match - finds tracks that sound like the given track + // Pure audio feature matching with graceful fallbacks + const sourceTrackId = value as string; + if (!sourceTrackId) { + return res.status(400).json({ error: "Track ID required for vibe matching" }); + } + + console.log(`[Radio:vibe] Starting vibe match for track: ${sourceTrackId}`); + + // 1. Get the source track's audio features (including Enhanced mode fields) + const sourceTrack = await prisma.track.findUnique({ + where: { id: sourceTrackId }, + include: { + album: { + select: { + artistId: true, + genres: true, + artist: { select: { id: true, name: true } } + } + } + } + }) as any; // Cast to any to include all Track fields + + if (!sourceTrack) { + return res.status(404).json({ error: "Track not found" }); + } + + // Check if track has Enhanced mode analysis + const isEnhancedAnalysis = sourceTrack.analysisMode === 'enhanced' || + (sourceTrack.moodHappy !== null && sourceTrack.moodSad !== null); + + console.log(`[Radio:vibe] Source: "${sourceTrack.title}" by ${sourceTrack.album.artist.name}`); + console.log(`[Radio:vibe] Analysis mode: ${isEnhancedAnalysis ? 'ENHANCED' : 'STANDARD'}`); + console.log(`[Radio:vibe] Source features: BPM=${sourceTrack.bpm}, Energy=${sourceTrack.energy}, Valence=${sourceTrack.valence}`); + if (isEnhancedAnalysis) { + console.log(`[Radio:vibe] ML Moods: Happy=${sourceTrack.moodHappy}, Sad=${sourceTrack.moodSad}, Relaxed=${sourceTrack.moodRelaxed}, Aggressive=${sourceTrack.moodAggressive}, Party=${sourceTrack.moodParty}, Acoustic=${sourceTrack.moodAcoustic}, Electronic=${sourceTrack.moodElectronic}`); + } + + // Store source features for frontend visualization + vibeSourceFeatures = { + bpm: sourceTrack.bpm, + energy: sourceTrack.energy, + valence: sourceTrack.valence, + arousal: sourceTrack.arousal, + danceability: sourceTrack.danceability, + keyScale: sourceTrack.keyScale, + instrumentalness: sourceTrack.instrumentalness, + // Enhanced mode features (all 7 ML mood predictions) + moodHappy: sourceTrack.moodHappy, + moodSad: sourceTrack.moodSad, + moodRelaxed: sourceTrack.moodRelaxed, + moodAggressive: sourceTrack.moodAggressive, + moodParty: sourceTrack.moodParty, + moodAcoustic: sourceTrack.moodAcoustic, + moodElectronic: sourceTrack.moodElectronic, + analysisMode: isEnhancedAnalysis ? 'enhanced' : 'standard', + }; + + let vibeMatchedIds: string[] = []; + const sourceArtistId = sourceTrack.album.artistId; + + // 2. Try audio feature matching first (if track is analyzed) + const hasAudioData = sourceTrack.bpm || sourceTrack.energy || sourceTrack.valence; + + if (hasAudioData) { + // Get all analyzed tracks (excluding source) - include Enhanced mode fields + const analyzedTracks = await prisma.track.findMany({ + where: { + id: { not: sourceTrackId }, + analysisStatus: "completed", + }, + select: { + id: true, + bpm: true, + energy: true, + valence: true, + arousal: true, + danceability: true, + keyScale: true, + moodTags: true, + lastfmTags: true, + essentiaGenres: true, + instrumentalness: true, + // Enhanced mode fields (all 7 ML mood predictions) + moodHappy: true, + moodSad: true, + moodRelaxed: true, + moodAggressive: true, + moodParty: true, + moodAcoustic: true, + moodElectronic: true, + danceabilityMl: true, + analysisMode: true, + }, + }); + + console.log(`[Radio:vibe] Found ${analyzedTracks.length} analyzed tracks to compare`); + + if (analyzedTracks.length > 0) { + // === COSINE SIMILARITY SCORING === + // Industry-standard approach: build feature vectors, compute cosine similarity + // Uses ALL 13 features for comprehensive matching + + // Enhanced valence: mode/tonality + mood + audio features + const calculateEnhancedValence = (track: any): number => { + const happy = track.moodHappy ?? 0.5; + const sad = track.moodSad ?? 0.5; + const party = (track as any).moodParty ?? 0.5; + const isMajor = track.keyScale === 'major'; + const isMinor = track.keyScale === 'minor'; + const modeValence = isMajor ? 0.3 : (isMinor ? -0.2 : 0); + const moodValence = happy * 0.35 + party * 0.25 + (1 - sad) * 0.2; + const audioValence = (track.energy ?? 0.5) * 0.1 + (track.danceabilityMl ?? track.danceability ?? 0.5) * 0.1; + + return Math.max(0, Math.min(1, moodValence + modeValence + audioValence)); + }; + + // Enhanced arousal: mood + energy + tempo (avoids unreliable "electronic" mood) + const calculateEnhancedArousal = (track: any): number => { + const aggressive = track.moodAggressive ?? 0.5; + const party = (track as any).moodParty ?? 0.5; + const relaxed = track.moodRelaxed ?? 0.5; + const acoustic = (track as any).moodAcoustic ?? 0.5; + const energy = track.energy ?? 0.5; + const bpm = track.bpm ?? 120; + const moodArousal = aggressive * 0.3 + party * 0.2; + const energyArousal = energy * 0.25; + const tempoArousal = Math.max(0, Math.min(1, (bpm - 60) / 120)) * 0.15; + const calmReduction = ((1 - relaxed) * 0.05) + ((1 - acoustic) * 0.05); + + return Math.max(0, Math.min(1, moodArousal + energyArousal + tempoArousal + calmReduction)); + }; + + // OOD detection using Energy-based scoring + const detectOOD = (track: any): boolean => { + const coreMoods = [ + track.moodHappy ?? 0.5, + track.moodSad ?? 0.5, + track.moodRelaxed ?? 0.5, + track.moodAggressive ?? 0.5 + ]; + + const minMood = Math.min(...coreMoods); + const maxMood = Math.max(...coreMoods); + + // Enhanced OOD detection based on research + // Flag if all core moods are high (>0.7) with low variance, OR if all are very neutral (~0.5) + const allHigh = minMood > 0.7 && (maxMood - minMood) < 0.3; + const allNeutral = Math.abs(maxMood - 0.5) < 0.15 && Math.abs(minMood - 0.5) < 0.15; + + return allHigh || allNeutral; + }; + + // Octave-aware BPM distance calculation + const octaveAwareBPMDistance = (bpm1: number, bpm2: number): number => { + if (!bpm1 || !bpm2) return 0; + + // Normalize to standard octave range (77-154 BPM) + const normalizeToOctave = (bpm: number): number => { + while (bpm < 77) bpm *= 2; + while (bpm > 154) bpm /= 2; + return bpm; + }; + + const norm1 = normalizeToOctave(bpm1); + const norm2 = normalizeToOctave(bpm2); + + // Calculate distance on logarithmic scale for harmonic equivalence + const logDistance = Math.abs(Math.log2(norm1) - Math.log2(norm2)); + return Math.min(logDistance, 1); // Cap at 1 for similarity calculation + }; + + // Helper: Build enhanced weighted feature vector from track + const buildFeatureVector = (track: any): number[] => { + // Detect OOD and apply normalization if needed + const isOOD = detectOOD(track); + + // Get mood values with OOD normalization + const getMoodValue = (value: number | null, defaultValue: number): number => { + if (!value) return defaultValue; + if (!isOOD) return value; + // Normalize OOD predictions to spread them out (0.2-0.8 range) + return 0.2 + Math.max(0, Math.min(0.6, value - 0.2)); + }; + + // Use enhanced valence/arousal calculations + const enhancedValence = calculateEnhancedValence(track); + const enhancedArousal = calculateEnhancedArousal(track); + + return [ + // ML Mood predictions (7 features) - enhanced weighting and OOD handling + getMoodValue(track.moodHappy, 0.5) * 1.3, // 1.3x weight for semantic features + getMoodValue(track.moodSad, 0.5) * 1.3, + getMoodValue(track.moodRelaxed, 0.5) * 1.3, + getMoodValue(track.moodAggressive, 0.5) * 1.3, + getMoodValue((track as any).moodParty, 0.5) * 1.3, + getMoodValue((track as any).moodAcoustic, 0.5) * 1.3, + getMoodValue((track as any).moodElectronic, 0.5) * 1.3, + // Audio features (5 features) - standard weight + track.energy ?? 0.5, + enhancedArousal, // Use enhanced arousal + track.danceabilityMl ?? track.danceability ?? 0.5, + track.instrumentalness ?? 0.5, + // Octave-aware BPM normalized to 0-1 + 1 - octaveAwareBPMDistance(track.bpm ?? 120, 120), // Similarity to reference tempo + // Enhanced key mode with valence consideration + enhancedValence, // Use enhanced valence instead of binary key + ]; + }; + + // Helper: Compute cosine similarity between two vectors + const cosineSimilarity = (a: number[], b: number[]): number => { + let dot = 0, magA = 0, magB = 0; + for (let i = 0; i < a.length; i++) { + dot += a[i] * b[i]; + magA += a[i] * a[i]; + magB += b[i] * b[i]; + } + if (magA === 0 || magB === 0) return 0; + return dot / (Math.sqrt(magA) * Math.sqrt(magB)); + }; + + // Helper: Compute tag overlap bonus + const computeTagBonus = ( + sourceTags: string[], + sourceGenres: string[], + trackTags: string[], + trackGenres: string[] + ): number => { + const sourceSet = new Set([...sourceTags, ...sourceGenres].map(t => t.toLowerCase())); + const trackSet = new Set([...trackTags, ...trackGenres].map(t => t.toLowerCase())); + if (sourceSet.size === 0 || trackSet.size === 0) return 0; + const overlap = [...sourceSet].filter(tag => trackSet.has(tag)).length; + // Max 5% bonus for tag overlap + return Math.min(0.05, overlap * 0.01); + }; + + // Build source feature vector once + const sourceVector = buildFeatureVector(sourceTrack); + + // Check if source track has Enhanced mode data + const bothEnhanced = isEnhancedAnalysis; + + const scored = analyzedTracks.map(t => { + // Check if target track has Enhanced mode data + const targetEnhanced = t.analysisMode === 'enhanced' || + (t.moodHappy !== null && t.moodSad !== null); + const useEnhanced = bothEnhanced && targetEnhanced; + + // Build target feature vector + const targetVector = buildFeatureVector(t as any); + + // Compute base cosine similarity + let score = cosineSimilarity(sourceVector, targetVector); + + // Add tag/genre overlap bonus (max 5%) + const tagBonus = computeTagBonus( + sourceTrack.lastfmTags || [], + sourceTrack.essentiaGenres || [], + t.lastfmTags || [], + t.essentiaGenres || [] + ); + + // Final score: 95% cosine similarity + 5% tag bonus + const finalScore = score * 0.95 + tagBonus; + + return { id: t.id, score: finalScore, enhanced: useEnhanced }; + }); + + // Filter to good matches and sort by score + // Use lower threshold (40%) for Enhanced mode since it's more precise + const minThreshold = isEnhancedAnalysis ? 0.40 : 0.50; + const goodMatches = scored + .filter(t => t.score > minThreshold) + .sort((a, b) => b.score - a.score); + + vibeMatchedIds = goodMatches.map(t => t.id); + const enhancedCount = goodMatches.filter(t => t.enhanced).length; + console.log(`[Radio:vibe] Audio matching found ${vibeMatchedIds.length} tracks (>${minThreshold * 100}% similarity)`); + console.log(`[Radio:vibe] Enhanced matches: ${enhancedCount}, Standard matches: ${goodMatches.length - enhancedCount}`); + + if (goodMatches.length > 0) { + console.log(`[Radio:vibe] Top match score: ${goodMatches[0].score.toFixed(2)} (${goodMatches[0].enhanced ? 'enhanced' : 'standard'})`); + } + } + } + + // 3. Fallback A: Same artist's other tracks + if (vibeMatchedIds.length < limitNum) { + const artistTracks = await prisma.track.findMany({ + where: { + album: { artistId: sourceArtistId }, + id: { notIn: [sourceTrackId, ...vibeMatchedIds] }, + }, + select: { id: true }, + }); + const newIds = artistTracks.map(t => t.id); + vibeMatchedIds = [...vibeMatchedIds, ...newIds]; + console.log(`[Radio:vibe] Fallback A (same artist): added ${newIds.length} tracks, total: ${vibeMatchedIds.length}`); + } + + // 4. Fallback B: Similar artists from Last.fm (filtered to library) + if (vibeMatchedIds.length < limitNum) { + const ownedArtistIds = await prisma.ownedAlbum.findMany({ + select: { artistId: true }, + distinct: ['artistId'], + }); + const libraryArtistSet = new Set(ownedArtistIds.map(o => o.artistId)); + libraryArtistSet.delete(sourceArtistId); + + const similarArtists = await prisma.similarArtist.findMany({ + where: { + fromArtistId: sourceArtistId, + toArtistId: { in: Array.from(libraryArtistSet) }, + }, + orderBy: { weight: "desc" }, + take: 10, + }); + + if (similarArtists.length > 0) { + const similarArtistTracks = await prisma.track.findMany({ + where: { + album: { artistId: { in: similarArtists.map(s => s.toArtistId) } }, + id: { notIn: [sourceTrackId, ...vibeMatchedIds] }, + }, + select: { id: true }, + }); + const newIds = similarArtistTracks.map(t => t.id); + vibeMatchedIds = [...vibeMatchedIds, ...newIds]; + console.log(`[Radio:vibe] Fallback B (similar artists): added ${newIds.length} tracks, total: ${vibeMatchedIds.length}`); + } + } + + // 5. Fallback C: Same genre (using TrackGenre relation) + const sourceGenres = (sourceTrack.album.genres as string[]) || []; + if (vibeMatchedIds.length < limitNum && sourceGenres.length > 0) { + // Search using the TrackGenre relation for better accuracy + const genreTracks = await prisma.track.findMany({ + where: { + trackGenres: { + some: { + genre: { + name: { in: sourceGenres, mode: "insensitive" }, + }, + }, + }, + id: { notIn: [sourceTrackId, ...vibeMatchedIds] }, + }, + select: { id: true }, + take: limitNum, + }); + const newIds = genreTracks.map(t => t.id); + vibeMatchedIds = [...vibeMatchedIds, ...newIds]; + console.log(`[Radio:vibe] Fallback C (same genre): added ${newIds.length} tracks, total: ${vibeMatchedIds.length}`); + } + + // 6. Fallback D: Random from library + if (vibeMatchedIds.length < limitNum) { + const randomTracks = await prisma.track.findMany({ + where: { id: { notIn: [sourceTrackId, ...vibeMatchedIds] } }, + select: { id: true }, + take: limitNum - vibeMatchedIds.length, + }); + const newIds = randomTracks.map(t => t.id); + vibeMatchedIds = [...vibeMatchedIds, ...newIds]; + console.log(`[Radio:vibe] Fallback D (random): added ${newIds.length} tracks, total: ${vibeMatchedIds.length}`); + } + + trackIds = vibeMatchedIds; + console.log(`[Radio:vibe] Final vibe queue: ${trackIds.length} tracks`); + break; + + case "all": + default: + // Random selection from all tracks in library + const allTracks = await prisma.track.findMany({ + select: { id: true }, + }); + trackIds = allTracks.map(t => t.id); + } + + // For vibe mode, keep the sorted order (by match score) + // For other modes, shuffle the results + const finalIds = type === "vibe" + ? trackIds.slice(0, limitNum) // Already sorted by match score + : trackIds.sort(() => Math.random() - 0.5).slice(0, limitNum); + + if (finalIds.length === 0) { + return res.json({ tracks: [] }); + } + + // Fetch full track data (include all analysis fields for logging) + const tracks = await prisma.track.findMany({ + where: { + id: { in: finalIds }, + }, + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + }, + }, + }, + }, + trackGenres: { + include: { + genre: { select: { name: true } }, + }, + }, + }, + }); + + // For vibe mode, reorder tracks to match the sorted finalIds order + // (Prisma's findMany with IN doesn't preserve order) + let orderedTracks = tracks; + if (type === "vibe") { + const trackMap = new Map(tracks.map(t => [t.id, t])); + orderedTracks = finalIds + .map(id => trackMap.get(id)) + .filter((t): t is typeof tracks[0] => t !== undefined); + } + + // === VIBE QUEUE LOGGING === + // Log detailed info for vibe matching analysis (using ordered tracks) + if (type === "vibe" && vibeSourceFeatures) { + console.log("\n" + "=".repeat(100)); + console.log("VIBE QUEUE ANALYSIS - Source Track"); + console.log("=".repeat(100)); + + // Find source track for logging + const srcTrack = await prisma.track.findUnique({ + where: { id: value as string }, + include: { + album: { include: { artist: { select: { name: true } } } }, + trackGenres: { include: { genre: { select: { name: true } } } }, + }, + }); + + if (srcTrack) { + console.log(`SOURCE: "${srcTrack.title}" by ${srcTrack.album.artist.name}`); + console.log(` Album: ${srcTrack.album.title}`); + console.log(` Analysis Mode: ${(srcTrack as any).analysisMode || 'unknown'}`); + console.log(` BPM: ${srcTrack.bpm?.toFixed(1) || 'N/A'} | Energy: ${srcTrack.energy?.toFixed(2) || 'N/A'} | Valence: ${srcTrack.valence?.toFixed(2) || 'N/A'}`); + console.log(` Danceability: ${srcTrack.danceability?.toFixed(2) || 'N/A'} | Arousal: ${srcTrack.arousal?.toFixed(2) || 'N/A'} | Key: ${srcTrack.keyScale || 'N/A'}`); + console.log(` ML Moods: Happy=${(srcTrack as any).moodHappy?.toFixed(2) || 'N/A'}, Sad=${(srcTrack as any).moodSad?.toFixed(2) || 'N/A'}, Relaxed=${(srcTrack as any).moodRelaxed?.toFixed(2) || 'N/A'}, Aggressive=${(srcTrack as any).moodAggressive?.toFixed(2) || 'N/A'}`); + console.log(` Genres: ${srcTrack.trackGenres.map(tg => tg.genre.name).join(', ') || 'N/A'}`); + console.log(` Last.fm Tags: ${((srcTrack as any).lastfmTags || []).join(', ') || 'N/A'}`); + console.log(` Mood Tags: ${((srcTrack as any).moodTags || []).join(', ') || 'N/A'}`); + } + + console.log("\n" + "-".repeat(100)); + console.log(`VIBE QUEUE - ${orderedTracks.length} tracks (showing up to 50, SORTED BY MATCH SCORE)`); + console.log("-".repeat(100)); + console.log(`${"#".padEnd(3)} | ${"TRACK".padEnd(35)} | ${"ARTIST".padEnd(20)} | ${"BPM".padEnd(6)} | ${"ENG".padEnd(5)} | ${"VAL".padEnd(5)} | ${"H".padEnd(4)} | ${"S".padEnd(4)} | ${"R".padEnd(4)} | ${"A".padEnd(4)} | MODE | GENRES`); + console.log("-".repeat(100)); + + orderedTracks.slice(0, 50).forEach((track, i) => { + const t = track as any; + const title = track.title.substring(0, 33).padEnd(35); + const artist = track.album.artist.name.substring(0, 18).padEnd(20); + const bpm = track.bpm ? track.bpm.toFixed(0).padEnd(6) : "N/A".padEnd(6); + const energy = track.energy !== null ? track.energy.toFixed(2).padEnd(5) : "N/A".padEnd(5); + const valence = track.valence !== null ? track.valence.toFixed(2).padEnd(5) : "N/A".padEnd(5); + const happy = t.moodHappy !== null ? t.moodHappy.toFixed(2).padEnd(4) : "N/A".padEnd(4); + const sad = t.moodSad !== null ? t.moodSad.toFixed(2).padEnd(4) : "N/A".padEnd(4); + const relaxed = t.moodRelaxed !== null ? t.moodRelaxed.toFixed(2).padEnd(4) : "N/A".padEnd(4); + const aggressive = t.moodAggressive !== null ? t.moodAggressive.toFixed(2).padEnd(4) : "N/A".padEnd(4); + const mode = (t.analysisMode || "std").substring(0, 7).padEnd(8); + const genres = track.trackGenres.slice(0, 3).map(tg => tg.genre.name).join(", "); + + console.log(`${String(i + 1).padEnd(3)} | ${title} | ${artist} | ${bpm} | ${energy} | ${valence} | ${happy} | ${sad} | ${relaxed} | ${aggressive} | ${mode} | ${genres}`); + }); + + if (orderedTracks.length > 50) { + console.log(`... and ${orderedTracks.length - 50} more tracks`); + } + + console.log("=".repeat(100) + "\n"); + } + + // Transform to match frontend Track interface + const transformedTracks = orderedTracks.map((track) => ({ + id: track.id, + title: track.title, + duration: track.duration, + trackNo: track.trackNo, + filePath: track.filePath, + artist: { + id: track.album.artist.id, + name: track.album.artist.name, + }, + album: { + id: track.album.id, + title: track.album.title, + coverArt: track.album.coverUrl, + }, + // Include audio features for vibe mode visualization (if available) + ...(vibeSourceFeatures && { + audioFeatures: { + bpm: track.bpm, + energy: track.energy, + valence: track.valence, + arousal: track.arousal, + danceability: track.danceability, + keyScale: track.keyScale, + instrumentalness: track.instrumentalness, + analysisMode: track.analysisMode, + // ML Mood predictions for enhanced visualization + moodHappy: track.moodHappy, + moodSad: track.moodSad, + moodRelaxed: track.moodRelaxed, + moodAggressive: track.moodAggressive, + moodParty: track.moodParty, + moodAcoustic: track.moodAcoustic, + moodElectronic: track.moodElectronic, + }, + }), + })); + + // For vibe mode, keep sorted order. For other modes, shuffle. + const finalTracks = type === "vibe" + ? transformedTracks + : transformedTracks.sort(() => Math.random() - 0.5); + + // Include source features if this was a vibe request + const response: any = { tracks: finalTracks }; + if (vibeSourceFeatures) { + response.sourceFeatures = vibeSourceFeatures; + } + + res.json(response); + } catch (error) { + console.error("Radio endpoint error:", error); + res.status(500).json({ error: "Failed to get radio tracks" }); + } +}); + +export default router; diff --git a/backend/src/routes/listeningState.ts b/backend/src/routes/listeningState.ts new file mode 100644 index 0000000..df977c6 --- /dev/null +++ b/backend/src/routes/listeningState.ts @@ -0,0 +1,108 @@ +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { z } from "zod"; + +const router = Router(); + +router.use(requireAuth); + +const listeningStateSchema = z.object({ + kind: z.enum(["music", "book"]), + entityId: z.string(), + trackId: z.string().optional(), + positionMs: z.number().int().min(0), +}); + +// POST /listening-state +router.post("/", async (req, res) => { + try { + const userId = req.session.userId!; + const data = listeningStateSchema.parse(req.body); + + const state = await prisma.listeningState.upsert({ + where: { + userId_kind_entityId: { + userId, + kind: data.kind, + entityId: data.entityId, + }, + }, + create: { + userId, + ...data, + }, + update: { + trackId: data.trackId, + positionMs: data.positionMs, + updatedAt: new Date(), + }, + }); + + res.json(state); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: error.errors }); + } + console.error("Update listening state error:", error); + res.status(500).json({ error: "Failed to update listening state" }); + } +}); + +// GET /listening-state +router.get("/", async (req, res) => { + try { + const userId = req.session.userId!; + const { kind, entityId } = req.query; + + if (!kind || !entityId) { + return res + .status(400) + .json({ error: "kind and entityId required" }); + } + + const state = await prisma.listeningState.findUnique({ + where: { + userId_kind_entityId: { + userId, + kind: kind as string, + entityId: entityId as string, + }, + }, + }); + + if (!state) { + return res.status(404).json({ error: "No listening state found" }); + } + + res.json(state); + } catch (error) { + console.error("Get listening state error:", error); + res.status(500).json({ error: "Failed to get listening state" }); + } +}); + +// GET /listening-state/recent (for "Continue Listening") +router.get("/recent", async (req, res) => { + try { + const userId = req.session.userId!; + const { limit = "10" } = req.query; + + const states = await prisma.listeningState.findMany({ + where: { userId }, + orderBy: { updatedAt: "desc" }, + take: parseInt(limit as string, 10), + }); + + res.json(states); + } catch (error) { + console.error("Get recent listening states error:", error); + res.status(500).json({ + error: "Failed to get recent listening states", + }); + } +}); + +export default router; diff --git a/backend/src/routes/mixes.ts b/backend/src/routes/mixes.ts new file mode 100644 index 0000000..f6919e5 --- /dev/null +++ b/backend/src/routes/mixes.ts @@ -0,0 +1,684 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { programmaticPlaylistService } from "../services/programmaticPlaylists"; +import { prisma } from "../utils/db"; +import { redisClient } from "../utils/redis"; + +const router = Router(); + +router.use(requireAuthOrToken); + +const getRequestUserId = (req: any): string | null => { + return req.user?.id || req.session?.userId || null; +}; + +/** + * @openapi + * /mixes: + * get: + * summary: Get all programmatic mixes + * description: Returns all auto-generated mixes (era-based, genre-based, top tracks, rediscover, artist similar, random discovery) + * tags: [Mixes] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * responses: + * 200: + * description: List of programmatic mixes + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * properties: + * id: + * type: string + * example: "era-2000" + * type: + * type: string + * enum: [era, genre, top-tracks, rediscover, artist-similar, random-discovery] + * name: + * type: string + * example: "Your 2000s Mix" + * description: + * type: string + * example: "Music from the 2000s in your library" + * trackIds: + * type: array + * items: + * type: string + * coverUrls: + * type: array + * items: + * type: string + * description: Album covers for mosaic display (up to 4) + * trackCount: + * type: integer + * example: 42 + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.get("/", async (req, res) => { + try { + const userId = getRequestUserId(req); + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + + // Check cache first (mixes are expensive to compute) + const cacheKey = `mixes:${userId}`; + const cached = await redisClient.get(cacheKey); + + if (cached) { + return res.json(JSON.parse(cached)); + } + + // Generate all mixes + const mixes = await programmaticPlaylistService.generateAllMixes( + userId + ); + + // Cache for 1 hour + await redisClient.setEx(cacheKey, 3600, JSON.stringify(mixes)); + + res.json(mixes); + } catch (error) { + console.error("Get mixes error:", error); + res.status(500).json({ error: "Failed to get mixes" }); + } +}); + +/** + * @openapi + * /mixes/mood: + * post: + * summary: Generate a custom mood-based mix on demand + * description: Creates a personalized mix based on audio features like valence, energy, tempo, etc. + * tags: [Mixes] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * valence: + * type: object + * properties: + * min: + * type: number + * minimum: 0 + * maximum: 1 + * max: + * type: number + * minimum: 0 + * maximum: 1 + * energy: + * type: object + * properties: + * min: + * type: number + * max: + * type: number + * danceability: + * type: object + * properties: + * min: + * type: number + * max: + * type: number + * acousticness: + * type: object + * properties: + * min: + * type: number + * max: + * type: number + * instrumentalness: + * type: object + * properties: + * min: + * type: number + * max: + * type: number + * bpm: + * type: object + * properties: + * min: + * type: number + * max: + * type: number + * keyScale: + * type: string + * enum: [major, minor] + * limit: + * type: integer + * default: 15 + * responses: + * 200: + * description: Generated mood mix with full track details + * 400: + * description: Not enough tracks matching criteria + * 401: + * description: Not authenticated + */ +router.post("/mood", async (req, res) => { + try { + const userId = getRequestUserId(req); + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + + const params = req.body; + + // Validate parameters + const validKeys = [ + // Basic audio features + 'valence', 'energy', 'danceability', 'acousticness', 'instrumentalness', 'arousal', 'bpm', 'keyScale', + // ML mood predictions + 'moodHappy', 'moodSad', 'moodRelaxed', 'moodAggressive', 'moodParty', 'moodAcoustic', 'moodElectronic', + // Other + 'limit' + ]; + for (const key of Object.keys(params)) { + if (!validKeys.includes(key)) { + return res.status(400).json({ error: `Invalid parameter: ${key}` }); + } + } + + const mix = await programmaticPlaylistService.generateMoodOnDemand(userId, params); + + if (!mix) { + return res.status(400).json({ + error: "Not enough tracks matching your criteria", + suggestion: "Try widening your parameters or wait for more tracks to be analyzed" + }); + } + + // Load full track details + const tracks = await prisma.track.findMany({ + where: { + id: { in: mix.trackIds }, + }, + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + mbid: true, + }, + }, + }, + }, + }, + }); + + // Preserve mix order + const orderedTracks = mix.trackIds + .map((id: string) => tracks.find((t) => t.id === id)) + .filter((t: any) => t !== undefined); + + console.log(`[MIXES] Generated mood-on-demand mix with ${mix.trackCount} tracks`); + + res.json({ + ...mix, + tracks: orderedTracks, + }); + } catch (error) { + console.error("Generate mood mix error:", error); + res.status(500).json({ error: "Failed to generate mood mix" }); + } +}); + +/** + * Available mood presets for the UI + */ +router.get("/mood/presets", async (req, res) => { + // Presets use ML mood predictions for more accurate matching + // These mirror the logic used in programmatic mixes (Chill Mix, Party Mix, etc.) + const presets = [ + { + id: "happy", + name: "Happy & Upbeat", + color: "from-yellow-400 to-orange-500", + params: { moodHappy: { min: 0.5 }, moodSad: { max: 0.4 }, energy: { min: 0.4 } }, + }, + { + id: "sad", + name: "Melancholic", + color: "from-blue-600 to-indigo-700", + params: { moodSad: { min: 0.5 }, moodHappy: { max: 0.4 }, keyScale: "minor" }, + }, + { + id: "chill", + name: "Chill & Relaxed", + color: "from-teal-400 to-cyan-500", + params: { moodRelaxed: { min: 0.5 }, moodAggressive: { max: 0.3 }, energy: { max: 0.55 } }, + }, + { + id: "energetic", + name: "High Energy", + color: "from-red-500 to-orange-600", + params: { arousal: { min: 0.6 }, energy: { min: 0.65 }, moodRelaxed: { max: 0.4 } }, + }, + { + id: "focus", + name: "Focus Mode", + color: "from-purple-600 to-violet-700", + params: { instrumentalness: { min: 0.5 }, moodRelaxed: { min: 0.3 }, energy: { min: 0.2, max: 0.6 } }, + }, + { + id: "dance", + name: "Dance Party", + color: "from-pink-500 to-rose-600", + params: { moodParty: { min: 0.5 }, danceability: { min: 0.6 }, energy: { min: 0.5 } }, + }, + { + id: "acoustic", + name: "Acoustic Vibes", + color: "from-amber-500 to-yellow-600", + params: { moodAcoustic: { min: 0.5 }, moodElectronic: { max: 0.4 } }, + }, + { + id: "dark", + name: "Dark & Moody", + color: "from-gray-700 to-slate-800", + params: { moodAggressive: { min: 0.4 }, moodHappy: { max: 0.4 }, keyScale: "minor" }, + }, + { + id: "romantic", + name: "Romantic", + color: "from-rose-500 to-pink-600", + params: { moodRelaxed: { min: 0.3 }, moodAggressive: { max: 0.3 }, acousticness: { min: 0.3 }, energy: { max: 0.6 } }, + }, + { + id: "workout", + name: "Workout Beast", + color: "from-green-500 to-emerald-600", + params: { arousal: { min: 0.6 }, energy: { min: 0.7 }, moodRelaxed: { max: 0.4 }, bpm: { min: 110 } }, + }, + { + id: "sleepy", + name: "Sleep & Unwind", + color: "from-indigo-400 to-purple-500", + params: { moodRelaxed: { min: 0.5 }, energy: { max: 0.35 }, moodAggressive: { max: 0.2 } }, + }, + { + id: "confident", + name: "Confidence Boost", + color: "from-amber-400 to-orange-500", + params: { moodHappy: { min: 0.4 }, moodParty: { min: 0.3 }, energy: { min: 0.5 }, danceability: { min: 0.5 } }, + }, + ]; + + res.json(presets); +}); + +/** + * Save user's mood mix preferences + * These preferences are used to generate "Your Mood Mix" in the mix rotation + */ +router.post("/mood/save-preferences", async (req, res) => { + try { + const userId = getRequestUserId(req); + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + + const params = req.body; + + // Validate that at least some params are provided + if (!params || Object.keys(params).length === 0) { + return res.status(400).json({ error: "No mood parameters provided" }); + } + + // Save to user record + await prisma.user.update({ + where: { id: userId }, + data: { moodMixParams: params } + }); + + // Invalidate mix cache so the new mood mix appears + const cacheKey = `mixes:${userId}`; + await redisClient.del(cacheKey); + + console.log(`[MIXES] Saved mood mix preferences for user ${userId}`); + + res.json({ success: true, message: "Mood preferences saved" }); + } catch (error) { + console.error("Save mood preferences error:", error); + res.status(500).json({ error: "Failed to save mood preferences" }); + } +}); + +/** + * @openapi + * /mixes/refresh: + * post: + * summary: Force refresh all mixes + * description: Clears cache and regenerates all programmatic mixes + * tags: [Mixes] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * responses: + * 200: + * description: Mixes refreshed successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * example: "Mixes refreshed" + * mixes: + * type: array + * items: + * type: object + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.post("/refresh", async (req, res) => { + try { + const userId = getRequestUserId(req); + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + + // Clear cache + const cacheKey = `mixes:${userId}`; + await redisClient.del(cacheKey); + + // Regenerate mixes with random selection (not date-based) + const mixes = await programmaticPlaylistService.generateAllMixes( + userId, + true + ); + + // Cache for 1 hour + await redisClient.setEx(cacheKey, 3600, JSON.stringify(mixes)); + + res.json({ message: "Mixes refreshed", mixes }); + } catch (error) { + console.error("Refresh mixes error:", error); + res.status(500).json({ error: "Failed to refresh mixes" }); + } +}); + +/** + * @openapi + * /mixes/{id}/save: + * post: + * summary: Save a mix as a playlist + * description: Creates a new playlist with all tracks from the specified mix + * tags: [Mixes] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * description: Mix ID to save as playlist + * requestBody: + * required: false + * content: + * application/json: + * schema: + * type: object + * properties: + * name: + * type: string + * description: Optional custom name for the playlist (defaults to mix name) + * responses: + * 200: + * description: Playlist created successfully + * content: + * application/json: + * schema: + * type: object + * properties: + * id: + * type: string + * name: + * type: string + * trackCount: + * type: integer + * 404: + * description: Mix not found + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.post("/:id/save", async (req, res) => { + try { + const userId = getRequestUserId(req); + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + const mixId = req.params.id; + const customName = req.body.name; + + // Get the mix with track details + const cacheKey = `mixes:${userId}`; + let mixes; + + const cached = await redisClient.get(cacheKey); + if (cached) { + mixes = JSON.parse(cached); + } else { + mixes = await programmaticPlaylistService.generateAllMixes(userId); + await redisClient.setEx(cacheKey, 3600, JSON.stringify(mixes)); + } + + const mix = mixes.find((m: any) => m.id === mixId); + + if (!mix) { + return res.status(404).json({ error: "Mix not found" }); + } + + const existingPlaylist = await prisma.playlist.findFirst({ + where: { + userId, + mixId: mix.id, + }, + select: { + id: true, + name: true, + }, + }); + + if (existingPlaylist) { + return res.status(409).json({ + error: "Mix already saved as playlist", + playlistId: existingPlaylist.id, + name: existingPlaylist.name, + }); + } + + // Create playlist + const playlist = await prisma.playlist.create({ + data: { + userId, + mixId: mix.id, + name: customName || mix.name, + isPublic: false, + }, + }); + + // Add all tracks to the playlist + const playlistItems = mix.trackIds.map( + (trackId: string, index: number) => ({ + playlistId: playlist.id, + trackId, + sort: index, + }) + ); + + await prisma.playlistItem.createMany({ + data: playlistItems, + }); + + console.log( + `[MIXES] Saved mix ${mixId} as playlist ${playlist.id} (${mix.trackIds.length} tracks)` + ); + + res.json({ + id: playlist.id, + name: playlist.name, + trackCount: mix.trackIds.length, + }); + } catch (error) { + console.error("Save mix as playlist error:", error); + res.status(500).json({ error: "Failed to save mix as playlist" }); + } +}); + +/** + * @openapi + * /mixes/{id}: + * get: + * summary: Get a specific mix with full track details + * tags: [Mixes] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * description: Mix ID (e.g., "era-2000", "genre-rock", "top-tracks") + * responses: + * 200: + * description: Mix with full track details + * content: + * application/json: + * schema: + * type: object + * properties: + * id: + * type: string + * type: + * type: string + * name: + * type: string + * description: + * type: string + * trackIds: + * type: array + * items: + * type: string + * coverUrls: + * type: array + * items: + * type: string + * trackCount: + * type: integer + * tracks: + * type: array + * items: + * $ref: '#/components/schemas/Track' + * 404: + * description: Mix not found + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.get("/:id", async (req, res) => { + try { + const userId = getRequestUserId(req); + if (!userId) { + return res.status(401).json({ error: "Not authenticated" }); + } + const mixId = req.params.id; + + // Get all mixes (from cache if available) + const cacheKey = `mixes:${userId}`; + let mixes; + + const cached = await redisClient.get(cacheKey); + if (cached) { + mixes = JSON.parse(cached); + } else { + mixes = await programmaticPlaylistService.generateAllMixes(userId); + await redisClient.setEx(cacheKey, 3600, JSON.stringify(mixes)); + } + + // Find the specific mix + const mix = mixes.find((m: any) => m.id === mixId); + + if (!mix) { + return res.status(404).json({ error: "Mix not found" }); + } + + // Load full track details + const tracks = await prisma.track.findMany({ + where: { + id: { + in: mix.trackIds, + }, + }, + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + mbid: true, + }, + }, + }, + }, + }, + }); + + // Preserve mix order + const orderedTracks = mix.trackIds + .map((id: string) => tracks.find((t) => t.id === id)) + .filter((t: any) => t !== undefined); + + res.json({ + ...mix, + tracks: orderedTracks, + }); + } catch (error) { + console.error("Get mix error:", error); + res.status(500).json({ error: "Failed to get mix" }); + } +}); + +export default router; diff --git a/backend/src/routes/notifications.ts b/backend/src/routes/notifications.ts new file mode 100644 index 0000000..99b5ec8 --- /dev/null +++ b/backend/src/routes/notifications.ts @@ -0,0 +1,711 @@ +import { Router, Response } from "express"; +import { notificationService } from "../services/notificationService"; +import { AuthenticatedRequest, requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; + +const router = Router(); + +/** + * GET /notifications + * Get all uncleared notifications for the current user + */ +router.get( + "/", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + console.log( + `[Notifications] Fetching notifications for user ${ + req.user!.id + }` + ); + const notifications = await notificationService.getForUser( + req.user!.id + ); + console.log( + `[Notifications] Found ${notifications.length} notifications` + ); + res.json(notifications); + } catch (error: any) { + console.error("Error fetching notifications:", error); + res.status(500).json({ error: "Failed to fetch notifications" }); + } + } +); + +/** + * GET /notifications/unread-count + * Get count of unread notifications + */ +router.get( + "/unread-count", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + const count = await notificationService.getUnreadCount( + req.user!.id + ); + res.json({ count }); + } catch (error: any) { + console.error("Error fetching unread count:", error); + res.status(500).json({ error: "Failed to fetch unread count" }); + } + } +); + +/** + * POST /notifications/:id/read + * Mark a notification as read + */ +router.post( + "/:id/read", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + await notificationService.markAsRead(req.params.id, req.user!.id); + res.json({ success: true }); + } catch (error: any) { + console.error("Error marking notification as read:", error); + res.status(500).json({ + error: "Failed to mark notification as read", + }); + } + } +); + +/** + * POST /notifications/read-all + * Mark all notifications as read + */ +router.post( + "/read-all", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + await notificationService.markAllAsRead(req.user!.id); + res.json({ success: true }); + } catch (error: any) { + console.error("Error marking all notifications as read:", error); + res.status(500).json({ + error: "Failed to mark all notifications as read", + }); + } + } +); + +/** + * POST /notifications/:id/clear + * Clear (dismiss) a notification + */ +router.post( + "/:id/clear", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + await notificationService.clear(req.params.id, req.user!.id); + res.json({ success: true }); + } catch (error: any) { + console.error("Error clearing notification:", error); + res.status(500).json({ error: "Failed to clear notification" }); + } + } +); + +/** + * POST /notifications/clear-all + * Clear all notifications + */ +router.post( + "/clear-all", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + await notificationService.clearAll(req.user!.id); + res.json({ success: true }); + } catch (error: any) { + console.error("Error clearing all notifications:", error); + res.status(500).json({ + error: "Failed to clear all notifications", + }); + } + } +); + +// ============================================ +// Download History Endpoints +// ============================================ + +/** + * GET /notifications/downloads/history + * Get completed/failed downloads that haven't been cleared + */ +router.get( + "/downloads/history", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + const downloads = await prisma.downloadJob.findMany({ + where: { + userId: req.user!.id, + status: { in: ["completed", "failed", "exhausted"] }, + cleared: false, + }, + orderBy: { updatedAt: "desc" }, + take: 50, + }); + res.json(downloads); + } catch (error: any) { + console.error("Error fetching download history:", error); + res.status(500).json({ error: "Failed to fetch download history" }); + } + } +); + +/** + * GET /notifications/downloads/active + * Get active downloads (pending/processing) + */ +router.get( + "/downloads/active", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + const downloads = await prisma.downloadJob.findMany({ + where: { + userId: req.user!.id, + status: { in: ["pending", "processing"] }, + }, + orderBy: { createdAt: "desc" }, + }); + res.json(downloads); + } catch (error: any) { + console.error("Error fetching active downloads:", error); + res.status(500).json({ error: "Failed to fetch active downloads" }); + } + } +); + +/** + * POST /notifications/downloads/:id/clear + * Clear a download from history + */ +router.post( + "/downloads/:id/clear", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + await prisma.downloadJob.updateMany({ + where: { + id: req.params.id, + userId: req.user!.id, + }, + data: { cleared: true }, + }); + res.json({ success: true }); + } catch (error: any) { + console.error("Error clearing download:", error); + res.status(500).json({ error: "Failed to clear download" }); + } + } +); + +/** + * POST /notifications/downloads/clear-all + * Clear all completed/failed downloads from history + */ +router.post( + "/downloads/clear-all", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + await prisma.downloadJob.updateMany({ + where: { + userId: req.user!.id, + status: { in: ["completed", "failed", "exhausted"] }, + cleared: false, + }, + data: { cleared: true }, + }); + res.json({ success: true }); + } catch (error: any) { + console.error("Error clearing all downloads:", error); + res.status(500).json({ error: "Failed to clear all downloads" }); + } + } +); + +/** + * POST /notifications/downloads/:id/retry + * Retry a failed download + */ +router.post( + "/downloads/:id/retry", + requireAuth, + async (req: AuthenticatedRequest, res: Response) => { + try { + // Get the failed download + const failedJob = await prisma.downloadJob.findFirst({ + where: { + id: req.params.id, + userId: req.user!.id, + status: { in: ["failed", "exhausted"] }, + }, + }); + + if (!failedJob) { + return res + .status(404) + .json({ error: "Download not found or not failed" }); + } + + // If this was a pending-track retry job, re-run the pending-track retry flow + const metadata = failedJob.metadata as Record< + string, + unknown + > | null; + if (metadata?.downloadType === "pending-track-retry") { + const playlistId = metadata.playlistId as string | undefined; + const pendingTrackId = metadata.pendingTrackId as + | string + | undefined; + + if (!playlistId || !pendingTrackId) { + return res.status(400).json({ + error: "Cannot retry: missing playlistId or pendingTrackId", + }); + } + + // Mark old job as cleared + await prisma.downloadJob.update({ + where: { id: failedJob.id }, + data: { cleared: true }, + }); + + // Validate playlist ownership and pending track exists + const playlist = await prisma.playlist.findUnique({ + where: { id: playlistId }, + }); + if (!playlist || playlist.userId !== req.user!.id) { + return res + .status(404) + .json({ error: "Playlist not found" }); + } + + const pendingTrack = + await prisma.playlistPendingTrack.findUnique({ + where: { id: pendingTrackId }, + }); + if (!pendingTrack) { + return res + .status(404) + .json({ error: "Pending track not found" }); + } + + const retryTargetId = + pendingTrack.albumMbid || + pendingTrack.artistMbid || + `pendingTrack:${pendingTrack.id}`; + + const newJobRecord = await prisma.downloadJob.create({ + data: { + userId: req.user!.id, + subject: `${pendingTrack.spotifyArtist} - ${pendingTrack.spotifyTitle}`, + type: "track", + targetMbid: retryTargetId, + artistMbid: pendingTrack.artistMbid, + status: "processing", + attempts: 1, + startedAt: new Date(), + metadata: { + downloadType: "pending-track-retry", + source: "soulseek", + playlistId, + pendingTrackId, + spotifyArtist: pendingTrack.spotifyArtist, + spotifyTitle: pendingTrack.spotifyTitle, + spotifyAlbum: pendingTrack.spotifyAlbum, + albumMbid: pendingTrack.albumMbid, + }, + }, + }); + + const { soulseekService } = await import( + "../services/soulseek" + ); + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + + const settings = await getSystemSettings(); + if (!settings?.musicPath) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: "Music path not configured", + completedAt: new Date(), + }, + }); + return res.json({ + success: false, + newJobId: newJobRecord.id, + error: "Music path not configured", + }); + } + + if ( + !settings?.soulseekUsername || + !settings?.soulseekPassword + ) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: "Soulseek credentials not configured", + completedAt: new Date(), + }, + }); + return res.json({ + success: false, + newJobId: newJobRecord.id, + error: "Soulseek credentials not configured", + }); + } + + const albumName = + pendingTrack.spotifyAlbum !== "Unknown Album" + ? pendingTrack.spotifyAlbum + : pendingTrack.spotifyArtist; + + const searchResult = await soulseekService.searchTrack( + pendingTrack.spotifyArtist, + pendingTrack.spotifyTitle + ); + + if ( + !searchResult.found || + searchResult.allMatches.length === 0 + ) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: "No matching files found", + completedAt: new Date(), + }, + }); + return res.json({ + success: false, + newJobId: newJobRecord.id, + error: "No matching files found", + }); + } + + // Start download in background (don't await) + soulseekService + .downloadBestMatch( + pendingTrack.spotifyArtist, + pendingTrack.spotifyTitle, + albumName, + searchResult.allMatches, + settings.musicPath + ) + .then(async (result) => { + if (result.success) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "completed", + completedAt: new Date(), + metadata: { + ...(newJobRecord.metadata as any), + filePath: result.filePath, + }, + }, + }); + + try { + const { scanQueue } = await import( + "../workers/queues" + ); + await scanQueue.add( + "scan", + { + userId: req.user!.id, + source: "retry-pending-track", + albumMbid: + pendingTrack.albumMbid || undefined, + artistMbid: + pendingTrack.artistMbid || + undefined, + }, + { + priority: 1, + removeOnComplete: true, + } + ); + } catch { + // Best-effort; job status already reflects download + } + } else { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: result.error || "Download failed", + completedAt: new Date(), + }, + }); + } + }) + .catch(async (error) => { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: error?.message || "Download exception", + completedAt: new Date(), + }, + }); + }); + + return res.json({ success: true, newJobId: newJobRecord.id }); + } + + // If this was a spotify_import job, retry with Soulseek first + if (metadata?.downloadType === "spotify_import") { + const artistName = metadata.artistName as string; + const albumTitle = metadata.albumTitle as string; + + if (!artistName || !albumTitle) { + return res + .status(400) + .json({ + error: "Cannot retry: missing artist/album info", + }); + } + + // Mark old job as cleared + await prisma.downloadJob.update({ + where: { id: failedJob.id }, + data: { cleared: true }, + }); + + // Create a NEW download job record for the retry + const newJobRecord = await prisma.downloadJob.create({ + data: { + userId: req.user!.id, + type: "album", + targetMbid: + failedJob.targetMbid || `retry_${Date.now()}`, + artistMbid: failedJob.artistMbid, + subject: `${artistName} - ${albumTitle}`, + status: "processing", + attempts: 1, + startedAt: new Date(), + metadata: { + ...metadata, + retryAttempt: true, + }, + }, + }); + + // Try Soulseek first (async) + const { soulseekService } = await import( + "../services/soulseek" + ); + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + + const settings = await getSystemSettings(); + const musicPath = settings?.musicPath; + + if (!musicPath) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: "Music path not configured", + completedAt: new Date(), + }, + }); + return res.json({ + success: false, + newJobId: newJobRecord.id, + error: "Music path not configured", + }); + } + + // Build track from album info (single track search using album as title) + const tracks = [ + { + artist: artistName, + title: albumTitle, + album: albumTitle, + }, + ]; + + console.log( + `[Retry] Trying Soulseek for ${artistName} - ${albumTitle}` + ); + + // Run Soulseek search async + soulseekService + .searchAndDownloadBatch(tracks, musicPath, 4) + .then(async (result) => { + if (result.successful > 0) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "completed", + completedAt: new Date(), + error: null, + metadata: { + ...metadata, + source: "soulseek", + tracksDownloaded: result.successful, + files: result.files, + }, + }, + }); + console.log( + `[Retry] ✓ Soulseek downloaded ${result.successful} tracks for ${artistName} - ${albumTitle}` + ); + + // Trigger library scan + const { scanQueue } = await import( + "../workers/queues" + ); + await scanQueue.add("scan", { + paths: [], + fullScan: false, + userId: req.user!.id, + source: "retry-spotify-import", + }); + } else { + // Soulseek failed, try Lidarr if we have an MBID + console.log( + `[Retry] Soulseek failed, trying Lidarr for ${artistName} - ${albumTitle}` + ); + + if ( + failedJob.targetMbid && + !failedJob.targetMbid.startsWith("retry_") + ) { + const { simpleDownloadManager } = await import( + "../services/simpleDownloadManager" + ); + const lidarrResult = + await simpleDownloadManager.startDownload( + newJobRecord.id, + artistName, + albumTitle, + failedJob.targetMbid, + req.user!.id, + false + ); + + if (!lidarrResult.success) { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: + lidarrResult.error || + "Both Soulseek and Lidarr failed", + completedAt: new Date(), + }, + }); + } + } else { + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: "No tracks found on Soulseek, no MBID for Lidarr fallback", + completedAt: new Date(), + }, + }); + } + } + }) + .catch(async (error) => { + console.error(`[Retry] Soulseek error:`, error); + await prisma.downloadJob.update({ + where: { id: newJobRecord.id }, + data: { + status: "failed", + error: error?.message || "Soulseek error", + completedAt: new Date(), + }, + }); + }); + + return res.json({ success: true, newJobId: newJobRecord.id }); + } + + // Validate that we have the required MBIDs + if (!failedJob.targetMbid) { + return res + .status(400) + .json({ error: "Cannot retry: missing album MBID" }); + } + + // Mark old job as cleared + await prisma.downloadJob.update({ + where: { id: failedJob.id }, + data: { cleared: true }, + }); + + // Extract parameters from the failed job + // Subject is typically "Artist - Album" format + const subjectParts = failedJob.subject.split(" - "); + const artistName = subjectParts[0] || failedJob.subject; + const albumTitle = + (metadata?.albumTitle as string) || + subjectParts[1] || + failedJob.subject; + + // Create a NEW download job record for the retry + const newJobRecord = await prisma.downloadJob.create({ + data: { + userId: req.user!.id, + type: failedJob.type as "artist" | "album", + targetMbid: failedJob.targetMbid, + artistMbid: failedJob.artistMbid, + subject: failedJob.subject, + status: "pending", + metadata: metadata || {}, + }, + }); + + // Import the download manager dynamically to avoid circular deps + const { simpleDownloadManager } = await import( + "../services/simpleDownloadManager" + ); + + // Start download with the correct positional arguments + // startDownload(jobId, artistName, albumTitle, albumMbid, userId, isDiscovery) + const result = await simpleDownloadManager.startDownload( + newJobRecord.id, + artistName, + albumTitle, + failedJob.targetMbid, + req.user!.id, + false // isDiscovery + ); + + res.json({ + success: result.success, + newJobId: newJobRecord.id, + error: result.error, + }); + } catch (error: any) { + console.error("Error retrying download:", error); + res.status(500).json({ error: "Failed to retry download" }); + } + } +); + +export default router; diff --git a/backend/src/routes/offline.ts b/backend/src/routes/offline.ts new file mode 100644 index 0000000..04e139c --- /dev/null +++ b/backend/src/routes/offline.ts @@ -0,0 +1,286 @@ +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { z } from "zod"; + +const router = Router(); + +router.use(requireAuth); + +const downloadAlbumSchema = z.object({ + quality: z.enum(["original", "high", "medium", "low"]).optional(), +}); + +// POST /offline/albums/:id/download +router.post("/albums/:id/download", async (req, res) => { + try { + const userId = req.session.userId!; + const albumId = req.params.id; + const { quality } = downloadAlbumSchema.parse(req.body); + + // Get user's default quality if not specified + let selectedQuality = quality; + if (!selectedQuality) { + const settings = await prisma.userSettings.findUnique({ + where: { userId }, + }); + selectedQuality = (settings?.playbackQuality as any) || "medium"; + } + + // Get album with tracks + const album = await prisma.album.findUnique({ + where: { id: albumId }, + include: { + tracks: { + orderBy: { trackNo: "asc" }, + }, + artist: { + select: { + name: true, + }, + }, + }, + }); + + if (!album) { + return res.status(404).json({ error: "Album not found" }); + } + + // Calculate total size estimate + const avgSizeMb: Record = { + original: 30, // FLAC + high: 10, // MP3 320 + medium: 6, // MP3 192 + low: 4, // MP3 128 + }; + + const estimatedSizeMb = + album.tracks.length * avgSizeMb[selectedQuality]; + + // Check user's cache limit + const settings = await prisma.userSettings.findUnique({ + where: { userId }, + }); + + if (settings) { + const currentCacheSize = await prisma.cachedTrack.aggregate({ + where: { userId }, + _sum: { fileSizeMb: true }, + }); + + const currentSize = currentCacheSize._sum.fileSizeMb || 0; + + if (currentSize + estimatedSizeMb > settings.maxCacheSizeMb) { + return res.status(400).json({ + error: "Cache size limit exceeded", + currentSize, + maxSize: settings.maxCacheSizeMb, + needed: estimatedSizeMb, + }); + } + } + + // Create download job (tracks to be downloaded by mobile client) + const downloadJob = { + albumId: album.id, + albumTitle: album.title, + artistName: album.artist.name, + quality: selectedQuality, + tracks: album.tracks.map((track) => ({ + trackId: track.id, + title: track.title, + trackNo: track.trackNo, + duration: track.duration, + streamUrl: `/library/tracks/${track.id}/stream?quality=${selectedQuality}`, + })), + estimatedSizeMb, + }; + + res.json(downloadJob); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: error.errors }); + } + console.error("Create download job error:", error); + res.status(500).json({ error: "Failed to create download job" }); + } +}); + +// POST /offline/tracks/:id/complete (called by mobile after download) +router.post("/tracks/:id/complete", async (req, res) => { + try { + const userId = req.session.userId!; + const trackId = req.params.id; + const { localPath, quality, fileSizeMb } = req.body; + + if (!localPath || !quality || !fileSizeMb) { + return res + .status(400) + .json({ error: "localPath, quality, and fileSizeMb required" }); + } + + const cachedTrack = await prisma.cachedTrack.upsert({ + where: { + userId_trackId_quality: { + userId, + trackId, + quality, + }, + }, + create: { + userId, + trackId, + localPath, + quality, + fileSizeMb: parseFloat(fileSizeMb), + }, + update: { + localPath, + fileSizeMb: parseFloat(fileSizeMb), + lastAccessedAt: new Date(), + }, + }); + + res.json(cachedTrack); + } catch (error) { + console.error("Complete track download error:", error); + res.status(500).json({ error: "Failed to complete download" }); + } +}); + +// GET /offline/albums +router.get("/albums", async (req, res) => { + try { + const userId = req.session.userId!; + + // Get all cached tracks grouped by album + const cachedTracks = await prisma.cachedTrack.findMany({ + where: { userId }, + include: { + track: { + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + mbid: true, + }, + }, + }, + }, + }, + }, + }, + }); + + // Group by album + const albumsMap = new Map(); + + for (const cached of cachedTracks) { + const albumId = cached.track.album.id; + + if (!albumsMap.has(albumId)) { + albumsMap.set(albumId, { + album: cached.track.album, + tracks: [], + totalSizeMb: 0, + }); + } + + const albumData = albumsMap.get(albumId); + albumData.tracks.push({ + ...cached.track, + cachedPath: cached.localPath, + cachedQuality: cached.quality, + cachedSizeMb: cached.fileSizeMb, + }); + albumData.totalSizeMb += cached.fileSizeMb; + } + + const albums = Array.from(albumsMap.values()).map((data) => ({ + ...data.album, + cachedTracks: data.tracks, + totalSizeMb: data.totalSizeMb, + })); + + res.json(albums); + } catch (error) { + console.error("Get cached albums error:", error); + res.status(500).json({ error: "Failed to get cached albums" }); + } +}); + +// DELETE /offline/albums/:id +router.delete("/albums/:id", async (req, res) => { + try { + const userId = req.session.userId!; + const albumId = req.params.id; + + // Get all cached tracks for this album + const cachedTracks = await prisma.cachedTrack.findMany({ + where: { + userId, + track: { + albumId, + }, + }, + }); + + // Delete all cached tracks for this album + await prisma.cachedTrack.deleteMany({ + where: { + userId, + track: { + albumId, + }, + }, + }); + + res.json({ + message: "Album removed from cache", + deletedCount: cachedTracks.length, + }); + } catch (error) { + console.error("Delete cached album error:", error); + res.status(500).json({ error: "Failed to delete cached album" }); + } +}); + +// GET /offline/stats +router.get("/stats", async (req, res) => { + try { + const userId = req.session.userId!; + + const [settings, cacheStats] = await Promise.all([ + prisma.userSettings.findUnique({ + where: { userId }, + }), + prisma.cachedTrack.aggregate({ + where: { userId }, + _sum: { fileSizeMb: true }, + _count: true, + }), + ]); + + const usedMb = cacheStats._sum.fileSizeMb || 0; + const maxMb = settings?.maxCacheSizeMb || 5120; + const trackCount = cacheStats._count || 0; + + res.json({ + usedMb, + maxMb, + availableMb: maxMb - usedMb, + percentUsed: (usedMb / maxMb) * 100, + trackCount, + }); + } catch (error) { + console.error("Get cache stats error:", error); + res.status(500).json({ error: "Failed to get cache stats" }); + } +}); + +export default router; diff --git a/backend/src/routes/onboarding.ts b/backend/src/routes/onboarding.ts new file mode 100644 index 0000000..edca0cd --- /dev/null +++ b/backend/src/routes/onboarding.ts @@ -0,0 +1,475 @@ +import { Router } from "express"; +import { prisma } from "../utils/db"; +import bcrypt from "bcrypt"; +import { z } from "zod"; +import axios from "axios"; +import crypto from "crypto"; +import { encryptField } from "../utils/systemSettings"; +import { writeEnvFile } from "../utils/envWriter"; +import { generateToken, requireAuth } from "../middleware/auth"; + +const router = Router(); + +// Validation schemas +const registerSchema = z.object({ + username: z.string().min(3).max(50), + password: z.string().min(6), +}); + +const lidarrConfigSchema = z.object({ + url: z.string().url().optional().or(z.literal("")), + apiKey: z.string().optional().or(z.literal("")), + enabled: z.boolean(), +}); + +const audiobookshelfConfigSchema = z.object({ + url: z.string().url().optional().or(z.literal("")), + apiKey: z.string().optional().or(z.literal("")), + enabled: z.boolean(), +}); + +const soulseekConfigSchema = z.object({ + username: z.string().optional().or(z.literal("")), + password: z.string().optional().or(z.literal("")), + enabled: z.boolean(), +}); + +const enrichmentConfigSchema = z.object({ + enabled: z.boolean(), +}); + +/** + * Generate a secure encryption key for settings encryption + * This is called automatically during first user registration + */ +async function ensureEncryptionKey(): Promise { + // Check if encryption key already exists + if ( + process.env.SETTINGS_ENCRYPTION_KEY && + process.env.SETTINGS_ENCRYPTION_KEY !== + "default-encryption-key-change-me" + ) { + console.log("[ONBOARDING] Encryption key already exists"); + return; + } + + // Generate a secure 32-byte encryption key + const encryptionKey = crypto.randomBytes(32).toString("base64"); + + console.log( + "[ONBOARDING] Generating encryption key for settings security..." + ); + + try { + // Write to .env file + await writeEnvFile({ + SETTINGS_ENCRYPTION_KEY: encryptionKey, + }); + + // Update the process environment so it's available immediately + process.env.SETTINGS_ENCRYPTION_KEY = encryptionKey; + + console.log("[ONBOARDING] Encryption key generated and saved to .env"); + } catch (error) { + console.error("[ONBOARDING] ✗ Failed to save encryption key:", error); + throw new Error("Failed to generate encryption key"); + } +} + +/** + * POST /onboarding/register + * Step 1: Create user account - returns JWT token like regular login + */ +router.post("/register", async (req, res) => { + try { + console.log("[ONBOARDING] Register attempt for user:", req.body?.username); + const { username, password } = registerSchema.parse(req.body); + + // Check if any user exists (first user becomes admin) + const userCount = await prisma.user.count(); + const isFirstUser = userCount === 0; + + // If this is the first user, ensure encryption key is generated + if (isFirstUser) { + await ensureEncryptionKey(); + } + + // Check if username is taken + const existing = await prisma.user.findUnique({ + where: { username }, + }); + + if (existing) { + console.log("[ONBOARDING] Username already taken:", username); + return res.status(400).json({ error: "Username already taken" }); + } + + // Create user + const passwordHash = await bcrypt.hash(password, 10); + const user = await prisma.user.create({ + data: { + username, + passwordHash, + role: isFirstUser ? "admin" : "user", + onboardingComplete: false, + }, + }); + + // Create default user settings with optimal defaults + await prisma.userSettings.create({ + data: { + userId: user.id, + playbackQuality: "original", + wifiOnly: false, + offlineEnabled: false, + maxCacheSizeMb: 10240, // 10GB + }, + }); + + // Generate JWT token (same as login) + const token = generateToken({ + id: user.id, + username: user.username, + role: user.role, + }); + + console.log("[ONBOARDING] User created successfully:", user.username); + res.json({ + token, + user: { + id: user.id, + username: user.username, + role: user.role, + onboardingComplete: false, + }, + }); + } catch (err: any) { + if (err instanceof z.ZodError) { + console.error("[ONBOARDING] Validation error:", err.errors); + return res + .status(400) + .json({ error: "Invalid request", details: err.errors }); + } + console.error("Registration error:", err); + res.status(500).json({ error: "Failed to create account" }); + } +}); + +/** + * POST /onboarding/lidarr + * Step 2a: Configure Lidarr integration + */ +router.post("/lidarr", requireAuth, async (req, res) => { + try { + const config = lidarrConfigSchema.parse(req.body); + + // If not enabled, just save as disabled + if (!config.enabled) { + const settings = await prisma.systemSettings.findFirst(); + if (settings) { + await prisma.systemSettings.update({ + where: { id: settings.id }, + data: { lidarrEnabled: false }, + }); + } + return res.json({ success: true, tested: false }); + } + + // Test connection if enabled (non-blocking - save anyway) + let connectionTested = false; + if (config.url && config.apiKey) { + try { + const response = await axios.get( + `${config.url}/api/v1/system/status`, + { + headers: { "X-Api-Key": config.apiKey }, + timeout: 5000, + } + ); + + if (response.status === 200) { + connectionTested = true; + console.log("Lidarr connection test successful"); + } + } catch (error: any) { + console.warn( + " Lidarr connection test failed (saved anyway):", + error.message + ); + // Don't block - just log the warning + } + } + + // Save to system settings (even if connection test failed) + await prisma.systemSettings.upsert({ + where: { id: "default" }, + create: { + id: "default", + lidarrEnabled: config.enabled, + lidarrUrl: config.url || null, + lidarrApiKey: encryptField(config.apiKey), + }, + update: { + lidarrEnabled: config.enabled, + lidarrUrl: config.url || null, + lidarrApiKey: encryptField(config.apiKey), + }, + }); + + res.json({ + success: true, + tested: connectionTested, + warning: connectionTested + ? null + : "Connection test failed but settings saved. You can test again in Settings.", + }); + } catch (err: any) { + if (err instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: err.errors }); + } + console.error("Lidarr config error:", err); + res.status(500).json({ error: "Failed to save configuration" }); + } +}); + +/** + * POST /onboarding/audiobookshelf + * Step 2b: Configure Audiobookshelf integration + */ +router.post("/audiobookshelf", requireAuth, async (req, res) => { + try { + const config = audiobookshelfConfigSchema.parse(req.body); + + // If not enabled, just save as disabled + if (!config.enabled) { + const settings = await prisma.systemSettings.findFirst(); + if (settings) { + await prisma.systemSettings.update({ + where: { id: settings.id }, + data: { audiobookshelfEnabled: false }, + }); + } + return res.json({ success: true, tested: false }); + } + + // Test connection if enabled (non-blocking - save anyway) + let connectionTested = false; + if (config.url && config.apiKey) { + try { + const response = await axios.get(`${config.url}/api/me`, { + headers: { Authorization: `Bearer ${config.apiKey}` }, + timeout: 5000, + }); + + if (response.status === 200) { + connectionTested = true; + console.log("Audiobookshelf connection test successful"); + } + } catch (error: any) { + console.warn( + " Audiobookshelf connection test failed (saved anyway):", + error.message + ); + // Don't block - just log the warning + } + } + + // Save to system settings (even if connection test failed) + await prisma.systemSettings.upsert({ + where: { id: "default" }, + create: { + id: "default", + audiobookshelfEnabled: config.enabled, + audiobookshelfUrl: config.url || null, + audiobookshelfApiKey: encryptField(config.apiKey), + }, + update: { + audiobookshelfEnabled: config.enabled, + audiobookshelfUrl: config.url || null, + audiobookshelfApiKey: encryptField(config.apiKey), + }, + }); + + res.json({ + success: true, + tested: connectionTested, + warning: connectionTested + ? null + : "Connection test failed but settings saved. You can test again in Settings.", + }); + } catch (err: any) { + if (err instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: err.errors }); + } + console.error("Audiobookshelf config error:", err); + res.status(500).json({ error: "Failed to save configuration" }); + } +}); + +/** + * POST /onboarding/soulseek + * Step 2c: Configure Soulseek integration (direct connection via slsk-client) + */ +router.post("/soulseek", requireAuth, async (req, res) => { + try { + const config = soulseekConfigSchema.parse(req.body); + + // If not enabled, clear credentials + if (!config.enabled) { + await prisma.systemSettings.upsert({ + where: { id: "default" }, + create: { + id: "default", + soulseekUsername: null, + soulseekPassword: null, + }, + update: { + soulseekUsername: null, + soulseekPassword: null, + }, + }); + return res.json({ success: true, tested: false }); + } + + // If enabled, require credentials + if (!config.username || !config.password) { + return res.status(400).json({ + error: "Soulseek username and password are required", + }); + } + + // Save to system settings + await prisma.systemSettings.upsert({ + where: { id: "default" }, + create: { + id: "default", + soulseekUsername: config.username, + soulseekPassword: encryptField(config.password), + }, + update: { + soulseekUsername: config.username, + soulseekPassword: encryptField(config.password), + }, + }); + + res.json({ success: true, tested: true }); + } catch (err: any) { + if (err instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: err.errors }); + } + console.error("Soulseek config error:", err); + res.status(500).json({ error: "Failed to save configuration" }); + } +}); + +/** + * POST /onboarding/enrichment + * Step 3: Configure metadata enrichment + */ +router.post("/enrichment", requireAuth, async (req, res) => { + try { + const config = enrichmentConfigSchema.parse(req.body); + + // Update user settings + await prisma.user.update({ + where: { id: req.user!.id }, + data: { + enrichmentSettings: { + enabled: config.enabled, + lastRun: null, + }, + }, + }); + + res.json({ success: true }); + } catch (err: any) { + if (err instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: err.errors }); + } + console.error("Enrichment config error:", err); + res.status(500).json({ error: "Failed to save configuration" }); + } +}); + +/** + * POST /onboarding/complete + * Final step: Mark onboarding as complete + */ +router.post("/complete", requireAuth, async (req, res) => { + try { + await prisma.user.update({ + where: { id: req.user!.id }, + data: { onboardingComplete: true }, + }); + + console.log("[ONBOARDING] User completed onboarding:", req.user!.id); + res.json({ success: true }); + } catch (err: any) { + console.error("Onboarding complete error:", err); + res.status(500).json({ error: "Failed to complete onboarding" }); + } +}); + +/** + * GET /onboarding/status + * Check if user needs onboarding + */ +router.get("/status", async (req, res) => { + try { + // Check if any users exist in the system + const userCount = await prisma.user.count(); + const hasAccount = userCount > 0; + + // Check for JWT token in Authorization header + const authHeader = req.headers.authorization; + const token = authHeader?.startsWith("Bearer ") + ? authHeader.substring(7) + : null; + + // If no token, return whether any users exist + if (!token) { + return res.json({ + needsOnboarding: !hasAccount, + hasAccount, + }); + } + + // Try to verify token and check onboarding status + try { + const jwt = require("jsonwebtoken"); + const JWT_SECRET = + process.env.JWT_SECRET || + "your-secret-key-change-in-production"; + const decoded = jwt.verify(token, JWT_SECRET) as { userId: string }; + + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + select: { onboardingComplete: true }, + }); + + res.json({ + needsOnboarding: !user?.onboardingComplete, + hasAccount: true, + }); + } catch { + // Invalid token - return basic status + res.json({ + needsOnboarding: !hasAccount, + hasAccount, + }); + } + } catch (err: any) { + console.error("Onboarding status error:", err); + res.status(500).json({ error: "Failed to check status" }); + } +}); + +export default router; diff --git a/backend/src/routes/playbackState.ts b/backend/src/routes/playbackState.ts new file mode 100644 index 0000000..b4245e2 --- /dev/null +++ b/backend/src/routes/playbackState.ts @@ -0,0 +1,149 @@ +import express from "express"; +import { prisma } from "../utils/db"; +import { requireAuth } from "../middleware/auth"; + +const router = express.Router(); + +// Get current playback state for the authenticated user +router.get("/", requireAuth, async (req, res) => { + try { + const userId = req.user!.id; + + const playbackState = await prisma.playbackState.findUnique({ + where: { userId }, + }); + + if (!playbackState) { + return res.json(null); + } + + res.json(playbackState); + } catch (error) { + console.error("Get playback state error:", error); + res.status(500).json({ error: "Failed to get playback state" }); + } +}); + +// Update current playback state for the authenticated user +router.post("/", requireAuth, async (req, res) => { + try { + const userId = req.user!.id; + const { + playbackType, + trackId, + audiobookId, + podcastId, + queue, + currentIndex, + isShuffle, + } = req.body; + + // Validate required field + if (!playbackType) { + return res.status(400).json({ error: "playbackType is required" }); + } + + // Validate playback type + const validPlaybackTypes = ["track", "audiobook", "podcast"]; + if (!validPlaybackTypes.includes(playbackType)) { + console.warn(`[PlaybackState] Invalid playbackType: ${playbackType}`); + return res.status(400).json({ error: "Invalid playbackType" }); + } + + // Limit queue size and sanitize queue items to prevent database issues + let safeQueue: any[] | null = null; + if (Array.isArray(queue) && queue.length > 0) { + // Only keep essential fields from each queue item to reduce JSON size + // Filter out any invalid items first + try { + safeQueue = queue + .slice(0, 100) + .filter((item: any) => item && item.id) // Must have at least an ID + .map((item: any) => ({ + id: String(item.id || ""), + title: String(item.title || "Unknown").substring(0, 500), // Limit title length + duration: Number(item.duration) || 0, + artist: item.artist ? { + id: String(item.artist.id || ""), + name: String(item.artist.name || "Unknown").substring(0, 200), + } : null, + album: item.album ? { + id: String(item.album.id || ""), + title: String(item.album.title || "Unknown").substring(0, 500), + coverArt: item.album.coverArt ? String(item.album.coverArt).substring(0, 1000) : null, + } : null, + })); + + // If sanitization removed all items, set to null + if (safeQueue.length === 0) { + safeQueue = null; + } + } catch (sanitizeError: any) { + console.error("[PlaybackState] Queue sanitization failed:", sanitizeError?.message); + safeQueue = null; // Fall back to null queue + } + } + + const safeCurrentIndex = Math.min( + Math.max(0, currentIndex || 0), + safeQueue?.length ? safeQueue.length - 1 : 0 + ); + + const playbackState = await prisma.playbackState.upsert({ + where: { userId }, + update: { + playbackType, + trackId: trackId || null, + audiobookId: audiobookId || null, + podcastId: podcastId || null, + queue: safeQueue, + currentIndex: safeCurrentIndex, + isShuffle: isShuffle || false, + }, + create: { + userId, + playbackType, + trackId: trackId || null, + audiobookId: audiobookId || null, + podcastId: podcastId || null, + queue: safeQueue, + currentIndex: safeCurrentIndex, + isShuffle: isShuffle || false, + }, + }); + + res.json(playbackState); + } catch (error: any) { + console.error("[PlaybackState] Error saving state:", error?.message || error); + console.error("[PlaybackState] Full error:", JSON.stringify(error, Object.getOwnPropertyNames(error), 2)); + if (error?.code) { + console.error("[PlaybackState] Error code:", error.code); + } + if (error?.meta) { + console.error("[PlaybackState] Prisma meta:", error.meta); + } + // Return more specific error for debugging + res.status(500).json({ + error: "Internal server error", + details: error?.message || "Unknown error" + }); + } +}); + +// Clear playback state (when user stops playback completely) +router.delete("/", requireAuth, async (req, res) => { + try { + const userId = req.user!.id; + + await prisma.playbackState.delete({ + where: { userId }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Delete playback state error:", error); + res.status(500).json({ error: "Failed to delete playback state" }); + } +}); + +export default router; diff --git a/backend/src/routes/playlists.ts b/backend/src/routes/playlists.ts new file mode 100644 index 0000000..791e683 --- /dev/null +++ b/backend/src/routes/playlists.ts @@ -0,0 +1,985 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { z } from "zod"; +import { sessionLog } from "../utils/playlistLogger"; + +const router = Router(); + +router.use(requireAuthOrToken); + +const createPlaylistSchema = z.object({ + name: z.string().min(1).max(200), + isPublic: z.boolean().optional().default(false), +}); + +const addTrackSchema = z.object({ + trackId: z.string(), +}); + +// GET /playlists +router.get("/", async (req, res) => { + try { + const userId = req.user.id; + + // Get user's hidden playlists + const hiddenPlaylists = await prisma.hiddenPlaylist.findMany({ + where: { userId }, + select: { playlistId: true }, + }); + const hiddenPlaylistIds = new Set( + hiddenPlaylists.map((h) => h.playlistId) + ); + + const playlists = await prisma.playlist.findMany({ + where: { + OR: [{ userId }, { isPublic: true }], + }, + orderBy: { createdAt: "desc" }, + include: { + user: { + select: { + username: true, + }, + }, + items: { + include: { + track: { + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + }, + }, + }, + }, + }, + }, + }, + orderBy: { sort: "asc" }, + }, + }, + }); + + const playlistsWithCounts = playlists.map((playlist) => ({ + ...playlist, + trackCount: playlist.items.length, + isOwner: playlist.userId === userId, + isHidden: hiddenPlaylistIds.has(playlist.id), + })); + + // Debug: log shared playlists with user info + const sharedPlaylists = playlistsWithCounts.filter((p) => !p.isOwner); + if (sharedPlaylists.length > 0) { + console.log( + `[Playlists] Found ${sharedPlaylists.length} shared playlists for user ${userId}:` + ); + sharedPlaylists.forEach((p) => { + console.log( + ` - "${p.name}" by ${ + p.user?.username || "UNKNOWN" + } (owner: ${p.userId})` + ); + }); + } + + res.json(playlistsWithCounts); + } catch (error) { + console.error("Get playlists error:", error); + res.status(500).json({ error: "Failed to get playlists" }); + } +}); + +// POST /playlists +router.post("/", async (req, res) => { + try { + const userId = req.user.id; + const data = createPlaylistSchema.parse(req.body); + + const playlist = await prisma.playlist.create({ + data: { + userId, + name: data.name, + isPublic: data.isPublic, + }, + }); + + res.json(playlist); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: error.errors }); + } + console.error("Create playlist error:", error); + res.status(500).json({ error: "Failed to create playlist" }); + } +}); + +// GET /playlists/:id +router.get("/:id", async (req, res) => { + try { + const userId = req.user.id; + + const playlist = await prisma.playlist.findUnique({ + where: { id: req.params.id }, + include: { + user: { + select: { + username: true, + }, + }, + items: { + include: { + track: { + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + mbid: true, + }, + }, + }, + }, + }, + }, + }, + orderBy: { sort: "asc" }, + }, + pendingTracks: { + orderBy: { sort: "asc" }, + }, + }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + // Check access permissions + if (!playlist.isPublic && playlist.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + // Format playlist items + const formattedItems = playlist.items.map((item) => ({ + ...item, + type: "track" as const, + track: { + ...item.track, + album: { + ...item.track.album, + coverArt: item.track.album.coverUrl, + }, + }, + })); + + // Format pending tracks + const formattedPending = playlist.pendingTracks.map((pending) => ({ + id: pending.id, + type: "pending" as const, + sort: pending.sort, + pending: { + id: pending.id, + artist: pending.spotifyArtist, + title: pending.spotifyTitle, + album: pending.spotifyAlbum, + previewUrl: pending.deezerPreviewUrl, + }, + })); + + // Merge and sort by position + const mergedItems = [ + ...formattedItems.map((item) => ({ ...item, sort: item.sort })), + ...formattedPending, + ].sort((a, b) => a.sort - b.sort); + + res.json({ + ...playlist, + isOwner: playlist.userId === userId, + trackCount: playlist.items.length, + pendingCount: playlist.pendingTracks.length, + items: formattedItems, + pendingTracks: formattedPending, + mergedItems, + }); + } catch (error) { + console.error("Get playlist error:", error); + res.status(500).json({ error: "Failed to get playlist" }); + } +}); + +// PUT /playlists/:id +router.put("/:id", async (req, res) => { + try { + const userId = req.user.id; + const data = createPlaylistSchema.parse(req.body); + + // Check ownership + const existing = await prisma.playlist.findUnique({ + where: { id: req.params.id }, + }); + + if (!existing) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (existing.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + const playlist = await prisma.playlist.update({ + where: { id: req.params.id }, + data: { + name: data.name, + isPublic: data.isPublic, + }, + }); + + res.json(playlist); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: error.errors }); + } + console.error("Update playlist error:", error); + res.status(500).json({ error: "Failed to update playlist" }); + } +}); + +// POST /playlists/:id/hide - Hide any playlist from your view +router.post("/:id/hide", async (req, res) => { + try { + const userId = req.user.id; + const playlistId = req.params.id; + + // Check playlist exists + const playlist = await prisma.playlist.findUnique({ + where: { id: playlistId }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + // User must own the playlist OR it must be public (shared) + if (playlist.userId !== userId && !playlist.isPublic) { + return res.status(403).json({ error: "Access denied" }); + } + + // Create hidden record (upsert to handle re-hiding) + await prisma.hiddenPlaylist.upsert({ + where: { + userId_playlistId: { userId, playlistId }, + }, + create: { userId, playlistId }, + update: {}, + }); + + res.json({ message: "Playlist hidden", isHidden: true }); + } catch (error) { + console.error("Hide playlist error:", error); + res.status(500).json({ error: "Failed to hide playlist" }); + } +}); + +// DELETE /playlists/:id/hide - Unhide a shared playlist +router.delete("/:id/hide", async (req, res) => { + try { + const userId = req.user.id; + const playlistId = req.params.id; + + // Delete hidden record if exists + await prisma.hiddenPlaylist.deleteMany({ + where: { userId, playlistId }, + }); + + res.json({ message: "Playlist unhidden", isHidden: false }); + } catch (error) { + console.error("Unhide playlist error:", error); + res.status(500).json({ error: "Failed to unhide playlist" }); + } +}); + +// DELETE /playlists/:id +router.delete("/:id", async (req, res) => { + try { + const userId = req.user.id; + + // Check ownership + const existing = await prisma.playlist.findUnique({ + where: { id: req.params.id }, + }); + + if (!existing) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (existing.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + await prisma.playlist.delete({ + where: { id: req.params.id }, + }); + + res.json({ message: "Playlist deleted" }); + } catch (error) { + console.error("Delete playlist error:", error); + res.status(500).json({ error: "Failed to delete playlist" }); + } +}); + +// POST /playlists/:id/items +router.post("/:id/items", async (req, res) => { + try { + const userId = req.user.id; + const parsedBody = addTrackSchema.safeParse(req.body); + if (!parsedBody.success) { + return res.status(400).json({ + error: "Invalid request", + details: parsedBody.error.errors, + }); + } + const { trackId } = parsedBody.data; + + // Check ownership + const playlist = await prisma.playlist.findUnique({ + where: { id: req.params.id }, + include: { + items: { + orderBy: { sort: "desc" }, + take: 1, + }, + }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + // Check if track exists + const track = await prisma.track.findUnique({ + where: { id: trackId }, + }); + + if (!track) { + return res.status(404).json({ error: "Track not found" }); + } + + // Check if track already in playlist + const existing = await prisma.playlistItem.findUnique({ + where: { + playlistId_trackId: { + playlistId: req.params.id, + trackId, + }, + }, + }); + + if (existing) { + return res.status(200).json({ + message: "Track already in playlist", + duplicated: true, + item: existing, + }); + } + + // Get next sort position + const maxSort = playlist.items[0]?.sort || 0; + + const item = await prisma.playlistItem.create({ + data: { + playlistId: req.params.id, + trackId, + sort: maxSort + 1, + }, + include: { + track: { + include: { + album: { + include: { + artist: true, + }, + }, + }, + }, + }, + }); + + res.json(item); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: error.errors }); + } + console.error("Add track to playlist error:", error); + res.status(500).json({ error: "Failed to add track to playlist" }); + } +}); + +// DELETE /playlists/:id/items/:trackId +router.delete("/:id/items/:trackId", async (req, res) => { + try { + const userId = req.user.id; + + // Check ownership + const playlist = await prisma.playlist.findUnique({ + where: { id: req.params.id }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + await prisma.playlistItem.delete({ + where: { + playlistId_trackId: { + playlistId: req.params.id, + trackId: req.params.trackId, + }, + }, + }); + + res.json({ message: "Track removed from playlist" }); + } catch (error) { + console.error("Remove track from playlist error:", error); + res.status(500).json({ error: "Failed to remove track from playlist" }); + } +}); + +// PUT /playlists/:id/items/reorder +router.put("/:id/items/reorder", async (req, res) => { + try { + const userId = req.user.id; + const { trackIds } = req.body; // Array of track IDs in new order + + if (!Array.isArray(trackIds)) { + return res.status(400).json({ error: "trackIds must be an array" }); + } + + // Check ownership + const playlist = await prisma.playlist.findUnique({ + where: { id: req.params.id }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + // Update sort order for each track + const updates = trackIds.map((trackId, index) => + prisma.playlistItem.update({ + where: { + playlistId_trackId: { + playlistId: req.params.id, + trackId, + }, + }, + data: { sort: index }, + }) + ); + + await prisma.$transaction(updates); + + res.json({ message: "Playlist reordered" }); + } catch (error) { + console.error("Reorder playlist error:", error); + res.status(500).json({ error: "Failed to reorder playlist" }); + } +}); + +// ============================================ +// Pending Tracks (from Spotify imports) +// ============================================ + +/** + * GET /playlists/:id/pending + * Get pending tracks for a playlist (tracks from Spotify that haven't been matched yet) + */ +router.get("/:id/pending", async (req, res) => { + try { + const userId = req.user.id; + const playlistId = req.params.id; + + // Check ownership or public access + const playlist = await prisma.playlist.findUnique({ + where: { id: playlistId }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId && !playlist.isPublic) { + return res.status(403).json({ error: "Access denied" }); + } + + const pendingTracks = await prisma.playlistPendingTrack.findMany({ + where: { playlistId }, + orderBy: { sort: "asc" }, + }); + + res.json({ + count: pendingTracks.length, + tracks: pendingTracks.map((t) => ({ + id: t.id, + artist: t.spotifyArtist, + title: t.spotifyTitle, + album: t.spotifyAlbum, + position: t.sort, + previewUrl: t.deezerPreviewUrl, + })), + spotifyPlaylistId: playlist.spotifyPlaylistId, + }); + } catch (error) { + console.error("Get pending tracks error:", error); + res.status(500).json({ error: "Failed to get pending tracks" }); + } +}); + +/** + * DELETE /playlists/:id/pending/:trackId + * Remove a pending track (user decides they don't want to wait for it) + */ +router.delete("/:id/pending/:trackId", async (req, res) => { + try { + const userId = req.user.id; + const { id: playlistId, trackId: pendingTrackId } = req.params; + + // Check ownership + const playlist = await prisma.playlist.findUnique({ + where: { id: playlistId }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + await prisma.playlistPendingTrack.delete({ + where: { id: pendingTrackId }, + }); + + res.json({ message: "Pending track removed" }); + } catch (error: any) { + if (error.code === "P2025") { + return res.status(404).json({ error: "Pending track not found" }); + } + console.error("Delete pending track error:", error); + res.status(500).json({ error: "Failed to delete pending track" }); + } +}); + +/** + * GET /playlists/:id/pending/:trackId/preview + * Get a fresh Deezer preview URL for a pending track (since they expire) + */ +router.get("/:id/pending/:trackId/preview", async (req, res) => { + try { + const { trackId: pendingTrackId } = req.params; + + // Get the pending track + const pendingTrack = await prisma.playlistPendingTrack.findUnique({ + where: { id: pendingTrackId }, + }); + + if (!pendingTrack) { + return res.status(404).json({ error: "Pending track not found" }); + } + + // Fetch fresh Deezer preview URL + const { deezerService } = await import("../services/deezer"); + const previewUrl = await deezerService.getTrackPreview( + pendingTrack.spotifyArtist, + pendingTrack.spotifyTitle + ); + + if (!previewUrl) { + return res + .status(404) + .json({ error: "No preview available on Deezer" }); + } + + // Update the stored preview URL for future use + await prisma.playlistPendingTrack.update({ + where: { id: pendingTrackId }, + data: { deezerPreviewUrl: previewUrl }, + }); + + res.json({ previewUrl }); + } catch (error: any) { + console.error("Get preview URL error:", error); + res.status(500).json({ error: "Failed to get preview URL" }); + } +}); + +/** + * POST /playlists/:id/pending/:trackId/retry + * Retry downloading a failed/pending track from Soulseek + * Returns immediately and downloads in background + */ +router.post("/:id/pending/:trackId/retry", async (req, res) => { + try { + const userId = req.user.id; + const { id: playlistId, trackId: pendingTrackId } = req.params; + + sessionLog( + "PENDING-RETRY", + `Request: userId=${userId} playlistId=${playlistId} pendingTrackId=${pendingTrackId}` + ); + + // Check ownership + const playlist = await prisma.playlist.findUnique({ + where: { id: playlistId }, + }); + + if (!playlist) { + sessionLog( + "PENDING-RETRY", + `Playlist not found: ${playlistId}`, + "WARN" + ); + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId) { + sessionLog( + "PENDING-RETRY", + `Access denied: playlistId=${playlistId} userId=${userId}`, + "WARN" + ); + return res.status(403).json({ error: "Access denied" }); + } + + // Get the pending track + const pendingTrack = await prisma.playlistPendingTrack.findUnique({ + where: { id: pendingTrackId }, + }); + + if (!pendingTrack) { + sessionLog( + "PENDING-RETRY", + `Pending track not found: ${pendingTrackId}`, + "WARN" + ); + return res.status(404).json({ error: "Pending track not found" }); + } + + sessionLog( + "PENDING-RETRY", + `Pending track: artist="${pendingTrack.spotifyArtist}" title="${pendingTrack.spotifyTitle}" album="${pendingTrack.spotifyAlbum}"` + ); + + // Create a DownloadJob so this retry appears in Activity (active/history) + const retryTargetId = + pendingTrack.albumMbid || + pendingTrack.artistMbid || + `pendingTrack:${pendingTrack.id}`; + + const downloadJob = await prisma.downloadJob.create({ + data: { + userId, + subject: `${pendingTrack.spotifyArtist} - ${pendingTrack.spotifyTitle}`, + type: "track", + targetMbid: retryTargetId, + artistMbid: pendingTrack.artistMbid, + status: "processing", + attempts: 1, + startedAt: new Date(), + metadata: { + downloadType: "pending-track-retry", + source: "soulseek", + playlistId, + pendingTrackId, + spotifyArtist: pendingTrack.spotifyArtist, + spotifyTitle: pendingTrack.spotifyTitle, + spotifyAlbum: pendingTrack.spotifyAlbum, + albumMbid: pendingTrack.albumMbid, + }, + }, + }); + + sessionLog( + "PENDING-RETRY", + `Created download job: downloadJobId=${downloadJob.id} target=${retryTargetId}` + ); + + // Import soulseek service and try to download + const { soulseekService } = await import("../services/soulseek"); + const { getSystemSettings } = await import("../utils/systemSettings"); + + const settings = await getSystemSettings(); + if (!settings?.musicPath) { + sessionLog("PENDING-RETRY", `Music path not configured`, "WARN"); + await prisma.downloadJob.update({ + where: { id: downloadJob.id }, + data: { + status: "failed", + error: "Music path not configured", + completedAt: new Date(), + }, + }); + return res.status(400).json({ error: "Music path not configured" }); + } + + if (!settings?.soulseekUsername || !settings?.soulseekPassword) { + sessionLog( + "PENDING-RETRY", + `Soulseek credentials not configured`, + "WARN" + ); + await prisma.downloadJob.update({ + where: { id: downloadJob.id }, + data: { + status: "failed", + error: "Soulseek credentials not configured", + completedAt: new Date(), + }, + }); + return res + .status(400) + .json({ error: "Soulseek credentials not configured" }); + } + + // Use a better album name if possible - extract from stored title or use artist name + const albumName = + pendingTrack.spotifyAlbum !== "Unknown Album" + ? pendingTrack.spotifyAlbum + : pendingTrack.spotifyArtist; // Use artist as fallback folder name + + console.log( + `[Retry] Starting download for: ${pendingTrack.spotifyArtist} - ${pendingTrack.spotifyTitle}` + ); + sessionLog( + "PENDING-RETRY", + `Search: ${pendingTrack.spotifyArtist} - ${pendingTrack.spotifyTitle}` + ); + + // First do a quick search to see if track is available (15s timeout) + // This way we can tell the user immediately if it's not found + const searchResult = await soulseekService.searchTrack( + pendingTrack.spotifyArtist, + pendingTrack.spotifyTitle + ); + + if (!searchResult.found || searchResult.allMatches.length === 0) { + console.log(`[Retry] ✗ No results found on Soulseek`); + sessionLog("PENDING-RETRY", `No results found on Soulseek`, "INFO"); + + await prisma.downloadJob.update({ + where: { id: downloadJob.id }, + data: { + status: "failed", + error: "No matching files found", + completedAt: new Date(), + }, + }); + + return res.status(200).json({ + success: false, + message: "Track not found on Soulseek", + error: "No matching files found", + }); + } + + console.log( + `[Retry] ✓ Found ${searchResult.allMatches.length} results, starting download in background` + ); + sessionLog( + "PENDING-RETRY", + `Found ${searchResult.allMatches.length} candidate(s); starting background download` + ); + + // Return immediately - download happens in background + res.json({ + success: true, + message: "Download started", + note: `Found ${searchResult.allMatches.length} sources. Downloading... Track will appear after scan.`, + downloadJobId: downloadJob.id, + }); + + // Start download in background (don't await) + soulseekService + .downloadBestMatch( + pendingTrack.spotifyArtist, + pendingTrack.spotifyTitle, + albumName, + searchResult.allMatches, + settings.musicPath + ) + .then(async (result) => { + if (result.success) { + console.log( + `[Retry] ✓ Download complete: ${result.filePath}` + ); + sessionLog( + "PENDING-RETRY", + `Download complete: filePath=${result.filePath}` + ); + + await prisma.downloadJob.update({ + where: { id: downloadJob.id }, + data: { + status: "completed", + completedAt: new Date(), + metadata: { + ...(downloadJob.metadata as any), + filePath: result.filePath, + }, + }, + }); + + // Trigger a library scan to add the track and reconcile pending + try { + const { scanQueue } = await import("../workers/queues"); + const scanJob = await scanQueue.add( + "scan", + { + userId, + source: "retry-pending-track", + albumMbid: pendingTrack.albumMbid || undefined, + artistMbid: + pendingTrack.artistMbid || undefined, + }, + { + priority: 1, // High priority + removeOnComplete: true, + } + ); + console.log( + `[Retry] Queued library scan to reconcile pending tracks` + ); + sessionLog( + "PENDING-RETRY", + `Queued library scan (bullJobId=${ + scanJob.id ?? "unknown" + })` + ); + } catch (scanError) { + console.error( + `[Retry] Failed to queue scan:`, + scanError + ); + sessionLog( + "PENDING-RETRY", + `Failed to queue scan: ${ + (scanError as any)?.message || scanError + }`, + "ERROR" + ); + } + } else { + console.log(`[Retry] ✗ Download failed: ${result.error}`); + sessionLog( + "PENDING-RETRY", + `Download failed: ${result.error || "unknown error"}`, + "WARN" + ); + + await prisma.downloadJob.update({ + where: { id: downloadJob.id }, + data: { + status: "failed", + error: result.error || "Download failed", + completedAt: new Date(), + }, + }); + } + }) + .catch((error) => { + console.error(`[Retry] Download error:`, error); + sessionLog( + "PENDING-RETRY", + `Download exception: ${error?.message || error}`, + "ERROR" + ); + + prisma.downloadJob + .update({ + where: { id: downloadJob.id }, + data: { + status: "failed", + error: error?.message || "Download exception", + completedAt: new Date(), + }, + }) + .catch(() => undefined); + }); + } catch (error: any) { + console.error("Retry pending track error:", error); + sessionLog( + "PENDING-RETRY", + `Handler error: ${error?.message || error}`, + "ERROR" + ); + res.status(500).json({ + error: "Failed to retry download", + details: error.message, + }); + } +}); + +/** + * POST /playlists/:id/pending/reconcile + * Manually trigger reconciliation for a specific playlist + */ +router.post("/:id/pending/reconcile", async (req, res) => { + try { + const userId = req.user.id; + const playlistId = req.params.id; + + // Check ownership + const playlist = await prisma.playlist.findUnique({ + where: { id: playlistId }, + }); + + if (!playlist) { + return res.status(404).json({ error: "Playlist not found" }); + } + + if (playlist.userId !== userId) { + return res.status(403).json({ error: "Access denied" }); + } + + // Import and run reconciliation + const { spotifyImportService } = await import( + "../services/spotifyImport" + ); + const result = await spotifyImportService.reconcilePendingTracks(); + + res.json({ + message: "Reconciliation complete", + tracksAdded: result.tracksAdded, + playlistsUpdated: result.playlistsUpdated, + }); + } catch (error) { + console.error("Reconcile pending tracks error:", error); + res.status(500).json({ error: "Failed to reconcile pending tracks" }); + } +}); + +export default router; diff --git a/backend/src/routes/plays.ts b/backend/src/routes/plays.ts new file mode 100644 index 0000000..5e1d3e4 --- /dev/null +++ b/backend/src/routes/plays.ts @@ -0,0 +1,84 @@ +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { z } from "zod"; + +const router = Router(); + +router.use(requireAuth); + +const playSchema = z.object({ + trackId: z.string(), +}); + +// POST /plays +router.post("/", async (req, res) => { + try { + const userId = req.session.userId!; + const { trackId } = playSchema.parse(req.body); + + // Verify track exists + const track = await prisma.track.findUnique({ + where: { id: trackId }, + }); + + if (!track) { + return res.status(404).json({ error: "Track not found" }); + } + + const play = await prisma.play.create({ + data: { + userId, + trackId, + }, + }); + + res.json(play); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid request", details: error.errors }); + } + console.error("Create play error:", error); + res.status(500).json({ error: "Failed to log play" }); + } +}); + +// GET /plays (recent plays for user) +router.get("/", async (req, res) => { + try { + const userId = req.session.userId!; + const { limit = "50" } = req.query; + + const plays = await prisma.play.findMany({ + where: { userId }, + orderBy: { playedAt: "desc" }, + take: parseInt(limit as string, 10), + include: { + track: { + include: { + album: { + include: { + artist: { + select: { + id: true, + name: true, + mbid: true, + }, + }, + }, + }, + }, + }, + }, + }); + + res.json(plays); + } catch (error) { + console.error("Get plays error:", error); + res.status(500).json({ error: "Failed to get plays" }); + } +}); + +export default router; diff --git a/backend/src/routes/podcasts.ts b/backend/src/routes/podcasts.ts new file mode 100644 index 0000000..47b2899 --- /dev/null +++ b/backend/src/routes/podcasts.ts @@ -0,0 +1,1560 @@ +import { Router } from "express"; +import { requireAuth, requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { rssParserService } from "../services/rss-parser"; +import { podcastCacheService } from "../services/podcastCache"; +import axios from "axios"; +import fs from "fs"; + +const router = Router(); + +/** + * POST /podcasts/sync-covers + * Manually trigger podcast cover caching + * Downloads and caches all podcast/episode covers locally + */ +router.post("/sync-covers", requireAuth, async (req, res) => { + try { + const { notificationService } = await import("../services/notificationService"); + console.log(" Starting podcast cover sync..."); + + const podcastResult = await podcastCacheService.syncAllCovers(); + const episodeResult = await podcastCacheService.syncEpisodeCovers(); + + // Send notification to user + await notificationService.notifySystem( + req.user!.id, + "Podcast Covers Synced", + `Synced ${podcastResult.cached || 0} podcast covers and ${episodeResult.cached || 0} episode covers` + ); + + res.json({ + success: true, + podcasts: podcastResult, + episodes: episodeResult, + }); + } catch (error: any) { + console.error("Podcast cover sync failed:", error); + res.status(500).json({ + error: "Sync failed", + message: error.message, + }); + } +}); + +router.use(requireAuthOrToken); + +/** + * GET /podcasts + * Get all podcasts the user is subscribed to + */ +router.get("/", async (req, res) => { + try { + const subscriptions = await prisma.podcastSubscription.findMany({ + where: { userId: req.user!.id }, + include: { + podcast: { + include: { + episodes: { + orderBy: { publishedAt: "desc" }, + take: 5, // Get latest 5 episodes per podcast + include: { + progress: { + where: { userId: req.user!.id }, + }, + }, + }, + }, + }, + }, + orderBy: { subscribedAt: "desc" }, + }); + + const podcasts = subscriptions.map((sub) => { + const podcast = sub.podcast; + return { + id: podcast.id, + title: podcast.title, + author: podcast.author, + description: podcast.description, + coverUrl: podcast.localCoverPath + ? `/podcasts/${podcast.id}/cover` + : podcast.imageUrl, // Fallback to original URL if not cached + episodeCount: podcast.episodeCount, + autoDownloadEpisodes: false, // Per-podcast auto-download not yet implemented + episodes: podcast.episodes.map((ep) => ({ + id: ep.id, + title: ep.title, + description: ep.description, + duration: ep.duration, + publishedAt: ep.publishedAt, + coverUrl: ep.localCoverPath + ? `/podcasts/episodes/${ep.id}/cover` + : ep.imageUrl, // Fallback to original URL + progress: ep.progress[0] + ? { + currentTime: ep.progress[0].currentTime, + progress: + ep.progress[0].duration > 0 + ? (ep.progress[0].currentTime / + ep.progress[0].duration) * + 100 + : 0, + isFinished: ep.progress[0].isFinished, + lastPlayedAt: ep.progress[0].lastPlayedAt, + } + : null, + })), + }; + }); + + res.json(podcasts); + } catch (error: any) { + console.error("Error fetching podcasts:", error); + res.status(500).json({ + error: "Failed to fetch podcasts", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/discover/top + * Get top podcasts - just search iTunes like the search bar does + */ +router.get("/discover/top", requireAuthOrToken, async (req, res) => { + try { + const { limit = "20" } = req.query; + const podcastLimit = Math.min(parseInt(limit as string, 10), 50); + + console.log(`\n[TOP PODCASTS] Request (limit: ${podcastLimit})`); + + // Simple iTunes search - same as the working search bar! + const itunesResponse = await axios.get( + "https://itunes.apple.com/search", + { + params: { + term: "podcast", + media: "podcast", + entity: "podcast", + limit: podcastLimit, + }, + timeout: 5000, + } + ); + + const podcasts = itunesResponse.data.results.map((podcast: any) => ({ + id: podcast.collectionId.toString(), + title: podcast.collectionName, + author: podcast.artistName, + coverUrl: podcast.artworkUrl600 || podcast.artworkUrl100, + feedUrl: podcast.feedUrl, + genres: podcast.genres || [], + episodeCount: podcast.trackCount || 0, + itunesId: podcast.collectionId, + isExternal: true, + })); + + console.log(` Found ${podcasts.length} podcasts`); + res.json(podcasts); + } catch (error: any) { + console.error("Error fetching top podcasts:", error); + res.status(500).json({ + error: "Failed to fetch top podcasts", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/discover/genres + * Get podcasts by specific genres/topics - using simple iTunes search like the search bar + */ +router.get("/discover/genres", async (req, res) => { + try { + const { genres } = req.query; // Comma-separated genre IDs + + console.log(`\n[GENRE PODCASTS] Request (genres: ${genres})`); + + if (!genres || typeof genres !== "string") { + return res.status(400).json({ + error: "genres parameter required (comma-separated genre IDs)", + }); + } + + const genreIds = genres.split(",").map((id) => parseInt(id.trim(), 10)); + + // Map genre IDs to search terms - same approach as the working search! + const genreSearchTerms: { [key: number]: string } = { + 1303: "comedy podcast", // Comedy + 1324: "society culture podcast", // Society & Culture + 1489: "news podcast", // News + 1488: "true crime podcast", // True Crime + 1321: "business podcast", // Business + 1545: "sports podcast", // Sports + 1502: "gaming hobbies podcast", // Leisure (Gaming & Hobbies) + }; + + // Fetch podcasts for each genre using simple iTunes search - PARALLEL execution + const genreFetchPromises = genreIds.map(async (genreId) => { + const searchTerm = genreSearchTerms[genreId] || "podcast"; + console.log(` Searching for "${searchTerm}"...`); + + try { + // Simple iTunes search - same as the working search bar! + const itunesResponse = await axios.get( + "https://itunes.apple.com/search", + { + params: { + term: searchTerm, + media: "podcast", + entity: "podcast", + limit: 10, + }, + timeout: 5000, + } + ); + + const podcasts = itunesResponse.data.results.map( + (podcast: any) => ({ + id: podcast.collectionId.toString(), + title: podcast.collectionName, + author: podcast.artistName, + coverUrl: + podcast.artworkUrl600 || podcast.artworkUrl100, + feedUrl: podcast.feedUrl, + genres: podcast.genres || [], + episodeCount: podcast.trackCount || 0, + itunesId: podcast.collectionId, + isExternal: true, + }) + ); + + console.log( + ` Found ${podcasts.length} podcasts for genre ${genreId}` + ); + return { genreId, podcasts }; + } catch (error: any) { + console.error( + ` Error searching for ${searchTerm}:`, + error.message + ); + return { genreId, podcasts: [] }; + } + }); + + // Wait for all genre searches to complete in parallel + const genreResults = await Promise.all(genreFetchPromises); + + // Convert array of results to object keyed by genreId + const results: any = {}; + for (const { genreId, podcasts } of genreResults) { + results[genreId] = podcasts; + } + + console.log( + ` Fetched podcasts for ${genreIds.length} genres (parallel)` + ); + res.json(results); + } catch (error: any) { + console.error("Error fetching genre podcasts:", error); + res.status(500).json({ + error: "Failed to fetch genre podcasts", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/discover/genre/:genreId + * Get paginated podcasts for a specific genre with offset support + */ +router.get("/discover/genre/:genreId", async (req, res) => { + try { + const { genreId } = req.params; + const { limit = "20", offset = "0" } = req.query; + + const podcastLimit = Math.min(parseInt(limit as string, 10), 50); + const podcastOffset = parseInt(offset as string, 10); + + console.log( + `\n[GENRE PAGINATED] Request (genre: ${genreId}, limit: ${podcastLimit}, offset: ${podcastOffset})` + ); + + // Map genre IDs to search terms + const genreSearchTerms: { [key: string]: string } = { + "1303": "comedy podcast", + "1324": "society culture podcast", + "1489": "news podcast", + "1488": "true crime podcast", + "1321": "business podcast", + "1545": "sports podcast", + "1502": "gaming hobbies podcast", + }; + + const searchTerm = genreSearchTerms[genreId] || "podcast"; + console.log( + ` Searching for "${searchTerm}" (offset: ${podcastOffset})...` + ); + + // iTunes API doesn't support offset directly, so we request more and slice + // This is a limitation but works for reasonable pagination + const totalToFetch = podcastOffset + podcastLimit; + + const itunesResponse = await axios.get( + "https://itunes.apple.com/search", + { + params: { + term: searchTerm, + media: "podcast", + entity: "podcast", + limit: Math.min(totalToFetch, 200), // iTunes max is 200 + }, + timeout: 5000, + } + ); + + const allPodcasts = itunesResponse.data.results.map((podcast: any) => ({ + id: podcast.collectionId.toString(), + title: podcast.collectionName, + author: podcast.artistName, + coverUrl: podcast.artworkUrl600 || podcast.artworkUrl100, + feedUrl: podcast.feedUrl, + genres: podcast.genres || [], + episodeCount: podcast.trackCount || 0, + itunesId: podcast.collectionId, + isExternal: true, + })); + + // Slice for pagination + const podcasts = allPodcasts.slice( + podcastOffset, + podcastOffset + podcastLimit + ); + + console.log( + ` Found ${podcasts.length} podcasts (total available: ${allPodcasts.length})` + ); + res.json(podcasts); + } catch (error: any) { + console.error("Error fetching paginated genre podcasts:", error); + res.status(500).json({ + error: "Failed to fetch podcasts", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/preview/:itunesId + * Preview a podcast by iTunes ID (for discovery, before subscribing) + * Returns basic podcast info without requiring a subscription + */ +router.get("/preview/:itunesId", async (req, res) => { + try { + const { itunesId } = req.params; + + console.log(`\n [PODCAST PREVIEW] iTunes ID: ${itunesId}`); + + // Try to fetch from iTunes API + const itunesResponse = await axios.get( + "https://itunes.apple.com/lookup", + { + params: { + id: itunesId, + entity: "podcast", + }, + timeout: 5000, + } + ); + + if ( + !itunesResponse.data.results || + itunesResponse.data.results.length === 0 + ) { + return res.status(404).json({ error: "Podcast not found" }); + } + + const podcastData = itunesResponse.data.results[0]; + + // Check if user is already subscribed + const existingPodcast = await prisma.podcast.findFirst({ + where: { + OR: [{ id: itunesId }, { feedUrl: podcastData.feedUrl }], + }, + }); + + let isSubscribed = false; + if (existingPodcast) { + const subscription = await prisma.podcastSubscription.findUnique({ + where: { + userId_podcastId: { + userId: req.user!.id, + podcastId: existingPodcast.id, + }, + }, + }); + isSubscribed = !!subscription; + } + + // Fetch description and episodes from RSS feed (iTunes API doesn't provide them) + let description = ""; + let previewEpisodes: any[] = []; + if (podcastData.feedUrl) { + try { + const feedData = await rssParserService.parseFeed( + podcastData.feedUrl + ); + description = + feedData.description || feedData.itunes?.summary || ""; + + // Get first 3 episodes for preview + previewEpisodes = (feedData.episodes || []) + .slice(0, 3) + .map((episode: any) => ({ + title: episode.title, + publishedAt: episode.publishedAt, + duration: episode.duration || 0, + })); + + console.log( + ` [PODCAST PREVIEW] Fetched description (${description.length} chars) and ${previewEpisodes.length} preview episodes` + ); + } catch (error) { + console.warn(` Failed to fetch RSS feed for preview:`, error); + // Continue without description and episodes + } + } + + res.json({ + itunesId: podcastData.collectionId.toString(), + title: podcastData.collectionName, + author: podcastData.artistName, + description: description, + coverUrl: podcastData.artworkUrl600 || podcastData.artworkUrl100, + feedUrl: podcastData.feedUrl, + genres: podcastData.genres || [], + episodeCount: podcastData.trackCount || 0, + previewEpisodes: previewEpisodes, + isSubscribed, + subscribedPodcastId: isSubscribed ? existingPodcast!.id : null, + }); + } catch (error: any) { + console.error("Error previewing podcast:", error); + res.status(500).json({ + error: "Failed to preview podcast", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/:id + * Get a specific podcast with full details and episodes + * Requires user to be subscribed + */ +router.get("/:id", async (req, res) => { + try { + const { id } = req.params; + + // Check if user is subscribed + const subscription = await prisma.podcastSubscription.findUnique({ + where: { + userId_podcastId: { + userId: req.user!.id, + podcastId: id, + }, + }, + }); + + if (!subscription) { + return res + .status(404) + .json({ error: "Podcast not found or not subscribed" }); + } + + const podcast = await prisma.podcast.findUnique({ + where: { id }, + include: { + episodes: { + orderBy: { publishedAt: "desc" }, + include: { + progress: { + where: { userId: req.user!.id }, + }, + downloads: { + where: { userId: req.user!.id }, + }, + }, + }, + }, + }); + + if (!podcast) { + return res.status(404).json({ error: "Podcast not found" }); + } + + const episodesWithProgress = podcast.episodes.map((episode) => ({ + id: episode.id, + title: episode.title, + description: episode.description, + duration: episode.duration, + publishedAt: episode.publishedAt, + episodeNumber: episode.episodeNumber, + season: episode.season, + imageUrl: episode.imageUrl, + isDownloaded: episode.downloads.length > 0, + progress: episode.progress[0] + ? { + currentTime: episode.progress[0].currentTime, + progress: + episode.progress[0].duration > 0 + ? (episode.progress[0].currentTime / + episode.progress[0].duration) * + 100 + : 0, + isFinished: episode.progress[0].isFinished, + lastPlayedAt: episode.progress[0].lastPlayedAt, + } + : null, + })); + + res.json({ + id: podcast.id, + title: podcast.title, + author: podcast.author, + description: podcast.description, + coverUrl: podcast.imageUrl, + feedUrl: podcast.feedUrl, + genres: [], // Podcast genres not yet stored in database + autoDownloadEpisodes: false, + episodes: episodesWithProgress, + isSubscribed: true, + }); + } catch (error: any) { + console.error("Error fetching podcast:", error); + res.status(500).json({ + error: "Failed to fetch podcast", + message: error.message, + }); + } +}); + +/** + * POST /podcasts/subscribe + * Subscribe to a podcast by RSS feed URL or iTunes ID + */ +router.post("/subscribe", async (req, res) => { + try { + const { feedUrl, itunesId } = req.body; + + if (!feedUrl && !itunesId) { + return res + .status(400) + .json({ error: "feedUrl or itunesId is required" }); + } + + console.log( + `\n [PODCAST] Subscribe request from ${req.user!.username}` + ); + console.log(` Feed URL: ${feedUrl || "N/A"}`); + console.log(` iTunes ID: ${itunesId || "N/A"}`); + + let finalFeedUrl = feedUrl; + + // If only iTunes ID provided, fetch feed URL from iTunes API + if (!finalFeedUrl && itunesId) { + console.log(` Looking up feed URL from iTunes...`); + const itunesResponse = await axios.get( + "https://itunes.apple.com/lookup", + { + params: { id: itunesId, entity: "podcast" }, + } + ); + + if ( + itunesResponse.data.resultCount === 0 || + !itunesResponse.data.results[0].feedUrl + ) { + return res + .status(404) + .json({ error: "Podcast not found in iTunes" }); + } + + finalFeedUrl = itunesResponse.data.results[0].feedUrl; + console.log(` Found feed URL: ${finalFeedUrl}`); + } + + // Check if podcast already exists in database + let podcast = await prisma.podcast.findUnique({ + where: { feedUrl: finalFeedUrl }, + }); + + if (podcast) { + console.log(` Podcast exists in database: ${podcast.title}`); + + // Check if user is already subscribed + const existingSubscription = + await prisma.podcastSubscription.findUnique({ + where: { + userId_podcastId: { + userId: req.user!.id, + podcastId: podcast.id, + }, + }, + }); + + if (existingSubscription) { + console.log(` User already subscribed`); + return res.json({ + success: true, + podcast: { + id: podcast.id, + title: podcast.title, + }, + message: "Already subscribed", + }); + } + + // Subscribe user to existing podcast + await prisma.podcastSubscription.create({ + data: { + userId: req.user!.id, + podcastId: podcast.id, + }, + }); + + console.log(` User subscribed to existing podcast`); + return res.json({ + success: true, + podcast: { + id: podcast.id, + title: podcast.title, + }, + message: "Subscribed successfully", + }); + } + + // Parse RSS feed to get podcast and episodes + console.log(` Parsing RSS feed...`); + const { podcast: podcastData, episodes } = + await rssParserService.parseFeed(finalFeedUrl); + + // Create podcast in database + console.log(` Saving podcast to database...`); + const finalItunesId = itunesId || podcastData.itunesId; + console.log(` iTunes ID to save: ${finalItunesId || "NONE"}`); + + podcast = await prisma.podcast.create({ + data: { + feedUrl: finalFeedUrl, + title: podcastData.title, + author: podcastData.author, + description: podcastData.description, + imageUrl: podcastData.imageUrl, + itunesId: finalItunesId, + language: podcastData.language, + explicit: podcastData.explicit || false, + episodeCount: episodes.length, + }, + }); + + console.log(` Podcast created: ${podcast.id}`); + console.log(` iTunes ID saved: ${podcast.itunesId || "NONE"}`); + + // Save episodes + console.log(` Saving ${episodes.length} episodes...`); + await prisma.podcastEpisode.createMany({ + data: episodes.map((ep) => ({ + podcastId: podcast!.id, + guid: ep.guid, + title: ep.title, + description: ep.description, + audioUrl: ep.audioUrl, + duration: ep.duration, + publishedAt: ep.publishedAt, + episodeNumber: ep.episodeNumber, + season: ep.season, + imageUrl: ep.imageUrl, + fileSize: ep.fileSize, + mimeType: ep.mimeType, + })), + skipDuplicates: true, + }); + + console.log(` Episodes saved`); + + // Subscribe user + await prisma.podcastSubscription.create({ + data: { + userId: req.user!.id, + podcastId: podcast.id, + }, + }); + + console.log(` User subscribed successfully`); + + res.json({ + success: true, + podcast: { + id: podcast.id, + title: podcast.title, + }, + message: "Subscribed successfully", + }); + } catch (error: any) { + console.error("Error subscribing to podcast:", error); + res.status(500).json({ + error: "Failed to subscribe to podcast", + message: error.message, + }); + } +}); + +/** + * DELETE /podcasts/:id/unsubscribe + * Unsubscribe from a podcast + */ +router.delete("/:id/unsubscribe", async (req, res) => { + try { + const { id } = req.params; + + console.log(`\n[PODCAST] Unsubscribe request`); + console.log(` User: ${req.user!.username}`); + console.log(` Podcast ID: ${id}`); + + // Delete subscription + const deleted = await prisma.podcastSubscription.deleteMany({ + where: { + userId: req.user!.id, + podcastId: id, + }, + }); + + if (deleted.count === 0) { + return res + .status(404) + .json({ error: "Not subscribed to this podcast" }); + } + + // Also delete user's progress for this podcast + await prisma.podcastProgress.deleteMany({ + where: { + userId: req.user!.id, + episode: { + podcastId: id, + }, + }, + }); + + // Also delete any downloaded episodes + await prisma.podcastDownload.deleteMany({ + where: { + userId: req.user!.id, + episode: { + podcastId: id, + }, + }, + }); + + console.log(` Unsubscribed successfully`); + + res.json({ + success: true, + message: "Unsubscribed successfully", + }); + } catch (error: any) { + console.error("Error unsubscribing from podcast:", error); + res.status(500).json({ + error: "Failed to unsubscribe", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/:id/refresh + * Manually refresh podcast feed to check for new episodes + */ +router.get("/:id/refresh", async (req, res) => { + try { + const { id } = req.params; + + console.log(`\n [PODCAST] Refresh request`); + console.log(` Podcast ID: ${id}`); + + const podcast = await prisma.podcast.findUnique({ + where: { id }, + }); + + if (!podcast) { + return res.status(404).json({ error: "Podcast not found" }); + } + + // Parse RSS feed + console.log(` Parsing RSS feed...`); + const { podcast: podcastData, episodes } = + await rssParserService.parseFeed(podcast.feedUrl); + + // Update podcast metadata + await prisma.podcast.update({ + where: { id }, + data: { + title: podcastData.title, + author: podcastData.author, + description: podcastData.description, + imageUrl: podcastData.imageUrl, + language: podcastData.language, + explicit: podcastData.explicit || false, + episodeCount: episodes.length, + lastRefreshed: new Date(), + }, + }); + + // Add new episodes (skip duplicates) + let newEpisodesCount = 0; + for (const ep of episodes) { + const existing = await prisma.podcastEpisode.findUnique({ + where: { + podcastId_guid: { + podcastId: id, + guid: ep.guid, + }, + }, + }); + + if (!existing) { + await prisma.podcastEpisode.create({ + data: { + podcastId: id, + guid: ep.guid, + title: ep.title, + description: ep.description, + audioUrl: ep.audioUrl, + duration: ep.duration, + publishedAt: ep.publishedAt, + episodeNumber: ep.episodeNumber, + season: ep.season, + imageUrl: ep.imageUrl, + fileSize: ep.fileSize, + mimeType: ep.mimeType, + }, + }); + newEpisodesCount++; + } + } + + console.log( + ` Refresh complete. ${newEpisodesCount} new episodes added.` + ); + + res.json({ + success: true, + newEpisodesCount, + totalEpisodes: episodes.length, + message: `Found ${newEpisodesCount} new episodes`, + }); + } catch (error: any) { + console.error("Error refreshing podcast:", error); + res.status(500).json({ + error: "Failed to refresh podcast", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/:podcastId/episodes/:episodeId/cache-status + * Check if a podcast episode is cached locally + * Used by frontend to know when it's safe to reload for seeking + * Also returns download progress if downloading + */ +router.get("/:podcastId/episodes/:episodeId/cache-status", async (req, res) => { + try { + const { episodeId } = req.params; + + const { getCachedFilePath, isDownloading, getDownloadProgress } = + await import("../services/podcastDownload"); + + const cachedPath = await getCachedFilePath(episodeId); + const downloading = isDownloading(episodeId); + const progress = getDownloadProgress(episodeId); + + res.json({ + episodeId, + cached: !!cachedPath, + downloading, + downloadProgress: progress?.progress ?? null, // 0-100 or null + path: cachedPath ? true : false, // Don't expose actual path + }); + } catch (error: any) { + console.error("[PODCAST] Cache status check failed:", error); + res.status(500).json({ error: "Failed to check cache status" }); + } +}); + +/** + * GET /podcasts/:podcastId/episodes/:episodeId/stream + * Stream a podcast episode (from local cache or RSS URL) + * Auto-caches episodes in background for better seeking support + */ +router.get("/:podcastId/episodes/:episodeId/stream", async (req, res) => { + try { + const { podcastId, episodeId } = req.params; + const userId = req.user?.id; + const podcastDebug = process.env.PODCAST_DEBUG === "1"; + + console.log(`\n [PODCAST STREAM] Request:`); + console.log(` Podcast ID: ${podcastId}`); + console.log(` Episode ID: ${episodeId}`); + if (podcastDebug) { + console.log(` Range: ${req.headers.range || "none"}`); + console.log(` UA: ${req.headers["user-agent"] || "unknown"}`); + } + + const episode = await prisma.podcastEpisode.findUnique({ + where: { id: episodeId }, + }); + + if (!episode) { + return res.status(404).json({ error: "Episode not found" }); + } + + if (podcastDebug) { + console.log(` Episode DB: title="${episode.title}"`); + console.log(` Episode DB: guid="${episode.guid}"`); + console.log(` Episode DB: audioUrl="${episode.audioUrl}"`); + console.log(` Episode DB: mimeType="${episode.mimeType || "unknown"}" fileSize=${episode.fileSize || 0}`); + } + + const range = req.headers.range; + + // Import podcast download service + const { getCachedFilePath, downloadInBackground, isDownloading } = + await import("../services/podcastDownload"); + + // Check if episode is cached locally (with full range support) + const cachedPath = await getCachedFilePath(episodeId); + + if (cachedPath) { + console.log(` Streaming from cache: ${cachedPath}`); + try { + const stats = await fs.promises.stat(cachedPath); + const fileSize = stats.size; + if (podcastDebug) { + console.log(` Cache file size: ${fileSize}`); + } + + if (fileSize === 0) { + throw new Error("Cached file is empty"); + } + + if (range) { + const [startStr, endStr] = range + .replace(/bytes=/, "") + .split("-"); + const start = parseInt(startStr, 10); + const end = endStr ? parseInt(endStr, 10) : fileSize - 1; + + // Validate range bounds + if (start >= fileSize) { + console.log( + ` Range start ${start} >= file size ${fileSize}, clamping to EOF` + ); + // Browsers can occasionally request a range start beyond EOF during media seeking. + // Returning 416 can cause some clients to stall; instead clamp to a small window near EOF and serve 206. + // NOTE: Serving only the last byte is not a valid decodable audio chunk for many formats/clients. + const clampWindowBytes = 1024 * 1024; // 1MB window near EOF + const clampedStart = Math.max(0, fileSize - clampWindowBytes); + res.writeHead(206, { + "Content-Range": `bytes ${clampedStart}-${fileSize - 1}/${fileSize}`, + "Accept-Ranges": "bytes", + "Content-Length": fileSize - clampedStart, + "Content-Type": episode.mimeType || "audio/mpeg", + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + }); + const fileStream = fs.createReadStream(cachedPath, { + start: clampedStart, + end: fileSize - 1, + }); + // Clean up file stream when client disconnects + res.on("close", () => { + if (!fileStream.destroyed) { + fileStream.destroy(); + } + }); + fileStream.pipe(res); + fileStream.on("error", (err) => { + console.error(" Cache stream error:", err); + if (!res.headersSent) { + res.status(500).json({ + error: "Failed to stream episode", + }); + } else { + res.end(); + } + }); + return; // Exit after starting clamped cache stream + } + + const validEnd = Math.min(end, fileSize - 1); + const chunkSize = validEnd - start + 1; + + console.log( + ` Serving range: bytes ${start}-${validEnd}/${fileSize}` + ); + + res.writeHead(206, { + "Content-Range": `bytes ${start}-${validEnd}/${fileSize}`, + "Accept-Ranges": "bytes", + "Content-Length": chunkSize, + "Content-Type": episode.mimeType || "audio/mpeg", + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": + req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + }); + + const fileStream = fs.createReadStream(cachedPath, { + start, + end: validEnd, + }); + // Clean up file stream when client disconnects + res.on("close", () => { + if (!fileStream.destroyed) { + fileStream.destroy(); + } + }); + fileStream.pipe(res); + fileStream.on("error", (err) => { + console.error(" Cache stream error:", err); + if (!res.headersSent) { + res.status(500).json({ + error: "Failed to stream episode", + }); + } else { + res.end(); + } + }); + return; // CRITICAL: Exit after starting cache stream + } + + // No range - serve entire file + console.log(` Serving full file: ${fileSize} bytes`); + res.writeHead(200, { + "Content-Type": episode.mimeType || "audio/mpeg", + "Content-Length": fileSize, + "Accept-Ranges": "bytes", + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + }); + + const fileStream = fs.createReadStream(cachedPath); + // Clean up file stream when client disconnects + res.on("close", () => { + if (!fileStream.destroyed) { + fileStream.destroy(); + } + }); + fileStream.pipe(res); + fileStream.on("error", (err) => { + console.error(" Cache stream error:", err); + if (!res.headersSent) { + res.status(500).json({ + error: "Failed to stream episode", + }); + } else { + res.end(); + } + }); + return; // CRITICAL: Exit after starting cache stream + } catch (err: any) { + console.error( + " Failed to stream from cache, falling back to RSS:", + err.message + ); + // Fall through to RSS streaming only if cache fails + } + } + + // Not cached yet - trigger background download while streaming from RSS + if (userId && !isDownloading(episodeId)) { + console.log(` Triggering background download for caching`); + downloadInBackground(episodeId, episode.audioUrl, userId); + } + + // Stream from RSS URL + console.log(` Streaming from RSS: ${episode.audioUrl}`); + + // Get file size first for proper range handling + let fileSize = episode.fileSize; + if (!fileSize) { + try { + const headResponse = await axios.head(episode.audioUrl); + fileSize = parseInt( + headResponse.headers["content-length"] || "0" + ); + if (Number.isFinite(fileSize) && fileSize > 0) { + await prisma.podcastEpisode.update({ + where: { id: episode.id }, + data: { fileSize }, + }); + } + } catch (err) { + console.warn(" Could not get file size via HEAD request"); + } + } + + if (range && fileSize) { + // Parse range header (format: bytes=start-end) + const parts = range.replace(/bytes=/, "").split("-"); + const start = parseInt(parts[0], 10); + const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1; + const chunkSize = end - start + 1; + + console.log(` Range request: bytes=${start}-${end}/${fileSize}`); + + try { + // Try range request first + const response = await axios.get(episode.audioUrl, { + headers: { Range: `bytes=${start}-${end}` }, + responseType: "stream", + validateStatus: (status) => + status === 206 || status === 200, + timeout: 30000, + }); + + // Send 206 Partial Content with proper range + res.writeHead(206, { + "Content-Range": `bytes ${start}-${end}/${fileSize}`, + "Accept-Ranges": "bytes", + "Content-Length": chunkSize, + "Content-Type": episode.mimeType || "audio/mpeg", + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + }); + + // Clean up axios stream when client disconnects + res.on("close", () => { + if (!response.data.destroyed) { + response.data.destroy(); + } + }); + response.data.pipe(res); + return; + } catch (rangeError: any) { + // 416 = Range Not Satisfiable - many podcast CDNs don't support range requests + // Fall back to streaming the full file and let the browser handle seeking + console.log( + ` Range request failed (${ + rangeError.response?.status || rangeError.message + }), falling back to full stream` + ); + + // Stream full file instead - browser will handle seeking locally + const response = await axios.get(episode.audioUrl, { + responseType: "stream", + timeout: 60000, + }); + + const contentLength = response.headers["content-length"]; + + res.writeHead(200, { + "Content-Type": episode.mimeType || "audio/mpeg", + "Accept-Ranges": "bytes", + ...(contentLength && { "Content-Length": contentLength }), + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + }); + + // Clean up axios stream when client disconnects + res.on("close", () => { + if (!response.data.destroyed) { + response.data.destroy(); + } + }); + response.data.pipe(res); + return; + } + } else { + // No range request - stream entire file + console.log(` Streaming full file`); + + const response = await axios.get(episode.audioUrl, { + responseType: "stream", + }); + + const contentLength = response.headers["content-length"]; + + res.writeHead(200, { + "Content-Type": episode.mimeType || "audio/mpeg", + "Accept-Ranges": "bytes", + ...(contentLength && { "Content-Length": contentLength }), + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": req.headers.origin || "*", + "Access-Control-Allow-Credentials": "true", + }); + + // Clean up axios stream when client disconnects + res.on("close", () => { + if (!response.data.destroyed) { + response.data.destroy(); + } + }); + response.data.pipe(res); + } + } catch (error: any) { + console.error("\n [PODCAST STREAM] Error:", error.message); + if (!res.headersSent) { + res.status(500).json({ + error: "Failed to stream episode", + message: error.message, + }); + } + } +}); + +/** + * POST /podcasts/:podcastId/episodes/:episodeId/progress + * Update playback progress for a podcast episode + */ +router.post("/:podcastId/episodes/:episodeId/progress", async (req, res) => { + try { + const { podcastId, episodeId } = req.params; + const { currentTime, duration, isFinished } = req.body; + + console.log(`\n [PODCAST PROGRESS] Update:`); + console.log(` User: ${req.user!.username}`); + console.log(` Episode ID: ${episodeId}`); + console.log(` Current Time: ${currentTime}s`); + console.log(` Duration: ${duration}s`); + console.log(` Finished: ${isFinished}`); + + const progress = await prisma.podcastProgress.upsert({ + where: { + userId_episodeId: { + userId: req.user!.id, + episodeId: episodeId, + }, + }, + create: { + userId: req.user!.id, + episodeId: episodeId, + currentTime, + duration, + isFinished: isFinished || false, + }, + update: { + currentTime, + duration, + isFinished: isFinished || false, + lastPlayedAt: new Date(), + }, + }); + + console.log(` Progress saved`); + + res.json({ + success: true, + progress: { + currentTime: progress.currentTime, + progress: + progress.duration > 0 + ? (progress.currentTime / progress.duration) * 100 + : 0, + isFinished: progress.isFinished, + }, + }); + } catch (error: any) { + console.error("Error updating progress:", error); + res.status(500).json({ + error: "Failed to update progress", + message: error.message, + }); + } +}); + +/** + * DELETE /podcasts/:podcastId/episodes/:episodeId/progress + * Remove/reset progress for a podcast episode + */ +router.delete("/:podcastId/episodes/:episodeId/progress", async (req, res) => { + try { + const { episodeId } = req.params; + + console.log(`\n[PODCAST PROGRESS] Delete:`); + console.log(` User: ${req.user!.username}`); + console.log(` Episode ID: ${episodeId}`); + + await prisma.podcastProgress.deleteMany({ + where: { + userId: req.user!.id, + episodeId: episodeId, + }, + }); + + console.log(` Progress removed`); + + res.json({ + success: true, + message: "Progress removed", + }); + } catch (error: any) { + console.error("Error removing progress:", error); + res.status(500).json({ + error: "Failed to remove progress", + message: error.message, + }); + } +}); + +/** + * GET /podcasts/:id/similar + * Get similar podcasts using iTunes Search API (free, no auth required) + */ +router.get("/:id/similar", async (req, res) => { + try { + const { id } = req.params; + + const podcast = await prisma.podcast.findUnique({ + where: { id }, + }); + + if (!podcast) { + return res.status(404).json({ error: "Podcast not found" }); + } + + console.log(`\n [SIMILAR PODCASTS] Request for: ${podcast.title}`); + + try { + // Check cache first + const cachedRecommendations = + await prisma.podcastRecommendation.findMany({ + where: { + podcastId: id, + expiresAt: { gt: new Date() }, + }, + orderBy: { score: "desc" }, + take: 10, + }); + + if (cachedRecommendations.length > 0) { + console.log( + ` Using ${cachedRecommendations.length} cached recommendations` + ); + return res.json( + cachedRecommendations.map((rec) => ({ + id: rec.recommendedId, + title: rec.title, + author: rec.author, + description: rec.description, + coverUrl: rec.coverUrl, + episodeCount: rec.episodeCount, + feedUrl: rec.feedUrl, + itunesId: rec.itunesId, + isExternal: true, + score: rec.score, + })) + ); + } + + // Fetch from iTunes Search API + console.log(` Fetching from iTunes Search API...`); + const { itunesService } = await import("../services/itunes"); + const recommendations = await itunesService.getSimilarPodcasts( + podcast.title, + podcast.description || undefined, + podcast.author + ); + + console.log(` Found ${recommendations.length} similar podcasts`); + + if (recommendations.length > 0) { + // Cache recommendations + const expiresAt = new Date(); + expiresAt.setDate(expiresAt.getDate() + 30); // 30 days cache + + await prisma.podcastRecommendation.deleteMany({ + where: { podcastId: id }, + }); + + await prisma.podcastRecommendation.createMany({ + data: recommendations.map((rec, index) => ({ + podcastId: id, + recommendedId: rec.collectionId.toString(), + title: rec.collectionName, + author: rec.artistName, + description: "", + coverUrl: rec.artworkUrl600 || rec.artworkUrl100, + episodeCount: rec.trackCount || 0, + feedUrl: rec.feedUrl, + itunesId: rec.collectionId.toString(), + score: recommendations.length - index, + cachedAt: new Date(), + expiresAt, + })), + }); + + console.log( + ` Cached ${recommendations.length} recommendations` + ); + + return res.json( + recommendations.map((rec, index) => ({ + id: rec.collectionId.toString(), + title: rec.collectionName, + author: rec.artistName, + description: "", + coverUrl: rec.artworkUrl600 || rec.artworkUrl100, + episodeCount: rec.trackCount || 0, + feedUrl: rec.feedUrl, + itunesId: rec.collectionId, + isExternal: true, + score: recommendations.length - index, + })) + ); + } + } catch (error: any) { + console.warn(" iTunes search failed:", error.message); + } + + // No recommendations available + console.log(` No recommendations found`); + res.json([]); + } catch (error: any) { + console.error("Error fetching similar podcasts:", error); + res.status(500).json({ + error: "Failed to fetch similar podcasts", + message: error.message, + }); + } +}); + +/** + * OPTIONS /podcasts/:id/cover + * Handle CORS preflight request for podcast cover images + */ +router.options("/:id/cover", (req, res) => { + const origin = req.headers.origin || "*"; + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + res.setHeader("Access-Control-Max-Age", "86400"); // 24 hours + res.status(204).end(); +}); + +/** + * GET /podcasts/:id/cover + * Serve cached podcast cover from local disk + */ +router.get("/:id/cover", async (req, res) => { + try { + const { id } = req.params; + + const podcast = await prisma.podcast.findUnique({ + where: { id }, + select: { localCoverPath: true, imageUrl: true }, + }); + + if (!podcast) { + return res.status(404).json({ error: "Podcast not found" }); + } + + // Serve from local disk if cached + if (podcast.localCoverPath) { + res.setHeader( + "Cache-Control", + "public, max-age=31536000, immutable" + ); + res.setHeader( + "Access-Control-Allow-Origin", + req.headers.origin || "*" + ); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Cross-Origin-Resource-Policy", "cross-origin"); + return res.sendFile(podcast.localCoverPath); + } + + // Fallback: redirect to original URL + if (podcast.imageUrl) { + return res.redirect(podcast.imageUrl); + } + + res.status(404).json({ error: "Cover not found" }); + } catch (error: any) { + console.error("Error serving podcast cover:", error); + res.status(500).json({ + error: "Failed to serve cover", + message: error.message, + }); + } +}); + +/** + * OPTIONS /podcasts/episodes/:episodeId/cover + * Handle CORS preflight request for episode cover images + */ +router.options("/episodes/:episodeId/cover", (req, res) => { + const origin = req.headers.origin || "*"; + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + res.setHeader("Access-Control-Max-Age", "86400"); // 24 hours + res.status(204).end(); +}); + +/** + * GET /podcasts/episodes/:episodeId/cover + * Serve cached episode cover from local disk + */ +router.get("/episodes/:episodeId/cover", async (req, res) => { + try { + const { episodeId } = req.params; + + const episode = await prisma.podcastEpisode.findUnique({ + where: { id: episodeId }, + select: { localCoverPath: true, imageUrl: true }, + }); + + if (!episode) { + return res.status(404).json({ error: "Episode not found" }); + } + + // Serve from local disk if cached + if (episode.localCoverPath) { + res.setHeader( + "Cache-Control", + "public, max-age=31536000, immutable" + ); + res.setHeader( + "Access-Control-Allow-Origin", + req.headers.origin || "*" + ); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Cross-Origin-Resource-Policy", "cross-origin"); + return res.sendFile(episode.localCoverPath); + } + + // Fallback: redirect to original URL + if (episode.imageUrl) { + return res.redirect(episode.imageUrl); + } + + res.status(404).json({ error: "Cover not found" }); + } catch (error: any) { + console.error("Error serving episode cover:", error); + res.status(500).json({ + error: "Failed to serve cover", + message: error.message, + }); + } +}); + +export default router; diff --git a/backend/src/routes/recommendations.ts b/backend/src/routes/recommendations.ts new file mode 100644 index 0000000..478ec54 --- /dev/null +++ b/backend/src/routes/recommendations.ts @@ -0,0 +1,469 @@ +import { Router } from "express"; +import { requireAuth, requireAuthOrToken } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { lastFmService } from "../services/lastfm"; + +const router = Router(); + +router.use(requireAuthOrToken); + +// GET /recommendations/for-you?limit=10 +router.get("/for-you", async (req, res) => { + try { + const { limit = "10" } = req.query; + const userId = req.user!.id; + const limitNum = parseInt(limit as string, 10); + + // Get user's most played artists + const recentPlays = await prisma.play.findMany({ + where: { userId }, + orderBy: { playedAt: "desc" }, + take: 50, + include: { + track: { + include: { + album: { + include: { + artist: true, + }, + }, + }, + }, + }, + }); + + // Count plays per artist + const artistPlayCounts = new Map< + string, + { artist: any; count: number } + >(); + for (const play of recentPlays) { + const artist = play.track.album.artist; + const existing = artistPlayCounts.get(artist.id); + if (existing) { + existing.count++; + } else { + artistPlayCounts.set(artist.id, { artist, count: 1 }); + } + } + + // Sort by play count and get top 3 seed artists + const topArtists = Array.from(artistPlayCounts.values()) + .sort((a, b) => b.count - a.count) + .slice(0, 3); + + if (topArtists.length === 0) { + // No listening history, return empty recommendations + return res.json({ artists: [] }); + } + + // Get similar artists for each top artist + const allSimilarArtists = await Promise.all( + topArtists.map(async ({ artist }) => { + const similar = await prisma.similarArtist.findMany({ + where: { fromArtistId: artist.id }, + orderBy: { weight: "desc" }, + take: 10, + include: { + toArtist: { + select: { + id: true, + mbid: true, + name: true, + heroUrl: true, + }, + }, + }, + }); + return similar.map((s) => s.toArtist); + }) + ); + + // Flatten and deduplicate + const recommendedArtists = Array.from( + new Map( + allSimilarArtists.flat().map((artist) => [artist.id, artist]) + ).values() + ); + + // Filter out artists user already owns (from native library) + const ownedArtists = await prisma.ownedAlbum.findMany({ + select: { artistId: true }, + distinct: ["artistId"], + }); + const ownedArtistIds = new Set(ownedArtists.map((a) => a.artistId)); + + console.log( + `Filtering recommendations: ${ownedArtistIds.size} owned artists to exclude` + ); + + const newArtists = recommendedArtists.filter( + (artist) => !ownedArtistIds.has(artist.id) + ); + + // Get album counts for recommended artists (from enriched discography) + const recommendedArtistIds = newArtists + .slice(0, limitNum) + .map((a) => a.id); + const albumCounts = await prisma.album.groupBy({ + by: ["artistId"], + where: { artistId: { in: recommendedArtistIds } }, + _count: { rgMbid: true }, + }); + const albumCountMap = new Map( + albumCounts.map((ac) => [ac.artistId, ac._count.rgMbid]) + ); + + // ========== CACHE-ONLY IMAGE LOOKUP FOR RECOMMENDATIONS ========== + // Only use cached data (DB heroUrl or Redis cache) - no API calls during page loads + // Background enrichment worker will populate cache over time + const { redisClient } = await import("../utils/redis"); + + // Get all cached images in a single Redis call for efficiency + const artistsToCheck = newArtists.slice(0, limitNum); + const cacheKeys = artistsToCheck + .filter(a => !a.heroUrl) + .map(a => `hero:${a.id}`); + + let cachedImages: (string | null)[] = []; + if (cacheKeys.length > 0) { + try { + cachedImages = await redisClient.mGet(cacheKeys); + } catch (err) { + // Redis errors are non-critical + } + } + + // Build a map from cache results + const cachedImageMap = new Map(); + let cacheIndex = 0; + for (const artist of artistsToCheck) { + if (!artist.heroUrl) { + const cached = cachedImages[cacheIndex]; + if (cached && cached !== "NOT_FOUND") { + cachedImageMap.set(artist.id, cached); + } + cacheIndex++; + } + } + + const artistsWithMetadata = artistsToCheck.map((artist) => { + // Use DB heroUrl first, then Redis cache, otherwise null + const coverArt = artist.heroUrl || cachedImageMap.get(artist.id) || null; + + return { + ...artist, + coverArt, + albumCount: albumCountMap.get(artist.id) || 0, + }; + }); + + console.log( + `Recommendations: Found ${artistsWithMetadata.length} new artists` + ); + artistsWithMetadata.forEach((a) => { + console.log( + ` ${a.name}: coverArt=${a.coverArt ? "YES" : "NO"}, albums=${ + a.albumCount + }` + ); + }); + + res.json({ artists: artistsWithMetadata }); + } catch (error) { + console.error("Get recommendations for you error:", error); + res.status(500).json({ error: "Failed to get recommendations" }); + } +}); + +// GET /recommendations?seedArtistId= +router.get("/", async (req, res) => { + try { + const { seedArtistId } = req.query; + + if (!seedArtistId) { + return res.status(400).json({ error: "seedArtistId required" }); + } + + // Get seed artist + const seedArtist = await prisma.artist.findUnique({ + where: { id: seedArtistId as string }, + }); + + if (!seedArtist) { + return res.status(404).json({ error: "Artist not found" }); + } + + // Get similar artists from database + const similarArtists = await prisma.similarArtist.findMany({ + where: { fromArtistId: seedArtistId as string }, + orderBy: { weight: "desc" }, + take: 20, + }); + + // Fetch full artist details for each similar artist + const recommendations = await Promise.all( + similarArtists.map(async (similar) => { + const artist = await prisma.artist.findUnique({ + where: { id: similar.toArtistId }, + }); + + const albums = await prisma.album.findMany({ + where: { artistId: similar.toArtistId }, + orderBy: { year: "desc" }, + take: 3, + }); + + const ownedAlbums = await prisma.ownedAlbum.findMany({ + where: { artistId: similar.toArtistId }, + }); + + const ownedRgMbids = new Set(ownedAlbums.map((o) => o.rgMbid)); + + return { + artist: { + id: artist?.id, + mbid: artist?.mbid, + name: artist?.name, + heroUrl: artist?.heroUrl, + }, + similarity: similar.weight, + topAlbums: albums.map((album) => ({ + ...album, + owned: ownedRgMbids.has(album.rgMbid), + })), + }; + }) + ); + + res.json({ + seedArtist: { + id: seedArtist.id, + name: seedArtist.name, + }, + recommendations, + }); + } catch (error) { + console.error("Get recommendations error:", error); + res.status(500).json({ error: "Failed to get recommendations" }); + } +}); + +// GET /recommendations/albums?seedAlbumId= +router.get("/albums", async (req, res) => { + try { + const { seedAlbumId } = req.query; + + if (!seedAlbumId) { + return res.status(400).json({ error: "seedAlbumId required" }); + } + + // Get seed album + const seedAlbum = await prisma.album.findUnique({ + where: { id: seedAlbumId as string }, + include: { + artist: true, + tracks: { + include: { + trackGenres: { + include: { + genre: true, + }, + }, + }, + }, + }, + }); + + if (!seedAlbum) { + return res.status(404).json({ error: "Album not found" }); + } + + // Get genre tags from the album's tracks + const genreTags = Array.from( + new Set( + seedAlbum.tracks.flatMap((track) => + track.trackGenres.map((tg) => tg.genre.name) + ) + ) + ); + + // Strategy 1: Get albums from similar artists + const similarArtists = await prisma.similarArtist.findMany({ + where: { fromArtistId: seedAlbum.artistId }, + orderBy: { weight: "desc" }, + take: 10, + }); + + const similarArtistAlbums = await prisma.album.findMany({ + where: { + artistId: { in: similarArtists.map((sa) => sa.toArtistId) }, + id: { not: seedAlbumId as string }, // Exclude seed album + }, + include: { + artist: true, + }, + orderBy: { year: "desc" }, + take: 15, + }); + + // Strategy 2: Get albums with matching genres + let genreMatchAlbums: any[] = []; + if (genreTags.length > 0) { + genreMatchAlbums = await prisma.album.findMany({ + where: { + id: { not: seedAlbumId as string }, + tracks: { + some: { + trackGenres: { + some: { + genre: { + name: { in: genreTags }, + }, + }, + }, + }, + }, + }, + include: { + artist: true, + }, + take: 10, + }); + } + + // Combine and deduplicate + const allAlbums = [...similarArtistAlbums, ...genreMatchAlbums]; + const uniqueAlbums = Array.from( + new Map(allAlbums.map((album) => [album.id, album])).values() + ); + + // Check ownership + const recommendations = await Promise.all( + uniqueAlbums.slice(0, 20).map(async (album) => { + const ownedAlbums = await prisma.ownedAlbum.findMany({ + where: { artistId: album.artistId }, + }); + + const ownedRgMbids = new Set(ownedAlbums.map((o) => o.rgMbid)); + + return { + ...album, + owned: ownedRgMbids.has(album.rgMbid), + }; + }) + ); + + res.json({ + seedAlbum: { + id: seedAlbum.id, + title: seedAlbum.title, + artist: seedAlbum.artist.name, + }, + recommendations, + }); + } catch (error) { + console.error("Get album recommendations error:", error); + res.status(500).json({ + error: "Failed to get album recommendations", + }); + } +}); + +// GET /recommendations/tracks?seedTrackId= +router.get("/tracks", async (req, res) => { + try { + const { seedTrackId } = req.query; + + if (!seedTrackId) { + return res.status(400).json({ error: "seedTrackId required" }); + } + + // Get seed track + const seedTrack = await prisma.track.findUnique({ + where: { id: seedTrackId as string }, + include: { + album: { + include: { + artist: true, + }, + }, + }, + }); + + if (!seedTrack) { + return res.status(404).json({ error: "Track not found" }); + } + + // Use Last.fm to get similar tracks + const similarTracksFromLastFm = await lastFmService.getSimilarTracks( + seedTrack.album.artist.name, + seedTrack.title, + 20 + ); + + // Try to match similar tracks in our library + const recommendations = []; + + for (const lfmTrack of similarTracksFromLastFm) { + const matchedTracks = await prisma.track.findMany({ + where: { + title: { + contains: lfmTrack.name, + mode: "insensitive", + }, + album: { + artist: { + name: { + contains: lfmTrack.artist?.name || "", + mode: "insensitive", + }, + }, + }, + }, + include: { + album: { + include: { + artist: true, + }, + }, + }, + take: 1, + }); + + if (matchedTracks.length > 0) { + recommendations.push({ + ...matchedTracks[0], + inLibrary: true, + similarity: lfmTrack.match || 0, + }); + } else { + // Include Last.fm suggestion even if not in library + recommendations.push({ + title: lfmTrack.name, + artist: lfmTrack.artist?.name || "Unknown", + inLibrary: false, + similarity: lfmTrack.match || 0, + lastFmUrl: lfmTrack.url, + }); + } + } + + res.json({ + seedTrack: { + id: seedTrack.id, + title: seedTrack.title, + artist: seedTrack.album.artist.name, + album: seedTrack.album.title, + }, + recommendations, + }); + } catch (error) { + console.error("Get track recommendations error:", error); + res.status(500).json({ + error: "Failed to get track recommendations", + }); + } +}); + +export default router; diff --git a/backend/src/routes/releases.ts b/backend/src/routes/releases.ts new file mode 100644 index 0000000..5dc6e8e --- /dev/null +++ b/backend/src/routes/releases.ts @@ -0,0 +1,259 @@ +/** + * Release Radar API + * + * Provides upcoming and recent releases from: + * 1. Lidarr monitored artists (via calendar API) + * 2. Similar artists from user's library (Last.fm similar artists) + */ + +import { Router } from "express"; +import { lidarrService, CalendarRelease } from "../services/lidarr"; +import { prisma } from "../utils/db"; + +const router = Router(); + +interface ReleaseRadarResponse { + upcoming: ReleaseItem[]; + recent: ReleaseItem[]; + monitoredArtistCount: number; + similarArtistCount: number; +} + +interface ReleaseItem { + id: number | string; + title: string; + artistName: string; + artistMbid?: string; + albumMbid: string; + releaseDate: string; + coverUrl: string | null; + source: 'lidarr' | 'similar'; + status: 'upcoming' | 'released' | 'available'; + inLibrary: boolean; + canDownload: boolean; +} + +/** + * GET /releases/radar + * + * Get upcoming and recent releases for the user's monitored artists + * and their similar artists. + */ +router.get("/radar", async (req, res) => { + try { + const now = new Date(); + const daysBack = parseInt(req.query.daysBack as string) || 30; + const daysAhead = parseInt(req.query.daysAhead as string) || 90; + + // Calculate date range + const startDate = new Date(now); + startDate.setDate(startDate.getDate() - daysBack); + + const endDate = new Date(now); + endDate.setDate(endDate.getDate() + daysAhead); + + console.log(`[Releases] Fetching radar: ${daysBack} days back, ${daysAhead} days ahead`); + + // 1. Get releases from Lidarr calendar (monitored artists) + const lidarrReleases = await lidarrService.getCalendar(startDate, endDate); + + // 2. Get monitored artists from Lidarr + const monitoredArtists = await lidarrService.getMonitoredArtists(); + const monitoredMbids = new Set(monitoredArtists.map(a => a.mbid)); + + // 3. Get similar artists from user's library that aren't monitored + const similarArtists = await prisma.similarArtist.findMany({ + where: { + // Source artist is in the library (has albums) + fromArtist: { + albums: { some: {} } + }, + // Target artist is NOT in library (no albums) + toArtist: { + albums: { none: {} } + } + }, + select: { + toArtist: { + select: { + id: true, + name: true, + mbid: true, + } + }, + weight: true, + }, + orderBy: { weight: 'desc' }, + take: 50, // Top 50 similar artists + }); + + // Filter out any that are already monitored in Lidarr + const unmonitoredSimilar = similarArtists.filter( + sa => sa.toArtist.mbid && !monitoredMbids.has(sa.toArtist.mbid) + ); + + console.log(`[Releases] Found ${lidarrReleases.length} Lidarr releases`); + console.log(`[Releases] Found ${unmonitoredSimilar.length} unmonitored similar artists`); + + // 4. Get albums in library to check what user already has + const libraryAlbums = await prisma.album.findMany({ + select: { + rgMbid: true, + } + }); + const libraryAlbumMbids = new Set(libraryAlbums.map(a => a.rgMbid).filter(Boolean)); + + // 5. Transform Lidarr releases + const releases: ReleaseItem[] = lidarrReleases.map(release => { + const releaseTime = new Date(release.releaseDate).getTime(); + const isUpcoming = releaseTime > now.getTime(); + const inLibrary = release.hasFile || libraryAlbumMbids.has(release.albumMbid); + + return { + id: release.id, + title: release.title, + artistName: release.artistName, + artistMbid: release.artistMbid, + albumMbid: release.albumMbid, + releaseDate: release.releaseDate, + coverUrl: release.coverUrl, + source: 'lidarr' as const, + status: isUpcoming ? 'upcoming' : (inLibrary ? 'available' : 'released'), + inLibrary, + canDownload: !inLibrary && !isUpcoming, + }; + }); + + // 6. Split into upcoming and recent + const upcoming = releases + .filter(r => r.status === 'upcoming') + .sort((a, b) => new Date(a.releaseDate).getTime() - new Date(b.releaseDate).getTime()); + + const recent = releases + .filter(r => r.status !== 'upcoming') + .sort((a, b) => new Date(b.releaseDate).getTime() - new Date(a.releaseDate).getTime()); + + const response: ReleaseRadarResponse = { + upcoming, + recent, + monitoredArtistCount: monitoredArtists.length, + similarArtistCount: unmonitoredSimilar.length, + }; + + res.json(response); + } catch (error: any) { + console.error("[Releases] Radar error:", error.message); + res.status(500).json({ error: "Failed to fetch release radar" }); + } +}); + +/** + * GET /releases/upcoming + * + * Get only upcoming releases (next X days) + */ +router.get("/upcoming", async (req, res) => { + try { + const daysAhead = parseInt(req.query.days as string) || 90; + + const now = new Date(); + const endDate = new Date(now); + endDate.setDate(endDate.getDate() + daysAhead); + + const releases = await lidarrService.getCalendar(now, endDate); + + // Sort by release date (soonest first) + const sorted = releases.sort((a, b) => + new Date(a.releaseDate).getTime() - new Date(b.releaseDate).getTime() + ); + + res.json({ + releases: sorted, + count: sorted.length, + daysAhead, + }); + } catch (error: any) { + console.error("[Releases] Upcoming error:", error.message); + res.status(500).json({ error: "Failed to fetch upcoming releases" }); + } +}); + +/** + * GET /releases/recent + * + * Get recently released albums (last X days) that user might want to download + */ +router.get("/recent", async (req, res) => { + try { + const daysBack = parseInt(req.query.days as string) || 30; + + const now = new Date(); + const startDate = new Date(now); + startDate.setDate(startDate.getDate() - daysBack); + + const releases = await lidarrService.getCalendar(startDate, now); + + // Get library albums to mark what's already downloaded + const libraryAlbums = await prisma.album.findMany({ + where: { rgMbid: { not: null } }, + select: { rgMbid: true } + }); + const libraryMbids = new Set(libraryAlbums.map(a => a.rgMbid).filter(Boolean)); + + // Filter to releases not in library and sort (newest first) + const notInLibrary = releases + .filter(r => !r.hasFile && !libraryMbids.has(r.albumMbid)) + .sort((a, b) => + new Date(b.releaseDate).getTime() - new Date(a.releaseDate).getTime() + ); + + res.json({ + releases: notInLibrary, + count: notInLibrary.length, + daysBack, + inLibraryCount: releases.length - notInLibrary.length, + }); + } catch (error: any) { + console.error("[Releases] Recent error:", error.message); + res.status(500).json({ error: "Failed to fetch recent releases" }); + } +}); + +/** + * POST /releases/download/:albumMbid + * + * Download a release from the radar + */ +router.post("/download/:albumMbid", async (req, res) => { + try { + const { albumMbid } = req.params; + const userId = req.user?.id; + + if (!userId) { + return res.status(401).json({ error: "Authentication required" }); + } + + console.log(`[Releases] Download requested for album: ${albumMbid}`); + + // Use Lidarr to download the album + const result = await lidarrService.downloadAlbum(albumMbid); + + if (result) { + res.json({ + success: true, + message: "Download started", + albumId: result.id + }); + } else { + res.status(404).json({ + error: "Album not found in Lidarr or download failed" + }); + } + } catch (error: any) { + console.error("[Releases] Download error:", error.message); + res.status(500).json({ error: "Failed to start download" }); + } +}); + +export default router; + diff --git a/backend/src/routes/search.ts b/backend/src/routes/search.ts new file mode 100644 index 0000000..2d901da --- /dev/null +++ b/backend/src/routes/search.ts @@ -0,0 +1,432 @@ +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { audiobookshelfService } from "../services/audiobookshelf"; +import { lastFmService } from "../services/lastfm"; +import { searchService } from "../services/search"; +import axios from "axios"; +import { redisClient } from "../utils/redis"; + +const router = Router(); + +router.use(requireAuth); + +/** + * @openapi + * /search: + * get: + * summary: Search across your music library + * description: Search for artists, albums, tracks, audiobooks, and podcasts in your library using PostgreSQL full-text search + * tags: [Search] + * security: + * - sessionAuth: [] + * - apiKeyAuth: [] + * parameters: + * - in: query + * name: q + * schema: + * type: string + * required: true + * description: Search query + * example: "radiohead" + * - in: query + * name: type + * schema: + * type: string + * enum: [all, artists, albums, tracks, audiobooks, podcasts] + * description: Type of content to search + * default: all + * - in: query + * name: genre + * schema: + * type: string + * description: Filter tracks by genre + * - in: query + * name: limit + * schema: + * type: integer + * minimum: 1 + * maximum: 100 + * description: Maximum number of results per type + * default: 20 + * responses: + * 200: + * description: Search results + * content: + * application/json: + * schema: + * type: object + * properties: + * artists: + * type: array + * items: + * $ref: '#/components/schemas/Artist' + * albums: + * type: array + * items: + * $ref: '#/components/schemas/Album' + * tracks: + * type: array + * items: + * $ref: '#/components/schemas/Track' + * audiobooks: + * type: array + * items: + * type: object + * podcasts: + * type: array + * items: + * type: object + * 401: + * description: Not authenticated + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/Error' + */ +router.get("/", async (req, res) => { + try { + const { q = "", type = "all", genre, limit = "20" } = req.query; + + const query = (q as string).trim(); + const searchLimit = Math.min(parseInt(limit as string, 10), 100); + + if (!query) { + return res.json({ + artists: [], + albums: [], + tracks: [], + audiobooks: [], + podcasts: [], + }); + } + + // Check cache for library search (short TTL since library can change) + const cacheKey = `search:library:${type}:${genre || ""}:${query}:${searchLimit}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(`[SEARCH] Cache hit for query="${query}"`); + return res.json(JSON.parse(cached)); + } + } catch (err) { + // Redis errors are non-critical + } + + const results: any = { + artists: [], + albums: [], + tracks: [], + audiobooks: [], + podcasts: [], + }; + + // Search artists using full-text search (only show artists with actual albums in library) + if (type === "all" || type === "artists") { + const artistResults = await searchService.searchArtists({ + query, + limit: searchLimit, + }); + + // Filter to only include artists with albums + const artistIds = artistResults.map((a) => a.id); + const artistsWithAlbums = await prisma.artist.findMany({ + where: { + id: { in: artistIds }, + albums: { + some: {}, + }, + }, + select: { + id: true, + mbid: true, + name: true, + heroUrl: true, + summary: true, + }, + }); + + // Preserve rank order from full-text search + const rankMap = new Map(artistResults.map((a) => [a.id, a.rank])); + results.artists = artistsWithAlbums.sort((a, b) => { + const rankA = rankMap.get(a.id) || 0; + const rankB = rankMap.get(b.id) || 0; + return rankB - rankA; // Sort by rank DESC + }); + } + + // Search albums using full-text search + if (type === "all" || type === "albums") { + const albumResults = await searchService.searchAlbums({ + query, + limit: searchLimit, + }); + + results.albums = albumResults.map((album) => ({ + id: album.id, + title: album.title, + artistId: album.artistId, + year: album.year, + coverUrl: album.coverUrl, + artist: { + id: album.artistId, + name: album.artistName, + mbid: "", // Not included in search result + }, + })); + } + + // Search tracks using full-text search + if (type === "all" || type === "tracks") { + const trackResults = await searchService.searchTracks({ + query, + limit: searchLimit, + }); + + // If genre filter is applied, filter the results + if (genre) { + const trackIds = trackResults.map((t) => t.id); + const tracksWithGenre = await prisma.track.findMany({ + where: { + id: { in: trackIds }, + trackGenres: { + some: { + genre: { + name: { + equals: genre as string, + mode: "insensitive", + }, + }, + }, + }, + }, + select: { id: true }, + }); + + const genreTrackIds = new Set(tracksWithGenre.map((t) => t.id)); + results.tracks = trackResults + .filter((t) => genreTrackIds.has(t.id)) + .map((track) => ({ + id: track.id, + title: track.title, + albumId: track.albumId, + duration: track.duration, + trackNo: 0, // Not included in search result + album: { + id: track.albumId, + title: track.albumTitle, + artistId: track.artistId, + coverUrl: null, // Not included in search result + artist: { + id: track.artistId, + name: track.artistName, + mbid: "", // Not included in search result + }, + }, + })); + } else { + results.tracks = trackResults.map((track) => ({ + id: track.id, + title: track.title, + albumId: track.albumId, + duration: track.duration, + trackNo: 0, // Not included in search result + album: { + id: track.albumId, + title: track.albumTitle, + artistId: track.artistId, + coverUrl: null, // Not included in search result + artist: { + id: track.artistId, + name: track.artistName, + mbid: "", // Not included in search result + }, + }, + })); + } + } + + // Search audiobooks + if (type === "all" || type === "audiobooks") { + try { + const audiobooks = await audiobookshelfService.searchAudiobooks( + query + ); + results.audiobooks = audiobooks.slice(0, searchLimit); + } catch (error) { + console.error("Audiobook search error:", error); + results.audiobooks = []; + } + } + + // Search podcasts (search through owned podcasts) + if (type === "all" || type === "podcasts") { + try { + const allPodcasts = + await audiobookshelfService.getAllPodcasts(); + results.podcasts = allPodcasts + .filter( + (p) => + p.media?.metadata?.title + ?.toLowerCase() + .includes(query.toLowerCase()) || + p.media?.metadata?.author + ?.toLowerCase() + .includes(query.toLowerCase()) + ) + .slice(0, searchLimit); + } catch (error) { + console.error("Podcast search error:", error); + results.podcasts = []; + } + } + + // Cache search results for 2 minutes (library can change) + try { + await redisClient.setEx(cacheKey, 120, JSON.stringify(results)); + } catch (err) { + // Redis errors are non-critical + } + + res.json(results); + } catch (error) { + console.error("Search error:", error); + res.status(500).json({ error: "Search failed" }); + } +}); + +// GET /search/genres +router.get("/genres", async (req, res) => { + try { + const genres = await prisma.genre.findMany({ + orderBy: { name: "asc" }, + include: { + _count: { + select: { trackGenres: true }, + }, + }, + }); + + res.json( + genres.map((g) => ({ + id: g.id, + name: g.name, + trackCount: g._count.trackGenres, + })) + ); + } catch (error) { + console.error("Get genres error:", error); + res.status(500).json({ error: "Failed to get genres" }); + } +}); + +/** + * GET /search/discover?q=query&type=music|podcasts + * Search for NEW content to discover (not in your library) + */ +router.get("/discover", async (req, res) => { + try { + const { q = "", type = "music", limit = "20" } = req.query; + + const query = (q as string).trim(); + const searchLimit = Math.min(parseInt(limit as string, 10), 50); + + if (!query) { + return res.json({ results: [] }); + } + + const cacheKey = `search:discover:${type}:${query}:${searchLimit}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log( + `[SEARCH DISCOVER] Cache hit for query="${query}" type=${type}` + ); + return res.json(JSON.parse(cached)); + } + } catch (err) { + console.warn("[SEARCH DISCOVER] Redis read error:", err); + } + + const results: any[] = []; + + if (type === "music" || type === "all") { + // Search Last.fm for artists AND tracks + try { + // Search for artists + const lastfmArtistResults = await lastFmService.searchArtists( + query, + searchLimit + ); + console.log( + `[SEARCH ENDPOINT] Found ${lastfmArtistResults.length} artist results` + ); + results.push(...lastfmArtistResults); + + // Search for tracks (songs) + const lastfmTrackResults = await lastFmService.searchTracks( + query, + searchLimit + ); + console.log( + `[SEARCH ENDPOINT] Found ${lastfmTrackResults.length} track results` + ); + results.push(...lastfmTrackResults); + } catch (error) { + console.error("Last.fm search error:", error); + } + } + + if (type === "podcasts" || type === "all") { + // Search iTunes Podcast API + try { + const itunesResponse = await axios.get( + "https://itunes.apple.com/search", + { + params: { + term: query, + media: "podcast", + entity: "podcast", + limit: searchLimit, + }, + timeout: 5000, + } + ); + + const podcasts = itunesResponse.data.results.map( + (podcast: any) => ({ + type: "podcast", + id: podcast.collectionId, + name: podcast.collectionName, + artist: podcast.artistName, + description: podcast.description, + coverUrl: + podcast.artworkUrl600 || podcast.artworkUrl100, + feedUrl: podcast.feedUrl, + genres: podcast.genres || [], + trackCount: podcast.trackCount, + }) + ); + + results.push(...podcasts); + } catch (error) { + console.error("iTunes podcast search error:", error); + } + } + + const payload = { results }; + + try { + await redisClient.setEx(cacheKey, 900, JSON.stringify(payload)); + } catch (err) { + console.warn("[SEARCH DISCOVER] Redis write error:", err); + } + + res.json(payload); + } catch (error) { + console.error("Discovery search error:", error); + res.status(500).json({ error: "Discovery search failed" }); + } +}); + +export default router; diff --git a/backend/src/routes/settings.ts b/backend/src/routes/settings.ts new file mode 100644 index 0000000..e980994 --- /dev/null +++ b/backend/src/routes/settings.ts @@ -0,0 +1,73 @@ +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { z } from "zod"; + +const router = Router(); + +router.use(requireAuth); + +const settingsSchema = z.object({ + playbackQuality: z.enum(["original", "high", "medium", "low"]).optional(), + wifiOnly: z.boolean().optional(), + offlineEnabled: z.boolean().optional(), + maxCacheSizeMb: z.number().int().min(0).optional(), +}); + +// GET /settings +router.get("/", async (req, res) => { + try { + const userId = req.user!.id; + + let settings = await prisma.userSettings.findUnique({ + where: { userId }, + }); + + // Create default settings if they don't exist + if (!settings) { + settings = await prisma.userSettings.create({ + data: { + userId, + playbackQuality: "medium", + wifiOnly: false, + offlineEnabled: false, + maxCacheSizeMb: 5120, + }, + }); + } + + res.json(settings); + } catch (error) { + console.error("Get settings error:", error); + res.status(500).json({ error: "Failed to get settings" }); + } +}); + +// POST /settings +router.post("/", async (req, res) => { + try { + const userId = req.user!.id; + const data = settingsSchema.parse(req.body); + + const settings = await prisma.userSettings.upsert({ + where: { userId }, + create: { + userId, + ...data, + }, + update: data, + }); + + res.json(settings); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid settings", details: error.errors }); + } + console.error("Update settings error:", error); + res.status(500).json({ error: "Failed to update settings" }); + } +}); + +export default router; diff --git a/backend/src/routes/soulseek.ts b/backend/src/routes/soulseek.ts new file mode 100644 index 0000000..4be669e --- /dev/null +++ b/backend/src/routes/soulseek.ts @@ -0,0 +1,193 @@ +/** + * Soulseek routes - Direct connection via slsk-client + * Simplified API for status and manual search/download + */ + +import { Router } from "express"; +import { requireAuth } from "../middleware/auth"; +import { soulseekService } from "../services/soulseek"; +import { getSystemSettings } from "../utils/systemSettings"; + +const router = Router(); + +// Middleware to check if Soulseek credentials are configured +async function requireSoulseekConfigured(req: any, res: any, next: any) { + try { + const available = await soulseekService.isAvailable(); + + if (!available) { + return res.status(403).json({ + error: "Soulseek credentials not configured. Add username/password in System Settings.", + }); + } + + next(); + } catch (error) { + console.error("Error checking Soulseek settings:", error); + res.status(500).json({ error: "Failed to check settings" }); + } +} + +/** + * GET /soulseek/status + * Check connection status + */ +router.get("/status", requireAuth, async (req, res) => { + try { + const available = await soulseekService.isAvailable(); + + if (!available) { + return res.json({ + enabled: false, + connected: false, + message: "Soulseek credentials not configured", + }); + } + + const status = await soulseekService.getStatus(); + + res.json({ + enabled: true, + connected: status.connected, + username: status.username, + }); + } catch (error: any) { + console.error("Soulseek status error:", error.message); + res.status(500).json({ + error: "Failed to get Soulseek status", + details: error.message, + }); + } +}); + +/** + * POST /soulseek/connect + * Manually trigger connection to Soulseek network + */ +router.post("/connect", requireAuth, requireSoulseekConfigured, async (req, res) => { + try { + await soulseekService.connect(); + + res.json({ + success: true, + message: "Connected to Soulseek network", + }); + } catch (error: any) { + console.error("Soulseek connect error:", error.message); + res.status(500).json({ + error: "Failed to connect to Soulseek", + details: error.message, + }); + } +}); + +/** + * POST /soulseek/search + * Search for a track + */ +router.post("/search", requireAuth, requireSoulseekConfigured, async (req, res) => { + try { + const { artist, title } = req.body; + + if (!artist || !title) { + return res.status(400).json({ + error: "Artist and title are required", + }); + } + + console.log(`[Soulseek] Searching: "${artist} - ${title}"`); + + const result = await soulseekService.searchTrack(artist, title); + + if (result.found && result.bestMatch) { + res.json({ + found: true, + match: { + user: result.bestMatch.username, + filename: result.bestMatch.filename, + size: result.bestMatch.size, + quality: result.bestMatch.quality, + score: result.bestMatch.score, + }, + }); + } else { + res.json({ + found: false, + message: "No suitable matches found", + }); + } + } catch (error: any) { + console.error("Soulseek search error:", error.message); + res.status(500).json({ + error: "Search failed", + details: error.message, + }); + } +}); + +/** + * POST /soulseek/download + * Download a track directly + */ +router.post("/download", requireAuth, requireSoulseekConfigured, async (req, res) => { + try { + const { artist, title, album } = req.body; + + if (!artist || !title) { + return res.status(400).json({ + error: "Artist and title are required", + }); + } + + const settings = await getSystemSettings(); + const musicPath = settings?.musicPath; + + if (!musicPath) { + return res.status(400).json({ + error: "Music path not configured", + }); + } + + console.log(`[Soulseek] Downloading: "${artist} - ${title}"`); + + const result = await soulseekService.searchAndDownload( + artist, + title, + album || "Unknown Album", + musicPath + ); + + if (result.success) { + res.json({ + success: true, + filePath: result.filePath, + }); + } else { + res.status(404).json({ + success: false, + error: result.error || "Download failed", + }); + } + } catch (error: any) { + console.error("Soulseek download error:", error.message); + res.status(500).json({ + error: "Download failed", + details: error.message, + }); + } +}); + +/** + * POST /soulseek/disconnect + * Disconnect from Soulseek network + */ +router.post("/disconnect", requireAuth, async (req, res) => { + try { + soulseekService.disconnect(); + res.json({ success: true, message: "Disconnected" }); + } catch (error: any) { + res.status(500).json({ error: error.message }); + } +}); + +export default router; diff --git a/backend/src/routes/spotify.ts b/backend/src/routes/spotify.ts new file mode 100644 index 0000000..c0910d4 --- /dev/null +++ b/backend/src/routes/spotify.ts @@ -0,0 +1,334 @@ +import { Router } from "express"; +import { requireAuthOrToken } from "../middleware/auth"; +import { z } from "zod"; +import { spotifyService } from "../services/spotify"; +import { spotifyImportService } from "../services/spotifyImport"; +import { deezerService } from "../services/deezer"; +import { readSessionLog, getSessionLogPath } from "../utils/playlistLogger"; + +const router = Router(); + +// All routes require authentication +router.use(requireAuthOrToken); + +// Validation schemas +const parseUrlSchema = z.object({ + url: z.string().url(), +}); + +const importSchema = z.object({ + spotifyPlaylistId: z.string(), + url: z.string().url().optional(), + playlistName: z.string().min(1).max(200), + albumMbidsToDownload: z.array(z.string()), +}); + +/** + * POST /api/spotify/parse + * Parse a Spotify URL and return basic info + */ +router.post("/parse", async (req, res) => { + try { + const { url } = parseUrlSchema.parse(req.body); + + const parsed = spotifyService.parseUrl(url); + if (!parsed) { + return res.status(400).json({ + error: "Invalid Spotify URL. Please provide a valid playlist URL.", + }); + } + + // For now, only support playlists + if (parsed.type !== "playlist") { + return res.status(400).json({ + error: `Only playlist imports are supported. Got: ${parsed.type}`, + }); + } + + res.json({ + type: parsed.type, + id: parsed.id, + url: `https://open.spotify.com/playlist/${parsed.id}`, + }); + } catch (error: any) { + console.error("Spotify parse error:", error); + if (error.name === "ZodError") { + return res.status(400).json({ error: "Invalid request body" }); + } + res.status(500).json({ error: error.message || "Failed to parse URL" }); + } +}); + +/** + * POST /api/spotify/preview + * Generate a preview of what will be imported from a Spotify or Deezer playlist + */ +router.post("/preview", async (req, res) => { + try { + const { url } = parseUrlSchema.parse(req.body); + + console.log(`[Playlist Import] Generating preview for: ${url}`); + + // Detect if it's a Deezer URL + if (url.includes("deezer.com")) { + // Extract playlist ID from Deezer URL + const deezerMatch = url.match(/playlist[\/:](\d+)/); + if (!deezerMatch) { + return res + .status(400) + .json({ error: "Invalid Deezer playlist URL" }); + } + + const playlistId = deezerMatch[1]; + const deezerPlaylist = await deezerService.getPlaylist(playlistId); + + if (!deezerPlaylist) { + return res + .status(404) + .json({ error: "Deezer playlist not found" }); + } + + // Convert Deezer format to Spotify Import format + const preview = + await spotifyImportService.generatePreviewFromDeezer( + deezerPlaylist + ); + + console.log( + `[Playlist Import] Deezer preview generated: ${preview.summary.total} tracks, ${preview.summary.inLibrary} in library` + ); + res.json(preview); + } else { + // Handle Spotify URL + const preview = await spotifyImportService.generatePreview(url); + + console.log( + `[Spotify Import] Preview generated: ${preview.summary.total} tracks, ${preview.summary.inLibrary} in library` + ); + res.json(preview); + } + } catch (error: any) { + console.error("Playlist preview error:", error); + if (error.name === "ZodError") { + return res.status(400).json({ error: "Invalid request body" }); + } + res.status(500).json({ + error: error.message || "Failed to generate preview", + }); + } +}); + +/** + * POST /api/spotify/import + * Start importing a Spotify playlist + */ +router.post("/import", async (req, res) => { + try { + const { spotifyPlaylistId, url, playlistName, albumMbidsToDownload } = + importSchema.parse(req.body); + const userId = req.user.id; + + // Re-generate preview to ensure fresh data + const effectiveUrl = + url?.trim() || + `https://open.spotify.com/playlist/${spotifyPlaylistId}`; + + let preview; + if (effectiveUrl.includes("deezer.com")) { + const deezerMatch = effectiveUrl.match(/playlist[\/:](\d+)/); + if (!deezerMatch) { + return res + .status(400) + .json({ error: "Invalid Deezer playlist URL" }); + } + const playlistId = deezerMatch[1]; + const deezerPlaylist = await deezerService.getPlaylist(playlistId); + if (!deezerPlaylist) { + return res + .status(404) + .json({ error: "Deezer playlist not found" }); + } + preview = await spotifyImportService.generatePreviewFromDeezer( + deezerPlaylist + ); + } else { + preview = await spotifyImportService.generatePreview(effectiveUrl); + } + + console.log( + `[Spotify Import] Starting import for user ${userId}: ${playlistName}` + ); + console.log( + `[Spotify Import] Downloading ${albumMbidsToDownload.length} albums` + ); + + const job = await spotifyImportService.startImport( + userId, + spotifyPlaylistId, + playlistName, + albumMbidsToDownload, + preview + ); + + res.json({ + jobId: job.id, + status: job.status, + message: "Import started", + }); + } catch (error: any) { + console.error("Spotify import error:", error); + if (error.name === "ZodError") { + return res.status(400).json({ error: "Invalid request body" }); + } + res.status(500).json({ + error: error.message || "Failed to start import", + }); + } +}); + +/** + * GET /api/spotify/import/:jobId/status + * Get the status of an import job + */ +router.get("/import/:jobId/status", async (req, res) => { + try { + const { jobId } = req.params; + const userId = req.user.id; + + const job = await spotifyImportService.getJob(jobId); + if (!job) { + return res.status(404).json({ error: "Import job not found" }); + } + + // Ensure user owns this job + if (job.userId !== userId) { + return res + .status(403) + .json({ error: "Not authorized to view this job" }); + } + + res.json(job); + } catch (error: any) { + console.error("Spotify job status error:", error); + res.status(500).json({ + error: error.message || "Failed to get job status", + }); + } +}); + +/** + * GET /api/spotify/imports + * Get all import jobs for the current user + */ +router.get("/imports", async (req, res) => { + try { + const userId = req.user.id; + const jobs = await spotifyImportService.getUserJobs(userId); + res.json(jobs); + } catch (error: any) { + console.error("Spotify imports error:", error); + res.status(500).json({ + error: error.message || "Failed to get imports", + }); + } +}); + +/** + * POST /api/spotify/import/:jobId/refresh + * Re-match pending tracks and add newly downloaded ones to the playlist + */ +router.post("/import/:jobId/refresh", async (req, res) => { + try { + const { jobId } = req.params; + const userId = req.user.id; + + const job = await spotifyImportService.getJob(jobId); + if (!job) { + return res.status(404).json({ error: "Import job not found" }); + } + + // Ensure user owns this job + if (job.userId !== userId) { + return res + .status(403) + .json({ error: "Not authorized to refresh this job" }); + } + + const result = await spotifyImportService.refreshJobMatches(jobId); + + res.json({ + message: + result.added > 0 + ? `Added ${result.added} newly downloaded track(s)` + : "No new tracks found yet. Albums may still be downloading.", + added: result.added, + total: result.total, + }); + } catch (error: any) { + console.error("Spotify refresh error:", error); + res.status(500).json({ + error: error.message || "Failed to refresh tracks", + }); + } +}); + +/** + * POST /api/spotify/import/:jobId/cancel + * Cancel an import job and create playlist with whatever succeeded + */ +router.post("/import/:jobId/cancel", async (req, res) => { + try { + const { jobId } = req.params; + const userId = req.user.id; + + const job = await spotifyImportService.getJob(jobId); + if (!job) { + return res.status(404).json({ error: "Import job not found" }); + } + + // Ensure user owns this job + if (job.userId !== userId) { + return res + .status(403) + .json({ error: "Not authorized to cancel this job" }); + } + + const result = await spotifyImportService.cancelJob(jobId); + + res.json({ + message: result.playlistCreated + ? `Import cancelled. Playlist created with ${result.tracksMatched} track(s).` + : "Import cancelled. No tracks were downloaded.", + playlistId: result.playlistId, + tracksMatched: result.tracksMatched, + }); + } catch (error: any) { + console.error("Spotify cancel error:", error); + res.status(500).json({ + error: error.message || "Failed to cancel import", + }); + } +}); + +/** + * GET /api/spotify/import/session-log + * Get the current session log for debugging import issues + */ +router.get("/import/session-log", async (req, res) => { + try { + const log = readSessionLog(); + const logPath = getSessionLogPath(); + + res.json({ + path: logPath, + content: log, + }); + } catch (error: any) { + console.error("Session log error:", error); + res.status(500).json({ + error: error.message || "Failed to read session log", + }); + } +}); + +export default router; diff --git a/backend/src/routes/systemSettings.ts b/backend/src/routes/systemSettings.ts new file mode 100644 index 0000000..9f6b8b3 --- /dev/null +++ b/backend/src/routes/systemSettings.ts @@ -0,0 +1,712 @@ +import { Router } from "express"; +import { requireAuth, requireAdmin } from "../middleware/auth"; +import { prisma } from "../utils/db"; +import { z } from "zod"; +import { writeEnvFile } from "../utils/envWriter"; +import { invalidateSystemSettingsCache } from "../utils/systemSettings"; +import { queueCleaner } from "../jobs/queueCleaner"; +import { encrypt, decrypt } from "../utils/encryption"; + +const router = Router(); + +/** + * Safely decrypt a field, returning null if decryption fails + */ +function safeDecrypt(value: string | null): string | null { + if (!value) return null; + try { + return decrypt(value); + } catch (error) { + console.warn("[Settings Route] Failed to decrypt field, returning null"); + return null; + } +} + +// Only admins can access system settings +router.use(requireAuth); +router.use(requireAdmin); + +const systemSettingsSchema = z.object({ + // Download Services + lidarrEnabled: z.boolean().optional(), + lidarrUrl: z.string().optional(), + lidarrApiKey: z.string().nullable().optional(), + + // AI Services + openaiEnabled: z.boolean().optional(), + openaiApiKey: z.string().nullable().optional(), + openaiModel: z.string().optional(), + openaiBaseUrl: z.string().nullable().optional(), + + fanartEnabled: z.boolean().optional(), + fanartApiKey: z.string().nullable().optional(), + + // Media Services + audiobookshelfEnabled: z.boolean().optional(), + audiobookshelfUrl: z.string().optional(), + audiobookshelfApiKey: z.string().nullable().optional(), + + // Soulseek (direct connection via slsk-client) + soulseekUsername: z.string().nullable().optional(), + soulseekPassword: z.string().nullable().optional(), + + // Spotify (for playlist import) + spotifyClientId: z.string().nullable().optional(), + spotifyClientSecret: z.string().nullable().optional(), + + // Storage Paths + musicPath: z.string().optional(), + downloadPath: z.string().optional(), + + // Feature Flags + autoSync: z.boolean().optional(), + autoEnrichMetadata: z.boolean().optional(), + + // Advanced Settings + maxConcurrentDownloads: z.number().optional(), + downloadRetryAttempts: z.number().optional(), + transcodeCacheMaxGb: z.number().optional(), + + // Download Preferences + downloadSource: z.enum(["soulseek", "lidarr"]).optional(), + soulseekFallback: z.enum(["none", "lidarr"]).optional(), +}); + +// GET /system-settings +router.get("/", async (req, res) => { + try { + let settings = await prisma.systemSettings.findUnique({ + where: { id: "default" }, + }); + + // Create default settings if they don't exist + if (!settings) { + settings = await prisma.systemSettings.create({ + data: { + id: "default", + lidarrEnabled: true, + lidarrUrl: "http://localhost:8686", + openaiEnabled: false, + openaiModel: "gpt-4", + fanartEnabled: false, + audiobookshelfEnabled: false, + audiobookshelfUrl: "http://localhost:13378", + musicPath: "/music", + downloadPath: "/downloads", + autoSync: true, + autoEnrichMetadata: true, + maxConcurrentDownloads: 3, + downloadRetryAttempts: 3, + transcodeCacheMaxGb: 10, + }, + }); + } + + // Decrypt sensitive fields before sending to client + // Use safeDecrypt to handle corrupted encrypted values gracefully + const decryptedSettings = { + ...settings, + lidarrApiKey: safeDecrypt(settings.lidarrApiKey), + openaiApiKey: safeDecrypt(settings.openaiApiKey), + fanartApiKey: safeDecrypt(settings.fanartApiKey), + audiobookshelfApiKey: safeDecrypt(settings.audiobookshelfApiKey), + soulseekPassword: safeDecrypt(settings.soulseekPassword), + spotifyClientSecret: safeDecrypt(settings.spotifyClientSecret), + }; + + res.json(decryptedSettings); + } catch (error) { + console.error("Get system settings error:", error); + res.status(500).json({ error: "Failed to get system settings" }); + } +}); + +// POST /system-settings +router.post("/", async (req, res) => { + try { + const data = systemSettingsSchema.parse(req.body); + + console.log("[SYSTEM SETTINGS] Saving settings..."); + console.log( + "[SYSTEM SETTINGS] transcodeCacheMaxGb:", + data.transcodeCacheMaxGb + ); + + // Encrypt sensitive fields + const encryptedData: any = { ...data }; + + if (data.lidarrApiKey) + encryptedData.lidarrApiKey = encrypt(data.lidarrApiKey); + if (data.openaiApiKey) + encryptedData.openaiApiKey = encrypt(data.openaiApiKey); + if (data.fanartApiKey) + encryptedData.fanartApiKey = encrypt(data.fanartApiKey); + if (data.audiobookshelfApiKey) + encryptedData.audiobookshelfApiKey = encrypt( + data.audiobookshelfApiKey + ); + if (data.soulseekPassword) + encryptedData.soulseekPassword = encrypt(data.soulseekPassword); + if (data.spotifyClientSecret) + encryptedData.spotifyClientSecret = encrypt(data.spotifyClientSecret); + + const settings = await prisma.systemSettings.upsert({ + where: { id: "default" }, + create: { + id: "default", + ...encryptedData, + }, + update: encryptedData, + }); + + invalidateSystemSettingsCache(); + + // If Audiobookshelf was disabled, clear all audiobook-related data + if (data.audiobookshelfEnabled === false) { + console.log( + "[CLEANUP] Audiobookshelf disabled - clearing all audiobook data from database" + ); + try { + const deletedProgress = + await prisma.audiobookProgress.deleteMany({}); + console.log( + ` Deleted ${deletedProgress.count} audiobook progress entries` + ); + } catch (clearError) { + console.error("Failed to clear audiobook data:", clearError); + // Don't fail the request + } + } + + // Write to .env file for Docker containers + try { + await writeEnvFile({ + LIDARR_ENABLED: data.lidarrEnabled ? "true" : "false", + LIDARR_URL: data.lidarrUrl || null, + LIDARR_API_KEY: data.lidarrApiKey || null, + FANART_API_KEY: data.fanartApiKey || null, + OPENAI_API_KEY: data.openaiApiKey || null, + AUDIOBOOKSHELF_URL: data.audiobookshelfUrl || null, + AUDIOBOOKSHELF_API_KEY: data.audiobookshelfApiKey || null, + SOULSEEK_USERNAME: data.soulseekUsername || null, + SOULSEEK_PASSWORD: data.soulseekPassword || null, + }); + console.log(".env file synchronized with database settings"); + } catch (envError) { + console.error("Failed to write .env file:", envError); + // Don't fail the request if .env write fails + } + + // Auto-configure Lidarr webhook if Lidarr is enabled + if (data.lidarrEnabled && data.lidarrUrl && data.lidarrApiKey) { + try { + console.log("[LIDARR] Auto-configuring webhook..."); + + const axios = (await import("axios")).default; + const lidarrUrl = data.lidarrUrl; + const apiKey = data.lidarrApiKey; + + // Determine webhook URL + // Use LIDIFY_CALLBACK_URL env var if set, otherwise default to host.docker.internal:3030 + // Port 3030 is the external Nginx port that Lidarr can reach + const callbackHost = process.env.LIDIFY_CALLBACK_URL || "http://host.docker.internal:3030"; + const webhookUrl = `${callbackHost}/api/webhooks/lidarr`; + + console.log(` Webhook URL: ${webhookUrl}`); + + // Check if webhook already exists - find by name "Lidify" OR by URL containing "lidify" or "webhooks/lidarr" + const notificationsResponse = await axios.get( + `${lidarrUrl}/api/v1/notification`, + { + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + + // Find existing Lidify webhook by name (primary) or URL pattern (fallback) + const existingWebhook = notificationsResponse.data.find( + (n: any) => + n.implementation === "Webhook" && + ( + // Match by name + n.name === "Lidify" || + // Or match by URL pattern (catches old webhooks with different URLs) + n.fields?.find( + (f: any) => + f.name === "url" && + (f.value?.includes("webhooks/lidarr") || f.value?.includes("lidify")) + ) + ) + ); + + if (existingWebhook) { + const currentUrl = existingWebhook.fields?.find((f: any) => f.name === "url")?.value; + console.log(` Found existing webhook: "${existingWebhook.name}" with URL: ${currentUrl}`); + if (currentUrl !== webhookUrl) { + console.log(` URL needs updating from: ${currentUrl}`); + console.log(` URL will be updated to: ${webhookUrl}`); + } + } + + const webhookConfig = { + onGrab: true, + onReleaseImport: true, + onAlbumDownload: true, + onDownloadFailure: true, + onImportFailure: true, + onAlbumDelete: true, + onRename: true, + onHealthIssue: false, + onApplicationUpdate: false, + supportsOnGrab: true, + supportsOnReleaseImport: true, + supportsOnAlbumDownload: true, + supportsOnDownloadFailure: true, + supportsOnImportFailure: true, + supportsOnAlbumDelete: true, + supportsOnRename: true, + supportsOnHealthIssue: true, + supportsOnApplicationUpdate: true, + includeHealthWarnings: false, + name: "Lidify", + implementation: "Webhook", + implementationName: "Webhook", + configContract: "WebhookSettings", + infoLink: + "https://wiki.servarr.com/lidarr/supported#webhook", + tags: [], + fields: [ + { name: "url", value: webhookUrl }, + { name: "method", value: 1 }, // 1 = POST + { name: "username", value: "" }, + { name: "password", value: "" }, + ], + }; + + if (existingWebhook) { + // Update existing webhook + await axios.put( + `${lidarrUrl}/api/v1/notification/${existingWebhook.id}?forceSave=true`, + { ...existingWebhook, ...webhookConfig }, + { + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + console.log(" Webhook updated"); + } else { + // Create new webhook (use forceSave to skip test) + await axios.post( + `${lidarrUrl}/api/v1/notification?forceSave=true`, + webhookConfig, + { + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + console.log(" Webhook created"); + } + + console.log("Lidarr webhook configured automatically\n"); + } catch (webhookError: any) { + console.error( + "Failed to auto-configure webhook:", + webhookError.message + ); + if (webhookError.response?.data) { + console.error( + " Lidarr error details:", + JSON.stringify(webhookError.response.data, null, 2) + ); + } + console.log( + " User can configure webhook manually in Lidarr UI\n" + ); + // Don't fail the request if webhook config fails + } + } + + res.json({ + success: true, + message: + "Settings saved successfully. Restart Docker containers to apply changes.", + requiresRestart: true, + }); + } catch (error) { + if (error instanceof z.ZodError) { + return res + .status(400) + .json({ error: "Invalid settings", details: error.errors }); + } + console.error("Update system settings error:", error); + res.status(500).json({ error: "Failed to update system settings" }); + } +}); + +// POST /system-settings/test-lidarr +router.post("/test-lidarr", async (req, res) => { + try { + const { url, apiKey } = req.body; + + console.log("[Lidarr Test] Testing connection to:", url); + + if (!url || !apiKey) { + return res + .status(400) + .json({ error: "URL and API key are required" }); + } + + // Normalize URL - remove trailing slash + const normalizedUrl = url.replace(/\/+$/, ""); + + const axios = require("axios"); + const response = await axios.get( + `${normalizedUrl}/api/v1/system/status`, + { + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + + console.log( + "[Lidarr Test] Connection successful, version:", + response.data.version + ); + + res.json({ + success: true, + message: "Lidarr connection successful", + version: response.data.version, + }); + } catch (error: any) { + console.error("[Lidarr Test] Error:", error.message); + console.error( + "[Lidarr Test] Details:", + error.response?.data || error.code + ); + + let details = error.message; + if (error.code === "ECONNREFUSED") { + details = + "Connection refused - check if Lidarr is running and accessible"; + } else if (error.code === "ENOTFOUND") { + details = "Host not found - check the URL"; + } else if (error.response?.status === 401) { + details = "Invalid API key"; + } else if (error.response?.data?.message) { + details = error.response.data.message; + } + + res.status(500).json({ + error: "Failed to connect to Lidarr", + details, + }); + } +}); + +// POST /system-settings/test-openai +router.post("/test-openai", async (req, res) => { + try { + const { apiKey, model } = req.body; + + if (!apiKey) { + return res.status(400).json({ error: "API key is required" }); + } + + const axios = require("axios"); + const response = await axios.post( + "https://api.openai.com/v1/chat/completions", + { + model: model || "gpt-3.5-turbo", + messages: [{ role: "user", content: "Test" }], + max_tokens: 5, + }, + { + headers: { Authorization: `Bearer ${apiKey}` }, + timeout: 10000, + } + ); + + res.json({ + success: true, + message: "OpenAI connection successful", + model: response.data.model, + }); + } catch (error: any) { + console.error("OpenAI test error:", error.message); + res.status(500).json({ + error: "Failed to connect to OpenAI", + details: error.response?.data?.error?.message || error.message, + }); + } +}); + +// Test Fanart.tv connection +router.post("/test-fanart", async (req, res) => { + try { + const { fanartApiKey } = req.body; + + if (!fanartApiKey) { + return res.status(400).json({ error: "API key is required" }); + } + + const axios = require("axios"); + + // Test with a known artist (The Beatles MBID) + const testMbid = "b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d"; + + const response = await axios.get( + `https://webservice.fanart.tv/v3/music/${testMbid}`, + { + params: { api_key: fanartApiKey }, + timeout: 5000, + } + ); + + // If we get here, the API key is valid + res.json({ + success: true, + message: "Fanart.tv connection successful", + }); + } catch (error: any) { + console.error("Fanart.tv test error:", error.message); + if (error.response?.status === 401) { + res.status(401).json({ + error: "Invalid Fanart.tv API key", + }); + } else { + res.status(500).json({ + error: "Failed to connect to Fanart.tv", + details: error.response?.data || error.message, + }); + } + } +}); + +// Test Audiobookshelf connection +router.post("/test-audiobookshelf", async (req, res) => { + try { + const { url, apiKey } = req.body; + + if (!url || !apiKey) { + return res + .status(400) + .json({ error: "URL and API key are required" }); + } + + const axios = require("axios"); + + const response = await axios.get(`${url}/api/libraries`, { + headers: { + Authorization: `Bearer ${apiKey}`, + }, + timeout: 5000, + }); + + res.json({ + success: true, + message: "Audiobookshelf connection successful", + libraries: response.data.libraries?.length || 0, + }); + } catch (error: any) { + console.error("Audiobookshelf test error:", error.message); + if (error.response?.status === 401 || error.response?.status === 403) { + res.status(401).json({ + error: "Invalid Audiobookshelf API key", + }); + } else { + res.status(500).json({ + error: "Failed to connect to Audiobookshelf", + details: error.response?.data || error.message, + }); + } + } +}); + +// Test Soulseek connection (direct via slsk-client) +router.post("/test-soulseek", async (req, res) => { + try { + const { username, password } = req.body; + + if (!username || !password) { + return res.status(400).json({ + error: "Soulseek username and password are required", + }); + } + + console.log(`[SOULSEEK-TEST] Testing connection as "${username}"...`); + + // Import soulseek service + const { soulseekService } = await import("../services/soulseek"); + + // Temporarily set credentials for test + // The service will use the provided credentials + try { + // Try to connect with the provided credentials + const slsk = require("slsk-client"); + + await new Promise((resolve, reject) => { + slsk.connect( + { user: username, pass: password }, + (err: Error | null, client: any) => { + if (err) { + console.log(`[SOULSEEK-TEST] Connection failed: ${err.message}`); + return reject(err); + } + console.log(`[SOULSEEK-TEST] Connected successfully`); + // We don't need to keep the connection open for the test + resolve(); + } + ); + }); + + res.json({ + success: true, + message: `Connected to Soulseek as "${username}"`, + soulseekUsername: username, + isConnected: true, + }); + } catch (connectError: any) { + console.error(`[SOULSEEK-TEST] Error: ${connectError.message}`); + res.status(401).json({ + error: "Invalid Soulseek credentials or connection failed", + details: connectError.message, + }); + } + } catch (error: any) { + console.error("[SOULSEEK-TEST] Error:", error.message); + res.status(500).json({ + error: "Failed to test Soulseek connection", + details: error.message, + }); + } +}); + +// Test Spotify credentials +router.post("/test-spotify", async (req, res) => { + try { + const { clientId, clientSecret } = req.body; + + if (!clientId || !clientSecret) { + return res.status(400).json({ + error: "Client ID and Client Secret are required" + }); + } + + // Import spotifyService to test credentials + const { spotifyService } = await import("../services/spotify"); + const result = await spotifyService.testCredentials(clientId, clientSecret); + + if (result.success) { + res.json({ + success: true, + message: "Spotify credentials are valid", + }); + } else { + res.status(401).json({ + error: result.error || "Invalid Spotify credentials", + }); + } + } catch (error: any) { + console.error("Spotify test error:", error.message); + res.status(500).json({ + error: "Failed to test Spotify credentials", + details: error.message, + }); + } +}); + +// Get queue cleaner status +router.get("/queue-cleaner-status", (req, res) => { + res.json(queueCleaner.getStatus()); +}); + +// Start queue cleaner manually +router.post("/queue-cleaner/start", async (req, res) => { + try { + await queueCleaner.start(); + res.json({ + success: true, + message: "Queue cleaner started", + status: queueCleaner.getStatus(), + }); + } catch (error: any) { + res.status(500).json({ + error: "Failed to start queue cleaner", + details: error.message, + }); + } +}); + +// Stop queue cleaner manually +router.post("/queue-cleaner/stop", (req, res) => { + queueCleaner.stop(); + res.json({ + success: true, + message: "Queue cleaner stopped", + status: queueCleaner.getStatus(), + }); +}); + +// Clear all Redis caches +router.post("/clear-caches", async (req, res) => { + try { + const { redisClient } = require("../utils/redis"); + const { notificationService } = await import("../services/notificationService"); + + // Get all keys but exclude session keys + const allKeys = await redisClient.keys("*"); + const keysToDelete = allKeys.filter( + (key: string) => !key.startsWith("sess:") + ); + + if (keysToDelete.length > 0) { + console.log( + `[CACHE] Clearing ${ + keysToDelete.length + } cache entries (excluding ${ + allKeys.length - keysToDelete.length + } session keys)...` + ); + for (const key of keysToDelete) { + await redisClient.del(key); + } + console.log( + `[CACHE] Successfully cleared ${keysToDelete.length} cache entries` + ); + + // Send notification to user + await notificationService.notifySystem( + req.user!.id, + "Caches Cleared", + `Successfully cleared ${keysToDelete.length} cache entries` + ); + + res.json({ + success: true, + message: `Cleared ${keysToDelete.length} cache entries`, + clearedKeys: keysToDelete.length, + }); + } else { + await notificationService.notifySystem( + req.user!.id, + "Caches Cleared", + "No cache entries to clear" + ); + + res.json({ + success: true, + message: "No cache entries to clear", + clearedKeys: 0, + }); + } + } catch (error: any) { + console.error("Clear caches error:", error); + res.status(500).json({ + error: "Failed to clear caches", + details: error.message, + }); + } +}); + +export default router; diff --git a/backend/src/routes/webhooks.ts b/backend/src/routes/webhooks.ts new file mode 100644 index 0000000..953829f --- /dev/null +++ b/backend/src/routes/webhooks.ts @@ -0,0 +1,231 @@ +/** + * Lidarr Webhook Handler (Refactored) + * + * Handles Lidarr webhooks for download tracking and Discovery Weekly integration. + * Uses the stateless simpleDownloadManager for all operations. + */ + +import { Router } from "express"; +import { prisma } from "../utils/db"; +import { scanQueue } from "../workers/queues"; +import { discoverWeeklyService } from "../services/discoverWeekly"; +import { simpleDownloadManager } from "../services/simpleDownloadManager"; +import { queueCleaner } from "../jobs/queueCleaner"; +import { getSystemSettings } from "../utils/systemSettings"; + +const router = Router(); + +// POST /webhooks/lidarr - Handle Lidarr webhooks +router.post("/lidarr", async (req, res) => { + try { + // Check if Lidarr is enabled before processing any webhooks + const settings = await getSystemSettings(); + if ( + !settings?.lidarrEnabled || + !settings?.lidarrUrl || + !settings?.lidarrApiKey + ) { + console.log( + `[WEBHOOK] Lidarr webhook received but Lidarr is disabled. Ignoring.` + ); + return res.status(202).json({ + success: true, + ignored: true, + reason: "lidarr-disabled", + }); + } + + const eventType = req.body.eventType; + console.log(`[WEBHOOK] Lidarr event: ${eventType}`); + + // Log payload in debug mode only (avoid verbose logs in production) + if (process.env.DEBUG_WEBHOOKS === "true") { + console.log(` Payload:`, JSON.stringify(req.body, null, 2)); + } + + switch (eventType) { + case "Grab": + await handleGrab(req.body); + break; + + case "Download": + case "AlbumDownload": + case "TrackRetag": + case "Rename": + await handleDownload(req.body); + break; + + case "ImportFailure": + case "DownloadFailed": + case "DownloadFailure": + await handleImportFailure(req.body); + break; + + case "Health": + case "HealthIssue": + case "HealthRestored": + // Ignore health events + break; + + case "Test": + console.log(" Lidarr test webhook received"); + break; + + default: + console.log(` Unhandled event: ${eventType}`); + } + + res.json({ success: true }); + } catch (error: any) { + console.error("Webhook error:", error.message); + res.status(500).json({ error: "Webhook processing failed" }); + } +}); + +/** + * Handle Grab event (download started by Lidarr) + */ +async function handleGrab(payload: any) { + const downloadId = payload.downloadId; + const albumMbid = + payload.albums?.[0]?.foreignAlbumId || payload.albums?.[0]?.mbId; + const albumTitle = payload.albums?.[0]?.title; + const artistName = payload.artist?.name; + const lidarrAlbumId = payload.albums?.[0]?.id; + + console.log(` Album: ${artistName} - ${albumTitle}`); + console.log(` Download ID: ${downloadId}`); + console.log(` MBID: ${albumMbid}`); + + if (!downloadId) { + console.log(` Missing downloadId, skipping`); + return; + } + + // Use the download manager's multi-strategy matching + const result = await simpleDownloadManager.onDownloadGrabbed( + downloadId, + albumMbid || "", + albumTitle || "", + artistName || "", + lidarrAlbumId || 0 + ); + + if (result.matched) { + // Start queue cleaner to monitor this download + queueCleaner.start(); + } +} + +/** + * Handle Download event (download complete + imported) + */ +async function handleDownload(payload: any) { + const downloadId = payload.downloadId; + const albumTitle = payload.album?.title || payload.albums?.[0]?.title; + const artistName = payload.artist?.name; + const albumMbid = + payload.album?.foreignAlbumId || payload.albums?.[0]?.foreignAlbumId; + const lidarrAlbumId = payload.album?.id || payload.albums?.[0]?.id; + + console.log(` Album: ${artistName} - ${albumTitle}`); + console.log(` Download ID: ${downloadId}`); + console.log(` Album MBID: ${albumMbid}`); + console.log(` Lidarr Album ID: ${lidarrAlbumId}`); + + if (!downloadId) { + console.log(` Missing downloadId, skipping`); + return; + } + + // Handle completion through download manager + const result = await simpleDownloadManager.onDownloadComplete( + downloadId, + albumMbid, + artistName, + albumTitle, + lidarrAlbumId + ); + + if (result.jobId) { + // Check if this is part of a download batch (artist download) + if (result.downloadBatchId) { + // Check if all jobs in the batch are complete + const batchComplete = await checkDownloadBatchComplete( + result.downloadBatchId + ); + if (batchComplete) { + console.log( + ` All albums in batch complete, triggering library scan...` + ); + await scanQueue.add("scan", { + type: "full", + source: "lidarr-import-batch", + }); + } else { + console.log(` Batch not complete, skipping scan`); + } + } else if (!result.batchId) { + // Single album download (not part of discovery batch) + console.log(` Triggering library scan...`); + await scanQueue.add("scan", { + type: "full", + source: "lidarr-import", + }); + } + // If part of discovery batch, the download manager already called checkBatchCompletion + } else { + // No job found - this might be an external download not initiated by us + // Still trigger a scan to pick up the new music + console.log(` No matching job, triggering scan anyway...`); + await scanQueue.add("scan", { + type: "full", + source: "lidarr-import-external", + }); + } +} + +/** + * Check if all jobs in a download batch are complete + */ +async function checkDownloadBatchComplete(batchId: string): Promise { + const pendingJobs = await prisma.downloadJob.count({ + where: { + metadata: { + path: ["batchId"], + equals: batchId, + }, + status: { in: ["pending", "processing"] }, + }, + }); + + console.log( + ` Batch ${batchId}: ${pendingJobs} pending/processing jobs remaining` + ); + return pendingJobs === 0; +} + +/** + * Handle import failure with automatic retry + */ +async function handleImportFailure(payload: any) { + const downloadId = payload.downloadId; + const albumMbid = + payload.album?.foreignAlbumId || payload.albums?.[0]?.foreignAlbumId; + const albumTitle = payload.album?.title || payload.release?.title; + const reason = payload.message || "Import failed"; + + console.log(` Album: ${albumTitle}`); + console.log(` Download ID: ${downloadId}`); + console.log(` Reason: ${reason}`); + + if (!downloadId) { + console.log(` Missing downloadId, skipping`); + return; + } + + // Handle failure through download manager (handles retry logic) + await simpleDownloadManager.onImportFailed(downloadId, reason, albumMbid); +} + +export default router; diff --git a/backend/src/services/audioStreaming.ts b/backend/src/services/audioStreaming.ts new file mode 100644 index 0000000..578c650 --- /dev/null +++ b/backend/src/services/audioStreaming.ts @@ -0,0 +1,395 @@ +import * as fs from "fs"; +import * as path from "path"; +import * as crypto from "crypto"; +import { prisma } from "../utils/db"; +import ffmpeg from "fluent-ffmpeg"; +import ffmpegPath from "@ffmpeg-installer/ffmpeg"; +import PQueue from "p-queue"; +import { AppError, ErrorCode, ErrorCategory } from "../utils/errors"; +import { parseFile } from "music-metadata"; + +// Set FFmpeg path to bundled binary +ffmpeg.setFfmpegPath(ffmpegPath.path); + +// Quality settings +export const QUALITY_SETTINGS = { + original: { bitrate: null, format: null }, // No transcoding + high: { bitrate: 320, format: "mp3" }, + medium: { bitrate: 192, format: "mp3" }, + low: { bitrate: 128, format: "mp3" }, +} as const; + +export type Quality = keyof typeof QUALITY_SETTINGS; + +interface StreamFileInfo { + filePath: string; + mimeType: string; +} + +export class AudioStreamingService { + private transcodeQueue = new PQueue({ concurrency: 3 }); + private musicPath: string; + private transcodeCachePath: string; + private transcodeCacheMaxGb: number; + private evictionInterval: NodeJS.Timeout | null = null; + + constructor( + musicPath: string, + transcodeCachePath: string, + transcodeCacheMaxGb: number + ) { + this.musicPath = musicPath; + this.transcodeCachePath = transcodeCachePath; + this.transcodeCacheMaxGb = transcodeCacheMaxGb; + + // Ensure cache directory exists + if (!fs.existsSync(this.transcodeCachePath)) { + fs.mkdirSync(this.transcodeCachePath, { recursive: true }); + } + + // Start cache eviction timer (every 6 hours) + this.evictionInterval = setInterval(() => { + this.evictCache(this.transcodeCacheMaxGb).catch((err) => { + console.error("Cache eviction failed:", err); + }); + }, 6 * 60 * 60 * 1000); + } + + /** + * Get file path for streaming (either original or transcoded) + */ + async getStreamFilePath( + trackId: string, + quality: Quality, + sourceModified: Date, + sourceAbsolutePath: string + ): Promise { + console.log(`[AudioStreaming] Request: trackId=${trackId}, quality=${quality}, source=${path.basename(sourceAbsolutePath)}`); + + // If original quality requested, return source file + if (quality === "original") { + const mimeType = this.getMimeType(sourceAbsolutePath); + console.log(`[AudioStreaming] Serving original: mimeType=${mimeType}`); + return { + filePath: sourceAbsolutePath, + mimeType, + }; + } + + // Check if we have a valid cached transcode + const cachedPath = await this.getCachedTranscode( + trackId, + quality, + sourceModified + ); + + if (cachedPath) { + console.log( + `[STREAM] Using cached transcode: ${quality} (${cachedPath})` + ); + return { + filePath: cachedPath, + mimeType: "audio/mpeg", + }; + } + + // Check source file bitrate to avoid pointless upsampling + const targetBitrate = QUALITY_SETTINGS[quality].bitrate; + if (targetBitrate) { + try { + const metadata = await parseFile(sourceAbsolutePath); + const sourceBitrate = metadata.format.bitrate + ? Math.round(metadata.format.bitrate / 1000) + : null; + + if (sourceBitrate && sourceBitrate <= targetBitrate) { + console.log( + `[STREAM] Source bitrate (${sourceBitrate}kbps) <= target (${targetBitrate}kbps), serving original` + ); + return { + filePath: sourceAbsolutePath, + mimeType: this.getMimeType(sourceAbsolutePath), + }; + } + } catch (err) { + console.warn( + `[STREAM] Failed to read source metadata, will transcode anyway:`, + err + ); + } + } + + // Need to transcode - check cache size first + const currentSize = await this.getCacheSize(); + if (currentSize > this.transcodeCacheMaxGb * 0.9) { + console.log( + `[STREAM] Cache near full (${currentSize.toFixed( + 2 + )}GB), evicting to 80%...` + ); + await this.evictCache(this.transcodeCacheMaxGb * 0.8); + } + + // Transcode to cache + console.log( + `[STREAM] Transcoding to ${quality} quality: ${sourceAbsolutePath}` + ); + const transcodedPath = await this.transcodeToCache( + trackId, + quality, + sourceAbsolutePath, + sourceModified + ); + + return { + filePath: transcodedPath, + mimeType: "audio/mpeg", + }; + } + + /** + * Get cached transcode if it exists and is valid + */ + private async getCachedTranscode( + trackId: string, + quality: Quality, + sourceModified: Date + ): Promise { + const cached = await prisma.transcodedFile.findFirst({ + where: { + trackId, + quality, + }, + }); + + if (!cached) return null; + + // Invalidate if source file was modified after transcode was created + if (cached.sourceModified < sourceModified) { + console.log( + `[STREAM] Cache stale for track ${trackId}, removing...` + ); + await prisma.transcodedFile.delete({ where: { id: cached.id } }); + + // Delete file from disk + const cachePath = path.join( + this.transcodeCachePath, + cached.cachePath + ); + await fs.promises.unlink(cachePath).catch(() => {}); + + return null; + } + + // Update last accessed time + await prisma.transcodedFile.update({ + where: { id: cached.id }, + data: { lastAccessed: new Date() }, + }); + + const fullPath = path.join(this.transcodeCachePath, cached.cachePath); + + // Verify file exists + if (!fs.existsSync(fullPath)) { + console.log(`[STREAM] Cache file missing: ${fullPath}`); + await prisma.transcodedFile.delete({ where: { id: cached.id } }); + return null; + } + + return fullPath; + } + + /** + * Transcode audio file to cache + */ + private async transcodeToCache( + trackId: string, + quality: Quality, + sourcePath: string, + sourceModified: Date + ): Promise { + const settings = QUALITY_SETTINGS[quality]; + if (!settings.bitrate || !settings.format) { + throw new AppError( + ErrorCode.INVALID_CONFIG, + ErrorCategory.FATAL, + `Invalid quality setting: ${quality}` + ); + } + + // Generate cache file path + const hash = crypto + .createHash("md5") + .update(`${trackId}-${quality}`) + .digest("hex"); + const cacheFileName = `${hash}.${settings.format}`; + const cachePath = path.join(this.transcodeCachePath, cacheFileName); + + return new Promise((resolve, reject) => { + try { + ffmpeg(sourcePath) + .audioBitrate(settings.bitrate) + .audioCodec("libmp3lame") + .format(settings.format) + .on("error", (err) => { + // Check if error is due to missing FFmpeg + const errorMsg = err.message.toLowerCase(); + if ( + errorMsg.includes("ffmpeg") && + errorMsg.includes("not found") + ) { + reject( + new AppError( + ErrorCode.FFMPEG_NOT_FOUND, + ErrorCategory.FATAL, + "FFmpeg not installed. Please install FFmpeg to enable transcoding.", + { trackId, quality } + ) + ); + } else { + reject( + new AppError( + ErrorCode.TRANSCODE_FAILED, + ErrorCategory.RECOVERABLE, + `Transcoding failed: ${err.message}`, + { trackId, quality, source: sourcePath } + ) + ); + } + }) + .on("end", async () => { + try { + // Get file size + const stats = await fs.promises.stat(cachePath); + + // Save to database + await prisma.transcodedFile.create({ + data: { + trackId, + quality, + cachePath: cacheFileName, + cacheSize: stats.size, + sourceModified, + lastAccessed: new Date(), + }, + }); + + console.log( + `[STREAM] Transcode complete: ${cacheFileName} (${( + stats.size / + 1024 / + 1024 + ).toFixed(2)}MB)` + ); + resolve(cachePath); + } catch (err: any) { + reject( + new AppError( + ErrorCode.DB_QUERY_ERROR, + ErrorCategory.RECOVERABLE, + `Failed to save transcode record: ${err.message}`, + { trackId, quality } + ) + ); + } + }) + .save(cachePath); + } catch (err: any) { + reject( + new AppError( + ErrorCode.FFMPEG_NOT_FOUND, + ErrorCategory.FATAL, + "FFmpeg not available. Please install FFmpeg to enable transcoding.", + { trackId, quality } + ) + ); + } + }); + } + + /** + * Get total cache size in GB + */ + async getCacheSize(): Promise { + const cached = await prisma.transcodedFile.findMany({ + select: { cacheSize: true }, + }); + const totalBytes = cached.reduce((sum, f) => sum + f.cacheSize, 0); + return totalBytes / (1024 * 1024 * 1024); + } + + /** + * Evict cache using LRU until size is below target + */ + async evictCache(targetGb: number): Promise { + console.log(`[CACHE] Starting eviction, target: ${targetGb}GB`); + + let currentSize = await this.getCacheSize(); + console.log(`[CACHE] Current size: ${currentSize.toFixed(2)}GB`); + + if (currentSize <= targetGb) { + console.log("[CACHE] Below target, no eviction needed"); + return; + } + + // Get all cached files sorted by last accessed (oldest first) + const cached = await prisma.transcodedFile.findMany({ + orderBy: { lastAccessed: "asc" }, + }); + + let evicted = 0; + for (const file of cached) { + if (currentSize <= targetGb) break; + + // Delete file from disk + const fullPath = path.join(this.transcodeCachePath, file.cachePath); + try { + await fs.promises.unlink(fullPath); + } catch (err) { + console.warn(`[CACHE] Failed to delete ${fullPath}:`, err); + } + + // Delete from database + await prisma.transcodedFile.delete({ where: { id: file.id } }); + + currentSize -= file.cacheSize / (1024 * 1024 * 1024); + evicted++; + } + + console.log( + `[CACHE] Evicted ${evicted} files, new size: ${currentSize.toFixed( + 2 + )}GB` + ); + } + + /** + * Get MIME type from file extension + */ + getMimeType(filePath: string): string { + const ext = path.extname(filePath).toLowerCase(); + const mimeTypes: Record = { + ".mp3": "audio/mpeg", + ".flac": "audio/flac", + ".m4a": "audio/mp4", + ".aac": "audio/aac", + ".ogg": "audio/ogg", + ".opus": "audio/opus", + ".wav": "audio/wav", + ".wma": "audio/x-ms-wma", + ".ape": "audio/x-ape", + ".wv": "audio/x-wavpack", + }; + return mimeTypes[ext] || "audio/mpeg"; + } + + /** + * Cleanup resources + */ + destroy(): void { + if (this.evictionInterval) { + clearInterval(this.evictionInterval); + this.evictionInterval = null; + } + } +} diff --git a/backend/src/services/audiobookCache.ts b/backend/src/services/audiobookCache.ts new file mode 100644 index 0000000..9656d16 --- /dev/null +++ b/backend/src/services/audiobookCache.ts @@ -0,0 +1,416 @@ +import { audiobookshelfService } from "./audiobookshelf"; +import { prisma } from "../utils/db"; +import fs from "fs/promises"; +import path from "path"; +import { config } from "../config"; + +/** + * Service to sync audiobooks from Audiobookshelf and cache them locally + * This allows us to serve audiobook metadata from our database instead of hitting + * the Audiobookshelf API every time, dramatically improving performance + */ + +interface SyncResult { + synced: number; + failed: number; + skipped: number; + errors: string[]; +} + +export class AudiobookCacheService { + private coverCacheDir: string; + + constructor() { + // Store covers in: /cover-cache/audiobooks/ + this.coverCacheDir = path.join( + config.music.musicPath, + "cover-cache", + "audiobooks" + ); + } + + /** + * Sync all audiobooks from Audiobookshelf to our database + */ + async syncAll(): Promise { + const result: SyncResult = { + synced: 0, + failed: 0, + skipped: 0, + errors: [], + }; + + try { + console.log(" Starting audiobook sync from Audiobookshelf..."); + + // Ensure cover cache directory exists + await fs.mkdir(this.coverCacheDir, { recursive: true }); + + // Fetch all audiobooks from Audiobookshelf + const audiobooks = await audiobookshelfService.getAllAudiobooks(); + + console.log( + `[AUDIOBOOK] Found ${audiobooks.length} audiobooks in Audiobookshelf` + ); + + for (const book of audiobooks) { + try { + await this.syncAudiobook(book); + result.synced++; + // Extract title and author from nested structure for logging + const metadata = book.media?.metadata || book; + const title = + metadata.title || book.title || "Unknown Title"; + const author = + metadata.authorName || + metadata.author || + book.author || + "Unknown Author"; + console.log(` Synced: ${title} by ${author}`); + } catch (error: any) { + result.failed++; + const metadata = book.media?.metadata || book; + const title = + metadata.title || book.title || "Unknown Title"; + const errorMsg = `Failed to sync ${title}: ${error.message}`; + result.errors.push(errorMsg); + console.error(` ✗ ${errorMsg}`); + } + } + + console.log("\nSync Summary:"); + console.log(` Synced: ${result.synced}`); + console.log(` Failed: ${result.failed}`); + console.log(` Skipped: ${result.skipped}`); + + if (result.errors.length > 0) { + console.log("\n[ERRORS]:"); + result.errors.forEach((err) => console.log(` - ${err}`)); + } + + return result; + } catch (error: any) { + console.error(" Audiobook sync failed:", error); + throw error; + } + } + + /** + * Sync a single audiobook + */ + private async syncAudiobook(book: any): Promise { + // Extract metadata from Audiobookshelf API response structure + // The API returns: { id, media: { metadata: { title, author, ... } } } + const metadata = book.media?.metadata || book; + const title = metadata.title || book.title; + + // Skip if no title (invalid audiobook data) + if (!title) { + console.warn(` Skipping audiobook ${book.id} - missing title`); + return; + } + + // Extract additional fields from API response + const author = metadata.authorName || metadata.author || null; + const narrator = metadata.narratorName || metadata.narrator || null; + const description = metadata.description || null; + const publishedYear = metadata.publishedYear + ? parseInt(metadata.publishedYear) + : null; + const publisher = metadata.publisher || null; + const isbn = metadata.isbn || null; + const asin = metadata.asin || null; + const language = metadata.language || null; + const genres = metadata.genres || []; + const tags = book.tags || []; + const duration = book.media?.duration || null; + const numTracks = book.media?.numTracks || null; + const numChapters = book.media?.numChapters || null; + const size = book.size ? BigInt(book.size) : null; + const libraryId = book.libraryId || null; + + // Get cover path - Audiobookshelf uses media.coverPath + const coverPath = book.media?.coverPath || null; + + // Build full cover URL for download (needs to be absolute URL with base) + const coverUrl = coverPath ? `items/${book.id}/cover` : null; + + // Series info - Audiobookshelf returns seriesName as a string like "Series Name #2" + // We need to parse this to extract the series name and sequence number + let series: string | null = null; + let seriesSequence: string | null = null; + + if (metadata.seriesName && typeof metadata.seriesName === "string") { + const seriesStr = metadata.seriesName.trim(); + + // Try to extract sequence from patterns like: + // "Series Name #1", "Series Name #2", "Series Name Book 1", "Series Name, Book 1" + const sequencePatterns = [ + /^(.+?)\s*#(\d+(?:\.\d+)?)\s*$/, // "Series Name #1" or "Series Name #1.5" + /^(.+?)\s*,?\s*Book\s*(\d+(?:\.\d+)?)\s*$/i, // "Series Name Book 1" or "Series Name, Book 1" + /^(.+?)\s*,?\s*Vol\.?\s*(\d+(?:\.\d+)?)\s*$/i, // "Series Name Vol 1" or "Series Name, Vol. 1" + /^(.+?)\s*\((\d+(?:\.\d+)?)\)\s*$/, // "Series Name (1)" + ]; + + let matched = false; + for (const pattern of sequencePatterns) { + const match = seriesStr.match(pattern); + if (match) { + series = match[1].trim(); + seriesSequence = match[2]; + matched = true; + break; + } + } + + // If no sequence pattern matched, use the whole string as series name + if (!matched && seriesStr) { + series = seriesStr; + seriesSequence = null; + } + } + + // Fallback: check metadata.series array/object format + if (!series) { + if (Array.isArray(metadata.series) && metadata.series.length > 0) { + series = metadata.series[0]?.name || null; + seriesSequence = + metadata.series[0]?.sequence?.toString() || null; + } else if ( + typeof metadata.series === "object" && + metadata.series !== null + ) { + series = metadata.series.name || null; + seriesSequence = metadata.series.sequence?.toString() || null; + } + } + + // Log series info for debugging (only for first few books) + if (series) { + console.log( + ` [Series] "${title}" -> "${series}" #${ + seriesSequence || "?" + }` + ); + } + + // Download cover image if available - need to construct full URL + let localCoverPath: string | null = null; + if (coverUrl) { + // Get the Audiobookshelf base URL from the service + const fullCoverUrl = await this.getFullCoverUrl(coverUrl); + if (fullCoverUrl) { + localCoverPath = await this.downloadCover( + book.id, + fullCoverUrl + ); + } + } + + // Upsert to database + await prisma.audiobook.upsert({ + where: { id: book.id }, + create: { + id: book.id, + title, + author, + narrator, + description, + publishedYear, + publisher, + series, + seriesSequence, + duration, + numTracks, + numChapters, + size, + isbn, + asin, + language, + genres, + tags, + localCoverPath, + coverUrl, + audioUrl: book.id, + libraryId, + lastSyncedAt: new Date(), + }, + update: { + title, + author, + narrator, + description, + publishedYear, + publisher, + series, + seriesSequence, + duration, + numTracks, + numChapters, + size, + isbn, + asin, + language, + genres, + tags, + localCoverPath: localCoverPath || undefined, + coverUrl, + audioUrl: book.id, + libraryId, + lastSyncedAt: new Date(), + }, + }); + } + + /** + * Get full Audiobookshelf cover URL by prepending base URL + */ + private async getFullCoverUrl( + relativePath: string + ): Promise { + try { + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (settings?.audiobookshelfUrl) { + const baseUrl = settings.audiobookshelfUrl.replace(/\/$/, ""); + return `${baseUrl}/api/${relativePath}`; + } + + return null; + } catch (error: any) { + console.error( + "Failed to get Audiobookshelf base URL:", + error.message + ); + return null; + } + } + + /** + * Download a cover image and save it locally + */ + private async downloadCover( + audiobookId: string, + coverUrl: string + ): Promise { + try { + // Get API key for authentication + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (!settings?.audiobookshelfApiKey) { + throw new Error("Audiobookshelf API key not configured"); + } + + const response = await fetch(coverUrl, { + headers: { + Authorization: `Bearer ${settings.audiobookshelfApiKey}`, + }, + }); + + if (!response.ok) { + throw new Error( + `HTTP ${response.status}: ${response.statusText}` + ); + } + + const buffer = await response.arrayBuffer(); + const fileName = `${audiobookId}.jpg`; + const filePath = path.join(this.coverCacheDir, fileName); + + await fs.writeFile(filePath, Buffer.from(buffer)); + + return filePath; + } catch (error: any) { + console.error( + `Failed to download cover for ${audiobookId}:`, + error.message + ); + return null as any; // Return null if download fails + } + } + + /** + * Get a single audiobook from cache or sync it + */ + async getAudiobook(audiobookId: string): Promise { + // Try to get from database first + let audiobook = await prisma.audiobook.findUnique({ + where: { id: audiobookId }, + }); + + // If not in cache or stale (> 7 days), try to sync it + if ( + !audiobook || + audiobook.lastSyncedAt < + new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) + ) { + console.log( + `[AUDIOBOOK] Audiobook ${audiobookId} not cached or stale, syncing...` + ); + try { + const book = await audiobookshelfService.getAudiobook( + audiobookId + ); + await this.syncAudiobook(book); + audiobook = await prisma.audiobook.findUnique({ + where: { id: audiobookId }, + }); + } catch (syncError: any) { + console.warn( + ` Failed to sync audiobook ${audiobookId} from Audiobookshelf:`, + syncError.message + ); + // If we have stale cached data, return it anyway + if (audiobook) { + console.log( + ` Using stale cached data for ${audiobookId}` + ); + } else { + // No cached data and sync failed - throw error + throw new Error( + `Audiobook not found in cache and sync failed: ${syncError.message}` + ); + } + } + } + + return audiobook; + } + + /** + * Clean up old cached covers that are no longer in database + */ + async cleanupOrphanedCovers(): Promise { + const audiobooks = await prisma.audiobook.findMany({ + select: { localCoverPath: true }, + }); + + const validCoverPaths = new Set( + audiobooks + .filter((a) => a.localCoverPath) + .map((a) => path.basename(a.localCoverPath!)) + ); + + let deleted = 0; + const files = await fs.readdir(this.coverCacheDir); + + for (const file of files) { + if (!validCoverPaths.has(file)) { + await fs.unlink(path.join(this.coverCacheDir, file)); + deleted++; + console.log(` [DELETE] Deleted orphaned cover: ${file}`); + } + } + + return deleted; + } +} + +// Export singleton instance +export const audiobookCacheService = new AudiobookCacheService(); diff --git a/backend/src/services/audiobookshelf.ts b/backend/src/services/audiobookshelf.ts new file mode 100644 index 0000000..436af78 --- /dev/null +++ b/backend/src/services/audiobookshelf.ts @@ -0,0 +1,335 @@ +import axios, { AxiosInstance } from "axios"; +import { getSystemSettings } from "../utils/systemSettings"; + +/** + * Audiobookshelf API Service + * Handles all interactions with the Audiobookshelf server + */ +class AudiobookshelfService { + private client: AxiosInstance | null = null; + private baseUrl: string | null = null; + private apiKey: string | null = null; + private initialized = false; + private podcastCache: { items: any[]; expiresAt: number } | null = null; + private readonly PODCAST_CACHE_TTL_MS = 5 * 60 * 1000; + + private async ensureInitialized() { + if (this.initialized && this.client) return; + + try { + // Try to get from database first + const settings = await getSystemSettings(); + + // Check if Audiobookshelf is explicitly disabled + if (settings && settings.audiobookshelfEnabled === false) { + throw new Error("Audiobookshelf is disabled in settings"); + } + + if ( + settings?.audiobookshelfEnabled && + settings?.audiobookshelfUrl && + settings?.audiobookshelfApiKey + ) { + this.baseUrl = settings.audiobookshelfUrl.replace(/\/$/, ""); // Remove trailing slash + this.apiKey = settings.audiobookshelfApiKey; + this.client = axios.create({ + baseURL: this.baseUrl, + headers: { + Authorization: `Bearer ${this.apiKey}`, + }, + timeout: 30000, // 30 seconds for remote server + }); + console.log("Audiobookshelf configured from database"); + this.initialized = true; + return; + } + } catch (error: any) { + if (error.message === "Audiobookshelf is disabled in settings") { + throw error; + } + console.log( + " Could not load Audiobookshelf from database, checking .env" + ); + } + + // Fallback to .env + if ( + process.env.AUDIOBOOKSHELF_URL && + process.env.AUDIOBOOKSHELF_API_KEY + ) { + this.baseUrl = process.env.AUDIOBOOKSHELF_URL.replace(/\/$/, ""); + this.apiKey = process.env.AUDIOBOOKSHELF_API_KEY; + this.client = axios.create({ + baseURL: this.baseUrl, + headers: { + Authorization: `Bearer ${this.apiKey}`, + }, + timeout: 30000, // 30 seconds for remote server + }); + console.log("Audiobookshelf configured from .env"); + this.initialized = true; + } else { + throw new Error("Audiobookshelf not configured"); + } + } + + /** + * Test connection to Audiobookshelf + */ + async ping(): Promise { + try { + await this.ensureInitialized(); + const response = await this.client!.get("/api/libraries"); + return response.status === 200; + } catch (error) { + console.error("Audiobookshelf connection failed:", error); + return false; + } + } + + /** + * Get all libraries from Audiobookshelf + */ + async getLibraries() { + await this.ensureInitialized(); + const response = await this.client!.get("/api/libraries"); + return response.data.libraries || []; + } + + /** + * Get all audiobooks from a specific library + */ + async getLibraryItems(libraryId: string) { + await this.ensureInitialized(); + const response = await this.client!.get( + `/api/libraries/${libraryId}/items` + ); + return response.data.results || []; + } + + /** + * Get all audiobooks from all libraries + */ + async getAllAudiobooks() { + await this.ensureInitialized(); + const libraries = await this.getLibraries(); + + const allBooks: any[] = []; + for (const library of libraries) { + if (library.mediaType === "book") { + // Only get audiobook libraries + const items = await this.getLibraryItems(library.id); + + // DEBUG: Log the structure of the first item with series + if (items.length > 0) { + const itemsWithSeries = items.filter((item: any) => + item.media?.metadata?.series || item.media?.metadata?.seriesName + ); + if (itemsWithSeries.length > 0) { + console.log( + "[AUDIOBOOKSHELF DEBUG] Sample item WITH series:", + JSON.stringify(itemsWithSeries[0], null, 2).substring(0, 2000) + ); + } else { + console.log( + "[AUDIOBOOKSHELF DEBUG] No items with series found! Sample item:", + JSON.stringify(items[0], null, 2).substring(0, 1000) + ); + } + } + + allBooks.push(...items); + } + } + + return allBooks; + } + + /** + * Get all podcasts from all libraries + */ + async getAllPodcasts(forceRefresh = false) { + await this.ensureInitialized(); + + if ( + !forceRefresh && + this.podcastCache && + this.podcastCache.expiresAt > Date.now() + ) { + return this.podcastCache.items; + } + + const libraries = await this.getLibraries(); + const podcastLibraries = libraries.filter( + (library: any) => library.mediaType === "podcast" + ); + + const libraryResults = await Promise.all( + podcastLibraries.map(async (library: any) => { + try { + return await this.getLibraryItems(library.id); + } catch (error) { + console.error( + `Audiobookshelf: failed to load podcast library ${library.id}`, + error + ); + return []; + } + }) + ); + + const allPodcasts = libraryResults.flat(); + + this.podcastCache = { + items: allPodcasts, + expiresAt: Date.now() + this.PODCAST_CACHE_TTL_MS, + }; + + return allPodcasts; + } + + /** + * Get a specific audiobook by ID + */ + async getAudiobook(audiobookId: string) { + await this.ensureInitialized(); + const response = await this.client!.get( + `/api/items/${audiobookId}?expanded=1` + ); + return response.data; + } + + /** + * Get a specific podcast by ID (alias for getAudiobook since API is the same) + */ + async getPodcast(podcastId: string) { + return this.getAudiobook(podcastId); + } + + /** + * Get user's progress for an audiobook + */ + async getProgress(audiobookId: string) { + await this.ensureInitialized(); + const response = await this.client!.get( + `/api/me/progress/${audiobookId}` + ); + return response.data; + } + + /** + * Update user's progress for an audiobook + */ + async updateProgress( + audiobookId: string, + currentTime: number, + duration: number, + isFinished: boolean = false + ) { + await this.ensureInitialized(); + const response = await this.client!.patch( + `/api/me/progress/${audiobookId}`, + { + currentTime, + duration, + isFinished, + } + ); + return response.data; + } + + /** + * Get stream URL for an audiobook + */ + async getStreamUrl(audiobookId: string): Promise { + await this.ensureInitialized(); + return `${this.baseUrl}/api/items/${audiobookId}/play`; + } + + /** + * Stream an audiobook with authentication + * Returns a readable stream that can be piped to the response + */ + async streamAudiobook(audiobookId: string, rangeHeader?: string) { + await this.ensureInitialized(); + + // First, get the audiobook to find the track file + const audiobook = await this.getAudiobook(audiobookId); + + // Get the first track's content URL + const firstTrack = audiobook.media?.tracks?.[0]; + if (!firstTrack || !firstTrack.contentUrl) { + throw new Error("No audio track found for this audiobook"); + } + + // Build request headers + const headers: Record = {}; + if (rangeHeader) { + headers["Range"] = rangeHeader; + } + + // The contentUrl format is: /api/items/{id}/file/{ino} + const response = await this.client!.get(firstTrack.contentUrl, { + responseType: "stream", + timeout: 0, // No timeout for streaming + headers, + // Don't throw on 206 Partial Content + validateStatus: (status) => status >= 200 && status < 300, + }); + + return { + stream: response.data, + headers: response.headers, + status: response.status, + }; + } + + /** + * Stream a podcast episode with authentication + * For podcasts, we need to get a specific episode ID + */ + async streamPodcastEpisode(podcastId: string, episodeId: string) { + await this.ensureInitialized(); + + // Get the podcast to find the episode + const podcast = await this.getPodcast(podcastId); + const episode = podcast.media?.episodes?.find( + (ep: any) => ep.id === episodeId + ); + + if (!episode) { + throw new Error("Episode not found"); + } + + // Podcast episodes use audioTrack.contentUrl, not audioFile.contentUrl + const contentUrl = + episode.audioTrack?.contentUrl || episode.audioFile?.contentUrl; + + if (!contentUrl) { + throw new Error("No audio file found for this episode"); + } + + const response = await this.client!.get(contentUrl, { + responseType: "stream", + timeout: 0, + }); + + return { + stream: response.data, + headers: response.headers, + }; + } + + /** + * Search audiobooks + */ + async searchAudiobooks(query: string) { + await this.ensureInitialized(); + const response = await this.client!.get( + `/api/search/books?q=${encodeURIComponent(query)}` + ); + return response.data.book || []; + } +} + +export const audiobookshelfService = new AudiobookshelfService(); diff --git a/backend/src/services/coverArt.ts b/backend/src/services/coverArt.ts new file mode 100644 index 0000000..af790f7 --- /dev/null +++ b/backend/src/services/coverArt.ts @@ -0,0 +1,67 @@ +import axios from "axios"; +import { redisClient } from "../utils/redis"; +import { rateLimiter } from "./rateLimiter"; + +class CoverArtService { + private readonly baseUrl = "https://coverartarchive.org"; + + async getCoverArt(rgMbid: string): Promise { + const cacheKey = `caa:${rgMbid}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached === "NOT_FOUND") return null; // Cached negative result + if (cached) return cached; + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + // Use rate limiter to prevent overwhelming Cover Art Archive + const response = await rateLimiter.execute("coverart", () => + axios.get(`${this.baseUrl}/release-group/${rgMbid}`, { + timeout: 5000, + }) + ); + + const images = response.data.images || []; + const frontImage = + images.find((img: any) => img.front) || images[0]; + + if (frontImage) { + const coverUrl = + frontImage.thumbnails?.large || frontImage.image; + + try { + await redisClient.setEx(cacheKey, 2592000, coverUrl); // 30 days + } catch (err) { + console.warn("Redis set error:", err); + } + + return coverUrl; + } + + // No front image found - cache negative result + try { + await redisClient.setEx(cacheKey, 604800, "NOT_FOUND"); // 7 days + } catch (err) { + // Ignore + } + } catch (error: any) { + if (error.response?.status === 404) { + // No cover art available - cache the negative result + try { + await redisClient.setEx(cacheKey, 604800, "NOT_FOUND"); // 7 days + } catch (err) { + // Ignore + } + return null; + } + console.error(`Cover art error for ${rgMbid}:`, error.message); + } + + return null; + } +} + +export const coverArtService = new CoverArtService(); diff --git a/backend/src/services/coverArtExtractor.ts b/backend/src/services/coverArtExtractor.ts new file mode 100644 index 0000000..e460739 --- /dev/null +++ b/backend/src/services/coverArtExtractor.ts @@ -0,0 +1,75 @@ +import * as fs from "fs"; +import * as path from "path"; +import * as crypto from "crypto"; +import { parseFile } from "music-metadata"; + +export class CoverArtExtractor { + private coverCachePath: string; + + constructor(coverCachePath: string) { + this.coverCachePath = coverCachePath; + + // Ensure cache directory exists + if (!fs.existsSync(this.coverCachePath)) { + fs.mkdirSync(this.coverCachePath, { recursive: true }); + } + } + + /** + * Extract cover art from audio file and save to cache + * Returns relative path to cached cover art, or null if none found + */ + async extractCoverArt( + audioFilePath: string, + albumId: string + ): Promise { + try { + // Check if already cached + const cacheFileName = `${albumId}.jpg`; + const cachePath = path.join(this.coverCachePath, cacheFileName); + + if (fs.existsSync(cachePath)) { + return cacheFileName; + } + + // Parse audio file metadata + const metadata = await parseFile(audioFilePath); + + // Get embedded picture + const picture = metadata.common.picture?.[0]; + if (!picture) { + return null; + } + + // Save to cache + await fs.promises.writeFile(cachePath, picture.data); + + console.log( + `[COVER-ART] Extracted cover art from ${path.basename(audioFilePath)}: ${cacheFileName}` + ); + + return cacheFileName; + } catch (err) { + console.error( + `[COVER-ART] Failed to extract from ${audioFilePath}:`, + err + ); + return null; + } + } + + /** + * Get cover art URL for album + * Returns relative path if available, or null + */ + async getCoverArtPath(albumId: string): Promise { + const cacheFileName = `${albumId}.jpg`; + const cachePath = path.join(this.coverCachePath, cacheFileName); + + if (fs.existsSync(cachePath)) { + return cacheFileName; + } + + return null; + } +} diff --git a/backend/src/services/dataCache.ts b/backend/src/services/dataCache.ts new file mode 100644 index 0000000..39bfce1 --- /dev/null +++ b/backend/src/services/dataCache.ts @@ -0,0 +1,390 @@ +/** + * DataCacheService - Unified data access with consistent caching pattern + * + * Pattern: DB first -> Redis fallback -> API fetch -> save to both + * + * This ensures: + * - DB is the source of truth + * - Redis provides fast reads + * - API calls only happen when data doesn't exist + * - All fetched data is persisted for future use + */ + +import { prisma } from "../utils/db"; +import { redisClient } from "../utils/redis"; +import { fanartService } from "./fanart"; +import { deezerService } from "./deezer"; +import { lastFmService } from "./lastfm"; +import { coverArtService } from "./coverArt"; + +// Cache TTLs +const ARTIST_IMAGE_TTL = 7 * 24 * 60 * 60; // 7 days +const ALBUM_COVER_TTL = 30 * 24 * 60 * 60; // 30 days +const NEGATIVE_CACHE_TTL = 24 * 60 * 60; // 1 day for "not found" results + +class DataCacheService { + /** + * Get artist hero image with unified caching + * Order: DB -> Redis -> Fanart.tv -> Deezer -> Last.fm -> save to both + */ + async getArtistImage( + artistId: string, + artistName: string, + mbid?: string | null + ): Promise { + const cacheKey = `hero:${artistId}`; + + // 1. Check DB first (source of truth) + try { + const artist = await prisma.artist.findUnique({ + where: { id: artistId }, + select: { heroUrl: true }, + }); + if (artist?.heroUrl) { + // Also populate Redis for faster future reads + this.setRedisCache(cacheKey, artist.heroUrl, ARTIST_IMAGE_TTL); + return artist.heroUrl; + } + } catch (err) { + console.warn("[DataCache] DB lookup failed for artist:", artistId); + } + + // 2. Check Redis cache + try { + const cached = await redisClient.get(cacheKey); + if (cached === "NOT_FOUND") return null; // Negative cache hit + if (cached) { + // Sync back to DB if Redis has it but DB doesn't + this.updateArtistHeroUrl(artistId, cached); + return cached; + } + } catch (err) { + // Redis errors are non-critical + } + + // 3. Fetch from external APIs + const heroUrl = await this.fetchArtistImage(artistName, mbid); + + // 4. Save to both DB and Redis + if (heroUrl) { + await this.updateArtistHeroUrl(artistId, heroUrl); + this.setRedisCache(cacheKey, heroUrl, ARTIST_IMAGE_TTL); + } else { + // Cache negative result to avoid repeated API calls + this.setRedisCache(cacheKey, "NOT_FOUND", NEGATIVE_CACHE_TTL); + } + + return heroUrl; + } + + /** + * Get album cover with unified caching + * Order: DB -> Redis -> Cover Art Archive -> save to both + */ + async getAlbumCover( + albumId: string, + rgMbid: string + ): Promise { + const cacheKey = `album-cover:${albumId}`; + + // 1. Check DB first + try { + const album = await prisma.album.findUnique({ + where: { id: albumId }, + select: { coverUrl: true }, + }); + if (album?.coverUrl) { + this.setRedisCache(cacheKey, album.coverUrl, ALBUM_COVER_TTL); + return album.coverUrl; + } + } catch (err) { + console.warn("[DataCache] DB lookup failed for album:", albumId); + } + + // 2. Check Redis cache + try { + const cached = await redisClient.get(cacheKey); + if (cached === "NOT_FOUND") return null; + if (cached) { + this.updateAlbumCoverUrl(albumId, cached); + return cached; + } + } catch (err) { + // Redis errors are non-critical + } + + // 3. Fetch from Cover Art Archive + const coverUrl = await coverArtService.getCoverArt(rgMbid); + + // 4. Save to both DB and Redis + if (coverUrl) { + await this.updateAlbumCoverUrl(albumId, coverUrl); + this.setRedisCache(cacheKey, coverUrl, ALBUM_COVER_TTL); + } else { + this.setRedisCache(cacheKey, "NOT_FOUND", NEGATIVE_CACHE_TTL); + } + + return coverUrl; + } + + /** + * Get track cover (uses album cover) + */ + async getTrackCover( + trackId: string, + albumId: string, + rgMbid?: string | null + ): Promise { + if (!rgMbid) { + // Try to get album's rgMbid from DB + const album = await prisma.album.findUnique({ + where: { id: albumId }, + select: { rgMbid: true, coverUrl: true }, + }); + if (album?.coverUrl) return album.coverUrl; + if (album?.rgMbid) rgMbid = album.rgMbid; + } + + if (!rgMbid) return null; + + return this.getAlbumCover(albumId, rgMbid); + } + + /** + * Batch get artist images - for list views + * Only returns what's already cached, doesn't make API calls + */ + async getArtistImagesBatch( + artists: Array<{ id: string; heroUrl?: string | null }> + ): Promise> { + const results = new Map(); + + // First, use any heroUrls already in the data + for (const artist of artists) { + if (artist.heroUrl) { + results.set(artist.id, artist.heroUrl); + } + } + + // For the rest, check Redis cache only (no API calls for list views) + const missingIds = artists + .filter((a) => !results.has(a.id)) + .map((a) => a.id); + + if (missingIds.length > 0) { + try { + const cacheKeys = missingIds.map((id) => `hero:${id}`); + const cached = await redisClient.mGet(cacheKeys); + + missingIds.forEach((id, index) => { + const value = cached[index]; + if (value && value !== "NOT_FOUND") { + results.set(id, value); + } + }); + } catch (err) { + // Redis errors are non-critical + } + } + + return results; + } + + /** + * Batch get album covers - for list views + */ + async getAlbumCoversBatch( + albums: Array<{ id: string; coverUrl?: string | null }> + ): Promise> { + const results = new Map(); + + for (const album of albums) { + if (album.coverUrl) { + results.set(album.id, album.coverUrl); + } + } + + const missingIds = albums + .filter((a) => !results.has(a.id)) + .map((a) => a.id); + + if (missingIds.length > 0) { + try { + const cacheKeys = missingIds.map((id) => `album-cover:${id}`); + const cached = await redisClient.mGet(cacheKeys); + + missingIds.forEach((id, index) => { + const value = cached[index]; + if (value && value !== "NOT_FOUND") { + results.set(id, value); + } + }); + } catch (err) { + // Redis errors are non-critical + } + } + + return results; + } + + /** + * Fetch artist image from external APIs + * Order: Fanart.tv (if MBID) -> Deezer -> Last.fm + */ + private async fetchArtistImage( + artistName: string, + mbid?: string | null + ): Promise { + let heroUrl: string | null = null; + + // Try Fanart.tv first if we have a valid MBID + if (mbid && !mbid.startsWith("temp-")) { + try { + heroUrl = await fanartService.getArtistImage(mbid); + if (heroUrl) { + console.log(`[DataCache] Got image from Fanart.tv for ${artistName}`); + return heroUrl; + } + } catch (err) { + // Fanart.tv failed, continue + } + } + + // Try Deezer + try { + heroUrl = await deezerService.getArtistImage(artistName); + if (heroUrl) { + console.log(`[DataCache] Got image from Deezer for ${artistName}`); + return heroUrl; + } + } catch (err) { + // Deezer failed, continue + } + + // Try Last.fm + try { + const validMbid = mbid && !mbid.startsWith("temp-") ? mbid : undefined; + const lastfmInfo = await lastFmService.getArtistInfo(artistName, validMbid); + + if (lastfmInfo?.image && Array.isArray(lastfmInfo.image)) { + const largestImage = + lastfmInfo.image.find((img: any) => img.size === "extralarge" || img.size === "mega") || + lastfmInfo.image[lastfmInfo.image.length - 1]; + + if (largestImage && largestImage["#text"]) { + // Filter out Last.fm placeholder images + const imageUrl = largestImage["#text"]; + if (!imageUrl.includes("2a96cbd8b46e442fc41c2b86b821562f")) { + console.log(`[DataCache] Got image from Last.fm for ${artistName}`); + return imageUrl; + } + } + } + } catch (err) { + // Last.fm failed + } + + console.log(`[DataCache] No image found for ${artistName}`); + return null; + } + + /** + * Update artist heroUrl in database + */ + private async updateArtistHeroUrl(artistId: string, heroUrl: string): Promise { + try { + await prisma.artist.update({ + where: { id: artistId }, + data: { heroUrl }, + }); + } catch (err) { + console.warn("[DataCache] Failed to update artist heroUrl:", err); + } + } + + /** + * Update album coverUrl in database + */ + private async updateAlbumCoverUrl(albumId: string, coverUrl: string): Promise { + try { + await prisma.album.update({ + where: { id: albumId }, + data: { coverUrl }, + }); + } catch (err) { + console.warn("[DataCache] Failed to update album coverUrl:", err); + } + } + + /** + * Set Redis cache with error handling + */ + private async setRedisCache(key: string, value: string, ttl: number): Promise { + try { + await redisClient.setEx(key, ttl, value); + } catch (err) { + // Redis errors are non-critical + } + } + + /** + * Warm up Redis cache from database + * Called on server startup + */ + async warmupCache(): Promise { + console.log("[DataCache] Warming up Redis cache from database..."); + + try { + // Warm up artist images + const artists = await prisma.artist.findMany({ + where: { heroUrl: { not: null } }, + select: { id: true, heroUrl: true }, + }); + + let artistCount = 0; + for (const artist of artists) { + if (artist.heroUrl) { + await this.setRedisCache(`hero:${artist.id}`, artist.heroUrl, ARTIST_IMAGE_TTL); + artistCount++; + } + } + console.log(`[DataCache] Cached ${artistCount} artist images`); + + // Warm up album covers + const albums = await prisma.album.findMany({ + where: { coverUrl: { not: null } }, + select: { id: true, coverUrl: true }, + }); + + let albumCount = 0; + for (const album of albums) { + if (album.coverUrl) { + await this.setRedisCache(`album-cover:${album.id}`, album.coverUrl, ALBUM_COVER_TTL); + albumCount++; + } + } + console.log(`[DataCache] Cached ${albumCount} album covers`); + + console.log("[DataCache] Cache warmup complete"); + } catch (err) { + console.error("[DataCache] Cache warmup failed:", err); + } + } +} + +export const dataCacheService = new DataCacheService(); + + + + + + + + + + + + + + + diff --git a/backend/src/services/deezer.ts b/backend/src/services/deezer.ts new file mode 100644 index 0000000..6d03229 --- /dev/null +++ b/backend/src/services/deezer.ts @@ -0,0 +1,587 @@ +import axios from "axios"; +import { redisClient } from "../utils/redis"; + +/** + * Deezer Service + * + * Fetches images, previews, and public playlist data from Deezer. + * No authentication required - Deezer's API is completely public. + */ + +const DEEZER_API = "https://api.deezer.com"; + +// ============================================ +// Playlist Types +// ============================================ + +export interface DeezerTrack { + deezerId: string; + title: string; + artist: string; + artistId: string; + album: string; + albumId: string; + durationMs: number; + previewUrl: string | null; + coverUrl: string | null; +} + +export interface DeezerPlaylist { + id: string; + title: string; + description: string | null; + creator: string; + imageUrl: string | null; + trackCount: number; + tracks: DeezerTrack[]; + isPublic: boolean; +} + +export interface DeezerPlaylistPreview { + id: string; + title: string; + description: string | null; + creator: string; + imageUrl: string | null; + trackCount: number; + fans: number; +} + +export interface DeezerRadioStation { + id: string; + title: string; + description: string | null; + imageUrl: string | null; + type: "radio"; +} + +export interface DeezerGenre { + id: number; + name: string; + imageUrl: string | null; +} + +export interface DeezerGenreWithRadios { + id: number; + name: string; + radios: DeezerRadioStation[]; +} + +// ============================================ +// Service Class +// ============================================ + +class DeezerService { + private readonly cachePrefix = "deezer:"; + private readonly cacheTTL = 86400; // 24 hours + + /** + * Get cached value from Redis + */ + private async getCached(key: string): Promise { + try { + return await redisClient.get(`${this.cachePrefix}${key}`); + } catch { + return null; + } + } + + /** + * Set cached value in Redis + */ + private async setCache(key: string, value: string): Promise { + try { + await redisClient.setex(`${this.cachePrefix}${key}`, this.cacheTTL, value); + } catch { + // Ignore cache errors + } + } + + // ============================================ + // Image & Preview Methods (existing functionality) + // ============================================ + + /** + * Search for an artist and get their image URL + */ + async getArtistImage(artistName: string): Promise { + const cacheKey = `artist:${artistName.toLowerCase()}`; + const cached = await this.getCached(cacheKey); + if (cached) return cached === "null" ? null : cached; + + try { + const response = await axios.get(`${DEEZER_API}/search/artist`, { + params: { q: artistName, limit: 1 }, + timeout: 5000, + }); + + const artist = response.data?.data?.[0]; + const imageUrl = artist?.picture_xl || artist?.picture_big || artist?.picture_medium || null; + + await this.setCache(cacheKey, imageUrl || "null"); + return imageUrl; + } catch (error: any) { + console.error(`Deezer artist image error for ${artistName}:`, error.message); + return null; + } + } + + /** + * Search for an album and get its cover art URL + */ + async getAlbumCover(artistName: string, albumName: string): Promise { + const cacheKey = `album:${artistName.toLowerCase()}:${albumName.toLowerCase()}`; + const cached = await this.getCached(cacheKey); + if (cached) return cached === "null" ? null : cached; + + try { + const response = await axios.get(`${DEEZER_API}/search/album`, { + params: { q: `artist:"${artistName}" album:"${albumName}"`, limit: 5 }, + timeout: 5000, + }); + + // Find the best match + const albums = response.data?.data || []; + let bestMatch = albums[0]; + + for (const album of albums) { + if (album.artist?.name?.toLowerCase() === artistName.toLowerCase() && + album.title?.toLowerCase() === albumName.toLowerCase()) { + bestMatch = album; + break; + } + } + + const coverUrl = bestMatch?.cover_xl || bestMatch?.cover_big || bestMatch?.cover_medium || null; + + await this.setCache(cacheKey, coverUrl || "null"); + return coverUrl; + } catch (error: any) { + console.error(`Deezer album cover error for ${artistName} - ${albumName}:`, error.message); + return null; + } + } + + /** + * Get a preview URL for a track + */ + async getTrackPreview(artistName: string, trackName: string): Promise { + const cacheKey = `preview:${artistName.toLowerCase()}:${trackName.toLowerCase()}`; + const cached = await this.getCached(cacheKey); + if (cached) return cached === "null" ? null : cached; + + try { + const response = await axios.get(`${DEEZER_API}/search/track`, { + params: { q: `artist:"${artistName}" track:"${trackName}"`, limit: 1 }, + timeout: 5000, + }); + + const track = response.data?.data?.[0]; + const previewUrl = track?.preview || null; + + await this.setCache(cacheKey, previewUrl || "null"); + return previewUrl; + } catch (error: any) { + console.error(`Deezer track preview error for ${artistName} - ${trackName}:`, error.message); + return null; + } + } + + // ============================================ + // Playlist Methods (new functionality) + // ============================================ + + /** + * Parse a Deezer URL and extract the type and ID + */ + parseUrl(url: string): { type: "playlist" | "album" | "track"; id: string } | null { + const playlistMatch = url.match(/deezer\.com\/(?:[a-z]{2}\/)?playlist\/(\d+)/); + if (playlistMatch) { + return { type: "playlist", id: playlistMatch[1] }; + } + + const albumMatch = url.match(/deezer\.com\/(?:[a-z]{2}\/)?album\/(\d+)/); + if (albumMatch) { + return { type: "album", id: albumMatch[1] }; + } + + const trackMatch = url.match(/deezer\.com\/(?:[a-z]{2}\/)?track\/(\d+)/); + if (trackMatch) { + return { type: "track", id: trackMatch[1] }; + } + + return null; + } + + /** + * Fetch a playlist by ID + */ + async getPlaylist(playlistId: string): Promise { + try { + console.log(`Deezer: Fetching playlist ${playlistId}...`); + + const response = await axios.get(`${DEEZER_API}/playlist/${playlistId}`, { + timeout: 15000, + }); + + const data = response.data; + if (data.error) { + console.error("Deezer API error:", data.error); + return null; + } + + const tracks: DeezerTrack[] = (data.tracks?.data || []).map((track: any) => ({ + deezerId: String(track.id), + title: track.title || "Unknown", + artist: track.artist?.name || "Unknown Artist", + artistId: String(track.artist?.id || ""), + album: track.album?.title || "Unknown Album", + albumId: String(track.album?.id || ""), + durationMs: (track.duration || 0) * 1000, + previewUrl: track.preview || null, + coverUrl: track.album?.cover_medium || track.album?.cover || null, + })); + + console.log(`Deezer: Fetched playlist "${data.title}" with ${tracks.length} tracks`); + + return { + id: String(data.id), + title: data.title || "Unknown Playlist", + description: data.description || null, + creator: data.creator?.name || "Unknown", + imageUrl: data.picture_medium || data.picture || null, + trackCount: data.nb_tracks || tracks.length, + tracks, + isPublic: data.public ?? true, + }; + } catch (error: any) { + console.error("Deezer playlist fetch error:", error.message); + return null; + } + } + + /** + * Get chart playlists (top playlists) + */ + async getChartPlaylists(limit: number = 20): Promise { + try { + const response = await axios.get(`${DEEZER_API}/chart/0/playlists`, { + params: { limit }, + timeout: 10000, + }); + + return (response.data?.data || []).map((playlist: any) => ({ + id: String(playlist.id), + title: playlist.title || "Unknown", + description: null, + creator: playlist.user?.name || "Deezer", + imageUrl: playlist.picture_medium || playlist.picture || null, + trackCount: playlist.nb_tracks || 0, + fans: playlist.fans || 0, + })); + } catch (error: any) { + console.error("Deezer chart playlists error:", error.message); + return []; + } + } + + /** + * Search for playlists + */ + async searchPlaylists(query: string, limit: number = 20): Promise { + try { + const response = await axios.get(`${DEEZER_API}/search/playlist`, { + params: { q: query, limit }, + timeout: 10000, + }); + + return (response.data?.data || []).map((playlist: any) => ({ + id: String(playlist.id), + title: playlist.title || "Unknown", + description: null, + creator: playlist.user?.name || "Unknown", + imageUrl: playlist.picture_medium || playlist.picture || null, + trackCount: playlist.nb_tracks || 0, + fans: 0, + })); + } catch (error: any) { + console.error("Deezer playlist search error:", error.message); + return []; + } + } + + /** + * Get featured/curated playlists from multiple sources + * Combines chart playlists with popular genre-based searches + * Cached for 24 hours + */ + async getFeaturedPlaylists(limit: number = 50): Promise { + const cacheKey = `playlists:featured:${limit}`; + const cached = await this.getCached(cacheKey); + if (cached) { + console.log("Deezer: Returning cached featured playlists"); + return JSON.parse(cached); + } + + try { + const allPlaylists: DeezerPlaylistPreview[] = []; + const seenIds = new Set(); + + // 1. Get chart playlists (max 99 available) + console.log("Deezer: Fetching chart playlists from API..."); + const chartPlaylists = await this.getChartPlaylists(Math.min(limit, 99)); + for (const p of chartPlaylists) { + if (!seenIds.has(p.id)) { + seenIds.add(p.id); + allPlaylists.push(p); + } + } + console.log(`Deezer: Got ${chartPlaylists.length} chart playlists`); + + // 2. If we need more, search for popular genre playlists + if (allPlaylists.length < limit) { + const genres = ["pop", "rock", "hip hop", "electronic", "r&b", "indie", "jazz", "classical", "metal", "country"]; + + for (const genre of genres) { + if (allPlaylists.length >= limit) break; + + try { + const genrePlaylists = await this.searchPlaylists(genre, 10); + for (const p of genrePlaylists) { + if (!seenIds.has(p.id) && allPlaylists.length < limit) { + seenIds.add(p.id); + allPlaylists.push(p); + } + } + } catch (e) { + // Continue with other genres + } + } + } + + const result = allPlaylists.slice(0, limit); + console.log(`Deezer: Caching ${result.length} featured playlists`); + await this.setCache(cacheKey, JSON.stringify(result)); + return result; + } catch (error: any) { + console.error("Deezer featured playlists error:", error.message); + return []; + } + } + + /** + * Get genres/categories available on Deezer + */ + /** + * Get genres/categories available on Deezer + * Cached for 24 hours + */ + async getGenres(): Promise> { + const cacheKey = "genres:all"; + const cached = await this.getCached(cacheKey); + if (cached) { + console.log("Deezer: Returning cached genres"); + return JSON.parse(cached); + } + + try { + console.log("Deezer: Fetching genres from API..."); + const response = await axios.get(`${DEEZER_API}/genre`, { + timeout: 10000, + }); + + const genres = (response.data?.data || []) + .filter((g: any) => g.id !== 0) // Skip "All" genre + .map((genre: any) => ({ + id: genre.id, + name: genre.name, + imageUrl: genre.picture_medium || genre.picture || null, + })); + + console.log(`Deezer: Caching ${genres.length} genres`); + await this.setCache(cacheKey, JSON.stringify(genres)); + return genres; + } catch (error: any) { + console.error("Deezer genres error:", error.message); + return []; + } + } + + /** + * Get playlists for a specific genre by searching + */ + async getGenrePlaylists(genreName: string, limit: number = 20): Promise { + return this.searchPlaylists(genreName, limit); + } + + // ============================================ + // Radio Methods + // ============================================ + + /** + * Get all radio stations (mood/theme based mixes) + * Cached for 24 hours + */ + async getRadioStations(): Promise { + const cacheKey = "radio:stations"; + const cached = await this.getCached(cacheKey); + if (cached) { + console.log("Deezer: Returning cached radio stations"); + return JSON.parse(cached); + } + + try { + console.log("Deezer: Fetching radio stations from API..."); + const response = await axios.get(`${DEEZER_API}/radio`, { + timeout: 10000, + }); + + const stations = (response.data?.data || []).map((radio: any) => ({ + id: String(radio.id), + title: radio.title || "Unknown", + description: null, + imageUrl: radio.picture_medium || radio.picture || null, + type: "radio" as const, + })); + + console.log(`Deezer: Got ${stations.length} radio stations, caching...`); + await this.setCache(cacheKey, JSON.stringify(stations)); + return stations; + } catch (error: any) { + console.error("Deezer radio stations error:", error.message); + return []; + } + } + + /** + * Get radio stations organized by genre + */ + /** + * Get radio stations organized by genre + * Cached for 24 hours + */ + async getRadiosByGenre(): Promise { + const cacheKey = "radio:by-genre"; + const cached = await this.getCached(cacheKey); + if (cached) { + console.log("Deezer: Returning cached radios by genre"); + return JSON.parse(cached); + } + + try { + console.log("Deezer: Fetching radios by genre from API..."); + const response = await axios.get(`${DEEZER_API}/radio/genres`, { + timeout: 10000, + }); + + const genres = (response.data?.data || []).map((genre: any) => ({ + id: genre.id, + name: genre.title || "Unknown", + radios: (genre.radios || []).map((radio: any) => ({ + id: String(radio.id), + title: radio.title || "Unknown", + description: null, + imageUrl: radio.picture_medium || radio.picture || null, + type: "radio" as const, + })), + })); + + console.log(`Deezer: Got ${genres.length} genre categories with radios, caching...`); + await this.setCache(cacheKey, JSON.stringify(genres)); + return genres; + } catch (error: any) { + console.error("Deezer radios by genre error:", error.message); + return []; + } + } + + /** + * Get tracks from a radio station (returns as DeezerPlaylist for consistency) + */ + async getRadioTracks(radioId: string): Promise { + try { + console.log(`Deezer: Fetching radio ${radioId} tracks...`); + + // First get radio info + const infoResponse = await axios.get(`${DEEZER_API}/radio/${radioId}`, { + timeout: 10000, + }); + const radioInfo = infoResponse.data; + + // Then get tracks + const tracksResponse = await axios.get(`${DEEZER_API}/radio/${radioId}/tracks`, { + params: { limit: 100 }, + timeout: 15000, + }); + + const tracks: DeezerTrack[] = (tracksResponse.data?.data || []).map((track: any) => ({ + deezerId: String(track.id), + title: track.title || "Unknown", + artist: track.artist?.name || "Unknown Artist", + artistId: String(track.artist?.id || ""), + album: track.album?.title || "Unknown Album", + albumId: String(track.album?.id || ""), + durationMs: (track.duration || 0) * 1000, + previewUrl: track.preview || null, + coverUrl: track.album?.cover_medium || track.album?.cover || null, + })); + + console.log(`Deezer: Fetched radio "${radioInfo.title}" with ${tracks.length} tracks`); + + return { + id: `radio-${radioId}`, + title: radioInfo.title || "Radio Station", + description: `Deezer Radio - ${radioInfo.title}`, + creator: "Deezer", + imageUrl: radioInfo.picture_medium || radioInfo.picture || null, + trackCount: tracks.length, + tracks, + isPublic: true, + }; + } catch (error: any) { + console.error("Deezer radio tracks error:", error.message); + return null; + } + } + + /** + * Get editorial/curated content for a specific genre + * Returns releases and playlists for that genre + */ + async getEditorialContent(genreId: number): Promise<{ + playlists: DeezerPlaylistPreview[]; + radios: DeezerRadioStation[]; + }> { + try { + // Get genre-specific playlists via search + const genreResponse = await axios.get(`${DEEZER_API}/genre/${genreId}`, { + timeout: 10000, + }); + const genreName = genreResponse.data?.name || ""; + + // Search for playlists with this genre + const playlists = genreName ? await this.searchPlaylists(genreName, 20) : []; + + // Get radios for this genre from the genres endpoint + const radiosResponse = await axios.get(`${DEEZER_API}/radio/genres`, { + timeout: 10000, + }); + + const genreRadios = (radiosResponse.data?.data || []).find((g: any) => g.id === genreId); + const radios: DeezerRadioStation[] = (genreRadios?.radios || []).map((radio: any) => ({ + id: String(radio.id), + title: radio.title || "Unknown", + description: null, + imageUrl: radio.picture_medium || radio.picture || null, + type: "radio" as const, + })); + + return { playlists, radios }; + } catch (error: any) { + console.error("Deezer editorial content error:", error.message); + return { playlists: [], radios: [] }; + } + } +} + +export const deezerService = new DeezerService(); diff --git a/backend/src/services/discoverWeekly.ts b/backend/src/services/discoverWeekly.ts new file mode 100644 index 0000000..ff3610e --- /dev/null +++ b/backend/src/services/discoverWeekly.ts @@ -0,0 +1,3122 @@ +/** + * Discovery Weekly Service (Refactored) + * + * Generates weekly discovery playlists using Last.fm recommendations, + * downloads via Lidarr, and only shows songs after successful import. + * + * Key improvements: + * - Prisma transactions for atomic operations + * - Pre-fetched and cached recommendations + * - Structured logging with batch logs field + * - No dynamic imports + */ + +import { Prisma } from "@prisma/client"; +import { prisma } from "../utils/db"; +import { lastFmService } from "./lastfm"; +import { musicBrainzService } from "./musicbrainz"; +import { simpleDownloadManager } from "./simpleDownloadManager"; +import { lidarrService } from "./lidarr"; +import { scanQueue } from "../workers/queues"; +import { startOfWeek, subWeeks } from "date-fns"; +import { getSystemSettings } from "../utils/systemSettings"; +import { discoveryLogger } from "./discoveryLogger"; + +interface SeedArtist { + name: string; + mbid?: string; +} + +interface RecommendedAlbum { + artistName: string; + artistMbid?: string; + albumTitle: string; + albumMbid: string; + similarity: number; + tier?: "high" | "medium" | "explore" | "wildcard"; +} + +// Tier distribution for variety in recommendations +// This ensures each playlist has a mix of similarity levels +const TIER_DISTRIBUTION = { + high: 0.3, // 30% from very similar artists (>80% match) + medium: 0.4, // 40% from moderately similar (50-80% match) + explore: 0.2, // 20% from stretch picks (30-50% match) + wildcard: 0.1, // 10% from genre tags (variety) +}; + +interface BatchLogEntry { + timestamp: string; + level: "info" | "warn" | "error"; + message: string; +} + +/** + * Calculate tier from Last.fm similarity score + * Last.fm typically returns scores in 0.5-0.9 range for similar artists + * Adjusted thresholds for better distribution: + * - High Match: 70-100% (0.7-1.0) + * - Medium Match: 50-69% (0.5-0.69) + * - Explore: 30-49% (0.3-0.49) + * - Wild Card: 0-29% (0-0.29) or explicitly set + */ +function getTierFromSimilarity( + similarity: number +): "high" | "medium" | "explore" | "wildcard" { + if (similarity >= 0.7) return "high"; + if (similarity >= 0.5) return "medium"; + if (similarity >= 0.3) return "explore"; + return "wildcard"; +} + +export class DiscoverWeeklyService { + /** + * Process liked albums before generating new playlist + * - Moves LIKED albums to LIBRARY + * - Deletes non-liked (ACTIVE) albums + * - Cleans up Lidarr + */ + private async processLikedAlbumsBeforeGeneration( + userId: string, + settings: any + ): Promise { + console.log(`\n Processing previous discovery albums...`); + + // Find all active discovery albums for this user + const discoveryAlbums = await prisma.discoveryAlbum.findMany({ + where: { + userId, + status: { in: ["ACTIVE", "LIKED"] }, + }, + }); + + if (discoveryAlbums.length === 0) { + console.log(` No previous discovery albums to process`); + return; + } + + const likedAlbums = discoveryAlbums.filter((a) => a.status === "LIKED"); + const activeAlbums = discoveryAlbums.filter( + (a) => a.status === "ACTIVE" + ); + + console.log(` Found ${likedAlbums.length} liked albums to keep`); + console.log( + ` Found ${activeAlbums.length} non-liked albums to remove` + ); + + // Process liked albums - move to library + for (const album of likedAlbums) { + try { + // Find the album in database + const dbAlbum = await prisma.album.findFirst({ + where: { rgMbid: album.rgMbid }, + include: { artist: true }, + }); + + if (dbAlbum) { + // Update album location to LIBRARY + await prisma.album.update({ + where: { id: dbAlbum.id }, + data: { location: "LIBRARY" }, + }); + + // Create OwnedAlbum record + await prisma.ownedAlbum.upsert({ + where: { + artistId_rgMbid: { + artistId: dbAlbum.artistId, + rgMbid: dbAlbum.rgMbid, + }, + }, + create: { + artistId: dbAlbum.artistId, + rgMbid: dbAlbum.rgMbid, + source: "discover_liked", + }, + update: {}, + }); + + console.log( + ` Moved to library: ${album.artistName} - ${album.albumTitle}` + ); + } + + // Mark as MOVED + await prisma.discoveryAlbum.update({ + where: { id: album.id }, + data: { status: "MOVED" }, + }); + } catch (error: any) { + console.error( + ` ✗ Failed to move ${album.albumTitle}: ${error.message}` + ); + } + } + + // Process active albums - delete them + for (const album of activeAlbums) { + try { + // Delete from Lidarr if enabled + if ( + settings.lidarrEnabled && + settings.lidarrUrl && + settings.lidarrApiKey && + album.lidarrAlbumId + ) { + try { + const axios = (await import("axios")).default; + await axios.delete( + `${settings.lidarrUrl}/api/v1/album/${album.lidarrAlbumId}`, + { + params: { deleteFiles: true }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + } catch (lidarrError: any) { + if (lidarrError.response?.status !== 404) { + console.log( + ` Lidarr delete failed: ${lidarrError.message}` + ); + } + } + } + + // Delete from database + const dbAlbum = await prisma.album.findFirst({ + where: { rgMbid: album.rgMbid }, + }); + + if (dbAlbum) { + await prisma.track.deleteMany({ + where: { albumId: dbAlbum.id }, + }); + await prisma.album.delete({ where: { id: dbAlbum.id } }); + } + + // Delete discovery track records + await prisma.discoveryTrack.deleteMany({ + where: { discoveryAlbumId: album.id }, + }); + + // Mark as DELETED + await prisma.discoveryAlbum.update({ + where: { id: album.id }, + data: { status: "DELETED" }, + }); + + console.log( + ` Deleted: ${album.artistName} - ${album.albumTitle}` + ); + } catch (error: any) { + console.error( + ` ✗ Failed to delete ${album.albumTitle}: ${error.message}` + ); + } + } + + // Clean up unavailable albums from previous week + await prisma.unavailableAlbum.deleteMany({ where: { userId } }); + + console.log(` Previous discovery cleanup complete`); + } + + /** + * Add a log entry to batch logs + */ + private async addBatchLog( + batchId: string, + level: "info" | "warn" | "error", + message: string + ): Promise { + try { + const batch = await prisma.discoveryBatch.findUnique({ + where: { id: batchId }, + select: { logs: true }, + }); + + const logs = (batch?.logs as unknown as BatchLogEntry[]) || []; + logs.push({ + timestamp: new Date().toISOString(), + level, + message, + }); + + // Keep only last 100 log entries + const trimmedLogs = logs.slice(-100); + + await prisma.discoveryBatch.update({ + where: { id: batchId }, + data: { logs: trimmedLogs as any }, + }); + } catch (error) { + // Don't fail if logging fails + console.error("Failed to add batch log:", error); + } + } + + /** + * Main entry: Generate Discovery Weekly + */ + async generatePlaylist(userId: string, jobId?: number) { + // Start a dedicated log file for this generation + const logPath = discoveryLogger.start(userId, jobId); + discoveryLogger.info(`Log file: ${logPath}`); + + try { + // Check if Lidarr is enabled and configured + discoveryLogger.section("CONFIGURATION CHECK"); + const settings = await getSystemSettings(); + if ( + !settings?.lidarrEnabled || + !settings?.lidarrUrl || + !settings?.lidarrApiKey + ) { + discoveryLogger.error("Lidarr must be enabled and configured"); + discoveryLogger.end(false, "Lidarr not configured"); + throw new Error( + "Lidarr must be enabled and configured to use Discovery Weekly" + ); + } + discoveryLogger.success("Lidarr configured"); + discoveryLogger.table({ + "Lidarr URL": settings.lidarrUrl, + "API Key": settings.lidarrApiKey + ? "***" + settings.lidarrApiKey.slice(-4) + : "not set", + }); + + const weekStart = startOfWeek(new Date(), { weekStartsOn: 1 }); + + // Get user config + const config = await prisma.userDiscoverConfig.findUnique({ + where: { userId }, + }); + + if (!config || !config.enabled) { + discoveryLogger.error("Discovery Weekly not enabled for user"); + discoveryLogger.end(false, "Not enabled"); + throw new Error("Discovery Weekly not enabled"); + } + + // Get download ratio from config (default 1.3) + const downloadRatio = config.downloadRatio ?? 1.3; + + discoveryLogger.table({ + "Target Songs": config.playlistSize, + "Download Ratio": `${downloadRatio}x`, + "Week Start": weekStart.toISOString().split("T")[0], + }); + + // CRITICAL: Process previous week's liked albums before generating new ones + discoveryLogger.section("PROCESSING PREVIOUS WEEK"); + await this.processLikedAlbumsBeforeGeneration(userId, settings); + + const targetCount = config.playlistSize; + + // Step 1: Get seed artists + discoveryLogger.section("STEP 1: SEED ARTISTS"); + const seeds = await this.getSeedArtists(userId); + if (seeds.length === 0) { + discoveryLogger.error( + "No seed artists found - need listening history" + ); + discoveryLogger.end(false, "No seed artists"); + throw new Error( + "No seed artists found - need listening history" + ); + } + discoveryLogger.success(`Found ${seeds.length} seed artists:`); + discoveryLogger.list( + seeds.map( + (s) => `${s.name}${s.mbid ? ` (${s.mbid})` : " (no MBID)"}` + ) + ); + + // Step 2: Pre-fetch and cache similar artists (parallel with rate limiting) + discoveryLogger.section("STEP 2: SIMILAR ARTISTS"); + const similarArtistsMap = await this.prefetchSimilarArtists(seeds); + discoveryLogger.success( + `Cached ${similarArtistsMap.size} similar artist sets` + ); + for (const [key, similar] of similarArtistsMap.entries()) { + const seedName = + seeds.find((s) => s.mbid === key || s.name === key)?.name || + key; + discoveryLogger.write( + ` ${seedName}: ${similar.length} similar artists`, + 1 + ); + } + + // Step 3: Find recommended albums using multi-strategy discovery + // REQUEST MORE ALBUMS than target to account for download failures + // User configurable ratio (default 1.3x) to control bandwidth usage + const albumsToRequest = Math.ceil(targetCount * downloadRatio); + + discoveryLogger.section( + "STEP 3: ALBUM RECOMMENDATIONS (Multi-Strategy)" + ); + discoveryLogger.info( + `Requesting ${albumsToRequest} albums (${downloadRatio}x target of ${targetCount}) to account for failures` + ); + + const recommended = await this.findRecommendedAlbumsMultiStrategy( + seeds, + similarArtistsMap, + albumsToRequest, // Request more albums! + userId + ); + + if (recommended.length === 0) { + discoveryLogger.error( + "No recommendations found after filtering" + ); + discoveryLogger.end(false, "No recommendations found"); + throw new Error("No recommendations found"); + } + + // MINIMUM THRESHOLD CHECK: Ensure we have enough candidates + // We need at least targetCount albums, ideally more for variety + const minRecommendations = targetCount; + if (recommended.length < minRecommendations) { + discoveryLogger.warn( + `Only ${recommended.length} recommendations found, need at least ${minRecommendations} for ${targetCount} unique albums` + ); + discoveryLogger.warn( + "Consider expanding seed artists or playing more music" + ); + await this.addBatchLog( + "threshold-check", + "warn", + `Low recommendations: ${recommended.length}/${minRecommendations} minimum (target: ${targetCount} unique albums)` + ); + } + + discoveryLogger.success( + `${recommended.length} albums recommended for download` + ); + discoveryLogger.list( + recommended.map( + (r) => + `${r.artistName} - ${r.albumTitle} (similarity: ${( + r.similarity * 100 + ).toFixed(0)}%)` + ) + ); + + // Step 4: Create batch and jobs in a transaction + discoveryLogger.section("STEP 4: CREATE BATCH & JOBS"); + const batch = await prisma.$transaction(async (tx) => { + // Create discovery batch + const newBatch = await tx.discoveryBatch.create({ + data: { + userId, + weekStart, + targetSongCount: targetCount, + status: "downloading", + totalAlbums: recommended.length, + completedAlbums: 0, + failedAlbums: 0, + logs: [ + { + timestamp: new Date().toISOString(), + level: "info", + message: `Started with ${recommended.length} albums to download`, + }, + ] as any, + }, + }); + discoveryLogger.success(`Created batch: ${newBatch.id}`); + + // Create all download jobs in the same transaction + for (const album of recommended) { + // Ensure similarity is a valid number + const similarity = + typeof album.similarity === "number" && + !isNaN(album.similarity) + ? album.similarity + : 0.5; + + // Check for existing pending/processing job to avoid duplicates + const existingJob = await tx.downloadJob.findFirst({ + where: { + targetMbid: album.albumMbid, + status: { in: ["pending", "processing"] }, + }, + }); + + if (existingJob) { + console.log( + ` Skipping job: ${album.artistName} - ${album.albumTitle} (already in queue: ${existingJob.id})` + ); + continue; + } + + console.log( + ` Creating job: ${album.artistName} - ${album.albumTitle} (similarity: ${similarity}, tier: ${album.tier})` + ); + + await tx.downloadJob.create({ + data: { + userId, + subject: `${album.artistName} - ${album.albumTitle}`, + type: "album", + targetMbid: album.albumMbid, + status: "pending", + discoveryBatchId: newBatch.id, + metadata: { + downloadType: "discovery", + rootFolderPath: "/music", + artistName: album.artistName, + artistMbid: album.artistMbid, + albumTitle: album.albumTitle, + albumMbid: album.albumMbid, + similarity: similarity, + tier: album.tier, + }, + }, + }); + } + + return newBatch; + }); + discoveryLogger.success( + `Created ${recommended.length} download jobs` + ); + + // Step 5: Start downloads outside transaction (they involve external APIs) + discoveryLogger.section("STEP 5: START DOWNLOADS"); + let downloadsStarted = 0; + let downloadsFailed = 0; + + const jobs = await prisma.downloadJob.findMany({ + where: { discoveryBatchId: batch.id }, + }); + + for (const job of jobs) { + const metadata = job.metadata as any; + try { + const result = await simpleDownloadManager.startDownload( + job.id, + metadata.artistName, + metadata.albumTitle, + metadata.albumMbid, + userId, + true // isDiscovery - tag artist in Lidarr for cleanup + ); + + if (result.success) { + downloadsStarted++; + discoveryLogger.success( + `Started: ${metadata.artistName} - ${metadata.albumTitle}`, + 1 + ); + } else { + downloadsFailed++; + discoveryLogger.error( + `Failed: ${metadata.albumTitle} - ${result.error}`, + 1 + ); + await this.addBatchLog( + batch.id, + "error", + `Failed to start: ${metadata.albumTitle} - ${result.error}` + ); + } + } catch (error: any) { + downloadsFailed++; + discoveryLogger.error( + `Error: ${metadata.albumTitle}: ${error.message}`, + 1 + ); + await this.addBatchLog( + batch.id, + "error", + `Error starting: ${metadata.albumTitle} - ${error.message}` + ); + } + } + + discoveryLogger.section("GENERATION COMPLETE"); + discoveryLogger.table({ + "Downloads Started": downloadsStarted, + "Downloads Failed": downloadsFailed, + "Total Albums": recommended.length, + "Batch ID": batch.id, + }); + + await this.addBatchLog( + batch.id, + "info", + `${downloadsStarted} downloads started, waiting for webhooks` + ); + + discoveryLogger.end( + true, + `${downloadsStarted}/${recommended.length} downloads queued` + ); + + return { + success: true, + playlistName: `Discover Weekly (Week of ${weekStart.toLocaleDateString()})`, + songCount: 0, + batchId: batch.id, + }; + } catch (error: any) { + discoveryLogger.error(`Generation failed: ${error.message}`); + discoveryLogger.end(false, error.message); + throw error; + } + } + + /** + * Pre-fetch similar artists for all seeds (parallel with rate limiting) + * Now includes exponential backoff retry for API failures + */ + private async prefetchSimilarArtists( + seeds: SeedArtist[] + ): Promise> { + const cache = new Map(); + + // Helper: fetch with exponential backoff retry + const fetchWithRetry = async ( + seed: SeedArtist, + maxRetries = 3 + ): Promise => { + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + const similar = await lastFmService.getSimilarArtists( + seed.mbid || "", + seed.name, + 20 + ); + return similar; + } catch (error: any) { + const isRetryable = + error.response?.status === 429 || + error.response?.status >= 500 || + error.code === "ECONNRESET" || + error.code === "ETIMEDOUT"; + + if (isRetryable && attempt < maxRetries) { + const delay = Math.pow(2, attempt) * 500; // 1s, 2s, 4s + console.warn( + ` Retry ${attempt}/${maxRetries} for ${seed.name} in ${delay}ms (${error.message})` + ); + await new Promise((r) => setTimeout(r, delay)); + continue; + } + + console.warn( + ` Failed to get similar artists for ${seed.name}: ${error.message}` + ); + return []; + } + } + return []; + }; + + // Process seeds in smaller batches to avoid overwhelming APIs + const batchSize = 3; + for (let i = 0; i < seeds.length; i += batchSize) { + const seedBatch = seeds.slice(i, i + batchSize); + + const results = await Promise.all( + seedBatch.map(async (seed) => { + const similar = await fetchWithRetry(seed); + return { key: seed.mbid || seed.name, similar }; + }) + ); + + for (const { key, similar } of results) { + cache.set(key, similar); + } + + // Small delay between batches + if (i + batchSize < seeds.length) { + await new Promise((r) => setTimeout(r, 300)); + } + } + + return cache; + } + + /** + * Check for batches stuck in "downloading" or "scanning" status for too long + * Called periodically from queue cleaner + */ + async checkStuckBatches(): Promise { + const BATCH_TIMEOUT_WITH_COMPLETIONS = 30 * 60 * 1000; // 30 minutes + const BATCH_TIMEOUT_NO_COMPLETIONS = 60 * 60 * 1000; // 60 minutes + const ABSOLUTE_MAX_TIMEOUT = 2 * 60 * 60 * 1000; // 2 hours - force fail any batch older than this + + const stuckBatches = await prisma.discoveryBatch.findMany({ + where: { + status: { in: ["downloading", "scanning"] }, + }, + include: { jobs: true }, + }); + + let forcedCount = 0; + + for (const batch of stuckBatches) { + const batchAge = Date.now() - batch.createdAt.getTime(); + const completedJobs = batch.jobs.filter( + (j) => j.status === "completed" + ); + const pendingJobs = batch.jobs.filter( + (j) => j.status === "pending" || j.status === "processing" + ); + + // Absolute timeout - fail any batch older than 2 hours regardless of state + if (batchAge > ABSOLUTE_MAX_TIMEOUT) { + console.log( + `\n⏰ [BATCH FORCE FAIL] Batch ${batch.id} is ${Math.round( + batchAge / 3600000 + )}h old - force failing` + ); + + await prisma.discoveryBatch.update({ + where: { id: batch.id }, + data: { + status: "failed", + errorMessage: "Batch timed out after 2 hours", + completedAt: new Date(), + }, + }); + + // Mark any remaining pending/processing jobs as failed + await prisma.downloadJob.updateMany({ + where: { + discoveryBatchId: batch.id, + status: { in: ["pending", "processing"] }, + }, + data: { + status: "failed", + error: "Batch force-failed due to timeout", + completedAt: new Date(), + }, + }); + + forcedCount++; + continue; + } + + // Check if batch should be force-completed + const hasCompletions = completedJobs.length > 0; + const timeout = hasCompletions + ? BATCH_TIMEOUT_WITH_COMPLETIONS + : BATCH_TIMEOUT_NO_COMPLETIONS; + + if (batchAge > timeout && pendingJobs.length > 0) { + console.log( + `\n⏰ [BATCH TIMEOUT] Batch ${ + batch.id + } stuck for ${Math.round(batchAge / 60000)}min` + ); + console.log( + ` Completed: ${completedJobs.length}, Pending: ${pendingJobs.length}` + ); + + // Mark all pending jobs as failed (timed out) + await prisma.downloadJob.updateMany({ + where: { + discoveryBatchId: batch.id, + status: { in: ["pending", "processing"] }, + }, + data: { + status: "failed", + error: "Batch timeout - download took too long", + completedAt: new Date(), + }, + }); + + console.log( + ` Marked ${pendingJobs.length} pending jobs as failed` + ); + + // Now trigger batch completion check + await this.checkBatchCompletion(batch.id); + forcedCount++; + } + } + + return forcedCount; + } + + /** + * Check if discovery batch is complete and trigger final steps + */ + async checkBatchCompletion(batchId: string) { + console.log(`\n[BATCH ${batchId}] Checking completion...`); + + const batch = await prisma.discoveryBatch.findUnique({ + where: { id: batchId }, + include: { jobs: true }, + }); + + if (!batch) { + console.log(`[BATCH ${batchId}] Not found - skipping`); + return; + } + + // Skip if already completed/failed/scanning + if ( + batch.status === "completed" || + batch.status === "failed" || + batch.status === "scanning" + ) { + console.log( + `[BATCH ${batchId}] Already ${batch.status} - skipping` + ); + return; + } + + const completedJobs = batch.jobs.filter( + (j) => j.status === "completed" + ); + const failedJobs = batch.jobs.filter( + (j) => j.status === "failed" || j.status === "exhausted" + ); + const pendingJobs = batch.jobs.filter( + (j) => j.status === "pending" || j.status === "processing" + ); + + const completed = completedJobs.length; + const failed = failedJobs.length; + const total = batch.jobs.length; + + console.log( + `[BATCH ${batchId}] Status: ${completed} completed, ${failed} failed, ${pendingJobs.length} pending (total: ${total})` + ); + + // Wait for ALL downloads to complete/fail + if (pendingJobs.length > 0) { + console.log( + `[BATCH ${batchId}] Still waiting for ${pendingJobs.length} downloads` + ); + return; + } + + console.log( + `[BATCH ${batchId}] All jobs done! Transitioning to scan phase...` + ); + + // All jobs finished - use transaction to update batch and create unavailable records + await prisma.$transaction(async (tx) => { + // Create UnavailableAlbum records for failed downloads + for (const job of failedJobs) { + const metadata = job.metadata as any; + try { + await tx.unavailableAlbum.upsert({ + where: { + userId_weekStartDate_albumMbid: { + userId: batch.userId, + weekStartDate: batch.weekStart, + albumMbid: job.targetMbid, + }, + }, + create: { + userId: batch.userId, + albumMbid: job.targetMbid, + artistName: metadata?.artistName || "Unknown", + albumTitle: metadata?.albumTitle || "Unknown", + similarity: metadata?.similarity || 0.5, + tier: + metadata?.tier || + getTierFromSimilarity( + metadata?.similarity || 0.5 + ), + attemptNumber: 1, + weekStartDate: batch.weekStart, + }, + update: { + attemptNumber: { increment: 1 }, + }, + }); + } catch (e) { + // Ignore duplicate errors + } + } + + // Update batch status + if (completed === 0) { + await tx.discoveryBatch.update({ + where: { id: batchId }, + data: { + status: "failed", + completedAlbums: 0, + failedAlbums: failed, + errorMessage: "All downloads failed", + completedAt: new Date(), + }, + }); + } else { + await tx.discoveryBatch.update({ + where: { id: batchId }, + data: { + status: "scanning", + completedAlbums: completed, + failedAlbums: failed, + }, + }); + } + }); + + if (completed === 0) { + console.log(` All downloads failed`); + await this.addBatchLog(batchId, "error", "All downloads failed"); + + // Cleanup failed artists from Lidarr + await this.cleanupFailedArtists(batchId); + return; + } + + // All successful downloads will be included in the playlist + console.log( + ` ${completed} albums ready for playlist. Triggering scan...` + ); + await this.addBatchLog( + batchId, + "info", + `${completed} completed, ${failed} failed. All successful downloads will be in playlist.` + ); + + // Trigger ONE scan with batch ID + await scanQueue.add("scan", { + type: "full", + source: "discover-weekly-completion", + discoveryBatchId: batchId, + }); + + console.log( + ` Scan queued - will build playlist after scan completes` + ); + } + + /** + * Build final playlist after scan completes (atomic transaction) + */ + async buildFinalPlaylist(batchId: string) { + console.log(`\n Building final playlist for batch ${batchId}...`); + + const batch = await prisma.discoveryBatch.findUnique({ + where: { id: batchId }, + }); + + if (!batch) { + console.log(` Batch not found`); + return; + } + + // Get completed download jobs + const completedJobs = await prisma.downloadJob.findMany({ + where: { + discoveryBatchId: batchId, + status: "completed", + }, + }); + + console.log(` Found ${completedJobs.length} completed downloads`); + await this.addBatchLog( + batchId, + "info", + `Building playlist from ${completedJobs.length} completed downloads` + ); + + // Build search criteria from completed jobs - use MBID (primary) + artist/album name (fallback) + const searchCriteria = completedJobs + .map((j) => { + const metadata = j.metadata as any; + return { + artistName: metadata?.artistName || "", + albumTitle: metadata?.albumTitle || "", + albumMbid: metadata?.albumMbid || j.targetMbid || "", + }; + }) + .filter((c) => c.artistName && c.albumTitle); + + console.log( + ` Searching for tracks using MBID (primary) + name fallback:` + ); + for (const c of searchCriteria) { + console.log( + ` - "${c.albumTitle}" by "${c.artistName}" (MBID: ${ + c.albumMbid || "none" + })` + ); + } + + // Find tracks - try MBID first (most accurate), then fall back to name matching + let allTracks: any[] = []; + for (const criteria of searchCriteria) { + let tracks: any[] = []; + + // PRIMARY: Search by rgMbid (most accurate) + if (criteria.albumMbid) { + tracks = await prisma.track.findMany({ + where: { + album: { rgMbid: criteria.albumMbid }, + }, + include: { + album: { include: { artist: true } }, + }, + }); + if (tracks.length > 0) { + console.log( + ` [MBID] Found ${tracks.length} tracks for "${criteria.albumTitle}"` + ); + } + } + + // FALLBACK: Search by artist name + album title (case-insensitive) + if (tracks.length === 0) { + tracks = await prisma.track.findMany({ + where: { + album: { + title: { + equals: criteria.albumTitle, + mode: "insensitive", + }, + artist: { + name: { + equals: criteria.artistName, + mode: "insensitive", + }, + }, + }, + }, + include: { + album: { include: { artist: true } }, + }, + }); + if (tracks.length > 0) { + console.log( + ` [NAME] Found ${tracks.length} tracks for "${criteria.albumTitle}"` + ); + } + } + + // FALLBACK 2: Normalized name search (handles Unicode/special chars) + if (tracks.length === 0) { + // Normalize for comparison + const normalizeStr = (s: string) => + s + .toLowerCase() + .normalize("NFKD") // Decompose Unicode + .replace(/[\u0300-\u036f]/g, "") // Remove diacritics + .replace(/[^\w\s]/g, " ") // Replace punctuation with space + .replace(/\s+/g, " ") // Normalize whitespace + .trim(); + + const normalizedAlbum = normalizeStr(criteria.albumTitle); + const normalizedArtist = normalizeStr(criteria.artistName); + + // Get all albums from this artist (by normalized name) + const artistAlbums = await prisma.album.findMany({ + where: { + artist: { + name: { + mode: "insensitive", + contains: normalizedArtist.split(" ")[0], + }, + }, + }, + include: { artist: true, tracks: true }, + }); + + // Find matching album by normalized title + for (const album of artistAlbums) { + if ( + normalizeStr(album.title) === normalizedAlbum || + normalizeStr(album.title).includes(normalizedAlbum) || + normalizedAlbum.includes(normalizeStr(album.title)) + ) { + tracks = album.tracks.map((t: any) => ({ + ...t, + album: { ...album, artist: album.artist }, + })); + if (tracks.length > 0) { + console.log( + ` [NORMALIZED] Found ${tracks.length} tracks for "${criteria.albumTitle}"` + ); + break; + } + } + } + } + + if (tracks.length === 0) { + console.log( + ` [MISS] No tracks found for "${criteria.albumTitle}" by "${criteria.artistName}"` + ); + } + + allTracks.push(...tracks); + } + + // Remove duplicates (same track ID) + const uniqueTracks = Array.from( + new Map(allTracks.map((t) => [t.id, t])).values() + ); + allTracks = uniqueTracks; + + console.log(` Found ${allTracks.length} tracks from imported albums`); + + if (allTracks.length === 0) { + console.log( + ` No tracks found after scan - albums may not have imported yet` + ); + await prisma.discoveryBatch.update({ + where: { id: batchId }, + data: { + status: "failed", + errorMessage: "No tracks found after scan", + completedAt: new Date(), + }, + }); + await this.addBatchLog( + batchId, + "error", + "No tracks found after scan" + ); + return; + } + + // ============================================== + // PLAYLIST COMPOSITION: ALL Discovery + ~20% Anchors + // ONE TRACK PER ALBUM - Each album contributes only 1 track + // Include ALL successfully downloaded albums! + // ============================================== + + // Group tracks by album ID and pick ONE random track per album + const tracksByAlbum = new Map(); + for (const track of allTracks) { + const albumId = track.album.id; + if (!tracksByAlbum.has(albumId)) { + tracksByAlbum.set(albumId, []); + } + tracksByAlbum.get(albumId)!.push(track); + } + + // Select 1 random track from each album + const onePerAlbum: typeof allTracks = []; + for (const [albumId, tracks] of tracksByAlbum) { + const randomTrack = + tracks[Math.floor(Math.random() * tracks.length)]; + onePerAlbum.push(randomTrack); + } + + const availableAlbums = onePerAlbum.length; + const anchorCount = Math.ceil(availableAlbums * 0.2); // Add 20% anchors on top + + console.log( + ` Unique albums available: ${availableAlbums} (from ${allTracks.length} total tracks)` + ); + console.log( + ` Target composition: ${availableAlbums} discovery + ${anchorCount} anchors = ${ + availableAlbums + anchorCount + } total` + ); + + // Shuffle the unique album tracks + const shuffled = onePerAlbum.sort(() => Math.random() - 0.5); + + // Step 1: Get ALL discovery tracks (1 per album) - no limit! + let discoverySelected = [...shuffled]; + console.log( + ` Discovery tracks: ${discoverySelected.length} (ALL available, 1 per album)` + ); + + // Step 2: ALWAYS add library anchor tracks (20%) + // Get seed artists for this user + const seeds = await this.getSeedArtists(batch.userId); + const seedArtistNames = seeds.slice(0, 10).map((s) => s.name); + const seedArtistMbids = seeds + .slice(0, 10) + .map((s) => s.mbid) + .filter(Boolean) as string[]; + + let libraryAnchors: any[] = []; + // Get existing track IDs to avoid duplicates + const existingTrackIds = new Set(discoverySelected.map((t) => t.id)); + + // First, try to find library tracks from seed artists (by name or mbid) + // Also exclude albums already used in discovery + const usedAlbumIds = new Set(discoverySelected.map((t) => t.album.id)); + + if (seedArtistNames.length > 0 || seedArtistMbids.length > 0) { + const libraryTracks = await prisma.track.findMany({ + where: { + album: { + artist: { + OR: [ + { name: { in: seedArtistNames } }, + ...(seedArtistMbids.length > 0 + ? [{ mbid: { in: seedArtistMbids } }] + : []), + ], + }, + location: "LIBRARY", + id: { notIn: Array.from(usedAlbumIds) }, // Exclude albums already in discovery + }, + id: { notIn: Array.from(existingTrackIds) }, + }, + include: { + album: { include: { artist: true } }, + }, + take: anchorCount * 10, // Get extra for 1-per-album selection + }); + + console.log( + ` Found ${libraryTracks.length} candidate library tracks from ${seedArtistNames.length} seed artists` + ); + + if (libraryTracks.length > 0) { + // Group by album and pick 1 per album + const anchorsByAlbum = new Map< + string, + (typeof libraryTracks)[0] + >(); + for (const track of libraryTracks) { + if ( + !anchorsByAlbum.has(track.album.id) && + !usedAlbumIds.has(track.album.id) + ) { + anchorsByAlbum.set(track.album.id, track); + } + } + + // Shuffle and take what we need + const uniqueAnchors = Array.from(anchorsByAlbum.values()).sort( + () => Math.random() - 0.5 + ); + libraryAnchors = uniqueAnchors.slice(0, anchorCount); + + // Mark these as library anchors and track used albums + for (const track of libraryAnchors) { + (track as any).isLibraryAnchor = true; + usedAlbumIds.add(track.album.id); + } + } + } + + // GUARANTEE: If we don't have enough anchors from seed artists, use ANY popular library tracks + if (libraryAnchors.length < anchorCount) { + const needed = anchorCount - libraryAnchors.length; + console.log( + ` Only ${libraryAnchors.length}/${anchorCount} anchors from seeds, adding ${needed} from popular library tracks` + ); + + // Get track IDs we already have (discovery + current anchors) + const usedTrackIds = new Set([ + ...existingTrackIds, + ...libraryAnchors.map((t) => t.id), + ]); + + // Find popular library tracks (from artists with most plays or albums) + // Exclude albums already used + const popularLibraryTracks = await prisma.track.findMany({ + where: { + album: { + location: "LIBRARY", + id: { notIn: Array.from(usedAlbumIds) }, // 1 per album + }, + id: { notIn: Array.from(usedTrackIds) }, + }, + include: { + album: { include: { artist: true } }, + }, + orderBy: { + // Order by album's artist name for variety, or you could add play count + album: { artist: { name: "asc" } }, + }, + take: needed * 10, // Get extra for 1-per-album selection + }); + + if (popularLibraryTracks.length > 0) { + // Group by album and pick 1 per album + const popByAlbum = new Map< + string, + (typeof popularLibraryTracks)[0] + >(); + for (const track of popularLibraryTracks) { + if ( + !popByAlbum.has(track.album.id) && + !usedAlbumIds.has(track.album.id) + ) { + popByAlbum.set(track.album.id, track); + } + } + + const shuffledPopular = Array.from(popByAlbum.values()).sort( + () => Math.random() - 0.5 + ); + const additionalAnchors = shuffledPopular.slice(0, needed); + + for (const track of additionalAnchors) { + (track as any).isLibraryAnchor = true; + usedAlbumIds.add(track.album.id); + } + + libraryAnchors = [...libraryAnchors, ...additionalAnchors]; + console.log( + ` Added ${additionalAnchors.length} popular library tracks as anchors (1 per album)` + ); + } else { + console.log( + ` No additional library tracks available for anchors` + ); + } + } + + console.log( + ` Library anchors: ${libraryAnchors.length}/${anchorCount}` + ); + + // Combine ALL discovery tracks with anchors + let selected = [...discoverySelected, ...libraryAnchors]; + + // Shuffle the final selection to mix anchors with discovery + selected = selected.sort(() => Math.random() - 0.5); + + await this.addBatchLog( + batchId, + "info", + `Playlist built: ${discoverySelected.length} discovery + ${libraryAnchors.length} anchors = ${selected.length} total` + ); + + // Log final result + const target = batch.targetSongCount; // For logging purposes only + if (selected.length === 0) { + console.log(` FAILED: No tracks available for playlist`); + await this.addBatchLog( + batchId, + "error", + `No tracks available for playlist` + ); + } else if (selected.length < target) { + console.log( + ` NOTE: Got ${selected.length} tracks (target was ${target}, including ALL successful downloads)` + ); + await this.addBatchLog( + batchId, + "info", + `Got ${selected.length} tracks (target was ${target})` + ); + } else { + console.log( + ` SUCCESS: Got ${selected.length} tracks (${discoverySelected.length} discovery + ${libraryAnchors.length} anchors)` + ); + } + + // Create discovery records in transaction + let result: { albumCount: number; trackCount: number } | null = null; + try { + result = await prisma.$transaction(async (tx) => { + const createdAlbums = new Map(); + let trackCount = 0; + + for (const track of selected) { + // Use album ID as the key for deduplication (not MBID) + const albumKey = track.album.id; + let discoveryAlbumId = createdAlbums.get(albumKey); + + if (!discoveryAlbumId) { + // Find the job for this album by artist+album name (case-insensitive) + const job = completedJobs.find((j) => { + const metadata = j.metadata as any; + const jobArtist = (metadata?.artistName || "") + .toLowerCase() + .trim(); + const jobAlbum = (metadata?.albumTitle || "") + .toLowerCase() + .trim(); + const trackArtist = track.album.artist.name + .toLowerCase() + .trim(); + const trackAlbum = track.album.title + .toLowerCase() + .trim(); + return ( + jobArtist === trackArtist && + jobAlbum === trackAlbum + ); + }); + + const metadata = job?.metadata as any; + + // Use upsert to handle regeneration (records may already exist) + // IMPORTANT: Use the tier from metadata directly, don't recalculate! + // This preserves "wildcard" and other tiers that don't match their similarity + const storedTier = + metadata?.tier || + getTierFromSimilarity(metadata?.similarity || 0.5); + const storedSimilarity = metadata?.similarity || 0.5; + + // Debug: Log if job wasn't matched + if (!job) { + console.log( + ` [WARN] No job match for: ${track.album.artist.name} - ${track.album.title}` + ); + console.log( + ` Available jobs: ${completedJobs + .map( + (j) => + `${ + (j.metadata as any)?.artistName + } - ${ + (j.metadata as any)?.albumTitle + }` + ) + .slice(0, 5) + .join(", ")}...` + ); + } else { + console.log( + ` ✓ Job matched: ${ + track.album.artist.name + } - ${ + track.album.title + } (tier: ${storedTier}, similarity: ${( + storedSimilarity * 100 + ).toFixed(0)}%)` + ); + } + + const discoveryAlbum = await tx.discoveryAlbum.upsert({ + where: { + userId_weekStartDate_rgMbid: { + userId: batch.userId, + weekStartDate: batch.weekStart, + rgMbid: track.album.rgMbid, + }, + }, + create: { + userId: batch.userId, + rgMbid: track.album.rgMbid, + artistName: track.album.artist.name, + artistMbid: track.album.artist.mbid, + albumTitle: track.album.title, + lidarrAlbumId: job?.lidarrAlbumId, + similarity: storedSimilarity, + tier: storedTier, + weekStartDate: batch.weekStart, + downloadedAt: new Date(), + status: "ACTIVE", + }, + update: { + // Refresh data on regeneration + artistName: track.album.artist.name, + artistMbid: track.album.artist.mbid, + albumTitle: track.album.title, + lidarrAlbumId: job?.lidarrAlbumId, + similarity: storedSimilarity, + tier: storedTier, + downloadedAt: new Date(), + status: "ACTIVE", // Reset to active on regeneration + }, + }); + + discoveryAlbumId = discoveryAlbum.id; + createdAlbums.set(albumKey, discoveryAlbumId); + + // Add to exclusion list (if user has exclusions enabled) + const userConfig = + await tx.userDiscoverConfig.findUnique({ + where: { userId: batch.userId }, + }); + const exclusionMonths = + userConfig?.exclusionMonths ?? 6; + + if (exclusionMonths > 0) { + const expiresAt = new Date(); + expiresAt.setMonth( + expiresAt.getMonth() + exclusionMonths + ); + + await tx.discoverExclusion.upsert({ + where: { + userId_albumMbid: { + userId: batch.userId, + albumMbid: track.album.rgMbid, + }, + }, + create: { + userId: batch.userId, + albumMbid: track.album.rgMbid, + artistName: track.album.artist.name, + albumTitle: track.album.title, + expiresAt, + }, + update: { + lastSuggestedAt: new Date(), + expiresAt, + }, + }); + } + } + + await tx.discoveryTrack.create({ + data: { + discoveryAlbumId, + trackId: track.id, + fileName: track.filePath.split("/").pop() || "", + filePath: track.filePath, + }, + }); + + trackCount++; + } + + // Mark batch complete + await tx.discoveryBatch.update({ + where: { id: batchId }, + data: { + status: "completed", + finalSongCount: trackCount, + completedAt: new Date(), + }, + }); + + return { albumCount: createdAlbums.size, trackCount }; + }); + } catch (txError: any) { + console.error(` ERROR: Transaction failed:`, txError.message); + console.error(` Stack:`, txError.stack); + await this.addBatchLog( + batchId, + "error", + `Transaction failed: ${txError.message}` + ); + } + + if (result) { + console.log( + ` Playlist complete: ${result.trackCount} tracks from ${result.albumCount} albums` + ); + await this.addBatchLog( + batchId, + "info", + `Playlist complete: ${result.trackCount} tracks from ${result.albumCount} albums` + ); + } else { + console.error( + ` ERROR: Transaction returned null - no records created` + ); + await this.addBatchLog( + batchId, + "error", + "Transaction failed - no records created" + ); + } + + // ALWAYS cleanup failed artists from Lidarr (even if playlist creation failed) + // This prevents accumulating unused artists in Lidarr over time + await this.cleanupFailedArtists(batchId); + + // Also cleanup any orphaned Lidarr queue items from this batch + await this.cleanupOrphanedLidarrQueue(batchId); + } + + /** + * Cleanup orphaned Lidarr queue items that belong to this discovery batch + * but are no longer needed (download completed but album not in final playlist) + */ + private async cleanupOrphanedLidarrQueue(batchId: string): Promise { + console.log(`\n[CLEANUP] Checking for orphaned Lidarr queue items...`); + + try { + const batch = await prisma.discoveryBatch.findUnique({ + where: { id: batchId }, + include: { jobs: true }, + }); + + if (!batch) return; + + const settings = await getSystemSettings(); + if ( + !settings?.lidarrEnabled || + !settings?.lidarrUrl || + !settings?.lidarrApiKey + ) { + return; + } + + // Get all download IDs from our batch jobs + const ourDownloadIds = new Set(); + for (const job of batch.jobs) { + if (job.lidarrRef) { + ourDownloadIds.add(job.lidarrRef); + } + } + + if (ourDownloadIds.size === 0) { + console.log(` No download IDs to check`); + return; + } + + // Get Lidarr queue + const { default: axios } = await import("axios"); + const queueResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/queue`, + { + params: { pageSize: 500 }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 30000, + } + ); + + const queueItems = queueResponse.data?.records || []; + let removed = 0; + + for (const item of queueItems) { + const downloadId = item.downloadId; + + // Check if this is one of our downloads + if (downloadId && ourDownloadIds.has(downloadId)) { + // Check if it's in a stuck state + const isStuck = + item.status === "warning" || + item.status === "failed" || + item.trackedDownloadState === "importFailed" || + item.trackedDownloadState === "importBlocked"; + + if (isStuck) { + try { + await axios.delete( + `${settings.lidarrUrl}/api/v1/queue/${item.id}`, + { + params: { + removeFromClient: true, + blocklist: true, + }, + headers: { + "X-Api-Key": settings.lidarrApiKey, + }, + timeout: 10000, + } + ); + console.log( + ` Removed orphaned queue item: ${item.title}` + ); + removed++; + } catch (e) { + // Ignore removal errors + } + } + } + } + + if (removed > 0) { + console.log(` Cleaned up ${removed} orphaned queue item(s)`); + } else { + console.log(` No orphaned queue items found`); + } + } catch (error: any) { + console.error( + `[CLEANUP] Error cleaning orphaned queue:`, + error.message + ); + } + } + + /** + * Cleanup artists from Lidarr that failed during discovery + * Only removes artists that: + * - Had ALL their downloads fail in this batch + * - Don't have any other music in the user's library + * + * NOTE: With tag-based tracking, we simply remove artists with the discovery tag + * who don't have successful downloads. The tag is the source of truth. + */ + private async cleanupFailedArtists(batchId: string): Promise { + console.log( + `\n[CLEANUP] Tag-based cleanup for failed discovery artists...` + ); + + const batch = await prisma.discoveryBatch.findUnique({ + where: { id: batchId }, + include: { jobs: true }, + }); + + if (!batch) return; + + // Build set of artists with successful downloads in this batch + const successfulArtistMbids = new Set(); + for (const job of batch.jobs) { + if (job.status === "completed") { + const metadata = job.metadata as any; + if (metadata?.artistMbid) { + successfulArtistMbids.add(metadata.artistMbid); + } + } + } + + console.log(` ${successfulArtistMbids.size} artists had successful downloads`); + + // Get all artists with the discovery tag + const discoveryArtists = await lidarrService.getDiscoveryArtists(); + console.log(` ${discoveryArtists.length} artists in Lidarr have discovery tag`); + + let removed = 0; + let kept = 0; + + for (const lidarrArtist of discoveryArtists) { + const artistMbid = lidarrArtist.foreignArtistId; + const artistName = lidarrArtist.artistName; + + if (!artistMbid) continue; + + // Keep if artist had successful downloads in this batch + if (successfulArtistMbids.has(artistMbid)) { + kept++; + continue; + } + + // Keep if artist has liked/moved discovery albums + const hasKept = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid, + status: { in: ["LIKED", "MOVED"] }, + }, + }); + + if (hasKept) { + console.log(` Keeping ${artistName} - has liked albums (removing tag)`); + await lidarrService.removeDiscoveryTagByMbid(artistMbid); + kept++; + continue; + } + + // Keep if artist has ACTIVE discovery albums from other weeks + const hasActiveOther = await prisma.discoveryAlbum.findFirst({ + where: { + artistMbid, + status: "ACTIVE", + weekStartDate: { not: batch.weekStart }, + }, + }); + + if (hasActiveOther) { + console.log(` Keeping ${artistName} - has active albums from other batches`); + kept++; + continue; + } + + // Artist has discovery tag, no successful downloads, no liked albums = remove + try { + const result = await lidarrService.deleteArtistById(lidarrArtist.id, true); + if (result.success) { + console.log(` ✓ Removed: ${artistName}`); + removed++; + } + } catch (error: any) { + console.error(` ✗ Failed to remove ${artistName}: ${error.message}`); + } + } + + console.log( + ` Cleanup complete: ${removed} removed, ${kept} kept` + ); + await this.addBatchLog( + batchId, + "info", + `Lidarr cleanup: ${removed} failed artists removed` + ); + } + + /** + * Cleanup extra albums that won't be in the final playlist + * Called when we have more successful downloads than needed + */ + private async cleanupExtraAlbums( + extraJobs: any[], + userId: string + ): Promise { + console.log( + `\n[CLEANUP] Removing ${extraJobs.length} extra albums from Lidarr and filesystem...` + ); + + const { lidarrService } = await import("./lidarr"); + + // Track artists to potentially remove (if they have no other albums) + const artistsToCheck = new Set(); + let albumsRemoved = 0; + let errors = 0; + + for (const job of extraJobs) { + const metadata = job.metadata as any; + const albumMbid = job.targetMbid; + const artistMbid = metadata?.artistMbid; + const albumTitle = metadata?.albumTitle || "Unknown"; + const artistName = metadata?.artistName || "Unknown"; + + try { + // Get Lidarr album ID if we have it + if (job.lidarrAlbumId) { + // Delete the album from Lidarr (with files) + const result = await lidarrService.deleteAlbum( + job.lidarrAlbumId, + true + ); + if (result.success) { + console.log( + ` ✓ Removed: ${artistName} - ${albumTitle}` + ); + albumsRemoved++; + + // Track artist for potential cleanup + if (artistMbid) { + artistsToCheck.add(artistMbid); + } + } else { + console.log( + ` - Skip: ${artistName} - ${albumTitle} (${result.message})` + ); + } + } else { + console.log( + ` - Skip: ${artistName} - ${albumTitle} (no Lidarr ID)` + ); + } + + // Mark the job as cancelled (not used in playlist) + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "cancelled", + error: "Extra album - not needed for playlist", + completedAt: new Date(), + }, + }); + } catch (error: any) { + console.error( + ` ✗ Error: ${artistName} - ${albumTitle}: ${error.message}` + ); + errors++; + } + } + + // Check if any artists now have no albums and should be removed + for (const artistMbid of artistsToCheck) { + try { + // Check if artist has any remaining albums in Lidarr + const albums = await lidarrService.getArtistAlbums(artistMbid); + + // Check if artist has native library content (real user library) + const hasNativeOwnedAlbums = await prisma.ownedAlbum.findFirst({ + where: { + artist: { mbid: artistMbid }, + source: "native_scan", + }, + }); + + if (!albums || (albums.length === 0 && !hasNativeOwnedAlbums)) { + // No albums left, remove artist + const result = await lidarrService.deleteArtist( + artistMbid, + true + ); + if (result.success) { + console.log(` ✓ Removed empty artist: ${artistMbid}`); + } + } + } catch (error) { + // Ignore errors when checking/removing artists + } + } + + console.log( + ` Extra album cleanup: ${albumsRemoved} removed, ${errors} errors` + ); + } + + /** + * Get seed artists from listening history + */ + private async getSeedArtists(userId: string): Promise { + const fourWeeksAgo = subWeeks(new Date(), 4); + + const recentPlays = await prisma.play.groupBy({ + by: ["trackId"], + where: { + userId, + playedAt: { gte: fourWeeksAgo }, + source: { in: ["LIBRARY", "DISCOVERY_KEPT"] }, + }, + _count: { id: true }, + orderBy: { _count: { id: "desc" } }, + take: 50, + }); + + if (recentPlays.length < 5) { + // Fallback to library - get artists with most albums + const albums = await prisma.album.groupBy({ + by: ["artistId"], + where: { location: "LIBRARY" }, + _count: { id: true }, + orderBy: { _count: { id: "desc" } }, + take: 10, + }); + + const artists = await prisma.artist.findMany({ + where: { id: { in: albums.map((a) => a.artistId) } }, + }); + + return artists.map((a) => ({ name: a.name, mbid: a.mbid })); + } + + const tracks = await prisma.track.findMany({ + where: { + id: { in: recentPlays.map((p) => p.trackId) }, + // Only include tracks from LIBRARY albums, not DISCOVER + album: { location: "LIBRARY" }, + }, + include: { album: { include: { artist: true } } }, + }); + + const artistMap = new Map(); + for (const track of tracks) { + if (!artistMap.has(track.album.artistId)) { + artistMap.set(track.album.artistId, track.album.artist); + } + } + + const artists = Array.from(artistMap.values()).slice(0, 10); + return artists.map((a: any) => ({ name: a.name, mbid: a.mbid })); + } + + /** + * Check if an artist is already in the user's library + * Discovery should find NEW artists, not more albums from artists they already own + */ + private async isArtistInLibrary( + artistName: string, + artistMbid: string | undefined + ): Promise { + // Check by MBID first (most accurate) + if (artistMbid && !artistMbid.startsWith("temp-")) { + const byMbid = await prisma.artist.findFirst({ + where: { mbid: artistMbid }, + include: { albums: { take: 1 } }, + }); + if (byMbid && byMbid.albums.length > 0) { + console.log( + ` [LIBRARY] ${artistName} IN LIBRARY (matched by MBID, ${byMbid.albums.length} album(s))` + ); + return true; + } + } + + // Check by name (case insensitive) + const byName = await prisma.artist.findFirst({ + where: { + name: { equals: artistName, mode: "insensitive" }, + }, + include: { albums: { take: 1 } }, + }); + + if (byName !== null && byName.albums.length > 0) { + console.log( + ` [LIBRARY] ${artistName} IN LIBRARY (matched by name, ${byName.albums.length} album(s))` + ); + return true; + } + + return false; + } + + /** + * Check if an album is owned by artist name + album title + * This catches cases where the MBID doesn't match but the album exists + */ + private async isAlbumOwnedByName( + artistName: string, + albumTitle: string + ): Promise { + // Normalize for comparison + const normalizedArtist = artistName.toLowerCase().trim(); + const normalizedAlbum = albumTitle + .toLowerCase() + .replace(/\(.*?\)/g, "") // Remove parenthetical content + .replace(/\[.*?\]/g, "") // Remove bracketed content + .replace( + /[-–—]\s*(deluxe|remaster|bonus|special|anniversary|expanded|limited|collector).*$/i, + "" + ) + .trim(); + + // Check Album table by name + const album = await prisma.album.findFirst({ + where: { + title: { contains: normalizedAlbum, mode: "insensitive" }, + artist: { + name: { contains: normalizedArtist, mode: "insensitive" }, + }, + }, + }); + if (album) { + console.log( + ` [OWNED-NAME] Found "${albumTitle}" by "${artistName}" in Album table` + ); + return true; + } + + // Check OwnedAlbum by looking up associated Album records through rgMbid + const ownedAlbumRefs = await prisma.ownedAlbum.findMany({ + where: { + artist: { + name: { contains: normalizedArtist, mode: "insensitive" }, + }, + }, + select: { rgMbid: true }, + }); + + // Look up the actual album titles for these owned albums + if (ownedAlbumRefs.length > 0) { + const rgMbids = ownedAlbumRefs.map((o) => o.rgMbid); + const ownedAlbumRecords = await prisma.album.findMany({ + where: { rgMbid: { in: rgMbids } }, + select: { title: true }, + }); + + for (const owned of ownedAlbumRecords) { + const ownedNormalized = owned.title + ?.toLowerCase() + .replace(/\(.*?\)/g, "") + .replace(/\[.*?\]/g, "") + .trim(); + if ( + ownedNormalized && + (ownedNormalized.includes(normalizedAlbum) || + normalizedAlbum.includes(ownedNormalized)) + ) { + console.log( + ` [OWNED-NAME] Found "${albumTitle}" by "${artistName}" in OwnedAlbum table` + ); + return true; + } + } + } + + return false; + } + + /** + * Check if an album is already owned + */ + private async isAlbumOwned( + albumMbid: string, + userId: string + ): Promise { + // Check OwnedAlbum table + const ownedAlbum = await prisma.ownedAlbum.findFirst({ + where: { rgMbid: albumMbid }, + }); + if (ownedAlbum) return true; + + // Check Album table + const existingAlbum = await prisma.album.findFirst({ + where: { rgMbid: albumMbid }, + }); + if (existingAlbum) return true; + + // Check previous discovery + const previousDiscovery = await prisma.discoveryAlbum.findFirst({ + where: { rgMbid: albumMbid, userId }, + }); + if (previousDiscovery) return true; + + // Check pending downloads + const pendingDownload = await prisma.downloadJob.findFirst({ + where: { + targetMbid: albumMbid, + status: { in: ["pending", "processing"] }, + }, + }); + if (pendingDownload) return true; + + // Check Lidarr + const inLidarr = await lidarrService.isAlbumAvailable(albumMbid); + if (inLidarr) return true; + + return false; + } + + /** + * Check if album was recommended recently (6 months) + */ + private async isAlbumExcluded( + albumMbid: string, + userId: string + ): Promise { + const exclusion = await prisma.discoverExclusion.findFirst({ + where: { + userId, + albumMbid, + expiresAt: { gt: new Date() }, + }, + }); + return !!exclusion; + } + + /** + * Find a replacement album when download fails after all retries. + * Uses multi-tier fallback prioritizing ARTIST DIVERSITY: + * - Tier 2: Album from DIFFERENT similar artist (prioritize diversity!) + * - Tier 3: Another album from SAME artist (last resort fallback) + */ + async findReplacementAlbum( + failedJob: any, + batch: any + ): Promise<{ + artistName: string; + artistMbid: string; + albumTitle: string; + albumMbid: string; + similarity: number; + } | null> { + const metadata = failedJob.metadata as any; + const failedArtistMbid = metadata?.artistMbid; + + console.log( + `[Discovery] Finding replacement for: ${metadata?.artistName} - ${metadata?.albumTitle}` + ); + + // Get all MBIDs and ARTIST MBIDs already attempted in this batch (for diversity tracking) + const attemptedMbids = new Set(); + const attemptedArtistMbids = new Set(); + const batchJobs = await prisma.downloadJob.findMany({ + where: { discoveryBatchId: batch.id }, + }); + for (const job of batchJobs) { + attemptedMbids.add(job.targetMbid); + const jobMeta = job.metadata as any; + if (jobMeta?.artistMbid) { + attemptedArtistMbids.add(jobMeta.artistMbid); + } + } + + console.log( + `[Discovery] Already have ${attemptedArtistMbids.size} artists in batch, prioritizing new artists` + ); + + // Tier 2: Try album from DIFFERENT similar artist - search ALL seeds with more similar artists + // IMPORTANT: Never pick same artist twice for diversity! + console.log( + `[Discovery] Tier 2: Searching ALL seeds for albums from NEW artists (diversity enforced)` + ); + const seeds = await this.getSeedArtists(batch.userId); + + // Search ALL seeds (not just 5) to maximize chances of finding new artists + for (const seed of seeds) { + if (!seed.mbid) continue; + + try { + // Get MORE similar artists per seed (30 instead of 15) + const similarArtists = await lastFmService.getSimilarArtists( + seed.mbid, + seed.name, + 30 + ); + + for (const similar of similarArtists) { + // Skip artists we already have in this batch (including the failed artist) + if (!similar.mbid) continue; + if (similar.mbid === failedArtistMbid) continue; + if (attemptedArtistMbids.has(similar.mbid)) { + continue; // Skip - we already have an album from this artist + } + + // Get more albums to increase chances of finding available one + const albums = await lastFmService.getArtistTopAlbums( + similar.mbid, + similar.name, + 5 + ); + + for (const album of albums) { + // Get MBID from MusicBrainz + const mbAlbum = await musicBrainzService.searchAlbum( + album.name, + similar.name + ); + + if (mbAlbum && !attemptedMbids.has(mbAlbum.id)) { + // Check if artist is already in library (Discovery = NEW artists only!) + try { + const artistInLibrary = + await this.isArtistInLibrary( + similar.name, + similar.mbid + ); + if (artistInLibrary) { + console.log( + `[Discovery] Skipping ${similar.name} - already in library` + ); + continue; + } + } catch (e: any) { + console.error( + `[Discovery] isArtistInLibrary error for ${similar.name}: ${e.message}` + ); + // Continue anyway - assume not in library if check fails + } + + // Check if owned + try { + const owned = await this.isAlbumOwned( + mbAlbum.id, + batch.userId + ); + if (owned) continue; + } catch (e: any) { + console.error( + `[Discovery] isAlbumOwned error: ${e.message}` + ); + continue; // Skip on error + } + + // Check if excluded + try { + const excluded = await this.isAlbumExcluded( + mbAlbum.id, + batch.userId + ); + if (excluded) continue; + } catch (e: any) { + console.error( + `[Discovery] isAlbumExcluded error: ${e.message}` + ); + continue; // Skip on error + } + + console.log( + `[Discovery] Tier 2 replacement found: ${album.name} by ${similar.name} (NEW artist!)` + ); + return { + artistName: similar.name, + artistMbid: similar.mbid, + albumTitle: album.name, + albumMbid: mbAlbum.id, + similarity: similar.match || 0.5, + }; + } + } + } + } catch (e) { + continue; + } + } + + // NOTE: Same-artist fallback REMOVED - we enforce strict one-album-per-artist + // If we can't find a new artist, go straight to library anchor + console.log( + `[Discovery] No new artists found, using library anchor (diversity enforced)` + ); + + // Tier 3: Use track from user's library as anchor (related to discovery seeds) + console.log( + `[Discovery] Tier 3: Selecting anchor track from user's library (seed artists)` + ); + try { + // Get a random album from seed artists that user already owns + for (const seed of seeds.slice(0, 5)) { + const ownedAlbum = await prisma.album.findFirst({ + where: { + artist: { + OR: [ + { mbid: seed.mbid || "___none___" }, + { + name: { + equals: seed.name, + mode: "insensitive", + }, + }, + ], + }, + tracks: { some: {} }, // Has tracks + }, + include: { artist: true }, + }); + + if ( + ownedAlbum && + ownedAlbum.rgMbid && + !attemptedMbids.has(ownedAlbum.rgMbid) + ) { + console.log( + `[Discovery] Tier 3 anchor found: ${ownedAlbum.artist.name} - ${ownedAlbum.title} (from library)` + ); + return { + artistName: ownedAlbum.artist.name, + artistMbid: ownedAlbum.artist.mbid, + albumTitle: ownedAlbum.title, + albumMbid: ownedAlbum.rgMbid, + similarity: 1.0, // Library = perfect match + isLibraryAnchor: true, // Flag so we know not to download + } as any; + } + } + } catch (e) { + console.log( + `[Discovery] Tier 3 search failed: ${(e as Error).message}` + ); + } + + console.log(`[Discovery] No replacement found`); + return null; + } + + /** + * Find recommended albums using pre-cached similar artists + * TWO-PASS APPROACH: + * 1. First pass: Prioritize NEW artists (not in library) + * 2. Second pass: Fall back to existing artists if needed + */ + private async findRecommendedAlbums( + seeds: SeedArtist[], + similarCache: Map, + targetCount: number, + userId: string + ): Promise { + const recommendations: RecommendedAlbum[] = []; + const seenArtists = new Set(); + const seenAlbums = new Set(); + const existingArtistsForFallback: any[] = []; // Artists in library saved for second pass + + console.log(`\n Finding ${targetCount} recommended albums...`); + console.log(` Seeds: ${seeds.map((s) => s.name).join(", ")}`); + + let totalSimilarArtists = 0; + let totalAlbumsChecked = 0; + let skippedNoMbid = 0; + let skippedOwned = 0; + let skippedExcluded = 0; + let skippedDuplicate = 0; + let skippedArtistInLibrary = 0; + let addedFromExistingArtists = 0; + + // Collect all similar artists from all seeds + const allSimilarArtists: any[] = []; + for (const seed of seeds) { + const similar = similarCache.get(seed.mbid || seed.name) || []; + for (const sim of similar) { + allSimilarArtists.push(sim); + } + } + console.log( + ` Total similar artists from all seeds: ${allSimilarArtists.length}` + ); + + // ============================================ + // PASS 1: NEW ARTISTS ONLY (true discovery) + // ============================================ + console.log(`\n === PASS 1: NEW Artists Only ===`); + + for (const sim of allSimilarArtists) { + if (recommendations.length >= targetCount) break; + + const key = sim.name.toLowerCase(); + if (seenArtists.has(key)) continue; + seenArtists.add(key); + totalSimilarArtists++; + + // Check if artist is in library + let artistInLibrary = false; + try { + artistInLibrary = await this.isArtistInLibrary( + sim.name, + sim.mbid + ); + } catch (e: any) { + console.error( + ` isArtistInLibrary ERROR for ${sim.name}: ${e.message}` + ); + } + + if (artistInLibrary) { + skippedArtistInLibrary++; + existingArtistsForFallback.push(sim); // Save for second pass + continue; + } + + // Process albums for this NEW artist + const album = await this.findValidAlbumForArtist( + sim, + userId, + seenAlbums + ); + if (album) { + totalAlbumsChecked += album.albumsChecked; + skippedNoMbid += album.skippedNoMbid; + skippedOwned += album.skippedOwned; + skippedExcluded += album.skippedExcluded; + skippedDuplicate += album.skippedDuplicate; + + if (album.recommendation) { + recommendations.push(album.recommendation); + console.log( + ` ✓ ADDED (NEW): ${sim.name} - ${album.recommendation.albumTitle}` + ); + } + } + } + + console.log( + ` Pass 1 complete: ${recommendations.length}/${targetCount} from NEW artists` + ); + + // ============================================ + // PASS 2: EXISTING ARTISTS (fallback if needed) + // ============================================ + if ( + recommendations.length < targetCount && + existingArtistsForFallback.length > 0 + ) { + console.log(`\n === PASS 2: Existing Artists (fallback) ===`); + console.log( + ` Need ${targetCount - recommendations.length} more, have ${ + existingArtistsForFallback.length + } existing artists to try` + ); + + for (const sim of existingArtistsForFallback) { + if (recommendations.length >= targetCount) break; + + // Process albums for this EXISTING artist (find new albums they don't own) + const album = await this.findValidAlbumForArtist( + sim, + userId, + seenAlbums + ); + if (album) { + totalAlbumsChecked += album.albumsChecked; + skippedNoMbid += album.skippedNoMbid; + skippedOwned += album.skippedOwned; + skippedExcluded += album.skippedExcluded; + skippedDuplicate += album.skippedDuplicate; + + if (album.recommendation) { + recommendations.push(album.recommendation); + addedFromExistingArtists++; + console.log( + ` ✓ ADDED (EXISTING): ${sim.name} - ${album.recommendation.albumTitle}` + ); + } + } + } + + console.log( + ` Pass 2 complete: Added ${addedFromExistingArtists} from existing artists` + ); + } + + // Summary logging + console.log(`\n === Recommendation Summary ===`); + console.log(` Similar artists checked: ${totalSimilarArtists}`); + console.log( + ` Artists already in library (fallback pool): ${skippedArtistInLibrary}` + ); + console.log(` Albums checked: ${totalAlbumsChecked}`); + console.log(` Skipped (no MBID from MusicBrainz): ${skippedNoMbid}`); + console.log(` Skipped (album already owned): ${skippedOwned}`); + console.log( + ` Skipped (excluded - recently recommended): ${skippedExcluded}` + ); + console.log(` Skipped (duplicate): ${skippedDuplicate}`); + console.log(` ✓ Found ${recommendations.length} albums total`); + console.log( + ` - ${ + recommendations.length - addedFromExistingArtists + } from NEW artists` + ); + console.log( + ` - ${addedFromExistingArtists} from EXISTING artists (fallback)` + ); + + if (recommendations.length === 0 && totalSimilarArtists === 0) { + console.log( + ` [WARN] No similar artists found! Check Last.fm API configuration.` + ); + } else if (recommendations.length === 0 && totalAlbumsChecked === 0) { + console.log( + ` [WARN] No albums returned from Last.fm! Check getArtistTopAlbums.` + ); + } else if ( + recommendations.length === 0 && + skippedNoMbid === totalAlbumsChecked + ) { + console.log( + ` [WARN] All albums failed MusicBrainz lookup! Check searchAlbum.` + ); + } else if ( + recommendations.length === 0 && + skippedOwned >= totalAlbumsChecked + ) { + console.log( + ` [WARN] All albums already owned! Need more variety in similar artists.` + ); + } + + return recommendations; + } + + /** + * Helper: Find a valid album for a given artist + * Returns the first album that passes all checks (owned, excluded, etc.) + */ + private async findValidAlbumForArtist( + artist: any, + userId: string, + seenAlbums: Set + ): Promise<{ + recommendation: RecommendedAlbum | null; + albumsChecked: number; + skippedNoMbid: number; + skippedOwned: number; + skippedExcluded: number; + skippedDuplicate: number; + }> { + let albumsChecked = 0; + let skippedNoMbid = 0; + let skippedOwned = 0; + let skippedExcluded = 0; + let skippedDuplicate = 0; + + // Patterns to exclude non-studio releases + const EXCLUDE_PATTERNS = [ + /\blive\b/i, + /\bep\b$/i, // Only at end of title + /\bacoustic\b/i, + /\bsession[s]?\b/i, + /\bcompilation\b/i, + /\bgreatest\s*hits\b/i, + /\bbest\s*of\b/i, + /\bremix(es|ed)?\b/i, + /\bunplugged\b/i, + /\bcollection\b/i, + /\banthology\b/i, + /\bdemo[s]?\b/i, + ]; + + const isStudioAlbum = (title: string): boolean => { + return !EXCLUDE_PATTERNS.some((pattern) => pattern.test(title)); + }; + + try { + // Get 10 albums per artist (was 5) to increase chances of finding available content + const topAlbums = await lastFmService.getArtistTopAlbums( + artist.mbid || "", + artist.name, + 10 + ); + + if (topAlbums.length === 0) { + return { + recommendation: null, + albumsChecked: 0, + skippedNoMbid: 0, + skippedOwned: 0, + skippedExcluded: 0, + skippedDuplicate: 0, + }; + } + + for (const album of topAlbums) { + albumsChecked++; + + // Skip non-studio albums (live, compilations, EPs, etc.) + if (!isStudioAlbum(album.name)) { + continue; + } + + // Get MBID from MusicBrainz + const mbAlbum = await musicBrainzService.searchAlbum( + album.name, + artist.name + ); + + if (!mbAlbum) { + skippedNoMbid++; + continue; + } + + // Skip duplicates + if (seenAlbums.has(mbAlbum.id)) { + skippedDuplicate++; + continue; + } + seenAlbums.add(mbAlbum.id); + + // Skip if owned by MBID + try { + const owned = await this.isAlbumOwned(mbAlbum.id, userId); + if (owned) { + skippedOwned++; + continue; + } + } catch (e: any) { + continue; + } + + // Skip if owned by name (catches MBID mismatches) + try { + const ownedByName = await this.isAlbumOwnedByName( + artist.name, + album.name + ); + if (ownedByName) { + skippedOwned++; + continue; + } + } catch (e: any) { + continue; + } + + // Check if album was recently recommended (exclusion period) + try { + const excluded = await this.isAlbumExcluded( + mbAlbum.id, + userId + ); + if (excluded) { + skippedExcluded++; + continue; + } + } catch (e: any) { + continue; + } + + // Found a valid album! + return { + recommendation: { + artistName: artist.name, + artistMbid: artist.mbid, + albumTitle: album.name, + albumMbid: mbAlbum.id, + similarity: artist.match || 0.5, + }, + albumsChecked, + skippedNoMbid, + skippedOwned, + skippedExcluded, + skippedDuplicate, + }; + } + } catch (error: any) { + console.warn( + ` Failed to get albums for ${artist.name}: ${error.message}` + ); + } + + return { + recommendation: null, + albumsChecked, + skippedNoMbid, + skippedOwned, + skippedExcluded, + skippedDuplicate, + }; + } + + // ============================================ + // MULTI-STRATEGY DISCOVERY ENGINE + // Rotates weekly to keep recommendations fresh + // ============================================ + + /** + * Get user's top genres from listening history + */ + private async getUserTopGenres(userId: string): Promise { + try { + // Get recent plays with artist info + const recentPlays = await prisma.play.findMany({ + where: { + userId, + playedAt: { gte: subWeeks(new Date(), 12) }, // Last 3 months + }, + include: { + track: { + include: { + album: { + include: { artist: true }, + }, + }, + }, + }, + take: 500, + }); + + // Collect genres from artists (stored as tags) + const genreCounts = new Map(); + + for (const play of recentPlays) { + const artist = play.track?.album?.artist; + if (artist?.genres) { + const genres = Array.isArray(artist.genres) + ? artist.genres + : ((artist.genres as string) || "") + .split(",") + .map((g: string) => g.trim()); + + for (const genre of genres) { + if (genre && typeof genre === "string") { + genreCounts.set( + genre.toLowerCase(), + (genreCounts.get(genre.toLowerCase()) || 0) + 1 + ); + } + } + } + } + + // Sort by count and return top genres + return Array.from(genreCounts.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, 10) + .map(([genre]) => genre); + } catch (error) { + console.error("Error getting user genres:", error); + return []; + } + } + + /** + * TAG EXPLORATION STRATEGY + * Find albums by the user's top genre tags via Last.fm + */ + private async tagExplorationStrategy( + userId: string, + targetCount: number, + seenAlbums: Set + ): Promise { + console.log( + `\n[STRATEGY] Tag Exploration - finding studio albums by genre` + ); + + const recommendations: RecommendedAlbum[] = []; + const genres = await this.getUserTopGenres(userId); + + // Patterns to exclude non-studio releases + const EXCLUDE_PATTERNS = [ + /\blive\b/i, + /\bep\b$/i, + /\bacoustic\b/i, + /\bsession[s]?\b/i, + /\bcompilation\b/i, + /\bgreatest\s*hits\b/i, + /\bbest\s*of\b/i, + /\bremix(es|ed)?\b/i, + /\bunplugged\b/i, + /\bcollection\b/i, + /\banthology\b/i, + /\bdemo[s]?\b/i, + ]; + + const isStudioAlbum = (title: string): boolean => { + return !EXCLUDE_PATTERNS.some((pattern) => pattern.test(title)); + }; + + if (genres.length === 0) { + console.log(` No genres found for user, using fallback tags`); + genres.push("rock", "indie", "alternative"); // Fallback + } + + console.log(` User's top genres: ${genres.slice(0, 5).join(", ")}`); + + for (const genre of genres.slice(0, 5)) { + if (recommendations.length >= targetCount) break; + + try { + // Use Last.fm's getTopAlbumsByTag + const tagAlbums = await lastFmService.getTopAlbumsByTag( + genre, + 30 + ); + + for (const album of tagAlbums) { + if (recommendations.length >= targetCount) break; + + const artistName = album.artist?.name || album.artist; + if (!artistName || !album.name) continue; + + // Skip non-studio albums + if (!isStudioAlbum(album.name)) continue; + + // Get MBID from MusicBrainz + const mbAlbum = await musicBrainzService.searchAlbum( + album.name, + artistName + ); + if (!mbAlbum || seenAlbums.has(mbAlbum.id)) continue; + + // Check if owned by MBID + const owned = await this.isAlbumOwned(mbAlbum.id, userId); + if (owned) continue; + + // Check if owned by name (catches MBID mismatches) + const ownedByName = await this.isAlbumOwnedByName( + artistName, + album.name + ); + if (ownedByName) continue; + + // Check if album was recently recommended (exclusion period) + const excluded = await this.isAlbumExcluded( + mbAlbum.id, + userId + ); + if (excluded) continue; + + // Check if artist is in library (prefer new artists) + const inLibrary = await this.isArtistInLibrary( + artistName, + undefined + ); + if (inLibrary) continue; + + seenAlbums.add(mbAlbum.id); + recommendations.push({ + artistName, + albumTitle: album.name, + albumMbid: mbAlbum.id, + similarity: 0.7, // Tag-based discovery + tier: "wildcard", + }); + console.log( + ` ✓ TAG: ${artistName} - ${album.name} (${genre})` + ); + } + } catch (error: any) { + console.warn( + ` Tag search failed for ${genre}: ${error.message}` + ); + } + } + + console.log( + ` Tag exploration found ${recommendations.length} albums` + ); + return recommendations; + } + + /** + * Main recommendation engine with tier-based selection + * Combines similar artists (by tier) + genre wildcards for variety + * + * Distribution: + * - 30% HIGH tier (>70% similar) + * - 40% MEDIUM tier (50-70% similar) + * - 20% EXPLORE tier (30-50% similar) + * - 10% WILDCARD (genre tags) + */ + async findRecommendedAlbumsMultiStrategy( + seeds: SeedArtist[], + similarCache: Map, + targetCount: number, + userId: string + ): Promise { + const seenAlbums = new Set(); + const seenArtists = new Set(); + const recommendations: RecommendedAlbum[] = []; + + console.log(`\n[DISCOVERY] Tier-Based Selection`); + console.log(` Target: ${targetCount} albums`); + console.log( + ` Distribution: 30% high, 40% medium, 20% explore, 10% wildcard` + ); + + // Calculate counts for each tier + const wildcardCount = Math.max( + 1, + Math.ceil(targetCount * TIER_DISTRIBUTION.wildcard) + ); + const similarArtistTarget = targetCount - wildcardCount; + + const highCount = Math.ceil( + similarArtistTarget * (TIER_DISTRIBUTION.high / 0.9) + ); + const mediumCount = Math.ceil( + similarArtistTarget * (TIER_DISTRIBUTION.medium / 0.9) + ); + const exploreCount = similarArtistTarget - highCount - mediumCount; + + console.log( + ` Targets: ${highCount} high, ${mediumCount} medium, ${exploreCount} explore, ${wildcardCount} wildcard` + ); + + // Collect all similar artists from all seeds + const allSimilarArtists: any[] = []; + for (const seed of seeds) { + const similar = similarCache.get(seed.mbid || seed.name) || []; + for (const sim of similar) { + allSimilarArtists.push(sim); + } + } + + // Group similar artists by tier (based on Last.fm match score) + // Thresholds adjusted for better distribution (Last.fm returns 0.5-0.9 range typically) + const byTier = { + high: allSimilarArtists.filter((a) => (a.match || 0) >= 0.7), + medium: allSimilarArtists.filter( + (a) => (a.match || 0) >= 0.5 && (a.match || 0) < 0.7 + ), + explore: allSimilarArtists.filter( + (a) => (a.match || 0) >= 0.3 && (a.match || 0) < 0.5 + ), + }; + + console.log( + ` Available: ${byTier.high.length} high, ${byTier.medium.length} medium, ${byTier.explore.length} explore` + ); + + // Debug: Show top artists from each tier with their match scores + if (byTier.high.length > 0) { + console.log( + ` HIGH tier sample: ${byTier.high + .slice(0, 3) + .map((a) => `${a.name}(${(a.match * 100).toFixed(0)}%)`) + .join(", ")}` + ); + } + if (byTier.medium.length > 0) { + console.log( + ` MEDIUM tier sample: ${byTier.medium + .slice(0, 3) + .map((a) => `${a.name}(${(a.match * 100).toFixed(0)}%)`) + .join(", ")}` + ); + } + if (byTier.explore.length > 0) { + console.log( + ` EXPLORE tier sample: ${byTier.explore + .slice(0, 3) + .map((a) => `${a.name}(${(a.match * 100).toFixed(0)}%)`) + .join(", ")}` + ); + } + + // Shuffle each tier for variety week-to-week + const shuffle = (arr: T[]): T[] => + [...arr].sort(() => Math.random() - 0.5); + byTier.high = shuffle(byTier.high); + byTier.medium = shuffle(byTier.medium); + byTier.explore = shuffle(byTier.explore); + + // Helper to select from a tier + const selectFromTier = async ( + tier: any[], + count: number, + tierName: "high" | "medium" | "explore" + ): Promise => { + const selected: RecommendedAlbum[] = []; + + for (const artist of tier) { + if (selected.length >= count) break; + + const key = artist.name.toLowerCase(); + if (seenArtists.has(key)) continue; + + // Check if artist is in library (prefer NEW artists) + let artistInLibrary = false; + try { + artistInLibrary = await this.isArtistInLibrary( + artist.name, + artist.mbid + ); + } catch (e) { + // Continue on error + } + + if (artistInLibrary) { + console.log(` [SKIP] ${artist.name} - in library`); + continue; + } + + // Find a valid album for this artist + const result = await this.findValidAlbumForArtist( + artist, + userId, + seenAlbums + ); + + if (result.recommendation) { + seenArtists.add(key); + result.recommendation.tier = tierName; + // Use the artist's actual match score for similarity + result.recommendation.similarity = + artist.match || result.recommendation.similarity; + selected.push(result.recommendation); + console.log( + ` ✓ [${tierName.toUpperCase()}] ${artist.name} - ${ + result.recommendation.albumTitle + } (${((artist.match || 0) * 100).toFixed(0)}%)` + ); + } + } + + return selected; + }; + + // Select from each tier + console.log(`\n === Selecting from HIGH tier ===`); + const highPicks = await selectFromTier(byTier.high, highCount, "high"); + recommendations.push(...highPicks); + + console.log(`\n === Selecting from MEDIUM tier ===`); + const mediumPicks = await selectFromTier( + byTier.medium, + mediumCount, + "medium" + ); + recommendations.push(...mediumPicks); + + console.log(`\n === Selecting from EXPLORE tier ===`); + const explorePicks = await selectFromTier( + byTier.explore, + exploreCount, + "explore" + ); + recommendations.push(...explorePicks); + + // If we didn't get enough from tiered selection, fill with any available NEW artists + if (recommendations.length < similarArtistTarget) { + console.log( + `\n === Filling remaining slots (NEW artists only) ===` + ); + const remaining = similarArtistTarget - recommendations.length; + const allRemaining = [ + ...byTier.high, + ...byTier.medium, + ...byTier.explore, + ].filter((a) => !seenArtists.has(a.name.toLowerCase())); + + for (const artist of shuffle(allRemaining)) { + if (recommendations.length >= similarArtistTarget) break; + + const key = artist.name.toLowerCase(); + if (seenArtists.has(key)) continue; + + // Check if artist is in library (same as tier selection) + let artistInLibrary = false; + try { + artistInLibrary = await this.isArtistInLibrary( + artist.name, + artist.mbid + ); + } catch (e) { + // Continue on error + } + + if (artistInLibrary) { + console.log(` [SKIP] ${artist.name} - in library`); + continue; + } + + const result = await this.findValidAlbumForArtist( + artist, + userId, + seenAlbums + ); + if (result.recommendation) { + seenArtists.add(key); + // Use the artist's actual match score for tier assignment + result.recommendation.tier = getTierFromSimilarity( + artist.match || result.recommendation.similarity + ); + // Also update similarity to use actual match score + result.recommendation.similarity = + artist.match || result.recommendation.similarity; + recommendations.push(result.recommendation); + console.log( + ` ✓ [FILL] ${artist.name} - ${ + result.recommendation.albumTitle + } (${(artist.match * 100).toFixed(0)}%)` + ); + } + } + } + + // FALLBACK: If still not enough, allow existing artists with NEW albums + if (recommendations.length < similarArtistTarget) { + console.log( + `\n === FALLBACK: Existing artists with NEW albums ===` + ); + console.log( + ` Need ${ + similarArtistTarget - recommendations.length + } more recommendations` + ); + + const allRemaining = [ + ...byTier.high, + ...byTier.medium, + ...byTier.explore, + ].filter((a) => !seenArtists.has(a.name.toLowerCase())); + + for (const artist of shuffle(allRemaining)) { + if (recommendations.length >= similarArtistTarget) break; + + const key = artist.name.toLowerCase(); + if (seenArtists.has(key)) continue; + + // This time we ALLOW artists in library - we just want NEW albums from them + const result = await this.findValidAlbumForArtist( + artist, + userId, + seenAlbums + ); + if (result.recommendation) { + seenArtists.add(key); + result.recommendation.tier = getTierFromSimilarity( + artist.match || result.recommendation.similarity + ); + result.recommendation.similarity = + artist.match || result.recommendation.similarity; + recommendations.push(result.recommendation); + console.log( + ` ✓ [EXISTING] ${artist.name} - ${ + result.recommendation.albumTitle + } (${((artist.match || 0) * 100).toFixed(0)}%)` + ); + } + } + } + + // Add genre wildcards for variety + console.log( + `\n === Adding ${wildcardCount} WILDCARD picks from genre tags ===` + ); + const wildcards = await this.tagExplorationStrategy( + userId, + wildcardCount, + seenAlbums + ); + for (const wc of wildcards) { + wc.tier = "wildcard"; + recommendations.push(wc); + } + + // Summary + const tierCounts = { + high: recommendations.filter((r) => r.tier === "high").length, + medium: recommendations.filter((r) => r.tier === "medium").length, + explore: recommendations.filter((r) => r.tier === "explore").length, + wildcard: recommendations.filter((r) => r.tier === "wildcard") + .length, + }; + + console.log(`\n[DISCOVERY] Final: ${recommendations.length} albums`); + console.log( + ` High: ${tierCounts.high}, Medium: ${tierCounts.medium}, Explore: ${tierCounts.explore}, Wildcard: ${tierCounts.wildcard}` + ); + + return recommendations.slice(0, targetCount); + } +} + +export const discoverWeeklyService = new DiscoverWeeklyService(); diff --git a/backend/src/services/discoveryLogger.ts b/backend/src/services/discoveryLogger.ts new file mode 100644 index 0000000..2d52817 --- /dev/null +++ b/backend/src/services/discoveryLogger.ts @@ -0,0 +1,226 @@ +import * as fs from "fs"; +import * as path from "path"; + +/** + * Discovery Logger - Creates detailed log files for each discovery playlist generation + */ +class DiscoveryLogger { + private logDir: string; + private currentLogFile: string | null = null; + private currentStream: fs.WriteStream | null = null; + + constructor() { + // Store logs in /app/logs/discovery (matches Dockerfile directory) + this.logDir = process.env.NODE_ENV === "production" + ? "/app/logs/discovery" + : path.join(process.cwd(), "data", "logs", "discovery"); + } + + /** + * Start a new log file for a discovery generation + */ + start(userId: string, jobId?: number): string { + // Ensure log directory exists + if (!fs.existsSync(this.logDir)) { + fs.mkdirSync(this.logDir, { recursive: true }); + } + + // Create filename with timestamp + const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); + const filename = `discovery-${timestamp}-job${jobId || "manual"}.log`; + this.currentLogFile = path.join(this.logDir, filename); + + // Open write stream + this.currentStream = fs.createWriteStream(this.currentLogFile, { flags: "a" }); + + // Write header + this.write("═".repeat(60)); + this.write(`DISCOVERY WEEKLY GENERATION LOG`); + this.write(`Started: ${new Date().toISOString()}`); + this.write(`User ID: ${userId}`); + this.write(`Job ID: ${jobId || "manual"}`); + this.write("═".repeat(60)); + this.write(""); + + return this.currentLogFile; + } + + /** + * Write a line to the current log + */ + write(message: string, indent: number = 0): void { + const prefix = " ".repeat(indent); + const timestamp = new Date().toISOString().split("T")[1].split(".")[0]; + const line = `[${timestamp}] ${prefix}${message}`; + + // Write to file + if (this.currentStream) { + this.currentStream.write(line + "\n"); + } + + // Also write to console for real-time visibility + console.log(message); + } + + /** + * Write a section header + */ + section(title: string): void { + this.write(""); + this.write("─".repeat(50)); + this.write(`> ${title}`); + this.write("─".repeat(50)); + } + + /** + * Write a success message + */ + success(message: string, indent: number = 0): void { + this.write(`✓ ${message}`, indent); + } + + /** + * Write an error message + */ + error(message: string, indent: number = 0): void { + this.write(`✗ ${message}`, indent); + } + + /** + * Write a warning message + */ + warn(message: string, indent: number = 0): void { + this.write(`[WARN] ${message}`, indent); + } + + /** + * Write info message + */ + info(message: string, indent: number = 0): void { + this.write(`ℹ ${message}`, indent); + } + + /** + * Write a table of key-value pairs + */ + table(data: Record, indent: number = 1): void { + for (const [key, value] of Object.entries(data)) { + this.write(`${key}: ${value}`, indent); + } + } + + /** + * Write a list of items + */ + list(items: string[], indent: number = 1): void { + for (const item of items) { + this.write(`• ${item}`, indent); + } + } + + /** + * End the current log and close the stream + */ + end(success: boolean, summary?: string): void { + this.write(""); + this.write("═".repeat(60)); + this.write(`GENERATION ${success ? "COMPLETED" : "FAILED"}`); + if (summary) { + this.write(summary); + } + this.write(`Ended: ${new Date().toISOString()}`); + this.write("═".repeat(60)); + + if (this.currentStream) { + this.currentStream.end(); + this.currentStream = null; + } + } + + /** + * Get the path to the current log file + */ + getCurrentLogPath(): string | null { + return this.currentLogFile; + } + + /** + * Get the most recent log file + */ + getLatestLog(): { path: string; content: string } | null { + if (!fs.existsSync(this.logDir)) { + return null; + } + + const files = fs.readdirSync(this.logDir) + .filter(f => f.startsWith("discovery-") && f.endsWith(".log")) + .sort() + .reverse(); + + if (files.length === 0) { + return null; + } + + const latestPath = path.join(this.logDir, files[0]); + const content = fs.readFileSync(latestPath, "utf-8"); + + return { path: latestPath, content }; + } + + /** + * Get all log files (most recent first) + */ + getAllLogs(): { filename: string; date: Date; size: number }[] { + if (!fs.existsSync(this.logDir)) { + return []; + } + + return fs.readdirSync(this.logDir) + .filter(f => f.startsWith("discovery-") && f.endsWith(".log")) + .map(filename => { + const filePath = path.join(this.logDir, filename); + const stats = fs.statSync(filePath); + return { + filename, + date: stats.mtime, + size: stats.size + }; + }) + .sort((a, b) => b.date.getTime() - a.date.getTime()); + } + + /** + * Get a specific log file content + */ + getLogContent(filename: string): string | null { + const filePath = path.join(this.logDir, filename); + if (!fs.existsSync(filePath)) { + return null; + } + return fs.readFileSync(filePath, "utf-8"); + } + + /** + * Clean up old logs (keep last N) + */ + cleanup(keepCount: number = 20): number { + const logs = this.getAllLogs(); + let deleted = 0; + + for (let i = keepCount; i < logs.length; i++) { + const filePath = path.join(this.logDir, logs[i].filename); + fs.unlinkSync(filePath); + deleted++; + } + + return deleted; + } +} + +export const discoveryLogger = new DiscoveryLogger(); + + + + + + diff --git a/backend/src/services/downloadQueue.ts b/backend/src/services/downloadQueue.ts new file mode 100644 index 0000000..dfdf90f --- /dev/null +++ b/backend/src/services/downloadQueue.ts @@ -0,0 +1,658 @@ +interface DownloadInfo { + downloadId: string; + albumTitle: string; + albumMbid: string; + artistName: string; + artistMbid?: string; + albumId?: number; + artistId?: number; + attempts: number; + startTime: number; + userId?: string; + tier?: string; + similarity?: number; +} + +type UnavailableAlbumCallback = (info: { + albumTitle: string; + artistName: string; + albumMbid: string; + artistMbid?: string; + userId?: string; + tier?: string; + similarity?: number; +}) => Promise; + +class DownloadQueueManager { + private activeDownloads = new Map(); + private timeoutTimer: NodeJS.Timeout | null = null; + private cleanupInterval: NodeJS.Timeout | null = null; + private readonly TIMEOUT_MINUTES = 10; // Trigger scan after 10 minutes regardless + private readonly MAX_RETRY_ATTEMPTS = 3; // Max retries before giving up + private readonly STALE_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes - entries older than this are considered stale + private unavailableCallbacks: UnavailableAlbumCallback[] = []; + + constructor() { + // Start periodic cleanup of stale downloads (every 5 minutes) + this.cleanupInterval = setInterval(() => { + this.cleanupStaleDownloads(); + }, 5 * 60 * 1000); + } + + /** + * Track a new download + */ + addDownload( + downloadId: string, + albumTitle: string, + albumMbid: string, + artistName: string, + albumId?: number, + artistId?: number, + options?: { + artistMbid?: string; + userId?: string; + tier?: string; + similarity?: number; + } + ) { + const info: DownloadInfo = { + downloadId, + albumTitle, + albumMbid, + artistName, + artistMbid: options?.artistMbid, + albumId, + artistId, + attempts: 1, + startTime: Date.now(), + userId: options?.userId, + tier: options?.tier, + similarity: options?.similarity, + }; + + this.activeDownloads.set(downloadId, info); + console.log( + `[DOWNLOAD] Started: "${albumTitle}" by ${artistName} (${downloadId})` + ); + console.log(` Album MBID: ${albumMbid}`); + console.log(` Active downloads: ${this.activeDownloads.size}`); + + // Persist Lidarr download reference to download job for later status updates + this.linkDownloadJob(downloadId, albumMbid).catch((error) => { + console.error(` linkDownloadJob error:`, error); + }); + + // Start timeout on first download + if (this.activeDownloads.size === 1 && !this.timeoutTimer) { + this.startTimeout(); + } + } + + /** + * Register a callback to be notified when an album is unavailable + */ + onUnavailableAlbum(callback: UnavailableAlbumCallback) { + this.unavailableCallbacks.push(callback); + } + + /** + * Clear all unavailable album callbacks + */ + clearUnavailableCallbacks() { + this.unavailableCallbacks = []; + } + + /** + * Mark download as complete + */ + async completeDownload(downloadId: string, albumTitle: string) { + this.activeDownloads.delete(downloadId); + console.log(`Download complete: "${albumTitle}" (${downloadId})`); + console.log(` Remaining downloads: ${this.activeDownloads.size}`); + + // If no more downloads, trigger refresh immediately + if (this.activeDownloads.size === 0) { + console.log(`⏰ All downloads complete! Starting refresh now...`); + this.clearTimeout(); + this.triggerFullRefresh(); + } + } + + /** + * Mark download as failed and optionally retry + */ + async failDownload(downloadId: string, reason: string) { + const info = this.activeDownloads.get(downloadId); + if (!info) { + console.log( + ` Download ${downloadId} not tracked, ignoring failure` + ); + return; + } + + console.log(` Download failed: "${info.albumTitle}" (${downloadId})`); + console.log(` Reason: ${reason}`); + console.log(` Attempt ${info.attempts}/${this.MAX_RETRY_ATTEMPTS}`); + + // Check if we should retry + if (info.attempts < this.MAX_RETRY_ATTEMPTS) { + info.attempts++; + console.log(` Retrying download... (attempt ${info.attempts})`); + await this.retryDownload(info); + } else { + console.log(` ⛔ Max retry attempts reached, giving up`); + await this.cleanupFailedAlbum(info); + this.activeDownloads.delete(downloadId); + + // Check if all downloads are done + if (this.activeDownloads.size === 0) { + console.log( + `⏰ All downloads finished (some failed). Starting refresh...` + ); + this.clearTimeout(); + this.triggerFullRefresh(); + } + } + } + + /** + * Retry a failed download by triggering Lidarr album search + */ + private async retryDownload(info: DownloadInfo) { + try { + if (!info.albumId) { + console.log(` No album ID, cannot retry`); + return; + } + + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if ( + !settings.lidarrEnabled || + !settings.lidarrUrl || + !settings.lidarrApiKey + ) { + console.log(` Lidarr not configured`); + return; + } + + const axios = (await import("axios")).default; + + // Trigger new album search + await axios.post( + `${settings.lidarrUrl}/api/v1/command`, + { + name: "AlbumSearch", + albumIds: [info.albumId], + }, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + + console.log(` Retry search triggered in Lidarr`); + } catch (error: any) { + console.log(` Failed to retry: ${error.message}`); + } + } + + /** + * Clean up failed album from Lidarr and Discovery database + */ + private async cleanupFailedAlbum(info: DownloadInfo) { + try { + console.log(` Cleaning up failed album: ${info.albumTitle}`); + + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if ( + !settings.lidarrEnabled || + !settings.lidarrUrl || + !settings.lidarrApiKey + ) { + return; + } + + const axios = (await import("axios")).default; + + // Delete album from Lidarr + if (info.albumId) { + try { + await axios.delete( + `${settings.lidarrUrl}/api/v1/album/${info.albumId}`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log(` Removed album from Lidarr`); + } catch (error: any) { + console.log(` Failed to remove album: ${error.message}`); + } + } + + // Check if artist has any other albums + if (info.artistId) { + try { + const artistResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/artist/${info.artistId}`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + + const artist = artistResponse.data; + const monitoredAlbums = + artist.albums?.filter((a: any) => a.monitored) || []; + + // If no other monitored albums, remove artist + if (monitoredAlbums.length === 0) { + await axios.delete( + `${settings.lidarrUrl}/api/v1/artist/${info.artistId}`, + { + params: { deleteFiles: false }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log( + ` Removed artist from Lidarr (no other albums)` + ); + } + } catch (error: any) { + console.log( + ` Failed to check/remove artist: ${error.message}` + ); + } + } + + // Mark as failed in Discovery database + const { prisma } = await import("../utils/db"); + await prisma.discoveryAlbum.updateMany({ + where: { albumTitle: info.albumTitle }, + data: { status: "FAILED" }, + }); + console.log(` Marked as failed in database`); + + // Notify callbacks about unavailable album + console.log( + ` [NOTIFY] Notifying ${this.unavailableCallbacks.length} callbacks about unavailable album` + ); + for (const callback of this.unavailableCallbacks) { + try { + await callback({ + albumTitle: info.albumTitle, + artistName: info.artistName, + albumMbid: info.albumMbid, + artistMbid: info.artistMbid, + userId: info.userId, + tier: info.tier, + similarity: info.similarity, + }); + } catch (error: any) { + console.log(` Callback error: ${error.message}`); + } + } + } catch (error: any) { + console.log(` Cleanup error: ${error.message}`); + } + } + + /** + * Start timeout to trigger scan after X minutes even if downloads are still pending + */ + private startTimeout() { + const timeoutMs = this.TIMEOUT_MINUTES * 60 * 1000; + console.log( + `[TIMER] Starting ${this.TIMEOUT_MINUTES}-minute timeout for automatic scan` + ); + + this.timeoutTimer = setTimeout(() => { + if (this.activeDownloads.size > 0) { + console.log( + `\n Timeout reached! ${this.activeDownloads.size} downloads still pending.` + ); + console.log(` These downloads never completed:`); + + // Mark each pending download as failed to trigger callbacks + for (const [downloadId, info] of this.activeDownloads) { + console.log( + ` - ${info.albumTitle} by ${info.artistName}` + ); + // This will trigger the unavailable album callback + this.failDownload( + downloadId, + "Download timeout - never completed" + ).catch((err) => { + console.error( + `Error failing download ${downloadId}:`, + err + ); + }); + } + + console.log( + ` Triggering scan anyway to process completed downloads...\n` + ); + } else { + this.triggerFullRefresh(); + } + }, timeoutMs); + } + + /** + * Clear the timeout timer + */ + private clearTimeout() { + if (this.timeoutTimer) { + clearTimeout(this.timeoutTimer); + this.timeoutTimer = null; + } + } + + /** + * Trigger full library refresh (Lidarr cleanup → Lidify sync) + */ + private async triggerFullRefresh() { + try { + console.log("\n Starting full library refresh...\n"); + + // Step 1: Clear failed imports from Lidarr + console.log("[1/2] Checking for failed imports in Lidarr..."); + await this.clearFailedLidarrImports(); + + // Step 2: Trigger Lidify library sync + console.log("[2/2] Triggering Lidify library sync..."); + const lidifySuccess = await this.triggerLidifySync(); + + if (!lidifySuccess) { + console.error(" Lidify sync failed"); + return; + } + + console.log("Lidify sync started"); + console.log( + "\n[SUCCESS] Full library refresh complete! New music should appear shortly.\n" + ); + } catch (error) { + console.error(" Library refresh error:", error); + } + } + + /** + * Clear failed imports from Lidarr queue + */ + private async clearFailedLidarrImports(): Promise { + try { + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + + if (!settings.lidarrEnabled || !settings.lidarrUrl) { + console.log(" Lidarr not configured, skipping"); + return; + } + + const axios = (await import("axios")).default; + + // Get Lidarr API key + const apiKey = settings.lidarrApiKey; + if (!apiKey) { + console.log(" Lidarr API key not found, skipping"); + return; + } + + // Get queue + const response = await axios.get( + `${settings.lidarrUrl}/api/v1/queue`, + { + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + + const queue = response.data.records || []; + + // Find failed imports + const failed = queue.filter( + (item: any) => + item.trackedDownloadStatus === "warning" || + item.trackedDownloadStatus === "error" || + item.status === "warning" || + item.status === "failed" + ); + + if (failed.length === 0) { + console.log(" No failed imports found"); + return; + } + + console.log(` Found ${failed.length} failed import(s)`); + + for (const item of failed) { + const artistName = + item.artist?.artistName || item.artist?.name || "Unknown"; + const albumTitle = + item.album?.title || item.album?.name || "Unknown Album"; + + console.log(` ${artistName} - ${albumTitle}`); + + try { + // Remove from queue, blocklist, and trigger search + await axios.delete( + `${settings.lidarrUrl}/api/v1/queue/${item.id}`, + { + params: { + removeFromClient: true, + blocklist: true, + }, + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + + // Trigger new search if album ID is available + if (item.album?.id) { + await axios.post( + `${settings.lidarrUrl}/api/v1/command`, + { + name: "AlbumSearch", + albumIds: [item.album.id], + }, + { + headers: { "X-Api-Key": apiKey }, + timeout: 10000, + } + ); + console.log( + ` → Blocklisted and searching for alternative` + ); + } else { + console.log( + ` → Blocklisted (no album ID for re-search)` + ); + } + } catch (error: any) { + console.log(` Failed to process: ${error.message}`); + } + } + + console.log(` Cleared ${failed.length} failed import(s)`); + } catch (error: any) { + console.log(` Failed to check Lidarr queue: ${error.message}`); + } + } + + /** + * Trigger Lidify library sync + */ + private async triggerLidifySync(): Promise { + try { + const { scanQueue } = await import("../workers/queues"); + const { prisma } = await import("../utils/db"); + + console.log(" Starting library scan..."); + + // Get first user for scanning + const firstUser = await prisma.user.findFirst(); + if (!firstUser) { + console.error(` No users found in database, cannot scan`); + return false; + } + + // Trigger scan via queue + await scanQueue.add("scan", { + userId: firstUser.id, + source: "download-queue", + }); + + console.log("Library scan queued"); + return true; + } catch (error: any) { + console.error("Lidify sync trigger error:", error.message); + return false; + } + } + + /** + * Get current queue status + */ + getStatus() { + return { + activeDownloads: this.activeDownloads.size, + downloads: Array.from(this.activeDownloads.values()), + timeoutActive: this.timeoutTimer !== null, + }; + } + + /** + * Get the active downloads map (for checking if a download is being tracked) + */ + getActiveDownloads() { + return this.activeDownloads; + } + + /** + * Manually trigger a full refresh (for testing or manual triggers) + */ + async manualRefresh() { + console.log("\n Manual refresh triggered...\n"); + await this.triggerFullRefresh(); + } + + /** + * Clean up stale downloads that have been active for too long + * This prevents the activeDownloads Map from growing unbounded + */ + cleanupStaleDownloads(): number { + const now = Date.now(); + let cleanedCount = 0; + + for (const [downloadId, info] of this.activeDownloads) { + const age = now - info.startTime; + if (age > this.STALE_TIMEOUT_MS) { + console.log( + `[CLEANUP] Cleaning up stale download: "${ + info.albumTitle + }" (${downloadId}) - age: ${Math.round( + age / 60000 + )} minutes` + ); + this.activeDownloads.delete(downloadId); + cleanedCount++; + } + } + + if (cleanedCount > 0) { + console.log( + `[CLEANUP] Cleaned up ${cleanedCount} stale download(s)` + ); + } + + return cleanedCount; + } + + /** + * Shutdown the download queue manager (cleanup resources) + */ + shutdown() { + if (this.cleanupInterval) { + clearInterval(this.cleanupInterval); + this.cleanupInterval = null; + } + this.clearTimeout(); + this.activeDownloads.clear(); + console.log("Download queue manager shutdown"); + } + + /** + * Link Lidarr download IDs to download jobs (so we can mark them completed later) + */ + private async linkDownloadJob(downloadId: string, albumMbid: string) { + console.log( + ` [LINK] Attempting to link download job for MBID: ${albumMbid}` + ); + try { + const { prisma } = await import("../utils/db"); + + // Debug: Check if job exists + const existingJobs = await prisma.downloadJob.findMany({ + where: { targetMbid: albumMbid }, + select: { + id: true, + status: true, + lidarrRef: true, + targetMbid: true, + }, + }); + console.log( + ` [LINK] Found ${existingJobs.length} job(s) with this MBID:`, + JSON.stringify(existingJobs, null, 2) + ); + + const result = await prisma.downloadJob.updateMany({ + where: { + targetMbid: albumMbid, + status: { in: ["pending", "processing"] }, + OR: [{ lidarrRef: null }, { lidarrRef: "" }], + }, + data: { + lidarrRef: downloadId, + status: "processing", + }, + }); + + if (result.count === 0) { + console.log( + ` No matching download jobs found to link with Lidarr ID ${downloadId}` + ); + console.log( + ` This means either: no job exists, job already has lidarrRef, or status is not pending/processing` + ); + } else { + console.log( + ` Linked Lidarr download ${downloadId} to ${result.count} download job(s)` + ); + } + } catch (error: any) { + console.error( + ` Failed to persist Lidarr download link:`, + error.message + ); + console.error(` Error details:`, error); + } + } +} + +// Singleton instance +export const downloadQueueManager = new DownloadQueueManager(); diff --git a/backend/src/services/enrichment.ts b/backend/src/services/enrichment.ts new file mode 100644 index 0000000..fc92c9e --- /dev/null +++ b/backend/src/services/enrichment.ts @@ -0,0 +1,664 @@ +/** + * Metadata Enrichment Service + * + * Enriches artist/album/track metadata using multiple sources: + * - MusicBrainz: MBIDs, release dates, track info + * - Last.fm: Genres, tags, similar artists, bio + * - Cover Art Archive: Album artwork + * - Discogs: Additional metadata (optional) + * + * Features: + * - Optional/opt-in (bandwidth intensive) + * - Rate limiting to respect API limits + * - Confidence scoring for matches + * - Manual override support + */ + +import { prisma } from "../utils/db"; +import { lastFmService } from "./lastfm"; +import { musicBrainzService } from "./musicbrainz"; +import { imageProviderService } from "./imageProvider"; + +export interface EnrichmentSettings { + enabled: boolean; + autoEnrichOnScan: boolean; + sources: { + musicbrainz: boolean; + lastfm: boolean; + coverArtArchive: boolean; + }; + rateLimit: { + maxRequestsPerMinute: number; + respectApiLimits: boolean; + }; + overwriteExisting: boolean; + matchingConfidence: "strict" | "moderate" | "loose"; +} + +export interface EnrichmentResult { + success: boolean; + itemsProcessed: number; + itemsEnriched: number; + itemsFailed: number; + errors: Array<{ item: string; error: string }>; +} + +export interface ArtistEnrichmentData { + mbid?: string; + bio?: string; + genres?: string[]; + tags?: string[]; + similarArtists?: string[]; + heroUrl?: string; + formed?: number; + confidence: number; +} + +export interface AlbumEnrichmentData { + rgMbid?: string; + releaseDate?: Date; + albumType?: string; + genres?: string[]; + tags?: string[]; + label?: string; + coverUrl?: string; + trackCount?: number; + confidence: number; +} + +export interface TrackEnrichmentData { + mbid?: string; + duration?: number; + genres?: string[]; + lyrics?: string; + confidence: number; +} + +export class EnrichmentService { + private defaultSettings: EnrichmentSettings = { + enabled: false, // Opt-in by default + autoEnrichOnScan: false, + sources: { + musicbrainz: true, + lastfm: true, + coverArtArchive: true, + }, + rateLimit: { + maxRequestsPerMinute: 30, + respectApiLimits: true, + }, + overwriteExisting: false, + matchingConfidence: "moderate", + }; + + private requestQueue: Array<() => Promise> = []; + private isProcessingQueue = false; + + /** + * Get enrichment settings for a user + */ + async getSettings(userId: string): Promise { + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { enrichmentSettings: true }, + }); + + if (user?.enrichmentSettings) { + // enrichmentSettings is already a JSON object from Prisma + let userSettings: any; + if (typeof user.enrichmentSettings === "string") { + userSettings = JSON.parse(user.enrichmentSettings); + } else { + userSettings = user.enrichmentSettings; + } + + // IMPORTANT: Always merge with defaults to ensure all fields exist + return { + ...this.defaultSettings, + ...userSettings, + sources: { + ...this.defaultSettings.sources, + ...(userSettings.sources || {}), + }, + rateLimit: { + ...this.defaultSettings.rateLimit, + ...(userSettings.rateLimit || {}), + }, + }; + } + + return this.defaultSettings; + } + + /** + * Update enrichment settings for a user + */ + async updateSettings( + userId: string, + settings: Partial + ): Promise { + const current = await this.getSettings(userId); + const updated = { ...current, ...settings }; + + await prisma.user.update({ + where: { id: userId }, + data: { + enrichmentSettings: JSON.stringify(updated) as any, + }, + }); + + return updated; + } + + /** + * Enrich a single artist with metadata from multiple sources + */ + async enrichArtist( + artistId: string, + settings?: EnrichmentSettings + ): Promise { + const config = settings || this.defaultSettings; + if (!config.enabled) { + return null; + } + + const artist = await prisma.artist.findUnique({ + where: { id: artistId }, + select: { id: true, name: true, mbid: true }, + }); + + if (!artist) { + throw new Error(`Artist ${artistId} not found`); + } + + console.log(`Enriching artist: ${artist.name}`); + + const enrichmentData: ArtistEnrichmentData = { + confidence: 0, + }; + + // Step 1: Get/verify MBID from MusicBrainz + if ( + config.sources.musicbrainz && + (!artist.mbid || artist.mbid.startsWith("temp-")) + ) { + try { + const mbResults = await musicBrainzService.searchArtist( + artist.name, + 1 + ); + if (mbResults.length > 0) { + enrichmentData.mbid = mbResults[0].id; + enrichmentData.confidence += 0.4; + console.log(` Found MBID: ${enrichmentData.mbid}`); + } + } catch (error) { + console.error(` ✗ MusicBrainz lookup failed:`, error); + } + } + + // Step 2: Get artist info from Last.fm + if (config.sources.lastfm) { + try { + const artistMbid = enrichmentData.mbid || artist.mbid; + const lastfmInfo = await lastFmService.getArtistInfo( + artist.name, + artistMbid && !artistMbid.startsWith("temp-") + ? artistMbid + : undefined + ); + + if (lastfmInfo) { + enrichmentData.bio = lastfmInfo.bio?.summary; + enrichmentData.tags = + lastfmInfo.tags?.tag?.map((t: any) => t.name) || []; + enrichmentData.genres = enrichmentData.tags?.slice(0, 3); // Top 3 tags as genres + enrichmentData.confidence += 0.3; + console.log( + ` Found Last.fm data: ${ + enrichmentData.tags?.length || 0 + } tags` + ); + + // Get similar artists + const similar = await lastFmService.getSimilarArtists( + artist.name, + "10" + ); + enrichmentData.similarArtists = similar.map( + (a: any) => a.name + ); + console.log(` Found ${similar.length} similar artists`); + } + } catch (error) { + console.error( + ` ✗ Last.fm lookup failed:`, + error instanceof Error ? error.message : error + ); + } + } + + // Step 3: Get artist image from multiple sources (Deezer → Fanart → MusicBrainz → Last.fm) + try { + const artistMbid = enrichmentData.mbid || artist.mbid; + const imageResult = await imageProviderService.getArtistImage( + artist.name, + artistMbid && !artistMbid.startsWith("temp-") + ? artistMbid + : undefined + ); + + if (imageResult) { + enrichmentData.heroUrl = imageResult.url; + enrichmentData.confidence += 0.2; + console.log(` Found artist image from ${imageResult.source}`); + } + } catch (error) { + console.error( + ` ✗ Artist image lookup failed:`, + error instanceof Error ? error.message : error + ); + } + + console.log( + ` Enrichment confidence: ${( + enrichmentData.confidence * 100 + ).toFixed(0)}%` + ); + + return enrichmentData; + } + + /** + * Enrich a single album with metadata from multiple sources + */ + async enrichAlbum( + albumId: string, + settings?: EnrichmentSettings + ): Promise { + const config = settings || this.defaultSettings; + if (!config.enabled) { + return null; + } + + const album = await prisma.album.findUnique({ + where: { id: albumId }, + include: { + artist: { + select: { name: true, mbid: true }, + }, + }, + }); + + if (!album) { + throw new Error(`Album ${albumId} not found`); + } + + console.log( + `[Enrichment] Processing album: ${album.artist.name} - ${album.title}` + ); + + const enrichmentData: AlbumEnrichmentData = { + confidence: 0, + }; + + // Step 1: Try to find MBID + if (config.sources.musicbrainz) { + try { + // If artist has MBID, search their discography + if ( + album.artist.mbid && + !album.artist.mbid.startsWith("temp-") + ) { + const releaseGroups = + await musicBrainzService.getReleaseGroups( + album.artist.mbid, + ["album", "ep"], + 50 + ); + + // Try to match by title + const match = releaseGroups.find( + (rg: any) => + rg.title.toLowerCase() === + album.title.toLowerCase() || + rg.title.toLowerCase().replace(/[^a-z0-9]/g, "") === + album.title + .toLowerCase() + .replace(/[^a-z0-9]/g, "") + ); + + if (match) { + enrichmentData.rgMbid = match.id; + enrichmentData.albumType = match["primary-type"]; + enrichmentData.releaseDate = match["first-release-date"] + ? new Date(match["first-release-date"]) + : undefined; + enrichmentData.confidence += 0.5; + console.log(` Found MBID: ${enrichmentData.rgMbid}`); + + // Try to get label info from first release + try { + const rgDetails = + await musicBrainzService.getReleaseGroup( + match.id + ); + if (rgDetails?.releases?.[0]?.id) { + const releaseId = rgDetails.releases[0].id; + const releaseInfo = + await musicBrainzService.getRelease( + releaseId + ); + if ( + releaseInfo?.["label-info"]?.[0]?.label + ?.name + ) { + enrichmentData.label = + releaseInfo["label-info"][0].label.name; + console.log( + ` Found label: ${enrichmentData.label}` + ); + } + } + } catch (error) { + console.log(`Could not fetch label info`); + } + } + } + } catch (error) { + console.error(` ✗ MusicBrainz lookup failed:`, error); + } + } + + // Step 2: Get album info from Last.fm + if (config.sources.lastfm) { + try { + const lastfmInfo = await lastFmService.getAlbumInfo( + album.artist.name, + album.title, + enrichmentData.rgMbid + ); + + if (lastfmInfo) { + enrichmentData.tags = + lastfmInfo.tags?.tag?.map((t: any) => t.name) || []; + enrichmentData.genres = enrichmentData.tags?.slice(0, 3); + enrichmentData.trackCount = + lastfmInfo.tracks?.track?.length; + enrichmentData.confidence += 0.3; + console.log( + ` Found Last.fm data: ${ + enrichmentData.tags?.length || 0 + } tags` + ); + } + } catch (error) { + console.error(` ✗ Last.fm lookup failed:`, error); + } + } + + // Step 3: Get cover art from multiple sources (Deezer → MusicBrainz → Fanart) + try { + const coverResult = await imageProviderService.getAlbumCover( + album.artist.name, + album.title, + enrichmentData.rgMbid + ); + + if (coverResult) { + enrichmentData.coverUrl = coverResult.url; + enrichmentData.confidence += 0.2; + console.log(` Found cover art from ${coverResult.source}`); + } + } catch (error) { + console.error( + ` ✗ Cover art lookup failed:`, + error instanceof Error ? error.message : error + ); + } + + console.log( + ` Enrichment confidence: ${( + enrichmentData.confidence * 100 + ).toFixed(0)}%` + ); + + return enrichmentData; + } + + /** + * Apply enrichment data to an artist in the database + */ + async applyArtistEnrichment( + artistId: string, + data: ArtistEnrichmentData + ): Promise { + const updateData: any = {}; + + // Check if MBID is already in use by another artist + if (data.mbid) { + const existingArtist = await prisma.artist.findUnique({ + where: { mbid: data.mbid }, + select: { id: true, name: true }, + }); + + if (existingArtist && existingArtist.id !== artistId) { + console.log( + `MBID ${data.mbid} already used by "${existingArtist.name}", skipping MBID update` + ); + } else { + updateData.mbid = data.mbid; + } + } + + if (data.bio) updateData.summary = data.bio; + if (data.heroUrl) updateData.heroUrl = data.heroUrl; + if (data.genres && data.genres.length > 0) { + updateData.genres = data.genres; + } + + if (Object.keys(updateData).length > 0) { + await prisma.artist.update({ + where: { id: artistId }, + data: updateData, + }); + console.log( + ` Saved ${data.genres?.length || 0} genres for artist` + ); + } + } + + /** + * Apply enrichment data to an album in the database + */ + async applyAlbumEnrichment( + albumId: string, + data: AlbumEnrichmentData + ): Promise { + const updateData: any = {}; + + if (data.rgMbid) updateData.rgMbid = data.rgMbid; + if (data.coverUrl) updateData.coverUrl = data.coverUrl; + if (data.releaseDate) { + updateData.year = data.releaseDate.getFullYear(); + } + if (data.label) updateData.label = data.label; + if (data.genres && data.genres.length > 0) { + updateData.genres = data.genres; + } + + if (Object.keys(updateData).length > 0) { + await prisma.album.update({ + where: { id: albumId }, + data: updateData, + }); + console.log( + ` Saved album data: ${ + data.genres?.length || 0 + } genres, label: ${data.label || "none"}` + ); + } + + // Update OwnedAlbum table if MBID changed + if (data.rgMbid) { + const album = await prisma.album.findUnique({ + where: { id: albumId }, + select: { artistId: true }, + }); + + if (album) { + await prisma.ownedAlbum.upsert({ + where: { + artistId_rgMbid: { + artistId: album.artistId, + rgMbid: data.rgMbid, + }, + }, + create: { + artistId: album.artistId, + rgMbid: data.rgMbid, + source: "enrichment", + }, + update: {}, + }); + } + } + } + + /** + * Enrich entire library for a user + */ + async enrichLibrary( + userId: string, + onProgress?: (progress: { + current: number; + total: number; + item: string; + }) => void + ): Promise { + const settings = await this.getSettings(userId); + if (!settings.enabled) { + throw new Error("Enrichment is not enabled for this user"); + } + + const result: EnrichmentResult = { + success: true, + itemsProcessed: 0, + itemsEnriched: 0, + itemsFailed: 0, + errors: [], + }; + + // Get all artists with their albums + const artists = await prisma.artist.findMany({ + where: { + albums: { + some: {}, // Only artists with albums + }, + }, + select: { + id: true, + name: true, + albums: { + select: { id: true, title: true }, + }, + }, + }); + + console.log(`Starting enrichment for ${artists.length} artists...`); + + for (const artist of artists) { + try { + result.itemsProcessed++; + onProgress?.({ + current: result.itemsProcessed, + total: + artists.length + + artists.reduce((sum, a) => sum + a.albums.length, 0), + item: `${artist.name}`, + }); + + // Enrich artist + const artistEnrichmentData = await this.enrichArtist( + artist.id, + settings + ); + if ( + artistEnrichmentData && + artistEnrichmentData.confidence > 0.3 + ) { + await this.applyArtistEnrichment( + artist.id, + artistEnrichmentData + ); + result.itemsEnriched++; + } + + // Enrich all albums for this artist + for (const album of artist.albums) { + try { + result.itemsProcessed++; + onProgress?.({ + current: result.itemsProcessed, + total: + artists.length + + artists.reduce( + (sum, a) => sum + a.albums.length, + 0 + ), + item: `${artist.name} - ${album.title}`, + }); + + const albumEnrichmentData = await this.enrichAlbum( + album.id, + settings + ); + if ( + albumEnrichmentData && + albumEnrichmentData.confidence > 0.3 + ) { + await this.applyAlbumEnrichment( + album.id, + albumEnrichmentData + ); + result.itemsEnriched++; + } + + // Rate limiting between albums + await new Promise((resolve) => + setTimeout(resolve, 500) + ); + } catch (error: any) { + result.itemsFailed++; + result.errors.push({ + item: `${artist.name} - ${album.title}`, + error: error.message, + }); + console.error( + ` ✗ Failed to enrich ${artist.name} - ${album.title}:`, + error + ); + } + } + + // Rate limiting between artists + await new Promise((resolve) => setTimeout(resolve, 1000)); + } catch (error: any) { + result.itemsFailed++; + result.errors.push({ + item: artist.name, + error: error.message, + }); + console.error(` ✗ Failed to enrich ${artist.name}:`, error); + } + } + + console.log( + `Enrichment complete: ${result.itemsEnriched}/${result.itemsProcessed} items enriched` + ); + + return result; + } +} + +export const enrichmentService = new EnrichmentService(); diff --git a/backend/src/services/fanart.ts b/backend/src/services/fanart.ts new file mode 100644 index 0000000..e57fb74 --- /dev/null +++ b/backend/src/services/fanart.ts @@ -0,0 +1,214 @@ +import axios, { AxiosInstance } from "axios"; +import { redisClient } from "../utils/redis"; +import { getSystemSettings } from "../utils/systemSettings"; + +/** + * Fanart.tv API Service + * + * Provides high-quality artist images, album covers, and backgrounds + * API Docs: https://fanart.tv/api-docs/music-api/ + * + * Free tier: 2 requests/second + * API key: Get one at https://fanart.tv/get-an-api-key/ + */ +class FanartService { + private client: AxiosInstance; + private apiKey: string | null = null; + private initialized: boolean = false; + private noKeyWarningShown: boolean = false; + + constructor() { + this.client = axios.create({ + baseURL: "https://webservice.fanart.tv/v3", + timeout: 10000, + headers: { + "User-Agent": "Lidify/1.0", + }, + }); + } + + /** + * Ensure service is initialized with API key from database or .env + */ + private async ensureInitialized() { + if (this.initialized) return; + + try { + // Try to get from database first + const settings = await getSystemSettings(); + if (settings?.fanartEnabled && settings?.fanartApiKey) { + this.apiKey = settings.fanartApiKey; + console.log("Fanart.tv configured from database"); + this.initialized = true; + return; + } + } catch (error) { + // Silently continue to check .env + } + + // Fallback to .env + if (process.env.FANART_API_KEY) { + this.apiKey = process.env.FANART_API_KEY; + console.log("Fanart.tv configured from .env"); + } + // Note: Not logging "not configured" here - it's optional and logs are spammy + this.initialized = true; + } + + /** + * Get artist images (background, thumbnail, logo) + * Returns the highest quality artist image available + */ + async getArtistImage(mbid: string): Promise { + await this.ensureInitialized(); + + // Early exit if no API key - don't log every time (reduces log spam) + if (!this.apiKey) { + return null; + } + + // Check cache first + const cacheKey = `fanart:artist:${mbid}`; + try { + if (redisClient.isOpen) { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(` Fanart.tv: Using cached image`); + return cached; + } + } + } catch (error) { + // Redis errors are non-critical + } + + try { + console.log(` Fetching from Fanart.tv...`); + const response = await this.client.get(`/music/${mbid}`, { + params: { api_key: this.apiKey }, + }); + + const data = response.data; + + // Priority: artistbackground > artistthumb > hdmusiclogo + let imageUrl: string | null = null; + + if (data.artistbackground && data.artistbackground.length > 0) { + let rawUrl = data.artistbackground[0].url; + + // If it's just a filename, construct the full URL + if (rawUrl && !rawUrl.startsWith("http")) { + rawUrl = `https://assets.fanart.tv/fanart/music/${mbid}/artistbackground/${rawUrl}`; + console.log( + ` Fanart.tv: Constructed full URL from filename` + ); + } + + imageUrl = rawUrl; + console.log(` Fanart.tv: Found artist background`); + } else if (data.artistthumb && data.artistthumb.length > 0) { + let rawUrl = data.artistthumb[0].url; + + // If it's just a filename, construct the full URL + if (rawUrl && !rawUrl.startsWith("http")) { + rawUrl = `https://assets.fanart.tv/fanart/music/${mbid}/artistthumb/${rawUrl}`; + console.log( + ` Fanart.tv: Constructed full URL from filename` + ); + } + + imageUrl = rawUrl; + console.log(` Fanart.tv: Found artist thumbnail`); + } else if (data.hdmusiclogo && data.hdmusiclogo.length > 0) { + let rawUrl = data.hdmusiclogo[0].url; + + // If it's just a filename, construct the full URL + if (rawUrl && !rawUrl.startsWith("http")) { + rawUrl = `https://assets.fanart.tv/fanart/music/${mbid}/hdmusiclogo/${rawUrl}`; + console.log( + ` Fanart.tv: Constructed full URL from filename` + ); + } + + imageUrl = rawUrl; + console.log(` Fanart.tv: Found HD logo`); + } + + // Cache for 7 days + if (imageUrl && redisClient.isOpen) { + try { + await redisClient.setEx( + cacheKey, + 7 * 24 * 60 * 60, + imageUrl + ); + } catch (error) { + // Redis errors are non-critical + } + } + + return imageUrl; + } catch (error: any) { + if (error.response?.status === 404) { + console.log(`Fanart.tv: No images found`); + } else { + console.error(` Fanart.tv error:`, error.message); + } + return null; + } + } + + /** + * Get album cover art + */ + async getAlbumCover(mbid: string): Promise { + await this.ensureInitialized(); + + if (!this.apiKey) return null; + + const cacheKey = `fanart:album:${mbid}`; + try { + if (redisClient.isOpen) { + const cached = await redisClient.get(cacheKey); + if (cached) return cached; + } + } catch (error) { + // Redis errors are non-critical + } + + try { + const response = await this.client.get(`/music/albums/${mbid}`, { + params: { api_key: this.apiKey }, + }); + + const data = response.data; + let imageUrl: string | null = null; + + if (data.albums && data.albums[mbid]) { + const album = data.albums[mbid]; + if (album.albumcover && album.albumcover.length > 0) { + imageUrl = album.albumcover[0].url; + } else if (album.cdart && album.cdart.length > 0) { + imageUrl = album.cdart[0].url; + } + } + + if (imageUrl && redisClient.isOpen) { + try { + await redisClient.setEx( + cacheKey, + 7 * 24 * 60 * 60, + imageUrl + ); + } catch (error) { + // Redis errors are non-critical + } + } + + return imageUrl; + } catch (error) { + return null; + } + } +} + +export const fanartService = new FanartService(); diff --git a/backend/src/services/fileValidator.ts b/backend/src/services/fileValidator.ts new file mode 100644 index 0000000..f65fff5 --- /dev/null +++ b/backend/src/services/fileValidator.ts @@ -0,0 +1,175 @@ +import * as fs from "fs"; +import * as path from "path"; +import { prisma } from "../utils/db"; +import { config } from "../config"; +import PQueue from "p-queue"; + +export interface ValidationResult { + tracksChecked: number; + tracksRemoved: number; + tracksMissing: string[]; // IDs of missing tracks + duration: number; +} + +export class FileValidatorService { + private validationQueue = new PQueue({ concurrency: 50 }); + + /** + * Validate all tracks in the library and remove missing files + */ + async validateLibrary(): Promise { + const startTime = Date.now(); + const result: ValidationResult = { + tracksChecked: 0, + tracksRemoved: 0, + tracksMissing: [], + duration: 0, + }; + + console.log("[FileValidator] Starting library validation..."); + + // Get all tracks from the database + const tracks = await prisma.track.findMany({ + select: { + id: true, + filePath: true, + title: true, + }, + }); + + console.log( + `[FileValidator] Found ${tracks.length} tracks to validate` + ); + + // Check each track's file existence + const missingTrackIds: string[] = []; + + for (const track of tracks) { + await this.validationQueue.add(async () => { + try { + const absolutePath = path.normalize( + path.join(config.music.musicPath, track.filePath) + ); + + // Prevent path traversal attacks + if (!absolutePath.startsWith(path.normalize(config.music.musicPath))) { + console.warn( + `[FileValidator] Path traversal attempt detected: ${track.filePath}` + ); + missingTrackIds.push(track.id); + result.tracksChecked++; + return; + } + + const exists = await this.fileExists(absolutePath); + + if (!exists) { + console.log( + `[FileValidator] Missing file: ${track.filePath} (${track.title})` + ); + missingTrackIds.push(track.id); + } + + result.tracksChecked++; + + // Log progress every 100 tracks + if (result.tracksChecked % 100 === 0) { + console.log( + `[FileValidator] Progress: ${result.tracksChecked}/${tracks.length} tracks checked, ${missingTrackIds.length} missing` + ); + } + } catch (err: any) { + console.error( + `[FileValidator] Error checking ${track.filePath}:`, + err.message + ); + } + }); + } + + await this.validationQueue.onIdle(); + + result.tracksMissing = missingTrackIds; + + // Remove missing tracks from database + if (missingTrackIds.length > 0) { + console.log( + `[FileValidator] Removing ${missingTrackIds.length} missing tracks from database...` + ); + + await prisma.track.deleteMany({ + where: { + id: { in: missingTrackIds }, + }, + }); + + result.tracksRemoved = missingTrackIds.length; + } + + result.duration = Date.now() - startTime; + + console.log( + `[FileValidator] Validation complete: ${result.tracksChecked} checked, ${result.tracksRemoved} removed (${result.duration}ms)` + ); + + return result; + } + + /** + * Check if a file exists (async) + */ + private async fileExists(filePath: string): Promise { + try { + await fs.promises.access(filePath, fs.constants.F_OK); + return true; + } catch { + return false; + } + } + + /** + * Validate a single track and remove if missing + */ + async validateTrack(trackId: string): Promise { + const track = await prisma.track.findUnique({ + where: { id: trackId }, + select: { + id: true, + filePath: true, + title: true, + }, + }); + + if (!track) { + return false; + } + + const absolutePath = path.normalize( + path.join(config.music.musicPath, track.filePath) + ); + + // Prevent path traversal attacks + if (!absolutePath.startsWith(path.normalize(config.music.musicPath))) { + console.warn( + `[FileValidator] Path traversal attempt detected: ${track.filePath}` + ); + return false; + } + + const exists = await this.fileExists(absolutePath); + + if (!exists) { + console.log( + `[FileValidator] Track file missing, removing from DB: ${track.title}` + ); + await prisma.track.delete({ + where: { id: trackId }, + }); + return false; + } + + return true; + } +} + +export const fileValidator = new FileValidatorService(); diff --git a/backend/src/services/imageProvider.ts b/backend/src/services/imageProvider.ts new file mode 100644 index 0000000..0256c44 --- /dev/null +++ b/backend/src/services/imageProvider.ts @@ -0,0 +1,421 @@ +/** + * Image Provider Service + * + * Tries multiple sources for high-quality artist/album artwork: + * 1. Deezer (most reliable, high quality) + * 2. Fanart.tv (excellent quality, requires API key) + * 3. MusicBrainz Cover Art Archive (good quality) + * 4. Last.fm (fallback, often missing) + */ + +import axios from "axios"; + +export interface ImageSearchOptions { + preferredSize?: "small" | "medium" | "large" | "extralarge" | "mega"; + timeout?: number; +} + +export interface ImageResult { + url: string; + source: "deezer" | "fanart" | "musicbrainz" | "lastfm" | "spotify"; + size?: string; +} + +export class ImageProviderService { + private readonly FANART_API_KEY = process.env.FANART_API_KEY; + private readonly DEEZER_API_URL = "https://api.deezer.com"; + private readonly FANART_API_URL = "https://webservice.fanart.tv/v3"; + + /** + * Get artist image from multiple sources with fallback chain + */ + async getArtistImage( + artistName: string, + mbid?: string, + options: ImageSearchOptions = {} + ): Promise { + const { timeout = 5000 } = options; + + console.log(`[IMAGE] Searching for artist image: ${artistName}`); + + // Try Deezer first (most reliable) + try { + const deezerImage = await this.getArtistImageFromDeezer( + artistName, + timeout + ); + if (deezerImage) { + console.log(` Found image from Deezer`); + return deezerImage; + } + } catch (error) { + console.log( + ` Deezer failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + + // Try Fanart.tv if we have API key and MBID + if (this.FANART_API_KEY && mbid) { + try { + const fanartImage = await this.getArtistImageFromFanart( + mbid, + timeout + ); + if (fanartImage) { + console.log(` Found image from Fanart.tv`); + return fanartImage; + } + } catch (error) { + console.log( + `Fanart.tv failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + } + + // Try MusicBrainz/Cover Art Archive if we have MBID + if (mbid) { + try { + const mbImage = await this.getArtistImageFromMusicBrainz( + mbid, + timeout + ); + if (mbImage) { + console.log(` Found image from MusicBrainz`); + return mbImage; + } + } catch (error) { + console.log( + `MusicBrainz failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + } + + console.log(` ✗ No artist image found from any source`); + return null; + } + + /** + * Get album cover from multiple sources with fallback chain + */ + async getAlbumCover( + artistName: string, + albumTitle: string, + rgMbid?: string, + options: ImageSearchOptions = {} + ): Promise { + const { timeout = 5000 } = options; + + console.log( + `[IMAGE] Searching for album cover: ${artistName} - ${albumTitle}` + ); + + // Try Deezer first (most reliable) + try { + const deezerCover = await this.getAlbumCoverFromDeezer( + artistName, + albumTitle, + timeout + ); + if (deezerCover) { + console.log(` Found cover from Deezer`); + return deezerCover; + } + } catch (error) { + console.log( + ` Deezer failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + + // Try MusicBrainz Cover Art Archive if we have MBID + if (rgMbid) { + try { + const mbCover = await this.getAlbumCoverFromMusicBrainz( + rgMbid, + timeout + ); + if (mbCover) { + console.log(` Found cover from MusicBrainz`); + return mbCover; + } + } catch (error) { + console.log( + `MusicBrainz failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + } + + // Try Fanart.tv if we have API key and MBID + if (this.FANART_API_KEY && rgMbid) { + try { + const fanartCover = await this.getAlbumCoverFromFanart( + rgMbid, + timeout + ); + if (fanartCover) { + console.log(` Found cover from Fanart.tv`); + return fanartCover; + } + } catch (error) { + console.log( + `Fanart.tv failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + } + + console.log(` ✗ No album cover found from any source`); + return null; + } + + /** + * Search Deezer for artist image + */ + private async getArtistImageFromDeezer( + artistName: string, + timeout: number + ): Promise { + const response = await axios.get( + `${this.DEEZER_API_URL}/search/artist`, + { + params: { q: artistName, limit: 1 }, + timeout, + } + ); + + if (response.data.data && response.data.data.length > 0) { + const artist = response.data.data[0]; + // Deezer provides: picture, picture_small, picture_medium, picture_big, picture_xl + const imageUrl = + artist.picture_xl || artist.picture_big || artist.picture; + if (imageUrl) { + return { + url: imageUrl, + source: "deezer", + size: "xl", + }; + } + } + + return null; + } + + /** + * Search Deezer for album cover + */ + private async getAlbumCoverFromDeezer( + artistName: string, + albumTitle: string, + timeout: number + ): Promise { + const response = await axios.get( + `${this.DEEZER_API_URL}/search/album`, + { + params: { + q: `artist:"${artistName}" album:"${albumTitle}"`, + limit: 5, + }, + timeout, + } + ); + + if (response.data.data && response.data.data.length > 0) { + // Try to find exact match first + let album = response.data.data.find( + (a: any) => + a.title.toLowerCase() === albumTitle.toLowerCase() && + a.artist.name.toLowerCase() === artistName.toLowerCase() + ); + + // Fall back to first result + if (!album) { + album = response.data.data[0]; + } + + // Deezer provides: cover, cover_small, cover_medium, cover_big, cover_xl + const coverUrl = album.cover_xl || album.cover_big || album.cover; + if (coverUrl) { + return { + url: coverUrl, + source: "deezer", + size: "xl", + }; + } + } + + return null; + } + + /** + * Get artist image from Fanart.tv + */ + private async getArtistImageFromFanart( + mbid: string, + timeout: number + ): Promise { + if (!this.FANART_API_KEY) { + return null; + } + + const response = await axios.get( + `${this.FANART_API_URL}/music/${mbid}`, + { + params: { api_key: this.FANART_API_KEY }, + timeout, + } + ); + + // Fanart.tv provides multiple image types, prefer artistthumb + const images = + response.data.artistthumb || + response.data.musicbanner || + response.data.hdmusiclogo; + if (images && images.length > 0) { + return { + url: images[0].url, + source: "fanart", + }; + } + + return null; + } + + /** + * Get album cover from Fanart.tv + */ + private async getAlbumCoverFromFanart( + rgMbid: string, + timeout: number + ): Promise { + if (!this.FANART_API_KEY) { + return null; + } + + const response = await axios.get( + `${this.FANART_API_URL}/music/albums/${rgMbid}`, + { + params: { api_key: this.FANART_API_KEY }, + timeout, + } + ); + + // Prefer albumcover, fall back to cdart + const covers = + response.data.albums?.[rgMbid]?.albumcover || + response.data.albums?.[rgMbid]?.cdart; + + if (covers && covers.length > 0) { + return { + url: covers[0].url, + source: "fanart", + }; + } + + return null; + } + + /** + * Get artist image from MusicBrainz (via relationships) + */ + private async getArtistImageFromMusicBrainz( + mbid: string, + timeout: number + ): Promise { + // MusicBrainz doesn't have direct artist images, but we can check for image relationships + // This is a placeholder - in practice, we'd need to parse relationships + return null; + } + + /** + * Get album cover from MusicBrainz Cover Art Archive + */ + private async getAlbumCoverFromMusicBrainz( + rgMbid: string, + timeout: number + ): Promise { + try { + const response = await axios.get( + `https://coverartarchive.org/release-group/${rgMbid}`, + { + timeout, + validateStatus: (status) => status === 200, + } + ); + + if (response.data.images && response.data.images.length > 0) { + // Find front cover + const frontCover = + response.data.images.find( + (img: any) => img.front === true + ) || response.data.images[0]; + + return { + url: frontCover.image, + source: "musicbrainz", + }; + } + } catch (error) { + // 404 is expected if no cover art exists + if (axios.isAxiosError(error) && error.response?.status === 404) { + return null; + } + throw error; + } + + return null; + } + + /** + * Get artist image from Last.fm (fallback only - often unreliable) + */ + async getArtistImageFromLastFm( + artistName: string, + mbid?: string + ): Promise { + try { + const { lastFmService } = await import("./lastfm"); + const artistInfo = await lastFmService.getArtistInfo( + artistName, + mbid + ); + + if (artistInfo?.image) { + const megaImage = artistInfo.image.find( + (img: any) => img.size === "mega" + ); + const largeImage = artistInfo.image.find( + (img: any) => img.size === "extralarge" + ); + const image = megaImage || largeImage; + + if (image?.["#text"]) { + return { + url: image["#text"], + source: "lastfm", + size: image.size, + }; + } + } + } catch (error) { + console.log( + `Last.fm failed: ${ + error instanceof Error ? error.message : "Unknown error" + }` + ); + } + + return null; + } +} + +export const imageProviderService = new ImageProviderService(); diff --git a/backend/src/services/itunes.ts b/backend/src/services/itunes.ts new file mode 100644 index 0000000..cf7e935 --- /dev/null +++ b/backend/src/services/itunes.ts @@ -0,0 +1,339 @@ +import axios, { AxiosInstance } from "axios"; +import { redisClient } from "../utils/redis"; + +interface ItunesPodcast { + collectionId: number; + collectionName: string; + artistName: string; + artworkUrl600?: string; + artworkUrl100?: string; + feedUrl: string; + genres: string[]; + trackCount?: number; + country?: string; + primaryGenreName?: string; + contentAdvisoryRating?: string; + collectionViewUrl?: string; +} + +class ItunesService { + private client: AxiosInstance; + private lastRequestTime = 0; + private readonly RATE_LIMIT_MS = 3000; // 20 requests per minute = 3 seconds between requests + + constructor() { + this.client = axios.create({ + baseURL: "https://itunes.apple.com", + timeout: 10000, + }); + } + + private async rateLimit() { + const now = Date.now(); + const timeSinceLastRequest = now - this.lastRequestTime; + + if (timeSinceLastRequest < this.RATE_LIMIT_MS) { + const delay = this.RATE_LIMIT_MS - timeSinceLastRequest; + await new Promise((resolve) => setTimeout(resolve, delay)); + } + + this.lastRequestTime = Date.now(); + } + + private async cachedRequest( + cacheKey: string, + requestFn: () => Promise, + ttlSeconds = 604800 // 7 days default + ): Promise { + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + await this.rateLimit(); + const data = await requestFn(); + + try { + await redisClient.setEx(cacheKey, ttlSeconds, JSON.stringify(data)); + } catch (err) { + console.warn("Redis set error:", err); + } + + return data; + } + + /** + * Search for podcasts by term + */ + async searchPodcasts( + term: string, + limit = 20 + ): Promise { + const cacheKey = `itunes:search:${term}:${limit}`; + + return this.cachedRequest( + cacheKey, + async () => { + const response = await this.client.get("/search", { + params: { + term, + media: "podcast", + entity: "podcast", + limit, + }, + }); + + return response.data.results || []; + }, + 2592000 // 30 days - podcast catalog changes slowly + ); + } + + /** + * Lookup podcast by iTunes ID + */ + async getPodcastById(podcastId: number): Promise { + const cacheKey = `itunes:podcast:${podcastId}`; + + return this.cachedRequest( + cacheKey, + async () => { + const response = await this.client.get("/lookup", { + params: { + id: podcastId, + entity: "podcast", + }, + }); + + const results = response.data.results || []; + return results.length > 0 ? results[0] : null; + }, + 2592000 // 30 days + ); + } + + /** + * Extract primary keywords from podcast title/description for "similar podcasts" search + */ + extractSearchKeywords( + title: string, + description?: string, + author?: string + ): string[] { + const commonWords = new Set([ + "the", + "a", + "an", + "and", + "or", + "but", + "in", + "on", + "at", + "to", + "for", + "of", + "with", + "by", + "from", + "up", + "about", + "into", + "through", + "during", + "before", + "after", + "above", + "below", + "between", + "under", + "again", + "further", + "then", + "once", + "here", + "there", + "when", + "where", + "why", + "how", + "all", + "both", + "each", + "few", + "more", + "most", + "other", + "some", + "such", + "no", + "nor", + "not", + "only", + "own", + "same", + "so", + "than", + "too", + "very", + "can", + "will", + "just", + "should", + "now", + "podcast", + "show", + "episode", + "episodes", + ]); + + // Combine title and description + const text = [title, description || "", author || ""] + .join(" ") + .toLowerCase() + .replace(/[^\w\s]/g, " "); // Remove punctuation + + // Extract words, filter common words, and count occurrences + const words = text.split(/\s+/).filter((word) => { + return ( + word.length > 3 && + !commonWords.has(word) && + !/^\d+$/.test(word) // Remove pure numbers + ); + }); + + // Count word frequency + const wordCount = new Map(); + words.forEach((word) => { + wordCount.set(word, (wordCount.get(word) || 0) + 1); + }); + + // Sort by frequency and take top 5 + const topWords = Array.from(wordCount.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, 5) + .map(([word]) => word); + + return topWords; + } + + /** + * Get similar podcasts based on keywords extracted from title/description + * This provides a "similar podcasts" feature similar to Last.fm for music + */ + async getSimilarPodcasts( + title: string, + description?: string, + author?: string, + limit = 10 + ): Promise { + const keywords = this.extractSearchKeywords(title, description, author); + + if (keywords.length === 0) { + console.log( + "No keywords extracted for similar podcast search, falling back to title" + ); + return this.searchPodcasts(title, limit); + } + + console.log( + ` Searching for similar podcasts using keywords: ${keywords.join(", ")}` + ); + + // Search using the top keyword (most relevant) + const searchTerm = keywords[0]; + const cacheKey = `itunes:similar:${searchTerm}:${limit}`; + + return this.cachedRequest( + cacheKey, + async () => { + const results = await this.searchPodcasts(searchTerm, limit * 2); + + // Filter out the original podcast (by title similarity) + const titleLower = title.toLowerCase(); + const filtered = results.filter((podcast) => { + const podcastTitleLower = podcast.collectionName.toLowerCase(); + // Exclude if titles are very similar (likely same podcast) + return !podcastTitleLower.includes(titleLower.slice(0, 20)); + }); + + return filtered.slice(0, limit); + }, + 2592000 // 30 days + ); + } + + /** + * Get top podcasts by genre using iTunes RSS feeds + * Note: iTunes Search API doesn't support genreId filtering, but RSS feeds do + */ + async getTopPodcastsByGenre( + genreId: number, + limit = 20 + ): Promise { + console.log(`[iTunes SERVICE] getTopPodcastsByGenre called with genre=${genreId}, limit=${limit}`); + const cacheKey = `itunes:genre:${genreId}:${limit}`; + console.log(`[iTunes SERVICE] Cache key: ${cacheKey}`); + + const result = await this.cachedRequest( + cacheKey, + async () => { + try { + console.log(`[iTunes] Fetching genre ${genreId} from RSS feed...`); + + // Use iTunes RSS feed for top podcasts by genre + const response = await this.client.get( + `/us/rss/toppodcasts/genre=${genreId}/limit=${limit}/json` + ); + + console.log(`[iTunes] Response status: ${response.status}`); + console.log(`[iTunes] Has feed data: ${!!response.data?.feed}`); + console.log(`[iTunes] Entries count: ${response.data?.feed?.entry?.length || 0}`); + + const entries = response.data?.feed?.entry || []; + + // If only one entry, it might not be an array + const entriesArray = Array.isArray(entries) ? entries : [entries]; + + console.log(`[iTunes] Processing ${entriesArray.length} entries`); + + // Convert RSS feed format to our podcast format + const podcasts = entriesArray.map((entry: any) => { + const podcast = { + collectionId: parseInt(entry.id?.attributes?.["im:id"] || "0", 10), + collectionName: entry["im:name"]?.label || entry.title?.label?.split(" - ")[0] || "Unknown", + artistName: entry["im:artist"]?.label || entry.title?.label?.split(" - ")[1] || "Unknown", + artworkUrl600: entry["im:image"]?.find((img: any) => img.attributes?.height === "170")?.label, + artworkUrl100: entry["im:image"]?.find((img: any) => img.attributes?.height === "60")?.label, + feedUrl: "", // RSS feed doesn't include feed URL + genres: entry.category ? [entry.category.attributes?.label] : [], + trackCount: 0, + primaryGenreName: entry.category?.attributes?.label, + collectionViewUrl: entry.link?.attributes?.href, + }; + console.log(`[iTunes] Mapped podcast: ${podcast.collectionName} (ID: ${podcast.collectionId})`); + return podcast; + }).filter((p: any) => p.collectionId > 0); // Filter out invalid entries + + console.log(`[iTunes] Returning ${podcasts.length} valid podcasts`); + return podcasts; + } catch (error) { + console.error(`[iTunes] ERROR in requestFn:`, error); + return []; + } + }, + 2592000 // 30 days + ); + + console.log(`[iTunes SERVICE] cachedRequest returned ${result.length} podcasts`); + return result; + } +} + + + +export const itunesService = new ItunesService(); diff --git a/backend/src/services/lastfm.ts b/backend/src/services/lastfm.ts new file mode 100644 index 0000000..4167a20 --- /dev/null +++ b/backend/src/services/lastfm.ts @@ -0,0 +1,947 @@ +import axios, { AxiosInstance } from "axios"; +import * as fuzz from "fuzzball"; +import { config } from "../config"; +import { redisClient } from "../utils/redis"; +import { getSystemSettings } from "../utils/systemSettings"; +import { fanartService } from "./fanart"; +import { deezerService } from "./deezer"; +import { rateLimiter } from "./rateLimiter"; + +interface SimilarArtist { + name: string; + mbid?: string; + match: number; // 0-1 similarity score + url: string; +} + +class LastFmService { + private client: AxiosInstance; + private apiKey: string; + private initialized = false; + + constructor() { + // Initial value from .env (for backwards compatibility) + this.apiKey = config.lastfm.apiKey; + this.client = axios.create({ + baseURL: "https://ws.audioscrobbler.com/2.0/", + timeout: 10000, + }); + } + + private async ensureInitialized() { + if (this.initialized) return; + + // Priority: 1) User settings from DB, 2) env var, 3) default app key + try { + const { getSystemSettings } = await import( + "../utils/systemSettings" + ); + const settings = await getSystemSettings(); + if (settings?.lastfmApiKey) { + this.apiKey = settings.lastfmApiKey; + console.log("Last.fm configured from user settings"); + } else if (this.apiKey) { + console.log("Last.fm configured (default app key)"); + } + } catch (err) { + // DB not ready yet, use default/env key + if (this.apiKey) { + console.log("Last.fm configured (default app key)"); + } + } + + if (!this.apiKey) { + console.warn("Last.fm API key not available"); + } + + this.initialized = true; + } + + private async request(params: Record) { + await this.ensureInitialized(); + const response = await rateLimiter.execute("lastfm", () => + this.client.get("/", { params }) + ); + return response.data; + } + + async getSimilarArtists( + artistMbid: string, + artistName: string, + limit = 30 + ): Promise { + const cacheKey = `lastfm:similar:${artistMbid}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const data = await this.request({ + method: "artist.getSimilar", + mbid: artistMbid, + api_key: this.apiKey, + format: "json", + limit, + }); + + const similar = data.similarartists?.artist || []; + + const results: SimilarArtist[] = similar.map((artist: any) => ({ + name: artist.name, + mbid: artist.mbid || undefined, + match: parseFloat(artist.match) || 0, + url: artist.url, + })); + + // Cache for 7 days + try { + await redisClient.setEx( + cacheKey, + 604800, + JSON.stringify(results) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return results; + } catch (error: any) { + // If MBID lookup fails, try by name + if ( + error.response?.status === 404 || + error.response?.data?.error === 6 + ) { + console.log( + `Artist MBID not found on Last.fm, trying name search: ${artistName}` + ); + return this.getSimilarArtistsByName(artistName, limit); + } + + console.error(`Last.fm error for ${artistName}:`, error); + return []; + } + } + + private async getSimilarArtistsByName( + artistName: string, + limit = 30 + ): Promise { + const cacheKey = `lastfm:similar:name:${artistName}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const data = await this.request({ + method: "artist.getSimilar", + artist: artistName, + api_key: this.apiKey, + format: "json", + limit, + }); + + const similar = data.similarartists?.artist || []; + + const results: SimilarArtist[] = similar.map((artist: any) => ({ + name: artist.name, + mbid: artist.mbid || undefined, + match: parseFloat(artist.match) || 0, + url: artist.url, + })); + + // Cache for 7 days + try { + await redisClient.setEx( + cacheKey, + 604800, + JSON.stringify(results) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return results; + } catch (error) { + console.error(`Last.fm error for ${artistName}:`, error); + return []; + } + } + + async getAlbumInfo(artistName: string, albumName: string) { + const cacheKey = `lastfm:album:${artistName}:${albumName}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const data = await this.request({ + method: "album.getInfo", + artist: artistName, + album: albumName, + api_key: this.apiKey, + format: "json", + }); + + const album = data.album; + + // Cache for 30 days + try { + await redisClient.setEx( + cacheKey, + 2592000, + JSON.stringify(album) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return album; + } catch (error) { + console.error(`Last.fm album info error for ${albumName}:`, error); + return null; + } + } + + async getTopAlbumsByTag(tag: string, limit = 20) { + const cacheKey = `lastfm:tag:albums:${tag}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const data = await this.request({ + method: "tag.getTopAlbums", + tag, + api_key: this.apiKey, + format: "json", + limit, + }); + + const albums = data.albums?.album || []; + + // Cache for 7 days + try { + await redisClient.setEx( + cacheKey, + 604800, + JSON.stringify(albums) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return albums; + } catch (error) { + console.error(`Last.fm tag albums error for ${tag}:`, error); + return []; + } + } + + async getSimilarTracks(artistName: string, trackName: string, limit = 20) { + const cacheKey = `lastfm:similar:track:${artistName}:${trackName}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const data = await this.request({ + method: "track.getSimilar", + artist: artistName, + track: trackName, + api_key: this.apiKey, + format: "json", + limit, + }); + + const tracks = data.similartracks?.track || []; + + // Cache for 7 days + try { + await redisClient.setEx( + cacheKey, + 604800, + JSON.stringify(tracks) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return tracks; + } catch (error) { + console.error( + `Last.fm similar tracks error for ${trackName}:`, + error + ); + return []; + } + } + + async getArtistTopTracks( + artistMbid: string, + artistName: string, + limit = 10 + ) { + const cacheKey = `lastfm:toptracks:${artistMbid || artistName}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const params: any = { + method: "artist.getTopTracks", + api_key: this.apiKey, + format: "json", + limit, + }; + + if (artistMbid) { + params.mbid = artistMbid; + } else { + params.artist = artistName; + } + + const data = await this.request(params); + + const tracks = data.toptracks?.track || []; + + // Cache for 7 days + try { + await redisClient.setEx( + cacheKey, + 604800, + JSON.stringify(tracks) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return tracks; + } catch (error) { + console.error(`Last.fm top tracks error for ${artistName}:`, error); + return []; + } + } + + async getArtistTopAlbums( + artistMbid: string, + artistName: string, + limit = 10 + ) { + const cacheKey = `lastfm:topalbums:${artistMbid || artistName}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const params: any = { + method: "artist.getTopAlbums", + api_key: this.apiKey, + format: "json", + limit, + }; + + if (artistMbid) { + params.mbid = artistMbid; + } else { + params.artist = artistName; + } + + const data = await this.request(params); + + const albums = data.topalbums?.album || []; + + // Cache for 7 days + try { + await redisClient.setEx( + cacheKey, + 604800, + JSON.stringify(albums) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return albums; + } catch (error) { + console.error(`Last.fm top albums error for ${artistName}:`, error); + return []; + } + } + + /** + * Get detailed artist info including real images + */ + async getArtistInfo(artistName: string, mbid?: string) { + try { + const params: any = { + method: "artist.getinfo", + api_key: this.apiKey, + format: "json", + }; + + if (mbid) { + params.mbid = mbid; + } else { + params.artist = artistName; + } + + const data = await this.request(params); + return data.artist; + } catch (error) { + console.error( + `Last.fm artist info error for ${artistName}:`, + error + ); + return null; + } + } + + /** + * Extract the best available image from Last.fm image array + */ + public getBestImage(imageArray: any[]): string | null { + if (!imageArray || !Array.isArray(imageArray)) { + return null; + } + + // Try extralarge first, then large, then medium, then small + const image = + imageArray.find((img: any) => img.size === "extralarge")?.[ + "#text" + ] || + imageArray.find((img: any) => img.size === "large")?.["#text"] || + imageArray.find((img: any) => img.size === "medium")?.["#text"] || + imageArray.find((img: any) => img.size === "small")?.["#text"]; + + // Filter out empty/placeholder images + if ( + !image || + image === "" || + image.includes("2a96cbd8b46e442fc41c2b86b821562f") + ) { + return null; + } + + return image; + } + + private isInvalidArtistName(name?: string | null) { + if (!name) return true; + const normalized = name.trim().toLowerCase(); + return ( + normalized.length === 0 || + normalized === "unknown" || + normalized === "various artists" + ); + } + + private normalizeName(name: string | undefined | null) { + return (name || "").trim().toLowerCase(); + } + + private normalizeKey(name: string | undefined | null) { + return this.normalizeName(name) + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/[^a-z0-9]/g, ""); + } + + private getArtistKey(artist: any) { + return ( + artist.mbid || this.normalizeKey(artist.name) || artist.url || "" + ); + } + + private isDuplicateArtist(existing: any[], candidate: any) { + const candidateKey = this.getArtistKey(candidate); + if (!candidateKey) { + return true; + } + + for (const entry of existing) { + const entryKey = this.getArtistKey(entry); + if (entryKey && entryKey === candidateKey) { + return true; + } + + const nameSimilarity = fuzz.ratio( + this.normalizeName(entry.name), + this.normalizeName(candidate.name) + ); + + if (nameSimilarity >= 95) { + return true; + } + } + + return false; + } + + private isStandaloneSingle(albumName: string, trackName: string) { + const albumLower = albumName.toLowerCase(); + const trackLower = trackName.toLowerCase(); + + return ( + albumLower === trackLower || + albumLower === `${trackLower} - single` || + albumLower.endsWith(" - single") || + albumLower.endsWith(" (single)") + ); + } + + private async buildArtistSearchResult(artist: any, enrich: boolean) { + const baseResult = { + type: "music", + id: artist.mbid || artist.name, + name: artist.name, + listeners: parseInt(artist.listeners || "0", 10), + url: artist.url, + image: this.getBestImage(artist.image), + mbid: artist.mbid, + bio: null, + tags: [] as string[], + }; + + if (!enrich) { + return baseResult; + } + + const [info, fanartImage, deezerImage] = await Promise.all([ + this.getArtistInfo(artist.name, artist.mbid), + artist.mbid + ? fanartService + .getArtistImage(artist.mbid) + .catch(() => null as string | null) + : Promise.resolve(null), + deezerService + .getArtistImage(artist.name) + .catch(() => null as string | null), + ]); + + const resolvedImage = + fanartImage || + deezerImage || + (info ? this.getBestImage(info.image) : null) || + baseResult.image; + + return { + ...baseResult, + image: resolvedImage, + bio: info?.bio?.summary || info?.bio?.content || null, + tags: info?.tags?.tag?.map((t: any) => t.name) || [], + }; + } + + private async buildTrackSearchResult(track: any, enrich: boolean) { + if (this.isInvalidArtistName(track.artist)) { + return null; + } + + const baseResult = { + type: "track", + id: track.mbid || `${track.artist}-${track.name}`, + name: track.name, + artist: track.artist, + album: track.album || null, + listeners: parseInt(track.listeners || "0", 10), + url: track.url, + image: this.getBestImage(track.image), + mbid: track.mbid, + }; + + if (!enrich) { + return baseResult; + } + + const trackInfo = await this.getTrackInfo(track.artist, track.name); + + let albumName = trackInfo?.album?.title || baseResult.album; + let albumArt = + this.getBestImage(trackInfo?.album?.image) || baseResult.image; + + if (albumName && this.isStandaloneSingle(albumName, track.name)) { + return null; + } + + if (!albumArt) { + albumArt = await deezerService + .getArtistImage(track.artist) + .catch(() => null as string | null); + } + + return { + ...baseResult, + album: albumName, + image: albumArt, + }; + } + + /** + * Search for artists on Last.fm and fetch their detailed info with images + */ + async searchArtists(query: string, limit = 20) { + try { + const data = await this.request({ + method: "artist.search", + artist: query, + api_key: this.apiKey, + format: "json", + limit, + }); + + const artists = data.results?.artistmatches?.artist || []; + + console.log( + `\n [LAST.FM SEARCH] Found ${artists.length} artists (before filtering)` + ); + + const queryLower = query.toLowerCase().trim(); + const words = queryLower.split(/\s+/).filter(Boolean); + const minWordMatches = + words.length <= 2 + ? words.length + : Math.max(1, words.length - 1); + + const escapeRegex = (text: string) => + text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const wordMatchers = words.map((word) => { + if (word.length <= 2) { + return (candidate: string) => candidate.includes(word); + } + const regex = new RegExp(`\\b${escapeRegex(word)}\\b`); + return (candidate: string) => regex.test(candidate); + }); + + const scoredArtists = artists + .map((artist: any) => { + const normalizedName = this.normalizeName(artist.name); + const similarity = fuzz.token_set_ratio( + queryLower, + normalizedName + ); + const listeners = parseInt(artist.listeners || "0", 10); + const hasMbid = Boolean(artist.mbid); + const wordMatches = wordMatchers.filter((matcher) => + matcher(normalizedName) + ).length; + + return { + artist, + similarity, + listeners, + hasMbid, + wordMatches, + }; + }) + .filter(({ similarity, wordMatches }) => { + if (!queryLower) return true; + return similarity >= 50 || wordMatches >= minWordMatches; + }) + .sort((a, b) => { + return ( + Number(b.hasMbid) - Number(a.hasMbid) || + b.wordMatches - a.wordMatches || + b.listeners - a.listeners || + b.similarity - a.similarity + ); + }); + + const uniqueArtists: any[] = []; + + for (const entry of scoredArtists) { + const artist = entry.artist; + if (this.isDuplicateArtist(uniqueArtists, artist)) { + continue; + } + + uniqueArtists.push(artist); + } + + if (uniqueArtists.length > 0 && uniqueArtists.length < limit) { + const primaryArtist = uniqueArtists[0]; + try { + const fallbackSimilar = await this.getSimilarArtists( + primaryArtist.mbid || "", + primaryArtist.name, + limit * 2 + ); + + for (const similar of fallbackSimilar) { + if (uniqueArtists.length >= limit) { + break; + } + + const candidate = { + name: similar.name, + mbid: similar.mbid, + listeners: 0, + url: similar.url, + image: [], + }; + + if (this.isDuplicateArtist(uniqueArtists, candidate)) { + continue; + } + + uniqueArtists.push(candidate); + } + } catch (error) { + console.warn( + "[LAST.FM SEARCH] Similar artist fallback failed:", + error + ); + } + } + + const limitedArtists = uniqueArtists.slice(0, limit); + + console.log( + ` → Filtered to ${limitedArtists.length} relevant matches (limit: ${limit})` + ); + + const enrichmentCount = Math.min(5, limitedArtists.length); + const [enriched, fast] = await Promise.all([ + Promise.all( + limitedArtists + .slice(0, enrichmentCount) + .map((artist: any) => + this.buildArtistSearchResult(artist, true) + ) + ), + Promise.all( + limitedArtists + .slice(enrichmentCount) + .map((artist: any) => + this.buildArtistSearchResult(artist, false) + ) + ), + ]); + + return [...enriched, ...fast].filter(Boolean); + } catch (error) { + console.error("Last.fm artist search error:", error); + return []; + } + } + + /** + * Search for tracks on Last.fm + */ + async searchTracks(query: string, limit = 20) { + try { + const data = await this.request({ + method: "track.search", + track: query, + api_key: this.apiKey, + format: "json", + limit, + }); + + const tracks = data.results?.trackmatches?.track || []; + + console.log( + `\n [LAST.FM TRACK SEARCH] Found ${tracks.length} tracks` + ); + + const validTracks = tracks.filter( + (track: any) => !this.isInvalidArtistName(track.artist) + ); + const limitedTracks = validTracks.slice(0, limit); + + const enrichmentCount = Math.min(8, limitedTracks.length); + + const [enriched, fast] = await Promise.all([ + Promise.all( + limitedTracks + .slice(0, enrichmentCount) + .map((track: any) => + this.buildTrackSearchResult(track, true) + ) + ), + Promise.all( + limitedTracks + .slice(enrichmentCount) + .map((track: any) => + this.buildTrackSearchResult(track, false) + ) + ), + ]); + + return [...enriched, ...fast].filter(Boolean); + } catch (error) { + console.error("Last.fm track search error:", error); + return []; + } + } + + /** + * Get detailed track info including album + */ + async getTrackInfo(artistName: string, trackName: string) { + try { + const data = await this.request({ + method: "track.getInfo", + artist: artistName, + track: trackName, + api_key: this.apiKey, + format: "json", + }); + + return data.track; + } catch (error) { + // Don't log errors for track info (many tracks don't have full info) + return null; + } + } + + /** + * Get popular artists from Last.fm charts + */ + async getTopChartArtists(limit = 20) { + await this.ensureInitialized(); + + // Return empty if no API key configured + if (!this.apiKey) { + console.warn( + "Last.fm: Cannot fetch chart artists - no API key configured" + ); + return []; + } + + const cacheKey = `lastfm:chart:artists:${limit}`; + + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + try { + const data = await this.request({ + method: "chart.getTopArtists", + api_key: this.apiKey, + format: "json", + limit, + }); + + const artists = data.artists?.artist || []; + + // Get detailed info for each artist with images + const detailedArtists = await Promise.all( + artists.map(async (artist: any) => { + // Try to get image from Fanart.tv using MBID + let image = null; + if (artist.mbid) { + try { + image = await fanartService.getArtistImage( + artist.mbid + ); + } catch (error) { + // Silently fail + } + } + + // Fallback to Deezer (most reliable) + if (!image) { + try { + const deezerImage = + await deezerService.getArtistImage(artist.name); + if (deezerImage) { + image = deezerImage; + } + } catch (error) { + // Silently fail + } + } + + // Last fallback to Last.fm images (but filter placeholders) + if (!image) { + const lastFmImage = this.getBestImage(artist.image); + if ( + lastFmImage && + !lastFmImage.includes( + "2a96cbd8b46e442fc41c2b86b821562f" + ) + ) { + image = lastFmImage; + } + } + + return { + type: "music", + id: artist.mbid || artist.name, + name: artist.name, + listeners: parseInt(artist.listeners || "0"), + playCount: parseInt(artist.playcount || "0"), + url: artist.url, + image, + mbid: artist.mbid, + }; + }) + ); + + // Cache for 6 hours (charts update frequently) + try { + await redisClient.setEx( + cacheKey, + 21600, + JSON.stringify(detailedArtists) + ); + } catch (err) { + console.warn("Redis set error:", err); + } + + return detailedArtists; + } catch (error) { + console.error("Last.fm chart artists error:", error); + return []; + } + } +} + +export const lastFmService = new LastFmService(); diff --git a/backend/src/services/lidarr.ts b/backend/src/services/lidarr.ts new file mode 100644 index 0000000..ce9334f --- /dev/null +++ b/backend/src/services/lidarr.ts @@ -0,0 +1,2057 @@ +import axios, { AxiosInstance } from "axios"; +import { config } from "../config"; +import { getSystemSettings } from "../utils/systemSettings"; + +interface LidarrArtist { + id: number; + artistName: string; + foreignArtistId: string; // MusicBrainz ID + monitored: boolean; + tags?: number[]; // Tag IDs +} + +interface LidarrTag { + id: number; + label: string; +} + +// Discovery tag label - used to identify discovery artists in Lidarr +const DISCOVERY_TAG_LABEL = "lidify-discovery"; + +interface LidarrAlbum { + id: number; + title: string; + foreignAlbumId: string; // MusicBrainz release group ID + artistId: number; + monitored: boolean; + artist?: { + foreignArtistId: string; // MusicBrainz artist ID + artistName: string; + }; +} + +class LidarrService { + private client: AxiosInstance | null = null; + private enabled: boolean; + private initialized: boolean = false; + + constructor() { + // Initial check from .env (for backwards compatibility) + this.enabled = config.lidarr?.enabled || false; + + if (this.enabled && config.lidarr) { + this.client = axios.create({ + baseURL: config.lidarr.url, + timeout: 30000, + headers: { + "X-Api-Key": config.lidarr.apiKey, + }, + }); + } + } + + private async ensureInitialized() { + if (this.initialized) return; + + try { + // Try to load from database + const settings = await getSystemSettings(); + + if (settings && settings.lidarrEnabled) { + const url = settings.lidarrUrl || config.lidarr?.url; + const apiKey = settings.lidarrApiKey || config.lidarr?.apiKey; + + if (url && apiKey) { + console.log("Lidarr configured from database"); + this.client = axios.create({ + baseURL: url, + timeout: 30000, + headers: { + "X-Api-Key": apiKey, + }, + }); + this.enabled = true; + } else { + console.warn(" Lidarr enabled but missing URL or API key"); + this.enabled = false; + } + } else if (config.lidarr) { + // Fallback to .env + console.log("Lidarr configured from .env"); + this.enabled = true; + } else { + console.log(" Lidarr not enabled"); + this.enabled = false; + } + } catch (error) { + console.error("Failed to load Lidarr settings:", error); + // Keep .env config if database fails + } + + this.initialized = true; + } + + async isEnabled(): Promise { + await this.ensureInitialized(); + return this.enabled; + } + + /** + * Ensure the root folder exists in Lidarr, fallback to first available if not + */ + private async ensureRootFolderExists( + requestedPath: string + ): Promise { + if (!this.client) { + return requestedPath; + } + + try { + // Get all root folders from Lidarr + const response = await this.client.get("/api/v1/rootfolder"); + const rootFolders = response.data; + + if (rootFolders.length === 0) { + console.warn(" No root folders configured in Lidarr!"); + return requestedPath; + } + + // Check if requested path exists + const exists = rootFolders.find( + (folder: any) => folder.path === requestedPath + ); + + if (exists) { + return requestedPath; + } + + // Fallback to first available root folder + const fallback = rootFolders[0].path; + console.log(` Root folder "${requestedPath}" not found in Lidarr`); + console.log(` Using fallback: "${fallback}"`); + return fallback; + } catch (error) { + console.error("Error checking root folders:", error); + return requestedPath; // Return requested path and let Lidarr error if needed + } + } + + async searchArtist( + artistName: string, + mbid?: string + ): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + const response = await this.client.get("/api/v1/artist/lookup", { + params: { + term: mbid ? `lidarr:${mbid}` : artistName, + }, + }); + + // If Lidarr's lookup returned results, use them + if (response.data && response.data.length > 0) { + return response.data; + } + + // FALLBACK: Lidarr's metadata server may be having issues + // If we have an MBID, create a minimal artist object from our own MusicBrainz data + if (mbid) { + console.log(` [FALLBACK] Lidarr lookup failed, using direct MusicBrainz data for MBID: ${mbid}`); + + try { + // Import MusicBrainz service dynamically to avoid circular deps + const { musicBrainzService } = await import("./musicbrainz"); + + // Get artist info from MusicBrainz directly + const mbArtists = await musicBrainzService.searchArtist(artistName, 5); + const mbArtist = mbArtists?.find(a => a.id === mbid) || mbArtists?.[0]; + + if (mbArtist) { + // Create a minimal Lidarr-compatible artist object + const fallbackArtist: LidarrArtist = { + id: 0, // Will be assigned when added + artistName: mbArtist.name || artistName, + foreignArtistId: mbid, + artistType: mbArtist.type || "Person", + monitored: false, + qualityProfileId: 1, + metadataProfileId: 1, + rootFolderPath: "/music", + tags: [], + statistics: { albumCount: 0 } + }; + + console.log(` [FALLBACK] Created artist from MusicBrainz: ${fallbackArtist.artistName}`); + return [fallbackArtist]; + } + } catch (mbError: any) { + console.error(` [FALLBACK] MusicBrainz lookup also failed:`, mbError.message); + } + } + + return response.data || []; + } catch (error) { + console.error("Lidarr artist search error:", error); + + // FALLBACK on error too + if (mbid) { + console.log(` [FALLBACK] Lidarr error, trying MusicBrainz for MBID: ${mbid}`); + try { + const { musicBrainzService } = await import("./musicbrainz"); + const mbArtists = await musicBrainzService.searchArtist(artistName, 5); + const mbArtist = mbArtists?.find(a => a.id === mbid) || mbArtists?.[0]; + + if (mbArtist) { + const fallbackArtist: LidarrArtist = { + id: 0, + artistName: mbArtist.name || artistName, + foreignArtistId: mbid, + artistType: mbArtist.type || "Person", + monitored: false, + qualityProfileId: 1, + metadataProfileId: 1, + rootFolderPath: "/music", + tags: [], + statistics: { albumCount: 0 } + }; + console.log(` [FALLBACK] Created artist from MusicBrainz: ${fallbackArtist.artistName}`); + return [fallbackArtist]; + } + } catch (mbError: any) { + console.error(` [FALLBACK] MusicBrainz also failed:`, mbError.message); + } + } + + return []; + } + } + + async addArtist( + mbid: string, + artistName: string, + rootFolderPath: string = "/music", + searchForMissingAlbums: boolean = true, + monitorAllAlbums: boolean = true, + isDiscovery: boolean = false + ): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + // Get discovery tag ID if this is a discovery add + let discoveryTagId: number | null = null; + if (isDiscovery) { + discoveryTagId = await this.getOrCreateDiscoveryTag(); + if (discoveryTagId) { + console.log(`[LIDARR] Will apply discovery tag (ID: ${discoveryTagId}) to artist`); + } + } + + try { + // Ensure root folder exists, fallback to default if not + const validRootFolder = await this.ensureRootFolderExists( + rootFolderPath + ); + + console.log( + ` Searching Lidarr for artist: "${artistName}"${ + mbid ? ` (MBID: ${mbid})` : " (no MBID - using name search)" + }` + ); + console.log(` Root folder: ${validRootFolder}`); + + // Search for artist (by MBID if available, otherwise by name) + const searchResults = await this.searchArtist(artistName, mbid); + + if (searchResults.length === 0) { + console.error(` Artist not found in Lidarr: ${artistName}`); + return null; + } + + console.log(` Found ${searchResults.length} results from Lidarr`); + + let artistData: LidarrArtist; + + if (mbid) { + // STRICT MBID FILTERING - Only use exact MBID match + const exactMatch = searchResults.find( + (artist) => artist.foreignArtistId === mbid + ); + + if (!exactMatch) { + console.error( + ` No exact MBID match found for: ${artistName} (${mbid})` + ); + console.log( + " Available results:", + searchResults.map((a) => ({ + name: a.artistName, + mbid: a.foreignArtistId, + type: a.artistType, + })) + ); + return null; + } + + // ADDITIONAL CHECK: If exact match is a "Group" with 0 albums, + // look for a better match with same name but different type + if ( + exactMatch.artistType === "Group" && + (exactMatch.statistics?.albumCount || 0) === 0 + ) { + console.log( + ` Exact MBID match is a Group with 0 albums - checking for better match...` + ); + + // Look for same artist name but different type with albums + const betterMatch = searchResults.find( + (artist) => + artist.artistName.toLowerCase() === + exactMatch.artistName.toLowerCase() && + artist.foreignArtistId !== mbid && + (artist.statistics?.albumCount || 0) > 0 && + (artist.artistType === "Person" || + artist.artistType === "Artist") + ); + + if (betterMatch) { + console.log( + ` Found better match: "${ + betterMatch.artistName + }" (Type: ${betterMatch.artistType}, Albums: ${ + betterMatch.statistics?.albumCount || 0 + })` + ); + artistData = betterMatch; + } else { + console.log( + ` No better match found, using Group entry` + ); + artistData = exactMatch; + } + } else { + console.log( + `Exact match found: "${exactMatch.artistName}" (Type: ${ + exactMatch.artistType + }, Albums: ${exactMatch.statistics?.albumCount || 0})` + ); + artistData = exactMatch; + } + } else { + // FALLBACK: No MBID - Use smart filtering for best match + console.log(" No MBID available - using smart selection..."); + + // Filter and score results + const scoredResults = searchResults.map((artist) => { + let score = 0; + + // Prefer "Person" or "Group" types for actual artists + const type = (artist.artistType || "").toLowerCase(); + if (type === "person") score += 1000; + else if (type === "group") score += 900; + else if (type === "artist") score += 800; + + // Album count (more albums = more likely correct) + const albumCount = artist.statistics?.albumCount || 0; + score += albumCount * 10; + + // Exact name match bonus (case-insensitive) + const artistNameNormalized = (artist.artistName || "") + .toLowerCase() + .trim(); + const searchNameNormalized = artistName + .toLowerCase() + .trim(); + + if (artistNameNormalized === searchNameNormalized) { + score += 500; + } else if ( + artistNameNormalized.includes(searchNameNormalized) || + searchNameNormalized.includes(artistNameNormalized) + ) { + score += 250; // Partial match + } + + // Popularity + if (artist.ratings?.votes && artist.ratings?.votes > 0) { + score += Math.min(artist.ratings.votes / 10, 100); + } + + // Penalize "Various Artists" entries + if ( + artistNameNormalized.includes("various") || + artistNameNormalized.includes("compilation") + ) { + score -= 1000; + } + + return { artist, score }; + }); + + // Sort by score + scoredResults.sort((a, b) => b.score - a.score); + + // Log candidates for debugging + console.log(" Candidates:"); + scoredResults.slice(0, 3).forEach((item, i) => { + console.log( + ` ${i + 1}. "${item.artist.artistName}" - Type: ${ + item.artist.artistType || "Unknown" + } - Albums: ${ + item.artist.statistics?.albumCount || 0 + } - Score: ${item.score}${i === 0 ? " ← SELECTED" : ""}` + ); + }); + + artistData = scoredResults[0].artist; + } + + // Check if already exists + const existingArtists = await this.client.get("/api/v1/artist"); + const exists = existingArtists.data.find( + (a: LidarrArtist) => + a.foreignArtistId === artistData.foreignArtistId || + (mbid && a.foreignArtistId === mbid) + ); + + if (exists) { + console.log(`Artist already in Lidarr: ${artistName}`); + + // If this is a discovery add and artist doesn't have discovery tag, add it + if (isDiscovery && discoveryTagId) { + const existingTags = exists.tags || []; + if (!existingTags.includes(discoveryTagId)) { + console.log(` Adding discovery tag to existing artist...`); + await this.addTagsToArtist(exists.id, [discoveryTagId]); + } + } + + // If monitorAllAlbums is true, update the artist to monitor all albums + if (monitorAllAlbums) { + console.log(` Updating artist to monitor all albums...`); + try { + // Update artist settings + const updated = await this.client.put( + `/api/v1/artist/${exists.id}`, + { + ...exists, + monitored: true, + monitorNewItems: "all", + } + ); + + // Get all albums for this artist and monitor them + const albumsResponse = await this.client.get( + `/api/v1/album?artistId=${exists.id}` + ); + const albums = albumsResponse.data; + + console.log( + ` Found ${albums.length} albums to monitor` + ); + + // Monitor all albums + for (const album of albums) { + if (!album.monitored) { + await this.client.put( + `/api/v1/album/${album.id}`, + { + ...album, + monitored: true, + } + ); + } + } + + // Trigger search for all albums if requested + if (searchForMissingAlbums && albums.length > 0) { + console.log( + ` Triggering search for ${albums.length} albums...` + ); + await this.client.post("/api/v1/command", { + name: "AlbumSearch", + albumIds: albums.map((a: any) => a.id), + }); + } + + console.log( + ` Updated existing artist and monitored all albums` + ); + return updated.data; + } catch (error: any) { + console.error( + ` Failed to update artist:`, + error.message + ); + // Return original artist if update fails + return exists; + } + } + + return exists; + } + + // Add artist - use "existing" monitor option to ensure album catalog is fetched + // even if we don't want to download all albums + const artistPayload: any = { + ...artistData, + rootFolderPath: validRootFolder, + qualityProfileId: 1, // Uses default profile - could be made configurable via settings + metadataProfileId: 1, + monitored: true, + monitorNewItems: monitorAllAlbums ? "all" : "none", + addOptions: { + monitor: "existing", // Always fetch album catalog, but don't monitor unless requested + searchForMissingAlbums, + }, + }; + + // Apply discovery tag if this is a discovery add + if (discoveryTagId) { + artistPayload.tags = [discoveryTagId]; + } + + const response = await this.client.post("/api/v1/artist", artistPayload); + + console.log(`Added artist to Lidarr: ${artistName}${isDiscovery ? " (tagged as discovery)" : ""}`); + + // Trigger metadata refresh to ensure album catalog is populated + if (!searchForMissingAlbums) { + console.log(` Triggering metadata refresh for new artist...`); + try { + await this.client.post("/api/v1/command", { + name: "RefreshArtist", + artistId: response.data.id, + }); + } catch (refreshError) { + console.warn(` Metadata refresh command failed (non-blocking)`); + } + } + + return response.data; + } catch (error: any) { + console.error( + "Lidarr add artist error:", + error.response?.data || error.message + ); + return null; + } + } + + async searchAlbum( + artistName: string, + albumTitle: string, + rgMbid?: string + ): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + const searchTerm = rgMbid + ? `lidarr:${rgMbid}` + : `${artistName} ${albumTitle}`; + console.log(` Searching Lidarr for album: ${searchTerm}`); + + const response = await this.client.get("/api/v1/album/lookup", { + params: { + term: searchTerm, + }, + }); + + console.log(` Found ${response.data.length} album result(s)`); + return response.data; + } catch (error: any) { + console.error(` ✗ Lidarr album search error: ${error.message}`); + if (error.response?.data) { + console.error(` Response:`, error.response.data); + } + return []; + } + } + + /** + * Get all albums for an artist that exist in Lidarr's catalog + * Used for same-artist fallback to avoid trying MusicBrainz albums that Lidarr can't find + */ + async getArtistAlbums(artistMbid: string): Promise { + if (!this.client) { + console.warn("Lidarr not enabled"); + return []; + } + + try { + // First find the artist in Lidarr + const artistsResponse = await this.client.get("/api/v1/artist"); + const artist = artistsResponse.data.find( + (a: LidarrArtist) => a.foreignArtistId === artistMbid + ); + + if (!artist) { + console.log(` Artist not found in Lidarr: ${artistMbid}`); + return []; + } + + // Get albums for this artist + const albumsResponse = await this.client.get(`/api/v1/album?artistId=${artist.id}`); + return albumsResponse.data || []; + } catch (error: any) { + console.error(` Failed to get artist albums: ${error.message}`); + return []; + } + } + + async addAlbum( + rgMbid: string, + artistName: string, + albumTitle: string, + rootFolderPath: string = "/music", + artistMbid?: string, + isDiscovery: boolean = false + ): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + console.log(` Adding album: ${albumTitle} by ${artistName}${isDiscovery ? " (discovery)" : ""}`); + console.log(` Album MBID: ${rgMbid}`); + console.log(` Artist MBID: ${artistMbid || "none"}`); + + // NEW APPROACH: Add artist first, then find album in their catalog + // This avoids the broken external album search API + + // Check if artist exists + const existingArtists = await this.client.get("/api/v1/artist"); + let artist = existingArtists.data.find( + (a: LidarrArtist) => + artistMbid && a.foreignArtistId === artistMbid + ); + + let justAddedArtist = false; + + // If discovery and artist exists, ensure they have the discovery tag + if (isDiscovery && artist) { + const discoveryTagId = await this.getOrCreateDiscoveryTag(); + if (discoveryTagId) { + const existingTags = artist.tags || []; + if (!existingTags.includes(discoveryTagId)) { + console.log(` Adding discovery tag to existing artist...`); + await this.addTagsToArtist(artist.id, [discoveryTagId]); + } + } + } + + if (!artist && artistMbid) { + console.log(` Adding artist first: ${artistName}`); + + // Add artist WITHOUT searching for all albums + // Pass isDiscovery to tag the artist appropriately + artist = await this.addArtist( + artistMbid, + artistName, + rootFolderPath, + false, // Don't auto-download all albums + false, // Don't monitor all albums + isDiscovery // Tag as discovery if this is a discovery download + ); + + if (!artist) { + console.error(` ✗ Failed to add artist`); + return null; + } + + justAddedArtist = true; + console.log( + ` Artist added: ${artist.artistName} (ID: ${artist.id})` + ); + console.log( + ` Waiting for Lidarr to populate album catalog...` + ); + } else if (!artist) { + console.error(` ✗ Artist not found and no MBID provided`); + return null; + } else { + console.log( + ` Artist already exists: ${artist.artistName} (ID: ${artist.id})` + ); + } + + // Get artist's albums from Lidarr + let artistAlbums: LidarrAlbum[] = []; + + // First check - get current album list + const artistAlbumsResponse = await this.client.get( + `/api/v1/album?artistId=${artist.id}` + ); + artistAlbums = artistAlbumsResponse.data; + + // If we just added the artist and no albums yet, wait for metadata to populate + if (artistAlbums.length === 0 && justAddedArtist) { + console.log(` Waiting for Lidarr to fetch album metadata...`); + + // Increased timeout: 15 attempts * 3 seconds = 45 seconds total + // Large artist catalogs (e.g., prolific bands) need more time + const maxAttempts = 15; + const retryDelay = 3000; // 3 seconds between retries + + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + await new Promise((resolve) => setTimeout(resolve, retryDelay)); + + const retryResponse = await this.client.get( + `/api/v1/album?artistId=${artist.id}` + ); + artistAlbums = retryResponse.data; + + if (artistAlbums.length > 0) { + console.log(` Albums loaded after ${attempt * 3}s`); + break; + } + + if (attempt < maxAttempts) { + console.log(` Attempt ${attempt}/${maxAttempts}: Still waiting...`); + } + } + } else if (artistAlbums.length === 0 && !justAddedArtist) { + // Artist exists but has 0 albums - try refreshing metadata once + console.log(` Artist exists but has 0 albums - refreshing metadata...`); + try { + await this.client.post("/api/v1/command", { + name: "RefreshArtist", + artistId: artist.id, + }); + // Wait for refresh to complete + await new Promise((resolve) => setTimeout(resolve, 5000)); + + const retryResponse = await this.client.get( + `/api/v1/album?artistId=${artist.id}` + ); + artistAlbums = retryResponse.data; + } catch (refreshError) { + console.warn(` Metadata refresh failed`); + } + } + + console.log( + ` Found ${artistAlbums.length} albums for ${artist.artistName}` + ); + + // Find the specific album by MBID first + let albumData = artistAlbums.find( + (a: LidarrAlbum) => a.foreignAlbumId === rgMbid + ); + + // If MBID doesn't match, try STRICT name matching + // IMPORTANT: We removed loose matching (base name, first word) because it caused + // wrong albums to be downloaded (e.g., "A Trip To The Mystery Planet" matching "A Funk Odyssey") + if (!albumData) { + console.log( + ` Album MBID not found, trying STRICT name match for: ${albumTitle}` + ); + + // Normalize title for matching - remove parenthetical suffixes, edition markers, etc. + const normalizeTitle = (title: string) => + title + .toLowerCase() + .replace(/\(.*?\)/g, "") // Remove parenthetical content (deluxe edition, remaster, etc.) + .replace(/\[.*?\]/g, "") // Remove bracketed content + .replace(/[-–—]\s*(deluxe|remaster|bonus|special|anniversary|expanded|limited|collector).*$/i, "") // Remove edition suffixes + .replace(/[^\w\s]/g, "") // Remove remaining punctuation + .replace(/\s+/g, " ") // Normalize whitespace + .trim(); + + const targetTitle = normalizeTitle(albumTitle); + console.log(` Normalized target: "${targetTitle}"`); + + // Try exact normalized match first + albumData = artistAlbums.find( + (a: LidarrAlbum) => normalizeTitle(a.title) === targetTitle + ); + if (albumData) { + console.log(` ✓ Matched exact normalized: "${albumData.title}"`); + } + + // Try partial match ONLY if one contains the other completely + // This handles "Album Name" matching "Album Name (Deluxe Edition)" + if (!albumData) { + albumData = artistAlbums.find((a: LidarrAlbum) => { + const normalized = normalizeTitle(a.title); + // Only match if one is a substring of the other AND they share significant content + // The shorter one must be at least 60% of the longer one's length + const shorter = normalized.length < targetTitle.length ? normalized : targetTitle; + const longer = normalized.length >= targetTitle.length ? normalized : targetTitle; + if (longer.includes(shorter) && shorter.length >= longer.length * 0.6) { + return true; + } + return false; + }); + if (albumData) { + console.log(` ✓ Matched partial (contained): "${albumData.title}"`); + } + } + + // NO base name matching - this caused wrong albums to be matched + // NO first word matching - this caused wrong albums to be matched + // If we don't have an exact or contained match, we should FAIL + // and let the discovery system find a different album + + if (albumData) { + console.log( + ` Final match: "${albumData.title}" (MBID: ${albumData.foreignAlbumId})` + ); + } else { + console.log(` ✗ No strict match found - will NOT use loose matching to avoid wrong albums`); + } + } + + if (!albumData) { + console.error( + ` ✗ Album "${albumTitle}" not found in artist's ${artistAlbums.length} albums` + ); + if (artistAlbums.length > 0) { + console.log(` Looking for: "${albumTitle}" (MBID: ${rgMbid})`); + console.log(` Available albums in Lidarr (showing up to 10):`); + artistAlbums.slice(0, 10).forEach((a: LidarrAlbum) => { + console.log(` - "${a.title}" (${a.foreignAlbumId})`); + }); + } + // Return null - let the caller handle replacement logic + // We should NOT download a random album that isn't what was requested + return null; + } + + console.log(` Found album in catalog: ${albumData.title} (ID: ${albumData.id})`); + + // Ensure artist is monitored (might have been added with monitoring disabled) + if (!artist.monitored) { + console.log(` Enabling artist monitoring...`); + await this.client.put(`/api/v1/artist/${artist.id}`, { + ...artist, + monitored: true, + }); + console.log(` Artist monitoring enabled`); + } else { + console.log(` Artist already monitored`); + } + + // CRITICAL: Fetch the FULL album data from Lidarr + // The album list endpoint may return incomplete data + console.log(` Fetching full album data from Lidarr...`); + const fullAlbumResponse = await this.client.get(`/api/v1/album/${albumData.id}`); + const fullAlbumData = fullAlbumResponse.data; + + console.log(` Full album data retrieved:`, JSON.stringify({ + id: fullAlbumData.id, + title: fullAlbumData.title, + monitored: fullAlbumData.monitored, + foreignAlbumId: fullAlbumData.foreignAlbumId, + anyReleaseOk: fullAlbumData.anyReleaseOk, + profileId: fullAlbumData.profileId, + releases: fullAlbumData.releases?.length || 0, + }, null, 2)); + + // ALWAYS monitor and search for the album, even if already monitored + // This ensures Lidarr picks up the request + // Preserve user's anyReleaseOk setting - we'll only change it if search fails later + console.log(` Setting album monitoring to true...`); + + const updateResponse = await this.client.put( + `/api/v1/album/${fullAlbumData.id}`, + { + ...fullAlbumData, + monitored: true, + } + ); + + console.log(` PUT response monitored: ${updateResponse.data.monitored}`); + + // CRITICAL: Re-fetch the album to verify the change actually persisted + const verifyResponse = await this.client.get(`/api/v1/album/${fullAlbumData.id}`); + const verifiedMonitored = verifyResponse.data.monitored; + + console.log(` Album monitoring VERIFIED after re-fetch: ${verifiedMonitored}`); + + if (!verifiedMonitored) { + console.error(` ✗ CRITICAL: Album monitoring failed to persist!`); + console.error(` Full album data we sent:`, JSON.stringify(fullAlbumData, null, 2).slice(0, 500)); + console.error(` Response from GET after PUT:`, JSON.stringify(verifyResponse.data, null, 2).slice(0, 500)); + } + + // Use the verified album data + const updatedAlbum = verifyResponse.data; + + // Check if album has releases - if not, refresh artist metadata from MusicBrainz + const releaseCount = updatedAlbum.releases?.length || 0; + if (releaseCount === 0) { + console.warn( + ` Album has 0 releases - refreshing artist metadata from MusicBrainz...` + ); + + // Trigger artist refresh to fetch latest metadata + await this.client.post("/api/v1/command", { + name: "RefreshArtist", + artistId: artist.id, + }); + + console.log(` Waiting for metadata refresh to complete...`); + // Wait for refresh to complete (Lidarr processes this asynchronously) + await new Promise((resolve) => setTimeout(resolve, 5000)); + + // Re-fetch the album to see if releases were populated + const refreshedAlbumResponse = await this.client.get( + `/api/v1/album/${updatedAlbum.id}` + ); + const refreshedAlbum = refreshedAlbumResponse.data; + const newReleaseCount = refreshedAlbum.releases?.length || 0; + + console.log( + ` After refresh: ${newReleaseCount} releases found` + ); + + if (newReleaseCount === 0) { + console.warn(` Still no releases after refresh!`); + console.warn( + ` This album may not be properly indexed in MusicBrainz yet.` + ); + console.warn(` Download will be attempted but may fail.`); + } + } + + // ALWAYS trigger search to download the album + console.log(` Triggering album search command for album ID ${updatedAlbum.id}...`); + const searchResponse = await this.client.post("/api/v1/command", { + name: "AlbumSearch", + albumIds: [updatedAlbum.id], + }); + console.log( + ` Search command sent (Command ID: ${searchResponse.data.id})` + ); + + // Wait a moment and check if search found anything + await new Promise((resolve) => setTimeout(resolve, 3000)); + const commandStatus = await this.client.get(`/api/v1/command/${searchResponse.data.id}`); + console.log(` Search result: ${commandStatus.data.message || 'pending'}`); + + if (commandStatus.data.message?.includes('0 reports')) { + // Check if anyReleaseOk is already true - if not, try enabling it + if (!updatedAlbum.anyReleaseOk) { + console.log(` [RETRY] No results with strict matching. Trying with anyReleaseOk=true...`); + + // Re-fetch album to ensure we have latest data + const refetchResponse = await this.client.get(`/api/v1/album/${updatedAlbum.id}`); + const refetchedAlbum = refetchResponse.data; + + // Enable anyReleaseOk + await this.client.put(`/api/v1/album/${updatedAlbum.id}`, { + ...refetchedAlbum, + anyReleaseOk: true, + }); + console.log(` Set anyReleaseOk=true for album`); + + // Retry search + console.log(` Retrying album search...`); + const retryResponse = await this.client.post("/api/v1/command", { + name: "AlbumSearch", + albumIds: [updatedAlbum.id], + }); + + // Wait and check retry result + await new Promise((resolve) => setTimeout(resolve, 3000)); + const retryStatus = await this.client.get(`/api/v1/command/${retryResponse.data.id}`); + console.log(` Retry search result: ${retryStatus.data.message || 'pending'}`); + + if (retryStatus.data.message?.includes('0 reports')) { + console.warn(` [FAIL] Still no releases found even with anyReleaseOk=true.`); + throw new Error("No releases available - indexers found no matching downloads"); + } else { + console.log(` ✓ Found releases after enabling anyReleaseOk`); + } + } else { + console.warn(` [FAIL] No releases grabbed automatically (anyReleaseOk already true).`); + throw new Error("No releases available - indexers found no matching downloads"); + } + } + + console.log(` Album download started: ${updatedAlbum.title}`); + return updatedAlbum; + } catch (error: any) { + // Re-throw our own errors (like "No releases available") + if (error.message?.includes("No releases available")) { + throw error; + } + console.error( + "Lidarr add album error:", + error.response?.data || error.message + ); + return null; + } + } + + async rescanLibrary(): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + await this.client.post("/api/v1/command", { + name: "RescanFolders", + }); + + console.log("Triggered Lidarr library rescan"); + } catch (error) { + console.error("Lidarr rescan error:", error); + throw error; + } + } + + async getArtists(): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return []; + } + + try { + const response = await this.client.get("/api/v1/artist"); + return response.data; + } catch (error) { + console.error("Lidarr get artists error:", error); + return []; + } + } + + /** + * Delete an artist from Lidarr by MusicBrainz ID + * This removes the artist and optionally deletes files + */ + async deleteArtist( + mbid: string, + deleteFiles: boolean = true + ): Promise<{ success: boolean; message: string }> { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return { success: false, message: "Lidarr not enabled or configured" }; + } + + if (!mbid || mbid.startsWith("temp-")) { + return { success: false, message: "Invalid or temporary MBID" }; + } + + try { + // Find artist in Lidarr by foreignArtistId (MBID) + const artists = await this.getArtists(); + const lidarrArtist = artists.find(a => a.foreignArtistId === mbid); + + if (!lidarrArtist) { + console.log(`[LIDARR] Artist with MBID ${mbid} not found in Lidarr`); + return { success: true, message: "Artist not in Lidarr (already removed or never added)" }; + } + + console.log(`[LIDARR] Deleting artist: ${lidarrArtist.artistName} (ID: ${lidarrArtist.id})`); + + // Delete the artist from Lidarr (with timeout to prevent hanging) + await this.client.delete(`/api/v1/artist/${lidarrArtist.id}`, { + params: { + deleteFiles: deleteFiles, + addImportListExclusion: false, + }, + timeout: 30000, // 30 second timeout + }); + + console.log(`[LIDARR] Successfully deleted artist: ${lidarrArtist.artistName}`); + return { success: true, message: `Deleted ${lidarrArtist.artistName} from Lidarr` }; + } catch (error: any) { + console.error("[LIDARR] Delete artist error:", error?.message || error); + return { success: false, message: error?.message || "Failed to delete from Lidarr" }; + } + } + + /** + * Delete an album from Lidarr by Lidarr album ID + * This unmonitors the album and optionally deletes files + */ + async deleteAlbum( + lidarrAlbumId: number, + deleteFiles: boolean = true + ): Promise<{ success: boolean; message: string }> { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return { success: false, message: "Lidarr not enabled or configured" }; + } + + try { + console.log(`[LIDARR] Deleting album ID: ${lidarrAlbumId}`); + + // First get the album to check for track files + const albumResponse = await this.client.get(`/api/v1/album/${lidarrAlbumId}`); + const album = albumResponse.data; + const artistId = album.artistId; + const albumTitle = album.title || "Unknown"; + + if (deleteFiles) { + // Get track files for this album + const trackFilesResponse = await this.client.get("/api/v1/trackFile", { + params: { albumId: lidarrAlbumId }, + }); + + const trackFiles = trackFilesResponse.data; + + if (trackFiles && trackFiles.length > 0) { + // Delete each track file + for (const trackFile of trackFiles) { + try { + await this.client.delete(`/api/v1/trackFile/${trackFile.id}`); + } catch (e) { + // Ignore individual file deletion errors + } + } + console.log(`[LIDARR] Deleted ${trackFiles.length} track files for album: ${albumTitle}`); + } + } + + // Unmonitor the album (don't delete the album record, just unmonitor) + await this.client.put(`/api/v1/album/${lidarrAlbumId}`, { + ...album, + monitored: false, + }); + + console.log(`[LIDARR] Successfully unmonitored album: ${albumTitle}`); + return { success: true, message: `Deleted files and unmonitored ${albumTitle}` }; + } catch (error: any) { + console.error("[LIDARR] Delete album error:", error?.message || error); + return { success: false, message: error?.message || "Failed to delete album from Lidarr" }; + } + } + + /** + * Check if an album exists in Lidarr and has files (already downloaded) + * Returns true if the album is already available in Lidarr + */ + async isAlbumAvailable(albumMbid: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return false; + } + + try { + // Search for the album by MBID + const response = await this.client.get("/api/v1/album", { + params: { foreignAlbumId: albumMbid }, + }); + + const albums = response.data; + if (!albums || albums.length === 0) { + return false; + } + + // Check if any matching album has files (statistics.percentOfTracks > 0) + for (const album of albums) { + if (album.foreignAlbumId === albumMbid) { + // Album exists in Lidarr - check if it has files + const hasFiles = album.statistics?.percentOfTracks > 0; + if (hasFiles) { + return true; + } + } + } + + return false; + } catch (error: any) { + // If 404 or other error, album doesn't exist + if (error.response?.status === 404) { + return false; + } + console.error("Lidarr album check error:", error.message); + return false; + } + } + + /** + * Check if an album exists in Lidarr by artist name and album title + * Handles MBID mismatches between MusicBrainz and Lidarr + */ + async isAlbumAvailableByTitle(artistName: string, albumTitle: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return false; + } + + const normalizedArtist = artistName.toLowerCase().trim(); + const normalizedAlbum = albumTitle.toLowerCase().trim(); + + try { + // Get all artists from Lidarr + const artistsResponse = await this.client.get("/api/v1/artist"); + const artists = artistsResponse.data || []; + + // Find matching artist by name + const matchingArtist = artists.find((a: any) => + a.artistName?.toLowerCase().trim() === normalizedArtist || + a.sortName?.toLowerCase().trim() === normalizedArtist + ); + + if (!matchingArtist) { + return false; + } + + // Get albums for this artist + const albumsResponse = await this.client.get("/api/v1/album", { + params: { artistId: matchingArtist.id }, + }); + const albums = albumsResponse.data || []; + + // Check if any album matches the title and has files + for (const album of albums) { + const albumTitleNorm = album.title?.toLowerCase().trim() || ""; + if (albumTitleNorm === normalizedAlbum || albumTitleNorm.includes(normalizedAlbum)) { + const hasFiles = album.statistics?.percentOfTracks > 0; + if (hasFiles) { + return true; + } + } + } + + return false; + } catch (error: any) { + console.error("Lidarr album check by title error:", error.message); + return false; + } + } + + /** + * Check if an artist exists in Lidarr + */ + async isArtistInLidarr(artistMbid: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return false; + } + + try { + const response = await this.client.get("/api/v1/artist"); + const artists = response.data; + return artists.some((a: any) => a.foreignArtistId === artistMbid); + } catch (error) { + return false; + } + } + + // ============================================ + // Tag Management Methods (for discovery tracking) + // ============================================ + + /** + * Get all tags from Lidarr + */ + async getTags(): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return []; + } + + try { + const response = await this.client.get("/api/v1/tag"); + return response.data || []; + } catch (error: any) { + console.error("[LIDARR] Failed to get tags:", error.message); + return []; + } + } + + /** + * Create a new tag in Lidarr + */ + async createTag(label: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return null; + } + + try { + const response = await this.client.post("/api/v1/tag", { label }); + console.log(`[LIDARR] Created tag: ${label} (ID: ${response.data.id})`); + return response.data; + } catch (error: any) { + console.error("[LIDARR] Failed to create tag:", error.message); + return null; + } + } + + /** + * Get or create the discovery tag + * Returns the tag ID, caching it for subsequent calls + */ + private discoveryTagId: number | null = null; + + async getOrCreateDiscoveryTag(): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return null; + } + + // Return cached tag ID if available + if (this.discoveryTagId !== null) { + return this.discoveryTagId; + } + + try { + // Check if tag already exists + const tags = await this.getTags(); + const existingTag = tags.find(t => t.label === DISCOVERY_TAG_LABEL); + + if (existingTag) { + console.log(`[LIDARR] Found existing discovery tag (ID: ${existingTag.id})`); + this.discoveryTagId = existingTag.id; + return existingTag.id; + } + + // Create the tag + const newTag = await this.createTag(DISCOVERY_TAG_LABEL); + if (newTag) { + this.discoveryTagId = newTag.id; + return newTag.id; + } + + return null; + } catch (error: any) { + console.error("[LIDARR] Failed to get/create discovery tag:", error.message); + return null; + } + } + + /** + * Add tags to an artist + */ + async addTagsToArtist(artistId: number, tagIds: number[]): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return false; + } + + try { + // Get current artist data + const response = await this.client.get(`/api/v1/artist/${artistId}`); + const artist = response.data; + + // Merge new tags with existing (avoid duplicates) + const existingTags = artist.tags || []; + const mergedTags = [...new Set([...existingTags, ...tagIds])]; + + // Update artist with new tags + await this.client.put(`/api/v1/artist/${artistId}`, { + ...artist, + tags: mergedTags, + }); + + console.log(`[LIDARR] Added tags ${tagIds} to artist ${artist.artistName}`); + return true; + } catch (error: any) { + console.error("[LIDARR] Failed to add tags to artist:", error.message); + return false; + } + } + + /** + * Remove tags from an artist + */ + async removeTagsFromArtist(artistId: number, tagIds: number[]): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return false; + } + + try { + // Get current artist data + const response = await this.client.get(`/api/v1/artist/${artistId}`); + const artist = response.data; + + // Remove specified tags + const existingTags = artist.tags || []; + const filteredTags = existingTags.filter((t: number) => !tagIds.includes(t)); + + // Update artist with filtered tags + await this.client.put(`/api/v1/artist/${artistId}`, { + ...artist, + tags: filteredTags, + }); + + console.log(`[LIDARR] Removed tags ${tagIds} from artist ${artist.artistName}`); + return true; + } catch (error: any) { + console.error("[LIDARR] Failed to remove tags from artist:", error.message); + return false; + } + } + + /** + * Get all artists that have a specific tag + */ + async getArtistsByTag(tagId: number): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return []; + } + + try { + const response = await this.client.get("/api/v1/artist"); + const artists: LidarrArtist[] = response.data; + + // Filter artists that have the specified tag + return artists.filter(artist => artist.tags?.includes(tagId)); + } catch (error: any) { + console.error("[LIDARR] Failed to get artists by tag:", error.message); + return []; + } + } + + /** + * Get all discovery-tagged artists (convenience method) + */ + async getDiscoveryArtists(): Promise { + const tagId = await this.getOrCreateDiscoveryTag(); + if (!tagId) { + return []; + } + return this.getArtistsByTag(tagId); + } + + /** + * Remove discovery tag from an artist by MBID + * Used when user likes an album (artist becomes "owned") + */ + async removeDiscoveryTagByMbid(artistMbid: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return false; + } + + try { + const tagId = await this.getOrCreateDiscoveryTag(); + if (!tagId) { + return false; + } + + // Find artist by MBID + const artists = await this.getArtists(); + const artist = artists.find(a => a.foreignArtistId === artistMbid); + + if (!artist) { + console.log(`[LIDARR] Artist ${artistMbid} not found in Lidarr`); + return true; // Not an error - artist might not be in Lidarr + } + + // Check if artist has the discovery tag + if (!artist.tags?.includes(tagId)) { + console.log(`[LIDARR] Artist ${artist.artistName} doesn't have discovery tag`); + return true; // Already doesn't have tag + } + + return await this.removeTagsFromArtist(artist.id, [tagId]); + } catch (error: any) { + console.error("[LIDARR] Failed to remove discovery tag:", error.message); + return false; + } + } + + /** + * Delete artist by Lidarr ID (used for cleanup) + */ + async deleteArtistById( + lidarrId: number, + deleteFiles: boolean = true + ): Promise<{ success: boolean; message: string }> { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return { success: false, message: "Lidarr not enabled" }; + } + + try { + await this.client.delete(`/api/v1/artist/${lidarrId}`, { + params: { + deleteFiles, + addImportListExclusion: false, + }, + timeout: 30000, + }); + + return { success: true, message: "Artist deleted" }; + } catch (error: any) { + if (error.response?.status === 404) { + return { success: true, message: "Artist already removed" }; + } + console.error("[LIDARR] Delete artist by ID error:", error.message); + return { success: false, message: error.message }; + } + } + + // ============================================ + // Release Iteration Methods (for exhaustive retry) + // ============================================ + + /** + * Get all available releases for an album from all indexers + * This is what Lidarr's "Interactive Search" uses + */ + async getAlbumReleases(lidarrAlbumId: number): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + console.log(`[LIDARR] Fetching releases for album ID: ${lidarrAlbumId}`); + const response = await this.client.get("/api/v1/release", { + params: { albumId: lidarrAlbumId }, + timeout: 60000, // 60s timeout for indexer searches + }); + + const releases: LidarrRelease[] = response.data || []; + console.log(`[LIDARR] Found ${releases.length} releases from indexers`); + + // Sort by preferred criteria (Lidarr already sorts by quality/preferred words) + // but we can add seeders as a secondary sort for torrents + releases.sort((a, b) => { + // Approved releases first + if (a.approved && !b.approved) return -1; + if (!a.approved && b.approved) return 1; + + // Higher seeders for torrents + if (a.seeders !== undefined && b.seeders !== undefined) { + return b.seeders - a.seeders; + } + + // Keep original order (Lidarr's quality sorting) + return 0; + }); + + return releases; + } catch (error: any) { + console.error(`[LIDARR] Failed to fetch releases:`, error.message); + return []; + } + } + + /** + * Grab (download) a specific release by GUID + * This tells Lidarr to download the specified release + */ + async grabRelease(release: LidarrRelease): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + console.log(`[LIDARR] Grabbing release: ${release.title}`); + console.log(` GUID: ${release.guid}`); + console.log(` Indexer: ${release.indexer || 'unknown'}`); + console.log(` Size: ${Math.round((release.size || 0) / 1024 / 1024)} MB`); + + await this.client.post("/api/v1/release", { + guid: release.guid, + indexerId: release.indexerId || 0, + }); + + console.log(`[LIDARR] Release grabbed successfully`); + return true; + } catch (error: any) { + console.error(`[LIDARR] Failed to grab release:`, error.response?.data || error.message); + return false; + } + } + + /** + * Remove a download from queue and blocklist the release + * Use skipRedownload=true since we'll manually grab the next release + */ + async blocklistAndRemove(downloadId: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + throw new Error("Lidarr not enabled"); + } + + try { + // Find the queue item by downloadId + const queueResponse = await this.client.get("/api/v1/queue", { + params: { page: 1, pageSize: 100 }, + }); + + const queueItem = queueResponse.data.records.find( + (item: any) => item.downloadId === downloadId + ); + + if (!queueItem) { + console.log(`[LIDARR] Download ${downloadId} not found in queue (may already be removed)`); + return true; // Consider it success if not in queue + } + + console.log(`[LIDARR] Blocklisting and removing: ${queueItem.title}`); + + await this.client.delete(`/api/v1/queue/${queueItem.id}`, { + params: { + removeFromClient: true, + blocklist: true, + skipRedownload: true, // We'll grab the next release manually + }, + }); + + console.log(`[LIDARR] Successfully blocklisted: ${queueItem.title}`); + return true; + } catch (error: any) { + console.error(`[LIDARR] Failed to blocklist:`, error.response?.data || error.message); + return false; + } + } + + /** + * Find queue item by download ID + */ + async findQueueItemByDownloadId(downloadId: string): Promise { + await this.ensureInitialized(); + + if (!this.enabled || !this.client) { + return null; + } + + try { + const response = await this.client.get("/api/v1/queue", { + params: { page: 1, pageSize: 100 }, + }); + + return response.data.records.find( + (item: any) => item.downloadId === downloadId + ) || null; + } catch (error: any) { + console.error(`[LIDARR] Failed to find queue item:`, error.message); + return null; + } + } + + /** + * Get upcoming and recent releases from Lidarr calendar + * Returns albums releasing within the specified date range for monitored artists + */ + async getCalendar(startDate: Date, endDate: Date): Promise { + await this.ensureInitialized(); + + if (!this.client) { + console.log("[LIDARR] Not configured - cannot fetch calendar"); + return []; + } + + try { + const start = startDate.toISOString().split('T')[0]; + const end = endDate.toISOString().split('T')[0]; + + const response = await this.client.get(`/api/v1/calendar`, { + params: { + start, + end, + includeArtist: true, + } + }); + + const releases: CalendarRelease[] = response.data.map((album: any) => ({ + id: album.id, + title: album.title, + artistName: album.artist?.artistName || 'Unknown Artist', + artistId: album.artist?.id, + artistMbid: album.artist?.foreignArtistId, + albumMbid: album.foreignAlbumId, + releaseDate: album.releaseDate, + monitored: album.monitored, + grabbed: album.grabbed || false, + hasFile: album.statistics?.percentOfTracks === 100, + coverUrl: album.images?.find((img: any) => img.coverType === 'cover')?.remoteUrl || null, + })); + + console.log(`[LIDARR] Calendar: Found ${releases.length} releases between ${start} and ${end}`); + return releases; + } catch (error: any) { + console.error(`[LIDARR] Failed to fetch calendar:`, error.message); + return []; + } + } + + /** + * Get all monitored artists from Lidarr + */ + async getMonitoredArtists(): Promise<{ id: number; name: string; mbid: string }[]> { + await this.ensureInitialized(); + + if (!this.client) { + return []; + } + + try { + const response = await this.client.get(`/api/v1/artist`); + return response.data + .filter((artist: any) => artist.monitored) + .map((artist: any) => ({ + id: artist.id, + name: artist.artistName, + mbid: artist.foreignArtistId, + })); + } catch (error: any) { + console.error(`[LIDARR] Failed to fetch monitored artists:`, error.message); + return []; + } + } +} + +// Interface for calendar release data +export interface CalendarRelease { + id: number; + title: string; + artistName: string; + artistId?: number; + artistMbid?: string; + albumMbid: string; + releaseDate: string; + monitored: boolean; + grabbed: boolean; + hasFile: boolean; + coverUrl: string | null; +} + +// Interface for release data from Lidarr (exported for use by simpleDownloadManager) +export interface LidarrRelease { + guid: string; + title: string; + indexerId: number; + indexer?: string; + size?: number; + seeders?: number; + leechers?: number; + protocol: string; // usenet, torrent + approved: boolean; + rejected: boolean; + rejections?: string[]; + quality?: { + quality: { name: string }; + }; +} + +export const lidarrService = new LidarrService(); + +// ============================================ +// Queue Cleaner Functions +// ============================================ + +// Types for queue monitoring +interface QueueItem { + id: number; + title: string; + status: string; + downloadId: string; + trackedDownloadStatus: string; + trackedDownloadState: string; + statusMessages: { title: string; messages: string[] }[]; +} + +interface QueueResponse { + page: number; + pageSize: number; + totalRecords: number; + records: QueueItem[]; +} + +interface HistoryRecord { + id: number; + albumId: number; + downloadId: string; + eventType: string; + date: string; + data: { + droppedPath?: string; + importedPath?: string; + }; + album: { + id: number; + title: string; + foreignAlbumId: string; // MBID + }; + artist: { + name: string; + }; +} + +interface HistoryResponse { + page: number; + pageSize: number; + totalRecords: number; + records: HistoryRecord[]; +} + +// Patterns that indicate a stuck download (case-insensitive matching) +const FAILED_IMPORT_PATTERNS = [ + // Import issues + "No files found are eligible for import", + "Not an upgrade for existing", + "Not a Custom Format upgrade", + "Has missing tracks", // Individual tracks from discography packs + "missing tracks", + "Album match is not close enough", // Lidarr matching threshold failure + "Artist name mismatch", // Manual import required - artist doesn't match + "automatic import is not possible", // Generic auto-import failure + // Unpack/extraction failures + "Unable to extract", + "Failed to extract", + "Unpacking failed", + "unpack error", + "Error extracting", + "extraction failed", + "corrupt archive", + "invalid archive", + "CRC failed", + "bad archive", + // Download/transfer issues + "Download failed", + "import failed", + "Sample", +]; + +/** + * Clean stuck downloads from Lidarr queue + * Returns items that were removed and will trigger automatic search for alternatives + */ +export async function cleanStuckDownloads( + lidarrUrl: string, + apiKey: string +): Promise<{ removed: number; items: string[] }> { + const removed: string[] = []; + + try { + // Fetch current queue + const response = await axios.get( + `${lidarrUrl}/api/v1/queue`, + { + params: { + page: 1, + pageSize: 100, + includeUnknownArtistItems: true, + }, + headers: { "X-Api-Key": apiKey }, + } + ); + + console.log( + ` Queue cleaner: checking ${response.data.records.length} items` + ); + + for (const item of response.data.records) { + // Check if this item has a failed import message + const allMessages = + item.statusMessages?.flatMap((sm) => sm.messages) || []; + + // Log ALL items to understand what states we're seeing + console.log(` - ${item.title}`); + console.log( + ` Status: ${item.status}, TrackedStatus: ${item.trackedDownloadStatus}, State: ${item.trackedDownloadState}` + ); + if (allMessages.length > 0) { + console.log(` Messages: ${allMessages.join("; ")}`); + } + + // Check for pattern matches in messages + const hasFailedPattern = allMessages.some((msg) => + FAILED_IMPORT_PATTERNS.some((pattern) => + msg.toLowerCase().includes(pattern.toLowerCase()) + ) + ); + + // Also check if trackedDownloadStatus is "warning" with importPending state + // These are items that have finished downloading but can't be imported + const isStuckWarning = + item.trackedDownloadStatus === "warning" && + item.trackedDownloadState === "importPending"; + + // CRITICAL: importFailed state is TERMINAL - will never recover + // Don't wait for timeout, clean up immediately + const isImportFailed = item.trackedDownloadState === "importFailed"; + + const shouldRemove = hasFailedPattern || isStuckWarning || isImportFailed; + + if (shouldRemove) { + const reason = isImportFailed + ? "importFailed state (terminal)" + : hasFailedPattern + ? "failed pattern match" + : "stuck warning state"; + console.log(` [REMOVE] Removing ${item.title} (${reason})`); + + try { + // Remove from queue, blocklist the release, trigger new search + await axios.delete(`${lidarrUrl}/api/v1/queue/${item.id}`, { + params: { + removeFromClient: true, // Remove from NZBGet too + blocklist: true, // Don't try this release again + skipRedownload: false, // DO trigger new search + }, + headers: { "X-Api-Key": apiKey }, + }); + + removed.push(item.title); + console.log(` Removed and blocklisted: ${item.title}`); + } catch (deleteError: any) { + // Item might already be gone - that's fine + if (deleteError.response?.status !== 404) { + console.error( + ` Failed to remove ${item.title}:`, + deleteError.message + ); + } + } + } + } + + if (removed.length > 0) { + console.log( + ` Queue cleaner: removed ${removed.length} stuck item(s)` + ); + } + + return { removed: removed.length, items: removed }; + } catch (error: any) { + console.error("Queue clean failed:", error.message); + throw error; + } +} + +/** + * Get recently completed downloads from Lidarr history + * Used to find orphaned completions (webhooks that never arrived) + */ +export async function getRecentCompletedDownloads( + lidarrUrl: string, + apiKey: string, + sinceMinutes: number = 5 +): Promise { + try { + const response = await axios.get( + `${lidarrUrl}/api/v1/history`, + { + params: { + page: 1, + pageSize: 100, + sortKey: "date", + sortDirection: "descending", + eventType: 3, // 3 = downloadFolderImported (successful import) + }, + headers: { "X-Api-Key": apiKey }, + } + ); + + // Filter to only recent imports (within last X minutes) + const cutoff = new Date(Date.now() - sinceMinutes * 60 * 1000); + return response.data.records.filter((record) => { + return new Date(record.date) >= cutoff; + }); + } catch (error: any) { + console.error("Failed to fetch Lidarr history:", error.message); + throw error; + } +} + +/** + * Get the current queue count from Lidarr + */ +export async function getQueueCount( + lidarrUrl: string, + apiKey: string +): Promise { + try { + const response = await axios.get( + `${lidarrUrl}/api/v1/queue`, + { + params: { + page: 1, + pageSize: 1, + }, + headers: { "X-Api-Key": apiKey }, + } + ); + return response.data.totalRecords; + } catch (error: any) { + console.error("Failed to get queue count:", error.message); + return 0; + } +} + +/** + * Check if a specific download is still actively downloading in Lidarr's queue + * Returns true if actively downloading, false if not found or stuck + */ +export async function isDownloadActive( + downloadId: string +): Promise<{ active: boolean; status?: string; progress?: number }> { + const settings = await getSystemSettings(); + if (!settings?.lidarrEnabled || !settings.lidarrUrl || !settings.lidarrApiKey) { + return { active: false }; + } + + try { + const response = await axios.get( + `${settings.lidarrUrl}/api/v1/queue`, + { + params: { + page: 1, + pageSize: 100, + includeUnknownArtistItems: true, + }, + headers: { "X-Api-Key": settings.lidarrApiKey }, + } + ); + + const item = response.data.records.find(r => r.downloadId === downloadId); + + if (!item) { + return { active: false, status: "not_found" }; + } + + // Check if it's actively downloading (not stuck in warning/failed state) + const isActivelyDownloading = + item.status === "downloading" || + (item.trackedDownloadState === "downloading" && item.trackedDownloadStatus !== "warning"); + + return { + active: isActivelyDownloading, + status: item.trackedDownloadState || item.status, + progress: item.sizeleft && item.size + ? Math.round((1 - item.sizeleft / item.size) * 100) + : undefined + }; + } catch (error: any) { + console.error("Failed to check download status:", error.message); + return { active: false }; + } +} diff --git a/backend/src/services/musicScanner.ts b/backend/src/services/musicScanner.ts new file mode 100644 index 0000000..d40f272 --- /dev/null +++ b/backend/src/services/musicScanner.ts @@ -0,0 +1,766 @@ +import * as fs from "fs"; +import * as path from "path"; +import { parseFile } from "music-metadata"; +import { prisma } from "../utils/db"; +import PQueue from "p-queue"; +import { CoverArtExtractor } from "./coverArtExtractor"; +import { deezerService } from "./deezer"; +import { normalizeArtistName, areArtistNamesSimilar, canonicalizeVariousArtists } from "../utils/artistNormalization"; + +// Supported audio formats +const AUDIO_EXTENSIONS = new Set([ + ".mp3", + ".flac", + ".m4a", + ".aac", + ".ogg", + ".opus", + ".wav", + ".wma", + ".ape", + ".wv", +]); + +interface ScanProgress { + filesScanned: number; + filesTotal: number; + currentFile: string; + errors: Array<{ file: string; error: string }>; +} + +interface ScanResult { + tracksAdded: number; + tracksUpdated: number; + tracksRemoved: number; + errors: Array<{ file: string; error: string }>; + duration: number; +} + +export class MusicScannerService { + private scanQueue = new PQueue({ concurrency: 10 }); + private progressCallback?: (progress: ScanProgress) => void; + private coverArtExtractor?: CoverArtExtractor; + + constructor( + progressCallback?: (progress: ScanProgress) => void, + coverCachePath?: string + ) { + this.progressCallback = progressCallback; + if (coverCachePath) { + this.coverArtExtractor = new CoverArtExtractor(coverCachePath); + } + } + + /** + * Scan the music directory and update the database + */ + async scanLibrary(musicPath: string): Promise { + const startTime = Date.now(); + const result: ScanResult = { + tracksAdded: 0, + tracksUpdated: 0, + tracksRemoved: 0, + errors: [], + duration: 0, + }; + + console.log(`Starting library scan: ${musicPath}`); + + // Step 1: Find all audio files + const audioFiles = await this.findAudioFiles(musicPath); + console.log(`Found ${audioFiles.length} audio files`); + + // Step 2: Get existing tracks from database + const existingTracks = await prisma.track.findMany({ + select: { + id: true, + filePath: true, + fileModified: true, + }, + }); + + const tracksByPath = new Map( + existingTracks.map((t) => [t.filePath, t]) + ); + + // Step 3: Process each audio file + let filesScanned = 0; + const progress: ScanProgress = { + filesScanned: 0, + filesTotal: audioFiles.length, + currentFile: "", + errors: [], + }; + + for (const audioFile of audioFiles) { + await this.scanQueue.add(async () => { + try { + const relativePath = path.relative(musicPath, audioFile); + progress.currentFile = relativePath; + this.progressCallback?.(progress); + + const stats = await fs.promises.stat(audioFile); + const fileModified = stats.mtime; + + const existingTrack = tracksByPath.get(relativePath); + + // Check if file needs updating + if (existingTrack) { + if ( + existingTrack.fileModified && + existingTrack.fileModified >= fileModified + ) { + // File hasn't changed, skip + filesScanned++; + progress.filesScanned = filesScanned; + return; + } + // File changed, will update + result.tracksUpdated++; + } else { + // New file + result.tracksAdded++; + } + + // Extract metadata and update database + await this.processAudioFile( + audioFile, + relativePath, + musicPath + ); + } catch (err: any) { + const error = { + file: audioFile, + error: err.message || String(err), + }; + result.errors.push(error); + progress.errors.push(error); + console.error(`Error processing ${audioFile}:`, err); + } finally { + filesScanned++; + progress.filesScanned = filesScanned; + this.progressCallback?.(progress); + } + }); + } + + await this.scanQueue.onIdle(); + + // Step 4: Remove tracks for files that no longer exist + const scannedPaths = new Set( + audioFiles.map((f) => path.relative(musicPath, f)) + ); + const tracksToRemove = existingTracks.filter( + (t) => !scannedPaths.has(t.filePath) + ); + + if (tracksToRemove.length > 0) { + await prisma.track.deleteMany({ + where: { + id: { in: tracksToRemove.map((t) => t.id) }, + }, + }); + result.tracksRemoved = tracksToRemove.length; + console.log(`Removed ${tracksToRemove.length} missing tracks`); + } + + // Step 5: Clean up orphaned albums (albums with no tracks) + const orphanedAlbums = await prisma.album.findMany({ + where: { + tracks: { none: {} }, + }, + select: { id: true, title: true }, + }); + + if (orphanedAlbums.length > 0) { + console.log(`Removing ${orphanedAlbums.length} orphaned albums...`); + await prisma.album.deleteMany({ + where: { + id: { in: orphanedAlbums.map((a) => a.id) }, + }, + }); + } + + // Step 6: Clean up orphaned artists (artists with no albums) + const orphanedArtists = await prisma.artist.findMany({ + where: { + albums: { none: {} }, + }, + select: { id: true, name: true }, + }); + + if (orphanedArtists.length > 0) { + console.log(`Removing ${orphanedArtists.length} orphaned artists: ${orphanedArtists.map(a => a.name).join(', ')}`); + await prisma.artist.deleteMany({ + where: { + id: { in: orphanedArtists.map((a) => a.id) }, + }, + }); + } + + result.duration = Date.now() - startTime; + console.log( + `Scan complete: +${result.tracksAdded} ~${result.tracksUpdated} -${result.tracksRemoved} (${result.duration}ms)` + ); + + return result; + } + + /** + * Extract the primary artist from collaboration strings + * Examples: + * "CHVRCHES & Robert Smith" -> "CHVRCHES" + * "Artist feat. Someone" -> "Artist" + * "Artist ft. Someone" -> "Artist" + * "Artist, Someone" -> "Artist" + * + * But preserves band names: + * "Earth, Wind & Fire" -> "Earth, Wind & Fire" (kept as-is) + * "The Naked and Famous" -> "The Naked and Famous" (kept as-is) + */ + private extractPrimaryArtist(artistName: string): string { + // Trim whitespace + artistName = artistName.trim(); + + // HIGH PRIORITY: These patterns almost always indicate collaborations + // (not band names) so we always split on them + const definiteCollaborationPatterns = [ + / feat\.? /i, // "feat." or "feat " + / ft\.? /i, // "ft." or "ft " + / featuring /i, + ]; + + for (const pattern of definiteCollaborationPatterns) { + const match = artistName.split(pattern); + if (match.length > 1) { + return match[0].trim(); + } + } + + // LOWER PRIORITY: These might be band names, so only split if the result + // looks like a complete artist name (not truncated) + const ambiguousPatterns = [ + { pattern: / \& /, name: "&" }, // "Earth, Wind & Fire" shouldn't split + { pattern: / and /i, name: "and" }, // "The Naked and Famous" shouldn't split + { pattern: / with /i, name: "with" }, + { pattern: /, /, name: "," }, + ]; + + for (const { pattern } of ambiguousPatterns) { + const parts = artistName.split(pattern); + if (parts.length > 1) { + const firstPart = parts[0].trim(); + const lastWord = firstPart.split(/\s+/).pop()?.toLowerCase() || ""; + + // Don't split if the first part ends with common incomplete words + // These suggest it's a band name, not a collaboration + const incompleteEndings = ["the", "a", "an", "and", "of", ","]; + if (incompleteEndings.includes(lastWord)) { + continue; // Skip this pattern, try the next one + } + + // Don't split if the first part is very short (likely incomplete) + if (firstPart.length < 4) { + continue; + } + + return firstPart; + } + } + + // No collaboration found, return as-is + return artistName; + } + + /** + * Check if a file path is within the discovery folder + * Discovery albums are stored in paths like "discovery/Artist/Album/track.flac" + * or "Discover/Artist/Album/track.flac" (case-insensitive) + */ + private isDiscoveryPath(relativePath: string): boolean { + const normalizedPath = relativePath.toLowerCase().replace(/\\/g, "/"); + // Check if path starts with "discovery/" or "discover/" + return ( + normalizedPath.startsWith("discovery/") || + normalizedPath.startsWith("discover/") + ); + } + + /** + * Normalize string for matching - handles encoding differences between + * file metadata and database records + */ + private normalizeForMatching(str: string): string { + return str + .toLowerCase() + .trim() + .normalize('NFD').replace(/[\u0300-\u036f]/g, '') // Remove diacritics (café → cafe) + .replace(/[''´`]/g, "'") // Normalize apostrophes + .replace(/[""„]/g, '"') // Normalize quotes + .replace(/[–—−]/g, '-') // Normalize dashes + .replace(/\s+/g, ' ') // Collapse whitespace + .replace(/[^\w\s'"-]/g, ''); // Remove other special chars + } + + /** + * Check if an album is part of a discovery download by matching artist name + album title. + * Uses multi-pass matching: exact match first, then partial match as fallback. + */ + private async isDiscoveryDownload( + artistName: string, + albumTitle: string + ): Promise { + if (!artistName || !albumTitle) return false; + + const normalizedArtist = this.normalizeForMatching(artistName); + const normalizedAlbum = this.normalizeForMatching(albumTitle); + + // Also try with primary artist extracted (handles "Artist A feat. Artist B") + const primaryArtist = this.extractPrimaryArtist(artistName); + const normalizedPrimaryArtist = this.normalizeForMatching(primaryArtist); + + console.log(`[Scanner] Checking discovery: "${artistName}" → "${normalizedArtist}"`); + if (primaryArtist !== artistName) { + console.log(`[Scanner] Primary artist: "${primaryArtist}" → "${normalizedPrimaryArtist}"`); + } + console.log(`[Scanner] Album: "${albumTitle}" → "${normalizedAlbum}"`); + + try { + // Get all discovery jobs (pending, processing, or recently completed) + const discoveryJobs = await prisma.downloadJob.findMany({ + where: { + discoveryBatchId: { not: null }, + status: { in: ["pending", "processing", "completed"] }, + }, + }); + + console.log(`[Scanner] Found ${discoveryJobs.length} discovery jobs to check`); + + // Pass 1: Exact match after normalization + for (const job of discoveryJobs) { + const metadata = job.metadata as any; + const jobArtist = this.normalizeForMatching(metadata?.artistName || ""); + const jobAlbum = this.normalizeForMatching(metadata?.albumTitle || ""); + + if ((jobArtist === normalizedArtist || jobArtist === normalizedPrimaryArtist) && jobAlbum === normalizedAlbum) { + console.log(`[Scanner] EXACT MATCH: job ${job.id}`); + return true; + } + } + + // Pass 2: Partial match fallback (handles "Album" vs "Album (Deluxe)") + for (const job of discoveryJobs) { + const metadata = job.metadata as any; + const jobArtist = this.normalizeForMatching(metadata?.artistName || ""); + const jobAlbum = this.normalizeForMatching(metadata?.albumTitle || ""); + + // Try matching both full artist name and extracted primary artist + const artistMatch = jobArtist === normalizedArtist || + jobArtist === normalizedPrimaryArtist || + normalizedArtist.includes(jobArtist) || + jobArtist.includes(normalizedArtist) || + normalizedPrimaryArtist.includes(jobArtist) || + jobArtist.includes(normalizedPrimaryArtist); + const albumMatch = jobAlbum === normalizedAlbum || + normalizedAlbum.includes(jobAlbum) || + jobAlbum.includes(normalizedAlbum); + + if (artistMatch && albumMatch) { + console.log(`[Scanner] PARTIAL MATCH: job ${job.id}`); + console.log(`[Scanner] Job: "${jobArtist}" - "${jobAlbum}"`); + return true; + } + } + + // Pass 3: Album-only match (handles featured artists on discovery albums) + // If the album title matches exactly, this track is likely a featured artist on a discovery album + for (const job of discoveryJobs) { + const metadata = job.metadata as any; + const jobAlbum = this.normalizeForMatching(metadata?.albumTitle || ""); + + if (jobAlbum === normalizedAlbum && normalizedAlbum.length > 3) { + console.log(`[Scanner] ALBUM-ONLY MATCH (featured artist): job ${job.id}`); + console.log(`[Scanner] Track artist "${normalizedArtist}" is likely featured on "${jobAlbum}"`); + return true; + } + } + + // Pass 4: Check DiscoveryAlbum table (for already processed albums) by album title + const discoveryAlbumByTitle = await prisma.discoveryAlbum.findFirst({ + where: { + albumTitle: { equals: albumTitle, mode: "insensitive" }, + status: { in: ["ACTIVE", "LIKED"] }, + }, + }); + + if (discoveryAlbumByTitle) { + console.log(`[Scanner] DiscoveryAlbum match (by title): ${discoveryAlbumByTitle.id}`); + return true; + } + + // Pass 5: Check if artist name matches any discovery album + // This catches cases where Lidarr downloads a different album than requested + // e.g., requested "Broods - Broods" but got "Broods - Evergreen" + const discoveryAlbumByArtist = await prisma.discoveryAlbum.findFirst({ + where: { + artistName: { equals: artistName, mode: "insensitive" }, + status: { in: ["ACTIVE", "LIKED", "DELETED"] }, // Include DELETED to catch cleanup scenarios + }, + }); + + if (discoveryAlbumByArtist) { + // Double-check: only match if this artist has NO library albums yet + // This prevents marking albums from artists that exist in both library and discovery + const existingLibraryAlbum = await prisma.album.findFirst({ + where: { + artist: { name: { equals: artistName, mode: "insensitive" } }, + location: "LIBRARY", + }, + }); + + if (!existingLibraryAlbum) { + console.log(`[Scanner] DiscoveryAlbum match (by artist): ${discoveryAlbumByArtist.id}`); + console.log(`[Scanner] Artist "${artistName}" is a discovery-only artist`); + return true; + } + } + + console.log(`[Scanner] No discovery match found`); + return false; + } catch (error) { + console.error(`[Scanner] Error checking discovery status:`, error); + return false; + } + } + + /** + * Recursively find all audio files in a directory + */ + private async findAudioFiles(dirPath: string): Promise { + const files: string[] = []; + + async function walk(dir: string) { + const entries = await fs.promises.readdir(dir, { + withFileTypes: true, + }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + await walk(fullPath); + } else if (entry.isFile()) { + const ext = path.extname(entry.name).toLowerCase(); + if (AUDIO_EXTENSIONS.has(ext)) { + files.push(fullPath); + } + } + } + } + + await walk(dirPath); + return files; + } + + /** + * Process a single audio file and update database + */ + private async processAudioFile( + absolutePath: string, + relativePath: string, + musicPath: string + ): Promise { + // Extract metadata + const metadata = await parseFile(absolutePath); + const stats = await fs.promises.stat(absolutePath); + + // Parse basic info + const title = + metadata.common.title || + path.basename(relativePath, path.extname(relativePath)); + const trackNo = metadata.common.track.no || 0; + const duration = Math.floor(metadata.format.duration || 0); + const mime = metadata.format.codec || "audio/mpeg"; + + // Artist and album info + // IMPORTANT: Prefer albumartist over artist to keep albums grouped under the primary artist + // This prevents featured artists from creating separate album entries + // e.g., "Artist A feat. Artist B" track should still be under "Artist A"'s album + let rawArtistName = + metadata.common.albumartist || + metadata.common.artist || + "Unknown Artist"; + + const albumTitle = metadata.common.album || "Unknown Album"; + const year = metadata.common.year || null; + + // ALWAYS extract primary artist first - this handles both: + // - Featured artists: "Artist A feat. Artist B" -> "Artist A" + // - Collaborations: "Artist A & Artist B" -> "Artist A" + // Band names like "Of Mice & Men" are preserved because extractPrimaryArtist + // only splits on " feat.", " ft.", " featuring ", " & ", etc. (with spaces) + const extractedPrimaryArtist = this.extractPrimaryArtist(rawArtistName); + let artistName = extractedPrimaryArtist; + + // Canonicalize Various Artists variations (VA, V.A., , etc.) + artistName = canonicalizeVariousArtists(artistName); + + // Try to find artist with the canonicalized name first + // This ensures "VA", "V.A.", etc. all find the canonical "Various Artists" + const normalizedPrimaryName = normalizeArtistName(artistName); + let artist = await prisma.artist.findFirst({ + where: { normalizedName: normalizedPrimaryName }, + }); + + // If no match with primary name and we actually extracted something, + // also try the full raw name (for bands like "Of Mice & Men") + if (!artist && extractedPrimaryArtist !== rawArtistName) { + const normalizedRawName = normalizeArtistName(rawArtistName); + artist = await prisma.artist.findFirst({ + where: { normalizedName: normalizedRawName }, + }); + // If full name matches an existing artist, use that instead + if (artist) { + artistName = rawArtistName; + } + } + + // Update normalized name for use below + const normalizedArtistName = normalizeArtistName(artistName); + + // If we found an artist, optionally update to better capitalization + if (artist && artist.name !== artistName) { + // Check if the new name has better capitalization (starts with uppercase) + const currentNameIsLowercase = artist.name[0] === artist.name[0].toLowerCase(); + const newNameIsCapitalized = artistName[0] === artistName[0].toUpperCase(); + + if (currentNameIsLowercase && newNameIsCapitalized) { + console.log(`Updating artist name capitalization: "${artist.name}" -> "${artistName}"`); + artist = await prisma.artist.update({ + where: { id: artist.id }, + data: { name: artistName }, + }); + } + } + + if (!artist) { + // Try fuzzy matching to catch typos like "the weeknd" vs "the weekend" + // Only check artists with similar normalized names (performance optimization) + const similarArtists = await prisma.artist.findMany({ + where: { + normalizedName: { + // Get artists whose normalized names start with similar prefix + startsWith: normalizedArtistName.substring(0, Math.min(3, normalizedArtistName.length)), + }, + }, + select: { id: true, name: true, normalizedName: true, mbid: true }, + }); + + // Check for fuzzy matches + for (const candidate of similarArtists) { + if (areArtistNamesSimilar(artistName, candidate.name, 95)) { + console.log(`Fuzzy match found: "${artistName}" -> "${candidate.name}"`); + artist = candidate; + break; + } + } + } + + if (!artist) { + // Try to find by MusicBrainz ID if available + const artistMbid = metadata.common.musicbrainz_artistid?.[0]; + if (artistMbid) { + artist = await prisma.artist.findUnique({ + where: { mbid: artistMbid }, + }); + + // If we have a real MBID but no artist exists, check if there's a temp artist we should consolidate + if (!artist) { + const tempArtist = await prisma.artist.findFirst({ + where: { + normalizedName: normalizedArtistName, + mbid: { startsWith: 'temp-' }, + }, + }); + + if (tempArtist) { + // Consolidate: update temp artist to real MBID + console.log(`[SCANNER] Consolidating temp artist "${tempArtist.name}" with real MBID: ${artistMbid}`); + artist = await prisma.artist.update({ + where: { id: tempArtist.id }, + data: { mbid: artistMbid }, + }); + } + } + } + + if (!artist) { + // Create new artist (use a temporary MBID for now) + artist = await prisma.artist.create({ + data: { + name: artistName, + normalizedName: normalizedArtistName, + mbid: + artistMbid || `temp-${Date.now()}-${Math.random()}`, + enrichmentStatus: "pending", + }, + }); + } + } + + // Get or create album + let album = await prisma.album.findFirst({ + where: { + artistId: artist.id, + title: albumTitle, + }, + }); + + if (!album) { + // Try to find by release group MBID if available + const albumMbid = metadata.common.musicbrainz_releasegroupid; + if (albumMbid) { + album = await prisma.album.findUnique({ + where: { rgMbid: albumMbid }, + }); + } + + if (!album) { + // Create new album (use a temporary MBID for now) + const rgMbid = + albumMbid || `temp-${Date.now()}-${Math.random()}`; + + // Determine if this is a discovery album: + // 1. Check file path (legacy: /music/discovery/ folder) + // 2. Check if artist+album matches a discovery download job + // 3. Check if artist is a discovery-only artist (has DISCOVER albums but no LIBRARY albums) + const isDiscoveryByPath = this.isDiscoveryPath(relativePath); + const isDiscoveryByJob = await this.isDiscoveryDownload(artistName, albumTitle); + + // Check if this artist is discovery-only (has no LIBRARY albums) + // If so, any new albums from them should also be DISCOVER + let isDiscoveryArtist = false; + if (!isDiscoveryByPath && !isDiscoveryByJob) { + const artistAlbums = await prisma.album.findMany({ + where: { artistId: artist.id }, + select: { location: true }, + }); + + // Artist is discovery-only if they have albums but NONE are LIBRARY + if (artistAlbums.length > 0) { + const hasLibraryAlbums = artistAlbums.some(a => a.location === "LIBRARY"); + isDiscoveryArtist = !hasLibraryAlbums; + if (isDiscoveryArtist) { + console.log(`[Scanner] Discovery-only artist detected: ${artistName}`); + } + } + } + + const isDiscoveryAlbum = isDiscoveryByPath || isDiscoveryByJob || isDiscoveryArtist; + + album = await prisma.album.create({ + data: { + title: albumTitle, + artistId: artist.id, + rgMbid, + year, + primaryType: "Album", + location: isDiscoveryAlbum ? "DISCOVER" : "LIBRARY", + }, + }); + + // Only create OwnedAlbum record for library albums (not discovery) + // Discovery albums are temporary and should not appear in the user's library + if (!isDiscoveryAlbum) { + await prisma.ownedAlbum.create({ + data: { + rgMbid, + artistId: artist.id, + source: "native_scan", + }, + }); + } + } + + // Extract cover art if we have an extractor + // Re-extract if: no cover, OR native cover file is missing + if (this.coverArtExtractor) { + let needsExtraction = !album.coverUrl; + + // Check if existing native cover file is missing + if (album.coverUrl?.startsWith("native:")) { + const nativePath = album.coverUrl.replace("native:", ""); + const coverCachePath = path.join( + path.dirname(absolutePath), + "..", + "..", + "cache", + "covers", + nativePath + ); + // Use the extractor's cache path instead + const extractorCachePath = path.join( + (this.coverArtExtractor as any).coverCachePath, + nativePath + ); + if (!fs.existsSync(extractorCachePath)) { + needsExtraction = true; + } + } + + if (needsExtraction) { + const coverPath = await this.coverArtExtractor.extractCoverArt( + absolutePath, + album.id + ); + if (coverPath) { + await prisma.album.update({ + where: { id: album.id }, + data: { coverUrl: `native:${coverPath}` }, + }); + } else { + // No embedded art, try fetching from Deezer + try { + const deezerCover = await deezerService.getAlbumCover( + artistName, + albumTitle + ); + if (deezerCover) { + await prisma.album.update({ + where: { id: album.id }, + data: { coverUrl: deezerCover }, + }); + } + } catch (error) { + // Silently fail - cover art is optional + } + } + } + } + } + + // Upsert track + await prisma.track.upsert({ + where: { filePath: relativePath }, + create: { + albumId: album.id, + title, + trackNo, + duration, + mime, + filePath: relativePath, + fileModified: stats.mtime, + fileSize: stats.size, + }, + update: { + albumId: album.id, + title, + trackNo, + duration, + mime, + fileModified: stats.mtime, + fileSize: stats.size, + }, + }); + } +} diff --git a/backend/src/services/musicbrainz.ts b/backend/src/services/musicbrainz.ts new file mode 100644 index 0000000..a1723ce --- /dev/null +++ b/backend/src/services/musicbrainz.ts @@ -0,0 +1,656 @@ +import axios, { AxiosInstance } from "axios"; +import { redisClient } from "../utils/redis"; +import { rateLimiter } from "./rateLimiter"; + +class MusicBrainzService { + private client: AxiosInstance; + + constructor() { + this.client = axios.create({ + baseURL: "https://musicbrainz.org/ws/2", + timeout: 10000, + headers: { + "User-Agent": + "Lidify/1.0.0 (https://github.com/Chevron7Locked/lidify)", + }, + }); + } + + private async cachedRequest( + cacheKey: string, + requestFn: () => Promise, + ttlSeconds = 2592000 // 30 days + ) { + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + return JSON.parse(cached); + } + } catch (err) { + console.warn("Redis get error:", err); + } + + // Use global rate limiter instead of local rate limiting + const data = await rateLimiter.execute("musicbrainz", requestFn); + + try { + // Use shorter TTL for null results (1 hour) vs successful results (30 days) + // This allows retrying failed lookups sooner while still caching successes + const actualTtl = data === null ? 3600 : ttlSeconds; + await redisClient.setEx(cacheKey, actualTtl, JSON.stringify(data)); + } catch (err) { + console.warn("Redis set error:", err); + } + + return data; + } + + async searchArtist(query: string, limit = 10) { + const cacheKey = `mb:search:artist:${query}:${limit}`; + + return this.cachedRequest(cacheKey, async () => { + const response = await this.client.get("/artist", { + params: { + query, + limit, + fmt: "json", + }, + }); + return response.data.artists || []; + }); + } + + async getArtist(mbid: string, includes: string[] = ["url-rels", "tags"]) { + const cacheKey = `mb:artist:${mbid}:${includes.join(",")}`; + + return this.cachedRequest(cacheKey, async () => { + const response = await this.client.get(`/artist/${mbid}`, { + params: { + inc: includes.join("+"), + fmt: "json", + }, + }); + return response.data; + }); + } + + async getReleaseGroups( + artistMbid: string, + types: string[] = ["album", "ep"], + limit = 100 + ) { + const cacheKey = `mb:rg:${artistMbid}:${types.join(",")}:${limit}`; + + return this.cachedRequest(cacheKey, async () => { + const response = await this.client.get("/release-group", { + params: { + artist: artistMbid, + type: types.join("|"), + limit, + fmt: "json", + }, + }); + return response.data["release-groups"] || []; + }); + } + + async getReleaseGroup(rgMbid: string) { + const cacheKey = `mb:rg:${rgMbid}`; + + return this.cachedRequest(cacheKey, async () => { + const response = await this.client.get(`/release-group/${rgMbid}`, { + params: { + inc: "artist-credits+releases", + fmt: "json", + }, + }); + return response.data; + }); + } + + async getReleaseGroupDetails(rgMbid: string) { + const cacheKey = `mb:rg:details:${rgMbid}`; + + return this.cachedRequest(cacheKey, async () => { + const response = await this.client.get(`/release-group/${rgMbid}`, { + params: { + inc: "artist-credits+releases+labels", + fmt: "json", + }, + }); + return response.data; + }); + } + + async getRelease(releaseMbid: string) { + const cacheKey = `mb:release:${releaseMbid}`; + + return this.cachedRequest(cacheKey, async () => { + const response = await this.client.get(`/release/${releaseMbid}`, { + params: { + inc: "recordings+artist-credits+labels", + fmt: "json", + }, + }); + return response.data; + }); + } + + extractPrimaryArtist(artistCredits: any[]): string { + if (!artistCredits || artistCredits.length === 0) + return "Unknown Artist"; + return ( + artistCredits[0].name || + artistCredits[0].artist?.name || + "Unknown Artist" + ); + } + + /** + * Escape special characters for Lucene query syntax + * MusicBrainz uses Lucene, which requires escaping: + - && || ! ( ) { } [ ] ^ " ~ * ? : \ / + */ + private escapeLucene(str: string): string { + return str.replace(/([+\-&|!(){}[\]^"~*?:\\/])/g, "\\$1"); + } + + /** + * Normalize album/artist names for better matching + * Removes common suffixes and cleans up the string + */ + private normalizeForSearch(str: string): string { + return ( + str + .replace(/\s*\([^)]*\)\s*/g, " ") // Remove parenthetical content + .replace(/\s*\[[^\]]*\]\s*/g, " ") // Remove bracketed content + // Remove "- YEAR Remaster", "- Remastered YEAR", "- Deluxe Edition", etc. + .replace( + /\s*-\s*(\d{4}\s+)?(deluxe|remastered|remaster|edition|version|expanded|bonus|explicit|clean|single|radio edit|remix|acoustic|live|mono|stereo)(\s+\d{4})?\s*(edition|version|mix)?\s*/gi, + " " + ) + // Also catch standalone year suffixes like "- 2011" + .replace(/\s*-\s*\d{4}\s*$/gi, " ") + .replace(/\s+/g, " ") + .trim() + ); + } + + /** + * Strip all punctuation from string for fuzzy matching + * Used as a fallback when normal search fails (e.g., "Do You Realize??") + */ + private stripPunctuation(str: string): string { + return str + .replace(/[^\w\s]/g, "") // Remove all non-word, non-space chars + .replace(/\s+/g, " ") + .trim(); + } + + /** + * Search for an album (release-group) by title and artist name + * Returns the first matching release group or null + * Uses multiple search strategies for better matching + */ + async searchAlbum( + albumTitle: string, + artistName: string + ): Promise<{ id: string; title: string } | null> { + const cacheKey = `mb:search:album:${artistName}:${albumTitle}`; + + return this.cachedRequest(cacheKey, async () => { + // Strategy 1: Exact match with escaped special characters + const escapedTitle = this.escapeLucene(albumTitle); + const escapedArtist = this.escapeLucene(artistName); + + try { + const query1 = `releasegroup:"${escapedTitle}" AND artist:"${escapedArtist}"`; + const response1 = await this.client.get("/release-group", { + params: { + query: query1, + limit: 5, + fmt: "json", + }, + }); + + const releaseGroups1 = response1.data["release-groups"] || []; + if (releaseGroups1.length > 0) { + return { + id: releaseGroups1[0].id, + title: releaseGroups1[0].title, + }; + } + } catch (e) { + // Continue to strategy 2 + } + + // Strategy 2: Normalized/cleaned title search + const normalizedTitle = this.normalizeForSearch(albumTitle); + const normalizedArtist = this.normalizeForSearch(artistName); + + if ( + normalizedTitle !== albumTitle || + normalizedArtist !== artistName + ) { + try { + const escapedNormTitle = this.escapeLucene(normalizedTitle); + const escapedNormArtist = + this.escapeLucene(normalizedArtist); + const query2 = `releasegroup:"${escapedNormTitle}" AND artist:"${escapedNormArtist}"`; + const response2 = await this.client.get("/release-group", { + params: { + query: query2, + limit: 5, + fmt: "json", + }, + }); + + const releaseGroups2 = + response2.data["release-groups"] || []; + if (releaseGroups2.length > 0) { + return { + id: releaseGroups2[0].id, + title: releaseGroups2[0].title, + }; + } + } catch (e) { + // Continue to strategy 3 + } + } + + // Strategy 3: Fuzzy search without quotes (last resort) + try { + // Use simple terms without quotes for fuzzy matching + const simpleTitle = normalizedTitle + .split(" ") + .slice(0, 3) + .join(" "); // First 3 words + const simpleArtist = normalizedArtist.split(" ")[0]; // First word of artist + const query3 = `${this.escapeLucene( + simpleTitle + )} AND artist:${this.escapeLucene(simpleArtist)}`; + + const response3 = await this.client.get("/release-group", { + params: { + query: query3, + limit: 10, + fmt: "json", + }, + }); + + const releaseGroups3 = response3.data["release-groups"] || []; + + // Find a match where the artist name contains our search term + for (const rg of releaseGroups3) { + const rgArtist = + rg["artist-credit"]?.[0]?.name || + rg["artist-credit"]?.[0]?.artist?.name || + ""; + if ( + rgArtist + .toLowerCase() + .includes(simpleArtist.toLowerCase()) + ) { + return { + id: rg.id, + title: rg.title, + }; + } + } + } catch (e) { + // All strategies failed + } + + return null; + }); + } + + /** + * Search for a recording (track) and return album information + * This is useful when we have artist + track title but not album name + * Returns the album (release group) that the track appears on + */ + async searchRecording( + trackTitle: string, + artistName: string + ): Promise<{ + albumName: string; + albumMbid: string; + artistMbid: string; + trackMbid: string; + } | null> { + const cacheKey = `mb:search:recording:${artistName}:${trackTitle}`; + + return this.cachedRequest(cacheKey, async () => { + try { + // Normalize track title first - removes "- 2011 Remaster", "(Radio Edit)", etc. + const normalizedTitle = this.normalizeForSearch(trackTitle); + const normalizedArtist = this.normalizeForSearch(artistName); + + // Search for recording by normalized track title and artist + const escapedTitle = this.escapeLucene(normalizedTitle); + const escapedArtist = this.escapeLucene(normalizedArtist); + + const query = `recording:"${escapedTitle}" AND artist:"${escapedArtist}"`; + + const response = await this.client.get("/recording", { + params: { + query, + limit: 50, // Need high limit because bootleg recordings often rank first + fmt: "json", + inc: "releases+release-groups+artists", + }, + }); + + const allRecordings = response.data.recordings || []; + + console.log( + `[MusicBrainz] Query: "${trackTitle}" by "${artistName}"` + ); + console.log( + `[MusicBrainz] Found ${allRecordings.length} total recordings` + ); + + // Log first 5 recordings for debugging + allRecordings.slice(0, 5).forEach((rec: any, i: number) => { + const disambig = rec.disambiguation || "(studio)"; + const releases = rec.releases || []; + const albumNames = releases + .slice(0, 2) + .map((r: any) => r["release-group"]?.title || "?") + .join(", "); + console.log( + ` ${i + 1}. [${disambig}] → ${ + albumNames || "(no albums)" + }` + ); + }); + + // Filter out live recordings - they have disambiguation like "live, 1995-07-28" + // We want the studio recording, not live versions + const recordings = allRecordings.filter((rec: any) => { + const disambig = (rec.disambiguation || "").toLowerCase(); + // Skip if disambiguation contains "live" or date patterns + if (disambig.includes("live")) return false; + if (disambig.match(/\d{4}[-‐]\d{2}[-‐]\d{2}/)) return false; + if (disambig.includes("demo")) return false; + if (disambig.includes("acoustic")) return false; + if (disambig.includes("remix")) return false; + return true; + }); + + console.log( + `[MusicBrainz] After filtering live/demo: ${recordings.length} studio recordings` + ); + + if (recordings.length === 0) { + // Try fuzzy search without quotes + const normalizedTitle = this.normalizeForSearch(trackTitle); + const normalizedArtist = + this.normalizeForSearch(artistName); + const fuzzyQuery = `${this.escapeLucene( + normalizedTitle + )} AND artist:${this.escapeLucene(normalizedArtist)}`; + + const fuzzyResponse = await this.client.get("/recording", { + params: { + query: fuzzyQuery, + limit: 10, + fmt: "json", + inc: "releases+release-groups+artists", + }, + }); + + const fuzzyRecordings = fuzzyResponse.data.recordings || []; + + // Find best match by checking artist name similarity + for (const rec of fuzzyRecordings) { + const recArtist = + rec["artist-credit"]?.[0]?.name || + rec["artist-credit"]?.[0]?.artist?.name || + ""; + if ( + recArtist + .toLowerCase() + .includes( + normalizedArtist.toLowerCase().split(" ")[0] + ) + ) { + const result = this.extractAlbumFromRecording(rec); + if (result) return result; // Only return if we found a good album + } + } + + // Strategy 3: Strip all punctuation (handles "Do You Realize??" etc.) + const strippedTitle = this.stripPunctuation(trackTitle); + const strippedArtist = this.stripPunctuation(artistName); + + if (strippedTitle !== normalizedTitle) { + console.log(`[MusicBrainz] Trying punctuation-stripped search: "${strippedTitle}" by ${strippedArtist}`); + + const strippedQuery = `${strippedTitle} AND artist:${strippedArtist}`; + const strippedResponse = await this.client.get("/recording", { + params: { + query: strippedQuery, + limit: 10, + fmt: "json", + inc: "releases+release-groups+artists", + }, + }); + + const strippedRecordings = strippedResponse.data.recordings || []; + console.log(`[MusicBrainz] Punctuation-stripped search found ${strippedRecordings.length} recordings`); + + for (const rec of strippedRecordings) { + const recArtist = + rec["artist-credit"]?.[0]?.name || + rec["artist-credit"]?.[0]?.artist?.name || + ""; + if ( + recArtist + .toLowerCase() + .includes(strippedArtist.toLowerCase().split(" ")[0]) + ) { + const result = this.extractAlbumFromRecording(rec); + if (result) { + console.log(`[MusicBrainz] ✓ Found via punctuation-stripped search: ${result.albumName}`); + return result; + } + } + } + } + + return null; + } + + // Try each recording until we find one with a good (non-bootleg) album + for (const rec of recordings) { + const disambig = rec.disambiguation || "(no disambiguation)"; + console.log(`[MusicBrainz] Trying recording: "${rec.title}" [${disambig}]`); + const result = this.extractAlbumFromRecording(rec, false); + if (result) { + console.log(`[MusicBrainz] ✓ Found album: "${result.albumName}" (MBID: ${result.albumMbid})`); + return result; // Found a good album + } else { + console.log(`[MusicBrainz] ✗ No valid album found for this recording`); + } + } + + // Fallback: Try again accepting Singles/EPs as last resort + console.log(`[MusicBrainz] No official albums found, trying to find Singles/EPs...`); + for (const rec of recordings) { + const result = this.extractAlbumFromRecording(rec, true); + if (result) { + console.log(`[MusicBrainz] ✓ Found Single/EP: "${result.albumName}" (MBID: ${result.albumMbid})`); + return result; + } + } + + // No good albums found in any recording + console.log( + `[MusicBrainz] No official albums or singles found for "${trackTitle}" by ${artistName} (checked ${recordings.length} recordings)` + ); + return null; + } catch (error: any) { + console.error( + "MusicBrainz recording search error:", + error.message + ); + return null; + } + }); + } + + /** + * Extract album information from a MusicBrainz recording result + * Prioritizes studio albums and filters out compilations, live albums, and bootlegs + * @param allowSingles - If true, accepts Singles/EPs as a fallback (lower threshold) + */ + private extractAlbumFromRecording(recording: any, allowSingles: boolean = false): { + albumName: string; + albumMbid: string; + artistMbid: string; + trackMbid: string; + } | null { + // Get artist MBID + const artistMbid = recording["artist-credit"]?.[0]?.artist?.id || ""; + const trackMbid = recording.id || ""; + + // Find the best release (prefer studio albums, avoid compilations/live/bootlegs) + const releases = recording.releases || []; + + if (releases.length === 0) { + return null; + } + + // Score each release to find the best one + const scoredReleases = releases.map((release: any) => { + const rg = release["release-group"]; + if (!rg?.id) return { release, score: -1000 }; + + let score = 0; + const primaryType = rg["primary-type"] || ""; + const secondaryTypes: string[] = rg["secondary-types"] || []; + const title = (rg.title || "").toLowerCase(); + + // Primary type scoring + if (primaryType === "Album") score += 100; + else if (primaryType === "EP") score += 50; + else if (primaryType === "Single") score += 25; + else score -= 50; // Unknown type + + // Heavy penalties for compilations, live, bootlegs, soundtracks + if (secondaryTypes.includes("Compilation")) score -= 200; + if (secondaryTypes.includes("Live")) score -= 150; + if (secondaryTypes.includes("Remix")) score -= 100; + if (secondaryTypes.includes("DJ-mix")) score -= 200; + if (secondaryTypes.includes("Mixtape/Street")) score -= 100; + if (secondaryTypes.includes("Soundtrack")) score -= 150; // Movie/TV soundtracks + + // Title-based penalties (catch bootlegs and compilations missed by types) + if (title.match(/\d{4}[-‐]\d{2}[-‐]\d{2}/)) score -= 300; // Dates like "2006-03-11" = bootleg + if (title.includes("live at") || title.includes("live from")) + score -= 150; + if (title.includes("best of") || title.includes("greatest hits")) + score -= 200; + if (title.includes("compilation") || title.includes("collection")) + score -= 200; + if (title.includes("soundtrack")) score -= 100; + if (title.includes("various artists")) score -= 300; + if (title.includes("sounds of the")) score -= 200; // "Sounds of the 70s" etc. + if (title.includes("deep sounds")) score -= 200; + + // Bonus for official status + if (release.status === "Official") score += 20; + + return { release, score }; + }); + + // Sort by score (highest first) + scoredReleases.sort((a: any, b: any) => b.score - a.score); + + // Find the first release with a GOOD score + // Normal mode: score > 50 (studio album = 100+, EP = 50+) + // Allow singles mode: score > 0 (Single = 25+, excludes compilations with negative scores) + const threshold = allowSingles ? 0 : 50; + const bestResult = scoredReleases.find((r: any) => r.score > threshold); + + if (!bestResult) { + // No good releases found with this threshold - return null so we try the next recording + const modeText = allowSingles ? "singles" : "albums"; + const topScores = scoredReleases.slice(0, 3).map((r: any) => { + const title = + r.release["release-group"]?.title || r.release.title; + return `"${title}" (${r.score})`; + }); + console.log( + `[MusicBrainz] Skipping recording - no ${modeText} found in ${ + releases.length + } releases (threshold: ${threshold}). Top scores: ${topScores.join(", ")}` + ); + return null; + } + + const bestRelease = bestResult.release; + const releaseGroup = bestRelease["release-group"]; + + if (!releaseGroup?.id) { + return null; + } + + console.log( + `[MusicBrainz] Selected "${releaseGroup.title}" (score: ${bestResult.score}) from ${releases.length} releases` + ); + + return { + albumName: + releaseGroup.title || bestRelease.title || "Unknown Album", + albumMbid: releaseGroup.id, + artistMbid, + trackMbid, + }; + } + + /** + * Clear cached recording search result + * Useful for retrying failed lookups + */ + async clearRecordingCache(trackTitle: string, artistName: string): Promise { + const cacheKey = `mb:search:recording:${artistName}:${trackTitle}`; + try { + await redisClient.del(cacheKey); + console.log(`[MusicBrainz] Cleared cache for: "${trackTitle}" by ${artistName}`); + return true; + } catch (err) { + console.warn("Redis del error:", err); + return false; + } + } + + /** + * Clear all stale null cache entries for recording searches + * Returns the number of entries cleared + */ + async clearStaleRecordingCaches(): Promise { + try { + // Get all recording cache keys + const keys = await redisClient.keys("mb:search:recording:*"); + let cleared = 0; + + for (const key of keys) { + const value = await redisClient.get(key); + if (value === "null") { + await redisClient.del(key); + cleared++; + } + } + + console.log(`[MusicBrainz] Cleared ${cleared} stale null cache entries`); + return cleared; + } catch (err) { + console.error("Error clearing stale caches:", err); + return 0; + } + } +} + +export const musicBrainzService = new MusicBrainzService(); diff --git a/backend/src/services/notificationService.ts b/backend/src/services/notificationService.ts new file mode 100644 index 0000000..d9c668b --- /dev/null +++ b/backend/src/services/notificationService.ts @@ -0,0 +1,225 @@ +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); + +export type NotificationType = + | "system" + | "download_complete" + | "download_failed" + | "playlist_ready" + | "import_complete" + | "error"; + +export interface CreateNotificationParams { + userId: string; + type: NotificationType; + title: string; + message?: string; + metadata?: Record; +} + +class NotificationService { + /** + * Create a new notification for a user + */ + async create(params: CreateNotificationParams) { + const { userId, type, title, message, metadata } = params; + + const notification = await prisma.notification.create({ + data: { + userId, + type, + title, + message, + metadata, + }, + }); + + console.log( + `[NOTIFICATION] Created: ${type} - ${title} for user ${userId}` + ); + return notification; + } + + /** + * Get all uncleared notifications for a user + */ + async getForUser(userId: string, includeRead = true) { + return prisma.notification.findMany({ + where: { + userId, + cleared: false, + ...(includeRead ? {} : { read: false }), + }, + orderBy: { createdAt: "desc" }, + take: 100, + }); + } + + /** + * Get unread count for a user + */ + async getUnreadCount(userId: string) { + return prisma.notification.count({ + where: { + userId, + cleared: false, + read: false, + }, + }); + } + + /** + * Mark a notification as read + */ + async markAsRead(id: string, userId: string) { + return prisma.notification.updateMany({ + where: { id, userId }, + data: { read: true }, + }); + } + + /** + * Mark all notifications as read for a user + */ + async markAllAsRead(userId: string) { + return prisma.notification.updateMany({ + where: { userId, cleared: false }, + data: { read: true }, + }); + } + + /** + * Clear a notification (remove from view but keep in DB) + */ + async clear(id: string, userId: string) { + return prisma.notification.updateMany({ + where: { id, userId }, + data: { cleared: true }, + }); + } + + /** + * Clear all notifications for a user + */ + async clearAll(userId: string) { + return prisma.notification.updateMany({ + where: { userId }, + data: { cleared: true }, + }); + } + + /** + * Delete old cleared notifications (cleanup job) + */ + async deleteOldCleared(daysOld = 30) { + const cutoff = new Date(); + cutoff.setDate(cutoff.getDate() - daysOld); + + const result = await prisma.notification.deleteMany({ + where: { + cleared: true, + createdAt: { lt: cutoff }, + }, + }); + + if (result.count > 0) { + console.log( + `[NOTIFICATION] Cleaned up ${result.count} old notifications` + ); + } + return result; + } + + // === Convenience methods for common notification types === + + /** + * Notify user that a download completed + */ + async notifyDownloadComplete( + userId: string, + subject: string, + albumId?: string, + artistId?: string + ) { + return this.create({ + userId, + type: "download_complete", + title: "Download Complete", + message: `${subject} has been downloaded and added to your library`, + metadata: { albumId, artistId }, + }); + } + + /** + * Notify user that a download failed + */ + async notifyDownloadFailed( + userId: string, + subject: string, + error?: string + ) { + return this.create({ + userId, + type: "download_failed", + title: "Download Failed", + message: `Failed to download ${subject}${ + error ? `: ${error}` : "" + }`, + metadata: { subject, error }, + }); + } + + /** + * Notify user that a playlist is ready + */ + async notifyPlaylistReady( + userId: string, + playlistName: string, + playlistId: string, + trackCount: number + ) { + return this.create({ + userId, + type: "playlist_ready", + title: "Playlist Ready", + message: `"${playlistName}" is ready with ${trackCount} tracks`, + metadata: { playlistId, playlistName, trackCount }, + }); + } + + /** + * Notify user that a Spotify import completed + */ + async notifyImportComplete( + userId: string, + playlistName: string, + playlistId: string, + matchedTracks: number, + totalTracks: number + ) { + const message = `"${playlistName}" imported with ${matchedTracks} of ${totalTracks} tracks`; + + return this.create({ + userId, + type: "import_complete", + title: "Import Complete", + message, + metadata: { playlistId, playlistName, matchedTracks, totalTracks }, + }); + } + + /** + * System notification (cache cleared, sync complete, etc.) + */ + async notifySystem(userId: string, title: string, message?: string) { + return this.create({ + userId, + type: "system", + title, + message, + }); + } +} + +export const notificationService = new NotificationService(); diff --git a/backend/src/services/openai.ts b/backend/src/services/openai.ts new file mode 100644 index 0000000..bdd0442 --- /dev/null +++ b/backend/src/services/openai.ts @@ -0,0 +1,184 @@ +import axios, { AxiosInstance } from "axios"; +import { config } from "../config"; + +interface PlaylistTrack { + artistName: string; + albumTitle?: string; + trackTitle: string; + reason?: string; +} + +interface GeneratePlaylistParams { + userId: string; + topArtists: Array<{ name: string; playCount: number; genres: string[] }>; + recentDiscoveries: string[]; + likedArtists: string[]; + dislikedArtists: string[]; + targetCount: number; +} + +class OpenAIService { + private client: AxiosInstance; + private apiKey: string; + + constructor() { + this.apiKey = config.openai.apiKey; + this.client = axios.create({ + baseURL: "https://api.openai.com/v1", + timeout: 60000, + headers: { + Authorization: `Bearer ${this.apiKey}`, + "Content-Type": "application/json", + }, + }); + } + + async generateWeeklyPlaylist( + params: GeneratePlaylistParams + ): Promise { + const { + topArtists, + recentDiscoveries, + likedArtists, + dislikedArtists, + targetCount, + } = params; + + // Build context for AI + const topArtistsText = topArtists + .slice(0, 20) + .map( + (a) => + `${a.name} (${a.playCount} plays, genres: ${a.genres.join( + ", " + )})` + ) + .join("\n"); + + const prompt = `You are a music curator creating a personalized "Discover Weekly" playlist. + +USER'S LISTENING PROFILE: +Top Artists (last 90 days): +${topArtistsText} + +Recent Discoveries (NEW artists to explore): ${recentDiscoveries.join(", ") || "None yet"} +Liked Artists: ${likedArtists.join(", ") || "None"} +Disliked Artists (NEVER recommend): ${dislikedArtists.join(", ") || "None"} + +TASK: +Generate a ${targetCount}-track playlist with this breakdown: +- 25% (${Math.round( + targetCount * 0.25 + )} tracks): From the user's top artists (1-2 tracks max per artist) +- 75% (${Math.round( + targetCount * 0.75 + )} tracks): NEW discoveries from the "Recent Discoveries" list above + +CRITICAL REQUIREMENTS: +1. PRIORITIZE new artists from the "Recent Discoveries" list - this is the main goal +2. Include only 1-2 well-known tracks from the user's top artists as "familiar anchors" +3. For new discoveries, choose popular, accessible tracks that will hook the listener +4. Maintain genre consistency with user's preferences +5. NEVER include artists from the "Disliked Artists" list +6. Variety of moods and tempos across the playlist + +OUTPUT FORMAT (JSON): +{ + "tracks": [ + { + "artistName": "Artist Name", + "trackTitle": "Track Title", + "reason": "Brief reason (e.g., 'Popular track from your favorite artist' or 'Similar to Jamiroquai')" + } + ] +} + +Return ONLY valid JSON, no markdown formatting.`; + + try { + const response = await this.client.post("/chat/completions", { + model: "gpt-4-turbo", + messages: [ + { + role: "system", + content: + "You are an expert music curator who creates personalized playlists based on listening history. You always respond with valid JSON only. Ensure all strings are properly escaped.", + }, + { + role: "user", + content: prompt, + }, + ], + max_tokens: 2000, + temperature: 0.7, + response_format: { type: "json_object" }, + }); + + const content = response.data.choices[0].message.content.trim(); + + // Remove markdown code blocks if present + let jsonContent = content; + if (content.startsWith("```json")) { + jsonContent = content + .replace(/```json\n?/g, "") + .replace(/```\n?/g, "") + .trim(); + } else if (content.startsWith("```")) { + jsonContent = content.replace(/```\n?/g, "").trim(); + } + + const result = JSON.parse(jsonContent); + + return result.tracks || []; + } catch (error: any) { + console.error( + "OpenAI API error:", + error.response?.data || error.message + ); + + // Log the raw response content for debugging + if (error instanceof SyntaxError) { + console.error("Failed to parse JSON response"); + } + + throw new Error("Failed to generate playlist with AI"); + } + } + + async enhanceTrackRecommendation( + track: { artist: string; title: string }, + userContext: string + ): Promise { + const prompt = `Given this track: "${track.title}" by ${track.artist} +User context: ${userContext} + +Provide a single-sentence reason why this track would fit in their Discover Weekly playlist. +Be concise and engaging (max 15 words).`; + + try { + const response = await this.client.post("/chat/completions", { + model: "gpt-3.5-turbo", + messages: [ + { + role: "system", + content: + "You write brief, engaging music recommendations.", + }, + { + role: "user", + content: prompt, + }, + ], + temperature: 0.7, + max_tokens: 50, + }); + + return response.data.choices[0].message.content.trim(); + } catch (error) { + console.error("OpenAI enhancement error:", error); + return "Recommended based on your listening history"; + } + } +} + +export const openAIService = new OpenAIService(); diff --git a/backend/src/services/podcastCache.ts b/backend/src/services/podcastCache.ts new file mode 100644 index 0000000..8ccd024 --- /dev/null +++ b/backend/src/services/podcastCache.ts @@ -0,0 +1,252 @@ +import { prisma } from "../utils/db"; +import fs from "fs/promises"; +import path from "path"; +import { config } from "../config"; + +/** + * Service to cache podcast cover images locally + * Podcasts are already stored in database (from RSS feeds) + * This service adds cover image caching to avoid repeated downloads + */ + +interface CoverSyncResult { + synced: number; + failed: number; + skipped: number; + errors: string[]; +} + +export class PodcastCacheService { + private coverCacheDir: string; + + constructor() { + // Store covers in: /cover-cache/podcasts/ + this.coverCacheDir = path.join( + config.music.musicPath, + "cover-cache", + "podcasts" + ); + } + + /** + * Sync cover images for all podcasts + */ + async syncAllCovers(): Promise { + const result: CoverSyncResult = { + synced: 0, + failed: 0, + skipped: 0, + errors: [], + }; + + try { + console.log(" Starting podcast cover sync..."); + + // Ensure cover cache directory exists + await fs.mkdir(this.coverCacheDir, { recursive: true }); + + // Fetch all podcasts from database + const podcasts = await prisma.podcast.findMany({ + where: { + localCoverPath: null, // Only sync podcasts without local covers + imageUrl: { not: null }, + }, + }); + + console.log( + `[PODCAST] Found ${podcasts.length} podcasts needing cover sync` + ); + + for (const podcast of podcasts) { + try { + if (podcast.imageUrl) { + const localPath = await this.downloadCover( + podcast.id, + podcast.imageUrl, + "podcast" + ); + + if (localPath) { + await prisma.podcast.update({ + where: { id: podcast.id }, + data: { localCoverPath: localPath }, + }); + result.synced++; + console.log(` Synced cover for: ${podcast.title}`); + } else { + result.skipped++; + } + } + } catch (error: any) { + result.failed++; + const errorMsg = `Failed to sync cover for ${podcast.title}: ${error.message}`; + result.errors.push(errorMsg); + console.error(` ✗ ${errorMsg}`); + } + } + + console.log("\nPodcast Cover Sync Summary:"); + console.log(` Synced: ${result.synced}`); + console.log(` Failed: ${result.failed}`); + console.log(` Skipped: ${result.skipped}`); + + return result; + } catch (error: any) { + console.error(" Podcast cover sync failed:", error); + throw error; + } + } + + /** + * Sync cover images for all podcast episodes (if they have unique covers) + */ + async syncEpisodeCovers(): Promise { + const result: CoverSyncResult = { + synced: 0, + failed: 0, + skipped: 0, + errors: [], + }; + + try { + console.log(" Starting podcast episode cover sync..."); + + await fs.mkdir(this.coverCacheDir, { recursive: true }); + + // Fetch episodes with unique covers (different from podcast cover) + const episodes = await prisma.podcastEpisode.findMany({ + where: { + localCoverPath: null, + imageUrl: { not: null }, + }, + include: { + podcast: { + select: { + imageUrl: true, + }, + }, + }, + }); + + // Filter to only episodes with unique covers + const uniqueEpisodes = episodes.filter( + (ep) => ep.imageUrl !== ep.podcast.imageUrl + ); + + console.log( + `[PODCAST] Found ${uniqueEpisodes.length} episodes with unique covers` + ); + + for (const episode of uniqueEpisodes) { + try { + if (episode.imageUrl) { + const localPath = await this.downloadCover( + episode.id, + episode.imageUrl, + "episode" + ); + + if (localPath) { + await prisma.podcastEpisode.update({ + where: { id: episode.id }, + data: { localCoverPath: localPath }, + }); + result.synced++; + console.log( + ` Synced cover for episode: ${episode.title}` + ); + } else { + result.skipped++; + } + } + } catch (error: any) { + result.failed++; + const errorMsg = `Failed to sync cover for episode ${episode.title}: ${error.message}`; + result.errors.push(errorMsg); + console.error(` ✗ ${errorMsg}`); + } + } + + console.log("\nEpisode Cover Sync Summary:"); + console.log(` Synced: ${result.synced}`); + console.log(` Failed: ${result.failed}`); + console.log(` Skipped: ${result.skipped}`); + + return result; + } catch (error: any) { + console.error(" Episode cover sync failed:", error); + throw error; + } + } + + /** + * Download a cover image and save it locally + */ + private async downloadCover( + id: string, + imageUrl: string, + type: "podcast" | "episode" + ): Promise { + try { + const response = await fetch(imageUrl); + + if (!response.ok) { + throw new Error( + `HTTP ${response.status}: ${response.statusText}` + ); + } + + const buffer = await response.arrayBuffer(); + const fileName = `${type}_${id}.jpg`; + const filePath = path.join(this.coverCacheDir, fileName); + + await fs.writeFile(filePath, Buffer.from(buffer)); + + return filePath; + } catch (error: any) { + console.error( + `Failed to download cover for ${type} ${id}:`, + error.message + ); + return null; + } + } + + /** + * Clean up orphaned covers + */ + async cleanupOrphanedCovers(): Promise { + const podcasts = await prisma.podcast.findMany({ + select: { localCoverPath: true }, + }); + + const episodes = await prisma.podcastEpisode.findMany({ + select: { localCoverPath: true }, + }); + + const validCoverPaths = new Set([ + ...podcasts + .filter((p) => p.localCoverPath) + .map((p) => path.basename(p.localCoverPath!)), + ...episodes + .filter((e) => e.localCoverPath) + .map((e) => path.basename(e.localCoverPath!)), + ]); + + let deleted = 0; + const files = await fs.readdir(this.coverCacheDir); + + for (const file of files) { + if (!validCoverPaths.has(file)) { + await fs.unlink(path.join(this.coverCacheDir, file)); + deleted++; + console.log(` [DELETE] Deleted orphaned podcast cover: ${file}`); + } + } + + return deleted; + } +} + +// Export singleton instance +export const podcastCacheService = new PodcastCacheService(); diff --git a/backend/src/services/podcastDownload.ts b/backend/src/services/podcastDownload.ts new file mode 100644 index 0000000..1bc0380 --- /dev/null +++ b/backend/src/services/podcastDownload.ts @@ -0,0 +1,441 @@ +import { prisma } from "../utils/db"; +import { config } from "../config"; +import fs from "fs/promises"; +import path from "path"; +import axios from "axios"; + +/** + * PodcastDownloadService - Background download and caching of podcast episodes + * + * Features: + * - Non-blocking background downloads when episodes are played + * - 30-day cache expiry with automatic cleanup + * - Proper range request support for cached files + */ + +// Track in-progress downloads to avoid duplicates +const downloadingEpisodes = new Set(); + +// Track download progress (episodeId -> { bytesDownloaded, totalBytes }) +interface DownloadProgress { + bytesDownloaded: number; + totalBytes: number; +} +const downloadProgress = new Map(); + +// Cache directory for podcast audio files +const getPodcastCacheDir = (): string => { + return path.join(config.music.transcodeCachePath, "../podcast-audio"); +}; + +/** + * Get download progress for an episode + * Returns { progress: 0-100, downloading: boolean } or null if not downloading + */ +export function getDownloadProgress(episodeId: string): { progress: number; downloading: boolean } | null { + if (!downloadingEpisodes.has(episodeId)) { + return null; + } + + const progress = downloadProgress.get(episodeId); + if (!progress || progress.totalBytes === 0) { + return { progress: 0, downloading: true }; + } + + const percent = Math.round((progress.bytesDownloaded / progress.totalBytes) * 100); + return { progress: Math.min(100, percent), downloading: true }; +} + +/** + * Check if a cached file exists and is valid + * Returns null if file doesn't exist, is empty, or is still being downloaded + */ +export async function getCachedFilePath(episodeId: string): Promise { + // Don't return cache path if still downloading - file may be incomplete + if (downloadingEpisodes.has(episodeId)) { + console.log(`[PODCAST-DL] Episode ${episodeId} is still downloading, not using cache`); + return null; + } + + const cacheDir = getPodcastCacheDir(); + const cachedPath = path.join(cacheDir, `${episodeId}.mp3`); + + try { + await fs.access(cachedPath, fs.constants.F_OK); + const stats = await fs.stat(cachedPath); + + // File must be > 0 bytes to be valid + if (stats.size > 0) { + // Strong validation: if we know the canonical remote file size, require the cache to match. + // This prevents "cached=true" when we only downloaded part of the file (which breaks seeking and causes 416s). + try { + const episode = await prisma.podcastEpisode.findUnique({ + where: { id: episodeId }, + select: { fileSize: true }, + }); + if (episode?.fileSize && episode.fileSize > 0) { + const expected = episode.fileSize; + const actual = stats.size; + const variance = Math.abs(actual - expected) / expected; + if (variance > 0.01) { + console.log( + `[PODCAST-DL] Episode size mismatch vs episode.fileSize for ${episodeId}: actual ${actual} vs expected ${expected} (variance ${Math.round( + variance * 100 + )}%), deleting cache` + ); + await fs.unlink(cachedPath).catch(() => {}); + await prisma.podcastDownload.deleteMany({ + where: { episodeId }, + }); + return null; + } + } + } catch { + // If this check fails, fall back to prior DB-record based validation + } + + // Check database record exists + const dbRecord = await prisma.podcastDownload.findFirst({ + where: { episodeId } + }); + + // If no DB record, file might be incomplete or stale + if (!dbRecord) { + console.log(`[PODCAST-DL] No DB record for ${episodeId}, deleting stale cache file`); + await fs.unlink(cachedPath).catch(() => {}); + return null; + } + + // Validate file size matches what we recorded (allow 1% variance for filesystem differences) + const expectedSize = dbRecord.fileSizeMb * 1024 * 1024; + const actualSize = stats.size; + const variance = Math.abs(actualSize - expectedSize) / expectedSize; + + if (expectedSize > 0 && variance > 0.01) { + console.log(`[PODCAST-DL] Size mismatch for ${episodeId}: actual ${actualSize} vs expected ${Math.round(expectedSize)}, deleting`); + await fs.unlink(cachedPath).catch(() => {}); + await prisma.podcastDownload.deleteMany({ where: { episodeId } }); + return null; + } + + // Update last accessed time + await prisma.podcastDownload.updateMany({ + where: { episodeId }, + data: { lastAccessedAt: new Date() } + }); + + console.log(`[PODCAST-DL] Cache valid for ${episodeId}: ${stats.size} bytes`); + return cachedPath; + } + return null; + } catch { + return null; + } +} + +/** + * Start a background download for an episode + * Returns immediately, download happens asynchronously + */ +export function downloadInBackground( + episodeId: string, + audioUrl: string, + userId: string +): void { + // Skip if already downloading + if (downloadingEpisodes.has(episodeId)) { + console.log(`[PODCAST-DL] Already downloading episode ${episodeId}, skipping`); + return; + } + + // Mark as downloading + downloadingEpisodes.add(episodeId); + + // Start download in background (don't await) + performDownload(episodeId, audioUrl, userId) + .catch(err => { + console.error(`[PODCAST-DL] Background download failed for ${episodeId}:`, err.message); + }) + .finally(() => { + downloadingEpisodes.delete(episodeId); + }); +} + +/** + * Perform the actual download with retry support + */ +async function performDownload( + episodeId: string, + audioUrl: string, + userId: string, + attempt: number = 1 +): Promise { + const maxAttempts = 3; + console.log(`[PODCAST-DL] Starting background download for episode ${episodeId} (attempt ${attempt}/${maxAttempts})`); + + const cacheDir = getPodcastCacheDir(); + + // Ensure cache directory exists + await fs.mkdir(cacheDir, { recursive: true }); + + const tempPath = path.join(cacheDir, `${episodeId}.tmp`); + const finalPath = path.join(cacheDir, `${episodeId}.mp3`); + + try { + // Check if already cached (and validated) + downloadingEpisodes.delete(episodeId); // Temporarily remove to check cache + const existingCached = await getCachedFilePath(episodeId); + downloadingEpisodes.add(episodeId); // Re-add + if (existingCached) { + console.log(`[PODCAST-DL] Episode ${episodeId} already cached, skipping download`); + return; + } + + // Clean up any partial temp files from previous attempts + await fs.unlink(tempPath).catch(() => {}); + + // Download the file with longer timeout for large podcasts + const response = await axios.get(audioUrl, { + responseType: 'stream', + timeout: 600000, // 10 minute timeout for large files (3+ hour podcasts) + headers: { + 'User-Agent': 'Lidify/1.0 (https://github.com/Chevron7Locked/lidify)' + }, + // Don't let axios decompress - we want raw bytes + decompress: false + }); + + const contentLength = parseInt(response.headers["content-length"] || "0", 10); + let expectedBytes = Number.isFinite(contentLength) && contentLength > 0 ? contentLength : 0; + + // If the origin provides Content-Length, treat it as ground truth and persist it. + // This prevents us from "accepting" partial caches that later break seeking. + if (expectedBytes > 0) { + try { + const episode = await prisma.podcastEpisode.findUnique({ + where: { id: episodeId }, + select: { fileSize: true }, + }); + const existing = episode?.fileSize || 0; + if (!existing) { + await prisma.podcastEpisode.update({ + where: { id: episodeId }, + data: { fileSize: expectedBytes }, + }); + } else { + const variance = Math.abs(existing - expectedBytes) / existing; + if (variance > 0.01) { + await prisma.podcastEpisode.update({ + where: { id: episodeId }, + data: { fileSize: expectedBytes }, + }); + } + } + } catch { + // Non-fatal + } + } else { + // Fallback: use DB fileSize if present (better than nothing) + try { + const episode = await prisma.podcastEpisode.findUnique({ + where: { id: episodeId }, + select: { fileSize: true }, + }); + if (episode?.fileSize && episode.fileSize > 0) { + expectedBytes = episode.fileSize; + } + } catch {} + } + + console.log( + `[PODCAST-DL] Downloading ${episodeId} (${expectedBytes > 0 ? Math.round(expectedBytes / 1024 / 1024) : 0}MB)` + ); + + // Initialize progress tracking + downloadProgress.set(episodeId, { + bytesDownloaded: 0, + totalBytes: expectedBytes || 0, + }); + + // Write to temp file first with progress tracking + const writeStream = (await import('fs')).createWriteStream(tempPath); + let bytesDownloaded = 0; + let lastLogTime = Date.now(); + + await new Promise((resolve, reject) => { + response.data.on('data', (chunk: Buffer) => { + bytesDownloaded += chunk.length; + downloadProgress.set(episodeId, { bytesDownloaded, totalBytes: contentLength }); + + // Log progress every 30 seconds for long downloads + const now = Date.now(); + if (now - lastLogTime > 30000) { + const percent = contentLength > 0 ? Math.round((bytesDownloaded / contentLength) * 100) : 0; + console.log(`[PODCAST-DL] Download progress ${episodeId}: ${percent}% (${Math.round(bytesDownloaded / 1024 / 1024)}MB)`); + lastLogTime = now; + } + }); + + response.data.on('end', () => { + writeStream.end(() => resolve()); + }); + + response.data.pipe(writeStream, { end: false }); + + writeStream.on('error', (err) => { + response.data.destroy(); + reject(err); + }); + + response.data.on('error', (err: Error) => { + writeStream.destroy(); + reject(err); + }); + + // Handle aborted connections + response.data.on('aborted', () => { + writeStream.destroy(); + reject(new Error('Download aborted by server')); + }); + }); + + // Verify file was written and is complete + const stats = await fs.stat(tempPath); + if (stats.size === 0) { + await fs.unlink(tempPath).catch(() => {}); + throw new Error('Downloaded file is empty'); + } + + // Check completeness when we know an expected size (prefer Content-Length). + // Allow a small variance because some servers are inconsistent at the byte level. + if (expectedBytes > 0) { + const variance = Math.abs(stats.size - expectedBytes) / expectedBytes; + if (variance > 0.01) { + const percentComplete = Math.round((stats.size / expectedBytes) * 100); + console.error(`[PODCAST-DL] Incomplete download for ${episodeId}: ${stats.size}/${expectedBytes} bytes (${percentComplete}%)`); + await fs.unlink(tempPath).catch(() => {}); + throw new Error(`Download incomplete: got ${stats.size} bytes, expected ${expectedBytes}`); + } + } + + // Move temp file to final location + await fs.rename(tempPath, finalPath); + + // Record in database + const fileSizeMb = stats.size / 1024 / 1024; + + await prisma.podcastDownload.upsert({ + where: { + userId_episodeId: { userId, episodeId } + }, + create: { + userId, + episodeId, + localPath: finalPath, + fileSizeMb, + downloadedAt: new Date(), + lastAccessedAt: new Date() + }, + update: { + localPath: finalPath, + fileSizeMb, + downloadedAt: new Date(), + lastAccessedAt: new Date() + } + }); + + console.log(`[PODCAST-DL] Successfully cached episode ${episodeId} (${fileSizeMb.toFixed(1)}MB)`); + + // Clean up progress tracking + downloadProgress.delete(episodeId); + + } catch (error: any) { + // Clean up temp file and progress tracking on error + await fs.unlink(tempPath).catch(() => {}); + downloadProgress.delete(episodeId); + + // Retry on failure + if (attempt < maxAttempts) { + console.log(`[PODCAST-DL] Download failed (attempt ${attempt}), retrying in 5s: ${error.message}`); + await new Promise(resolve => setTimeout(resolve, 5000)); + return performDownload(episodeId, audioUrl, userId, attempt + 1); + } + + throw error; + } +} + +/** + * Clean up cached episodes older than 30 days + * Should be called periodically (e.g., daily) + */ +export async function cleanupExpiredCache(): Promise<{ deleted: number; freedMb: number }> { + console.log('[PODCAST-DL] Starting cache cleanup...'); + + const thirtyDaysAgo = new Date(); + thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); + + // Find expired downloads + const expiredDownloads = await prisma.podcastDownload.findMany({ + where: { + lastAccessedAt: { lt: thirtyDaysAgo } + } + }); + + let deleted = 0; + let freedMb = 0; + + for (const download of expiredDownloads) { + try { + // Delete file from disk + await fs.unlink(download.localPath).catch(() => {}); + + // Delete database record + await prisma.podcastDownload.delete({ + where: { id: download.id } + }); + + deleted++; + freedMb += download.fileSizeMb; + + console.log(`[PODCAST-DL] Deleted expired cache: ${path.basename(download.localPath)}`); + } catch (err: any) { + console.error(`[PODCAST-DL] Failed to delete ${download.localPath}:`, err.message); + } + } + + console.log(`[PODCAST-DL] Cleanup complete: ${deleted} files deleted, ${freedMb.toFixed(1)}MB freed`); + + return { deleted, freedMb }; +} + +/** + * Get cache statistics + */ +export async function getCacheStats(): Promise<{ + totalFiles: number; + totalSizeMb: number; + oldestFile: Date | null; +}> { + const downloads = await prisma.podcastDownload.findMany({ + select: { + fileSizeMb: true, + downloadedAt: true + }, + orderBy: { downloadedAt: 'asc' } + }); + + return { + totalFiles: downloads.length, + totalSizeMb: downloads.reduce((sum, d) => sum + d.fileSizeMb, 0), + oldestFile: downloads.length > 0 ? downloads[0].downloadedAt : null + }; +} + +/** + * Check if an episode is currently being downloaded + */ +export function isDownloading(episodeId: string): boolean { + return downloadingEpisodes.has(episodeId); +} + diff --git a/backend/src/services/podcastindex.ts b/backend/src/services/podcastindex.ts new file mode 100644 index 0000000..e0be9fd --- /dev/null +++ b/backend/src/services/podcastindex.ts @@ -0,0 +1,94 @@ +import { getSystemSettings } from "../utils/systemSettings"; +import { decrypt } from "../utils/encryption"; + +let podcastindexApi: any = null; + +/** + * Initialize PodcastIndex API client with credentials from system settings + */ +async function initPodcastindexClient() { + const settings = await getSystemSettings(); + + if (!settings?.podcastindexEnabled) { + throw new Error("PodcastIndex is not enabled in system settings"); + } + + if (!settings.podcastindexApiKey || !settings.podcastindexApiSecret) { + throw new Error("PodcastIndex API credentials not configured"); + } + + const apiKey = decrypt(settings.podcastindexApiKey); + const apiSecret = decrypt(settings.podcastindexApiSecret); + + const podcastIndexApi = require("podcast-index-api"); + podcastindexApi = podcastIndexApi(apiKey, apiSecret, "Lidify"); + + return podcastindexApi; +} + +/** + * Search podcasts by term + */ +export async function searchPodcasts(query: string, max: number = 20) { + const client = await initPodcastindexClient(); + const results = await client.searchByTerm(query, max); + return results; +} + +/** + * Get trending podcasts + */ +export async function getTrendingPodcasts(max: number = 10, category?: string) { + const client = await initPodcastindexClient(); + const results = await client.podcastsTrending(max, null, null, category); + return results; +} + +/** + * Get podcasts by category + */ +export async function getPodcastsByCategory( + category: string, + max: number = 20 +) { + const client = await initPodcastindexClient(); + const results = await client.searchByTerm("", max, null, null); + // Filter by category + return results; +} + +/** + * Get all categories + */ +export async function getCategories() { + const client = await initPodcastindexClient(); + const results = await client.categoriesList(); + return results; +} + +/** + * Get podcast by feed URL + */ +export async function getPodcastByFeedUrl(feedUrl: string) { + const client = await initPodcastindexClient(); + const results = await client.podcastsByFeedUrl(feedUrl); + return results; +} + +/** + * Get podcast by iTunes ID + */ +export async function getPodcastByItunesId(itunesId: string) { + const client = await initPodcastindexClient(); + const results = await client.podcastsByFeedItunesId(itunesId); + return results; +} + +/** + * Get recent podcasts + */ +export async function getRecentPodcasts(max: number = 20) { + const client = await initPodcastindexClient(); + const results = await client.recentFeeds(max); + return results; +} diff --git a/backend/src/services/programmaticPlaylists.ts b/backend/src/services/programmaticPlaylists.ts new file mode 100644 index 0000000..1d626b0 --- /dev/null +++ b/backend/src/services/programmaticPlaylists.ts @@ -0,0 +1,3246 @@ +import { prisma } from "../utils/db"; +import { lastFmService } from "./lastfm"; + +export interface ProgrammaticMix { + id: string; + type: string; + name: string; + description: string; + trackIds: string[]; + coverUrls: string[]; // For mosaic cover art + trackCount: number; + color: string; // Tailwind gradient classes for mood-reflective hero +} + +// Research-based color psychology for mix vibes +// Using actual CSS rgba values for inline styles (Tailwind classes get purged at build time) +const MIX_COLORS: Record = { + // Night/Introspection - Deep blues and purples for calm, night sky, solitude + "late-night": "linear-gradient(to bottom, rgba(30, 27, 75, 0.7), rgba(30, 58, 138, 0.5), rgba(15, 23, 42, 0.4))", + "3am-thoughts": "linear-gradient(to bottom, rgba(46, 16, 101, 0.7), rgba(88, 28, 135, 0.5), rgba(15, 23, 42, 0.4))", + "night-drive": "linear-gradient(to bottom, rgba(15, 23, 42, 0.7), rgba(49, 46, 129, 0.5), rgba(88, 28, 135, 0.4))", + + // Calm/Relaxation - Teal and seafoam for spa-like tranquility + "chill": "linear-gradient(to bottom, rgba(17, 94, 89, 0.6), rgba(22, 78, 99, 0.5), rgba(15, 23, 42, 0.4))", + "coffee-shop": "linear-gradient(to bottom, rgba(120, 53, 15, 0.6), rgba(68, 64, 60, 0.5), rgba(38, 38, 38, 0.4))", + "rainy-day": "linear-gradient(to bottom, rgba(51, 65, 85, 0.6), rgba(31, 41, 55, 0.5), rgba(39, 39, 42, 0.4))", + "sunday-morning": "linear-gradient(to bottom, rgba(253, 186, 116, 0.4), rgba(252, 211, 77, 0.3), rgba(68, 64, 60, 0.4))", + + // Energy/Workout - Red and orange to increase heart rate + "workout": "linear-gradient(to bottom, rgba(153, 27, 27, 0.6), rgba(124, 45, 18, 0.5), rgba(68, 64, 60, 0.4))", + "confidence-boost": "linear-gradient(to bottom, rgba(194, 65, 12, 0.6), rgba(146, 64, 14, 0.5), rgba(68, 64, 60, 0.4))", + + // Happy/Uplifting - Yellow and warm amber for optimism + "happy": "linear-gradient(to bottom, rgba(217, 119, 6, 0.5), rgba(161, 98, 7, 0.4), rgba(68, 64, 60, 0.4))", + "summer-vibes": "linear-gradient(to bottom, rgba(8, 145, 178, 0.5), rgba(15, 118, 110, 0.4), rgba(30, 58, 138, 0.4))", + "golden-hour": "linear-gradient(to bottom, rgba(245, 158, 11, 0.5), rgba(234, 88, 12, 0.4), rgba(136, 19, 55, 0.4))", + + // Sad/Melancholy - Cool blue-grays for "feeling blue" + "melancholy": "linear-gradient(to bottom, rgba(51, 65, 85, 0.6), rgba(30, 58, 138, 0.5), rgba(17, 24, 39, 0.4))", + "sad-girl-sundays": "linear-gradient(to bottom, rgba(136, 19, 55, 0.5), rgba(30, 41, 59, 0.5), rgba(59, 7, 100, 0.4))", + "heartbreak-hotel": "linear-gradient(to bottom, rgba(30, 58, 138, 0.6), rgba(88, 28, 135, 0.5), rgba(15, 23, 42, 0.4))", + + // Party/Dance - Hot pink and magenta for club energy + "dance-floor": "linear-gradient(to bottom, rgba(162, 28, 175, 0.6), rgba(131, 24, 67, 0.5), rgba(59, 7, 100, 0.4))", + + // Acoustic/Organic - Warm browns like wood instruments + "acoustic": "linear-gradient(to bottom, rgba(146, 64, 14, 0.6), rgba(124, 45, 18, 0.5), rgba(68, 64, 60, 0.4))", + "unplugged": "linear-gradient(to bottom, rgba(68, 64, 60, 0.6), rgba(120, 53, 15, 0.5), rgba(38, 38, 38, 0.4))", + + // Focus/Instrumental - Purple for creativity and concentration + "instrumental": "linear-gradient(to bottom, rgba(91, 33, 182, 0.6), rgba(88, 28, 135, 0.5), rgba(15, 23, 42, 0.4))", + "focus-flow": "linear-gradient(to bottom, rgba(30, 58, 138, 0.6), rgba(30, 41, 59, 0.5), rgba(17, 24, 39, 0.4))", + + // Adventure/Road Trip - Sunset oranges for freedom + "road-trip": "linear-gradient(to bottom, rgba(194, 65, 12, 0.6), rgba(146, 64, 14, 0.5), rgba(14, 165, 233, 0.4))", + + // Character/Mood Archetypes + "main-character": "linear-gradient(to bottom, rgba(245, 158, 11, 0.5), rgba(202, 138, 4, 0.4), rgba(124, 45, 18, 0.4))", + "villain-era": "linear-gradient(to bottom, rgba(69, 10, 10, 0.7), rgba(17, 24, 39, 0.6), rgba(0, 0, 0, 0.5))", + + // Nostalgia - Sepia and vintage tones + "throwback": "linear-gradient(to bottom, rgba(146, 64, 14, 0.5), rgba(124, 45, 18, 0.4), rgba(68, 64, 60, 0.4))", + + // Genre/Era based - More neutral but themed + "era": "linear-gradient(to bottom, rgba(68, 64, 60, 0.5), rgba(38, 38, 38, 0.4), rgba(39, 39, 42, 0.4))", + "genre": "linear-gradient(to bottom, rgba(63, 63, 70, 0.5), rgba(30, 41, 59, 0.4), rgba(17, 24, 39, 0.4))", + "top-tracks": "linear-gradient(to bottom, rgba(6, 95, 70, 0.5), rgba(17, 94, 89, 0.4), rgba(15, 23, 42, 0.4))", + "rediscover": "linear-gradient(to bottom, rgba(55, 48, 163, 0.5), rgba(76, 29, 149, 0.4), rgba(15, 23, 42, 0.4))", + "artist-similar": "linear-gradient(to bottom, rgba(107, 33, 168, 0.5), rgba(112, 26, 117, 0.4), rgba(15, 23, 42, 0.4))", + "discovery": "linear-gradient(to bottom, rgba(2, 132, 199, 0.5), rgba(30, 58, 138, 0.4), rgba(15, 23, 42, 0.4))", + + // Mood-on-demand default + "mood": "linear-gradient(to bottom, rgba(162, 28, 175, 0.5), rgba(107, 33, 168, 0.4), rgba(15, 23, 42, 0.4))", + + // Default fallback + "default": "linear-gradient(to bottom, rgba(88, 28, 135, 0.4), rgba(26, 26, 26, 1), transparent)", +}; + +// Helper to get color for a mix type +function getMixColor(type: string): string { + return MIX_COLORS[type] || MIX_COLORS["default"]; +} + +// Helper to randomly sample from array +function randomSample(array: T[], count: number): T[] { + const shuffled = [...array].sort(() => Math.random() - 0.5); + return shuffled.slice(0, count); +} + +// Helper to get seeded random number for daily consistency +function getSeededRandom(seed: string): number { + let hash = 0; + for (let i = 0; i < seed.length; i++) { + const char = seed.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; + } + return Math.abs(hash); +} + +// Type for track with album cover +type TrackWithAlbumCover = { + id: string; + album: { coverUrl: string | null; genres?: unknown }; + lastfmTags?: string[]; + essentiaGenres?: string[]; + [key: string]: unknown; +}; + +/** + * Helper to find tracks matching genre patterns. + * Uses lastfmTags and essentiaGenres on tracks (String[]) first, + * then falls back to filtering album.genres (JSON array) in memory. + */ +async function findTracksByGenrePatterns( + genrePatterns: string[], + limit: number = 100 +): Promise { + // Strategy 1: Use track's lastfmTags and essentiaGenres (native String[] fields) + const tagPatterns = genrePatterns.map(g => g.toLowerCase()); + + const tracks = await prisma.track.findMany({ + where: { + OR: [ + { lastfmTags: { hasSome: tagPatterns } }, + { essentiaGenres: { hasSome: tagPatterns } }, + ], + }, + include: { album: { select: { coverUrl: true, genres: true } } }, + take: limit, + }); + + if (tracks.length >= 15) { + return tracks; + } + + // Strategy 2: Query albums with non-empty genres and filter in memory + const albumTracks = await prisma.track.findMany({ + where: { + album: { + genres: { not: { equals: null } }, + }, + }, + include: { album: { select: { coverUrl: true, genres: true } } }, + take: limit * 3, // Get more to filter down + }); + + // Filter by genre patterns (case-insensitive partial match) + const genreMatched = albumTracks.filter(t => { + const albumGenres = t.album.genres as string[] | null; + if (!albumGenres || !Array.isArray(albumGenres)) return false; + return albumGenres.some(ag => + genrePatterns.some(gp => ag.toLowerCase().includes(gp.toLowerCase())) + ); + }); + + // Merge unique tracks + const existingIds = new Set(tracks.map(t => t.id)); + const merged = [...tracks, ...genreMatched.filter(t => !existingIds.has(t.id))]; + + return merged.slice(0, limit); +} + +export class ProgrammaticPlaylistService { + private readonly TRACK_LIMIT = 20; + private readonly DAILY_MIX_COUNT = 5; + + // Track count thresholds for mix generation + private readonly MIN_TRACKS_DAILY = 8; // Minimum to generate a daily mix + private readonly MIN_TRACKS_WEEKLY = 15; // Minimum to generate a weekly mix + private readonly DAILY_TRACK_LIMIT = 10; // Daily mix size + private readonly WEEKLY_TRACK_LIMIT = 20; // Weekly mix size + + /** + * Generate 4 daily rotating mixes + */ + async generateAllMixes( + userId: string, + forceRandom = false + ): Promise { + // Get today's date for daily rotation (or random seed if refreshing) + const today = new Date().toISOString().split("T")[0]; + const seedString = forceRandom + ? `${userId}-${Date.now()}-${Math.random()}` + : `${today}-${userId}`; + const dateSeed = getSeededRandom(seedString); + + console.log( + `[MIXES] Generating mixes for user ${userId}, forceRandom: ${forceRandom}, seed: ${dateSeed}` + ); + + // Define all possible mix types + const seedSuffix = forceRandom ? `-${Date.now()}` : ""; + const mixGenerators = [ + // Classic mixes (genre/era based) + { + fn: () => this.generateEraMix(userId, today + seedSuffix), + weight: 2, + name: "Era Mix", + }, + { + fn: () => this.generateGenreMix(userId, today + seedSuffix), + weight: 2, + name: "Genre Mix", + }, + { + fn: () => this.generateTopTracksMix(userId), + weight: 1, + name: "Top Tracks Mix", + }, + { + fn: () => + this.generateRediscoverMix(userId, today + seedSuffix), + weight: 1, + name: "Rediscover Mix", + }, + { + fn: () => this.generateArtistSimilarMix(userId), + weight: 1, + name: "Artist Similar Mix", + }, + { + fn: () => + this.generateRandomDiscoveryMix(userId, today + seedSuffix), + weight: 1, + name: "Random Discovery Mix", + }, + { + fn: () => this.generatePartyMix(userId, today + seedSuffix), + weight: 2, + name: "Party Mix", + }, + { + fn: () => this.generateChillMix(userId, today + seedSuffix), + weight: 2, + name: "Chill Mix", + }, + { + fn: () => this.generateWorkoutMix(userId, today + seedSuffix), + weight: 2, + name: "Workout Mix", + }, + { + fn: () => this.generateFocusMix(userId, today + seedSuffix), + weight: 2, + name: "Focus Mix", + }, + // Audio analysis-based mixes (using Essentia features) + { + fn: () => this.generateHighEnergyMix(userId, today + seedSuffix), + weight: 2, + name: "High Energy Mix", + }, + { + fn: () => this.generateLateNightMix(userId, today + seedSuffix), + weight: 2, + name: "Late Night Mix", + }, + { + fn: () => this.generateHappyMix(userId, today + seedSuffix), + weight: 2, + name: "Happy Vibes Mix", + }, + { + fn: () => this.generateMelancholyMix(userId, today + seedSuffix), + weight: 2, + name: "Melancholy Mix", + }, + { + fn: () => this.generateDanceFloorMix(userId, today + seedSuffix), + weight: 2, + name: "Dance Floor Mix", + }, + { + fn: () => this.generateAcousticMix(userId, today + seedSuffix), + weight: 2, + name: "Acoustic Mix", + }, + { + fn: () => this.generateInstrumentalMix(userId, today + seedSuffix), + weight: 2, + name: "Instrumental Mix", + }, + { + fn: () => this.generateRoadTripMix(userId, today + seedSuffix), + weight: 2, + name: "Road Trip Mix", + }, + // Day-of-week mixes + { + fn: () => this.generateDayMix(userId), + weight: 1, + name: "Day Mix", + }, + // Curated Vibe Mixes (Daily, 10 tracks) + { + fn: () => this.generateSadGirlSundays(userId, today + seedSuffix), + weight: 2, + name: "Sad Girl Sundays", + }, + { + fn: () => this.generateMainCharacterEnergy(userId, today + seedSuffix), + weight: 2, + name: "Main Character Energy", + }, + { + fn: () => this.generateVillainEra(userId, today + seedSuffix), + weight: 2, + name: "Villain Era", + }, + { + fn: () => this.generate3AMThoughts(userId, today + seedSuffix), + weight: 2, + name: "3AM Thoughts", + }, + { + fn: () => this.generateHotGirlWalk(userId, today + seedSuffix), + weight: 2, + name: "Hot Girl Walk", + }, + { + fn: () => this.generateRageCleaning(userId, today + seedSuffix), + weight: 2, + name: "Rage Cleaning", + }, + { + fn: () => this.generateGoldenHour(userId, today + seedSuffix), + weight: 2, + name: "Golden Hour", + }, + { + fn: () => this.generateShowerKaraoke(userId, today + seedSuffix), + weight: 2, + name: "Shower Karaoke", + }, + { + fn: () => this.generateInMyFeelings(userId, today + seedSuffix), + weight: 2, + name: "In My Feelings", + }, + { + fn: () => this.generateMidnightDrive(userId, today + seedSuffix), + weight: 2, + name: "Midnight Drive", + }, + { + fn: () => this.generateCoffeeShopVibes(userId, today + seedSuffix), + weight: 2, + name: "Coffee Shop Vibes", + }, + { + fn: () => this.generateRomanticizeYourLife(userId, today + seedSuffix), + weight: 2, + name: "Romanticize Your Life", + }, + { + fn: () => this.generateThatGirlEra(userId, today + seedSuffix), + weight: 2, + name: "That Girl Era", + }, + { + fn: () => this.generateUnhinged(userId, today + seedSuffix), + weight: 2, + name: "Unhinged", + }, + // Weekly Curated Mixes (20 tracks) + { + fn: () => this.generateDeepCuts(userId, today + seedSuffix), + weight: 1, + name: "Deep Cuts", + }, + { + fn: () => this.generateKeyJourney(userId, today + seedSuffix), + weight: 1, + name: "Key Journey", + }, + { + fn: () => this.generateTempoFlow(userId, today + seedSuffix), + weight: 1, + name: "Tempo Flow", + }, + { + fn: () => this.generateVocalDetox(userId, today + seedSuffix), + weight: 1, + name: "Vocal Detox", + }, + { + fn: () => this.generateMinorKeyMix(userId, today + seedSuffix), + weight: 1, + name: "Minor Key Mondays", + }, + ]; + + // Select 5 mixes based on date seed + const selectedIndices: number[] = []; + let seed = dateSeed; + + console.log( + `[MIXES] Selecting ${this.DAILY_MIX_COUNT} mixes from ${mixGenerators.length} types...` + ); + + while (selectedIndices.length < this.DAILY_MIX_COUNT) { + seed = (seed * 9301 + 49297) % 233280; + const index = seed % mixGenerators.length; + if (!selectedIndices.includes(index)) { + selectedIndices.push(index); + console.log( + `[MIXES] Selected index ${index}: ${mixGenerators[index].name}` + ); + } + } + + console.log( + `[MIXES] Final selected indices: [${selectedIndices.join(", ")}]` + ); + + // Generate selected mixes + const mixPromises = selectedIndices.map((i) => { + console.log(`[MIXES] Generating ${mixGenerators[i].name}...`); + return mixGenerators[i].fn(); + }); + const mixes = await Promise.all(mixPromises); + + console.log(`[MIXES] Generated ${mixes.length} mixes before filtering`); + mixes.forEach((mix, i) => { + if (mix === null) { + console.log( + `[MIXES] Mix ${i} (${ + mixGenerators[selectedIndices[i]].name + }) returned NULL` + ); + } else { + console.log( + `[MIXES] Mix ${i}: ${mix.name} (${mix.trackCount} tracks)` + ); + } + }); + + // Filter out null mixes + let finalMixes = mixes.filter( + (mix): mix is ProgrammaticMix => mix !== null + ); + console.log( + `[MIXES] Returning ${finalMixes.length} mixes after filtering nulls` + ); + + // If we don't have 5 mixes, try to fill gaps with successful generators + if (finalMixes.length < this.DAILY_MIX_COUNT) { + console.log( + `[MIXES] Only got ${finalMixes.length} mixes, trying to fill gaps...` + ); + + // Try generating from all types that weren't selected or failed + const successfulTypes = new Set(finalMixes.map((m) => m.type)); + const attemptedIndices = new Set(selectedIndices); + + for ( + let i = 0; + i < mixGenerators.length && + finalMixes.length < this.DAILY_MIX_COUNT; + i++ + ) { + if (!attemptedIndices.has(i)) { + console.log( + `[MIXES] Attempting fallback: ${mixGenerators[i].name}` + ); + const fallbackMix = await mixGenerators[i].fn(); + if (fallbackMix && !successfulTypes.has(fallbackMix.type)) { + finalMixes.push(fallbackMix); + successfulTypes.add(fallbackMix.type); + console.log( + `[MIXES] Fallback succeeded: ${fallbackMix.name}` + ); + } + } + } + + console.log(`[MIXES] After fallbacks: ${finalMixes.length} mixes`); + } + + // Check if user has saved mood preferences and generate their personalized mood mix + try { + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { moodMixParams: true } + }); + + if (user?.moodMixParams && typeof user.moodMixParams === 'object') { + const params = user.moodMixParams as any; + const presetName = params.presetName || "Mood"; + const mixName = `Your ${presetName} Mix`; + + console.log(`[MIXES] User has saved mood preferences, generating "${mixName}"...`); + const moodMix = await this.generateMoodOnDemand(userId, params); + if (moodMix) { + // Override the mix metadata with the preset name + const yourMoodMix: ProgrammaticMix = { + ...moodMix, + id: "your-mood-mix", + type: "mood", + name: mixName, + description: `Based on your ${presetName.toLowerCase()} preferences`, + }; + finalMixes.push(yourMoodMix); + console.log(`[MIXES] Added "${mixName}" with ${moodMix.trackCount} tracks`); + } + } + } catch (err) { + console.error("[MIXES] Error generating user's mood mix:", err); + } + + return finalMixes; + } + + /** + * Generate ONE era-based mix (rotating decade daily) + */ + async generateEraMix( + userId: string, + today: string + ): Promise { + // Get all decades + const albums = await prisma.album.findMany({ + where: { tracks: { some: {} } }, + select: { year: true }, + }); + + const decades = new Set(); + albums.forEach((album) => { + if (album.year) { + const decade = Math.floor(album.year / 10) * 10; + decades.add(decade); + } + }); + + if (decades.size === 0) return null; + + // Pick one decade based on today's date + const decadeArray = Array.from(decades).sort((a, b) => b - a); + const decadeSeed = getSeededRandom(`era-${today}`); + const selectedDecade = decadeArray[decadeSeed % decadeArray.length]; + + // Get ALL tracks from this decade + const tracks = await prisma.track.findMany({ + where: { + album: { + year: { gte: selectedDecade, lt: selectedDecade + 10 }, + }, + }, + include: { + album: { select: { coverUrl: true } }, + }, + }); + + if (tracks.length < 15) return null; + + // Random sample 20 tracks + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `era-${selectedDecade}-${today}`, + type: "era", + name: `Your ${selectedDecade}s Mix`, + description: `Random picks from the ${selectedDecade}s`, + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("era"), + }; + } + + /** + * Generate ONE genre-based mix (rotating genre daily) + */ + async generateGenreMix( + userId: string, + today: string + ): Promise { + // Get top genres + const genres = await prisma.genre.findMany({ + include: { + _count: { select: { trackGenres: true } }, + }, + orderBy: { + trackGenres: { _count: "desc" }, + }, + take: 20, + }); + + console.log(`[GENRE MIX] Found ${genres.length} genres total`); + const validGenres = genres.filter((g) => g._count.trackGenres >= 5); + console.log( + `[GENRE MIX] ${validGenres.length} genres have >= 5 tracks` + ); + if (validGenres.length === 0) { + console.log(`[GENRE MIX] FAILED: No genres with enough tracks`); + return null; + } + + // Pick one genre based on today's date + const genreSeed = getSeededRandom(`genre-${today}`); + const selectedGenre = validGenres[genreSeed % validGenres.length]; + + // Get ALL tracks from this genre + const trackGenres = await prisma.trackGenre.findMany({ + where: { genreId: selectedGenre.id }, + include: { + track: { + include: { + album: { select: { coverUrl: true } }, + }, + }, + }, + }); + + const tracks = trackGenres.map((tg) => tg.track); + if (tracks.length < 5) return null; + + // Random sample 20 tracks + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `genre-${selectedGenre.id}-${today}`, + type: "genre", + name: `Your ${selectedGenre.name} Mix`, + description: `Random ${selectedGenre.name} picks`, + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("genre"), + }; + } + + /** + * Generate "Your Top 20" mix + */ + async generateTopTracksMix( + userId: string + ): Promise { + const playStats = await prisma.play.groupBy({ + by: ["trackId"], + where: { userId }, + _count: { trackId: true }, + orderBy: { _count: { trackId: "desc" } }, + take: this.TRACK_LIMIT, + }); + + console.log( + `[TOP TRACKS MIX] Found ${playStats.length} unique played tracks` + ); + if (playStats.length < 5) { + console.log( + `[TOP TRACKS MIX] FAILED: Only ${playStats.length} tracks (need at least 5)` + ); + return null; + } + + const trackIds = playStats.map((p) => p.trackId); + const tracks = await prisma.track.findMany({ + where: { id: { in: trackIds } }, + include: { + album: { select: { coverUrl: true } }, + }, + }); + + // Preserve play count order + const orderedTracks = trackIds + .map((id) => tracks.find((t) => t.id === id)) + .filter((t) => t !== undefined); + + const coverUrls = orderedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: "top-tracks", + type: "top-tracks", + name: "Your Top 20", + description: "Your most played tracks", + trackIds: orderedTracks.map((t) => t.id), + coverUrls, + trackCount: orderedTracks.length, + color: getMixColor("top-tracks"), + }; + } + + /** + * Generate "Rediscover" mix with daily rotation + */ + async generateRediscoverMix( + userId: string, + today: string + ): Promise { + // Get tracks with low play count (0-2 plays) + const allTracks = await prisma.track.findMany({ + include: { + _count: { + select: { + plays: { where: { userId } }, + }, + }, + album: { select: { coverUrl: true } }, + }, + }); + + const underplayedTracks = allTracks.filter((t) => t._count.plays <= 2); + + if (underplayedTracks.length < 5) return null; + + // Use date seed for consistent daily selection + const seed = getSeededRandom(`rediscover-${today}`); + let random = seed; + const shuffled = underplayedTracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `rediscover-${today}`, + type: "rediscover", + name: "Rediscover", + description: "Hidden gems you rarely play", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("rediscover"), + }; + } + + /** + * Generate "More Like X" mix + */ + async generateArtistSimilarMix( + userId: string + ): Promise { + // Get most played artist from last 7 days + const recentPlays = await prisma.play.findMany({ + where: { + userId, + playedAt: { + gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), + }, + }, + include: { + track: { + include: { + album: { select: { artistId: true } }, + }, + }, + }, + }); + + console.log( + `[ARTIST SIMILAR MIX] Found ${recentPlays.length} plays in last 7 days` + ); + if (recentPlays.length === 0) { + console.log(`[ARTIST SIMILAR MIX] FAILED: No plays in last 7 days`); + return null; + } + + // Count plays by artist + const artistPlayCounts = new Map(); + recentPlays.forEach((play) => { + const artistId = play.track.album.artistId; + artistPlayCounts.set( + artistId, + (artistPlayCounts.get(artistId) || 0) + 1 + ); + }); + + // Get top artist + const topArtistId = Array.from(artistPlayCounts.entries()).sort( + (a, b) => b[1] - a[1] + )[0][0]; + + const topArtist = await prisma.artist.findUnique({ + where: { id: topArtistId }, + }); + + if (!topArtist || !topArtist.name) { + console.log( + `[ARTIST SIMILAR MIX] FAILED: Top artist not found or has no name` + ); + return null; + } + + console.log(`[ARTIST SIMILAR MIX] Top artist: ${topArtist.name}`); + + // Get similar artists from Last.fm + try { + const similarArtists = await lastFmService.getSimilarArtists( + topArtist.name, + "10" + ); + + console.log( + `[ARTIST SIMILAR MIX] Last.fm returned ${similarArtists.length} similar artists` + ); + + const similarArtistNames = similarArtists.map((a) => a.name); + const artistsInLibrary = await prisma.artist.findMany({ + where: { name: { in: similarArtistNames } }, + include: { + albums: { + include: { + tracks: { + include: { + album: { select: { coverUrl: true } }, + }, + }, + }, + }, + }, + }); + + console.log( + `[ARTIST SIMILAR MIX] Found ${artistsInLibrary.length} similar artists in library` + ); + + const tracks = artistsInLibrary.flatMap((artist) => + artist.albums.flatMap((album) => album.tracks) + ); + + console.log( + `[ARTIST SIMILAR MIX] Total tracks from similar artists: ${tracks.length}` + ); + + if (tracks.length < 5) { + console.log( + `[ARTIST SIMILAR MIX] FAILED: Only ${tracks.length} tracks (need at least 5)` + ); + return null; + } + + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `artist-similar-${topArtistId}`, + type: "artist-similar", + name: `More Like ${topArtist.name}`, + description: `Similar artists you might enjoy`, + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("artist-similar"), + }; + } catch (error) { + console.error("Failed to generate artist similar mix:", error); + return null; + } + } + + /** + * Generate random discovery mix with daily rotation + */ + async generateRandomDiscoveryMix( + userId: string, + today: string + ): Promise { + const totalAlbums = await prisma.album.count({ + where: { tracks: { some: {} } }, + }); + + if (totalAlbums < 10) return null; + + // Use date as seed for consistent daily randomness + const seed = getSeededRandom(`random-${today}`) % totalAlbums; + + const randomAlbums = await prisma.album.findMany({ + where: { tracks: { some: {} } }, + include: { + tracks: { + include: { + album: { select: { coverUrl: true } }, + }, + }, + }, + skip: seed, + take: 5, // Just a few albums + }); + + const tracks = randomAlbums.flatMap((album) => album.tracks); + if (tracks.length < 5) return null; + + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = randomAlbums + .filter((a) => a.coverUrl) + .slice(0, 4) + .map((a) => a.coverUrl!); + + return { + id: `random-discovery-${today}`, + type: "discovery", + name: "Random Discovery", + description: "Random albums to explore today", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("discovery"), + }; + } + + /** + * Generate "Party Playlist" mix - upbeat dance, electronic, pop tracks + * Uses multiple strategies: Genre table, album.genre, audio analysis + */ + async generatePartyMix( + userId: string, + today: string + ): Promise { + const partyGenres = [ + "dance", "electronic", "pop", "disco", "house", "techno", "edm", + "funk", "electro", "dance pop", "club", "eurodance", "trance", + "dubstep", "drum and bass", "hip hop" + ]; + + let tracks: any[] = []; + + // Strategy 1: Genre table + const genres = await prisma.genre.findMany({ + where: { name: { in: partyGenres, mode: "insensitive" } }, + include: { + trackGenres: { + include: { + track: { include: { album: { select: { coverUrl: true } } } }, + }, + take: 50, + }, + }, + }); + tracks = genres.flatMap((g) => g.trackGenres.map((tg) => tg.track)); + console.log(`[PARTY MIX] Found ${tracks.length} tracks from Genre table`); + + // Strategy 2: Album genre field (using helper for proper JSON array handling) + if (tracks.length < 15) { + const albumGenreTracks = await findTracksByGenrePatterns(partyGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[PARTY MIX] After album genre fallback: ${tracks.length} tracks`); + } + + // Strategy 3: Audio analysis (high energy, high danceability) + if (tracks.length < 15) { + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { danceability: { gte: 0.7 } }, + { AND: [{ energy: { gte: 0.7 } }, { bpm: { gte: 110 } }] }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...audioTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[PARTY MIX] After audio analysis fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[PARTY MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + // Use date seed for consistent daily selection + const seed = getSeededRandom(`party-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `party-${today}`, + type: "dance-floor", + name: "Party Playlist", + description: "High energy dance, EDM, and pop hits", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("dance-floor"), + }; + } + + /** + * Generate "Chill Mix" - relaxing, mellow tracks + * Enhanced mode: Uses ML moodRelaxed prediction + * Standard mode: Uses energy/arousal heuristics + */ + async generateChillMix( + userId: string, + today: string + ): Promise { + // Strategy 1: Enhanced mode - ML moodRelaxed prediction + let tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + analysisMode: "enhanced", + AND: [ + { moodRelaxed: { gte: 0.5 } }, + { moodAggressive: { lte: 0.3 } }, + { energy: { lte: 0.55 } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + + console.log(`[CHILL MIX] Enhanced mode: Found ${tracks.length} tracks`); + + // Strategy 2: Standard mode fallback + if (tracks.length < this.MIN_TRACKS_DAILY) { + console.log(`[CHILL MIX] Falling back to Standard mode`); + tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + // MUST be low-to-moderate energy + { energy: { lte: 0.55 } }, + // MUST be slow-to-moderate tempo + { bpm: { lte: 115 } }, + // Plus additional mellow indicator + { + OR: [ + { arousal: { lte: 0.55 } }, + { acousticness: { gte: 0.3 } }, + { valence: { lte: 0.65 } }, + ], + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + console.log(`[CHILL MIX] Standard mode: Found ${tracks.length} tracks`); + } + + console.log(`[CHILL MIX] Total: ${tracks.length} tracks matching criteria`); + + if (tracks.length < this.MIN_TRACKS_DAILY) { + console.log(`[CHILL MIX] FAILED: Only ${tracks.length} tracks (need ${this.MIN_TRACKS_DAILY})`); + return null; + } + + const seed = getSeededRandom(`chill-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + // Determine if daily or weekly based on available tracks + const isWeekly = tracks.length >= this.MIN_TRACKS_WEEKLY; + const trackLimit = isWeekly ? this.WEEKLY_TRACK_LIMIT : this.DAILY_TRACK_LIMIT; + const selectedTracks = shuffled.slice(0, trackLimit); + + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `chill-${today}`, + type: "chill", + name: "Chill Mix", + description: "Relax and unwind with mellow vibes", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("chill"), + }; + } + + /** + * Generate "Workout Mix" - high energy, motivational tracks + * Enhanced mode: Uses ML high arousal + moodAggressive + * Standard mode: Uses energy/BPM heuristics + genres + */ + async generateWorkoutMix( + userId: string, + today: string + ): Promise { + const workoutGenres = [ + "rock", "metal", "hard rock", "alternative rock", "punk", + "hip hop", "rap", "trap", "hardcore", "metalcore", + "industrial", "drum and bass", "hardstyle", "nu metal", + "electronic", "edm", "house", "techno", "pop punk" + ]; + + let tracks: any[] = []; + + // Strategy 1: Enhanced mode - high arousal and energy + const enhancedTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + analysisMode: "enhanced", + AND: [ + { arousal: { gte: 0.6 } }, + { energy: { gte: 0.6 } }, + { bpm: { gte: 110 } }, + // Not too relaxed + { moodRelaxed: { lte: 0.4 } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = enhancedTracks; + console.log(`[WORKOUT MIX] Enhanced mode: Found ${tracks.length} tracks`); + + // Strategy 2: Standard mode fallback - audio analysis + if (tracks.length < 15) { + console.log(`[WORKOUT MIX] Falling back to Standard mode`); + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { AND: [{ energy: { gte: 0.65 } }, { bpm: { gte: 115 } }] }, + { moodTags: { hasSome: ["workout", "energetic", "upbeat", "powerful"] } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...audioTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[WORKOUT MIX] Standard mode: Total ${tracks.length} tracks`); + } + + // Strategy 2: Genre table + if (tracks.length < 15) { + const genres = await prisma.genre.findMany({ + where: { name: { in: workoutGenres, mode: "insensitive" } }, + include: { + trackGenres: { + include: { + track: { include: { album: { select: { coverUrl: true } } } }, + }, + take: 50, + }, + }, + }); + const genreTracks = genres.flatMap((g) => g.trackGenres.map((tg) => tg.track)); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...genreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[WORKOUT MIX] After Genre table: ${tracks.length} tracks`); + } + + // Strategy 3: Album genre field (using helper for proper JSON array handling) + if (tracks.length < 15) { + const albumGenreTracks = await findTracksByGenrePatterns(workoutGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[WORKOUT MIX] After album genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[WORKOUT MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`workout-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `workout-${today}`, + type: "workout", + name: "Workout Mix", + description: "High energy tracks to power your workout", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("workout"), + }; + } + + /** + * Generate "Focus Mix" - instrumental, minimal vocals, concentration music + * Uses multiple strategies: Genre table, album.genre, audio analysis + */ + async generateFocusMix( + userId: string, + today: string + ): Promise { + const focusGenres = [ + "classical", "instrumental", "jazz", "piano", "ambient", + "post-rock", "math rock", "soundtrack", "score", + "contemporary classical", "minimal", "modern classical", "neoclassical" + ]; + + let tracks: any[] = []; + + // Strategy 1: Genre table + const genres = await prisma.genre.findMany({ + where: { name: { in: focusGenres, mode: "insensitive" } }, + include: { + trackGenres: { + include: { + track: { include: { album: { select: { coverUrl: true } } } }, + }, + take: 50, + }, + }, + }); + tracks = genres.flatMap((g) => g.trackGenres.map((tg) => tg.track)); + console.log(`[FOCUS MIX] Found ${tracks.length} tracks from Genre table`); + + // Strategy 2: Album genre field (using helper for proper JSON array handling) + if (tracks.length < 15) { + const albumGenreTracks = await findTracksByGenrePatterns(focusGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[FOCUS MIX] After album genre fallback: ${tracks.length} tracks`); + } + + // Strategy 3: Audio analysis (high instrumentalness, moderate energy) + if (tracks.length < 15) { + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + instrumentalness: { gte: 0.5 }, + energy: { gte: 0.2, lte: 0.7 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...audioTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[FOCUS MIX] After audio analysis fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[FOCUS MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`focus-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `focus-${today}`, + type: "focus-flow", + name: "Focus Mix", + description: "Concentration music for deep work", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("focus-flow"), + }; + } + + // ============================================================ + // AUDIO ANALYSIS-BASED MIXES (Using Essentia features) + // ============================================================ + + /** + * Generate "High Energy" mix using audio analysis + * Criteria: energy >= 0.7, BPM >= 120 + * Fallback: energetic genres if no audio analysis + */ + async generateHighEnergyMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Audio analysis + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + energy: { gte: 0.7 }, + bpm: { gte: 120 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = audioTracks; + console.log(`[HIGH ENERGY MIX] Found ${tracks.length} tracks from audio analysis`); + + // Strategy 2: Fallback to energetic genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const energyGenres = ["rock", "metal", "punk", "electronic", "edm", "dance", "hip hop", "trap"]; + const albumGenreTracks = await findTracksByGenrePatterns(energyGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[HIGH ENERGY MIX] After genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[HIGH ENERGY MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`high-energy-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `high-energy-${today}`, + type: "workout", + name: "High Energy", + description: "Fast-paced tracks to get you moving", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("workout"), + }; + } + + /** + * Generate "Late Night" mix using audio analysis + * Enhanced mode: Uses ML moodRelaxed and low moodAggressive + * Standard mode: Uses energy, BPM, arousal heuristics + */ + async generateLateNightMix( + userId: string, + today: string + ): Promise { + // First try Enhanced mode (ML mood predictions) + let tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + analysisMode: "enhanced", + AND: [ + // High relaxed mood (ML) + { moodRelaxed: { gte: 0.5 } }, + // Low aggression (ML) + { moodAggressive: { lte: 0.4 } }, + // Low-moderate energy + { energy: { lte: 0.5 } }, + // Slow-moderate tempo + { bpm: { lte: 110 } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + + console.log(`[LATE NIGHT MIX] Enhanced mode: Found ${tracks.length} tracks`); + + // Fallback to Standard mode if not enough Enhanced tracks + if (tracks.length < this.MIN_TRACKS_DAILY) { + console.log(`[LATE NIGHT MIX] Falling back to Standard mode`); + tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + // MUST have low energy + { energy: { lte: 0.45 } }, + // MUST have moderate-slow tempo + { bpm: { lte: 110 } }, + // Plus at least one additional mellow indicator + { + OR: [ + { arousal: { lte: 0.5 } }, + { valence: { lte: 0.6 } }, + { acousticness: { gte: 0.3 } }, + ], + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + console.log(`[LATE NIGHT MIX] Standard mode: Found ${tracks.length} tracks`); + } + + console.log(`[LATE NIGHT MIX] Total: ${tracks.length} tracks matching criteria`); + + // No fallback padding - if not enough truly mellow tracks, don't generate + if (tracks.length < this.MIN_TRACKS_DAILY) { + console.log(`[LATE NIGHT MIX] FAILED: Only ${tracks.length} tracks (need ${this.MIN_TRACKS_DAILY})`); + return null; + } + + const seed = getSeededRandom(`late-night-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + // Determine if daily or weekly based on available tracks + const isWeekly = tracks.length >= this.MIN_TRACKS_WEEKLY; + const trackLimit = isWeekly ? this.WEEKLY_TRACK_LIMIT : this.DAILY_TRACK_LIMIT; + const selectedTracks = shuffled.slice(0, trackLimit); + + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `late-night-${today}`, + type: "late-night", + name: "Late Night", + description: "Mellow vibes for the quiet hours", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("late-night"), + }; + } + + /** + * Generate "Happy Vibes" mix using audio analysis + * Enhanced mode: Uses ML moodHappy prediction + * Standard mode: Uses valence/energy heuristics + */ + async generateHappyMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Enhanced mode - ML moodHappy prediction + const enhancedTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + analysisMode: "enhanced", + moodHappy: { gte: 0.6 }, + moodSad: { lte: 0.3 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = enhancedTracks; + console.log(`[HAPPY MIX] Enhanced mode: Found ${tracks.length} tracks`); + + // Strategy 2: Standard mode fallback - valence/energy heuristics + if (tracks.length < 15) { + const standardTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + valence: { gte: 0.6 }, + energy: { gte: 0.5 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...standardTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[HAPPY MIX] After Standard fallback: ${tracks.length} tracks`); + } + + // Strategy 2: Fallback to upbeat/happy genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const happyGenres = ["pop", "funk", "disco", "soul", "reggae", "ska", "motown"]; + const albumGenreTracks = await findTracksByGenrePatterns(happyGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[HAPPY MIX] After genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[HAPPY MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`happy-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `happy-${today}`, + type: "happy", + name: "Happy Vibes", + description: "Feel-good tracks to brighten your day", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("happy"), + }; + } + + /** + * Generate "Melancholy" mix using audio analysis + * Enhanced mode: Uses ML moodSad prediction + * Standard mode: Uses valence heuristics + minor key + */ + async generateMelancholyMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Enhanced mode - ML moodSad prediction + const enhancedTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + analysisMode: "enhanced", + moodSad: { gte: 0.5 }, + moodHappy: { lte: 0.4 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 150, + }); + console.log(`[MELANCHOLY MIX] Enhanced mode: Found ${enhancedTracks.length} tracks`); + + if (enhancedTracks.length >= 15) { + tracks = enhancedTracks; + } else { + // Strategy 2: Standard mode fallback + console.log(`[MELANCHOLY MIX] Falling back to Standard mode`); + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + valence: { lte: 0.35 }, + energy: { lte: 0.6 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 150, + }); + console.log(`[MELANCHOLY MIX] Standard mode: Found ${audioTracks.length} low-valence tracks`); + + // Further filter: prefer minor key OR sad mood tags + tracks = audioTracks.filter((t) => { + const hasMinorKey = t.keyScale === "minor"; + const hasSadTags = t.moodTags?.some((tag: string) => + ["sad", "melancholic", "melancholy", "moody", "atmospheric"].includes(tag.toLowerCase()) + ); + const hasLastfmSadTags = t.lastfmTags?.some((tag: string) => + ["sad", "melancholic", "melancholy", "depressing", "emotional", "heartbreak"].includes(tag.toLowerCase()) + ); + return hasMinorKey || hasSadTags || hasLastfmSadTags; + }); + console.log(`[MELANCHOLY MIX] After tag filter: ${tracks.length} tracks`); + } + + // Strategy 2: Fallback to sad/emotional genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const sadGenres = ["blues", "soul", "ballad", "singer-songwriter", "slowcore", "sadcore"]; + const albumGenreTracks = await findTracksByGenrePatterns(sadGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[MELANCHOLY MIX] After genre fallback: ${tracks.length} tracks`); + } + + // Require minimum 15 tracks for a meaningful playlist + if (tracks.length < 15) { + console.log(`[MELANCHOLY MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + // Score and sort by "melancholy-ness" (only for tracks with audio analysis) + const sortedTracks = tracks.sort((a, b) => { + // Lower valence = more melancholy (score should be lower = better) + const aScore = + (a.valence || 0.5) * 2 + // Valence is primary factor + (a.energy || 0.5) + // Lower energy is better + (a.keyScale === "minor" ? 0 : 0.3); // Minor key bonus + const bScore = + (b.valence || 0.5) * 2 + + (b.energy || 0.5) + + (b.keyScale === "minor" ? 0 : 0.3); + return aScore - bScore; + }); + + const seed = getSeededRandom(`melancholy-${today}`); + let random = seed; + // Take top 50 most melancholy tracks, then shuffle + const shuffled = sortedTracks.slice(0, 50).sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `melancholy-${today}`, + type: "melancholy", + name: "Melancholy", + description: "Introspective tracks for reflective moments", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("melancholy"), + }; + } + + /** + * Generate "Dance Floor" mix using audio analysis + * Criteria: danceability >= 0.7, BPM 110-140 + * Fallback: dance/electronic genres if no audio analysis + */ + async generateDanceFloorMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Audio analysis + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + danceability: { gte: 0.7 }, + bpm: { gte: 110, lte: 140 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = audioTracks; + console.log(`[DANCE FLOOR MIX] Found ${tracks.length} tracks from audio analysis`); + + // Strategy 2: Fallback to dance genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const danceGenres = ["dance", "electronic", "edm", "house", "disco", "techno", "pop"]; + const albumGenreTracks = await findTracksByGenrePatterns(danceGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[DANCE FLOOR MIX] After genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[DANCE FLOOR MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`dance-floor-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `dance-floor-${today}`, + type: "dance-floor", + name: "Dance Floor", + description: "High danceability tracks with perfect tempo", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("dance-floor"), + }; + } + + /** + * Generate "Acoustic Afternoon" mix using audio analysis + * Criteria: acousticness >= 0.6, energy 0.3-0.6 + * Fallback: acoustic/folk/singer-songwriter genres + */ + async generateAcousticMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Audio analysis + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + acousticness: { gte: 0.6 }, + energy: { gte: 0.3, lte: 0.6 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = audioTracks; + console.log(`[ACOUSTIC MIX] Found ${tracks.length} tracks from audio analysis`); + + // Strategy 2: Fallback to acoustic genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const acousticGenres = ["acoustic", "folk", "singer-songwriter", "unplugged", "indie folk"]; + const albumGenreTracks = await findTracksByGenrePatterns(acousticGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[ACOUSTIC MIX] After genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[ACOUSTIC MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`acoustic-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `acoustic-${today}`, + type: "acoustic", + name: "Acoustic Afternoon", + description: "Stripped-down, organic sounds", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("acoustic"), + }; + } + + /** + * Generate "Instrumental Focus" mix using audio analysis + * Criteria: instrumentalness >= 0.7, energy 0.3-0.6 + * Fallback: instrumental/classical/soundtrack genres + */ + async generateInstrumentalMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Audio analysis + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + instrumentalness: { gte: 0.7 }, + energy: { gte: 0.3, lte: 0.6 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = audioTracks; + console.log(`[INSTRUMENTAL MIX] Found ${tracks.length} tracks from audio analysis`); + + // Strategy 2: Fallback to instrumental genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const instrumentalGenres = ["instrumental", "classical", "soundtrack", "score", "ambient", "post-rock"]; + const albumGenreTracks = await findTracksByGenrePatterns(instrumentalGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[INSTRUMENTAL MIX] After genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[INSTRUMENTAL MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`instrumental-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `instrumental-${today}`, + type: "instrumental", + name: "Instrumental Focus", + description: "No vocals, pure concentration", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("instrumental"), + }; + } + + // ============================================================ + // LAST.FM TAG-BASED MIXES + // ============================================================ + + /** + * Generate mix based on Last.fm mood tags + */ + async generateMoodTagMix( + userId: string, + today: string, + moodTag: string, + mixName: string, + mixDescription: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + lastfmTags: { + has: moodTag, + }, + }, + include: { + album: { select: { coverUrl: true } }, + }, + take: 100, + }); + + if (tracks.length < 15) return null; + + const seed = getSeededRandom(`mood-${moodTag}-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `mood-${moodTag}-${today}`, + type: `mood-${moodTag}`, + name: mixName, + description: mixDescription, + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("mood"), + }; + } + + /** + * Generate "Road Trip" mix - using tags + */ + async generateRoadTripMix( + userId: string, + today: string + ): Promise { + let tracks: any[] = []; + + // Strategy 1: Last.fm/mood tags + const taggedTracks = await prisma.track.findMany({ + where: { + OR: [ + { lastfmTags: { hasSome: ["driving", "road trip", "travel", "summer"] } }, + { moodTags: { hasSome: ["energetic", "upbeat", "happy"] } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + tracks = taggedTracks; + console.log(`[ROAD TRIP MIX] Found ${tracks.length} tracks from tags`); + + // Strategy 2: Audio analysis (medium-high energy, good tempo) + if (tracks.length < 15) { + const audioTracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + energy: { gte: 0.5, lte: 0.8 }, + bpm: { gte: 100, lte: 130 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...audioTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[ROAD TRIP MIX] After audio fallback: ${tracks.length} tracks`); + } + + // Strategy 3: Fallback to upbeat rock/pop genres (using helper for proper JSON array handling) + if (tracks.length < 15) { + const roadTripGenres = ["rock", "pop", "indie", "alternative", "classic rock"]; + const albumGenreTracks = await findTracksByGenrePatterns(roadTripGenres, 100); + const existingIds = new Set(tracks.map(t => t.id)); + tracks = [...tracks, ...albumGenreTracks.filter(t => !existingIds.has(t.id))]; + console.log(`[ROAD TRIP MIX] After genre fallback: ${tracks.length} tracks`); + } + + if (tracks.length < 15) { + console.log(`[ROAD TRIP MIX] FAILED: Only ${tracks.length} tracks found`); + return null; + } + + const seed = getSeededRandom(`road-trip-${today}`); + let random = seed; + const shuffled = tracks.sort(() => { + random = (random * 9301 + 49297) % 233280; + return random / 233280 - 0.5; + }); + + const selectedTracks = shuffled.slice(0, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `road-trip-${today}`, + type: "road-trip", + name: "Road Trip", + description: "Perfect soundtrack for the open road", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("road-trip"), + }; + } + + // ============================================================ + // DAY-OF-WEEK MIXES + // ============================================================ + + /** + * Generate day-specific mix based on the current day + */ + async generateDayMix(userId: string): Promise { + const dayOfWeek = new Date().getDay(); + const today = new Date().toISOString().split("T")[0]; + + // Different vibes for different days + switch (dayOfWeek) { + case 0: // Sunday - Relaxed + return this.generateSundayMix(userId, today); + case 1: // Monday - Motivation + return this.generateMondayMix(userId, today); + case 5: // Friday - Party + return this.generateFridayMix(userId, today); + default: + return null; + } + } + + async generateSundayMix( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + OR: [ + { + analysisStatus: "completed", + energy: { lte: 0.5 }, + acousticness: { gte: 0.5 }, + }, + { + lastfmTags: { hasSome: ["relaxed", "calm", "peaceful", "chill", "sunday"] }, + }, + ], + }, + include: { + album: { select: { coverUrl: true } }, + }, + take: 100, + }); + + if (tracks.length < 15) return null; + + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `sunday-${today}`, + type: "sunday-morning", + name: "Sunday Morning", + description: "Peaceful tunes for a lazy Sunday", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("sunday-morning"), + }; + } + + async generateMondayMix( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + OR: [ + { + analysisStatus: "completed", + energy: { gte: 0.6 }, + valence: { gte: 0.5 }, + }, + { + lastfmTags: { hasSome: ["motivation", "uplifting", "energetic", "happy"] }, + }, + ], + }, + include: { + album: { select: { coverUrl: true } }, + }, + take: 100, + }); + + if (tracks.length < 15) return null; + + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `monday-${today}`, + type: "confidence-boost", + name: "Monday Motivation", + description: "Start your week with energy", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("confidence-boost"), + }; + } + + async generateFridayMix( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + OR: [ + { + analysisStatus: "completed", + danceability: { gte: 0.7 }, + energy: { gte: 0.6 }, + }, + { + lastfmTags: { hasSome: ["party", "dance", "fun", "groovy"] }, + }, + ], + }, + include: { + album: { select: { coverUrl: true } }, + }, + take: 100, + }); + + if (tracks.length < 15) return null; + + const selectedTracks = randomSample(tracks, this.TRACK_LIMIT); + const coverUrls = selectedTracks + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `friday-${today}`, + type: "dance-floor", + name: "Friday Night", + description: "Weekend vibes to kick off the party", + trackIds: selectedTracks.map((t) => t.id), + coverUrls, + trackCount: selectedTracks.length, + color: getMixColor("dance-floor"), + }; + } + + // ============================================================ + // CURATED VIBE MIXES (Daily, 10 tracks) + // These are "mood" mixes based on audio analysis and vibes + // ============================================================ + + /** + * "Sad Girl Sundays" - Melancholic introspection + * valence < 0.3 + keyScale = 'minor' + arousal < 0.4 + * Only available on Sundays + */ + async generateSadGirlSundays( + userId: string, + today: string + ): Promise { + // Only generate on Sundays (day 0) + const dayOfWeek = new Date().getDay(); + if (dayOfWeek !== 0) return null; + + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { valence: { lte: 0.35 } }, + { keyScale: "minor" }, + ], + }, + { + AND: [ + { valence: { lte: 0.3 } }, + { arousal: { lte: 0.4 } }, + ], + }, + { + lastfmTags: { hasSome: ["sad", "melancholic", "heartbreak", "emotional"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `sad-girl-sundays-${today}`, + type: "sad-girl-sundays", + name: "Sad Girl Sundays", + description: "Melancholic introspection and feelings", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("sad-girl-sundays"), + }; + } + + /** + * "Main Character Energy" - Walking through life like a movie + * valence > 0.6 + energy > 0.6 + danceability > 0.5 + */ + async generateMainCharacterEnergy( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { valence: { gte: 0.55 } }, + { energy: { gte: 0.55 } }, + { danceability: { gte: 0.5 } }, + ], + }, + { + lastfmTags: { hasSome: ["empowering", "confident", "uplifting", "anthemic"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `main-character-${today}`, + type: "main-character", + name: "Main Character Energy", + description: "You're the protagonist today", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("main-character"), + }; + } + + /** + * "Villain Era" - Dark, empowering, dramatic + * keyScale = 'minor' + energy > 0.7 + moodTags includes 'aggressive' + */ + async generateVillainEra( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { keyScale: "minor" }, + { energy: { gte: 0.65 } }, + ], + }, + { + moodTags: { hasSome: ["aggressive", "dark", "intense"] }, + }, + { + lastfmTags: { hasSome: ["dark", "aggressive", "intense", "powerful"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `villain-era-${today}`, + type: "villain-era", + name: "Villain Era", + description: "Embrace your dark side", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("villain-era"), + }; + } + + /** + * "3AM Thoughts" - Late night overthinking + * arousal < 0.3 + energy < 0.4 + valence < 0.4 + */ + async generate3AMThoughts( + userId: string, + today: string + ): Promise { + // STRICT criteria: truly late-night introspective tracks only + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + { arousal: { lte: 0.4 } }, + { energy: { lte: 0.5 } }, + { bpm: { lte: 110 } }, + { + OR: [ + { valence: { lte: 0.5 } }, + { acousticness: { gte: 0.3 } }, + ], + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < this.MIN_TRACKS_DAILY) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `3am-thoughts-${today}`, + type: "3am-thoughts", + name: "3AM Thoughts", + description: "Late night overthinking companion", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("3am-thoughts"), + }; + } + + /** + * "Hot Girl Walk" - Confident, upbeat cardio + * danceability > 0.7 + bpm 100-130 + energy > 0.6 + */ + async generateHotGirlWalk( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { danceability: { gte: 0.65 } }, + { bpm: { gte: 95, lte: 135 } }, + { energy: { gte: 0.55 } }, + ], + }, + { + AND: [ + { valence: { gte: 0.6 } }, + { energy: { gte: 0.6 } }, + ], + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `hot-girl-walk-${today}`, + type: "hot-girl-walk", + name: "Hot Girl Walk", + description: "Confidence boost for your walk", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("confidence-boost"), + }; + } + + /** + * "Rage Cleaning" - Aggressive productivity + * energy > 0.8 + arousal > 0.7 + bpm > 130 + */ + async generateRageCleaning( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { energy: { gte: 0.75 } }, + { arousal: { gte: 0.65 } }, + { bpm: { gte: 125 } }, + ], + }, + { + AND: [ + { energy: { gte: 0.8 } }, + { danceability: { gte: 0.6 } }, + ], + }, + { + moodTags: { hasSome: ["aggressive", "energetic"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `rage-cleaning-${today}`, + type: "rage-cleaning", + name: "Rage Cleaning", + description: "Aggressive productivity fuel", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("workout"), + }; + } + + /** + * "Golden Hour" - Warm, hopeful, sunset vibes + * valence > 0.5 + acousticness > 0.4 + energy 0.3-0.6 + */ + async generateGoldenHour( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { valence: { gte: 0.45 } }, + { acousticness: { gte: 0.35 } }, + { energy: { gte: 0.25, lte: 0.65 } }, + ], + }, + { + lastfmTags: { hasSome: ["warm", "sunset", "dreamy", "peaceful"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `golden-hour-${today}`, + type: "golden-hour", + name: "Golden Hour", + description: "Warm sunset vibes", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("golden-hour"), + }; + } + + /** + * "Shower Karaoke" - Belters you can't help but sing + * instrumentalness < 0.3 + energy > 0.6 + valence > 0.5 + */ + async generateShowerKaraoke( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + { instrumentalness: { lte: 0.35 } }, + { energy: { gte: 0.55 } }, + { valence: { gte: 0.45 } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `shower-karaoke-${today}`, + type: "shower-karaoke", + name: "Shower Karaoke", + description: "Belters you can't help but sing", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("happy"), + }; + } + + /** + * "In My Feelings" - Deep emotional processing + * valence < 0.35 + arousal < 0.5 + acousticness > 0.3 + */ + async generateInMyFeelings( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { valence: { lte: 0.4 } }, + { arousal: { lte: 0.55 } }, + { acousticness: { gte: 0.25 } }, + ], + }, + { + lastfmTags: { hasSome: ["emotional", "heartbreak", "feelings", "vulnerable"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `in-my-feelings-${today}`, + type: "in-my-feelings", + name: "In My Feelings", + description: "Let it all out", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("heartbreak-hotel"), + }; + } + + /** + * "Midnight Drive" - Cruising at night, contemplative + * energy 0.4-0.6 + arousal 0.3-0.5 + bpm 90-120 + */ + async generateMidnightDrive( + userId: string, + today: string + ): Promise { + // STRICT criteria: contemplative driving music only + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + // MUST be moderate energy (not too mellow, not too intense) + { energy: { gte: 0.3, lte: 0.65 } }, + // MUST have cruising tempo + { bpm: { gte: 80, lte: 130 } }, + // Plus mellow mood indicator + { + OR: [ + { arousal: { lte: 0.6 } }, + { valence: { gte: 0.3, lte: 0.7 } }, + ], + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < this.MIN_TRACKS_DAILY) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `midnight-drive-${today}`, + type: "midnight-drive", + name: "Midnight Drive", + description: "Perfect for late night cruising", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("night-drive"), + }; + } + + /** + * "Coffee Shop Vibes" - Cozy background energy + * acousticness > 0.5 + energy 0.2-0.5 + instrumentalness > 0.3 + */ + async generateCoffeeShopVibes( + userId: string, + today: string + ): Promise { + // STRICT criteria: cozy, background-appropriate music only + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + // MUST be low-to-moderate energy + { energy: { lte: 0.55 } }, + // MUST be moderate-slow tempo + { bpm: { lte: 120 } }, + // Plus at least one cozy indicator + { + OR: [ + { acousticness: { gte: 0.35 } }, + { instrumentalness: { gte: 0.25 } }, + ], + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < this.MIN_TRACKS_DAILY) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `coffee-shop-${today}`, + type: "coffee-shop", + name: "Coffee Shop Vibes", + description: "Cozy background music", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("coffee-shop"), + }; + } + + /** + * "Romanticize Your Life" - Dreamy, aesthetic moments + * valence 0.4-0.7 + arousal 0.3-0.6 + acousticness > 0.3 + */ + async generateRomanticizeYourLife( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { + AND: [ + { valence: { gte: 0.35, lte: 0.75 } }, + { arousal: { gte: 0.25, lte: 0.65 } }, + { acousticness: { gte: 0.25 } }, + ], + }, + { + lastfmTags: { hasSome: ["dreamy", "aesthetic", "cinematic", "romantic"] }, + }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `romanticize-${today}`, + type: "romanticize", + name: "Romanticize Your Life", + description: "Make every moment aesthetic", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("golden-hour"), + }; + } + + /** + * "That Girl Era" - Self-improvement anthem energy + * valence > 0.6 + energy > 0.5 + danceability > 0.5 + */ + async generateThatGirlEra( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + AND: [ + { valence: { gte: 0.55 } }, + { energy: { gte: 0.45 } }, + { danceability: { gte: 0.45 } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 50, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `that-girl-era-${today}`, + type: "that-girl-era", + name: "That Girl Era", + description: "Self-improvement mode activated", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("confidence-boost"), + }; + } + + /** + * "Unhinged" - Chaotic, weird, fun + * High variance in features, unexpected combinations + */ + async generateUnhinged( + userId: string, + today: string + ): Promise { + // Get a variety of tracks with extreme features + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + OR: [ + { energy: { gte: 0.85 } }, + { energy: { lte: 0.15 } }, + { valence: { gte: 0.9 } }, + { valence: { lte: 0.1 } }, + { bpm: { gte: 160 } }, + { bpm: { lte: 70 } }, + { danceability: { gte: 0.9 } }, + ], + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + + if (tracks.length < 8) return null; + + const shuffled = randomSample(tracks, this.DAILY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `unhinged-${today}`, + type: "unhinged", + name: "Unhinged", + description: "Embrace the chaos", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("dance-floor"), + }; + } + + // ============================================================ + // WEEKLY CURATED MIXES (20 tracks) + // ============================================================ + + /** + * "Deep Cuts" - Hidden gems from your library + * Tracks with playCount < 3 from artists you play often + */ + async generateDeepCuts( + userId: string, + today: string + ): Promise { + // Get tracks that haven't been played much + const tracks = await prisma.track.findMany({ + where: { + plays: { + none: {}, + }, + }, + include: { + album: { + select: { + coverUrl: true, + artist: { select: { id: true } }, + } + } + }, + take: 200, + }); + + if (tracks.length < 15) { + // Fallback: tracks with few plays + const lowPlayTracks = await prisma.track.findMany({ + include: { + album: { select: { coverUrl: true } }, + _count: { select: { plays: true } }, + }, + take: 200, + }); + + const filtered = lowPlayTracks + .filter(t => t._count.plays <= 3) + .map(t => ({ ...t, album: t.album })); + + if (filtered.length < 15) return null; + + const shuffled = randomSample(filtered, this.WEEKLY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `deep-cuts-${today}`, + type: "deep-cuts", + name: "Deep Cuts", + description: "Hidden gems waiting to be discovered", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("rediscover"), + }; + } + + const shuffled = randomSample(tracks, this.WEEKLY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `deep-cuts-${today}`, + type: "deep-cuts", + name: "Deep Cuts", + description: "Hidden gems waiting to be discovered", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("rediscover"), + }; + } + + /** + * "Key Journey" - Harmonic progression + * Tracks ordered by circle of fifths key progression + */ + async generateKeyJourney( + userId: string, + today: string + ): Promise { + // Circle of fifths order + const keyOrder = ["C", "G", "D", "A", "E", "B", "F#", "Db", "Ab", "Eb", "Bb", "F"]; + + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + key: { not: null }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 200, + }); + + if (tracks.length < 15) return null; + + // Group by key + const byKey = new Map(); + for (const track of tracks) { + const key = track.key || "C"; + if (!byKey.has(key)) byKey.set(key, []); + byKey.get(key)!.push(track); + } + + // Build a journey through keys + const journey: typeof tracks = []; + const seed = getSeededRandom(`key-journey-${today}`); + let seedVal = seed; + + for (const key of keyOrder) { + const keyTracks = byKey.get(key) || []; + if (keyTracks.length > 0 && journey.length < this.WEEKLY_TRACK_LIMIT) { + // Pick 1-2 tracks from each key + const count = Math.min(2, keyTracks.length, this.WEEKLY_TRACK_LIMIT - journey.length); + seedVal = (seedVal * 9301 + 49297) % 233280; + const shuffled = keyTracks.sort(() => { + seedVal = (seedVal * 9301 + 49297) % 233280; + return seedVal / 233280 - 0.5; + }); + journey.push(...shuffled.slice(0, count)); + } + } + + if (journey.length < 15) return null; + + const coverUrls = journey + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `key-journey-${today}`, + type: "key-journey", + name: "Key Journey", + description: "Harmonic progression through your library", + trackIds: journey.map((t) => t.id), + coverUrls, + trackCount: journey.length, + color: getMixColor("instrumental"), + }; + } + + /** + * "Tempo Flow" - Energy arc throughout + * Start low BPM, build to peak, come down + */ + async generateTempoFlow( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + bpm: { not: null }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 200, + }); + + if (tracks.length < 15) return null; + + // Sort by BPM + const sorted = [...tracks].sort((a, b) => (a.bpm || 0) - (b.bpm || 0)); + + // Build an arc: slow → fast → slow + const slow = sorted.filter(t => (t.bpm || 0) < 100); + const medium = sorted.filter(t => (t.bpm || 0) >= 100 && (t.bpm || 0) < 130); + const fast = sorted.filter(t => (t.bpm || 0) >= 130); + + const flow: typeof tracks = []; + + // Intro: 4 slow tracks + flow.push(...randomSample(slow, Math.min(4, slow.length))); + // Build: 4 medium tracks + flow.push(...randomSample(medium, Math.min(5, medium.length))); + // Peak: 5 fast tracks + flow.push(...randomSample(fast, Math.min(6, fast.length))); + // Cool down: 3 medium tracks + flow.push(...randomSample(medium.filter(t => !flow.includes(t)), Math.min(3, medium.length))); + // Outro: 3 slow tracks + flow.push(...randomSample(slow.filter(t => !flow.includes(t)), Math.min(2, slow.length))); + + if (flow.length < 15) return null; + + const coverUrls = flow + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `tempo-flow-${today}`, + type: "tempo-flow", + name: "Tempo Flow", + description: "An energy journey through BPM", + trackIds: flow.slice(0, this.WEEKLY_TRACK_LIMIT).map((t) => t.id), + coverUrls, + trackCount: Math.min(flow.length, this.WEEKLY_TRACK_LIMIT), + color: getMixColor("workout"), + }; + } + + /** + * "Vocal Detox" - Pure instrumental escape + * instrumentalness > 0.8 + variety of moods + */ + async generateVocalDetox( + userId: string, + today: string + ): Promise { + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + instrumentalness: { gte: 0.75 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + + if (tracks.length < 15) return null; + + const shuffled = randomSample(tracks, this.WEEKLY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `vocal-detox-${today}`, + type: "vocal-detox", + name: "Vocal Detox", + description: "Pure instrumental escape", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("instrumental"), + }; + } + + /** + * "Minor Key Mondays" - All minor key bangers + * keyScale = 'minor' + energy > 0.5 + * Only available on Mondays + */ + async generateMinorKeyMix( + userId: string, + today: string + ): Promise { + // Only generate on Mondays (day 1) + const dayOfWeek = new Date().getDay(); + if (dayOfWeek !== 1) return null; + + const tracks = await prisma.track.findMany({ + where: { + analysisStatus: "completed", + keyScale: "minor", + energy: { gte: 0.45 }, + }, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + + if (tracks.length < 15) return null; + + const shuffled = randomSample(tracks, this.WEEKLY_TRACK_LIMIT); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + return { + id: `minor-key-${today}`, + type: "melancholy", + name: "Minor Key Mondays", + description: "All minor key bangers", + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("melancholy"), + }; + } + + // ============================================================ + // MOOD ON DEMAND - Generate a mix based on specific criteria + // ============================================================ + + /** + * Generate a custom mood mix based on audio feature parameters + * Supports both basic audio features and ML mood predictions + */ + async generateMoodOnDemand( + userId: string, + params: { + // Basic audio features + valence?: { min?: number; max?: number }; + energy?: { min?: number; max?: number }; + danceability?: { min?: number; max?: number }; + acousticness?: { min?: number; max?: number }; + instrumentalness?: { min?: number; max?: number }; + arousal?: { min?: number; max?: number }; + bpm?: { min?: number; max?: number }; + keyScale?: "major" | "minor"; + // ML mood predictions (require Enhanced mode analysis) + moodHappy?: { min?: number; max?: number }; + moodSad?: { min?: number; max?: number }; + moodRelaxed?: { min?: number; max?: number }; + moodAggressive?: { min?: number; max?: number }; + moodParty?: { min?: number; max?: number }; + moodAcoustic?: { min?: number; max?: number }; + moodElectronic?: { min?: number; max?: number }; + limit?: number; + } + ): Promise { + const where: any = { + analysisStatus: "completed", + }; + + // Check if any ML mood params are being used + const mlMoodParams = ['moodHappy', 'moodSad', 'moodRelaxed', 'moodAggressive', 'moodParty', 'moodAcoustic', 'moodElectronic']; + const usesMLMoods = mlMoodParams.some(key => params[key as keyof typeof params] !== undefined); + + // If using ML moods, require enhanced analysis mode + if (usesMLMoods) { + where.analysisMode = "enhanced"; + } + + // Basic audio feature filters + if (params.valence) { + where.valence = {}; + if (params.valence.min !== undefined) where.valence.gte = params.valence.min; + if (params.valence.max !== undefined) where.valence.lte = params.valence.max; + } + if (params.energy) { + where.energy = {}; + if (params.energy.min !== undefined) where.energy.gte = params.energy.min; + if (params.energy.max !== undefined) where.energy.lte = params.energy.max; + } + if (params.danceability) { + where.danceability = {}; + if (params.danceability.min !== undefined) where.danceability.gte = params.danceability.min; + if (params.danceability.max !== undefined) where.danceability.lte = params.danceability.max; + } + if (params.acousticness) { + where.acousticness = {}; + if (params.acousticness.min !== undefined) where.acousticness.gte = params.acousticness.min; + if (params.acousticness.max !== undefined) where.acousticness.lte = params.acousticness.max; + } + if (params.instrumentalness) { + where.instrumentalness = {}; + if (params.instrumentalness.min !== undefined) where.instrumentalness.gte = params.instrumentalness.min; + if (params.instrumentalness.max !== undefined) where.instrumentalness.lte = params.instrumentalness.max; + } + if (params.arousal) { + where.arousal = {}; + if (params.arousal.min !== undefined) where.arousal.gte = params.arousal.min; + if (params.arousal.max !== undefined) where.arousal.lte = params.arousal.max; + } + if (params.bpm) { + where.bpm = {}; + if (params.bpm.min !== undefined) where.bpm.gte = params.bpm.min; + if (params.bpm.max !== undefined) where.bpm.lte = params.bpm.max; + } + if (params.keyScale) { + where.keyScale = params.keyScale; + } + + // ML mood prediction filters + if (params.moodHappy) { + where.moodHappy = {}; + if (params.moodHappy.min !== undefined) where.moodHappy.gte = params.moodHappy.min; + if (params.moodHappy.max !== undefined) where.moodHappy.lte = params.moodHappy.max; + } + if (params.moodSad) { + where.moodSad = {}; + if (params.moodSad.min !== undefined) where.moodSad.gte = params.moodSad.min; + if (params.moodSad.max !== undefined) where.moodSad.lte = params.moodSad.max; + } + if (params.moodRelaxed) { + where.moodRelaxed = {}; + if (params.moodRelaxed.min !== undefined) where.moodRelaxed.gte = params.moodRelaxed.min; + if (params.moodRelaxed.max !== undefined) where.moodRelaxed.lte = params.moodRelaxed.max; + } + if (params.moodAggressive) { + where.moodAggressive = {}; + if (params.moodAggressive.min !== undefined) where.moodAggressive.gte = params.moodAggressive.min; + if (params.moodAggressive.max !== undefined) where.moodAggressive.lte = params.moodAggressive.max; + } + if (params.moodParty) { + where.moodParty = {}; + if (params.moodParty.min !== undefined) where.moodParty.gte = params.moodParty.min; + if (params.moodParty.max !== undefined) where.moodParty.lte = params.moodParty.max; + } + if (params.moodAcoustic) { + where.moodAcoustic = {}; + if (params.moodAcoustic.min !== undefined) where.moodAcoustic.gte = params.moodAcoustic.min; + if (params.moodAcoustic.max !== undefined) where.moodAcoustic.lte = params.moodAcoustic.max; + } + if (params.moodElectronic) { + where.moodElectronic = {}; + if (params.moodElectronic.min !== undefined) where.moodElectronic.gte = params.moodElectronic.min; + if (params.moodElectronic.max !== undefined) where.moodElectronic.lte = params.moodElectronic.max; + } + + const tracks = await prisma.track.findMany({ + where, + include: { album: { select: { coverUrl: true } } }, + take: 100, + }); + + const limit = params.limit || 15; + if (tracks.length < Math.min(limit, 8)) return null; + + const shuffled = randomSample(tracks, limit); + const coverUrls = shuffled + .filter((t) => t.album.coverUrl) + .slice(0, 4) + .map((t) => t.album.coverUrl!); + + const timestamp = Date.now(); + return { + id: `mood-on-demand-${timestamp}`, + type: "mood-on-demand", + name: "Custom Mood Mix", + description: `Generated just for you`, + trackIds: shuffled.map((t) => t.id), + coverUrls, + trackCount: shuffled.length, + color: getMixColor("mood"), + }; + } +} + +export const programmaticPlaylistService = new ProgrammaticPlaylistService(); diff --git a/backend/src/services/rateLimiter.ts b/backend/src/services/rateLimiter.ts new file mode 100644 index 0000000..4a7bcad --- /dev/null +++ b/backend/src/services/rateLimiter.ts @@ -0,0 +1,303 @@ +/** + * Global Rate Limiter Service + * + * Provides centralized rate limiting with exponential backoff for all external API calls. + * Implements circuit breaker pattern to pause requests when rate limited. + */ + +import PQueue from "p-queue"; + +interface RateLimitConfig { + /** Requests per interval */ + intervalCap: number; + /** Interval in milliseconds */ + interval: number; + /** Maximum concurrent requests */ + concurrency: number; + /** Maximum retries on 429 */ + maxRetries: number; + /** Base delay for exponential backoff (ms) */ + baseDelay: number; +} + +interface ServiceConfig { + lastfm: RateLimitConfig; + musicbrainz: RateLimitConfig; + deezer: RateLimitConfig; + lidarr: RateLimitConfig; + coverart: RateLimitConfig; +} + +// Service-specific rate limit configurations +const SERVICE_CONFIGS: ServiceConfig = { + lastfm: { + intervalCap: 3, // 3 requests per second (Last.fm allows 5, but we're conservative) + interval: 1000, + concurrency: 2, + maxRetries: 3, + baseDelay: 1000, + }, + musicbrainz: { + intervalCap: 1, // 1 request per second (MusicBrainz is strict) + interval: 1100, // Slightly over 1 second to be safe + concurrency: 1, + maxRetries: 3, + baseDelay: 2000, + }, + deezer: { + intervalCap: 25, // Deezer is more lenient + interval: 5000, + concurrency: 5, + maxRetries: 2, + baseDelay: 500, + }, + lidarr: { + intervalCap: 10, // Local service, can be faster + interval: 1000, + concurrency: 3, + maxRetries: 2, + baseDelay: 500, + }, + coverart: { + intervalCap: 5, // Cover Art Archive - conservative rate + interval: 1000, + concurrency: 3, + maxRetries: 2, + baseDelay: 1000, + }, +}; + +type ServiceName = keyof ServiceConfig; + +interface CircuitState { + isOpen: boolean; + openedAt: number; + consecutiveFailures: number; + resetAfterMs: number; +} + +class GlobalRateLimiter { + private queues: Map = new Map(); + private circuitBreakers: Map = new Map(); + private globalPaused = false; + private globalPauseUntil = 0; + + constructor() { + // Initialize queues for each service + for (const [service, config] of Object.entries(SERVICE_CONFIGS)) { + this.queues.set( + service as ServiceName, + new PQueue({ + concurrency: config.concurrency, + intervalCap: config.intervalCap, + interval: config.interval, + carryoverConcurrencyCount: true, + }) + ); + + this.circuitBreakers.set(service as ServiceName, { + isOpen: false, + openedAt: 0, + consecutiveFailures: 0, + resetAfterMs: 30000, // 30 seconds default + }); + } + + console.log("Global rate limiter initialized"); + } + + /** + * Execute a request with rate limiting and automatic retry + */ + async execute( + service: ServiceName, + requestFn: () => Promise, + options?: { + priority?: number; + skipRetry?: boolean; + } + ): Promise { + const queue = this.queues.get(service); + const config = SERVICE_CONFIGS[service]; + + if (!queue || !config) { + throw new Error(`Unknown service: ${service}`); + } + + // Check global pause + if (this.globalPaused && Date.now() < this.globalPauseUntil) { + const waitTime = this.globalPauseUntil - Date.now(); + console.log(`Global rate limit pause - waiting ${waitTime}ms`); + await this.sleep(waitTime); + } + + // Check circuit breaker + const circuit = this.circuitBreakers.get(service)!; + if (circuit.isOpen) { + const elapsed = Date.now() - circuit.openedAt; + if (elapsed < circuit.resetAfterMs) { + // Circuit is open, wait or throw + const waitTime = circuit.resetAfterMs - elapsed; + console.log( + `Circuit breaker open for ${service} - waiting ${waitTime}ms` + ); + await this.sleep(waitTime); + } + // Reset circuit to initial state + circuit.isOpen = false; + circuit.consecutiveFailures = 0; + circuit.resetAfterMs = 30000; // Reset to initial 30 seconds + } + + // Execute with retry logic + let lastError: Error | null = null; + const maxRetries = options?.skipRetry ? 0 : config.maxRetries; + + for (let attempt = 0; attempt <= maxRetries; attempt++) { + try { + const result = await queue.add( + async () => { + return await requestFn(); + }, + { priority: options?.priority ?? 0 } + ); + + // Success - reset failure count + circuit.consecutiveFailures = 0; + return result as T; + } catch (error: any) { + lastError = error; + + // Check if it's a rate limit error + const isRateLimit = + error.response?.status === 429 || + error.message?.includes("429") || + error.message?.toLowerCase().includes("rate limit"); + + if (isRateLimit) { + circuit.consecutiveFailures++; + + // Calculate backoff delay + const delay = this.calculateBackoff( + attempt, + config.baseDelay, + error + ); + console.warn( + `Rate limited by ${service} (attempt ${attempt + 1}/${ + maxRetries + 1 + }) - backing off ${delay}ms` + ); + + // If too many failures, open circuit + if (circuit.consecutiveFailures >= 5) { + circuit.isOpen = true; + circuit.openedAt = Date.now(); + circuit.resetAfterMs = Math.min( + 60000, + circuit.resetAfterMs * 2 + ); + console.warn( + `Circuit breaker opened for ${service} - will reset in ${circuit.resetAfterMs}ms` + ); + } + + if (attempt < maxRetries) { + await this.sleep(delay); + continue; + } + } + + // Non-rate-limit error or max retries reached + throw error; + } + } + + throw lastError || new Error("Request failed after retries"); + } + + /** + * Calculate exponential backoff delay + */ + private calculateBackoff( + attempt: number, + baseDelay: number, + error?: any + ): number { + // Check for Retry-After header + const retryAfter = error?.response?.headers?.["retry-after"]; + if (retryAfter) { + const parsed = parseInt(retryAfter, 10); + if (!isNaN(parsed)) { + return parsed * 1000; // Convert to ms + } + } + + // Exponential backoff with jitter + const exponentialDelay = baseDelay * Math.pow(2, attempt); + const jitter = Math.random() * 1000; + return Math.min(exponentialDelay + jitter, 60000); // Cap at 60 seconds + } + + /** + * Pause all requests globally (for severe rate limiting) + */ + pauseAll(durationMs: number) { + this.globalPaused = true; + this.globalPauseUntil = Date.now() + durationMs; + console.warn(`Global rate limiter paused for ${durationMs}ms`); + } + + /** + * Resume all requests + */ + resume() { + this.globalPaused = false; + this.globalPauseUntil = 0; + console.log("Global rate limiter resumed"); + } + + /** + * Get queue statistics + */ + getStats(): Record { + const stats: any = {}; + for (const [service, queue] of this.queues.entries()) { + stats[service] = { + pending: queue.pending, + size: queue.size, + }; + } + return stats; + } + + /** + * Wait for all pending requests to complete + */ + async drain(): Promise { + const promises = Array.from(this.queues.values()).map((queue) => + queue.onIdle() + ); + await Promise.all(promises); + } + + /** + * Clear all pending requests + */ + clear() { + for (const queue of this.queues.values()) { + queue.clear(); + } + } + + private sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); + } +} + +// Singleton instance +export const rateLimiter = new GlobalRateLimiter(); + +// Export types for use in other services +export type { ServiceName, RateLimitConfig }; + diff --git a/backend/src/services/rss-parser.ts b/backend/src/services/rss-parser.ts new file mode 100644 index 0000000..75bf9c3 --- /dev/null +++ b/backend/src/services/rss-parser.ts @@ -0,0 +1,281 @@ +import Parser from "rss-parser"; + +interface RSSPodcast { + title: string; + author?: string; + description?: string; + imageUrl?: string; + language?: string; + explicit?: boolean; + itunesId?: string; +} + +interface RSSEpisode { + guid: string; + title: string; + description?: string; + audioUrl: string; + duration: number; // seconds + publishedAt: Date; + episodeNumber?: number; + season?: number; + imageUrl?: string; + fileSize?: number; // bytes + mimeType?: string; +} + +interface ParsedPodcastFeed { + podcast: RSSPodcast; + episodes: RSSEpisode[]; +} + +class RSSParserService { + private parser: Parser; + + constructor() { + this.parser = new Parser({ + customFields: { + feed: [ + ["itunes:author", "itunesAuthor"], + ["itunes:image", "itunesImage"], + ["itunes:explicit", "itunesExplicit"], + ["itunes:type", "itunesType"], + ], + item: [ + ["itunes:author", "itunesAuthor"], + ["itunes:duration", "itunesDuration"], + ["itunes:image", "itunesImage"], + ["itunes:episode", "itunesEpisode"], + ["itunes:season", "itunesSeason"], + ["itunes:explicit", "itunesExplicit"], + ], + }, + }); + } + + /** + * Parse an RSS podcast feed from a URL + */ + async parseFeed(feedUrl: string): Promise { + try { + console.log(`\n [RSS PARSER] Fetching feed: ${feedUrl}`); + const feed = await this.parser.parseURL(feedUrl); + + // Extract podcast metadata + const podcast: RSSPodcast = { + title: feed.title || "Unknown Podcast", + author: (feed as any).itunesAuthor || feed.author || undefined, + description: feed.description || undefined, + imageUrl: this.extractImageUrl(feed), + language: feed.language || undefined, + explicit: this.parseExplicit((feed as any).itunesExplicit), + itunesId: this.extractItunesId(feed), + }; + + console.log(` Podcast: ${podcast.title}`); + console.log(` Author: ${podcast.author || "Unknown"}`); + console.log(` Episodes found: ${feed.items?.length || 0}`); + + // Extract episodes + const episodes: RSSEpisode[] = (feed.items || []) + .map((item) => { + try { + // Find audio enclosure + const audioEnclosure = this.findAudioEnclosure(item); + if (!audioEnclosure) { + console.warn( + ` Skipping episode "${item.title}" - no audio found` + ); + return null; + } + + const episode: RSSEpisode = { + guid: item.guid || item.link || item.title || "", + title: item.title || "Unknown Episode", + description: + item.content || + item.contentSnippet || + undefined, + audioUrl: audioEnclosure.url, + duration: this.parseDuration( + (item as any).itunesDuration + ), + publishedAt: item.pubDate + ? new Date(item.pubDate) + : new Date(), + episodeNumber: (item as any).itunesEpisode + ? parseInt((item as any).itunesEpisode) + : undefined, + season: (item as any).itunesSeason + ? parseInt((item as any).itunesSeason) + : undefined, + imageUrl: + this.extractImageUrl(item) || + podcast.imageUrl || + undefined, + fileSize: audioEnclosure.length + ? parseInt(audioEnclosure.length) + : undefined, + mimeType: audioEnclosure.type || "audio/mpeg", + }; + + return episode; + } catch (error: any) { + console.error( + ` Error parsing episode "${item.title}":`, + error.message + ); + return null; + } + }) + .filter((ep): ep is RSSEpisode => ep !== null); + + console.log(` Successfully parsed ${episodes.length} episodes`); + + return { podcast, episodes }; + } catch (error: any) { + console.error( + `\n [RSS PARSER] Failed to parse feed:`, + error.message + ); + throw new Error(`Failed to parse podcast feed: ${error.message}`); + } + } + + /** + * Extract image URL from feed/item + */ + private extractImageUrl(data: any): string | undefined { + // Try iTunes image first + if (data.itunesImage) { + if (typeof data.itunesImage === "string") { + return data.itunesImage; + } + if (data.itunesImage.href) { + return data.itunesImage.href; + } + if (data.itunesImage.$ && data.itunesImage.$.href) { + return data.itunesImage.$.href; + } + } + + // Try standard image field + if (data.image) { + if (typeof data.image === "string") { + return data.image; + } + if (data.image.url) { + return data.image.url; + } + } + + return undefined; + } + + /** + * Find audio enclosure in episode + */ + private findAudioEnclosure( + item: any + ): { url: string; type?: string; length?: string } | null { + // Check enclosure field + if (item.enclosure) { + const enc = item.enclosure; + if (enc.url && this.isAudioMimeType(enc.type)) { + return { + url: enc.url, + type: enc.type, + length: enc.length, + }; + } + } + + // Check enclosures array + if (Array.isArray(item.enclosures)) { + for (const enc of item.enclosures) { + if (enc.url && this.isAudioMimeType(enc.type)) { + return { + url: enc.url, + type: enc.type, + length: enc.length, + }; + } + } + } + + return null; + } + + /** + * Check if MIME type is audio + */ + private isAudioMimeType(mimeType?: string): boolean { + if (!mimeType) return false; + return ( + mimeType.startsWith("audio/") || + mimeType.includes("mpeg") || + mimeType.includes("mp3") || + mimeType.includes("m4a") + ); + } + + /** + * Parse iTunes duration format + * Supports: "HH:MM:SS", "MM:SS", or just seconds + */ + private parseDuration(duration?: string): number { + if (!duration) return 0; + + // If it's already a number (seconds) + const asNumber = parseInt(duration); + if (!isNaN(asNumber) && asNumber.toString() === duration) { + return asNumber; + } + + // Parse time format (HH:MM:SS or MM:SS) + const parts = duration.split(":").map((p) => parseInt(p)); + if (parts.length === 3) { + // HH:MM:SS + return parts[0] * 3600 + parts[1] * 60 + parts[2]; + } else if (parts.length === 2) { + // MM:SS + return parts[0] * 60 + parts[1]; + } + + return 0; + } + + /** + * Parse explicit flag + */ + private parseExplicit(explicit?: string): boolean { + if (!explicit) return false; + const lower = explicit.toLowerCase(); + return lower === "yes" || lower === "true" || lower === "explicit"; + } + + /** + * Extract iTunes ID from feed + */ + private extractItunesId(feed: any): string | undefined { + // Try to extract from feed link (e.g., https://podcasts.apple.com/us/podcast/podcast-name/id123456789) + if (feed.link) { + const match = feed.link.match(/\/id(\d+)/); + if (match) { + return match[1]; + } + } + + // Try from feed image URL + if (feed.image?.url) { + const match = feed.image.url.match(/\/id(\d+)/); + if (match) { + return match[1]; + } + } + + return undefined; + } +} + +export const rssParserService = new RSSParserService(); diff --git a/backend/src/services/search.ts b/backend/src/services/search.ts new file mode 100644 index 0000000..7fb96c0 --- /dev/null +++ b/backend/src/services/search.ts @@ -0,0 +1,384 @@ +import { prisma } from "../utils/db"; +import { redisClient } from "../utils/redis"; + +interface SearchOptions { + query: string; + limit?: number; + offset?: number; +} + +interface ArtistSearchResult { + id: string; + name: string; + mbid: string; + heroUrl: string | null; + rank: number; +} + +interface AlbumSearchResult { + id: string; + title: string; + artistId: string; + artistName: string; + year: number | null; + coverUrl: string | null; + rank: number; +} + +interface TrackSearchResult { + id: string; + title: string; + albumId: string; + albumTitle: string; + artistId: string; + artistName: string; + duration: number; + rank: number; +} + +interface PodcastSearchResult { + id: string; + title: string; + author: string | null; + description: string | null; + imageUrl: string | null; + episodeCount: number; +} + +export class SearchService { + /** + * Convert user query to PostgreSQL tsquery format + * Splits on whitespace and adds prefix matching (:*) + * Example: "radio head" -> "radio:* & head:*" + */ + private queryToTsquery(query: string): string { + return query + .trim() + .split(/\s+/) + .map((term) => `${term.replace(/[^\w]/g, "")}:*`) + .join(" & "); + } + + async searchArtists({ + query, + limit = 20, + offset = 0, + }: SearchOptions): Promise { + if (!query || query.trim().length === 0) { + return []; + } + + const tsquery = this.queryToTsquery(query); + + try { + const results = await prisma.$queryRaw` + SELECT + id, + name, + mbid, + "heroUrl", + ts_rank(search_vector, to_tsquery('english', ${tsquery})) AS rank + FROM "Artist" + WHERE search_vector @@ to_tsquery('english', ${tsquery}) + ORDER BY rank DESC, name ASC + LIMIT ${limit} + OFFSET ${offset} + `; + + return results; + } catch (error) { + console.error("Artist search error:", error); + // Fallback to LIKE query if full-text search fails + const results = await prisma.artist.findMany({ + where: { + name: { + contains: query, + mode: "insensitive", + }, + }, + select: { + id: true, + name: true, + mbid: true, + heroUrl: true, + }, + take: limit, + skip: offset, + orderBy: { + name: "asc", + }, + }); + + return results.map((r) => ({ ...r, rank: 0 })); + } + } + + async searchAlbums({ + query, + limit = 20, + offset = 0, + }: SearchOptions): Promise { + if (!query || query.trim().length === 0) { + return []; + } + + const tsquery = this.queryToTsquery(query); + + try { + const results = await prisma.$queryRaw` + SELECT + a.id, + a.title, + a."artistId", + ar.name as "artistName", + a.year, + a."coverUrl", + GREATEST( + ts_rank(a.search_vector, to_tsquery('english', ${tsquery})), + ts_rank(ar.search_vector, to_tsquery('english', ${tsquery})) + ) AS rank + FROM "Album" a + LEFT JOIN "Artist" ar ON a."artistId" = ar.id + WHERE a.search_vector @@ to_tsquery('english', ${tsquery}) + OR ar.search_vector @@ to_tsquery('english', ${tsquery}) + ORDER BY rank DESC, a.title ASC + LIMIT ${limit} + OFFSET ${offset} + `; + + return results; + } catch (error) { + console.error("Album search error:", error); + // Fallback to LIKE query - search both album title and artist name + const results = await prisma.album.findMany({ + where: { + OR: [ + { + title: { + contains: query, + mode: "insensitive", + }, + }, + { + artist: { + name: { + contains: query, + mode: "insensitive", + }, + }, + }, + ], + }, + select: { + id: true, + title: true, + artistId: true, + year: true, + coverUrl: true, + artist: { + select: { + name: true, + }, + }, + }, + take: limit, + skip: offset, + orderBy: { + title: "asc", + }, + }); + + return results.map((r) => ({ + id: r.id, + title: r.title, + artistId: r.artistId, + artistName: r.artist.name, + year: r.year, + coverUrl: r.coverUrl, + rank: 0, + })); + } + } + + async searchTracks({ + query, + limit = 20, + offset = 0, + }: SearchOptions): Promise { + if (!query || query.trim().length === 0) { + return []; + } + + const tsquery = this.queryToTsquery(query); + + try { + const results = await prisma.$queryRaw` + SELECT + t.id, + t.title, + t."albumId", + t.duration, + a.title as "albumTitle", + a."artistId", + ar.name as "artistName", + ts_rank(t.search_vector, to_tsquery('english', ${tsquery})) AS rank + FROM "Track" t + LEFT JOIN "Album" a ON t."albumId" = a.id + LEFT JOIN "Artist" ar ON a."artistId" = ar.id + WHERE t.search_vector @@ to_tsquery('english', ${tsquery}) + ORDER BY rank DESC, t.title ASC + LIMIT ${limit} + OFFSET ${offset} + `; + + return results; + } catch (error) { + console.error("Track search error:", error); + // Fallback to LIKE query + const results = await prisma.track.findMany({ + where: { + title: { + contains: query, + mode: "insensitive", + }, + }, + select: { + id: true, + title: true, + albumId: true, + duration: true, + album: { + select: { + title: true, + artistId: true, + artist: { + select: { + name: true, + }, + }, + }, + }, + }, + take: limit, + skip: offset, + orderBy: { + title: "asc", + }, + }); + + return results.map((r) => ({ + id: r.id, + title: r.title, + albumId: r.albumId, + albumTitle: r.album.title, + artistId: r.album.artistId, + artistName: r.album.artist.name, + duration: r.duration, + rank: 0, + })); + } + } + + async searchPodcasts({ + query, + limit = 20, + offset = 0, + }: SearchOptions): Promise { + if (!query || query.trim().length === 0) { + return []; + } + + // Simple LIKE search for podcasts (no full-text search vector on podcasts yet) + try { + const results = await prisma.podcast.findMany({ + where: { + OR: [ + { + title: { + contains: query, + mode: "insensitive", + }, + }, + { + author: { + contains: query, + mode: "insensitive", + }, + }, + { + description: { + contains: query, + mode: "insensitive", + }, + }, + ], + }, + select: { + id: true, + title: true, + author: true, + description: true, + imageUrl: true, + episodeCount: true, + }, + take: limit, + skip: offset, + orderBy: { + title: "asc", + }, + }); + + return results; + } catch (error) { + console.error("Podcast search error:", error); + return []; + } + } + + async searchAll({ query, limit = 10 }: SearchOptions) { + if (!query || query.trim().length === 0) { + return { + artists: [], + albums: [], + tracks: [], + podcasts: [], + }; + } + + // Check Redis cache first + const cacheKey = `search:all:${query}:${limit}`; + try { + const cached = await redisClient.get(cacheKey); + if (cached) { + console.log(`[SEARCH] Cache HIT for query: "${query}"`); + return JSON.parse(cached); + } + } catch (err) { + console.warn("[SEARCH] Redis cache read error:", err); + } + + console.log( + `[SEARCH] Cache MISS for query: "${query}" - fetching from database` + ); + + const [artists, albums, tracks, podcasts] = await Promise.all([ + this.searchArtists({ query, limit }), + this.searchAlbums({ query, limit }), + this.searchTracks({ query, limit }), + this.searchPodcasts({ query, limit }), + ]); + + const results = { artists, albums, tracks, podcasts }; + + // Cache for 1 hour (search results don't change often) + try { + await redisClient.setEx(cacheKey, 3600, JSON.stringify(results)); + } catch (err) { + console.warn("[SEARCH] Redis cache write error:", err); + } + + return results; + } +} + +export const searchService = new SearchService(); diff --git a/backend/src/services/simpleDownloadManager.ts b/backend/src/services/simpleDownloadManager.ts new file mode 100644 index 0000000..d1361ed --- /dev/null +++ b/backend/src/services/simpleDownloadManager.ts @@ -0,0 +1,1684 @@ +/** + * Simple Download Manager (Refactored) + * + * Stateless download service that uses the database as the single source of truth. + * Handles album downloads with automatic retry, blocklisting, and completion tracking. + * No in-memory state - survives server restarts. + */ + +import { prisma } from "../utils/db"; +import { lidarrService, LidarrRelease } from "./lidarr"; +import { musicBrainzService } from "./musicbrainz"; +import { getSystemSettings } from "../utils/systemSettings"; +import { notificationService } from "./notificationService"; +import { sessionLog } from "../utils/playlistLogger"; +import axios from "axios"; +import * as crypto from "crypto"; + +// Generate a UUID v4 without external dependency +function generateCorrelationId(): string { + return crypto.randomUUID(); +} + +class SimpleDownloadManager { + private readonly DEFAULT_MAX_ATTEMPTS = 3; + // Increased timeouts for batch processing (Discovery requests 30+ albums at once) + private readonly IMPORT_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes (large batches need more time) + private readonly PENDING_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes for pending (batch queuing) + + /** + * Get max retry attempts from user's discover config, fallback to default + */ + private async getMaxAttempts(userId: string): Promise { + try { + const config = await prisma.userDiscoverConfig.findUnique({ + where: { userId }, + }); + return config?.maxRetryAttempts || this.DEFAULT_MAX_ATTEMPTS; + } catch { + return this.DEFAULT_MAX_ATTEMPTS; + } + } + + /** + * Start a new download + * Returns the correlation ID for webhook matching + * @param isDiscovery - If true, tags the artist in Lidarr for discovery cleanup + */ + async startDownload( + jobId: string, + artistName: string, + albumTitle: string, + albumMbid: string, + userId: string, + isDiscovery: boolean = false + ): Promise<{ success: boolean; correlationId?: string; error?: string }> { + console.log(`\n Starting download: ${artistName} - ${albumTitle}${isDiscovery ? " (discovery)" : ""}`); + console.log(` Job ID: ${jobId}`); + console.log(` Album MBID: ${albumMbid}`); + + // Generate correlation ID for webhook matching + const correlationId = generateCorrelationId(); + + try { + // Fetch artist MBID from MusicBrainz using the album MBID + let artistMbid: string | undefined; + try { + console.log(` Fetching artist MBID from MusicBrainz...`); + const releaseGroup = await musicBrainzService.getReleaseGroup( + albumMbid + ); + + if (releaseGroup?.["artist-credit"]?.[0]?.artist?.id) { + artistMbid = releaseGroup["artist-credit"][0].artist.id; + console.log(` Found artist MBID: ${artistMbid}`); + } else { + console.warn( + ` Could not extract artist MBID from release group` + ); + } + } catch (mbError) { + console.error( + ` Failed to fetch artist MBID from MusicBrainz:`, + mbError + ); + } + + // Add album to Lidarr (with discovery tag if this is a discovery download) + const result = await lidarrService.addAlbum( + albumMbid, + artistName, + albumTitle, + "/music", + artistMbid, + isDiscovery + ); + + if (!result) { + throw new Error( + "Failed to add album to Lidarr - album not found" + ); + } + + console.log(` Album queued in Lidarr (ID: ${result.id})`); + + // Lidarr may have matched by name and returned a different MBID + const actualLidarrMbid = result.foreignAlbumId; + if (actualLidarrMbid && actualLidarrMbid !== albumMbid) { + console.log( + ` MBID mismatch - original: ${albumMbid}, Lidarr: ${actualLidarrMbid}` + ); + } + + // Update job with all tracking information + // IMPORTANT: Preserve existing metadata (especially tier/similarity from discovery jobs) + const now = new Date(); + const existingJob = await prisma.downloadJob.findUnique({ + where: { id: jobId }, + select: { metadata: true }, + }); + const existingMetadata = (existingJob?.metadata as any) || {}; + + await prisma.downloadJob.update({ + where: { id: jobId }, + data: { + correlationId, // Unique ID for webhook matching + status: "processing", + startedAt: now, // For timeout tracking (if field exists) + lidarrAlbumId: result.id, // Store Lidarr album ID for retry/cleanup + artistMbid: artistMbid, // Store artist MBID for same-artist fallback + attempts: 1, + metadata: { + ...existingMetadata, // Preserve tier, similarity, etc. + albumTitle, + artistName, + artistMbid, + albumMbid, // Original requested MBID + lidarrMbid: actualLidarrMbid, // Actual Lidarr MBID (may differ) + downloadType: existingMetadata.downloadType || "library", + startedAt: now.toISOString(), // Backup in metadata for timeout tracking + }, + }, + }); + + console.log( + ` Download started with correlation ID: ${correlationId}` + ); + return { success: true, correlationId }; + } catch (error: any) { + console.error(` Failed to start download:`, error.message); + + // Get the job to check if it's a discovery job + const job = await prisma.downloadJob.findUnique({ + where: { id: jobId }, + }); + + // If album wasn't found, try same-artist fallback ONLY for non-discovery jobs + // Discovery jobs should find NEW artists via the discovery system instead + if (job && error.message?.includes("album not found")) { + if (job.discoveryBatchId) { + console.log(` Album not found - Discovery job, skipping same-artist fallback`); + console.log(` Discovery system will find a different artist instead`); + } else { + console.log(` Album not found - trying same-artist fallback...`); + + // Use the new tryNextAlbumFromArtist approach instead of findReplacementAlbum + const metadata = (job.metadata as any) || {}; + const artistMbid = job.artistMbid || metadata.artistMbid; + + if (artistMbid) { + const fallbackResult = await this.tryNextAlbumFromArtist( + { ...job, metadata }, + "Album not found in Lidarr" + ); + + if (fallbackResult.retried && fallbackResult.jobId) { + return { success: true, replacedWith: fallbackResult.jobId }; + } + } + } + } + + // No replacement found - mark as failed + await prisma.downloadJob.update({ + where: { id: jobId }, + data: { + correlationId, + status: "failed", + error: error.message || "Failed to add album to Lidarr", + completedAt: new Date(), + }, + }); + + // Check batch completion for discovery jobs + if (job?.discoveryBatchId) { + const { discoverWeeklyService } = await import("./discoverWeekly"); + await discoverWeeklyService.checkBatchCompletion(job.discoveryBatchId); + } + + return { success: false, error: error.message }; + } + } + + /** + * Handle download grabbed event (from webhook) + * Links the Lidarr downloadId to our job + * + * IMPORTANT: One logical album = one job, regardless of MBID. + * MBIDs can differ between MusicBrainz and Lidarr, but artist+album name is canonical. + */ + async onDownloadGrabbed( + downloadId: string, + albumMbid: string, + albumTitle: string, + artistName: string, + lidarrAlbumId: number + ): Promise<{ matched: boolean; jobId?: string }> { + console.log(`[DOWNLOAD] Grabbed: ${artistName} - ${albumTitle}`); + console.log(` Download ID: ${downloadId}`); + console.log(` Album MBID: ${albumMbid}`); + console.log(` Lidarr Album ID: ${lidarrAlbumId}`); + + // Get ALL active jobs (pending + processing) for matching + // Include pending because job might not have transitioned to processing yet + const activeJobs = await prisma.downloadJob.findMany({ + where: { + status: { in: ["pending", "processing"] }, + }, + }); + + console.log( + ` Found ${activeJobs.length} active job(s) to match against` + ); + + let job: (typeof activeJobs)[0] | undefined; + + // Normalize artist/album for name-based matching + const normalizedArtist = artistName?.toLowerCase().trim() || ""; + const normalizedAlbum = albumTitle?.toLowerCase().trim() || ""; + + // Strategy 1: Match by targetMbid (exact MBID match) + job = activeJobs.find( + (j) => j.targetMbid === albumMbid && !j.lidarrRef + ); + if (job) { + console.log(` Matched by targetMbid`); + } + + // Strategy 2: Match by lidarrMbid in metadata + if (!job) { + job = activeJobs.find((j) => { + const metadata = j.metadata as any; + return metadata?.lidarrMbid === albumMbid && !j.lidarrRef; + }); + if (job) { + console.log(` Matched by lidarrMbid`); + } + } + + // Strategy 3: Match by lidarrAlbumId (stored when download started) + if (!job && lidarrAlbumId > 0) { + job = activeJobs.find((j) => { + const metadata = j.metadata as any; + return ( + (j as any).lidarrAlbumId === lidarrAlbumId || + metadata?.lidarrAlbumId === lidarrAlbumId + ); + }); + if (job) { + console.log(` Matched by lidarrAlbumId`); + } + } + + // Strategy 4: Match by artist + album title in metadata (CANONICAL - most important) + // This handles MBID mismatches between MusicBrainz and Lidarr + if (!job && normalizedArtist && normalizedAlbum) { + job = activeJobs.find((j) => { + if (j.lidarrRef) return false; // Already linked to a different download + const metadata = j.metadata as any; + const candidateArtist = metadata?.artistName?.toLowerCase().trim() || ""; + const candidateAlbum = metadata?.albumTitle?.toLowerCase().trim() || ""; + return ( + candidateArtist === normalizedArtist && + candidateAlbum === normalizedAlbum + ); + }); + if (job) { + console.log(` Matched by artist/album title in metadata`); + } + } + + // Strategy 5: Match by subject field (format: "Artist - Album") + if (!job && normalizedArtist && normalizedAlbum) { + job = activeJobs.find((j) => { + if (j.lidarrRef) return false; // Already linked + const subject = j.subject?.toLowerCase().trim() || ""; + // Check if subject contains BOTH artist AND album (more precise) + return ( + subject.includes(normalizedArtist) && + subject.includes(normalizedAlbum) + ); + }); + if (job) { + console.log(` Matched by subject field`); + } + } + + // Strategy 6: For retries - update job that already has a different lidarrRef + if (!job && lidarrAlbumId > 0) { + job = activeJobs.find((j) => { + const metadata = j.metadata as any; + return ( + ((j as any).lidarrAlbumId === lidarrAlbumId || + metadata?.lidarrAlbumId === lidarrAlbumId) && + j.lidarrRef !== null + ); + }); + if (job) { + console.log(` Matched retry by lidarrAlbumId (updating lidarrRef)`); + } + } + + if (!job) { + // Before creating a new job, do one final check: search ALL active jobs by name + // This catches jobs that might have been created with different casing or formatting + console.log(` No match in active jobs with first pass - doing thorough name search...`); + + // Search all active jobs (including ones we might have filtered out) + for (const j of activeJobs) { + if (j.lidarrRef) continue; // Already linked + + const metadata = j.metadata as any; + const candidateArtist = metadata?.artistName?.toLowerCase().trim() || ""; + const candidateAlbum = metadata?.albumTitle?.toLowerCase().trim() || ""; + const subject = j.subject?.toLowerCase().trim() || ""; + + // More lenient matching - check metadata OR subject + const artistMatches = + candidateArtist === normalizedArtist || + (normalizedArtist && subject.includes(normalizedArtist)); + const albumMatches = + candidateAlbum === normalizedAlbum || + (normalizedAlbum && subject.includes(normalizedAlbum)); + + if (artistMatches && albumMatches) { + console.log(` Found existing job by thorough name search: ${j.id}`); + job = j; + break; + } + } + } + + if (!job) { + // Still no match - this is truly an external download or timing issue + // Create a tracking job, but first check we're not creating a duplicate + console.log(` No matching job found - checking for duplicates before creating tracking job`); + + // Check if there's already a tracking job for this exact download + const existingTrackingJob = await prisma.downloadJob.findFirst({ + where: { + lidarrRef: downloadId, + }, + }); + + if (existingTrackingJob) { + console.log(` Tracking job already exists: ${existingTrackingJob.id}`); + return { matched: true, jobId: existingTrackingJob.id }; + } + + // Check if there's a job for this artist+album that we somehow missed + const duplicateCheck = await prisma.downloadJob.findFirst({ + where: { + status: { in: ["pending", "processing"] }, + OR: [ + { targetMbid: albumMbid }, + { lidarrAlbumId: lidarrAlbumId > 0 ? lidarrAlbumId : undefined }, + ], + }, + }); + + if (duplicateCheck) { + console.log(` Found job by MBID/lidarrAlbumId: ${duplicateCheck.id} - linking instead of creating new`); + job = duplicateCheck; + } + } + + if (!job) { + // Truly no existing job - create tracking job for retry support + console.log(` Creating tracking job for untracked download`); + + try { + // Find the user from a recent artist download request + const recentJob = await prisma.downloadJob.findFirst({ + where: { + type: "artist", + status: { in: ["pending", "processing", "completed"] }, + metadata: { + path: ["artistName"], + string_contains: artistName, + }, + }, + orderBy: { createdAt: "desc" }, + }); + + const userId = recentJob?.userId; + + if (userId) { + const newJob = await prisma.downloadJob.create({ + data: { + userId, + subject: `${artistName} - ${albumTitle}`, + type: "album", + targetMbid: albumMbid, + status: "processing", + lidarrRef: downloadId, + lidarrAlbumId, + attempts: 1, + metadata: { + artistName, + albumTitle, + downloadId, + grabbedAt: new Date().toISOString(), + source: "lidarr-auto-grab", + }, + }, + }); + console.log(` Created tracking job: ${newJob.id}`); + return { matched: true, jobId: newJob.id }; + } else { + console.log(` Could not determine user, skipping job creation`); + return { matched: false }; + } + } catch (error: any) { + console.log(` Failed to create tracking job: ${error.message}`); + return { matched: false }; + } + } + + // Update job with Lidarr reference and ensure status is processing + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "processing", // Ensure status is processing (might have been pending) + lidarrRef: downloadId, + lidarrAlbumId, + targetMbid: job.targetMbid || albumMbid, // Keep original or use Lidarr's + metadata: { + ...((job.metadata as any) || {}), + downloadId, + lidarrMbid: albumMbid, // Store Lidarr's MBID for future matching + grabbedAt: new Date().toISOString(), + }, + }, + }); + + console.log(` Linked to job: ${job.id}`); + return { matched: true, jobId: job.id }; + } + + /** + * Handle download complete event (from webhook) + * + * IMPORTANT: One logical album = one job. Match by name if MBID doesn't match. + */ + async onDownloadComplete( + downloadId: string, + albumMbid?: string, + artistName?: string, + albumTitle?: string, + lidarrAlbumId?: number + ): Promise<{ jobId?: string; batchId?: string; downloadBatchId?: string }> { + console.log(`\n[COMPLETE] Download completed: ${downloadId}`); + if (albumMbid) console.log(` Album MBID: ${albumMbid}`); + if (lidarrAlbumId) console.log(` Lidarr Album ID: ${lidarrAlbumId}`); + if (artistName && albumTitle) + console.log(` Album: ${artistName} - ${albumTitle}`); + + // Get ALL active jobs (pending + processing) for matching + const activeJobs = await prisma.downloadJob.findMany({ + where: { status: { in: ["pending", "processing"] } }, + }); + + console.log( + ` Found ${activeJobs.length} active job(s) to match against` + ); + + // Normalize for name matching + const normalizedArtist = artistName?.toLowerCase().trim() || ""; + const normalizedAlbum = albumTitle?.toLowerCase().trim() || ""; + + let job: (typeof activeJobs)[0] | undefined; + let matchedJobs: (typeof activeJobs) = []; + + // Strategy 1: Find job by lidarrRef (most reliable) + job = activeJobs.find((j) => j.lidarrRef === downloadId); + if (job) console.log(` Matched by lidarrRef`); + + // Strategy 2: Find job by lidarrAlbumId + if (!job && lidarrAlbumId) { + job = activeJobs.find((j) => j.lidarrAlbumId === lidarrAlbumId); + if (job) console.log(` Matched by lidarrAlbumId`); + } + + // Strategy 3: Match by previousDownloadIds (for retried downloads) + if (!job) { + job = activeJobs.find((j) => { + const metadata = j.metadata as any; + const prevIds = metadata?.previousDownloadIds as string[] | undefined; + return prevIds?.includes(downloadId); + }); + if (job) console.log(` Matched by previousDownloadIds`); + } + + // Strategy 4: Match by MBID (targetMbid or lidarrMbid in metadata) + if (!job && albumMbid) { + job = activeJobs.find((j) => j.targetMbid === albumMbid); + if (job) { + console.log(` Matched by targetMbid`); + } else { + job = activeJobs.find((j) => { + const metadata = j.metadata as any; + return metadata?.lidarrMbid === albumMbid; + }); + if (job) console.log(` Matched by lidarrMbid in metadata`); + } + } + + // Strategy 5: Match by artist+album name (CANONICAL - handles MBID mismatches) + if (!job && normalizedArtist && normalizedAlbum) { + // Find ALL jobs matching this artist+album (we'll dedupe after) + matchedJobs = activeJobs.filter((j) => { + const metadata = j.metadata as any; + const candidateArtist = metadata?.artistName?.toLowerCase().trim() || ""; + const candidateAlbum = metadata?.albumTitle?.toLowerCase().trim() || ""; + const subject = j.subject?.toLowerCase().trim() || ""; + + // Match by metadata or subject + const metaMatch = candidateArtist === normalizedArtist && candidateAlbum === normalizedAlbum; + const subjectMatch = subject.includes(normalizedArtist) && subject.includes(normalizedAlbum); + + return metaMatch || subjectMatch; + }); + + if (matchedJobs.length > 0) { + // Pick the first one (oldest), will clean up duplicates below + job = matchedJobs[0]; + console.log(` Matched by artist/album name (found ${matchedJobs.length} matching job(s))`); + } + } + + // Strategy 6: Match by subject containing artist (last resort) + if (!job && normalizedArtist) { + job = activeJobs.find((j) => { + const subject = j.subject?.toLowerCase().trim() || ""; + return subject.includes(normalizedArtist); + }); + if (job) console.log(` Matched by subject containing artist`); + } + + if (!job) { + console.log(` No matching job found for downloadId: ${downloadId}`); + return {}; + } + + // Clean up duplicate jobs for the same artist+album + // Mark extras as completed too (they're the same logical download) + // Always search for duplicates, regardless of how we found the primary job + const jobMeta = job.metadata as any; + const jobArtist = jobMeta?.artistName?.toLowerCase().trim() || ""; + const jobAlbum = jobMeta?.albumTitle?.toLowerCase().trim() || ""; + const jobSubject = job.subject?.toLowerCase().trim() || ""; + + const duplicateJobs = activeJobs.filter((j) => { + if (j.id === job.id) return false; // Skip the matched job + + const meta = j.metadata as any; + const candArtist = meta?.artistName?.toLowerCase().trim() || ""; + const candAlbum = meta?.albumTitle?.toLowerCase().trim() || ""; + const candSubject = j.subject?.toLowerCase().trim() || ""; + + // Match by metadata + if (jobArtist && jobAlbum && candArtist === jobArtist && candAlbum === jobAlbum) { + return true; + } + + // Match by subject + if (jobSubject && candSubject === jobSubject) { + return true; + } + + // Match if subjects contain both artist and album + if (jobArtist && jobAlbum && candSubject.includes(jobArtist) && candSubject.includes(jobAlbum)) { + return true; + } + + return false; + }); + + if (duplicateJobs.length > 0) { + console.log(` Found ${duplicateJobs.length} duplicate job(s) for same album - marking as completed`); + const duplicateIds = duplicateJobs.map(j => j.id); + await prisma.downloadJob.updateMany({ + where: { id: { in: duplicateIds } }, + data: { + status: "completed", + completedAt: new Date(), + error: null, + }, + }); + } + + // Mark job as completed (clear any previous error messages) + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "completed", + completedAt: new Date(), + error: null, // Clear any timeout errors since download succeeded + metadata: { + ...((job.metadata as any) || {}), + completedAt: new Date().toISOString(), + }, + }, + }); + + console.log(` Job ${job.id} marked complete`); + + // Send notification for completed download (skip for discovery/import batches) + // Also skip if notification was already sent (dedup for same artist+album) + const meta = job.metadata as any; + const isDiscovery = meta?.downloadType === "discovery"; + const isSpotifyImport = !!meta?.spotifyImportJobId; + const notificationAlreadySent = meta?.notificationSent === true; + + if (!isDiscovery && !isSpotifyImport && !notificationAlreadySent) { + try { + await notificationService.notifyDownloadComplete( + job.userId, + job.subject, + undefined, + meta?.artistId + ); + + // Mark notification as sent to prevent duplicates + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + metadata: { + ...meta, + notificationSent: true, + }, + }, + }); + } catch (notifError) { + console.error("Failed to send download notification:", notifError); + } + } + + const metadata = job.metadata as any; + const downloadBatchId = metadata?.batchId as string | undefined; + const spotifyImportJobId = metadata?.spotifyImportJobId as string | undefined; + + // Check if part of discovery batch + if (job.discoveryBatchId) { + console.log(` Part of Discovery batch: ${job.discoveryBatchId}`); + // Use dynamic import to avoid circular dependency + const { discoverWeeklyService } = await import("./discoverWeekly"); + await discoverWeeklyService.checkBatchCompletion( + job.discoveryBatchId + ); + return { + jobId: job.id, + batchId: job.discoveryBatchId, + downloadBatchId, + }; + } + + // Check if part of Spotify import + if (spotifyImportJobId) { + console.log(` Part of Spotify Import: ${spotifyImportJobId}`); + // Use dynamic import to avoid circular dependency + const { spotifyImportService } = await import("./spotifyImport"); + await spotifyImportService.checkImportCompletion(spotifyImportJobId); + return { + jobId: job.id, + spotifyImportJobId, + downloadBatchId, + }; + } + + // Check if part of download batch (artist download) + if (downloadBatchId) { + console.log(` Part of download batch: ${downloadBatchId}`); + } + + return { jobId: job.id, downloadBatchId }; + } + + // Track recently processed failure events to prevent duplicate handling + private processedFailures = new Map(); + private readonly FAILURE_DEDUP_WINDOW_MS = 30000; // 30 seconds + + /** + * Handle import failure - LET LIDARR HANDLE RELEASE ITERATION + * + * Strategy: + * 1. Blocklist the failed release with skipRedownload=false (Lidarr searches for alternatives) + * 2. Track the failure but DON'T limit retries - let Lidarr exhaust all releases + * 3. Only intervene when Lidarr has NO more releases (detected via stale job timeout) + * 4. At that point, try a different album from the same artist + */ + async onImportFailed( + downloadId: string, + reason: string, + albumMbid?: string + ): Promise<{ retried: boolean; failed: boolean; jobId?: string }> { + console.log(`\n[RETRY] Import failed: ${downloadId}`); + console.log(` Reason: ${reason}`); + + // Deduplicate failure events - same downloadId within 30 seconds + const now = Date.now(); + const lastProcessed = this.processedFailures.get(downloadId); + if ( + lastProcessed && + now - lastProcessed < this.FAILURE_DEDUP_WINDOW_MS + ) { + console.log( + ` Duplicate failure event (within ${ + this.FAILURE_DEDUP_WINDOW_MS / 1000 + }s), skipping` + ); + return { retried: false, failed: false }; + } + this.processedFailures.set(downloadId, now); + + // Clean up old entries periodically + if (this.processedFailures.size > 100) { + for (const [id, time] of this.processedFailures) { + if (now - time > this.FAILURE_DEDUP_WINDOW_MS * 2) { + this.processedFailures.delete(id); + } + } + } + + // Find all processing jobs to match against + const processingJobs = await prisma.downloadJob.findMany({ + where: { status: "processing" }, + }); + + let job: (typeof processingJobs)[0] | undefined; + + // Strategy 1: Match by current lidarrRef + job = processingJobs.find((j) => j.lidarrRef === downloadId); + if (job) console.log(` Matched by lidarrRef`); + + // Strategy 2: Match by previousDownloadIds in metadata + if (!job) { + job = processingJobs.find((j) => { + const metadata = j.metadata as any; + const prevIds = metadata?.previousDownloadIds as + | string[] + | undefined; + return prevIds?.includes(downloadId); + }); + if (job) console.log(` Matched by previousDownloadIds`); + } + + // Strategy 3: Match by MBID + if (!job && albumMbid) { + job = processingJobs.find((j) => j.targetMbid === albumMbid); + if (job) console.log(` Matched by albumMbid`); + } + + if (!job) { + console.log( + ` No matching job found - cleaning up Lidarr queue anyway` + ); + // Still try to remove from Lidarr queue to prevent it from being stuck + await this.removeFromLidarrQueue(downloadId); + return { retried: false, failed: false }; + } + + console.log(` Found job: ${job.id}`); + console.log(` Album: ${job.subject}`); + + // ============================================ + // LET LIDARR HANDLE RELEASE ITERATION + // ============================================ + // Blocklist current release and let Lidarr search for alternatives + // skipRedownload=false means Lidarr will automatically search for another release + + const metadata = (job.metadata as any) || {}; + const failureCount = (metadata.failureCount || 0) + 1; + const previousDownloadIds = metadata.previousDownloadIds || []; + if (downloadId && !previousDownloadIds.includes(downloadId)) { + previousDownloadIds.push(downloadId); + } + + // Update job with failure tracking (no retry limit - let Lidarr exhaust options) + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + lidarrRef: null, // Clear - we'll get a new one from Lidarr's next grab + metadata: { + ...metadata, + failureCount, + lastError: reason, + lastFailureAt: new Date().toISOString(), + previousDownloadIds, + }, + }, + }); + + console.log(` Failure #${failureCount} - blocklisting and letting Lidarr find alternative`); + + // Blocklist with skipRedownload=false so Lidarr searches for alternatives + await this.removeFromLidarrQueue(downloadId); + + // For Spotify Import jobs, check if this failure completes the import + // (Unlike regular downloads, we don't do fallback, so failure might mean completion) + if (metadata.spotifyImportJobId) { + // Don't check immediately - let Lidarr try alternative releases first + // The stale job cleanup will eventually mark it as exhausted + } + + return { retried: true, failed: false, jobId: job.id }; + } + + /** + * Try the next album from the same artist when current album is exhausted + * This is called when all releases for an album have been tried + * + * IMPORTANT: + * - For Discovery Weekly jobs, we DON'T do same-artist fallback. + * Discovery should find NEW artists, not more albums from the same artist. + * - For Spotify Import jobs, we DON'T do same-artist fallback. + * User wants EXACT playlist, not substitutes. + */ + private async tryNextAlbumFromArtist( + job: any, + reason: string + ): Promise<{ retried: boolean; failed: boolean; jobId?: string }> { + const metadata = (job.metadata as any) || {}; + const artistMbid = job.artistMbid || metadata.artistMbid; + const artistName = metadata.artistName; + + // CRITICAL: For Discovery Weekly, DON'T try same-artist fallback + // Discovery should prioritize ARTIST DIVERSITY - let the discovery system + // find a completely different artist instead + if (job.discoveryBatchId) { + console.log(`[RETRY] Discovery job - skipping same-artist fallback (diversity enforced)`); + console.log(` Discovery should find NEW artists, not more from: ${artistName}`); + return await this.markJobExhausted(job, reason); + } + + // CRITICAL: For Spotify Import, DON'T try same-artist fallback + // User wants the EXACT playlist, not substitutes from same artist + if (metadata.spotifyImportJobId || metadata.downloadType === "spotify_import" || metadata.noFallback) { + console.log(`[RETRY] Spotify Import job - skipping fallback (exact match required)`); + console.log(` User wants exact album: ${job.subject}`); + + // Mark as failed and trigger completion check + const result = await this.markJobExhausted(job, reason); + + // Check if import is complete + if (metadata.spotifyImportJobId) { + const { spotifyImportService } = await import("./spotifyImport"); + await spotifyImportService.checkImportCompletion(metadata.spotifyImportJobId); + } + + return result; + } + + if (!artistMbid) { + console.log(` No artistMbid - cannot try other albums from same artist`); + return await this.markJobExhausted(job, reason); + } + + console.log(`[RETRY] Trying other albums from artist: ${artistName || artistMbid}`); + + try { + // Get albums available in LIDARR for this artist (not MusicBrainz) + // MusicBrainz has many obscure albums (bootlegs, live recordings) that Lidarr can't find + const lidarrAlbums = await lidarrService.getArtistAlbums(artistMbid); + + if (!lidarrAlbums || lidarrAlbums.length === 0) { + console.log(` No albums found in Lidarr for artist`); + return await this.markJobExhausted(job, reason); + } + + console.log(` Found ${lidarrAlbums.length} albums in Lidarr for artist`); + + // Get albums we've already tried + const triedAlbumMbids = new Set(); + + // Check for other jobs with same artist + const artistJobs = await prisma.downloadJob.findMany({ + where: { + artistMbid: artistMbid, + status: { in: ["processing", "completed", "failed", "exhausted"] }, + }, + }); + artistJobs.forEach((j: any) => { + triedAlbumMbids.add(j.targetMbid); + }); + + // Also add current job's album + triedAlbumMbids.add(job.targetMbid); + + // Filter to untried albums that exist in Lidarr + const untriedAlbums = lidarrAlbums.filter( + (album: any) => !triedAlbumMbids.has(album.foreignAlbumId) + ); + + console.log(` Untried albums in Lidarr: ${untriedAlbums.length}`); + + if (untriedAlbums.length === 0) { + console.log(` All Lidarr albums from artist exhausted`); + return await this.markJobExhausted(job, reason); + } + + // Pick the first untried album (prioritize studio albums over singles/EPs if possible) + const studioAlbums = untriedAlbums.filter((a: any) => + a.albumType?.toLowerCase() === 'album' || + !a.albumType + ); + const nextAlbum = studioAlbums.length > 0 ? studioAlbums[0] : untriedAlbums[0]; + console.log(`[RETRY] Trying next album from same artist: ${nextAlbum.title}`); + + // Mark current job as exhausted (not failed - we're continuing with same artist) + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "exhausted", + error: `All releases exhausted - trying: ${nextAlbum.title}`, + completedAt: new Date(), + }, + }); + + // Use Lidarr's foreignAlbumId (MBID) for the new job + const albumMbid = nextAlbum.foreignAlbumId; + + // Create new job for the next album + const newJob = await prisma.downloadJob.create({ + data: { + userId: job.userId, + subject: `${artistName || 'Unknown'} - ${nextAlbum.title}`, + type: "album", + targetMbid: albumMbid, + status: "pending", + discoveryBatchId: job.discoveryBatchId, + artistMbid: artistMbid, + metadata: { + artistName: artistName, + artistMbid: artistMbid, + albumTitle: nextAlbum.title, + albumMbid: albumMbid, + lidarrAlbumId: nextAlbum.id, // Store Lidarr album ID for faster lookup + sameArtistFallback: true, + originalJobId: job.id, + downloadType: metadata.downloadType || "library", + rootFolderPath: metadata.rootFolderPath || "/music", + }, + }, + }); + + console.log(` Created fallback job: ${newJob.id}`); + + // Start the download + const result = await this.startDownload( + newJob.id, + artistName || "Unknown Artist", + nextAlbum.title, + albumMbid, + job.userId + ); + + if (result.success) { + console.log(` Same-artist fallback download started`); + return { retried: true, failed: false, jobId: newJob.id }; + } else { + console.log(` Same-artist fallback failed to start: ${result.error}`); + // The new job will be marked as failed by startDownload + return { retried: false, failed: true, jobId: newJob.id }; + } + } catch (error: any) { + console.error(` Error trying same-artist fallback: ${error.message}`); + return await this.markJobExhausted(job, reason); + } + } + + /** + * Mark a job as exhausted (all releases and same-artist albums tried) + * + * IMPORTANT: Before failing, check if another job for the same album already succeeded. + * This handles race conditions where duplicates exist and one succeeds. + */ + private async markJobExhausted( + job: any, + reason: string + ): Promise<{ retried: boolean; failed: boolean; jobId?: string }> { + console.log(`[RETRY] Job fully exhausted: ${job.id}`); + + const meta = job.metadata as any; + const artistName = meta?.artistName?.toLowerCase().trim() || ""; + const albumTitle = meta?.albumTitle?.toLowerCase().trim() || ""; + + // Before marking as failed, check if another job for the same album already SUCCEEDED + // This handles duplicate job scenarios + if (artistName && albumTitle) { + const completedDuplicate = await prisma.downloadJob.findFirst({ + where: { + id: { not: job.id }, + status: "completed", + }, + }); + + if (completedDuplicate) { + const dupMeta = completedDuplicate.metadata as any; + const dupArtist = dupMeta?.artistName?.toLowerCase().trim() || ""; + const dupAlbum = dupMeta?.albumTitle?.toLowerCase().trim() || ""; + + if (dupArtist === artistName && dupAlbum === albumTitle) { + console.log(` Found completed duplicate job ${completedDuplicate.id} - marking this as completed too`); + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "completed", + completedAt: new Date(), + error: null, + metadata: { + ...meta, + mergedWithJob: completedDuplicate.id, + }, + }, + }); + return { retried: false, failed: false, jobId: job.id }; + } + } + } + + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "failed", + error: `All releases and albums exhausted: ${reason}`, + completedAt: new Date(), + }, + }); + + // Check batch completion for discovery jobs + if (job.discoveryBatchId) { + const { discoverWeeklyService } = await import("./discoverWeekly"); + await discoverWeeklyService.checkBatchCompletion(job.discoveryBatchId); + } + + // Send failure notification ONLY if: + // 1. Not discovery/spotify import + // 2. Notification not already sent for this job + // 3. No other job for the same album has already notified + const isDiscovery = meta?.downloadType === "discovery"; + const isSpotifyImport = !!meta?.spotifyImportJobId; + const notificationAlreadySent = meta?.notificationSent === true; + + if (!isDiscovery && !isSpotifyImport && !notificationAlreadySent) { + // Check if any OTHER job for this album already sent a notification + const otherNotified = await prisma.downloadJob.findFirst({ + where: { + id: { not: job.id }, + userId: job.userId, + metadata: { + path: ["artistName"], + string_contains: meta?.artistName || "", + }, + }, + }); + + let skipNotification = false; + if (otherNotified) { + const otherMeta = otherNotified.metadata as any; + if (otherMeta?.notificationSent && + otherMeta?.albumTitle?.toLowerCase() === albumTitle) { + skipNotification = true; + console.log(` Skipping notification - another job already notified for this album`); + } + } + + if (!skipNotification) { + try { + await notificationService.notifyDownloadFailed( + job.userId, + job.subject, + reason + ); + + // Mark notification as sent + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + metadata: { + ...meta, + notificationSent: true, + }, + }, + }); + } catch (notifError) { + console.error("Failed to send failure notification:", notifError); + } + } + } + + return { retried: false, failed: true, jobId: job.id }; + } + // Timeout for "no sources" - if Lidarr hasn't grabbed anything after searching + private readonly NO_SOURCE_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes (indexer searches can be slow) + + /** + * Mark stale jobs as failed (called by cleanup job) + * - Pending jobs (never started) timeout after 3 minutes = "download never started" + * - Processing jobs with no lidarrRef (never grabbed) timeout after 2 minutes = "no sources found" + * - Processing jobs with lidarrRef (grabbed but not imported) timeout after 5 minutes = "import failed" + */ + async markStaleJobsAsFailed(): Promise { + const pendingCutoff = new Date(Date.now() - this.PENDING_TIMEOUT_MS); // 30 minutes for pending (batch processing) + const noSourceCutoff = new Date(Date.now() - this.NO_SOURCE_TIMEOUT_MS); + const importCutoff = new Date(Date.now() - this.IMPORT_TIMEOUT_MS); + + // Find all pending and processing jobs + const activeJobs = await prisma.downloadJob.findMany({ + where: { status: { in: ["pending", "processing"] } }, + }); + + // Log to session for debugging Spotify imports + if (activeJobs.length > 0) { + const spotifyJobs = activeJobs.filter(j => j.id.startsWith("spotify_")); + if (spotifyJobs.length > 0) { + sessionLog('CLEANUP', `Checking ${activeJobs.length} active jobs (${spotifyJobs.length} Spotify import)`); + } + } + + // Separate pending from processing + const pendingJobs = activeJobs.filter(j => j.status === "pending"); + const processingJobs = activeJobs.filter(j => j.status === "processing"); + + // Handle old pending jobs first (they never started) + const stalePendingJobs = pendingJobs.filter(job => job.createdAt < pendingCutoff); + + if (stalePendingJobs.length > 0) { + console.log(`\n⏰ Found ${stalePendingJobs.length} stuck PENDING jobs (never started)`); + sessionLog('CLEANUP', `Found ${stalePendingJobs.length} stuck PENDING jobs`); + + for (const job of stalePendingJobs) { + console.log(` Timing out: ${job.subject} (never started - ${Math.round((Date.now() - job.createdAt.getTime()) / 60000)}m old)`); + + // Mark as failed + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "failed", + error: "Download never started - timed out", + completedAt: new Date(), + }, + }); + + // Check batch completion for discovery jobs + if (job.discoveryBatchId) { + const { discoverWeeklyService } = await import("./discoverWeekly"); + await discoverWeeklyService.checkBatchCompletion(job.discoveryBatchId); + } + } + } + + if (processingJobs.length === 0) { + return 0; + } + + const staleJobs: typeof processingJobs = []; + + // Import lidarr service for active download check + const { isDownloadActive } = await import("./lidarr"); + + for (const job of processingJobs) { + const metadata = job.metadata as any; + const startedAt = metadata?.startedAt + ? new Date(metadata.startedAt) + : job.createdAt; + + // Skip Soulseek jobs - they complete immediately with direct slsk-client + // Old SLSKD jobs used source: "slskd", new direct jobs use source: "soulseek_direct" + if (metadata?.source === "slskd" || metadata?.source === "soulseek_direct") { + console.log(` ${job.subject}: Soulseek download, skipping stale check`); + sessionLog('CLEANUP', `Skipping Soulseek job: ${job.subject} (status: ${job.status})`); + continue; + } + + // Jobs without lidarrRef = Lidarr never grabbed = no sources found + if (!job.lidarrRef) { + if (startedAt < noSourceCutoff) { + staleJobs.push(job); + } + } else { + // Jobs with lidarrRef = grabbed but potentially still downloading + if (startedAt < importCutoff) { + // Check if Lidarr is still actively downloading before timing out + const downloadStatus = await isDownloadActive(job.lidarrRef); + + if (downloadStatus.active) { + // Still downloading - extend the timeout, don't mark as stale + console.log(` ${job.subject}: Still downloading (${downloadStatus.progress || 0}%), extending timeout`); + + // Update the startedAt to extend the timeout + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + metadata: { + ...metadata, + startedAt: new Date().toISOString(), + extendedTimeout: true, + } + } + }); + } else { + // Not actively downloading - mark as stale + staleJobs.push(job); + } + } + } + } + + if (staleJobs.length === 0) { + return 0; + } + + console.log(`\n⏰ Found ${staleJobs.length} stale download jobs`); + sessionLog('CLEANUP', `Found ${staleJobs.length} stale jobs to mark as failed`); + + // Track unique batch IDs to check + const batchIds = new Set(); + const downloadBatchIds = new Set(); + + for (const job of staleJobs) { + const hasLidarrRef = !!job.lidarrRef; + const errorMessage = hasLidarrRef + ? `Import failed - download stuck for ${ + this.IMPORT_TIMEOUT_MS / 60000 + } minutes` + : `No sources found - no indexer results`; + + console.log( + ` Timing out: ${job.subject} (${ + hasLidarrRef ? "stuck import" : "no sources" + })` + ); + sessionLog('CLEANUP', `Marking stale: ${job.subject} - ${errorMessage}`); + + const metadata = (job.metadata as any) || {}; + const artistName = metadata?.artistName?.toLowerCase().trim() || ""; + const albumTitle = metadata?.albumTitle?.toLowerCase().trim() || ""; + + // FIRST: Check if a COMPLETED job already exists for this album + // This handles the case where a duplicate job succeeded while this one was processing + if (artistName && albumTitle) { + const completedDuplicate = await prisma.downloadJob.findFirst({ + where: { + id: { not: job.id }, + status: "completed", + }, + }); + + if (completedDuplicate) { + const dupMeta = completedDuplicate.metadata as any; + const dupArtist = dupMeta?.artistName?.toLowerCase().trim() || ""; + const dupAlbum = dupMeta?.albumTitle?.toLowerCase().trim() || ""; + + if (dupArtist === artistName && dupAlbum === albumTitle) { + console.log(` Found completed duplicate - marking this job as completed too`); + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "completed", + completedAt: new Date(), + error: null, + metadata: { + ...metadata, + mergedWithJob: completedDuplicate.id, + }, + }, + }); + continue; // Skip to next stale job + } + } + } + + // Clean up from Lidarr queue if possible + const lidarrAlbumId = (job as any).lidarrAlbumId; + if (lidarrAlbumId && job.lidarrRef) { + await this.blocklistAndRetry(job.lidarrRef, lidarrAlbumId); + } + + // Use same-artist fallback ONLY for non-discovery jobs + // Discovery jobs should find NEW artists via the discovery system + let replacementStarted = false; + const artistMbid = job.artistMbid || metadata.artistMbid; + + if (artistMbid && !job.discoveryBatchId) { + console.log(` Attempting same-artist fallback...`); + try { + const fallbackResult = await this.tryNextAlbumFromArtist( + { ...job, metadata }, + errorMessage + ); + if (fallbackResult.retried && fallbackResult.jobId) { + console.log(` Same-artist fallback started: ${fallbackResult.jobId}`); + replacementStarted = true; + } + } catch (fallbackErr: any) { + console.error(` Same-artist fallback error: ${fallbackErr.message}`); + } + } else if (job.discoveryBatchId) { + console.log(` Discovery job - letting discovery system find new artist`); + } + + // If no replacement was started, mark the original job as failed + // NOTE: No notification here - stale cleanup is a background safety net + // Notifications are only sent from markJobExhausted when truly exhausted + if (!replacementStarted) { + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "failed", + error: errorMessage, + completedAt: new Date(), + }, + }); + } + + if (job.discoveryBatchId) { + batchIds.add(job.discoveryBatchId); + } + + // Track download batch IDs for artist downloads + if (metadata?.batchId) { + downloadBatchIds.add(metadata.batchId); + } + } + + // Check discovery batch completion for affected batches + if (batchIds.size > 0) { + const { discoverWeeklyService } = await import("./discoverWeekly"); + for (const batchId of batchIds) { + console.log( + ` Checking discovery batch completion: ${batchId}` + ); + await discoverWeeklyService.checkBatchCompletion(batchId); + } + } + + return staleJobs.length; + } + + /** + * Blocklist a failed release and let Lidarr search for alternatives + * skipRedownload=false tells Lidarr to automatically search for another release + */ + private async blocklistAndRetry(downloadId: string, _lidarrAlbumId: number) { + try { + const settings = await getSystemSettings(); + if (!settings?.lidarrUrl || !settings?.lidarrApiKey) return; + + // Get queue to find the specific release + try { + const queueResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/queue`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + + const queueItem = queueResponse.data.records?.find( + (item: any) => item.downloadId === downloadId + ); + + if (queueItem) { + // Remove from queue with blocklist=true and skipRedownload=false + // Lidarr will automatically search for another release + await axios.delete( + `${settings.lidarrUrl}/api/v1/queue/${queueItem.id}?removeFromClient=true&blocklist=true&skipRedownload=false`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log(` Blocklisted release, Lidarr searching for alternative`); + } + } catch (queueError: any) { + // Queue item may have already been removed + console.log(` Queue cleanup: ${queueError.message}`); + } + } catch (error: any) { + console.error(` Blocklist/retry failed:`, error.message); + } + } + + /** + * Remove a failed download from Lidarr's queue (without retrying) + * Used when we don't have a tracking job but still need to clean up + */ + private async removeFromLidarrQueue(downloadId: string) { + try { + const settings = await getSystemSettings(); + if (!settings?.lidarrUrl || !settings?.lidarrApiKey) return; + + const queueResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/queue`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + + const queueItem = queueResponse.data.records?.find( + (item: any) => item.downloadId === downloadId + ); + + if (queueItem) { + // Remove from queue with blocklist=true and skipRedownload=false + // skipRedownload=false tells Lidarr to search for another release + await axios.delete( + `${settings.lidarrUrl}/api/v1/queue/${queueItem.id}?removeFromClient=true&blocklist=true&skipRedownload=false`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log(` Removed from Lidarr queue, blocklisted, triggering new search`); + } else { + console.log( + ` Item not found in Lidarr queue (may already be removed)` + ); + } + } catch (error: any) { + console.error( + ` Failed to remove from Lidarr queue:`, + error.message + ); + } + } + + /** + * Clear all failed/stuck items from Lidarr's download queue + * and trigger new searches for the albums + */ + async clearLidarrQueue(): Promise<{ removed: number; errors: string[] }> { + const errors: string[] = []; + let removed = 0; + const albumIdsToSearch: number[] = []; + + try { + const settings = await getSystemSettings(); + if (!settings?.lidarrUrl || !settings?.lidarrApiKey) { + return { removed: 0, errors: ["Lidarr not configured"] }; + } + + console.log(`\nClearing Lidarr download queue...`); + + const queueResponse = await axios.get( + `${settings.lidarrUrl}/api/v1/queue`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + + const records = queueResponse.data.records || []; + + if (records.length === 0) { + return { removed: 0, errors: [] }; + } + + console.log(` Found ${records.length} items in queue`); + + // Filter for failed/warning status items + const failedItems = records.filter( + (item: any) => + item.status === "warning" || + item.status === "failed" || + item.trackedDownloadStatus === "warning" || + item.trackedDownloadStatus === "error" || + item.trackedDownloadState === "importPending" || + item.trackedDownloadState === "importFailed" || + (item.statusMessages && item.statusMessages.length > 0) + ); + + if (failedItems.length === 0) { + return { removed: 0, errors: [] }; + } + + console.log(` ${failedItems.length} items have errors/warnings`); + + for (const item of failedItems) { + try { + // Collect album IDs for re-search + if (item.albumId) { + albumIdsToSearch.push(item.albumId); + } + + // Remove from queue with blocklist + await axios.delete( + `${settings.lidarrUrl}/api/v1/queue/${item.id}?removeFromClient=true&blocklist=true&skipRedownload=false`, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log( + ` Removed: ${ + item.title || item.album?.title || "Unknown" + }` + ); + removed++; + } catch (error: any) { + const msg = `Failed to remove ${item.id}: ${error.message}`; + console.log(` ✗ ${msg}`); + errors.push(msg); + } + } + + // Explicitly trigger album searches for removed items + if (albumIdsToSearch.length > 0) { + try { + console.log( + ` Triggering search for ${albumIdsToSearch.length} album(s)...` + ); + await axios.post( + `${settings.lidarrUrl}/api/v1/command`, + { + name: "AlbumSearch", + albumIds: albumIdsToSearch, + }, + { + headers: { "X-Api-Key": settings.lidarrApiKey }, + timeout: 10000, + } + ); + console.log( + ` Search triggered for alternative releases` + ); + } catch (searchError: any) { + console.log( + ` Failed to trigger search: ${searchError.message}` + ); + } + } + + console.log(` Removed ${removed} items from queue`); + return { removed, errors }; + } catch (error: any) { + console.error(` Queue cleanup failed:`, error.message); + return { removed, errors: [error.message] }; + } + } + + /** + * Get statistics about current downloads + */ + async getStats(): Promise<{ + pending: number; + processing: number; + completed: number; + failed: number; + }> { + const [pending, processing, completed, failed] = await Promise.all([ + prisma.downloadJob.count({ where: { status: "pending" } }), + prisma.downloadJob.count({ where: { status: "processing" } }), + prisma.downloadJob.count({ where: { status: "completed" } }), + prisma.downloadJob.count({ where: { status: "failed" } }), + ]); + + return { pending, processing, completed, failed }; + } + + /** + * Reconcile processing jobs with Lidarr + * Checks if albums in "processing" state are already available in Lidarr + * and marks them as completed if so (fixes missed webhook completion events) + * + * IMPORTANT: Checks by both MBID and artist+album name to handle MBID mismatches + */ + async reconcileWithLidarr(): Promise<{ reconciled: number; errors: string[] }> { + console.log(`\n[RECONCILE] Checking processing jobs against Lidarr...`); + + const processingJobs = await prisma.downloadJob.findMany({ + where: { status: "processing" }, + }); + + if (processingJobs.length === 0) { + console.log(` No processing jobs to reconcile`); + return { reconciled: 0, errors: [] }; + } + + console.log(` Found ${processingJobs.length} processing job(s)`); + + let reconciled = 0; + const errors: string[] = []; + + for (const job of processingJobs) { + const metadata = job.metadata as any; + const albumMbid = job.targetMbid || metadata?.albumMbid || metadata?.lidarrMbid; + const artistName = metadata?.artistName; + const albumTitle = metadata?.albumTitle; + + try { + let isAvailable = false; + + // Strategy 1: Check by MBID(s) + if (albumMbid) { + isAvailable = await lidarrService.isAlbumAvailable(albumMbid); + + // Also try lidarrMbid if different + if (!isAvailable && metadata?.lidarrMbid && metadata.lidarrMbid !== albumMbid) { + isAvailable = await lidarrService.isAlbumAvailable(metadata.lidarrMbid); + } + } + + // Strategy 2: Check by artist+album name (handles MBID mismatches) + if (!isAvailable && artistName && albumTitle) { + isAvailable = await lidarrService.isAlbumAvailableByTitle(artistName, albumTitle); + } + + // Strategy 3: Parse subject if no metadata (format: "Artist - Album") + if (!isAvailable && !artistName && job.subject) { + const parts = job.subject.split(" - "); + if (parts.length >= 2) { + const parsedArtist = parts[0].trim(); + const parsedAlbum = parts.slice(1).join(" - ").trim(); + isAvailable = await lidarrService.isAlbumAvailableByTitle(parsedArtist, parsedAlbum); + } + } + + if (isAvailable) { + console.log(` Job ${job.id}: Album "${job.subject}" found in Lidarr - marking complete`); + + await prisma.downloadJob.update({ + where: { id: job.id }, + data: { + status: "completed", + completedAt: new Date(), + error: null, + metadata: { + ...metadata, + completedAt: new Date().toISOString(), + reconciledFromLidarr: true, + }, + }, + }); + + // Check batch completion for discovery jobs + if (job.discoveryBatchId) { + const { discoverWeeklyService } = await import("./discoverWeekly"); + await discoverWeeklyService.checkBatchCompletion(job.discoveryBatchId); + } + + reconciled++; + } else { + // Only log for jobs older than 5 minutes + const jobAge = Date.now() - (job.createdAt?.getTime() || 0); + if (jobAge > 5 * 60 * 1000) { + console.log(` Job ${job.id}: "${job.subject}" not yet available in Lidarr (${Math.round(jobAge / 60000)}m old)`); + } + } + } catch (error: any) { + const msg = `Job ${job.id}: Error checking Lidarr - ${error.message}`; + console.error(` ${msg}`); + errors.push(msg); + } + } + + console.log(`[RECONCILE] Reconciled ${reconciled} job(s)`); + return { reconciled, errors }; + } +} + +// Singleton instance +export const simpleDownloadManager = new SimpleDownloadManager(); diff --git a/backend/src/services/soulseek.ts b/backend/src/services/soulseek.ts new file mode 100644 index 0000000..caeec14 --- /dev/null +++ b/backend/src/services/soulseek.ts @@ -0,0 +1,1008 @@ +/** + * Direct Soulseek integration using slsk-client + * Replaces the SLSKD Docker container with native Node.js connection + */ + +import slsk from "slsk-client"; +import path from "path"; +import fs from "fs"; +import PQueue from "p-queue"; +import { getSystemSettings } from "../utils/systemSettings"; +import { sessionLog } from "../utils/playlistLogger"; + +// slsk-client types +interface SlskClient { + search( + opts: { req: string; timeout: number }, + cb: (err: Error | null, results: SearchResult[]) => void + ): void; + download( + opts: { file: SearchResult; path: string }, + cb: (err: Error | null, data?: { buffer: Buffer }) => void + ): void; +} + +export interface SearchResult { + user: string; + file: string; + size: number; + slots: boolean; + bitrate?: number; + speed: number; +} + +export interface TrackMatch { + username: string; + filename: string; + fullPath: string; + size: number; + bitRate?: number; + quality: string; + score: number; +} + +export interface SearchTrackResult { + found: boolean; + bestMatch: TrackMatch | null; + allMatches: TrackMatch[]; // All ranked matches for retry +} + +class SoulseekService { + private client: SlskClient | null = null; + private connecting = false; + private connectPromise: Promise | null = null; + private lastConnectAttempt = 0; + private readonly RECONNECT_COOLDOWN = 30000; // 30 seconds between reconnect attempts + private readonly DOWNLOAD_TIMEOUT = 180000; // 3 minutes per download attempt + private readonly MAX_DOWNLOAD_RETRIES = 3; // Try up to 3 different users + + // Connection health tracking + private connectedAt: Date | null = null; + private lastSuccessfulSearch: Date | null = null; + private consecutiveEmptySearches = 0; + private totalSearches = 0; + private totalSuccessfulSearches = 0; + private readonly MAX_CONSECUTIVE_EMPTY = 3; // After 3 empty searches, force reconnect + + /** + * Normalize track title for better search results + * Extracts main song name by removing live performance details, remasters, etc. + * e.g. "Santa Claus Is Comin' to Town (Live at C.W. Post College, NY - Dec 1975)" → "Santa Claus Is Comin' to Town" + */ + private normalizeTrackTitle(title: string): string { + // First, normalize Unicode characters to ASCII equivalents for better search matching + let normalized = title + .replace(/…/g, "") // Remove ellipsis (U+2026) - files don't have this + .replace(/[''′`]/g, "'") // Smart apostrophes → ASCII apostrophe + .replace(/[""]/g, '"') // Smart quotes → ASCII quotes + .replace(/\//g, " ") // Slash → space (file names can't have /) + .replace(/[–—]/g, "-") // En/em dash → hyphen + .replace(/[×]/g, "x"); // Multiplication sign → x + + // Remove content in parentheses that contains live/remaster/remix info + const livePatterns = + /\s*\([^)]*(?:live|remaster|remix|version|edit|demo|acoustic|radio|single|extended|instrumental|feat\.|ft\.|featuring)[^)]*\)\s*/gi; + normalized = normalized.replace(livePatterns, " "); + + // Also try brackets + const bracketPatterns = + /\s*\[[^\]]*(?:live|remaster|remix|version|edit|demo|acoustic|radio|single|extended|instrumental|feat\.|ft\.|featuring)[^\]]*\]\s*/gi; + normalized = normalized.replace(bracketPatterns, " "); + + // Remove trailing dash content (often contains year or version info) + normalized = normalized.replace( + /\s*-\s*(\d{4}|remaster|live|remix|version|edit|demo|acoustic).*$/i, + "" + ); + + // Clean up whitespace + normalized = normalized.replace(/\s+/g, " ").trim(); + + // If we stripped too much, return original + if (normalized.length < 3) { + return title; + } + + return normalized; + } + + /** + * Connect to Soulseek network + */ + async connect(): Promise { + const settings = await getSystemSettings(); + + if (!settings?.soulseekUsername || !settings?.soulseekPassword) { + throw new Error("Soulseek credentials not configured"); + } + + sessionLog("SOULSEEK", `Connecting as ${settings.soulseekUsername}...`); + + return new Promise((resolve, reject) => { + slsk.connect( + { + user: settings.soulseekUsername, + pass: settings.soulseekPassword, + }, + (err: Error | null, client: SlskClient) => { + if (err) { + sessionLog( + "SOULSEEK", + `Connection failed: ${err.message}`, + "ERROR" + ); + return reject(err); + } + this.client = client; + this.connectedAt = new Date(); + this.consecutiveEmptySearches = 0; + sessionLog("SOULSEEK", "Connected to Soulseek network"); + resolve(); + } + ); + }); + } + + /** + * Force disconnect and clear client state + */ + private forceDisconnect(): void { + const uptime = this.connectedAt + ? Math.round((Date.now() - this.connectedAt.getTime()) / 1000) + : 0; + sessionLog( + "SOULSEEK", + `Force disconnecting (was connected for ${uptime}s)`, + "WARN" + ); + this.client = null; + this.connectedAt = null; + this.lastConnectAttempt = 0; // Allow immediate reconnect + } + + /** + * Ensure we have an active connection + * @param force - If true, disconnect and reconnect even if client exists + */ + private async ensureConnected(force: boolean = false): Promise { + if (force && this.client) { + this.forceDisconnect(); + } + + if (this.client) { + return; + } + + // Prevent multiple simultaneous connection attempts + if (this.connecting && this.connectPromise) { + return this.connectPromise; + } + + // Cooldown between reconnect attempts (skip if forced) + const now = Date.now(); + if (!force && now - this.lastConnectAttempt < this.RECONNECT_COOLDOWN) { + throw new Error( + "Connection cooldown - please wait before retrying" + ); + } + + this.connecting = true; + this.lastConnectAttempt = now; + + this.connectPromise = this.connect().finally(() => { + this.connecting = false; + this.connectPromise = null; + }); + + return this.connectPromise; + } + + /** + * Check if connected to Soulseek + */ + isConnected(): boolean { + return this.client !== null; + } + + /** + * Check if Soulseek is available (credentials configured) + */ + async isAvailable(): Promise { + try { + const settings = await getSystemSettings(); + return !!(settings?.soulseekUsername && settings?.soulseekPassword); + } catch { + return false; + } + } + + /** + * Get connection status + */ + async getStatus(): Promise<{ + connected: boolean; + username: string | null; + }> { + const settings = await getSystemSettings(); + return { + connected: this.client !== null, + username: settings?.soulseekUsername || null, + }; + } + + /** + * Search for a track and return the best match plus alternatives for retry + */ + async searchTrack( + artistName: string, + trackTitle: string, + isRetry: boolean = false + ): Promise { + this.totalSearches++; + const searchId = this.totalSearches; + const connectionAge = this.connectedAt + ? Math.round((Date.now() - this.connectedAt.getTime()) / 1000) + : 0; + + try { + await this.ensureConnected(); + } catch (err: any) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Connection error: ${err.message}`, + "ERROR" + ); + return { found: false, bestMatch: null, allMatches: [] }; + } + + if (!this.client) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Client not connected`, + "ERROR" + ); + return { found: false, bestMatch: null, allMatches: [] }; + } + + // Normalize title to extract main song name (removes live/remaster info) + const normalizedTitle = this.normalizeTrackTitle(trackTitle); + const useNormalized = normalizedTitle !== trackTitle; + + const query = `${artistName} ${normalizedTitle}`; + if (useNormalized) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Normalized: "${trackTitle}" → "${normalizedTitle}"` + ); + } + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Searching: "${query}" (connected ${connectionAge}s, ${this.consecutiveEmptySearches} consecutive empty)` + ); + + return new Promise(async (resolve) => { + const searchStartTime = Date.now(); + this.client!.search( + { + req: query, + timeout: 45000, // 45 seconds for individual tracks (popular tracks can return large results) + }, + async (err, results) => { + const searchDuration = Date.now() - searchStartTime; + + if (err) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Search error after ${searchDuration}ms: ${err.message}`, + "ERROR" + ); + this.consecutiveEmptySearches++; + + // If we get an error and haven't retried, force reconnect and try again + if (!isRetry && this.consecutiveEmptySearches >= 2) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Search error detected, forcing reconnect and retry...`, + "WARN" + ); + this.forceDisconnect(); + return resolve( + await this.searchTrack( + artistName, + trackTitle, + true + ) + ); + } + + return resolve({ + found: false, + bestMatch: null, + allMatches: [], + }); + } + + if (!results || results.length === 0) { + this.consecutiveEmptySearches++; + sessionLog( + "SOULSEEK", + `[Search #${searchId}] No results found after ${searchDuration}ms (${this.consecutiveEmptySearches}/${this.MAX_CONSECUTIVE_EMPTY} consecutive empty)`, + "WARN" + ); + + // If too many consecutive empty searches, connection might be stale + if ( + !isRetry && + this.consecutiveEmptySearches >= + this.MAX_CONSECUTIVE_EMPTY + ) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Too many consecutive empty searches, forcing reconnect and retry...`, + "WARN" + ); + this.forceDisconnect(); + return resolve( + await this.searchTrack( + artistName, + trackTitle, + true + ) + ); + } + + return resolve({ + found: false, + bestMatch: null, + allMatches: [], + }); + } + + // Reset consecutive empty counter on successful results + this.consecutiveEmptySearches = 0; + this.lastSuccessfulSearch = new Date(); + this.totalSuccessfulSearches++; + + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Found ${ + results.length + } results in ${searchDuration}ms (success rate: ${Math.round( + (this.totalSuccessfulSearches / + this.totalSearches) * + 100 + )}%)` + ); + + // Filter for audio files with available slots + const audioExtensions = [ + ".flac", + ".mp3", + ".m4a", + ".ogg", + ".opus", + ".wav", + ".aac", + ]; + const audioFiles = results.filter((r) => { + const filename = (r.file || "").toLowerCase(); + const isAudio = audioExtensions.some((ext) => + filename.endsWith(ext) + ); + // Prefer files with slots available (faster download) + return isAudio; + }); + + if (audioFiles.length === 0) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] No audio files in ${results.length} results`, + "WARN" + ); + return resolve({ + found: false, + bestMatch: null, + allMatches: [], + }); + } + + // Rank and score all results + const rankedMatches = this.rankAllResults( + audioFiles, + artistName, + trackTitle + ); + + if (rankedMatches.length === 0) { + sessionLog( + "SOULSEEK", + `[Search #${searchId}] No suitable match found from ${audioFiles.length} audio files`, + "WARN" + ); + return resolve({ + found: false, + bestMatch: null, + allMatches: [], + }); + } + + const best = rankedMatches[0]; + sessionLog( + "SOULSEEK", + `[Search #${searchId}] ✓ MATCH: ${best.filename} | ${ + best.quality + } | ${Math.round(best.size / 1024 / 1024)}MB | User: ${ + best.username + } | Score: ${best.score}` + ); + sessionLog( + "SOULSEEK", + `[Search #${searchId}] Found ${rankedMatches.length} alternative sources for retry` + ); + + resolve({ + found: true, + bestMatch: best, + allMatches: rankedMatches, + }); + } + ); + }); + } + + /** + * Rank all search results and return sorted matches (best first) + * Filters out matches below minimum score threshold + */ + private rankAllResults( + results: SearchResult[], + artistName: string, + trackTitle: string + ): TrackMatch[] { + // Normalize search terms for matching + const normalizedArtist = artistName + .toLowerCase() + .replace(/[^a-z0-9\s]/g, ""); + const normalizedTitle = trackTitle + .toLowerCase() + .replace(/[^a-z0-9\s]/g, "") + .replace(/^\d+\s*[-.]?\s*/, ""); // Remove leading track numbers + + // Get first word of artist for fuzzy matching + const artistFirstWord = normalizedArtist.split(/\s+/)[0]; + // Get first few significant words of title + const titleWords = normalizedTitle + .split(/\s+/) + .filter((w) => w.length > 2) + .slice(0, 3); + + const scored = results.map((file) => { + const filename = (file.file || "").toLowerCase(); + const normalizedFilename = filename.replace(/[^a-z0-9]/g, ""); + const shortFilename = filename.split(/[/\\]/).pop() || filename; + + let score = 0; + + // Prefer files with slots available (+20) + if (file.slots) score += 20; + + // Check if filename contains artist (full or first word) + if ( + normalizedFilename.includes(normalizedArtist.replace(/\s/g, "")) + ) { + score += 50; // Full artist match + } else if ( + artistFirstWord.length >= 3 && + normalizedFilename.includes(artistFirstWord) + ) { + score += 35; // Partial artist match (first word) + } + + // Check if filename contains title (full or partial) + const titleNoSpaces = normalizedTitle.replace(/\s/g, ""); + if (normalizedFilename.includes(titleNoSpaces)) { + score += 50; // Full title match + } else if ( + titleWords.length > 0 && + titleWords.every((w) => normalizedFilename.includes(w)) + ) { + score += 40; // All significant title words match + } else if ( + titleWords.length > 0 && + titleWords.some( + (w) => w.length > 4 && normalizedFilename.includes(w) + ) + ) { + score += 25; // At least one significant title word matches + } + + // Prefer FLAC (+30) + if (filename.endsWith(".flac")) score += 30; + // Then high-quality MP3 (+20 for 320, +10 for 256) + else if (filename.endsWith(".mp3") && (file.bitrate || 0) >= 320) + score += 20; + else if (filename.endsWith(".mp3") && (file.bitrate || 0) >= 256) + score += 10; + + // Prefer reasonable file sizes + const sizeMB = (file.size || 0) / 1024 / 1024; + if (sizeMB >= 3 && sizeMB <= 100) score += 10; + if (sizeMB >= 10 && sizeMB <= 50) score += 5; // FLAC range + + // Prefer higher speed peers + if (file.speed > 1000000) score += 5; // >1MB/s + + const quality = this.getQualityFromFilename( + file.file, + file.bitrate + ); + + return { + username: file.user, + filename: shortFilename, + fullPath: file.file, + size: file.size, + bitRate: file.bitrate, + quality, + score, + }; + }); + + // Sort by score descending, filter by minimum threshold + // Score 20+ is acceptable: slots(20) OR artist match(35-50) OR title match(25-50) + return scored + .filter((m) => m.score >= 20) + .sort((a, b) => b.score - a.score) + .slice(0, 10); // Keep top 10 for retry purposes + } + + /** + * Download a track directly to the music library with timeout + */ + async downloadTrack( + match: TrackMatch, + destPath: string + ): Promise<{ success: boolean; error?: string }> { + try { + await this.ensureConnected(); + } catch (err: any) { + return { success: false, error: err.message }; + } + + if (!this.client) { + return { success: false, error: "Not connected" }; + } + + // Ensure destination directory exists + const destDir = path.dirname(destPath); + if (!fs.existsSync(destDir)) { + fs.mkdirSync(destDir, { recursive: true }); + } + + sessionLog( + "SOULSEEK", + `Downloading from ${match.username}: ${match.filename} -> ${destPath}` + ); + + return new Promise((resolve) => { + let resolved = false; + + // Timeout handler - 3 minutes max per download attempt + const timeoutId = setTimeout(() => { + if (!resolved) { + resolved = true; + sessionLog( + "SOULSEEK", + `Download timed out after ${ + this.DOWNLOAD_TIMEOUT / 1000 + }s: ${match.filename}`, + "WARN" + ); + // Clean up partial file if it exists + if (fs.existsSync(destPath)) { + try { + fs.unlinkSync(destPath); + } catch (e) { + // Ignore cleanup errors + } + } + resolve({ success: false, error: "Download timed out" }); + } + }, this.DOWNLOAD_TIMEOUT); + + // Create a SearchResult object for the download + const downloadFile: SearchResult = { + user: match.username, + file: match.fullPath, + size: match.size, + slots: true, + bitrate: match.bitRate, + speed: 0, + }; + + this.client!.download( + { + file: downloadFile, + path: destPath, + }, + (err) => { + if (resolved) return; // Already timed out + resolved = true; + clearTimeout(timeoutId); + + if (err) { + sessionLog( + "SOULSEEK", + `Download failed: ${err.message}`, + "ERROR" + ); + return resolve({ success: false, error: err.message }); + } + + // Verify file was written + if (fs.existsSync(destPath)) { + const stats = fs.statSync(destPath); + sessionLog( + "SOULSEEK", + `✓ Downloaded: ${match.filename} (${Math.round( + stats.size / 1024 + )}KB)` + ); + resolve({ success: true }); + } else { + sessionLog( + "SOULSEEK", + "File not found after download", + "ERROR" + ); + resolve({ success: false, error: "File not written" }); + } + } + ); + }); + } + + /** + * Search and download a track in one operation + * Includes retry logic - tries multiple users if first fails/times out + */ + async searchAndDownload( + artistName: string, + trackTitle: string, + albumName: string, + musicPath: string + ): Promise<{ success: boolean; filePath?: string; error?: string }> { + // Search for the track + const searchResult = await this.searchTrack(artistName, trackTitle); + + if (!searchResult.found || searchResult.allMatches.length === 0) { + return { success: false, error: "No suitable match found" }; + } + + const sanitize = (name: string) => + name.replace(/[<>:"/\\|?*]/g, "_").trim(); + const errors: string[] = []; + + // Try up to MAX_DOWNLOAD_RETRIES different users + const matchesToTry = searchResult.allMatches.slice( + 0, + this.MAX_DOWNLOAD_RETRIES + ); + + for (let attempt = 0; attempt < matchesToTry.length; attempt++) { + const match = matchesToTry[attempt]; + + sessionLog( + "SOULSEEK", + `Attempt ${attempt + 1}/${matchesToTry.length}: Trying ${ + match.username + } for ${match.filename}` + ); + + // Build destination path: Singles/Artist/Album/filename + const destPath = path.join( + musicPath, + "Singles", + sanitize(artistName), + sanitize(albumName), + sanitize(match.filename) + ); + + // Download with timeout + const downloadResult = await this.downloadTrack(match, destPath); + + if (downloadResult.success) { + if (attempt > 0) { + sessionLog( + "SOULSEEK", + `✓ Success on attempt ${attempt + 1} (user: ${ + match.username + })` + ); + } + return { success: true, filePath: destPath }; + } + + // Log failure and try next user + const errorMsg = downloadResult.error || "Unknown error"; + errors.push(`${match.username}: ${errorMsg}`); + sessionLog( + "SOULSEEK", + `Attempt ${ + attempt + 1 + } failed: ${errorMsg}, trying next user...`, + "WARN" + ); + } + + // All attempts failed + sessionLog( + "SOULSEEK", + `All ${matchesToTry.length} download attempts failed for: ${artistName} - ${trackTitle}`, + "ERROR" + ); + return { + success: false, + error: `All ${matchesToTry.length} attempts failed: ${errors.join( + "; " + )}`, + }; + } + + /** + * Download best match from pre-searched results + * Used when search was already done separately (e.g., for retry functionality) + */ + async downloadBestMatch( + artistName: string, + trackTitle: string, + albumName: string, + allMatches: TrackMatch[], + musicPath: string + ): Promise<{ success: boolean; filePath?: string; error?: string }> { + if (allMatches.length === 0) { + return { success: false, error: "No matches provided" }; + } + + const sanitize = (name: string) => + name.replace(/[<>:"/\\|?*]/g, "_").trim(); + const errors: string[] = []; + + // Try up to MAX_DOWNLOAD_RETRIES different users + const matchesToTry = allMatches.slice(0, this.MAX_DOWNLOAD_RETRIES); + + for (let attempt = 0; attempt < matchesToTry.length; attempt++) { + const match = matchesToTry[attempt]; + + sessionLog( + "SOULSEEK", + `[${artistName} - ${trackTitle}] Attempt ${attempt + 1}/${ + matchesToTry.length + }: Trying ${match.username}` + ); + + // Build destination path: Singles/Artist/Album/filename + const destPath = path.join( + musicPath, + "Singles", + sanitize(artistName), + sanitize(albumName), + sanitize(match.filename) + ); + + // Download with timeout + const downloadResult = await this.downloadTrack(match, destPath); + + if (downloadResult.success) { + if (attempt > 0) { + sessionLog( + "SOULSEEK", + `✓ Success on attempt ${attempt + 1} (user: ${ + match.username + })` + ); + } + return { success: true, filePath: destPath }; + } + + // Log failure and try next user + const errorMsg = downloadResult.error || "Unknown error"; + errors.push(`${match.username}: ${errorMsg}`); + sessionLog( + "SOULSEEK", + `Attempt ${attempt + 1} failed: ${errorMsg}`, + "WARN" + ); + } + + // All attempts failed + return { + success: false, + error: `All ${matchesToTry.length} attempts failed: ${errors.join( + "; " + )}`, + }; + } + + /** + * Search and download multiple tracks in parallel + * - Searches run fully parallel (fast, 15s timeout each) + * - Downloads limited to concurrency of 4 to prevent network saturation + */ + async searchAndDownloadBatch( + tracks: Array<{ artist: string; title: string; album: string }>, + musicPath: string, + concurrency: number = 4 + ): Promise<{ + successful: number; + failed: number; + files: string[]; + errors: string[]; + }> { + const downloadQueue = new PQueue({ concurrency }); + const results: { + successful: number; + failed: number; + files: string[]; + errors: string[]; + } = { + successful: 0, + failed: 0, + files: [], + errors: [], + }; + + // Phase 1: Search all tracks in parallel (searches are fast) + sessionLog( + "SOULSEEK", + `Searching for ${tracks.length} tracks in parallel...` + ); + const searchPromises = tracks.map((track) => + this.searchTrack(track.artist, track.title).then((result) => ({ + track, + result, + })) + ); + const searchResults = await Promise.all(searchPromises); + + // Phase 2: Queue downloads with concurrency limit + const tracksWithMatches = searchResults.filter( + (r) => r.result.found && r.result.allMatches.length > 0 + ); + sessionLog( + "SOULSEEK", + `Found matches for ${tracksWithMatches.length}/${tracks.length} tracks, downloading with concurrency ${concurrency}...` + ); + + // Count tracks with no search results as failed + const noMatchTracks = searchResults.filter( + (r) => !r.result.found || r.result.allMatches.length === 0 + ); + for (const { track } of noMatchTracks) { + results.failed++; + results.errors.push( + `${track.artist} - ${track.title}: No match found on Soulseek` + ); + } + + // Queue downloads for tracks with matches + const downloadPromises = tracksWithMatches.map(({ track, result }) => + downloadQueue.add(async () => { + const downloadResult = await this.downloadWithRetry( + track.artist, + track.title, + track.album, + result.allMatches, + musicPath + ); + if (downloadResult.success && downloadResult.filePath) { + results.successful++; + results.files.push(downloadResult.filePath); + } else { + results.failed++; + results.errors.push( + `${track.artist} - ${track.title}: ${ + downloadResult.error || "Unknown error" + }` + ); + } + }) + ); + + await Promise.all(downloadPromises); + + sessionLog( + "SOULSEEK", + `Batch complete: ${results.successful} succeeded, ${results.failed} failed` + ); + + return results; + } + + /** + * Download with retry logic (extracted for use by batch downloads) + */ + private async downloadWithRetry( + artistName: string, + trackTitle: string, + albumName: string, + allMatches: TrackMatch[], + musicPath: string + ): Promise<{ success: boolean; filePath?: string; error?: string }> { + const sanitize = (name: string) => + name.replace(/[<>:"/\\|?*]/g, "_").trim(); + const errors: string[] = []; + const matchesToTry = allMatches.slice(0, this.MAX_DOWNLOAD_RETRIES); + + for (let attempt = 0; attempt < matchesToTry.length; attempt++) { + const match = matchesToTry[attempt]; + + sessionLog( + "SOULSEEK", + `[${artistName} - ${trackTitle}] Attempt ${attempt + 1}/${ + matchesToTry.length + }: Trying ${match.username}` + ); + + const destPath = path.join( + musicPath, + "Singles", + sanitize(artistName), + sanitize(albumName), + sanitize(match.filename) + ); + + const result = await this.downloadTrack(match, destPath); + if (result.success) { + if (attempt > 0) { + sessionLog( + "SOULSEEK", + `[${artistName} - ${trackTitle}] ✓ Success on attempt ${ + attempt + 1 + }` + ); + } + return { success: true, filePath: destPath }; + } + errors.push(`${match.username}: ${result.error}`); + } + + sessionLog( + "SOULSEEK", + `[${artistName} - ${trackTitle}] All ${matchesToTry.length} attempts failed`, + "ERROR" + ); + return { success: false, error: errors.join("; ") }; + } + + /** + * Get quality string from filename/bitrate + */ + private getQualityFromFilename(filename: string, bitRate?: number): string { + const lowerFilename = filename.toLowerCase(); + if (lowerFilename.endsWith(".flac")) return "FLAC"; + if (lowerFilename.endsWith(".wav")) return "WAV"; + if (lowerFilename.endsWith(".mp3")) { + if (bitRate && bitRate >= 320) return "MP3 320"; + if (bitRate && bitRate >= 256) return "MP3 256"; + if (bitRate && bitRate >= 192) return "MP3 192"; + return "MP3"; + } + if (lowerFilename.endsWith(".m4a") || lowerFilename.endsWith(".aac")) + return "AAC"; + if (lowerFilename.endsWith(".ogg")) return "OGG"; + if (lowerFilename.endsWith(".opus")) return "OPUS"; + return "Unknown"; + } + + /** + * Disconnect from Soulseek + */ + disconnect(): void { + this.client = null; + sessionLog("SOULSEEK", "Disconnected"); + } +} + +// Export singleton instance +export const soulseekService = new SoulseekService(); diff --git a/backend/src/services/spotify.ts b/backend/src/services/spotify.ts new file mode 100644 index 0000000..db47146 --- /dev/null +++ b/backend/src/services/spotify.ts @@ -0,0 +1,575 @@ +import axios from "axios"; + +/** + * Spotify Service + * + * Fetches public playlist data from Spotify using anonymous tokens. + * No API credentials required - uses Spotify's web player token endpoint. + */ + +export interface SpotifyTrack { + spotifyId: string; + title: string; + artist: string; + artistId: string; + album: string; + albumId: string; + isrc: string | null; + durationMs: number; + trackNumber: number; + previewUrl: string | null; + coverUrl: string | null; +} + +export interface SpotifyPlaylist { + id: string; + name: string; + description: string | null; + owner: string; + imageUrl: string | null; + trackCount: number; + tracks: SpotifyTrack[]; + isPublic: boolean; +} + +export interface SpotifyAlbum { + id: string; + name: string; + artist: string; + artistId: string; + imageUrl: string | null; + releaseDate: string | null; + trackCount: number; +} + +export interface SpotifyPlaylistPreview { + id: string; + name: string; + description: string | null; + owner: string; + imageUrl: string | null; + trackCount: number; +} + +// URL patterns +const SPOTIFY_PLAYLIST_REGEX = /(?:spotify\.com\/playlist\/|spotify:playlist:)([a-zA-Z0-9]+)/; +const SPOTIFY_ALBUM_REGEX = /(?:spotify\.com\/album\/|spotify:album:)([a-zA-Z0-9]+)/; +const SPOTIFY_TRACK_REGEX = /(?:spotify\.com\/track\/|spotify:track:)([a-zA-Z0-9]+)/; + +class SpotifyService { + private anonymousToken: string | null = null; + private tokenExpiry: number = 0; + + /** + * Get anonymous access token from Spotify web player + * Try multiple endpoints for reliability + */ + private async getAnonymousToken(): Promise { + // Check if we have a valid token + if (this.anonymousToken && Date.now() < this.tokenExpiry - 60000) { + return this.anonymousToken; + } + + // Try multiple endpoints + const endpoints = [ + { + url: "https://open.spotify.com/get_access_token", + params: { reason: "transport", productType: "web_player" } + }, + { + url: "https://open.spotify.com/get_access_token", + params: { reason: "init", productType: "embed" } + } + ]; + + for (const endpoint of endpoints) { + try { + console.log(`Spotify: Fetching anonymous token from ${endpoint.url}...`); + + const response = await axios.get(endpoint.url, { + params: endpoint.params, + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Accept": "application/json", + "Accept-Language": "en-US,en;q=0.9", + "Origin": "https://open.spotify.com", + "Referer": "https://open.spotify.com/", + }, + timeout: 10000, + }); + + const token = response.data?.accessToken; + if (token) { + this.anonymousToken = token; + // Anonymous tokens last about an hour + this.tokenExpiry = Date.now() + 3600 * 1000; + + console.log("Spotify: Got anonymous token"); + return token; + } + } catch (error: any) { + console.log(`Spotify: Token endpoint failed (${error.response?.status || error.message})`); + } + } + + console.error("Spotify: All token endpoints failed - API browsing unavailable"); + return null; + } + + /** + * Parse a Spotify URL and extract the type and ID + */ + parseUrl(url: string): { type: "playlist" | "album" | "track"; id: string } | null { + const playlistMatch = url.match(SPOTIFY_PLAYLIST_REGEX); + if (playlistMatch) { + return { type: "playlist", id: playlistMatch[1] }; + } + + const albumMatch = url.match(SPOTIFY_ALBUM_REGEX); + if (albumMatch) { + return { type: "album", id: albumMatch[1] }; + } + + const trackMatch = url.match(SPOTIFY_TRACK_REGEX); + if (trackMatch) { + return { type: "track", id: trackMatch[1] }; + } + + return null; + } + + /** + * Fetch playlist via anonymous token + */ + private async fetchPlaylistViaAnonymousApi(playlistId: string): Promise { + const token = await this.getAnonymousToken(); + if (!token) { + return await this.fetchPlaylistViaEmbedHtml(playlistId); + } + + try { + console.log(`Spotify: Fetching playlist ${playlistId}...`); + + const playlistResponse = await axios.get( + `https://api.spotify.com/v1/playlists/${playlistId}`, + { + headers: { + Authorization: `Bearer ${token}`, + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + }, + params: { + fields: "id,name,description,owner.display_name,images,public,tracks.total,tracks.items(track(id,name,artists(id,name),album(id,name,images),duration_ms,track_number,preview_url,external_ids))", + }, + timeout: 15000, + } + ); + + const playlist = playlistResponse.data; + console.log(`Spotify: Fetched playlist "${playlist.name}" with ${playlist.tracks?.items?.length || 0} tracks`); + + const tracks: SpotifyTrack[] = []; + + for (const item of playlist.tracks?.items || []) { + const track = item.track; + if (!track || !track.id) { + continue; + } + + // Get album name, handling null, undefined, and empty strings + const albumName = track.album?.name?.trim() || "Unknown Album"; + + // Debug log for tracks with Unknown Album + if (albumName === "Unknown Album") { + console.log(`Spotify: Track "${track.name}" has no album data:`, JSON.stringify({ + trackId: track.id, + album: track.album, + hasAlbum: !!track.album, + albumName: track.album?.name, + })); + } + + tracks.push({ + spotifyId: track.id, + title: track.name, + artist: track.artists?.[0]?.name || "Unknown Artist", + artistId: track.artists?.[0]?.id || "", + album: albumName, + albumId: track.album?.id || "", + isrc: track.external_ids?.isrc || null, + durationMs: track.duration_ms || 0, + trackNumber: track.track_number || 0, + previewUrl: track.preview_url || null, + coverUrl: track.album?.images?.[0]?.url || null, + }); + } + + console.log(`Spotify: Processed ${tracks.length} tracks`); + + return { + id: playlist.id, + name: playlist.name, + description: playlist.description, + owner: playlist.owner?.display_name || "Unknown", + imageUrl: playlist.images?.[0]?.url || null, + trackCount: playlist.tracks?.total || tracks.length, + tracks, + isPublic: playlist.public ?? true, + }; + } catch (error: any) { + console.error("Spotify API error:", error.response?.status, error.response?.data || error.message); + + // Fallback to embed HTML parsing + return await this.fetchPlaylistViaEmbedHtml(playlistId); + } + } + + /** + * Last resort: Parse embed HTML for track data + */ + private async fetchPlaylistViaEmbedHtml(playlistId: string): Promise { + try { + console.log("Spotify: Trying embed HTML parsing..."); + + const response = await axios.get( + `https://open.spotify.com/embed/playlist/${playlistId}`, + { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + }, + timeout: 10000, + } + ); + + const html = response.data; + const match = html.match(/

      3u7`IHHPVz@cR9^ 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 EU*^RPKmY&$ literal 0 HcmV?d00001 diff --git a/assets/screenshots/reddit post/vibe-overlay.png b/assets/screenshots/reddit post/vibe-overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..7b265d54dda30d56ef6898f70774f56bea0af5dc GIT binary patch literal 170851 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
      a3bU1CW-2ih_aybpZsd8FCB;o9(*mfVFyL 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эKHi94_lV5^6_2 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

    3u7`IHHPVz@cR9^ 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 EU*^RPKmY&$ literal 0 HcmV?d00001 diff --git a/assets/screenshots/mobile-podcasts.png b/assets/screenshots/mobile-podcasts.png new file mode 100644 index 0000000000000000000000000000000000000000..ca999510b16a4f0d8d42aeaa2eaeb38f134e806e GIT binary patch literal 76778 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

    !_7QwV%aU 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�CnQh>^?lBIF06nD5;eP7b}xXZewuRhX_4Q{ph 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�%_0G@|u2PL^dQz=1L|_14B=t-at{*M7Sl@qVZ;?r6{Y9l_$TpR<
V6uBG$;Yh_xR4TErUY(CrRljat)# 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
Kk16DS2 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