From 699bf0a6f34207b0eb549564b9a21be291041a89 Mon Sep 17 00:00:00 2001 From: bilulib Date: Fri, 9 May 2025 19:19:04 +0200 Subject: [PATCH] fix huntarr-install naming issues --- .gitignore | 1 + Huntarr.io-6.3.6/.github/FUNDING.yml | 15 + .../.github/workflows/docker-image.yml | 110 + Huntarr.io-6.3.6/.gitignore | 230 ++ Huntarr.io-6.3.6/Dockerfile | 24 + Huntarr.io-6.3.6/LICENSE | 674 +++++ Huntarr.io-6.3.6/README.md | 230 ++ Huntarr.io-6.3.6/docker-compose.yml | 17 + .../src/routes/api/settings/+server.js | 123 + .../frontend/src/routes/settings/+page.svelte | 116 + .../frontend/static/arrs/48-lidarr.png | Bin 0 -> 2203 bytes .../frontend/static/arrs/48-radarr.png | Bin 0 -> 987 bytes .../frontend/static/arrs/48-readarr.png | Bin 0 -> 1822 bytes .../frontend/static/arrs/48-sonarr.png | Bin 0 -> 824 bytes .../frontend/static/arrs/48-whisparr.png | Bin 0 -> 2123 bytes .../frontend/static/css/new-style.css | 1818 +++++++++++ .../frontend/static/css/style.css | 1540 ++++++++++ .../frontend/static/images/discord.png | Bin 0 -> 740 bytes Huntarr.io-6.3.6/frontend/static/js/apps.js | 739 +++++ .../frontend/static/js/apps/cleanuperr.js | 7 + .../frontend/static/js/apps/eros.js | 196 ++ .../frontend/static/js/apps/lidarr.js | 101 + .../frontend/static/js/apps/radarr.js | 75 + .../frontend/static/js/apps/readarr.js | 75 + .../frontend/static/js/apps/sonarr.js | 82 + .../frontend/static/js/apps/swaparr.js | 381 +++ .../frontend/static/js/apps/whisparr.js | 195 ++ .../frontend/static/js/direct-reset.js | 181 ++ .../frontend/static/js/github-sponsors.js | 269 ++ .../frontend/static/js/history.js | 345 +++ .../frontend/static/js/new-main.js | 2655 +++++++++++++++++ .../frontend/static/js/new-user.js | 363 +++ .../frontend/static/js/reset-stateful.js | 95 + .../frontend/static/js/settings_forms.js | 1912 ++++++++++++ .../frontend/static/js/stats-reset.js | 80 + .../frontend/static/js/theme-preload.js | 108 + Huntarr.io-6.3.6/frontend/static/js/user.js | 53 + Huntarr.io-6.3.6/frontend/static/js/utils.js | 71 + Huntarr.io-6.3.6/frontend/static/logo/128.png | Bin 0 -> 19356 bytes Huntarr.io-6.3.6/frontend/static/logo/16.png | Bin 0 -> 2511 bytes Huntarr.io-6.3.6/frontend/static/logo/256.png | Bin 0 -> 58862 bytes Huntarr.io-6.3.6/frontend/static/logo/32.png | Bin 0 -> 3807 bytes Huntarr.io-6.3.6/frontend/static/logo/40.png | Bin 0 -> 5874 bytes Huntarr.io-6.3.6/frontend/static/logo/400.png | Bin 0 -> 135009 bytes Huntarr.io-6.3.6/frontend/static/logo/48.png | Bin 0 -> 5874 bytes Huntarr.io-6.3.6/frontend/static/logo/512.png | Bin 0 -> 211042 bytes Huntarr.io-6.3.6/frontend/static/logo/64.png | Bin 0 -> 7680 bytes Huntarr.io-6.3.6/frontend/static/logo/800.png | Bin 0 -> 461392 bytes Huntarr.io-6.3.6/frontend/static/logo/864.png | Bin 0 -> 566444 bytes .../frontend/static/logo/Huntarr.svg | 10 + .../frontend/static/logo/apps/cleanuperr.png | Bin 0 -> 2971 bytes .../frontend/static/logo/huntarr.ico | Bin 0 -> 32038 bytes Huntarr.io-6.3.6/frontend/templates/base.html | 27 + .../templates/components/apps_section.html | 233 ++ .../components/cleanuperr_section.html | 426 +++ .../frontend/templates/components/footer.html | 68 + .../frontend/templates/components/head.html | 19 + .../templates/components/history_section.html | 703 +++++ .../templates/components/home_section.html | 959 ++++++ .../templates/components/logs_section.html | 426 +++ .../templates/components/scripts.html | 3 + .../components/settings_section.html | 69 + .../templates/components/sidebar.html | 245 ++ .../frontend/templates/components/topbar.html | 267 ++ .../templates/components/user_profile.html | 137 + .../frontend/templates/index.html | 50 + .../frontend/templates/login.html | 400 +++ .../frontend/templates/setup.html | 768 +++++ Huntarr.io-6.3.6/frontend/templates/user.html | 439 +++ Huntarr.io-6.3.6/main.py | 217 ++ Huntarr.io-6.3.6/requirements.txt | 7 + Huntarr.io-6.3.6/routes.py | 62 + Huntarr.io-6.3.6/src/primary/__init__.py | 6 + Huntarr.io-6.3.6/src/primary/api.py | 389 +++ Huntarr.io-6.3.6/src/primary/app.py | 129 + Huntarr.io-6.3.6/src/primary/app_manager.py | 41 + .../src/primary/apps/blueprints.py | 24 + Huntarr.io-6.3.6/src/primary/apps/eros.py | 171 ++ .../src/primary/apps/eros/__init__.py | 95 + Huntarr.io-6.3.6/src/primary/apps/eros/api.py | 517 ++++ .../src/primary/apps/eros/missing.py | 245 ++ .../src/primary/apps/eros/upgrade.py | 209 ++ .../src/primary/apps/eros_routes.py | 229 ++ Huntarr.io-6.3.6/src/primary/apps/lidarr.py | 242 ++ .../src/primary/apps/lidarr/__init__.py | 91 + .../src/primary/apps/lidarr/api.py | 419 +++ .../src/primary/apps/lidarr/missing.py | 355 +++ .../src/primary/apps/lidarr/upgrade.py | 184 ++ .../src/primary/apps/lidarr_routes.py | 127 + Huntarr.io-6.3.6/src/primary/apps/radarr.py | 147 + .../src/primary/apps/radarr/__init__.py | 53 + .../src/primary/apps/radarr/api.py | 337 +++ .../src/primary/apps/radarr/missing.py | 201 ++ .../src/primary/apps/radarr/upgrade.py | 126 + .../src/primary/apps/radarr_routes.py | 127 + Huntarr.io-6.3.6/src/primary/apps/readarr.py | 179 ++ .../src/primary/apps/readarr/__init__.py | 91 + .../src/primary/apps/readarr/api.py | 372 +++ .../src/primary/apps/readarr/missing.py | 177 ++ .../src/primary/apps/readarr/upgrade.py | 172 ++ .../src/primary/apps/readarr_routes.py | 127 + Huntarr.io-6.3.6/src/primary/apps/sonarr.py | 152 + .../src/primary/apps/sonarr/__init__.py | 94 + .../src/primary/apps/sonarr/api.py | 993 ++++++ .../src/primary/apps/sonarr/missing.py | 612 ++++ .../src/primary/apps/sonarr/upgrade.py | 605 ++++ .../src/primary/apps/sonarr_routes.py | 136 + Huntarr.io-6.3.6/src/primary/apps/swaparr.py | 181 ++ .../src/primary/apps/swaparr/__init__.py | 16 + .../src/primary/apps/swaparr/handler.py | 467 +++ .../src/primary/apps/swaparr_routes.py | 134 + Huntarr.io-6.3.6/src/primary/apps/whisparr.py | 171 ++ .../src/primary/apps/whisparr/__init__.py | 95 + .../src/primary/apps/whisparr/api.py | 475 +++ .../src/primary/apps/whisparr/missing.py | 227 ++ .../src/primary/apps/whisparr/upgrade.py | 191 ++ .../src/primary/apps/whisparr_routes.py | 337 +++ Huntarr.io-6.3.6/src/primary/auth.py | 554 ++++ Huntarr.io-6.3.6/src/primary/background.py | 543 ++++ Huntarr.io-6.3.6/src/primary/config.py | 170 ++ .../src/primary/default_configs/eros.json | 18 + .../src/primary/default_configs/general.json | 14 + .../src/primary/default_configs/lidarr.json | 17 + .../src/primary/default_configs/radarr.json | 16 + .../src/primary/default_configs/readarr.json | 16 + .../src/primary/default_configs/sonarr.json | 17 + .../src/primary/default_configs/swaparr.json | 8 + .../src/primary/default_configs/whisparr.json | 17 + .../src/primary/history_manager.py | 471 +++ Huntarr.io-6.3.6/src/primary/keys_manager.py | 31 + Huntarr.io-6.3.6/src/primary/routes/common.py | 444 +++ .../src/primary/routes/history_routes.py | 51 + Huntarr.io-6.3.6/src/primary/routes/main.py | 54 + Huntarr.io-6.3.6/src/primary/server.py | 20 + .../src/primary/settings_manager.py | 338 +++ Huntarr.io-6.3.6/src/primary/state.py | 322 ++ .../src/primary/stateful_manager.py | 361 +++ .../src/primary/stateful_routes.py | 115 + Huntarr.io-6.3.6/src/primary/stats_manager.py | 241 ++ .../src/primary/utils/__init__.py | 7 + .../src/primary/utils/app_utils.py | 24 + .../src/primary/utils/history_utils.py | 41 + .../src/primary/utils/log_handler.py | 37 + Huntarr.io-6.3.6/src/primary/utils/logger.py | 230 ++ .../src/primary/utils/logging_config.py | 33 + .../src/primary/utils/migrate_settings.py | 79 + Huntarr.io-6.3.6/src/primary/web_server.py | 887 ++++++ .../src/primary/windows_service.py | 198 ++ Huntarr.io-6.3.6/src/routes.py | 82 + .../src/routes/api/settings/+server.js | 91 + .../src/routes/settings/+page.svelte | 115 + Huntarr.io-6.3.6/version.txt | 1 + ct/huntarr.sh | 2 +- install/huntarr-install.sh | 28 +- 154 files changed, 34570 insertions(+), 7 deletions(-) create mode 100644 .gitignore create mode 100644 Huntarr.io-6.3.6/.github/FUNDING.yml create mode 100644 Huntarr.io-6.3.6/.github/workflows/docker-image.yml create mode 100644 Huntarr.io-6.3.6/.gitignore create mode 100644 Huntarr.io-6.3.6/Dockerfile create mode 100644 Huntarr.io-6.3.6/LICENSE create mode 100644 Huntarr.io-6.3.6/README.md create mode 100644 Huntarr.io-6.3.6/docker-compose.yml create mode 100644 Huntarr.io-6.3.6/frontend/src/routes/api/settings/+server.js create mode 100644 Huntarr.io-6.3.6/frontend/src/routes/settings/+page.svelte create mode 100644 Huntarr.io-6.3.6/frontend/static/arrs/48-lidarr.png create mode 100644 Huntarr.io-6.3.6/frontend/static/arrs/48-radarr.png create mode 100644 Huntarr.io-6.3.6/frontend/static/arrs/48-readarr.png create mode 100644 Huntarr.io-6.3.6/frontend/static/arrs/48-sonarr.png create mode 100644 Huntarr.io-6.3.6/frontend/static/arrs/48-whisparr.png create mode 100644 Huntarr.io-6.3.6/frontend/static/css/new-style.css create mode 100644 Huntarr.io-6.3.6/frontend/static/css/style.css create mode 100644 Huntarr.io-6.3.6/frontend/static/images/discord.png create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/cleanuperr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/eros.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/lidarr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/radarr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/readarr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/sonarr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/swaparr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/apps/whisparr.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/direct-reset.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/github-sponsors.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/history.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/new-main.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/new-user.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/reset-stateful.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/settings_forms.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/stats-reset.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/theme-preload.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/user.js create mode 100644 Huntarr.io-6.3.6/frontend/static/js/utils.js create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/128.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/16.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/256.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/32.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/40.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/400.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/48.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/512.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/64.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/800.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/864.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/Huntarr.svg create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/apps/cleanuperr.png create mode 100644 Huntarr.io-6.3.6/frontend/static/logo/huntarr.ico create mode 100644 Huntarr.io-6.3.6/frontend/templates/base.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/apps_section.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/cleanuperr_section.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/footer.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/head.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/history_section.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/home_section.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/logs_section.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/scripts.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/settings_section.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/sidebar.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/topbar.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/components/user_profile.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/index.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/login.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/setup.html create mode 100644 Huntarr.io-6.3.6/frontend/templates/user.html create mode 100644 Huntarr.io-6.3.6/main.py create mode 100644 Huntarr.io-6.3.6/requirements.txt create mode 100644 Huntarr.io-6.3.6/routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/app.py create mode 100644 Huntarr.io-6.3.6/src/primary/app_manager.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/blueprints.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/eros.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/eros/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/eros/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/eros/missing.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/eros/upgrade.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/eros_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/lidarr.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/lidarr/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/lidarr/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/lidarr/missing.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/lidarr/upgrade.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/lidarr_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/radarr.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/radarr/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/radarr/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/radarr/missing.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/radarr/upgrade.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/radarr_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/readarr.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/readarr/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/readarr/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/readarr/missing.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/readarr/upgrade.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/readarr_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/sonarr.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/sonarr/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/sonarr/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/sonarr/missing.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/sonarr/upgrade.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/sonarr_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/swaparr.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/swaparr/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/swaparr/handler.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/swaparr_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/whisparr.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/whisparr/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/whisparr/api.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/whisparr/missing.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/whisparr/upgrade.py create mode 100644 Huntarr.io-6.3.6/src/primary/apps/whisparr_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/auth.py create mode 100644 Huntarr.io-6.3.6/src/primary/background.py create mode 100644 Huntarr.io-6.3.6/src/primary/config.py create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/eros.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/general.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/lidarr.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/radarr.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/readarr.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/sonarr.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/swaparr.json create mode 100644 Huntarr.io-6.3.6/src/primary/default_configs/whisparr.json create mode 100644 Huntarr.io-6.3.6/src/primary/history_manager.py create mode 100644 Huntarr.io-6.3.6/src/primary/keys_manager.py create mode 100644 Huntarr.io-6.3.6/src/primary/routes/common.py create mode 100644 Huntarr.io-6.3.6/src/primary/routes/history_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/routes/main.py create mode 100644 Huntarr.io-6.3.6/src/primary/server.py create mode 100644 Huntarr.io-6.3.6/src/primary/settings_manager.py create mode 100644 Huntarr.io-6.3.6/src/primary/state.py create mode 100644 Huntarr.io-6.3.6/src/primary/stateful_manager.py create mode 100644 Huntarr.io-6.3.6/src/primary/stateful_routes.py create mode 100644 Huntarr.io-6.3.6/src/primary/stats_manager.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/__init__.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/app_utils.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/history_utils.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/log_handler.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/logger.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/logging_config.py create mode 100644 Huntarr.io-6.3.6/src/primary/utils/migrate_settings.py create mode 100644 Huntarr.io-6.3.6/src/primary/web_server.py create mode 100644 Huntarr.io-6.3.6/src/primary/windows_service.py create mode 100644 Huntarr.io-6.3.6/src/routes.py create mode 100644 Huntarr.io-6.3.6/src/routes/api/settings/+server.js create mode 100644 Huntarr.io-6.3.6/src/routes/settings/+page.svelte create mode 100644 Huntarr.io-6.3.6/version.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7dd35dd --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +Huntarr.io-6.3.6/ diff --git a/Huntarr.io-6.3.6/.github/FUNDING.yml b/Huntarr.io-6.3.6/.github/FUNDING.yml new file mode 100644 index 0000000..8d6142a --- /dev/null +++ b/Huntarr.io-6.3.6/.github/FUNDING.yml @@ -0,0 +1,15 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +thanks_dev: # Replace with a single thanks.dev username +paypal: # https://www.paypal.com/donate?hosted_button_id=58AYJ68VVMGSC diff --git a/Huntarr.io-6.3.6/.github/workflows/docker-image.yml b/Huntarr.io-6.3.6/.github/workflows/docker-image.yml new file mode 100644 index 0000000..a131aed --- /dev/null +++ b/Huntarr.io-6.3.6/.github/workflows/docker-image.yml @@ -0,0 +1,110 @@ +name: Docker Build and Push +on: + push: + branches: + - '*' # This will trigger on any branch push + tags: + - "*" # This will trigger on any tag push + pull_request: + branches: + - main +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + # 1) Check out your repository code with full depth + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # 2) List files to verify huntarr.py is present + - name: List files in directory + run: ls -la + + # 3) Set up QEMU for multi-architecture builds + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + with: + platforms: arm64,amd64 + + # 4) Set up Docker Buildx + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + # 5) Log in to Docker Hub + - name: Log in to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + # 6) Extract metadata (version, branch name, etc.) + - name: Extract metadata + id: meta + run: | + if [[ "${{ github.ref }}" == refs/tags/* ]]; then + echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + echo "IS_TAG=true" >> $GITHUB_OUTPUT + else + echo "BRANCH=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT + echo "IS_TAG=false" >> $GITHUB_OUTPUT + fi + + # 7a) Build & Push if on 'main' branch + - name: Build and Push (main) + if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + uses: docker/build-push-action@v3 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + huntarr/huntarr:latest + huntarr/huntarr:${{ github.sha }} + + # 7b) Build & Push if on 'dev' branch + - name: Build and Push (dev) + if: github.ref == 'refs/heads/dev' && github.event_name != 'pull_request' + uses: docker/build-push-action@v3 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + huntarr/huntarr:dev + huntarr/huntarr:${{ github.sha }} + + # 7c) Build & Push if it's a tag/release + - name: Build and Push (release) + if: steps.meta.outputs.IS_TAG == 'true' && github.event_name != 'pull_request' + uses: docker/build-push-action@v3 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + huntarr/huntarr:${{ steps.meta.outputs.VERSION }} + huntarr/huntarr:latest + + # 7d) Build & Push for any other branch + - name: Build and Push (feature branch) + if: github.ref != 'refs/heads/main' && github.ref != 'refs/heads/dev' && steps.meta.outputs.IS_TAG != 'true' && github.event_name != 'pull_request' + uses: docker/build-push-action@v3 + with: + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + huntarr/huntarr:${{ steps.meta.outputs.BRANCH }} + huntarr/huntarr:${{ github.sha }} + + # 7e) Just build on pull requests + - name: Build (PR) + if: github.event_name == 'pull_request' + uses: docker/build-push-action@v3 + with: + context: . + push: false + platforms: linux/amd64,linux/arm64 \ No newline at end of file diff --git a/Huntarr.io-6.3.6/.gitignore b/Huntarr.io-6.3.6/.gitignore new file mode 100644 index 0000000..ddafd42 --- /dev/null +++ b/Huntarr.io-6.3.6/.gitignore @@ -0,0 +1,230 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# vertual enviornments +.venv/ + +# React files +.idea/ +.vscode/ +build/ +*.tgz +template/src/__tests__/__snapshots__/ +lerna-debug.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/.changelog +.npm/ + +.DS_STORE +node_modules +scripts/flow/*/.flowconfig +.flowconfig +*~ +*.pyc +.grunt +_SpecRunner.html +__benchmarks__ +build/ +remote-repo/ +coverage/ +.module-cache +fixtures/dom/public/react-dom.js +fixtures/dom/public/react.js +test/the-files-to-test.generated.js +*.log* +chrome-user-data +*.sublime-project +*.sublime-workspace +.idea +*.iml +.vscode +*.swp +*.swo + +packages/react-devtools-core/dist +packages/react-devtools-extensions/chrome/build +packages/react-devtools-extensions/chrome/*.crx +packages/react-devtools-extensions/chrome/*.pem +packages/react-devtools-extensions/firefox/build +packages/react-devtools-extensions/firefox/*.xpi +packages/react-devtools-extensions/firefox/*.pem +packages/react-devtools-extensions/shared/build +packages/react-devtools-extensions/.tempUserDataDir +packages/react-devtools-fusebox/dist +packages/react-devtools-inline/dist +packages/react-devtools-shell/dist +packages/react-devtools-timeline/dist + + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc \ No newline at end of file diff --git a/Huntarr.io-6.3.6/Dockerfile b/Huntarr.io-6.3.6/Dockerfile new file mode 100644 index 0000000..91d4421 --- /dev/null +++ b/Huntarr.io-6.3.6/Dockerfile @@ -0,0 +1,24 @@ +FROM python:3.9-slim + +WORKDIR /app + +# Install required packages from the root requirements file +COPY requirements.txt /app/ +RUN pip install --no-cache-dir -r requirements.txt + +# Copy application code +COPY . /app/ + +# Create necessary directories +RUN mkdir -p /config/settings /config/stateful /config/user /config/logs +RUN chmod -R 755 /config + +# Set environment variables +ENV PYTHONPATH=/app +# ENV APP_TYPE=sonarr # APP_TYPE is likely managed via config now, remove if not needed + +# Expose port +EXPOSE 9705 + +# Run the main application using the new entry point +CMD ["python3", "main.py"] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/LICENSE b/Huntarr.io-6.3.6/LICENSE new file mode 100644 index 0000000..b01123c --- /dev/null +++ b/Huntarr.io-6.3.6/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/Huntarr.io-6.3.6/README.md b/Huntarr.io-6.3.6/README.md new file mode 100644 index 0000000..dbcd486 --- /dev/null +++ b/Huntarr.io-6.3.6/README.md @@ -0,0 +1,230 @@ +

Huntarr - Find Missing & Upgrade Media Items

+ +

+ Huntarr Logo +

+ +--- + +

Want to Help? Click the Star in the Upper-Right Corner! ⭐

+ + + +| Application | Status | +| :---------- | :------------ | +| Sonarr | **✅ Ready** | +| Radarr | **✅ Ready** | +| Lidarr | **✅ Ready** | +| Readarr | **✅ Ready** | +| Whisparr v2 | **✅ Ready** | +| Whisparr v3 | **✅ Ready** | +| Bazarr | **❌ Not Ready** | + + +Keep in mind this is very early in program development. If you have a very special hand picked collection (because some users are extra special), test before you deploy. + +## Table of Contents +- [Overview](#overview) +- [Other Projects](#other-projects) +- [Community](#community) +- [Indexers Approving of Huntarr](#indexers-approving-of-huntarr) +- [How It Works](#how-it-works) +- [Web Interface](#web-interface) + - [How to Access](#how-to-access) + - [Web UI Settings](#web-ui-settings) + - [Volume Mapping](#volume-mapping) +- [Installation Methods](#installation-methods) + - [Docker Run](#docker-run) + - [Docker Compose](#docker-compose) + - [Unraid Users](#unraid-users) +- [Tips](#tips) +- [Troubleshooting](#troubleshooting) +- [Change Log](#change-log) + +## Overview + +This application continually searches your media libraries for missing content and items that need quality upgrades. It automatically triggers searches for both missing items and those below your quality cutoff. It's designed to run continuously while being gentle on your indexers, helping you gradually complete your media collection with the best available quality. + +For detailed documentation, please visit our [Wiki](https://github.com/plexguide/Huntarr/wiki). + +## Other Projects + +* [Unraid Intel ARC Deployment](https://github.com/plexguide/Unraid_Intel-ARC_Deployment) - Convert videos to AV1 Format (I've saved 325TB encoding to AV1) +* Visit [PlexGuide](https://plexguide.com) for more great scripts + +## Community + +

+ Join the community on Discord! +
+ + Discord + +

+ +## PayPal Donations – For My Daughter's College Fund + +My 12-year-old daughter is passionate about singing, dancing, and exploring STEM. She consistently earns A-B honors! Every donation goes directly into her college fund! + +[![Donate with PayPal button](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/donate?hosted_button_id=58AYJ68VVMGSC) + +## Indexers Approving of Huntarr: +* https://ninjacentral.co.za + +## How It Works + +### 🔄 Continuous Automation Cycle + +#### 1️⃣ Connect & Analyze +Huntarr connects to your Sonarr/Radarr/Lidarr/Readarr instance and analyzes your media library to identify both missing content and potential quality upgrades. + +#### 2️⃣ Hunt Missing Content +- 📊 **Smart Selection:** Choose between random or sequential processing +- 🔍 **Efficient Refreshing:** Optionally skip metadata refresh to reduce disk I/O +- 🔮 **Future-Aware:** Automatically skip content with future release dates +- 🎯 **Precise Control:** Set exactly how many items to process per cycle + +#### 3️⃣ Hunt Quality Upgrades +- ⬆️ **Quality Improvement:** Find content below your quality cutoff settings +- 📦 **Batch Processing:** Configure exactly how many upgrades to process at once +- 📚 **Large Library Support:** Smart pagination handles even massive libraries +- 🔀 **Flexible Modes:** Choose between random or sequential processing + +#### 4️⃣ State Management +- 📝 **History Tracking:** Remembers which items have been processed +- 💾 **Persistent Storage:** State data is saved in the `/config` directory +- ⏱️ **Automatic Reset:** State is cleared after your configured time period (default: 7 days) + +#### 5️⃣ Repeat & Rest +Huntarr waits for your configured interval (adjustable in settings) before starting the next cycle. This ensures your indexers aren't overloaded while maintaining continuous improvement of your library. + +## Web Interface + +Huntarr's live homepage will provide you statics about how many hunts have been pursed regarding missing media and upgrade searches! Note: Numbers reflected are but all required for testing... damn you Whisparr! + +

+ image +
+ Homepage +

+ +Huntarr includes a real-time log viewer and settings management web interface that allows you to monitor and configure its operation directly from your browser. + +

+ image +
+ Logger UI +

+ +### How to Access + +The web interface is available on port 9705. Simply navigate to: + +``` +http://YOUR_SERVER_IP:9705 +``` + +The URL will be displayed in the logs when Huntarr starts, using the same hostname you configured for your API_URL. + +### Web UI Settings + +The web interface allows you to configure all of Huntarr's settings: + +

+ image +
+ Settings UI +

+ +### Volume Mapping + +To ensure data persistence, make sure you map the `/config` directory to a persistent volume on your host system: + +```bash +-v /your-path/appdata/huntarr:/config +``` + +--- + +## Installation Methods + +### Docker Run + +The simplest way to run Huntarr is via Docker (all configuration is done via the web UI): + +```bash +docker run -d --name huntarr \ + --restart always \ + -p 9705:9705 \ + -v /your-path/huntarr:/config \ + -e TZ=America/New_York \ + huntarr/huntarr:latest +``` + +To check on the status of the program, you can use the web interface at http://YOUR_SERVER_IP:9705 or check the logs with: +```bash +docker logs huntarr +``` + +### Docker Compose + +For those who prefer Docker Compose, add this to your `docker-compose.yml` file: + +```yaml +services: + huntarr: + image: huntarr/huntarr:latest + container_name: huntarr + restart: always + ports: + - "9705:9705" + volumes: + - /your-path/huntarr:/config + environment: + - TZ=America/New_York +``` + +Then run: + +```bash +docker-compose up -d huntarr +``` + +### Unraid Users + +Run this from Command Line in Unraid: + +```bash +docker run -d --name huntarr \ + --restart always \ + -p 9705:9705 \ + -v /mnt/user/appdata/huntarr:/config \ + -e TZ=America/New_York \ + huntarr/huntarr:latest +``` +## Tips + +- **First-Time Setup**: Navigate to the web interface after installation to create your admin account with 2FA option +- **API Connections**: Configure connections to your *Arr applications through the dedicated settings pages +- **Search Frequency**: Adjust Sleep Duration (default: 900 seconds) based on your indexer's rate limits. +- **Batch Processing**: Set Hunt Missing and Upgrade values to control how many items are processed per cycle +- **Queue Management**: Use Minimum Download Queue Size to pause searching when downloads are backed up +- **Skip Processing**: Enable Skip Series/Movie Refresh to significantly reduce disk I/O and database load +- **Future Content**: Keep Skip Future Items enabled to avoid searching for unreleased content +- **Authentication**: Enable two-factor authentication for additional security on your Huntarr instance + +## Troubleshooting + +- **API Connection Issues**: Verify your API key and URL in the Settings page (check for missing http:// or https://) +- **Config URLs**: It is best practice to omit the trailing slash (/) at the end of the URL for each service. i.e. For Sonarr, instead of http://10.10.10.1:8989/ use http://10.10.10.1:8989. This is the most common cause of errors seen in the log each time a cycle runs. +- **Authentication Problems**: If you forget your password, delete `/config/user/credentials.json` and restart +- **Two-Factor Authentication**: If locked out of 2FA, remove credentials file to reset your account +- **Web Interface Not Loading**: Confirm port 9705 is correctly mapped and not blocked by firewalls +- **Logs Not Showing**: Check permissions on the `/config/logs/` directory inside your container +- **Missing State Data**: State files in `/config/stateful/` track processed items; verify permissions +- **Docker Volume Issues**: Ensure your volume mount for `/config` has correct permissions and ownership +- **Command Timeouts**: Adjust command_wait_attempts and command_wait_delay in advanced settings +- **Debug Information**: Enable Debug Mode temporarily to see detailed API responses in the logs + +## Change Log +Visit: https://github.com/plexguide/Huntarr/releases/ diff --git a/Huntarr.io-6.3.6/docker-compose.yml b/Huntarr.io-6.3.6/docker-compose.yml new file mode 100644 index 0000000..5ad7715 --- /dev/null +++ b/Huntarr.io-6.3.6/docker-compose.yml @@ -0,0 +1,17 @@ +services: + huntarr: + build: + context: . + dockerfile: Dockerfile + container_name: huntarr + ports: + - "9705:9705" + volumes: + - huntarr-config:/config + environment: + - TZ=America/New_York + restart: unless-stopped + +volumes: + huntarr-config: + name: huntarr-config \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/src/routes/api/settings/+server.js b/Huntarr.io-6.3.6/frontend/src/routes/api/settings/+server.js new file mode 100644 index 0000000..ce00f33 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/src/routes/api/settings/+server.js @@ -0,0 +1,123 @@ +import fs from 'fs'; +import path from 'path'; +import { json } from '@sveltejs/kit'; +import { invalidateCache } from '$lib/config'; // Assuming config.js handles huntarr.json read/write + +const CONFIG_FILE = path.resolve('huntarr.json'); // Path to the main config file +const DEFAULT_CONFIGS_DIR = path.resolve('src/primary/default_configs'); // Path to new default configs + +// Helper function to load default settings for a specific app +function loadDefaultAppSettings(appName) { + const defaultFile = path.join(DEFAULT_CONFIGS_DIR, `${appName}.json`); + try { + if (fs.existsSync(defaultFile)) { + const data = fs.readFileSync(defaultFile, 'utf8'); + return JSON.parse(data); + } else { + console.warn(`Default settings file not found for app: ${appName}`); + return {}; + } + } catch (error) { + console.error(`Error loading default settings for ${appName}:`, error); + return {}; + } +} + +// Helper function to get all default settings combined +function getAllDefaultSettings() { + const allDefaults = {}; + const appNames = ['sonarr', 'radarr', 'lidarr', 'readarr']; // Define known apps + appNames.forEach(appName => { + const defaults = loadDefaultAppSettings(appName); + if (Object.keys(defaults).length > 0) { + allDefaults[appName] = defaults; + } + }); + // Add a default 'ui' section if needed by the frontend directly + // allDefaults.ui = { theme: 'dark', ... }; + return allDefaults; +} + + +// Helper to read config, creating it from defaults if it doesn't exist +function readConfig() { + try { + if (fs.existsSync(CONFIG_FILE)) { + const data = fs.readFileSync(CONFIG_FILE, 'utf8'); + // Handle potentially empty file + if (data.trim() === '') { + console.warn(`Config file ${CONFIG_FILE} is empty. Creating with defaults.`); + const defaultSettings = getAllDefaultSettings(); + writeConfig(defaultSettings); // Write defaults back + return defaultSettings; + } + let parsedData = JSON.parse(data); + + // Optional: Merge with defaults to ensure all keys exist? + // This might be better handled client-side or on save. + // For now, just return what's in the file. If file is missing/empty, defaults are used. + + // Remove legacy sections if present + if (parsedData.global) delete parsedData.global; + // Keep UI section if it exists and is used + // if (parsedData.ui) ... + + return parsedData; + } else { + // Create file with defaults if it doesn't exist + console.log(`Config file ${CONFIG_FILE} not found. Creating with defaults.`); + const defaultSettings = getAllDefaultSettings(); + writeConfig(defaultSettings); // Write defaults to the file + return defaultSettings; + } + } catch (error) { + console.error('Error reading or parsing config file:', error); + // Fallback to defaults in case of error + return getAllDefaultSettings(); + } +} + +// Helper to write config +function writeConfig(config) { + try { + const configDir = path.dirname(CONFIG_FILE); + if (!fs.existsSync(configDir)) { + fs.mkdirSync(configDir, { recursive: true }); + } + fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8'); + invalidateCache(); // Invalidate cache after writing + return true; + } catch (error) { + console.error('Error writing config file:', error); + return false; + } +} + +// GET request handler +export async function GET() { + const config = readConfig(); + return json(config); +} + +// POST request handler +export async function POST({ request }) { + try { + const newSettings = await request.json(); + + // Optional: Validate or sanitize newSettings here + + // Read current config to potentially merge or just overwrite + // let currentConfig = readConfig(); + // Merge logic could go here if needed, e.g., preserving a 'ui' section + // For simplicity, this example overwrites the entire config + + if (writeConfig(newSettings)) { + return json({ success: true, message: 'Settings saved successfully.' }); + } else { + return json({ success: false, message: 'Failed to write settings.' }, { status: 500 }); + } + } catch (error) { + console.error('Error processing POST request:', error); + return json({ success: false, message: 'Invalid request data.' }, { status: 400 }); + } +} diff --git a/Huntarr.io-6.3.6/frontend/src/routes/settings/+page.svelte b/Huntarr.io-6.3.6/frontend/src/routes/settings/+page.svelte new file mode 100644 index 0000000..4f58c4c --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/src/routes/settings/+page.svelte @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/static/arrs/48-lidarr.png b/Huntarr.io-6.3.6/frontend/static/arrs/48-lidarr.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff9a0cb75e0afba7592568da2506e6470426d2c GIT binary patch literal 2203 zcmb_c`8(7LAN`VT7&F6|vCIr(oneT?m_o?DGctp+FX^I;=vE3L)L3pr_FWVa*>b(M z%6hq6(PBvUu@56nk?Vclf8jmPbIy6rFXyMv=R9z*GZz+=5(EH1*wVs;eC!(krND_} z^lqmdn)cU=N)YB^)vn%o%zt!)wR97&05=($?=A&NW(!8_S)9y+~@Jx&l3|9 z3Bxr&ngds|EsT8nq}oY>DgledN+QI0z@ z?tj~7GMRJpbA3}|HJ{(c4prTMR~6q~7TH!nr_)_uK5%z;2l6SvBS!~&2d)P;K)@Ne z3rWd@$Yo0q#-Si6gfLQ+TZo?*0m0+(02=zJrvh*z0Di>zm8JESRlxI9?R0PIM3Z8n zKPJ>NdA#9nM{!6e8cl2JG9`C}{v?wU#cW(wRg1_c>Nc%1|Jo`GCC z1B8%(D_RgUHGrZDm@28rD$1ZRa7iQ}2LnX;0Rir#Uq?s#KRN3=+pC*n^HU!_etbRN z+y3{v!rAU;W1aMY7co8MiS0$dcNB)aEr@B)OHWUCsEM|#jHJvWCQ}*W(?gm(gvpn`1V%kaq`if8;Mc|}37!Lb=W%B#+ok@g~?VJD} zQP_{2<>|@c*4n~Ux`(c^yp{7F#WE?v84Uou36>^C7jAlFX2o6ivli>c4O}H&@?(uO zB@lh4nnP+sjs^91^Ilpz-R1_d`nKn=&EADCp3`;qMdvF0%NFNRL`5yU1{SM<4|mJ1 zOIx4b$%AP^L@JQcefMp)BgHjlqQP>?oN@|x-}kg=)a+>y$t<@F2D;>ZmHrW~V=VjH zOD$d8s@KMWQ_ixzYVH$JZF9NUFS9}axX`SsZ9G5kt!+jWAs`ES>uzq9kMmOsw4}0C zb8;}ZKE#qo4?p21_0szZ_6!E;Vs4J!D(4w@agAqoksrk?(8x1u!XY4FA)HgRwl>e} zwMuxaFqRr-q;5Bg=O?se?u&7!X!3Lyzi0DQkTw zhS-E%BVct`IbRM_Ph<79loI>lz@sGk#26_NM-+(3R*d>}{(z3g)7N|^ELJ1(mq6X= z3K2CuJg;9meuPGQ_u;lVPg5FKEVy&$V8cu%Nk)=w+?`(Dsszc*$g-H3&j#H|IvPp@cOFpSk8C96om*=A;RUoy!eR3@BMc;2SpiIOJw=&Ps=$P=y9A%By_8nNn>B3;@J1C7tbSAGM{fu znx9@C$ydCi`yoJT6KBHm=f*bXWp*asoJ0^w_&Wjb=#WLoc%Bh z_mmqP&OvrXLCFVfLetYt<$IY;&&}AS$!4!)QB7{s;2HO7vp*bMVX=Wr&^fTwRdX^G z0{dZ?`Q+RUECBC(j!uqD!o+1pB#1FI>Z@A)C5%lR zq8-vXU3`Pw@$MhtkW^0--Z*ZP;`;2+*`aUly%GK& z<7}>Bce%cXzRes)e6C^DMbs%)eDXN+GDtLh)(R%H zPPiY8FdGwl*H|uD{l2}TR1ec6yEKZRBs!v-dz|{)trw**FAWD-^e>g4_M@Bx^8Iho zV*wPnyNay5oAHpfy0H_Q@Mh4)Wu%fC8Avs+|FnRX3tl9Y`>gNZeqA&Y8>`?t+MP&g zY3k?g(TKiR$>^MPfN0eWs7HjU4zIjw`$1{dz-3%$s5fF>!O#5Y8gC$ObU>9tFAB9N z#lo8yDeT6Y7M*wTy3=CLjo$9G{U7n+bx%odQSu==6*tD_c5^C`6CJ^Sc5DT$4<;@7 zZT0?|sgC>Rr#W{w;^xt!NlN=-*iL7i!4VgoQylgsJ|OvcwE;_0JCoY;Ua|iI5$6Df literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/arrs/48-radarr.png b/Huntarr.io-6.3.6/frontend/static/arrs/48-radarr.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2151259b92f49d4227ace09d7c6bce6aac522b GIT binary patch literal 987 zcmV<110?*3P)K2@dBE)2N=ngFpA?D8_j3iwr$(CZJWWfZQHiFwr%t5KgqJvx6qn9$!}Qo-8#*} zAc-v6P{Xg||G_}l!Zr97-7yTm<9VEqwm1&DV(!-dEBcxFo zhr#cSSx`_2;9g`pa`4UgD#zdt$FArJIgG}Y9Ti|D$Z)*T<`|5E9J*p{)RZ&8iI8E5 z9PQe02}VE;Phj101-KtFEN5xIIPQfUCgXu}1o*%+fZ1<#bjNhaVGq=oD!}`J0nGjf z;}^)`ee6|=0IypE_)j}_#U#jL3O*=yfafg%LTgpx9gKw>&O}2o0zBazz`y1?cph^2 z8z&SR;33}t`gZ*U9`>wTjb-r%WHAl@VbyX3Xo1il>!IHB8pmTG3Xa74ST0nESN~&*3~< z<8uN690mpW2g{>6VDKAa6!x0?^VwL|*5M4uaBxI`6Cn?SaZccrCW)7zxrX|7JQXq= z77^eK$YLDsLMm`-aT7*EhFYHjCqafI@(A!MvVphy{^$?o;#=f6$Z&K(fL_=jaMhN^ z=a5BD--1V3Hnz+FXF_vz#(Ag=e4O6{ISj%|zC{m*3@1edxER8PNCZAyF2ZQf-HTL6 z;X@$9sSyDV34DT9VGaBXISj-$`79|9gbb$_Y0vcm$YB63KwZ8UIsh`9Rp8)n!9>X6 zHe?IErS^ji=jBnS3R`(>Zp}bXtX8aztz96)`GGaIz%!7;|2U!?=K~i8Zj4QU9F9S2 zDfUK}z%*zfmpl5@VtdG85`IRil-ui-IVN=1J05Z$LJpr{k8&MyRAF^IiQYITV$$_B zCP5B6qc$$budUb%vmlEJcrp&ht-E4#?2fDOC*<%nHjl%ty()%ag6BhJ95zK&oKEal z!he|Nc(_~<_ka300*~Vt3`alwfUC_lYMetn2H%yB7Ep`-u+002ov JPDHLkV1kJXx3mBN literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/arrs/48-readarr.png b/Huntarr.io-6.3.6/frontend/static/arrs/48-readarr.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc680d5b56127c361cdeb1ce2b9271e621094ff GIT binary patch literal 1822 zcmV+(2jTdMP)gw(6?8(T;>gwv>-{0Wi;Njun*45R)zrW_?<>~0?)zsA0)6?tg>*(m{;Nalr=H}<- z=G@!c#KOYY*4DMMvf<$1*Vfj+y}ilE$mHbY*nUvxVXEFjGJt1l`%1WCnw?H;NsNO;Ly;~u&}YNuE?F8 zZfIy!OG}|jN@Yq)PDe*$Iy!GGEbHp(&$YF#}J<=ouk*x2LN*2|=%w2+X%j*h*DhqZNev~qHoY;0&^VyRtS zqfJe2N=i^SHC-% zl$4K;sf~?{hlikshN^{yyMu$Le0;5UcXx4dn{RJ&Y;1a3T9Q~;T~=0&PfvDDO>9j~ zkw{2~K|yaoKxjHTk2pAPI5=!LICwTTYBe>$xfwJ7001s@QchC<{{1`j(5$F{6z%M6 zYW3#h+Rds$EE(;BBpTV+&~R_>gjG}~8Vm8{t!`E^AZ?&s>i_@*L`g(JR7l5-miJ%N zP!z?}&{8TxEV9JCC-{*Ls@iS*GlqJlXov5HfYwmP;ngqrqNs~{X8=`z!lyU(L0@2cG zQAz(OpBFm;h_p@CW6skq*BNJ#wMh#^6JqC$S051>2LMKsx;}?NR!mO4+GGTPxX6gV z>nBg60kozPJzK5PXjCkuH|rz-^dvDce{nQ`L}zADWhl?i&vV%Aj=cQra)SyP7Kx6T zF8~%#1jx+NBko$aeeGsCFyYN>x3AlUsL#p-m>44%52-h*D^OMWz~UAxl4XCT3ftAI z$v+~3<~s>s^-IK^gBJKpmcgBf=Lzv=9`hn;$W$ZdZta3`)U`DiQJo2NXXQR=}LEw)Y=LQ_f&D7N2}0H*fqYk{b$ z(YxiuvVi^cOQkmf z$Q9JmG-yyWhR=u611cyx*8;5{-)sS29VrfI&wB%^wJa06p25V+BZ|5&()A%(n}H^bHxp=M}B_ z$P@u2P%;1~VxDi02-qkBYbBFr;-6&sIj;04g<6t*Psg^ znVQJ~9ucrc1gzY`1MvW7$dEki!vTRI@sn;91DixZ^Qpk37jetlx*`l<;g>aq+cpVu!NZ|}RT`!mK$$vb0$~B(1c;KN{WfzWWAxv^ zXvPiJW|mQ`V&g#KH?rE|finK2e)`6r*x`ZV+FYz4MkbA=I87O|%5JZtj_Z*fW!!2G zIJ&(etK`l2HDbpF3pBRW9pZt4e%np3UGST+k(g3MkljZUg0=ho#O@3G3;e*|b6#+> zc3;8T{bVXgF@ivGJBIs*hI`yyT%eTlfg&K-$SUzi)>RT&HNAZ`rv}-`YA?}g{q^(3 zp*V>qNVQoQij3Y|&4%LS|BKxNT<{9 literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/arrs/48-sonarr.png b/Huntarr.io-6.3.6/frontend/static/arrs/48-sonarr.png new file mode 100644 index 0000000000000000000000000000000000000000..00a4a7db9bf3510d76347c92bfa17bac712fb6c0 GIT binary patch literal 824 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s8v}eoT!HjEB7l{BAY2uY4Ma_? z6V&s%fsDY=RK4gDoupdL%vOjphBNAut~3rzSL@uL40N{k#lxSx z3<8UV^bRk)EAsqy6)M>oJFnZy-ip&+^KSjs#nU(bJ{+nLA)uO5 zE2SRb`nhk{tKTL`do~IyGd$n5=JjJ&o6h4+8k&Fih@btd)bZQ#{FBSvE!L&+8dG)3 z(){~vPMrCB@%vG|XWNAfg^Cya|GA23H$yOsk3hEkwDpJdx4mw=->R|BJ9vqYP)7Wp zb+?U$%%V4@#q!KZl91g0qh0pg_W!Z-Gm{?sUr1WituJZZ6T44y8bh+%k9D=_fkpE_ z1^;~aNc*+HvVE~VGhNM`)ED=BHQ>4EXp!=F3F9|`C1-r4`mEX|GwynRlTfoO`lC{_ b;jMY$%VWD9>KJbTrX~hYS3j3^P6k>kzI!( zI!T0+9C1nt$&zH3CCvY+|L=F+>w2E=zVGLLpZ9y;>%CqM-puHbfP?@D1Uh7lMiPOq z>UQks2Qp*uzm*;)1$!7_ z%(mdiS}H0kOU!%q7LnGvSW6vD4=wc{dd7W=a3cuJ0Y;p#D_mn$QgloJv!bFRkb&ja zS(UAn1iGG?o4!@2b@G-|O`CP1zNT(6_R5N5d6todO=;7uZN&*b+ zFi`z&S_+^mDJea&j9y@tZm_C!&qGtN?q40t+bD@q#!iuFr`Pn%^XeLEYHC2AbW`?a z1IoaKticP}G+omnM(zkB?;47cX6gY{{ZNcBw4=GUkvEbKQ3nH^S#VMF9Pv?@|4FwqH48fN5~LJeL} zQ_v9jGfLv7Q}wLF-9SU&z+(VIokheK`#Y}sWT=K_rFqCA^PU|HpJd`zh`*L<>fS<$ zzlps<&@u#^ByFQ^YRZ&-5gSR>J`XX5BKmC7pIF6Fb+Hs(lb5vA8Hc+eXyy&< zu+57IOIHNBnBZSR3>dd71Ui%w1MA2UOt`r%3=bII&@&Aoum|MGa5O8^%X`WfyMNJ0!;&9H;8cNI0f+!7BKSMP&DA9rgMh-2C(+Ct zq#Bspd>J>yyTIe|;6U)YMSwKBjdqOJr*;rtwx|(m2j3jbV*HnKWq0VK_@5;2J4*b? ze}bT&h3h zcJQT~5t0Ofb~_s*5hS0i>#5%ik}Zz5X_6PbLjN3jc&k8Wu3y9*QHN+UyO%e4iYl#i zI3y@9Se+DgR#a^7K)#@{=t=eba}6wSYTX_ig=)!#I?oq=Z{AnMO%!`i_~$Iry4giU z6h})2!9FH#`ebZs@?BrGS@Qny6E6K_oQfmPWoBtN3wxbW*~{+p4iT=)3U`q=ULDpo z$C$)(id`q^hNmbe(~o&llBGg%1;wngXXy@vGtLBwsf+OAf~@>~)qOpUGE%rG+xv#s zz_AMRzWT)2cCt_FhUFYo5}XkIhp+|qUf8XRS?asoBwR|)=3#TKpr@sWb;>sKzjUynMkgl=p zo3kBBzf!@YGB1>T3g!LTnpj=1b7y0B=%(<*vV_9WJH_H}pxAdb*-HY}>RZDyOUs>J zA3m4)6juHb*Jn3OfQGa@@R@dpmr3kKe-^8p73f<=^F_p`P95WYtg>}>e=0cYbV$`u zycTMsDkVHGuQjame(A8kGQ{tr#bU4Cw3NKz!N0k=zQ2}FEI2gH_-1f9b{dVt`N8dU zDLqcGXwKv?+0;WtV&wNE-?w_lmm->)a?JTPM0~xbPGZ$vwXnqSw4SwSkpUm}o4HSV zT^}1ZSoG|0uS}Xtr|aWE$R;{ppn|Pjs}{Lhq$yBR=lP_dHB)I^w)peCEXTK0scBuK z6XA7G?$jqjs`vCWZ{emkk6tyD^-$ZzxZkccAJ`K8Q-b}8U#O`@>G;?6`JOelO)PJ9 z_w#SNw@z`6Z@rShs0gmBn>8xuJebPpe$#eDE{x~V?v3b}oU?o|BD=@Qx()JTU)Rx+ zwGMt!+%w6!Wi(gQEoGHNh73q-4pl~ItUwfaU%bPPRR*XywyW8OZ#L4J4);rxeng2?L&$-iB#YZS~MdbG;vKRY{-%-v$@bcr<&C#miZ*o<3P zGym|=zNg0Bc4P%MiG)ny=P2+LNLp$=tT;Gk;i#Q=`16;01PK_B$%6E#)4Xy-wpUii z3Tfj!;YhHUiZtwOAg|@t;(iKs5_DPkul_*ZX#M%fI(*GZ3#-4=)SAE6=eBt~l`Ew0 zRc@V7;p;5Tl`a{HYwPt1C0zDj7ZtIJ4OiKFhgX%;b2Y;+aH-~V8UEj$_eq6VXN3? a7>~cY8tE!K7rgxvfs9dR$Z~x~$bSIpl`+%+ literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/css/new-style.css b/Huntarr.io-6.3.6/frontend/static/css/new-style.css new file mode 100644 index 0000000..1000631 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/static/css/new-style.css @@ -0,0 +1,1818 @@ +:root { + /* Light Theme Colors */ + --bg-primary: #f8f9fa; + --bg-secondary: #ffffff; + --bg-tertiary: #f1f3f5; + --text-primary: #212529; + --text-secondary: #495057; + --text-muted: #6c757d; + --border-color: #dee2e6; + --accent-color: #3498db; + --accent-hover: #2980b9; + --success-color: #27ae60; + --warning-color: #f39c12; + --error-color: #e74c3c; + --info-color: #2980b9; + --debug-color: #7f8c8d; + + /* Component Colors */ + --sidebar-bg: #2c3e50; + --sidebar-text: #ecf0f1; + --sidebar-item-hover: #34495e; + --sidebar-item-active: #3498db; + --topbar-bg: var(--bg-secondary); + --card-bg: var(--bg-secondary); + --switch-bg: #cbd2d9; + --switch-active: #3498db; + + /* Button Colors */ + --button-primary-bg: #3498db; + --button-primary-text: #ffffff; + --button-primary-hover: #2980b9; + --button-danger-bg: #e74c3c; + --button-danger-hover: #c0392b; + --button-success-bg: #27ae60; + --button-success-hover: #219955; + + /* Status Colors */ + --status-connected: #27ae60; + --status-not-connected: #e74c3c; + + /* Logs Colors */ + --log-bg: var(--bg-secondary); + --log-border: var(--border-color); +} + +.dark-theme { + --bg-primary: #1a1d24; + --bg-secondary: #252a34; + --bg-tertiary: #2d3748; + --text-primary: #f8f9fa; + --text-secondary: #e9ecef; + --text-muted: #adb5bd; + --border-color: #4a5568; + --accent-color: #3498db; + --accent-hover: #2980b9; + + /* Component Colors */ + --sidebar-bg: #121212; + --sidebar-text: #ecf0f1; + --sidebar-item-hover: #2d3748; + --sidebar-item-active: #3498db; + --topbar-bg: #252a34; + --card-bg: #252a34; + --switch-bg: #4a5568; + + /* Logs Colors */ + --log-bg: #252a34; + --log-border: #4a5568; +} + +/* Base Styles */ +body, html { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + margin: 0; + padding: 0; + background-color: var(--bg-primary); + color: var(--text-primary); + height: 100%; + width: 100%; + overflow: auto !important; /* Allow scrolling on body and html */ +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + line-height: 1.6; + transition: background-color 0.3s, color 0.3s; + height: 100vh; +} + +/* Global scrollbar management */ +.content-section { + overflow: auto !important; /* Allow scrolling on content sections */ +} + +/* Styling for scrollbars */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: #262a36; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: #3d4353; + border-radius: 4px; + transition: background-color 0.3s; +} + +::-webkit-scrollbar-thumb:hover { + background: #4d5569; +} + +/* Allow scrolling on main elements */ +body, html, .main-content, .section-wrapper { + overflow: auto !important; + scrollbar-width: thin !important; +} + +/* Only allow scrollbars on specific elements */ +.single-scroll-container { + scrollbar-width: thin !important; + overflow-y: auto !important; +} + +/* Hide scrollbars on all table elements */ +table, tbody, tr, td, th { + overflow: visible !important; +} + +/* Hide all WebKit scrollbars except on allowed containers */ +body::-webkit-scrollbar, +html::-webkit-scrollbar, +.content-section::-webkit-scrollbar, +.main-content::-webkit-scrollbar, +.section-wrapper::-webkit-scrollbar { + width: 8px !important; + height: 8px !important; + display: block !important; +} + +table::-webkit-scrollbar, +tr::-webkit-scrollbar, +tbody::-webkit-scrollbar, +th::-webkit-scrollbar, +td::-webkit-scrollbar { + width: 0 !important; + height: 0 !important; + display: none !important; +} + +a { + text-decoration: none; + color: var(--accent-color); +} + +button { + cursor: pointer; + font-family: inherit; +} + +/* Layout Structure */ +.app-container { + display: flex; + height: 100vh; + overflow: hidden; +} + +/* Sidebar */ +.sidebar { + width: 240px; + background-color: var(--sidebar-bg); + color: var(--sidebar-text); + display: flex; + flex-direction: column; + padding: 20px 0; + height: 100%; + overflow: auto; + box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1); + flex-shrink: 0; +} + +.logo-container { + display: flex; + align-items: center; + justify-content: center; + padding: 0 20px 20px; + margin-bottom: 10px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + min-height: 64px; /* Ensures container doesn't collapse while loading */ +} + +/* Updated logo size */ +.logo { + width: 64px; + height: 64px; + margin-right: 10px; + object-fit: contain; + transition: none !important; /* Prevent transition animations */ +} + +.login-logo { + width: 64px; + height: 64px; + margin-bottom: 10px; + object-fit: contain; + transition: none !important; /* Prevent transition animations */ +} + +.sidebar h1 { + font-size: 1.5rem; + font-weight: bold; +} + +.nav-menu { + display: flex; + flex-direction: column; + flex-grow: 1; + margin-top: 20px; +} + +.nav-item { + display: flex; + align-items: center; + padding: 12px 20px; + color: var(--sidebar-text); + transition: all 0.3s; +} + +.nav-item i { + margin-right: 12px; + font-size: 18px; + width: 24px; + text-align: center; +} + +.nav-item:hover { + background-color: var(--sidebar-item-hover); +} + +.nav-item.active { + background-color: var(--sidebar-item-active); + font-weight: 600; +} + +/* Theme Switch */ +.theme-switcher { + padding: 20px; + margin-top: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.1); +} + +.switch-label { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 14px; +} + +.light-icon, .dark-icon { + color: var(--sidebar-text); +} + +.switch { + position: relative; + display: inline-block; + width: 100%; + height: 26px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--switch-bg); + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 4px; + bottom: 4px; + background-color: white; + transition: .4s; +} + +input:checked + .slider { + background-color: var(--switch-active); +} + +input:checked + .slider:before { + transform: translateX(calc(100% + 4px)); +} + +.slider.round { + border-radius: 34px; + width: 48px; +} + +.slider.round:before { + border-radius: 50%; +} + +/* Main Content */ +.main-content { + flex-grow: 1; + display: flex; + flex-direction: column; + overflow: auto; /* Changed from hidden to auto to allow scrolling */ +} + +/* Top Bar */ +.top-bar { + height: 60px; + background-color: var(--topbar-bg); + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px; + border-bottom: 1px solid var(--border-color); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} + +.page-title { + font-size: 1.3rem; + font-weight: 600; + color: var(--text-primary); +} + +.user-info { + display: flex; + align-items: center; + font-size: 14px; +} + +.user-info span { + margin-right: 12px; +} + +.logout-btn { + color: var(--text-secondary); + transition: color 0.3s; +} + +.logout-btn:hover { + color: var(--error-color); +} + +/* Content Sections - Strict section isolation */ +.content-section { + display: none !important; + visibility: hidden; + position: absolute; + left: 0; + right: 0; + height: 0; + overflow: hidden; + opacity: 0; + z-index: -1; +} + +.content-section.active { + display: block !important; + visibility: visible; + position: relative; + height: auto; + overflow: auto !important; /* Allow scrolling when content is tall */ + opacity: 1; + z-index: 1; + padding: 20px; +} + +/* Cards */ +.dashboard-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 20px; +} + +.card { + background-color: var(--card-bg); + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); + padding: 20px; +} + +.card h2, .card h3 { + margin-bottom: 15px; + font-weight: 600; + display: flex; + align-items: center; +} + +.card h2 i, .card h3 i { + margin-right: 10px; + color: var(--accent-color); +} + +.welcome-card { + grid-column: 1 / -1; +} + +/* Status Card */ +.status-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.status-item { + display: flex; + justify-content: space-between; + align-items: center; +} + +.status-badge { + padding: 6px 12px; + border-radius: 20px; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; +} + +.status-badge i { + margin-right: 5px; +} + +.status-badge.connected { + background-color: rgba(39, 174, 96, 0.2); + color: var(--status-connected); +} + +.status-badge.not-connected { + background-color: rgba(231, 76, 60, 0.2); + color: var(--status-not-connected); +} + +/* Stats Card */ +.stats-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; +} + +.stat-item { + display: flex; + flex-direction: column; + align-items: center; + padding: 10px; + border-radius: 6px; + background-color: var(--bg-tertiary); +} + +.stat-value { + font-size: 1.8rem; + font-weight: bold; + color: var(--accent-color); +} + +.stat-label { + font-size: 0.9rem; + color: var(--text-secondary); + margin-top: 5px; +} + +/* Action Card */ +.action-buttons { + display: flex; + gap: 10px; +} + +.action-button { + padding: 12px 20px; + border-radius: 6px; + border: none; + font-weight: 600; + display: flex; + align-items: center; + justify-content: center; + flex: 1; + transition: background-color 0.3s, transform 0.2s; +} + +.action-button i { + margin-right: 8px; +} + +.action-button.start { + background-color: var(--button-success-bg); + color: white; +} + +.action-button.start:hover { + background-color: var(--button-success-hover); + transform: translateY(-2px); +} + +.action-button.stop { + background-color: var(--button-danger-bg); + color: white; +} + +.action-button.stop:hover { + background-color: var(--button-danger-hover); + transform: translateY(-2px); +} + +/* Logs Section */ +.section-header { + margin-bottom: 20px; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 15px; +} + +.app-tabs, .log-controls { + display: flex; + gap: 10px; + align-items: center; +} + +.app-tab, .settings-tab { + padding: 8px 20px; + background-color: var(--bg-tertiary); + border: none; + border-radius: 20px; + color: var(--text-secondary); + font-weight: 500; + transition: all 0.3s; +} + +.app-tab.active, .settings-tab.active { + background-color: var(--accent-color); + color: white; +} + +.app-tab:hover, .settings-tab:hover { + background-color: var(--accent-hover); + color: white; +} + +.log-tabs { + display: flex; + gap: 10px; + align-items: center; + margin-bottom: 15px; /* Add some space below the tabs */ +} + +.log-tab { + padding: 8px 20px; + background-color: var(--bg-tertiary); + border: none; + border-radius: 20px; + color: var(--text-secondary); + font-weight: 500; + transition: all 0.3s; + cursor: pointer; /* Add cursor pointer */ +} + +.log-tab.active { + background-color: var(--accent-color); + color: white; +} + +.log-tab:hover { + background-color: var(--accent-hover); + color: white; +} + +/* Adjust log controls layout if needed */ +.log-controls { + display: flex; + justify-content: flex-end; /* Align controls to the right */ + align-items: center; + gap: 15px; + flex-grow: 1; /* Allow controls to take remaining space */ +} + +/* Ensure section header handles flex layout properly */ +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; /* Allow wrapping on smaller screens */ + gap: 15px; + margin-bottom: 20px; +} + +.app-tabs, .log-controls { + display: flex; + gap: 10px; + align-items: center; +} + +.app-tab, .settings-tab { + padding: 8px 20px; + background-color: var(--bg-tertiary); + border: none; + border-radius: 20px; + color: var(--text-secondary); + font-weight: 500; + transition: all 0.3s; +} + +.app-tab.active, .settings-tab.active { + background-color: var(--accent-color); + color: white; +} + +.app-tab:hover, .settings-tab:hover { + background-color: var(--accent-hover); + color: white; +} + +.log-options { + display: flex; + align-items: center; + gap: 15px; +} + +.auto-scroll { + display: flex; + align-items: center; + gap: 5px; + font-size: 14px; +} + +.clear-button { + padding: 6px 12px; + background-color: var(--button-danger-bg); + color: white; + border: none; + border-radius: 4px; + display: flex; + align-items: center; + gap: 5px; + transition: background-color 0.3s; +} + +.clear-button:hover { + background-color: var(--button-danger-hover); +} + +.logs { + /* Reduce height by 15% from original calc(100vh - 160px) */ + height: calc(85vh - 160px); + background-color: var(--log-bg); + border: 1px solid var(--log-border); + border-radius: 8px; + padding: 15px; + overflow-y: auto; + font-family: monospace; + white-space: pre-wrap; + word-wrap: break-word; + line-height: 1.5; + font-size: 14px; + margin-bottom: 20px; /* Add margin to create space between logs and footer */ +} + +.log-entry { + margin-bottom: 5px; + padding: 2px 5px; /* Add some horizontal padding */ + display: flex; /* Use flexbox for alignment */ + align-items: baseline; /* Align items based on text baseline */ + gap: 8px; /* Space between elements */ +} + +.log-timestamp { + color: var(--text-muted); /* Muted color for timestamp */ + font-size: 0.85em; + white-space: nowrap; /* Prevent timestamp from wrapping */ +} + +.log-app { + color: var(--accent-color); /* Use accent color for app name */ + font-weight: bold; + font-size: 0.9em; + white-space: nowrap; +} + +.log-level { + font-weight: bold; + padding: 1px 5px; + border-radius: 3px; + font-size: 0.8em; + text-transform: uppercase; + white-space: nowrap; +} + +.log-level-info { + background-color: var(--info-bg, #d1ecf1); /* Use CSS variables with fallbacks */ + color: var(--info-color, #0c5460); +} + +.log-level-warning { + background-color: var(--warning-bg, #fff3cd); + color: var(--warning-color, #856404); +} + +.log-level-error { + background-color: var(--error-bg, #f8d7da); + color: var(--error-color, #721c24); +} + +.log-level-debug { + background-color: var(--debug-bg, #e2e3e5); + color: var(--debug-color, #383d41); +} + +/* Apply level colors directly to the entry for fallback */ +.log-info .log-message { + color: var(--info-color, #0c5460); +} + +.log-warning .log-message { + color: var(--warning-color, #856404); +} + +.log-error .log-message { + color: var(--error-color, #721c24); +} + +.log-debug .log-message { + color: var(--debug-color, #383d41); +} + +.log-logger { + color: var(--text-muted); /* Muted color for logger name */ + font-size: 0.85em; + white-space: nowrap; +} + +.log-message { + flex-grow: 1; /* Allow message to take remaining space */ + word-break: break-word; /* Break long words */ +} + +.status-connected { + color: var(--status-connected); + font-weight: 600; +} + +.status-disconnected { + color: var(--status-not-connected); + font-weight: 600; +} + +/* Settings Section */ +.settings-actions { + display: flex; + gap: 10px; +} + +.save-button, .reset-button { + padding: 8px 16px; + border: none; + border-radius: 4px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + transition: background-color 0.3s; +} + +.save-button { + background-color: var(--button-success-bg); + color: white; +} + +.save-button:hover { + background-color: var(--button-success-hover); +} + +.reset-button { + background-color: var(--button-danger-bg); + color: white; +} + +.reset-button:hover { + background-color: var(--button-danger-hover); +} + +.settings-form { + padding: 0; + overflow-y: auto; + height: calc(100vh - 150px); +} + +.app-settings-panel { + display: none; +} + +.app-settings-panel.active { + display: block; +} + +.settings-group { + background-color: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; + position: relative; +} + +.settings-group h3 { + margin-bottom: 15px; + padding-bottom: 10px; + /* border-bottom: 1px solid var(--border-color); */ /* Removed to prevent double border */ + font-size: 1.1rem; +} + +.setting-item { + margin-bottom: 20px; + display: flex; + flex-wrap: wrap; + align-items: center; +} + +.setting-item label { + width: 200px; + font-weight: 500; + margin-right: 15px; +} + +.setting-item input[type="text"], +.setting-item input[type="number"], +.setting-item input[type="password"] { + width: 300px; + padding: 8px 12px; + border: 1px solid var(--border-color); + border-radius: 4px; + background-color: var(--bg-tertiary); + color: var(--text-primary); +} + +/* Make number inputs shorter where appropriate */ +.short-number-input { + width: 100px !important; /* Use !important to override wider default if needed */ +} + +/* Make number inputs for intervals shorter */ +.short-number-input { + width: 80px !important; /* Use !important to override potential broader input styles */ +} + +.setting-help { + width: 100%; + margin-top: 5px; + margin-left: 215px; + font-size: 13px; + color: var(--text-muted); +} + +/* Stateful management header row with reset button */ +.stateful-header-row { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 10px; /* Reduced padding */ + margin-bottom: 15px; /* Spacing below header */ + /* border-bottom: 1px solid var(--border-color); Removed border */ + width: 100%; +} + +.stateful-header-row h3 { + margin: 0; + font-size: 1.1rem; /* Match other group headers */ + font-weight: 600; + color: var(--text-primary); +} + +/* Reset button styling */ +#reset_stateful_btn { + background-color: var(--button-danger-bg); /* Use variable */ + color: white; + border: none; + padding: 5px 12px; + border-radius: 4px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 5px; + transition: background-color 0.2s ease; +} + +#reset_stateful_btn:hover { + background-color: var(--button-danger-hover); /* Use variable */ +} + +#reset_stateful_btn i { + font-size: 13px; +} + +/* Stateful Management Section Styling */ +#generalSettings .setting-info-block { + background-color: var(--bg-tertiary); + border: 1px solid var(--border-color); + border-radius: 6px; + padding: 15px; + margin-top: 0; /* Remove top margin as header row provides spacing */ + margin-bottom: 20px; +} + +#generalSettings .info-container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* Responsive columns */ + gap: 15px; + /* margin-bottom: 15px; Removed margin, handled by parent */ +} + +#generalSettings .date-info-block { + background-color: var(--bg-secondary); + padding: 12px 15px; /* Adjusted padding */ + border-radius: 4px; + border-left: 3px solid var(--accent-color); +} + +#generalSettings .date-label { + font-size: 0.85em; /* Slightly smaller */ + color: var(--text-secondary); + margin-bottom: 5px; /* Increased spacing */ +} + +#generalSettings .date-value { + font-size: 0.95em; /* Adjusted size */ + font-weight: 500; + color: var(--text-primary); + font-family: inherit; /* Use standard font */ + background-color: transparent; /* Remove background */ + padding: 0; /* Remove padding */ +} + +/* Style the State Reset Interval item specifically */ +#generalSettings .setting-item input#stateful_management_hours { + width: 100px; /* Make input smaller */ +} + +#generalSettings .setting-item .reset-help { + color: var(--warning-color); /* Use warning color */ + font-style: normal; + font-size: 0.85em; +} + +/* Responsive Adjustments */ +@media (max-width: 950px) { + .sidebar { + width: 70px; + } + + .sidebar h1, .nav-item span, .switch-label { + display: none; + } + + .nav-item i { + margin-right: 0; + font-size: 22px; + } + + .logo-container { + justify-content: center; + } + + .logo { + margin-right: 0; + } +} + +@media (max-width: 992px) { + .settings-group { + padding: 15px; + } + + .setting-item label { + width: 100%; + margin-bottom: 8px; + } + + .setting-help { + margin-left: 0; + } + + .stats-grid { + grid-template-columns: 1fr; + } + + /* Make inputs responsive on narrow screens */ + .setting-item input[type="text"], + .setting-item input[type="number"], + .setting-item input[type="password"] { + width: 100%; + max-width: 300px; + } + + /* Specific width for short number inputs */ + .setting-item input.short-number-input { + width: 80px; /* Adjust width as needed */ + max-width: 80px; + } +} + +@media (max-width: 768px) { + .dashboard-grid { + grid-template-columns: 1fr; + } + + .section-header { + flex-direction: column; + align-items: flex-start; + } + + .app-tabs, .settings-actions { + width: 100%; + overflow-x: auto; + padding-bottom: 5px; /* Prevent cut-off of button shadows */ + } + + .app-tab, .settings-tab { + flex: 1; + white-space: nowrap; + min-width: 100px; /* Minimum button width */ + } + + /* Layout improvements for user cards on mobile */ + .user-card { + padding: 15px; + } + + .verification-container { + flex-direction: column; + align-items: center; + } + + .verification-input { + width: 100%; + max-width: 200px; + margin-right: 0; + margin-bottom: 10px; + } +} + +/* Ensure very small screens can still access everything */ +@media (max-width: 480px) { + .top-bar { + flex-direction: column; + align-items: flex-start; + height: auto; + padding: 10px 15px; + } + + .user-info { + margin-top: 10px; + } + + .action-buttons { + flex-direction: column; + } + + .action-button { + margin-bottom: 10px; + } +} + +/* Footer */ +.footer { + text-align: center; + padding: 20px; + margin-top: 20px; + background-color: var(--bg-secondary); + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); + color: var(--text-secondary); + font-size: 14px; +} + +.footer p { + margin: 5px 0; +} + +.footer a { + color: var(--accent-color); + text-decoration: none; + font-weight: 500; + transition: color 0.3s; +} + +.footer a:hover { + text-decoration: underline; + color: var(--accent-hover); +} + +/* Notification styles for async operations */ +.notification { + position: fixed; + top: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 8px; + color: white; + font-weight: 500; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + z-index: 1000; + transform: translateY(-20px); + opacity: 0; + transition: transform 0.3s, opacity 0.3s; +} + +.notification.show { + transform: translateY(0); + opacity: 1; +} + +.notification.success { + background-color: var(--success-color); +} + +.notification.error { + background-color: var(--error-color); +} + +.notification.info { + background-color: var(--info-color); +} + +/* Multi-instance styles */ +.instances-container { + margin-bottom: 20px; +} + +.instance-item { + border: 1px solid var(--border-color); + border-radius: 8px; + margin-bottom: 16px; + background-color: var(--card-bg); +} + +.instance-header { + padding: 10px 15px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid var(--border-color); + background-color: var(--card-header-bg); + border-radius: 8px 8px 0 0; +} + +.instance-header h4 { + margin: 0; + font-size: 16px; + font-weight: 500; +} + +.instance-actions { + display: flex; + align-items: center; + gap: 10px; +} + +.instance-toggle { + margin-right: 5px; +} + +.instance-content { + padding: 15px; +} + +.add-instance-container { + display: flex; + justify-content: center; + margin: 15px 0; +} + +.add-instance-btn { + padding: 8px 16px; + background-color: var(--accent-color); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-weight: 500; + transition: background-color 0.2s; +} + +.add-instance-btn:hover { + background-color: var(--accent-color-dark); +} + +.add-instance-btn:disabled { + background-color: #ccc; + cursor: not-allowed; +} + +.remove-instance-btn { + padding: 5px 10px; + background-color: var(--delete-color); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + transition: background-color 0.2s; +} + +.remove-instance-btn:hover { + background-color: var(--delete-color-dark); +} + +.test-connection-btn { + padding: 6px 12px; + background-color: var(--accent-color); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; +} + +.test-connection-btn:hover { + background-color: var(--accent-color-dark); +} + +.connection-status { + margin-left: 10px; + font-size: 14px; +} + +.connection-status.success { + color: var(--success-color); +} + +.connection-status.error { + color: var(--error-color); +} + +.connection-status.testing { + color: var(--accent-color); +} + +/* Swaparr specific styles */ +.swaparr-panel { + margin-bottom: 15px; + border-radius: 8px; + background-color: var(--bg-secondary); + border-left: 4px solid var(--accent-color); +} + +.swaparr-config { + padding: 12px; +} + +.swaparr-config h3 { + margin-top: 0; + margin-bottom: 10px; + color: var(--accent-color); +} + +.swaparr-config-content { + display: flex; + flex-wrap: wrap; + gap: 15px; +} + +.swaparr-config-content span { + background-color: var(--bg-tertiary); + padding: 5px 10px; + border-radius: 4px; + font-family: monospace; +} + +.swaparr-table { + width: 100%; + overflow-x: auto; + margin-bottom: 15px; +} + +.swaparr-table table { + width: 100%; + border-collapse: collapse; + background-color: var(--bg-secondary); + border-radius: 8px; + overflow: hidden; +} + +.swaparr-table th { + background-color: var(--bg-tertiary); + padding: 10px; + text-align: left; + color: var(--text-secondary); +} + +.swaparr-table td { + padding: 10px; + border-bottom: 1px solid var(--bg-tertiary); +} + +.swaparr-status-striked { + background-color: rgba(255, 193, 7, 0.1); +} + +.swaparr-status-pending { + background-color: rgba(13, 110, 253, 0.1); +} + +.swaparr-status-ignored { + background-color: rgba(108, 117, 125, 0.1); +} + +.swaparr-status-normal { + background-color: rgba(25, 135, 84, 0.1); +} + +.swaparr-status-removed { + background-color: rgba(220, 53, 69, 0.1); +} + +/* When in dark mode */ +.dark-theme .swaparr-status-striked { + background-color: rgba(255, 193, 7, 0.2); +} + +.dark-theme .swaparr-status-pending { + background-color: rgba(13, 110, 253, 0.2); +} + +.dark-theme .swaparr-status-ignored { + background-color: rgba(108, 117, 125, 0.2); +} + +.dark-theme .swaparr-status-normal { + background-color: rgba(25, 135, 84, 0.2); +} + +.dark-theme .swaparr-status-removed { + background-color: rgba(220, 53, 69, 0.2); +} + +/* Log Dropdown Styles */ +.log-dropdown-container { + position: relative; + margin-bottom: 15px; +} + +.log-dropdown { + position: relative; + display: inline-block; +} + +.log-dropdown-btn { + padding: 10px 20px; + background-color: var(--accent-color); + color: white; + border: none; + border-radius: 20px; + font-weight: 500; + transition: all 0.3s; + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + min-width: 140px; + justify-content: space-between; +} + +.log-dropdown-btn:hover { + background-color: var(--accent-hover); +} + +.log-dropdown-content { + display: none; + position: absolute; + top: 100%; + left: 0; + background-color: var(--bg-secondary); + min-width: 180px; + z-index: 10; + border-radius: 8px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + margin-top: 8px; + border: 1px solid var(--border-color); + max-height: 400px; + overflow-y: auto; +} + +.log-dropdown-content.show { + display: block; +} + +.log-option { + display: block; + padding: 10px 15px; + text-decoration: none; + color: var(--text-primary); + transition: all 0.2s; + text-align: left; +} + +.log-option:hover { + background-color: var(--bg-tertiary); +} + +.log-option.active { + color: var(--accent-color); + font-weight: 600; + background-color: rgba(var(--accent-color-rgb), 0.1); +} + +/* Settings Dropdown Styles - Matching log dropdown styles */ +.settings-dropdown-container { + position: relative; + margin-bottom: 15px; +} + +.settings-dropdown { + position: relative; + display: inline-block; +} + +.settings-dropdown-btn { + padding: 10px 20px; + background-color: var(--accent-color); + color: white; + border: none; + border-radius: 20px; + font-weight: 500; + transition: all 0.3s; + cursor: pointer; + display: flex; + align-items: center; + gap: 8px; + min-width: 140px; + justify-content: space-between; +} + +.settings-dropdown-btn:hover { + background-color: var(--accent-hover); +} + +.settings-dropdown-content { + display: none; + position: absolute; + top: 100%; + left: 0; + background-color: var(--bg-secondary); + min-width: 180px; + z-index: 10; + border-radius: 8px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); + margin-top: 8px; + border: 1px solid var(--border-color); + max-height: 400px; + overflow-y: auto; +} + +.settings-dropdown-content.show { + display: block; +} + +.settings-option { + display: block; + padding: 10px 15px; + text-decoration: none; + color: var(--text-primary); + transition: all 0.2s; + text-align: left; +} + +.settings-option:hover { + background-color: var(--bg-tertiary); +} + +.settings-option.active { + color: var(--accent-color); + font-weight: 600; + background-color: rgba(var(--accent-color-rgb), 0.1); +} + +/* History Dropdown Styles - Matching log dropdown styles */ +.history-dropdown-container { + display: flex; + align-items: center; +} + +.history-dropdown { + position: relative; + display: inline-block; +} + +.history-dropdown-btn { + background-color: var(--bg-tertiary); + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 8px 15px; + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: var(--text-primary); + transition: all 0.2s; + cursor: pointer; +} + +.history-dropdown-btn:hover { + background-color: var(--bg-primary); +} + +.history-dropdown-content { + display: none; + position: absolute; + background-color: var(--bg-secondary); + min-width: 160px; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + z-index: 1001; + border-radius: 4px; + max-height: 400px; + overflow-y: auto; +} + +.history-dropdown-content a { + color: var(--text-primary); + padding: 12px 16px; + text-decoration: none; + display: block; + transition: all 0.2s; +} + +.history-dropdown-content a:hover { + background-color: var(--bg-tertiary); +} + +.history-dropdown-content a.active { + background-color: var(--accent-color); + color: white; +} + +.history-dropdown-content.show { + display: block; +} + +/* Placeholder message styling */ +.placeholder-message { + display: flex; + justify-content: center; + align-items: center; + height: calc(100% - 60px); /* Adjust based on header height */ +} + +.message-container { + text-align: center; + padding: 30px; + background-color: var(--bg-secondary); + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + max-width: 500px; +} + +.message-container i { + color: var(--accent-color); + margin-bottom: 15px; +} + +.message-container h3 { + margin-bottom: 10px; + font-size: 1.5rem; +} + +.message-container p { + color: var(--text-secondary); + line-height: 1.5; +} + +/* History Table Styles */ +.history-container { + position: relative; + height: calc(100% - 120px); /* Adjust based on header and pagination height */ + overflow: auto; + background-color: var(--bg-secondary); + border-radius: 4px; + box-shadow: 0 1px 3px rgba(0,0,0,0.1); +} + +.history-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + font-size: 14px; +} + +.history-table thead { + position: sticky; + top: 0; + background-color: var(--bg-tertiary); + z-index: 1; +} + +.history-table th { + padding: 12px 15px; + text-align: left; + font-weight: 600; + color: var(--text-primary); + border-bottom: 1px solid var(--border-color); +} + +.history-table td { + padding: 10px 15px; + border-bottom: 1px solid var(--border-color); + vertical-align: middle; +} + +.history-table tbody tr:nth-child(even) { + background-color: var(--bg-tertiary); +} + +.history-table tbody tr:hover { + background-color: rgba(var(--accent-color-rgb), 0.1); +} + +/* Operation Type Styles in History Table */ +.operation-missing { + background-color: #005a9e; + color: white; + padding: 3px 8px; + border-radius: 4px; + font-size: 0.9em; + display: inline-block; +} + +.operation-upgrade { + background-color: #1e40af; /* Changed from #2a9d8f to a more vibrant blue */ + color: white; + padding: 3px 8px; + border-radius: 4px; + font-size: 0.9em; + display: inline-block; +} + +/* History Controls */ +.history-controls { + display: flex; + justify-content: flex-end; + align-items: center; + gap: 15px; +} + +.history-search { + display: flex; + align-items: center; + margin-right: auto; /* Push to left side */ +} + +.history-search input { + padding: 8px 15px; + border: 1px solid var(--border-color); + border-radius: 4px 0 0 4px; + background-color: var(--bg-tertiary); + color: var(--text-primary); + width: 200px; +} + +.history-search button { + background-color: var(--accent-color); + color: white; + border: none; + border-radius: 0 4px 4px 0; + padding: 8px 12px; + cursor: pointer; +} + +.history-search button:hover { + background-color: var(--accent-hover); +} + +.history-page-size { + display: flex; + align-items: center; + gap: 8px; +} + +.history-page-size select { + padding: 7px 10px; + border: 1px solid var(--border-color); + border-radius: 4px; + background-color: var(--bg-tertiary); + color: var(--text-primary); +} + +/* Pagination Controls */ +.pagination-controls { + display: flex; + justify-content: center; + align-items: center; + padding: 15px 0; + gap: 15px; +} + +.pagination-button { + padding: 8px 15px; + border: 1px solid var(--border-color); + border-radius: 4px; + background-color: var(--bg-tertiary); + color: var(--text-primary); + cursor: pointer; + transition: all 0.2s; +} + +.pagination-button:hover { + background-color: var(--accent-color); + color: white; +} + +.pagination-button:disabled { + opacity: 0.5; + cursor: not-allowed; + background-color: var(--bg-tertiary); + color: var(--text-muted); +} + +#historyPageInfo { + color: var(--text-secondary); + font-size: 14px; +} + +/* Empty state and loading */ +.empty-state-message, .loading-indicator { + display: none; + flex-direction: column; + align-items: center; + justify-content: center; + height: 200px; + color: var(--text-muted); + text-align: center; + padding: 20px; +} + +.empty-state-message i, .loading-indicator i { + margin-bottom: 15px; + color: var(--accent-color); +} + +/* Responsive adjustments */ +@media (max-width: 992px) { + .history-table { + font-size: 13px; + } + + .history-table th, .history-table td { + padding: 8px 10px; + } + + .history-search input { + width: 150px; + } +} + +@media (max-width: 768px) { + .history-controls { + flex-wrap: wrap; + gap: 10px; + } + + .history-search { + width: 100%; + margin-bottom: 10px; + } + + .history-search input { + width: calc(100% - 40px); + } +} + +.styled-select { + background: var(--accent-color); + color: #fff; + border: none; + border-radius: 20px; + padding: 10px 20px; + font-weight: 500; + font-size: 1rem; + min-width: 140px; + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + cursor: pointer; + outline: none; + transition: background 0.3s; + margin-right: 10px; +} +.styled-select:focus, .styled-select:hover { + background: var(--accent-hover); +} +.styled-select option { + color: #222; + background: #fff; +} diff --git a/Huntarr.io-6.3.6/frontend/static/css/style.css b/Huntarr.io-6.3.6/frontend/static/css/style.css new file mode 100644 index 0000000..053e64b --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/static/css/style.css @@ -0,0 +1,1540 @@ +:root { + /* Light Theme Colors */ + --bg-primary: #f8f9fa; + --bg-secondary: #ffffff; + --bg-tertiary: #f1f3f5; + --text-primary: #212529; + --text-secondary: #495057; + --text-muted: #6c757d; + --border-color: #dee2e6; + --accent-color: #3498db; + --accent-hover: #2980b9; + --success-color: #27ae60; + --warning-color: #f39c12; + --error-color: #e74c3c; + --info-color: #2980b9; + --debug-color: #7f8c8d; + + /* Component Colors */ + --sidebar-bg: #2c3e50; + --sidebar-text: #ecf0f1; + --sidebar-item-hover: #34495e; + --sidebar-item-active: #3498db; + --topbar-bg: var(--bg-secondary); + --card-bg: var(--bg-secondary); + --switch-bg: #cbd2d9; + --switch-active: #3498db; + + /* Button Colors */ + --button-primary-bg: #3498db; + --button-primary-text: #ffffff; + --button-primary-hover: #2980b9; + --button-danger-bg: #e74c3c; + --button-danger-hover: #c0392b; + --button-success-bg: #27ae60; + --button-success-hover: #219955; + + /* Status Colors */ + --status-connected: #27ae60; + --status-not-connected: #e74c3c; + + /* Logs Colors */ + --log-bg: var(--bg-secondary); + --log-border: var(--border-color); +} + +.dark-theme { + --bg-primary: #1a1d24; + --bg-secondary: #252a34; + --bg-tertiary: #2d3748; + --text-primary: #f8f9fa; + --text-secondary: #e9ecef; + --text-muted: #adb5bd; + --border-color: #4a5568; + --accent-color: #3498db; + --accent-hover: #2980b9; + + /* Component Colors */ + --sidebar-bg: #121212; + --sidebar-text: #ecf0f1; + --sidebar-item-hover: #2d3748; + --sidebar-item-active: #3498db; + --topbar-bg: #252a34; + --card-bg: #252a34; + --switch-bg: #4a5568; + + /* Logs Colors */ + --log-bg: #252a34; + --log-border: #4a5568; +} + +/* Base Styles */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + background-color: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; + transition: background-color 0.3s, color 0.3s; + height: 100vh; + overflow: hidden; +} + +a { + text-decoration: none; + color: var(--accent-color); +} + +button { + cursor: pointer; + font-family: inherit; +} + +/* Layout Structure */ +.app-container { + display: flex; + height: 100vh; + width: 100%; + overflow: hidden; +} + +.sidebar { + width: 250px; + height: 100vh; + background: linear-gradient(180deg, rgba(22, 26, 34, 0.98), rgba(18, 22, 30, 0.95)); + border-right: 1px solid rgba(90, 109, 137, 0.15); + box-shadow: 2px 0 10px rgba(0, 0, 0, 0.2); + display: flex; + flex-direction: column; + z-index: 100; + flex-shrink: 0; + overflow-y: auto; +} + +.main-content { + flex: 1; + min-width: 0; /* Important for flex child to respect parent constraints */ + height: 100vh; + overflow-y: auto; + position: relative; + box-sizing: border-box; +} + +/* Content Section styles */ +.content-section { + display: none; + padding: 20px; + height: calc(100vh - 60px); /* 60px is topbar height */ + overflow-y: auto; + box-sizing: border-box; +} + +.content-section.active { + display: block; +} + +/* Sidebar */ +.logo-container { + display: flex; + align-items: center; + justify-content: center; + padding: 0 20px 20px; + margin-bottom: 10px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +.logo { + width: 40px; + height: 40px; + margin-right: 10px; +} + +.sidebar h1 { + font-size: 1.5rem; + font-weight: bold; +} + +.nav-menu { + display: flex; + flex-direction: column; + flex-grow: 1; + margin-top: 20px; +} + +.nav-item { + display: flex; + align-items: center; + padding: 12px 20px; + color: var(--sidebar-text); + transition: all 0.3s; +} + +.nav-item i { + margin-right: 12px; + font-size: 18px; + width: 24px; + text-align: center; +} + +.nav-item:hover { + background-color: var(--sidebar-item-hover); +} + +.nav-item.active { + background-color: var(--sidebar-item-active); + font-weight: 600; +} + +/* Theme Switch */ +.theme-switcher { + padding: 20px; + margin-top: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.1); +} + +.switch-label { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 14px; +} + +.light-icon, .dark-icon { + color: var(--sidebar-text); +} + +.switch { + position: relative; + display: inline-block; + width: 100%; + height: 26px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; +} + +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--switch-bg); + transition: .4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 4px; + bottom: 4px; + background-color: white; + transition: .4s; +} + +input:checked + .slider { + background-color: var(--switch-active); +} + +input:checked + .slider:before { + transform: translateX(calc(100% + 4px)); +} + +.slider.round { + border-radius: 34px; +} + +.slider.round:before { + border-radius: 50%; +} + +/* Main Content */ +.main-content { + flex-grow: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +/* Top Bar */ +.top-bar { + height: 60px; + background-color: var(--topbar-bg); + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px; + border-bottom: 1px solid var(--border-color); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); +} + +.page-title { + font-size: 1.3rem; + font-weight: 600; + color: var(--text-primary); +} + +.user-info { + display: flex; + align-items: center; + font-size: 14px; +} + +.user-info span { + margin-right: 12px; +} + +.logout-btn { + color: var(--text-secondary); + transition: color 0.3s; +} + +.logout-btn:hover { + color: var(--error-color); +} + +/* Content Sections */ +.content-section { + display: none; + height: calc(100vh - 60px); + overflow-y: auto; + padding: 20px; +} + +.content-section.active { + display: block; +} + +/* Cards */ +.dashboard-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 20px; +} + +.card { + background-color: var(--card-bg); + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); + padding: 20px; +} + +.card h2, .card h3 { + margin-bottom: 15px; + font-weight: 600; + display: flex; + align-items: center; +} + +.card h2 i, .card h3 i { + margin-right: 10px; + color: var(--accent-color); +} + +.welcome-card { + grid-column: 1 / -1; +} + +/* Status Card */ +.status-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.status-item { + display: flex; + justify-content: space-between; + align-items: center; +} + +.status-badge { + padding: 6px 12px; + border-radius: 20px; + font-size: 13px; + font-weight: 500; + display: flex; + align-items: center; +} + +.status-badge i { + margin-right: 5px; +} + +.status-badge.connected { + background-color: rgba(39, 174, 96, 0.2); + color: var(--status-connected); +} + +.status-badge.not-connected { + background-color: rgba(231, 76, 60, 0.2); + color: var(--status-not-connected); +} + +/* Stats Card */ +.stats-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; +} + +.stat-item { + display: flex; + flex-direction: column; + align-items: center; + padding: 10px; + border-radius: 6px; + background-color: var(--bg-tertiary); +} + +.stat-value { + font-size: 1.8rem; + font-weight: bold; + color: var(--accent-color); +} + +.stat-label { + font-size: 0.9rem; + color: var(--text-secondary); + margin-top: 5px; +} + +/* Action Card */ +.action-buttons { + display: flex; + gap: 10px; +} + +.action-button { + padding: 12px 20px; + border-radius: 6px; + border: none; + font-weight: 600; + display: flex; + align-items: center; + justify-content: center; + flex: 1; + transition: background-color 0.3s, transform 0.2s; +} + +.action-button i { + margin-right: 8px; +} + +.action-button.start { + background-color: var(--button-success-bg); + color: white; +} + +.action-button.start:hover { + background-color: var(--button-success-hover); + transform: translateY(-2px); +} + +.action-button.stop { + background-color: var(--button-danger-bg); + color: white; +} + +.action-button.stop:hover { + background-color: var(--button-danger-hover); + transform: translateY(-2px); +} + +/* Small action button */ +.action-button-small { + padding: 8px 12px; + border-radius: 4px; + border: none; + font-weight: 600; + background-color: var(--button-danger-bg); + color: white; + font-size: 0.9em; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; +} + +.action-button-small:hover { + background-color: var(--button-danger-hover); + transform: translateY(-1px); +} + +/* Danger action button */ +.action-button.danger { + background-color: #e74c3c; + color: #fff; + border: none; + border-radius: 4px; + padding: 6px 12px; + font-size: 13px; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 5px; + transition: background-color 0.2s ease, transform 0.1s ease; + width: fit-content; + max-width: max-content; + white-space: nowrap; +} + +.action-button.danger:hover { + background-color: #c0392b; +} + +.action-button.danger:active { + transform: translateY(0); +} + +.action-button.danger i { + font-size: 12px; + margin-right: 1px; +} + +/* Logs Section */ +.section-header { + margin-bottom: 20px; + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 15px; +} + +.app-tabs, .log-controls { + display: flex; + gap: 10px; + align-items: center; +} + +.app-tab, .settings-tab { + padding: 8px 20px; + background-color: var(--bg-tertiary); + border: none; + border-radius: 20px; + color: var(--text-secondary); + font-weight: 500; + transition: all 0.3s; +} + +.app-tab.active, .settings-tab.active { + background-color: var(--accent-color); + color: white; +} + +.app-tab:hover, .settings-tab:hover { + background-color: var(--accent-hover); + color: white; +} + +.log-options { + display: flex; + align-items: center; + gap: 15px; +} + +.auto-scroll { + display: flex; + align-items: center; + gap: 5px; + font-size: 14px; +} + +.clear-button { + padding: 6px 12px; + background-color: var(--button-danger-bg); + color: white; + border: none; + border-radius: 4px; + display: flex; + align-items: center; + gap: 5px; + transition: background-color 0.3s; +} + +.clear-button:hover { + background-color: var(--button-danger-hover); +} + +.logs { + height: calc(100vh - 160px); + background-color: var(--log-bg); + border: 1px solid var(--log-border); + border-radius: 8px; + padding: 15px; + overflow-y: auto; + font-family: monospace; + white-space: pre-wrap; + word-wrap: break-word; + line-height: 1.5; + font-size: 14px; +} + +.log-entry { + margin-bottom: 5px; + padding: 2px 0; +} + +.log-info { + color: var(--info-color); +} + +.log-warning { + color: var(--warning-color); +} + +.log-error { + color: var(--error-color); +} + +.log-debug { + color: var(--debug-color); +} + +.status-connected { + color: var(--status-connected); + font-weight: 600; +} + +.status-disconnected { + color: var(--status-not-connected); + font-weight: 600; +} + +/* Settings Section */ +.settings-actions { + display: flex; + gap: 10px; +} + +.save-button, .reset-button { + padding: 8px 16px; + border: none; + border-radius: 4px; + font-weight: 500; + display: flex; + align-items: center; + gap: 6px; + transition: background-color 0.3s; +} + +.save-button { + background-color: var(--button-success-bg); + color: white; +} + +.save-button:hover { + background-color: var(--button-success-hover); +} + +.reset-button { + background-color: var(--button-danger-bg); + color: white; +} + +.reset-button:hover { + background-color: var(--button-danger-hover); +} + +.settings-form { + padding: 0; + overflow-y: auto; + height: calc(100vh - 150px); +} + +.app-settings-panel { + display: none; +} + +.app-settings-panel.active { + display: block; +} + +.settings-group { + background-color: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; + position: relative; +} + +.settings-group h3 { + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid var(--border-color); + font-size: 1.1rem; +} + +.setting-item { + margin-bottom: 20px; + display: flex; + flex-wrap: wrap; + align-items: center; +} + +.setting-item label { + width: 200px; + font-weight: 500; + margin-right: 15px; +} + +.setting-item input[type="text"], +.setting-item input[type="number"], +.setting-item input[type="password"] { + width: 300px; + padding: 8px 12px; + border: 1px solid var(--border-color); + border-radius: 4px; + background-color: var(--bg-tertiary); + color: var(--text-primary); +} + +.setting-help { + width: 100%; + margin-top: 5px; + margin-left: 215px; + font-size: 13px; + color: var(--text-muted); +} + +/* Toggle Switch for Settings */ +.toggle-switch { + position: relative; + display: inline-block; + width: 40px; /* Changed to match login page toggle (40px) */ + height: 20px; + flex-shrink: 0; +} + +.toggle-switch input { + opacity: 0; + width: 0; + height: 0; +} + +.toggle-slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--switch-bg); + transition: .4s; + border-radius: 24px; +} + +.toggle-slider:before { + position: absolute; + content: ""; + height: 12px; /* Changed to match login page toggle (12px) */ + width: 12px; /* Changed to match login page toggle (12px) */ + left: 4px; /* Changed to match login page toggle */ + bottom: 4px; /* Changed to match login page toggle */ + background-color: white; + transition: .4s; + border-radius: 50%; +} + +input:checked + .toggle-slider { + background-color: var(--switch-active); +} + +input:checked + .toggle-slider:before { + transform: translateX(20px); /* Changed to match login page toggle (20px) */ +} + +/* Stateful Management Styling */ +.stateful-header-wrapper { + position: relative; + width: 100%; + margin-bottom: 25px; + padding-bottom: 15px; + border-bottom: 1px solid #2d3748; /* Darker border matching the screenshot */ +} + +.stateful-header-wrapper h3 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: var(--text-primary); + padding-bottom: 15px; +} + +.header-line { + display: none; +} + +.stateful-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid var(--border-color); +} + +.stateful-title { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); +} + +.stateful-reset-btn { + padding: 8px 16px; + font-size: 13px; + font-weight: 500; + background-color: var(--button-danger-bg); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s ease; + white-space: nowrap; +} + +.stateful-reset-btn:hover { + background-color: var(--button-danger-hover); +} + +.info-container { + display: flex; + flex-direction: column; + gap: 12px; + padding: 12px; + background-color: var(--bg-tertiary); + border-radius: 6px; + margin-top: 10px; +} + +.date-info-block { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 10px; + background-color: var(--bg-secondary); + border-radius: 4px; + border-left: 4px solid var(--accent-color); +} + +.date-label { + font-weight: 500; + color: var(--text-secondary); +} + +.date-value { + font-family: monospace; + font-size: 14px; + font-weight: 600; + color: var(--accent-color); + padding: 4px 8px; + background-color: rgba(52, 152, 219, 0.1); + border-radius: 4px; +} + +.reset-help { + margin-top: 8px; + font-style: italic; + color: var(--error-color); + font-size: 12px; +} + +/* Settings Stateful Management */ +.setting-info-block { + background-color: var(--bg-tertiary); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 15px; + margin: 10px 0; +} + +.setting-info-block .info-row { + display: flex; + justify-content: space-between; + padding: 5px 0; + border-bottom: 1px solid var(--border-color); +} + +.setting-info-block .info-row:last-child { + border-bottom: none; +} + +.danger-button { + background-color: var(--button-danger-bg); + color: #fff; + border: none; + border-radius: 4px; + padding: 8px 15px; + cursor: pointer; + transition: background-color 0.3s; +} + +.danger-button:hover { + background-color: var(--button-danger-hover); +} + +/* Custom reset button that matches the screenshot exactly */ +.danger-reset-button { + background-color: #e74c3c; /* Solid red to match the image */ + color: white; + border: none; + padding: 6px 12px; + border-radius: 4px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 4px; + transition: background-color 0.2s ease; + width: fit-content; + white-space: nowrap; + position: absolute; + top: 0; + right: 0; +} + +.danger-reset-button:hover { + background-color: #c0392b; +} + +.danger-reset-button i { + font-size: 13px; +} + +/* Make sure settings-group has the right positioning for absolute elements */ +.settings-group { + position: relative; +} + +/* Responsive Adjustments */ +@media (max-width: 768px) { + .sidebar { + width: 60px !important; + min-width: 60px !important; + max-width: 60px !important; + } + + .main-content { + margin-left: 0 !important; + width: calc(100% - 60px) !important; + } + + /* Navbar item adjustments */ + .nav-item { + padding: 10px 0; + justify-content: center; + } + + .nav-item span { + display: none !important; + } + + .nav-icon-wrapper { + margin-right: 0 !important; + } + + /* Logo container */ + .logo-container { + justify-content: center !important; + padding: 15px 0 !important; + } + + .logo-container h1 { + display: none !important; + } + + .logo { + width: 40px !important; + height: 40px !important; + } + + /* Fix active/hover state */ + .nav-item:hover, + .nav-item.active { + background: rgba(65, 105, 225, 0.2) !important; + width: 50px !important; + margin: 0 auto !important; + border-radius: 8px !important; + } + + /* Topbar adjustments */ + .topbar-section.center { + position: relative !important; + left: 0 !important; + transform: none !important; + justify-content: center !important; + } + + /* Version bar */ + .version-bar { + flex-wrap: wrap !important; + gap: 8px !important; + } + + .version-item, .developer-credit { + font-size: 12px !important; + } +} + +@media (max-width: 480px) { + .community-links { + flex-direction: column; + } + + .community-link-card { + width: 100%; + } + + .app-stats-grid { + grid-template-columns: 1fr; + } + + .sponsors-list { + grid-template-columns: repeat(2, 1fr); + } + + .version-bar { + gap: 8px; + } + + .version-divider { + display: none; + } +} + +/* Footer */ +.footer { + text-align: center; + padding: 20px; + margin-top: 20px; + background-color: var(--bg-secondary); + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); + color: var(--text-secondary); + font-size: 14px; +} + +.footer p { + margin: 5px 0; +} + +.footer a { + color: var(--accent-color); + text-decoration: none; + font-weight: 500; + transition: color 0.3s; +} + +.footer a:hover { + text-decoration: underline; + color: var(--accent-hover); +} + +/* Notification styles for async operations */ +.notification { + position: fixed; + top: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 8px; + color: white; + font-weight: 500; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + z-index: 1000; + transform: translateY(-20px); + opacity: 0; + transition: transform 0.3s, opacity 0.3s; +} + +.notification.show { + transform: translateY(0); + opacity: 1; +} + +.notification.success { + background-color: var(--success-color); +} + +.notification.error { + background-color: var(--error-color); +} + +.notification.info { + background-color: var(--info-color); +} + +/* Login Page Styles */ +.login-page { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background-color: var(--bg-primary); +} + +.login-container { + width: 100%; + max-width: 400px; + background-color: var(--bg-secondary); + border-radius: 10px; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); + overflow: hidden; +} + +.login-header { + background-color: var(--sidebar-bg); + color: var(--sidebar-text); + padding: 25px 20px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; +} + +.login-logo { + width: 60px; + height: 60px; + margin-bottom: 10px; +} + +.login-header h1 { + margin: 0; + font-size: 1.8rem; + font-weight: 600; +} + +.login-form { + padding: 25px; +} + +.login-form h2 { + margin: 0 0 20px; + font-size: 1.3rem; + text-align: center; + color: var(--text-primary); +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + color: var(--text-secondary); + font-weight: 500; +} + +.form-group label i { + margin-right: 8px; + color: var(--accent-color); +} + +.form-group input { + width: 100%; + padding: 12px 15px; + border: 1px solid var(--border-color); + border-radius: 4px; + background-color: var(--bg-tertiary); + color: var(--text-primary); + font-size: 16px; + transition: border-color 0.3s; +} + +.form-group input:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2); +} + +.login-button { + width: 100%; + padding: 12px; + background-color: var(--accent-color); + color: white; + border: none; + border-radius: 4px; + font-size: 16px; + font-weight: 500; + cursor: pointer; + display: flex; + align-items: center; + gap: 10px; + transition: background-color 0.3s; +} + +.login-button:hover { + background-color: var(--accent-hover); +} + +.error-message { + color: var(--error-color); + margin: 15px 0; + font-size: 14px; + text-align: center; + min-height: 20px; +} + +.login-form .theme-toggle { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + margin-top: 25px; + color: var(--text-secondary); + font-size: 14px; +} + +.login-form .switch { + width: 40px; + height: 20px; +} + +.login-form .slider:before { + height: 12px; + width: 12px; + left: 4px; + bottom: 4px; +} + +.login-form input:checked + .slider:before { + transform: translateX(20px); +} + +@media (max-width: 480px) { + .login-container { + max-width: 90%; + margin: 0 15px; + } +} + +/* Section header with action button */ +.section-header-with-action { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; + position: relative; + border-bottom: 1px solid var(--border-color); + padding-bottom: 10px; +} + +.section-header-with-action h3 { + margin: 0; + color: var(--text-primary); + font-size: 18px; + font-weight: 600; +} + +.section-header-with-action .icon-button { + padding: 7px 12px; + font-size: 13px; + font-weight: 500; + background-color: var(--button-danger-bg); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + gap: 5px; + margin-left: auto; /* Push to the right edge */ + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} + +.section-header-with-action .icon-button i { + font-size: 14px; +} + +.section-header-with-action .icon-button:hover { + background-color: var(--button-danger-hover); + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.section-header-with-action .icon-button:active { + transform: translateY(0); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} + +/* Fix for trash icon positioning */ +.fa-trash-alt { + display: inline-block; + margin-right: 2px; +} + +/* Reset button in top right corner */ +.top-right-button { + position: absolute !important; + top: 0; + right: 0; + margin: 0 !important; + padding: 6px 10px !important; + font-size: 12px !important; + border-radius: 3px !important; +} + +.top-right-button i { + margin-right: 3px; +} + +/* Stateful management header row with reset button */ +.stateful-header-row { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 12px; + margin-bottom: 20px; + border-bottom: 1px solid #2d3748; /* Dark border line matching the screenshot */ + width: 100%; +} + +.stateful-header-row h3 { + margin: 0; + font-size: 18px; + font-weight: 600; + color: var(--text-primary); +} + +/* Reset button styling exactly matching the screenshot */ +#reset_stateful_btn { + background-color: #e74c3c; + color: white; + border: none; + padding: 5px 12px; + border-radius: 4px; + font-size: 13px; + font-weight: 500; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 5px; + transition: background-color 0.2s ease; +} + +#reset_stateful_btn:hover { + background-color: #c0392b; +} + +#reset_stateful_btn i { + font-size: 13px; +} + +/* Apps Section */ +/* Use the existing log dropdown styles for app section. No custom CSS needed for the dropdown itself. */ + +/* App settings content styling */ +.settings-content { + margin-top: 20px; +} + +.app-apps-panel { + display: none; + width: 100%; +} + +.app-apps-panel.active { + display: block; +} + +/* Instance panel styling */ +.instance-panel { + background-color: var(--bg-secondary, #2c2c2c); + border-radius: 4px; + padding: 15px; + margin-bottom: 15px; + border: 1px solid var(--border-color, #3c3c3c); +} + +.instance-header { + display: flex; + align-items: center; + margin-bottom: 15px; + gap: 10px; + padding-bottom: 10px; + border-bottom: 1px solid var(--border-color, #3c3c3c); +} + +.instance-name { + flex: 1; + padding: 8px; + background-color: var(--bg-tertiary, #252525); + border: 1px solid var(--border-color, #3c3c3c); + border-radius: 4px; + color: var(--text-primary, white); + font-size: 14px; +} + +.form-field { + margin-bottom: 15px; +} + +.form-field label { + display: block; + margin-bottom: 5px; + font-weight: 400; + color: var(--text-primary, #f0f0f0); + font-size: 14px; +} + +.form-field input { + padding: 8px; + background-color: var(--bg-tertiary, #252525); + border: 1px solid var(--border-color, #3c3c3c); + border-radius: 4px; + color: var(--text-primary, white); + width: 100%; + max-width: 500px; + font-size: 14px; +} + +/* Button styling */ +.add-instance-btn { + background-color: var(--accent-color, #007bff); + color: white; + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 14px; + margin-top: 15px; +} + +.add-instance-btn:hover { + background-color: var(--accent-hover, #0069d9); +} + +.remove-instance-btn { + background-color: #dc3545; + color: white; + border: none; + width: 30px; + height: 30px; + border-radius: 4px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} + +.remove-instance-btn:hover { + background-color: #c82333; +} + +.test-connection-btn { + background-color: #28a745; + color: white; + border: none; + padding: 6px 12px; + border-radius: 4px; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 13px; + margin-top: 5px; + transition: background-color 0.2s; +} + +.test-connection-btn:hover { + background-color: #218838; +} + +.test-connection-btn.test-success { + background-color: #28a745; +} + +.test-connection-btn.test-failed { + background-color: #dc3545; +} + +.test-connection-btn:disabled { + opacity: 0.7; + cursor: not-allowed; +} + +/* Match styling with existing settings UI */ +#appsSection .section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + border-bottom: 1px solid var(--border-color, #3c3c3c); + padding-bottom: 10px; +} + +#appsSection .settings-group { + margin-top: 20px; + margin-bottom: 30px; + background-color: var(--bg-secondary, #252525); + border-radius: 4px; + padding: 20px; +} + +#appsSection .settings-group-header { + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid var(--border-color, #363636); + font-size: 16px; + font-weight: 500; + color: var(--text-primary, #f0f0f0); +} + +.loading-panel { + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + color: var(--text-primary, #f0f0f0); + gap: 10px; +} + +.error-panel { + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + color: #dc3545; + gap: 10px; +} + +/* App content panel styling - eliminate box effect */ +.app-content-panel { + border: none; + box-shadow: none; + background: transparent; + padding: 0; +} + +/* Style the direct children of app panels that are creating nested boxes */ +.app-apps-panel > .settings-group { + border: none; + box-shadow: none; + background: transparent; + padding: 0; +} + +/* Instance panel styling - keep these as boxes */ +.instance-panel { + background-color: var(--bg-secondary, #2c2c2c); + border-radius: 4px; + padding: 15px; + margin-bottom: 15px; + border: 1px solid var(--border-color, #3c3c3c); +} \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/static/images/discord.png b/Huntarr.io-6.3.6/frontend/static/images/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..0f20692dee3303c24bbc4e271cf253cd276f359b GIT binary patch literal 740 zcmVJ5pyQ=?H6jh!iK zF&e6kkQj`n^`jb$d}tyS6{!jl5J<2r6hD^NoE{o>YrC+pGux7VlauYvIdk?rJ2ShJ zZ6XmXR;>N2vkJ#8g(pJ7778$C61I>iSPEUcE?!8SHd?f5Zk9y%uI_x)g$wV9918?c zn>JAwtz4s^kPiy55_QqSYn4C%ZBQ^8Ed~(r2%tTu(E01Y;B#PN3i$X1klE&O)c)x! z$2=@@KM^HBG7S`70c%y@?F7)D2c8WBQ`5lGGPiGR@R81`o%|H{<~^`l1@c3jClUZE zsA6+5bBhQhiXSThKW)xq9H4KI3t9h#J!yTjKjkwDP@X}kD$f`MP=N4^8v;xd7prvSTr?UJw{BI5T_}u#b zLo)zv9o%nG$HAWDINrB8<<|;euXzh7P4ezCC { + // Skip handling if currently saving or change detection is suppressed + if (window._appsCurrentlySaving || window._appsSuppressChangeDetection) { + return; + } + + // Only check for navigation away from apps section + const navItem = event.target.closest('.nav-item, a'); + if (navItem) { + const href = navItem.getAttribute('href'); + + // Skip if clicking within the apps section or on external links + if (!href || href === '#apps' || href.startsWith('http') || navItem.getAttribute('target') === '_blank') { + return; + } + + // Immediately clear the settingsChanged flag if we're not actually on the apps page + if (window.location.hash !== '#apps') { + this.settingsChanged = false; + return; + } + + // Check for unsaved changes + if (this.hasUnsavedChanges()) { + if (!confirm('You have unsaved changes. Are you sure you want to leave? Changes will be lost.')) { + event.preventDefault(); + } else { + // User clicked OK, reset the settings changed flag + this.settingsChanged = false; + } + } + } + }); + + // Also handle browser back/forward navigation + window.addEventListener('beforeunload', (event) => { + // Skip if currently saving, suppression active, or not on apps page + if (window._appsCurrentlySaving || + window._appsSuppressChangeDetection || + window.location.hash !== '#apps') { + return; + } + + // Check for unsaved changes + if (this.hasUnsavedChanges()) { + // Show standard browser confirmation + event.preventDefault(); + event.returnValue = 'You have unsaved changes. Are you sure you want to leave? Changes will be lost.'; + return event.returnValue; + } + }); + } + }, + + // Check for unsaved changes before navigating away + hasUnsavedChanges: function() { + // If test connection suppression is active, return false to prevent dialog + if (window._suppressUnsavedChangesDialog === true) { + console.log('Unsaved changes check suppressed due to test connection'); + return false; + } + + // If the app is currently saving, don't consider it as having unsaved changes + if (window._appsCurrentlySaving) { + console.log('Skipping unsaved changes check because app is currently saving'); + return false; + } + + // Check if settings have changed + return this.settingsChanged === true; + }, + + // Cache DOM elements + cacheElements: function() { + this.elements = { + // Apps dropdown + appsOptions: document.querySelectorAll('#appsSection .log-option'), + currentAppsApp: document.getElementById('current-apps-app'), + appsDropdownBtn: document.querySelector('#appsSection .log-dropdown-btn'), + appsDropdownContent: document.querySelector('#appsSection .log-dropdown-content'), + + // Apps panels + appAppsPanels: document.querySelectorAll('.app-apps-panel'), + + // Controls + saveAppsButton: document.getElementById('saveAppsButton') + }; + }, + + // Set up event listeners + setupEventListeners: function() { + // App selection via +

Friendly name for this Sonarr instance

+ +
+ + +

Base URL for Sonarr (e.g., http://localhost:8989)

+
+
+ + +

API key for Sonarr

+
+
+ + +
+ + + `; + }); + + instancesHtml += ` + +
+ +
+ + `; + + // Search Settings + let searchSettingsHtml = ` +
+

Search Settings

+
+ + +

How to search for missing Sonarr content (Season Packs recommended for torrent users)

+
+
+ + +

Number of missing items to search per cycle (0 to disable)

+
+
+ + +

Number of episodes to upgrade per cycle (0 to disable)

+
+
+ + +

Time in seconds between processing cycles

+
+
+ +
+

Additional Options

+
+ + +

Only search for monitored items

+
+
+ + +

Skip searching for episodes with future air dates

+
+
+ + +

Skip refreshing series metadata before searching

+
+
+ `; + + // Set the content + container.innerHTML = instancesHtml + searchSettingsHtml; + + // Setup instance management (add/remove/test) + SettingsForms.setupInstanceManagement(container, 'sonarr', settings.instances.length); + }, + + // Generate Radarr settings form + generateRadarrForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'radarr'); + + // Make sure the instances array exists + if (!settings.instances || !Array.isArray(settings.instances) || settings.instances.length === 0) { + settings.instances = [{ + name: "Default", + api_url: settings.api_url || "", + api_key: settings.api_key || "", + enabled: true + }]; + } + + // Create a container for instances with a scrollable area for many instances + let instancesHtml = ` +
+

Radarr Instances

+
+ `; + + // Generate form elements for each instance + settings.instances.forEach((instance, index) => { + instancesHtml += ` +
+
+

Instance ${index + 1}: ${instance.name || 'Unnamed'}

+
+ ${index > 0 ? '' : ''} + +
+
+
+
+ + +

Friendly name for this Radarr instance

+
+
+ + +

Base URL for Radarr (e.g., http://localhost:7878)

+
+
+ + +

API key for Radarr

+
+
+ + +
+
+
+ `; + }); + + // Add a button to add new instances (limit to 9 total) + instancesHtml += ` +
+
+ +
+
+ `; + + // Continue with the rest of the settings form + container.innerHTML = ` + ${instancesHtml} + +
+

Search Settings

+
+ + +

Number of missing movies to search per cycle (0 to disable)

+
+
+ + +

Number of movies to search for quality upgrades per cycle (0 to disable)

+
+
+ + +

Time in seconds between processing cycles

+
+
+ +
+

Additional Options

+
+ + +

Only search for monitored items

+
+
+ + +

Skip searching for movies with future release dates

+
+
+ + +

Select which release date type to use when determining if a movie is considered a future release

+
+
+ + +

Skip refreshing movie metadata before searching

+
+
+ `; + + // Add event listeners for the instance management + SettingsForms.setupInstanceManagement(container, 'radarr', settings.instances.length); + + // Set up event listeners for the skip_future_releases checkbox + const skipFutureCheckbox = container.querySelector('#skip_future_releases'); + const releaseTypeContainer = container.querySelector('#future_release_type_container'); + + if (skipFutureCheckbox) { + skipFutureCheckbox.addEventListener('change', function() { + if (this.checked) { + releaseTypeContainer.style.display = ''; + } else { + releaseTypeContainer.style.display = 'none'; + } + }); + } + }, + + // Generate Lidarr settings form + generateLidarrForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'lidarr'); + + // Make sure the instances array exists + if (!settings.instances || !Array.isArray(settings.instances) || settings.instances.length === 0) { + settings.instances = [{ + name: "Default", + api_url: settings.api_url || "", // Legacy support + api_key: settings.api_key || "", // Legacy support + enabled: true + }]; + } + + // Create a container for instances + let instancesHtml = ` +
+

Lidarr Instances

+
+ `; + + // Generate form elements for each instance + settings.instances.forEach((instance, index) => { + instancesHtml += ` +
+
+

Instance ${index + 1}: ${instance.name || 'Unnamed'}

+
+ ${index > 0 ? '' : ''} + +
+
+
+
+ + +

Friendly name for this Lidarr instance

+
+
+ + +

Base URL for Lidarr (e.g., http://localhost:8686)

+
+
+ + +

API key for Lidarr

+
+
+ + +
+
+
+ `; + }); + + instancesHtml += ` +
+
+ +
+
+ `; + + // Continue with the rest of the settings form + container.innerHTML = ` + ${instancesHtml} + +
+

Search Settings

+
+ + +

Whether to search by artist (all missing albums for artist) or individual albums

+
+
+ + +

Number of artists with missing albums to search per cycle (0 to disable)

+
+ +
+ + +

Number of albums to search for quality upgrades per cycle (0 to disable)

+
+
+ + +

Time in seconds between processing cycles

+
+
+ +
+

Additional Options

+
+ + +

Only search for monitored items

+
+
+ + +

Skip searching for albums with future release dates

+
+
+ + +

Skip refreshing artist metadata before searching

+
+
+ `; + + // Add event listeners for the instance management + SettingsForms.setupInstanceManagement(container, 'lidarr', settings.instances.length); + }, + + // Generate Readarr settings form + generateReadarrForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'readarr'); + + // Make sure the instances array exists + if (!settings.instances || !Array.isArray(settings.instances) || settings.instances.length === 0) { + settings.instances = [{ + name: "Default", + api_url: settings.api_url || "", // Legacy support + api_key: settings.api_key || "", // Legacy support + enabled: true + }]; + } + + // Create a container for instances + let instancesHtml = ` +
+

Readarr Instances

+
+ `; + + // Generate form elements for each instance + settings.instances.forEach((instance, index) => { + instancesHtml += ` +
+
+

Instance ${index + 1}: ${instance.name || 'Unnamed'}

+
+ ${index > 0 ? '' : ''} + +
+
+
+
+ + +

Friendly name for this Readarr instance

+
+
+ + +

Base URL for Readarr (e.g., http://localhost:8787)

+
+
+ + +

API key for Readarr

+
+
+ + +
+
+
+ `; + }); + + instancesHtml += ` +
+
+ +
+
+ `; + + // Continue with the rest of the settings form + container.innerHTML = ` + ${instancesHtml} + +
+

Search Settings

+
+ + +

Number of missing books to search per cycle (0 to disable)

+
+
+ + +

Number of books to search for quality upgrades per cycle (0 to disable)

+
+
+ + +

Time in seconds between processing cycles

+
+
+ +
+

Additional Options

+
+ + +

Only search for monitored items

+
+
+ + +

Skip searching for books with future release dates

+
+
+ + +

Skip refreshing author metadata before searching

+
+
+ `; + + // Add event listeners for the instance management + SettingsForms.setupInstanceManagement(container, 'readarr', settings.instances.length); + }, + + // Generate Whisparr settings form + generateWhisparrForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'whisparr'); + + // Make sure the instances array exists + if (!settings.instances || !Array.isArray(settings.instances) || settings.instances.length === 0) { + settings.instances = [{ + name: "Default", + api_url: "", + api_key: "", + enabled: true + }]; + } + + // Create a container for instances + let instancesHtml = ` +
+

Whisparr V2 Instances

+
+ `; + + // Generate form elements for each instance + settings.instances.forEach((instance, index) => { + instancesHtml += ` +
+
+

Instance ${index + 1}: ${instance.name || 'Unnamed'}

+
+ ${index > 0 ? '' : ''} + +
+
+
+
+ + +

Friendly name for this Whisparr V2 instance

+
+
+ + +

Base URL for Whisparr V2 (e.g., http://localhost:6969)

+
+
+ + +

API key for Whisparr V2

+
+
+ + +
+
+
+ `; + }); + + instancesHtml += ` +
+
+ +
+
+ `; + + // Search Settings + let searchSettingsHtml = ` +
+

Search Settings

+
+ + +

Number of missing items to search per cycle (0 to disable)

+
+
+ + +

Number of items to search for quality upgrades per cycle (0 to disable)

+
+
+ + +

Time in seconds between processing cycles

+
+
+ +
+

Additional Options

+
+ + +

Only search for monitored items

+
+
+ + +

Skip searching for scenes with future release dates

+
+
+ + +

Skip refreshing series metadata before searching

+
+
+ + +

Skip refreshing scene info before searching

+
+
+ `; + + // Set the content + container.innerHTML = instancesHtml + searchSettingsHtml; + + // Add event listeners for the instance management + this.setupInstanceManagement(container, 'whisparr', settings.instances.length); + + // Update duration display + this.updateDurationDisplay(); + }, + + // Generate Eros settings form + generateErosForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'eros'); + + // Make sure the instances array exists + if (!settings.instances || !Array.isArray(settings.instances) || settings.instances.length === 0) { + settings.instances = [{ + name: "Default", + api_url: "", + api_key: "", + enabled: true + }]; + } + + // Create a container for instances + let instancesHtml = ` +
+

Whisparr V3 Instances

+
+ `; + + // Generate form elements for each instance + settings.instances.forEach((instance, index) => { + instancesHtml += ` +
+
+

Instance ${index + 1}: ${instance.name || 'Unnamed'}

+
+ ${index > 0 ? '' : ''} + +
+
+
+
+ + +

Friendly name for this Whisparr V3 instance

+
+
+ + +

Base URL for Whisparr V3 (e.g., http://localhost:6969)

+
+
+ + +

API key for Whisparr V3

+
+
+ + +
+
+
+ `; + }); + + instancesHtml += ` +
+
+ +
+
+ `; + + // Search Mode dropdown + let searchSettingsHtml = ` +
+

Search Settings

+
+ + +

How to search for missing and upgradable Whisparr V3 content (Movie-based or Scene-based)

+
+
+ + +

Number of missing items to search per cycle (0 to disable)

+
+
+ + +

Number of items to search for quality upgrades per cycle (0 to disable)

+
+
+ + +

Time in seconds between processing cycles

+
+
+ +
+

Additional Options

+
+ + +

Only search for monitored items

+
+
+ + +

Skip searching for scenes with future release dates

+
+
+ + +

Skip refreshing movie metadata before searching (strongly recommended to enable this for Whisparr V3)

+
+
+ `; + + // Set the content + container.innerHTML = instancesHtml + searchSettingsHtml; + + // Add event listeners for the instance management + this.setupInstanceManagement(container, 'eros', settings.instances.length); + + // Update duration display + this.updateDurationDisplay(); + }, + + // Generate Swaparr settings form + generateSwaparrForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'swaparr'); + + container.innerHTML = ` +
+

Swaparr (Beta) - Only For Torrent Users

+
+

Swaparr addresses the issue of stalled downloads and I rewrote it to support Huntarr. Visit Swaparr's GitHub for more information and support the developer!

+
+
+ +
+

Swaparr Settings

+
+ + +

Enable automatic handling of stalled downloads

+
+
+ + +

Number of strikes before removing a stalled download

+
+
+ + +

Maximum time a download can be stalled (e.g., 30m, 2h, 1d)

+
+
+ + +

Ignore files larger than this size (e.g., 1GB, 25GB, 1TB)

+
+
+ + +

Remove the download from the torrent/usenet client when removed

+
+
+ + +

Log actions but don't actually remove downloads. Useful for testing the first time!

+
+
+ +
+

Swaparr Status

+
+
+ +
+
+

Loading Swaparr status...

+
+
+
+ `; + + // Load Swaparr status automatically + const resetStrikesBtn = container.querySelector('#reset_swaparr_strikes'); + const statusContainer = container.querySelector('#swaparr_status'); + + fetch('/api/swaparr/status') + .then(response => response.json()) + .then(data => { + let statusHTML = ''; + + // Add stats for each app if available + if (data.statistics && Object.keys(data.statistics).length > 0) { + statusHTML += '
    '; + + for (const [app, stats] of Object.entries(data.statistics)) { + statusHTML += `
  • ${app.toUpperCase()}: `; + if (stats.error) { + statusHTML += `Error: ${stats.error}
  • `; + } else { + statusHTML += `${stats.currently_striked} currently striked, ${stats.removed} removed (${stats.total_tracked} total tracked)`; + } + } + + statusHTML += '
'; + } else { + statusHTML += '

No statistics available yet.

'; + } + + statusContainer.innerHTML = statusHTML; + }) + .catch(error => { + console.error('Error loading Swaparr status:', error); + statusContainer.innerHTML = `

Error fetching status: ${error.message}

`; + }); + + // Add event listener for the Reset Strikes button + if (resetStrikesBtn) { + resetStrikesBtn.addEventListener('click', function() { + if (confirm('Are you sure you want to reset all Swaparr strikes? This will clear the strike history for all apps.')) { + statusContainer.innerHTML = '

Resetting strikes...

'; + + fetch('/api/swaparr/reset', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({}) + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + statusContainer.innerHTML = `

Success: ${data.message}

`; + // Reload status after a short delay + setTimeout(() => { + fetch('/api/swaparr/status') + .then(response => response.json()) + .then(data => { + let statusHTML = ''; + if (data.statistics && Object.keys(data.statistics).length > 0) { + statusHTML += '
    '; + for (const [app, stats] of Object.entries(data.statistics)) { + statusHTML += `
  • ${app.toUpperCase()}: `; + if (stats.error) { + statusHTML += `Error: ${stats.error}
  • `; + } else { + statusHTML += `${stats.currently_striked} currently striked, ${stats.removed} removed (${stats.total_tracked} total tracked)`; + } + } + statusHTML += '
'; + } else { + statusHTML += '

No statistics available yet.

'; + } + statusContainer.innerHTML = statusHTML; + }); + }, 1000); + } else { + statusContainer.innerHTML = `

Error: ${data.message}

`; + } + }) + .catch(error => { + statusContainer.innerHTML = `

Error resetting strikes: ${error.message}

`; + }); + } + }); + } else if (!resetStrikesBtn) { + console.warn('Could not find #reset_swaparr_strikes to attach listener.'); + } else { + console.warn('huntarrUI or huntarrUI.resetStatefulManagement is not available.'); + } + + // Add confirmation dialog for local access bypass toggle + const localAccessBypassCheckbox = container.querySelector('#local_access_bypass'); + if (localAccessBypassCheckbox) { + // Store original state + const originalState = localAccessBypassCheckbox.checked; + + localAccessBypassCheckbox.addEventListener('change', function() { + const newState = this.checked; + + // Preview the UI changes immediately, but they'll be reverted if user doesn't save + if (typeof huntarrUI !== 'undefined' && typeof huntarrUI.updateUIForLocalAccessBypass === 'function') { + huntarrUI.updateUIForLocalAccessBypass(newState); + } + // Also ensure the main app knows settings have changed if the preview runs + if (typeof huntarrUI !== 'undefined' && typeof huntarrUI.markSettingsAsChanged === 'function') { + huntarrUI.markSettingsAsChanged(); + } + }); + } + }, + + // Format date nicely for display + formatDate: function(date) { + if (!date) return 'Never'; + + const options = { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + hour12: true + }; + + return date.toLocaleString('en-US', options); + }, + + // Get settings from form + getFormSettings: function(container, appType) { + let settings = {}; + + // Helper function to get input value with fallback + function getInputValue(selector, defaultValue) { + const element = container.querySelector(selector); + if (!element) return defaultValue; + + if (element.type === 'checkbox') { + return element.checked; + } else if (element.type === 'number') { + const parsedValue = parseInt(element.value); + return !isNaN(parsedValue) ? parsedValue : defaultValue; + } else { + return element.value || defaultValue; + } + } + + // For the general settings form, collect settings including advanced settings + if (appType === 'general') { + settings.themeName = getInputValue('#theme-select', 'dark'); + settings.resetInterval = getInputValue('#resetInterval', 168); + settings.clearCache = getInputValue('#clearCache', false); + settings.refreshSchedule = getInputValue('#refreshSchedule', false); + settings.disableSorting = getInputValue('#disableSorting', false); + settings.disableNotifications = getInputValue('#disableNotifications', false); + settings.openInNewTab = getInputValue('#openInNewTab', false); + settings.saveColumnSortState = getInputValue('#saveColumnSortState', true); + settings.disableAnimation = getInputValue('#disableAnimation', false); + settings.useCompactLayout = getInputValue('#useCompactLayout', false); + settings.disableAllowListPopup = getInputValue('#disableAllowListPopup', false); + settings.maxHistoryItems = getInputValue('#maxHistoryItems', 100); + settings.maxLogItems = getInputValue('#maxLogItems', 200); + settings.stateful_management_hours = getInputValue('#stateful_management_hours', 168); + settings.autoLoginWithoutPassword = getInputValue('#autoLoginWithoutPassword', false); + + // Add collection of advanced settings + settings.api_timeout = getInputValue('#api_timeout', 120); + settings.command_wait_delay = getInputValue('#command_wait_delay', 1); + settings.command_wait_attempts = getInputValue('#command_wait_attempts', 600); + settings.minimum_download_queue_size = getInputValue('#minimum_download_queue_size', -1); + settings.log_refresh_interval_seconds = getInputValue('#log_refresh_interval_seconds', 30); + } + + // For other app types, collect settings + else { + // Handle instances differently + const instances = []; + // Find instance containers with both old and new class names + const instanceContainers = container.querySelectorAll('.instance-item, .instance-panel'); + + // Collect instance data with improved error handling + instanceContainers.forEach((instance, index) => { + const nameInput = instance.querySelector('input[name="name"]'); + const urlInput = instance.querySelector('input[name="api_url"]'); + const keyInput = instance.querySelector('input[name="api_key"]'); + const enabledInput = instance.querySelector('input[name="enabled"]'); + + const name = nameInput ? nameInput.value : null; + const url = urlInput ? urlInput.value : null; + const key = keyInput ? keyInput.value : null; + const enabled = enabledInput ? enabledInput.checked : true; // Default to enabled if checkbox not found + + if (!name || !url || !key) { + console.warn(`Instance ${index} is missing required fields`); + } + + const instanceObj = { + name: name || `Instance ${index + 1}`, + api_url: url || "", + api_key: key || "", + enabled: enabled + }; + + instances.push(instanceObj); + }); + + // Ensure we always have at least one instance + if (instances.length === 0) { + console.warn('No instances found, adding a default empty instance'); + instances.push({ + name: 'Default', + api_url: '', + api_key: '', + enabled: true + }); + } + + settings.instances = instances; + + // Add app-specific settings + if (appType === 'sonarr') { + settings.hunt_missing_mode = getInputValue('#sonarr-hunt-missing-mode', 'episodes'); + settings.hunt_missing_items = getInputValue('#sonarr-hunt-missing-items', 1); + settings.hunt_upgrade_items = getInputValue('#sonarr-hunt-upgrade-items', 0); + settings.sleep_duration = getInputValue('#sonarr_sleep_duration', 900); + settings.monitored_only = getInputValue('#sonarr_monitored_only', true); + settings.skip_future_episodes = getInputValue('#sonarr_skip_future_episodes', true); + settings.skip_series_refresh = getInputValue('#sonarr_skip_series_refresh', false); + } + else if (appType === 'radarr') { + settings.hunt_missing_movies = getInputValue('#radarr_hunt_missing_movies', 1); + settings.hunt_upgrade_movies = getInputValue('#radarr_hunt_upgrade_movies', 0); + settings.monitored_only = getInputValue('#radarr_monitored_only', true); + settings.skip_future_releases = getInputValue('#skip_future_releases', true); + settings.skip_movie_refresh = getInputValue('#skip_movie_refresh', false); + settings.sleep_duration = getInputValue('#radarr_sleep_duration', 900); + settings.release_type = getInputValue('#release_type', 'physical'); + } + else if (appType === 'lidarr') { + settings.hunt_missing_items = getInputValue('#lidarr_hunt_missing_items', 1); + settings.hunt_upgrade_items = getInputValue('#lidarr_hunt_upgrade_items', 0); + settings.hunt_missing_mode = getInputValue('#lidarr_hunt_missing_mode', 'artist'); + settings.monitored_only = getInputValue('#lidarr_monitored_only', true); + settings.sleep_duration = getInputValue('#lidarr_sleep_duration', 900); + } + else if (appType === 'readarr') { + settings.hunt_missing_books = getInputValue('#readarr_hunt_missing_books', 1); + settings.hunt_upgrade_books = getInputValue('#readarr_hunt_upgrade_books', 0); + settings.monitored_only = getInputValue('#readarr_monitored_only', true); + settings.skip_future_releases = getInputValue('#readarr_skip_future_releases', true); + settings.skip_author_refresh = getInputValue('#skip_author_refresh', false); + settings.sleep_duration = getInputValue('#readarr_sleep_duration', 900); + } + else if (appType === 'whisparr') { + settings.hunt_missing_items = getInputValue('#whisparr_hunt_missing_items', 1); + settings.hunt_upgrade_items = getInputValue('#whisparr_hunt_upgrade_items', 0); + settings.monitored_only = getInputValue('#whisparr_monitored_only', true); + settings.whisparr_version = getInputValue('#whisparr-api-version', 'v3'); + settings.skip_future_releases = getInputValue('#whisparr_skip_future_releases', true); + settings.sleep_duration = getInputValue('#whisparr_sleep_duration', 900); + } + else if (appType === 'eros') { + settings.search_mode = getInputValue('#eros_search_mode', 'movie'); + settings.hunt_missing_items = getInputValue('#eros_hunt_missing_items', 1); + settings.hunt_upgrade_items = getInputValue('#eros_hunt_upgrade_items', 0); + settings.monitored_only = getInputValue('#eros_monitored_only', true); + settings.skip_future_releases = getInputValue('#eros_skip_future_releases', true); + settings.skip_item_refresh = getInputValue('#eros_skip_item_refresh', false); + settings.sleep_duration = getInputValue('#eros_sleep_duration', 900); + } + else if (appType === 'swaparr') { + settings.enabled = getInputValue('#swaparr_enabled', false); + settings.max_strikes = getInputValue('#swaparr_max_strikes', 3); + settings.max_download_time = getInputValue('#swaparr_max_download_time', '2h'); + settings.ignore_above_size = getInputValue('#swaparr_ignore_above_size', '25GB'); + settings.remove_from_client = getInputValue('#swaparr_remove_from_client', true); + settings.dry_run = getInputValue('#swaparr_dry_run', false); + } + } + + console.log('Collected settings for', appType, settings); + return settings; + }, + + // Generate General settings form + generateGeneralForm: function(container, settings = {}) { + // Add data-app-type attribute to container + container.setAttribute('data-app-type', 'general'); + + container.innerHTML = ` +
+

System Settings

+
+ + +

Automatically check for Huntarr updates

+
+
+ + +

Enable verbose logging for troubleshooting (applies to all apps)

+
+
+ + +

Interval in seconds to refresh log display (applies to all apps)

+
+
+ +
+
+

Stateful Management

+ +
+
+ +
+
+
Initial State Created:
+
Loading...
+
+
+
State Reset Date:
+
Loading...
+
+
+
+
+ + +

Hours before resetting processed media state (${((settings.stateful_management_hours || 168) / 24).toFixed(1)} days)

+

Reset clears all processed media IDs to allow reprocessing

+
+
+ +
+

Security

+
+ + +

Allow access without login when connecting from local network IP addresses (e.g., 192.168.x.x, 10.x.x.x)

+
+
+ +
+

Advanced Settings

+
+ + +

API request timeout in seconds

+
+
+ + +

Delay between command status checks in seconds

+
+
+ + +

Maximum number of attempts to check command status

+
+
+ + + If the current download queue for an app instance exceeds this value, downloads will be skipped until the queue reduces. Set to -1 to disable this limit. This setting applies per app instance. +
+
+ + +

How often Huntarr refreshes logs from apps (seconds)

+
+
+ `; + + // Get hours input and days span elements once + const statefulHoursInput = container.querySelector('#stateful_management_hours'); + const statefulDaysSpan = container.querySelector('#stateful_management_days'); + + if (statefulHoursInput && statefulDaysSpan) { + statefulHoursInput.addEventListener('input', function() { + const hours = parseInt(this.value); + const days = (hours / 24).toFixed(1); + statefulDaysSpan.textContent = `${days} days`; + }); + } + + // Load stateful management info + const createdDateEl = document.getElementById('stateful_initial_state'); + const expiresDateEl = document.getElementById('stateful_expires_date'); + + // Skip loading if huntarrUI has already loaded this data to prevent flashing + if (window.huntarrUI && window.huntarrUI._cachedStatefulData) { + console.log('[SettingsForms] Using existing huntarrUI cached stateful data'); + return; // Exit early - main.js already has this covered + } + + // Only set to Loading if not already populated + if (createdDateEl && (!createdDateEl.textContent || createdDateEl.textContent === 'N/A')) { + createdDateEl.textContent = 'Loading...'; + } + if (expiresDateEl && (!expiresDateEl.textContent || expiresDateEl.textContent === 'N/A')) { + expiresDateEl.textContent = 'Loading...'; + } + + // Check if data is already cached in localStorage + const cachedStatefulData = localStorage.getItem('huntarr-stateful-data'); + if (cachedStatefulData) { + try { + const parsedData = JSON.parse(cachedStatefulData); + const cacheAge = Date.now() - parsedData.timestamp; + + // Use cache if it's less than 5 minutes old + if (cacheAge < 300000) { + console.log('[SettingsForms] Using cached stateful data'); + + if (createdDateEl && parsedData.created_at_ts) { + const createdDate = new Date(parsedData.created_at_ts * 1000); + createdDateEl.textContent = this.formatDate(createdDate); + } + + if (expiresDateEl && parsedData.expires_at_ts) { + const expiresDate = new Date(parsedData.expires_at_ts * 1000); + expiresDateEl.textContent = this.formatDate(expiresDate); + } + + // Still fetch fresh data in the background, but don't update UI + fetchStatefulInfoSilently(); + return; + } + } catch (e) { + console.warn('[SettingsForms] Error parsing cached stateful data:', e); + } + } + + fetch('/api/stateful/info', { + cache: 'no-cache', + headers: { + 'Cache-Control': 'no-cache, no-store, must-revalidate', + 'Pragma': 'no-cache', + 'Expires': '0' + } + }) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + return response.json(); + }) + .then(data => { + // Cache the response with a timestamp for future use + localStorage.setItem('huntarr-stateful-data', JSON.stringify({ + ...data, + timestamp: Date.now() + })); + + if (createdDateEl) { + if (data.created_at_ts) { + const createdDate = new Date(data.created_at_ts * 1000); + createdDateEl.textContent = this.formatDate(createdDate); + } else { + createdDateEl.textContent = 'Not yet created'; + } + } + + if (expiresDateEl) { + if (data.expires_at_ts) { + const expiresDate = new Date(data.expires_at_ts * 1000); + expiresDateEl.textContent = this.formatDate(expiresDate); + } else { + expiresDateEl.textContent = 'Not set'; + } + } + + // Store data for other components to use + if (window.huntarrUI) { + window.huntarrUI._cachedStatefulData = data; + } + }) + .catch(error => { + console.error('Error loading stateful info:', error); + + // Try using cached data as fallback + if (cachedStatefulData) { + try { + const parsedData = JSON.parse(cachedStatefulData); + + if (createdDateEl && parsedData.created_at_ts) { + const createdDate = new Date(parsedData.created_at_ts * 1000); + createdDateEl.textContent = this.formatDate(createdDate) + ' (cached)'; + } else if (createdDateEl) { + createdDateEl.textContent = 'Not available'; + } + + if (expiresDateEl && parsedData.expires_at_ts) { + const expiresDate = new Date(parsedData.expires_at_ts * 1000); + expiresDateEl.textContent = this.formatDate(expiresDate) + ' (cached)'; + } else if (expiresDateEl) { + expiresDateEl.textContent = 'Not available'; + } + } catch (e) { + if (createdDateEl) createdDateEl.textContent = 'Not available'; + if (expiresDateEl) expiresDateEl.textContent = 'Not available'; + } + } else { + if (createdDateEl) createdDateEl.textContent = 'Not available'; + if (expiresDateEl) expiresDateEl.textContent = 'Not available'; + } + }); + + // Helper function to fetch data silently without updating UI + function fetchStatefulInfoSilently() { + fetch('/api/stateful/info', { + cache: 'no-cache', + headers: { + 'Cache-Control': 'no-cache, no-store, must-revalidate', + 'Pragma': 'no-cache', + 'Expires': '0' + } + }) + .then(response => response.ok ? response.json() : null) + .then(data => { + if (data && data.success) { + localStorage.setItem('huntarr-stateful-data', JSON.stringify({ + ...data, + timestamp: Date.now() + })); + + if (window.huntarrUI) { + window.huntarrUI._cachedStatefulData = data; + } + } + }) + .catch(error => console.warn('Silent stateful info fetch failed:', error)); + } + }, + + // Update duration display - e.g., convert seconds to hours + updateDurationDisplay: function() { + // Function to update a specific sleep duration display + const updateSleepDisplay = function(inputId, spanId) { + const input = document.getElementById(inputId); + const span = document.getElementById(spanId); + if (!input || !span) return; + + const seconds = parseInt(input.value); + if (isNaN(seconds)) return; + + const hours = (seconds / 3600).toFixed(1); + if (hours < 1) { + const minutes = Math.round(seconds / 60); + span.textContent = `${minutes} minutes`; + } else { + span.textContent = `${hours} hours`; + } + }; + + // Update for each app + updateSleepDisplay('sleep_duration', 'sleep_duration_hours'); + updateSleepDisplay('radarr_sleep_duration', 'radarr_sleep_duration_hours'); + updateSleepDisplay('lidarr_sleep_duration', 'lidarr_sleep_duration_hours'); + updateSleepDisplay('readarr_sleep_duration', 'readarr_sleep_duration_hours'); + updateSleepDisplay('whisparr_sleep_duration', 'whisparr_sleep_duration_hours'); // Added Whisparr + }, + + // Setup instance management - test connection buttons and add/remove instance buttons + setupInstanceManagement: function(container, appType, initialCount) { + console.log(`Setting up instance management for ${appType} with ${initialCount} instances`); + + // Make sure container has the app type set + const form = container.closest('.settings-form'); + if (form && !form.hasAttribute('data-app-type')) { + form.setAttribute('data-app-type', appType); + } + + // Add listeners for test connection buttons + const testButtons = container.querySelectorAll('.test-connection-btn'); + testButtons.forEach(button => { + button.addEventListener('click', (e) => { + // Prevent any default form submission + e.preventDefault(); + + console.log('Test connection button clicked'); + + // Get the instance panel containing this button - look for both old and new class names + const instancePanel = button.closest('.instance-item') || button.closest('.instance-panel'); + if (!instancePanel) { + console.error('Could not find instance panel for test button', button); + alert('Error: Could not find instance panel'); + return; + } + + // Get the URL and API key inputs directly within this instance panel + const urlInput = instancePanel.querySelector('input[name="api_url"]'); + const keyInput = instancePanel.querySelector('input[name="api_key"]'); + + console.log('Found inputs:', urlInput, keyInput); + + if (!urlInput || !keyInput) { + console.error('Could not find URL or API key inputs in panel', instancePanel); + alert('Error: Could not find URL or API key inputs'); + return; + } + + const url = urlInput.value.trim(); + const apiKey = keyInput.value.trim(); + + console.log(`Testing connection for ${appType} - URL: ${url}, API Key: ${apiKey.substring(0, 5)}...`); + + if (!url) { + alert('Please enter a valid URL'); + urlInput.focus(); + return; + } + + if (!apiKey) { + alert('Please enter a valid API key'); + keyInput.focus(); + return; + } + + // Show testing status + const originalButtonHTML = button.innerHTML; + button.innerHTML = ' Testing...'; + button.disabled = true; + + // Make the API request + fetch(`/api/${appType}/test-connection`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + api_url: url, + api_key: apiKey + }) + }) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error ${response.status}: ${response.statusText}`); + } + return response.json(); + }) + .then(data => { + console.log(`Test connection response:`, data); + + // Reset button + button.disabled = false; + + if (data.success) { + // Success + button.innerHTML = ' Connected!'; + button.classList.add('test-success'); + + let successMessage = `Successfully connected to ${appType.charAt(0).toUpperCase() + appType.slice(1)}`; + if (data.version) { + successMessage += ` (version ${data.version})`; + } + + // Alert the user of success + alert(successMessage); + + // Reset button after delay + setTimeout(() => { + button.innerHTML = originalButtonHTML; + button.classList.remove('test-success'); + }, 3000); + } else { + // Failure + button.innerHTML = ' Failed'; + button.classList.add('test-failed'); + + alert(`Connection failed: ${data.message || 'Unknown error'}`); + + setTimeout(() => { + button.innerHTML = originalButtonHTML; + button.classList.remove('test-failed'); + }, 3000); + } + }) + .catch(error => { + console.error(`Test connection error:`, error); + + button.disabled = false; + button.innerHTML = ' Error'; + button.classList.add('test-failed'); + + alert(`Connection test failed: ${error.message}`); + + setTimeout(() => { + button.innerHTML = originalButtonHTML; + button.classList.remove('test-failed'); + }, 3000); + }); + }); + }); + + // Add a button to add new instances (limit to 9 total) + const addBtn = container.querySelector(`.add-${appType}-instance-btn`); + if (addBtn) { + // Function to update the button text with current instance count + const updateAddButtonText = () => { + const instancesContainer = container.querySelector('.instances-container'); + if (!instancesContainer) return; + const currentCount = instancesContainer.querySelectorAll('.instance-item').length; + addBtn.innerHTML = ` Add ${appType.charAt(0).toUpperCase() + appType.slice(1)} Instance (${currentCount}/9)`; + + // Disable button if we've reached the maximum + if (currentCount >= 9) { + addBtn.disabled = true; + addBtn.title = "Maximum number of instances reached"; + } else { + addBtn.disabled = false; + addBtn.title = ""; + } + }; + + // Initialize button text + updateAddButtonText(); + + addBtn.addEventListener('click', function() { + const instancesContainer = container.querySelector('.instances-container'); + if (!instancesContainer) return; + + // Count current instances + const currentCount = instancesContainer.querySelectorAll('.instance-item').length; + + // Don't add more if we have 9 already + if (currentCount >= 9) { + alert("Maximum of 9 instances allowed"); + return; + } + + // Create new instance div + const newInstanceDiv = document.createElement('div'); + newInstanceDiv.className = 'instance-item'; // Use instance-item + newInstanceDiv.dataset.instanceId = currentCount; + + // Set content for the new instance using the updated structure + newInstanceDiv.innerHTML = ` +
+

Instance ${currentCount + 1}: Instance ${currentCount + 1}

+
+ + +
+
+
+
+ + +

Friendly name for this ${appType} instance

+
+
+ + +

Base URL for ${appType} (e.g., http://localhost:8989)

+
+
+ + +

API key for ${appType}

+
+
+ + +
+
+ `; + + // Add the new instance to the container + instancesContainer.appendChild(newInstanceDiv); + + // Update the button text with new count + updateAddButtonText(); + + // Add event listener for the remove button + const removeBtn = newInstanceDiv.querySelector('.remove-instance-btn'); + if (removeBtn) { + removeBtn.addEventListener('click', function() { + instancesContainer.removeChild(newInstanceDiv); + + // Update the add button text after removing + updateAddButtonText(); + + // Trigger change event to update save button state + const changeEvent = new Event('change'); + container.dispatchEvent(changeEvent); + }); + } + + // Add event listener for test connection button + const testBtn = newInstanceDiv.querySelector('.test-connection-btn'); + if (testBtn) { + testBtn.addEventListener('click', function() { + // Get the URL and API key inputs from the parent instance item + const instanceContainer = testBtn.closest('.instance-item') || testBtn.closest('.instance-panel'); + if (!instanceContainer) { + alert('Error: Could not find instance container'); + return; + } + + const urlInput = instanceContainer.querySelector('input[name="api_url"]'); + const keyInput = instanceContainer.querySelector('input[name="api_key"]'); + + if (!urlInput || !keyInput) { + alert('Error: Could not find URL or API key inputs'); + return; + } + + const url = urlInput.value.trim(); + const apiKey = keyInput.value.trim(); + + if (!url) { + alert('Please enter a valid URL'); + urlInput.focus(); + return; + } + + if (!apiKey) { + alert('Please enter a valid API key'); + keyInput.focus(); + return; + } + + // Call the test connection function + SettingsForms.testConnection(appType, url, apiKey, testBtn); + }); + } + + // Trigger change event to update save button state + const changeEvent = new Event('change'); + container.dispatchEvent(changeEvent); + }); + } + + // Set up remove buttons for existing instances + const removeButtons = container.querySelectorAll('.remove-instance-btn'); + removeButtons.forEach(btn => { + btn.addEventListener('click', function() { + const instancePanel = btn.closest('.instance-item') || btn.closest('.instance-panel'); + if (instancePanel && instancePanel.parentNode) { + instancePanel.parentNode.removeChild(instancePanel); + + // Update the button text with new count if updateAddButtonText exists + if (typeof updateAddButtonText === 'function') { + updateAddButtonText(); + } + + // Trigger change event to update save button state + const changeEvent = new Event('change'); + container.dispatchEvent(changeEvent); + } + }); + }); + }, + + // Test connection to an *arr API + testConnection: function(app, url, apiKey, buttonElement) { + // Temporarily suppress change detection to prevent the unsaved changes dialog + if (window.huntarrUI && window.huntarrUI.suppressUnsavedChangesCheck) { + window.huntarrUI.suppressUnsavedChangesCheck = true; + } + + // Also set a global flag used by the apps module + window._suppressUnsavedChangesDialog = true; + + // Find or create a status message element next to the button + let statusElement = buttonElement.closest('.instance-actions').querySelector('.connection-message'); + if (!statusElement) { + statusElement = document.createElement('span'); + statusElement.className = 'connection-message'; + statusElement.style.marginLeft = '10px'; + statusElement.style.fontWeight = 'bold'; + buttonElement.closest('.instance-actions').insertBefore(statusElement, buttonElement); + } + + // Show testing status + const originalButtonHTML = buttonElement.innerHTML; + buttonElement.innerHTML = ' Testing...'; + buttonElement.disabled = true; + statusElement.textContent = 'Testing connection...'; + statusElement.style.color = '#888'; + + console.log(`Testing connection for ${app} - URL: ${url}, API Key: ${apiKey.substring(0, 5)}...`); + + if (!url) { + statusElement.textContent = 'Please enter a valid URL'; + statusElement.style.color = 'red'; + buttonElement.innerHTML = originalButtonHTML; + buttonElement.disabled = false; + // Reset suppression flags + this._resetSuppressionFlags(); + return; + } + + if (!apiKey) { + statusElement.textContent = 'Please enter a valid API key'; + statusElement.style.color = 'red'; + buttonElement.innerHTML = originalButtonHTML; + buttonElement.disabled = false; + // Reset suppression flags + this._resetSuppressionFlags(); + return; + } + + // Make the API request + fetch(`/api/${app}/test-connection`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + api_url: url, + api_key: apiKey + }) + }) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error ${response.status}: ${response.statusText}`); + } + return response.json(); + }) + .then(data => { + console.log(`Test connection response:`, data); + + // Reset button + buttonElement.disabled = false; + + if (data.success) { + // Success + buttonElement.innerHTML = ' Test Connection'; + + let successMessage = `Connected successfully`; + if (data.version) { + successMessage += ` (v${data.version})`; + } + + // Show success message + statusElement.textContent = successMessage; + statusElement.style.color = 'green'; + } else { + // Failure + buttonElement.innerHTML = ' Test Connection'; + + // Show error message + const errorMsg = data.message || 'Connection failed'; + statusElement.textContent = errorMsg; + statusElement.style.color = 'red'; + } + + // Reset suppression flags after a short delay to handle any potential redirects + setTimeout(() => { + this._resetSuppressionFlags(); + }, 500); + }) + .catch(error => { + console.error(`Connection test error:`, error); + + // Reset button + buttonElement.innerHTML = originalButtonHTML; + buttonElement.disabled = false; + + // Show error message + statusElement.textContent = `Error: ${error.message}`; + statusElement.style.color = 'red'; + + // Reset suppression flags + this._resetSuppressionFlags(); + }); + }, + + // Helper method to reset unsaved changes suppression flags + _resetSuppressionFlags: function() { + // Reset all suppression flags + if (window.huntarrUI) { + window.huntarrUI.suppressUnsavedChangesCheck = false; + } + window._suppressUnsavedChangesDialog = false; + }, +}; diff --git a/Huntarr.io-6.3.6/frontend/static/js/stats-reset.js b/Huntarr.io-6.3.6/frontend/static/js/stats-reset.js new file mode 100644 index 0000000..21f9907 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/static/js/stats-reset.js @@ -0,0 +1,80 @@ +/** + * Stats Reset Handler + * Provides a unified way to handle stats reset operations + */ + +document.addEventListener('DOMContentLoaded', function() { + // Find the reset button on the home page + const resetButton = document.getElementById('reset-stats'); + + if (resetButton) { + console.log('Stats reset button found, attaching handler'); + + resetButton.addEventListener('click', function(e) { + e.preventDefault(); + + // Prevent double-clicks + if (this.disabled) return; + + // First update the UI immediately for responsive feedback + resetStatsUI(); + + // Then make the API call to persist the changes + resetStatsAPI() + .then(response => { + console.log('Stats reset response:', response); + if (!response.success) { + console.warn('Server reported an error with stats reset:', response.error); + } + }) + .catch(error => { + console.error('Error during stats reset:', error); + }); + }); + } +}); + +/** + * Reset the stats UI immediately for responsive feedback + */ +function resetStatsUI() { + // Find all stat counters and reset them to 0 + const statCounters = document.querySelectorAll('.stat-number'); + statCounters.forEach(counter => { + if (counter && counter.textContent) { + counter.textContent = '0'; + } + }); + + // Show success notification if available + if (window.huntarrUI && typeof window.huntarrUI.showNotification === 'function') { + window.huntarrUI.showNotification('Statistics reset successfully', 'success'); + } +} + +/** + * Make the API call to reset stats on the server + * @param {string|null} appType - Optional specific app to reset + * @returns {Promise} - Promise resolving to the API response + */ +function resetStatsAPI(appType = null) { + const requestBody = appType ? { app_type: appType } : {}; + + // Use the public endpoint that doesn't require authentication + return fetch('/api/stats/reset_public', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestBody) + }) + .then(response => { + if (!response.ok) { + throw new Error('Server responded with status: ' + response.status); + } + return response.json(); + }); +} + +// Make resetStatsAPI available globally so other scripts can use it +window.resetStatsAPI = resetStatsAPI; diff --git a/Huntarr.io-6.3.6/frontend/static/js/theme-preload.js b/Huntarr.io-6.3.6/frontend/static/js/theme-preload.js new file mode 100644 index 0000000..92befe1 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/static/js/theme-preload.js @@ -0,0 +1,108 @@ +(function() { + // Store logo URL consistently across the app - use local path instead of GitHub + const LOGO_URL = '/static/logo/256.png'; + + // Create and preload image with local path + const preloadImg = new Image(); + preloadImg.src = LOGO_URL; + + // Always enforce dark theme + document.documentElement.classList.add('dark-theme'); + localStorage.setItem('huntarr-dark-mode', 'true'); + + // Add inline style to immediately set background color + // This prevents flash before the CSS files load + const style = document.createElement('style'); + style.textContent = ` + body, html { + background-color: #1a1d24 !important; + color: #f8f9fa !important; + } + .sidebar { + background-color: #121212 !important; + } + .top-bar { + background-color: #252a34 !important; + } + .login-container { + background-color: #252a34 !important; + } + .login-header { + background-color: #121212 !important; + } + `; + document.head.appendChild(style); + + // Store the logo URL in localStorage for persistence across page loads + localStorage.setItem('huntarr-logo-url', LOGO_URL); + + // Create a global function to apply the logo to all logo elements + window.applyLogoToAllElements = function() { + const logoUrl = localStorage.getItem('huntarr-logo-url') || LOGO_URL; + const logoElements = document.querySelectorAll('.logo, .login-logo'); + + logoElements.forEach(img => { + if (!img.src || img.src !== logoUrl) { + img.src = logoUrl; + } + + // Handle image load event properly + if (img.complete) { + img.classList.add('loaded'); + } else { + img.onload = function() { + this.classList.add('loaded'); + }; + img.onerror = function() { + // Fallback if local path fails + console.warn('Logo failed to load, trying alternate source'); + if (this.src !== '/logo/256.png') { + this.src = '/logo/256.png'; + } + }; + } + }); + + // Check if the logo source needs updating + document.querySelectorAll('img[alt*="Logo"]').forEach(img => { + // Check if the src is not the correct static path + const currentSrc = new URL(img.src, window.location.origin).pathname; + if (currentSrc !== LOGO_URL) { + // Check against the old incorrect path as well, just in case + if (currentSrc === '/logo/64.png') { + img.src = LOGO_URL; + } + // You might want to add more specific checks or broader updates here + // For now, we only correct the specific incorrect path found + } + }); + }; + + // Apply logo as soon as DOM is interactive + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', window.applyLogoToAllElements); + } else { + // DOMContentLoaded already fired + window.applyLogoToAllElements(); + } + + // Set up MutationObserver to catch any dynamically added logo elements + document.addEventListener('DOMContentLoaded', function() { + const observer = new MutationObserver(function(mutations) { + let shouldApplyLogos = false; + mutations.forEach(function(mutation) { + if (mutation.addedNodes.length) { + shouldApplyLogos = true; + } + }); + if (shouldApplyLogos) { + window.applyLogoToAllElements(); + } + }); + + observer.observe(document.body, { childList: true, subtree: true }); + }); + + // Ensure logo is loaded when navigating with AJAX + window.addEventListener('load', window.applyLogoToAllElements); +})(); diff --git a/Huntarr.io-6.3.6/frontend/static/js/user.js b/Huntarr.io-6.3.6/frontend/static/js/user.js new file mode 100644 index 0000000..8670b97 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/static/js/user.js @@ -0,0 +1,53 @@ +/** + * Huntarr - User Settings Page + * Handles user profile management functionality + */ + +document.addEventListener('DOMContentLoaded', function() { + // This file serves as a placeholder for any additional user management + // functionality that might be needed in the future + + console.log('User settings page loaded'); + + // Most of the user functionality is implemented inline in the HTML page + // The following functions could be moved here in the future: + + // Function to load user information + function loadUserInfo() { + fetch('/api/user/info') + .then(response => response.json()) + .then(data => { + if (data.username) { + document.getElementById('username').textContent = data.username; + document.getElementById('currentUsername').value = data.username; + } + }) + .catch(error => console.error('Error loading user info:', error)); + } + + // Function to check 2FA status + function check2FAStatus() { + fetch('/api/user/2fa-status') + .then(response => response.json()) + .then(data => { + const enable2FACheckbox = document.getElementById('enable2FA'); + const setup2FAContainer = document.getElementById('setup2FAContainer'); + const remove2FAContainer = document.getElementById('remove2FAContainer'); + + if (data.enabled) { + enable2FACheckbox.checked = true; + setup2FAContainer.style.display = 'none'; + remove2FAContainer.style.display = 'block'; + } else { + enable2FACheckbox.checked = false; + setup2FAContainer.style.display = 'none'; + remove2FAContainer.style.display = 'none'; + } + }) + .catch(error => console.error('Error checking 2FA status:', error)); + } + + // Call these functions if needed + // loadUserInfo(); + // check2FAStatus(); +}); diff --git a/Huntarr.io-6.3.6/frontend/static/js/utils.js b/Huntarr.io-6.3.6/frontend/static/js/utils.js new file mode 100644 index 0000000..040cbab --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/static/js/utils.js @@ -0,0 +1,71 @@ +/** + * Huntarr - Utility Functions + * Shared functions for use across the application + */ + +const HuntarrUtils = { + /** + * Fetch with timeout using the global settings + * @param {string} url - The URL to fetch + * @param {Object} options - Fetch options + * @returns {Promise} - Fetch promise with timeout handling + */ + fetchWithTimeout: function(url, options = {}) { + // Get the API timeout from global settings, default to 120 seconds if not set + let apiTimeout = 120000; // Default 120 seconds in milliseconds + + // Try to get timeout from huntarrUI if available + if (window.huntarrUI && window.huntarrUI.originalSettings && + window.huntarrUI.originalSettings.general && + window.huntarrUI.originalSettings.general.api_timeout) { + apiTimeout = window.huntarrUI.originalSettings.general.api_timeout * 1000; + } + + // Create abort controller for timeout + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), apiTimeout); + + // Merge options with signal from AbortController + const fetchOptions = { + ...options, + signal: controller.signal + }; + + return fetch(url, fetchOptions) + .then(response => { + clearTimeout(timeoutId); + return response; + }) + .catch(error => { + clearTimeout(timeoutId); + // Customize the error if it was a timeout + if (error.name === 'AbortError') { + throw new Error(`Request timeout after ${apiTimeout / 1000} seconds`); + } + throw error; + }); + }, + + /** + * Get the global API timeout value in seconds + * @returns {number} - API timeout in seconds + */ + getApiTimeout: function() { + // Default value + let timeout = 120; + + // Try to get from global settings + if (window.huntarrUI && window.huntarrUI.originalSettings && + window.huntarrUI.originalSettings.general && + window.huntarrUI.originalSettings.general.api_timeout) { + timeout = window.huntarrUI.originalSettings.general.api_timeout; + } + + return timeout; + } +}; + +// If running in Node.js environment +if (typeof module !== 'undefined' && module.exports) { + module.exports = HuntarrUtils; +} diff --git a/Huntarr.io-6.3.6/frontend/static/logo/128.png b/Huntarr.io-6.3.6/frontend/static/logo/128.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb41798758c2671cccedd756126c775c52faf4e GIT binary patch literal 19356 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 AX8-^I literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/logo/16.png b/Huntarr.io-6.3.6/frontend/static/logo/16.png new file mode 100644 index 0000000000000000000000000000000000000000..987f868fd66e4976915a1d3fc543de98a6bcaa69 GIT binary patch literal 2511 zcmah~YgiLk8XnYD3<3)3gOvwka1oJYLJSCF0)=o35JUoU(F!3M!a$MMRnDE6JLe~hPN??r=S8~~VBkAy|aB3VHY7Zs8?JTwj_DTQJT2LPIf zQq18d!7_Xt%tu6Y!ob-J1U$l{6C#{hWR{o#Cm{Z63CvaphjGslyrhY7s7t)r$GYVK#?WU36ZQ2JOh=$cxRF`iA-?E;b{_HJQV8fI}wbH z=!68BObmgbLZKijR*+B$A9Qkaa|6i~kU}A145Cyel5vzok!o32_+`KdCN~PHZ151gJ+qClVR_kPa)6FVOYKCv6 zgd!&~I$5KQBDfhvDMn=Hf!6kj7KS%!II5Bwppskzp(fnc_?& zQ;B5PFbWx>P$6gi5F(Qe$_6%eM|d0==l}8bCmm12B3LZQACbyXiOMiFe*D>R^7v?c zC_oJ79*;M;4{^BTW{4#yPtJvThQ%?taa4-N%M=_5?8(P$qZ2&i;}Ogs6+T3NqVY~7 zCo;+P;|N6pj9L5Ty@3;%f%=>HE;SnXN%AxU;e)G-#f{HlEdlE-;QQu+4c@mWScLT? z3D$fbtU;&%V3dYnwtQj-0NCfr^SYOBUt@LEqq-sPM|;xxb2B6MWLS_2iKT~~*%^DD zX%y_=&z&DADq5#a@yT3xf%L}YbolY_389i3#N_Q8nv)Xq>E$}wfkC=X1?k)#e0TVE zR_{xO-JTV7TqD>8D!)a0SjRF+&4@c%k(2IK5O%6&;n9Aj_Sd9v_o1rWM7yAQM?32- z9u@VZU;TDzgyf$$_SD@-bf~u9*r72rhE-Wr6V_$9wQt5Xb#Ho!=^MxB_K{k6 zv(45)o2HZ6Q7zp{Iq!UAJCst&F%53I7QM+NxTExSaL$4gXv4DSH>pbZZNv7|Z@ivu zs^EK!Sl{>Jh1d2?sa6~eY+C8K$>>yU!pvba|3}!r$V{<+loS9=EcK5OP_oww0H)%Z z-kxEu*+TZZp!MN%yL3(a(u&Py-TRJJV&}40)AE*jFx_joblHhkYMHr3{#t6J=Aqx; z*H-$sShU@{)I!x1{UiOAc1KZRy18kd@jc&r(}@8Ko$8IRlgZ@Hjm>9t`*p9AN|IY& zYdqScNAfgtdLDLXHm_+Yc{1PkneLdjFpv3Dk08$M?$1jesJx69Z%J51f8kdnHJb;+s$h6w)M_qiXd~JP_g4$fe{=9VYknII{$rPYIc!;{H2wptf-9AOi2=_aA z^TBWpNNCp1Tbm+JinC+7wym>bAFwK}03B!@NWCM`EYXu4`U|^&fo7PPPUC8J!LK7tja83pDQS2HB% zLR@7_=gvB1)u~ZEJbl*8Ja*ZcIGZkX-RW@SGp(#}i5$3Cy^qzd3JoC!<=emhZe3+OhF_^&=&89%@s+EZXx_`Pg5p zu6$LV^|MjkrIjs@LUaK|`@RN%?gL2)VF7^wcNu#d(#j6m27WuTf%bY<^xhcNZ-@34 zULnj8v}F&Z{)gWQ00#?)q;`F?rp|0sKK7ik>fe9lq^cXv%qM2j;wtlng_)wQ=lH|J z+rRqt@Tn)itaT{Ucvv{%b`2ygOaTDWK4taw#(S%Ai=Qsj=BxU8PTb!(x@EfCE4j!- zO4`s7T?2d_>CioNq@HrTmR-9gO+~pa=k%r8yq%hw)~a69n23o00MjSf`?y!^w*LZY C#oDg` literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/logo/256.png b/Huntarr.io-6.3.6/frontend/static/logo/256.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d49770750a8e6113bb0d479dc42b8aa006f0ef GIT binary patch literal 58862 zcmagF1z4NSvj-Zi1SxJU1w!!R?(Xgm#S0X7cMI-Lu|g>lq!8SS7MDV>V#SI>ald@u z-_E(`oO|;;d6Ip9GqbZhv$OKfMysjFzC?eG4gdgN%F9V<000Qje-Qw{7tcRNu3z2* z0LY`ZT6*q!%1QzjP7W+)mQLnYEZz>z&o}@eBBpkNjkY&fw)#oNsJe0cGN zY56!?v1(YkIeEBRSV?( z*1^ir?eEI|rQd&0{r?MK0};;>-Zl?UQ$xc)#<&h z{WIpKAu9ormzLyV=jY*J=3x1U($5AJc;>Zz?;~aA{!GQe#=*_Z#>LFWr^Uf0z`-fN z!TwwnU}O7R^54|YKRH>daRUS_UV;?~cG69$XFe{cJ2As>+1 zUtSGjXJKb!;rs6#UN%%RlcbK&11%F6LMF1bDjpt1F9%jX~$V*6~C|6vXQfIitHd6h9ton%n7amc)wp2esg zO*c0Zk0p({sDxWHGWQVXrMcAJah#E1xaBDwP1?nBjnS-KoetJ;9beQhqsON{!9nlo1r~(jpVGSpT>spg68d| zdc>W%&>4qJ-aPex82%0%8QJ|_a<(@SaFFSZw~%ccefY~EEBqBza1Zh)l8)dP~n`EOF>xZY_HEW<|nMyK@h*(W_8#oR`TTp~2J!?G{V!*Yiw*<}9c01^{5- z|Mf)xxc6$2uUWtA-gwKSOsrf1XBCu1N`!mVaDbs!!I052kWj5tOH*dOCAfEr;h zp&nQm6fik8h1?D2YD zm^*pwc;V-CGciNrvm|S{ zq&h^o*qcU@O_TQqGIb`=~7r2Vx3aRvS3-jNsdu zP`Ee%B1XMZqE3JSu!Wi-nt<_f^}-=?dN`3qY@BkoKn#Ec4l*?u*o%|D69dGN#?2Ck z8vq9jC}fJ7t1)mX%|Mt`IQ+$LWbZ-2o();u3Th4SE$z+eiQ`!*UXQN)&=TC8O5l%Y z+_OW_CY3+`qriWGnma;Wi=<8)dF)p4 zL&LDt6-bMYz?LN+ZH1^8t}iB)A^8;!0pj)>%KEQH=^%q8)=;ISYT<}Dbs5nhb7(}g zIUcYl_|2glP9#A@GG8@@8KniL6f*oZ0z^tG>y^6Y_t!*+He$hS=x6|=Ih6WBJ*I9C zAqa%N)HE(aEF2mfK?$g$BtWM{FE*twxXQehK6AB+sbOf^PVY|CIb7i6?k;i3d)Trb z4zDHqs|gT87C{kB^>m|o{?fDB;o;!`?%kXG{RZt44T8uJ4s(QcJ~r84m=ZdUhL(U8 zN(Pk;6!!&XHz))GNADrRK{S*!BZ-Fb@SOFEHB7U?aq5HP5jZgb$bkS2hSWbG#voh8j>E>z`3gT;Cpa3jr8*XLLV4<=%A_O3M1U(j z0KrRw)PliwOj*ngo?q0y*Rw}L2(p*~#q=@ZP#SPb;ct8(B0%bNHNs5JVDLzcM8-TG z#a0@whX9GI1Aq){{~(#*y$g-w?$M!-iL-&qlYmX>OX-0~lsF8f(hSOQ5*Oh_rCk98 zM2z0Azz`{tU&If!I46st(eFmzhtWkv4(8{H)US^n8`Vu8eZOiJ{GXv|~oVd5_UZBn3zg z&PD*(Z-^3STx%tO#iZ^*AnDU>JOuVZanV7S^*d=q&MJ2Bsk}-Cl#LS&BTa+;RyqU+ zmjQ@h1p|XEp%K&QqnOeP#q{7gw|>?a$bIk-4J-)qz(9348WnYWI2#5Uh8zPWRE{A6 z1f>3`g3n2XDOs0+hG?T(L=s-Ch1dHDMUe=H%F{U(F0L4w zJ&8oODZaR^bjGUzgBN08A}j_DIIx?ZC{|5Dobe@!nkBeyAZbUSC&R25n9N=R%V5K# z#3Z3wyVh2u6fH{AIE|!1v51!v4+a5~kS(nvzuxl=%r9%=e_*){qoCCk3oirGpp`n!osx!(+iz<9>F0BQ;d00?k^L~o=7 z774>?Btrh$(k{wIo?{&)^R=m^?}{l8e&E&7pp)Qh)2@UZggT6Tf<@^{jDTEhAsrbg z&1)23*IH4&UFCzZ9rOtb{WK6sD-OtFMh>pSwUv$5qvX*cNDsB^fsi>c;=GVERRV$~ z2v9d500e?Qyye^;i>M}E^d&kkZQrN5PRDN0g$&g|Jx#9UXLx0UM$B3(maTH#(*)7$ z99MjPY7O~1CbndhZc}!(Nk|U_l4f(5BnCn>Gkf-L>c;m9A(Dt7fSeuxu?K{hOqYNv z1qX_!hNiSroKD)9@d1kql9*Qng;Gqs24;>@-x8$Rd z^oy3^is53m2t+eH6bohyroI#~xY@a1Zc`e>p)O@+qxp%-Y+33Xj~xvxVPvdY^5deo zVJmn_&p10j$7OkVuR_7{t)_EI43{(rxJ4_WhrySCDCUe$Ud$HG+`{T2#yJiSHv>Ys z0YF?zPc$%fJ94yGR(2IzA@KEU16zh`g!J~9Z$(r0oRXh<=T!4KwjLQ?iB=hQ$|Q6O zn$U)I;aVYHn}AqCixBE3N5P)I_#$gA9J%TkB> z&U)UrgmV7&QQ2%A&vH#KkmJM6qU!IHFr_k$3CDenOD7?PMO=j!O3NrxOfMn9kN64n zV$+6*GK5eu1HeHpRUfK%$lgE?CE!BS=VgPBZHIAHaS>pMXYLDlyj#rH&`-9hu0An% zGnoBW;&5?F#le9P4-F;xdCm$KA0T1Zk>mR;59RLP?uyv32{)rgMqvq1O^76|`@D>K!WfO&pXrEw(h~I89z9!H z6j1roz$=N{P|I-h2N6LoOZ-%aI5HUd6b&1vy9Z2Q2mp`rVD(@Wrs0i@z^-Gp^oV0hc1iq<5^hhyPk(WYtFhvR55SR4#&1si9opml< zlaWz8jnoNQA{`x8o~oIb7#jlguK`$SAys+|1W12`bVETB(ygKQ-Ne!{^q#NeAYwV; zg&>_@X$YXjSxaTDx2XVq+|;pcR2fLu*m##v5%)McUvB=n^abnYh9ArfJaiy zb{}D3&tozbX)Ec8ncW|%<+hHGQH!^WFQPH)ti;Um-*rRWOe9Lj$XS)aHaJ-kQc_~b zW*8w68pzIK_Mn@*Wa|PScHa+EKk##Tv7yy9DESt;$Nc>ja4P8eU2oGsYf!lK3V@}Yc8`K8-ij-i(7 zs1C-rj5(a?wq!3T>s~f_OS|xh2?E0a(UuZbY?z!38j~gJ6)wTB7x_D24&1o9Vwg-% zEOXf@dk|AD>pN|x@FqAJ3I+xFPQyQ@)K z3KhDa0%nxrMkV-V-+(=sxEL9HWn{;9T|z3_f2<=Sq(BOsOi^F`7jn;sQwXO{wv#gl zWCqA5c4AqZ8fUw>%b}gC=yy7ylSB?cjROKnd`bjXbA}QU;)nCCj~{+KIbH9aj&YTM zwfIUPm0bI3EtB$K1sQQYUOq0*TFKqShQ^s=QD|BDfZO-jP(<_=#L`q-GhA08?19(F zw0N?1wPp}D{sgKF=IFj%MKEGAqC)Ag0z){i;@XJ!_=Mn=ZL^~e>0$2#(gzZz^YAj~*&zr%V${cxV&T15{uHX8wFjieC@IoKpnlj$kKPVsw$d8e3*_DsUc> ze#%*PC^!`q&wf5`^w^0YMCr9YY&m|ns!E4v+o*#e6aETQEKBj*&3usT&?a3e4t_A8 zn6eh~F-V3TczP0m{k^iLy>8LK4O)4zp(&6X#kE_7;6DZ@h7=iPNb-&m-`}NN{R|bl z<11GBoDpZT-b|f9ME6p{*WJ=ShWnfTp|LV*6O4;jmR62GK@tanlvcxqw*M<(OePz@ z;~RpRMQNPK;&d=Lg$**ogv1-9fR_DUwyVTBVZP+msR>ir4Pj*f@6&m> zmfux_>Szw{Rj8BzjJFP<4~UiuK|zD8R@=+Iff6hBAetq(-AYLSfLN|KE>$M=8LN7Y zA2w2mGel5$usyH1L=CgmsqlWQtsxIYs(-C9ooEkyb-cE;x_hEprlh^_CjM3(GnDugUQk(Mrg3F8zzmd$-JRQ(4q<5yfdedIyTD zp)&iG(u>7L=@>!vB34HL>l_yuFY^yaX0f&e&P$=I(fU7kxksyd>GJo@)(T4-24{S0 z;Q->^FF0C6Z|-(SOqj|(Kg#4igb~E7%0(6ufS1 z5?paZKKb?0*wj$)b6XO;|HZX*9Ip#cb?b25g4k!!MU|+A+B65 zU$c0XOW4A=$e#Do0?_&nc84BFF+@IGUTTe22(1?sXhJ`W4NTtPd)`A<@1sisd%z{? z^oytdp1(Si*P|)Ov(-o7UZZ`|qQ>X>-qy#j5U+c+t*I+s=VIGBI(1mOUZwfKS;Z9k zeM-OnoZhy^fs|ODO8#mf2ZBnw-wdfeL4?lBMB_ytX3kVq3fLb|9pcLa(dL_!M5uJX zS8*OlxowshIt8dQ6(2@SP<$+LAG3r$faDVtUScJ9A#J;9wi#kqRw#Ma!4&$rwF$y0 z-{=lrAjgFBkN?!OD@D6J zisp#4pImk_gCDlkRbo&1burJ>ONF1N=|(yqJiA*cYBcgwRrnSat?6RM%%%bhp{17? z%uwxAGHFW*Qfo9h(*=oSs>P|kjBleZU7s`{BlRSsN(r9*S5!ada*eg)tvV(;2g@)v54dJi?NAKfIC$5s|2hkN>3{Ak~PJT+ANO7e;c5fOpf z5}dpekL0~K6vf-|XZkB$?%uvr-n9Oc2K@=Q3%MD4DEeVG@o{IYrS*VxSp&n@O}26+ zPwLf88-dPJ*lFM1@VS2})MDd#;iZ)~gqth{7EflsRy-w2)^ItFfIM&3{p*^am!|hR zY`DvvCWcqn*>lJF3es)N2tt8NJDQumt9s2>fhIpTZ9>4xk@K%{%>W-pI=UXrVF+&|1f;A(6C#U@uXIi;@4El&HG`^`qt_G;|t<^K7KR_88O0$ z=mU0#)Yo0QhN;z!Mg%0v3DbCWAVSit1r}XUH%I{k;xYf9QE)!;tpW1zkqG~hiH?$zrBeyF=|<2j$B5telw>qTU|y# zl{#TnrlVb=l09SKr_%~Hww91IBai@18iZx9^QrhFvWa(_Ln#Lt<+JoL7)N_0zx_U$ z@8c(f#b3cb?_cLtdQtE?HGzZMs)fcr3i&PGEw#1=W|x0=$IWeatx2Pb)Pv|zBG#qF zTo!>$DeL+W^&jBAj~A@ft7{d%+x$ig?i<(=U(JnVcV8FWji(;Ba7|Umor%DYKBs=c ziZOdB$5J2w+owkqG+V={rx|ovYt1LIi!MZ{r6*J@@yVApBLStW6zXA?;yAk;4vb|! zpAoLEvI_qW+G}c)b(?aO1jIVs6&tQ{>@KC!dIibb8kYZ>!*BZOxZ9aX;{)t*k*vlc z0G1HKtBvDPj{__Z7n|V5%M0pPW!u|1@uQ!CDU+4CY(t_^{y&x5oT878VrmM0?nybf z7t(W6dz)w~ZvR}|oB8H~q|tt#E;*^tPq+f!di#0lzP4bKWq){=IZ~BY zU%l)B4KdCKkau1j-156!1+`ayeviesvZ)jly-$g?S43T_i}%x1jG^jXhe2TAO+1xA z${F^2*`5BO4F2fnLd;yv&KviZ4^F(jL$b4)iVg!VFW<%nPHJlA3e~`%dzx6bWcq2_ zVAEI?Bn5Qoo>3PKAT<-w;)SL6%xZhN=+&XHfL#p~)8IOelzfp!-ZYaoxQya@d(iK* zYFoQNx-E={8nHh>;M`;dMV~EA3_0@8Lc7r24Cjq3h4(?{kfy*>N9Xv$7x9S6`hHGU ze~v}mD~*B6USgFmy7KArp-QbmXKQqq@A&Q*cf&bL*JLfBGlodpL;z^aw+wVny@&RUZ$_0*0tNe=aZFr+C`ry`h_f3lnrc;ny6vvew3VCD!E4 zufLT|2{ip|HC^sjrerJ1{3mwEypG=RMKMmY4OB6s#GVq#9M?=win2EFY(5@I@`kk| z=&|IK_1=C?0pr*e*?IX&ROycVzO%;58S3PVJ3Jvp@e`?KP; z)4PIpXmRM1+wkVL2l{w3QrUdnVBzwyq@k`%Wt=gR$+a3O4QI3#kgK^w)xlA|prG1$ z5sIMHtwv3d4a{$%F$Ab9;AU>Kp(9A!`OGdx4{8zQ`Pd8m5cC;CzVx>8&eT(FBY1Y> zL1NDIi;E{7tL;3DG{`i(=PinuLT=YNOu8h>e72e%eY26&aj5fl&rbAb&}zOR>{C4^ zr&-V9+IdiGrT<=L2y4)XR?qB8Nl`&g?V><9r^jOc2Gyq&rO)(&>@4{^;-F0%*(%tn zcOzSg6i4)ABpz~7NXUU(?*={{1)rVkF^XuAZ6<{B5D&T5a;WAvw2WN&sAF~IX<=Gq zSIdmglIP&B1MIRzRi?g^uOlcpG!QL$>?Sg2dJ)|C8jeUl8HJwINcHS;NZo&geWlN>Lmzf ztgN^y!e6&vY`^W?8ptL8DAclL@_{qjgNZgaM(QZ-jAEWvIkf`BJvt*`srFvq$QSLPZHx0G>%T-3=sVgeGkBx?u#Y&8C~(+ z7|T>Xw!KqVHZE2TqpkW}T;Y1%*rt2?YMX1@~9zWTg3rE$a#N9 z^GDg(gU3>dJY8&b<8Qmc{=3r?#hc1^^DYlYce34PlTt#7Az z-_UlRiv0g%p7L5e1-uckhnKjU6;EpE7PM4!KzARCoV0LWPcCuOB3g_RaR3_Q_%y3A zG2>+eatBwsOee;7NF(nK7v}62cOj-_^?*&d;V#9aN43CK*29M-fz~4%JG-YZBpBwD zpSvJp#as&LYuA2wc%_@VqHTfAL5DeRmsx^ai8z-1MeQb<#|5`7f?lmrCIjQ~@d0sR zm(+&4v)7-f@UbI`UfS*NU9!WQHF7HKp)@$(T;2rBHE5Ki6Y0fjaTLKS6OFn&H$60s z>o13BdIgtX|J-E)=$|uQcpt~UoA?>Q%QHLo(UciUL9PlHC#3MP=E;l_Ofr(N0VfT7 z8kk=@@!A=443a=og=9_EIFHgz1lW}Momd?RTsJw*B(Iw65V@Jfn*b*aYn}gOKKzpM zAi)DZ?>}&|fykjdEn-4CWRdy}h`v!6pQt`<42~DfTq^LD50H})^QKBu!h^D%n-#Hc&-d6xLIvZLN>ea;k~;ivgI za`v-JexyXv$LoZSat=>hp<7E_)pj9s?Cez%>Xa45u-vFQl|7q#2(V$tSK_UsAg&ob z)GR)J_5}=#2io#wC~d#$YII#ouPEmxRr#nL)@DM!$bc9o7>@#~c_*pJ!#bO;of@>V zG8;$~txm6;N{IWm#jrbr52TM{dwy9n7~j?UFoiDrwBK;F$jjuWqTBX(TF}vTaGY5; zd%Cc(s2xzM%RVo98S-$Idq*+a-{>zQD}`QBqHxfH7E^_5hsi*xt`LG?PmYywb%{+D zWa&3yX!bR6qQ$oti!S8jz+YVh*U}Ccy*UNjV(<0!l9N(0IQHP8Y3buMzS{v#iKzz zHllR6)kwxdW%d150nvED>2hT2xxq+UJxfHHk($WO$b8^+S(lRRVWLq6E~l95R9;b->fi(*lm(5dCDlgz--w`LzGsjq|drB0_o<4`XbnP$gYQ2L<68j6My1q#Nd|Fr` zAarr&bG=4AV zoOU%U+Gz2m>g~_*Wqb93qr}pHUcGiMy9B=GdM9(fw$>I)If3|pJ!UrgJq>`Sg+d9iL&KxPB>t z*IS8DOquurh{Ro#s@s0ure~-59i@%KVfOs{=ywIz{tG*-7CU{6cC@voGShr1dg@Hu zABTr4I*RFC-$1)Vy+4M55M9$S-Y01k#-#0$ykgJ@v8{8bosa#~>=oTLHh1F*13ccZ z<(^?ZOiu9%I0{fQQNNk^6*kZOI?!pvn>a?=C}>tWcOKbfKYO}!7(zzsQWbQbNq+tG z@xJNl+TwgkQFU>Bcl3EsG++OEda&&LlMq<9_&zG~hK`DAJ3n$jpz%!z2x4bQ&=6xa zxWPpkE_Gg#v4|1%B1%*`Ld}}7%qg?ir%fL)A#_4m26gzu4ZDcP=#y!X4$7X%s1uG+ zkf7M4CU9&$YBZu047|+CKAhk@XihC$+dLz`XZ3kRBGQ7Z9%cW5v9(!l^@|Fy2kk?x z$euVFMXLE-M3f84_Hw4ru=9RwB?vz(et8moxa(IO+zP&#U7!CxnYtUZDKx0Qj3W(p zF;&xh)YzZ}4W4~>X^5OYd#7J_l%LQTc`)Q=aGjrd+qCPu!a~#y6TL0Wb?01la-O z_>;ctaCd*5*kt0}ovCUkZ=ZPg*5ayPxr}yqsqE@Y!TrX&?4=-=KQosWmmT-#oT|nh zN%cXRJ&#`vd9y67E+&Vyk%+ZtXU<#Dn3iZJ61FOYnhvm~1+7)* z)e7w}?cCgyaqR+Otsx$!`K4#&c{^RFi+=1dHTNOV>96P<(-eDe3|@31gQXcWSa%Go zJ8o9OE_3~|X@x(e8r@&>Cq9Z=|M}>9i*UYKKrAfkwNiB^Ah?8e{5!{gakS+uAxm_2 zfy*zZ>Rr2Ki9K%GX@c|3l(9gTXr=WN)um|A_-Oudvt`$oY8?5W>6Fab3hf8F`R!zw zV#d8g!7S%cYUFK2bmz-}31045igH*r<|j4&(gxE!ytp6BF__#bYhb?t6s$#uE}<~=2^^}svhm8k_EF`7aib7_#xy@@tQ7;}Rg1lEoWQCV7y)U@2Gjo)Btu-z0m;v(9*F zR?uR5>9(NVU+jJHQu~gv6!gZc#Wobk$pGyJ|7ynaK~LDI5WYi|dDL4<8rLNt5aBl7 zOwe^Rym)2LiBWjG5cIk8^ki+sX| zF>_~v?a4)iEYHZ@%9Yf@TkphmRFmb^T)|4acYeBqs6C)-Naewb#RF14H>HaZcZO>V zV)0}!v^&Q1A#%#2QrAh~WPmR6MGwyLhcP4f51&#c-m+UQmgE-G`zaC7NFeK^EmrwyXVzzv~0mHs~7Ik_VpIFNL8Yc zrN(mkAoKmCI4XsE?+iogV@uFQ3>6NMpe*VOqhLAPsCzart{RE7GfXywBE`xU zB#-?{32NJH;jdqs_);#989lv#Kkj#8{PK7E=}sBLma5VDRAS(o?0`&N8p%w?>DuIC zNN@y1%2pS>lZ@=uE5FMY>DU^RPWRpAs36zCwBc*MgWACnoo|leQBDuP@>9z^jnuM! z3pXT@?Q`_wz_DRyRP@p(4}j`@g+4?(On*@TGQmx964?GVc@WI&;k&x9O5krd-lqrg zEvJtwsiQaB^DXs@)#KLnuW%vGKRFKg5^!*f>3#j!Y@LG4>Y_I{J}!IkD{H?Ww~HM` zC68$we!W~l6bzZ{Csr!zRPH@%EmP@G!YxCt+wCfCy{SR<`oJ5K>)2e%TeNuwWuD!K zfeOAPj4FFo2k7#8?NGc+hsPZJxx9p{a&gVT(UF-jLz6zG0WtbH66)HUC3%dsvvYX- z9zzpV_ww$OPZ9P^?iS}K1KrRcEhe^_7Tp*u2G^`tg(h!C%dj3zy>!o(_cOa{o%loy z@VAfO^!5hQe5xk(3-p1n+8O-W8d^Rq^F^CmC66yB^T`!5IM?nr^nl}q+4V>@S2R(SSjYX&1sv{{&(j{qQv;>kP z_nTcFqLJ)>FA*S1FKFqfSGc|*9?+wo2KE3u9yXBr+4#H?iy{xkDtR2z?F{d4gWt61 zzV+RQK4!ko{eV5Ez+L~HXf7-3RS)Ji-}~*>YWO05p_A$FkjR)BQ}%M_#d8^cpG!W+ zpu^*{cTLqOC!>S}TAx|+c--LS=2R&fMMwa8jRvdyf~21L@ARuaKOCAUYOiJr7}xE8 zYn+~+IWE1$^y}+{g~4F3yBXdYmDtigghLy)L2lrwRFuX|ot_v8CMA$jwy3V-(*sg` zd_0|{B>DWO5x@O!*0;miVa7mR<3BE5iTGF#?g7esdk5XOnDr4G0wplo(liJm0lKtQ zBs-Uuo-Pwn(2ptYpfBuIpC)nYK_`-UQ|*o$+chvP+5&<73@bx!mGizzpPOz3=6>@j z6VCFE(`NG(FKJ{2{5W=cvW$|n7sztfMoyM9HD78xkA7@^VcV5I%t~KneY*RFUGS&Bpn6BP=0gZT@}$w*3hLhrc+edQhn?}GIU5KYi`nQ zKTEg^%=-A96xf|%=5V0O08Va3O#Y=HMfqO64@A~vn{4u3Q`t)UDy^D9cNRX!JZ~_k zJXMVl;R%Vc{lbn z^ZUCum>xOC;b%)(L&{X$Da<_d4#TWj84F;j6!odMUpg0c(5b3oyp|R$EfpP3oY?%y z8<{^ArSD5*RE34ps2ZQ72@ZWquZf{ zLmkDma44tIjOHeiQfPonpx45C7U|*C)Zzk?uSDsM&f65n=P4b2ShaH+-F@u+9Wcn; zURxPm{hC5AcSzN;2qrl|B2S~a$;VPv2Ly+ej@+8;9g^}nJq7rV>ver@`sRiQKpuF_ zL5uf(?(!nxzBL0MX|*MAnFkI1X)|HVNPT}3-Z^{q(!!^lebmK=NsjR)l#IT#FdeM? z+GBR;IaAuF_qS9U0L-hVFRZcJ=7s|xpb)bD*3Q{4LtT1FTa+Tr3XqHLR@jXCGg?e@ z)p4A}f0gugW6>?3MxcI{;-u@{ob`%9-L{5kUlJP?uy^{+H$JNFo)TCBT?+tW(i*Za z&}aV*jw3Y_DqI$DKP2tN>u|WwXtDpRl_Icjq=6@BsP4X(dqkJo?Isv6`uW6Ap*x(u z0WTaElOgce0{6(kK$ykjdON--8Onxi4x5(wD+9Z!#gMu}?Mj|b+LP+$SI1Gj z_G~H@EP@R__g@pL-9>O)jr|wt zbso;AJD+!jv3_olx_#z;@UHTTZ`2X16GZJwiu%MI$4oc~PjK3Q6`)8sO z=F0*baD;a)Hq|*5$ABEA(?ea|J+?q)&Y8*W1;&yPO4*+#Fvoy*z>uw$`#nRsL5E?<)?oNl>h`apZ>U;o#pkPd99N}5YC^! z*l!r=^)(4cr=tb0hQ;S0r-Mkz?_(OX<%dv*;p){c7vqNO=pB}KrvthBLWljyBDhIx z{VdTC_7_sr$joqqBmfTwGK7sYLi`KSk?_;+SQST?#w}RJ>5=opglYxf{cr4hv51Y; zH>*O0p={y%HuLnw^yupXEMSZ7V(;BQkJbaOQ>Y0~*P+=CsdUEcJ72XsoftAFVqp?J zeF`n!7B{!LMixg-uY3a9zNiEo=gewor)SSMcV4-byL;5sJ!iW6uhM~thzNlM2+`rO z+q6zPPutO~3ENc6Z%fYzt2=M=%8!T9uiMbpu)Bl>x!qO{OnlL5z!@j;QI{!*Sq{;{ zXv69an>V`eL^r!5p2QR4WR6y;E{_Jsp5{@X%<5@9} zdBk4Gd&h=zGL+I}SIN9h&o?nPTxf>Yz~a0j6X=tCC z$BjtD35rQ-g<8G)Q%5qd^7&hgl?wzs{!GBzPYpP7KdKoFa@(GAiAv|*4*EWrU$>OU zm;Z`xN_1!ntwrD@@~v>~oxkoI8-va|3(Ka+6IavzzE+enKOBug=Q}*Su&yx{<%rJy z7+ynAvTl61)fEfi>GBqy)zuAZZs~MsbY@y(7{!bAF-&7(6a(7nLK_)P^lvbflbr|& zMQ_r*bPumoT&8Wk&SH31TJ3KB%qkk|_8MRS2nrr?6~HBZ_7JhnX2*6CK-~a9;!7p8 z{1juIj=by7gVk2iN8~1BKZPxE46GYli_me>mFDqRWCZ|2Mr1r)K~n_%5mQ>9hcS=D z-dhU6lYsgUqUY<_E8Mm3mF?7kVhTe`NW#z}Hq7VIb%4rgtsJoN({9dw?#~IS6Gb{r z<)8K8bUPN9%**El&iddqyh9u6W#nWHHh20nfJWS?tAnZogIG zt03Ckm#%OF8>rNvNLL?S7w&sT5X6cREb&zu3c+kZBn#~8H1R))(1tCYwT@iZTu)$Z z|Cs3VlQaKdJ*et#cHjPTe{N5Wfm&lI<(f8(5=YEczknjpav^LV9+x-3cHy?I^kj9M zldddNWsWDME+xJe3#|9VZ+F>P`xxH1t$jPM0Hpx9PpDNqR$_=6~j z!i5wI5E^Q_us?!93+!B(Ov+Y6546w>YKmAwOFTri4tlh&d%k1aj|kY_;sU<%;WqW^WdAHlZTt+muE_ANZ`{M5gemADn_iA z*pa#Lsug!%FWuhBI1kpt+ILC8DeF=^Pgxr}osRm{=_+CI&#(NY8KmnV5X8bSP*`~p zPHTbqcTo7rdyP(oiqgF_1S!f7Rb zqgq162_kUprk4LDCt!3jaDt8;!30TJc79XDvN`fm*6OBPzCBtDXnGOo`@_{PO9ozZ{G@KItZXSEnjcLk0m#hRlOjMv zrZg~2mA%5+#z&Oh`ca&}Tysfwxa*}182f09VP{wIUNQ^ze8oZGVx)xr{aanX>mL;4 z5<$nGR}Fjh3pBp14+^zNk{|K!7*P$92b}B&HD67vz6=ZQ{f;VS3N1lyY=;C4>27TMjy1T2F&lg~l zXb+b~hOoN;C(eZ8;%>c`y8IXR$X3t{s6}7DB7gj30whG0lc*5gw#YQi%VCQ3&8(z^Ju z#bx7!T_+CCZ?ePj%40v8?s3fS%$WJt>iut{5gk_W7IJZTQ8-y$y=2?BJXrHpXzSz++ExhA6|AaW|FbB+j=X`(&@jaFBMmat?QoL zz8^5p5_W-aT3&`>i!}A}iURKMy~0Klh_T}1pR64uJ=FWqalesJiIa#iND#=#HIu&; zj)=US@q$;8RlyS~$?z*48)t*gIs$Pq_|MfNC4ex@EcJ>~K@KFExQwICsvFyH) z#^6vS)o(ZTR*C+T3LKOs`o*{=_wR;|WReJ}N>G8FZRzJC8cWi~n zbNaRh=8_%>Q;V{zAWIO0Z_=Y?K%M1vUBRU5H^e%kI_G2jQRKpH<#rk)FI$q=9{|sJ zx20mWk^OA=q_LCMLn;KJ@%vG%)z#(n@7!l|1^pc!xnJC+zoJ;YKCjANX2c&lXlIM- zE|Ftorv2)|1VAp0UNqo1w1dZyy#y6N49_ROpD5;E6?0Db?T)C5vQx#X zg?_`WKp)YeL4)WIZEh*^u6V9U_8PL@JYbLC;oft&3>9=Hy_jPb_MF}8Wnneg7;G4z zgK)|oz9&^uij2bpTG6Zde*4_!8HBI2Qzhs-HmN>Xb#s3HJ-r~S0+CP0@q{w7-Rfhi zWLdz?d+TJ4h1eT+&KGuRzZ%337pw6^Qb!L=hPb?7*I4wwst!8Xt*6MA-&l`szDDRq z-68ey{HS^=OBrEJk6B7zJMaZNzsf^PekFR_Bj7P(`Nuv_l|eHnc1k$2li-K2Uy*|= zS%ECV!9#Z}B>{K2PR20bF}o}=P=vx>#U1*qYUFWE;Pur=XXEb4Rv1Oq>`zOF!gbN7 zS-QsB0h-lzih|Bfaihmszmts2kA;kI=m&>(j~}yR+1oi=j6~3;49wPOVlf3wL>kET zVk;HALql`1?t8*dw-I>Q@y?~z0Br7E>{ZtTO4;+<0+%Ndf%~;Z5-JILhJGpOG7v4; zjyZy)oF2)s&Ekr9uG;uwk1CPh{xtH_obk^*azFUND3`SSj3X@Birc&wAQr3$cGvFM>8GJ8>WZV7!Q)HB^!ov(Qx6FH&aeCOrw8gme4Vp? zM*Km+?y8iYQrQF*Z6GHr;yH2Uf4{y(8&t`_=FL!IMgK^WVO?RloGj`}FN^e^t46=l$Pm z&31;4Jo50$@r!IvIPOi+b2Mhz=EWt8i#zvntrvu_2p^;u`1b@}w<@N>sU zM~Ru0*^)IDF-3%sG^T**=|XP4Y3twgIQv0f6v_{NYU~OBoYtPAs#C?-+I1^m*KBrr zh?oTO2w7cKK&dK6+vTGZtt$o=)S4hpVvW4=lyUv~EkAwv{ajsu%efK{2XUi5Y{;QL+p4OlL!|o?k(eJ0>m}90Oss7-uUHkst)eI#B zozvMdh5!f|!z!AvaF7=m4kxHO7lmEv$wYhnW3KVX9RRNQ#B1Hk)oXtP5=b;bRg~vQ zKT4!vO(|k_dRlMz-pxN;efZ)L)~wLpO1_rH7Fm#sCT zh!9CsmL*gLs!GNZc%$w#I&>(*Q{y7z(8CPqd`M5rvi zLP=9fC`*rKvx%AMkiL8MraxcNx9IOqN&CWEzx2eaM?DrUyb!7|GB#d*xzW?JPoh#v zKoUWW2>_|0(%Up}))(e?RXLD|v6Kvq<1hX{13$Ic|F~b$zW#;%3x^h;B@$7IYCNp) ztJ*dAGmLM4;~ESt8vKl5v@OT@nm7OZljdeW7LGq+u(N5?=J$T@+jo901`}iSN&kJAhybDh_{-n3P_jeY~j}Si&tUdMtr*}F403ZNKL_t*OS1(#tzj*ik zn|qQM6GKAu35G3Mwi-gzn1V)idfm-iFX<$D{mLZ+hn;%LsaH+x-*Zx{@C-Htu*R5B z`m+0OvVwBiwr%V~&p3JA-w)LhUiGD!C*Aw_;N<==F+TNBR;%CQGEIQ0v$i|AO61F^ z)cv}>eYIzA-8Q{}B^rjYg#qt9Y~3#&0FwIW*Lw5ik^(AYpNj9pOfXDPO=!1U7#<$I z>d2#3+#A$)#{0HDsm}h7g*W`KAIS5bbHdoBySBXNn_vIYw`z@sRJx6d7z2zoR1^h5 z2xJWUk3aF~|9ke?r=Rz$zV0V7-ucF3`CFfV$2re`_Q{t_?%6fyi;lM1?P}~5N-7E> zq8I~8pVFP1w*Sk}qTY8u_jxDu9kb!6kMDbM`-!tt6NoV=F>45cn5u$biV2-|D6YTe zzQ10w)PB%OJD&H?_dF@m{{M(ezB!?`-YB+g+46-|t5*ON5n_O~7OJY&TBMW|Dp)+! zkQAG5O&}){GYv4LmTq|VPgV_jTmj(ApLn$$S~PTlv&Kr-)>!edQb{EMCYYXXhRLbc zB?;ccQh3LC4?gLl?PK9}|Lr?+#;VoLt=o3I_3Cfk_Bl~a(&aw*(yO(WhzTOf%;HWz z^TZEa`nNBcR}=aP`1=b_rI$Tt!&{F&YQ@J!9=P48FDb@gtR)yr8hoiS1to%(CG@KA z-urK@LjT+HB?}j=KlaEkOiT=)-E1`(-FHvB$I=iYQcT)v#dPmIyZ?0En!&$zVKTh$ z)4QJ3n^CBRv}gC!RlbvU)$18C8;FWRfh4K>-X&s`ym(>XnWN*)J`yrUOG8F@`w^Rd z;^#iDF2L`+_{if4|&p+d0CLFLK5#t=BRXWkJRmFf*7KMG^JpTX%kT zu($tRM;|k^=7`nnE^SXwoZf6TDTDy3a$lsBpsM7(rx3Y)_of{e4lc?5VWC0%FQ3}` zq}=%*i67lLjh8-SB@xtu!;3Wm#yCnTfw|JYS14&z5OMGLY`ki4K{jDPvCK^p+t3fs zwsFzeqiga%GXoeN{um7{U;2{X1^pR8$uJQUfxA3lV=Ms0Y_p}e-t?m%En7aYHz}9z z{G+EXDdv@bbiJPRtfMD?c=MgFyY<$4zhJEsXi`wOCL#)76kt_qH7DJM4QoDn;>o9+ z|ABWO`BMY#XFvMZr`=q^i(98WIB;b4;Z1k!dggWC-+WQCX<%Iqv&|-{ij*D5C70ds z&(Ws$EM3zWdgj^By0qOIKVxcgQd5XvGL&UGmA<61^hhbG4@U03Yx|$~_Vs;aL63{? z`^=N0+W&aqk;Um|>w7B?TR9n`M-0_5z=uj(hZHc(s5eZlEIPkQl&OcBsGu_Mr%fj; z|FO^fnMJCNKiW*IR;_wL(J7Q5Odu5%l1e&@ssdoryYIY1U1l!LYqcio6Ng0Y=U0h$ z{qeW;qKlq6b^Ukmc>ly$Yw$VGJN_kErZ$B@tWaYOr6hndtfhg|&phda`^Tp41aQND z{H#xZ=-Kt9{pqBy{?qH1`XDieK+U3)K$KF9i2;d0QcQtDOqiOUA_B*<-AO)pu`nUa zGR|u?HO8nyczSZO(`>f4UUbFiFXdVM;koN--iN;CY|9yTl#-CDFjUoM7RFFi6;=^8 zY&D9gVMm&Tt%Zm}ovX*pSjw`5MxK|umP}0l!5`cq0OFs#Y1NhbGZg2)U4%2gT1fa zJ3R8S6-x%Z^J}t39JDr>#j6y7Fn&4-p`VuxHoE z-DjS@?iQG`v-0@fC-r&j@#2CDZc+dvfBeS&H{QVbrx(0%{i_TcRR)QOG82UmAt3>f z-rl|iuf6D^vwwKO1=kAzTzDafcP_=z>yP^Q+I4GRl_X_Q(il9lEJI8Q5Ct=7j7gb^ ztaTJ6fdFN$xZs`HrjlW#7-3yTssclh&6~DgwqfyuZ@=K5ZvTZA!d3tJ#aZl zw3iuHQc`BiF(y(7oU>ANI!YBSg_sNy6wW%-^PI}EP&N$To!&!AGBY*pzjyWb|LVeb z4}JW?kB{q7s|Gq;U-)mv@w-PxW@^`6xA~JcH~;hGGuJFQe#4RfGPZB$u`|;xGS-k# zR25K45hA3{S(=&lY176B{&;Ap=Ti&Au6WL+<4>u@4*<>3)@1`r+FQ16y?Duz1%ER+ zHmfOB-8YST!2BkrfT2YLLtC~#blS3I@*Su*k}@;fYkzEAKK2nnC$MSb?XT?XU$BTt zNUCXGGPcTOyF)+<1s>Y7@7qSXbfENt7hM08yZMiWvwy8MbJGoXUvSme@4TWYiWtfQ z1fsGm)LO3GU6P`wH+#-K-`{Z{=w5gs6n%YmX0mu$@@1nvHRV#-aaJ`8t(M~uGL)q= zA!a7V9Hq}fbJk@kITU4%qNv5@OwDMhp={UcmTJB^l~XKg6C=CpDe^OCdlqKD$anke z^Nynafx*|h*jlUQ^y1d!{=xCRyB4;_h6mf@!wY7H_b%AKbH`vgJ-IN<&Mcf7erRxd zgBUt2%EZO4P}xc2J1ugh`=W`KyO)9FA&i44=Sr31%lhzlS2 zyC-aL>82Ytenv!7Z(m(S6fstX8eF1uiXZ@@T4jJxa(ND87_pqhg5K<85mr`mH5=^oK!ZR3`lBAT<{z^QaP*pD z%?n=k>mRTLBT$l531(6ibwJFp*5RvP{>HFj`RG7@eWGKF@YSn+IWDSCCVcI?yY+(q zd2;#PFW>#uMo-VW$u9M`{~w~;%CYH%eeR1iX_0t#1pa0)?^L{O!!*SazjlBhzMHr}~q6TR-E;Wp6wbJ9KU}3(N|23 z4If>WCAlmkiK$}0`G^<=s!6A3RPWmOze`pT2P4fm{CA8NmAW$30^~f4>C) zCRT`&HAYj6P^mOPI_-elZryV8>Qzg|oC*HC_iubkreBW-Z++_z^i^wDPyg`x```V= z%fJ6aW1M&&RF%+Z^q}3I)zi-0@QzoU=<-MY-UmLltJ4hWLzjN;>K9&f_1!x%)6k+Q zR76pFPg&*wB2v*x5K=+b7zIdUh)^hEj2cR#SA6Nlt2f{Ez;7JBV(9!Aox0)Poony< zg`dY~ubtYrZ*9@(>F?dO;mdMthbAho)0-{c*KuU;WAm7_4JfK*_a$q zMxJLxF#4r0U31O&*u)!8f8K^W-uvOZiZ}f2&3fU5zZ`+fzx~{}|LynY-~YzfZhG4_ z-@WPn%vl&~$T^3iQz$XfT#DXkH0E5`(c9aLPN#!LZygT}Pw7{_cHN(Cc){U+dFT*{^K+W3>$U{PL=sggI;o1NWrHlw-jad>Nvvw*(Z#}- zyy@fvLExtbfRV9YW@FBTBoGL5X`ZUW7(;*%L$Gbzmf7b#=cJop5Z-jbjZeGt|4+gj z-+!B)a;8jQ{jH7Xf8o;a-(qcD>Wy4eO5|fZd&#e#_5YrB`Z2FN@1>7cWP0JNzN6>9 z>m{QPYaV(6e=pphEWs+YPA}sCR=*V5AOWO z+Tz+p=U#A2Jm>GOKCo#2_P-v%1NM{`ZrHH;i}&Am`${s7lnk7!f?!b;5P=qD3w!tO zAKS5G|G8_9TK3riH&%Y+vK>#mO{bG)QvX2z%69K|7wE}d^eVqfJ^%Da?dg$Njs;^wySF6|7iwYEpNCf~CU{rqJq%fqDV^i1X zj>{})`0QtYeu=TCDt_++qxw6i9ln2f-^6d-cH4d5cFvIx9ktdV#I`-<)D!-_B=k+}?P7|uD3F~WO~T3&;SVz$|Yi0b4_F^!n;w-G|9Ol3t$LR5e?M4^5Aro-mVd(K;T_~2zjv_HJ- zlTXcR|Iflhtq~-pc*h-^FYBrIcqXpSPT3P-mNMVe@=>Du)R!d;GeSskS!4gw4d#&ShKH|QUNGyZDyel2&N<5SoJ54O zECVs2C<~}6*(`?=Bb8~J6lw2opSS72J95Q`p2c6i_}mwtary~YG)G648q~?Uj2exG zGMHi%hyo#a9UYyX+P!n?caL1U>>Ec6$9Vq751nt{6AhPN4sFevuwvE9`uP7N;L{+X)&{}Tg1XSRh!ix>8naKkRP6EKrB~i0Cmp$FeD}^hZ@Ts7dv8)Dq!dt=C6+F&*VnIK z@u3H9+U*|sJ4NZGQxrw)I;f>owE>;809CW@Ow{ek5}eJDWr#2NovRPYqR4tOl9Yn6 z7AlIeEYaz7&}z0&T^mg7ZKe9vvSt|(e9 zO0mi^%c3AAhVK;Uv|BVj+HBr((~kGA8_YhxAaABuUAgON|E_)PtM_YYMHyUJ-yEYC zYcq%{YUj8^bFvtn{TQwU9tQ*nX{B)QfO6$1wpBL z@yHmW>#yAumo6LJ7Ru7U^!I)-w%Jn|@BHwsX-Q+<@b|xW@0;(uW9Rirl7!SoC79%MOsbFZri%|9j70)^y0pv5r6N~kF9a{bb@fhPmFiA^z`;9AaIt!T&?{W0!d1e z^u63H4Ap%a`Rnpxc!zL_d1gy_&|o4n=`Wu9{IC9eGxH)#B2Z} z7&efUv@A=wEUN?|6{;fWsNgub4K6P@YlnflU&3s$sSO{&#$bjpIF2&E86MO2WmZ)9fp*4yuY``V?4U(st) zdgtZ$&2KV~K-p8q?K>a5Zt03a#OM)Y)T$Fu9mNzxDJCplP#fHM&;FAXa1qH;NHj52 z8HxT_03fn1?%BQ7Flpve?<0SvuV(>S zGF)`pRXSbG$5*sJBD7mA&9fXaMIt7I7!g8DhaI`+kbH-Bo>NGPyNkK>2C(5C3@jX4AIs9HBvd8;s_#bt5iF8M9Uhq(Ib!Xy2a|-fX`tc%=Q8f??L+Dsu8Il)P$I&D1^q}V!Z4$2V-69- zSH1a5hh(AT8MG4Y~JWCl`-WL-rL0uB`Kxz?x+ z1W7%p{KTk(MB9((@S_4iy8X@68hb5lo^4ol{&4_cDoHWOl4Urp;AT)A;K^rrAUvQODvOT9|C({LgDnTjSp_W>(2XMee9~G zH@)wlwmfOQBn~yotVqF|eLcOs&AGNQ5ux;D1#V@%aKqT>A` z#-P@+3KBZAZJL@I-={{RpfMi+e#t13*Y3=}h8QqcD67{S#KutSDiMoR?o8G&NcoU0 zoZjXvSGoj&VvL%SV0vao^DNgCV?_xL2>`+SpellW`}S)nA7+ZWjLhV8oA0=D&mDK& zwe7c#Kg`|#zK?Bopk5=+Gpj4_ozJXO`+6a%bH z=}mueXl5~*r2-0A>mVXXDMD3IlqG8Q1`Jt*5VY0qpgB8>7@{UgTFV{|Pz#qX+dVZg z{_DTKEZ=#-$M2b6{QpUO^ox7cSm#GZM<486&_L-uQ~}Edq(F)hq9C$NwOYR3`#_|L z%apiP*N1BWy766f&n-J#fB(SBxx!!faaH{PZizPv^q$T4Os-wMa)LV9{PuqkASrZq))p8Ikye|-D9#mW2`b89b3{qB-i(JgOb@&nOhM5Se-j^!UHLF48 zu#b%}^8_h$gtqBE>}iQCHw#fg8%i#HvEARtwH$ z1XT)UNh+eMik_Yxvd&TxC1yj;X0d7JN5&5ZSXBr57fqGHPpOI$Va{HSoO6|m7aR2U zHpDtJL_~&EIiyFl0i!M?6)enhN6c1ZOjJ=&6DfoMLJUDC#wX>l!&cm9awF%z=brf^ zz(GJ!mK0K?7%GL=lu|{i=@tb6KvZF^)yg!)tF;KPeeLCk08PFH z=Gu@#pajU=-vGeqw2&n26G_Bu$r`5wf-$Tjq7VgCsnwbdi!>L(>MNQYdoAGYQDo+N6tA|Ybg|5BtA4mDH2Ca+oUrhO<#l*kxUsVj*f&oiW$y6Jvgq$H{!g7Cuu zAem{XV4%|dNU+Wz#y~_=iO*=&dkzsZhLbu|%%1@c5)6YhC2n`xWSk)%N+=X51yv}T z%~^^uBBlU^KoQ|sW%Smi*tF?{gB}D@iiQ-KB+<;(D1=BZ%V^Fhq&p~7&H1<62r(jx zrrPZMT>rtqr@lC;Oh%n`&7MY&5};D)NRY9HLI`k~qpGT`HBuWDN`gnY1DjL>IQGUE z0PXsKfRJJ&7^5meV5{C2Q-%}JH1iMhAc53?7{W~54veADbqr21X{}aM6(xX>QX(>{ zhpk(7WXBD>c*_ljF8#-4p4o}DP7+i?Q7A~&SR5VqoSfq#uosX zuLB$mM9L6?v~tG?1X3o5hyny=uAG!rL8N^klT?*i5+4Wv6ZrsaHr;R8l0xU$Xdq%$ z5hOq@5r8zQWwPY$d`0&l!CF!xhHAz9GepQ-#jG=itKqCvS#Q)MW`*v|u7ggvoMM zP+KKwrt=~o2MbA|F-9?Y4Iogb*+RWuQ&9yWc9oe)AwW?SU?LRFCZ(bEBfjC*% z%A0_ka{!#|*@9)RN_ynA_#0vNr zkjgpfI8V-)1p;e`N)_qO0@N2?tcUe_&79$C!h|YQMi5k$y!S{cDu`)nx)p_!l#^aIaI?z&=@22_V!l#O{%cgz#1lJtxAXl z5sIy-Jd@gO0UHI&{Ly*+)JIftSs5Mw~2rvYYCkpvLX2vxC1$Sl;3WZ2q!=ly7B~S=mt_aE`<=C51&Vf? z0HE}q<`iY}T24fSzP>&Z5v@8AX>Re7_oaGYkVt}P1R&_?=|OjTQ~{8+7S1_U0VRpr zzpzfPyz-9uP2(V8hDwo;N-~79TZeJZ!Ix#XDC?lYNGXy=6)2QQs?GrQeo~#PgqZS_ zQl(r@@Pz`ZNRo(%D27Dd2dc(_D@!&21O-9} zkd!Ef0OD$jW6qqTT7U`$!CFH_(LqW{Q%Z>4slu#slF>ZRp#YK!ilRVK6bK<`cOVR^ zT50@?R94+xnfS75_rX+>)Tr0%L`2HO@ZM8OqP1EbzKr^V=NvPi0URv2rp`>ylrag6 zvoO}eSI^lE+Zuvz$z)Jq8k7vH@}G|qhkWdS*LP9xIyO}U!@xesNHIpDFh0& z`ANWo1+N6-GVXLrt<@UR=@gphHJww{k1>Inl!zdrAR_JQ=}~A!79t`TYv*=tP2HiQ z-~%dmVTH98F-AZE@BIPJcuHw*_FJo2|D;sK6$G@G1icK7y1;Sye~@;;IHP zc-$q@K%okyB#~4r+vkddF7V!yRBxL45WI>}J5!&3m-7ey;y_vl z0?M)^B7iGj016=>NrH6_-g^Y^5kf@l&J?IBdV6~TRSF@@Y4@YmZlPYUV=lUMIvrFR zBp?x~JP3&>&dGpRI|`}-v(W79EV3+DVuH1n+N~B5)103nO7GEbb+p|o^#8o)sQC=w zAVIPc#!wO!xU6z%&azCMb1>Fc`T)#e!=wqBDlto!2{^p-9Gdk40;zLWiJ>mD%3aTK zRfX#sL8d6I3=%j0EDshEa%id+-1O8GjAf__wc9PU+ie&&D%}LE)oM{Ks{tUWB($0> zHOv}=R|a5>6PsrufVPWLTkVcC>J6Zhcvk0(_@aO#(&U5I^17y!kh@$pC0J`zVpKzn z;6p_QtBQPJW;7a&Zl*yfimI|KNl3L4Ftx^Lo;%8%!?I58S9x2X(#TT}jAi4T)v_#M zt<{tgi3ozPj_V?orJQI2gDEjpZNLFLh)G+b9U`R^NL2|65LNwXXDy;cC>W{|2tYFP zJ>7!^UzSiZTv@UKlA;0vYfZNXz?A2iiU=A#J=E^B6a)dPG#_l)Xf>zb_C<9rP$)FQ z!07bE6nY2xC?$a*rl>)ure@3V}9>>{O2+2g?bu2Sy7a8nHnV#rAlKSq6#()W>iKq zCaFY97CI)EfjSsyTX> zsrMzhEQ11StfjK_N<>tYg%S~9Yjn{?-@bACj`5p`OKs$twVdD!NzBAHXHJPsX4Nkm zasrC%gRL1dl;xZuB_UGEa<-zNEMo=Ob=m^Mh9v>LeTF2F6{G&1MUk%cT*EU-hkh%3_6GAxvbPu`q1NM-OWZ#VE>D z(SwLcMHR+qVi2)*i9kz_yBWK8JOeT#o&aHH76GwgWn!oT%!Y_a@;rw%4qJ~H_|<;n zr!W+RyjD{mf<{ebnH8v9UV`^sbw-A>j#7$Rb_y;1^xyx%`Op2zXl2Zrtui@>#`%n6XOV6a&z41qS@xQ)_Rvoq%qx+Vk)|kfhz9m?^ayJkO`=$;f?Tl-4 zau5S6B92&hA9n6sgVb_ZFw{aZm4liSOAb41`E^q>Q~h}@*XC>!U0*;7A!wt~An!f( z_4J}F3pDCI2tndR@BFdxV8QndbFHz?wOXxe`VY{`CzPwM3_x1dj4F}{Lj|f90NVGT zgjOd5`I%6)hg6xFm>7~0LI{*)xhfI$GUx_$z;ER`$9#{zw7fEpNT#u`;)x@OK*z{OK!S`AuqW_8g-^ zRjDirWj0U+q7MK-W$;iyJDm=)ETfbl%q-`B?5_EY@gN~I#!zbRHii(TS)t*yTQmG1t08yS<`S&-UKA!>{B-DH_l|C$R&LM8-DS)a=lLWyBN~!@QP=czW zvImzXqY#-Q6)AIPDSF@4d=wIu1LhAYCF<>|EzV5Fi)QBoz`+7#4n2K+U?NH>kuio+ zN)$psjFAQh1~tobaxSOo=@|+^D3(R~{onu5AxW_fR}4a97$QlDFh@()cBezuTAi~D zQ-vC1Nday7c}1Xug}gb)HmmncPtBlG0D}6m5|9y5O_J1FiY$qQ-443y+Gc)u`lq_Q68)479$&a5Ym(HLTds+MI5g=$JsRYYfI zW=N%?>{{#8m`sc@hfJWwFhL|zh#nz$VkWYgQ&e;38bTn$2AOdPK9Khwg%7ANnb!h1 zSV%Tdy=HpK(vvlYL{V9`ceOmNF_qU3@u(4i!K&yo0b^eW!6yI+Y=~kEP(aJFKy{X= zXr3uWQsRN6jF4LM0pK8k$*QEJDFt*%n=r)0AV^FERZLG$!#M|$M50QEl9s__sPrWf z2t;(?tZ9ros|OeG~My+?OyP>EPL%oBkQ7Hk`ai5IpzMYoDuQN)S4A_a-SFu_?j z)-41QQMU$==d&1SED`U^@f2e<=phOJKYQODuUA#2z1G_Ml(*jAZ|+U+AtAKTLRS$5 zK~RcP#X&*EHe)0TR;Nt-1BR_id-_vc5mg4Z;r* z1d?DT&!6}H&Uw$;=j^rjUgdd+5W}bfB!H0+NC0PissoY$es;ead?3RSh>k;`R0PZx zfSI*YNiYzR5fCz&3GXyiCGg9Buq~L0L7>Q zQZ;!l6edejI_x--m5R|?X3z6+4@ZFKdB7Y`2kWB)4n5Cv9mI=7pfto`gszmp3AY;% z5?W)BkicloMr&X;ETurB4L@~G+Xr9<0SQ?I#Bt2kYLIjwvPIudA(4PMj**05DFs+I zKnR=)4$?^O4Uk&`KcAIGs~TnkAp{tsK`FIISAvlc!Y~4DY}tYmfDCre5ulKDL3$FR z&{mCQ2%`{PH%a9vWtbT;3HVqbbQ>f}4&h)s@ZN&!AtMPJ1_2`>S1J`y38xzeaRl0E zL?n>XNisEv5bJ%HVkaRWj$$E503l+^PXPkKlygd2j+4FwOv=dt7|G1pQru_H_oN*>QZ(+CWoFjT{*p&k9xtcK~|{5&;}Xf^-~Y21un+fP_pUi39)uD6K$g#R>C| z1Vr9vIt|E-j+CgChD5zcgP%&V5CU}K0KjovPNmWug%LWAV9zBp)^Jc9bgw`WqiF%LKl&(Xuji;zZ4I%-PATZXlH3s7-2FFR9fzpbDFg~axwU?ko2FqckAy(F71TfZ4 zNrNXHn#NeP%wSO{LZ~vZ0RRn%f7S-9t3*6^-l8p)N;uU?z*7YU2wJPB&J^ji4^2(p zERsacx@G@aeE`EUa-?F&=kgFm5gVlt7=Q#pH4KoMQELr}K&J$w6-cq~jsQkkavTTQ zGR7)qK!9{QmC%@JjoKut5~Wg^tCav8$Ad&J@F4aEbTuH)mD7Z9JOo4rW@8x=Nx7ty zmn{R47Xriq39^9V&y|1x0NGf z_nXlNGOP{3YK?`-0yxqEM>-&-06@fCF2_1y+d;ON^leBV;&|U30SJN1<%(bn?7Jz{ z%5V^bsI_M4I1J1vr34~E=}55Ff;h+@vDZMZ!?|o`ejLRD5g9BegtFEojbui%5E6=| zAO^4jTC|901=61#KxRU+FdhvI_C1V358Vv#GA00|{%weOw}i4c(zswr!cP~aZDLSqa9 z0w4nTzR#ZLK^TP0%>3QA@cl5s@9o;ao0<002tG==rqI-i1jRg3(%= z>^PH_WlSi>93T?RmNAMWs8%Wfh(HA9ZQm^(JO=Cq6vl>9^>xj&;%G__kP=#d08aXN zECV7y5LU)rDM}1%z*>vo{CNjZwFsdjp{c3mL8TNB5fTvtLsCeC(gO#(I+OSJ^k-d1%Z&rk&=t0GH9^udM?lupFdkhtrSe9-8hN- z@;;kfjFLRhqdm;TQw+oGx*i&1rknw?wHjT|VQUO0ZNUfea^oX!CYm>=wa!93i-AxG zk#zHNLIP?MRuBdYECsJ82MnTRax6^AK_+N*2iXrIjzTkPHRz-Q713A*&r2ma#Y8NW zQ$A+vYHM;z(7~3#7l|8gI38ENcIDe^YvtE^2gXxR|6e96ECN_W#7rg)p6j7DhNTps zrr2JX0hLnV`#us0OgI4nKJf|I>pKBL3qnXFM5vU@d(wXxg&_n%0En0fhH8_rjUj>O zIR_oUUcj*Iq|VN+X~q~4DFs>^L?R#(z?K1#kXb_*hoB<611vH#8DKO-=FeFGIaUi* z>A>j7z!)=EOu{CbaKmeZL;{SqXtV($&h++;&SOCbcK|N}Km5WQ{S^yNdw(uvKQ-LH z3+wCP84-M@GzuxuB#ax0UZ1rXYYkx>v2Y}MzGtU0Gpvo_DBwK~V6RWKIMfuB%czwC z9Y<`9Vrwlh023yuXJ%k2T#llcUC-leE_bjFcrT!q0D$%U(UDO^29!cF0x%IltYWan zuw^sFD3w|ZQ$ntcWF3e9d<4i{^nIQ+K4DS7sMe|iz-+9AB$}9Xdl4l%1Nm&N@O-gU zIE3H&hl7E@zXjj@x3k6J$1Hd^MWdf7kMw0#MX>RKXhG}rIZW+ zdz5`B2m*|v5Cj2d(zx#?7!tXjM+gXx>p~nW1k0e5LdS7XYt5-t3ba<}Ixfa>48_UG zgB)^u0iGskZEIXuoGbz&a$qET9_ciF8^HA`>O2d9)gVpRs~xG;qqV z86O)fOiBstx-K9g2tw9caU92hKp><WAI;)A<@7loC=_HNmlpfX5i?jO z>7ddYgb?Tm2cjqfXG%H98Us-jA|eA4upnd=N6)&?b?41LxOlt-eCdMO=z6~A`|iwA zsqz$GBmjW5Ceets3$)&=M%&`8JNxQ%OL))$ya4>{n`h@|%<1~Ve9nNe1_cpBQOJ(tKoA6s0PJ}_L}A2QDORy!Ap}R&035OR&;EO0O(ID~iC`?m zaSUnCPnhHq>T=M=fYO=~lG5^AHv5dD$$QVK^&n%9+gHzgAfnGGtZmG=V`CH3fko0f z4hY6tFxDbsQVS3hvtfFizz`u=AT$=4U4B{`5CCA|&?xw|1OxqrHDR!a3LJn4KuU?e z?*k&DF$$)2wbT^~l?4^b9Sj6M4}SdhvoeboF8q$r#Vbq{$tVaxsVZ2lxvs9(q<#09 zReWA;a*jhxH2spcPGkU#E&=i}r~VFjH~^U;z;ly7D-V(IkSS z7*wlZvfTnforX+%U6La?!VGXq+%V1Us`0ajXk<`DqT`x&RH3Z-)O?nBbruEpY(>(4ylPq$wBi9i1Q(yRXYs+k=x z^x8Xbx}4myu&zTk?I?YNb!e%D~ zvy_C{Tm}&=cXqWdMnd7@KI}x>$N2Ym%*5IA7M`}^m=(XQ&pRJ$YpwbEamO8h+gna( zseis}-*f)7%#7I`Kduho-56PqrM|dXl0E zB+#BxS`{mZv;8lI-_|Xy$ANw8J~R5#VM(9wAP|cno!Uf zp3u&zi>9gMP&hzi6j`SZDR6+!{h-lEVg~?LY+Fbs9K8eTF zG^Fdw)uKQ`2!a5n3dcY?4l8ZgT8mK>LKH=yRD@v|IQ;{ohdlirSAMtGKK#(uTRp4= zS7N$rdeil}y3E-hI&ani`z^iPD2T8!fgFI+tDbq#ej(?9jmy&DYt{JXlvtl9J48dj?$Xo@9@ z2rOF&g8+aTi3Af#uojR&fGY*o)#WZZe?_kA`^B`H4%qMM<-$29HsF#)^OmTPU9HU?epX0ie=Jy|PzYiJ%;S^x@r+Al%WM;3 zKm!a0XKv5Kvw|;YzHz-mTBX$ObL?cH~;`C)Hw`RX&XUh$$Ed!IV9-~8qCniRLC0|*2m>Gz00=;c7=|GrNsvP38|&-3$9mMd<^P~hRq>t<;lmZk}i@M8ABnaKM#& zKDagJ`K@YIwHnTBYin4@)(EW(>L{V?&gE0n^EH`iOJ=Cw{r2I>5CGsU7c|32k7)wn zqw?9b<9QxWR+xYNO1S|)001BWNkls7ZnQoQ{g?d_8%{`bbG#_H~$UR>Kfqw8}W z?X_PR?cdQBRU^n|a%iC-zekX|(R z)hjx79od~7y61`UmplgF{?Ll-2S0T7MKe3wKWpRC6(hR`Wl*W296MeJGjPu-bed(Z0auT9+aUn zARHeg5n5}J8NgabDP4%d2#FAg2vr<|=lV!Uz}A8w!eVK>xudh=41sj`A>I7T``1_F zD~@h2?k-n%w|CZ^9jib97#F~va`>$DA7{^i{xzEp%8EZ7D;Bp(wz1dNp8v@3&_t7z zE)yXj0Ua})$!UH-P2A50J!3NTevVjvYOBt zLPjJoP+OC#pVrlWXLn=A*)Qe!4@97fkRa|-%66qvX^Y5H^?$@{A>jc?diksc`5Ry@ z0oWq47G#Z-!d~^wHKwy4p6vht0G7V)4(pHx&FW`CpqNO2u@;q9D5PM=l_(^!>o{ms zRdlx2uapAif4q0!6r$`8T=FkZ@Nu2~P+`1u(W(cx+$M$ON>G6?jyRq6K}r%`U2T^h za>(NAKYMkj0|4-eZv^(ZBb&FJd&-eFedV^kXYIv*{`2LC0A<&4Vj&Q~T6Tz-kXS3l zQb@?8(wt4D!6?Io$Vw^jJs;vYLf4V(xeiRJ1v3J0O+E`L--j^JXp9*pD_>HNKol7m z9~o0pNU)YU2tsxp7qXc&x{e3M$s+1lqmDIto(pU&xY9u(lFGEF+ER@HYYbK@6;MjS z$nYo@#*1Bhey1>2tw>521v)_FOtA>XxyHuS_uqSV+tKejqv>E^a0;$)=){wbxu{sE zq*bgjNx3orA~=ql^pB7PWsEMBY80Ijjaj9@LJwFRddgmz-G+CMTp z`kC8ThcAgMaCl_**aHtf`k&J}JKs?*Rb{mju#^I8YHCF_sIns^20>^L3HR^=c%F+| z#cZrWtr9w_pc*0x0gMRMY8i|+aiLIHv*&jjTQaG1US=kW2G}MNmPpwu82tXjE1D@-O8M9j6g2)m4WcO9i zcfSvQV_WGxXO^yXQoa)gF_yxJ5gl?ta;Y3p#&gh1yHu$v)|$z(Vc`Jin8`4pBN+&h ztg+zvDV!(-R1LK0n3gFWdTd+e_SG*fn10i}mM?b;AKAER_-l;hMpZ*fTR==y%A`!X z%N)mH1c6Z$ks}?+XvvYp)>@57Fj1(2bR;1f4>3TZ7W|HH?&i;2y{lA{PnlfKgE&q! z2aGmgK(XT*sISe|BX{03S&ZHQ5I+3!SoZe^LoD0d8&+)Dv;%`a1AfmP<_e)Jm;DHkGEfdUS5db{^mUC=LH=;x&kw<0+&tR2Xi@j=-7{Jb z6GDhoI)gBk_o`F^yKC3b=O4Il>vh-PHSjm}!+++Y=@fU5@W(&>^5^qkiFoJfO=4_3 zIRB)R=YO%L)^7@`5qXXeY|NfrE&@spLQ@?W8awNg|GDwE`}>*qHQso#r0(Wc_qDG+ z`qtH})}Ka%VAujPpd;O>?p*{x;*mmBFgAQ`eKr%K5M?5#D1EA6Dvpm_RkbJmej5Y8 zvrB>Z;P}_y%-LevPVZ{oGQ4|Y0|T+r46fs&Lk>txY5|A@AQ7~-HqSwFI`WkIKM}0? z`7LMQ+MWy^@~ZaH$JTDYVC|az2MiO3VFX4Su*N_-I!Sh-&&vmbN zpP8Zm`tqwze(+aUe(rZay70g6`tF7IyUk5s#jzG=U)r=k@gH}Nm~5u`M~^8ff&?RAl1el&a$uF?C)pZ*O=bag1)C4DwWDHNzE@K0Aj-b4@@MG z(E>l_FoIh1Mh)QWB zq=fbSJiNbb+#gu8qW~-Bz_v}BM%Onr)gLbfVBn@kR6hM zgs9>egh0?n+L7V%f8}!iCXf^mQ6LZ^-oKdcKkk@%6#jt zU$62ndr!xfhaOme=K2joj~ft{q(o~iOA;uFnns>kRQ0??B5!@?a$LV^W0Xm!&TnaJsEd^* zr4_i2i-^Rrj={1)r6cI*>`4FVfhQhmnAf)Hjz9DraB+YSpVvWGUUKYlC!KoS4b_R^ zIZ?IhH#gKS0j+bZ{@8c_p{I3E-t~)h5Bq-h)wMNFUb+ryrH}xSnPq)_{^(R%_8r<` zH{A0?+1&b2A2)IQ$b+la6$-^lZb#4VdtKC*9+zt$dHr2m5Bz2AIq=Y$ial{@%jW+6 zu_se0_f?L^zA?N^N6GrJP)IbNwmJjqY71oz^(HbV-_Cdw8oer!%0%ZGx99 zck!Ila(K@}!TvVsCF7`NR=noq6OJwvhOZbIo|KX#D5aQ4;1nS%N+~dkEcf?SHaE8W zH=ux63O5kKL>Uq)rG?ove*@fe&!6x6ybjh*2T1}A; zvPF^vLP&54uv)dH+KhkK>lQYc+a4a=i$k(+@#C9jV@+<+sjofrl)J_Uw>1~X3V?tp z$3^Nqeu)WW0J{jm*GN5TTIdw6rvx9z=R{sn-APHD{-lSaHaE=PjCZa$~0c$ogz++i6GT z#mc3*)G0?a;sqyknWZyw@P{YH|E?VD%B5}2g83cq*}7rpk&!aU%pin=3=BYskPrYu zRgvi*FMYnX(cg|pN(cxoTFoBme8sWv`%>RC?0#Mc@bNdy23yPU=tJ9kTiY5gaa`e& z5GWl9K!C36LKH@f%s`~U7-}w-w`6v}R9-52_Hj^!LFi4edrGm$_527$!dT9}yBqpfZE z>xeZWi2#Wzf~3kTsU6#6Z(CD&#=W06V&A%PKBOX_&wul4w+{`E{Ar2-W=eV(IEo?$ z02Cy_YRSz_b*-x&dg2O_&H<4P`1ea%X~hXgpS5VoyzBe7Ztjeu2(7lDwMGO$6)TJ* zg~mkA>^aSspLF7~ua*19oa0VuzHh_ho6gv}d1y!(WtEN)5kW{vl}fR0=FIM|&0D+7;BI=h>0aivu|xAwiY zXXof$DrP8`BAS>eyU3U?j2GGqW0P~OvF9yXG~>42)ot_kw|&otTn^C7pg8P^Wp620 zRJ(LsGDfqt08^rDkWhhZ&<1&|82(Xc?EpfAz>0xb3bIJTzUHpUXWjpKCn z))+lGQM$wTJ!`GDdmMo?)u(RQVyqPUz9XhjZ+_3#zW#>)x^~&$b%W5`U*+Pg6)P@2 zWXarb_wL%1Mn@pnqy^Vl1Jy79q~!Pmj8HBG+|ZQ2pr*O~?k66bSa|Z{d7D=~u>MUO z)(z|of{=}|5QYkJ`5MqV@~3q*e(xI}Jp4@`I4^TRILp0-8}F^C`sVs?_4M{$=cRlb z=?JW~kV$750Fj8<^N6z<=jisfwwt8q#k;oezI6MR;adRNG8hP>h^6Cz5CWnogj}9F zXU^=r<*dWq+1H&cU$H^Ni%vZTQW@LO-j=_3*N$Cetw9n3rI5hZf>Iic(qJtBl4Ko6 z_mcpFAhbZz6476SU0_X`)&91|6K|~yz>pU^1`>Cch>y*GrrNgZA)Dkh6ILD z$1x)!IG&5zCX75rTZV+82V!Nhrlz*5I8iyGw@~`oyw28bk3ZS7rlGO!4A;Z7AOS`j z@LUg69Hv{_8ebI#_R)E*@%D!fw!J00xVnY4HN_*nUWTn}avirJQdqL@KjWVQmW1xRPSCg1l?9t`--HQR!T{cYo4 z!mAdOJn7X(9XdL)`Ecze%i)LdWlDIrD72%!WS5{cNy zSik>E8~Y6)m`k~rraHT{cB_vW%j7ljs#$Zit znns7KI_3DkdedyHf4;W#a*oMf$0sjqp;w)8);qeo8^5}9`<9wW#Q@CcN(VCOG+JXJ ziX%|5LPt7mjKwLgJ_zF&wrw4V`+7z{o6E`vTg%$0`c(gu>vpd4egD*k#!Oxa2b5Bn zhv0iP@KC<)C;fX?6Q=2|5mCm3mJ#-ugRjj}o z3lU7#U zbwLN*xn^7Ric1%)T+!gnn%VL04Nq)4j%^~%rL9Q>dnqXbvc^Dc00(x5*Eco!s|g`S zAtEA-9ardlB=r08KU!BTDA3)oh{ARA3i#)&i+|1|9;J=ee=09dwREx?@Fbz zXQVR1m5vVxn9zE~<&5X}r%b4chhE#5?fv!EiNBli+Sj=Iu@Sp;j{o>XA)H8OQpXT! zCr)as5E#I595BX0I+dE2$)@L66W=wj1~+>dTGN=#-Phpxzmhif3(C=d*XHVPEQh5V zjEe4H#^UNN!7C~Vd)+z9u(8drYi_Cg&;H&~PY40pXe2}+K(xj%aAJ2g660RV`-Jb> z2uTJ+6i9Sp7OWf^)^GaBUuNri!DmlA|G$|a&vRzBk55d7e;`685-5ZOfrygC9$9F} z=5jc5PGhFNG4tV#pxl>lNcJwi|LHSm<%x&AZP}sozBAn4TQ@OY0EYxRLPBwJl3gjm z^;~oumjMt6ki#HkW((RH=ouK}wQF|#XsMp-~=Ty@_er~;O@toTpeBg=G z2M3D7rBV@sAi!!6vNZy-xpe*FC9`i0r=`yL#3z=#V$YLU+s{*I8s z04fwj;7Ex^Ya|3<8&XZJ^JbFt-CNe|=Ko$jXeZ;)?iieaXmA2NIRQnd%qRDxOcQq& zX4a+jh3CI=$Zfm204Hfc9C6fP*9{DeWDzARov<&nWk^#0gt0OVl!CGG$vH7^=-|soz>EL%5h8ci>B2DeXF-b&kmXILtJ@LE6(YfHGTSw_Rl>2=#zP1 zMz%It`K<*ak+e&b#7gLJVWRYv+8VEy0b-JFRR|Gc22@RH!e05^ozFS<{w9xSn=GeI zCs?I#-?C}fb_*dOCfooP7}#2{#z3)HW{#G+AZL-u z@s&4ie$K6ACcWL(HHiOtbk*j|CMWb{O>GLQ)grM)M0T*I#_uRsCjRwbFFyR>F5oY~ zK!BZ{O((ZBH~zG?DP2F>KlYi&*7n>KE2RL@8a7FfO02+W3v3wkHJMA>+w0%G;fYO~ zZ~vdWFWb4TKT|1H4j=6wT3MYaojTAzcwW!W-b;pd4_yt+pY81E_~T`-s-5)@|1e{} zy#v4EyWP{9PGA4{W37mQM1YQzpyT8mzlQ@{1M|?>$dk2o{u*FpKnew*657~Y(dV|o zzQ4Ng{!I?x_>*tqk-V{|zxwF0o}S%bv}}wqW{RdBz;RvB#$YC$MnVElSn6tT_~_Oh z!%d(0=VMN0#=~Rjt02mOAHV6zD#W9nV zNJ4NBMexM>T|-;944yZ0`m|eowNoE=-(T5p0l-^tV*ccfJ9Ucb&edz4e8-L*V-wPG z*%-@}Ab?6WfKs_U@v$E~@`~Ou?Jp!ERIzGptv{}|uI^hEjW{tLyt{8;@;l^7R;44s3xCptj*>=P@Jqv1VFaTY#5~w2`8s9hzJlVh^t}rRo|C}5h6sP z1fdp=FvhLe&GVkE%KUWv&6D!9GrwkCMs{8Qu5!ut3daF$3}|CeX${60u2id_Vg)Kx zaM;pWIc3b%W~}szs|mR7ika>i7o7L5g>$<9X>ix}Y^7X8DJhY*7MPsTD*-F55fbKG zu2d?ZwSpiBdGqFh@pbEZuAMo1`dv$g%kgD5zVPzW&;D}I)GZtO$wLory1Y<`0}a+P z5$x(2FXl6~|F$>n{(DBsX24pjm5H#uqv4F%v)iw)Yt2yKuAz^uez^BnY)K;tCV{{R zAOvEpBXB*}X>FtXsFL`kiZ&{ zViKUNW#t%QY9?Cv+Ao{G`c1y5N%?`(k3ww2>gFeVI@;QsS3nYv073*30tj)6)KLIQ z0j{5J-?XXk<||L@2yT05|7Qelyzx?8F)enFU3uKU&FHNCP~VQtu2GC}93wD*>$-^^ zU!=hp1}P*&afDJj0Biw;fG0Qh^z7O`a`C**nRhxam`i`K;cvFJwfm5UghDBGfcv;E15Ur2(P z%`G)cls3Q&7^@hhln6{1D@6_U^(QgPI2;RZ9~v$GAq=BTp-^&*lVMfGSgn?I7)Kl_ z15hpnO|^CTmE&83yVm!|#eHGlyDpp|4qr64Gn?~2w|T?%dbWg!kf=c+f=;q+Xn|Q7 zVTXrHH#gL#A3|h>LIe_JL{ci>aZK}QiGRHDulM7;sIz%x#&)jT-DZvL{q*KdJKwxu z!HhOz3`Svup64g&-(nM`!&Eevq%#HU7sLfN?()hxR=BpnLl3Uh{#RFjtKa z_IoC_Pz?g`d=H2SRIC6PP)Z3Y&jDo(3xN!50GZ&)CwDx#Ye)Z;b6RFRk`D&V+rGE^ zMceaV_Y@UC@m2u1^<^~ifCUB)xRT6xxeRGPjY2vCp>z&c@N-K~sRjdU$FJG7%Zpo@ za~Ba=H|2R?*s=vc-*Z`OC2MPIJ~o^S4Hd_}oD$hfy;KTIkrvfrRR(e7E2U)+hxMZ) z#cV^fSC`6UB*5OUWx4Xo<&@)5tgo#(zrSbqOlz4XGU}uO4-(>E0w7{Z5_a`XOxEYq zKVV@D0mYIiCW4rSG)TfwpM|{|kOUl(s`Ab1iWy=PnL#$Mc zDvlGu2mk;;kOXw}iiOv%TQ|7yrhhtYzXrEH_wG6Fp~oElxrQ3&Uxxd7)02}W)LMfO zgi6I6$1yT62oh|RWuq;#F&Ksc#7e`OH9N+3Z6Cg1UdOaY-gm=e>TN%I@ss}`{&tL) zhAp8J<@0$q)&XOXNKkDYN%{Z2$lTG@Sl+Q^=v^B(4&0G(U8^m#v5d?Hv{8U$5ry)m zwxIWn001BWNkl^(jEo*k{9DU2ug|oL@`;9e!mnF`B@0ctyR4Y*x2`~uD z?0OzbLa$mbx?i|@L6mE1IeS~*;H`s$*YOi$}- z`u1RN+TU8*dDGICxkoRVzTlrxM$zbKrSI_B=|Qp(F+%Cc<6Fn2kcIxi(SaR1dY<_9 zFDLiPyU&9smmjh0>ih1wH>)Cz#8Yc%qRI)DE$G-XW5kmsGn7jC4_O3*05Oq>B!WT) zlP{Ja6~3@Xd`W@1x1F~bYZ~gStJiKb-CZpwIReQT1A-(l0{{{zt5&7T`S_KJm50}ZV4UCF+xX}5;_%qotk>yz9wHDVx`m8!q)-ZQ z>*}({MCI!3rNQ#rZ9DtM8yj-(Q&IIuj%j7FR6JR0^%`J!L%C9YQ!bl%s}SyS?X~4! z)=ks#u3ayWO>ciY;AuLD#@bv0CH=W>1%f`dqah=frb zPem;)I*!M#>w3nxC#+ew?WW~T?ct4&?cG|J?_Yc>c1-UVZ@ujDtJ_=azb-j^b>G%) zc{IJTQ|!nMj-?s03<6D0U?29i`p>k9tpNJH{?G~k}V+y zLWochMk32G%gA1Odt8a&jDr85pc}n_KeNHZ?SSDn+8)vt#6gkFD#u%P?6$0w4ejQ&}o< zF;A92XJTQ{sfyjrfJF&ZFg@?&Q@o(#AcuAA+3ty;>@TmhD@jNT1u>Qd64*DRq zkx3NCiH~=|FQEh#Cj#3Gob{xe> zBoG0RNaSmB^{4mj9Jo8M@gu_{lN$}-w25MsidBW>s?ycKa8yw?3=K#}E^wr1>EDdM zUB4@S(ci{LFKolMX?2Ztsm#~ct=`yz&TAY%;d=b zXYV}&EW4^R?RTxc_c{08%CU2nS`tb~!pags0ST}$Fd`!?Fqmx2$ACS2W;A1C17nO6 z0)$O8CJBR)0g;3f5{fOg)asy)Rn=YHmFw0G=bXLwTHlXb&Bu6*2c(wN-KytL{pqfI zZk@f?4r{IVorU+Fy!S*Pnyb|iqd)}6^9+qB3*@?Mh zcg3FSj-A7A*u7`+1~y3~R!vI@j4|3W)Fetv?u6BAmw$G!r!?5xU-_0Jxo~fDc4cb& z`;u~3f8ommjYhG2cDi}e#s_y@G`4^GpSwFNkE_|u^|U1yoO||%hIbC1SSoiAK(Nli zuz><(4C{Q`s8;J%$EL%d^>>x3O31;c$>5y4@g+^-o3H!zxBdq?BsKbb*KfnzOqZ@$ zwdA(31Jxg{T;2O3XDx#Fu+G84B7{Iu1R#Mzv2OjM7mbdNoi*1JZUb=0&ehF*)4i)N z9Qfqq=ul_g$Vj3>pm3Hn%X3PT1Rz5qsxd}7XpR(PROc*02)b?C$i}&u>~-sw_wRn^ z-#)N#=08mN>l^NsH(%EK*@?;Nd)cOAwq#JN&E!ggA{S##Nm+v#9iMH#_d&0hyk_Ox z-o3MLX;l4Z*PqaPd8DZ7EmQzz0vV5Aa)d;hD} zP4+)?1-|&j9SS^l5tsk*#^c@dFTUWSvAuh*njD*9g@a*M5g`x|gFpZnW~e}Cr)O_G z{@9*-Ndhs9H^xK;f|U?E=Bo4lz`t3I%^|7JU-i73w3HTc{fT|qgBu?Ci^;LMsA9xe zixB)To~T?ZA;btKP^ArRJp+}`?`w?qef<@y4#{);@#`I3a>@B`)5b(!W3Gm5Uf-cq zDj~*5h7E{FWAO04X!S2R2V#P;7WGEZ2Orq}gOT9_FI%^4@ouBj3)}v~oa=6!k}v#t z?t#zUIMGa#lCYzuLR-ESE!|2IRlMf~U9@)HF;|R@PZd*BGq2sZZ|d_BIkY6T6~u%_ zy^a_?x_is#RN71b@T#**tN)|V{K!{!XlwF6c0TydMcmil-X2B&bo!oYf>P;ij85JTyMhc*7~HPZ)W}wGV{1 zU3>Jp8y$@l-0*Br1qC4@LB1v|apyOFsU{hKEionu;_n z15knrm|2UW&=5Q*3W^BXF+Bd&zJa!F#I}GjIn?ALR9H5#x0rm)N7O?W09IXjy_|UU z7h{J@Fg`Ky>Aia=cPD8@nvEtE-jny?pqj9X2%vz3fHTf`#?|*dy#MscWj*HeuYd02 z3Ia5RiMXN#a_O(g_#_80r#3#*w%LsLy4wuebM02UU2b+7jJst!7Jxx zn;Hs0g2EUFQB`9MF*B@l5Tlry@;e3=cYVwl6QP=ua?VQLu?9mDnED>`^BnRP-6YX) z&e9Ms$e1_g%T9rH>uJ_9nX8->0jBiYj%zF)E?KJ#L(V- zVXj)solD6V9so2+N@xiv5Uh1n6doZ6#UL=osdFiXpy~_S^o--zY#W%K46pji?F%da z5y&TR7}5tf4FA>e?&>Y&aw^^zNYa#?b#8Gw09E#6B6W3}%h#@5ex3Ij4{aa2ddud? zyF^%WpCiTq1(e8;_kp^*%Wqw|eCeAG)iZYG?R4r1>z0AyM~8O}m4o+`q=||OilRW8 zrU+3qsvwGBrm0e`HLj}|u?)#cHD|+_Etw)U#;+SGb(a6ROGobGlKWp+gDk&e8r;wDizOnp0naHKT}_2bz^Az#2)5U zOQjUnI{2bM2mxuDs&k2ofCvO1yw+9(YadfPDSQl`%g!orPYS zNq}f6uZI&~`qE{O`-uAXs}|Fm+3K7l-UF&^2U-k#^i~rUpzT3SKRQMccK0=hdcmOPQPD!Dp6bvI50Z(cY8<1 zX05RYs~V6b$w5B>sHz%cDJ`)%_W0$m9U7UrYU5dh<`ZvU`I!FLT`R|B?7+mQ>eYJi zKB8W$Qz$$!8%#}2Q?r>t1@J*20)jCBTiv{6SJ<(A_{Mg(Xkqdn;oSYeeqDQRvHRhN zhh93ecjl4I7bum}bY_Cl%$mYPWZ00;y-QO2+e{t(OP@I~eqe0k4VyQQ-mYRrp&%l4 z*2>K6Y~IYO*H2A7{(6;Ov&b!9zWCBjcW-=2wVD%=(HJ9&qEPQWRG}dTvdl<~(^}n+ zE*a?hld>ZrvN^HM8Jru>!I&bx>T7!+_joCl%#okLkJI`#*8eErBOhz%`hk4+#KiO~ zw{M@AtX7+))vE>=fTT$xhEo`}=PrQW0MOme#URvv~=zMu~{2J0q=e5KnzeT6J=0@pb-)E zrpokG{@Ly>69Eziawe0hwca=m9nGFYvRFMKGF``Bc&mo;Tr5l$&wI`@zOi%X*td*v zB8VDep%Mk6O2iCe17j315S2^ZbNmU*uN@uQ+W(379s8Je0e|#QJLA+;^@Dpyr|tx? z3aP4+dLI#0HN=Q4%TTK~h{@^p?W1=XW8d1jsOvx1PFmoILh3-z(y2%G?VUQuSo6SK zYzmZ{rBa!S!lRU=c+igfRN(V|k%^1kn^Up4SNS9TOd zso89xqqBn~25r_N{p8kdTO`Jd+g3F9{r%_X7FPeGoPYV-7re7*9&KY37YKKO6`;OY+Aw}rYpI?8LBS-$Nnx6afa>*rl_&6yOZGwyYj_KRP5(Wh^_ z@y7qsn9Dgt0k?#H=1cv7D1s0K%vQ&y!$|baxAb(C#z53ywpBCV@kb%}<;7fh-Is=bgTJ+vcG+PfpA=31+_U-XTpAa?U|iRAMBFqKFa4tXp?w zL&Me6-Tat)6_y^mxY+gR-d8;M(B3z0dSvLA_t;->@?RS}B*o%rMr#IrG2Gfxr3OoPOiZ>h#hxs~aBARF` z``*9(>^Wy$ymsf?|HrS^+W&R=)LRx2Wf^||^S_>4(gH^xuYGR&%D%qdFAWZKUf?}& z^PM|ha`UFOEIeuq*H_aJxnIWzjHdVt(u03txitlZRCqGm>q+|C9*XpNIrj29wNYUZ^Y0o+} zGmO_a^K3#?krg?V6o%**U#ewu%tVo>udiq6Ip;m=2SZ!)wV!(L8IM~(;4PmzpbL}# z=}mcgV|a9Q@}=YB)mv({prm@pEt$ne_Km4Qo0w~F`QcAZ^n#XwmcTius)86J*fOFj z!7vU?)n{v2@!#7!O@oM=WTKYD(d~ob;^Y z9=Z3PhyEwj1~vxF1XU&HoPq!!0<5(fVnnS`#VOBRwPy9|{_BQEr%OM4>G}n?oCO{i zpZSvL*MC-@oSLj(wRdFVR%gv2wPXH+tGmpz&wA#{*SzlKU*Gc3rnS}>upttOPzZb| z5PXDXM(_e_oz|O_&(yMyu2^2)ON@fa77Wucj&mxEUoumZE5E)47yaZv*Z6-dJShR- z(o27&yGNFzjYyJ$!@BjWzp#7v-fLrEiBZ)UqcH|zW@T&Oy+@R&r8GsgTE)6`%b&e+ z#gcFSh^veL>OF_1b8vyDHzAoE85r!kWc8|L8xO_ryY!UB^!_)UU{>_4?d|UE`uI&h z{OOrckgI?e^GDykC|L(ZT(H=1UZQdWv&a$jNW<9 zIfvpg{|}xtx1Jlmdq1waYBjPRh5<# z51_^vB17ow>pqRh_OENN{p7Cg`9cs_;3?vx6H4RZ-LXw}pxgMW$^Ei&# z`JWqnJ|3R*?erB_e_clB+PqN>C!f4xY-q>c_cxnGl}(hq$UtB%rDd|#Aq1}yBcQ4w zFDUrjEL*zh&CAxTe&73FzOwzve)a_x`1dTey|ixS()Q7!e7-+uv0hGsI0Mt}|?d+2+=k{TW;KN}hT=(Jop~iDBpO zzhMB4Y8$wepnsr!Xxk&hJNx>(E`!1;S^}chnU)XQ{Qq&zQIUI1QbT@^^1o&gg6}U3}U3e|q;FKl{VUv01B;TI$!L05RAw`54u(MN}bxP-{vt zHdX!blK#p~hBzm~HL%T?xZ$kJO$ELy*Z7LB{buUEkCmq+0DSeUTXFU8uLSpbm};3z z-DOld(%W`#-#f5$S?}plB3WaJ2;_Yr712_uOfd$85VTw>6S44$m4oM5W2uSCEpJ&g zu3z1{Altvd6VFF~_ZVAQw`S1`Uwr9@AGqu8-<#M!Z6Sb&5;GHsK*SVcRAwfPLP13v zdBn)R>K7OFRlaSEdS+9z#x@L5!;vWr8^2^4QS6Z3aDU@T`7Td+Ui~}&c!eniV$taC ze_%^@N2U9dtJn6ukO|C8BvI86Auo#gTU1t6g-aY%A_6$<+BJ6VfziniEgoo}eAi!Z zTIlIt;0fUqZ%e6>E$8-u{;qQ`ea_$C{-YnhvR=(eM4%!lr77|}z*qw!MvMWu&(KyX zqnV35x_kDE1A`r(NsN#oRN309HE6JMW-UC|5zgH{9M8M6`lKCepYoh~qpd8fPu&|} z%Kr2-kD0BM?CzDNQj9eEoQMb=9UbbNRgp-5Qt*Mi50n~X*Q_3V*ODbY*N*LP zmY?eHv%t~G|9ayhn)1im6Q6zVx^td;?!RpK*&SEbXLBe4#uy|?iV$K;UL4daaD&1n zPHRoltvhFa+}~aKa>9|oR3mnEX47Oc8LahbV#4v$Q?c3h#M_YnGEeyq;2_`q%u7ru zsL8ZQ@4si)@=AO9h2xJ~d=Oq12Clv5XSbeRt7l9wExEfW3S~0ZpeX!76>JCv z)U2X4eD?H{7)}2K?ffhZQhNb(q#Zw-tW9873+o1N8?*I-`SyPo6 zBvDgSoOZ^l;hxUQ3x-F=?@vJDJ^6vdXa@iQ|MsmHQgy12 zyTX*^&~*1da9~w?TlsTq*7ctOEn1mXA`KyuLY1gxp$q_`EprFsSep&qbpKsD-<8np zt%LoO^7cyivY`+HjIoF@ zwCv@Xz{I+HXYJ=5J#Bx;N$!YD-IC5RCrxL$VU%;nQk*zE9rrKl$JL*I@F^Lihs_QE z0ABQx?`mfySIw=EbK%ryF5gqHXRjFDH+=`OQG(Hy*^8=So}d1N5F(5*kQjkTD5d7a zXPte__ex!ht{fd+_qe><7I=Dc`DH}owMKg81!uo+Vtn7<-FN4`orz5~27riL9$cyv zLaRYXqJW6OOd6wN)7Hs{Z5#iovB8pXoroGB+h9hMiSs1!VM(nXFaQ2teX0QwA@1HL zKkyW#0sk|eebEKzDCKCESCW!NKlJa*@9E-TCeBIJYf)YvYrXT3O)89(f=fTO zZ_m)%wrqOD#2|orf&xTD)|ysJF9FO%Dhd@*A1y}q*KhCaPTx~0yBwrVHc~f+8>vYe zmbkF6p-XMN`tzHg@{HAC7Xbe4yZ7S7uRaB?@Gur6v4p;XwtWBSzMEr+Cznca?-7kLLVC^UO%ska!ae>2_b5H9i zuRY=T(=K?#Q8(-wsddeSZJs11bcZ~guw_a=H}vG*`2R;7R(AmZo;yGH3OiLVNVJhefvwNh zFf=^-`QuMoe1)~b5(vRZFf&9{TW5mSPirkg6ja(O@Lr^u7Z2Zi&qJ?ymY?2q<@LqF zoxlSB8-MWfRi?AzD(7AH+}9_F@85d=#-+1!RWjB>MadY8P=uD2ARG8lfQUd$iU_Lb zRz~+v-`Lif{AHRV1JER(X{~EG;<^Fy)Kxr}#>1OFvtQfm`C%~z54#<}FJ5O~;s5|1 z^GQTORCD#!OVwzu5JOPWBu#i`X7<*pskyXVZaaxt9RMX_0zk$XSZiti#emr$D{?S1 zlEf}rG}!mbedunkPi7vvYmZ+j8(aWyeeGhp_>8{fg0oIp@>}Pg`Tj6h|KNtZ?(fbE zPYQv70TYui0+@}ef?^a95sYCK6*LP8JNHapKhWR(QJ2I>pxh8OjIqtc*ajIcnA6Z3 z8Uef==l|@`3wu0P4(lBN036soNE^R*HU}w80X3mO3L@HY@8Vm z-UmvYg%1UsOOWRoO67_Y5#>bzX4WJr$Gt;Sw>|R6mRB!dGdT91j~`l*#RZNWKJbTq zB(vR>Gfq3@taa-a|E~>qZ#ZRa{|vD)Oavl@sw##;61+j3I;&Fje!}f$93E z2f8c&ni|_=*19rshN)X?n}#V*wdBi!_{=RMa{kW_ulkh3J^&o#hR?mo=v-k0&O*Jb z&ecjgHt&1>%2kU$*3;M7XDvu1Dj?L#3NVZ@t#(Xf;A2GM9Ab=`BxNmfd0^|-oqskw zy!X4G_+Gtus=wa?Pady-eK#+0on~qOV9$BaKI^ShV^i;W=)Q+Kq8Ef1$T_PDA^;jf zAOgT_5Tinc;1WUvWOBBc-nDo7FIO+?yDdS8Y$&tDb!BdnG0nsvHxa&r`a*kd<*F~< zbXZM(;4nV|{4!tp*KPWi-(RLQr3l7qViQ`lbn&Ab?%94fz~{AfCS7a{Lq*w`*4qPM ztUai?ju@i`A4mjRO5NfWYZko>gjJ`nO>ezzWA%`WLoRT5a>Y68(nVeE$6o&8OMmq9 zTkn4H@Q!^Yi3(z-QYnS^1rd>k5Xd=)`B(rVqfA81th@I$hU&Tg!P36+7R#KIp@v~< zvf;WlE=$GGe=~>de z^7>te<;z;&vGd{A3{a8uyJg2L?tjKfC%<)WX7Y_Ywm!0WX0nM=njnM-0!UO~tpyQ5 zMBsgZ66Q536EqqKBO`P7a6%vJ?Kb-rNu+SvHvk7eEZ1qQ1AeSzq;)!?zIa zhzbA)`POyMXR5J<0Y@JaAef<%@$$@c^@D4VS^CD#wz6qu23pR5)*6aY6aa~+G6>9u zK&;9DAZTkZ%h1r|_b0|@-kCRN_g2bDc<;3ff#7K1zrFPtcCfd-v}Wz9Q&%io`qvxp zzW0pD$!TZ=5n8Ea5FvOEV~i3JHJh1QYhazF%x3^wook5h-aY+=RZF@*X`l%hO)|(0 zQA4e1vQnO;N#SA=P~PX)@0`>Zf2Vm^kD((j09Hv**ACt5z@h#K1sXk4QueLMni@mH_BM?{{B#SnHISNeL9`kfDqj8CjE&uy0RY z>}+Jwr<>(1pE~@<%@G#>ewiLP9a^#l1IOX6rKD_(1!NLA(77unkt6Z_x zXF|r*?;S@nyz~saPR2b#7Ofdvi1wsg|d_F0N%>1zt zWUNuqf^tt``?lGkq?EjCaIiF^s)3m67L>u5j7W3Glqs3u7$Njb%kN)Tlm5x+BVxQ9 z(E$Jee*C?QsMusoHHt~fY(pUy64U)-lj;6_)oV^W{g~Ggyd`2Pr6~&U!Q6WBK4c)oO9{}ke16$AbsHOpKthJQOj;QwwBc#-L7bComB zJoS=io__M5Jb3S2C+*)m#?b?YO{+^^S_Qq7s z!NxSKwHbl3#FA&?aLoQjsI~9XtG*PDxG`~51ONcI}EZMO%tPO5S@^%55;#YK(zOr4sTiM~o3crPbGsB38auegz zZDV8O7cW`d_nyAq&f|=86hcA98udO0^r2XPc&cCpCaNz2pJwq4o-nz9s zJvOD4QacG0g)gXFslW%1R=1wQ8iybPQ2`M^>OnBt$b(K)F*H3n``KkndTt>KqJ*5u zHVkuSjLDd($r|(2+K{M*j$%Tt{@myhIq?s2)C7QoeEQRGrvCn26owtK6h<`~0$cHt zO7!W--qH5CS^3j7YnEN!-eKB6N)n|dHVUOuTGB?d2|!yGWdPV1Z8REWt%WrP!51)A zH7%uqIo)~ReOo?KujOCsFITeVvpe*a-(I*QIMlr3O(#=(#W1EP-SHk3HEeJ%!Jbx~nSA7vt%nJ{xYOBPU4SZ3+ zS*x5tjY&fkx1%WhcOQD_!Ee`_a{sf^rP*t~yzz)1AWtRle&t!zv=5`=dbz@-)Rpb( z7r*4UUjvFS7}>n#xRHH()47=p&ZdwU*%;HB{H;{48f&S@^OiI>(AwtD7l;|-&}c@T zp3OEiYQ;Yd4wUY;Y>Ge-D0wDo8b$`@rXwzlk~c81KbEAeQI(f}{m7sEz)>6k{^1|q zNTpJazUmmwh%z^fg(!zuIB+x~A)TIXmPUtW-?C~||5cscZjrSH5(C&+7-LB!Ktz;U z%*#GSRaH_Ei0ZroOaxmduxkInVB9mb@AgfbcKp#`@8E-5AKhMj?#F)Nc<>wWM{nw& zrVem>-P+#em9BHoKl@Z;lUIstFPuiE*mljSNk!VyACgx@gf$ zd;8PUTr~q=P_8(t)$1sgO07w+EgiyxDMVuo#Tb;B34ju-Hk%nb+B*PfOw-E4bF=X$ zLnFJtF*ZE$FfVS;v#BV5`^_iL?D0tFEx)tG^mf>?OH9Xw&w0-4maks^j?E8m7})v9 z_N0h}#5!UI%{O`|gAfYeI;s&Vm?0{Z=eas(Nfj-9c@?NSoviz~cWm}Yj_FHF2GZRG zBBCT`aK=m-6EdD|053 zVAYEgcn7G9O0wypofr1>_q=nkzvJ}wa#~grL}K*ZWoC59SiDtrMVQtu;K zXB46k0n#*u_W>@k+S}KI@yW@1C&y+#o#pYCYIS3-W=#pFHXY)vv>=uUJMa zmkDIXuq#!p4-LEi`1NZ~KJB=(Lx>m6PRw02H#^fex_dVa7)4Yh#v!VwsL&)yNtF=8 zybvc^X}v7ZpsGlc1WW{91O*$^n<1Z=YHpsGsef+Gs@{7^gSA9CF&9KOgGIxr&B;*V zM02DrI%ndNF(;RO{}Jt-o;fPt)6*sZ9OUa?dl_-9NpZGrohGJezy=gfS*%7elhd_y za$@f6wu=4ZV~<&WQVcm8HlnKRLjapr?RboWQkrU(WiZylFvEvHXnC8?D-{BT_W(pI zm6953g^io+=xE3f*qA&8uOWBbOziGvp*rv?U4QIJ9rMWEc;g(WtfKhGN|prI%r zssti!HSiIdo^eIy@(Q;_wsNQl&mMjoH6S4M`%pTBZh|LYbH zww<21#6(pJ!Gq1bA%qBsNmW7KdpKt`&kIr|q)7tj9I`A!Q4}bZ%YZ6;@G#D3rBXq6 zcTa3Kv(eev#y`Q}d)3+6$mVTZC(4!fW+OIr_hcR4`F?)H28F9%1?mfHO~nyMLnO8- z^?E*d$>q;~?%H+hE@;fmoIE-_vbIsL^-oPrQ=>jdq>Ly6!$hfb2vGnKL3iOQ|Wya+83nZbOjWwII5o%2cMhG?{T2)E% zrkF>!3}4dQSN_17wM&+ZD62#@))Fw^G7=)#Fi8|O){rlvwrrsVZEY3gd5#bxoV5rc zXpF7<1ZD#=2BosqA{KsdpnI%TN=K$Aij9wM8@{PlpSY{qoEcB!lA?(1;xeb(+aAXC z*B^eDP_I324GpYTl+{v=Gt+LJU9xzft*5VV*}(F_B_#g1l1(nEbaz}dGdW$_v2hdC zY7N-5jF=ZxF1Krth!{MKVfZX>)nbT{QcHvr5M>Zbb7qr##Bt}#vli4lZl(wn1YEja;BhYa+6c&bd{L3PsqFeb{lNe!|w0< zMDer@0Kd$2*S(QlI6$Rl)0jG&!gxy>Y*2CpN@55+F)`hBU~KZj!9|N-R8GtVUEOKL zScV1x8zLgn5L#Vi&L%1%WQ4q6nR7|;+4?&$20 z{=sf|A7W8pv-kckU&sT&V@r@Q8l#_jWb5{3buP>MJG(=)iTa5MDS7?tf7$zs!TW*t z5q;>RkAE;<^L9|RaU43)L~Sa8LxitngxpeFVz}ni`YgB3hMv<-KXr9yZ_nAsu3dYU zP29dV1URtbRK!^Ur&_N(YEUm^hM3Am%0;%7~G(wK;@C>QLCs z#nHDvkN59%B(e|y=K0A_E}~sq*HEY5ZKOer5N)8y3~@okiWf%^tD^D2%?H-E zRp^hGujoC$QtC*Z6@UVmO{cRG7K*7w^+Tt2O8OE}DA4s7ZLnM(1 zCI(xEv35SMO>i#Ja>X^1)HHg#d#BhY6LYnEbar-nNTO`rvun@xJ$v?#7C}ZU9qr9B z_lPEia%8fk6l0E@Isv1GC}Sdd!xvzj!N5->P&T2YTZD!URzso+~3Ue{$?{XQ!!9oD|cl_1I-a$*! zN6Cn?QKi_7HU@74;3%k*C`Li1;d3`JR$a%yvz@iC>L2J{&50*#E!0O4h*}aPK!{PD zb@Qnxowt@~S)4H&HO5e$=K!FIb0n&&BJ)1;^D{tObqHCrp&)@o57$=Gwn~Ld) zS<`YQ6N$AD{EQDW6GFaARc4AjpYz^N7T(YH^z_t-OdxOuP!>XnAw*lR7d=_wD`ZgV z>F#Rl>}c;C80_ixQCEqEHOm(->dckf#>d9m=4Pj9|Nc>$o|vYRw#!_##%Y>HP!y^v)atkl#lDv^Khv|H4uY{A`@jqlrx!}3<@TAHSlG)oO6z4G-6+4Twn3kr)LJ{ zmstn^zk)A+>NVWGY#PP3go|R9a}`4bqaj#TIEm3|L?Vcs*BM*44gYrElFr{-xuknl z;kO*rn4lZHFu=*G%NfS+y6cU44HdGWIObR9-NK}Dh{u$Ic3(E$omdIED zKop@QaoTLwDaL>-%OIiE7^T8sw)35Iky>I3s-V`yWj3t~7BGRJDvF{gs8T5*N<{P? zhK)v5Qi8@1$ruNy!We^A_a1}Ly7~tQK?2A?>h%z7b2>CWId_k7{Iw-Z+C~iE0QTS* zNlk9qW?=O&rZB_>k$PeqEwS`Bclss!+O*uO^k4A(IxGZ$UxROb_;RY3$+SmL zwPwQrY@@)c4-QZxDv7G{bhTNT9G_cVE~OWiE9QkA9c{*AK+Ya z@Lm+8tTKQ9VGL_tG^t#!K%<~&NpAt%THy^@^4=qgpp>SFsv1KeW36W1V`i!;`zB^L zw6#?}U8$I@r8E(vP-4w3Od+5^MhhlWFjGc~0AszgF+?DyX%Ty-Q@r7`4?nH9`~MLO z0pQo<&;R^gG|*P3<-CXInqs_yeIb_A+u&i9qKTpwqArS1vk`df*4<~iq~n$Ak6nCf zn$jYokfhE)L;z(t>(I=au-47bU!Y|%jbBXe5EafjjS}IUr6SK^jcu)z1P~17t*NP1 zeB=QT@;n0*qf{=TC_IP=zK99}mCNPU=cu;)?U*4F5G1zj)wuOE#2*11!4>!CJ^y_ps*T3pg5ntBVs5-jbXCZfI!Hy9Ap^8gb)fPWsn*W0AbQv z!=qO7O_gF}wGr=%A>KPM&^eS?Er=-+I1ms4$qm~=37#0fmCv`HC`3asb~mk@ylGs1 zbm=~P@P96>`2P_L0pK^}mam`7qf=cZ!BecM5s3yqXH_yGh+)7+sL@D{A*eU%$@oOQ z*DJ5}KEJfDyYt0M7IkzbiK8sb`Cx;QwN?Q_QRL*Dn{PZa2m-_y)wfn`@;+B4rh`2Q zDlM7ngWCxeg|wuQ>EHw>X0Wvgg@=eLxTSk@@Z}THe5tb_DWzzcs1TSLMd8)3g%1JF zTGG}MPc3__R+}v`A+{Wv=XVXQx_lA*VrRlkMD+hFF$ow%0+^_IQ(-8D_gWvF$R?Y4 z_TBaheW#LCs|zds z|AmDB@EEx9#^=-IWFI=lCb=-4sy?y_Fe-s1^9Ip!RB;F(MNFaw0#l+QG*?sJzGLY5 zJ-waJ8R+XgmdPz|ub6gXI6zdR5D}?pB<}-UTGHS>Ds63O)N52qQ-y+PzS=E{l0;Er zq8J4#qG_5U&vPV6LOui-XW@MSKnf6L&8DUsUTnIk`x(b>LtCUA!FaM7z{XpMfRbP%$4+mBkxAcV z126gZwuKe{*I*$4JPz)><80dU$njLRHRKaB49Yk(jiE*`064N5jnS%#g@{o^t4ahg ztCAfZpR3H(n(Z2Ny@-8Idl#QSIM}hGlqAF~NSs9so&iPh0%x6yf`a#ONdf@#TmIIh zq$ifB}6-3gF^C}2Q{^PP;u1j7cZ+7ic{zcc_5(xfyW005car4&Umed=r!lP-zw=G`Uu~i6;sjvV7 z5d~F5WiE&~7}EKlCI^{{6Dj3|YBnr<9vhc;WXJw)(#b3jyE|@q@2k zO5=0N+ANc4G$>RHjw&o1n8X^PXccNC2&syNG7EBtC=}Tk62aJPUfw@Cw}K5nGfD8w zt`4)Tqpdt>DD5{k=>UPtiBX_{YM>aS#;BB}sWuu-DwRrLZZ*ZIlGbW-sI<3{4*@ZV zTEkRiInuO*BDS1vvu1`$xs0eS!%OcASZkmHwZ>8i5g>-Dz$F&UgnDfb#vIH9cz`VO zTr^2b1ZDLxAj|5QoSf4v=aFVG50z8?X(h2+ZGvXvC{Ggg45I`aqY9WLf=I}4B%uOC zfeZyA_C)Y(*t4Nv|G)OmUq`DdisEbSeeS*Ad;>WAOGpr-7IxZLz#I4kv>FR*o@IIq zjhz%$K7kD(F>0ZSg%KhWU;+rt%y;iSXYXZk(FZV$Cg%IKr#|cKeb!#ttqT;WpXMxf zkkiVs_w-O7fA;?j>zp)O0eD4d>B6lSfC-arSw&T{WL&CefOuOS4sZ zVYZTxE9p!XN*)SN(WanBYu!9eeN5ILj_v$r9Iw{7zPop3{eCIKg;S?`o;kC^(09x9 zTqhgHqvd0c24e?7U@@pBhG9@dutt4pvjLJQNaoIn5FivQXstmYA;L@1GQ*JaQUsAx z6%Jn()FbiV|lOl;QpwSSt zQYi(&ka>e;gG%&dU{&MdlU-bVACRuie_d`u~)z0GuHE`#1RZ&M!Rv zc1Bx|v=!|r!&GFla8-90EHca!B{D3tbtzDUXQl&b43%7xa3=aJc+O*4|90>GTgOL- zZ@8Dsg1^3d`qb&tb9ZOh*(>hrq3;GWtsxn@ zCDI`9TEj(}l9+3Bndl;DG%pDnjXg4HPAl%*%yWUjXf=y_LeZ#bW|}G1 ze$|hw)iAncB`7k@mgp^D3@Ig1q$LdvM3_tjGmQZ#Ocq8ol1ZthmvE&-YssSQTXg6& zL>EPmb?)gd!XM^4KVQbx+qbuu{sh=kb0LN=!_jp_0pCo?*#Z^{m)ky|r00000NkvXXu0mjf5pBGU literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/logo/32.png b/Huntarr.io-6.3.6/frontend/static/logo/32.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f4e1b9e7ff395d64c7a09f173db5135ec91dd2 GIT binary patch literal 3807 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 Nu*BJzmKb}U{$Fj~X7K<3 literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/logo/40.png b/Huntarr.io-6.3.6/frontend/static/logo/40.png new file mode 100644 index 0000000000000000000000000000000000000000..30c260c8803d1b22cde340d52e3fdb0b5d368e40 GIT binary patch literal 5874 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

*|i|wtmb@`&; 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

RbSSQE-Q2 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ʤ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⊚^#yUm;YhTmnuTFAa~I$p4sHL@+P| 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 + + + + + + + + + diff --git a/Huntarr.io-6.3.6/frontend/static/logo/apps/cleanuperr.png b/Huntarr.io-6.3.6/frontend/static/logo/apps/cleanuperr.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf2f328fdf064fbc125979d83877f306a7a88a7 GIT binary patch literal 2971 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 RUgiJ*002ovPDHLkV1iqkTG#*p literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/logo/huntarr.ico b/Huntarr.io-6.3.6/frontend/static/logo/huntarr.ico new file mode 100644 index 0000000000000000000000000000000000000000..45c70ed9da48d19c6bc94f5492529639ecf8e756 GIT binary patch literal 32038 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⋙to_^iv3OV8boUwdKSdEP?5==NT77JhVeLs-g`AG3dlDO7N`)3h zg01&M7=zc`_A!Rj`R0mwok)D_RxvNZ_6ggfVrR-}9zJvKeOiWe@zKeYD^JO8Z6hrb z0l9OYGqz2`vi?K2-}nvR#=zGx=F)RHUpAp~L3`#?*k60st?E-z$m)0o^Z!&Tv@m*C zY~`J8{<)Xg%tF`CRd$1%1p#bIGT1DmF!-OKQCRz5q;Zqa-`C5y`jiYdEN`_k>a4_r z^FG=qI2^UihLr(>w{C=-zE2Jsxl8sNx;I4N&OYpyb<;6|Y29%?rJRn(dlMU9 z?v5x)-5y!-7S4h^e)WV|$DZ3JS_<&}cY3orUbeJ`NwemghGUdlzc~H!#8Af7XIRYX zn>S>`a+#)o!(+XIR)W{D@qn;14**|!NDdmlebx8m)%ach89xkf{1D!3-wmsd?Subc zxFbtyda*O6@;3Nxd<*`;L_W<6GSZb`zdnNFd*IXHH0=9-KFu@Rd;I7v`s{1Z?xbIN zMs}#}YZUc+&llMpn)55z?%n{~pgVqjmks@nUR-Na)$`dJnXTR*nPyzpy40|u*Gn<0 z^_Emr#jC9zsfBc!?lbLRG7k8O!!9~vN{8MgH<18^bxWyJ@Cl6{+yh7 z^*PzBxFc*wQ1;YW;NEmnC+75ZGlj&$Z^99NKj zTIM_xr_25?v zLCS^uZ>-9@eI&vPKGUK3-adS5`SnVc1Qzp9HIQpO!|{9YL-Go2>bHGseY2H|JaL%@ z?4>Uh+CM4+G7G-DQ z9|>c+uGFzRv^iIv94&x#kaPVRIr#X+GrN3}6t@yn{wMoklbS0loO9#2O%UvNGVpY7 zZB%yLJl)>^L~K!Vgfjce|5KmQqGJ( ztKrTHb}uP#w@rXQ01N_|(J&wlY|`h2-+U|V>2guSR~D1b+!o8a`t(}XwP)ni%TEAT zyz@jqr?~|D%Q6aDrq19Y(`CLlUN3L^6X^JE0N;%8A9>*~V4ssgjt6*c=nYy;PgMb> zlK=WX3^{&&P4<nv|7%z-1br5ye3x3nNzOW zZ9qe>=V!`h8CDB6k@rA$hv9TA*!53>-IEW4HgUt>(q{klzJEBM+8On~C7-_+2Xxab z()eR?(xnM<{DntY(5ahm^zz$|i~6NGiut56?};k?XM14YQZB2|UuaYue*R0wkcxV{ zF4bCDvtK|K|2w-y@IOGyZ35pMyx_0i26WBaz|Zw7_zz1A_@5ZJUF=&nYtVN#4M|_G zX!{@6H~z4XU;D0}(m;qfadA`J*j)qg8C4s9;ou?OT}pbx!)KDO^1`g`j_?d&{|T;DDgQQ9FMl-~>g3wBD_FZ&|+e|-S|9q~p0Y-Yj60E7Q2!Qg+0 z-ok$Z^|2cJYcLx4tXr>O^ZyzL!^g_uaR17HfvaW#gE!lJ`fpr>|C7CEf8^pzoA&c$ zGAa9D;pGU&RqESJ&x z;b+R%=JZGWE*hLgVOe|fFT1ueTFcf^Zt#P#1Lj`mV0NqPep0=+OmwA}WKg~X_>a{9 zTZ(P)--Gm^^S7GABKY@ZdyM|$^9)`Fa0deLjN=X(;2}b{@fcAOktjGLK%#HJvj8?p ziDB)K5&SG*;CTRR$A6o0-hk)DaQ_6jCkG6E!hgj57C>gvH+bD-E1Jobo{(RFdXfX; z$+grIR-#bPda8*@8pyVoYJ3thwo_AHAukri+G!{|FaX{z>eYeQ+3wlVg##pF9X{AN z`%@~cBLHhB5UH{80QggycABY}YFrc>r^3M90@O%_k@0u}Y7LkpCPI_(-{*>_%0V{* z#vvbGAJh+SD5he7J4ppYfyb0EEaTurf&iW)AihFLCSV;MSO@Ol0^$ICSbVO$ftnzm zzz1Yplxo5W?>7zpFFi0G>tS3(VSIk0o?M2(^D_;e9l-v394Ds76`V%k>G09+2{8;d qGzyyZt|xeJrsjzT(vT+^!Eg9{LPwzhxFyHqHwe+-@szU&?Ee6~j|CzC literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/templates/base.html b/Huntarr.io-6.3.6/frontend/templates/base.html new file mode 100644 index 0000000..c971f1a --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/base.html @@ -0,0 +1,27 @@ + + + + + + My App + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/templates/components/apps_section.html b/Huntarr.io-6.3.6/frontend/templates/components/apps_section.html new file mode 100644 index 0000000..3794a1b --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/apps_section.html @@ -0,0 +1,233 @@ +

+
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/cleanuperr_section.html b/Huntarr.io-6.3.6/frontend/templates/components/cleanuperr_section.html new file mode 100644 index 0000000..d2e7643 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/cleanuperr_section.html @@ -0,0 +1,426 @@ +
+
+
+ +
+

Cleanuperr

+
+ +
+
+ + +
+ + View on GitHub + +
+ + Loading... +
+
+ +
+

Cleanuperr is a tool for automating the cleanup of unwanted or blocked files in Sonarr, Radarr, and supported download clients like qBittorrent. It removes incomplete or blocked downloads, updates queues, and enforces blacklists or whitelists to manage file selection. After removing blocked content, Cleanuperr can also trigger a search to replace the deleted shows/movies.

+ +

Key Features:

+
    +
  • Strike system to mark stalled or downloads stuck in metadata downloading
  • +
  • Remove and block downloads that reached a maximum number of strikes
  • +
  • Remove and block downloads that have a low download speed or high estimated completion time
  • +
  • Remove downloads blocked by qBittorrent or by Cleanuperr's content blocker
  • +
  • Trigger a search for downloads removed from the *arrs
  • +
  • Clean up downloads that have been seeding for a certain amount of time
  • +
  • Notify on strike or download removal
  • +
  • Ignore certain torrent hashes, categories, tags or trackers from being processed
  • +
+ +
+

Cleanuperr was created primarily to address malicious files, such as *.lnk or *.zipx, that were getting stuck in Sonarr/Radarr and required manual intervention. It supports both qBittorrent's built-in exclusion features and its own blocklist-based system.

+
+ +
+
+ Flaminel +
+

About the Author

+

Cleanuperr is developed by Flaminel, a passionate developer focused on creating tools that enhance the media server experience.

+
+
+
+ +
+

Huntarr is proud to feature Cleanuperr as part of our commitment to helping other projects grow. We believe in collaboration across the media server community to create better tools for everyone.

+
+ + +
+
+
+
+ + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/footer.html b/Huntarr.io-6.3.6/frontend/templates/components/footer.html new file mode 100644 index 0000000..f32c515 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/footer.html @@ -0,0 +1,68 @@ + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/head.html b/Huntarr.io-6.3.6/frontend/templates/components/head.html new file mode 100644 index 0000000..9caa105 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/head.html @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/history_section.html b/Huntarr.io-6.3.6/frontend/templates/components/history_section.html new file mode 100644 index 0000000..f963ab0 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/history_section.html @@ -0,0 +1,703 @@ +
+
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + +
Date and TimeProcessed InformationOperationID NumberName of InstanceHow Long Ago
+
+ + +
+ +

No history found. Items will appear here when media is processed.

+
+ + +
+ +

Loading history...

+
+
+ + +
+ + Page 1 of 1 + +
+
+ + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/home_section.html b/Huntarr.io-6.3.6/frontend/templates/components/home_section.html new file mode 100644 index 0000000..ade5801 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/home_section.html @@ -0,0 +1,959 @@ +
+
+ + + + + + + +
+
+

Live Hunts Executed

+ +
+
+
+ +
+
+ Loading... + +
+
+
+ +
+

Sonarr

+
+
+
+
0
+
Searches Triggered
+
+
+
0
+
Upgrades Triggered
+
+
+
+ + +
+
+ Loading... + +
+
+
+ +
+

Radarr

+
+
+
+ 0 + Searches Triggered +
+
+ 0 + Upgrades Triggered +
+
+
+ + +
+
+ Loading... + +
+
+
+ +
+

Lidarr

+
+
+
+ 0 + Searches Triggered +
+
+ 0 + Upgrades Triggered +
+
+
+ + +
+
+ Loading... + +
+
+
+ +
+

Readarr

+
+
+
+ 0 + Searches Triggered +
+
+ 0 + Upgrades Triggered +
+
+
+ + +
+
+ Loading... + +
+
+
+ +
+

Whisparr V2

+
+
+
+ 0 + Searches Triggered +
+
+ 0 + Upgrades Triggered +
+
+
+ + +
+
+ Loading... + +
+
+
+ +
+

Whisparr V3

+
+
+
+ 0 + Searches Triggered +
+
+ 0 + Upgrades Triggered +
+
+
+
+
+
+ +
+
+ + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/logs_section.html b/Huntarr.io-6.3.6/frontend/templates/components/logs_section.html new file mode 100644 index 0000000..4602768 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/logs_section.html @@ -0,0 +1,426 @@ +
+
+ +
+ +
+
+
+ Status: Disconnected +
+
+ + +
+
+
+ +
+
+ + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/scripts.html b/Huntarr.io-6.3.6/frontend/templates/components/scripts.html new file mode 100644 index 0000000..447707d --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/scripts.html @@ -0,0 +1,3 @@ + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/settings_section.html b/Huntarr.io-6.3.6/frontend/templates/components/settings_section.html new file mode 100644 index 0000000..f86f96e --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/settings_section.html @@ -0,0 +1,69 @@ +
+
+

General Settings

+ +
+ +
+
+ +
+
+
+
+ + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/sidebar.html b/Huntarr.io-6.3.6/frontend/templates/components/sidebar.html new file mode 100644 index 0000000..8ad1e29 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/sidebar.html @@ -0,0 +1,245 @@ + + + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/topbar.html b/Huntarr.io-6.3.6/frontend/templates/components/topbar.html new file mode 100644 index 0000000..169fef2 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/topbar.html @@ -0,0 +1,267 @@ +
+
+
+
+
+
+
+ + Version 6.2.1 +
+
+
+ + Latest: 6.2.1 +
+
+
+ + Beta: Info +
+
+
+ + 764 +
+
+
+ Thanks 4 Using Huntarr - Admin9705 +
+
+
+
+ +
+
+ + + + diff --git a/Huntarr.io-6.3.6/frontend/templates/components/user_profile.html b/Huntarr.io-6.3.6/frontend/templates/components/user_profile.html new file mode 100644 index 0000000..78110a8 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/components/user_profile.html @@ -0,0 +1,137 @@ +
+
+

Change Username

+
+ +
Loading...
+
+
+ + +
+
+ +
+ +
+ +
+

Change Password

+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ +
+ +
+

Two-Factor Authentication

+
+ +
Loading...
+
+ + + + + + +
+
+ + diff --git a/Huntarr.io-6.3.6/frontend/templates/index.html b/Huntarr.io-6.3.6/frontend/templates/index.html new file mode 100644 index 0000000..685f277 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/index.html @@ -0,0 +1,50 @@ + + + + {% include 'components/head.html' %} + Huntarr - Home + + +
+ {% include 'components/sidebar.html' %} + +
+ {% include 'components/topbar.html' %} + + + {% include 'components/home_section.html' %} + + + {% include 'components/logs_section.html' %} + + + {% include 'components/history_section.html' %} + + + {% include 'components/apps_section.html' %} + + + {% include 'components/cleanuperr_section.html' %} + + + {% include 'components/settings_section.html' %} + +
+
+ + {% include 'components/footer.html' %} + + {% include 'components/scripts.html' %} + + + + + + + + + + + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/templates/login.html b/Huntarr.io-6.3.6/frontend/templates/login.html new file mode 100644 index 0000000..576b965 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/login.html @@ -0,0 +1,400 @@ + + + + + + Huntarr Login + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/templates/setup.html b/Huntarr.io-6.3.6/frontend/templates/setup.html new file mode 100644 index 0000000..7c765ca --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/setup.html @@ -0,0 +1,768 @@ + + + + + + Setup - Huntarr + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/frontend/templates/user.html b/Huntarr.io-6.3.6/frontend/templates/user.html new file mode 100644 index 0000000..34e0736 --- /dev/null +++ b/Huntarr.io-6.3.6/frontend/templates/user.html @@ -0,0 +1,439 @@ + + + + User Settings - Huntarr + {% include 'components/head.html' %} + + + +
+ {% include 'components/sidebar.html' %} + +
+ {% include 'components/topbar.html' %} + +
+
+

Change Username

+
+ + Loading... +
+
+ + +
+
+ + +
+
+ +
+ +
+ +
+

Change Password

+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+ +
+

Two-Factor Authentication

+
+ + +
+ + + + + + +
+
+
+
+ + {% include 'components/scripts.html' %} + + + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/main.py b/Huntarr.io-6.3.6/main.py new file mode 100644 index 0000000..654484a --- /dev/null +++ b/Huntarr.io-6.3.6/main.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 +""" +Main entry point for Huntarr +Starts both the web server and the background processing tasks. +""" + +import os +import threading +import sys +import signal +import logging # Use standard logging for initial setup + +# Ensure the 'src' directory is in the Python path +# This allows importing modules from 'src.primary' etc. +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))) + +# --- Early Logging Setup (Before importing app components) --- +# Basic logging to capture early errors during import or setup +log_level = logging.DEBUG if os.environ.get('DEBUG', 'false').lower() == 'true' else logging.INFO +logging.basicConfig(level=log_level, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S') +root_logger = logging.getLogger("HuntarrRoot") # Specific logger for this entry point +root_logger.info("--- Huntarr Main Process Starting ---") +root_logger.info(f"Python sys.path: {sys.path}") + +# Check for Windows service commands +if sys.platform == 'win32' and len(sys.argv) > 1: + if sys.argv[1] == '--install-service': + try: + from src.primary.windows_service import install_service + success = install_service() + sys.exit(0 if success else 1) + except ImportError: + root_logger.error("Failed to import Windows service module. Make sure pywin32 is installed.") + sys.exit(1) + except Exception as e: + root_logger.exception(f"Error installing Windows service: {e}") + sys.exit(1) + elif sys.argv[1] == '--remove-service': + try: + from src.primary.windows_service import remove_service + success = remove_service() + sys.exit(0 if success else 1) + except ImportError: + root_logger.error("Failed to import Windows service module. Make sure pywin32 is installed.") + sys.exit(1) + except Exception as e: + root_logger.exception(f"Error removing Windows service: {e}") + sys.exit(1) + elif sys.argv[1] in ['--start', '--stop', '--restart', '--debug', '--update']: + try: + import win32serviceutil + service_name = "Huntarr" + if sys.argv[1] == '--start': + win32serviceutil.StartService(service_name) + print(f"Started {service_name} service") + elif sys.argv[1] == '--stop': + win32serviceutil.StopService(service_name) + print(f"Stopped {service_name} service") + elif sys.argv[1] == '--restart': + win32serviceutil.RestartService(service_name) + print(f"Restarted {service_name} service") + elif sys.argv[1] == '--debug': + # Run the service in debug mode directly + from src.primary.windows_service import HuntarrService + win32serviceutil.HandleCommandLine(HuntarrService) + elif sys.argv[1] == '--update': + # Update the service + win32serviceutil.StopService(service_name) + from src.primary.windows_service import install_service + install_service() + win32serviceutil.StartService(service_name) + print(f"Updated {service_name} service") + sys.exit(0) + except ImportError: + root_logger.error("Failed to import Windows service module. Make sure pywin32 is installed.") + sys.exit(1) + except Exception as e: + root_logger.exception(f"Error managing Windows service: {e}") + sys.exit(1) + +try: + # Import the Flask app instance + from primary.web_server import app + # Import the background task starter function and shutdown helpers from the renamed file + from primary.background import start_huntarr, stop_event, shutdown_threads + # Configure logging first + import logging + sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src")) + from primary.utils.logger import setup_main_logger, get_logger + + # Initialize main logger + huntarr_logger = setup_main_logger() + huntarr_logger.info("Successfully imported application components.") +except ImportError as e: + root_logger.critical(f"Fatal Error: Failed to import application components: {e}", exc_info=True) + root_logger.critical("Please ensure the application structure is correct, dependencies are installed (`pip install -r requirements.txt`), and the script is run from the project root.") + sys.exit(1) +except Exception as e: + root_logger.critical(f"Fatal Error: An unexpected error occurred during initial imports: {e}", exc_info=True) + sys.exit(1) + + +def run_background_tasks(): + """Runs the Huntarr background processing.""" + bg_logger = get_logger("HuntarrBackground") # Use app's logger + try: + bg_logger.info("Starting Huntarr background tasks...") + start_huntarr() # This function contains the main loop and shutdown logic + except Exception as e: + bg_logger.exception(f"Critical error in Huntarr background tasks: {e}") + finally: + bg_logger.info("Huntarr background tasks stopped.") + +def run_web_server(): + """Runs the Flask web server using Waitress in production.""" + web_logger = get_logger("WebServer") # Use app's logger + debug_mode = os.environ.get('DEBUG', 'false').lower() == 'true' + host = os.environ.get('FLASK_HOST', '0.0.0.0') + port = int(os.environ.get('PORT', 9705)) # Use PORT for consistency + + web_logger.info(f"Starting web server on {host}:{port} (Debug: {debug_mode})...") + + if debug_mode: + # Use Flask's development server for debugging (less efficient, auto-reloads) + # Note: use_reloader=True can cause issues with threads starting twice. + web_logger.warning("Running in DEBUG mode with Flask development server.") + try: + app.run(host=host, port=port, debug=True, use_reloader=False) + except Exception as e: + web_logger.exception(f"Flask development server failed: {e}") + # Signal background thread to stop if server fails critically + if not stop_event.is_set(): + stop_event.set() + else: + # Use Waitress for production + try: + from waitress import serve + web_logger.info("Running with Waitress production server.") + # Adjust threads as needed, default is 4 + serve(app, host=host, port=port, threads=8) + except ImportError: + web_logger.error("Waitress not found. Falling back to Flask development server (NOT recommended for production).") + web_logger.error("Install waitress ('pip install waitress') for production use.") + try: + app.run(host=host, port=port, debug=False, use_reloader=False) + except Exception as e: + web_logger.exception(f"Flask development server (fallback) failed: {e}") + # Signal background thread to stop if server fails critically + if not stop_event.is_set(): + stop_event.set() + except Exception as e: + web_logger.exception(f"Waitress server failed: {e}") + # Signal background thread to stop if server fails critically + if not stop_event.is_set(): + stop_event.set() + +def main_shutdown_handler(signum, frame): + """Gracefully shut down the application.""" + huntarr_logger.warning(f"Received signal {signal.Signals(signum).name}. Initiating shutdown...") + if not stop_event.is_set(): + stop_event.set() + # The rest of the cleanup happens after run_web_server() returns or in the finally block. + +if __name__ == '__main__': + # Register signal handlers for graceful shutdown in the main process + signal.signal(signal.SIGINT, main_shutdown_handler) + signal.signal(signal.SIGTERM, main_shutdown_handler) + + background_thread = None + try: + # Start background tasks in a daemon thread + # Daemon threads exit automatically if the main thread exits unexpectedly, + # but we'll try to join() them for a graceful shutdown. + background_thread = threading.Thread(target=run_background_tasks, name="HuntarrBackground", daemon=True) + background_thread.start() + + # Start the web server in the main thread (blocking) + # This will run until the server is stopped (e.g., by Ctrl+C) + run_web_server() + + except KeyboardInterrupt: + huntarr_logger.info("KeyboardInterrupt received in main thread. Shutting down...") + if not stop_event.is_set(): + stop_event.set() + except Exception as e: + huntarr_logger.exception(f"An unexpected error occurred in the main execution block: {e}") + if not stop_event.is_set(): + stop_event.set() # Ensure shutdown is triggered on unexpected errors + finally: + # --- Cleanup --- + huntarr_logger.info("Web server has stopped. Initiating final shutdown sequence...") + + # Ensure the stop event is set (might already be set by signal handler or error) + if not stop_event.is_set(): + huntarr_logger.warning("Stop event was not set before final cleanup. Setting now.") + stop_event.set() + + # Wait for the background thread to finish cleanly + if background_thread and background_thread.is_alive(): + huntarr_logger.info("Waiting for background tasks to complete...") + background_thread.join(timeout=30) # Wait up to 30 seconds + + if background_thread.is_alive(): + huntarr_logger.warning("Background thread did not stop gracefully within the timeout.") + elif background_thread: + huntarr_logger.info("Background thread already stopped.") + else: + huntarr_logger.info("Background thread was not started.") + + # Call the shutdown_threads function from primary.main (if it does more than just join) + # This might be redundant if start_huntarr handles its own cleanup via stop_event + # huntarr_logger.info("Calling shutdown_threads()...") + # shutdown_threads() # Uncomment if primary.main.shutdown_threads() does more cleanup + + huntarr_logger.info("--- Huntarr Main Process Exiting ---") + # Use os._exit(0) for a more forceful exit if necessary, but sys.exit(0) is generally preferred + sys.exit(0) \ No newline at end of file diff --git a/Huntarr.io-6.3.6/requirements.txt b/Huntarr.io-6.3.6/requirements.txt new file mode 100644 index 0000000..419b6de --- /dev/null +++ b/Huntarr.io-6.3.6/requirements.txt @@ -0,0 +1,7 @@ +Flask==3.0.0 +requests==2.31.0 +waitress==2.1.2 +bcrypt==4.1.2 +qrcode[pil]==7.4.2 # Added qrcode with PIL support +pyotp==2.9.0 # Added pyotp +pywin32==306; sys_platform == 'win32' # For Windows service support \ No newline at end of file diff --git a/Huntarr.io-6.3.6/routes.py b/Huntarr.io-6.3.6/routes.py new file mode 100644 index 0000000..fe3f483 --- /dev/null +++ b/Huntarr.io-6.3.6/routes.py @@ -0,0 +1,62 @@ +from flask import Flask, render_template, request, redirect, send_file + +app = Flask(__name__) + +import os +import json + +def get_ui_preference(): + """Determine which UI to use based on config and user preference""" + # Check if ui_settings.json exists + config_file = os.path.join(os.path.dirname(__file__), 'config/ui_settings.json') + + use_new_ui = False + + if os.path.exists(config_file): + try: + with open(config_file, 'r') as f: + settings = json.load(f) + use_new_ui = settings.get('use_new_ui', False) + except Exception as e: + print(f"Error loading UI settings: {e}") + + # Allow URL parameter to override + ui_param = request.args.get('ui', None) + if ui_param == 'new': + use_new_ui = True + elif ui_param == 'classic': + use_new_ui = False + + return use_new_ui + +@app.route('/') +def index(): + """Root route with UI switching capability""" + if get_ui_preference(): + return redirect('/new') + else: + return render_template('index.html') + +@app.route('/user') +def user_page(): + """User settings page with UI switching capability""" + return render_template('user.html') + +@app.route('/user/new') +def user_new_page(): + """User settings page for new UI""" + return render_template('user.html') + +@app.route('/version.txt') +def version_txt(): + """Serve version.txt file directly""" + version_path = os.path.join(os.path.dirname(__file__), 'version.txt') + print(f"Serving version.txt from path: {version_path}") # Debug log + try: + return send_file(version_path, mimetype='text/plain') + except Exception as e: + print(f"Error serving version.txt: {e}") # Log any errors + return str(e), 500 # Return error message and 500 status code + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/__init__.py b/Huntarr.io-6.3.6/src/primary/__init__.py new file mode 100644 index 0000000..851281f --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/__init__.py @@ -0,0 +1,6 @@ +""" +Huntarr - Find Missing & Upgrade Media Items +A unified tool for Sonarr, Radarr, Lidarr, and Readarr +""" + +__version__ = "4.0.0" \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/api.py b/Huntarr.io-6.3.6/src/primary/api.py new file mode 100644 index 0000000..50d0e5b --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/api.py @@ -0,0 +1,389 @@ +#!/usr/bin/env python3 +""" +Arr API Helper Functions +Handles all communication with the Arr API +""" + +import requests +import time +from typing import List, Dict, Any, Optional, Union +from primary.utils.logger import logger, debug_log +from primary.config import API_KEY, API_URL, API_TIMEOUT, COMMAND_WAIT_DELAY, COMMAND_WAIT_ATTEMPTS, APP_TYPE +from src.primary.stats_manager import get_stats, reset_stats + +# Create a session for reuse +session = requests.Session() + +def arr_request(endpoint: str, method: str = "GET", data: Dict = None) -> Optional[Union[Dict, List]]: + """ + Make a request to the Arr API. + `endpoint` should be something like 'series', 'command', 'wanted/cutoff', etc. + """ + # Determine the API version based on app type + if APP_TYPE == "sonarr": + api_base = "api/v3" + elif APP_TYPE == "radarr": + api_base = "api/v3" + elif APP_TYPE == "lidarr": + api_base = "api/v1" + elif APP_TYPE == "readarr": + api_base = "api/v1" + else: + # Default to v3 for unknown app types + api_base = "api/v3" + + url = f"{API_URL}/{api_base}/{endpoint}" + headers = { + "X-Api-Key": API_KEY, + "Content-Type": "application/json" + } + + try: + if method.upper() == "GET": + response = session.get(url, headers=headers, timeout=API_TIMEOUT) + elif method.upper() == "POST": + response = session.post(url, headers=headers, json=data, timeout=API_TIMEOUT) + else: + logger.error(f"Unsupported HTTP method: {method}") + return None + + # Check for 401 Unauthorized or other error status codes + if response.status_code == 401: + logger.error(f"API request error: 401 Client Error: Unauthorized for url: {url}") + return None + + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException as e: + logger.error(f"API request error: {e}") + return None + +def check_connection(app_type: str = None) -> bool: + """ + Check if we can connect to the Arr API. + Returns True if connection is successful, False otherwise. + + Args: + app_type: Optional app type to check connection for (sonarr, radarr, etc.). + If None, uses the global APP_TYPE. + """ + # Determine which app type to use + current_app_type = app_type or APP_TYPE + + # Get API credentials for the specified app type + from primary import keys_manager + api_url, api_key = keys_manager.get_api_keys(current_app_type) + + # First explicitly check if API URL and Key are configured + if not api_url: + logger.error(f"API URL is not configured for {current_app_type} in settings. Please set it up in the Settings page.") + return False + + if not api_key: + logger.error(f"API Key is not configured for {current_app_type} in settings. Please set it up in the Settings page.") + return False + + # Log what we're attempting to connect to + logger.debug(f"Attempting to connect to {current_app_type.title()} at {api_url}") + + # Try to access the system/status endpoint which should be available on all Arr applications + try: + endpoint = "system/status" + + # Determine the API version based on app type + if current_app_type == "sonarr": + api_base = "api/v3" + elif current_app_type == "radarr": + api_base = "api/v3" + elif current_app_type == "lidarr": + api_base = "api/v1" + elif current_app_type == "readarr": + api_base = "api/v1" + else: + # Default to v3 for unknown app types + api_base = "api/v3" + + url = f"{api_url}/{api_base}/{endpoint}" + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + logger.debug(f"Testing connection with URL: {url}") + response = session.get(url, headers=headers, timeout=API_TIMEOUT) + + if response.status_code == 401: + logger.error(f"Connection test failed: 401 Client Error: Unauthorized - Invalid API key for {current_app_type.title()}") + return False + + response.raise_for_status() + logger.info(f"Connection to {current_app_type.title()} at {api_url} successful") + return True + except requests.exceptions.RequestException as e: + logger.error(f"Connection test failed for {current_app_type}: {e}") + return False + +def wait_for_command(command_id: int): + logger.debug(f"Waiting for command {command_id} to complete...") + attempts = 0 + while True: + try: + time.sleep(COMMAND_WAIT_DELAY) + response = arr_request(f"command/{command_id}") + logger.debug(f"Command {command_id} Status: {response['status']}") + except Exception as error: + logger.error(f"Error fetching command status on attempt {attempts + 1}: {error}") + return False + + attempts += 1 + + if response['status'].lower() in ['complete', 'completed'] or attempts >= COMMAND_WAIT_ATTEMPTS: + break + + if response['status'].lower() not in ['complete', 'completed']: + logger.warning(f"Command {command_id} did not complete within the allowed attempts.") + return False + + time.sleep(0.5) + + return response['status'].lower() in ['complete', 'completed'] + +# Sonarr-specific functions +def get_series() -> List[Dict]: + """Get all series from Sonarr.""" + if APP_TYPE != "sonarr": + logger.error("get_series() called but APP_TYPE is not sonarr") + return [] + + series_list = arr_request("series") + if series_list: + debug_log("Raw series API response sample:", series_list[:2] if len(series_list) > 2 else series_list) + return series_list or [] + +def refresh_series(series_id: int) -> bool: + """ + POST /api/v5/command + { + "name": "RefreshSeries", + "seriesId": + } + """ + if APP_TYPE != "sonarr": + logger.error("refresh_series() called but APP_TYPE is not sonarr") + return False + + data = { + "name": "RefreshSeries", + "seriesId": series_id + } + response = arr_request("command", method="POST", data=data) + if not response or 'id' not in response: + return False + return wait_for_command(response['id']) + +def episode_search_episodes(episode_ids: List[int]) -> bool: + """ + POST /api/v5/command + { + "name": "EpisodeSearch", + "episodeIds": [...] + } + """ + if APP_TYPE != "sonarr": + logger.error("episode_search_episodes() called but APP_TYPE is not sonarr") + return False + + data = { + "name": "EpisodeSearch", + "episodeIds": episode_ids + } + response = arr_request("command", method="POST", data=data) + if not response or 'id' not in response: + return False + return wait_for_command(response['id']) + +def get_download_queue_size() -> int: + """ + GET /api/v5/queue + Returns total number of items in the queue with the status 'downloading'. + """ + # Endpoint is the same for all apps + response = arr_request("queue?status=downloading") + if not response: + return 0 + + total_records = response.get("totalRecords", 0) + if not isinstance(total_records, int): + total_records = 0 + logger.debug(f"Download Queue Size: {total_records}") + + return total_records + +def get_cutoff_unmet(page: int = 1) -> Optional[Dict]: + """ + GET /api/v5/wanted/cutoff?sortKey=airDateUtc&sortDirection=descending&includeSeriesInformation=true + &page=&pageSize=200 + Returns JSON with a "records" array and "totalRecords". + """ + if APP_TYPE != "sonarr": + logger.error("get_cutoff_unmet() called but APP_TYPE is not sonarr") + return None + + endpoint = ( + "wanted/cutoff?" + "sortKey=airDateUtc&sortDirection=descending&includeSeriesInformation=true" + f"&page={page}&pageSize=200" + ) + return arr_request(endpoint, method="GET") + +def get_cutoff_unmet_total_pages() -> int: + """ + To find total pages, call the endpoint with page=1&pageSize=1, read totalRecords, + then compute how many pages if each pageSize=200. + """ + if APP_TYPE != "sonarr": + logger.error("get_cutoff_unmet_total_pages() called but APP_TYPE is not sonarr") + return 0 + + response = arr_request("wanted/cutoff?page=1&pageSize=1") + if not response or "totalRecords" not in response: + return 0 + + total_records = response.get("totalRecords", 0) + if not isinstance(total_records, int) or total_records < 1: + return 0 + + # Each page has up to 200 episodes + total_pages = (total_records + 200 - 1) // 200 + return max(total_pages, 1) + +def get_episodes_for_series(series_id: int) -> Optional[List[Dict]]: + """Get all episodes for a specific series""" + if APP_TYPE != "sonarr": + logger.error("get_episodes_for_series() called but APP_TYPE is not sonarr") + return None + + return arr_request(f"episode?seriesId={series_id}", method="GET") + +def get_missing_episodes(pageSize: int = 1000) -> Optional[Dict]: + """ + GET /api/v5/wanted/missing?pageSize=&includeSeriesInformation=true + Returns JSON with a "records" array of missing episodes and "totalRecords". + """ + if APP_TYPE != "sonarr": + logger.error("get_missing_episodes() called but APP_TYPE is not sonarr") + return None + + endpoint = f"wanted/missing?pageSize={pageSize}&includeSeriesInformation=true" + result = arr_request(endpoint, method="GET") + + # Better debugging for missing episodes query + if result: + logger.debug(f"Found {result.get('totalRecords', 0)} total missing episodes") + if result.get('records'): + logger.debug(f"First few missing episodes: {result['records'][:2] if len(result['records']) > 2 else result['records']}") + else: + logger.warning("Missing episodes query returned no data") + + return result + +def get_series_with_missing_episodes() -> List[Dict]: + """ + Fetch all shows that have missing episodes using the wanted/missing endpoint. + Returns a list of series objects with an additional 'missingEpisodes' field + containing the list of missing episodes for that series. + """ + if APP_TYPE != "sonarr": + logger.error("get_series_with_missing_episodes() called but APP_TYPE is not sonarr") + return [] + + # Log request attempt + logger.debug("Requesting missing episodes from Sonarr API") + + missing_data = get_missing_episodes() + if not missing_data or "records" not in missing_data: + logger.error("Failed to get missing episodes data or no 'records' field in response") + return [] + + # Group missing episodes by series ID + series_with_missing = {} + for episode in missing_data.get("records", []): + series_id = episode.get("seriesId") + if not series_id: + logger.warning(f"Found episode without seriesId: {episode}") + continue + + series_title = None + + # Try to get series info from the episode record + if "series" in episode and isinstance(episode["series"], dict): + series_info = episode["series"] + series_title = series_info.get("title") + + # Initialize the series entry if it doesn't exist + if series_id not in series_with_missing: + series_with_missing[series_id] = { + "id": series_id, + "title": series_title or "Unknown Show", + "monitored": series_info.get("monitored", False), + "missingEpisodes": [] + } + else: + # If we don't have series info, need to fetch it + if series_id not in series_with_missing: + # Get series info directly + series_info = arr_request(f"series/{series_id}", method="GET") + if series_info: + series_with_missing[series_id] = { + "id": series_id, + "title": series_info.get("title", "Unknown Show"), + "monitored": series_info.get("monitored", False), + "missingEpisodes": [] + } + else: + logger.warning(f"Could not get series info for ID {series_id}, skipping episode") + continue + + # Add the episode to the series record + if series_id in series_with_missing: + series_with_missing[series_id]["missingEpisodes"].append(episode) + + # Convert to list and add count for convenience + result = [] + for series_id, series_data in series_with_missing.items(): + series_data["missingEpisodeCount"] = len(series_data["missingEpisodes"]) + result.append(series_data) + + logger.debug(f"Processed missing episodes data into {len(result)} series with missing episodes") + return result + +def get_media_stats(): + """Get statistics for hunted and upgraded media""" + try: + stats = get_stats() + return jsonify({ + "success": True, + "stats": stats + }) + except Exception as e: + logger.error(f"Error retrieving media statistics: {e}") + return jsonify({ + "success": False, + "message": "Error retrieving media statistics." + }), 500 + +def reset_media_stats(): + """Reset statistics for hunted and upgraded media""" + try: + app_type = request.json.get('app_type') if request.json else None + reset_stats(app_type) + return jsonify({ + "success": True, + "message": f"Successfully reset statistics for {'all apps' if app_type is None else app_type}." + }) + except Exception as e: + logger.error(f"Error resetting media statistics: {e}") + return jsonify({ + "success": False, + "message": "Error resetting media statistics." + }), 500 \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/app.py b/Huntarr.io-6.3.6/src/primary/app.py new file mode 100644 index 0000000..5e78d06 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/app.py @@ -0,0 +1,129 @@ +import logging +import json +import pathlib +from datetime import datetime +import time + +class WebAddressFilter(logging.Filter): + """Filter out web interface availability messages""" + def filter(self, record): + if "Web interface available at http://" in record.getMessage(): + return False + return True + +def configure_logging(): + # Get timezone set in the environment (this will be updated when user changes the timezone in UI) + try: + # Create a custom formatter that includes timezone information + class TimezoneFormatter(logging.Formatter): + def formatTime(self, record, datefmt=None): + ct = self.converter(record.created) + if datefmt: + return time.strftime(datefmt, ct) + else: + # Include timezone in the timestamp + return time.strftime("%Y-%m-%d %H:%M:%S %z", ct) + + # Configure the formatter for all handlers + formatter = TimezoneFormatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + + # Reset the root logger and reconfigure with proper timezone handling + for handler in logging.root.handlers[:]: + logging.root.removeHandler(handler) + + logging.basicConfig(level=logging.INFO) + + # Apply the formatter to all handlers + for handler in logging.root.handlers: + handler.setFormatter(formatter) + + except Exception as e: + # Fallback to basic logging if any issues + logging.basicConfig(level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') + logging.error(f"Error setting up timezone-aware logging: {e}") + + # Add filter to remove web interface URL logs + for handler in logging.root.handlers: + handler.addFilter(WebAddressFilter()) + + logging.info("Logging is configured.") + +def migrate_settings(): + """Migrate settings from nested to flat structure""" + # Settings file path + SETTINGS_DIR = pathlib.Path("/config") + SETTINGS_FILE = SETTINGS_DIR / "huntarr.json" + + if not SETTINGS_FILE.exists(): + logging.info(f"Settings file {SETTINGS_FILE} does not exist, nothing to migrate.") + return + + try: + # Read current settings + with open(SETTINGS_FILE, "r", encoding="utf-8") as file: + settings = json.load(file) + + # Flag to track if changes were made + changes_made = False + + # Check and migrate each app's settings + for app in ["sonarr", "radarr", "lidarr", "readarr"]: + if app in settings and "huntarr" in settings[app]: + logging.info(f"Found nested huntarr section in {app}, migrating...") + + # Move all settings from app.huntarr to app level + for key, value in settings[app]["huntarr"].items(): + if key not in settings[app]: + settings[app][key] = value + + # Remove the huntarr section + del settings[app]["huntarr"] + changes_made = True + + # Check for advanced section + if app in settings and "advanced" in settings[app]: + logging.info(f"Found advanced section in {app}, migrating...") + + # Move all settings from app.advanced to app level + for key, value in settings[app]["advanced"].items(): + if key not in settings[app]: + settings[app][key] = value + + # Remove the advanced section + del settings[app]["advanced"] + changes_made = True + + # Remove global section if present + if "global" in settings: + logging.info("Removing global section...") + del settings["global"] + changes_made = True + + # Remove UI section if present + if "ui" in settings: + logging.info("Removing UI section...") + del settings["ui"] + changes_made = True + + # Save changes if needed + if changes_made: + with open(SETTINGS_FILE, "w", encoding="utf-8") as file: + json.dump(settings, file, indent=2) + logging.info("Settings migration completed successfully.") + else: + logging.info("No changes needed, settings are already in the correct format.") + + except Exception as e: + logging.error(f"Error migrating settings: {e}") + +if __name__ == "__main__": + configure_logging() + logging.info("Starting Huntarr application") + + # Migrate settings to flat structure + migrate_settings() + + # Using filtered logging + logging.info("Web interface available at http://localhost:8080") + logging.info("Application started") \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/app_manager.py b/Huntarr.io-6.3.6/src/primary/app_manager.py new file mode 100644 index 0000000..7eb80d4 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/app_manager.py @@ -0,0 +1,41 @@ +# If this file doesn't exist, we'll create it + +import os +from src.primary.utils.logger import get_logger +from src.primary.settings_manager import load_settings + +logger = get_logger("app_manager") + +# List of supported app types +SUPPORTED_APP_TYPES = ["sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros"] + +def initialize_apps(): + """Initialize all supported applications""" + for app_type in SUPPORTED_APP_TYPES: + initialize_app(app_type) + + # Also load general settings but don't treat it as a regular app + load_general_settings() + +def initialize_app(app_type): + """Initialize a specific application""" + if app_type not in SUPPORTED_APP_TYPES: + logger.warning(f"Attempted to initialize unsupported app type: {app_type}") + return False + + # Load settings for this app + settings = load_settings(app_type) + + # Additional initialization as needed + # ... + + return True + +def load_general_settings(): + """Load general settings without treating it as a regular app""" + settings = load_settings("general") + logger.info("--- Configuration for general ---") + # Log the settings as needed + # ... + logger.info("--- End Configuration for general ---") + return settings diff --git a/Huntarr.io-6.3.6/src/primary/apps/blueprints.py b/Huntarr.io-6.3.6/src/primary/apps/blueprints.py new file mode 100644 index 0000000..786e29e --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/blueprints.py @@ -0,0 +1,24 @@ +""" +Centralized blueprint imports +This module provides a single location to import all app blueprints +to avoid circular import issues +""" + +# Import blueprints from the renamed route files +from src.primary.apps.sonarr_routes import sonarr_bp +from src.primary.apps.radarr_routes import radarr_bp +from src.primary.apps.lidarr_routes import lidarr_bp +from src.primary.apps.readarr_routes import readarr_bp +from src.primary.apps.whisparr_routes import whisparr_bp +from src.primary.apps.swaparr_routes import swaparr_bp +from src.primary.apps.eros_routes import eros_bp + +__all__ = [ + "sonarr_bp", + "radarr_bp", + "lidarr_bp", + "readarr_bp", + "whisparr_bp", + "swaparr_bp", + "eros_bp" +] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/eros.py b/Huntarr.io-6.3.6/src/primary/apps/eros.py new file mode 100644 index 0000000..9bbd866 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/eros.py @@ -0,0 +1,171 @@ +from flask import Blueprint, request, jsonify +import datetime, os, requests +from primary import keys_manager +from src.primary.utils.logger import get_logger +from src.primary.state import get_state_file_path +from src.primary.settings_manager import load_settings, settings_manager + +eros_bp = Blueprint('eros', __name__) +eros_logger = get_logger("eros") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("eros", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("eros", "processed_upgrades") + +@eros_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to an Eros API instance with comprehensive diagnostics""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Log the test attempt + eros_logger.info(f"Testing connection to Eros API at {api_url}") + + # First check if URL is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + eros_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Try multiple API path combinations to handle different Whisparr V3/Eros setups + api_paths = [ + "/api/v3/system/status", # Standard V3 path + "/api/system/status", # Standard V2 path that might still work + "/system/status" # Direct path without /api prefix + ] + + success = False + last_error = None + response_data = None + + for api_path in api_paths: + test_url = f"{api_url.rstrip('/')}{api_path}" + headers = {'X-Api-Key': api_key} + eros_logger.debug(f"Trying Eros API path: {test_url}") + + try: + # Use a connection timeout separate from read timeout + response = requests.get(test_url, headers=headers, timeout=(10, api_timeout)) + + # Log HTTP status code for diagnostic purposes + eros_logger.debug(f"Eros API status code: {response.status_code} for path {api_path}") + + # Check HTTP status code + if response.status_code == 404: + # Try next path if 404 + continue + + response.raise_for_status() + + # Ensure the response is valid JSON + try: + response_data = response.json() + eros_logger.debug(f"Eros API response: {response_data}") + + # Verify this is actually an Eros API by checking for version + version = response_data.get('version', None) + if not version: + # No version info, try next path + last_error = "API response doesn't contain version information" + continue + + # The version number should start with 3 for Eros + if version.startswith('3'): + eros_logger.info(f"Successfully connected to Eros API version {version} using path {api_path}") + success = True + break + elif version.startswith('2'): + error_msg = f"Connected to Whisparr V2 (version {version}). Use the Whisparr integration for V2." + eros_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + else: + # Connected to some other version, try next path + last_error = f"Connected to unknown version {version}, but Huntarr requires Eros V3" + continue + + except ValueError: + last_error = "Invalid JSON response from API" + continue + + except requests.exceptions.Timeout: + last_error = f"Connection timed out after {api_timeout} seconds" + continue + + except requests.exceptions.ConnectionError: + last_error = "Failed to connect. Check that the URL is correct and that Eros is running." + continue + + except requests.exceptions.HTTPError as e: + last_error = f"HTTP error: {str(e)}" + continue + + except Exception as e: + last_error = f"Unexpected error: {str(e)}" + continue + + # After trying all paths + if success: + return jsonify({ + "success": True, + "message": f"Successfully connected to Eros (version {response_data.get('version')})", + "version": response_data.get('version') + }) + else: + error_msg = last_error or "Failed to connect to Eros API. Please check your URL and API key." + eros_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + +# Function to check if Eros is configured +def is_configured(): + """Check if Eros API credentials are configured""" + try: + settings = load_settings("eros") + instances = settings.get("instances", []) + + for instance in instances: + if instance.get("enabled", True): + return True + + return False + except Exception as e: + eros_logger.error(f"Error checking if Eros is configured: {str(e)}") + return False + +# Get all valid instances from settings +def get_configured_instances(): + """Get all configured and enabled Eros instances""" + try: + settings = load_settings("eros") + instances = settings.get("instances", []) + + enabled_instances = [] + for instance in instances: + if not instance.get("enabled", True): + continue + + api_url = instance.get("api_url") + api_key = instance.get("api_key") + + if not api_url or not api_key: + continue + + # Add name and timeout + instance_name = instance.get("name", "Default") + api_timeout = instance.get("api_timeout", 90) + + enabled_instances.append({ + "api_url": api_url, + "api_key": api_key, + "instance_name": instance_name, + "api_timeout": api_timeout + }) + + return enabled_instances + except Exception as e: + eros_logger.error(f"Error getting configured Eros instances: {str(e)}") + return [] diff --git a/Huntarr.io-6.3.6/src/primary/apps/eros/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/eros/__init__.py new file mode 100644 index 0000000..896c14a --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/eros/__init__.py @@ -0,0 +1,95 @@ +""" +Eros app module for Huntarr +Contains functionality for missing items and quality upgrades in Eros + +Exclusively supports the v3 API. +""" + +# Module exports +from src.primary.apps.eros.missing import process_missing_items +from src.primary.apps.eros.upgrade import process_cutoff_upgrades +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +# Define logger for this module +eros_logger = get_logger("eros") + +# For backward compatibility +process_missing_scenes = process_missing_items + +def get_configured_instances(): + """Get all configured and enabled Eros instances""" + settings = load_settings("eros") + instances = [] + # Use debug level to avoid log spam on new installations + eros_logger.debug(f"Loaded Eros settings for instance check: {settings}") + + if not settings: + eros_logger.debug("No settings found for Eros") + return instances + + # Always use Eros V3 API + # Use debug level to avoid log spam on new installations + eros_logger.debug("Using Eros API v3 exclusively") + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + # Use debug level to avoid log spam on new installations + eros_logger.debug(f"Found 'instances' list with {len(settings['instances'])} items. Processing...") + for idx, instance in enumerate(settings["instances"]): + eros_logger.debug(f"Checking instance #{idx}: {instance}") + # Enhanced validation + api_url = instance.get("api_url", "").strip() + api_key = instance.get("api_key", "").strip() + + # Enhanced URL validation - ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + eros_logger.warning(f"Instance '{instance.get('name', 'Unnamed')}' has URL without http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + eros_logger.warning(f"Auto-correcting URL to: {api_url}") + + is_enabled = instance.get("enabled", True) + + # Only include properly configured instances + if is_enabled and api_url and api_key: + instance_name = instance.get("name", "Default") + + # Create a settings object for this instance by combining global settings with instance-specific ones + instance_settings = settings.copy() + + # Remove instances list to avoid confusion + if "instances" in instance_settings: + del instance_settings["instances"] + + # Override with instance-specific settings + instance_settings["api_url"] = api_url + instance_settings["api_key"] = api_key + instance_settings["instance_name"] = instance_name + + # Add timeout setting with default if not present + if "api_timeout" not in instance_settings: + instance_settings["api_timeout"] = 30 + + # Use debug level to prevent log spam + eros_logger.debug(f"Adding configured Eros instance: {instance_name}") + instances.append(instance_settings) + else: + name = instance.get("name", "Unnamed") + if not is_enabled: + eros_logger.debug(f"Skipping disabled instance: {name}") + else: + # For brand new installations, don't spam logs with warnings about default instances + if name == 'Default': + # Use debug level for default instances to avoid log spam on new installations + eros_logger.debug(f"Skipping instance {name} due to missing API URL or API Key") + else: + # Still log warnings for non-default instances + eros_logger.warning(f"Skipping instance {name} due to missing API URL or API Key") + else: + eros_logger.debug("No instances array found in settings or it's empty") + + # Use debug level to avoid spamming logs, especially with 0 instances + eros_logger.debug(f"Found {len(instances)} configured and enabled Eros instances") + return instances + +__all__ = ["process_missing_items", "process_missing_scenes", "process_cutoff_upgrades", "get_configured_instances"] diff --git a/Huntarr.io-6.3.6/src/primary/apps/eros/api.py b/Huntarr.io-6.3.6/src/primary/apps/eros/api.py new file mode 100644 index 0000000..b403bda --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/eros/api.py @@ -0,0 +1,517 @@ +#!/usr/bin/env python3 +""" +Eros-specific API functions +Handles all communication with the Eros API + +Exclusively uses the Eros API v3 +""" + +import requests +import json +import time +import datetime +import traceback +import sys +from typing import List, Dict, Any, Optional, Union +from src.primary.utils.logger import get_logger + +# Get logger for the Eros app +eros_logger = get_logger("eros") + +# Use a session for better performance +session = requests.Session() + +def arr_request(api_url: str, api_key: str, api_timeout: int, endpoint: str, method: str = "GET", data: Dict = None) -> Any: + """ + Make a request to the Eros API. + + Args: + api_url: The base URL of the Eros API + api_key: The API key for authentication + api_timeout: Timeout for the API request + endpoint: The API endpoint to call + method: HTTP method (GET, POST, PUT, DELETE) + data: Optional data to send with the request + + Returns: + The JSON response from the API, or None if the request failed + """ + if not api_url or not api_key: + eros_logger.error("API URL or API key is missing. Check your settings.") + return None + + # Always use v3 API path + api_base = "api/v3" + eros_logger.debug(f"Using Eros API path: {api_base}") + + # Full URL - ensure no double slashes + url = f"{api_url.rstrip('/')}/{api_base}/{endpoint.lstrip('/')}" + + # Add debug logging for the exact URL being called + eros_logger.debug(f"Making {method} request to: {url}") + + # Headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + if method == "GET": + response = session.get(url, headers=headers, timeout=api_timeout) + elif method == "POST": + response = session.post(url, headers=headers, json=data, timeout=api_timeout) + elif method == "PUT": + response = session.put(url, headers=headers, json=data, timeout=api_timeout) + elif method == "DELETE": + response = session.delete(url, headers=headers, timeout=api_timeout) + else: + eros_logger.error(f"Unsupported HTTP method: {method}") + return None + + # Check if the request was successful + try: + response.raise_for_status() + except requests.exceptions.HTTPError as e: + eros_logger.error(f"Error during {method} request to {endpoint}: {e}, Status Code: {response.status_code}") + eros_logger.debug(f"Response content: {response.text[:200]}") + return None + + # Try to parse JSON response + try: + if response.text: + result = response.json() + eros_logger.debug(f"Response from {response.url}: Status {response.status_code}, JSON parsed successfully") + return result + else: + eros_logger.debug(f"Response from {response.url}: Status {response.status_code}, Empty response") + return {} + except json.JSONDecodeError: + eros_logger.error(f"Invalid JSON response from API: {response.text[:200]}") + return None + + except requests.exceptions.RequestException as e: + eros_logger.error(f"Request failed: {e}") + return None + except Exception as e: + eros_logger.error(f"Unexpected error during API request: {e}") + return None + +def get_download_queue_size(api_url: str, api_key: str, api_timeout: int) -> int: + """ + Get the current size of the download queue. + + Args: + api_url: The base URL of the Eros API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + The number of items in the download queue, or -1 if the request failed + """ + response = arr_request(api_url, api_key, api_timeout, "queue") + + if response is None: + return -1 + + # V3 API returns a list directly + if isinstance(response, list): + return len(response) + # Fallback to records format if needed + elif isinstance(response, dict) and "records" in response: + return len(response["records"]) + else: + return -1 + +def get_items_with_missing(api_url: str, api_key: str, api_timeout: int, monitored_only: bool, search_mode: str = "movie") -> List[Dict[str, Any]]: + """ + Get a list of items with missing files (not downloaded/available). + + Args: + api_url: The base URL of the Eros API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored items. + search_mode: The search mode to use - 'movie' for movie-based or 'scene' for scene-based + + Returns: + A list of item objects with missing files, or None if the request failed. + """ + try: + eros_logger.debug(f"Retrieving missing items using search mode: {search_mode}...") + + if search_mode == "movie": + # In movie mode, we get all movies and filter for ones without files + endpoint = "movie" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + return None + + # Extract the movies with missing files + items = [] + if isinstance(response, list): + # Filter for movies that don't have files (hasFile = false) + items = [item for item in response if not item.get("hasFile", True)] + elif isinstance(response, dict) and "records" in response: + # Fallback to old format if somehow it returns in this format + items = [item for item in response["records"] if not item.get("hasFile", True)] + + elif search_mode == "scene": + # In scene mode, we try to use scene-specific endpoints + # First check if the movie-scene endpoint exists + endpoint = "scene/missing?pageSize=1000" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + # Fallback to regular movie filtering if scene endpoint doesn't exist + eros_logger.warning("Scene endpoint not available, falling back to movie mode") + return get_items_with_missing(api_url, api_key, api_timeout, monitored_only, "movie") + + # Extract the scenes + items = [] + if isinstance(response, dict) and "records" in response: + items = response["records"] + elif isinstance(response, list): + items = response + + else: + # Invalid search mode + eros_logger.error(f"Invalid search mode: {search_mode}. Must be 'movie' or 'scene'") + return None + + # Filter monitored if needed + if monitored_only: + items = [item for item in items if item.get("monitored", False)] + + eros_logger.debug(f"Found {len(items)} missing items using {search_mode} mode") + + return items + + except Exception as e: + eros_logger.error(f"Error retrieving missing items: {str(e)}") + return None + +def get_cutoff_unmet_items(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> List[Dict[str, Any]]: + """ + Get a list of items that don't meet their quality profile cutoff. + + Args: + api_url: The base URL of the Eros API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored items. + + Returns: + A list of item objects that need quality upgrades, or None if the request failed. + """ + try: + eros_logger.debug(f"Retrieving cutoff unmet items...") + + # Endpoint + endpoint = "wanted/cutoff?pageSize=1000&sortKey=airDateUtc&sortDirection=descending" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + return None + + # Extract the episodes/items + items = [] + if isinstance(response, dict) and "records" in response: + items = response["records"] + elif isinstance(response, list): + items = response + + eros_logger.debug(f"Found {len(items)} cutoff unmet items") + + # Just filter monitored if needed + if monitored_only: + items = [item for item in items if item.get("monitored", False)] + eros_logger.debug(f"Found {len(items)} cutoff unmet items after filtering monitored") + + return items + + except Exception as e: + eros_logger.error(f"Error retrieving cutoff unmet items: {str(e)}") + return None + +def get_quality_upgrades(api_url: str, api_key: str, api_timeout: int, monitored_only: bool, search_mode: str = "movie") -> List[Dict[str, Any]]: + """ + Get a list of items that can be upgraded to better quality. + + Args: + api_url: The base URL of the Eros API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored items. + search_mode: The search mode to use - 'movie' for movie-based or 'scene' for scene-based + + Returns: + A list of item objects that need quality upgrades, or None if the request failed. + """ + try: + eros_logger.debug(f"Retrieving quality upgrade items using search mode: {search_mode}...") + + if search_mode == "movie": + # In movie mode, we get all movies and filter for ones that have files but need quality upgrades + endpoint = "movie" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + return None + + # Extract movies that have files but need quality upgrades + items = [] + if isinstance(response, list): + # Filter for movies that have files but haven't met quality cutoff + items = [item for item in response if item.get("hasFile", False) and item.get("qualityCutoffNotMet", False)] + elif isinstance(response, dict) and "records" in response: + # Fallback to old format if somehow it returns in this format + items = [item for item in response["records"] if item.get("hasFile", False) and item.get("qualityCutoffNotMet", False)] + + elif search_mode == "scene": + # In scene mode, try to use scene-specific endpoints + endpoint = "scene/cutoff?pageSize=1000" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + # Fallback to regular movie filtering if scene endpoint doesn't exist + eros_logger.warning("Scene cutoff endpoint not available, falling back to movie mode") + return get_quality_upgrades(api_url, api_key, api_timeout, monitored_only, "movie") + + # Extract the scenes + items = [] + if isinstance(response, dict) and "records" in response: + items = response["records"] + elif isinstance(response, list): + items = response + + else: + # Invalid search mode + eros_logger.error(f"Invalid search mode: {search_mode}. Must be 'movie' or 'scene'") + return None + + # Filter monitored if needed + if monitored_only: + items = [item for item in items if item.get("monitored", False)] + + eros_logger.debug(f"Found {len(items)} quality upgrade items using {search_mode} mode") + + return items + + except Exception as e: + eros_logger.error(f"Error retrieving quality upgrade items: {str(e)}") + return None + +def refresh_item(api_url: str, api_key: str, api_timeout: int, item_id: int) -> int: + """ + Refresh a movie in Whisparr V3. + + Args: + api_url: The base URL of the Whisparr V3 API + api_key: The API key for authentication + api_timeout: Timeout for the API request + item_id: The ID of the movie to refresh + + Returns: + The command ID if the refresh was triggered successfully, None otherwise + """ + try: + eros_logger.info(f"Explicitly refreshing movie with ID {item_id} via API call") + + # In Whisparr V3, we use RefreshMovie command directly with the movieId + payload = { + "name": "RefreshMovie", + "movieId": item_id + } + + # Command endpoint + command_endpoint = "command" + + # Make the API request + response = arr_request(api_url, api_key, api_timeout, command_endpoint, "POST", payload) + + if response and "id" in response: + command_id = response["id"] + eros_logger.info(f"Refresh movie command triggered with ID {command_id} for movie {item_id}") + return command_id + else: + eros_logger.error(f"Failed to trigger refresh command for movie {item_id} - no command ID returned") + return None + + except Exception as e: + eros_logger.error(f"Error refreshing movie {item_id}: {str(e)}") + return None + +def item_search(api_url: str, api_key: str, api_timeout: int, item_ids: List[int]) -> int: + """ + Trigger a search for one or more movies in Whisparr V3. + + Args: + api_url: The base URL of the Whisparr V3 API + api_key: The API key for authentication + api_timeout: Timeout for the API request + item_ids: A list of movie IDs to search for + + Returns: + The command ID if the search command was triggered successfully, None otherwise + """ + try: + if not item_ids: + eros_logger.warning("No movie IDs provided for search.") + return None + + eros_logger.debug(f"Searching for movies with IDs: {item_ids}") + + # Try several possible command formats, as the API might be in flux + possible_commands = [ + # Format 1: MoviesSearch with integer IDs (Radarr-like) and no auto-refresh + { + "name": "MoviesSearch", + "movieIds": item_ids, + "updateScheduledTask": False, + "runRefreshAfterSearch": False, + "sendUpdatesToClient": False + }, + # Format 2: MovieSearch with integer IDs and no auto-refresh + { + "name": "MovieSearch", + "movieIds": item_ids, + "updateScheduledTask": False, + "runRefreshAfterSearch": False, + "sendUpdatesToClient": False + }, + # Format 3: MoviesSearch with string IDs and no auto-refresh + { + "name": "MoviesSearch", + "movieIds": [str(id) for id in item_ids], + "updateScheduledTask": False, + "runRefreshAfterSearch": False, + "sendUpdatesToClient": False + }, + # Format 4: MovieSearch with string IDs and no auto-refresh + { + "name": "MovieSearch", + "movieIds": [str(id) for id in item_ids], + "updateScheduledTask": False, + "runRefreshAfterSearch": False, + "sendUpdatesToClient": False + }, + # Fallback to original formats if the above don't work + { + "name": "MoviesSearch", + "movieIds": item_ids + }, + { + "name": "MovieSearch", + "movieIds": item_ids + }, + { + "name": "MoviesSearch", + "movieIds": [str(id) for id in item_ids] + }, + { + "name": "MovieSearch", + "movieIds": [str(id) for id in item_ids] + } + ] + + # Command endpoint + command_endpoint = "command" + + # Try each command format until one works + for i, payload in enumerate(possible_commands): + eros_logger.debug(f"Trying search command format {i+1}: {payload}") + + # Make the API request + response = arr_request(api_url, api_key, api_timeout, command_endpoint, "POST", payload) + + if response and "id" in response: + command_id = response["id"] + eros_logger.debug(f"Search command format {i+1} succeeded with ID {command_id}") + return command_id + + # If we've tried all formats and none worked: + eros_logger.error("All search command formats failed - no command ID returned") + return None + + except Exception as e: + eros_logger.error(f"Error searching for movies: {str(e)}") + return None + +def get_command_status(api_url: str, api_key: str, api_timeout: int, command_id: int) -> Optional[Dict]: + """ + Get the status of a specific command. + + Args: + api_url: The base URL of the Eros API + api_key: The API key for authentication + api_timeout: Timeout for the API request + command_id: The ID of the command to check + + Returns: + A dictionary containing the command status, or None if the request failed. + """ + if not command_id: + eros_logger.error("No command ID provided for status check.") + return None + + try: + command_endpoint = f"command/{command_id}" + + # Make the API request + result = arr_request(api_url, api_key, api_timeout, command_endpoint) + + if result: + eros_logger.debug(f"Command {command_id} status: {result.get('status', 'unknown')}") + return result + else: + eros_logger.error(f"Failed to get command status for ID {command_id}") + return None + + except Exception as e: + eros_logger.error(f"Error getting command status for ID {command_id}: {e}") + return None + +def check_connection(api_url: str, api_key: str, api_timeout: int) -> bool: + """ + Check the connection to Whisparr V3 API. + + Args: + api_url: The base URL of the Whisparr V3 API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + True if the connection is successful, False otherwise + """ + try: + eros_logger.debug(f"Checking connection to Whisparr V3 instance at {api_url}") + + endpoint = "system/status" + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is not None: + # Get the version information if available + version = response.get("version", "unknown") + + # Simply check if we received a valid response - Whisparr V3 is in development + # so the version number might be in various formats + if version and isinstance(version, str): + eros_logger.info(f"Successfully connected to Whisparr V3 API, reported version: {version}") + return True + else: + eros_logger.warning(f"Connected to server but found unexpected version format: {version}") + return False + else: + eros_logger.error("Failed to connect to Whisparr V3 API") + return False + + except Exception as e: + eros_logger.error(f"Error checking connection to Whisparr V3 API: {str(e)}") + return False diff --git a/Huntarr.io-6.3.6/src/primary/apps/eros/missing.py b/Huntarr.io-6.3.6/src/primary/apps/eros/missing.py new file mode 100644 index 0000000..cb87dcc --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/eros/missing.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python3 +""" +Missing Items Processing for Eros +Handles searching for missing items in Eros + +Exclusively supports the v3 API. +""" + +import time +import random +import datetime +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.eros import api as eros_api +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.stats_manager import increment_stat +from src.primary.utils.history_utils import log_processed_media +from src.primary.state import check_state_reset + +# Get logger for the app +eros_logger = get_logger("eros") + +def process_missing_items( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process missing items in Eros based on provided settings. + + Args: + app_settings: Dictionary containing all settings for Eros + stop_check: A function that returns True if the process should stop + + Returns: + True if any items were processed, False otherwise. + """ + eros_logger.info("Starting missing items processing cycle for Eros.") + processed_any = False + + # Reset state files if enough time has passed + check_state_reset("eros") + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + instance_name = app_settings.get("instance_name", "Eros Default") + + # Load general settings to get centralized timeout + general_settings = load_settings('general') + + monitored_only = app_settings.get("monitored_only", True) + skip_future_releases = app_settings.get("skip_future_releases", True) + skip_item_refresh = app_settings.get("skip_item_refresh", False) + eros_logger.info(f"Skip item refresh setting: {skip_item_refresh}") + search_mode = app_settings.get("search_mode", "movie") # Default to movie mode if not specified + + eros_logger.info(f"Using search mode: {search_mode} for missing items") + + # Use the new hunt_missing_items parameter name, falling back to hunt_missing_scenes for backwards compatibility + hunt_missing_items = app_settings.get("hunt_missing_items", app_settings.get("hunt_missing_scenes", 0)) + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + # Use the centralized advanced setting for stateful management hours + stateful_management_hours = get_advanced_setting("stateful_management_hours", 168) + + # Log that we're using Eros v3 API + eros_logger.info(f"Using Eros API v3 for instance: {instance_name}") + + # Skip if hunt_missing_items is set to a negative value or 0 + if hunt_missing_items <= 0: + eros_logger.info("'hunt_missing_items' setting is 0 or less. Skipping missing item processing.") + return False + + # Check for stop signal + if stop_check(): + eros_logger.info("Stop requested before starting missing items. Aborting...") + return False + + # Get missing items + eros_logger.info(f"Retrieving items with missing files...") + missing_items = eros_api.get_items_with_missing(api_url, api_key, api_timeout, monitored_only, search_mode) + + if missing_items is None: # API call failed + eros_logger.error("Failed to retrieve missing items from Eros API.") + return False + + if not missing_items: + eros_logger.info("No missing items found.") + return False + + # Check for stop signal after retrieving items + if stop_check(): + eros_logger.info("Stop requested after retrieving missing items. Aborting...") + return False + + eros_logger.info(f"Found {len(missing_items)} items with missing files.") + + # Filter out future releases if configured + if skip_future_releases: + now = datetime.datetime.now(datetime.timezone.utc) + original_count = len(missing_items) + # Eros item object has 'airDateUtc' for release dates + missing_items = [ + item for item in missing_items + if not item.get('airDateUtc') or ( + item.get('airDateUtc') and + datetime.datetime.fromisoformat(item['airDateUtc'].replace('Z', '+00:00')) < now + ) + ] + skipped_count = original_count - len(missing_items) + if skipped_count > 0: + eros_logger.info(f"Skipped {skipped_count} future item releases based on air date.") + + if not missing_items: + eros_logger.info("No missing items left to process after filtering future releases.") + return False + + # Filter out already processed items using stateful management + unprocessed_items = [] + for item in missing_items: + item_id = str(item.get("id")) + if not is_processed("eros", instance_name, item_id): + unprocessed_items.append(item) + else: + eros_logger.debug(f"Skipping already processed item ID: {item_id}") + + eros_logger.info(f"Found {len(unprocessed_items)} unprocessed items out of {len(missing_items)} total items with missing files.") + + if not unprocessed_items: + eros_logger.info(f"No unprocessed items found for {instance_name}. All available items have been processed.") + return False + + items_processed = 0 + processing_done = False + + # Select items to search based on configuration + eros_logger.info(f"Randomly selecting up to {hunt_missing_items} missing items.") + items_to_search = random.sample(unprocessed_items, min(len(unprocessed_items), hunt_missing_items)) + + eros_logger.info(f"Selected {len(items_to_search)} missing items to search.") + + # Process selected items + for item in items_to_search: + # Check for stop signal before each item + if stop_check(): + eros_logger.info("Stop requested during item processing. Aborting...") + break + + # Re-check limit in case it changed + current_limit = app_settings.get("hunt_missing_items", app_settings.get("hunt_missing_scenes", 1)) + if items_processed >= current_limit: + eros_logger.info(f"Reached HUNT_MISSING_ITEMS limit ({current_limit}) for this cycle.") + break + + item_id = item.get("id") + title = item.get("title", "Unknown Title") + + # For movies, we don't use season/episode format + if search_mode == "movie": + item_info = title + else: + # If somehow using scene mode, try to format as S/E if available + season_number = item.get('seasonNumber') + episode_number = item.get('episodeNumber') + if season_number is not None and episode_number is not None: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + item_info = f"{title} - {season_episode}" + else: + item_info = title + + eros_logger.info(f"Processing missing item: \"{item_info}\" (Item ID: {item_id})") + + # Mark the item as processed BEFORE triggering any searches + add_processed_id("eros", instance_name, str(item_id)) + eros_logger.debug(f"Added item ID {item_id} to processed list for {instance_name}") + + # Refresh the item information if not skipped + refresh_command_id = None + if not skip_item_refresh: + eros_logger.info(" - Refreshing item information...") + refresh_command_id = eros_api.refresh_item(api_url, api_key, api_timeout, item_id) + if refresh_command_id: + eros_logger.info(f"Triggered refresh command {refresh_command_id}. Waiting a few seconds...") + time.sleep(5) # Basic wait + else: + eros_logger.warning(f"Failed to trigger refresh command for item ID: {item_id}. Proceeding without refresh.") + else: + eros_logger.info(" - Skipping item refresh (skip_item_refresh=true)") + + # Check for stop signal before searching + if stop_check(): + eros_logger.info(f"Stop requested before searching for {title}. Aborting...") + break + + # Search for the item + eros_logger.info(" - Searching for missing item...") + search_command_id = eros_api.item_search(api_url, api_key, api_timeout, [item_id]) + if search_command_id: + eros_logger.info(f"Triggered search command {search_command_id}. Assuming success for now.") + + # Log to history system + log_processed_media("eros", item_info, item_id, instance_name, "missing") + eros_logger.debug(f"Logged history entry for item: {item_info}") + + items_processed += 1 + processing_done = True + + # Increment the hunted statistics for Eros + increment_stat("eros", "hunted", 1) + eros_logger.debug(f"Incremented eros hunted statistics by 1") + + # Log progress + current_limit = app_settings.get("hunt_missing_items", app_settings.get("hunt_missing_scenes", 1)) + eros_logger.info(f"Processed {items_processed}/{current_limit} missing items this cycle.") + else: + eros_logger.warning(f"Failed to trigger search command for item ID {item_id}.") + # Do not mark as processed if search couldn't be triggered + continue + + # Log final status + if items_processed > 0: + eros_logger.info(f"Completed processing {items_processed} missing items for this cycle.") + else: + eros_logger.info("No new missing items were processed in this run.") + + return processing_done + +# For backward compatibility with the background processing system +def process_missing_scenes(app_settings, stop_check): + """ + Backwards compatibility function that calls process_missing_items. + + Args: + app_settings: Dictionary containing all settings for Eros + stop_check: A function that returns True if the process should stop + + Returns: + Result from process_missing_items + """ + return process_missing_items(app_settings, stop_check) diff --git a/Huntarr.io-6.3.6/src/primary/apps/eros/upgrade.py b/Huntarr.io-6.3.6/src/primary/apps/eros/upgrade.py new file mode 100644 index 0000000..df1be22 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/eros/upgrade.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 +""" +Quality Upgrade Processing for Eros +Handles searching for items that need quality upgrades in Eros + +Exclusively supports the v3 API. +""" + +import time +import random +import datetime +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.eros import api as eros_api +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.stats_manager import increment_stat +from src.primary.utils.history_utils import log_processed_media +from src.primary.state import check_state_reset + +# Get logger for the app +eros_logger = get_logger("eros") + +def process_cutoff_upgrades( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process quality cutoff upgrades for Eros based on settings. + + Args: + app_settings: Dictionary containing all settings for Eros + stop_check: A function that returns True if the process should stop + + Returns: + True if any items were processed for upgrades, False otherwise. + """ + eros_logger.info("Starting quality cutoff upgrades processing cycle for Eros.") + processed_any = False + + # Reset state files if enough time has passed + check_state_reset("eros") + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + instance_name = app_settings.get("instance_name", "Eros Default") + + # Load general settings to get centralized timeout + general_settings = load_settings('general') + + monitored_only = app_settings.get("monitored_only", True) + skip_item_refresh = app_settings.get("skip_item_refresh", False) + eros_logger.info(f"Skip item refresh setting: {skip_item_refresh}") + search_mode = app_settings.get("search_mode", "movie") # Default to movie mode if not specified + + eros_logger.info(f"Using search mode: {search_mode} for quality upgrades") + + # Use the new hunt_upgrade_items parameter name, falling back to hunt_upgrade_scenes for backwards compatibility + hunt_upgrade_items = app_settings.get("hunt_upgrade_items", app_settings.get("hunt_upgrade_scenes", 0)) + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + state_reset_interval_hours = get_advanced_setting("stateful_management_hours", 168) + + # Log that we're using Eros API v3 + eros_logger.info(f"Using Eros API v3 for instance: {instance_name}") + + # Skip if hunt_upgrade_items is set to 0 + if hunt_upgrade_items <= 0: + eros_logger.info("'hunt_upgrade_items' setting is 0 or less. Skipping quality upgrade processing.") + return False + + # Check for stop signal + if stop_check(): + eros_logger.info("Stop requested before starting quality upgrades. Aborting...") + return False + + # Get items eligible for upgrade + eros_logger.info(f"Retrieving items eligible for cutoff upgrade...") + upgrade_eligible_data = eros_api.get_quality_upgrades(api_url, api_key, api_timeout, monitored_only, search_mode) + + if not upgrade_eligible_data: + eros_logger.info("No items found eligible for upgrade or error retrieving them.") + return False + + # Check for stop signal after retrieving eligible items + if stop_check(): + eros_logger.info("Stop requested after retrieving upgrade eligible items. Aborting...") + return False + + eros_logger.info(f"Found {len(upgrade_eligible_data)} items eligible for quality upgrade.") + + # Filter out already processed items using stateful management + unprocessed_items = [] + for item in upgrade_eligible_data: + item_id = str(item.get("id")) + if not is_processed("eros", instance_name, item_id): + unprocessed_items.append(item) + else: + eros_logger.debug(f"Skipping already processed item ID: {item_id}") + + eros_logger.info(f"Found {len(unprocessed_items)} unprocessed items out of {len(upgrade_eligible_data)} total items eligible for quality upgrade.") + + if not unprocessed_items: + eros_logger.info(f"No unprocessed items found for {instance_name}. All available items have been processed.") + return False + + items_processed = 0 + processing_done = False + + # Always use random selection for upgrades + eros_logger.info(f"Randomly selecting up to {hunt_upgrade_items} items for quality upgrade.") + items_to_upgrade = random.sample(unprocessed_items, min(len(unprocessed_items), hunt_upgrade_items)) + + eros_logger.info(f"Selected {len(items_to_upgrade)} items for quality upgrade.") + + # Process selected items + for item in items_to_upgrade: + # Check for stop signal before each item + if stop_check(): + eros_logger.info("Stop requested during item processing. Aborting...") + break + + # Re-check limit in case it changed + current_limit = app_settings.get("hunt_upgrade_items", app_settings.get("hunt_upgrade_scenes", 1)) + if items_processed >= current_limit: + eros_logger.info(f"Reached HUNT_UPGRADE_ITEMS limit ({current_limit}) for this cycle.") + break + + item_id = item.get("id") + title = item.get("title", "Unknown Title") + + # For movies, we don't use season/episode format + if search_mode == "movie": + item_info = title + # In Whisparr, movie quality is stored differently than TV shows + current_quality = item.get("movieFile", {}).get("quality", {}).get("quality", {}).get("name", "Unknown") + else: + # If somehow using scene mode, try to format as S/E if available + season_number = item.get('seasonNumber') + episode_number = item.get('episodeNumber') + if season_number is not None and episode_number is not None: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + item_info = f"{title} - {season_episode}" + else: + item_info = title + # Legacy episode quality path + current_quality = item.get("episodeFile", {}).get("quality", {}).get("quality", {}).get("name", "Unknown") + + eros_logger.info(f"Processing item for quality upgrade: \"{item_info}\" (Item ID: {item_id})") + eros_logger.info(f" - Current quality: {current_quality}") + + # Mark the item as processed BEFORE triggering any searches + add_processed_id("eros", instance_name, str(item_id)) + eros_logger.debug(f"Added item ID {item_id} to processed list for {instance_name}") + + # Refresh the item information if not skipped + refresh_command_id = None + if not skip_item_refresh: + eros_logger.info(" - Refreshing item information...") + refresh_command_id = eros_api.refresh_item(api_url, api_key, api_timeout, item_id) + if refresh_command_id: + eros_logger.info(f"Triggered refresh command {refresh_command_id}. Waiting a few seconds...") + time.sleep(5) # Basic wait + else: + eros_logger.warning(f"Failed to trigger refresh command for item ID: {item_id}. Proceeding without refresh.") + else: + eros_logger.info(" - Skipping item refresh (skip_item_refresh=true)") + + # Check for stop signal before searching + if stop_check(): + eros_logger.info(f"Stop requested before searching for {title}. Aborting...") + break + + # Search for the item + eros_logger.info(" - Searching for quality upgrade...") + search_command_id = eros_api.item_search(api_url, api_key, api_timeout, [item_id]) + if search_command_id: + eros_logger.info(f"Triggered search command {search_command_id}. Assuming success for now.") + + # Log to history so the upgrade appears in the history UI + log_processed_media("eros", item_info, item_id, instance_name, "upgrade") + eros_logger.debug(f"Logged quality upgrade to history for item ID {item_id}") + + items_processed += 1 + processing_done = True + + # Increment the upgraded statistics for Eros + increment_stat("eros", "upgraded", 1) + eros_logger.debug(f"Incremented eros upgraded statistics by 1") + + # Log progress + current_limit = app_settings.get("hunt_upgrade_items", app_settings.get("hunt_upgrade_scenes", 1)) + eros_logger.info(f"Processed {items_processed}/{current_limit} items for quality upgrade this cycle.") + else: + eros_logger.warning(f"Failed to trigger search command for item ID {item_id}.") + # Do not mark as processed if search couldn't be triggered + continue + + # Log final status + if items_processed > 0: + eros_logger.info(f"Completed processing {items_processed} items for quality upgrade for this cycle.") + else: + eros_logger.info("No new items were processed for quality upgrade in this run.") + + return processing_done diff --git a/Huntarr.io-6.3.6/src/primary/apps/eros_routes.py b/Huntarr.io-6.3.6/src/primary/apps/eros_routes.py new file mode 100644 index 0000000..9d6b8c7 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/eros_routes.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path, reset_state_file +from src.primary.utils.logger import get_logger, APP_LOG_FILES +from src.primary.settings_manager import load_settings +import traceback +import socket +from urllib.parse import urlparse +from src.primary.apps.eros import api as eros_api + +eros_bp = Blueprint('eros', __name__) +eros_logger = get_logger("eros") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("eros", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("eros", "processed_upgrades") + +def get_configured_instances(): + # Load Eros settings + settings = load_settings("eros") + instances = settings.get("instances", []) + return instances + +def test_connection(url, api_key): + # Validate URL format + if not (url.startswith('http://') or url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + + # Try to establish a socket connection first to check basic connectivity + parsed_url = urlparse(url) + hostname = parsed_url.hostname + port = parsed_url.port or (443 if parsed_url.scheme == 'https' else 80) + + try: + # Try socket connection for quick feedback on connectivity issues + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) # Short timeout for quick feedback + result = sock.connect_ex((hostname, port)) + sock.close() + + if result != 0: + error_msg = f"Connection refused - Unable to connect to {hostname}:{port}. Please check if the server is running and the port is correct." + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + except socket.gaierror: + error_msg = f"DNS resolution failed - Cannot resolve hostname: {hostname}. Please check your URL." + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + except Exception as e: + # Log the socket testing error but continue with the full request + eros_logger.debug(f"Socket test error, continuing with full request: {str(e)}") + + # For Eros, we only use v3 API path + api_url = f"{url.rstrip('/')}/api/v3/system/status" + headers = {'X-Api-Key': api_key} + + try: + # Make the request with appropriate timeouts + eros_logger.debug(f"Trying API path: {api_url}") + response = requests.get(api_url, headers=headers, timeout=(5, 30)) + + try: + response.raise_for_status() + + # Check if we got a valid JSON response + try: + response_data = response.json() + + # Verify this is actually an Eros server by checking for version + version = response_data.get('version') + if not version: + error_msg = "API response doesn't contain version information. This doesn't appear to be a valid Eros server." + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + + # Version check - should be v3.x for Eros + if version.startswith('3'): + detected_version = "v3" + eros_logger.info(f"Successfully connected to Eros API version: {version} (API {detected_version})") + + # Success! + return {"success": True, "message": "Successfully connected to Eros API", "version": version, "api_version": detected_version} + elif version.startswith('2'): + error_msg = f"Incompatible version detected: {version}. This appears to be Whisparr V2, not Eros." + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + else: + error_msg = f"Unexpected version {version} detected. Eros requires API v3." + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + except ValueError: + error_msg = "Invalid JSON response from Eros API - This doesn't appear to be a valid Eros server" + eros_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return {"success": False, "message": error_msg} + + except requests.exceptions.HTTPError: + # Handle specific HTTP errors + if response.status_code == 401: + error_msg = "Invalid API key - Authentication failed" + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + elif response.status_code == 404: + error_msg = "API endpoint not found: This doesn't appear to be a valid Eros server. Check your URL." + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + else: + error_msg = f"Eros server error (HTTP {response.status_code}): The Eros server is experiencing issues" + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + + except requests.exceptions.ConnectionError as e: + # Connection error - server might be down or unreachable + error_details = str(e) + + if "Connection refused" in error_details: + error_msg = f"Connection refused - Eros is not running on {url} or the port is incorrect" + else: + error_msg = f"Connection error - Check if Eros is running: {error_details}" + + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + + except requests.exceptions.Timeout: + error_msg = f"Connection timed out - Eros took too long to respond" + eros_logger.error(error_msg) + return {"success": False, "message": error_msg} + + except Exception as e: + error_msg = f"Unexpected error: {str(e)}" + eros_logger.error(f"{error_msg}\n{traceback.format_exc()}") + return {"success": False, "message": error_msg} + +@eros_bp.route('/status', methods=['GET']) +def get_status(): + """Get the status of all configured Eros instances""" + try: + instances = get_configured_instances() + eros_logger.debug(f"Eros configured instances: {instances}") + if instances: + connected_count = 0 + for instance in instances: + if test_connection(instance['url'], instance['api_key'])['success']: + connected_count += 1 + return jsonify({ + "configured": True, + "connected": connected_count > 0, + "connected_count": connected_count, + "total_configured": len(instances) + }) + else: + eros_logger.debug("No Eros instances configured") + return jsonify({"configured": False, "connected": False}) + except Exception as e: + eros_logger.error(f"Error getting Eros status: {str(e)}") + return jsonify({"configured": False, "connected": False, "error": str(e)}) + +@eros_bp.route('/test-connection', methods=['POST']) +def test_connection_endpoint(): + """Test connection to an Eros API instance""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + eros_logger.info(f"Testing connection to Eros API at {api_url}") + + return test_connection(api_url, api_key) + +@eros_bp.route('/test-settings', methods=['GET']) +def test_eros_settings(): + """Debug endpoint to test Eros settings loading""" + try: + # Directly read the settings file to bypass any potential caching + import json + import os + + # Check all possible settings locations + possible_locations = [ + "/config/eros.json", # Main Docker mount + "/app/config/eros.json", # Alternate location + os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "config", "eros.json") # Relative path + ] + + results = {} + + # Try all locations + for location in possible_locations: + results[location] = {"exists": os.path.exists(location)} + if os.path.exists(location): + try: + with open(location, 'r') as f: + results[location]["content"] = json.load(f) + except Exception as e: + results[location]["error"] = str(e) + + # Also try loading via settings_manager + try: + from src.primary.settings_manager import load_settings + settings = load_settings("eros") + results["settings_manager"] = settings + except Exception as e: + results["settings_manager_error"] = str(e) + + return jsonify(results) + except Exception as e: + return jsonify({"error": str(e)}) + +@eros_bp.route('/reset-processed', methods=['POST']) +def reset_processed_state(): + """Reset the processed state files for Eros""" + try: + # Reset the state files for missing and upgrades + reset_state_file("eros", "processed_missing") + reset_state_file("eros", "processed_upgrades") + + eros_logger.info("Successfully reset Eros processed state files") + return jsonify({"success": True, "message": "Successfully reset processed state"}) + except Exception as e: + error_msg = f"Error resetting Eros state: {str(e)}" + eros_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 diff --git a/Huntarr.io-6.3.6/src/primary/apps/lidarr.py b/Huntarr.io-6.3.6/src/primary/apps/lidarr.py new file mode 100644 index 0000000..aceb3e8 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/lidarr.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 +""" +Lidarr Blueprint for Huntarr +Defines Flask routes for interacting with Lidarr +""" + +import json +import traceback +import requests +from flask import Blueprint, jsonify, request +from src.primary.utils.logger import get_logger +from src.primary.apps.lidarr import api as lidarr_api +from src.primary.state import reset_state_file, get_state_file_path +from src.primary.settings_manager import load_settings +import src.primary.config as config + +# Create a logger for this module +lidarr_logger = get_logger("lidarr") + +# Create Blueprint for Lidarr routes +lidarr_bp = Blueprint('lidarr', __name__) + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("lidarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("lidarr", "processed_upgrades") + +# Function to check if Lidarr is configured +def is_configured(): + """Check if Lidarr API credentials are configured by checking if at least one instance is enabled""" + settings = load_settings("lidarr") + + if not settings: + lidarr_logger.debug("No settings found for Lidarr") + return False + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + lidarr_logger.debug(f"Found configured Lidarr instance: {instance.get('name', 'Unnamed')}") + return True + + lidarr_logger.debug("No enabled Lidarr instances found with valid API URL and key") + return False + + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + return bool(api_url and api_key) + +# Get all valid instances from settings +def get_configured_instances(): + """Get all configured and enabled Lidarr instances""" + settings = load_settings("lidarr") + instances = [] + + if not settings: + lidarr_logger.debug("No settings found for Lidarr") + return instances + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + # Create a settings object for this instance by combining global settings with instance-specific ones + instance_settings = settings.copy() + # Remove instances list to avoid confusion + if "instances" in instance_settings: + del instance_settings["instances"] + + # Override with instance-specific connection settings + instance_settings["api_url"] = instance.get("api_url") + instance_settings["api_key"] = instance.get("api_key") + instance_settings["instance_name"] = instance.get("name", "Default") + + instances.append(instance_settings) + else: + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + if api_url and api_key: + settings["instance_name"] = "Default" + instances.append(settings) + + lidarr_logger.info(f"Found {len(instances)} configured and enabled Lidarr instances") + return instances + +@lidarr_bp.route('/status', methods=['GET']) +def status(): + """Get Lidarr connection status and version.""" + try: + # Get API settings from config + settings = config.get_app_settings("lidarr") + + if not settings or not settings.get("api_url") or not settings.get("api_key"): + return jsonify({"connected": False, "message": "Lidarr is not configured"}), 200 + + api_url = settings["api_url"] + api_key = settings["api_key"] + api_timeout = settings.get("api_timeout", 30) + + # Check connection and get system status + system_status = lidarr_api.get_system_status(api_url, api_key, api_timeout) + + if system_status is not None: + version = system_status.get("version", "Unknown") + return jsonify({ + "connected": True, + "version": version, + "message": f"Connected to Lidarr {version}" + }), 200 + else: + return jsonify({ + "connected": False, + "message": "Failed to connect to Lidarr" + }), 200 + + except Exception as e: + error_message = f"Error checking Lidarr status: {str(e)}" + lidarr_logger.error(error_message) + lidarr_logger.error(traceback.format_exc()) + return jsonify({"connected": False, "message": error_message}), 500 + +@lidarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to Lidarr with provided API settings.""" + try: + # Extract API settings from request + data = request.json + api_url = data.get("api_url", "").rstrip('/') + api_key = data.get("api_key", "") + api_timeout = int(data.get("api_timeout", 30)) + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Test connection to Lidarr + system_status = lidarr_api.get_system_status(api_url, api_key, api_timeout) + + if system_status is not None: + version = system_status.get("version", "Unknown") + return jsonify({ + "success": True, + "version": version, + "message": f"Successfully connected to Lidarr {version}" + }), 200 + else: + return jsonify({ + "success": False, + "message": "Failed to connect to Lidarr. Check URL and API Key." + }), 400 + + except requests.exceptions.RequestException as e: + error_message = f"Connection error: {str(e)}" + if hasattr(e, 'response'): + if e.response is not None: + error_message += f" - Status Code: {e.response.status_code}, Response: {e.response.text[:200]}" + lidarr_logger.error(f"Lidarr connection error: {error_message}") + return jsonify({"success": False, "message": error_message}), 500 + except Exception as e: # Catch any other unexpected errors + lidarr_logger.error(f"An unexpected error occurred during Lidarr connection test: {str(e)}", exc_info=True) + return jsonify({"success": False, "message": f"An unexpected error occurred: {str(e)}"}), 500 + +@lidarr_bp.route('/stats', methods=['GET']) +def get_stats(): + """Get statistics about Lidarr library.""" + try: + # Get API settings from config + settings = config.get_app_settings("lidarr") + + if not settings or not settings.get("api_url") or not settings.get("api_key"): + return jsonify({"error": "Lidarr is not configured"}), 400 + + api_url = settings["api_url"] + api_key = settings["api_key"] + api_timeout = settings.get("api_timeout", 30) + monitored_only = settings.get("monitored_only", True) + + # Get all artists from Lidarr + all_artists = lidarr_api.get_artists(api_url, api_key, api_timeout) + if all_artists is None: + return jsonify({"error": "Failed to get artists from Lidarr"}), 500 + + # Count total artists and monitored artists + total_artists = len(all_artists) + monitored_artists = sum(1 for artist in all_artists if artist.get("monitored", False)) + + # Get missing albums + missing_albums = lidarr_api.get_missing_albums(api_url, api_key, api_timeout, monitored_only) + total_missing = len(missing_albums) if missing_albums is not None else 0 + + # Get cutoff unmet albums + cutoff_unmet = lidarr_api.get_cutoff_unmet_albums(api_url, api_key, api_timeout, monitored_only) + total_upgradable = len(cutoff_unmet) if cutoff_unmet is not None else 0 + + # Get download queue + queue_size = lidarr_api.get_download_queue_size(api_url, api_key, api_timeout) + + # Return stats + return jsonify({ + "total_artists": total_artists, + "monitored_artists": monitored_artists, + "missing_albums": total_missing, + "upgradable_albums": total_upgradable, + "queue_size": queue_size + }), 200 + + except Exception as e: + error_message = f"Error getting Lidarr stats: {str(e)}" + lidarr_logger.error(error_message) + lidarr_logger.error(traceback.format_exc()) + return jsonify({"error": error_message}), 500 + +@lidarr_bp.route('/reset-state', methods=['POST']) +def reset_state(): + """Reset the Lidarr state files to clear processed IDs.""" + try: + # JSON object with flags for which states to reset + data = request.json or {} + reset_missing = data.get('reset_missing', True) + reset_upgrades = data.get('reset_upgrades', True) + + # Reset missing state if requested + if reset_missing: + reset_state_file("lidarr", "processed_missing") + lidarr_logger.info("Reset Lidarr missing albums state") + + # Reset upgrades state if requested + if reset_upgrades: + reset_state_file("lidarr", "processed_upgrades") + lidarr_logger.info("Reset Lidarr upgrades state") + + return jsonify({ + "success": True, + "message": "Lidarr state reset successfully" + }), 200 + + except Exception as e: + error_message = f"Error resetting Lidarr state: {str(e)}" + lidarr_logger.error(error_message) + lidarr_logger.error(traceback.format_exc()) + return jsonify({"error": error_message}), 500 \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/lidarr/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/lidarr/__init__.py new file mode 100644 index 0000000..d003f14 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/lidarr/__init__.py @@ -0,0 +1,91 @@ +""" +Lidarr app module for Huntarr +Contains functionality for missing albums and quality upgrades in Lidarr +""" + +# Module exports +from src.primary.apps.lidarr.missing import process_missing_albums +from src.primary.apps.lidarr.upgrade import process_cutoff_upgrades +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +# Define logger for this module +lidarr_logger = get_logger("lidarr") + +def get_configured_instances(): + """Get all configured and enabled Lidarr instances""" + settings = load_settings("lidarr") + instances = [] + # lidarr_logger.info(f"Loaded Lidarr settings for instance check: {settings}") # Removed verbose log + + if not settings: + lidarr_logger.debug("No settings found for Lidarr") + return instances + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + # lidarr_logger.info(f"Found 'instances' list with {len(settings['instances'])} items. Processing...") # Removed verbose log + for idx, instance in enumerate(settings["instances"]): + lidarr_logger.debug(f"Checking instance #{idx}: {instance}") + # Enhanced validation + api_url = instance.get("api_url", "").strip() + api_key = instance.get("api_key", "").strip() + + # Enhanced URL validation - ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + lidarr_logger.warning(f"Instance '{instance.get('name', 'Unnamed')}' has URL without http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + lidarr_logger.warning(f"Auto-correcting URL to: {api_url}") + + is_enabled = instance.get("enabled", True) + + # Only include properly configured instances + if is_enabled and api_url and api_key: + # Return only essential instance details + instance_data = { + "instance_name": instance.get("name", "Default"), + "api_url": api_url, + "api_key": api_key, + } + instances.append(instance_data) + # lidarr_logger.info(f"Added valid instance: {instance_data}") # Removed verbose log + elif not is_enabled: + lidarr_logger.debug(f"Skipping disabled instance: {instance.get('name', 'Unnamed')}") + else: + # For brand new installations, don't spam logs with warnings about default instances + instance_name = instance.get('name', 'Unnamed') + if instance_name == 'Default': + # Use debug level for default instances to avoid log spam on new installations + lidarr_logger.debug(f"Skipping instance '{instance_name}' due to missing API URL or key (URL: '{api_url}', Key Set: {bool(api_key)})") + else: + # Still log warnings for non-default instances + lidarr_logger.warning(f"Skipping instance '{instance_name}' due to missing API URL or key (URL: '{api_url}', Key Set: {bool(api_key)})") + else: + # lidarr_logger.info("No 'instances' list found or list is empty. Checking legacy config.") # Removed verbose log + # Fallback to legacy single-instance config + api_url = settings.get("api_url", "").strip() + api_key = settings.get("api_key", "").strip() + + # Ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + lidarr_logger.warning(f"API URL missing http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + lidarr_logger.warning(f"Auto-correcting URL to: {api_url}") + + if api_url and api_key: + # Create a clean instance_data dict for the legacy instance + instance_data = { + "instance_name": "Default", + "api_url": api_url, + "api_key": api_key, + } + instances.append(instance_data) + # lidarr_logger.info(f"Added valid legacy instance: {instance_data}") # Removed verbose log + else: + lidarr_logger.warning("No API URL or key found in legacy configuration") + + # Use debug level to avoid spamming logs, especially with 0 instances + lidarr_logger.debug(f"Found {len(instances)} configured and enabled Lidarr instances") + return instances + +__all__ = ["process_missing_albums", "process_cutoff_upgrades", "get_configured_instances"] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/lidarr/api.py b/Huntarr.io-6.3.6/src/primary/apps/lidarr/api.py new file mode 100644 index 0000000..5baae67 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/lidarr/api.py @@ -0,0 +1,419 @@ +#!/usr/bin/env python3 +""" +Lidarr-specific API functions +Handles all communication with the Lidarr API (v1) +""" + +import requests +import json +import sys +import time +import datetime +import traceback +import logging +from typing import List, Dict, Any, Optional, Union +from src.primary.utils.logger import get_logger + +# Get logger for the Lidarr app +lidarr_logger = get_logger("lidarr") + +# Use a session for better performance +session = requests.Session() + +def arr_request(api_url: str, api_key: str, api_timeout: int, endpoint: str, method: str = "GET", data: Dict = None, params: Dict = None) -> Any: + """ + Make a request to the Lidarr API. + + Args: + api_url: The base URL of the Lidarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + endpoint: The API endpoint to call + method: HTTP method (GET, POST, PUT, DELETE) + data: Optional data to send with the request + params: Optional query parameters + + Returns: + The JSON response from the API, or None if the request failed + """ + if not api_url or not api_key: + lidarr_logger.error("API URL or API key is missing. Check your settings.") + return None + + # Ensure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + lidarr_logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return None + + # Make sure URL is properly formed + full_url = f"{api_url.rstrip('/')}/api/v1/{endpoint.lstrip('/')}" + + # Set up headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + lidarr_logger.debug(f"Lidarr API Request: {method} {full_url} Params: {params} Data: {data}") + + try: + response = session.request( + method=method.upper(), + url=full_url, + headers=headers, + json=data if method.upper() in ["POST", "PUT"] else None, + params=params if method.upper() == "GET" else None, + timeout=api_timeout + ) + + lidarr_logger.debug(f"Lidarr API Response Status: {response.status_code}") + # Log response body only in debug mode and if small enough + if lidarr_logger.level == logging.DEBUG and len(response.content) < 1000: + lidarr_logger.debug(f"Lidarr API Response Body: {response.text}") + elif lidarr_logger.level == logging.DEBUG: + lidarr_logger.debug(f"Lidarr API Response Body (truncated): {response.text[:500]}...") + + # Check for successful response + response.raise_for_status() + + # Parse response if there is content + if response.content and response.headers.get('Content-Type', '').startswith('application/json'): + return response.json() + elif response.status_code in [200, 201, 202]: # Success codes that might not return JSON + return True + else: # Should have been caught by raise_for_status, but as a fallback + lidarr_logger.warning(f"Request successful (status {response.status_code}) but no JSON content returned from {endpoint}") + return True # Indicate success even without content + + except requests.exceptions.RequestException as e: + error_msg = f"Error during {method} request to Lidarr endpoint '{endpoint}': {str(e)}" + if e.response is not None: + error_msg += f" | Status: {e.response.status_code} | Response: {e.response.text[:500]}" + lidarr_logger.error(error_msg) + return None + except json.JSONDecodeError: + lidarr_logger.error(f"Error decoding JSON response from Lidarr endpoint '{endpoint}'. Response: {response.text[:500]}") + return None + + except Exception as e: + # Catch all exceptions and log them with traceback + error_msg = f"CRITICAL ERROR in Lidarr arr_request: {str(e)}" + lidarr_logger.error(error_msg) + lidarr_logger.error(f"Full traceback: {traceback.format_exc()}") + print(error_msg, file=sys.stderr) + print(traceback.format_exc(), file=sys.stderr) + return None + +# --- Specific API Functions --- + +def get_system_status(api_url: str, api_key: str, api_timeout: int) -> Optional[Dict]: + """Get Lidarr system status.""" + return arr_request(api_url, api_key, api_timeout, "system/status") + +def check_connection(api_url: str, api_key: str, api_timeout: int) -> bool: + """Check the connection to Lidarr API.""" + try: + # Ensure api_url is properly formatted + if not api_url: + lidarr_logger.error("API URL is empty or not set") + return False + + # Make sure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + lidarr_logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return False + + # Ensure URL doesn't end with a slash before adding the endpoint + base_url = api_url.rstrip('/') + full_url = f"{base_url}/api/v1/system/status" + + response = requests.get(full_url, headers={"X-Api-Key": api_key}, timeout=api_timeout) + response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) + lidarr_logger.info("Successfully connected to Lidarr.") + return True + except requests.exceptions.RequestException as e: + lidarr_logger.error(f"Error connecting to Lidarr: {e}") + return False + except Exception as e: + lidarr_logger.error(f"An unexpected error occurred during Lidarr connection check: {e}") + return False + +def get_artists(api_url: str, api_key: str, api_timeout: int, artist_id: Optional[int] = None) -> Union[List, Dict, None]: + """Get artist information from Lidarr.""" + endpoint = f"artist/{artist_id}" if artist_id else "artist" + return arr_request(api_url, api_key, api_timeout, endpoint) + +def get_albums(api_url: str, api_key: str, api_timeout: int, album_id: Optional[int] = None, artist_id: Optional[int] = None) -> Union[List, Dict, None]: + """Get album information from Lidarr.""" + params = {} + if artist_id: + params['artistId'] = artist_id + + if album_id: + endpoint = f"album/{album_id}" + else: + endpoint = "album" + + return arr_request(api_url, api_key, api_timeout, endpoint, params=params if params else None) + +def get_tracks(api_url: str, api_key: str, api_timeout: int, album_id: Optional[int] = None) -> Union[List, None]: + """Get track information for a specific album.""" + if not album_id: + lidarr_logger.warning("get_tracks requires an album_id.") + return None + params = {'albumId': album_id} + return arr_request(api_url, api_key, api_timeout, "track", params=params) + +def get_queue(api_url: str, api_key: str, api_timeout: int) -> List: + """Get the current queue from Lidarr (handles pagination).""" + # Lidarr v1 queue endpoint supports pagination, unlike Sonarr v3's simple list + all_records = [] + page = 1 + page_size = 1000 # Request large page size + + while True: + params = { + "page": page, + "pageSize": page_size, + "sortKey": "timeleft", # Example sort key + "sortDir": "asc" + } + response = arr_request(api_url, api_key, api_timeout, "queue", params=params) + + if response and isinstance(response, dict) and 'records' in response: + records = response.get('records', []) + if not records: + break # No more records + all_records.extend(records) + + # Check if this was the last page + total_records = response.get('totalRecords', 0) + if len(all_records) >= total_records: + break + + page += 1 + else: + lidarr_logger.error(f"Failed to get queue page {page} or invalid response format.") + break # Return what we have so far + + return all_records + +def get_download_queue_size(api_url: str, api_key: str, api_timeout: int) -> int: + """Get the current size of the Lidarr download queue.""" + params = {"pageSize": 1} # Only need 1 record to get totalRecords + response = arr_request(api_url, api_key, api_timeout, "queue", params=params) + + if response and isinstance(response, dict) and 'totalRecords' in response: + queue_size = response.get('totalRecords', 0) + lidarr_logger.debug(f"Lidarr download queue size: {queue_size}") + return queue_size + else: + lidarr_logger.error("Error getting Lidarr download queue size.") + return -1 # Indicate error + +def get_missing_albums(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> List[Dict[str, Any]]: + """Get missing albums from Lidarr, handling pagination.""" + endpoint = "wanted/missing" + page = 1 + page_size = 1000 + all_missing_albums = [] + total_records_reported = -1 + + lidarr_logger.debug(f"Starting fetch for missing albums (monitored_only={monitored_only}).") + + while True: + params = { + "page": page, + "pageSize": page_size, + "includeArtist": "true" # Include artist info for filtering + # Removed sortKey and sortDir + } + + lidarr_logger.debug(f"Requesting missing albums page {page} with params: {params}") + response = arr_request(api_url, api_key, api_timeout, endpoint, params=params) + + if response and isinstance(response, dict) and 'records' in response: + records = response.get('records', []) + total_records_on_page = len(records) + + if page == 1: + total_records_reported = response.get('totalRecords', 0) + lidarr_logger.debug(f"Lidarr API reports {total_records_reported} total missing albums.") + + lidarr_logger.debug(f"Parsed {total_records_on_page} missing album records from Lidarr API JSON (page {page}).") + + if not records: + lidarr_logger.debug(f"No more missing records found on page {page}. Stopping pagination.") + break + + all_missing_albums.extend(records) + + if total_records_reported >= 0 and len(all_missing_albums) >= total_records_reported: + lidarr_logger.debug(f"Fetched {len(all_missing_albums)} records, matching or exceeding total reported ({total_records_reported}). Assuming last page.") + break + + if total_records_on_page < page_size: + lidarr_logger.debug(f"Received {total_records_on_page} records (less than page size {page_size}). Assuming last page.") + break + + page += 1 + # time.sleep(0.1) # Optional delay + + else: + lidarr_logger.error(f"Failed to get missing albums page {page} or invalid response format.") + break # Return what we have so far + + lidarr_logger.info(f"Total missing albums fetched across all pages: {len(all_missing_albums)}") + + # Apply monitored filter after fetching + if monitored_only: + original_count = len(all_missing_albums) + # Check both album and artist monitored status + filtered_missing = [ + album for album in all_missing_albums + if album.get('monitored', False) and album.get('artist', {}).get('monitored', False) + ] + lidarr_logger.debug(f"Filtered for monitored_only=True: {len(filtered_missing)} monitored missing albums remain (out of {original_count} total).") + return filtered_missing + else: + lidarr_logger.debug(f"Returning {len(all_missing_albums)} missing albums (monitored_only=False).") + return all_missing_albums + +def get_cutoff_unmet_albums(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> List[Dict[str, Any]]: + """Get cutoff unmet albums from Lidarr, handling pagination.""" + # Note: Lidarr API returns ALBUMS for cutoff unmet, not tracks. + endpoint = "wanted/cutoff" + page = 1 + page_size = 1000 # Adjust page size if needed, Lidarr default might be smaller + all_cutoff_unmet = [] + total_records_reported = -1 + + lidarr_logger.debug(f"Starting fetch for cutoff unmet albums (monitored_only={monitored_only}).") + + while True: + params = { + "page": page, + "pageSize": page_size, + "includeArtist": "true" # Include artist info for filtering + # Removed sortKey and sortDir + } + + lidarr_logger.debug(f"Requesting cutoff unmet albums page {page} with params: {params}") + response = arr_request(api_url, api_key, api_timeout, endpoint, params=params) + + if response and isinstance(response, dict) and 'records' in response: + records = response.get('records', []) + total_records_on_page = len(records) + + if page == 1: + total_records_reported = response.get('totalRecords', 0) + lidarr_logger.debug(f"Lidarr API reports {total_records_reported} total cutoff unmet albums.") + + lidarr_logger.debug(f"Parsed {total_records_on_page} cutoff unmet album records from Lidarr API JSON (page {page}).") + + if not records: + lidarr_logger.debug(f"No more cutoff unmet records found on page {page}. Stopping pagination.") + break + + all_cutoff_unmet.extend(records) + + # Check if we have fetched all reported records + if total_records_reported >= 0 and len(all_cutoff_unmet) >= total_records_reported: + lidarr_logger.debug(f"Fetched {len(all_cutoff_unmet)} records, matching or exceeding total reported ({total_records_reported}). Assuming last page.") + break + + # Check if the number of records received is less than the page size + if total_records_on_page < page_size: + lidarr_logger.debug(f"Received {total_records_on_page} records (less than page size {page_size}). Assuming last page.") + break + + page += 1 + # time.sleep(0.1) # Optional small delay between pages + + else: + # Log the error based on the response received (handled in arr_request) + lidarr_logger.error(f"Error getting cutoff unmet albums from Lidarr (page {page}) or invalid response format. Stopping pagination.") + # Return what we have so far, or indicate complete failure? Let's return what we have. + break + + lidarr_logger.info(f"Total cutoff unmet albums fetched across all pages: {len(all_cutoff_unmet)}") + + # Apply monitored filter after fetching all pages + if monitored_only: + original_count = len(all_cutoff_unmet) + # Check both album and artist monitored status + filtered_cutoff_unmet = [ + album for album in all_cutoff_unmet + if album.get('monitored', False) and album.get('artist', {}).get('monitored', False) + ] + lidarr_logger.debug(f"Filtered for monitored_only=True: {len(filtered_cutoff_unmet)} monitored cutoff unmet albums remain (out of {original_count} total).") + return filtered_cutoff_unmet + else: + lidarr_logger.debug(f"Returning {len(all_cutoff_unmet)} cutoff unmet albums (monitored_only=False).") + return all_cutoff_unmet + +def search_albums(api_url: str, api_key: str, api_timeout: int, album_ids: List[int]) -> Optional[Dict]: + """Trigger a search for specific albums in Lidarr.""" + if not album_ids: + lidarr_logger.warning("No album IDs provided for search.") + return None + + payload = { + "name": "AlbumSearch", + "albumIds": album_ids + } + response = arr_request(api_url, api_key, api_timeout, "command", method="POST", data=payload) + + if response and isinstance(response, dict) and 'id' in response: + command_id = response.get('id') + lidarr_logger.info(f"Triggered Lidarr AlbumSearch for album IDs: {album_ids}. Command ID: {command_id}") + return response # Return the full command object including ID + else: + lidarr_logger.error(f"Failed to trigger Lidarr AlbumSearch for album IDs {album_ids}. Response: {response}") + return None + +def search_artist(api_url: str, api_key: str, api_timeout: int, artist_id: int) -> Optional[Dict]: + """Trigger a search for a specific artist in Lidarr.""" + payload = { + "name": "ArtistSearch", + "artistIds": [artist_id] + } + response = arr_request(api_url, api_key, api_timeout, "command", method="POST", data=payload) + + if response and isinstance(response, dict) and 'id' in response: + command_id = response.get('id') + lidarr_logger.info(f"Triggered Lidarr ArtistSearch for artist ID: {artist_id}. Command ID: {command_id}") + return response # Return the full command object + else: + lidarr_logger.error(f"Failed to trigger Lidarr ArtistSearch for artist ID {artist_id}. Response: {response}") + return None + +def refresh_artist(api_url: str, api_key: str, api_timeout: int, artist_id: int) -> Optional[Dict]: + """Trigger a refresh for a specific artist in Lidarr.""" + payload = { + "name": "RefreshArtist", + "artistId": artist_id + } + response = arr_request(api_url, api_key, api_timeout, "command", method="POST", data=payload) + + if response and isinstance(response, dict) and 'id' in response: + command_id = response.get('id') + lidarr_logger.info(f"Triggered Lidarr RefreshArtist for artist ID: {artist_id}. Command ID: {command_id}") + return response # Return the full command object + else: + lidarr_logger.error(f"Failed to trigger Lidarr RefreshArtist for artist ID {artist_id}. Response: {response}") + return None + +def get_command_status(api_url: str, api_key: str, api_timeout: int, command_id: int) -> Optional[Dict[str, Any]]: + """Get the status of a Lidarr command.""" + response = arr_request(api_url, api_key, api_timeout, f"command/{command_id}") + if response and isinstance(response, dict): + lidarr_logger.debug(f"Checked Lidarr command status for ID {command_id}: {response.get('status')}") + return response + else: + lidarr_logger.error(f"Error getting Lidarr command status for ID {command_id}. Response: {response}") + return None + +def get_artist_by_id(api_url: str, api_key: str, api_timeout: int, artist_id: int) -> Optional[Dict[str, Any]]: + """Get artist details by ID from Lidarr.""" + return arr_request(api_url, api_key, api_timeout, f"artist/{artist_id}") \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/lidarr/missing.py b/Huntarr.io-6.3.6/src/primary/apps/lidarr/missing.py new file mode 100644 index 0000000..3b0af46 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/lidarr/missing.py @@ -0,0 +1,355 @@ +#!/usr/bin/env python3 +""" +Lidarr missing content processing module for Huntarr +Handles missing albums or artists based on configuration. +""" + +import time +import random +import datetime +import os +import json +from typing import Dict, Any, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.lidarr import api as lidarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.state import get_state_file_path, check_state_reset +import json +import os + +# Get the logger for the Lidarr module +lidarr_logger = get_logger(__name__) # Use __name__ for correct logger hierarchy + + +def process_missing_albums( + app_settings: Dict[str, Any], # Combined settings dictionary + stop_check: Callable[[], bool] = None # Function to check for stop signal +) -> bool: + """ + Processes missing albums for a specific Lidarr instance based on settings. + + Args: + app_settings (dict): Dictionary containing combined instance and general settings. + stop_check (Callable[[], bool]): Function to check if shutdown is requested. + + Returns: + bool: True if any items were processed, False otherwise. + """ + + # Copy instance-specific information + instance_name = app_settings.get("instance_name", "Default") + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + monitored_only = app_settings.get("monitored_only", True) + skip_future_releases = app_settings.get("skip_future_releases", False) + hunt_missing_items = app_settings.get("hunt_missing_items", 0) + hunt_missing_mode = app_settings.get("hunt_missing_mode", "album") + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + # Early exit for disabled features + if not api_url or not api_key: + lidarr_logger.warning(f"Missing API URL or API key, skipping missing processing for {instance_name}") + return False + + if hunt_missing_items <= 0: + lidarr_logger.debug(f"Hunting for missing items is disabled (hunt_missing_items={hunt_missing_items}) for {instance_name}") + return False + + # Make sure any requested stop function is executable + stop_check = stop_check if callable(stop_check) else lambda: False + + lidarr_logger.info(f"Looking for missing albums for {instance_name}") + lidarr_logger.debug(f"Processing up to {hunt_missing_items} missing items in {hunt_missing_mode} mode") + + # Reset state files if enough time has passed + check_state_reset("lidarr") + + # Initialize processed counter and tracking containers + processed_count = 0 + processed_any = False + processed_artists_or_albums = set() + total_items_to_process = hunt_missing_items + + try: + # Fetch all missing albums first + lidarr_logger.info(f"Fetching all missing albums for {instance_name}...") + missing_items = lidarr_api.get_missing_albums( + api_url, + api_key, + monitored_only=monitored_only, + api_timeout=api_timeout + ) + + if missing_items is None: # API call failed or returned None + lidarr_logger.error(f"Failed to get missing items from Lidarr API for {instance_name}.") + return False + + if not missing_items: + lidarr_logger.info(f"No missing albums found for {instance_name} after initial fetch and filtering.") + return False + + lidarr_logger.info(f"Found {len(missing_items)} potentially missing albums for {instance_name} after initial fetch.") + + # --- Filter Future Releases --- # + original_count = len(missing_items) + if skip_future_releases: + now = datetime.datetime.now(datetime.timezone.utc) + valid_missing_items = [] + skipped_count = 0 + for item in missing_items: + release_date_str = item.get('releaseDate') + if release_date_str: + try: + # Lidarr dates often include 'Z' for UTC + release_date = datetime.datetime.fromisoformat(release_date_str.replace('Z', '+00:00')) + if release_date <= now: + valid_missing_items.append(item) + else: + # lidarr_logger.debug(f"Skipping future album ID {item.get('id')} ('{item.get('title')}') release: {release_date_str}") + skipped_count += 1 + except ValueError as e: + lidarr_logger.warning(f"Could not parse release date '{release_date_str}' for album ID {item.get('id')}. Error: {e}. Including it.") + valid_missing_items.append(item) # Keep if date is invalid + else: + valid_missing_items.append(item) # Keep if no release date + + missing_items = valid_missing_items # Replace with filtered list + if skipped_count > 0: + lidarr_logger.info(f"Skipped {skipped_count} future albums based on release date. {len(missing_items)} remaining.") + else: + lidarr_logger.debug("Skipping future release filtering as 'skip_future_releases' is False.") + + # Check if any items remain after filtering + if not missing_items: + lidarr_logger.info(f"No missing albums left after filtering future releases for {instance_name}.") + return False + + # Process based on mode + lidarr_logger.info(f"Processing missing items in '{hunt_missing_mode}' mode.") + + target_entities = [] + search_entity_type = "album" # Default to album + + if hunt_missing_mode == "artist": + search_entity_type = "artist" + # Group by artist ID + items_by_artist = {} + for item in missing_items: # Use the potentially filtered missing_items list + artist_id = item.get('artistId') + lidarr_logger.debug(f"Missing album item: {item.get('title')} by artistId: {artist_id}") + if artist_id: + if artist_id not in items_by_artist: + items_by_artist[artist_id] = [] + items_by_artist[artist_id].append(item) + + # In artist mode, map from artists to their albums + # First, get all artist IDs + target_entities = list(items_by_artist.keys()) + + # Filter out already processed artists + lidarr_logger.info(f"Found {len(target_entities)} artists with missing albums before filtering") + unprocessed_entities = [eid for eid in target_entities + if not is_processed("lidarr", instance_name, str(eid))] + + lidarr_logger.info(f"Found {len(unprocessed_entities)} unprocessed artists out of {len(target_entities)} total") + else: + # In album mode, directly track album IDs + target_entities = [item['id'] for item in missing_items] + + # Filter out processed albums + lidarr_logger.info(f"Found {len(target_entities)} missing albums before filtering") + unprocessed_entities = [eid for eid in target_entities + if not is_processed("lidarr", instance_name, str(eid))] + + lidarr_logger.info(f"Found {len(unprocessed_entities)} unprocessed albums out of {len(target_entities)} total") + + if not unprocessed_entities: + lidarr_logger.info(f"No unprocessed {search_entity_type}s found for {instance_name}. All available {search_entity_type}s have been processed.") + return False + + # Select entities to search + if not unprocessed_entities: + lidarr_logger.info(f"No {search_entity_type}s found to process after grouping/filtering.") + return False + + entities_to_search_ids = random.sample(unprocessed_entities, min(len(unprocessed_entities), total_items_to_process)) + lidarr_logger.info(f"Randomly selected {len(entities_to_search_ids)} {search_entity_type}s to search.") + lidarr_logger.debug(f"Unprocessed entities: {unprocessed_entities}") + lidarr_logger.debug(f"Entities to search: {entities_to_search_ids}") + + # --- Trigger Search (Artist or Album) --- + if hunt_missing_mode == "artist": + lidarr_logger.info(f"Artist-based missing mode selected") + lidarr_logger.info(f"Found {len(entities_to_search_ids)} unprocessed artists to search.") + + # Prepare a list for artist details log + artist_details_log = [] + + # First, fetch detailed artist info for each artist ID to enhance logs + artist_details = {} + for artist_id in entities_to_search_ids: + # Get artist details from API for better logging + artist_data = lidarr_api.get_artist_by_id(api_url, api_key, api_timeout, artist_id) + if artist_data: + artist_details[artist_id] = artist_data + + lidarr_logger.info(f"Artists selected for processing in this cycle:") + for i, artist_id in enumerate(entities_to_search_ids): + # Get artist name and any additional details + artist_name = f"Artist ID {artist_id}" # Default if name not found + artist_metadata = "" + + if artist_id in artist_details: + artist_data = artist_details[artist_id] + artist_name = artist_data.get('artistName', artist_name) + # Add year active or debut year if available + if 'statistics' in artist_data and 'albumCount' in artist_data['statistics']: + album_count = artist_data['statistics']['albumCount'] + artist_metadata = f"({album_count} albums)" + # Get genre info if available + if 'genres' in artist_data and artist_data['genres']: + genres = ", ".join(artist_data['genres'][:2]) # Limit to first 2 genres + if artist_metadata: + artist_metadata = f"{artist_metadata} - {genres}" + else: + artist_metadata = f"({genres})" + + detail_line = f"{i+1}. {artist_name} {artist_metadata} - ID: {artist_id}" + artist_details_log.append(detail_line) + lidarr_logger.info(f" {detail_line}") + + lidarr_logger.info(f"Triggering Artist Search for {len(entities_to_search_ids)} artists on {instance_name}...") + for i, artist_id in enumerate(entities_to_search_ids): + if stop_check(): # Use the new stop_check function + lidarr_logger.warning("Shutdown requested during artist search trigger.") + break + + # Get artist name from cached details or first album + artist_name = f"Artist ID {artist_id}" # Default if name not found + if artist_id in artist_details: + artist_data = artist_details[artist_id] + artist_name = artist_data.get('artistName', artist_name) + elif artist_id in items_by_artist and items_by_artist[artist_id]: + # Fallback to album info if direct artist details not available + first_album = items_by_artist[artist_id][0] + artist_info = first_album.get('artist') + if artist_info and isinstance(artist_info, dict): + artist_name = artist_info.get('artistName', artist_name) + + # Mark the artist as processed right away - BEFORE triggering the search + success = add_processed_id("lidarr", instance_name, str(artist_id)) + lidarr_logger.debug(f"Added artist ID {artist_id} to processed list for {instance_name}, success: {success}") + + # Trigger the search AFTER marking as processed + command_result = lidarr_api.search_artist(api_url, api_key, api_timeout, artist_id) + command_id = command_result.get('id', 'unknown') if command_result else 'failed' + lidarr_logger.info(f"Triggered Lidarr ArtistSearch for artist ID: {artist_id}, Command ID: {command_id}") + + # Increment stats for UI tracking + if command_result: + increment_stat("lidarr", "hunted") + processed_count += 1 # Count successful searches + processed_artists_or_albums.add(artist_id) + + # Also mark all albums from this artist as processed + if artist_id in items_by_artist: + for album in items_by_artist[artist_id]: + album_id = album.get('id') + if album_id: + album_success = add_processed_id("lidarr", instance_name, str(album_id)) + lidarr_logger.debug(f"Added album ID {album_id} to processed list for {instance_name}, success: {album_success}") + + # Log to history system + log_processed_media("lidarr", f"{artist_name}", artist_id, instance_name, "missing") + lidarr_logger.debug(f"Logged history entry for artist: {artist_name}") + + time.sleep(0.1) # Small delay between triggers + else: # Album mode + album_ids_to_search = list(entities_to_search_ids) + if stop_check(): # Use the new stop_check function + lidarr_logger.warning("Shutdown requested before album search trigger.") + return False + + # Prepare descriptive list for logging + album_details_log = [] + # Create a dict for quick lookup based on album ID + missing_items_dict = {item['id']: item for item in missing_items if 'id' in item} + + # First, fetch additional album details for better logging if needed + album_details = {} + for album_id in album_ids_to_search: + album_details[album_id] = lidarr_api.get_albums(api_url, api_key, api_timeout, album_id) + + lidarr_logger.info(f"Albums selected for processing in this cycle:") + for idx, album_id in enumerate(album_ids_to_search): + album_info = missing_items_dict.get(album_id) + if album_info: + # Safely get title and artist name, provide defaults + title = album_info.get('title', f'Album ID {album_id}') + artist_name = album_info.get('artist', {}).get('artistName', 'Unknown Artist') + + # Get additional metadata if available + release_year = "" + if 'releaseDate' in album_info and album_info['releaseDate']: + try: + release_date = album_info['releaseDate'].split('T')[0] + release_year = f"({release_date[:4]})" + except (IndexError, ValueError): + pass + + # Get quality if available + quality_info = "" + if album_details.get(album_id) and 'quality' in album_details[album_id]: + quality = album_details[album_id]['quality'].get('quality', {}).get('name', '') + if quality: + quality_info = f"[{quality}]" + + detail_line = f"{idx+1}. {artist_name} - {title} {release_year} {quality_info} - ID: {album_id}" + album_details_log.append(detail_line) + lidarr_logger.info(f" {detail_line}") + else: + # Fallback if album ID wasn't found in the fetched missing items (should be rare) + detail_line = f"{idx+1}. Album ID {album_id} (Details not found)" + album_details_log.append(detail_line) + lidarr_logger.info(f" {detail_line}") + + # Mark the albums as processed BEFORE triggering the search + for album_id in album_ids_to_search: + success = add_processed_id("lidarr", instance_name, str(album_id)) + lidarr_logger.debug(f"Added album ID {album_id} to processed list for {instance_name}, success: {success}") + + # Now trigger the search + command_id = lidarr_api.search_albums(api_url, api_key, api_timeout, album_ids_to_search) + if command_id: + # Log after successful search + lidarr_logger.debug(f"Album search command triggered with ID: {command_id} for albums: [{', '.join(album_details_log)}]") + increment_stat("lidarr", "hunted") # Changed from "missing" to "hunted" + processed_count += len(album_ids_to_search) # Count albums searched + processed_artists_or_albums.update(album_ids_to_search) + + # Log to history system + for album_id in album_ids_to_search: + album_info = missing_items_dict.get(album_id) + if album_info: + # Get title and artist name for the history entry + title = album_info.get('title', f'Album ID {album_id}') + artist_name = album_info.get('artist', {}).get('artistName', 'Unknown Artist') + media_name = f"{artist_name} - {title}" + log_processed_media("lidarr", media_name, album_id, instance_name, "missing") + lidarr_logger.debug(f"Logged history entry for album: {media_name}") + + time.sleep(command_wait_delay) # Basic delay after the single command + else: + lidarr_logger.warning(f"Failed to trigger album search for IDs {album_ids_to_search} on {instance_name}.") + + except Exception as e: + lidarr_logger.error(f"An error occurred during missing album processing for {instance_name}: {e}", exc_info=True) + return False + + lidarr_logger.info(f"Missing album processing finished for {instance_name}. Processed {processed_count} items/searches ({len(processed_artists_or_albums)} unique {search_entity_type}s).") + return processed_count > 0 \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/lidarr/upgrade.py b/Huntarr.io-6.3.6/src/primary/apps/lidarr/upgrade.py new file mode 100644 index 0000000..a85fd19 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/lidarr/upgrade.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python3 +""" +Lidarr cutoff upgrade processing module for Huntarr +Handles albums that do not meet the configured quality cutoff. +""" + +import time +import random +from typing import Dict, Any, Optional, Callable, List, Union, Set # Added List, Union and Set +from src.primary.utils.logger import get_logger +from src.primary.apps.lidarr import api as lidarr_api +from src.primary.utils.history_utils import log_processed_media +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.stats_manager import increment_stat +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.state import check_state_reset # Add the missing import + +# Get logger for the app +lidarr_logger = get_logger(__name__) # Use __name__ for correct logger hierarchy + +def process_cutoff_upgrades( + app_settings: Dict[str, Any], # Changed signature: Use app_settings + stop_check: Callable[[], bool] # Changed signature: Use stop_check +) -> bool: + """ + Processes cutoff upgrades for albums in a specific Lidarr instance. + + Args: + app_settings (dict): Dictionary containing combined instance and general Lidarr settings. + stop_check (Callable[[], bool]): Function to check if shutdown is requested. + + Returns: + bool: True if any items were processed, False otherwise. + """ + lidarr_logger.info("Starting quality cutoff upgrades processing cycle for Lidarr.") + processed_any = False + + # --- Extract Settings --- # + # Instance details are now part of app_settings passed from background loop + instance_name = app_settings.get("instance_name", "Lidarr Default") + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + + # Get command wait settings from general.json + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + # General Lidarr settings (also from app_settings) + hunt_upgrade_items = app_settings.get("hunt_upgrade_items", 0) + monitored_only = app_settings.get("monitored_only", True) + + lidarr_logger.info(f"Using API timeout of {api_timeout} seconds for Lidarr upgrades") + + lidarr_logger.debug(f"Processing upgrades for instance: {instance_name}") + # lidarr_logger.debug(f"Instance Config (extracted): {{ 'api_url': '{api_url}', 'api_key': '***' }}") + # lidarr_logger.debug(f"General Settings (from app_settings): {app_settings}") # Avoid logging full settings potentially containing sensitive info + + # Check if API URL or Key are missing + if not api_url or not api_key: + lidarr_logger.error(f"Missing API URL or Key for instance '{instance_name}'. Cannot process upgrades.") + return False + + # Check if upgrade hunting is enabled + if hunt_upgrade_items <= 0: + lidarr_logger.info(f"'hunt_upgrade_items' is {hunt_upgrade_items} or less. Skipping upgrade processing for {instance_name}.") + return False + + lidarr_logger.info(f"Looking for quality upgrades for {instance_name}") + lidarr_logger.debug(f"Processing up to {hunt_upgrade_items} items for quality upgrade") + + # Reset state files if enough time has passed + check_state_reset("lidarr") + + processed_count = 0 + processed_any = False + + try: + lidarr_logger.info(f"Fetching cutoff unmet albums for {instance_name}...") + # Pass necessary details extracted above to the API function + # Corrected function name from get_cutoff_unmet to get_cutoff_unmet_albums + cutoff_unmet_albums = lidarr_api.get_cutoff_unmet_albums( + api_url, + api_key, + monitored_only=monitored_only, + api_timeout=api_timeout + ) + + if not cutoff_unmet_albums: + lidarr_logger.info(f"No cutoff unmet albums found for {instance_name}.") + return False + + lidarr_logger.info(f"Found {len(cutoff_unmet_albums)} cutoff unmet albums for {instance_name}.") + + # Filter out already processed items + unprocessed_albums = [] + for album in cutoff_unmet_albums: + album_id = str(album.get('id')) + if not is_processed("lidarr", instance_name, album_id): + unprocessed_albums.append(album) + else: + lidarr_logger.debug(f"Skipping already processed album ID: {album_id}") + + lidarr_logger.info(f"Found {len(unprocessed_albums)} unprocessed albums out of {len(cutoff_unmet_albums)} total albums eligible for quality upgrade.") + + if not unprocessed_albums: + lidarr_logger.info("No unprocessed albums found for quality upgrade. Skipping cycle.") + return False + + # Always select albums randomly + albums_to_search = random.sample(unprocessed_albums, min(len(unprocessed_albums), hunt_upgrade_items)) + lidarr_logger.info(f"Randomly selected {len(albums_to_search)} albums for upgrade search.") + + album_ids_to_search = [album['id'] for album in albums_to_search] + + if not album_ids_to_search: + lidarr_logger.info("No album IDs selected for upgrade search. Skipping trigger.") + return False + + # Prepare detailed album information for logging + album_details_log = [] + for i, album in enumerate(albums_to_search): + # Extract useful information for logging + album_title = album.get('title', f'Album ID {album["id"]}') + artist_name = album.get('artist', {}).get('artistName', 'Unknown Artist') + quality = album.get('quality', {}).get('quality', {}).get('name', 'Unknown Quality') + album_details_log.append(f"{i+1}. {artist_name} - {album_title} (ID: {album['id']}, Current Quality: {quality})") + + # Log each album on a separate line for better readability + if album_details_log: + lidarr_logger.info(f"Albums selected for quality upgrade in this cycle:") + for album_detail in album_details_log: + lidarr_logger.info(f" {album_detail}") + + # Check stop event before triggering search + if stop_check and stop_check(): # Use the passed stop_check function + lidarr_logger.warning("Shutdown requested, stopping upgrade album search.") + return False # Return False as no search was triggered in this case + + # Mark albums as processed BEFORE triggering search + for album_id in album_ids_to_search: + add_processed_id("lidarr", instance_name, str(album_id)) + lidarr_logger.debug(f"Added album ID {album_id} to processed list for {instance_name}") + + lidarr_logger.info(f"Triggering Album Search for {len(album_ids_to_search)} albums for upgrade on instance {instance_name}: {album_ids_to_search}") + # Pass necessary details extracted above to the API function + command_id = lidarr_api.search_albums( + api_url, + api_key, + api_timeout, + album_ids_to_search + ) + if command_id: + lidarr_logger.debug(f"Upgrade album search command triggered with ID: {command_id} for albums: {album_ids_to_search}") + increment_stat("lidarr", "upgraded") # Use appropriate stat key + + # Log to history + for album_id in album_ids_to_search: + # Find the album info for this ID to log to history + for album in albums_to_search: + if album['id'] == album_id: + album_title = album.get('title', f'Album ID {album_id}') + artist_name = album.get('artist', {}).get('artistName', 'Unknown Artist') + media_name = f"{artist_name} - {album_title}" + log_processed_media("lidarr", media_name, album_id, instance_name, "upgrade") + lidarr_logger.debug(f"Logged quality upgrade to history for album ID {album_id}") + break + + time.sleep(command_wait_delay) # Basic delay + processed_count += len(album_ids_to_search) + processed_any = True # Mark that we processed something + # Consider adding wait_for_command logic if needed + # wait_for_command(api_url, api_key, command_id, command_wait_delay, command_wait_attempts) + else: + lidarr_logger.warning(f"Failed to trigger upgrade album search for IDs {album_ids_to_search} on {instance_name}.") + + except Exception as e: + lidarr_logger.error(f"An error occurred during upgrade album processing for {instance_name}: {e}", exc_info=True) + return False # Indicate failure + + lidarr_logger.info(f"Upgrade album processing finished for {instance_name}. Triggered searches for {processed_count} items.") + return processed_any # Return True if anything was processed \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/lidarr_routes.py b/Huntarr.io-6.3.6/src/primary/apps/lidarr_routes.py new file mode 100644 index 0000000..bd78fda --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/lidarr_routes.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path, reset_state_file +from src.primary.utils.logger import get_logger +import traceback +import socket +from urllib.parse import urlparse + +lidarr_bp = Blueprint('lidarr', __name__) +lidarr_logger = get_logger("lidarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("lidarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("lidarr", "processed_upgrades") + +@lidarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Lidarr API instance""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + lidarr_logger.info(f"Testing connection to Lidarr API at {api_url}") + + # Validate URL format + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Try to establish a socket connection first to check basic connectivity + parsed_url = urlparse(api_url) + hostname = parsed_url.hostname + port = parsed_url.port or (443 if parsed_url.scheme == 'https' else 80) + + try: + # Try socket connection for quick feedback on connectivity issues + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) # Short timeout for quick feedback + result = sock.connect_ex((hostname, port)) + sock.close() + + if result != 0: + error_msg = f"Connection refused - Unable to connect to {hostname}:{port}. Please check if the server is running and the port is correct." + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except socket.gaierror: + error_msg = f"DNS resolution failed - Cannot resolve hostname: {hostname}. Please check your URL." + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except Exception as e: + # Log the socket testing error but continue with the full request + lidarr_logger.debug(f"Socket test error, continuing with full request: {str(e)}") + + # For Lidarr, use api/v1 + url = f"{api_url.rstrip('/')}/api/v1/system/status" + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + response = requests.get(url, headers=headers, timeout=(10, api_timeout)) + + # For HTTP errors, provide more specific feedback + if response.status_code == 401: + error_msg = "Authentication failed: Invalid API key" + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 401 + elif response.status_code == 403: + error_msg = "Access forbidden: Check API key permissions" + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 403 + elif response.status_code == 404: + error_msg = "API endpoint not found: This doesn't appear to be a valid Lidarr server. Check your URL." + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + elif response.status_code >= 500: + error_msg = f"Lidarr server error (HTTP {response.status_code}): The Lidarr server is experiencing issues" + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), response.status_code + + # Raise for other HTTP errors + response.raise_for_status() + + try: + response_data = response.json() + version = response_data.get('version', 'unknown') + lidarr_logger.info(f"Successfully connected to Lidarr API version: {version}") + + return jsonify({ + "success": True, + "message": "Successfully connected to Lidarr API", + "version": version + }) + except ValueError: + error_msg = "Invalid JSON response from Lidarr API - This doesn't appear to be a valid Lidarr server" + lidarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.ConnectionError as e: + # Handle different types of connection errors + error_details = str(e) + if "Connection refused" in error_details: + error_msg = f"Connection refused - Lidarr is not running on {api_url} or the port is incorrect" + elif "Name or service not known" in error_details or "getaddrinfo failed" in error_details: + error_msg = f"DNS resolution failed - Cannot find host '{urlparse(api_url).hostname}'. Check your URL." + else: + error_msg = f"Connection error - Check if Lidarr is running: {error_details}" + + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except requests.exceptions.Timeout: + error_msg = f"Connection timed out - Lidarr took too long to respond" + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 504 + except requests.exceptions.RequestException as e: + error_msg = f"Connection test failed: {str(e)}" + lidarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 diff --git a/Huntarr.io-6.3.6/src/primary/apps/radarr.py b/Huntarr.io-6.3.6/src/primary/apps/radarr.py new file mode 100644 index 0000000..14502ed --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/radarr.py @@ -0,0 +1,147 @@ +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.utils.logger import get_logger +from src.primary.state import get_state_file_path +from src.primary.settings_manager import load_settings + +radarr_bp = Blueprint('radarr', __name__) +radarr_logger = get_logger("radarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("radarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("radarr", "processed_upgrades") + +@radarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Radarr API instance with comprehensive diagnostics""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Log the test attempt + radarr_logger.info(f"Testing connection to Radarr API at {api_url}") + + # First check if URL is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # For Radarr, use api/v3 + api_base = "api/v3" + test_url = f"{api_url.rstrip('/')}/{api_base}/system/status" + headers = {'X-Api-Key': api_key} + + try: + # Use a connection timeout separate from read timeout + response = requests.get(test_url, headers=headers, timeout=(10, api_timeout)) + + # Log HTTP status code for diagnostic purposes + radarr_logger.debug(f"Radarr API status code: {response.status_code}") + + # Check HTTP status code + response.raise_for_status() + + # Ensure the response is valid JSON + try: + response_data = response.json() + + # We no longer save keys here since we use instances + # keys_manager.save_api_keys("radarr", api_url, api_key) + + radarr_logger.info(f"Successfully connected to Radarr API version: {response_data.get('version', 'unknown')}") + + # Return success with some useful information + return jsonify({ + "success": True, + "message": "Successfully connected to Radarr API", + "version": response_data.get('version', 'unknown') + }) + except ValueError: + error_msg = "Invalid JSON response from Radarr API" + radarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.Timeout as e: + error_msg = f"Connection timed out after {api_timeout} seconds" + radarr_logger.error(f"{error_msg}: {str(e)}") + return jsonify({"success": False, "message": error_msg}), 504 + + except requests.exceptions.ConnectionError as e: + error_msg = "Connection error - check hostname and port" + details = str(e) + # Check for common DNS resolution errors + if "Name or service not known" in details or "getaddrinfo failed" in details: + error_msg = "DNS resolution failed - check hostname" + # Check for common connection refused errors + elif "Connection refused" in details: + error_msg = "Connection refused - check if Radarr is running and the port is correct" + + radarr_logger.error(f"{error_msg}: {details}") + return jsonify({"success": False, "message": f"{error_msg}: {details}"}), 502 + + except requests.exceptions.RequestException as e: + error_message = f"Connection failed: {str(e)}" + + if hasattr(e, 'response') and e.response is not None: + status_code = e.response.status_code + + # Add specific messages based on common status codes + if status_code == 401: + error_message = "Authentication failed: Invalid API key" + elif status_code == 403: + error_message = "Access forbidden: Check API key permissions" + elif status_code == 404: + error_message = "API endpoint not found: Check API URL" + elif status_code >= 500: + error_message = f"Radarr server error (HTTP {status_code}): The Radarr server is experiencing issues" + + # Try to extract more error details if available + try: + error_details = e.response.json() + error_message += f" - {error_details.get('message', 'No details')}" + except ValueError: + if e.response.text: + error_message += f" - Response: {e.response.text[:200]}" + + radarr_logger.error(error_message) + return jsonify({"success": False, "message": error_message}), 500 + + except Exception as e: + error_msg = f"An unexpected error occurred: {str(e)}" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 + +# Function to check if Radarr is configured +def is_configured(): + """Check if Radarr API credentials are configured by checking if at least one instance is enabled""" + settings = load_settings("radarr") + + if not settings: + radarr_logger.debug("No settings found for Radarr") + return False + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + radarr_logger.debug(f"Found configured Radarr instance: {instance.get('name', 'Unnamed')}") + return True + + radarr_logger.debug("No enabled Radarr instances found with valid API URL and key") + return False + + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + return bool(api_url and api_key) + +# Get all valid instances from settings +# get_configured_instances function has been moved to src/primary/apps/radarr/__init__.py + +# Function to reset the processed IDs files diff --git a/Huntarr.io-6.3.6/src/primary/apps/radarr/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/radarr/__init__.py new file mode 100644 index 0000000..facdd9d --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/radarr/__init__.py @@ -0,0 +1,53 @@ +""" +Radarr app module for Huntarr +Contains functionality for missing movies and quality upgrades in Radarr +""" + +# Module exports +from src.primary.apps.radarr.missing import process_missing_movies +from src.primary.apps.radarr.upgrade import process_cutoff_upgrades + +# Add necessary imports for get_configured_instances +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +radarr_logger = get_logger("radarr") # Get the logger instance + +def get_configured_instances(): + """Get all configured and enabled Radarr instances""" + settings = load_settings("radarr") + instances = [] + + if not settings: + radarr_logger.debug("No settings found for Radarr") + return instances + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + # Create a settings object for this instance by combining global settings with instance-specific ones + instance_settings = settings.copy() + # Remove instances list to avoid confusion + if "instances" in instance_settings: + del instance_settings["instances"] + + # Override with instance-specific connection settings + instance_settings["api_url"] = instance.get("api_url") + instance_settings["api_key"] = instance.get("api_key") + instance_settings["instance_name"] = instance.get("name", "Default") + + instances.append(instance_settings) + else: + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + if api_url and api_key: + settings["instance_name"] = "Default" + instances.append(settings) + + # Use debug level to avoid spamming logs, especially with 0 instances + radarr_logger.debug(f"Found {len(instances)} configured and enabled Radarr instances") + return instances + +__all__ = ["process_missing_movies", "process_cutoff_upgrades", "get_configured_instances"] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/radarr/api.py b/Huntarr.io-6.3.6/src/primary/apps/radarr/api.py new file mode 100644 index 0000000..c2a0f9b --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/radarr/api.py @@ -0,0 +1,337 @@ +#!/usr/bin/env python3 +""" +Radarr-specific API functions +Handles all communication with the Radarr API +""" + +import requests +import json +import time +import datetime +from typing import List, Dict, Any, Optional, Union +# Correct the import path +from src.primary.utils.logger import get_logger + +# Get logger for the Radarr app +radarr_logger = get_logger("radarr") + +# Use a session for better performance +session = requests.Session() + +def arr_request(api_url: str, api_key: str, api_timeout: int, endpoint: str, method: str = "GET", data: Dict = None) -> Any: + """ + Make a request to the Radarr API. + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + endpoint: The API endpoint to call + method: HTTP method (GET, POST, PUT, DELETE) + data: Optional data to send with the request + + Returns: + The JSON response from the API, or None if the request failed + """ + if not api_url or not api_key: + radarr_logger.error("API URL or API key is missing. Check your settings.") + return None + + # Ensure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + radarr_logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return None + + # Full URL - ensure no double slashes + url = f"{api_url.rstrip('/')}/api/v3/{endpoint.lstrip('/')}" + + # Headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + if method == "GET": + response = session.get(url, headers=headers, timeout=api_timeout) + elif method == "POST": + response = session.post(url, headers=headers, json=data, timeout=api_timeout) + elif method == "PUT": + response = session.put(url, headers=headers, json=data, timeout=api_timeout) + elif method == "DELETE": + response = session.delete(url, headers=headers, timeout=api_timeout) + else: + radarr_logger.error(f"Unsupported HTTP method: {method}") + return None + + # Check for errors + response.raise_for_status() + + # Parse JSON response + if response.text: + return response.json() + return {} + + except requests.exceptions.RequestException as e: + radarr_logger.error(f"API request failed: {e}") + return None + +def get_download_queue_size(api_url: str, api_key: str, api_timeout: int) -> int: + """ + Get the current size of the download queue. + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + The number of items in the download queue, or -1 if the request failed + """ + if not api_url or not api_key: + radarr_logger.error("Radarr API URL or API Key not provided for queue size check.") + return -1 + try: + # Radarr uses /api/v3/queue + endpoint = f"{api_url.rstrip('/')}/api/v3/queue?page=1&pageSize=1000" # Fetch a large page size + headers = {"X-Api-Key": api_key} + response = session.get(endpoint, headers=headers, timeout=api_timeout) + response.raise_for_status() + queue_data = response.json() + queue_size = queue_data.get('totalRecords', 0) + radarr_logger.debug(f"Radarr download queue size: {queue_size}") + return queue_size + except requests.exceptions.RequestException as e: + radarr_logger.error(f"Error getting Radarr download queue size: {e}") + return -1 # Return -1 to indicate an error + except Exception as e: + radarr_logger.error(f"An unexpected error occurred while getting Radarr queue size: {e}") + return -1 + +def get_movies_with_missing(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> Optional[List[Dict]]: + """ + Get a list of movies with missing files (not downloaded/available). + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored movies. + + Returns: + A list of movie objects with missing files, or None if the request failed. + """ + # Use the updated arr_request with passed arguments + movies = arr_request(api_url, api_key, api_timeout, "movie") + if movies is None: # Check for None explicitly, as an empty list is valid + radarr_logger.error("Failed to retrieve movies from Radarr API.") + return None + + missing_movies = [] + for movie in movies: + is_monitored = movie.get("monitored", False) + has_file = movie.get("hasFile", False) + # Apply monitored_only filter if requested + if not has_file and (not monitored_only or is_monitored): + missing_movies.append(movie) + + radarr_logger.debug(f"Found {len(missing_movies)} missing movies (monitored_only={monitored_only}).") + return missing_movies + +def get_cutoff_unmet_movies(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> Optional[List[Dict]]: + """ + Get a list of movies that don't meet their quality profile cutoff. + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored movies. + + Returns: + A list of movie objects that need quality upgrades, or None if the request failed. + """ + # Radarr API endpoint for cutoff unmet movies + # Note: Radarr's /api/v3/movie endpoint doesn't directly support a simple 'cutoffUnmet=true' like Sonarr's wanted/cutoff. + # We need to fetch all movies and filter locally, or use the /api/v3/movie/lookup endpoint if searching by TMDB/IMDB ID. + # Fetching all movies is simpler for now. + radarr_logger.debug("Fetching all movies to determine cutoff unmet status...") + movies = arr_request(api_url, api_key, api_timeout, "movie") + if movies is None: + radarr_logger.error("Failed to retrieve movies from Radarr API for cutoff check.") + return None + + # Need quality profile information to determine cutoff unmet status. + # Fetch quality profiles first. + profiles = arr_request(api_url, api_key, api_timeout, "qualityprofile") + if profiles is None: + radarr_logger.error("Failed to retrieve quality profiles from Radarr API.") + return None + + # Create a map for easy lookup: profile_id -> cutoff_format_score (or cutoff quality ID) + # Radarr profiles have 'cutoff' (quality ID) and potentially 'cutoffFormatScore' + profile_cutoff_map = {p['id']: p.get('cutoff') for p in profiles} + # TODO: Potentially incorporate cutoffFormatScore if needed for more complex logic + + unmet_movies = [] + for movie in movies: + is_monitored = movie.get("monitored", False) + has_file = movie.get("hasFile", False) + profile_id = movie.get("qualityProfileId") + movie_file = movie.get("movieFile") + + # Apply monitored_only filter if requested + if not monitored_only or is_monitored: + if has_file and movie_file and profile_id in profile_cutoff_map: + cutoff_quality_id = profile_cutoff_map[profile_id] + current_quality_id = movie_file.get("quality", {}).get("quality", {}).get("id") + + # Simple check: if current quality ID is less than cutoff quality ID + # This assumes quality IDs are ordered correctly (lower ID = lower quality) + # A more robust check might involve comparing quality *names* or *scores* if IDs aren't reliable order indicators. + if current_quality_id is not None and cutoff_quality_id is not None and current_quality_id < cutoff_quality_id: + # TODO: Add check for cutoffFormatScore if necessary + unmet_movies.append(movie) + # else: # Log why a movie wasn't considered unmet (optional) + # if not has_file: radarr_logger.debug(f"Skipping {movie.get('title')} - no file.") + # elif not movie_file: radarr_logger.debug(f"Skipping {movie.get('title')} - no movieFile info.") + # elif profile_id not in profile_cutoff_map: radarr_logger.debug(f"Skipping {movie.get('title')} - profile ID {profile_id} not found.") + + radarr_logger.debug(f"Found {len(unmet_movies)} cutoff unmet movies (monitored_only={monitored_only}).") + return unmet_movies + +def refresh_movie(api_url: str, api_key: str, api_timeout: int, movie_id: int, + command_wait_delay: int = 1, command_wait_attempts: int = 600) -> Optional[int]: + """ + Refresh a movie in Radarr. + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + movie_id: The ID of the movie to refresh + command_wait_delay: Seconds to wait between command status checks + command_wait_attempts: Maximum number of status check attempts + + Returns: + The command ID if the refresh was triggered successfully, None otherwise + """ + endpoint = "command" + data = { + "name": "RefreshMovie", + "movieIds": [movie_id] + } + + # Use the updated arr_request + response = arr_request(api_url, api_key, api_timeout, endpoint, method="POST", data=data) + if response and 'id' in response: + command_id = response['id'] + radarr_logger.debug(f"Triggered refresh for movie ID {movie_id}. Command ID: {command_id}") + + # Wait for command to complete if requested + if command_wait_delay > 0 and command_wait_attempts > 0: + radarr_logger.debug(f"Waiting for refresh command {command_id} to complete...") + success = wait_for_command(api_url, api_key, api_timeout, command_id, + delay_seconds=command_wait_delay, + max_attempts=command_wait_attempts) + if success: + radarr_logger.debug(f"Refresh command {command_id} completed successfully") + else: + radarr_logger.warning(f"Timed out waiting for refresh command {command_id} to complete") + + return command_id + else: + radarr_logger.error(f"Failed to trigger refresh command for movie ID {movie_id}. Response: {response}") + return None + +def movie_search(api_url: str, api_key: str, api_timeout: int, movie_ids: List[int]) -> Optional[int]: + """ + Trigger a search for one or more movies. + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + movie_ids: A list of movie IDs to search for + + Returns: + The command ID if the search command was triggered successfully, None otherwise + """ + if not movie_ids: + radarr_logger.warning("No movie IDs provided for search.") + return None + + endpoint = "command" + data = { + "name": "MoviesSearch", + "movieIds": movie_ids + } + + # Use the updated arr_request + response = arr_request(api_url, api_key, api_timeout, endpoint, method="POST", data=data) + if response and 'id' in response: + command_id = response['id'] + radarr_logger.debug(f"Triggered search for movie IDs: {movie_ids}. Command ID: {command_id}") + return command_id + else: + radarr_logger.error(f"Failed to trigger search command for movie IDs {movie_ids}. Response: {response}") + return None + +def check_connection(api_url: str, api_key: str, api_timeout: int) -> bool: + """Check the connection to Radarr API.""" + try: + # Ensure api_url is properly formatted + if not api_url: + radarr_logger.error("API URL is empty or not set") + return False + + # Make sure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + radarr_logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return False + + # Ensure URL doesn't end with a slash before adding the endpoint + base_url = api_url.rstrip('/') + full_url = f"{base_url}/api/v3/system/status" + + response = requests.get(full_url, headers={"X-Api-Key": api_key}, timeout=api_timeout) + response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) + radarr_logger.info("Successfully connected to Radarr.") + return True + except requests.exceptions.RequestException as e: + radarr_logger.error(f"Error connecting to Radarr: {e}") + return False + except Exception as e: + radarr_logger.error(f"An unexpected error occurred during Radarr connection check: {e}") + return False + +def wait_for_command(api_url: str, api_key: str, api_timeout: int, command_id: int, + delay_seconds: int = 1, max_attempts: int = 600) -> bool: + """ + Wait for a command to complete. + + Args: + api_url: The base URL of the Radarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + command_id: The ID of the command to wait for + delay_seconds: Seconds to wait between command status checks + max_attempts: Maximum number of status check attempts + + Returns: + True if the command completed successfully, False if timed out + """ + attempts = 0 + while attempts < max_attempts: + response = arr_request(api_url, api_key, api_timeout, f"command/{command_id}") + if response and 'state' in response: + state = response['state'] + if state == "completed": + return True + elif state == "failed": + radarr_logger.error(f"Command {command_id} failed") + return False + time.sleep(delay_seconds) + attempts += 1 + radarr_logger.warning(f"Timed out waiting for command {command_id} to complete") + return False \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/radarr/missing.py b/Huntarr.io-6.3.6/src/primary/apps/radarr/missing.py new file mode 100644 index 0000000..4fb9249 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/radarr/missing.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 +""" +Missing Movies Processing for Radarr +Handles searching for missing movies in Radarr +""" + +import time +import random +import datetime +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.radarr import api as radarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.settings_manager import load_settings, get_advanced_setting + +# Get logger for the app +radarr_logger = get_logger("radarr") + +def process_missing_movies( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process missing movies in Radarr based on provided settings. + + Args: + app_settings: Dictionary containing all settings for Radarr + stop_check: A function that returns True if the process should stop + + Returns: + True if any movies were processed, False otherwise. + """ + processed_any = False + + # Get instance name - check for instance_name first, fall back to legacy "name" key if needed + instance_name = app_settings.get("instance_name", app_settings.get("name", "Radarr Default")) + + # Log important settings + radarr_logger.info("=== Radarr Missing Movies Settings ===") + radarr_logger.info(f"Instance Name: {instance_name}") + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + monitored_only = app_settings.get("monitored_only", True) + skip_future_releases = app_settings.get("skip_future_releases", True) + skip_movie_refresh = app_settings.get("skip_movie_refresh", False) + hunt_missing_movies = app_settings.get("hunt_missing_movies", 0) + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + release_type = app_settings.get("release_type", "physical") + + radarr_logger.info(f"Hunt Missing Movies: {hunt_missing_movies}") + radarr_logger.info(f"Monitored Only: {monitored_only}") + radarr_logger.info(f"Skip Future Releases: {skip_future_releases}") + radarr_logger.info(f"Skip Movie Refresh: {skip_movie_refresh}") + radarr_logger.info(f"Release Type for Future Status: {release_type}") + + release_type_field = 'physicalRelease' + if release_type == 'digital': + release_type_field = 'digitalRelease' + elif release_type == 'cinema': + release_type_field = 'inCinemas' + + radarr_logger.info(f"Using {release_type_field} date to determine future releases") + radarr_logger.info("=======================================") + + radarr_logger.info("Starting missing movies processing cycle for Radarr.") + + if not api_url or not api_key: + radarr_logger.error("API URL or Key not configured in settings. Cannot process missing movies.") + return False + + # Skip if hunt_missing_movies is set to 0 + if hunt_missing_movies <= 0: + radarr_logger.info("'hunt_missing_movies' setting is 0 or less. Skipping missing movie processing.") + return False + + # Check for stop signal + if stop_check(): + radarr_logger.info("Stop requested before starting missing movies. Aborting...") + return False + + # Get missing movies + radarr_logger.info("Retrieving movies with missing files...") + missing_movies = radarr_api.get_movies_with_missing(api_url, api_key, api_timeout, monitored_only) + + if missing_movies is None: # API call failed + radarr_logger.error("Failed to retrieve missing movies from Radarr API.") + return False + + if not missing_movies: + radarr_logger.info("No missing movies found.") + return False + + # Check for stop signal after retrieving movies + if stop_check(): + radarr_logger.info("Stop requested after retrieving missing movies. Aborting...") + return False + + radarr_logger.info(f"Found {len(missing_movies)} movies with missing files.") + + # Filter out future releases if configured + if skip_future_releases: + now = datetime.datetime.now(datetime.timezone.utc) + original_count = len(missing_movies) + + missing_movies = [ + movie for movie in missing_movies + if movie.get(release_type_field) and datetime.datetime.fromisoformat(movie[release_type_field].replace('Z', '+00:00')) < now + ] + skipped_count = original_count - len(missing_movies) + if skipped_count > 0: + radarr_logger.info(f"Skipped {skipped_count} future movie releases based on {release_type} release date.") + + if not missing_movies: + radarr_logger.info("No missing movies left to process after filtering future releases.") + return False + + movies_processed = 0 + processing_done = False + + # Filter out already processed movies using stateful management + unprocessed_movies = [] + for movie in missing_movies: + movie_id = str(movie.get("id")) + if not is_processed("radarr", instance_name, movie_id): + unprocessed_movies.append(movie) + else: + radarr_logger.debug(f"Skipping already processed movie ID: {movie_id}") + + radarr_logger.info(f"Found {len(unprocessed_movies)} unprocessed missing movies out of {len(missing_movies)} total.") + + if not unprocessed_movies: + radarr_logger.info("No unprocessed missing movies found. All available movies have been processed.") + return False + + # Always use random selection for missing movies + radarr_logger.info(f"Using random selection for missing movies") + if len(unprocessed_movies) > hunt_missing_movies: + movies_to_process = random.sample(unprocessed_movies, hunt_missing_movies) + else: + movies_to_process = unprocessed_movies + + radarr_logger.info(f"Selected {len(movies_to_process)} movies to process.") + + # Add detailed logging for selected movies + if movies_to_process: + radarr_logger.info(f"Movies selected for processing in this cycle:") + for idx, movie in enumerate(movies_to_process): + movie_id = movie.get("id") + movie_title = movie.get("title", "Unknown Title") + year = movie.get("year", "Unknown Year") + radarr_logger.info(f" {idx+1}. {movie_title} ({year}) - ID: {movie_id}") + + # Process each movie + for movie in movies_to_process: + if stop_check(): + radarr_logger.info("Stop requested during processing. Aborting...") + break + + movie_id = movie.get("id") + movie_title = movie.get("title", "Unknown Title") + + # Optional: Refresh the movie before searching + if not skip_movie_refresh: + radarr_logger.info(f"Refreshing movie metadata for '{movie_title}' (ID: {movie_id})...") + refresh_success = radarr_api.refresh_movie(api_url, api_key, api_timeout, movie_id, command_wait_delay, command_wait_attempts) + + if not refresh_success: + radarr_logger.warning(f"Failed to refresh movie metadata for '{movie_title}'. Continuing anyway...") + + # Search for the movie + radarr_logger.info(f"Searching for movie '{movie_title}' (ID: {movie_id})...") + search_success = radarr_api.movie_search(api_url, api_key, api_timeout, [movie_id]) + + if search_success: + radarr_logger.info(f"Successfully triggered search for movie '{movie_title}'") + # Immediately add to processed IDs to prevent duplicate processing + success = add_processed_id("radarr", instance_name, str(movie_id)) + radarr_logger.debug(f"Added processed ID: {movie_id}, success: {success}") + + # Log to history system + year = movie.get("year", "Unknown Year") + media_name = f"{movie_title} ({year})" + log_processed_media("radarr", media_name, movie_id, instance_name, "missing") + radarr_logger.debug(f"Logged history entry for movie: {media_name}") + + increment_stat("radarr", "hunted") + movies_processed += 1 + processed_any = True + else: + radarr_logger.warning(f"Failed to trigger search for movie '{movie_title}'") + + radarr_logger.info(f"Finished processing missing movies. Processed {movies_processed} of {len(movies_to_process)} selected movies.") + return processed_any \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/radarr/upgrade.py b/Huntarr.io-6.3.6/src/primary/apps/radarr/upgrade.py new file mode 100644 index 0000000..2980276 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/radarr/upgrade.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +""" +Quality Upgrade Processing for Radarr +Handles searching for movies that need quality upgrades in Radarr +""" + +import time +import random +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.radarr import api as radarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.settings_manager import get_advanced_setting + +# Get logger for the app +radarr_logger = get_logger("radarr") + +def process_cutoff_upgrades( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process quality cutoff upgrades for Radarr based on settings. + + Args: + app_settings: Dictionary containing all settings for Radarr + stop_check: A function that returns True if the process should stop + + Returns: + True if any movies were processed for upgrades, False otherwise. + """ + radarr_logger.info("Starting quality cutoff upgrades processing cycle for Radarr.") + processed_any = False + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + monitored_only = app_settings.get("monitored_only", True) + skip_movie_refresh = app_settings.get("skip_movie_refresh", False) + hunt_upgrade_movies = app_settings.get("hunt_upgrade_movies", 0) + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + # Get instance name - check for instance_name first, fall back to legacy "name" key if needed + instance_name = app_settings.get("instance_name", app_settings.get("name", "Radarr Default")) + + # Get movies eligible for upgrade + radarr_logger.info("Retrieving movies eligible for cutoff upgrade...") + upgrade_eligible_data = radarr_api.get_cutoff_unmet_movies(api_url, api_key, api_timeout, monitored_only) + + if not upgrade_eligible_data: + radarr_logger.info("No movies found eligible for upgrade or error retrieving them.") + return False + + radarr_logger.info(f"Found {len(upgrade_eligible_data)} movies eligible for upgrade.") + + # Filter out already processed movies using stateful management + unprocessed_movies = [] + for movie in upgrade_eligible_data: + movie_id = str(movie.get("id")) + if not is_processed("radarr", instance_name, movie_id): + unprocessed_movies.append(movie) + else: + radarr_logger.debug(f"Skipping already processed movie ID: {movie_id}") + + radarr_logger.info(f"Found {len(unprocessed_movies)} unprocessed movies for upgrade out of {len(upgrade_eligible_data)} total.") + + if not unprocessed_movies: + radarr_logger.info("No upgradeable movies found to process (after filtering already processed). Skipping.") + return False + + radarr_logger.info(f"Randomly selecting up to {hunt_upgrade_movies} movies for upgrade search.") + movies_to_process = random.sample(unprocessed_movies, min(hunt_upgrade_movies, len(unprocessed_movies))) + + radarr_logger.info(f"Selected {len(movies_to_process)} movies to search for upgrades.") + processed_count = 0 + processed_something = False + + for movie in movies_to_process: + if stop_check(): + radarr_logger.info("Stop signal received, aborting Radarr upgrade cycle.") + break + + movie_id = movie.get("id") + movie_title = movie.get("title") + movie_year = movie.get("year") + + radarr_logger.info(f"Processing upgrade for movie: \"{movie_title}\" ({movie_year}) (Movie ID: {movie_id})") + + # Refresh movie (optional) + if not skip_movie_refresh: + radarr_logger.info(f" - Refreshing movie info...") + refresh_result = radarr_api.refresh_movie(api_url, api_key, api_timeout, movie_id) + if not refresh_result: + radarr_logger.warning(f" - Failed to trigger movie refresh. Continuing search anyway.") + else: + radarr_logger.debug(f" - Skipping movie refresh (skip_movie_refresh=true)") + + # Search for cutoff upgrade + radarr_logger.info(f" - Searching for quality upgrade...") + search_result = radarr_api.movie_search(api_url, api_key, api_timeout, [movie_id]) + + if search_result: + radarr_logger.info(f" - Successfully triggered search for quality upgrade.") + add_processed_id("radarr", instance_name, str(movie_id)) + increment_stat("radarr", "upgraded") + + # Log to history so the upgrade appears in the history UI + media_name = f"{movie_title} ({movie_year})" + log_processed_media("radarr", media_name, movie_id, instance_name, "upgrade") + radarr_logger.debug(f"Logged quality upgrade to history for movie ID {movie_id}") + + processed_count += 1 + processed_something = True + else: + radarr_logger.warning(f" - Failed to trigger search for quality upgrade.") + + # Log final status + radarr_logger.info(f"Completed processing {processed_count} movies for quality upgrades.") + + return processed_something \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/radarr_routes.py b/Huntarr.io-6.3.6/src/primary/apps/radarr_routes.py new file mode 100644 index 0000000..eb6caf6 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/radarr_routes.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path, reset_state_file +from src.primary.utils.logger import get_logger +import traceback +import socket +from urllib.parse import urlparse + +radarr_bp = Blueprint('radarr', __name__) +radarr_logger = get_logger("radarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("radarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("radarr", "processed_upgrades") + +@radarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Radarr API instance""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + radarr_logger.info(f"Testing connection to Radarr API at {api_url}") + + # Validate URL format + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Try to establish a socket connection first to check basic connectivity + parsed_url = urlparse(api_url) + hostname = parsed_url.hostname + port = parsed_url.port or (443 if parsed_url.scheme == 'https' else 80) + + try: + # Try socket connection for quick feedback on connectivity issues + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) # Short timeout for quick feedback + result = sock.connect_ex((hostname, port)) + sock.close() + + if result != 0: + error_msg = f"Connection refused - Unable to connect to {hostname}:{port}. Please check if the server is running and the port is correct." + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except socket.gaierror: + error_msg = f"DNS resolution failed - Cannot resolve hostname: {hostname}. Please check your URL." + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except Exception as e: + # Log the socket testing error but continue with the full request + radarr_logger.debug(f"Socket test error, continuing with full request: {str(e)}") + + # For Radarr, use api/v3 + url = f"{api_url.rstrip('/')}/api/v3/system/status" + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + response = requests.get(url, headers=headers, timeout=(10, api_timeout)) + + # For HTTP errors, provide more specific feedback + if response.status_code == 401: + error_msg = "Authentication failed: Invalid API key" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 401 + elif response.status_code == 403: + error_msg = "Access forbidden: Check API key permissions" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 403 + elif response.status_code == 404: + error_msg = "API endpoint not found: This doesn't appear to be a valid Radarr server. Check your URL." + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + elif response.status_code >= 500: + error_msg = f"Radarr server error (HTTP {response.status_code}): The Radarr server is experiencing issues" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), response.status_code + + # Raise for other HTTP errors + response.raise_for_status() + + try: + response_data = response.json() + version = response_data.get('version', 'unknown') + radarr_logger.info(f"Successfully connected to Radarr API version: {version}") + + return jsonify({ + "success": True, + "message": "Successfully connected to Radarr API", + "version": version + }) + except ValueError: + error_msg = "Invalid JSON response from Radarr API - This doesn't appear to be a valid Radarr server" + radarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.ConnectionError as e: + # Handle different types of connection errors + error_details = str(e) + if "Connection refused" in error_details: + error_msg = f"Connection refused - Radarr is not running on {api_url} or the port is incorrect" + elif "Name or service not known" in error_details or "getaddrinfo failed" in error_details: + error_msg = f"DNS resolution failed - Cannot find host '{urlparse(api_url).hostname}'. Check your URL." + else: + error_msg = f"Connection error - Check if Radarr is running: {error_details}" + + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except requests.exceptions.Timeout: + error_msg = f"Connection timed out - Radarr took too long to respond" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 504 + except requests.exceptions.RequestException as e: + error_msg = f"Connection test failed: {str(e)}" + radarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 diff --git a/Huntarr.io-6.3.6/src/primary/apps/readarr.py b/Huntarr.io-6.3.6/src/primary/apps/readarr.py new file mode 100644 index 0000000..2cb866e --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/readarr.py @@ -0,0 +1,179 @@ +from flask import Blueprint, request, jsonify +import datetime, os, requests +from primary import keys_manager +from src.primary.utils.logger import get_logger +from src.primary.state import get_state_file_path +from src.primary.settings_manager import load_settings + +readarr_bp = Blueprint('readarr', __name__) +readarr_logger = get_logger("readarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("readarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("readarr", "processed_upgrades") + +@readarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Readarr API instance with comprehensive diagnostics""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Log the test attempt + readarr_logger.info(f"Testing connection to Readarr API at {api_url}") + + # First check if URL is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # For Readarr, use api/v1 + api_base = "api/v1" + test_url = f"{api_url.rstrip('/')}/{api_base}/system/status" + headers = {'X-Api-Key': api_key} + + try: + # Use a connection timeout separate from read timeout + response = requests.get(test_url, headers=headers, timeout=(10, api_timeout)) + + # Log HTTP status code for diagnostic purposes + readarr_logger.debug(f"Readarr API status code: {response.status_code}") + + # Check HTTP status code + response.raise_for_status() + + # Ensure the response is valid JSON + try: + response_data = response.json() + + # We no longer save keys here since we use instances + # keys_manager.save_api_keys("readarr", api_url, api_key) + + readarr_logger.info(f"Successfully connected to Readarr API version: {response_data.get('version', 'unknown')}") + + # Return success with some useful information + return jsonify({ + "success": True, + "message": "Successfully connected to Readarr API", + "version": response_data.get('version', 'unknown') + }) + except ValueError: + error_msg = "Invalid JSON response from Readarr API" + readarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.Timeout as e: + error_msg = f"Connection timed out after {api_timeout} seconds" + readarr_logger.error(f"{error_msg}: {str(e)}") + return jsonify({"success": False, "message": error_msg}), 504 + + except requests.exceptions.ConnectionError as e: + error_msg = "Connection error - check hostname and port" + details = str(e) + # Check for common DNS resolution errors + if "Name or service not known" in details or "getaddrinfo failed" in details: + error_msg = "DNS resolution failed - check hostname" + # Check for common connection refused errors + elif "Connection refused" in details: + error_msg = "Connection refused - check if Readarr is running and the port is correct" + + readarr_logger.error(f"{error_msg}: {details}") + return jsonify({"success": False, "message": f"{error_msg}: {details}"}), 502 + + except requests.exceptions.RequestException as e: + error_message = f"Connection failed: {str(e)}" + + if hasattr(e, 'response') and e.response is not None: + status_code = e.response.status_code + + # Add specific messages based on common status codes + if status_code == 401: + error_message = "Authentication failed: Invalid API key" + elif status_code == 403: + error_message = "Access forbidden: Check API key permissions" + elif status_code == 404: + error_message = "API endpoint not found: Check API URL" + elif status_code >= 500: + error_message = f"Readarr server error (HTTP {status_code}): The Readarr server is experiencing issues" + + # Try to extract more error details if available + try: + error_details = e.response.json() + error_message += f" - {error_details.get('message', 'No details')}" + except ValueError: + if e.response.text: + error_message += f" - Response: {e.response.text[:200]}" + + readarr_logger.error(error_message) + return jsonify({"success": False, "message": error_message}), 500 + + except Exception as e: + error_msg = f"An unexpected error occurred: {str(e)}" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 + +# Function to check if Readarr is configured +def is_configured(): + """Check if Readarr API credentials are configured by checking if at least one instance is enabled""" + settings = load_settings("readarr") + + if not settings: + readarr_logger.debug("No settings found for Readarr") + return False + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + readarr_logger.debug(f"Found configured Readarr instance: {instance.get('name', 'Unnamed')}") + return True + + readarr_logger.debug("No enabled Readarr instances found with valid API URL and key") + return False + + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + return bool(api_url and api_key) + +# Get all valid instances from settings +def get_configured_instances(): + """Get all configured and enabled Readarr instances""" + settings = load_settings("readarr") + instances = [] + + if not settings: + readarr_logger.debug("No settings found for Readarr") + return instances + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + # Create a settings object for this instance by combining global settings with instance-specific ones + instance_settings = settings.copy() + # Remove instances list to avoid confusion + if "instances" in instance_settings: + del instance_settings["instances"] + + # Override with instance-specific connection settings + instance_settings["api_url"] = instance.get("api_url") + instance_settings["api_key"] = instance.get("api_key") + instance_settings["instance_name"] = instance.get("name", "Default") + + instances.append(instance_settings) + else: + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + if api_url and api_key: + settings["instance_name"] = "Default" + instances.append(settings) + + readarr_logger.info(f"Found {len(instances)} configured and enabled Readarr instances") + return instances diff --git a/Huntarr.io-6.3.6/src/primary/apps/readarr/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/readarr/__init__.py new file mode 100644 index 0000000..7a2516a --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/readarr/__init__.py @@ -0,0 +1,91 @@ +""" +Readarr module initialization +""" + +# Use src.primary imports +from src.primary.apps.readarr.missing import process_missing_books +from src.primary.apps.readarr.upgrade import process_cutoff_upgrades +# Add necessary imports +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +# Define logger for this module +readarr_logger = get_logger("readarr") + +def get_configured_instances(): + """Get all configured and enabled Readarr instances""" + settings = load_settings("readarr") + instances = [] + # readarr_logger.info(f"Loaded Readarr settings for instance check: {settings}") # Removed verbose log + + if not settings: + readarr_logger.debug("No settings found for Readarr") + return instances + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + # readarr_logger.info(f"Found 'instances' list with {len(settings['instances'])} items. Processing...") # Removed verbose log + for idx, instance in enumerate(settings["instances"]): + readarr_logger.debug(f"Checking instance #{idx}: {instance}") + # Enhanced validation + api_url = instance.get("api_url", "").strip() + api_key = instance.get("api_key", "").strip() + + # Enhanced URL validation - ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + readarr_logger.warning(f"Instance '{instance.get('name', 'Unnamed')}' has URL without http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + readarr_logger.warning(f"Auto-correcting URL to: {api_url}") + + is_enabled = instance.get("enabled", True) + + # Only include properly configured instances + if is_enabled and api_url and api_key: + # Return only essential instance details + instance_data = { + "instance_name": instance.get("name", "Default"), + "api_url": api_url, + "api_key": api_key, + } + instances.append(instance_data) + # readarr_logger.info(f"Added valid instance: {instance_data}") # Removed verbose log + elif not is_enabled: + readarr_logger.debug(f"Skipping disabled instance: {instance.get('name', 'Unnamed')}") + else: + # For brand new installations, don't spam logs with warnings about default instances + instance_name = instance.get('name', 'Unnamed') + if instance_name == 'Default': + # Use debug level for default instances to avoid log spam on new installations + readarr_logger.debug(f"Skipping instance '{instance_name}' due to missing API URL or key (URL: '{api_url}', Key Set: {bool(api_key)})") + else: + # Still log warnings for non-default instances + readarr_logger.warning(f"Skipping instance '{instance_name}' due to missing API URL or key (URL: '{api_url}', Key Set: {bool(api_key)})") + else: + # readarr_logger.info("No 'instances' list found or list is empty. Checking legacy config.") # Removed verbose log + # Fallback to legacy single-instance config + api_url = settings.get("api_url", "").strip() + api_key = settings.get("api_key", "").strip() + + # Ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + readarr_logger.warning(f"API URL missing http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + readarr_logger.warning(f"Auto-correcting URL to: {api_url}") + + if api_url and api_key: + # Create a clean instance_data dict for the legacy instance + instance_data = { + "instance_name": "Default", + "api_url": api_url, + "api_key": api_key, + } + instances.append(instance_data) + # readarr_logger.info(f"Added valid legacy instance: {instance_data}") # Removed verbose log + else: + readarr_logger.warning("No API URL or key found in legacy configuration") + + # Use debug level to avoid spamming logs, especially with 0 instances + readarr_logger.debug(f"Found {len(instances)} configured and enabled Readarr instances") + return instances + +__all__ = ["process_missing_books", "process_cutoff_upgrades", "get_configured_instances"] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/readarr/api.py b/Huntarr.io-6.3.6/src/primary/apps/readarr/api.py new file mode 100644 index 0000000..6137893 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/readarr/api.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python3 +""" +Readarr-specific API functions +Handles all communication with the Readarr API +""" + +import requests +import json +import time +import datetime +from typing import List, Dict, Any, Optional, Union +# Correct the import path +from src.primary.utils.logger import get_logger +# Import load_settings +from src.primary.settings_manager import load_settings + +# Get app-specific logger +logger = get_logger("readarr") + +# Use a session for better performance +session = requests.Session() + +# Default API timeout in seconds - used as fallback only +API_TIMEOUT = 30 + +def check_connection(api_url: str, api_key: str, api_timeout: int) -> bool: + """Check the connection to Readarr API.""" + try: + # Ensure api_url is properly formatted + if not api_url: + logger.error("API URL is empty or not set") + return False + + # Make sure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return False + + # Ensure URL doesn't end with a slash before adding the endpoint + base_url = api_url.rstrip('/') + full_url = f"{base_url}/api/v1/system/status" + + response = requests.get(full_url, headers={"X-Api-Key": api_key}, timeout=api_timeout) + response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) + logger.info("Successfully connected to Readarr.") + return True + except requests.exceptions.RequestException as e: + logger.error(f"Error connecting to Readarr: {e}") + return False + except Exception as e: + logger.error(f"An unexpected error occurred during Readarr connection check: {e}") + return False + +def get_download_queue_size(api_url: str = None, api_key: str = None, timeout: int = 30) -> int: + """ + Get the current size of the download queue. + + Args: + api_url: Optional API URL (if not provided, will be fetched from settings) + api_key: Optional API key (if not provided, will be fetched from settings) + timeout: Timeout in seconds for the request + + Returns: + The number of items in the download queue, or 0 if the request failed + """ + try: + # If API URL and key are provided, use them directly + if api_url and api_key: + # Clean up API URL + api_url = api_url.rstrip('/') + url = f"{api_url}/api/v1/queue" + + # Headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + # Make the request + response = session.get(url, headers=headers, timeout=timeout) + response.raise_for_status() + + # Parse JSON response + data = response.json() + if "totalRecords" in data: + return data["totalRecords"] + return 0 + else: + # Use the arr_request function if API URL and key aren't provided + response = arr_request("queue") + if response and "totalRecords" in response: + return response["totalRecords"] + return 0 + except Exception as e: + logger.error(f"Error getting download queue size: {e}") + return 0 + +def arr_request(endpoint: str, method: str = "GET", data: Dict = None, app_type: str = "readarr", + api_url: Optional[str] = None, api_key: Optional[str] = None, api_timeout: Optional[int] = None) -> Any: + """ + Make a request to the Readarr API. + Now accepts optional api_url, api_key, and api_timeout. + + Args: + endpoint: The API endpoint to call + method: HTTP method (GET, POST, PUT, DELETE) + data: Optional data to send with the request + app_type: The app type (readarr by default) + api_url: Optional API URL (overrides loaded settings) + api_key: Optional API key (overrides loaded settings) + api_timeout: Optional API timeout (overrides loaded settings) + + Returns: + The JSON response from the API, or None if the request failed + """ + # Load settings only if credentials are not provided directly + if api_url is None or api_key is None or api_timeout is None: + settings = load_settings(app_type) + loaded_api_url = settings.get('api_url', '') + loaded_api_key = settings.get('api_key', '') + loaded_api_timeout = settings.get('api_timeout', 60) + + # Use provided args if available, otherwise use loaded settings + api_url = api_url if api_url is not None else loaded_api_url + api_key = api_key if api_key is not None else loaded_api_key + api_timeout = api_timeout if api_timeout is not None else loaded_api_timeout + + if not api_url or not api_key: + logger.error("API URL or API key is missing. Check your settings.") + return None + + # Ensure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return None + + # Determine the API version + api_base = "api/v1" # Readarr uses v1 + + # Full URL + url = f"{api_url.rstrip('/')}/{api_base}/{endpoint.lstrip('/')}" + + # Headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + if method == "GET": + response = session.get(url, headers=headers, timeout=api_timeout) + elif method == "POST": + response = session.post(url, headers=headers, json=data, timeout=api_timeout) + elif method == "PUT": + response = session.put(url, headers=headers, json=data, timeout=api_timeout) + elif method == "DELETE": + response = session.delete(url, headers=headers, timeout=api_timeout) + else: + logger.error(f"Unsupported HTTP method: {method}") + return None + + # Check for errors + response.raise_for_status() + + # Parse JSON response + if response.text: + return response.json() + return {} + + except requests.exceptions.RequestException as e: + logger.error(f"API request failed: {e}") + return None + +def get_books_with_missing_files() -> List[Dict]: + """ + Get a list of books with missing files (not downloaded/available). + + Returns: + A list of book objects with missing files + """ + # First, get all books + books = arr_request("book") + if not books: + return [] + + # Filter for books with missing files + missing_books = [] + for book in books: + # Check if book is monitored and doesn't have a file + if book.get("monitored", False) and not book.get("bookFile", None): + missing_books.append(book) + + return missing_books + +def get_cutoff_unmet_books(api_url: Optional[str] = None, api_key: Optional[str] = None, api_timeout: Optional[int] = None) -> List[Dict]: + """ + Get a list of books that don't meet their quality profile cutoff. + Accepts optional API credentials. + + Args: + api_url: Optional API URL + api_key: Optional API key + api_timeout: Optional API timeout + + Returns: + A list of book objects that need quality upgrades + """ + # The cutoffUnmet endpoint in Readarr + params = "cutoffUnmet=true" + # Pass credentials to arr_request + books = arr_request(f"wanted/cutoff?{params}", api_url=api_url, api_key=api_key, api_timeout=api_timeout) + if not books or "records" not in books: + return [] + + return books.get("records", []) + +def get_wanted_missing_books(api_url: str, api_key: str, api_timeout: int, monitored_only: bool = True) -> List[Dict]: + """ + Get wanted/missing books from Readarr, handling pagination. + + Args: + api_url: The base URL of the Readarr API. + api_key: The API key for authentication. + api_timeout: Timeout for the API request. + monitored_only: If True, only return monitored books (Readarr API default seems to handle this). + + Returns: + A list of dictionaries, each representing a missing book, or an empty list on error. + """ + all_missing_books = [] + page = 1 + page_size = 100 # Adjust as needed, check Readarr API limits + endpoint = "wanted/missing" + + # Ensure api_url is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + logger.error(f"Invalid URL format: {api_url}") + return [] + base_url = api_url.rstrip('/') + url = f"{base_url}/api/v1/{endpoint.lstrip('/')}" + headers = {"X-Api-Key": api_key} + + while True: + params = { + 'page': page, + 'pageSize': page_size, + # Removed sorting parameters due to potential API issues + # 'sortKey': 'author.sortName', + # 'sortDirection': 'ascending', + # 'monitored': monitored_only # Note: Check if Readarr API supports this directly for wanted/missing + } + try: + response = requests.get(url, headers=headers, params=params, timeout=api_timeout) + response.raise_for_status() + data = response.json() + + if not data or 'records' not in data or not data['records']: + break # No more data or unexpected format + + all_missing_books.extend(data['records']) + + total_records = data.get('totalRecords', 0) + if len(all_missing_books) >= total_records: + break # We have fetched all records + + page += 1 + + except requests.exceptions.RequestException as e: + logger.error(f"Error fetching missing books (page {page}) from {url}: {e}") + return [] # Return empty list on error + except json.JSONDecodeError: + logger.error(f"Error decoding JSON response from {url} (page {page}). Response: {response.text[:200]}") + return [] + except Exception as e: + logger.error(f"Unexpected error fetching missing books (page {page}): {e}", exc_info=True) + return [] + + logger.info(f"Successfully fetched {len(all_missing_books)} missing books from Readarr.") + return all_missing_books + +def refresh_author(author_id: int, api_url: Optional[str] = None, api_key: Optional[str] = None, api_timeout: Optional[int] = None) -> bool: + """ + Refresh an author in Readarr. + Accepts optional API credentials. + + Args: + author_id: The ID of the author to refresh + api_url: Optional API URL + api_key: Optional API key + api_timeout: Optional API timeout + + Returns: + True if the refresh was successful, False otherwise + """ + endpoint = f"command" + data = { + "name": "RefreshAuthor", + "authorId": author_id + } + + # Pass credentials to arr_request + response = arr_request(endpoint, method="POST", data=data, api_url=api_url, api_key=api_key, api_timeout=api_timeout) + if response: + logger.debug(f"Refreshed author ID {author_id}") + return True + return False + +def book_search(book_ids: List[int], api_url: Optional[str] = None, api_key: Optional[str] = None, api_timeout: Optional[int] = None) -> bool: + """ + Trigger a search for one or more books. + Accepts optional API credentials. + + Args: + book_ids: A list of book IDs to search for + api_url: Optional API URL + api_key: Optional API key + api_timeout: Optional API timeout + + Returns: + True if the search command was successful, False otherwise + """ + endpoint = "command" + data = { + "name": "BookSearch", + "bookIds": book_ids + } + + # Pass credentials to arr_request + response = arr_request(endpoint, method="POST", data=data, api_url=api_url, api_key=api_key, api_timeout=api_timeout) + # Return the response object (contains command ID) instead of just True/False + # The calling function expects the command object now. + return response + +def get_author_details(api_url: str, api_key: str, author_id: int, api_timeout: int = 120) -> Optional[Dict]: + """Fetches details for a specific author from the Readarr API.""" + endpoint = f"{api_url}/api/v1/author/{author_id}" + headers = {'X-Api-Key': api_key} + try: + response = requests.get(endpoint, headers=headers, timeout=api_timeout) + response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx) + author_data = response.json() + logger.debug(f"Successfully fetched details for author ID {author_id}.") + return author_data + except requests.exceptions.RequestException as e: + logger.error(f"Error fetching author details for ID {author_id} from {endpoint}: {e}") + return None + except Exception as e: + logger.error(f"An unexpected error occurred fetching author details for ID {author_id}: {e}") + return None + +def search_books(api_url: str, api_key: str, book_ids: List[int], api_timeout: int = 120) -> Optional[Dict]: + """Triggers a search for specific book IDs in Readarr.""" + endpoint = f"{api_url}/api/v1/command" # This uses the full URL, not arr_request + headers = {'X-Api-Key': api_key} + payload = { + 'name': 'BookSearch', + 'bookIds': book_ids + } + try: + # This uses requests.post directly, not arr_request. It's already correct. + response = requests.post(endpoint, headers=headers, json=payload, timeout=api_timeout) + response.raise_for_status() + command_data = response.json() + command_id = command_data.get('id') + logger.info(f"Successfully triggered BookSearch command for book IDs: {book_ids}. Command ID: {command_id}") + return command_data # Return the full command object which includes the ID + except requests.exceptions.RequestException as e: + logger.error(f"Error triggering BookSearch command for book IDs {book_ids} via {endpoint}: {e}") + return None + except Exception as e: + logger.error(f"An unexpected error occurred triggering BookSearch for book IDs {book_ids}: {e}") + return None \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/readarr/missing.py b/Huntarr.io-6.3.6/src/primary/apps/readarr/missing.py new file mode 100644 index 0000000..f927147 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/readarr/missing.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +""" +Missing Books Processing for Readarr +Handles searching for missing books in Readarr +""" + +import time +import random +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.readarr import api as readarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.state import check_state_reset + +# Get logger for the app +readarr_logger = get_logger("readarr") + +def process_missing_books( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process missing books in Readarr based on provided settings. + + Args: + app_settings: Dictionary containing all settings for Readarr + stop_check: A function that returns True if the process should stop + + Returns: + True if any books were processed, False otherwise. + """ + readarr_logger.info("Starting missing books processing cycle for Readarr.") + processed_any = False + + # Reset state files if enough time has passed + check_state_reset("readarr") + + # Get the settings for the instance + general_settings = readarr_api.load_settings('general') + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + instance_name = app_settings.get("instance_name", "Readarr Default") + + readarr_logger.info(f"Using API timeout of {api_timeout} seconds for Readarr") + + monitored_only = app_settings.get("monitored_only", True) + skip_future_releases = app_settings.get("skip_future_releases", True) + skip_author_refresh = app_settings.get("skip_author_refresh", False) + hunt_missing_books = app_settings.get("hunt_missing_books", 0) + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + # Get missing books + readarr_logger.info("Retrieving wanted/missing books...") + readarr_logger.info("Retrieving wanted/missing books...") + + # Call the correct function to get missing books + missing_books_data = readarr_api.get_wanted_missing_books(api_url, api_key, api_timeout, monitored_only) + + if missing_books_data is None: # Check if None was returned due to an API error + readarr_logger.error(f"Failed to retrieve missing books data. Skipping processing.") + return False + + readarr_logger.info(f"Found {len(missing_books_data)} missing books.") + + # Group by author ID (optional) + books_by_author = {} + for book in missing_books_data: + author_id = book.get("authorId") + if author_id: + if author_id not in books_by_author: + books_by_author[author_id] = [] + books_by_author[author_id].append(book) + + author_ids = list(books_by_author.keys()) + + # Filter out already processed authors using stateful management + unprocessed_authors = [] + for author_id in author_ids: + if not is_processed("readarr", instance_name, str(author_id)): + unprocessed_authors.append(author_id) + else: + readarr_logger.debug(f"Skipping already processed author ID: {author_id}") + + readarr_logger.info(f"Found {len(unprocessed_authors)} unprocessed authors out of {len(author_ids)} total authors with missing books.") + + if not unprocessed_authors: + readarr_logger.info(f"No unprocessed authors found for {instance_name}. All available authors have been processed.") + return False + + # Always randomly select authors/books to process + readarr_logger.info(f"Randomly selecting up to {hunt_missing_books} authors with missing books.") + authors_to_process = random.sample(unprocessed_authors, min(hunt_missing_books, len(unprocessed_authors))) + + readarr_logger.info(f"Selected {len(authors_to_process)} authors to search for missing books.") + processed_count = 0 + processed_something = False + processed_authors = [] # Track author names processed + + for author_id in authors_to_process: + if stop_check(): + readarr_logger.info("Stop signal received, aborting Readarr missing cycle.") + break + + author_info = readarr_api.get_author_details(api_url, api_key, author_id, api_timeout) # Assuming this exists + author_name = author_info.get("authorName", f"Author ID {author_id}") if author_info else f"Author ID {author_id}" + + readarr_logger.info(f"Processing missing books for author: \"{author_name}\" (Author ID: {author_id})") + + # Refresh author (optional) + if not skip_author_refresh: + readarr_logger.info(f" - Refreshing author info...") + refresh_result = readarr_api.refresh_author(author_id, api_url, api_key, api_timeout) + time.sleep(5) # Basic wait + if not refresh_result: + readarr_logger.warning(f" - Failed to trigger author refresh. Continuing search anyway.") + else: + readarr_logger.info(f" - Skipping author refresh (skip_author_refresh=true)") + + # Search for missing books associated with the author + readarr_logger.info(f" - Searching for missing books...") + book_ids_for_author = [book['id'] for book in books_by_author[author_id]] # 'id' is bookId + + # Create detailed log with book titles + book_details = [] + for book in books_by_author[author_id]: + book_title = book.get('title', f"Book ID {book['id']}") + book_details.append(f"'{book_title}' (ID: {book['id']})") + + # Construct detailed log message + details_string = ', '.join(book_details) + log_message = f"Triggering Book Search for {len(book_details)} books by author '{author_name}': [{details_string}]" + readarr_logger.debug(log_message) # Changed level from INFO to DEBUG + + # Mark author as processed BEFORE triggering any searches + add_processed_id("readarr", instance_name, str(author_id)) + readarr_logger.debug(f"Added author ID {author_id} to processed list for {instance_name}") + + # Now trigger the search + search_command_result = readarr_api.search_books(api_url, api_key, book_ids_for_author, api_timeout) + + if search_command_result: + # Extract command ID if the result is a dictionary, otherwise use the result directly + command_id = search_command_result.get('id') if isinstance(search_command_result, dict) else search_command_result + readarr_logger.info(f"Triggered book search command {command_id} for author {author_name}. Assuming success for now.") # Log only command ID + increment_stat("readarr", "hunted") + + # Log to history system + log_processed_media("readarr", author_name, author_id, instance_name, "missing") + readarr_logger.debug(f"Logged history entry for author: {author_name}") + + processed_count += 1 # Count processed authors/groups + processed_authors.append(author_name) # Add to list of processed authors + processed_something = True + readarr_logger.info(f"Processed {processed_count}/{len(authors_to_process)} authors/groups for missing books this cycle.") + else: + readarr_logger.error(f"Failed to trigger search for author {author_name}.") + + if processed_count >= hunt_missing_books: + readarr_logger.info(f"Reached target of {hunt_missing_books} authors/groups processed for this cycle.") + break + + if processed_authors: + authors_list = '", "'.join(processed_authors) + readarr_logger.info(f'Completed processing {processed_count} authors/groups for missing books this cycle: "{authors_list}"') + else: + readarr_logger.info(f"Completed processing {processed_count} authors/groups for missing books this cycle.") + + return processed_something \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/readarr/upgrade.py b/Huntarr.io-6.3.6/src/primary/apps/readarr/upgrade.py new file mode 100644 index 0000000..3a4552e --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/readarr/upgrade.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +""" +Quality Upgrade Processing for Readarr +Handles searching for books that need quality upgrades in Readarr +""" + +import time +import random +import datetime # Import the datetime module +from typing import List, Dict, Any, Set, Callable, Union, Optional +from src.primary.utils.logger import get_logger +from src.primary.apps.readarr import api as readarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.state import check_state_reset +from src.primary.settings_manager import load_settings # Import load_settings function + +# Get logger for the app +readarr_logger = get_logger("readarr") + +def process_cutoff_upgrades( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process quality cutoff upgrades for Readarr based on settings. + + Args: + app_settings: Dictionary containing all settings for Readarr + stop_check: A function that returns True if the process should stop + + Returns: + True if any books were processed for upgrades, False otherwise. + """ + readarr_logger.info("Starting quality cutoff upgrades processing cycle for Readarr.") + + # Reset state files if enough time has passed + check_state_reset("readarr") + + processed_any = False + + # Load general settings to get centralized timeout + general_settings = load_settings('general') + + # Get the API credentials for this instance + api_url = app_settings.get('api_url', '') + api_key = app_settings.get('api_key', '') + + # Use the centralized timeout from general settings with app-specific as fallback + api_timeout = general_settings.get("api_timeout", app_settings.get("api_timeout", 90)) # Use centralized timeout + + readarr_logger.info(f"Using API timeout of {api_timeout} seconds for Readarr") + + # Extract necessary settings + instance_name = app_settings.get("instance_name", "Readarr Default") + monitored_only = app_settings.get("monitored_only", True) + skip_author_refresh = app_settings.get("skip_author_refresh", False) + hunt_upgrade_books = app_settings.get("hunt_upgrade_books", 0) + command_wait_delay = app_settings.get("command_wait_delay", 5) + command_wait_attempts = app_settings.get("command_wait_attempts", 12) + + # Get books eligible for upgrade + readarr_logger.info("Retrieving books eligible for quality upgrade...") + # Pass API credentials explicitly + upgrade_eligible_data = readarr_api.get_cutoff_unmet_books(api_url=api_url, api_key=api_key, api_timeout=api_timeout) + + if upgrade_eligible_data is None: # Check if the API call failed (assuming it returns None on error) + readarr_logger.error("Error retrieving books eligible for upgrade from Readarr API.") + return False + elif not upgrade_eligible_data: # Check if the list is empty + readarr_logger.info("No books found eligible for upgrade.") + return False + + readarr_logger.info(f"Found {len(upgrade_eligible_data)} books eligible for quality upgrade.") + + # Filter out future releases if configured + skip_future_releases = app_settings.get("skip_future_releases", True) + if skip_future_releases: + now = datetime.datetime.now(datetime.timezone.utc) + original_count = len(upgrade_eligible_data) + filtered_books = [] + for book in upgrade_eligible_data: + release_date_str = book.get('releaseDate') + if release_date_str: + try: + # Try to parse ISO format first (with time component) + try: + # Handle ISO format date strings like '2023-10-17T04:00:00Z' + # fromisoformat doesn't handle 'Z' timezone, so we replace it + release_date_str_fixed = release_date_str.replace('Z', '+00:00') + release_date = datetime.datetime.fromisoformat(release_date_str_fixed) + except ValueError: + # Fall back to simple YYYY-MM-DD format + release_date = datetime.datetime.strptime(release_date_str, '%Y-%m-%d') + # Add UTC timezone for consistent comparison + release_date = release_date.replace(tzinfo=datetime.timezone.utc) + + if release_date <= now: + filtered_books.append(book) + else: + readarr_logger.debug(f"Skipping future book ID {book.get('id')} with release date {release_date_str}") + except ValueError: + readarr_logger.warning(f"Could not parse release date '{release_date_str}' for book ID {book.get('id')}. Including anyway.") + filtered_books.append(book) + else: + filtered_books.append(book) # Include books without a release date + + upgrade_eligible_data = filtered_books + skipped_count = original_count - len(upgrade_eligible_data) + if skipped_count > 0: + readarr_logger.info(f"Skipped {skipped_count} future books based on release date for upgrades.") + + if not upgrade_eligible_data: + readarr_logger.info("No upgradeable books found to process (after potential filtering). Skipping.") + return False + + # Filter out already processed books using stateful management + unprocessed_books = [] + for book in upgrade_eligible_data: + book_id = str(book.get("id")) + if not is_processed("readarr", instance_name, book_id): + unprocessed_books.append(book) + else: + readarr_logger.debug(f"Skipping already processed book ID: {book_id}") + + readarr_logger.info(f"Found {len(unprocessed_books)} unprocessed books out of {len(upgrade_eligible_data)} total books eligible for upgrade.") + + if not unprocessed_books: + readarr_logger.info(f"No unprocessed books found for {instance_name}. All available books have been processed.") + return False + + # Always randomly select books to process + readarr_logger.info(f"Randomly selecting up to {hunt_upgrade_books} books for upgrade search.") + books_to_process = random.sample(unprocessed_books, min(hunt_upgrade_books, len(unprocessed_books))) + + readarr_logger.info(f"Selected {len(books_to_process)} books to search for upgrades.") + processed_count = 0 + processed_something = False + + book_ids_to_search = [book.get("id") for book in books_to_process] + + # Mark books as processed BEFORE triggering any searches + for book_id in book_ids_to_search: + add_processed_id("readarr", instance_name, str(book_id)) + readarr_logger.debug(f"Added book ID {book_id} to processed list for {instance_name}") + + # Now trigger the search + search_command_result = readarr_api.search_books(api_url, api_key, book_ids_to_search, api_timeout) + + if search_command_result: + command_id = search_command_result + readarr_logger.info(f"Triggered upgrade search command {command_id} for {len(book_ids_to_search)} books.") + increment_stat("readarr", "upgraded") + + # Log to history system for each book + for book in books_to_process: + author_name = book.get("authorName") + book_title = book.get("title") + media_name = f"{author_name} - {book_title}" + log_processed_media("readarr", media_name, book.get("id"), instance_name, "upgrade") + readarr_logger.debug(f"Logged quality upgrade to history for book ID {book.get('id')}") + + processed_count += len(book_ids_to_search) + processed_something = True + readarr_logger.info(f"Processed {processed_count} book upgrades this cycle.") + else: + readarr_logger.error(f"Failed to trigger search for book upgrades.") + + readarr_logger.info(f"Completed processing {processed_count} books for upgrade this cycle.") + + return processed_something \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/readarr_routes.py b/Huntarr.io-6.3.6/src/primary/apps/readarr_routes.py new file mode 100644 index 0000000..d729aae --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/readarr_routes.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path, reset_state_file +from src.primary.utils.logger import get_logger +import traceback +import socket +from urllib.parse import urlparse + +readarr_bp = Blueprint('readarr', __name__) +readarr_logger = get_logger("readarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("readarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("readarr", "processed_upgrades") + +@readarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Readarr API instance""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + readarr_logger.info(f"Testing connection to Readarr API at {api_url}") + + # Validate URL format + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # For Readarr, use api/v1 + url = f"{api_url}/api/v1/system/status" + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + # First check if the host is reachable at all + parsed_url = urlparse(api_url) + hostname = parsed_url.hostname + port = parsed_url.port or (443 if parsed_url.scheme == 'https' else 80) + + # Try to establish a socket connection first to provide a better error message for connection issues + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) # Short timeout for quick feedback + result = sock.connect_ex((hostname, port)) + sock.close() + + if result != 0: + error_msg = f"Connection refused - Unable to connect to {hostname}:{port}. Please check if the server is running and the port is correct." + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except socket.gaierror: + error_msg = f"DNS resolution failed - Cannot resolve hostname: {hostname}. Please check your URL." + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except Exception as e: + # Log the socket testing error but continue with the full request + readarr_logger.debug(f"Socket test error, continuing with full request: {str(e)}") + + # Now proceed with the actual API request + response = requests.get(url, headers=headers, timeout=10) + + # For HTTP errors, provide more specific feedback + if response.status_code == 401: + error_msg = "Authentication failed: Invalid API key" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 401 + elif response.status_code == 403: + error_msg = "Access forbidden: Check API key permissions" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 403 + elif response.status_code == 404: + error_msg = "API endpoint not found: This doesn't appear to be a valid Readarr server. Check your URL." + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + elif response.status_code >= 500: + error_msg = f"Readarr server error (HTTP {response.status_code}): The Readarr server is experiencing issues" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), response.status_code + + # Raise for other HTTP errors + response.raise_for_status() + + try: + response_data = response.json() + version = response_data.get('version', 'unknown') + readarr_logger.info(f"Successfully connected to Readarr API version: {version}") + + return jsonify({ + "success": True, + "message": "Successfully connected to Readarr API", + "version": version + }) + except ValueError: + error_msg = "Invalid JSON response from Readarr API - This doesn't appear to be a valid Readarr server" + readarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.ConnectionError as e: + # Handle different types of connection errors + error_details = str(e) + if "Connection refused" in error_details: + error_msg = f"Connection refused - Readarr is not running on {api_url} or the port is incorrect" + elif "Name or service not known" in error_details or "getaddrinfo failed" in error_details: + error_msg = f"DNS resolution failed - Cannot find host '{urlparse(api_url).hostname}'. Check your URL." + else: + error_msg = f"Connection error - Check if Readarr is running: {error_details}" + + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except requests.exceptions.Timeout: + error_msg = f"Connection timed out - Readarr took too long to respond" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 504 + except requests.exceptions.RequestException as e: + error_msg = f"Connection test failed: {str(e)}" + readarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 diff --git a/Huntarr.io-6.3.6/src/primary/apps/sonarr.py b/Huntarr.io-6.3.6/src/primary/apps/sonarr.py new file mode 100644 index 0000000..18a3f28 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/sonarr.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path +from src.primary.settings_manager import load_settings +import logging +from src.primary.utils.logger import get_logger + +sonarr_bp = Blueprint('sonarr', __name__) +sonarr_logger = get_logger("sonarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("sonarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("sonarr", "processed_upgrades") + +@sonarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Sonarr API instance with comprehensive diagnostics""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Log the test attempt + sonarr_logger.info(f"Testing connection to Sonarr API at {api_url}") + + # First check if URL is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Create the test URL and set headers + test_url = f"{api_url.rstrip('/')}/api/v3/system/status" + headers = {'X-Api-Key': api_key} + + try: + # Use a connection timeout separate from read timeout + response = requests.get(test_url, headers=headers, timeout=(10, api_timeout)) + + # Log HTTP status code for diagnostic purposes + sonarr_logger.debug(f"Sonarr API status code: {response.status_code}") + + # Check HTTP status code + response.raise_for_status() + + # Ensure the response is valid JSON + try: + response_data = response.json() + + # Save keys if connection is successful - Not saving here anymore since we use instances + # keys_manager.save_api_keys("sonarr", api_url, api_key) + + sonarr_logger.info(f"Successfully connected to Sonarr API version: {response_data.get('version', 'unknown')}") + + # Return success with some useful information + return jsonify({ + "success": True, + "message": "Successfully connected to Sonarr API", + "version": response_data.get('version', 'unknown') + }) + except ValueError: + error_msg = "Invalid JSON response from Sonarr API" + sonarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.Timeout as e: + error_msg = f"Connection timed out after {api_timeout} seconds" + sonarr_logger.error(f"{error_msg}: {str(e)}") + return jsonify({"success": False, "message": error_msg}), 504 + + except requests.exceptions.ConnectionError as e: + error_msg = "Connection error - check hostname and port" + details = str(e) + # Check for common DNS resolution errors + if "Name or service not known" in details or "getaddrinfo failed" in details: + error_msg = "DNS resolution failed - check hostname" + # Check for common connection refused errors + elif "Connection refused" in details: + error_msg = "Connection refused - check if Sonarr is running and the port is correct" + + sonarr_logger.error(f"{error_msg}: {details}") + return jsonify({"success": False, "message": f"{error_msg}: {details}"}), 502 + + except requests.exceptions.RequestException as e: + error_message = f"Connection failed: {str(e)}" + + if hasattr(e, 'response') and e.response is not None: + status_code = e.response.status_code + + # Add specific messages based on common status codes + if status_code == 401: + error_message = "Authentication failed: Invalid API key" + elif status_code == 403: + error_message = "Access forbidden: Check API key permissions" + elif status_code == 404: + error_message = "API endpoint not found: Check API URL" + elif status_code >= 500: + error_message = f"Sonarr server error (HTTP {status_code}): The Sonarr server is experiencing issues" + + # Try to extract more error details if available + try: + error_details = e.response.json() + error_message += f" - {error_details.get('message', 'No details')}" + except ValueError: + if e.response.text: + error_message += f" - Response: {e.response.text[:200]}" + + sonarr_logger.error(error_message) + return jsonify({"success": False, "message": error_message}), 500 + + except Exception as e: + error_msg = f"An unexpected error occurred: {str(e)}" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 + +# --- Configuration and State --- # + +# --- Multi-Instance Support --- # + +# get_configured_instances function has been moved to src/primary/apps/sonarr/__init__.py + +# --- Reset State --- # + +# Function to check if Sonarr is configured +def is_configured(): + """Check if Sonarr API credentials are configured by checking if at least one instance is enabled""" + settings = load_settings("sonarr") + + if not settings: + sonarr_logger.debug("No settings found for Sonarr") + return False + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + sonarr_logger.debug(f"Found configured Sonarr instance: {instance.get('name', 'Unnamed')}") + return True + + sonarr_logger.debug("No enabled Sonarr instances found with valid API URL and key") + return False + + # Fallback to legacy single-instance config + api_url = settings.get("api_url") + api_key = settings.get("api_key") + return bool(api_url and api_key) diff --git a/Huntarr.io-6.3.6/src/primary/apps/sonarr/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/sonarr/__init__.py new file mode 100644 index 0000000..6c6e3c7 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/sonarr/__init__.py @@ -0,0 +1,94 @@ +""" +Sonarr module initialization +""" + +# Use src.primary imports +from src.primary.apps.sonarr.missing import process_missing_episodes +from src.primary.apps.sonarr.upgrade import process_cutoff_upgrades +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +# Define logger for this module +sonarr_logger = get_logger("sonarr") + +def get_configured_instances(): + """Get all configured and enabled Sonarr instances""" + settings = load_settings("sonarr") + instances = [] + # sonarr_logger.info(f"Loaded Sonarr settings for instance check: {settings}") # Removed verbose log + + if not settings: + sonarr_logger.debug("No settings found for Sonarr") + return instances + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + # sonarr_logger.info(f"Found 'instances' list with {len(settings['instances'])} items. Processing...") # Removed verbose log + for idx, instance in enumerate(settings["instances"]): + sonarr_logger.debug(f"Checking instance #{idx}: {instance}") + # Enhanced validation + api_url = instance.get("api_url", "").strip() + api_key = instance.get("api_key", "").strip() + + # Enhanced URL validation - ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + sonarr_logger.warning(f"Instance '{instance.get('name', 'Unnamed')}' has URL without http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + sonarr_logger.warning(f"Auto-correcting URL to: {api_url}") + + is_enabled = instance.get("enabled", True) + + # Only include properly configured instances + if is_enabled and api_url and api_key: + # Get the exact instance name as configured in the UI + instance_name = instance.get("name", "Default") + sonarr_logger.info(f"Using configured instance name: '{instance_name}' for Sonarr instance") + + # Return only essential instance details + instance_data = { + "instance_name": instance_name, + "api_url": api_url, + "api_key": api_key, + } + instances.append(instance_data) + # sonarr_logger.info(f"Added valid instance: {instance_data}") # Removed verbose log + elif not is_enabled: + sonarr_logger.debug(f"Skipping disabled instance: {instance.get('name', 'Unnamed')}") + else: + # For brand new installations, don't spam logs with warnings about default instances + instance_name = instance.get('name', 'Unnamed') + if instance_name == 'Default': + # Use debug level for default instances to avoid log spam on new installations + sonarr_logger.debug(f"Skipping instance '{instance_name}' due to missing API URL or key (URL: '{api_url}', Key Set: {bool(api_key)})") + else: + # Still log warnings for non-default instances + sonarr_logger.warning(f"Skipping instance '{instance_name}' due to missing API URL or key (URL: '{api_url}', Key Set: {bool(api_key)})") + else: + # sonarr_logger.info("No 'instances' list found or list is empty. Checking legacy config.") # Removed verbose log + # Fallback to legacy single-instance config + api_url = settings.get("api_url", "").strip() + api_key = settings.get("api_key", "").strip() + + # Ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + sonarr_logger.warning(f"API URL missing http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + sonarr_logger.warning(f"Auto-correcting URL to: {api_url}") + + if api_url and api_key: + # Create a clean instance_data dict for the legacy instance + instance_data = { + "instance_name": "Default", + "api_url": api_url, + "api_key": api_key, + } + instances.append(instance_data) + sonarr_logger.info(f"Using legacy configuration with instance name: 'Default'") + else: + sonarr_logger.warning("No API URL or key found in legacy configuration") + + # Use debug level to avoid spamming logs, especially with 0 instances + sonarr_logger.debug(f"Found {len(instances)} configured and enabled Sonarr instances") + return instances + +__all__ = ["process_missing_episodes", "process_cutoff_upgrades", "get_configured_instances"] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/sonarr/api.py b/Huntarr.io-6.3.6/src/primary/apps/sonarr/api.py new file mode 100644 index 0000000..07472fd --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/sonarr/api.py @@ -0,0 +1,993 @@ +#!/usr/bin/env python3 +""" +Sonarr-specific API functions +Handles all communication with the Sonarr API +""" + +import requests +import json +import sys +import time +import datetime +import traceback +from typing import List, Dict, Any, Optional, Union, Callable +# Correct the import path +from src.primary.utils.logger import get_logger + +# Get logger for the Sonarr app +sonarr_logger = get_logger("sonarr") + +# Use a session for better performance +session = requests.Session() + +def arr_request(api_url: str, api_key: str, api_timeout: int, endpoint: str, method: str = "GET", data: Dict = None) -> Any: + """ + Make a request to the Sonarr API. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + endpoint: The API endpoint to call + method: HTTP method (GET, POST, PUT, DELETE) + data: Optional data payload for POST/PUT requests + + Returns: + The parsed JSON response or None if the request failed + """ + try: + if not api_url or not api_key: + sonarr_logger.error("No URL or API key provided") + return None + + # Ensure api_url has a scheme + if not (api_url.startswith('http://') or api_url.startswith('https://')): + sonarr_logger.error(f"Invalid URL format: {api_url} - URL must start with http:// or https://") + return None + + # Construct the full URL properly + full_url = f"{api_url.rstrip('/')}/api/v3/{endpoint.lstrip('/')}" + + sonarr_logger.debug(f"Making {method} request to: {full_url}") + + # Set up headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + if method.upper() == "GET": + response = session.get(full_url, headers=headers, timeout=api_timeout) + elif method.upper() == "POST": + response = session.post(full_url, headers=headers, json=data, timeout=api_timeout) + elif method.upper() == "PUT": + response = session.put(full_url, headers=headers, json=data, timeout=api_timeout) + elif method.upper() == "DELETE": + response = session.delete(full_url, headers=headers, timeout=api_timeout) + else: + sonarr_logger.error(f"Unsupported HTTP method: {method}") + return None + + # Check for successful response + response.raise_for_status() + + # Check if there's any content before trying to parse JSON + if response.content: + try: + return response.json() + except json.JSONDecodeError as jde: + # Log detailed information about the malformed response + sonarr_logger.error(f"Error decoding JSON response from {endpoint}: {str(jde)}") + sonarr_logger.error(f"Response status code: {response.status_code}") + sonarr_logger.error(f"Response content (first 200 chars): {response.content[:200]}") + return None + else: + sonarr_logger.debug(f"Empty response content from {endpoint}, returning empty dict") + return {} + + except requests.exceptions.RequestException as e: + # Add detailed error logging + error_details = str(e) + if hasattr(e, 'response') and e.response is not None: + error_details += f", Status Code: {e.response.status_code}" + if e.response.content: + error_details += f", Content: {e.response.content[:200]}" + + sonarr_logger.error(f"Error during {method} request to {endpoint}: {error_details}") + return None + except Exception as e: + # Catch all exceptions and log them with traceback + error_msg = f"CRITICAL ERROR in arr_request: {str(e)}" + sonarr_logger.error(error_msg) + sonarr_logger.error(f"Full traceback: {traceback.format_exc()}") + print(error_msg, file=sys.stderr) + print(traceback.format_exc(), file=sys.stderr) + return None + +def check_connection(api_url: str, api_key: str, api_timeout: int) -> bool: + """Checks connection by fetching system status.""" + if not api_url: + sonarr_logger.error("API URL is empty or not set") + return False + if not api_key: + sonarr_logger.error("API Key is empty or not set") + return False + + try: + # Use a shorter timeout for a quick connection check + quick_timeout = min(api_timeout, 15) + status = get_system_status(api_url, api_key, quick_timeout) + if status and isinstance(status, dict) and 'version' in status: + # Log success only if debug is enabled to avoid clutter + sonarr_logger.debug(f"Connection check successful for {api_url}. Version: {status.get('version')}") + return True + else: + # Log details if the status response was unexpected + sonarr_logger.warning(f"Connection check for {api_url} returned unexpected status: {str(status)[:200]}") + return False + except Exception as e: + # Error should have been logged by arr_request, just indicate failure + sonarr_logger.error(f"Connection check failed for {api_url}") + return False + +def get_system_status(api_url: str, api_key: str, api_timeout: int) -> Dict: + """ + Get Sonarr system status. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + System status information or empty dict if request failed + """ + response = arr_request(api_url, api_key, api_timeout, "system/status") + if response: + return response + return {} + +def get_series(api_url: str, api_key: str, api_timeout: int, series_id: Optional[int] = None) -> Union[List, Dict, None]: + """ + Get series information from Sonarr. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + series_id: Optional series ID to get a specific series + + Returns: + List of all series, a specific series, or None if request failed + """ + if series_id: + endpoint = f"series/{series_id}" + else: + endpoint = "series" + + return arr_request(api_url, api_key, api_timeout, endpoint) + +def get_episode(api_url: str, api_key: str, api_timeout: int, episode_id: int) -> Dict: + """ + Get episode information by ID. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + episode_id: The episode ID + + Returns: + Episode information or empty dict if request failed + """ + response = arr_request(api_url, api_key, api_timeout, f"episode/{episode_id}") + if response: + return response + return {} + +def get_queue(api_url: str, api_key: str, api_timeout: int) -> List: + """ + Get the current queue from Sonarr. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + Queue information or empty list if request failed + """ + response = arr_request(api_url, api_key, api_timeout, "queue") + if not response or "records" not in response: + return [] + + return response.get("records", []) + +def get_calendar(api_url: str, api_key: str, api_timeout: int, start_date: Optional[str] = None, end_date: Optional[str] = None) -> List: + """ + Get calendar information for a date range. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + start_date: Optional start date (ISO format) + end_date: Optional end date (ISO format) + + Returns: + Calendar information or empty list if request failed + """ + params = [] + + if start_date: + params.append(f"start={start_date}") + + if end_date: + params.append(f"end={end_date}") + + endpoint = "calendar" + if params: + endpoint = f"{endpoint}?{'&'.join(params)}" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + if response: + return response + return [] + +def command_status(api_url: str, api_key: str, api_timeout: int, command_id: Union[int, str]) -> Dict: + """ + Get the status of a command by ID. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + command_id: The command ID + + Returns: + Command status information or empty dict if request failed + """ + response = arr_request(api_url, api_key, api_timeout, f"command/{command_id}") + if response: + return response + return {} + +def get_missing_episodes(api_url: str, api_key: str, api_timeout: int, monitored_only: bool, series_id: Optional[int] = None) -> List[Dict[str, Any]]: + """Get missing episodes from Sonarr, handling pagination.""" + endpoint = "wanted/missing" + page = 1 + page_size = 1000 # Adjust page size if needed, but 1000 is usually good + all_missing_episodes = [] + retries_per_page = 2 + retry_delay = 3 + + while True: + retry_count = 0 + success = False + + while retry_count <= retries_per_page and not success: + # Parameters for the request + params = { + "page": page, + "pageSize": page_size, + "includeSeries": "true" + } + + # Add series ID filter if provided + if series_id is not None: + params["seriesId"] = series_id + + # Ensure proper URL construction with scheme + base_url = api_url.rstrip('/') + url = f"{base_url}/api/v3/{endpoint.lstrip('/')}" + sonarr_logger.debug(f"Requesting missing episodes page {page} (attempt {retry_count+1}/{retries_per_page+1})") + + try: + response = requests.get(url, headers={"X-Api-Key": api_key}, params=params, timeout=api_timeout) + response.raise_for_status() # Check for HTTP errors (4xx or 5xx) + + if not response.content: + sonarr_logger.warning(f"Empty response for missing episodes page {page} (attempt {retry_count+1})") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up on empty response after {retries_per_page+1} attempts") + break # Exit the retry loop, continuing to next page or ending + + try: + data = response.json() + records = data.get('records', []) + total_records_on_page = len(records) + sonarr_logger.debug(f"Parsed {total_records_on_page} missing episode records from page {page}") + + if not records: # No more records found + sonarr_logger.debug(f"No more records found on page {page}. Stopping pagination.") + success = True # Mark as successful even though no records (might be legitimate) + break # Exit retry loop, then also exit pagination loop + + all_missing_episodes.extend(records) + + # Check if this was the last page + if total_records_on_page < page_size: + sonarr_logger.debug(f"Received {total_records_on_page} records (less than page size {page_size}). Last page.") + success = True + break # Exit retry loop, then also exit pagination loop + + # We got records and need to continue - mark success for this page + success = True + break # Exit retry loop, continue to next page + + except json.JSONDecodeError as e: + sonarr_logger.error(f"Failed to decode JSON response for missing episodes page {page} (attempt {retry_count+1}): {e}") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up after {retries_per_page+1} failed JSON decode attempts") + break # Exit retry loop, moving to next page or ending + + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Request error for missing episodes page {page} (attempt {retry_count+1}): {e}") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up on request after {retries_per_page+1} failed attempts") + break # Exit retry loop + except Exception as e: + sonarr_logger.error(f"Unexpected error for missing episodes page {page} (attempt {retry_count+1}): {e}") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up after unexpected error and {retries_per_page+1} attempts") + break # Exit retry loop + + # If we didn't succeed after all retries or there are no more records, stop pagination + if not success or not records: + break + + # Prepare for the next page + page += 1 + + sonarr_logger.info(f"Total missing episodes fetched across all pages: {len(all_missing_episodes)}") + + # Apply monitored filter after fetching all pages + if monitored_only: + original_count = len(all_missing_episodes) + filtered_missing = [ + ep for ep in all_missing_episodes + if ep.get('series', {}).get('monitored', False) and ep.get('monitored', False) + ] + sonarr_logger.debug(f"Filtered for monitored_only=True: {len(filtered_missing)} monitored episodes (out of {original_count} total)") + return filtered_missing + else: + sonarr_logger.debug(f"Returning {len(all_missing_episodes)} episodes (monitored_only=False)") + return all_missing_episodes + +def get_cutoff_unmet_episodes(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> List[Dict[str, Any]]: + """Get cutoff unmet episodes from Sonarr, handling pagination.""" + endpoint = "wanted/cutoff" + page = 1 + page_size = 1000 # Sonarr's max page size for this endpoint + all_cutoff_unmet = [] + retries_per_page = 2 + retry_delay = 3 + + sonarr_logger.debug(f"Starting fetch for cutoff unmet episodes (monitored_only={monitored_only}).") + + while True: + retry_count = 0 + success = False + records = [] + + while retry_count <= retries_per_page and not success: + # Parameters for the request + params = { + "page": page, + "pageSize": page_size, + "includeSeries": "true", # Include series info for filtering + "sortKey": "airDateUtc", + "sortDir": "asc" + } + url = f"{api_url}/api/v3/{endpoint}" + sonarr_logger.debug(f"Requesting cutoff unmet page {page} (attempt {retry_count+1}/{retries_per_page+1})") + + try: + response = requests.get(url, headers={"X-Api-Key": api_key}, params=params, timeout=api_timeout) + sonarr_logger.debug(f"Sonarr API response status code for cutoff unmet page {page}: {response.status_code}") + response.raise_for_status() # Check for HTTP errors + + if not response.content: + sonarr_logger.warning(f"Empty response for cutoff unmet episodes page {page} (attempt {retry_count+1})") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up on empty response after {retries_per_page+1} attempts") + break + + try: + data = response.json() + records = data.get('records', []) + total_records_on_page = len(records) + total_records_reported = data.get('totalRecords', 0) + + if page == 1: + sonarr_logger.info(f"Sonarr API reports {total_records_reported} total cutoff unmet records.") + + sonarr_logger.debug(f"Parsed {total_records_on_page} cutoff unmet records from page {page}") + + if not records: # No more records found + sonarr_logger.debug(f"No more cutoff unmet records found on page {page}. Stopping pagination.") + success = True + break + + all_cutoff_unmet.extend(records) + + # Check if this was the last page + if total_records_on_page < page_size: + sonarr_logger.debug(f"Received {total_records_on_page} records (less than page size {page_size}). Last page.") + success = True + break + + # Success for this page + success = True + break + + except json.JSONDecodeError as e: + sonarr_logger.error(f"Failed to decode JSON for cutoff unmet page {page} (attempt {retry_count+1}): {e}") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up after {retries_per_page+1} failed JSON decode attempts") + break + + except requests.exceptions.Timeout as e: + sonarr_logger.error(f"Timeout for cutoff unmet page {page} (attempt {retry_count+1}): {e}") + if retry_count < retries_per_page: + retry_count += 1 + # Use a slightly longer retry delay for timeouts + time.sleep(retry_delay * 2) + continue + else: + sonarr_logger.error(f"Giving up after {retries_per_page+1} timeout failures") + break + + except requests.exceptions.RequestException as e: + error_details = f"Error: {e}" + if hasattr(e, 'response') and e.response is not None: + error_details += f", Status Code: {e.response.status_code}" + if hasattr(e.response, 'text') and e.response.text: + error_details += f", Response: {e.response.text[:500]}" + + sonarr_logger.error(f"Request error for cutoff unmet page {page} (attempt {retry_count+1}): {error_details}") + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up on request after {retries_per_page+1} failed attempts") + break + + except Exception as e: + sonarr_logger.error(f"Unexpected error for cutoff unmet page {page} (attempt {retry_count+1}): {e}", exc_info=True) + if retry_count < retries_per_page: + retry_count += 1 + time.sleep(retry_delay) + continue + else: + sonarr_logger.error(f"Giving up after unexpected error and {retries_per_page+1} attempts") + break + + # If we didn't succeed after all retries or there are no more records, stop pagination + if not success or not records: + break + + # Prepare for the next page + page += 1 + + sonarr_logger.info(f"Total cutoff unmet episodes fetched across all pages: {len(all_cutoff_unmet)}") + + # Apply monitored filter after fetching all pages + if monitored_only: + original_count = len(all_cutoff_unmet) + # Ensure series and episode are monitored + filtered_cutoff_unmet = [ + ep for ep in all_cutoff_unmet + if ep.get('series', {}).get('monitored', False) and ep.get('monitored', False) + ] + sonarr_logger.debug(f"Filtered for monitored_only=True: {len(filtered_cutoff_unmet)} monitored cutoff unmet episodes remain (out of {original_count} total).") + return filtered_cutoff_unmet + else: + sonarr_logger.debug(f"Returning {len(all_cutoff_unmet)} cutoff unmet episodes (monitored_only=False).") + return all_cutoff_unmet + +def get_cutoff_unmet_episodes_random_page(api_url: str, api_key: str, api_timeout: int, monitored_only: bool, count: int) -> List[Dict[str, Any]]: + """ + Get a specified number of random cutoff unmet episodes by selecting a random page. + This is much more efficient for very large libraries. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: Whether to include only monitored episodes + count: How many episodes to return + + Returns: + A list of randomly selected cutoff unmet episodes + """ + endpoint = "wanted/cutoff" + page_size = 100 # Smaller page size to make the initial query faster + + # First, make a request to get just the total record count (page 1 with size=1) + params = { + "page": 1, + "pageSize": 1, + "includeSeries": "true" # Include series info for filtering + } + url = f"{api_url}/api/v3/{endpoint}" + + try: + # Get total record count from a minimal query + response = requests.get(url, headers={"X-Api-Key": api_key}, params=params, timeout=api_timeout) + response.raise_for_status() + data = response.json() + total_records = data.get('totalRecords', 0) + + if total_records == 0: + sonarr_logger.info("No cutoff unmet episodes found in Sonarr.") + return [] + + # Calculate total pages with our desired page size + total_pages = (total_records + page_size - 1) // page_size + sonarr_logger.info(f"Found {total_records} total cutoff unmet episodes across {total_pages} pages") + + if total_pages == 0: + return [] + + # Select a random page + import random + random_page = random.randint(1, total_pages) + sonarr_logger.info(f"Selected random page {random_page} of {total_pages} for quality upgrade selection") + + # Get episodes from the random page + params = { + "page": random_page, + "pageSize": page_size, + "includeSeries": "true" + } + + response = requests.get(url, headers={"X-Api-Key": api_key}, params=params, timeout=api_timeout) + response.raise_for_status() + + data = response.json() + records = data.get('records', []) + sonarr_logger.info(f"Retrieved {len(records)} episodes from page {random_page}") + + # Apply monitored filter if requested + if monitored_only: + filtered_records = [ + ep for ep in records + if ep.get('series', {}).get('monitored', False) and ep.get('monitored', False) + ] + sonarr_logger.debug(f"Filtered to {len(filtered_records)} monitored episodes") + records = filtered_records + + # Select random episodes from this page + if len(records) > count: + selected_records = random.sample(records, count) + sonarr_logger.debug(f"Randomly selected {len(selected_records)} episodes from page {random_page}") + return selected_records + else: + # If we have fewer episodes than requested, return all of them + sonarr_logger.debug(f"Returning all {len(records)} episodes from page {random_page} (fewer than requested {count})") + return records + + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error getting random cutoff unmet episodes from Sonarr: {str(e)}") + return [] + except json.JSONDecodeError as e: + sonarr_logger.error(f"Failed to decode JSON response for random cutoff selection: {str(e)}") + return [] + except Exception as e: + sonarr_logger.error(f"Unexpected error in random cutoff selection: {str(e)}", exc_info=True) + return [] + +def get_missing_episodes_random_page(api_url: str, api_key: str, api_timeout: int, monitored_only: bool, count: int, series_id: Optional[int] = None) -> List[Dict[str, Any]]: + """ + Get a specified number of random missing episodes by selecting a random page. + This is more efficient for very large libraries. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: Whether to include only monitored episodes + count: How many episodes to return + series_id: Optional series ID to filter results for a specific series + + Returns: + A list of randomly selected missing episodes, up to the requested count + """ + endpoint = "wanted/missing" + page_size = 100 # Smaller page size for better performance + retries = 2 + retry_delay = 3 + + # First, make a request to get just the total record count (page 1 with size=1) + params = { + "page": 1, + "pageSize": 1, + "includeSeries": "true" # Include series info for filtering + } + url = f"{api_url}/api/v3/{endpoint}" + + for attempt in range(retries + 1): + try: + # Get total record count from a minimal query + sonarr_logger.debug(f"Getting missing episodes count (attempt {attempt+1}/{retries+1})") + response = requests.get(url, headers={"X-Api-Key": api_key}, params=params, timeout=api_timeout) + response.raise_for_status() + + if not response.content: + sonarr_logger.warning(f"Empty response when getting missing count (attempt {attempt+1})") + if attempt < retries: + time.sleep(retry_delay) + continue + return [] + + try: + data = response.json() + total_records = data.get('totalRecords', 0) + + if total_records == 0: + sonarr_logger.info("No missing episodes found in Sonarr.") + return [] + + # Calculate total pages with our desired page size + total_pages = (total_records + page_size - 1) // page_size + sonarr_logger.info(f"Found {total_records} total missing episodes across {total_pages} pages") + + if total_pages == 0: + return [] + + # Select a random page + import random + random_page = random.randint(1, total_pages) + sonarr_logger.info(f"Selected random page {random_page} of {total_pages} for missing episodes") + + # Get episodes from the random page + params = { + "page": random_page, + "pageSize": page_size, + "includeSeries": "true" + } + + if series_id is not None: + params["seriesId"] = series_id + + response = requests.get(url, headers={"X-Api-Key": api_key}, params=params, timeout=api_timeout) + response.raise_for_status() + + if not response.content: + sonarr_logger.warning(f"Empty response when getting missing episodes page {random_page}") + return [] + + try: + data = response.json() + records = data.get('records', []) + sonarr_logger.info(f"Retrieved {len(records)} missing episodes from page {random_page}") + + # Apply monitored filter if requested + if monitored_only: + filtered_records = [ + ep for ep in records + if ep.get('series', {}).get('monitored', False) and ep.get('monitored', False) + ] + sonarr_logger.debug(f"Filtered to {len(filtered_records)} monitored missing episodes") + records = filtered_records + + # Select random episodes from this page + if len(records) > count: + selected_records = random.sample(records, count) + sonarr_logger.debug(f"Randomly selected {len(selected_records)} missing episodes from page {random_page}") + return selected_records + else: + # If we have fewer episodes than requested, return all of them + sonarr_logger.debug(f"Returning all {len(records)} missing episodes from page {random_page} (fewer than requested {count})") + return records + + except json.JSONDecodeError as jde: + sonarr_logger.error(f"Failed to decode JSON response for missing episodes page {random_page}: {str(jde)}") + if attempt < retries: + time.sleep(retry_delay) + continue + return [] + + except json.JSONDecodeError as jde: + sonarr_logger.error(f"Failed to decode JSON response for missing episodes count: {str(jde)}") + if attempt < retries: + time.sleep(retry_delay) + continue + return [] + + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error getting missing episodes from Sonarr (attempt {attempt+1}): {str(e)}") + if attempt < retries: + time.sleep(retry_delay) + continue + return [] + + except Exception as e: + sonarr_logger.error(f"Unexpected error getting missing episodes (attempt {attempt+1}): {str(e)}", exc_info=True) + if attempt < retries: + time.sleep(retry_delay) + continue + return [] + + # If we get here, all retries failed + sonarr_logger.error("All attempts to get missing episodes failed") + return [] + +def search_episode(api_url: str, api_key: str, api_timeout: int, episode_ids: List[int]) -> Optional[Union[int, str]]: + """Trigger a search for specific episodes in Sonarr.""" + if not episode_ids: + sonarr_logger.warning("No episode IDs provided for search.") + return None + try: + endpoint = f"{api_url}/api/v3/command" + payload = { + "name": "EpisodeSearch", + "episodeIds": episode_ids + } + response = requests.post(endpoint, headers={"X-Api-Key": api_key}, json=payload, timeout=api_timeout) + response.raise_for_status() + command_id = response.json().get('id') + sonarr_logger.info(f"Triggered Sonarr search for episode IDs: {episode_ids}. Command ID: {command_id}") + return command_id + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error triggering Sonarr search for episode IDs {episode_ids}: {e}") + return None + except Exception as e: + sonarr_logger.error(f"An unexpected error occurred while triggering Sonarr search: {e}") + return None + +def get_command_status(api_url: str, api_key: str, api_timeout: int, command_id: Union[int, str]) -> Optional[Dict[str, Any]]: + """Get the status of a Sonarr command.""" + try: + endpoint = f"{api_url}/api/v3/command/{command_id}" + response = requests.get(endpoint, headers={"X-Api-Key": api_key}, timeout=api_timeout) + response.raise_for_status() + status = response.json() + sonarr_logger.debug(f"Checked Sonarr command status for ID {command_id}: {status.get('status')}") + return status + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error getting Sonarr command status for ID {command_id}: {e}") + return None + except Exception as e: + sonarr_logger.error(f"An unexpected error occurred while getting Sonarr command status: {e}") + return None + +def get_download_queue_size(api_url: str, api_key: str, api_timeout: int) -> int: + """Get the current size of the Sonarr download queue.""" + retries = 2 # Number of retry attempts + retry_delay = 3 # Delay between retries in seconds + + for attempt in range(retries + 1): + try: + endpoint = f"{api_url}/api/v3/queue?page=1&pageSize=1" # Just get total count, don't need records + response = requests.get(endpoint, headers={"X-Api-Key": api_key}, params={"includeSeries": "false"}, timeout=api_timeout) + response.raise_for_status() + + if not response.content: + sonarr_logger.warning(f"Empty response when getting queue size (attempt {attempt+1}/{retries+1})") + if attempt < retries: + time.sleep(retry_delay) + continue + return -1 + + try: + queue_data = response.json() + queue_size = queue_data.get('totalRecords', 0) + sonarr_logger.debug(f"Sonarr download queue size: {queue_size}") + return queue_size + except json.JSONDecodeError as jde: + sonarr_logger.error(f"Failed to decode queue JSON (attempt {attempt+1}/{retries+1}): {jde}") + if attempt < retries: + time.sleep(retry_delay) + continue + return -1 + + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error getting Sonarr download queue size (attempt {attempt+1}/{retries+1}): {e}") + if attempt < retries: + sonarr_logger.info(f"Retrying in {retry_delay} seconds...") + time.sleep(retry_delay) + continue + return -1 # Return -1 to indicate an error + except Exception as e: + sonarr_logger.error(f"Unexpected error getting queue size (attempt {attempt+1}/{retries+1}): {e}") + if attempt < retries: + time.sleep(retry_delay) + continue + return -1 + + # If we get here, all retries failed + sonarr_logger.error(f"All {retries+1} attempts to get download queue size failed") + return -1 + +def refresh_series(api_url: str, api_key: str, api_timeout: int, series_id: int) -> Optional[Union[int, str]]: + """Trigger a refresh for a specific series in Sonarr.""" + try: + endpoint = f"{api_url}/api/v3/command" + payload = { + "name": "RefreshSeries", + "seriesId": series_id + } + response = requests.post(endpoint, headers={"X-Api-Key": api_key}, json=payload, timeout=api_timeout) + response.raise_for_status() + command_id = response.json().get('id') + sonarr_logger.info(f"Triggered Sonarr refresh for series ID: {series_id}. Command ID: {command_id}") + return command_id + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error triggering Sonarr refresh for series ID {series_id}: {e}") + return None + except Exception as e: + sonarr_logger.error(f"An unexpected error occurred while triggering Sonarr series refresh: {e}") + return None + +def get_series_by_id(api_url: str, api_key: str, api_timeout: int, series_id: int) -> Optional[Dict[str, Any]]: + """Get series details by ID from Sonarr.""" + try: + endpoint = f"{api_url}/api/v3/series/{series_id}" + response = requests.get(endpoint, headers={"X-Api-Key": api_key}, timeout=api_timeout) + response.raise_for_status() + series_data = response.json() + sonarr_logger.debug(f"Fetched details for Sonarr series ID: {series_id}") + return series_data + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error getting Sonarr series details for ID {series_id}: {e}") + return None + except Exception as e: + sonarr_logger.error(f"An unexpected error occurred while getting Sonarr series details: {e}") + return None + +def search_season(api_url: str, api_key: str, api_timeout: int, series_id: int, season_number: int) -> Optional[Union[int, str]]: + """Trigger a search for a specific season in Sonarr.""" + try: + endpoint = f"{api_url}/api/v3/command" + payload = { + "name": "SeasonSearch", + "seriesId": series_id, + "seasonNumber": season_number + } + response = requests.post(endpoint, headers={"X-Api-Key": api_key}, json=payload, timeout=api_timeout) + response.raise_for_status() + command_id = response.json().get('id') + sonarr_logger.info(f"Triggered Sonarr season search for series ID: {series_id}, season: {season_number}. Command ID: {command_id}") + return command_id + except requests.exceptions.RequestException as e: + sonarr_logger.error(f"Error triggering Sonarr season search for series ID {series_id}, season {season_number}: {e}") + return None + except Exception as e: + sonarr_logger.error(f"An unexpected error occurred while triggering Sonarr season search: {e}") + return None + +def get_series_with_missing_episodes(api_url: str, api_key: str, api_timeout: int, monitored_only: bool = True, limit: int = 50, random_mode: bool = True) -> List[Dict[str, Any]]: + """ + Get a list of series that have missing episodes, along with missing episode counts per season. + This is much more efficient than fetching all missing episodes for large libraries. + + Args: + api_url: The base URL of the Sonarr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: Whether to only include monitored series + limit: Maximum number of series to return + random_mode: Whether to randomly select series + + Returns: + A list of series with missing episodes and counts per season + """ + result = [] + + # Step 1: Get all series + all_series = get_series(api_url, api_key, api_timeout) + if not all_series: + sonarr_logger.error("Failed to retrieve series list") + return [] + + # Step 2: Filter to monitored series if requested + if monitored_only: + filtered_series = [s for s in all_series if s.get('monitored', False)] + sonarr_logger.info(f"Filtered from {len(all_series)} total series to {len(filtered_series)} monitored series") + else: + filtered_series = all_series + + # Apply random selection if requested + if random_mode: + import random + sonarr_logger.info(f"Using RANDOM selection mode for missing episodes") + random.shuffle(filtered_series) + else: + sonarr_logger.info(f"Using SEQUENTIAL selection mode for missing episodes") + + # Step 3: For each series, check if it has missing episodes using series/id/episodes endpoint + # This is much more efficient than using the wanted/missing endpoint + series_with_missing = [] + examined_count = 0 + + for series in filtered_series[:limit]: + examined_count += 1 + series_id = series.get('id') + series_title = series.get('title', 'Unknown') + + if not series_id: + continue + + # Get all episodes for this series + try: + endpoint = f"{api_url}/api/v3/episode?seriesId={series_id}" + response = requests.get(endpoint, headers={"X-Api-Key": api_key}, timeout=api_timeout) + response.raise_for_status() + + if not response.content: + continue + + episodes = response.json() + + # Filter to missing episodes + missing_episodes = [ + e for e in episodes + if e.get('hasFile') is False and + (not monitored_only or e.get('monitored', False)) + ] + + if not missing_episodes: + continue + + # Group by season + seasons_dict = {} + for episode in missing_episodes: + season_number = episode.get('seasonNumber') + if season_number is not None: + if season_number not in seasons_dict: + seasons_dict[season_number] = [] + seasons_dict[season_number].append(episode) + + # If we have any seasons with missing episodes, add this series to our result + if seasons_dict: + missing_info = { + 'series_id': series_id, + 'series_title': series_title, + 'seasons': [ + { + 'season_number': season, + 'episode_count': len(episodes), + 'episodes': episodes + } + for season, episodes in seasons_dict.items() + ] + } + series_with_missing.append(missing_info) + + sonarr_logger.debug(f"Found series {series_title} with {len(missing_episodes)} missing episodes across {len(seasons_dict)} seasons") + + except Exception as e: + sonarr_logger.error(f"Error checking missing episodes for series {series_title} (ID: {series_id}): {str(e)}") + continue + + selection_mode = "RANDOM" if random_mode else "SEQUENTIAL" + sonarr_logger.info(f"Examined {examined_count} series ({selection_mode} mode) and found {len(series_with_missing)} with missing episodes") + return series_with_missing \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/sonarr/missing.py b/Huntarr.io-6.3.6/src/primary/apps/sonarr/missing.py new file mode 100644 index 0000000..f4f26d0 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/sonarr/missing.py @@ -0,0 +1,612 @@ +#!/usr/bin/env python3 +""" +Sonarr missing episodes processing module for Huntarr +""" + +import time +import random +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.sonarr import api as sonarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.settings_manager import load_settings, get_advanced_setting + +# Get logger for the Sonarr app +sonarr_logger = get_logger("sonarr") + +def process_missing_episodes( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int = get_advanced_setting("api_timeout", 120), + monitored_only: bool = True, + skip_future_episodes: bool = True, + skip_series_refresh: bool = False, + hunt_missing_items: int = 5, + hunt_missing_mode: str = "episodes", + command_wait_delay: int = get_advanced_setting("command_wait_delay", 1), + command_wait_attempts: int = get_advanced_setting("command_wait_attempts", 600), + stop_check: Callable[[], bool] = lambda: False +) -> bool: + """ + Process missing episodes in Sonarr and trigger searches + Added support for multiple missing modes (episodes, seasons, shows) + """ + if hunt_missing_items <= 0: + sonarr_logger.info("'hunt_missing_items' setting is 0 or less. Skipping missing processing.") + return False + + sonarr_logger.info(f"Checking for {hunt_missing_items} missing episodes in {hunt_missing_mode} mode...") + + # Handle different modes + if hunt_missing_mode == "episodes": + # Handle episode-based missing items + sonarr_logger.info("Episode-based missing mode selected") + return process_missing_episodes_mode( + api_url, api_key, instance_name, api_timeout, monitored_only, + skip_future_episodes, skip_series_refresh, + hunt_missing_items, command_wait_delay, command_wait_attempts, + stop_check + ) + elif hunt_missing_mode == "seasons_packs": + # Handle season pack searches (using SeasonSearch command) + sonarr_logger.info("Season [Packs] mode selected - searching for complete season packs") + return process_missing_seasons_packs_mode( + api_url, api_key, instance_name, api_timeout, monitored_only, + skip_series_refresh, hunt_missing_items, + command_wait_delay, command_wait_attempts, stop_check + ) + elif hunt_missing_mode == "shows": + # Handle show-based missing items (all episodes from a show) + sonarr_logger.info("Show-based missing mode selected") + return process_missing_shows_mode( + api_url, api_key, instance_name, api_timeout, monitored_only, + skip_future_episodes, skip_series_refresh, hunt_missing_items, + command_wait_delay, command_wait_attempts, stop_check + ) + else: + sonarr_logger.error(f"Invalid hunt_missing_mode: {hunt_missing_mode}. Valid options are 'episodes', 'seasons_packs', or 'shows'.") + return False + +def process_missing_episodes_mode( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int, + monitored_only: bool, + skip_future_episodes: bool, + skip_series_refresh: bool, + hunt_missing_items: int, + command_wait_delay: int, + command_wait_attempts: int, + stop_check: Callable[[], bool] +) -> bool: + """Process missing episodes in episode mode (original implementation).""" + processed_any = False + + # Always use random selection for missing episodes + sonarr_logger.info(f"Using random selection for missing episodes") + episodes_to_search = sonarr_api.get_missing_episodes_random_page( + api_url, api_key, api_timeout, monitored_only, hunt_missing_items) + + if stop_check(): + sonarr_logger.info("Stop requested during missing episode processing.") + return processed_any + + # Filter out future episodes for random selection approach + if skip_future_episodes: + now_unix = time.time() + original_count = len(episodes_to_search) + episodes_to_search = [ + ep for ep in episodes_to_search + if ep.get('airDateUtc') and time.mktime(time.strptime(ep['airDateUtc'], '%Y-%m-%dT%H:%M:%SZ')) < now_unix + ] + skipped_count = original_count - len(episodes_to_search) + if skipped_count > 0: + sonarr_logger.info(f"Skipped {skipped_count} future episodes based on air date.") + + # Filter out already processed episodes for random selection approach + unprocessed_episodes = [] + for episode in episodes_to_search: + episode_id = str(episode.get("id")) + if not is_processed("sonarr", instance_name, episode_id): + unprocessed_episodes.append(episode) + else: + sonarr_logger.debug(f"Skipping already processed episode ID: {episode_id}") + + sonarr_logger.info(f"Found {len(unprocessed_episodes)} unprocessed missing episodes out of {len(episodes_to_search)} total.") + episodes_to_search = unprocessed_episodes + + if not episodes_to_search: + sonarr_logger.info("No missing episodes left to process after filtering.") + return False + + sonarr_logger.info(f"Selected {len(episodes_to_search)} missing episodes to search.") + + # Add detailed listing of episodes being processed + if episodes_to_search: + sonarr_logger.info(f"Episodes selected for processing in this cycle:") + for idx, episode in enumerate(episodes_to_search): + series_title = episode.get('series', {}).get('title', 'Unknown Series') + episode_title = episode.get('title', 'Unknown Episode') + season_number = episode.get('seasonNumber', 'Unknown Season') + episode_number = episode.get('episodeNumber', 'Unknown Episode') + + episode_id = episode.get("id") + try: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + except (ValueError, TypeError): + season_episode = f"S{season_number}E{episode_number}" + + sonarr_logger.info(f" {idx+1}. {series_title} - {season_episode} - \"{episode_title}\" (ID: {episode_id})") + + # Group episodes by series for potential refresh + series_to_refresh: Dict[int, List[int]] = {} + series_titles: Dict[int, str] = {} # Store titles for logging + for episode in episodes_to_search: + series_id = episode.get('seriesId') + if series_id: + if series_id not in series_to_refresh: + series_to_refresh[series_id] = [] + # Store title when first encountering the series ID + series_titles[series_id] = episode.get('series', {}).get('title', f"Series ID {series_id}") + series_to_refresh[series_id].append(episode['id']) + + # Process each series + for series_id, episode_ids in series_to_refresh.items(): + if stop_check(): sonarr_logger.info("Stop requested before processing next series."); break + series_title = series_titles.get(series_id, f"Series ID {series_id}") + sonarr_logger.info(f"Processing series: {series_title} (ID: {series_id}) with {len(episode_ids)} missing episodes.") + + # Refresh series metadata if not skipped + refresh_command_id = None + if not skip_series_refresh: + sonarr_logger.debug(f"Attempting to refresh series ID: {series_id}") + refresh_command_id = sonarr_api.refresh_series(api_url, api_key, api_timeout, series_id) + if refresh_command_id: + # Wait for refresh command to complete + if not wait_for_command( + api_url, api_key, api_timeout, refresh_command_id, + command_wait_delay, command_wait_attempts, "Series Refresh", stop_check + ): + sonarr_logger.warning(f"Series refresh command (ID: {refresh_command_id}) for series {series_id} did not complete successfully or timed out. Proceeding with search anyway.") + else: + sonarr_logger.warning(f"Failed to trigger refresh command for series ID: {series_id}. Proceeding without refresh.") + else: + sonarr_logger.debug(f"Skipping series refresh for series ID: {series_id} as configured.") + + if stop_check(): sonarr_logger.info("Stop requested after series refresh attempt."); break + + # Trigger search for the selected episodes in this series + sonarr_logger.debug(f"Attempting to search for episode IDs: {episode_ids}") + search_command_id = sonarr_api.search_episode(api_url, api_key, api_timeout, episode_ids) + + if search_command_id: + # Add episode IDs to stateful manager IMMEDIATELY after processing each batch + for episode_id in episode_ids: + # Force flush to disk by calling add_processed_id immediately for each ID + success = add_processed_id("sonarr", instance_name, str(episode_id)) + sonarr_logger.debug(f"Added processed ID: {episode_id}, success: {success}") + + # Wait for search command to complete + if wait_for_command( + api_url, api_key, api_timeout, search_command_id, + command_wait_delay, command_wait_attempts, "Episode Search", stop_check + ): + # Mark episodes as processed if search command completed successfully + processed_any = True # Mark that we did something + sonarr_logger.info(f"Successfully processed and searched for {len(episode_ids)} episodes in series {series_id}.") + + # Add stats incrementing right here - this is the code path that's actually being executed + for episode_id in episode_ids: + # Increment stat for each episode individually, just like Radarr + increment_stat("sonarr", "hunted") + sonarr_logger.info(f"*** STATS INCREMENT *** sonarr hunted by 1 for episode ID {episode_id}") + + # Log to history system + # Find the corresponding episode data for this ID + for episode in episodes_to_search: + if episode.get('id') == episode_id: + series_title = episode.get('series', {}).get('title', 'Unknown Series') + episode_title = episode.get('title', 'Unknown Episode') + season_number = episode.get('seasonNumber', 'Unknown Season') + episode_number = episode.get('episodeNumber', 'Unknown Episode') + + try: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + except (ValueError, TypeError): + season_episode = f"S{season_number}E{episode_number}" + + media_name = f"{series_title} - {season_episode} - {episode_title}" + process_id = f"{series_id}_{episode_id}" + add_processed_id("sonarr", instance_name, process_id) + log_processed_media("sonarr", media_name, episode_id, instance_name, "missing") + + # Increment the stat for each episode individually (like Radarr does for movies) + increment_stat("sonarr", "hunted") + sonarr_logger.debug(f"Incremented sonarr hunted statistic for episode {episode_id}") + break + + # The batch increment was causing issues - removing it + # increment_stat("sonarr", "hunted", len(episode_ids)) + # sonarr_logger.debug(f"Incremented sonarr hunted statistics by {len(episode_ids)}") + else: + sonarr_logger.warning(f"Episode search command (ID: {search_command_id}) for series {series_id} did not complete successfully or timed out. Episodes will not be marked as processed yet.") + else: + sonarr_logger.error(f"Failed to trigger search command for episodes {episode_ids} in series {series_id}.") + + sonarr_logger.info("Finished missing episodes processing cycle for Sonarr.") + return processed_any + +def process_missing_seasons_packs_mode( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int, + monitored_only: bool, + skip_series_refresh: bool, + hunt_missing_items: int, + command_wait_delay: int, + command_wait_attempts: int, + stop_check: Callable[[], bool] +) -> bool: + """ + Process missing seasons using the SeasonSearch command + This mode is optimized for torrent users who rely on season packs + Uses a direct episode lookup approach which is much more efficient + """ + processed_any = False + + # Get all missing episodes in one call instead of per-series + missing_episodes = sonarr_api.get_missing_episodes(api_url, api_key, api_timeout, monitored_only) + if not missing_episodes: + sonarr_logger.info("No missing episodes found") + return False + + # Group episodes by series and season + missing_seasons = {} + for episode in missing_episodes: + if monitored_only and not episode.get('monitored', False): + continue + + series_id = episode.get('seriesId') + if not series_id: + continue + + season_number = episode.get('seasonNumber') + series_title = episode.get('series', {}).get('title', 'Unknown Series') + + key = f"{series_id}:{season_number}" + if key not in missing_seasons: + missing_seasons[key] = { + 'series_id': series_id, + 'season_number': season_number, + 'series_title': series_title, + 'episode_count': 0 + } + missing_seasons[key]['episode_count'] += 1 + + # Convert to list and sort by episode count (most missing episodes first) + seasons_list = list(missing_seasons.values()) + seasons_list.sort(key=lambda x: x['episode_count'], reverse=True) + + # Filter out already processed seasons + unprocessed_seasons = [] + for season in seasons_list: + season_id = f"{season['series_id']}_{season['season_number']}" + if not is_processed("sonarr", instance_name, season_id): + unprocessed_seasons.append(season) + else: + sonarr_logger.debug(f"Skipping already processed season ID: {season_id}") + + sonarr_logger.info(f"Found {len(unprocessed_seasons)} unprocessed seasons with missing episodes out of {len(seasons_list)} total.") + + if not unprocessed_seasons: + sonarr_logger.info("All seasons with missing episodes have been processed.") + return False + + # Apply randomization if requested + random.shuffle(unprocessed_seasons) + + # Process up to hunt_missing_items seasons + processed_count = 0 + + # Add detailed logging for selected seasons + if unprocessed_seasons and hunt_missing_items > 0: + seasons_to_process = unprocessed_seasons[:hunt_missing_items] + sonarr_logger.info(f"Randomly selected {min(len(unprocessed_seasons), hunt_missing_items)} seasons with missing episodes:") + + for idx, season in enumerate(seasons_to_process): + sonarr_logger.info(f" {idx+1}. {season['series_title']} - Season {season['season_number']} ({season['episode_count']} missing episodes) (Series ID: {season['series_id']})") + + for season in unprocessed_seasons: + if processed_count >= hunt_missing_items: + break + + if stop_check(): + sonarr_logger.info("Stop signal received, halting processing.") + break + + series_id = season['series_id'] + season_number = season['season_number'] + series_title = season['series_title'] + episode_count = season['episode_count'] + + # Refresh series metadata if not skipped + if not skip_series_refresh: + sonarr_logger.debug(f"Refreshing metadata for {series_title} before season pack search") + refresh_command_id = sonarr_api.refresh_series(api_url, api_key, api_timeout, series_id) + if refresh_command_id: + wait_for_command( + api_url, api_key, api_timeout, refresh_command_id, + command_wait_delay, command_wait_attempts, "Series Refresh", stop_check + ) + + sonarr_logger.info(f"Searching for season pack: {series_title} - Season {season_number} (contains {episode_count} missing episodes)") + + # Trigger an API call to search for the entire season + command_id = sonarr_api.search_season(api_url, api_key, api_timeout, series_id, season_number) + + if command_id: + processed_any = True + processed_count += 1 + + # Add season to processed list + season_id = f"{series_id}_{season_number}" + success = add_processed_id("sonarr", instance_name, season_id) + sonarr_logger.debug(f"Added season ID {season_id} to processed list for {instance_name}, success: {success}") + + # Log to history system + media_name = f"{series_title} - Season {season_number} (contains {episode_count} missing episodes)" + log_processed_media("sonarr", media_name, season_id, instance_name, "missing") + sonarr_logger.debug(f"Logged history entry for season pack: {media_name}") + + # Increment stats one by one instead of in a batch + for i in range(episode_count): + increment_stat("sonarr", "hunted") + sonarr_logger.debug(f"Incremented sonarr hunted statistics for {episode_count} episodes in season pack") + + # Wait for command to complete if configured + if command_wait_delay > 0 and command_wait_attempts > 0: + if wait_for_command( + api_url, api_key, api_timeout, command_id, + command_wait_delay, command_wait_attempts, "Season Search", stop_check + ): + pass + else: + sonarr_logger.error(f"Failed to trigger search for {series_title}.") + + sonarr_logger.info(f"Processed {processed_count} missing season packs for Sonarr.") + return processed_any + +def process_missing_shows_mode( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int, + monitored_only: bool, + skip_future_episodes: bool, + skip_series_refresh: bool, + hunt_missing_items: int, + command_wait_delay: int, + command_wait_attempts: int, + stop_check: Callable[[], bool] +) -> bool: + """Process missing episodes in show mode - gets all missing episodes for entire shows.""" + processed_any = False + + # Get series with missing episodes + sonarr_logger.info("Retrieving series with missing episodes...") + series_with_missing = sonarr_api.get_series_with_missing_episodes( + api_url, api_key, api_timeout, monitored_only, random_mode=True) + + if not series_with_missing: + sonarr_logger.info("No series with missing episodes found.") + return False + + # Filter out shows that have been processed + unprocessed_series = [] + for series in series_with_missing: + series_id = str(series.get("series_id")) + if not is_processed("sonarr", instance_name, series_id): + unprocessed_series.append(series) + else: + sonarr_logger.debug(f"Skipping already processed series ID: {series_id}") + + sonarr_logger.info(f"Found {len(unprocessed_series)} unprocessed series with missing episodes out of {len(series_with_missing)} total.") + + if not unprocessed_series: + sonarr_logger.info("All series with missing episodes have been processed.") + return False + + # Select the shows to process (random or sequential) + shows_to_process = random.sample( + unprocessed_series, + min(len(unprocessed_series), hunt_missing_items) + ) + + # Add detailed logging for selected shows + if shows_to_process: + sonarr_logger.info("Shows selected for processing in this cycle:") + for idx, show in enumerate(shows_to_process): + show_id = show.get('series_id') + show_title = show.get('series_title', 'Unknown Show') + # Count total missing episodes across all seasons + episode_count = sum(season.get('episode_count', 0) for season in show.get('seasons', [])) + sonarr_logger.info(f" {idx+1}. {show_title} ({episode_count} missing episodes) (Show ID: {show_id})") + + # Process each show + for show in shows_to_process: + if stop_check(): + sonarr_logger.info("Stop requested. Aborting show processing.") + break + + show_id = show.get('series_id') + show_title = show.get('series_title', 'Unknown Show') + + # Get missing episodes for this show + missing_episodes = [] + for season in show.get('seasons', []): + missing_episodes.extend(season.get('episodes', [])) + + # Filter out future episodes if needed + if skip_future_episodes: + now_unix = time.time() + original_count = len(missing_episodes) + missing_episodes = [ + ep for ep in missing_episodes + if ep.get('airDateUtc') and time.mktime(time.strptime(ep['airDateUtc'], '%Y-%m-%dT%H:%M:%SZ')) < now_unix + ] + skipped_count = original_count - len(missing_episodes) + if skipped_count > 0: + sonarr_logger.info(f"Skipped {skipped_count} future episodes for {show_title} based on air date.") + + if not missing_episodes: + sonarr_logger.info(f"No eligible missing episodes found for {show_title} after filtering.") + continue + + # Log episodes to be processed + sonarr_logger.info(f"Processing {len(missing_episodes)} missing episodes for show: {show_title}") + for idx, episode in enumerate(missing_episodes[:5]): # Only log first 5 for brevity + season = episode.get('seasonNumber', 'Unknown') + ep_num = episode.get('episodeNumber', 'Unknown') + title = episode.get('title', 'Unknown Title') + sonarr_logger.debug(f" {idx+1}. S{season:02d}E{ep_num:02d} - {title}") + + if len(missing_episodes) > 5: + sonarr_logger.debug(f" ... and {len(missing_episodes)-5} more episodes.") + + # Refresh series if not skipped + if not skip_series_refresh: + sonarr_logger.info(f"Refreshing series info for {show_title}...") + refresh_command_id = sonarr_api.refresh_series(api_url, api_key, api_timeout, show_id) + if refresh_command_id: + wait_success = wait_for_command( + api_url, api_key, api_timeout, refresh_command_id, + command_wait_delay, command_wait_attempts, "Series Refresh", stop_check + ) + if not wait_success: + sonarr_logger.warning(f"Series refresh command timed out or failed for {show_title}. Proceeding with search anyway.") + else: + sonarr_logger.warning(f"Failed to trigger refresh command for {show_title}. Proceeding with search anyway.") + + # Extract episode IDs to search + episode_ids = [episode.get('id') for episode in missing_episodes if episode.get('id')] + + if not episode_ids: + sonarr_logger.warning(f"No valid episode IDs found for {show_title}.") + continue + + # Search for all episodes in the show + sonarr_logger.info(f"Searching for {len(episode_ids)} missing episodes for {show_title}...") + search_successful = sonarr_api.search_episode(api_url, api_key, api_timeout, episode_ids) + + if search_successful: + processed_any = True + sonarr_logger.info(f"Successfully processed {len(episode_ids)} missing episodes in {show_title}") + + # Add episode IDs to stateful manager IMMEDIATELY after processing each batch + for episode_id in episode_ids: + # Force flush to disk by calling add_processed_id immediately for each ID + success = add_processed_id("sonarr", instance_name, str(episode_id)) + sonarr_logger.debug(f"Added processed ID: {episode_id}, success: {success}") + + # Log each episode to history + # Find the corresponding episode data + for episode in missing_episodes: + if episode.get('id') == episode_id: + season = episode.get('seasonNumber', 'Unknown') + ep_num = episode.get('episodeNumber', 'Unknown') + title = episode.get('title', 'Unknown Title') + + try: + season_episode = f"S{season:02d}E{ep_num:02d}" + except (ValueError, TypeError): + season_episode = f"S{season}E{ep_num}" + + media_name = f"{show_title} - {season_episode} - {title}" + log_processed_media("sonarr", media_name, str(episode_id), instance_name, "missing") + sonarr_logger.debug(f"Logged history entry for episode: {media_name}") + break + + # Add series ID to processed list + success = add_processed_id("sonarr", instance_name, str(show_id)) + sonarr_logger.debug(f"Added series ID {show_id} to processed list for {instance_name}, success: {success}") + + # Also log the entire show to history + media_name = f"{show_title} - Complete Series ({len(episode_ids)} episodes)" + log_processed_media("sonarr", media_name, str(show_id), instance_name, "missing") + sonarr_logger.debug(f"Logged history entry for complete series: {media_name}") + + # Increment the hunted statistics + increment_stat("sonarr", "hunted", len(episode_ids)) + sonarr_logger.debug(f"Incremented sonarr hunted statistics by {len(episode_ids)}") + else: + sonarr_logger.error(f"Failed to trigger search for {show_title}.") + + sonarr_logger.info("Show-based missing episode processing complete.") + return processed_any + +def wait_for_command( + api_url: str, + api_key: str, + api_timeout: int, + command_id: int, + wait_delay: int, + max_attempts: int, + command_name: str = "Command", + stop_check: Callable[[], bool] = lambda: False +) -> bool: + """ + Wait for a Sonarr command to complete or timeout. + + Args: + api_url: The Sonarr API URL + api_key: The Sonarr API key + api_timeout: API request timeout + command_id: The ID of the command to monitor + wait_delay: Seconds to wait between status checks + max_attempts: Maximum number of status check attempts + command_name: Name of the command (for logging) + stop_check: Optional function to check if operation should be aborted + + Returns: + True if command completed successfully, False otherwise + """ + if wait_delay <= 0 or max_attempts <= 0: + sonarr_logger.debug(f"Not waiting for command to complete (wait_delay={wait_delay}, max_attempts={max_attempts})") + return True # Return as if successful since we're not checking + + sonarr_logger.debug(f"Waiting for {command_name} to complete (command ID: {command_id}). Checking every {wait_delay}s for up to {max_attempts} attempts") + + # Wait for command completion + attempts = 0 + while attempts < max_attempts: + if stop_check(): + sonarr_logger.info(f"Stopping wait for {command_name} due to stop request") + return False + + command_status = sonarr_api.get_command_status(api_url, api_key, api_timeout, command_id) + if not command_status: + sonarr_logger.warning(f"Failed to get status for {command_name} (ID: {command_id}), attempt {attempts+1}") + attempts += 1 + time.sleep(wait_delay) + continue + + status = command_status.get('status') + if status == 'completed': + sonarr_logger.debug(f"Sonarr {command_name} (ID: {command_id}) completed successfully") + return True + elif status in ['failed', 'aborted']: + sonarr_logger.warning(f"Sonarr {command_name} (ID: {command_id}) {status}") + return False + + sonarr_logger.debug(f"Sonarr {command_name} (ID: {command_id}) status: {status}, attempt {attempts+1}/{max_attempts}") + + attempts += 1 + time.sleep(wait_delay) + + sonarr_logger.error(f"Sonarr command '{command_name}' (ID: {command_id}) timed out after {max_attempts} attempts.") + return False \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/sonarr/upgrade.py b/Huntarr.io-6.3.6/src/primary/apps/sonarr/upgrade.py new file mode 100644 index 0000000..d6b5a2d --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/sonarr/upgrade.py @@ -0,0 +1,605 @@ +#!/usr/bin/env python3 +""" +Sonarr cutoff upgrade processing module for Huntarr +""" + +import time +import random +from typing import List, Dict, Any, Set, Callable, Union +from src.primary.utils.logger import get_logger +from src.primary.apps.sonarr import api as sonarr_api +from src.primary.stats_manager import increment_stat +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.utils.history_utils import log_processed_media +from src.primary.settings_manager import get_advanced_setting + +# Get logger for the Sonarr app +sonarr_logger = get_logger("sonarr") + +def process_cutoff_upgrades( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int = get_advanced_setting("api_timeout", 120), + monitored_only: bool = True, + skip_series_refresh: bool = False, + hunt_upgrade_items: int = 5, + command_wait_delay: int = get_advanced_setting("command_wait_delay", 1), + command_wait_attempts: int = get_advanced_setting("command_wait_attempts", 600), + stop_check: Callable[[], bool] = lambda: False +) -> bool: + """ + Process quality cutoff upgrades for Sonarr. + This function only uses the episode mode for upgrades regardless of hunt_missing_mode. + """ + if hunt_upgrade_items <= 0: + sonarr_logger.info("'hunt_upgrade_items' setting is 0 or less. Skipping upgrade processing.") + return False + + sonarr_logger.info(f"Checking for {hunt_upgrade_items} quality upgrades...") + + sonarr_logger.info("Using RANDOM selection mode for quality upgrades") + + # Always use episode mode for upgrades, regardless of the hunt_missing_mode setting + return process_upgrade_episodes_mode( + api_url, api_key, instance_name, api_timeout, monitored_only, + skip_series_refresh, hunt_upgrade_items, + command_wait_delay, command_wait_attempts, stop_check + ) + +def process_upgrade_episodes_mode( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int, + monitored_only: bool, + skip_series_refresh: bool, + hunt_upgrade_items: int, + command_wait_delay: int, + command_wait_attempts: int, + stop_check: Callable[[], bool] +) -> bool: + """Process upgrades in episode mode (original implementation).""" + processed_any = False + + # Always use the efficient random page selection method + sonarr_logger.debug(f"Using random selection for cutoff unmet episodes") + episodes_to_search = sonarr_api.get_cutoff_unmet_episodes_random_page( + api_url, api_key, api_timeout, monitored_only, hunt_upgrade_items) + + # If we didn't get enough episodes, we might need to try another page + if len(episodes_to_search) < hunt_upgrade_items and len(episodes_to_search) > 0: + sonarr_logger.debug(f"Got {len(episodes_to_search)} episodes from random page, fewer than requested {hunt_upgrade_items}") + + if stop_check(): + sonarr_logger.info("Stop requested during upgrade processing.") + return processed_any + + # Filter out future episodes for random selection approach + if skip_series_refresh: + now_unix = time.time() + original_count = len(episodes_to_search) + episodes_to_search = [ + ep for ep in episodes_to_search + if ep.get('airDateUtc') and time.mktime(time.strptime(ep['airDateUtc'], '%Y-%m-%dT%H:%M:%SZ')) < now_unix + ] + skipped_count = original_count - len(episodes_to_search) + if skipped_count > 0: + sonarr_logger.info(f"Skipped {skipped_count} future episodes based on air date for upgrades.") + + # Filter out already processed episodes for random selection approach + unprocessed_episodes = [] + for episode in episodes_to_search: + episode_id = str(episode.get("id")) + if not is_processed("sonarr", instance_name, episode_id): + unprocessed_episodes.append(episode) + else: + sonarr_logger.debug(f"Skipping already processed episode ID for upgrade: {episode_id}") + + sonarr_logger.info(f"Found {len(unprocessed_episodes)} unprocessed cutoff unmet episodes out of {len(episodes_to_search)} total.") + episodes_to_search = unprocessed_episodes + + if not episodes_to_search: + sonarr_logger.info("No cutoff unmet episodes left to process for upgrades after filtering.") + return False + + sonarr_logger.info(f"Selected {len(episodes_to_search)} cutoff unmet episodes to search for upgrades.") + + # Add detailed listing of episodes being upgraded + if episodes_to_search: + sonarr_logger.info(f"Episodes selected for quality upgrades in this cycle:") + for idx, episode in enumerate(episodes_to_search): + series_title = episode.get('series', {}).get('title', 'Unknown Series') + episode_title = episode.get('title', 'Unknown Episode') + season_number = episode.get('seasonNumber', 'Unknown Season') + episode_number = episode.get('episodeNumber', 'Unknown Episode') + + # Get quality information + quality_name = "Unknown" + if "quality" in episode and episode["quality"]: + quality_name = episode["quality"].get("quality", {}).get("name", "Unknown") + + episode_id = episode.get("id") + try: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + except (ValueError, TypeError): + season_episode = f"S{season_number}E{episode_number}" + + sonarr_logger.info(f" {idx+1}. {series_title} - {season_episode} - \"{episode_title}\" - Current quality: {quality_name} (ID: {episode_id})") + + # Group episodes by series for potential refresh + series_to_process: Dict[int, List[int]] = {} + series_titles: Dict[int, str] = {} # Store titles for logging + for episode in episodes_to_search: + series_id = episode.get('seriesId') + if series_id: + if series_id not in series_to_process: + series_to_process[series_id] = [] + # Store title when first encountering the series ID + series_titles[series_id] = episode.get('series', {}).get('title', f"Series ID {series_id}") + series_to_process[series_id].append(episode['id']) + + # Process each series + for series_id, episode_ids in series_to_process.items(): + if stop_check(): + sonarr_logger.info("Stop requested before processing next series for upgrades.") + break + + series_title = series_titles.get(series_id, f"Series ID {series_id}") + sonarr_logger.info(f"Processing series for upgrades: {series_title} (ID: {series_id}) with {len(episode_ids)} episodes.") + + # Refresh series metadata if not skipped + refresh_command_id = None + if not skip_series_refresh: + sonarr_logger.debug(f"Attempting to refresh series ID: {series_id} before upgrade search.") + refresh_command_id = sonarr_api.refresh_series(api_url, api_key, api_timeout, series_id) + if refresh_command_id: + # Wait for refresh command to complete + if not wait_for_command( + api_url, api_key, api_timeout, refresh_command_id, + command_wait_delay, command_wait_attempts, "Series Refresh (Upgrade)", stop_check + ): + sonarr_logger.warning(f"Series refresh command (ID: {refresh_command_id}) for series {series_id} did not complete successfully or timed out. Proceeding with upgrade search anyway.") + else: + sonarr_logger.warning(f"Failed to trigger refresh command for series ID: {series_id}. Proceeding without refresh.") + else: + sonarr_logger.debug(f"Skipping series refresh for series ID: {series_id} as configured.") + + if stop_check(): + sonarr_logger.info("Stop requested after series refresh attempt for upgrades.") + break + + # Trigger search for the selected episodes in this series + sonarr_logger.debug(f"Attempting upgrade search for episode IDs: {episode_ids}") + search_command_id = sonarr_api.search_episode(api_url, api_key, api_timeout, episode_ids) + + if search_command_id: + # Wait for search command to complete + if wait_for_command( + api_url, api_key, api_timeout, search_command_id, + command_wait_delay, command_wait_attempts, "Episode Upgrade Search", stop_check + ): + # Mark episodes as processed if search command completed successfully + processed_any = True # Mark that we did something + sonarr_logger.info(f"Successfully processed and searched for {len(episode_ids)} episodes in series {series_id}.") + + # Add stats incrementing right here - this is the code path that's actually being executed + for episode_id in episode_ids: + # Increment stat for each episode individually, just like Radarr + increment_stat("sonarr", "upgraded") + sonarr_logger.info(f"*** STATS INCREMENT *** sonarr upgraded by 1 for episode ID {episode_id}") + + # Mark episodes as processed using stateful management + for episode_id in episode_ids: + add_processed_id("sonarr", instance_name, str(episode_id)) + sonarr_logger.debug(f"Marked episode ID {episode_id} as processed for upgrades") + + # Find the episode information for history logging + # We need to get the episode details from the API to include proper info in history + try: + episode_details = sonarr_api.get_episode(api_url, api_key, api_timeout, episode_id) + if episode_details: + series_title = episode_details.get('series', {}).get('title', 'Unknown Series') + episode_title = episode_details.get('title', 'Unknown Episode') + season_number = episode_details.get('seasonNumber', 'Unknown Season') + episode_number = episode_details.get('episodeNumber', 'Unknown Episode') + + try: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + except (ValueError, TypeError): + season_episode = f"S{season_number}E{episode_number}" + + # Record the upgrade in history with quality upgrade identifier + media_name = f"{series_title} - {season_episode} - {episode_title}" + log_processed_media("sonarr", media_name, episode_id, instance_name, "upgrade") + sonarr_logger.debug(f"Logged quality upgrade to history for episode ID {episode_id}") + except Exception as e: + sonarr_logger.error(f"Failed to log history for episode ID {episode_id}: {str(e)}") + else: + sonarr_logger.warning(f"Episode upgrade search command (ID: {search_command_id}) for series {series_id} did not complete successfully or timed out. Episodes will not be marked as processed yet.") + else: + sonarr_logger.error(f"Failed to trigger upgrade search command for episodes {episode_ids} in series {series_id}.") + + sonarr_logger.info("Finished quality cutoff upgrades processing cycle for Sonarr.") + return processed_any + +def process_upgrade_seasons_mode( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int, + monitored_only: bool, + skip_series_refresh: bool, + hunt_upgrade_items: int, + command_wait_delay: int, + command_wait_attempts: int, + stop_check: Callable[[], bool] +) -> bool: + """Process upgrades in season mode - groups episodes by season.""" + processed_any = False + + # Get all cutoff unmet episodes + cutoff_unmet_episodes = sonarr_api.get_cutoff_unmet_episodes(api_url, api_key, api_timeout, monitored_only) + sonarr_logger.info(f"Received {len(cutoff_unmet_episodes)} cutoff unmet episodes from Sonarr API (before filtering).") + + if not cutoff_unmet_episodes: + sonarr_logger.info("No cutoff unmet episodes found in Sonarr.") + return False + + # Filter out future episodes if configured + if skip_series_refresh: + now_unix = time.time() + original_count = len(cutoff_unmet_episodes) + # Ensure airDateUtc exists and is not None before parsing + cutoff_unmet_episodes = [ + ep for ep in cutoff_unmet_episodes + if ep.get('airDateUtc') and time.mktime(time.strptime(ep['airDateUtc'], '%Y-%m-%dT%H:%M:%SZ')) < now_unix + ] + skipped_count = original_count - len(cutoff_unmet_episodes) + if skipped_count > 0: + sonarr_logger.info(f"Skipped {skipped_count} future episodes based on air date for upgrades.") + + if stop_check(): + sonarr_logger.info("Stop requested during upgrade processing.") + return processed_any + + # Group episodes by series and season + series_season_episodes: Dict[int, Dict[int, List[Dict]]] = {} + for episode in cutoff_unmet_episodes: + series_id = episode.get('seriesId') + season_number = episode.get('seasonNumber') + + if series_id is not None and season_number is not None: + if series_id not in series_season_episodes: + series_season_episodes[series_id] = {} + + if season_number not in series_season_episodes[series_id]: + series_season_episodes[series_id][season_number] = [] + + series_season_episodes[series_id][season_number].append(episode) + + # Create a list of (series_id, season_number) tuples for selection + available_seasons = [] + for series_id, seasons in series_season_episodes.items(): + for season_number, episodes in seasons.items(): + # Get series title from the first episode for this season + series_title = episodes[0].get('series', {}).get('title', f"Series ID {series_id}") + available_seasons.append((series_id, season_number, len(episodes), series_title)) + + if not available_seasons: + sonarr_logger.info("No valid seasons with cutoff unmet episodes found.") + return False + + # Select seasons to process - always randomly + random.shuffle(available_seasons) + seasons_to_process = available_seasons[:hunt_upgrade_items] + + sonarr_logger.info(f"Selected {len(seasons_to_process)} seasons with cutoff unmet episodes to process") + + # Log selected seasons + for idx, (series_id, season_number, episode_count, series_title) in enumerate(seasons_to_process): + sonarr_logger.info(f" {idx+1}. {series_title} - Season {season_number} - {episode_count} cutoff unmet episodes") + + # Process each selected season + for series_id, season_number, _, series_title in seasons_to_process: + if stop_check(): + sonarr_logger.info("Stop requested before processing next season.") + break + + episodes = series_season_episodes[series_id][season_number] + episode_ids = [episode["id"] for episode in episodes] + + sonarr_logger.info(f"Processing {series_title} - Season {season_number} with {len(episode_ids)} cutoff unmet episodes") + + # Refresh series metadata if not skipped + if not skip_series_refresh: + sonarr_logger.debug(f"Attempting to refresh series ID: {series_id}") + refresh_command_id = sonarr_api.refresh_series(api_url, api_key, api_timeout, series_id) + if refresh_command_id: + # Wait for refresh command to complete + if not wait_for_command( + api_url, api_key, api_timeout, refresh_command_id, + command_wait_delay, command_wait_attempts, "Series Refresh (Upgrade)", stop_check + ): + sonarr_logger.warning(f"Series refresh command for {series_title} did not complete successfully or timed out.") + else: + sonarr_logger.warning(f"Failed to trigger refresh command for series {series_title}") + + if stop_check(): + sonarr_logger.info("Stop requested after series refresh attempt.") + break + + # Trigger search for the selected episodes in this season + sonarr_logger.debug(f"Attempting to search for {len(episode_ids)} episodes in {series_title} Season {season_number} for upgrades") + search_command_id = sonarr_api.search_episode(api_url, api_key, api_timeout, episode_ids) + + if search_command_id: + # Wait for search command to complete + if wait_for_command( + api_url, api_key, api_timeout, search_command_id, + command_wait_delay, command_wait_attempts, "Episode Upgrade Search", stop_check + ): + # Mark as processed if search command completed successfully + processed_any = True + sonarr_logger.info(f"Successfully processed {len(episode_ids)} cutoff unmet episodes in {series_title} Season {season_number}") + + # We'll increment stats individually for each episode instead of in batch + # increment_stat("sonarr", "upgraded", len(episode_ids)) + # sonarr_logger.debug(f"Incremented sonarr upgraded statistics by {len(episode_ids)}") + + # Mark episodes as processed using stateful management + for episode_id in episode_ids: + add_processed_id("sonarr", instance_name, str(episode_id)) + sonarr_logger.debug(f"Marked episode ID {episode_id} as processed for upgrades") + + # Increment stats for this episode (consistent with Radarr's approach) + increment_stat("sonarr", "upgraded") + sonarr_logger.debug(f"Incremented sonarr upgraded statistic for episode {episode_id}") + + # Find the episode information for history logging + # We need to get the episode details from the API to include proper info in history + try: + episode_details = sonarr_api.get_episode(api_url, api_key, api_timeout, episode_id) + if episode_details: + series_title = episode_details.get('series', {}).get('title', 'Unknown Series') + episode_title = episode_details.get('title', 'Unknown Episode') + season_number = episode_details.get('seasonNumber', 'Unknown Season') + episode_number = episode_details.get('episodeNumber', 'Unknown Episode') + + try: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + except (ValueError, TypeError): + season_episode = f"S{season_number}E{episode_number}" + + # Record the upgrade in history with quality upgrade identifier + media_name = f"{series_title} - {season_episode} - {episode_title}" + log_processed_media("sonarr", media_name, episode_id, instance_name, "upgrade") + sonarr_logger.debug(f"Logged quality upgrade to history for episode ID {episode_id}") + except Exception as e: + sonarr_logger.error(f"Failed to log history for episode ID {episode_id}: {str(e)}") + else: + sonarr_logger.warning(f"Episode upgrade search command for {series_title} Season {season_number} did not complete successfully") + else: + sonarr_logger.error(f"Failed to trigger upgrade search command for {series_title} Season {season_number}") + + sonarr_logger.info("Finished quality cutoff upgrades processing cycle (season mode) for Sonarr.") + return processed_any + +def process_upgrade_shows_mode( + api_url: str, + api_key: str, + instance_name: str, + api_timeout: int, + monitored_only: bool, + skip_series_refresh: bool, + hunt_upgrade_items: int, + command_wait_delay: int, + command_wait_attempts: int, + stop_check: Callable[[], bool] +) -> bool: + """Process upgrades in show mode - gets all cutoff unmet episodes for entire shows.""" + processed_any = False + + # Get all cutoff unmet episodes + cutoff_unmet_episodes = sonarr_api.get_cutoff_unmet_episodes(api_url, api_key, api_timeout, monitored_only) + sonarr_logger.info(f"Received {len(cutoff_unmet_episodes)} cutoff unmet episodes from Sonarr API (before filtering).") + + if not cutoff_unmet_episodes: + sonarr_logger.info("No cutoff unmet episodes found in Sonarr.") + return False + + # Filter out future episodes if configured + if skip_series_refresh: + now_unix = time.time() + original_count = len(cutoff_unmet_episodes) + # Ensure airDateUtc exists and is not None before parsing + cutoff_unmet_episodes = [ + ep for ep in cutoff_unmet_episodes + if ep.get('airDateUtc') and time.mktime(time.strptime(ep['airDateUtc'], '%Y-%m-%dT%H:%M:%SZ')) < now_unix + ] + skipped_count = original_count - len(cutoff_unmet_episodes) + if skipped_count > 0: + sonarr_logger.info(f"Skipped {skipped_count} future episodes based on air date for upgrades.") + + if stop_check(): + sonarr_logger.info("Stop requested during upgrade processing.") + return processed_any + + # Group episodes by series + series_episodes: Dict[int, List[Dict]] = {} + series_titles: Dict[int, str] = {} # Keep track of series titles + + for episode in cutoff_unmet_episodes: + series_id = episode.get('seriesId') + if series_id is not None: + if series_id not in series_episodes: + series_episodes[series_id] = [] + # Store series title when first encountering the series ID + series_titles[series_id] = episode.get('series', {}).get('title', f"Series ID {series_id}") + + series_episodes[series_id].append(episode) + + # Create a list of (series_id, episode_count, series_title) tuples for selection + available_series = [(series_id, len(episodes), series_titles[series_id]) + for series_id, episodes in series_episodes.items()] + + if not available_series: + sonarr_logger.info("No series with cutoff unmet episodes found.") + return False + + # Select series to process - always randomly + random.shuffle(available_series) + series_to_process = available_series[:hunt_upgrade_items] + + sonarr_logger.info(f"Selected {len(series_to_process)} series with cutoff unmet episodes to process") + + # Log selected series + for idx, (series_id, episode_count, series_title) in enumerate(series_to_process): + sonarr_logger.info(f" {idx+1}. {series_title} - {episode_count} cutoff unmet episodes") + + # Process each selected series + for series_id, _, series_title in series_to_process: + if stop_check(): + sonarr_logger.info("Stop requested before processing next series.") + break + + episodes = series_episodes[series_id] + episode_ids = [episode["id"] for episode in episodes] + + sonarr_logger.info(f"Processing {series_title} with {len(episode_ids)} cutoff unmet episodes") + + # Refresh series metadata if not skipped + if not skip_series_refresh: + sonarr_logger.debug(f"Attempting to refresh series ID: {series_id}") + refresh_command_id = sonarr_api.refresh_series(api_url, api_key, api_timeout, series_id) + if refresh_command_id: + # Wait for refresh command to complete + if not wait_for_command( + api_url, api_key, api_timeout, refresh_command_id, + command_wait_delay, command_wait_attempts, "Series Refresh (Upgrade)", stop_check + ): + sonarr_logger.warning(f"Series refresh command for {series_title} did not complete successfully or timed out.") + else: + sonarr_logger.warning(f"Failed to trigger refresh command for series {series_title}") + + if stop_check(): + sonarr_logger.info("Stop requested after series refresh attempt.") + break + + # Trigger search for all cutoff unmet episodes in this series + sonarr_logger.debug(f"Attempting to search for {len(episode_ids)} episodes in {series_title} for upgrades") + search_command_id = sonarr_api.search_episode(api_url, api_key, api_timeout, episode_ids) + + if search_command_id: + # Wait for search command to complete + if wait_for_command( + api_url, api_key, api_timeout, search_command_id, + command_wait_delay, command_wait_attempts, "Episode Upgrade Search", stop_check + ): + # Mark as processed if search command completed successfully + processed_any = True + sonarr_logger.info(f"Successfully processed {len(episode_ids)} cutoff unmet episodes in {series_title}") + + # We'll increment stats individually for each episode instead of in batch + # increment_stat("sonarr", "upgraded", len(episode_ids)) + # sonarr_logger.debug(f"Incremented sonarr upgraded statistics by {len(episode_ids)}") + + # Mark episodes as processed using stateful management + for episode_id in episode_ids: + add_processed_id("sonarr", instance_name, str(episode_id)) + sonarr_logger.debug(f"Marked episode ID {episode_id} as processed for upgrades") + + # Increment stats for this episode (consistent with Radarr's approach) + increment_stat("sonarr", "upgraded") + sonarr_logger.debug(f"Incremented sonarr upgraded statistic for episode {episode_id}") + + # Find the episode information for history logging + # We need to get the episode details from the API to include proper info in history + try: + episode_details = sonarr_api.get_episode(api_url, api_key, api_timeout, episode_id) + if episode_details: + series_title = episode_details.get('series', {}).get('title', 'Unknown Series') + episode_title = episode_details.get('title', 'Unknown Episode') + season_number = episode_details.get('seasonNumber', 'Unknown Season') + episode_number = episode_details.get('episodeNumber', 'Unknown Episode') + + try: + season_episode = f"S{season_number:02d}E{episode_number:02d}" + except (ValueError, TypeError): + season_episode = f"S{season_number}E{episode_number}" + + # Record the upgrade in history with quality upgrade identifier + media_name = f"{series_title} - {season_episode} - {episode_title}" + log_processed_media("sonarr", media_name, episode_id, instance_name, "upgrade") + sonarr_logger.debug(f"Logged quality upgrade to history for episode ID {episode_id}") + except Exception as e: + sonarr_logger.error(f"Failed to log history for episode ID {episode_id}: {str(e)}") + else: + sonarr_logger.warning(f"Episode upgrade search command for {series_title} did not complete successfully") + else: + sonarr_logger.error(f"Failed to trigger upgrade search command for {series_title}") + + sonarr_logger.info("Finished quality cutoff upgrades processing cycle (show mode) for Sonarr.") + return processed_any + +def wait_for_command( + api_url: str, + api_key: str, + api_timeout: int, + command_id: Union[int, str], + wait_delay: int, + max_attempts: int, + command_name: str = "Command", + stop_check: Callable[[], bool] = lambda: False +) -> bool: + """ + Wait for a Sonarr command to complete or timeout. + + Args: + api_url: The Sonarr API URL + api_key: The Sonarr API key + api_timeout: API request timeout + command_id: The ID of the command to monitor + wait_delay: Seconds to wait between status checks + max_attempts: Maximum number of status check attempts + command_name: Name of the command (for logging) + stop_check: Optional function to check if operation should be aborted + + Returns: + True if command completed successfully, False otherwise + """ + if wait_delay <= 0 or max_attempts <= 0: + sonarr_logger.debug(f"Not waiting for command to complete (wait_delay={wait_delay}, max_attempts={max_attempts})") + return True # Return as if successful since we're not checking + + sonarr_logger.debug(f"Waiting for {command_name} to complete (command ID: {command_id}). Checking every {wait_delay}s for up to {max_attempts} attempts") + + # Wait for command completion + attempts = 0 + while attempts < max_attempts: + if stop_check(): + sonarr_logger.info(f"Stopping wait for {command_name} due to stop request") + return False + + command_status = sonarr_api.get_command_status(api_url, api_key, api_timeout, command_id) + if not command_status: + sonarr_logger.warning(f"Failed to get status for {command_name} (ID: {command_id}), attempt {attempts+1}") + attempts += 1 + time.sleep(wait_delay) + continue + + status = command_status.get('status') + if status == 'completed': + sonarr_logger.debug(f"Sonarr {command_name} (ID: {command_id}) completed successfully") + return True + elif status in ['failed', 'aborted']: + sonarr_logger.warning(f"Sonarr {command_name} (ID: {command_id}) {status}") + return False + + sonarr_logger.debug(f"Sonarr {command_name} (ID: {command_id}) status: {status}, attempt {attempts+1}/{max_attempts}") + + attempts += 1 + time.sleep(wait_delay) + + sonarr_logger.error(f"Sonarr command '{command_name}' (ID: {command_id}) timed out after {max_attempts} attempts.") + return False \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/sonarr_routes.py b/Huntarr.io-6.3.6/src/primary/apps/sonarr_routes.py new file mode 100644 index 0000000..7dd0d7f --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/sonarr_routes.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path, reset_state_file +from src.primary.utils.logger import get_logger +import traceback +import socket +from urllib.parse import urlparse + +sonarr_bp = Blueprint('sonarr', __name__) +sonarr_logger = get_logger("sonarr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("sonarr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("sonarr", "processed_upgrades") + +@sonarr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Sonarr API instance with comprehensive diagnostics""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Log the test attempt + sonarr_logger.info(f"Testing connection to Sonarr API at {api_url}") + + # First check if URL is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Try to establish a socket connection first to check basic connectivity + parsed_url = urlparse(api_url) + hostname = parsed_url.hostname + port = parsed_url.port or (443 if parsed_url.scheme == 'https' else 80) + + try: + # Try socket connection for quick feedback on connectivity issues + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) # Short timeout for quick feedback + result = sock.connect_ex((hostname, port)) + sock.close() + + if result != 0: + error_msg = f"Connection refused - Unable to connect to {hostname}:{port}. Please check if the server is running and the port is correct." + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except socket.gaierror: + error_msg = f"DNS resolution failed - Cannot resolve hostname: {hostname}. Please check your URL." + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except Exception as e: + # Log the socket testing error but continue with the full request + sonarr_logger.debug(f"Socket test error, continuing with full request: {str(e)}") + + # Create the test URL and set headers + test_url = f"{api_url.rstrip('/')}/api/v3/system/status" + headers = {'X-Api-Key': api_key} + + try: + # Now proceed with the actual API request + response = requests.get(test_url, headers=headers, timeout=(10, api_timeout)) + + # For HTTP errors, provide more specific feedback + if response.status_code == 401: + error_msg = "Authentication failed: Invalid API key" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 401 + elif response.status_code == 403: + error_msg = "Access forbidden: Check API key permissions" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 403 + elif response.status_code == 404: + error_msg = "API endpoint not found: This doesn't appear to be a valid Sonarr server. Check your URL." + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + elif response.status_code >= 500: + error_msg = f"Sonarr server error (HTTP {response.status_code}): The Sonarr server is experiencing issues" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), response.status_code + + # Raise for other HTTP errors + response.raise_for_status() + + # Log HTTP status code for diagnostic purposes + sonarr_logger.debug(f"Sonarr API status code: {response.status_code}") + + # Ensure the response is valid JSON + try: + response_data = response.json() + + # We no longer save keys here since we use instances + # keys_manager.save_api_keys("sonarr", api_url, api_key) + + sonarr_logger.info(f"Successfully connected to Sonarr API version: {response_data.get('version', 'unknown')}") + + # Return success with some useful information + return jsonify({ + "success": True, + "message": "Successfully connected to Sonarr API", + "version": response_data.get('version', 'unknown') + }) + except ValueError: + error_msg = "Invalid JSON response from Sonarr API - This doesn't appear to be a valid Sonarr server" + sonarr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + + except requests.exceptions.Timeout as e: + error_msg = f"Connection timed out after {api_timeout} seconds" + sonarr_logger.error(f"{error_msg}: {str(e)}") + return jsonify({"success": False, "message": error_msg}), 504 + + except requests.exceptions.ConnectionError as e: + # Handle different types of connection errors + error_details = str(e) + if "Connection refused" in error_details: + error_msg = f"Connection refused - Sonarr is not running on {api_url} or the port is incorrect" + elif "Name or service not known" in error_details or "getaddrinfo failed" in error_details: + error_msg = f"DNS resolution failed - Cannot find host '{urlparse(api_url).hostname}'. Check your URL." + else: + error_msg = f"Connection error - Check if Sonarr is running: {error_details}" + + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + + except requests.exceptions.RequestException as e: + error_msg = f"Connection test failed: {str(e)}" + sonarr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 diff --git a/Huntarr.io-6.3.6/src/primary/apps/swaparr.py b/Huntarr.io-6.3.6/src/primary/apps/swaparr.py new file mode 100644 index 0000000..83d79d7 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/swaparr.py @@ -0,0 +1,181 @@ +""" +Swaparr module for Huntarr +Handles stalled downloads in Starr apps based on the original Swaparr application +""" + +from flask import Blueprint, request, jsonify +import os +import json +from src.primary.utils.logger import get_logger +from src.primary.settings_manager import load_settings, save_settings +from src.primary.apps.swaparr.handler import process_stalled_downloads +from src.primary.apps.radarr import get_configured_instances as get_radarr_instances +from src.primary.apps.sonarr import get_configured_instances as get_sonarr_instances +from src.primary.apps.lidarr import get_configured_instances as get_lidarr_instances +from src.primary.apps.readarr import get_configured_instances as get_readarr_instances + +def get_configured_instances(): + """Get all configured Starr app instances from their respective settings""" + try: + from src.primary.apps.whisparr import get_configured_instances as get_whisparr_instances + whisparr_instances = get_whisparr_instances() + except ImportError: + whisparr_instances = [] + + try: + from src.primary.apps.eros import get_configured_instances as get_eros_instances + eros_instances = get_eros_instances() + except ImportError: + eros_instances = [] + + instances = { + "radarr": get_radarr_instances(), + "sonarr": get_sonarr_instances(), + "lidarr": get_lidarr_instances(), + "readarr": get_readarr_instances(), + "whisparr": whisparr_instances, + "eros": eros_instances + } + + logger = get_logger("swaparr") + logger.info(f"Found {sum(len(v) for v in instances.values())} configured Starr app instances") + return instances + +swaparr_bp = Blueprint('swaparr', __name__) +swaparr_logger = get_logger("swaparr") + +@swaparr_bp.route('/status', methods=['GET']) +def get_status(): + """Get Swaparr status and statistics""" + settings = load_settings("swaparr") + enabled = settings.get("enabled", False) + + # Get strike statistics from all app state directories + statistics = {} + state_dir = os.path.join(os.getenv("CONFIG_DIR", "/config"), "swaparr") + + if os.path.exists(state_dir): + for app_name in os.listdir(state_dir): + app_dir = os.path.join(state_dir, app_name) + if os.path.isdir(app_dir): + strike_file = os.path.join(app_dir, "strikes.json") + if os.path.exists(strike_file): + try: + with open(strike_file, 'r') as f: + strike_data = json.load(f) + + total_items = len(strike_data) + removed_items = sum(1 for item in strike_data.values() if item.get("removed", False)) + striked_items = sum(1 for item in strike_data.values() + if item.get("strikes", 0) > 0 and not item.get("removed", False)) + + statistics[app_name] = { + "total_tracked": total_items, + "currently_striked": striked_items, + "removed": removed_items + } + except (json.JSONDecodeError, IOError) as e: + swaparr_logger.error(f"Error reading strike data for {app_name}: {str(e)}") + statistics[app_name] = {"error": str(e)} + + return jsonify({ + "enabled": enabled, + "settings": { + "max_strikes": settings.get("max_strikes", 3), + "max_download_time": settings.get("max_download_time", "2h"), + "ignore_above_size": settings.get("ignore_above_size", "25GB"), + "remove_from_client": settings.get("remove_from_client", True), + "dry_run": settings.get("dry_run", False) + }, + "statistics": statistics + }) + +@swaparr_bp.route('/settings', methods=['GET']) +def get_settings(): + """Get Swaparr settings""" + settings = load_settings("swaparr") + return jsonify(settings) + +@swaparr_bp.route('/settings', methods=['POST']) +def update_settings(): + """Update Swaparr settings""" + data = request.json + + if not data: + return jsonify({"success": False, "message": "No data provided"}), 400 + + # Load current settings + settings = load_settings("swaparr") + + # Update settings with provided data + for key, value in data.items(): + settings[key] = value + + # Save updated settings + success = save_settings("swaparr", settings) + + if success: + return jsonify({"success": True, "message": "Settings updated successfully"}) + else: + return jsonify({"success": False, "message": "Failed to save settings"}), 500 + +@swaparr_bp.route('/reset', methods=['POST']) +def reset_strikes(): + """Reset all strikes for all apps or a specific app""" + data = request.json + app_name = data.get('app_name') if data else None + + state_dir = os.path.join(os.getenv("CONFIG_DIR", "/config"), "swaparr") + + if not os.path.exists(state_dir): + return jsonify({"success": True, "message": "No strike data to reset"}) + + if app_name: + # Reset strikes for a specific app + app_dir = os.path.join(state_dir, app_name) + if os.path.exists(app_dir): + strike_file = os.path.join(app_dir, "strikes.json") + if os.path.exists(strike_file): + try: + os.remove(strike_file) + swaparr_logger.info(f"Reset strikes for {app_name}") + return jsonify({"success": True, "message": f"Strikes reset for {app_name}"}) + except IOError as e: + swaparr_logger.error(f"Error resetting strikes for {app_name}: {str(e)}") + return jsonify({"success": False, "message": f"Failed to reset strikes for {app_name}: {str(e)}"}), 500 + return jsonify({"success": False, "message": f"No strike data found for {app_name}"}), 404 + else: + # Reset strikes for all apps + try: + for app_name in os.listdir(state_dir): + app_dir = os.path.join(state_dir, app_name) + if os.path.isdir(app_dir): + strike_file = os.path.join(app_dir, "strikes.json") + if os.path.exists(strike_file): + os.remove(strike_file) + + swaparr_logger.info("Reset all strikes") + return jsonify({"success": True, "message": "All strikes reset"}) + except IOError as e: + swaparr_logger.error(f"Error resetting all strikes: {str(e)}") + return jsonify({"success": False, "message": f"Failed to reset all strikes: {str(e)}"}), 500 + +def is_configured(): + """Check if Swaparr has any configured Starr app instances""" + instances = get_configured_instances() + return any(len(app_instances) > 0 for app_instances in instances.values()) + +def run_swaparr(): + """Run Swaparr cycle to check for stalled downloads in all configured Starr app instances""" + settings = load_settings("swaparr") + + if not settings or not settings.get("enabled", False): + swaparr_logger.debug("Swaparr is disabled, skipping run") + return + + instances = get_configured_instances() + + # Process stalled downloads for each app type and instance + for app_name, app_instances in instances.items(): + for app_settings in app_instances: + process_stalled_downloads(app_name, app_settings, settings) diff --git a/Huntarr.io-6.3.6/src/primary/apps/swaparr/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/swaparr/__init__.py new file mode 100644 index 0000000..79fd6bc --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/swaparr/__init__.py @@ -0,0 +1,16 @@ +""" +Swaparr app module for Huntarr +Contains functionality for handling stalled downloads in Starr apps +""" + +# Add necessary imports for get_configured_instances +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +swaparr_logger = get_logger("swaparr") # Get the logger instance + +# We don't need the get_configured_instances function here anymore as it's defined in swaparr.py +# to avoid circular imports + +# Export just the swaparr_logger for now +__all__ = ["swaparr_logger"] diff --git a/Huntarr.io-6.3.6/src/primary/apps/swaparr/handler.py b/Huntarr.io-6.3.6/src/primary/apps/swaparr/handler.py new file mode 100644 index 0000000..26c463c --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/swaparr/handler.py @@ -0,0 +1,467 @@ +""" +Implementation of the swaparr functionality to detect and remove stalled downloads in Starr apps. +Based on the functionality provided by https://github.com/ThijmenGThN/swaparr +""" + +import os +import json +import time +import hashlib +from datetime import datetime, timedelta +import requests + +from src.primary.utils.logger import get_logger +from src.primary.settings_manager import load_settings +from src.primary.state import get_state_file_path + +# Create logger +swaparr_logger = get_logger("swaparr") + +# Create state directory for tracking strikes +SWAPARR_STATE_DIR = os.path.join(os.getenv("CONFIG_DIR", "/config"), "swaparr") + +def ensure_state_directory(app_name): + """Ensure the state directory exists for tracking strikes for a specific app""" + app_state_dir = os.path.join(SWAPARR_STATE_DIR, app_name) + if not os.path.exists(app_state_dir): + os.makedirs(app_state_dir, exist_ok=True) + swaparr_logger.info(f"Created swaparr state directory for {app_name}: {app_state_dir}") + return app_state_dir + +def load_strike_data(app_name): + """Load strike data for a specific app""" + app_state_dir = ensure_state_directory(app_name) + strike_file = os.path.join(app_state_dir, "strikes.json") + + if not os.path.exists(strike_file): + return {} + + try: + with open(strike_file, 'r') as f: + return json.load(f) + except (json.JSONDecodeError, IOError) as e: + swaparr_logger.error(f"Error loading strike data for {app_name}: {str(e)}") + return {} + +def save_strike_data(app_name, strike_data): + """Save strike data for a specific app""" + app_state_dir = ensure_state_directory(app_name) + strike_file = os.path.join(app_state_dir, "strikes.json") + + try: + with open(strike_file, 'w') as f: + json.dump(strike_data, f, indent=2) + except IOError as e: + swaparr_logger.error(f"Error saving strike data for {app_name}: {str(e)}") + +def load_removed_items(app_name): + """Load list of permanently removed items""" + app_state_dir = ensure_state_directory(app_name) + removed_file = os.path.join(app_state_dir, "removed_items.json") + + if not os.path.exists(removed_file): + return {} + + try: + with open(removed_file, 'r') as f: + return json.load(f) + except (json.JSONDecodeError, IOError) as e: + swaparr_logger.error(f"Error loading removed items for {app_name}: {str(e)}") + return {} + +def save_removed_items(app_name, removed_items): + """Save list of permanently removed items""" + app_state_dir = ensure_state_directory(app_name) + removed_file = os.path.join(app_state_dir, "removed_items.json") + + try: + with open(removed_file, 'w') as f: + json.dump(removed_items, f, indent=2) + except IOError as e: + swaparr_logger.error(f"Error saving removed items for {app_name}: {str(e)}") + +def generate_item_hash(item): + """Generate a unique hash for an item based on its name and size. + This helps track items across restarts even if their queue ID changes.""" + hash_input = f"{item['name']}_{item['size']}" + return hashlib.md5(hash_input.encode('utf-8')).hexdigest() + +def parse_time_string_to_seconds(time_string): + """Parse a time string like '2h', '30m', '1d' to seconds""" + if not time_string: + return 7200 # Default 2 hours + + unit = time_string[-1].lower() + try: + value = int(time_string[:-1]) + except ValueError: + swaparr_logger.error(f"Invalid time string: {time_string}, using default 2 hours") + return 7200 + + if unit == 'd': + return value * 86400 # Days to seconds + elif unit == 'h': + return value * 3600 # Hours to seconds + elif unit == 'm': + return value * 60 # Minutes to seconds + else: + swaparr_logger.error(f"Unknown time unit in: {time_string}, using default 2 hours") + return 7200 + +def parse_size_string_to_bytes(size_string): + """Parse a size string like '25GB', '1TB' to bytes""" + if not size_string: + return 25 * 1024 * 1024 * 1024 # Default 25GB + + # Extract the numeric part and unit + unit = "" + for i in range(len(size_string) - 1, -1, -1): + if not size_string[i].isalpha(): + value = float(size_string[:i+1]) + unit = size_string[i+1:].upper() + break + else: + swaparr_logger.error(f"Invalid size string: {size_string}, using default 25GB") + return 25 * 1024 * 1024 * 1024 + + # Convert to bytes based on unit + if unit == 'B': + return int(value) + elif unit == 'KB': + return int(value * 1024) + elif unit == 'MB': + return int(value * 1024 * 1024) + elif unit == 'GB': + return int(value * 1024 * 1024 * 1024) + elif unit == 'TB': + return int(value * 1024 * 1024 * 1024 * 1024) + else: + swaparr_logger.error(f"Unknown size unit in: {size_string}, using default 25GB") + return 25 * 1024 * 1024 * 1024 + +def get_queue_items(app_name, api_url, api_key, api_timeout=120): + """Get download queue items from a Starr app API with pagination support""" + api_version_map = { + "radarr": "v3", + "sonarr": "v3", + "lidarr": "v1", + "readarr": "v1", + "whisparr": "v3" + } + + api_version = api_version_map.get(app_name, "v3") + + # Initialize an empty list to store all records + all_records = [] + + # Start with page 1 + page = 1 + page_size = 100 # Request a large page size to reduce API calls + + while True: + # Add pagination parameters + queue_url = f"{api_url.rstrip('/')}/api/{api_version}/queue?page={page}&pageSize={page_size}" + headers = {'X-Api-Key': api_key} + + try: + response = requests.get(queue_url, headers=headers, timeout=api_timeout) + response.raise_for_status() + queue_data = response.json() + + if api_version in ["v3"]: # Radarr, Sonarr, Whisparr use v3 + records = queue_data.get("records", []) + total_records = queue_data.get("totalRecords", 0) + else: # Lidarr, Readarr use v1 + records = queue_data + total_records = len(records) + + # Add this page's records to our collection + all_records.extend(records) + + # If we've fetched all records or there are no more, break the loop + if len(all_records) >= total_records or len(records) == 0: + break + + # Otherwise, move to the next page + page += 1 + + except requests.exceptions.RequestException as e: + swaparr_logger.error(f"Error fetching queue for {app_name} (page {page}): {str(e)}") + break + + swaparr_logger.info(f"Fetched {len(all_records)} queue items for {app_name}") + + # Normalize the response based on app type + if app_name in ["radarr", "whisparr", "eros"]: + return parse_queue_items(all_records, "movie", app_name) + elif app_name == "sonarr": + return parse_queue_items(all_records, "series", app_name) + elif app_name == "lidarr": + return parse_queue_items(all_records, "album", app_name) + elif app_name == "readarr": + return parse_queue_items(all_records, "book", app_name) + else: + swaparr_logger.error(f"Unknown app type: {app_name}") + return [] + +def parse_queue_items(records, item_type, app_name): + """Parse queue items from API response into a standardized format""" + queue_items = [] + + for record in records: + # Skip non-dictionary records + if not isinstance(record, dict): + swaparr_logger.warning(f"Skipping non-dictionary record in {app_name} queue: {record}") + continue + + # Extract the name based on the item type + name = None + if item_type == "movie" and record.get("movie"): + name = record["movie"].get("title", "Unknown Movie") + elif item_type == "series" and record.get("series"): + name = record["series"].get("title", "Unknown Series") + elif item_type == "album" and record.get("album"): + name = record["album"].get("title", "Unknown Album") + elif item_type == "book" and record.get("book"): + name = record["book"].get("title", "Unknown Book") + + # If no name was found, try to use the download title + if not name and record.get("title"): + name = record.get("title", "Unknown Download") + + # Parse ETA if available + eta_seconds = 0 + if record.get("timeleft"): + eta = record.get("timeleft", "") + # Basic parsing of timeleft format like "00:30:00" (30 minutes) + try: + eta_parts = eta.split(':') + if len(eta_parts) == 3: + eta_seconds = int(eta_parts[0]) * 3600 + int(eta_parts[1]) * 60 + int(eta_parts[2]) + except (ValueError, IndexError): + eta_seconds = 0 + + queue_items.append({ + "id": record.get("id"), + "name": name, + "size": record.get("size", 0), + "status": record.get("status", "unknown").lower(), + "eta": eta_seconds, + "error_message": record.get("errorMessage", "") + }) + + return queue_items + +def delete_download(app_name, api_url, api_key, download_id, remove_from_client=True, api_timeout=120): + """Delete a download from a Starr app""" + api_version_map = { + "radarr": "v3", + "sonarr": "v3", + "lidarr": "v1", + "readarr": "v1", + "whisparr": "v3" + } + + api_version = api_version_map.get(app_name, "v3") + delete_url = f"{api_url.rstrip('/')}/api/{api_version}/queue/{download_id}?removeFromClient={str(remove_from_client).lower()}&blocklist=true" + headers = {'X-Api-Key': api_key} + + try: + response = requests.delete(delete_url, headers=headers, timeout=api_timeout) + response.raise_for_status() + swaparr_logger.info(f"Successfully removed download {download_id} from {app_name}") + return True + except requests.exceptions.RequestException as e: + swaparr_logger.error(f"Error removing download {download_id} from {app_name}: {str(e)}") + return False + +def process_stalled_downloads(app_name, app_settings, swaparr_settings=None): + """Process stalled downloads for a specific app instance""" + if not swaparr_settings: + swaparr_settings = load_settings("swaparr") + + if not swaparr_settings or not swaparr_settings.get("enabled", False): + swaparr_logger.debug(f"Swaparr is disabled, skipping {app_name} instance: {app_settings.get('instance_name', 'Unknown')}") + return + + swaparr_logger.info(f"Processing stalled downloads for {app_name} instance: {app_settings.get('instance_name', 'Unknown')}") + + # Get settings + max_strikes = swaparr_settings.get("max_strikes", 3) + max_download_time = parse_time_string_to_seconds(swaparr_settings.get("max_download_time", "2h")) + ignore_above_size = parse_size_string_to_bytes(swaparr_settings.get("ignore_above_size", "25GB")) + remove_from_client = swaparr_settings.get("remove_from_client", True) + dry_run = swaparr_settings.get("dry_run", False) + + api_url = app_settings.get("api_url") + api_key = app_settings.get("api_key") + api_timeout = app_settings.get("api_timeout", 120) + + if not api_url or not api_key: + swaparr_logger.error(f"Missing API URL or API Key for {app_name} instance: {app_settings.get('instance_name', 'Unknown')}") + return + + # Load existing strike data + strike_data = load_strike_data(app_name) + + # Load list of permanently removed items + removed_items = load_removed_items(app_name) + + # Clean up expired removed items (older than 30 days) + now = datetime.utcnow() + for item_hash in list(removed_items.keys()): + removed_date = datetime.fromisoformat(removed_items[item_hash]["removed_time"].replace('Z', '+00:00')) + if (now - removed_date) > timedelta(days=30): + swaparr_logger.debug(f"Removing expired entry from removed items list: {removed_items[item_hash]['name']}") + del removed_items[item_hash] + + # Get current queue items + queue_items = get_queue_items(app_name, api_url, api_key, api_timeout) + + if not queue_items: + swaparr_logger.info(f"No queue items found for {app_name} instance: {app_settings.get('instance_name', 'Unknown')}") + return + + # Keep track of items still in queue for cleanup + current_item_ids = set(item["id"] for item in queue_items) + + # Clean up items that are no longer in the queue + for item_id in list(strike_data.keys()): + if int(item_id) not in current_item_ids: + swaparr_logger.debug(f"Removing item {item_id} from strike list as it's no longer in the queue") + del strike_data[item_id] + + # Process each queue item + for item in queue_items: + item_id = str(item["id"]) + item_state = "Normal" + item_hash = generate_item_hash(item) + + # Check if this item has been previously removed + if item_hash in removed_items: + last_removed_date = datetime.fromisoformat(removed_items[item_hash]["removed_time"].replace('Z', '+00:00')) + days_since_removal = (now - last_removed_date).days + + # Re-remove it automatically if it's been less than 7 days since last removal + if days_since_removal < 7: + swaparr_logger.warning(f"Found previously removed download that reappeared: {item['name']} (removed {days_since_removal} days ago)") + + if not dry_run: + if delete_download(app_name, api_url, api_key, item["id"], remove_from_client, api_timeout): + swaparr_logger.info(f"Re-removed previously removed download: {item['name']}") + # Update the removal time + removed_items[item_hash]["removed_time"] = datetime.utcnow().isoformat() + else: + swaparr_logger.info(f"DRY RUN: Would have re-removed previously removed download: {item['name']}") + + item_state = "Re-removed" if not dry_run else "Would Re-remove (Dry Run)" + continue + + # Skip large files if configured + if item["size"] >= ignore_above_size: + swaparr_logger.debug(f"Ignoring large download: {item['name']} ({item['size']} bytes > {ignore_above_size} bytes)") + item_state = "Ignored (Size)" + continue + + # Handle delayed items - we'll skip these + if item["status"] == "delay": + swaparr_logger.debug(f"Ignoring delayed download: {item['name']}") + item_state = "Ignored (Delayed)" + continue + + # Special handling for "queued" status + # We only skip truly queued items, not those with metadata issues + metadata_issue = "metadata" in item["status"].lower() or "metadata" in item["error_message"].lower() + + if item["status"] == "queued" and not metadata_issue: + # For regular queued items, check how long they've been in strike data + if item_id in strike_data and "first_strike_time" in strike_data[item_id]: + first_strike = datetime.fromisoformat(strike_data[item_id]["first_strike_time"].replace('Z', '+00:00')) + if (now - first_strike) < timedelta(hours=1): + # Skip if it's been less than 1 hour since first seeing it + swaparr_logger.debug(f"Ignoring recently queued download: {item['name']}") + item_state = "Ignored (Recently Queued)" + continue + else: + # Initialize with first strike time for queued items + if item_id not in strike_data: + strike_data[item_id] = { + "strikes": 0, + "name": item["name"], + "first_strike_time": datetime.utcnow().isoformat(), + "last_strike_time": None + } + swaparr_logger.debug(f"Monitoring new queued download: {item['name']}") + item_state = "Monitoring (Queued)" + continue + + # Initialize strike count if not already in strike data + if item_id not in strike_data: + strike_data[item_id] = { + "strikes": 0, + "name": item["name"], + "first_strike_time": datetime.utcnow().isoformat(), + "last_strike_time": None + } + + # Check if download should be striked + should_strike = False + strike_reason = "" + + # Strike if metadata issue, eta too long, or no progress (eta = 0 and not queued) + if metadata_issue: + should_strike = True + strike_reason = "Metadata" + elif item["eta"] >= max_download_time: + should_strike = True + strike_reason = "ETA too long" + elif item["eta"] == 0 and item["status"] not in ["queued", "delay"]: + should_strike = True + strike_reason = "No progress" + + # If we should strike this item, add a strike + if should_strike: + strike_data[item_id]["strikes"] += 1 + strike_data[item_id]["last_strike_time"] = datetime.utcnow().isoformat() + + if strike_data[item_id]["first_strike_time"] is None: + strike_data[item_id]["first_strike_time"] = datetime.utcnow().isoformat() + + current_strikes = strike_data[item_id]["strikes"] + swaparr_logger.info(f"Added strike ({current_strikes}/{max_strikes}) to {item['name']} - Reason: {strike_reason}") + + # If max strikes reached, remove the download + if current_strikes >= max_strikes: + swaparr_logger.warning(f"Max strikes reached for {item['name']}, removing download") + + if not dry_run: + if delete_download(app_name, api_url, api_key, item["id"], remove_from_client, api_timeout): + swaparr_logger.info(f"Successfully removed {item['name']} after {max_strikes} strikes") + + # Keep the item in strike data for reference but mark as removed + strike_data[item_id]["removed"] = True + strike_data[item_id]["removed_time"] = datetime.utcnow().isoformat() + + # Add to removed items list for persistent tracking + removed_items[item_hash] = { + "name": item["name"], + "size": item["size"], + "removed_time": datetime.utcnow().isoformat(), + "reason": strike_reason + } + else: + swaparr_logger.info(f"DRY RUN: Would have removed {item['name']} after {max_strikes} strikes") + + item_state = "Removed" if not dry_run else "Would Remove (Dry Run)" + else: + item_state = f"Striked ({current_strikes}/{max_strikes})" + + swaparr_logger.debug(f"Processed download: {item['name']} - State: {item_state}") + + # Save updated strike data + save_strike_data(app_name, strike_data) + + # Save updated removed items list + save_removed_items(app_name, removed_items) + + swaparr_logger.info(f"Finished processing stalled downloads for {app_name} instance: {app_settings.get('instance_name', 'Unknown')}") diff --git a/Huntarr.io-6.3.6/src/primary/apps/swaparr_routes.py b/Huntarr.io-6.3.6/src/primary/apps/swaparr_routes.py new file mode 100644 index 0000000..58f86be --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/swaparr_routes.py @@ -0,0 +1,134 @@ +""" +Route definitions for Swaparr API endpoints. +""" + +from flask import Blueprint, request, jsonify +import os +import json +from src.primary.utils.logger import get_logger +from src.primary.settings_manager import load_settings, save_settings +from src.primary.apps.swaparr.handler import process_stalled_downloads + +# Create the blueprint directly in this file +swaparr_bp = Blueprint('swaparr', __name__) +swaparr_logger = get_logger("swaparr") + +@swaparr_bp.route('/status', methods=['GET']) +def get_status(): + """Get Swaparr status and statistics""" + settings = load_settings("swaparr") + enabled = settings.get("enabled", False) + + # Get strike statistics from all app state directories + statistics = {} + state_dir = os.path.join(os.getenv("CONFIG_DIR", "/config"), "swaparr") + + if os.path.exists(state_dir): + for app_name in os.listdir(state_dir): + app_dir = os.path.join(state_dir, app_name) + if os.path.isdir(app_dir): + strike_file = os.path.join(app_dir, "strikes.json") + if os.path.exists(strike_file): + try: + with open(strike_file, 'r') as f: + strike_data = json.load(f) + + total_items = len(strike_data) + removed_items = sum(1 for item in strike_data.values() if item.get("removed", False)) + striked_items = sum(1 for item in strike_data.values() + if item.get("strikes", 0) > 0 and not item.get("removed", False)) + + statistics[app_name] = { + "total_tracked": total_items, + "currently_striked": striked_items, + "removed": removed_items + } + except (json.JSONDecodeError, IOError) as e: + swaparr_logger.error(f"Error reading strike data for {app_name}: {str(e)}") + statistics[app_name] = {"error": str(e)} + + return jsonify({ + "enabled": enabled, + "settings": { + "max_strikes": settings.get("max_strikes", 3), + "max_download_time": settings.get("max_download_time", "2h"), + "ignore_above_size": settings.get("ignore_above_size", "25GB"), + "remove_from_client": settings.get("remove_from_client", True), + "dry_run": settings.get("dry_run", False) + }, + "statistics": statistics + }) + +@swaparr_bp.route('/settings', methods=['GET']) +def get_settings(): + """Get Swaparr settings""" + settings = load_settings("swaparr") + return jsonify(settings) + +@swaparr_bp.route('/settings', methods=['POST']) +def update_settings(): + """Update Swaparr settings""" + data = request.json + + if not data: + return jsonify({"success": False, "message": "No data provided"}), 400 + + # Load current settings + settings = load_settings("swaparr") + + # Update settings with provided data + for key, value in data.items(): + settings[key] = value + + # Save updated settings + success = save_settings("swaparr", settings) + + if success: + return jsonify({"success": True, "message": "Settings updated successfully"}) + else: + return jsonify({"success": False, "message": "Failed to save settings"}), 500 + +@swaparr_bp.route('/reset', methods=['POST']) +def reset_strikes(): + """Reset all strikes for all apps or a specific app""" + data = request.json + app_name = data.get('app_name') if data else None + + state_dir = os.path.join(os.getenv("CONFIG_DIR", "/config"), "swaparr") + + if not os.path.exists(state_dir): + return jsonify({"success": True, "message": "No strike data to reset"}) + + if app_name: + # Reset strikes for a specific app + app_dir = os.path.join(state_dir, app_name) + if os.path.exists(app_dir): + strike_file = os.path.join(app_dir, "strikes.json") + if os.path.exists(strike_file): + try: + os.remove(strike_file) + swaparr_logger.info(f"Reset strikes for {app_name}") + return jsonify({"success": True, "message": f"Strikes reset for {app_name}"}) + except IOError as e: + swaparr_logger.error(f"Error resetting strikes for {app_name}: {str(e)}") + return jsonify({"success": False, "message": f"Failed to reset strikes for {app_name}: {str(e)}"}), 500 + return jsonify({"success": False, "message": f"No strike data found for {app_name}"}), 404 + else: + # Reset strikes for all apps + try: + for app_name in os.listdir(state_dir): + app_dir = os.path.join(state_dir, app_name) + if os.path.isdir(app_dir): + strike_file = os.path.join(app_dir, "strikes.json") + if os.path.exists(strike_file): + os.remove(strike_file) + + swaparr_logger.info("Reset all strikes") + return jsonify({"success": True, "message": "All strikes reset"}) + except IOError as e: + swaparr_logger.error(f"Error resetting all strikes: {str(e)}") + return jsonify({"success": False, "message": f"Failed to reset all strikes: {str(e)}"}), 500 + +def register_routes(app): + """Register Swaparr routes with the Flask app.""" + app.register_blueprint(swaparr_bp, url_prefix='/api/swaparr') diff --git a/Huntarr.io-6.3.6/src/primary/apps/whisparr.py b/Huntarr.io-6.3.6/src/primary/apps/whisparr.py new file mode 100644 index 0000000..33b2622 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/whisparr.py @@ -0,0 +1,171 @@ +from flask import Blueprint, request, jsonify +import datetime, os, requests +from primary import keys_manager +from src.primary.utils.logger import get_logger +from src.primary.state import get_state_file_path +from src.primary.settings_manager import load_settings + +whisparr_bp = Blueprint('whisparr', __name__) +whisparr_logger = get_logger("whisparr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("whisparr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("whisparr", "processed_upgrades") + +@whisparr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Whisparr API instance with comprehensive diagnostics""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + # Log the test attempt + whisparr_logger.info(f"Testing connection to Whisparr V2 API at {api_url}") + + # First check if URL is properly formatted + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Try multiple API path combinations to handle different Whisparr V2 setups + api_paths = [ + "/api/system/status", # Standard V2 path + "/api/v3/system/status", # Some V2 instances use V3 API + "/system/status" # Direct path without /api prefix + ] + + success = False + last_error = None + response_data = None + + for api_path in api_paths: + test_url = f"{api_url.rstrip('/')}{api_path}" + headers = {'X-Api-Key': api_key} + whisparr_logger.debug(f"Trying Whisparr API path: {test_url}") + + try: + # Use a connection timeout separate from read timeout + response = requests.get(test_url, headers=headers, timeout=(10, api_timeout)) + + # Log HTTP status code for diagnostic purposes + whisparr_logger.debug(f"Whisparr API status code: {response.status_code} for path {api_path}") + + # Check HTTP status code + if response.status_code == 404: + # Try next path if 404 + continue + + response.raise_for_status() + + # Ensure the response is valid JSON + try: + response_data = response.json() + whisparr_logger.debug(f"Whisparr API response: {response_data}") + + # Verify this is actually a Whisparr API by checking for version + version = response_data.get('version', None) + if not version: + # No version info, try next path + last_error = "API response doesn't contain version information" + continue + + # The version number should start with 2 for Whisparr + if version.startswith('2'): + whisparr_logger.info(f"Successfully connected to Whisparr V2 API version {version} using path {api_path}") + success = True + break + elif version.startswith('3'): + error_msg = f"Connected to Whisparr V3 (version {version}). Use the Eros integration for V3." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + else: + # Connected to some other version, try next path + last_error = f"Connected to unknown version {version}, but Huntarr requires Whisparr V2" + continue + + except ValueError: + last_error = "Invalid JSON response from API" + continue + + except requests.exceptions.Timeout: + last_error = f"Connection timed out after {api_timeout} seconds" + continue + + except requests.exceptions.ConnectionError: + last_error = "Failed to connect. Check that the URL is correct and that Whisparr is running." + continue + + except requests.exceptions.HTTPError as e: + last_error = f"HTTP error: {str(e)}" + continue + + except Exception as e: + last_error = f"Unexpected error: {str(e)}" + continue + + # After trying all paths + if success: + return jsonify({ + "success": True, + "message": f"Successfully connected to Whisparr V2 (version {response_data.get('version')})", + "version": response_data.get('version') + }) + else: + error_msg = last_error or "Failed to connect to Whisparr API. Please check your URL and API key." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + +# Function to check if Whisparr is configured +def is_configured(): + """Check if Whisparr API credentials are configured""" + try: + api_keys = keys_manager.load_api_keys("whisparr") + instances = api_keys.get("instances", []) + + for instance in instances: + if instance.get("enabled", True): + return True + + return False + except Exception as e: + whisparr_logger.error(f"Error checking if Whisparr is configured: {str(e)}") + return False + +# Get all valid instances from settings +def get_configured_instances(): + """Get all configured and enabled Whisparr instances""" + try: + api_keys = keys_manager.load_api_keys("whisparr") + instances = api_keys.get("instances", []) + + enabled_instances = [] + for instance in instances: + if not instance.get("enabled", True): + continue + + api_url = instance.get("api_url") + api_key = instance.get("api_key") + + if not api_url or not api_key: + continue + + # Add name and timeout + instance_name = instance.get("name", "Default") + api_timeout = instance.get("api_timeout", 90) + + enabled_instances.append({ + "api_url": api_url, + "api_key": api_key, + "instance_name": instance_name, + "api_timeout": api_timeout + }) + + return enabled_instances + except Exception as e: + whisparr_logger.error(f"Error getting configured Whisparr instances: {str(e)}") + return [] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/whisparr/__init__.py b/Huntarr.io-6.3.6/src/primary/apps/whisparr/__init__.py new file mode 100644 index 0000000..2e2c844 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/whisparr/__init__.py @@ -0,0 +1,95 @@ +""" +Whisparr app module for Huntarr +Contains functionality for missing items and quality upgrades in Whisparr + +Exclusively supports the v2 API (legacy). +""" + +# Module exports +from src.primary.apps.whisparr.missing import process_missing_items +from src.primary.apps.whisparr.upgrade import process_cutoff_upgrades +from src.primary.settings_manager import load_settings +from src.primary.utils.logger import get_logger + +# Define logger for this module +whisparr_logger = get_logger("whisparr") + +# For backward compatibility +process_missing_scenes = process_missing_items + +def get_configured_instances(): + """Get all configured and enabled Whisparr instances""" + settings = load_settings("whisparr") + instances = [] + # Use debug level to avoid log spam on new installations + whisparr_logger.debug(f"Loaded Whisparr settings for instance check: {settings}") + + if not settings: + whisparr_logger.debug("No settings found for Whisparr") + return instances + + # Always use Whisparr V2 API + # Use debug level to avoid log spam on new installations + whisparr_logger.debug("Using Whisparr V2 API exclusively") + + # Check if instances are configured + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + # Use debug level to avoid log spam on new installations + whisparr_logger.debug(f"Found 'instances' list with {len(settings['instances'])} items. Processing...") + for idx, instance in enumerate(settings["instances"]): + whisparr_logger.debug(f"Checking instance #{idx}: {instance}") + # Enhanced validation + api_url = instance.get("api_url", "").strip() + api_key = instance.get("api_key", "").strip() + + # Enhanced URL validation - ensure URL has proper scheme + if api_url and not (api_url.startswith('http://') or api_url.startswith('https://')): + whisparr_logger.warning(f"Instance '{instance.get('name', 'Unnamed')}' has URL without http(s) scheme: {api_url}") + api_url = f"http://{api_url}" + whisparr_logger.warning(f"Auto-correcting URL to: {api_url}") + + is_enabled = instance.get("enabled", True) + + # Only include properly configured instances + if is_enabled and api_url and api_key: + instance_name = instance.get("name", "Default") + + # Create a settings object for this instance by combining global settings with instance-specific ones + instance_settings = settings.copy() + + # Remove instances list to avoid confusion + if "instances" in instance_settings: + del instance_settings["instances"] + + # Override with instance-specific settings + instance_settings["api_url"] = api_url + instance_settings["api_key"] = api_key + instance_settings["instance_name"] = instance_name + + # Add timeout setting with default if not present + if "api_timeout" not in instance_settings: + instance_settings["api_timeout"] = 30 + + # Use debug level to prevent log spam + whisparr_logger.debug(f"Adding configured Whisparr instance: {instance_name}") + instances.append(instance_settings) + else: + name = instance.get("name", "Unnamed") + if not is_enabled: + whisparr_logger.debug(f"Skipping disabled instance: {name}") + else: + # For brand new installations, don't spam logs with warnings about default instances + if name == 'Default': + # Use debug level for default instances to avoid log spam on new installations + whisparr_logger.debug(f"Skipping instance {name} due to missing API URL or API Key") + else: + # Still log warnings for non-default instances + whisparr_logger.warning(f"Skipping instance {name} due to missing API URL or API Key") + else: + whisparr_logger.debug("No instances array found in settings or it's empty") + + # Use debug level to avoid spamming logs, especially with 0 instances + whisparr_logger.debug(f"Found {len(instances)} configured and enabled Whisparr instances") + return instances + +__all__ = ["process_missing_items", "process_missing_scenes", "process_cutoff_upgrades", "get_configured_instances"] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/whisparr/api.py b/Huntarr.io-6.3.6/src/primary/apps/whisparr/api.py new file mode 100644 index 0000000..c47b414 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/whisparr/api.py @@ -0,0 +1,475 @@ +#!/usr/bin/env python3 +""" +Whisparr-specific API functions +Handles all communication with the Whisparr API + +Exclusively uses the Whisparr V2 API +""" + +import requests +import json +import time +import datetime +import traceback +import sys +from typing import List, Dict, Any, Optional, Union +from src.primary.utils.logger import get_logger + +# Get logger for the Whisparr app +whisparr_logger = get_logger("whisparr") + +# Use a session for better performance +session = requests.Session() + +def arr_request(api_url: str, api_key: str, api_timeout: int, endpoint: str, method: str = "GET", data: Dict = None) -> Any: + """ + Make a request to the Whisparr V2 API. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + endpoint: The API endpoint to call + method: HTTP method (GET, POST, PUT, DELETE) + data: Optional data to send with the request + + Returns: + The JSON response from the API, or None if the request failed + """ + if not api_url or not api_key: + whisparr_logger.error("API URL or API key is missing. Check your settings.") + return None + + # Always try standard path first + api_base = "api" + whisparr_logger.debug(f"Using Whisparr API path: {api_base}") + + # Full URL - ensure no double slashes + url = f"{api_url.rstrip('/')}/{api_base}/{endpoint.lstrip('/')}" + + # Add debug logging for the exact URL being called + whisparr_logger.debug(f"Making {method} request to: {url}") + + # Headers + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + try: + if method == "GET": + response = session.get(url, headers=headers, timeout=api_timeout) + elif method == "POST": + response = session.post(url, headers=headers, json=data, timeout=api_timeout) + elif method == "PUT": + response = session.put(url, headers=headers, json=data, timeout=api_timeout) + elif method == "DELETE": + response = session.delete(url, headers=headers, timeout=api_timeout) + else: + whisparr_logger.error(f"Unsupported HTTP method: {method}") + return None + + # If we get a 404, try with v3 path instead + if response.status_code == 404: + api_base = "api/v3" + v3_url = f"{api_url.rstrip('/')}/{api_base}/{endpoint.lstrip('/')}" + whisparr_logger.debug(f"Standard path returned 404, trying with V3 path: {v3_url}") + + if method == "GET": + response = session.get(v3_url, headers=headers, timeout=api_timeout) + elif method == "POST": + response = session.post(v3_url, headers=headers, json=data, timeout=api_timeout) + elif method == "PUT": + response = session.put(v3_url, headers=headers, json=data, timeout=api_timeout) + elif method == "DELETE": + response = session.delete(v3_url, headers=headers, timeout=api_timeout) + + whisparr_logger.debug(f"V3 path request returned status code: {response.status_code}") + + # Check if the request was successful + try: + response.raise_for_status() + except requests.exceptions.HTTPError as e: + whisparr_logger.error(f"Error during {method} request to {endpoint}: {e}, Status Code: {response.status_code}") + whisparr_logger.debug(f"Response content: {response.text[:200]}") + return None + + # Try to parse JSON response + try: + if response.text: + result = response.json() + whisparr_logger.debug(f"Response from {response.url}: Status {response.status_code}, JSON parsed successfully") + return result + else: + whisparr_logger.debug(f"Response from {response.url}: Status {response.status_code}, Empty response") + return {} + except json.JSONDecodeError: + whisparr_logger.error(f"Invalid JSON response from API: {response.text[:200]}") + return None + + except requests.exceptions.RequestException as e: + whisparr_logger.error(f"Request failed: {e}") + return None + except Exception as e: + whisparr_logger.error(f"Unexpected error during API request: {e}") + return None + +def get_download_queue_size(api_url: str, api_key: str, api_timeout: int) -> int: + """ + Get the current size of the download queue. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + The number of items in the download queue, or -1 if the request failed + """ + response = arr_request(api_url, api_key, api_timeout, "queue") + + if response is None: + return -1 + + # V2 API uses records in queue response + if isinstance(response, dict) and "records" in response: + return len(response["records"]) + elif isinstance(response, list): + return len(response) + else: + return -1 + +def get_items_with_missing(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> List[Dict[str, Any]]: + """ + Get a list of items with missing files (not downloaded/available). + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored items. + + Returns: + A list of item objects with missing files, or None if the request failed. + """ + try: + whisparr_logger.debug(f"Retrieving missing items...") + + # Endpoint parameters - always use v2 format + endpoint = "wanted/missing?pageSize=1000&sortKey=airDateUtc&sortDirection=descending" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + return None + + # Extract the episodes/items + items = [] + if isinstance(response, dict) and "records" in response: + items = response["records"] + + # Filter monitored if needed + if monitored_only: + items = [item for item in items if item.get("monitored", False)] + + whisparr_logger.debug(f"Found {len(items)} missing items") + return items + + except Exception as e: + whisparr_logger.error(f"Error retrieving missing items: {str(e)}") + return None + +def get_cutoff_unmet_items(api_url: str, api_key: str, api_timeout: int, monitored_only: bool) -> List[Dict[str, Any]]: + """ + Get a list of items that don't meet their quality profile cutoff. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + monitored_only: If True, only return monitored items. + + Returns: + A list of item objects that need quality upgrades, or None if the request failed. + """ + try: + whisparr_logger.debug(f"Retrieving cutoff unmet items...") + + # Endpoint - always use v2 format + endpoint = "wanted/cutoff?pageSize=1000&sortKey=airDateUtc&sortDirection=descending" + + response = arr_request(api_url, api_key, api_timeout, endpoint) + + if response is None: + return None + + # Extract the episodes/items + items = [] + if isinstance(response, dict) and "records" in response: + items = response["records"] + + whisparr_logger.debug(f"Found {len(items)} cutoff unmet items") + + # Just filter monitored if needed + if monitored_only: + items = [item for item in items if item.get("monitored", False)] + whisparr_logger.debug(f"Found {len(items)} cutoff unmet items after filtering monitored") + + return items + + except Exception as e: + whisparr_logger.error(f"Error retrieving cutoff unmet items: {str(e)}") + return None + +def refresh_item(api_url: str, api_key: str, api_timeout: int, item_id: int) -> int: + """ + Refresh an item in Whisparr. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + item_id: The ID of the item to refresh + + Returns: + The command ID if the refresh was triggered successfully, None otherwise + """ + try: + whisparr_logger.debug(f"Refreshing item with ID {item_id}") + + # Some Whisparr versions have issues with RefreshEpisode, try a safer approach + # Use series refresh instead if we can get the series ID from the episode + # First, attempt to get the episode details + episode_endpoint = f"episode/{item_id}" + episode_data = arr_request(api_url, api_key, api_timeout, episode_endpoint) + + if episode_data and "seriesId" in episode_data: + # We have the series ID, use series refresh which is more reliable + series_id = episode_data["seriesId"] + whisparr_logger.debug(f"Retrieved series ID {series_id} for episode {item_id}, using series refresh") + + # RefreshSeries is generally more reliable + payload = { + "name": "RefreshSeries", + "seriesId": series_id + } + else: + # Fall back to episode refresh if we can't get the series ID + whisparr_logger.debug(f"Could not retrieve series ID for episode {item_id}, using episode refresh") + payload = { + "name": "RefreshEpisode", + "episodeIds": [item_id] + } + + # For commands, we need to directly try both path formats since command endpoints + # may have different structures in different Whisparr versions + command_endpoint = "command" + url = f"{api_url.rstrip('/')}/api/{command_endpoint}" + backup_url = f"{api_url.rstrip('/')}/api/v3/{command_endpoint}" + + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + # Try standard API path first + whisparr_logger.debug(f"Attempting command with standard API path: {url}") + try: + response = session.post(url, headers=headers, json=payload, timeout=api_timeout) + # If we get a 404 or 405, try the v3 path + if response.status_code in [404, 405]: + whisparr_logger.debug(f"Standard path returned {response.status_code}, trying with V3 path: {backup_url}") + response = session.post(backup_url, headers=headers, json=payload, timeout=api_timeout) + + response.raise_for_status() + result = response.json() + + if result and "id" in result: + command_id = result["id"] + whisparr_logger.debug(f"Refresh command triggered with ID {command_id}") + return command_id + else: + whisparr_logger.error("Failed to trigger refresh command - no command ID returned") + return None + except requests.exceptions.HTTPError as e: + whisparr_logger.error(f"HTTP error during refresh command: {e}, Status Code: {response.status_code}") + whisparr_logger.debug(f"Response content: {response.text[:200]}") + return None + except Exception as e: + whisparr_logger.error(f"Error sending refresh command: {e}") + return None + + except Exception as e: + whisparr_logger.error(f"Error refreshing item: {str(e)}") + return None + +def item_search(api_url: str, api_key: str, api_timeout: int, item_ids: List[int]) -> int: + """ + Trigger a search for one or more items. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + item_ids: A list of item IDs to search for + + Returns: + The command ID if the search command was triggered successfully, None otherwise + """ + try: + whisparr_logger.debug(f"Searching for items with IDs: {item_ids}") + + # Always use the same payload format since we're always using v2 API + payload = { + "name": "EpisodeSearch", + "episodeIds": item_ids + } + + # For commands, we need to directly try both path formats + command_endpoint = "command" + url = f"{api_url.rstrip('/')}/api/{command_endpoint}" + backup_url = f"{api_url.rstrip('/')}/api/v3/{command_endpoint}" + + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + # Try standard API path first + whisparr_logger.debug(f"Attempting command with standard API path: {url}") + try: + response = session.post(url, headers=headers, json=payload, timeout=api_timeout) + # If we get a 404 or 405, try the v3 path + if response.status_code in [404, 405]: + whisparr_logger.debug(f"Standard path returned {response.status_code}, trying with V3 path: {backup_url}") + response = session.post(backup_url, headers=headers, json=payload, timeout=api_timeout) + + response.raise_for_status() + result = response.json() + + if result and "id" in result: + command_id = result["id"] + whisparr_logger.debug(f"Search command triggered with ID {command_id}") + return command_id + else: + whisparr_logger.error("Failed to trigger search command - no command ID returned") + return None + except requests.exceptions.HTTPError as e: + whisparr_logger.error(f"HTTP error during search command: {e}, Status Code: {response.status_code}") + whisparr_logger.debug(f"Response content: {response.text[:200]}") + return None + except Exception as e: + whisparr_logger.error(f"Error sending search command: {e}") + return None + + except Exception as e: + whisparr_logger.error(f"Error searching for items: {str(e)}") + return None + +def get_command_status(api_url: str, api_key: str, api_timeout: int, command_id: int) -> Optional[Dict]: + """ + Get the status of a specific command. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + command_id: The ID of the command to check + + Returns: + A dictionary containing the command status, or None if the request failed. + """ + if not command_id: + whisparr_logger.error("No command ID provided for status check.") + return None + + try: + # For commands, we need to directly try both path formats + command_endpoint = f"command/{command_id}" + url = f"{api_url.rstrip('/')}/api/{command_endpoint}" + backup_url = f"{api_url.rstrip('/')}/api/v3/{command_endpoint}" + + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + # Try standard API path first + whisparr_logger.debug(f"Checking command status with standard API path: {url}") + try: + response = session.get(url, headers=headers, timeout=api_timeout) + # If we get a 404, try the v3 path + if response.status_code == 404: + whisparr_logger.debug(f"Standard path returned 404, trying with V3 path: {backup_url}") + response = session.get(backup_url, headers=headers, timeout=api_timeout) + + response.raise_for_status() + result = response.json() + + whisparr_logger.debug(f"Command {command_id} status: {result.get('status', 'unknown')}") + return result + except requests.exceptions.HTTPError as e: + whisparr_logger.error(f"HTTP error getting command status: {e}, Status Code: {response.status_code}") + whisparr_logger.debug(f"Response content: {response.text[:200]}") + return None + except Exception as e: + whisparr_logger.error(f"Error getting command status: {e}") + return None + + except Exception as e: + whisparr_logger.error(f"Error getting command status for ID {command_id}: {e}") + return None + +def check_connection(api_url: str, api_key: str, api_timeout: int) -> bool: + """ + Check the connection to Whisparr V2 API. + + Args: + api_url: The base URL of the Whisparr API + api_key: The API key for authentication + api_timeout: Timeout for the API request + + Returns: + True if the connection is successful, False otherwise + """ + try: + # For Whisparr V2, we need to handle both regular and v3 API formats + whisparr_logger.debug(f"Checking connection to Whisparr V2 instance at {api_url}") + + # First try with standard path + endpoint = "system/status" + response = arr_request(api_url, api_key, api_timeout, endpoint) + + # If that failed, try with v3 path format + if response is None: + whisparr_logger.debug("Standard API path failed, trying v3 format...") + # Try direct HTTP request to v3 endpoint without using arr_request + url = f"{api_url.rstrip('/')}/api/v3/system/status" + headers = {'X-Api-Key': api_key} + + try: + resp = session.get(url, headers=headers, timeout=api_timeout) + resp.raise_for_status() + response = resp.json() + except Exception as e: + whisparr_logger.debug(f"V3 API path also failed: {str(e)}") + return False + + if response is not None: + # Get the version information if available + version = response.get("version", "unknown") + + # Check if this is a v2.x version + if version and version.startswith('2'): + whisparr_logger.info(f"Successfully connected to Whisparr V2 API version: {version}") + return True + else: + whisparr_logger.warning(f"Connected to Whisparr but found unexpected version: {version}, expected 2.x") + return False + else: + whisparr_logger.error("Failed to connect to Whisparr V2 API") + return False + + except Exception as e: + whisparr_logger.error(f"Error checking connection to Whisparr V2 API: {str(e)}") + return False \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/whisparr/missing.py b/Huntarr.io-6.3.6/src/primary/apps/whisparr/missing.py new file mode 100644 index 0000000..0305c8b --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/whisparr/missing.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 +""" +Missing Items Processing for Whisparr +Handles searching for missing items in Whisparr + +Supports both v2 (legacy) and v3 (Eros) API versions +""" + +import time +import random +import datetime +from typing import List, Dict, Any, Set, Callable +from src.primary.utils.logger import get_logger +from src.primary.apps.whisparr import api as whisparr_api +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.stats_manager import increment_stat +from src.primary.utils.history_utils import log_processed_media +from src.primary.state import check_state_reset + +# Get logger for the app +whisparr_logger = get_logger("whisparr") + +def process_missing_items( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process missing items in Whisparr based on provided settings. + + Args: + app_settings: Dictionary containing all settings for Whisparr + stop_check: A function that returns True if the process should stop + + Returns: + True if any items were processed, False otherwise. + """ + whisparr_logger.info("Starting missing items processing cycle for Whisparr.") + processed_any = False + + # Reset state files if enough time has passed + check_state_reset("whisparr") + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + instance_name = app_settings.get("instance_name", "Whisparr Default") + + # Use the centralized advanced setting for stateful management hours + stateful_management_hours = get_advanced_setting("stateful_management_hours", 168) + + monitored_only = app_settings.get("monitored_only", True) + skip_future_releases = app_settings.get("skip_future_releases", True) + skip_item_refresh = app_settings.get("skip_item_refresh", False) + + # Use the new hunt_missing_items parameter name, falling back to hunt_missing_scenes for backwards compatibility + hunt_missing_items = app_settings.get("hunt_missing_items", app_settings.get("hunt_missing_scenes", 0)) + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + # Log that we're using Whisparr V2 API + whisparr_logger.info(f"Using Whisparr V2 API for instance: {instance_name}") + + # Skip if hunt_missing_items is set to 0 + if hunt_missing_items <= 0: + whisparr_logger.info("'hunt_missing_items' setting is 0 or less. Skipping missing item processing.") + return False + + # Check for stop signal + if stop_check(): + whisparr_logger.info("Stop requested before starting missing items. Aborting...") + return False + + # Get missing items + whisparr_logger.info(f"Retrieving items with missing files...") + missing_items = whisparr_api.get_items_with_missing(api_url, api_key, api_timeout, monitored_only) + + if missing_items is None: # API call failed + whisparr_logger.error("Failed to retrieve missing items from Whisparr API.") + return False + + if not missing_items: + whisparr_logger.info("No missing items found.") + return False + + # Check for stop signal after retrieving items + if stop_check(): + whisparr_logger.info("Stop requested after retrieving missing items. Aborting...") + return False + + whisparr_logger.info(f"Found {len(missing_items)} items with missing files.") + + # Filter out future releases if configured + if skip_future_releases: + now = datetime.datetime.now(datetime.timezone.utc) + original_count = len(missing_items) + # Whisparr item object has 'airDateUtc' for release dates + missing_items = [ + item for item in missing_items + if not item.get('airDateUtc') or ( + item.get('airDateUtc') and + datetime.datetime.fromisoformat(item['airDateUtc'].replace('Z', '+00:00')) < now + ) + ] + skipped_count = original_count - len(missing_items) + if skipped_count > 0: + whisparr_logger.info(f"Skipped {skipped_count} future item releases based on air date.") + + if not missing_items: + whisparr_logger.info("No missing items left to process after filtering future releases.") + return False + + # Filter out already processed items using stateful management + unprocessed_items = [] + for item in missing_items: + item_id = str(item.get("id")) + if not is_processed("whisparr", instance_name, item_id): + unprocessed_items.append(item) + else: + whisparr_logger.debug(f"Skipping already processed item ID: {item_id}") + + whisparr_logger.info(f"Found {len(unprocessed_items)} unprocessed items out of {len(missing_items)} total items with missing files.") + + if not unprocessed_items: + whisparr_logger.info(f"No unprocessed items found for {instance_name}. All available items have been processed.") + return False + + items_processed = 0 + processing_done = False + + # Select items to search based on configuration + whisparr_logger.info(f"Randomly selecting up to {hunt_missing_items} missing items.") + items_to_search = random.sample(unprocessed_items, min(len(unprocessed_items), hunt_missing_items)) + + whisparr_logger.info(f"Selected {len(items_to_search)} missing items to search.") + + # Process selected items + for item in items_to_search: + # Check for stop signal before each item + if stop_check(): + whisparr_logger.info("Stop requested during item processing. Aborting...") + break + + # Re-check limit in case it changed + current_limit = app_settings.get("hunt_missing_items", app_settings.get("hunt_missing_scenes", 1)) + if items_processed >= current_limit: + whisparr_logger.info(f"Reached HUNT_MISSING_ITEMS limit ({current_limit}) for this cycle.") + break + + item_id = item.get("id") + title = item.get("title", "Unknown Title") + season_episode = f"S{item.get('seasonNumber', 0):02d}E{item.get('episodeNumber', 0):02d}" + + whisparr_logger.info(f"Processing missing item: \"{title}\" - {season_episode} (Item ID: {item_id})") + + # Refresh the item information if not skipped + refresh_command_id = None + if not skip_item_refresh: + whisparr_logger.info(" - Refreshing item information...") + refresh_command_id = whisparr_api.refresh_item(api_url, api_key, api_timeout, item_id) + if refresh_command_id: + whisparr_logger.info(f"Triggered refresh command {refresh_command_id}. Waiting a few seconds...") + time.sleep(5) # Basic wait + else: + whisparr_logger.warning(f"Failed to trigger refresh command for item ID: {item_id}. Proceeding without refresh.") + else: + whisparr_logger.info(" - Skipping item refresh (skip_item_refresh=true)") + + # Mark the item as processed BEFORE triggering any searches + add_processed_id("whisparr", instance_name, str(item_id)) + whisparr_logger.debug(f"Added item ID {item_id} to processed list for {instance_name}") + + # Check for stop signal before searching + if stop_check(): + whisparr_logger.info(f"Stop requested before searching for {title}. Aborting...") + break + + # Search for the item + whisparr_logger.info(" - Searching for missing item...") + search_command_id = whisparr_api.item_search(api_url, api_key, api_timeout, [item_id]) + if search_command_id: + whisparr_logger.info(f"Triggered search command {search_command_id}. Assuming success for now.") + + # Log to history system + media_name = f"{title} - {season_episode}" + log_processed_media("whisparr", media_name, item_id, instance_name, "missing") + whisparr_logger.debug(f"Logged history entry for item: {media_name}") + + items_processed += 1 + processing_done = True + + # Increment the hunted statistics for Whisparr + increment_stat("whisparr", "hunted", 1) + whisparr_logger.debug(f"Incremented whisparr hunted statistics by 1") + + # Log progress + current_limit = app_settings.get("hunt_missing_items", app_settings.get("hunt_missing_scenes", 1)) + whisparr_logger.info(f"Processed {items_processed}/{current_limit} missing items this cycle.") + else: + whisparr_logger.warning(f"Failed to trigger search command for item ID {item_id}.") + # Do not mark as processed if search couldn't be triggered + continue + + # Log final status + if items_processed > 0: + whisparr_logger.info(f"Completed processing {items_processed} missing items for this cycle.") + else: + whisparr_logger.info("No new missing items were processed in this run.") + + return processing_done + +# For backward compatibility with the background processing system +def process_missing_scenes(app_settings, stop_check): + """ + Backwards compatibility function that calls process_missing_items. + + Args: + app_settings: Dictionary containing all settings for Whisparr + stop_check: A function that returns True if the process should stop + + Returns: + Result from process_missing_items + """ + return process_missing_items(app_settings, stop_check) \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/whisparr/upgrade.py b/Huntarr.io-6.3.6/src/primary/apps/whisparr/upgrade.py new file mode 100644 index 0000000..d04415c --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/whisparr/upgrade.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +""" +Quality Upgrade Processing for Whisparr +Handles searching for items that need quality upgrades in Whisparr + +Supports both v2 (legacy) and v3 (Eros) API versions +""" + +import time +import random +from typing import Dict, Any, List, Callable +from datetime import datetime, timedelta +from src.primary.utils.logger import get_logger +from src.primary.apps.whisparr import api as whisparr_api +from src.primary.settings_manager import load_settings, get_advanced_setting +from src.primary.stateful_manager import is_processed, add_processed_id +from src.primary.stats_manager import increment_stat +from src.primary.utils.history_utils import log_processed_media +from src.primary.state import check_state_reset + +# Get logger for the app +whisparr_logger = get_logger("whisparr") + +def process_cutoff_upgrades( + app_settings: Dict[str, Any], + stop_check: Callable[[], bool] # Function to check if stop is requested +) -> bool: + """ + Process quality cutoff upgrades for Whisparr based on settings. + + Args: + app_settings: Dictionary containing all settings for Whisparr + stop_check: A function that returns True if the process should stop + + Returns: + True if any items were processed for upgrades, False otherwise. + """ + whisparr_logger.info("Starting quality cutoff upgrades processing cycle for Whisparr.") + processed_any = False + + # Reset state files if enough time has passed + check_state_reset("whisparr") + + # Extract necessary settings + api_url = app_settings.get("api_url", "").strip() + api_key = app_settings.get("api_key", "").strip() + api_timeout = get_advanced_setting("api_timeout", 120) # Use general.json value + instance_name = app_settings.get("instance_name", "Whisparr Default") + + # Use advanced settings from general.json for command operations + command_wait_delay = get_advanced_setting("command_wait_delay", 1) + command_wait_attempts = get_advanced_setting("command_wait_attempts", 600) + + monitored_only = app_settings.get("monitored_only", True) + skip_item_refresh = app_settings.get("skip_item_refresh", False) + + # Use the new hunt_upgrade_items parameter name, falling back to hunt_upgrade_scenes for backwards compatibility + hunt_upgrade_items = app_settings.get("hunt_upgrade_items", app_settings.get("hunt_upgrade_scenes", 0)) + + state_reset_interval_hours = get_advanced_setting("stateful_management_hours", 168) + + # Log that we're using Whisparr V2 API + whisparr_logger.info(f"Using Whisparr V2 API for instance: {instance_name}") + + # Skip if hunt_upgrade_items is set to 0 + if hunt_upgrade_items <= 0: + whisparr_logger.info("'hunt_upgrade_items' setting is 0 or less. Skipping quality upgrade processing.") + return False + + # Check for stop signal + if stop_check(): + whisparr_logger.info("Stop requested before starting quality upgrades. Aborting...") + return False + + # Get items eligible for upgrade + whisparr_logger.info(f"Retrieving items eligible for cutoff upgrade...") + upgrade_eligible_data = whisparr_api.get_cutoff_unmet_items(api_url, api_key, api_timeout, monitored_only) + + if not upgrade_eligible_data: + whisparr_logger.info("No items found eligible for upgrade or error retrieving them.") + return False + + # Check for stop signal after retrieving eligible items + if stop_check(): + whisparr_logger.info("Stop requested after retrieving upgrade eligible items. Aborting...") + return False + + whisparr_logger.info(f"Found {len(upgrade_eligible_data)} items eligible for quality upgrade.") + + # Filter out already processed items using stateful management + unprocessed_items = [] + for item in upgrade_eligible_data: + item_id = str(item.get("id")) + if not is_processed("whisparr", instance_name, item_id): + unprocessed_items.append(item) + else: + whisparr_logger.debug(f"Skipping already processed item ID: {item_id}") + + whisparr_logger.info(f"Found {len(unprocessed_items)} unprocessed items out of {len(upgrade_eligible_data)} total items eligible for quality upgrade.") + + if not unprocessed_items: + whisparr_logger.info(f"No unprocessed items found for {instance_name}. All available items have been processed.") + return False + + items_processed = 0 + processing_done = False + + # Always use random selection for upgrades + whisparr_logger.info(f"Randomly selecting up to {hunt_upgrade_items} items for quality upgrade.") + items_to_upgrade = random.sample(unprocessed_items, min(len(unprocessed_items), hunt_upgrade_items)) + + whisparr_logger.info(f"Selected {len(items_to_upgrade)} items for quality upgrade.") + + # Process selected items + for item in items_to_upgrade: + # Check for stop signal before each item + if stop_check(): + whisparr_logger.info("Stop requested during item processing. Aborting...") + break + + # Re-check limit in case it changed + current_limit = app_settings.get("hunt_upgrade_items", app_settings.get("hunt_upgrade_scenes", 1)) + if items_processed >= current_limit: + whisparr_logger.info(f"Reached HUNT_UPGRADE_ITEMS limit ({current_limit}) for this cycle.") + break + + item_id = item.get("id") + title = item.get("title", "Unknown Title") + season_episode = f"S{item.get('seasonNumber', 0):02d}E{item.get('episodeNumber', 0):02d}" + + current_quality = item.get("episodeFile", {}).get("quality", {}).get("quality", {}).get("name", "Unknown") + + whisparr_logger.info(f"Processing item for quality upgrade: \"{title}\" - {season_episode} (Item ID: {item_id})") + whisparr_logger.info(f" - Current quality: {current_quality}") + + # Refresh the item information if not skipped + refresh_command_id = None + if not skip_item_refresh: + whisparr_logger.info(" - Refreshing item information...") + refresh_command_id = whisparr_api.refresh_item(api_url, api_key, api_timeout, item_id) + if refresh_command_id: + whisparr_logger.info(f"Triggered refresh command {refresh_command_id}. Waiting a few seconds...") + time.sleep(5) # Basic wait + else: + whisparr_logger.warning(f"Failed to trigger refresh command for item ID: {item_id}. Proceeding without refresh.") + else: + whisparr_logger.info(" - Skipping item refresh (skip_item_refresh=true)") + + # Check for stop signal before searching + if stop_check(): + whisparr_logger.info(f"Stop requested before searching for {title}. Aborting...") + break + + # Mark the item as processed BEFORE triggering any searches + add_processed_id("whisparr", instance_name, str(item_id)) + whisparr_logger.debug(f"Added item ID {item_id} to processed list for {instance_name}") + + # Search for the item + whisparr_logger.info(" - Searching for quality upgrade...") + search_command_id = whisparr_api.item_search(api_url, api_key, api_timeout, [item_id]) + if search_command_id: + whisparr_logger.info(f"Triggered search command {search_command_id}. Assuming success for now.") + + # Log to history so the upgrade appears in the history UI + series_title = item.get("series", {}).get("title", "Unknown Series") + media_name = f"{series_title} - {season_episode} - {title}" + log_processed_media("whisparr", media_name, item_id, instance_name, "upgrade") + whisparr_logger.debug(f"Logged quality upgrade to history for item ID {item_id}") + + items_processed += 1 + processing_done = True + + # Increment the upgraded statistics for Whisparr + increment_stat("whisparr", "upgraded", 1) + whisparr_logger.debug(f"Incremented whisparr upgraded statistics by 1") + + # Log progress + current_limit = app_settings.get("hunt_upgrade_items", app_settings.get("hunt_upgrade_scenes", 1)) + whisparr_logger.info(f"Processed {items_processed}/{current_limit} items for quality upgrade this cycle.") + else: + whisparr_logger.warning(f"Failed to trigger search command for item ID {item_id}.") + # Do not mark as processed if search couldn't be triggered + continue + + # Log final status + if items_processed > 0: + whisparr_logger.info(f"Completed processing {items_processed} items for quality upgrade for this cycle.") + else: + whisparr_logger.info("No new items were processed for quality upgrade in this run.") + + return processing_done \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/apps/whisparr_routes.py b/Huntarr.io-6.3.6/src/primary/apps/whisparr_routes.py new file mode 100644 index 0000000..6c35943 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/apps/whisparr_routes.py @@ -0,0 +1,337 @@ +#!/usr/bin/env python3 + +from flask import Blueprint, request, jsonify +import datetime, os, requests +from src.primary import keys_manager +from src.primary.state import get_state_file_path, reset_state_file +from src.primary.utils.logger import get_logger, APP_LOG_FILES +import traceback +import socket +from urllib.parse import urlparse +from src.primary.apps.whisparr import api as whisparr_api + +whisparr_bp = Blueprint('whisparr', __name__) +whisparr_logger = get_logger("whisparr") + +# Make sure we're using the correct state files +PROCESSED_MISSING_FILE = get_state_file_path("whisparr", "processed_missing") +PROCESSED_UPGRADES_FILE = get_state_file_path("whisparr", "processed_upgrades") + +@whisparr_bp.route('/status', methods=['GET']) +def get_status(): + """Get the status of all configured Whisparr instances""" + try: + # Get all configured instances + api_keys = keys_manager.load_api_keys("whisparr") + instances = api_keys.get("instances", []) + + connected_count = 0 + total_configured = len(instances) + + for instance in instances: + api_url = instance.get("api_url") + api_key = instance.get("api_key") + if api_url and api_key and instance.get("enabled", True): + # Use a short timeout for status checks + if whisparr_api.check_connection(api_url, api_key, 5): + connected_count += 1 + + return jsonify({ + "configured": total_configured > 0, + "connected": connected_count > 0, + "connected_count": connected_count, + "total_configured": total_configured + }) + except Exception as e: + whisparr_logger.error(f"Error getting Whisparr status: {str(e)}") + return jsonify({ + "configured": False, + "connected": False, + "error": str(e) + }), 500 + +@whisparr_bp.route('/test-connection', methods=['POST']) +def test_connection(): + """Test connection to a Whisparr API instance""" + data = request.json + api_url = data.get('api_url') + api_key = data.get('api_key') + api_timeout = data.get('api_timeout', 30) # Use longer timeout for connection test + + if not api_url or not api_key: + return jsonify({"success": False, "message": "API URL and API Key are required"}), 400 + + whisparr_logger.info(f"Testing connection to Whisparr API at {api_url}") + + # Validate URL format + if not (api_url.startswith('http://') or api_url.startswith('https://')): + error_msg = "API URL must start with http:// or https://" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + + # Try to establish a socket connection first to check basic connectivity + parsed_url = urlparse(api_url) + hostname = parsed_url.hostname + port = parsed_url.port or (443 if parsed_url.scheme == 'https' else 80) + + try: + # Try socket connection for quick feedback on connectivity issues + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) # Short timeout for quick feedback + result = sock.connect_ex((hostname, port)) + sock.close() + + if result != 0: + error_msg = f"Connection refused - Unable to connect to {hostname}:{port}. Please check if the server is running and the port is correct." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except socket.gaierror: + error_msg = f"DNS resolution failed - Cannot resolve hostname: {hostname}. Please check your URL." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except Exception as e: + # Log the socket testing error but continue with the full request + whisparr_logger.debug(f"Socket test error, continuing with full request: {str(e)}") + + # First try standard API endpoint (Whisparr v2) + api_paths = [ + {"url": f"{api_url.rstrip('/')}/api/system/status", "version": "v2"}, + {"url": f"{api_url.rstrip('/')}/api/v3/system/status", "version": "v3"} + ] + + headers = { + "X-Api-Key": api_key, + "Content-Type": "application/json" + } + + response = None + detected_version = None + + # Try each API path in order + for api_path in api_paths: + try: + url = api_path["url"] + whisparr_logger.debug(f"Trying API path: {url}") + response = requests.get(url, headers=headers, timeout=(10, api_timeout)) + + if response.status_code == 200: + detected_version = api_path["version"] + break + + except requests.exceptions.RequestException: + continue + + # If no successful response was obtained + if not response or response.status_code != 200: + if response: + # For HTTP errors, provide more specific feedback + if response.status_code == 401: + error_msg = "Authentication failed: Invalid API key" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 401 + elif response.status_code == 403: + error_msg = "Access forbidden: Check API key permissions" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 403 + elif response.status_code == 404: + error_msg = "API endpoint not found: This doesn't appear to be a valid Whisparr server. Check your URL." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + elif response.status_code >= 500: + error_msg = f"Whisparr server error (HTTP {response.status_code}): The Whisparr server is experiencing issues" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), response.status_code + else: + error_msg = f"HTTP error {response.status_code} connecting to Whisparr" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), response.status_code + else: + error_msg = "Could not connect to any Whisparr API endpoint" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + + # Successfully connected, now validate version + try: + response_data = response.json() + version = response_data.get('version', 'unknown') + whisparr_logger.info(f"Successfully connected to Whisparr API version: {version} (API {detected_version})") + + # Check if this is a v2 version + if version and version.startswith('2'): + # Detected v2 + return jsonify({ + "success": True, + "message": "Successfully connected to Whisparr API", + "version": version, + "is_v2": True + }) + elif version and version.startswith('3'): + # Detected Eros API (V3) + error_msg = f"Incompatible Whisparr version {version} detected. Huntarr requires Whisparr V2." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + else: + error_msg = f"Unexpected Whisparr version {version} detected. Huntarr requires Whisparr V2." + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 400 + except ValueError: + error_msg = "Invalid JSON response from Whisparr API - This doesn't appear to be a valid Whisparr server" + whisparr_logger.error(f"{error_msg}. Response content: {response.text[:200]}") + return jsonify({"success": False, "message": error_msg}), 500 + except requests.exceptions.ConnectionError as e: + # Handle different types of connection errors + error_details = str(e) + if "Connection refused" in error_details: + error_msg = f"Connection refused - Whisparr is not running on {api_url} or the port is incorrect" + elif "Name or service not known" in error_details or "getaddrinfo failed" in error_details: + error_msg = f"DNS resolution failed - Cannot find host '{urlparse(api_url).hostname}'. Check your URL." + else: + error_msg = f"Connection error - Check if Whisparr is running: {error_details}" + + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 404 + except requests.exceptions.Timeout: + error_msg = f"Connection timed out - Whisparr took too long to respond" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 504 + except requests.exceptions.RequestException as e: + error_msg = f"Connection test failed: {str(e)}" + whisparr_logger.error(error_msg) + return jsonify({"success": False, "message": error_msg}), 500 + +# Function to check if Whisparr is configured +def is_configured(): + """Check if Whisparr API credentials are configured""" + api_keys = keys_manager.load_api_keys("whisparr") + return api_keys.get("api_url") and api_keys.get("api_key") + +@whisparr_bp.route('/versions', methods=['GET']) +def get_versions(): + """Get the version information from the Whisparr API""" + try: + # Get all configured instances + api_keys = keys_manager.load_api_keys("whisparr") + instances = api_keys.get("instances", []) + + if not instances: + return jsonify({"success": False, "message": "No Whisparr instances configured"}), 404 + + results = [] + for instance in instances: + if not instance.get("enabled", True): + continue + + api_url = instance.get("api_url") + api_key = instance.get("api_key") + instance_name = instance.get("name", "Default") + + if not api_url or not api_key: + results.append({ + "name": instance_name, + "success": False, + "message": "API URL or API Key missing" + }) + continue + + # First try standard API endpoint + version_url = f"{api_url.rstrip('/')}/api/system/status" + headers = {"X-Api-Key": api_key} + + try: + response = requests.get(version_url, headers=headers, timeout=10) + + # If we get a 404, try with the v3 path + if response.status_code == 404: + whisparr_logger.debug(f"Standard API path failed for {instance_name}, trying v3 path") + v3_url = f"{api_url.rstrip('/')}/api/v3/system/status" + response = requests.get(v3_url, headers=headers, timeout=10) + + if response.status_code == 200: + version_data = response.json() + version = version_data.get("version", "Unknown") + + # Validate that it's a V2 version + if version and version.startswith('2'): + results.append({ + "name": instance_name, + "success": True, + "version": version, + "is_v2": True + }) + elif version and version.startswith('3'): + # Reject Eros API version + results.append({ + "name": instance_name, + "success": False, + "message": f"Incompatible Whisparr version {version} detected. Huntarr requires Whisparr V2.", + "version": version + }) + else: + # Unexpected version + results.append({ + "name": instance_name, + "success": False, + "message": f"Unexpected Whisparr version {version} detected. Huntarr requires Whisparr V2.", + "version": version + }) + else: + # API call failed + results.append({ + "name": instance_name, + "success": False, + "message": f"Failed to get version information: HTTP {response.status_code}" + }) + except requests.exceptions.RequestException as e: + results.append({ + "name": instance_name, + "success": False, + "message": f"Connection error: {str(e)}" + }) + + return jsonify({"success": True, "results": results}) + except Exception as e: + whisparr_logger.error(f"Error getting Whisparr versions: {str(e)}") + return jsonify({"success": False, "message": str(e)}), 500 + +@whisparr_bp.route('/logs', methods=['GET']) +def get_logs(): + """Get the log file for Whisparr""" + try: + # Get the log file path + log_file = APP_LOG_FILES.get("whisparr") + + if not log_file or not os.path.exists(log_file): + return jsonify({"success": False, "message": "Log file not found"}), 404 + + # Read the log file (last 200 lines) + with open(log_file, 'r') as f: + lines = f.readlines() + log_content = ''.join(lines[-200:]) + + return jsonify({"success": True, "logs": log_content}) + except Exception as e: + error_message = f"Error fetching Whisparr logs: {str(e)}" + whisparr_logger.error(error_message) + traceback.print_exc() + return jsonify({"success": False, "message": error_message}), 500 + +@whisparr_bp.route('/clear-processed', methods=['POST']) +def clear_processed(): + """Clear the processed missing and upgrade files for Whisparr""" + try: + # Reset missing items state file + whisparr_logger.info("Clearing processed missing items state") + reset_state_file("whisparr", "processed_missing") + + # Reset upgrade state file + whisparr_logger.info("Clearing processed quality upgrade state") + reset_state_file("whisparr", "processed_upgrades") + + return jsonify({ + "success": True, + "message": "Successfully cleared Whisparr processed state" + }) + except Exception as e: + error_message = f"Error clearing Whisparr processed state: {str(e)}" + whisparr_logger.error(error_message) + return jsonify({"success": False, "message": error_message}), 500 \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/auth.py b/Huntarr.io-6.3.6/src/primary/auth.py new file mode 100644 index 0000000..01f320c --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/auth.py @@ -0,0 +1,554 @@ +#!/usr/bin/env python3 +""" +Authentication module for Huntarr +Handles user creation, verification, and session management +Including two-factor authentication +""" + +import os +import json +import hashlib +import secrets +import time +import pathlib +import base64 +import io +import qrcode +import pyotp # Ensure pyotp is imported +import re # Import the re module for regex +from typing import Dict, Any, Optional, Tuple +from flask import request, redirect, url_for, session +from .utils.logger import logger # Ensure logger is imported + +# User directory setup +USER_DIR = pathlib.Path("/config/user") +USER_DIR.mkdir(parents=True, exist_ok=True) +USER_FILE = USER_DIR / "credentials.json" + +# Session settings +SESSION_EXPIRY = 60 * 60 * 24 * 7 # 1 week in seconds +SESSION_COOKIE_NAME = "huntarr_session" + +# Store active sessions +active_sessions = {} + +# --- Add Helper functions for user data --- +def get_user_data() -> Dict[str, Any]: + """Load user data from the credentials file.""" + if not USER_FILE.exists(): + logger.warning(f"Attempted to get user data, but file not found: {USER_FILE}") + return {} + try: + with open(USER_FILE, 'r') as f: + return json.load(f) + except json.JSONDecodeError: + logger.error(f"Error decoding JSON from user file: {USER_FILE}") + return {} + except Exception as e: + logger.error(f"Error reading user file {USER_FILE}: {e}", exc_info=True) + return {} + +def save_user_data(user_data: Dict[str, Any]) -> bool: + """Save user data to the credentials file.""" + try: + logger.debug(f"Attempting to save user data to: {USER_FILE}") + # Ensure directory exists (though it should from startup) + USER_DIR.mkdir(parents=True, exist_ok=True) + + with open(USER_FILE, 'w') as f: + json.dump(user_data, f, indent=4) # Add indent for readability + + # Set permissions after writing + try: + os.chmod(USER_FILE, 0o644) + logger.debug(f"Set permissions 0o644 on {USER_FILE}") + except Exception as e_perm: + logger.warning(f"Could not set permissions on file {USER_FILE}: {e_perm}") + + logger.info(f"User data saved successfully to {USER_FILE}") + return True + except Exception as e: + logger.error(f"Error saving user file {USER_FILE}: {e}", exc_info=True) + return False +# --- End Helper functions --- + +def hash_password(password: str) -> str: + """Hash a password for storage""" + # Use SHA-256 with a salt + salt = secrets.token_hex(16) + pw_hash = hashlib.sha256((password + salt).encode()).hexdigest() + return f"{salt}:{pw_hash}" + +def verify_password(stored_password: str, provided_password: str) -> bool: + """Verify a password against its hash""" + try: + salt, pw_hash = stored_password.split(':', 1) + verify_hash = hashlib.sha256((provided_password + salt).encode()).hexdigest() + return secrets.compare_digest(verify_hash, pw_hash) + except Exception as e: + logger.error(f"Error verifying password hash: {e}", exc_info=True) + return False + +def hash_username(username: str) -> str: + """Create a normalized hash of the username""" + # Convert to lowercase and hash + return hashlib.sha256(username.lower().encode()).hexdigest() + +def validate_password_strength(password: str) -> Optional[str]: + """Validate password strength based on defined criteria. + + Args: + password: The password string to validate. + + Returns: + An error message string if validation fails, None otherwise. + """ + if len(password) < 8: + return "Password must be at least 8 characters long." + + # If check passes + return None + +def user_exists() -> bool: + """Check if a user has been created""" + return USER_FILE.exists() and os.path.getsize(USER_FILE) > 0 + +def create_user(username: str, password: str) -> bool: + """Create a new user""" + if not username or not password: + logger.error("Attempted to create user with empty username or password") + return False + + # Ensure user directory exists with proper permissions + logger.info(f"Ensuring user directory exists: {USER_DIR}") + USER_DIR.mkdir(parents=True, exist_ok=True) + try: + # Set appropriate permissions if not running as root + logger.info(f"Setting permissions on directory: {USER_DIR}") + os.chmod(USER_DIR, 0o755) + except Exception as e: + logger.warning(f"Could not set permissions on directory {USER_DIR}: {e}") + + # Hash the username and password + username_hash = hash_username(username) + password_hash = hash_password(password) + + # Store the credentials + user_data = { + "username": username_hash, + "password": password_hash, + "created_at": time.time(), + "2fa_enabled": False, + "2fa_secret": None + } + + try: + logger.info(f"Writing user file: {USER_FILE}") + with open(USER_FILE, 'w') as f: + json.dump(user_data, f) + # Set appropriate permissions on the file + try: + logger.info(f"Setting permissions on file: {USER_FILE}") + os.chmod(USER_FILE, 0o644) + except Exception as e: + logger.warning(f"Could not set permissions on file {USER_FILE}: {e}") + logger.info("User creation successful") + return True + except Exception as e: + logger.error(f"Error creating user file {USER_FILE}: {e}", exc_info=True) + return False + +def verify_user(username: str, password: str, otp_code: str = None) -> Tuple[bool, bool]: + """ + Verify user credentials + + Returns: + Tuple[bool, bool]: (auth_success, needs_2fa) + """ + if not user_exists(): + logger.warning("Login attempt failed: User does not exist.") + return False, False + + try: + with open(USER_FILE, 'r') as f: + user_data = json.load(f) + + # Hash the provided username + username_hash = hash_username(username) + + # Compare username and verify password + if user_data.get("username") == username_hash: + if verify_password(user_data.get("password", ""), password): + # Check if 2FA is enabled + two_fa_enabled = user_data.get("2fa_enabled", False) + logger.debug(f"2FA enabled for user '{username}': {two_fa_enabled}") + logger.debug(f"2FA secret present: {bool(user_data.get('2fa_secret'))}") + logger.debug(f"OTP code provided: {bool(otp_code)}") + + if two_fa_enabled: + # If 2FA code was provided, verify it + if otp_code: + totp = pyotp.TOTP(user_data.get("2fa_secret")) + valid_code = totp.verify(otp_code) + logger.debug(f"OTP code validation result: {valid_code}") + if valid_code: + logger.info(f"User '{username}' authenticated successfully with 2FA.") + return True, False + else: + logger.warning(f"Login attempt failed for user '{username}': Invalid 2FA code.") + return False, True + else: + # No OTP code provided but 2FA is enabled + logger.warning(f"Login attempt failed for user '{username}': 2FA code required but not provided.") + logger.debug("Returning needs_2fa=True to trigger 2FA input display") + return False, True + else: + # 2FA not enabled, password is correct + logger.info(f"User '{username}' authenticated successfully (no 2FA).") + return True, False + else: + logger.warning(f"Login attempt failed for user '{username}': Invalid password.") + return False, False + except Exception as e: + logger.error(f"Error during user verification for '{username}': {e}", exc_info=True) + + logger.warning(f"Login attempt failed for user '{username}': Username not found or other error.") + return False, False + +def create_session(username: str) -> str: + """Create a new session for an authenticated user""" + session_id = secrets.token_hex(32) + # Store the actual username, not the hash + + # Store session data + active_sessions[session_id] = { + "username": username, # Store actual username + "created_at": time.time(), + "expires_at": time.time() + SESSION_EXPIRY + } + + return session_id + +def verify_session(session_id: str) -> bool: + """Verify if a session is valid""" + if not session_id or session_id not in active_sessions: + return False + + session_data = active_sessions[session_id] + + # Check if session has expired + if session_data.get("expires_at", 0) < time.time(): + # Clean up expired session + del active_sessions[session_id] + return False + + # Extend session expiry + active_sessions[session_id]["expires_at"] = time.time() + SESSION_EXPIRY + return True + +def get_username_from_session(session_id: str) -> Optional[str]: + """Get the username from a session""" + if not session_id or session_id not in active_sessions: + return None + + # Return the stored username + return active_sessions[session_id].get("username") + +def authenticate_request(): + """Flask route decorator to check if user is authenticated""" + # If no user exists, redirect to setup + if not user_exists(): + if request.path != "/setup" and not request.path.startswith(("/static/", "/api/setup")): + return redirect("/setup") + return None + + # Skip authentication for static files and the login/setup pages + if request.path.startswith(("/static/", "/login", "/api/login", "/setup", "/api/setup")) or request.path == "/favicon.ico": + return None + + # Check if the request is from a local network and bypass authentication if enabled + # Get configuration setting for local network bypass + local_access_bypass = False + try: + # Force reload settings from disk to ensure we have the latest + from src.primary.settings_manager import load_settings + from src.primary import settings_manager + + # Ensure we're getting fresh settings by clearing any cache + if hasattr(settings_manager, 'settings_cache'): + settings_manager.settings_cache = {} + + settings = load_settings("general") # Specify 'general' as the app_type + general_settings = settings + local_access_bypass = general_settings.get("local_access_bypass", False) + logger.info(f"Local access bypass setting: {local_access_bypass}") + + # Debug print all general settings + logger.debug(f"All general settings: {general_settings}") + except Exception as e: + logger.error(f"Error loading local access bypass setting: {e}", exc_info=True) + + remote_addr = request.remote_addr + logger.info(f"Request IP address: {remote_addr}") + + if local_access_bypass: + # Common local network IP ranges + local_networks = [ + '127.0.0.1', # localhost + '::1', # localhost IPv6 + '10.', # 10.0.0.0/8 + '172.16.', # 172.16.0.0/12 + '172.17.', + '172.18.', + '172.19.', + '172.20.', + '172.21.', + '172.22.', + '172.23.', + '172.24.', + '172.25.', + '172.26.', + '172.27.', + '172.28.', + '172.29.', + '172.30.', + '172.31.', + '192.168.' # 192.168.0.0/16 + ] + is_local = False + + # Check if request is coming through a proxy + forwarded_for = request.headers.get('X-Forwarded-For') + if forwarded_for: + logger.debug(f"X-Forwarded-For header detected: {forwarded_for}") + # Take the first IP in the chain which is typically the client's real IP + possible_client_ip = forwarded_for.split(',')[0].strip() + logger.debug(f"Checking if forwarded IP {possible_client_ip} is local") + + # Check if this forwarded IP is a local network IP + for network in local_networks: + if possible_client_ip == network or (network.endswith('.') and possible_client_ip.startswith(network)): + is_local = True + logger.info(f"Forwarded IP {possible_client_ip} is a local network IP (matches {network})") + break + + # Check if direct remote_addr is a local network IP if not already determined + if not is_local: + for network in local_networks: + if remote_addr == network or (network.endswith('.') and remote_addr.startswith(network)): + is_local = True + logger.info(f"Direct IP {remote_addr} is a local network IP (matches {network})") + break + + if is_local: + logger.info(f"Local network access from {remote_addr} - Authentication bypassed!") + return None + else: + logger.warning(f"Access from {remote_addr} is not recognized as local network - Authentication required") + else: + logger.info("Local access bypass is DISABLED - Authentication required") + + # Check for valid session + session_id = session.get(SESSION_COOKIE_NAME) + if session_id and verify_session(session_id): + return None + + # No valid session, redirect to login + if request.path != "/login" and not request.path.startswith("/api/"): + return redirect("/login") + + # For API calls, return 401 Unauthorized + if request.path.startswith("/api/"): + return {"error": "Unauthorized"}, 401 + + return None + +def logout(session_id: str): + """Log out the current user by invalidating their session""" + if session_id and session_id in active_sessions: + del active_sessions[session_id] + + # Clear the session cookie in Flask context (if available, otherwise handled by route) + # session.pop(SESSION_COOKIE_NAME, None) # This might be better handled solely in the route + +def is_2fa_enabled(username): + """Check if 2FA is enabled for a user.""" + user_data = get_user_data() + return user_data.get('2fa_enabled', False) + +def generate_2fa_secret(username: str) -> Tuple[str, str]: + """ + Generate a new 2FA secret and QR code + + Returns: + Tuple[str, str]: (secret, qr_code_data_uri) + """ + # Generate a random secret + secret = pyotp.random_base32() + + # Create a TOTP object + totp = pyotp.TOTP(secret) + + # Get the provisioning URI - Use the actual username here + uri = totp.provisioning_uri(name=username, issuer_name="Huntarr") + + # Generate QR code + qr = qrcode.QRCode( + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_L, + box_size=10, + border=4, + ) + qr.add_data(uri) + qr.make(fit=True) + + try: + img = qr.make_image(fill_color="black", back_color="white") + + # Convert to base64 string + buffered = io.BytesIO() + img.save(buffered, format="PNG") + img_str = base64.b64encode(buffered.getvalue()).decode() + + # Store the secret temporarily associated with the user + user_data = get_user_data() + user_data["temp_2fa_secret"] = secret + if save_user_data(user_data): + logger.info(f"Generated temporary 2FA secret for user '{username}'.") + return secret, f"data:image/png;base64,{img_str}" + else: + logger.error(f"Failed to save temporary 2FA secret for user '{username}'.") + raise Exception("Failed to save user data with temporary 2FA secret.") + + except Exception as e: + logger.error(f"Error generating 2FA QR code for user '{username}': {e}", exc_info=True) + raise + +def verify_2fa_code(username: str, code: str, enable_on_verify: bool = False) -> bool: + """Verify a 2FA code against the temporary secret""" + user_data = get_user_data() + temp_secret = user_data.get("temp_2fa_secret") + + if not temp_secret: + logger.warning(f"2FA verification attempt for '{username}' failed: No temporary secret found.") + return False + + totp = pyotp.TOTP(temp_secret) + if totp.verify(code): + logger.info(f"2FA code verified successfully for user '{username}'.") + if enable_on_verify: + user_data["2fa_enabled"] = True + user_data["2fa_secret"] = temp_secret + user_data.pop("temp_2fa_secret", None) + if save_user_data(user_data): + logger.info(f"2FA enabled permanently for user '{username}'.") + else: + logger.error(f"Failed to save user data after enabling 2FA for '{username}'.") + return False + return True + else: + logger.warning(f"Invalid 2FA code provided by user '{username}'.") + return False + +def disable_2fa(password: str) -> bool: + """Disable 2FA for the current user (using only password - kept for potential other uses)""" + user_data = get_user_data() + + # Verify password + if verify_password(user_data.get("password", ""), password): + user_data["2fa_enabled"] = False + user_data["2fa_secret"] = None + if save_user_data(user_data): + logger.info("2FA disabled successfully (password only).") + return True + else: + logger.error("Failed to save user data after disabling 2FA (password only).") + return False + else: + logger.warning("Failed to disable 2FA (password only): Invalid password provided.") + return False + +def disable_2fa_with_password_and_otp(username: str, password: str, otp_code: str) -> bool: + """Disable 2FA for the specified user, requiring both password and OTP code.""" + user_data = get_user_data() # Assuming this gets data for the logged-in user implicitly + + # 1. Verify Password + if not verify_password(user_data.get("password", ""), password): + logger.warning(f"Failed to disable 2FA for '{username}': Invalid password provided.") + return False + + # 2. Verify OTP Code against permanent secret + perm_secret = user_data.get("2fa_secret") + if not user_data.get("2fa_enabled") or not perm_secret: + logger.error(f"Failed to disable 2FA for '{username}': 2FA is not enabled or secret missing.") + # Should ideally not happen if called from the correct UI state, but good to check + return False + + totp = pyotp.TOTP(perm_secret) + if not totp.verify(otp_code): + logger.warning(f"Failed to disable 2FA for '{username}': Invalid OTP code provided.") + return False + + # 3. Both verified, proceed to disable + user_data["2fa_enabled"] = False + user_data["2fa_secret"] = None + if save_user_data(user_data): + logger.info(f"2FA disabled successfully for '{username}' after verifying password and OTP.") + return True + else: + logger.error(f"Failed to save user data after disabling 2FA for '{username}'.") + return False + +def change_username(current_username: str, new_username: str, password: str) -> bool: + """Change the username for the current user""" + user_data = get_user_data() + + # Verify current username and password + current_username_hash = hash_username(current_username) + if user_data.get("username") != current_username_hash: + logger.warning(f"Username change failed: Current username '{current_username}' does not match stored hash.") + return False + + if not verify_password(user_data.get("password", ""), password): + logger.warning(f"Username change failed for '{current_username}': Invalid password provided.") + return False + + # Update username + user_data["username"] = hash_username(new_username) + if save_user_data(user_data): + logger.info(f"Username changed successfully from '{current_username}' to '{new_username}'.") + return True + else: + logger.error(f"Failed to save user data after changing username for '{current_username}'.") + return False + +def change_password(current_password: str, new_password: str) -> bool: + """Change the password for the current user""" + user_data = get_user_data() + + # Verify current password + if not verify_password(user_data.get("password", ""), current_password): + logger.warning("Password change failed: Invalid current password provided.") + return False + + # Update password + user_data["password"] = hash_password(new_password) + if save_user_data(user_data): + logger.info("Password changed successfully.") + return True + else: + logger.error("Failed to save user data after changing password.") + return False + +def get_app_url_and_key(app_type: str) -> Tuple[str, str]: + """ + Get the API URL and API key for a specific app type + + Args: + app_type: The app type (sonarr, radarr, lidarr, readarr) + + Returns: + Tuple[str, str]: (api_url, api_key) + """ + from primary import keys_manager + return keys_manager.get_api_keys(app_type) \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/background.py b/Huntarr.io-6.3.6/src/primary/background.py new file mode 100644 index 0000000..689771c --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/background.py @@ -0,0 +1,543 @@ +#!/usr/bin/env python3 +""" +Huntarr - Main entry point for the application +Supports multiple Arr applications running concurrently +""" + +import time +import sys +import os +# import socket # No longer used directly +import signal +import importlib +import logging +import threading +from typing import Dict, List, Optional, Callable, Union, Tuple + +# Define the version number +__version__ = "1.0.0" # Consider updating this based on changes + +# Set up logging first +from src.primary.utils.logger import setup_main_logger, get_logger # Import get_logger +logger = setup_main_logger() + +# Import necessary modules +from src.primary import config, settings_manager +# Removed keys_manager import as settings_manager handles API details +from src.primary.state import check_state_reset, calculate_reset_time +# from src.primary.utils.app_utils import get_ip_address # No longer used here + +# Track active threads and stop flag +app_threads: Dict[str, threading.Thread] = {} +stop_event = threading.Event() # Use an event for clearer stop signaling + +def app_specific_loop(app_type: str) -> None: + """ + Main processing loop for a specific Arr application. + + Args: + app_type: The type of Arr application (sonarr, radarr, lidarr, readarr) + """ + app_logger = get_logger(app_type) + app_logger.info(f"=== [{app_type.upper()}] Thread starting ===") + + # Dynamically import app-specific modules + process_missing = None + process_upgrades = None + get_queue_size = None + check_connection = None + get_instances_func = None # Default: No multi-instance function found + hunt_missing_setting = "" + hunt_upgrade_setting = "" + + try: + # Import the main app module first to check for get_configured_instances + app_module = importlib.import_module(f'src.primary.apps.{app_type}') + app_logger.debug(f"Attributes found in {app_module.__name__}: {dir(app_module)}") + api_module = importlib.import_module(f'src.primary.apps.{app_type}.api') + missing_module = importlib.import_module(f'src.primary.apps.{app_type}.missing') + upgrade_module = importlib.import_module(f'src.primary.apps.{app_type}.upgrade') + + # Try to get the multi-instance function from the main app module + try: + get_instances_func = getattr(app_module, 'get_configured_instances') + app_logger.debug(f"Found 'get_configured_instances' in {app_module.__name__}") + except AttributeError: + app_logger.debug(f"'get_configured_instances' not found in {app_module.__name__}. Assuming single instance mode.") + get_instances_func = None # Explicitly set to None if not found + + check_connection = getattr(api_module, 'check_connection') + get_queue_size = getattr(api_module, 'get_download_queue_size', lambda api_url, api_key, api_timeout: 0) # Default if not found + + if app_type == "sonarr": + missing_module = importlib.import_module('src.primary.apps.sonarr.missing') + upgrade_module = importlib.import_module('src.primary.apps.sonarr.upgrade') + process_missing = getattr(missing_module, 'process_missing_episodes') + process_upgrades = getattr(upgrade_module, 'process_cutoff_upgrades') + hunt_missing_setting = "hunt_missing_items" + hunt_upgrade_setting = "hunt_upgrade_items" + elif app_type == "radarr": + missing_module = importlib.import_module('src.primary.apps.radarr.missing') + upgrade_module = importlib.import_module('src.primary.apps.radarr.upgrade') + process_missing = getattr(missing_module, 'process_missing_movies') + process_upgrades = getattr(upgrade_module, 'process_cutoff_upgrades') + hunt_missing_setting = "hunt_missing_movies" + hunt_upgrade_setting = "hunt_upgrade_movies" + elif app_type == "lidarr": + missing_module = importlib.import_module('src.primary.apps.lidarr.missing') + upgrade_module = importlib.import_module('src.primary.apps.lidarr.upgrade') + # Use process_missing_albums as the function name + process_missing = getattr(missing_module, 'process_missing_albums') + process_upgrades = getattr(upgrade_module, 'process_cutoff_upgrades') + hunt_missing_setting = "hunt_missing_items" + # Use hunt_upgrade_items + hunt_upgrade_setting = "hunt_upgrade_items" + elif app_type == "readarr": + missing_module = importlib.import_module('src.primary.apps.readarr.missing') + upgrade_module = importlib.import_module('src.primary.apps.readarr.upgrade') + process_missing = getattr(missing_module, 'process_missing_books') + process_upgrades = getattr(upgrade_module, 'process_cutoff_upgrades') + hunt_missing_setting = "hunt_missing_books" + hunt_upgrade_setting = "hunt_upgrade_books" + elif app_type == "whisparr": + missing_module = importlib.import_module('src.primary.apps.whisparr.missing') + upgrade_module = importlib.import_module('src.primary.apps.whisparr.upgrade') + process_missing = getattr(missing_module, 'process_missing_scenes') + process_upgrades = getattr(upgrade_module, 'process_cutoff_upgrades') + hunt_missing_setting = "hunt_missing_items" # Updated to new name + hunt_upgrade_setting = "hunt_upgrade_items" # Updated to new name + elif app_type == "eros": + missing_module = importlib.import_module('src.primary.apps.eros.missing') + upgrade_module = importlib.import_module('src.primary.apps.eros.upgrade') + process_missing = getattr(missing_module, 'process_missing_items') + process_upgrades = getattr(upgrade_module, 'process_cutoff_upgrades') + hunt_missing_setting = "hunt_missing_items" + hunt_upgrade_setting = "hunt_upgrade_items" + else: + app_logger.error(f"Unsupported app_type: {app_type}") + return # Exit thread if app type is invalid + + except (ImportError, AttributeError) as e: + app_logger.error(f"Failed to import modules or functions for {app_type}: {e}", exc_info=True) + return # Exit thread if essential modules fail to load + + # Create app-specific logger using provided function + app_logger = logging.getLogger(f"huntarr.{app_type}") + + while not stop_event.is_set(): + # --- Load Settings for this Cycle --- # + try: + # Load all settings for this app for the current cycle + app_settings = settings_manager.load_settings(app_type) # Corrected function name + if not app_settings: # Handle case where loading fails + app_logger.error("Failed to load settings. Skipping cycle.") + stop_event.wait(60) # Wait a minute before retrying + continue + + # Get global settings needed for cycle timing + sleep_duration = app_settings.get("sleep_duration", 900) + api_timeout = app_settings.get("api_timeout", 120) # Default to 120 seconds + + except Exception as e: + app_logger.error(f"Error loading settings for cycle: {e}", exc_info=True) + stop_event.wait(60) # Wait before retrying + continue + + # --- State Reset Check --- # + check_state_reset(app_type) + + app_logger.info(f"=== Starting {app_type.upper()} cycle ===") + + # Check if we need to use multi-instance mode + instances_to_process = [] + + # Use the dynamically loaded function (if found) + if get_instances_func: + # Multi-instance mode supported + try: + instances_to_process = get_instances_func() # Call the dynamically loaded function + if instances_to_process: + app_logger.info(f"Found {len(instances_to_process)} configured {app_type} instances to process") + else: + # No instances found via get_configured_instances + app_logger.warning(f"No configured {app_type} instances found. Skipping cycle.") + stop_event.wait(sleep_duration) + continue + except Exception as e: + app_logger.error(f"Error calling get_configured_instances function: {e}", exc_info=True) + stop_event.wait(60) + continue + else: + # get_instances_func is None (either not defined in app module or import failed earlier) + # Fallback to single instance mode using base settings if available + api_url = app_settings.get("api_url") + api_key = app_settings.get("api_key") + instance_name = app_settings.get("name", f"{app_type.capitalize()} Default") # Use 'name' or default + + if api_url and api_key: + app_logger.info(f"Processing {app_type} as single instance: {instance_name}") + # Create a list with a single dict matching the multi-instance structure + instances_to_process = [{ + "instance_name": instance_name, + "api_url": api_url, + "api_key": api_key + }] + else: + app_logger.warning(f"No 'get_configured_instances' function found and no valid single instance config (URL/Key) for {app_type}. Skipping cycle.") + stop_event.wait(sleep_duration) + continue + + # If after all checks, instances_to_process is still empty + if not instances_to_process: + app_logger.warning(f"No valid {app_type} instances to process this cycle (unexpected state). Skipping.") + stop_event.wait(sleep_duration) + continue + + # Process each instance dictionary returned by get_configured_instances + processed_any_items = False + for instance_details in instances_to_process: + if stop_event.is_set(): + break + + instance_name = instance_details.get("instance_name", "Default") # Use the dict from get_configured_instances + app_logger.info(f"Processing {app_type} instance: {instance_name}") + + # Get instance-specific settings from the instance_details dict + api_url = instance_details.get("api_url", "") + api_key = instance_details.get("api_key", "") + + # Get global/shared settings from app_settings loaded at the start of the loop + # Example: monitored_only = app_settings.get("monitored_only", True) + + # --- Connection Check --- # + if not api_url or not api_key: + app_logger.warning(f"Missing API URL or Key for instance '{instance_name}'. Skipping.") + continue + try: + # Use instance details for connection check + app_logger.debug(f"Checking connection to {app_type} instance '{instance_name}' at {api_url} with timeout {api_timeout}s") + connected = check_connection(api_url, api_key, api_timeout=api_timeout) + if not connected: + app_logger.warning(f"Failed to connect to {app_type} instance '{instance_name}' at {api_url}. Skipping.") + continue + app_logger.info(f"Successfully connected to {app_type} instance: {instance_name}") + except Exception as e: + app_logger.error(f"Error connecting to {app_type} instance '{instance_name}': {e}", exc_info=True) + continue # Skip this instance if connection fails + + # --- Check if Hunt Modes are Enabled --- # + # These checks use the hunt_missing_setting/hunt_upgrade_setting defined earlier + # which correspond to keys in the main app_settings dict (e.g., 'hunt_missing_items') + hunt_missing_value = app_settings.get(hunt_missing_setting, 0) + hunt_upgrade_value = app_settings.get(hunt_upgrade_setting, 0) + + hunt_missing_enabled = hunt_missing_value > 0 + hunt_upgrade_enabled = hunt_upgrade_value > 0 + + # --- Queue Size Check --- # Moved inside loop + # Get maximum_download_queue_size from general settings (still using minimum_download_queue_size key for backward compatibility) + general_settings = settings_manager.load_settings('general') + max_queue_size = general_settings.get("minimum_download_queue_size", -1) + app_logger.info(f"Using maximum download queue size: {max_queue_size} from general settings") + + if max_queue_size >= 0: + try: + # Use instance details for queue check + current_queue_size = get_queue_size(api_url, api_key, api_timeout) + if current_queue_size >= max_queue_size: + app_logger.info(f"Download queue size ({current_queue_size}) meets or exceeds maximum ({max_queue_size}) for {instance_name}. Skipping cycle for this instance.") + continue # Skip processing for this instance + else: + app_logger.info(f"Queue size ({current_queue_size}) is below maximum ({max_queue_size}). Proceeding.") + except Exception as e: + app_logger.warning(f"Could not get download queue size for {instance_name}. Proceeding anyway. Error: {e}", exc_info=False) # Log less verbosely + + # Prepare args dictionary for processing functions + # Combine instance details with general app settings for the processing functions + # Assuming app_settings already contains most general settings, add instance specifics + combined_settings = app_settings.copy() # Start with general settings + combined_settings.update(instance_details) # Add/overwrite with instance specifics (name, url, key) + + # Ensure settings from general.json are consistently used for all apps + combined_settings["api_timeout"] = settings_manager.get_advanced_setting("api_timeout", 120) + combined_settings["command_wait_delay"] = settings_manager.get_advanced_setting("command_wait_delay", 1) + combined_settings["command_wait_attempts"] = settings_manager.get_advanced_setting("command_wait_attempts", 600) + + # Define the stop check function + stop_check_func = stop_event.is_set + + # --- Process Missing --- # + if hunt_missing_enabled and process_missing: + try: + # Extract settings for direct function calls + api_url = combined_settings.get("api_url", "").strip() + api_key = combined_settings.get("api_key", "").strip() + api_timeout = combined_settings.get("api_timeout", 120) + monitored_only = combined_settings.get("monitored_only", True) + skip_future_episodes = combined_settings.get("skip_future_episodes", True) + skip_series_refresh = combined_settings.get("skip_series_refresh", False) + hunt_missing_items = combined_settings.get("hunt_missing_items", 0) + hunt_missing_mode = combined_settings.get("hunt_missing_mode", "episodes") + command_wait_delay = combined_settings.get("command_wait_delay", 1) + command_wait_attempts = combined_settings.get("command_wait_attempts", 600) + + if app_type == "sonarr": + processed_missing = process_missing( + api_url=api_url, + api_key=api_key, + instance_name=instance_name, # Added the required instance_name parameter + api_timeout=api_timeout, + monitored_only=monitored_only, + skip_future_episodes=skip_future_episodes, + skip_series_refresh=skip_series_refresh, + hunt_missing_items=hunt_missing_items, + hunt_missing_mode=hunt_missing_mode, + command_wait_delay=command_wait_delay, + command_wait_attempts=command_wait_attempts, + stop_check=stop_check_func + ) + else: + # For other apps that still use the old signature + processed_missing = process_missing(app_settings=combined_settings, stop_check=stop_check_func) + + if processed_missing: + processed_any_items = True + except Exception as e: + app_logger.error(f"Error during missing processing for {instance_name}: {e}", exc_info=True) + + # --- Process Upgrades --- # + if hunt_upgrade_enabled and process_upgrades: + try: + # Extract settings for direct function calls (only for Sonarr) + if app_type == "sonarr": + api_url = combined_settings.get("api_url", "").strip() + api_key = combined_settings.get("api_key", "").strip() + api_timeout = combined_settings.get("api_timeout", 120) + monitored_only = combined_settings.get("monitored_only", True) + skip_series_refresh = combined_settings.get("skip_series_refresh", False) + hunt_upgrade_items = combined_settings.get("hunt_upgrade_items", 0) + command_wait_delay = combined_settings.get("command_wait_delay", 1) + command_wait_attempts = combined_settings.get("command_wait_attempts", 600) + + processed_upgrades = process_upgrades( + api_url=api_url, + api_key=api_key, + instance_name=instance_name, # Added the required instance_name parameter + api_timeout=api_timeout, + monitored_only=monitored_only, + skip_series_refresh=skip_series_refresh, + hunt_upgrade_items=hunt_upgrade_items, + command_wait_delay=command_wait_delay, + command_wait_attempts=command_wait_attempts, + stop_check=stop_check_func + ) + else: + # For other apps that still use the old signature + processed_upgrades = process_upgrades(app_settings=combined_settings, stop_check=stop_check_func) + + if processed_upgrades: + processed_any_items = True + except Exception as e: + app_logger.error(f"Error during upgrade processing for {instance_name}: {e}", exc_info=True) + + # Small delay between instances if needed (optional) + if not stop_event.is_set(): + time.sleep(1) # Short pause + + # --- Process Swaparr (stalled downloads) --- # + try: + # Try to import Swaparr module + if not 'process_stalled_downloads' in locals(): + try: + # Import directly from handler module to avoid circular imports + from src.primary.apps.swaparr.handler import process_stalled_downloads + swaparr_logger = get_logger("swaparr") + swaparr_logger.debug(f"Successfully imported Swaparr module") + except (ImportError, AttributeError) as e: + app_logger.debug(f"Swaparr module not available or missing functions: {e}") + process_stalled_downloads = None + + # Check if Swaparr is enabled + swaparr_settings = settings_manager.load_settings("swaparr") + if swaparr_settings and swaparr_settings.get("enabled", False) and process_stalled_downloads: + app_logger.info(f"Running Swaparr on {app_type} instance: {instance_name}") + process_stalled_downloads(app_type, combined_settings, swaparr_settings) + app_logger.info(f"Completed Swaparr processing for {app_type} instance: {instance_name}") + except Exception as e: + app_logger.error(f"Error during Swaparr processing for {instance_name}: {e}", exc_info=True) + + # --- Cycle End & Sleep --- # + calculate_reset_time(app_type) # Pass app_type here if needed by the function + + # Log cycle completion + if processed_any_items: + app_logger.info(f"=== {app_type.upper()} cycle finished. Processed items across instances. ===") + else: + app_logger.info(f"=== {app_type.upper()} cycle finished. No items processed in any instance. ===") + + # Calculate sleep duration (use configured or default value) + sleep_seconds = app_settings.get("sleep_duration", 900) # Default to 15 minutes + + # Sleep with periodic checks for reset file + app_logger.info(f"Sleeping for {sleep_seconds} seconds before next cycle...") + + # Use shorter sleep intervals and check for reset file + wait_interval = 1 # Check every second to be more responsive + elapsed = 0 + reset_file_path = f"/config/reset/{app_type}.reset" + + while elapsed < sleep_seconds: + # Check if stop event is set + if stop_event.is_set(): + app_logger.info("Stop event detected during sleep. Breaking out of sleep cycle.") + break + + # Check if reset file exists + if os.path.exists(reset_file_path): + try: + # Read timestamp from the file (if it exists) + with open(reset_file_path, 'r') as f: + timestamp = f.read().strip() + app_logger.info(f"!!! RESET FILE DETECTED !!! Manual cycle reset triggered for {app_type} (timestamp: {timestamp}). Starting new cycle immediately.") + + # Delete the reset file + os.remove(reset_file_path) + app_logger.info(f"Reset file removed for {app_type}. Starting new cycle now.") + break + except Exception as e: + app_logger.error(f"Error processing reset file for {app_type}: {e}", exc_info=True) + # Try to remove the file even if reading failed + try: + os.remove(reset_file_path) + except: + pass + break + + # Sleep for a short interval + stop_event.wait(wait_interval) + elapsed += wait_interval + + # If we've slept for at least 30 seconds, update the logger message every 30 seconds + if elapsed > 0 and elapsed % 30 == 0: + app_logger.info(f"Still sleeping, {sleep_seconds - elapsed} seconds remaining before next cycle...") + + app_logger.info(f"=== [{app_type.upper()}] Thread stopped ====") + +def reset_app_cycle(app_type: str) -> bool: + """ + Trigger a manual reset of an app's cycle. + + Args: + app_type: The type of Arr application (sonarr, radarr, lidarr, readarr, etc.) + + Returns: + bool: True if the reset was triggered, False if the app is not running + """ + logger.info(f"Manual cycle reset requested for {app_type} - Creating reset file") + + # Create a reset file for this app + reset_file_path = f"/config/reset/{app_type}.reset" + try: + with open(reset_file_path, 'w') as f: + f.write(str(int(time.time()))) + logger.info(f"Reset file created for {app_type}. Cycle will reset on next check.") + return True + except Exception as e: + logger.error(f"Error creating reset file for {app_type}: {e}", exc_info=True) + return False + +def start_app_threads(): + """Start threads for all configured and enabled apps.""" + configured_apps_list = settings_manager.get_configured_apps() # Corrected function name + configured_apps = {app: True for app in configured_apps_list} # Convert list to dict format expected below + + for app_type, is_configured in configured_apps.items(): + if is_configured: + # Optional: Add an explicit 'enabled' setting check if desired + # enabled = settings_manager.get_setting(app_type, "enabled", True) + # if not enabled: + # logger.info(f"Skipping {app_type} thread as it is disabled in settings.") + # continue + + if app_type not in app_threads or not app_threads[app_type].is_alive(): + if app_type in app_threads: # If it existed but died + logger.warning(f"{app_type} thread died, restarting...") + del app_threads[app_type] + else: # Starting for the first time + logger.info(f"Starting thread for {app_type}...") + + thread = threading.Thread(target=app_specific_loop, args=(app_type,), name=f"{app_type}-Loop", daemon=True) + app_threads[app_type] = thread + thread.start() + elif app_type in app_threads and app_threads[app_type].is_alive(): + # If app becomes un-configured, stop its thread? Or let it fail connection check? + # For now, let it run and fail connection check. + logger.warning(f"{app_type} is no longer configured. Thread will likely stop after failing connection checks.") + # else: # App not configured and no thread running - do nothing + # logger.debug(f"{app_type} is not configured. No thread started.") + pass # Corrected indentation + +def check_and_restart_threads(): + """Check if any threads have died and restart them if the app is still configured.""" + configured_apps_list = settings_manager.get_configured_apps() # Corrected function name + configured_apps = {app: True for app in configured_apps_list} # Convert list to dict format expected below + + for app_type, thread in list(app_threads.items()): + if not thread.is_alive(): + logger.warning(f"{app_type} thread died unexpectedly.") + del app_threads[app_type] # Remove dead thread + # Only restart if it's still configured + if configured_apps.get(app_type, False): + logger.info(f"Restarting thread for {app_type}...") + new_thread = threading.Thread(target=app_specific_loop, args=(app_type,), name=f"{app_type}-Loop", daemon=True) + app_threads[app_type] = new_thread + new_thread.start() + else: + logger.info(f"Not restarting {app_type} thread as it is no longer configured.") + +def shutdown_handler(signum, frame): + """Handle termination signals (SIGINT, SIGTERM).""" + logger.info(f"Received signal {signum}. Initiating shutdown...") + stop_event.set() # Signal all threads to stop + +def shutdown_threads(): + """Wait for all threads to finish.""" + logger.info("Waiting for app threads to finish...") + active_thread_list = list(app_threads.values()) + for thread in active_thread_list: + thread.join(timeout=15) # Wait up to 15 seconds per thread + if thread.is_alive(): + logger.warning(f"Thread {thread.name} did not stop gracefully.") + logger.info("All app threads stopped.") + +def start_huntarr(): + """Main entry point for Huntarr background tasks.""" + logger.info(f"--- Starting Huntarr Background Tasks v{__version__} --- ") + + # Perform initial settings migration if specified (e.g., via env var or arg) + if os.environ.get("HUNTARR_RUN_MIGRATION", "false").lower() == "true": + logger.info("Running settings migration from huntarr.json (if found)...") + settings_manager.migrate_from_huntarr_json() + + # Log initial configuration for all known apps + for app_name in settings_manager.KNOWN_APP_TYPES: # Corrected attribute name + try: + config.log_configuration(app_name) + except Exception as e: + logger.error(f"Error logging initial configuration for {app_name}: {e}") + + try: + # Main loop: Start and monitor app threads + while not stop_event.is_set(): + start_app_threads() # Start/Restart threads for configured apps + # check_and_restart_threads() # This is implicitly handled by start_app_threads checking is_alive + stop_event.wait(15) # Check for stop signal every 15 seconds + + except Exception as e: + logger.exception(f"Unexpected error in main monitoring loop: {e}") + finally: + logger.info("Background task main loop exited. Shutting down threads...") + if not stop_event.is_set(): + stop_event.set() # Ensure stop is signaled if loop exited unexpectedly + shutdown_threads() + logger.info("--- Huntarr Background Tasks stopped --- ") \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/config.py b/Huntarr.io-6.3.6/src/primary/config.py new file mode 100644 index 0000000..c2e7190 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/config.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +""" +Configuration module for Huntarr +Provides utility functions to access settings via settings_manager +and perform configuration-related tasks like logging. +Removes the old concept of loading a single app's config into global constants. +""" + +import os +import sys +import logging +import traceback +from src.primary import settings_manager +from src.primary.utils.logger import logger, get_logger # Import get_logger + +# Removed global constants like APP_TYPE, API_URL, API_KEY, SLEEP_DURATION etc. +# Settings should be fetched directly using settings_manager when needed. + +# Enable debug logging across the application +# Set to True for detailed logs, False for production +DEBUG_MODE = False # Changed default to False + +# Add a function to get the debug mode from settings +def get_debug_mode(): + """Get the debug mode setting from general settings""" + try: + return settings_manager.get_setting("general", "debug_mode", False) + except Exception: + return False + +# Determine the hunt mode for a specific app +def determine_hunt_mode(app_name: str) -> str: + """Determine the hunt mode for a specific app based on its settings.""" + # Fetch settings directly for the given app + hunt_missing = 0 + hunt_upgrade = 0 + + if app_name == "sonarr": + hunt_missing = settings_manager.get_setting(app_name, "hunt_missing_items", 0) + hunt_upgrade = settings_manager.get_setting(app_name, "hunt_upgrade_items", 0) + elif app_name == "radarr": + hunt_missing = settings_manager.get_setting(app_name, "hunt_missing_movies", 0) + hunt_upgrade = settings_manager.get_setting(app_name, "hunt_upgrade_movies", 0) + elif app_name.lower() == 'lidarr': + # Use hunt_missing_items instead of hunt_missing_albums + hunt_missing = settings_manager.get_setting(app_name, "hunt_missing_items", 0) + # Use hunt_upgrade_items instead of hunt_upgrade_albums + hunt_upgrade = settings_manager.get_setting(app_name, "hunt_upgrade_items", 0) + + # For Lidarr, also include the hunt_missing_mode + hunt_missing_mode = settings_manager.get_setting(app_name, "hunt_missing_mode", "artist") + elif app_name == "readarr": + hunt_missing = settings_manager.get_setting(app_name, "hunt_missing_books", 0) + hunt_upgrade = settings_manager.get_setting(app_name, "hunt_upgrade_books", 0) + else: + # Handle unknown app types if necessary, or just return disabled + return "disabled" + + # Determine mode based on fetched values + if hunt_missing > 0 and hunt_upgrade > 0: + return "both" + elif hunt_missing > 0: + return "missing" + elif hunt_upgrade > 0: + return "upgrade" + else: + return "disabled" + +# Configure logging level based on an app's debug setting +def configure_logging(app_name: str = None): + """Configure logging level based on the debug setting of a specific app or globally.""" + try: + debug_mode = get_debug_mode() + log_instance = logger # Default to the main logger + + if app_name: + debug_mode = settings_manager.get_setting(app_name, "debug_mode", False) + log_instance = get_logger(app_name) # Get the specific app logger + # else: # Optional: Could check a global debug setting if needed + # debug_mode = settings_manager.get_setting("global", "debug_mode", False) + + level = logging.DEBUG if debug_mode else logging.INFO + + # Configure the specific app logger + if app_name and log_instance: + log_instance.setLevel(level) + + # Always configure the root logger as well (or adjust based on desired behavior) + # If you want root logger level controlled by a specific app, this needs refinement. + # For now, let's set the root logger based on the *last* app configured or global. + root_logger = logging.getLogger() + root_logger.setLevel(level) + + # Optional: Configure handlers if not done elsewhere + # Example: Ensure handlers exist and set their level + # for handler in log_instance.handlers: + # handler.setLevel(level) + # for handler in root_logger.handlers: + # handler.setLevel(level) + + except Exception as e: + print(f"CRITICAL ERROR in configure_logging for app '{app_name}': {str(e)}", file=sys.stderr) + print(f"Traceback: {traceback.format_exc()}", file=sys.stderr) + # Try to log it anyway + if logger: + logger.error(f"Error in configure_logging for app '{app_name}': {str(e)}") + logger.error(traceback.format_exc()) + # Decide whether to raise or continue + # raise + +# Log the configuration for a specific app +def log_configuration(app_name: str): + """Log the current configuration settings for a specific app.""" + log = get_logger(app_name) # Use the specific app's logger + settings = settings_manager.load_settings(app_name) # Corrected function name + + if not settings: + log.error(f"Could not load settings for app: {app_name}. Cannot log configuration.") + return + + api_url = settings.get("api_url", "") + api_key = settings.get("api_key", "") + debug_mode = settings.get("debug_mode", False) + sleep_duration = settings.get("sleep_duration", 900) + # Get state reset interval + state_reset_interval = settings_manager.get_advanced_setting("stateful_management_hours", 168) + monitored_only = settings.get("monitored_only", True) + min_queue_size = settings.get("minimum_download_queue_size", -1) + + log.info(f"--- Configuration for {app_name} ---") + log.info(f"API URL: {api_url}") + log.info(f"API Key: {'[REDACTED]' if api_key else 'Not Set'}") + log.info(f"Debug Mode: {debug_mode}") + log.info(f"Hunt Mode: {determine_hunt_mode(app_name)}") + log.info(f"Sleep Duration: {sleep_duration} seconds") + log.info(f"State Reset Interval: {state_reset_interval} hours") + log.info(f"Monitored Only: {monitored_only}") + log.info(f"Maximum Download Queue Size: {settings.get('minimum_download_queue_size', -1)}") + + # App-specific settings logging + if app_name == "sonarr": + log.info(f"Hunt Missing Items: {settings.get('hunt_missing_items', 0)}") + log.info(f"Hunt Upgrade Items: {settings.get('hunt_upgrade_items', 0)}") + log.info(f"Skip Future Episodes: {settings.get('skip_future_episodes', True)}") + log.info(f"Skip Series Refresh: {settings.get('skip_series_refresh', False)}") + elif app_name == "radarr": + log.info(f"Hunt Missing Movies: {settings.get('hunt_missing_movies', 0)}") + log.info(f"Hunt Upgrade Movies: {settings.get('hunt_upgrade_movies', 0)}") + log.info(f"Skip Future Releases: {settings.get('skip_future_releases', True)}") + log.info(f"Skip Movie Refresh: {settings.get('skip_movie_refresh', False)}") + elif app_name.lower() == 'lidarr': + log.info(f"Mode: {settings.get('hunt_missing_mode', 'artist')}") + log.info(f"Hunt Missing Items: {settings.get('hunt_missing_items', 0)}") + # Use hunt_upgrade_items + log.info(f"Hunt Upgrade Items: {settings.get('hunt_upgrade_items', 0)}") + log.info(f"Sleep Duration: {settings.get('sleep_duration', 900)} seconds") + log.info(f"State Reset Interval: {state_reset_interval} hours") + log.info(f"Monitored Only: {settings.get('monitored_only', True)}") + log.info(f"Maximum Download Queue Size: {settings.get('minimum_download_queue_size', -1)}") + elif app_name == "readarr": + log.info(f"Hunt Missing Books: {settings.get('hunt_missing_books', 0)}") + log.info(f"Hunt Upgrade Books: {settings.get('hunt_upgrade_books', 0)}") + log.info(f"Skip Future Releases: {settings.get('skip_future_releases', True)}") + log.info(f"Skip Author Refresh: {settings.get('skip_author_refresh', False)}") + log.info(f"--- End Configuration for {app_name} ---") + +# Removed refresh_settings function - settings are loaded dynamically by settings_manager + +# Initial logging configuration (optional, could be done in main startup) +# configure_logging() # Configure root logger based on global/default debug setting if desired \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/eros.json b/Huntarr.io-6.3.6/src/primary/default_configs/eros.json new file mode 100644 index 0000000..dc5659a --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/eros.json @@ -0,0 +1,18 @@ +{ + "instances": [ + { + "name": "Default", + "api_url": "", + "api_key": "", + "enabled": true + } + ], + "hunt_missing_items": 1, + "hunt_upgrade_items": 0, + "sleep_duration": 900, + "monitored_only": true, + "skip_series_refresh": true, + "skip_future_releases": true, + "skip_scene_refresh": true, + "search_mode": "movie" +} diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/general.json b/Huntarr.io-6.3.6/src/primary/default_configs/general.json new file mode 100644 index 0000000..ab41cfe --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/general.json @@ -0,0 +1,14 @@ +{ + "debug_mode": false, + "log_refresh_interval_seconds": 30, + "ui_theme": "dark", + "check_for_updates": true, + "enable_notifications": false, + "notification_level": "info", + "local_access_bypass": false, + "stateful_management_hours": 168, + "command_wait_delay": 1, + "command_wait_attempts": 600, + "minimum_download_queue_size": -1, + "api_timeout": 120 +} \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/lidarr.json b/Huntarr.io-6.3.6/src/primary/default_configs/lidarr.json new file mode 100644 index 0000000..1e71955 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/lidarr.json @@ -0,0 +1,17 @@ +{ + "instances": [ + { + "name": "Default", + "api_url": "", + "api_key": "", + "enabled": true + } + ], + "hunt_missing_mode": "artist", + "hunt_missing_items": 1, + "hunt_upgrade_items": 0, + "sleep_duration": 900, + "monitored_only": true, + "skip_future_releases": true, + "skip_artist_refresh": true +} diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/radarr.json b/Huntarr.io-6.3.6/src/primary/default_configs/radarr.json new file mode 100644 index 0000000..d7a7e8f --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/radarr.json @@ -0,0 +1,16 @@ +{ + "instances": [ + { + "name": "Default", + "api_url": "", + "api_key": "", + "enabled": true + } + ], + "hunt_missing_movies": 1, + "hunt_upgrade_movies": 0, + "sleep_duration": 900, + "monitored_only": true, + "skip_future_releases": true, + "skip_movie_refresh": true +} diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/readarr.json b/Huntarr.io-6.3.6/src/primary/default_configs/readarr.json new file mode 100644 index 0000000..c6292ae --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/readarr.json @@ -0,0 +1,16 @@ +{ + "instances": [ + { + "name": "Default", + "api_url": "", + "api_key": "", + "enabled": true + } + ], + "hunt_missing_books": 1, + "hunt_upgrade_books": 0, + "sleep_duration": 900, + "monitored_only": true, + "skip_future_releases": true, + "skip_author_refresh": true +} diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/sonarr.json b/Huntarr.io-6.3.6/src/primary/default_configs/sonarr.json new file mode 100644 index 0000000..86476ca --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/sonarr.json @@ -0,0 +1,17 @@ +{ + "instances": [ + { + "name": "Default", + "api_url": "", + "api_key": "", + "enabled": true + } + ], + "hunt_missing_items": 1, + "hunt_upgrade_items": 0, + "hunt_missing_mode": "episodes", + "sleep_duration": 900, + "monitored_only": true, + "skip_future_episodes": true, + "skip_series_refresh": true +} diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/swaparr.json b/Huntarr.io-6.3.6/src/primary/default_configs/swaparr.json new file mode 100644 index 0000000..396352a --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/swaparr.json @@ -0,0 +1,8 @@ +{ + "enabled": false, + "max_strikes": 3, + "max_download_time": "2h", + "ignore_above_size": "25GB", + "remove_from_client": true, + "dry_run": false +} diff --git a/Huntarr.io-6.3.6/src/primary/default_configs/whisparr.json b/Huntarr.io-6.3.6/src/primary/default_configs/whisparr.json new file mode 100644 index 0000000..34eb7c1 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/default_configs/whisparr.json @@ -0,0 +1,17 @@ +{ + "instances": [ + { + "name": "Default", + "api_url": "", + "api_key": "", + "enabled": true + } + ], + "hunt_missing_items": 1, + "hunt_upgrade_items": 0, + "sleep_duration": 900, + "monitored_only": true, + "skip_series_refresh": true, + "skip_future_releases": true, + "skip_scene_refresh": true +} \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/history_manager.py b/Huntarr.io-6.3.6/src/primary/history_manager.py new file mode 100644 index 0000000..ab42e2e --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/history_manager.py @@ -0,0 +1,471 @@ +import os +import json +import time +from datetime import datetime +import threading +import logging +import pathlib + +# Create a logger +logger = logging.getLogger(__name__) + +# Path will be /config/history in production +HISTORY_BASE_PATH = pathlib.Path("/config/history") + +# Lock to prevent race conditions during file operations +history_locks = { + "sonarr": threading.Lock(), + "radarr": threading.Lock(), + "lidarr": threading.Lock(), + "readarr": threading.Lock(), + "whisparr": threading.Lock(), + "eros": threading.Lock(), + "swaparr": threading.Lock() +} + +def ensure_history_dir(): + """Ensure the history directory exists with app-specific subdirectories""" + try: + # Create base directory + HISTORY_BASE_PATH.mkdir(exist_ok=True, parents=True) + + # Create app-specific directories + for app in history_locks.keys(): + app_dir = HISTORY_BASE_PATH / app + app_dir.mkdir(exist_ok=True, parents=True) + + return True + except Exception as e: + logger.error(f"Failed to create history directory: {str(e)}") + return False + +def get_history_file_path(app_type, instance_name=None): + """Get the appropriate history file path based on app type and instance name""" + # If no instance name is provided, use "Default" + if instance_name is None: + instance_name = "Default" + + # Create safe filename from instance name (same as in stateful_manager.py) + safe_instance_name = "".join([c if c.isalnum() else "_" for c in instance_name]) + return HISTORY_BASE_PATH / app_type / f"{safe_instance_name}.json" + +def add_history_entry(app_type, entry_data): + """ + Add a new history entry + + Parameters: + - app_type: str - The app type (sonarr, radarr, etc) + - entry_data: dict with required fields: + - name: str - Name of processed content + - instance_name: str - Name of the instance + - id: str - ID of the processed content + """ + if not ensure_history_dir(): + logger.error("Could not ensure history directory exists") + return None + + if app_type not in history_locks: + logger.error(f"Invalid app type: {app_type}") + return None + + required_fields = ["name", "instance_name", "id"] + for field in required_fields: + if field not in entry_data: + logger.error(f"Missing required field: {field}") + return None + + # Log the instance name for debugging + instance_name = entry_data["instance_name"] + logger.debug(f"Adding history entry for {app_type} with instance_name: '{instance_name}'") + + # Create the entry with timestamp + timestamp = int(time.time()) + entry = { + "date_time": timestamp, + "date_time_readable": datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S'), + "processed_info": entry_data["name"], + "id": entry_data["id"], + "instance_name": instance_name, # Use the instance_name we extracted above + "operation_type": entry_data.get("operation_type", "missing"), # Default to "missing" if not specified + "app_type": app_type # Include app_type in the entry for display in UI + } + + history_file = get_history_file_path(app_type, instance_name) + logger.debug(f"Writing to history file: {history_file}") + + # Make sure the parent directory exists + history_file.parent.mkdir(exist_ok=True, parents=True) + + # Thread-safe file operation + with history_locks[app_type]: + try: + if history_file.exists(): + with open(history_file, 'r') as f: + history_data = json.load(f) + else: + history_data = [] + except (json.JSONDecodeError, FileNotFoundError): + # If file doesn't exist or is corrupt, start with empty list + history_data = [] + + # Add new entry at the beginning for most recent first + history_data.insert(0, entry) + + # Write back to file + with open(history_file, 'w') as f: + json.dump(history_data, f, indent=2) + + logger.info(f"Added history entry for {app_type}-{instance_name}: {entry_data['name']}") + return entry + +def get_history(app_type, search_query=None, page=1, page_size=20): + """ + Get history entries for an app + + Parameters: + - app_type: str - The app type (sonarr, radarr, etc) + - search_query: str - Optional search query to filter results + - page: int - Page number (1-based) + - page_size: int - Number of entries per page + + Returns: + - dict with entries, total_entries, and total_pages + """ + if not ensure_history_dir(): + logger.error("Could not ensure history directory exists") + return {"entries": [], "total_entries": 0, "total_pages": 0, "current_page": 1} + + if app_type not in history_locks and app_type != "all": + logger.error(f"Invalid app type: {app_type}") + return {"entries": [], "total_entries": 0, "total_pages": 0, "current_page": 1} + + result = [] + + if app_type == "all": + # Combine histories from all apps and their instances + for app in history_locks.keys(): + app_dir = HISTORY_BASE_PATH / app + + # Find and read all instance files + if app_dir.exists(): + for history_file in app_dir.glob("*.json"): + try: + with open(history_file, 'r') as f: + instance_history = json.load(f) + result.extend(instance_history) + logger.debug(f"Read {len(instance_history)} entries from {history_file}") + except (json.JSONDecodeError, FileNotFoundError) as e: + logger.warning(f"Error reading instance history file {history_file}: {str(e)}") + else: + # Get history for specific app - combine all instances + app_dir = HISTORY_BASE_PATH / app_type + + # Make sure app directory exists + app_dir.mkdir(exist_ok=True, parents=True) + + # Read from all instance files + if app_dir.exists(): + instance_files = list(app_dir.glob("*.json")) + logger.debug(f"Found {len(instance_files)} instance files for {app_type}: {[f.name for f in instance_files]}") + + for history_file in instance_files: + try: + with open(history_file, 'r') as f: + instance_history = json.load(f) + result.extend(instance_history) + logger.debug(f"Read {len(instance_history)} entries from {history_file}") + except (json.JSONDecodeError, FileNotFoundError) as e: + logger.warning(f"Error reading instance history file {history_file}: {e}") + + # Sort by date_time in descending order + result = sorted(result, key=lambda x: x["date_time"], reverse=True) + + # Apply search filter if provided + if search_query and search_query.strip(): + search_query = search_query.lower() + result = [ + entry for entry in result if + search_query in entry.get("processed_info", "").lower() or + search_query in entry.get("instance_name", "").lower() or + search_query in str(entry.get("id", "")).lower() + ] + + # Calculate pagination + total_entries = len(result) + total_pages = (total_entries + page_size - 1) // page_size if total_entries > 0 else 1 + + # Adjust page if out of bounds + if page < 1: + page = 1 + elif page > total_pages: + page = total_pages + + # Get entries for the current page + start_idx = (page - 1) * page_size + end_idx = start_idx + page_size + paginated_entries = result[start_idx:end_idx] + + # Calculate "how long ago" for each entry + current_time = int(time.time()) + for entry in paginated_entries: + seconds_ago = current_time - entry["date_time"] + entry["how_long_ago"] = format_time_ago(seconds_ago) + + return { + "entries": paginated_entries, + "total_entries": total_entries, + "total_pages": total_pages, + "current_page": page + } + +def format_time_ago(seconds): + """Format seconds into a human-readable 'time ago' string""" + minutes = seconds // 60 + hours = minutes // 60 + days = hours // 24 + + if days > 0: + return f"{days} {'day' if days == 1 else 'days'} ago" + elif hours > 0: + return f"{hours} {'hour' if hours == 1 else 'hours'} ago" + elif minutes > 0: + return f"{minutes} {'minute' if minutes == 1 else 'minutes'} ago" + else: + return f"{seconds} {'second' if seconds == 1 else 'seconds'} ago" + +def clear_history(app_type): + """ + Clear history for an app + + Parameters: + - app_type: str - The app type (sonarr, radarr, etc) or "all" to clear all history + + Returns: + - bool - Success or failure + """ + if not ensure_history_dir(): + logger.error("Could not ensure history directory exists") + return False + + if app_type not in history_locks and app_type != "all": + logger.error(f"Invalid app type: {app_type}") + return False + + try: + if app_type == "all": + # Clear all history files for all apps + for app in history_locks.keys(): + # Clear all instance files + app_dir = HISTORY_BASE_PATH / app + # Ensure directory exists + app_dir.mkdir(exist_ok=True, parents=True) + + if app_dir.exists(): + instance_files = list(app_dir.glob("*.json")) + logger.debug(f"Found {len(instance_files)} instance files to clear for {app}") + + for history_file in instance_files: + with open(history_file, 'w') as f: + json.dump([], f) + logger.debug(f"Cleared instance history file: {history_file}") + else: + # Clear all instance files for specific app + app_dir = HISTORY_BASE_PATH / app_type + # Ensure directory exists + app_dir.mkdir(exist_ok=True, parents=True) + + if app_dir.exists(): + instance_files = list(app_dir.glob("*.json")) + logger.debug(f"Found {len(instance_files)} instance files to clear for {app_type}") + + for history_file in instance_files: + with open(history_file, 'w') as f: + json.dump([], f) + logger.debug(f"Cleared instance history file: {history_file}") + + logger.info(f"Successfully cleared history for {app_type}") + return True + except Exception as e: + logger.error(f"Error clearing history for {app_type}: {str(e)}") + return False + +def handle_instance_rename(app_type, old_instance_name, new_instance_name): + """ + Handle renaming of an instance by moving history entries to a new file. + + Parameters: + - app_type: str - The app type (sonarr, radarr, etc) + - old_instance_name: str - Previous instance name + - new_instance_name: str - New instance name + + Returns: + - bool - Success or failure + """ + if not ensure_history_dir(): + logger.error("Could not ensure history directory exists") + return False + + if app_type not in history_locks: + logger.error(f"Invalid app type: {app_type}") + return False + + # If names are the same, nothing to do + if old_instance_name == new_instance_name: + return True + + logger.info(f"Handling instance rename for {app_type}: {old_instance_name} -> {new_instance_name}") + + # Get paths for old and new history files + old_file = get_history_file_path(app_type, old_instance_name) + new_file = get_history_file_path(app_type, new_instance_name) + + # Ensure parent directories exist + new_file.parent.mkdir(exist_ok=True, parents=True) + + # Thread-safe operation + with history_locks[app_type]: + try: + # Load old data if it exists + old_data = [] + if old_file.exists(): + try: + with open(old_file, 'r') as f: + old_data = json.load(f) + logger.info(f"Loaded {len(old_data)} history entries from {old_file}") + except (json.JSONDecodeError, FileNotFoundError) as e: + logger.warning(f"Error reading old history file {old_file}: {e}") + + # Update instance_name in all entries + for entry in old_data: + entry["instance_name"] = new_instance_name + + # Create or load new file + new_data = [] + if new_file.exists(): + try: + with open(new_file, 'r') as f: + new_data = json.load(f) + logger.info(f"Loaded {len(new_data)} existing history entries from {new_file}") + except (json.JSONDecodeError, FileNotFoundError) as e: + logger.warning(f"Error reading new history file {new_file}: {e}") + + # Merge data, avoiding duplicates + existing_keys = {(entry.get("id", ""), entry.get("date_time", 0)) for entry in new_data} + for entry in old_data: + entry_key = (entry.get("id", ""), entry.get("date_time", 0)) + if entry_key not in existing_keys: + new_data.append(entry) + + # Sort by timestamp + new_data = sorted(new_data, key=lambda x: x.get("date_time", 0), reverse=True) + + # Save merged data to new file + with open(new_file, 'w') as f: + json.dump(new_data, f, indent=2) + logger.info(f"Saved {len(new_data)} history entries to {new_file}") + + # Optionally delete old file if it exists + if old_file.exists(): + old_file.unlink() + logger.info(f"Deleted old history file {old_file}") + + return True + except Exception as e: + logger.error(f"Error renaming instance history: {e}") + return False + +def initialize_instance_history(app_type, instance_name): + """ + Initialize or ensure history file exists for a specific instance. + This should be called whenever an instance is created or configured. + + Parameters: + - app_type: str - The app type (sonarr, radarr, etc) + - instance_name: str - Name of the instance + + Returns: + - str - Path to the history file + """ + if not ensure_history_dir(): + logger.error("Could not ensure history directory exists") + return None + + if app_type not in history_locks: + logger.error(f"Invalid app type: {app_type}") + return None + + try: + # Get the history file path + history_file = get_history_file_path(app_type, instance_name) + + # Ensure parent directory exists + history_file.parent.mkdir(exist_ok=True, parents=True) + + # Create the file if it doesn't exist + if not history_file.exists(): + with open(history_file, 'w') as f: + json.dump([], f) + logger.info(f"Created history file for {app_type}/{instance_name}: {history_file}") + + return str(history_file) + except Exception as e: + logger.error(f"Error initializing history for {app_type}/{instance_name}: {e}") + return None + +def sync_history_files_with_instances(): + """ + Synchronize history files with existing instances. + This ensures that every instance has a corresponding history file. + + Returns: + - dict - Information about what was synchronized + """ + result = { + "success": False, + "app_instances": {}, + "created_files": [], + "error": None + } + + try: + # First ensure history directories exist + ensure_history_dir() + + # Load settings for each app type to find instances + for app_type in history_locks.keys(): + app_dir = HISTORY_BASE_PATH / app_type + app_dir.mkdir(exist_ok=True, parents=True) + + result["app_instances"][app_type] = [] + + # Let's check for instance settings from settings directory + instances_dir = pathlib.Path("/config") / app_type + if instances_dir.exists(): + for instance_file in instances_dir.glob("*.json"): + try: + # Extract instance name from filename + instance_name = instance_file.stem + result["app_instances"][app_type].append(instance_name) + logger.info(f"Found instance for {app_type}: {instance_name}") + + # Create history file for this instance if it doesn't exist + history_file = get_history_file_path(app_type, instance_name) + if not history_file.exists(): + history_file.parent.mkdir(exist_ok=True, parents=True) + with open(history_file, 'w') as f: + json.dump([], f) + logger.info(f"Created history file for {app_type}/{instance_name}: {history_file}") + result["created_files"].append(str(history_file)) + except Exception as e: + logger.error(f"Error processing instance file {instance_file}: {e}") + + result["success"] = True + return result + except Exception as e: + logger.error(f"Error syncing history files with instances: {e}") + result["error"] = str(e) + return result + +# Run the synchronization on module import +sync_result = sync_history_files_with_instances() +logger.info(f"History synchronization result: {sync_result}") diff --git a/Huntarr.io-6.3.6/src/primary/keys_manager.py b/Huntarr.io-6.3.6/src/primary/keys_manager.py new file mode 100644 index 0000000..99a53d0 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/keys_manager.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +""" +Keys manager for Huntarr +Handles storage and retrieval of API keys and URLs from huntarr.json +""" + +import os +import json +import pathlib +import logging +from typing import Dict, Any, Optional, Tuple + +# Create a simple logger +logging.basicConfig(level=logging.INFO) +keys_logger = logging.getLogger("keys_manager") + +# Settings directory - Changed to match the updated settings_manager.py +SETTINGS_DIR = pathlib.Path("/config") +SETTINGS_DIR.mkdir(parents=True, exist_ok=True) + +SETTINGS_FILE = SETTINGS_DIR / "huntarr.json" + +# Removed save_api_keys function + +# Removed get_api_keys function + +# Removed list_configured_apps function + +# Keep other functions if they exist and are needed, otherwise the file might become empty. +# If this file solely managed API keys in the old way, it might be removable entirely, +# but let's keep it for now in case other key-related logic exists or is added later. \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/routes/common.py b/Huntarr.io-6.3.6/src/primary/routes/common.py new file mode 100644 index 0000000..47a5d38 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/routes/common.py @@ -0,0 +1,444 @@ +#!/usr/bin/env python3 +""" +Common routes blueprint for Huntarr web interface +""" + +import os +import json +import base64 +import io +import qrcode +import pyotp +import logging +# Add render_template, send_from_directory, session +from flask import Blueprint, request, jsonify, make_response, redirect, url_for, current_app, render_template, send_from_directory, session +from ..auth import ( + verify_user, create_session, get_username_from_session, SESSION_COOKIE_NAME, + change_username as auth_change_username, change_password as auth_change_password, + validate_password_strength, logout, verify_session, disable_2fa_with_password_and_otp, + user_exists, create_user, generate_2fa_secret, verify_2fa_code, is_2fa_enabled # Add missing auth imports +) +from ..utils.logger import logger # Ensure logger is imported +from .. import settings_manager # Import settings_manager + +common_bp = Blueprint('common', __name__) + +# --- Static File Serving --- # + +@common_bp.route('/static/') +def static_files(filename): + return send_from_directory(common_bp.static_folder, filename) + +@common_bp.route('/favicon.ico') +def favicon(): + return send_from_directory(common_bp.static_folder, 'favicon.ico', mimetype='image/vnd.microsoft.icon') + +@common_bp.route('/logo/') +def logo_files(filename): + logo_dir = os.path.join(common_bp.static_folder, 'logo') + return send_from_directory(logo_dir, filename) + +# --- Authentication Routes --- # + +@common_bp.route('/login', methods=['GET', 'POST']) +def login_route(): + if request.method == 'POST': + try: # Wrap the POST logic in a try block for better error handling + data = request.json + username = data.get('username') + password = data.get('password') + twoFactorCode = data.get('twoFactorCode') # Changed from 'otp_code' to match frontend form + + if not username or not password: + logger.warning("Login attempt with missing username or password.") + return jsonify({"success": False, "error": "Username and password are required"}), 400 + + # Call verify_user which now returns (auth_success, needs_2fa) + auth_success, needs_2fa = verify_user(username, password, twoFactorCode) + + logger.debug(f"Auth result for '{username}': success={auth_success}, needs_2fa={needs_2fa}") + + if auth_success: + # User is authenticated (password correct, and 2FA if needed was correct) + session_token = create_session(username) + session[SESSION_COOKIE_NAME] = session_token # Store token in Flask session immediately + response = jsonify({"success": True, "redirect": "/"}) # Add redirect URL + response.set_cookie(SESSION_COOKIE_NAME, session_token, httponly=True, samesite='Lax', path='/') # Add path + logger.info(f"User '{username}' logged in successfully.") + return response + elif needs_2fa: + # Authentication failed *because* 2FA was required (or code was invalid) + # The specific reason (missing vs invalid code) is logged in verify_user + logger.warning(f"Login failed for '{username}': 2FA required or invalid.") + logger.debug(f"Returning 2FA required response: {{\"success\": False, \"requires_2fa\": True, \"requiresTwoFactor\": True, \"error\": \"Invalid or missing 2FA code\"}}") + + # Use all common variations of the 2FA flag to ensure compatibility + return jsonify({ + "success": False, + "requires_2fa": True, + "requiresTwoFactor": True, + "requires2fa": True, + "requireTwoFactor": True, + "error": "Two-factor authentication code required" + }), 401 + else: + # Authentication failed for other reasons (e.g., wrong password, user not found) + # Specific reason logged in verify_user + logger.warning(f"Login failed for '{username}': Invalid credentials or other error.") + return jsonify({"success": False, "error": "Invalid username or password"}), 401 # Use 401 + + except Exception as e: + logger.error(f"Unexpected error during login POST for user '{username if 'username' in locals() else 'unknown'}': {e}", exc_info=True) + return jsonify({"success": False, "error": "An internal server error occurred during login."}), 500 + else: + # GET request - show login page + # If user already exists, show login, otherwise redirect to setup + if not user_exists(): + logger.info("No user exists, redirecting to setup.") + return redirect(url_for('common.setup_route')) + logger.debug("Displaying login page.") + return render_template('login.html') + +@common_bp.route('/logout', methods=['POST']) +def logout_route(): + try: + session_token = request.cookies.get(SESSION_COOKIE_NAME) + if session_token: + logger.info(f"Logging out session token: {session_token[:8]}...") # Log part of token + logout(session_token) # Call the logout function from auth.py + else: + logger.warning("Logout attempt without session cookie.") + + response = jsonify({"success": True}) + # Ensure cookie deletion happens even if logout function had issues + response.delete_cookie(SESSION_COOKIE_NAME, path='/', samesite='Lax') # Specify path and samesite + logger.info("Logout successful, cookie deleted.") + return response + except Exception as e: + logger.error(f"Error during logout: {e}", exc_info=True) + # Return a JSON error response + return jsonify({"success": False, "error": "An internal server error occurred during logout."}), 500 + +@common_bp.route('/setup', methods=['GET', 'POST']) +def setup(): + if user_exists(): # This function should now be defined via import + # If a user already exists, redirect to login or home + logger.info("Setup page accessed but user already exists. Redirecting to login.") + return redirect(url_for('common.login_route')) + + if request.method == 'POST': + username = None # Initialize username for logging in case of early failure + try: # Add try block to catch potential errors during user creation + data = request.json + username = data.get('username') + password = data.get('password') + confirm_password = data.get('confirm_password') + + # Basic validation + if not username or not password or not confirm_password: + return jsonify({"success": False, "error": "Missing required fields"}), 400 + + # Add username length validation + if len(username.strip()) < 3: + return jsonify({"success": False, "error": "Username must be at least 3 characters long"}), 400 + + if password != confirm_password: + return jsonify({"success": False, "error": "Passwords do not match"}), 400 + + # Validate password strength using the backend function + password_error = validate_password_strength(password) + if password_error: + return jsonify({"success": False, "error": password_error}), 400 + + logger.info(f"Attempting to create user '{username}' during setup.") + if create_user(username, password): # This function should now be defined via import + # Automatically log in the user after setup + logger.info(f"User '{username}' created successfully during setup. Creating session.") + session_token = create_session(username) + # Explicitly set username in Flask session - might not be needed if using token correctly + # session['username'] = username + session[SESSION_COOKIE_NAME] = session_token # Store token in session + response = jsonify({"success": True}) + # Set cookie in the response + response.set_cookie(SESSION_COOKIE_NAME, session_token, httponly=True, samesite='Lax', path='/') # Add path + return response + else: + # create_user itself failed, but didn't raise an exception + logger.error(f"create_user function returned False for user '{username}' during setup.") + return jsonify({"success": False, "error": "Failed to create user (internal reason)"}), 500 + except Exception as e: + # Catch any unexpected exception during the process + logger.error(f"Unexpected error during setup POST for user '{username if username else 'unknown'}': {e}", exc_info=True) + return jsonify({"success": False, "error": f"An unexpected server error occurred: {e}"}), 500 + else: + # GET request - show setup page + logger.info("Displaying setup page.") + return render_template('setup.html') # This function should now be defined via import + +# --- User Management API Routes --- # + +@common_bp.route('/api/user/info', methods=['GET']) +def get_user_info_route(): + # Use session token to get username + session_token = request.cookies.get(SESSION_COOKIE_NAME) + username = get_username_from_session(session_token) # Use auth function + + if not username: + logger.warning("Attempt to get user info failed: Not authenticated (no valid session).") + return jsonify({"error": "Not authenticated"}), 401 + + # Pass username to is_2fa_enabled + two_fa_status = is_2fa_enabled(username) # This function should now be defined via import + logger.debug(f"Retrieved user info for '{username}'. 2FA enabled: {two_fa_status}") + return jsonify({"username": username, "is_2fa_enabled": two_fa_status}) + +@common_bp.route('/api/user/change-username', methods=['POST']) +def change_username_route(): + # Use session token to get username + session_token = request.cookies.get(SESSION_COOKIE_NAME) + current_username = get_username_from_session(session_token) + + if not current_username: + logger.warning("Username change attempt failed: Not authenticated.") + return jsonify({"error": "Not authenticated"}), 401 + + data = request.json + new_username = data.get('username') + password = data.get('password') # Get password from request + + if not new_username or not password: # Check if password is provided + return jsonify({"success": False, "error": "New username and current password are required"}), 400 + + # Add username length validation + if len(new_username.strip()) < 3: + return jsonify({"success": False, "error": "Username must be at least 3 characters long"}), 400 + + # Call the change_username function from auth.py + if auth_change_username(current_username, new_username, password): + # Update session? The session stores a token, not the username directly. + # If the username is needed frequently, maybe re-create session or update session data if stored there. + # For now, assume token remains valid. + logger.info(f"Username changed successfully for '{current_username}' to '{new_username}'.") + # Re-fetch username to confirm change for response? Or trust change_username? + # Fetch updated info to send back + updated_username = new_username # Assume success means it changed + return jsonify({"success": True, "username": updated_username}) # Return new username + else: + logger.warning(f"Username change failed for '{current_username}'. Check logs in auth.py for details.") + return jsonify({"success": False, "error": "Failed to change username. Check password or logs."}), 400 + +@common_bp.route('/api/user/change-password', methods=['POST']) +def change_password_route(): + # Use session token to get username - needed? change_password might not need it if single user + session_token = request.cookies.get(SESSION_COOKIE_NAME) + username = get_username_from_session(session_token) # Get username for logging + + if not username: # Check if session is valid even if function doesn't need username + logger.warning("Password change attempt failed: Not authenticated.") + return jsonify({"error": "Not authenticated"}), 401 + + data = request.json + current_password = data.get('current_password') + new_password = data.get('new_password') + + if not current_password or not new_password: + logger.warning(f"Password change attempt for user '{username}' failed: Missing current or new password.") + return jsonify({"success": False, "error": "Current and new passwords are required"}), 400 + + logger.info(f"Attempting to change password for user '{username}'.") + # Pass username? change_password might not need it. Assuming it doesn't for now. + if auth_change_password(current_password, new_password): + logger.info(f"Password changed successfully for user '{username}'.") + return jsonify({"success": True}) + else: + logger.warning(f"Password change failed for user '{username}'. Check logs in auth.py for details.") + return jsonify({"success": False, "error": "Failed to change password. Check current password or logs."}), 400 + +# --- 2FA Management API Routes --- # + +@common_bp.route('/api/user/2fa/setup', methods=['POST']) +def setup_2fa(): + # Use session token to get username + session_token = request.cookies.get(SESSION_COOKIE_NAME) + username = get_username_from_session(session_token) + + if not username: + logger.warning("2FA setup attempt failed: No username in session.") # Add logging + return jsonify({"error": "Not authenticated"}), 401 + + try: + logger.info(f"Generating 2FA setup for user: {username}") # Add logging + # Pass username to generate_2fa_secret + secret, qr_code_data_uri = generate_2fa_secret(username) # This function should now be defined via import + + # Return secret and QR code data URI + return jsonify({"success": True, "secret": secret, "qr_code_url": qr_code_data_uri}) # Match frontend expectation 'qr_code_url' + + except Exception as e: + logger.error(f"Error during 2FA setup generation for user '{username}': {e}", exc_info=True) + return jsonify({"success": False, "error": "Failed to generate 2FA setup information."}), 500 + +@common_bp.route('/api/user/2fa/verify', methods=['POST']) +def verify_2fa(): + # Use session token to get username + session_token = request.cookies.get(SESSION_COOKIE_NAME) + username = get_username_from_session(session_token) + + if not username: + logger.warning("2FA verify attempt failed: No username in session.") # Add logging + return jsonify({"error": "Not authenticated"}), 401 + + data = request.json + otp_code = data.get('code') # Match frontend key 'code' + + if not otp_code or len(otp_code) != 6 or not otp_code.isdigit(): # Add validation + logger.warning(f"2FA verification for '{username}' failed: Invalid code format provided.") + return jsonify({"success": False, "error": "Invalid or missing 6-digit OTP code"}), 400 + + logger.info(f"Attempting to verify 2FA code for user '{username}'.") + # Pass username to verify_2fa_code + if verify_2fa_code(username, otp_code, enable_on_verify=True): # This function should now be defined via import + logger.info(f"Successfully verified and enabled 2FA for user: {username}") # Add logging + return jsonify({"success": True}) + else: + # Reason logged in verify_2fa_code + logger.warning(f"2FA verification failed for user: {username}. Check logs in auth.py.") + return jsonify({"success": False, "error": "Invalid OTP code"}), 400 # Use 400 for bad request + +@common_bp.route('/api/user/2fa/disable', methods=['POST']) +def disable_2fa_route(): + session_token = request.cookies.get(SESSION_COOKIE_NAME) + username = get_username_from_session(session_token) + + if not username: + logger.warning("2FA disable attempt failed: Not authenticated.") + return jsonify({"error": "Not authenticated"}), 401 + + data = request.json + password = data.get('password') + otp_code = data.get('code') + + # Require BOTH password and OTP code + if not password or not otp_code: + logger.warning(f"2FA disable attempt for '{username}' failed: Missing password or OTP code.") + return jsonify({"success": False, "error": "Both password and current OTP code are required to disable 2FA"}), 400 + + if not (len(otp_code) == 6 and otp_code.isdigit()): + logger.warning(f"2FA disable attempt for '{username}' failed: Invalid OTP code format.") + return jsonify({"success": False, "error": "Invalid 6-digit OTP code format"}), 400 + + # Call a function that verifies both password and OTP + if disable_2fa_with_password_and_otp(username, password, otp_code): + logger.info(f"2FA disabled successfully for user '{username}' using password and OTP.") + return jsonify({"success": True}) + else: + # Reason logged in disable_2fa_with_password_and_otp + logger.warning(f"Failed to disable 2FA for user '{username}' using password and OTP. Check logs.") + # Provide a more specific error if possible, otherwise generic + # The auth function should log the specific reason (bad pass, bad otp) + return jsonify({"success": False, "error": "Failed to disable 2FA. Invalid password or OTP code."}), 400 + +# --- Theme Setting Route --- +@common_bp.route('/api/settings/theme', methods=['POST']) +def set_theme(): + # Authentication check + session_token = request.cookies.get(SESSION_COOKIE_NAME) + if not verify_session(session_token): + logger.warning("Theme setting attempt failed: Not authenticated.") + return jsonify({"error": "Unauthorized"}), 401 + + try: + data = request.json + dark_mode = data.get('dark_mode') + + if dark_mode is None or not isinstance(dark_mode, bool): + logger.warning("Invalid theme setting received.") + return jsonify({"success": False, "error": "Invalid 'dark_mode' value"}), 400 + + # Here you would typically save this preference to a user profile or global setting + # For now, just log it. A real implementation would persist this. + username = get_username_from_session(session_token) # Get username for logging + logger.info(f"User '{username}' set dark mode preference to: {dark_mode}") + + # Example: Saving to a hypothetical global config (replace with actual persistence) + # global_settings = settings_manager.load_global_settings() # Assuming such a function exists + # global_settings['ui']['dark_mode'] = dark_mode + # settings_manager.save_global_settings(global_settings) # Assuming such a function exists + + return jsonify({"success": True}) + except Exception as e: + logger.error(f"Error setting theme preference: {e}", exc_info=True) + return jsonify({"success": False, "error": "Failed to set theme preference"}), 500 + +# --- Local Access Bypass Status API Route --- # + +@common_bp.route('/api/get_local_access_bypass_status', methods=['GET']) +def get_local_access_bypass_status_route(): + """API endpoint to get the status of the local network authentication bypass setting.""" + try: + # Get the setting from the 'general' section, default to False if not found + bypass_enabled = settings_manager.get_setting('general', 'local_access_bypass', False) + logger.debug(f"Retrieved local_access_bypass status: {bypass_enabled}") + # Return status in the format expected by the frontend + return jsonify({"isEnabled": bypass_enabled}) + except Exception as e: + logger.error(f"Error retrieving local_access_bypass status: {e}", exc_info=True) + # Return a generic error to the client + return jsonify({"error": "Failed to retrieve bypass status"}), 500 + +# --- Stats Management API Routes --- # +@common_bp.route('/api/stats', methods=['GET']) +def get_stats_api(): + """API endpoint to get media statistics""" + try: + # Import here to avoid circular imports + from ..stats_manager import get_stats + + # Get stats from stats_manager + stats = get_stats() + logger.debug(f"Retrieved stats for API response: {stats}") + + # Return success response with stats + return jsonify({"success": True, "stats": stats}) + except Exception as e: + logger.error(f"Error retrieving stats: {e}", exc_info=True) + return jsonify({"success": False, "error": str(e)}), 500 + +@common_bp.route('/api/stats/reset', methods=['POST']) +def reset_stats_api(): + """API endpoint to reset media statistics""" + try: + # Import here to avoid circular imports + from ..stats_manager import reset_stats + + # Check if authenticated + session_token = request.cookies.get(SESSION_COOKIE_NAME) + if not verify_session(session_token): + logger.warning("Stats reset attempt failed: Not authenticated.") + return jsonify({"error": "Unauthorized"}), 401 + + # Get app type from request if provided + data = request.json or {} + app_type = data.get('app_type') # None will reset all + + if app_type is not None and app_type not in ["sonarr", "radarr", "lidarr", "readarr", "whisparr"]: + logger.warning(f"Invalid app_type for stats reset: {app_type}") + return jsonify({"success": False, "error": "Invalid app_type"}), 400 + + # Reset stats + if reset_stats(app_type): + message = f"Reset statistics for {app_type}" if app_type else "Reset all statistics" + logger.info(message) + return jsonify({"success": True, "message": message}) + else: + error_msg = f"Failed to reset statistics for {app_type}" if app_type else "Failed to reset all statistics" + logger.error(error_msg) + return jsonify({"success": False, "error": error_msg}), 500 + except Exception as e: + logger.error(f"Error resetting stats: {e}", exc_info=True) + return jsonify({"success": False, "error": str(e)}), 500 + +# Ensure all routes previously in this file that interact with settings +# are either moved to web_server.py or updated here using the new settings_manager functions. + +# REMOVED DUPLICATE BLUEPRINT DEFINITION AND CONFLICTING ROUTES BELOW THIS LINE diff --git a/Huntarr.io-6.3.6/src/primary/routes/history_routes.py b/Huntarr.io-6.3.6/src/primary/routes/history_routes.py new file mode 100644 index 0000000..2a2735c --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/routes/history_routes.py @@ -0,0 +1,51 @@ +from flask import Blueprint, request, jsonify, current_app +import logging + +from src.primary.history_manager import get_history, clear_history, add_history_entry + +logger = logging.getLogger("huntarr") +history_blueprint = Blueprint('history', __name__) + +@history_blueprint.route('/', methods=['GET']) +def get_app_history(app_type): + """Get history entries for a specific app or all apps""" + try: + search_query = request.args.get('search', '') + page = int(request.args.get('page', 1)) + page_size = int(request.args.get('page_size', 20)) + + # Validate page_size to be one of the allowed values + allowed_page_sizes = [10, 20, 30, 50, 100, 250, 1000] + if page_size not in allowed_page_sizes: + page_size = 20 + + # Validate app_type + valid_app_types = ["all", "sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros", "swaparr"] + if app_type not in valid_app_types: + return jsonify({"error": f"Invalid app type: {app_type}"}), 400 + + result = get_history(app_type, search_query, page, page_size) + return jsonify(result), 200 + + except Exception as e: + logger.error(f"Error getting history for {app_type}: {str(e)}") + return jsonify({"error": str(e)}), 500 + +@history_blueprint.route('/', methods=['DELETE']) +def clear_app_history(app_type): + """Clear history for a specific app or all apps""" + try: + # Validate app_type + valid_app_types = ["all", "sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros", "swaparr"] + if app_type not in valid_app_types: + return jsonify({"error": f"Invalid app type: {app_type}"}), 400 + + success = clear_history(app_type) + if success: + return jsonify({"message": f"History cleared for {app_type}"}), 200 + else: + return jsonify({"error": f"Failed to clear history for {app_type}"}), 500 + + except Exception as e: + logger.error(f"Error clearing history for {app_type}: {str(e)}") + return jsonify({"error": str(e)}), 500 diff --git a/Huntarr.io-6.3.6/src/primary/routes/main.py b/Huntarr.io-6.3.6/src/primary/routes/main.py new file mode 100644 index 0000000..8794c5b --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/routes/main.py @@ -0,0 +1,54 @@ +from flask import Blueprint, request, jsonify +from src.primary.stats_manager import get_stats, reset_stats + +main_blueprint = Blueprint('main', __name__) + +@main_blueprint.route('/') +def index(): + # ...existing code... + + # Remove or comment out any logging of the web interface URL here + # logger.info(f"Web interface available at http://{request.host}") + + # ...existing code... + +# Add new route for getting media statistics +@main_blueprint.route('/api/stats', methods=['GET']) +@jwt_required() +def api_get_stats(): + """Get media statistics for each app""" + try: + stats = get_stats() + return jsonify({ + "success": True, + "stats": stats + }) + except Exception as e: + logger.error(f"Error retrieving media statistics: {e}") + return jsonify({ + "success": False, + "message": "Error retrieving media statistics." + }), 500 + +# Add route for resetting statistics +@main_blueprint.route('/api/stats/reset', methods=['POST']) +@jwt_required() +@admin_required +def api_reset_stats(): + """Reset media statistics""" + try: + app_type = None + if request.is_json: + app_type = request.json.get('app_type') + + reset_stats(app_type) + return jsonify({ + "success": True, + "message": f"Successfully reset statistics for {'all apps' if app_type is None else app_type}." + }) + except Exception as e: + logger.error(f"Error resetting media statistics: {e}") + return jsonify({ + "success": False, + "message": "Error resetting media statistics." + }), 500 \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/server.py b/Huntarr.io-6.3.6/src/primary/server.py new file mode 100644 index 0000000..27d5a50 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/server.py @@ -0,0 +1,20 @@ +import logging + +# ...existing code... + +def start_server(host='0.0.0.0', port=9876, debug=False): + """Start the web server""" + logging.basicConfig(level=logging.DEBUG if debug else logging.INFO) + logger = logging.getLogger(__name__) + + # ...existing code... + + # Change this line: + # logger.info(f"Web interface available at http://{host}:{port}") + + # To this (more discreet version): + logger.info(f"Server started on port {port}") + + # ...existing code... + +# ...existing code... \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/settings_manager.py b/Huntarr.io-6.3.6/src/primary/settings_manager.py new file mode 100644 index 0000000..2e69b13 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/settings_manager.py @@ -0,0 +1,338 @@ +#!/usr/bin/env python3 +""" +Settings manager for Huntarr +Handles loading, saving, and providing settings from individual JSON files per app +Supports default configurations for different Arr applications +""" + +import os +import json +import pathlib +import logging +import shutil +import subprocess +import time +from typing import Dict, Any, Optional, List + +# Create a simple logger for settings_manager +logging.basicConfig(level=logging.INFO) +settings_logger = logging.getLogger("settings_manager") + +# Settings directory setup - Root config directory +SETTINGS_DIR = pathlib.Path("/config") +SETTINGS_DIR.mkdir(parents=True, exist_ok=True) + +# Default configs location remains the same +DEFAULT_CONFIGS_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'default_configs')) + +# Update or add this as a class attribute or constant +KNOWN_APP_TYPES = ["sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros", "general", "swaparr"] + +# Add a settings cache with timestamps to avoid excessive disk reads +settings_cache = {} # Format: {app_name: {'timestamp': timestamp, 'data': settings_dict}} +CACHE_TTL = 5 # Cache time-to-live in seconds + +def clear_cache(app_name=None): + """Clear the settings cache for a specific app or all apps.""" + global settings_cache + if app_name: + if app_name in settings_cache: + settings_logger.debug(f"Clearing cache for {app_name}") + settings_cache.pop(app_name, None) + else: + settings_logger.debug("Clearing entire settings cache") + settings_cache = {} + +def get_settings_file_path(app_name: str) -> pathlib.Path: + """Get the path to the settings file for a specific app.""" + if app_name not in KNOWN_APP_TYPES: + # Log a warning but allow for potential future app types + settings_logger.warning(f"Requested settings file for unknown app type: {app_name}") + return SETTINGS_DIR / f"{app_name}.json" + +def get_default_config_path(app_name: str) -> pathlib.Path: + """Get the path to the default config file for a specific app.""" + return pathlib.Path(DEFAULT_CONFIGS_DIR) / f"{app_name}.json" + +# Helper function to load default settings for a specific app +def load_default_app_settings(app_name: str) -> Dict[str, Any]: + """Load default settings for a specific app from its JSON file.""" + default_file = get_default_config_path(app_name) + if default_file.exists(): + try: + with open(default_file, 'r') as f: + return json.load(f) + except Exception as e: + settings_logger.error(f"Error loading default settings for {app_name} from {default_file}: {e}") + return {} + else: + settings_logger.warning(f"Default settings file not found for {app_name}: {default_file}") + return {} + +def _ensure_config_exists(app_name: str) -> None: + """Ensure the config file exists for an app, copying from default if not.""" + settings_file = get_settings_file_path(app_name) + if not settings_file.exists(): + default_file = get_default_config_path(app_name) + if default_file.exists(): + try: + shutil.copyfile(default_file, settings_file) + settings_logger.info(f"Created default settings file for {app_name} at {settings_file}") + except Exception as e: + settings_logger.error(f"Error copying default settings for {app_name}: {e}") + else: + # Create an empty file if no default exists + settings_logger.warning(f"No default config found for {app_name}. Creating empty settings file.") + try: + with open(settings_file, 'w') as f: + json.dump({}, f) + except Exception as e: + settings_logger.error(f"Error creating empty settings file for {app_name}: {e}") + + +def load_settings(app_type, use_cache=True): + """ + Load settings for a specific app type + + Args: + app_type: The app type to load settings for + use_cache: Whether to use the cached settings if available and recent + + Returns: + Dict containing the app settings + """ + global settings_cache + + # Only log unexpected app types that are not 'general' + if app_type not in KNOWN_APP_TYPES and app_type != "general": + settings_logger.warning(f"load_settings called with unexpected app_type: {app_type}") + + # Check if we have a valid cache entry + if use_cache and app_type in settings_cache: + cache_entry = settings_cache[app_type] + cache_age = time.time() - cache_entry.get('timestamp', 0) + + if cache_age < CACHE_TTL: + settings_logger.debug(f"Using cached settings for {app_type} (age: {cache_age:.1f}s)") + return cache_entry['data'] + else: + settings_logger.debug(f"Cache expired for {app_type} (age: {cache_age:.1f}s)") + + # No valid cache entry, load from disk + _ensure_config_exists(app_type) + settings_file = get_settings_file_path(app_type) + try: + with open(settings_file, 'r') as f: + # Load existing settings + current_settings = json.load(f) + + # Load defaults to check for missing keys + default_settings = load_default_app_settings(app_type) + + # Add missing keys from defaults without overwriting existing values + updated = False + for key, value in default_settings.items(): + if key not in current_settings: + current_settings[key] = value + updated = True + + # If keys were added, save the updated file + if updated: + settings_logger.info(f"Added missing default keys to {app_type}.json") + save_settings(app_type, current_settings) # Use save_settings to handle writing + + # Update cache + settings_cache[app_type] = { + 'timestamp': time.time(), + 'data': current_settings + } + + return current_settings + + except json.JSONDecodeError: + settings_logger.error(f"Error decoding JSON from {settings_file}. Restoring from default.") + # Attempt to restore from default + default_settings = load_default_app_settings(app_type) + save_settings(app_type, default_settings) # Save the restored defaults + + # Update cache with defaults + settings_cache[app_type] = { + 'timestamp': time.time(), + 'data': default_settings + } + + return default_settings + except Exception as e: + settings_logger.error(f"Error loading settings for {app_type} from {settings_file}: {e}") + return {} # Return empty dict on other errors + + +def save_settings(app_name: str, settings_data: Dict[str, Any]) -> bool: + """Save settings for a specific app.""" + if app_name not in KNOWN_APP_TYPES: + settings_logger.error(f"Attempted to save settings for unknown app type: {app_name}") + return False + + settings_file = get_settings_file_path(app_name) + try: + # Ensure the directory exists (though it should from the top-level check) + settings_file.parent.mkdir(parents=True, exist_ok=True) + + # Write the provided settings data directly + with open(settings_file, 'w') as f: + json.dump(settings_data, f, indent=2) + settings_logger.info(f"Settings saved successfully for {app_name} to {settings_file}") + + # Clear cache for this app to ensure fresh reads + clear_cache(app_name) + + return True + except Exception as e: + settings_logger.error(f"Error saving settings for {app_name} to {settings_file}: {e}") + return False + +def get_setting(app_name: str, key: str, default: Optional[Any] = None) -> Any: + """Get a specific setting value for an app.""" + settings = load_settings(app_name) + return settings.get(key, default) + +def get_api_url(app_name: str) -> Optional[str]: + """Get the API URL for a specific app.""" + return get_setting(app_name, "api_url", "") + +def get_api_key(app_name: str) -> Optional[str]: + """Get the API Key for a specific app.""" + return get_setting(app_name, "api_key", "") + +def get_all_settings() -> Dict[str, Dict[str, Any]]: + """Load settings for all known apps.""" + all_settings = {} + for app_name in KNOWN_APP_TYPES: + # Only include apps if their config file exists or can be created from defaults + # Effectively, load_settings ensures the file exists and loads it. + settings = load_settings(app_name) + if settings: # Only add if settings were successfully loaded + all_settings[app_name] = settings + return all_settings + +def get_configured_apps() -> List[str]: + """Return a list of app names that have basic configuration (API URL and Key).""" + configured = [] + for app_name in KNOWN_APP_TYPES: + settings = load_settings(app_name) + + # First check if there are valid instances configured (multi-instance mode) + if "instances" in settings and isinstance(settings["instances"], list) and settings["instances"]: + for instance in settings["instances"]: + if instance.get("enabled", True) and instance.get("api_url") and instance.get("api_key"): + configured.append(app_name) + break # One valid instance is enough to consider the app configured + continue # Skip the single-instance check if we already checked instances + + # Fallback to legacy single-instance config + if settings.get("api_url") and settings.get("api_key"): + configured.append(app_name) + + settings_logger.info(f"Configured apps: {configured}") + return configured + +def apply_timezone(timezone: str) -> bool: + """Apply the specified timezone to the container. + + Args: + timezone: The timezone to set (e.g., 'UTC', 'America/New_York') + + Returns: + bool: True if successful, False otherwise + """ + try: + # Set TZ environment variable + os.environ['TZ'] = timezone + + # Create symlink for localtime (common approach in containers) + zoneinfo_path = f"/usr/share/zoneinfo/{timezone}" + if os.path.exists(zoneinfo_path): + # Remove existing symlink if it exists + if os.path.exists("/etc/localtime"): + os.remove("/etc/localtime") + + # Create new symlink + os.symlink(zoneinfo_path, "/etc/localtime") + + # Also update /etc/timezone file if it exists + with open("/etc/timezone", "w") as f: + f.write(f"{timezone}\n") + + settings_logger.info(f"Timezone set to {timezone}") + return True + else: + settings_logger.error(f"Timezone file not found: {zoneinfo_path}") + return False + except Exception as e: + settings_logger.error(f"Error setting timezone: {str(e)}") + return False + +# Add a list of known advanced settings for clarity and documentation +ADVANCED_SETTINGS = [ + "api_timeout", + "command_wait_delay", + "command_wait_attempts", + "minimum_download_queue_size", + "log_refresh_interval_seconds", + "debug_mode", + "stateful_management_hours" +] + +def get_advanced_setting(setting_name, default_value=None): + """ + Get an advanced setting from general settings. + + Advanced settings are now centralized in general settings and no longer stored + in individual app settings files. This function provides a consistent way to + access these settings from anywhere in the codebase. + + Args: + setting_name: The name of the advanced setting to retrieve + default_value: The default value to return if the setting is not found + + Returns: + The value of the setting or the default value if not found + """ + if setting_name not in ADVANCED_SETTINGS: + settings_logger.warning(f"Requested unknown advanced setting: {setting_name}") + + # Get from general settings + general_settings = load_settings('general', use_cache=True) + return general_settings.get(setting_name, default_value) + +# Example usage (for testing purposes, remove later) +if __name__ == "__main__": + settings_logger.info(f"Known app types: {KNOWN_APP_TYPES}") + + # Ensure defaults are copied if needed + for app in KNOWN_APP_TYPES: + _ensure_config_exists(app) + + # Test loading Sonarr settings + sonarr_settings = load_settings("sonarr") + settings_logger.info(f"Loaded Sonarr settings: {json.dumps(sonarr_settings, indent=2)}") + + # Test getting a specific setting + sonarr_sleep = get_setting("sonarr", "sleep_duration", 999) + settings_logger.info(f"Sonarr sleep duration: {sonarr_sleep}") + + # Test saving updated settings (example) + if sonarr_settings: + sonarr_settings["sleep_duration"] = 850 + save_settings("sonarr", sonarr_settings) + reloaded_sonarr_settings = load_settings("sonarr") + settings_logger.info(f"Reloaded Sonarr settings after save: {json.dumps(reloaded_sonarr_settings, indent=2)}") + + + # Test getting all settings + all_app_settings = get_all_settings() + settings_logger.info(f"All loaded settings: {json.dumps(all_app_settings, indent=2)}") + + # Test getting configured apps + configured_list = get_configured_apps() + settings_logger.info(f"Configured apps: {configured_list}") \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/state.py b/Huntarr.io-6.3.6/src/primary/state.py new file mode 100644 index 0000000..50011de --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/state.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python3 +""" +State management module for Huntarr +Handles all persistence of program state +""" + +import os +import datetime +import time +import json +from typing import List, Dict, Any, Optional +from src.primary import settings_manager + +# Define the config directory - typically /config in Docker environment +CONFIG_DIR = os.environ.get('CONFIG_DIR', '/config') + +# Get the logger at module level +from src.primary.utils.logger import get_logger +logger = get_logger("huntarr") + +def get_state_file_path(app_type, state_name): + """ + Get the path to a state file for a specific app type and state name. + + Args: + app_type: The application type (sonarr, radarr, etc.) + state_name: The name of the state file + + Returns: + The path to the state file + """ + # Define known app types + known_app_types = ["sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros"] + + # If app_type is not in known types, log a warning but don't fail + if app_type not in known_app_types and app_type != "general": + logger.warning(f"get_state_file_path called with unexpected app_type: {app_type}") + + # Create the state directory if it doesn't exist + state_dir = os.path.join(CONFIG_DIR, "state", app_type) + os.makedirs(state_dir, exist_ok=True) + + # Return the path to the state file + return os.path.join(state_dir, f"{state_name}.json") + +def get_last_reset_time(app_type: str = None) -> datetime.datetime: + """ + Get the last time the state was reset for a specific app type. + + Args: + app_type: The type of app to get last reset time for. + + Returns: + The datetime of the last reset, or a very old date if no reset has occurred or app_type is invalid. + """ + if not app_type: + logger.error("get_last_reset_time called without app_type.") + return datetime.datetime.fromtimestamp(0) + + current_app_type = app_type + reset_file = get_state_file_path(current_app_type, "last_reset") + + try: + if os.path.exists(reset_file): + with open(reset_file, "r") as f: + reset_time_str = f.read().strip() + return datetime.datetime.fromisoformat(reset_time_str) + except Exception as e: + logger.error(f"Error reading last reset time for {current_app_type}: {e}") + + return datetime.datetime.fromtimestamp(0) + +def set_last_reset_time(reset_time: datetime.datetime, app_type: str = None) -> None: + """ + Set the last time the state was reset for a specific app type. + + Args: + reset_time: The datetime to set + app_type: The type of app to set last reset time for. + """ + if not app_type: + logger.error("set_last_reset_time called without app_type.") + return + + current_app_type = app_type + reset_file = get_state_file_path(current_app_type, "last_reset") + + try: + with open(reset_file, "w") as f: + f.write(reset_time.isoformat()) + except Exception as e: + logger.error(f"Error writing last reset time for {current_app_type}: {e}") + +def check_state_reset(app_type: str = None) -> bool: + """ + Check if the state needs to be reset based on the reset interval. + If it's time to reset, clears the processed IDs and updates the last reset time. + + Args: + app_type: The type of app to check state reset for. + + Returns: + True if the state was reset, False otherwise. + """ + if not app_type: + logger.error("check_state_reset called without app_type.") + return False + + current_app_type = app_type + + # Use a much longer default interval (1 week = 168 hours) to prevent frequent resets + reset_interval = settings_manager.get_advanced_setting("stateful_management_hours", 168) + + last_reset = get_last_reset_time(current_app_type) + now = datetime.datetime.now() + + delta = now - last_reset + hours_passed = delta.total_seconds() / 3600 + + # Log every cycle to help diagnose state reset issues + logger.debug(f"State check for {current_app_type}: {hours_passed:.1f} hours since last reset (interval: {reset_interval}h)") + + if hours_passed >= reset_interval: + logger.warning(f"State files for {current_app_type} will be reset after {hours_passed:.1f} hours (interval: {reset_interval}h)") + logger.warning(f"This will cause all previously processed media to be eligible for processing again") + + # Add additional safeguard - only reset if more than double the interval has passed + # This helps prevent accidental resets due to clock issues or other anomalies + if hours_passed >= (reset_interval * 2): + logger.info(f"Confirmed state reset for {current_app_type} after {hours_passed:.1f} hours") + clear_processed_ids(current_app_type) + set_last_reset_time(now, current_app_type) + return True + else: + logger.info(f"State reset postponed for {current_app_type} - will proceed when {reset_interval * 2}h have passed") + # Update last reset time partially to avoid immediate reset next cycle + half_delta = datetime.timedelta(hours=reset_interval/2) + set_last_reset_time(now - half_delta, current_app_type) + + return False + +def clear_processed_ids(app_type: str = None) -> None: + """ + Clear all processed IDs for a specific app type. + + Args: + app_type: The type of app to clear processed IDs for. + """ + if not app_type: + logger.error("clear_processed_ids called without app_type.") + return + + current_app_type = app_type + + missing_file = get_state_file_path(current_app_type, "processed_missing") + try: + if os.path.exists(missing_file): + with open(missing_file, "w") as f: + f.write("[]") + logger.info(f"Cleared processed missing IDs for {current_app_type}") + except Exception as e: + logger.error(f"Error clearing processed missing IDs for {current_app_type}: {e}") + + upgrades_file = get_state_file_path(current_app_type, "processed_upgrades") + try: + if os.path.exists(upgrades_file): + with open(upgrades_file, "w") as f: + f.write("[]") + logger.info(f"Cleared processed upgrade IDs for {current_app_type}") + except Exception as e: + logger.error(f"Error clearing processed upgrade IDs for {current_app_type}: {e}") + +def calculate_reset_time(app_type: str = None) -> str: + """ + Calculate when the next state reset will occur. + + Args: + app_type: The type of app to calculate reset time for. + + Returns: + A string representation of when the next reset will occur. + """ + if not app_type: + logger.error("calculate_reset_time called without app_type.") + return "Next reset: Unknown (app type not provided)" + + current_app_type = app_type + + reset_interval = settings_manager.get_advanced_setting("stateful_management_hours", 168) + + last_reset = get_last_reset_time(current_app_type) + next_reset = last_reset + datetime.timedelta(hours=reset_interval) + now = datetime.datetime.now() + + if next_reset < now: + return "Next reset: at the start of the next cycle" + + delta = next_reset - now + hours = delta.total_seconds() / 3600 + + if hours < 1: + minutes = delta.total_seconds() / 60 + return f"Next reset: in {int(minutes)} minutes" + elif hours < 24: + return f"Next reset: in {int(hours)} hours" + else: + days = hours / 24 + return f"Next reset: in {int(days)} days" + +def load_processed_ids(filepath: str) -> List[int]: + """ + Load processed IDs from a file. + + Args: + filepath: The path to the file + + Returns: + A list of processed IDs + """ + try: + if os.path.exists(filepath): + with open(filepath, "r") as f: + loaded_data = json.load(f) + if isinstance(loaded_data, list): + return loaded_data + else: + logger.error(f"Invalid data type loaded from {filepath}. Expected list, got {type(loaded_data)}. Returning empty list.") + return [] + return [] + except json.JSONDecodeError as e: + logger.error(f"Error decoding JSON from {filepath}: {e}. Returning empty list.") + return [] # Ensure list is returned even on JSON error + except Exception as e: + logger.error(f"Error loading processed IDs from {filepath}: {e}") + return [] + +def save_processed_ids(filepath: str, ids: List[int]) -> None: + """ + Save processed IDs to a file. + + Args: + filepath: The path to the file + ids: The list of IDs to save + """ + try: + with open(filepath, "w") as f: + json.dump(ids, f) + except Exception as e: + logger.error(f"Error saving processed IDs to {filepath}: {e}") + +def save_processed_id(filepath: str, item_id: int) -> None: + """ + Add a single ID to a processed IDs file. + + Args: + filepath: The path to the file + item_id: The ID to add + """ + processed_ids = load_processed_ids(filepath) + + if item_id not in processed_ids: + processed_ids.append(item_id) + save_processed_ids(filepath, processed_ids) + +def reset_state_file(app_type: str, state_type: str) -> bool: + """ + Reset a specific state file for an app type. + + Args: + app_type: The type of app (sonarr, radarr, etc.) + state_type: The type of state file (processed_missing, processed_upgrades) + + Returns: + True if successful, False otherwise + """ + if not app_type: + logger.error("reset_state_file called without app_type.") + return False + + filepath = get_state_file_path(app_type, state_type) + + try: + save_processed_ids(filepath, []) + logger.info(f"Reset {state_type} state file for {app_type}") + return True + except Exception as e: + logger.error(f"Error resetting {state_type} state file for {app_type}: {e}") + return False + +def truncate_processed_list(filepath: str, max_items: int = 1000) -> None: + """ + Truncate a processed IDs list to a maximum number of items. + This helps prevent the file from growing too large over time. + + Args: + filepath: The path to the file + max_items: The maximum number of items to keep + """ + processed_ids = load_processed_ids(filepath) + + if len(processed_ids) > max_items: + processed_ids = processed_ids[-max_items:] + save_processed_ids(filepath, processed_ids) + logger.debug(f"Truncated {filepath} to {max_items} items") + +def init_state_files() -> None: + """Initialize state files for all app types""" + app_types = settings_manager.KNOWN_APP_TYPES + + for app_type in app_types: + missing_file = get_state_file_path(app_type, "processed_missing") + upgrades_file = get_state_file_path(app_type, "processed_upgrades") + reset_file = get_state_file_path(app_type, "last_reset") + + for filepath in [missing_file, upgrades_file]: + if not os.path.exists(filepath): + save_processed_ids(filepath, []) + + if not os.path.exists(reset_file): + set_last_reset_time(datetime.datetime.fromtimestamp(0), app_type) + +init_state_files() \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/stateful_manager.py b/Huntarr.io-6.3.6/src/primary/stateful_manager.py new file mode 100644 index 0000000..30819f1 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/stateful_manager.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +""" +Stateful Manager for Huntarr +Handles storing and retrieving processed media IDs to prevent reprocessing +""" + +import os +import json +import time +import pathlib +import datetime +import logging +from typing import Dict, Any, List, Optional, Set + +# Create logger for stateful_manager +stateful_logger = logging.getLogger("stateful_manager") + +# Constants +STATEFUL_DIR = pathlib.Path(os.getenv("STATEFUL_DIR", "/config/stateful")) +LOCK_FILE = STATEFUL_DIR / "lock.json" +DEFAULT_HOURS = 168 # Default 7 days (168 hours) + +# Ensure the stateful directory exists +try: + STATEFUL_DIR.mkdir(parents=True, exist_ok=True) + stateful_logger.info(f"Stateful directory created/confirmed at {STATEFUL_DIR}") +except Exception as e: + stateful_logger.error(f"Error creating stateful directory: {e}") + +# Create app directories +APP_TYPES = ["sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros"] +for app_type in APP_TYPES: + (STATEFUL_DIR / app_type).mkdir(exist_ok=True) + +# Add import for get_advanced_setting +from src.primary.settings_manager import get_advanced_setting + +def initialize_lock_file() -> None: + """Initialize the lock file with the current timestamp if it doesn't exist.""" + # Ensure directory exists - we don't need to log this again + try: + STATEFUL_DIR.mkdir(parents=True, exist_ok=True) + except Exception as e: + stateful_logger.error(f"Error creating stateful directory: {e}") + + if not LOCK_FILE.exists(): + try: + current_time = int(time.time()) + # Get the expiration hours setting + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + + expires_at = current_time + (expiration_hours * 3600) + + with open(LOCK_FILE, 'w') as f: + json.dump({ + "created_at": current_time, + "expires_at": expires_at + }, f, indent=2) + stateful_logger.info(f"Initialized lock file at {LOCK_FILE} with expiration in {expiration_hours} hours") + except Exception as e: + stateful_logger.error(f"Error initializing lock file: {e}") + +def get_lock_info() -> Dict[str, Any]: + """Get the current lock information.""" + initialize_lock_file() + try: + with open(LOCK_FILE, 'r') as f: + lock_info = json.load(f) + + # Validate the structure and ensure required fields exist + if not isinstance(lock_info, dict): + raise ValueError("Lock info is not a dictionary") + + if "created_at" not in lock_info: + lock_info["created_at"] = int(time.time()) + + if "expires_at" not in lock_info or lock_info["expires_at"] is None: + # Recalculate expiration if missing + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + lock_info["expires_at"] = lock_info["created_at"] + (expiration_hours * 3600) + + # Save the updated info + with open(LOCK_FILE, 'w') as f: + json.dump(lock_info, f, indent=2) + + return lock_info + except Exception as e: + stateful_logger.error(f"Error reading lock file: {e}") + # Return default values if there's an error + current_time = int(time.time()) + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + expires_at = current_time + (expiration_hours * 3600) + + return { + "created_at": current_time, + "expires_at": expires_at + } + +def update_lock_expiration(hours: int = None) -> bool: + """Update the lock expiration based on the hours setting.""" + if hours is None: + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + else: + expiration_hours = hours + + lock_info = get_lock_info() + created_at = lock_info.get("created_at", int(time.time())) + expires_at = created_at + (expiration_hours * 3600) + + lock_info["expires_at"] = expires_at + + try: + with open(LOCK_FILE, 'w') as f: + json.dump(lock_info, f, indent=2) + stateful_logger.info(f"Updated lock expiration to {datetime.datetime.fromtimestamp(expires_at)}") + return True + except Exception as e: + stateful_logger.error(f"Error updating lock expiration: {e}") + return False + +def reset_stateful_management() -> bool: + """ + Reset the stateful management system. + + This involves: + 1. Creating a new lock file with the current timestamp and a calculated expiration time + based on the 'stateful_management_hours' setting. + 2. Deleting all stored processed ID files (*.json) within each app-specific + subdirectory under the STATEFUL_DIR. + + Returns: + bool: True if the reset was successful, False otherwise. + """ + try: + # Get the expiration hours setting BEFORE writing the lock file + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + + # Create new lock file with calculated expiration + current_time = int(time.time()) + expires_at = current_time + (expiration_hours * 3600) + + with open(LOCK_FILE, 'w') as f: + json.dump({ + "created_at": current_time, + "expires_at": expires_at # Write the calculated expiration time directly + }, f, indent=2) + + # Delete all stored IDs + for app_type in APP_TYPES: + app_dir = STATEFUL_DIR / app_type + if app_dir.exists(): + for json_file in app_dir.glob("*.json"): + try: + json_file.unlink() + stateful_logger.debug(f"Deleted {json_file}") + except Exception as e: + stateful_logger.error(f"Error deleting {json_file}: {e}") + + # No need to call update_lock_expiration() again as we wrote it directly + stateful_logger.info(f"Successfully reset stateful management. New expiration: {datetime.datetime.fromtimestamp(expires_at)}") + return True + except Exception as e: + stateful_logger.error(f"Error resetting stateful management: {e}") + return False + +def check_expiration() -> bool: + """ + Check if the stateful management has expired. + + Returns: + bool: True if expired, False otherwise + """ + lock_info = get_lock_info() + expires_at = lock_info.get("expires_at") + + # If expires_at is None, update it based on settings + if expires_at is None: + update_lock_expiration() + lock_info = get_lock_info() + expires_at = lock_info.get("expires_at") + + current_time = int(time.time()) + + if current_time >= expires_at: + stateful_logger.info("Stateful management has expired, resetting...") + reset_stateful_management() + return True + + return False + +def get_processed_ids(app_type: str, instance_name: str) -> Set[str]: + """ + Get the set of processed media IDs for a specific app instance. + + Args: + app_type: The type of app (sonarr, radarr, etc.) + instance_name: The name of the instance + + Returns: + Set[str]: Set of processed media IDs + """ + if app_type not in APP_TYPES: + stateful_logger.warning(f"Unknown app type: {app_type}") + return set() + + # Create safe filename from instance name + safe_instance_name = "".join([c if c.isalnum() else "_" for c in instance_name]) + + file_path = STATEFUL_DIR / app_type / f"{safe_instance_name}.json" + stateful_logger.debug(f"[get_processed_ids] Checking file: {file_path} for {app_type}/{instance_name}") # DEBUG LOG + + if not file_path.exists(): + stateful_logger.debug(f"[get_processed_ids] File not found: {file_path}") # DEBUG LOG + return set() + + try: + with open(file_path, 'r') as f: + data = json.load(f) + processed_ids_set = set(data.get("processed_ids", [])) # Convert list to set + stateful_logger.debug(f"[get_processed_ids] Read {len(processed_ids_set)} IDs from {file_path}: {processed_ids_set}") # DEBUG LOG + return processed_ids_set + except Exception as e: + stateful_logger.error(f"Error reading processed IDs for {instance_name} from {file_path}: {e}") # Updated log + return set() + +def add_processed_id(app_type: str, instance_name: str, media_id: str) -> bool: + """ + Add a media ID to the processed list for a specific app instance. + + Args: + app_type: The type of app (sonarr, radarr, etc.) + instance_name: The name of the instance + media_id: The ID of the processed media + + Returns: + bool: True if successful, False otherwise + """ + if app_type not in APP_TYPES: + stateful_logger.warning(f"Unknown app type: {app_type}") + return False + + # Create safe filename from instance name + safe_instance_name = "".join([c if c.isalnum() else "_" for c in instance_name]) + + file_path = STATEFUL_DIR / app_type / f"{safe_instance_name}.json" + + # Get existing processed IDs using the get function (which includes logging) + current_processed_ids_set = get_processed_ids(app_type, instance_name) + + # Convert set back to list for appending and saving + processed_ids_list = list(current_processed_ids_set) + + # Add the new ID if it's not already there + if media_id not in current_processed_ids_set: + processed_ids_list.append(media_id) + stateful_logger.debug(f"[add_processed_id] Adding ID {media_id} to list for {app_type}/{instance_name}") # DEBUG LOG + else: + stateful_logger.debug(f"[add_processed_id] ID {media_id} already in list for {app_type}/{instance_name}") # DEBUG LOG + # No need to write if the ID is already present + return True + + # Write the updated list back to the file + stateful_logger.debug(f"[add_processed_id] Writing {len(processed_ids_list)} IDs to {file_path}: {processed_ids_list}") # DEBUG LOG + try: + with open(file_path, 'w') as f: + json.dump({ + "processed_ids": processed_ids_list, + "last_updated": int(time.time()) + }, f, indent=2) + # Removed redundant log here, previous debug log is sufficient + return True + except Exception as e: + stateful_logger.error(f"Error adding media ID {media_id} to {file_path}: {e}") + return False + +def is_processed(app_type: str, instance_name: str, media_id: str) -> bool: + """ + Check if a media ID has already been processed. + + Args: + app_type: The type of app (sonarr, radarr, etc.) + instance_name: The name of the instance + media_id: The ID of the media to check + + Returns: + bool: True if already processed, False otherwise + """ + # Create safe filename for logging + safe_instance = "".join([c if c.isalnum() else "_" for c in instance_name]) + file_path = STATEFUL_DIR / app_type / f"{safe_instance}.json" + + # Get processed IDs for this app/instance + processed_ids = get_processed_ids(app_type, instance_name) + + # Log what we're checking and the result + # Converting media_id to string since some callers might pass an integer + media_id_str = str(media_id) + is_in_set = media_id_str in processed_ids + + stateful_logger.info(f"is_processed check: {app_type}/{instance_name}, ID:{media_id_str}, Found:{is_in_set}, File:{file_path}, Total IDs:{len(processed_ids)}") + + return is_in_set + +def get_stateful_management_info() -> Dict[str, Any]: + """Get information about the stateful management system.""" + lock_info = get_lock_info() + created_at_ts = lock_info.get("created_at") + expires_at_ts = lock_info.get("expires_at") + + # Get the interval setting + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + + return { + "created_at_ts": created_at_ts, + "expires_at_ts": expires_at_ts, + "interval_hours": expiration_hours + } + +def initialize_stateful_system(): + """Perform a complete initialization of the stateful management system.""" + stateful_logger.info("Initializing stateful management system") + + # Ensure all required directories exist + try: + STATEFUL_DIR.mkdir(parents=True, exist_ok=True) + for app_type in APP_TYPES: + (STATEFUL_DIR / app_type).mkdir(exist_ok=True) + stateful_logger.info(f"Stateful directory structure created at {STATEFUL_DIR}") + except Exception as e: + stateful_logger.error(f"Failed to create stateful directories: {e}") + + # Initialize the lock file with proper expiration + try: + initialize_lock_file() + # Update expiration time + expiration_hours = get_advanced_setting("stateful_management_hours", DEFAULT_HOURS) + update_lock_expiration(expiration_hours) + stateful_logger.info(f"Stateful lock file initialized with {expiration_hours} hour expiration") + except Exception as e: + stateful_logger.error(f"Failed to initialize lock file: {e}") + + # Check for existing processed IDs + try: + total_ids = 0 + for app_type in APP_TYPES: + app_dir = STATEFUL_DIR / app_type + if app_dir.exists(): + files = list(app_dir.glob("*.json")) + total_ids += len(files) + + if total_ids > 0: + stateful_logger.info(f"Found {total_ids} existing processed ID files") + else: + stateful_logger.info("No existing processed ID files found") + except Exception as e: + stateful_logger.error(f"Failed to check for existing processed IDs: {e}") + + stateful_logger.info("Stateful management system initialization complete") + +# Initialize the stateful system on module import +initialize_stateful_system() diff --git a/Huntarr.io-6.3.6/src/primary/stateful_routes.py b/Huntarr.io-6.3.6/src/primary/stateful_routes.py new file mode 100644 index 0000000..a652131 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/stateful_routes.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +""" +Stateful Management API Routes +Handles API endpoints for stateful management +""" + +from flask import Blueprint, jsonify, request, Response +import json +from src.primary.stateful_manager import ( + get_stateful_management_info, + reset_stateful_management, + update_lock_expiration +) +from src.primary.utils.logger import get_logger + +# Create logger +stateful_logger = get_logger("stateful") + +# Create blueprint +stateful_api = Blueprint('stateful_api', __name__) + +@stateful_api.route('/info', methods=['GET']) +def get_info(): + """Get stateful management information.""" + try: + info = get_stateful_management_info() + # Add CORS headers to allow access from frontend + response_data = { + "success": True, + "created_at_ts": info.get("created_at_ts"), + "expires_at_ts": info.get("expires_at_ts"), + "interval_hours": info.get("interval_hours") + } + response = Response(json.dumps(response_data)) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + except Exception as e: + stateful_logger.error(f"Error getting stateful info: {e}") + # Return error response with proper headers + error_data = {"success": False, "message": f"Error getting stateful info: {str(e)}"} + response = Response(json.dumps(error_data), status=500) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + +@stateful_api.route('/reset', methods=['POST']) +def reset_stateful(): + """Reset the stateful management system.""" + try: + success = reset_stateful_management() + if success: + # Add CORS headers to allow access from frontend + response = Response(json.dumps({"success": True, "message": "Stateful management reset successfully"})) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + else: + # Add CORS headers to allow access from frontend + response = Response(json.dumps({"success": False, "message": "Failed to reset stateful management"}), status=500) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + except Exception as e: + stateful_logger.error(f"Error resetting stateful management: {e}") + # Return error response with proper headers + error_data = {"error": str(e)} + response = Response(json.dumps(error_data), status=500) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + +@stateful_api.route('/update-expiration', methods=['POST']) +def update_expiration(): + """Update the stateful management expiration time.""" + try: + hours = request.json.get('hours') + if hours is None or not isinstance(hours, int) or hours <= 0: + stateful_logger.error(f"Invalid hours value for update-expiration: {hours}") + # Return error response with proper headers + error_data = {"success": False, "message": f"Invalid hours value: {hours}. Must be a positive integer."} + response = Response(json.dumps(error_data), status=400) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + + updated = update_lock_expiration(hours) + if updated: + # Get updated info + info = get_stateful_management_info() + # Add CORS headers to allow access from frontend + response_data = { + "success": True, + "message": f"Expiration updated to {hours} hours", + "expires_at": info.get("expires_at"), + "expires_date": info.get("expires_date") + } + response = Response(json.dumps(response_data)) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + else: + # Add CORS headers to allow access from frontend + response = Response(json.dumps({"success": False, "message": "Failed to update expiration"}), status=500) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response + except Exception as e: + stateful_logger.error(f"Error updating expiration: {e}", exc_info=True) + # Return error response with proper headers + error_data = {"success": False, "message": f"Error updating expiration: {str(e)}"} + response = Response(json.dumps(error_data), status=500) + response.headers['Content-Type'] = 'application/json' + response.headers['Access-Control-Allow-Origin'] = '*' + return response diff --git a/Huntarr.io-6.3.6/src/primary/stats_manager.py b/Huntarr.io-6.3.6/src/primary/stats_manager.py new file mode 100644 index 0000000..51aff12 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/stats_manager.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python3 +""" +Statistics Manager for Huntarr +Handles tracking, storing, and retrieving statistics about hunted and upgraded media +""" + +import os +import json +import time +import threading +from typing import Dict, Any, Optional +from src.primary.utils.logger import get_logger + +logger = get_logger("stats") + +# Path constants - Define multiple possible locations and check them in order +STATS_DIRS = [ + "/config/tally", # Docker default + os.path.join(os.path.expanduser("~"), ".huntarr/tally"), # User's home directory + os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "data/tally") # Relative to script +] + +# Lock for thread-safe operations +stats_lock = threading.Lock() + +def find_writable_stats_dir(): + """Find a writable directory for stats from the list of candidates""" + for dir_path in STATS_DIRS: + try: + os.makedirs(dir_path, exist_ok=True) + test_file = os.path.join(dir_path, "write_test") + with open(test_file, 'w') as f: + f.write("test") + os.remove(test_file) + logger.info(f"Using stats directory: {dir_path}") + return dir_path + except (IOError, OSError) as e: + logger.warning(f"Directory {dir_path} is not writable: {e}") + continue + + # Fallback to current directory + fallback_dir = os.path.join(os.getcwd(), "tally") + try: + os.makedirs(fallback_dir, exist_ok=True) + logger.info(f"Falling back to current directory for stats: {fallback_dir}") + return fallback_dir + except Exception as e: + logger.error(f"Failed to create fallback stats directory: {e}") + return None + +# Find the best stats directory +STATS_DIR = find_writable_stats_dir() +STATS_FILE = os.path.join(STATS_DIR, "media_stats.json") if STATS_DIR else None + +# Log the stats file location once at module load time +if STATS_FILE: + logger.info(f"===> Stats will be stored at: {STATS_FILE}") +else: + logger.error("===> CRITICAL: No stats file location could be determined!") + +def ensure_stats_dir(): + """Ensure the statistics directory exists""" + if not STATS_DIR: + logger.error("No writable stats directory found") + return False + + try: + os.makedirs(STATS_DIR, exist_ok=True) + logger.debug(f"Stats directory ensured: {STATS_DIR}") + return True + except Exception as e: + logger.error(f"Failed to create stats directory: {e}") + return False + +def load_stats() -> Dict[str, Dict[str, int]]: + """ + Load statistics from the stats file + + Returns: + Dictionary containing statistics for each app + """ + if not ensure_stats_dir() or not STATS_FILE: + logger.error("Cannot load stats - no valid stats directory available") + return get_default_stats() + + default_stats = get_default_stats() + + try: + if os.path.exists(STATS_FILE): + logger.debug(f"Loading stats from: {STATS_FILE}") + with open(STATS_FILE, 'r') as f: + stats = json.load(f) + + # Ensure all apps are in the stats + for app in default_stats: + if app not in stats: + stats[app] = default_stats[app] + + logger.debug(f"Loaded stats: {stats}") + return stats + else: + logger.info(f"Stats file not found at {STATS_FILE}, using default stats") + return default_stats + except Exception as e: + logger.error(f"Error loading stats from {STATS_FILE}: {e}") + return default_stats + +def get_default_stats() -> Dict[str, Dict[str, int]]: + """Get the default stats structure""" + return { + "sonarr": {"hunted": 0, "upgraded": 0}, + "radarr": {"hunted": 0, "upgraded": 0}, + "lidarr": {"hunted": 0, "upgraded": 0}, + "readarr": {"hunted": 0, "upgraded": 0}, + "whisparr": {"hunted": 0, "upgraded": 0}, + "eros": {"hunted": 0, "upgraded": 0}, + "swaparr": {"hunted": 0, "upgraded": 0} + } + +def save_stats(stats: Dict[str, Dict[str, int]]) -> bool: + """ + Save statistics to the stats file + + Args: + stats: Dictionary containing statistics for each app + + Returns: + True if successful, False otherwise + """ + if not ensure_stats_dir() or not STATS_FILE: + logger.error("Cannot save stats - no valid stats directory available") + return False + + try: + logger.debug(f"Saving stats to: {STATS_FILE}") + # First write to a temp file, then move it to avoid partial writes + temp_file = f"{STATS_FILE}.tmp" + with open(temp_file, 'w') as f: + json.dump(stats, f, indent=2) + f.flush() + os.fsync(f.fileno()) + + # Move the temp file to the actual file + os.replace(temp_file, STATS_FILE) + + logger.info(f"===> Successfully wrote stats to file: {STATS_FILE}") + logger.debug(f"Stats saved successfully: {stats}") + return True + except Exception as e: + logger.error(f"Error saving stats to {STATS_FILE}: {e}", exc_info=True) + return False + +def increment_stat(app_type: str, stat_type: str, count: int = 1) -> bool: + """ + Increment a specific statistic + + Args: + app_type: The application type (sonarr, radarr, etc.) + stat_type: The type of statistic (hunted or upgraded) + count: The amount to increment by (default: 1) + + Returns: + True if successful, False otherwise + """ + if app_type not in ["sonarr", "radarr", "lidarr", "readarr", "whisparr", "eros", "swaparr"]: + logger.error(f"Invalid app_type: {app_type}") + return False + + if stat_type not in ["hunted", "upgraded"]: + logger.error(f"Invalid stat_type: {stat_type}") + return False + + with stats_lock: + stats = load_stats() + prev_value = stats[app_type][stat_type] + stats[app_type][stat_type] += count + new_value = stats[app_type][stat_type] + logger.info(f"*** STATS INCREMENT *** {app_type} {stat_type} by {count}: {prev_value} -> {new_value}") + save_success = save_stats(stats) + + if not save_success: + logger.error(f"Failed to save stats after incrementing {app_type} {stat_type}") + return False + + # Add debug verification that stats were actually saved + verification_stats = load_stats() + if verification_stats[app_type][stat_type] != new_value: + logger.error(f"Stats verification failed! Expected {new_value} but got {verification_stats[app_type][stat_type]} for {app_type} {stat_type}") + return False + + logger.info(f"Successfully incremented and verified {app_type} {stat_type}") + return True + +def get_stats() -> Dict[str, Dict[str, int]]: + """ + Get the current statistics + + Returns: + Dictionary containing statistics for each app + """ + with stats_lock: + stats = load_stats() + logger.debug(f"Retrieved stats: {stats}") + return stats + +def reset_stats(app_type: Optional[str] = None) -> bool: + """ + Reset statistics for a specific app or all apps + + Args: + app_type: The application type to reset, or None to reset all + + Returns: + True if successful, False otherwise + """ + with stats_lock: + stats = load_stats() + + if app_type is None: + # Reset all stats + logger.info("Resetting all app statistics") + for app in stats: + stats[app]["hunted"] = 0 + stats[app]["upgraded"] = 0 + elif app_type in stats: + # Reset specific app stats + logger.info(f"Resetting statistics for {app_type}") + stats[app_type]["hunted"] = 0 + stats[app_type]["upgraded"] = 0 + else: + logger.error(f"Invalid app_type for reset: {app_type}") + return False + + return save_stats(stats) + +# Initialize stats file with find_writable_stats_dir already called during import +if STATS_DIR and not os.path.exists(STATS_FILE): + logger.info(f"Creating new stats file at: {STATS_FILE}") + save_stats(get_default_stats()) +else: + logger.debug(f"Stats system initialized. Using file: {STATS_FILE}") \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/utils/__init__.py b/Huntarr.io-6.3.6/src/primary/utils/__init__.py new file mode 100644 index 0000000..1ec4cca --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/__init__.py @@ -0,0 +1,7 @@ +""" +Utility functions for Huntarr +""" + +from src.primary.utils.logger import logger, debug_log + +__all__ = ['logger', 'debug_log'] \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/utils/app_utils.py b/Huntarr.io-6.3.6/src/primary/utils/app_utils.py new file mode 100644 index 0000000..3e29f6f --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/app_utils.py @@ -0,0 +1,24 @@ +import socket +from urllib.parse import urlparse +from src.primary.config import API_URL + +def get_ip_address(): + try: + parsed_url = urlparse(API_URL) + hostname = parsed_url.netloc + if ':' in hostname: + hostname = hostname.split(':')[0] + return hostname + except Exception: + try: + hostname = socket.gethostname() + ip = socket.gethostbyname(hostname) + return ip + except: + return "localhost" + +def write_log(log_file, message): + from datetime import datetime + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + with open(log_file, 'a') as f: + f.write(f"{timestamp} - {message}\n") diff --git a/Huntarr.io-6.3.6/src/primary/utils/history_utils.py b/Huntarr.io-6.3.6/src/primary/utils/history_utils.py new file mode 100644 index 0000000..c0bc4be --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/history_utils.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +from src.primary.history_manager import add_history_entry +from src.primary.utils.logger import get_logger + +logger = get_logger("history") + +def log_processed_media(app_type, media_name, media_id, instance_name, operation_type="missing"): + """ + Log when media is processed by an app instance + + Parameters: + - app_type: str - The app type (sonarr, radarr, etc) + - media_name: str - Name of the processed media + - media_id: str/int - ID of the processed media + - instance_name: str - Name of the instance that processed it + - operation_type: str - Type of operation ("missing" or "upgrade") + + Returns: + - bool - Success or failure + """ + try: + logger.debug(f"Logging history entry for {app_type} - {instance_name}: '{media_name}' (ID: {media_id})") + + entry_data = { + "name": media_name, + "id": str(media_id), + "instance_name": instance_name, + "operation_type": operation_type + } + + result = add_history_entry(app_type, entry_data) + if result: + logger.info(f"Logged history entry for {app_type} - {instance_name}: {media_name} ({operation_type})") + return True + else: + logger.error(f"Failed to log history entry for {app_type} - {instance_name}: {media_name}") + return False + except Exception as e: + logger.error(f"Error logging history entry: {str(e)}") + return False diff --git a/Huntarr.io-6.3.6/src/primary/utils/log_handler.py b/Huntarr.io-6.3.6/src/primary/utils/log_handler.py new file mode 100644 index 0000000..b6da47b --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/log_handler.py @@ -0,0 +1,37 @@ +import re +import logging + +class WebUrlFilter(logging.Filter): + """Filter out web URLs from log messages""" + + def filter(self, record): + if not hasattr(record, 'msg'): + return True + + if isinstance(record.msg, str): + # Filter out web interface messages + if "Web interface available at http://" in record.msg: + return False + + # Redact URLs if they need to appear in logs + record.msg = re.sub( + r'(http|https)://[^\s<>"]+', + '[REDACTED URL]', + record.msg + ) + + return True + +# Add this filter to the existing loggers +def apply_log_filters(): + """Apply web URL filters to all loggers""" + web_filter = WebUrlFilter() + + # Apply to root logger + for handler in logging.root.handlers: + handler.addFilter(web_filter) + + # Apply to huntarr logger + huntarr_logger = logging.getLogger('huntarr') + for handler in huntarr_logger.handlers: + handler.addFilter(web_filter) diff --git a/Huntarr.io-6.3.6/src/primary/utils/logger.py b/Huntarr.io-6.3.6/src/primary/utils/logger.py new file mode 100644 index 0000000..e680a6e --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/logger.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python3 +""" +Logging configuration for Huntarr +Supports separate log files for each application type +""" + +import logging +import sys +import os +import pathlib +from typing import Dict, Optional + +# Create log directory +LOG_DIR = pathlib.Path("/config/logs") # Changed path +LOG_DIR.mkdir(parents=True, exist_ok=True) + +# Default log file for general messages +MAIN_LOG_FILE = LOG_DIR / "huntarr.log" + +# App-specific log files +APP_LOG_FILES = { + "sonarr": LOG_DIR / "sonarr.log", # Updated filename + "radarr": LOG_DIR / "radarr.log", # Updated filename + "lidarr": LOG_DIR / "lidarr.log", # Updated filename + "readarr": LOG_DIR / "readarr.log", # Updated filename + "whisparr": LOG_DIR / "whisparr.log", # Added Whisparr + "eros": LOG_DIR / "eros.log", # Added Eros for Whisparr V3 + "swaparr": LOG_DIR / "swaparr.log" # Added Swaparr +} + +# Global logger instances +logger: Optional[logging.Logger] = None +app_loggers: Dict[str, logging.Logger] = {} + +def setup_main_logger(debug_mode=None): + """Set up the main Huntarr logger.""" + global logger + log_name = "huntarr" + log_file = MAIN_LOG_FILE + + # Determine debug mode safely + use_debug_mode = False + if debug_mode is None: + try: + # Use the get_debug_mode function to check general settings + from src.primary.config import get_debug_mode + use_debug_mode = get_debug_mode() + except (ImportError, AttributeError): + pass # Default to False + else: + use_debug_mode = debug_mode + + # Get or create the main logger instance + current_logger = logging.getLogger(log_name) + + # Reset handlers each time setup is called to avoid duplicates + # This is important if setup might be called again (e.g., config reload) + for handler in current_logger.handlers[:]: + current_logger.removeHandler(handler) + + current_logger.propagate = False # Prevent propagation to root logger + current_logger.setLevel(logging.DEBUG if use_debug_mode else logging.INFO) + + # Create console handler + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setLevel(logging.DEBUG if use_debug_mode else logging.INFO) + + # Create file handler + file_handler = logging.FileHandler(log_file) + file_handler.setLevel(logging.DEBUG if use_debug_mode else logging.INFO) + + # Set format for the main logger + log_format = "%(asctime)s - huntarr - %(levelname)s - %(message)s" + formatter = logging.Formatter(log_format, datefmt="%Y-%m-%d %H:%M:%S") + console_handler.setFormatter(formatter) + file_handler.setFormatter(formatter) + + # Add handlers to the main logger + current_logger.addHandler(console_handler) + current_logger.addHandler(file_handler) + + if use_debug_mode: + current_logger.debug("Debug logging enabled for main logger") + + logger = current_logger # Assign to the global variable + return current_logger + +def get_logger(app_type: str) -> logging.Logger: + """ + Get or create a logger for a specific app type. + + Args: + app_type: The app type (e.g., 'sonarr', 'radarr'). + + Returns: + A logger specific to the app type, or the main logger if app_type is invalid. + """ + if app_type not in APP_LOG_FILES: + # Fallback to main logger if the app type is not recognized + global logger + if logger is None: + # Ensure main logger is initialized if accessed before module-level setup + setup_main_logger() + # We checked logger is not None, so we can assert its type + assert logger is not None + return logger + + log_name = f"huntarr.{app_type}" + if log_name in app_loggers: + # Return cached logger instance + return app_loggers[log_name] + + # If not cached, set up a new logger for this app type + app_logger = logging.getLogger(log_name) + + # Prevent propagation to the main 'huntarr' logger or root logger + app_logger.propagate = False + + # Determine debug mode setting safely + try: + from src.primary.config import get_debug_mode + debug_mode = get_debug_mode() + except ImportError: + debug_mode = False + + app_logger.setLevel(logging.DEBUG if debug_mode else logging.INFO) + + # Reset handlers in case this logger existed before but wasn't cached + # (e.g., across restarts without clearing logging._handlers) + for handler in app_logger.handlers[:]: + app_logger.removeHandler(handler) + + # Create console handler + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setLevel(logging.DEBUG if debug_mode else logging.INFO) + + # Create file handler for the specific app log file + log_file = APP_LOG_FILES[app_type] + file_handler = logging.FileHandler(log_file) + file_handler.setLevel(logging.DEBUG if debug_mode else logging.INFO) + + # Set a distinct format for this app log + log_format = f"%(asctime)s - huntarr.{app_type} - %(levelname)s - %(message)s" + formatter = logging.Formatter(log_format, datefmt="%Y-%m-%d %H:%M:%S") + + console_handler.setFormatter(formatter) + file_handler.setFormatter(formatter) + + # Add the handlers specific to this app logger + app_logger.addHandler(console_handler) + app_logger.addHandler(file_handler) + + # Cache the configured logger + app_loggers[log_name] = app_logger + + if debug_mode: + app_logger.debug(f"Debug logging enabled for {app_type} logger") + + return app_logger + +def update_logging_levels(debug_mode=None): + """ + Update all logger levels based on the current debug mode setting. + Call this after settings are changed in the UI to apply changes immediately. + + Args: + debug_mode: Force a specific debug mode, or None to read from settings + """ + # Determine debug mode from settings if not specified + if debug_mode is None: + try: + from src.primary.config import get_debug_mode + debug_mode = get_debug_mode() + except (ImportError, AttributeError): + debug_mode = False + + # Set level for main logger + level = logging.DEBUG if debug_mode else logging.INFO + if logger: + logger.setLevel(level) + for handler in logger.handlers: + handler.setLevel(level) + + # Set level for all app loggers + for app_type, app_logger in app_loggers.items(): + app_logger.setLevel(level) + for handler in app_logger.handlers: + handler.setLevel(level) + + # Set root logger level too + root_logger = logging.getLogger() + root_logger.setLevel(level) + for handler in root_logger.handlers: + handler.setLevel(level) + + # Force Python's logging module to respect the log level for all existing loggers + for name, logger_instance in logging.Logger.manager.loggerDict.items(): + if isinstance(logger_instance, logging.Logger): + logger_instance.setLevel(level) + + return debug_mode + +def debug_log(message: str, data: object = None, app_type: Optional[str] = None) -> None: + """ + Log debug messages with optional data. + + Args: + message: The message to log. + data: Optional data to include with the message. + app_type: Optional app type to log to a specific app's log file. + """ + current_logger = get_logger(app_type) if app_type else logger + + if current_logger.level <= logging.DEBUG: + current_logger.debug(f"{message}") + if data is not None: + try: + import json + as_json = json.dumps(data) + if len(as_json) > 500: + as_json = as_json[:500] + "..." + current_logger.debug(as_json) + except: + data_str = str(data) + if len(data_str) > 500: + data_str = data_str[:500] + "..." + current_logger.debug(data_str) + +# Initialize the main logger instance when the module is imported +logger = setup_main_logger() \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/utils/logging_config.py b/Huntarr.io-6.3.6/src/primary/utils/logging_config.py new file mode 100644 index 0000000..e6b388c --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/logging_config.py @@ -0,0 +1,33 @@ +import logging + +class SensitiveInfoFilter(logging.Filter): + """Filter out sensitive information from logs""" + def filter(self, record): + message = record.getMessage() + # Filter out web interface URLs + if "Web interface available at http://" in message: + return False + # Add more filters as needed + return True + +def configure_logging(level=logging.INFO): + """Configure logging with filters for sensitive information""" + # Basic config + logging.basicConfig( + level=level, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%Y-%m-%d %H:%M:%S' + ) + + # Add the filter to all handlers + for handler in logging.root.handlers: + handler.addFilter(SensitiveInfoFilter()) + + # Individual loggers can also be configured here + logger = logging.getLogger('huntarr') + logger.setLevel(level) + + for handler in logger.handlers: + handler.addFilter(SensitiveInfoFilter()) + + return logger diff --git a/Huntarr.io-6.3.6/src/primary/utils/migrate_settings.py b/Huntarr.io-6.3.6/src/primary/utils/migrate_settings.py new file mode 100644 index 0000000..5afb3fd --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/utils/migrate_settings.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +""" +Settings migration utility for Huntarr +Migrates settings from nested structure to flat structure +""" + +import os +import json +import pathlib +import logging + +# Create logger +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("settings_migration") + +# Settings file path +SETTINGS_DIR = pathlib.Path("/config") +SETTINGS_FILE = SETTINGS_DIR / "huntarr.json" + +def migrate_settings(): + """Migrate settings from nested to flat structure""" + logger.info("Starting settings migration...") + + if not SETTINGS_FILE.exists(): + logger.info(f"Settings file {SETTINGS_FILE} does not exist, nothing to migrate.") + return + + try: + # Read current settings + with open(SETTINGS_FILE, "r", encoding="utf-8") as file: + settings = json.load(file) + + # Flag to track if changes were made + changes_made = False + + # Check and migrate each app's settings + for app in ["sonarr", "radarr", "lidarr", "readarr"]: + if app in settings and "huntarr" in settings[app]: + logger.info(f"Found nested huntarr section in {app}, migrating...") + + # Move all settings from app.huntarr to app level + for key, value in settings[app]["huntarr"].items(): + if key not in settings[app]: + settings[app][key] = value + logger.info(f"Moved {app}.huntarr.{key} to {app}.{key}") + + # Remove the huntarr section + del settings[app]["huntarr"] + logger.info(f"Removed {app}.huntarr section") + changes_made = True + + # Check for advanced section + if app in settings and "advanced" in settings[app]: + logger.info(f"Found advanced section in {app}, migrating...") + + # Move all settings from app.advanced to app level + for key, value in settings[app]["advanced"].items(): + if key not in settings[app]: + settings[app][key] = value + logger.info(f"Moved {app}.advanced.{key} to {app}.{key}") + + # Remove the advanced section + del settings[app]["advanced"] + logger.info(f"Removed {app}.advanced section") + changes_made = True + + # Save changes if needed + if changes_made: + with open(SETTINGS_FILE, "w", encoding="utf-8") as file: + json.dump(settings, file, indent=2) + logger.info("Settings migration completed successfully.") + else: + logger.info("No changes needed, settings are already in the correct format.") + + except Exception as e: + logger.error(f"Error migrating settings: {e}") + +if __name__ == "__main__": + migrate_settings() diff --git a/Huntarr.io-6.3.6/src/primary/web_server.py b/Huntarr.io-6.3.6/src/primary/web_server.py new file mode 100644 index 0000000..5181ccf --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/web_server.py @@ -0,0 +1,887 @@ +#!/usr/bin/env python3 +""" +Web server for Huntarr +Provides a web interface to view logs in real-time, manage settings, and includes authentication +""" + +import os +import datetime +import time +from threading import Lock +from primary.utils.logger import LOG_DIR, APP_LOG_FILES, MAIN_LOG_FILE # Import log constants +from primary import settings_manager # Import settings_manager +from src.primary.stateful_manager import update_lock_expiration # Import stateful update function + +# import socket # No longer used +import json +# import signal # No longer used for reload +import sys +import qrcode +import pyotp +import base64 +import io +# import requests # No longer used +import logging +import threading +import importlib # Added import +from flask import Flask, render_template, request, jsonify, Response, send_from_directory, redirect, url_for, session, stream_with_context # Added stream_with_context +# from src.primary.config import API_URL # No longer needed directly +# Use only settings_manager +from src.primary import settings_manager +from src.primary.utils.logger import setup_main_logger, get_logger, LOG_DIR, update_logging_levels # Import get_logger, LOG_DIR, and update_logging_levels +from src.primary.auth import ( + authenticate_request, user_exists, create_user, verify_user, create_session, + logout, SESSION_COOKIE_NAME, is_2fa_enabled, generate_2fa_secret, + verify_2fa_code, disable_2fa, change_username, change_password +) +# Import blueprint for common routes +from src.primary.routes.common import common_bp + +# Import blueprints for each app from the centralized blueprints module +from src.primary.apps.blueprints import sonarr_bp, radarr_bp, lidarr_bp, readarr_bp, whisparr_bp, swaparr_bp, eros_bp + +# Import stateful blueprint +from src.primary.stateful_routes import stateful_api + +# Import history blueprint +from src.primary.routes.history_routes import history_blueprint + +# Import background module to trigger manual cycle resets +from src.primary import background + +# Disable Flask default logging +log = logging.getLogger('werkzeug') +log.setLevel(logging.DEBUG) # Change to DEBUG to see all Flask/Werkzeug logs + +# Configure template and static paths with proper PyInstaller support +# Check if we're running from a PyInstaller bundle +print("==== HUNTARR TEMPLATE DEBUG ====") +print(f"__file__: {__file__}") +print(f"sys.executable: {sys.executable}") +print(f"os.getcwd(): {os.getcwd()}") +print(f"sys.path: {sys.path}") +print(f"Is frozen: {getattr(sys, 'frozen', False)}") + +if getattr(sys, 'frozen', False): + # We're running from the bundled package + bundle_dir = os.path.dirname(sys.executable) + # Override the template and static directories + template_dir = os.path.join(bundle_dir, 'templates') + static_dir = os.path.join(bundle_dir, 'static') + print(f"PyInstaller mode - Using templates dir: {template_dir}") + print(f"PyInstaller mode - Using static dir: {static_dir}") + print(f"Template dir exists: {os.path.exists(template_dir)}") + if os.path.exists(template_dir): + print(f"Template dir contents: {os.listdir(template_dir)}") +else: + # Normal development mode - use relative paths + template_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'frontend', 'templates')) + static_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', 'frontend', 'static')) + print(f"Normal mode - Using templates dir: {template_dir}") + print(f"Normal mode - Using static dir: {static_dir}") + print(f"Template dir exists: {os.path.exists(template_dir)}") + if os.path.exists(template_dir): + print(f"Template dir contents: {os.listdir(template_dir)}") + +# Create Flask app with additional debug logging +app = Flask(__name__, template_folder=template_dir, static_folder=static_dir) +print(f"Flask app created with template_folder: {app.template_folder}") +print(f"Flask app created with static_folder: {app.static_folder}") + +# Add debug logging for template rendering +def debug_template_rendering(): + """Additional logging for Flask template rendering""" + app.jinja_env.auto_reload = True + orig_get_source = app.jinja_env.loader.get_source + + def get_source_wrapper(environment, template): + try: + result = orig_get_source(environment, template) + print(f"Template loaded successfully: {template}") + return result + except Exception as e: + print(f"Error loading template {template}: {e}") + print(f"Loader search paths: {environment.loader.searchpath}") + # Print all available templates + try: + all_templates = environment.loader.list_templates() + print(f"Available templates: {all_templates}") + except: + print("Could not list available templates") + raise + + app.jinja_env.loader.get_source = get_source_wrapper + +debug_template_rendering() + +app.secret_key = os.environ.get('SECRET_KEY', 'dev_key_for_sessions') + +# Register blueprints +app.register_blueprint(common_bp) +app.register_blueprint(sonarr_bp, url_prefix='/api/sonarr') +app.register_blueprint(radarr_bp, url_prefix='/api/radarr') +app.register_blueprint(lidarr_bp, url_prefix='/api/lidarr') +app.register_blueprint(readarr_bp, url_prefix='/api/readarr') +app.register_blueprint(whisparr_bp, url_prefix='/api/whisparr') +app.register_blueprint(eros_bp, url_prefix='/api/eros') +app.register_blueprint(swaparr_bp, url_prefix='/api/swaparr') +app.register_blueprint(stateful_api, url_prefix='/api/stateful') +app.register_blueprint(history_blueprint, url_prefix='/api/history') + +# Register the authentication check to run before requests +app.before_request(authenticate_request) + +# Removed MAIN_PID and signal-related code + +# Lock for accessing the log files +log_lock = Lock() + +# Define known log files based on logger config +KNOWN_LOG_FILES = { + "sonarr": APP_LOG_FILES.get("sonarr"), + "radarr": APP_LOG_FILES.get("radarr"), + "lidarr": APP_LOG_FILES.get("lidarr"), + "readarr": APP_LOG_FILES.get("readarr"), + "whisparr": APP_LOG_FILES.get("whisparr"), + "eros": APP_LOG_FILES.get("eros"), # Added Eros to known log files + "swaparr": APP_LOG_FILES.get("swaparr"), # Added Swaparr to known log files + "system": MAIN_LOG_FILE, # Map 'system' to the main huntarr log +} +# Filter out None values if an app log file doesn't exist +KNOWN_LOG_FILES = {k: v for k, v in KNOWN_LOG_FILES.items() if v} + +ALL_APP_LOG_FILES = list(KNOWN_LOG_FILES.values()) # List of all individual log file paths + +@app.route('/') +def home(): + return render_template('index.html') + +@app.route('/user') +def user(): + # User account screen + return render_template('user.html') + +# Removed /settings and /logs routes if handled by index.html and JS routing +# Keep /logs if it's the actual SSE endpoint + +@app.route('/logs') +def logs_stream(): + """ + Event stream for logs. + Filter logs by app type using the 'app' query parameter. + Supports 'all', 'system', 'sonarr', 'radarr', 'lidarr', 'readarr'. + Example: /logs?app=sonarr + """ + app_type = request.args.get('app', 'all') # Default to 'all' if no app specified + web_logger = get_logger("web_server") + + valid_app_types = list(KNOWN_LOG_FILES.keys()) + ['all'] + if app_type not in valid_app_types: + web_logger.warning(f"Invalid app type '{app_type}' requested for logs. Defaulting to 'all'.") + app_type = 'all' + + # Import needed modules + import time + from pathlib import Path + import threading + import datetime # Added datetime import + import time # Add time module import + + # Use a client identifier to track connections + # Use request.remote_addr directly for client_id + client_id = request.remote_addr + current_time_str = datetime.datetime.now().strftime("%H:%M:%S") # Renamed variable + + web_logger.info(f"Starting log stream for app type: {app_type} (client: {client_id}, time: {current_time_str})") + + # Track active connections to limit resource usage + if not hasattr(app, 'active_log_streams'): + app.active_log_streams = {} + app.log_stream_lock = threading.Lock() + + # Clean up stale connections (older than 60 seconds without activity) + with app.log_stream_lock: + current_time = time.time() + stale_clients = [c for c, t in app.active_log_streams.items() + if current_time - t > 60] + for client in stale_clients: + # Check if client exists before popping, avoid KeyError + if client in app.active_log_streams: + app.active_log_streams.pop(client) + web_logger.debug(f"Removed stale log stream connection for client: {client}") + + # If too many connections, return an error for new ones + # Increased limit slightly and check before adding the new client + MAX_LOG_CONNECTIONS = 10 # Define as constant + if len(app.active_log_streams) >= MAX_LOG_CONNECTIONS: + web_logger.warning(f"Too many log stream connections ({len(app.active_log_streams)}). Rejecting new connection from {client_id}") + # Send SSE formatted error message + return Response("event: error\ndata: Too many active connections. Please try again later.\n\n", + mimetype='text/event-stream', status=429) # Use 429 status code + + # Add/Update this client's timestamp *after* checking the limit + app.active_log_streams[client_id] = current_time + web_logger.debug(f"Active log streams: {len(app.active_log_streams)} clients. Added/Updated: {client_id}") + + + def generate(): + """Generate log events for the SSE stream.""" + client_ip = request.remote_addr + web_logger.info(f"Log stream generator started for {app_type} (Client: {client_ip})") + try: + # Initialize last activity time + last_activity = time.time() + + # Determine which log files to follow + log_files_to_follow = [] + if app_type == 'all': + # Follow all log files for 'all' type + log_files_to_follow = list(KNOWN_LOG_FILES.items()) + web_logger.debug(f"Following all log files for 'all' type") + elif app_type == 'system': + # For system, only follow main log + system_log = KNOWN_LOG_FILES.get('system') + if system_log: + log_files_to_follow = [('system', system_log)] + web_logger.debug(f"Following system log: {system_log}") + else: + # For specific app, follow that app's log + app_log = KNOWN_LOG_FILES.get(app_type) + if app_log: + log_files_to_follow = [(app_type, app_log)] + web_logger.debug(f"Following {app_type} log: {app_log}") + + # Also include system log for related messages + system_log = KNOWN_LOG_FILES.get('system') + if system_log: + log_files_to_follow.append(('system', system_log)) + web_logger.debug(f"Also following system log for {app_type} messages") + + if not log_files_to_follow: + web_logger.warning(f"No log files found for app type: {app_type}") + yield f"data: No logs available for {app_type}\n\n" + return + + # Send confirmation + yield f"data: Starting log stream for {app_type}...\n\n" + web_logger.debug(f"Sent confirmation for {app_type} (Client: {client_ip})") + + # Track file positions + positions = {} + last_check = {} + keep_alive_counter = 0 + + # Convert to Path objects + log_files_to_follow = [(name, Path(path) if isinstance(path, str) else path) + for name, path in log_files_to_follow if path] + + # Main streaming loop + while True: + had_content = False + current_time = time.time() + + # Update client activity + if current_time - last_activity > 10: + with app.log_stream_lock: + if client_id in app.active_log_streams: + app.active_log_streams[client_id] = current_time + else: + web_logger.warning(f"Client {client_id} gone. Stopping generator.") + break + last_activity = current_time + + keep_alive_counter += 1 + + # Check each file + for name, path in log_files_to_follow: + try: + # Limit check frequency + now = datetime.datetime.now() + if name in last_check and (now - last_check[name]).total_seconds() < 0.2: + continue + + last_check[name] = now + + # Check file exists + if not path.exists(): + if positions.get(name) != -1: + web_logger.warning(f"Log file {path} not found. Skipping.") + positions[name] = -1 + continue + elif positions.get(name) == -1: + web_logger.info(f"Log file {path} found again. Resuming.") + positions.pop(name, None) + + # Get size + try: + current_size = path.stat().st_size + except FileNotFoundError: + web_logger.warning(f"Log file {path} disappeared. Skipping.") + positions[name] = -1 + continue + + # Init position or handle truncation + if name not in positions or current_size < positions.get(name, 0): + start_pos = max(0, current_size - 5120) + web_logger.debug(f"Init position for {name}: {start_pos}") + positions[name] = start_pos + + # Read content + try: + with open(path, 'r', encoding='utf-8', errors='ignore') as f: + f.seek(positions[name]) + new_lines = [] + lines_read = 0 + max_lines = 100 + + while lines_read < max_lines: + line = f.readline() + if not line: + break + + # Only filter when reading system log for specific app tab + if app_type != 'all' and app_type != 'system' and name == 'system': + # MODIFIED: Don't include system logs in app tabs at all + include_line = False + else: + include_line = True + + if include_line: + new_lines.append(line) + + lines_read += 1 + + # Process collected lines + if new_lines: + had_content = True + positions[name] = f.tell() + for line in new_lines: + stripped = line.strip() + if stripped: + prefix = f"[{name.upper()}] " if app_type == 'all' else "" + yield f"data: {prefix}{stripped}\n\n" + + except FileNotFoundError: + web_logger.warning(f"Log file {path} disappeared during read.") + positions[name] = -1 + except Exception as e: + web_logger.error(f"Error reading {path}: {e}") + yield f"data: ERROR: Problem reading log: {str(e)}\n\n" + + except Exception as e: + web_logger.error(f"Error processing {name}: {e}") + yield f"data: ERROR: Unexpected issue with log.\n\n" + + # Keep-alive or sleep + if not had_content: + if keep_alive_counter >= 75: + yield f": keepalive {time.time()}\n\n" + keep_alive_counter = 0 + time.sleep(0.2) + else: + keep_alive_counter = 0 + time.sleep(0.05) + + except GeneratorExit: + # Clean up when client disconnects + web_logger.info(f"Client {client_id} disconnected from log stream for {app_type}. Cleaning up.") + except Exception as e: + web_logger.error(f"Unhandled error in log stream generator for {app_type} (Client: {client_ip}): {e}", exc_info=True) + try: + # Ensure error message is properly formatted for SSE + yield f"event: error\ndata: ERROR: Log streaming failed unexpectedly: {str(e)}\n\n" + except Exception as yield_err: + web_logger.error(f"Error yielding final error message to client {client_id}: {yield_err}") + finally: + # Ensure cleanup happens regardless of how the generator exits + with app.log_stream_lock: + removed_client = app.active_log_streams.pop(client_id, None) + if removed_client: + web_logger.info(f"Successfully removed client {client_id} from active log streams.") + else: + web_logger.warning(f"Client {client_id} was already removed from active log streams before finally block.") + web_logger.info(f"Log stream generator finished for {app_type} (Client: {client_id})") + + # Return the SSE response with appropriate headers for better streaming + response = Response(stream_with_context(generate()), mimetype='text/event-stream') # Use stream_with_context + response.headers['Cache-Control'] = 'no-cache' + response.headers['X-Accel-Buffering'] = 'no' # Disable nginx buffering if using nginx + return response + +@app.route('/api/settings', methods=['GET']) +def api_settings(): + if request.method == 'GET': + # Return all settings using the new manager function + all_settings = settings_manager.get_all_settings() # Corrected function name + return jsonify(all_settings) + +@app.route('/api/settings/general', methods=['POST']) +def save_general_settings(): + general_logger = get_logger("web_server") + general_logger.info("Received request to save general settings.") + + # Make sure we have data + if not request.is_json: + return jsonify({"success": False, "error": "Expected JSON data"}), 400 + + data = request.json + + # Save general settings + success = settings_manager.save_settings('general', data) + + if success: + # Update expiration timing from general settings if applicable + try: + new_hours = int(data.get('stateful_management_hours')) + if new_hours > 0: + general_logger.info(f"Updating stateful expiration to {new_hours} hours.") + update_lock_expiration(hours=new_hours) + except (ValueError, TypeError, KeyError): + # Don't update if the value wasn't provided or is invalid + pass + except Exception as e: + general_logger.error(f"Error updating expiration timing: {e}") + + # Update logging levels immediately when general settings are changed + update_logging_levels() + + # Return all settings + return jsonify(settings_manager.get_all_settings()) + else: + return jsonify({"success": False, "error": "Failed to save general settings"}), 500 + +@app.route('/api/settings/', methods=['GET', 'POST']) +def handle_app_settings(app_name): + web_logger = get_logger("web_server") + + # Validate app_name + if app_name not in settings_manager.KNOWN_APP_TYPES: + return jsonify({"success": False, "error": f"Unknown application type: {app_name}"}), 400 + + if request.method == 'GET': + # Return settings for the specific app + app_settings = settings_manager.load_settings(app_name) + return jsonify(app_settings) + + elif request.method == 'POST': + # Make sure we have data + if not request.is_json: + return jsonify({"success": False, "error": "Expected JSON data"}), 400 + + data = request.json + web_logger.debug(f"Received {app_name} settings save request: {data}") + + # Save the app settings + success = settings_manager.save_settings(app_name, data) + + if success: + web_logger.info(f"Successfully saved {app_name} settings") + return jsonify({"success": True}) + else: + web_logger.error(f"Failed to save {app_name} settings") + return jsonify({"success": False, "error": f"Failed to save {app_name} settings"}), 500 + +@app.route('/api/settings/theme', methods=['GET', 'POST']) +def api_theme(): + # Theme settings are handled separately, potentially in /config/ui.json + if request.method == 'GET': + dark_mode = settings_manager.get_setting("ui", "dark_mode", False) + return jsonify({"dark_mode": dark_mode}) + elif request.method == 'POST': + data = request.json + dark_mode = data.get('dark_mode', False) + success = settings_manager.update_setting("ui", "dark_mode", dark_mode) + return jsonify({"success": success}) + +@app.route('/api/settings/reset', methods=['POST']) +def api_reset_settings(): + data = request.json + app_name = data.get('app') + web_logger = get_logger("web_server") + + if not app_name or app_name not in settings_manager.KNOWN_APP_TYPES: # Corrected attribute name + return jsonify({"success": False, "error": f"Invalid or missing app name: {app_name}"}), 400 + + web_logger.info(f"Resetting settings for {app_name} to defaults.") + # Load default settings for the app + default_settings = settings_manager.load_default_app_settings(app_name) + + if not default_settings: + return jsonify({"success": False, "error": f"Could not load default settings for {app_name}"}), 500 + + # Save the default settings, overwriting the current ones + success = settings_manager.save_settings(app_name, default_settings) # Corrected function name + + if success: + # Return the full updated config after reset + all_settings = settings_manager.get_all_settings() # Corrected function name + return jsonify(all_settings) + else: + return jsonify({"success": False, "error": f"Failed to save reset settings for {app_name}"}), 500 + +@app.route('/api/app-settings', methods=['GET']) +def api_app_settings(): + app_type = request.args.get('app') + if not app_type or app_type not in settings_manager.KNOWN_APP_TYPES: # Corrected attribute name + return jsonify({"success": False, "error": f"Invalid or missing app type: {app_type}"}), 400 + + # Get API credentials using the updated settings_manager function + # api_details = settings_manager.get_api_details(app_type) # Function does not exist + api_url = settings_manager.get_api_url(app_type) + api_key = settings_manager.get_api_key(app_type) + api_details = {"api_url": api_url, "api_key": api_key} + return jsonify({"success": True, **api_details}) + +@app.route('/api/configured-apps', methods=['GET']) +def api_configured_apps(): + # Return the configured status of all apps using the updated settings_manager function + configured_apps_list = settings_manager.get_configured_apps() # Corrected function name + # Convert list to dict format expected by frontend + configured_status = {app: (app in configured_apps_list) for app in settings_manager.KNOWN_APP_TYPES} + return jsonify(configured_status) + +# --- Add Status Endpoint --- # +@app.route('/api/status/', methods=['GET']) +def api_app_status(app_name): + """Check connection status for a specific app.""" + web_logger = get_logger("web_server") + response_data = {"configured": False, "connected": False} # Default for non-Sonarr apps + status_code = 200 + + # First validate the app name + if app_name not in settings_manager.KNOWN_APP_TYPES: + web_logger.warning(f"Status check requested for invalid app name: {app_name}") + return jsonify({"configured": False, "connected": False, "error": "Invalid app name"}), 400 + + try: + if app_name in ['sonarr', 'radarr', 'lidarr', 'readarr', 'whisparr', 'eros']: + # --- Multi-Instance Status Check --- # + connected_count = 0 + total_configured = 0 + try: + # Import app specific functions + module_name = f'src.primary.apps.{app_name}' + instances_module = importlib.import_module(module_name) + api_module = importlib.import_module(f'{module_name}.api') + + if hasattr(instances_module, 'get_configured_instances'): + get_instances_func = getattr(instances_module, 'get_configured_instances') + instances = get_instances_func() + total_configured = len(instances) + api_timeout = settings_manager.get_setting(app_name, "api_timeout", 10) # Get global timeout + + if total_configured > 0: + web_logger.debug(f"Checking connection for {total_configured} {app_name.capitalize()} instances...") + if hasattr(api_module, 'check_connection'): + check_connection_func = getattr(api_module, 'check_connection') + for instance in instances: + inst_url = instance.get("api_url") + inst_key = instance.get("api_key") + inst_name = instance.get("instance_name", "Default") + try: + # Use a short timeout per instance check + if check_connection_func(inst_url, inst_key, min(api_timeout, 5)): + web_logger.debug(f"{app_name.capitalize()} instance '{inst_name}' connected successfully.") + connected_count += 1 + else: + web_logger.debug(f"{app_name.capitalize()} instance '{inst_name}' connection check failed.") + except Exception as e: + web_logger.error(f"Error checking connection for {app_name.capitalize()} instance '{inst_name}': {str(e)}") + else: + web_logger.warning(f"check_connection function not found in {app_name} API module") + else: + web_logger.debug(f"No configured {app_name.capitalize()} instances found for status check.") + + # Prepare multi-instance response + response_data = {"total_configured": total_configured, "connected_count": connected_count} + else: + web_logger.warning(f"get_configured_instances function not found in {app_name} module") + # Fall back to legacy status check + api_url = settings_manager.get_api_url(app_name) + api_key = settings_manager.get_api_key(app_name) + is_configured = bool(api_url and api_key) + is_connected = False + if is_configured and hasattr(api_module, 'check_connection'): + check_connection_func = getattr(api_module, 'check_connection') + is_connected = check_connection_func(api_url, api_key, min(api_timeout, 5)) + response_data = {"total_configured": 1 if is_configured else 0, "connected_count": 1 if is_connected else 0} + + except ImportError as e: + web_logger.error(f"Failed to import {app_name} modules for status check: {e}") + response_data = {"total_configured": 0, "connected_count": 0, "error": "Import Error"} + status_code = 500 + except Exception as e: + web_logger.error(f"Error during {app_name} multi-instance status check: {e}", exc_info=True) + response_data = {"total_configured": total_configured, "connected_count": connected_count, "error": "Check Error"} + status_code = 500 + + else: + # --- Legacy/Single Instance Status Check (for other apps) --- # + api_url = settings_manager.get_api_url(app_name) + api_key = settings_manager.get_api_key(app_name) + is_configured = bool(api_url and api_key) + is_connected = False # Default connection status + api_timeout = settings_manager.get_setting(app_name, "api_timeout", 10) + + if is_configured: + try: + module_path = f'src.primary.apps.{app_name}.api' + api_module = importlib.import_module(module_path) + + if hasattr(api_module, 'check_connection'): + check_connection_func = getattr(api_module, 'check_connection') + # Use a short timeout to prevent long waits + is_connected = check_connection_func(api_url, api_key, min(api_timeout, 5)) + else: + web_logger.warning(f"check_connection function not found in {module_path}") + except ImportError: + web_logger.error(f"Could not import API module for {app_name}") + is_connected = False # Ensure connection is false on import error + except Exception as e: + web_logger.error(f"Error checking connection for {app_name}: {str(e)}") + is_connected = False # Ensure connection is false on check error + + # Prepare legacy response format + response_data = {"configured": is_configured, "connected": is_connected} + + return jsonify(response_data), status_code + + except Exception as e: + web_logger.error(f"Unexpected error in status check for {app_name}: {str(e)}", exc_info=True) + # Return a valid response even on error to prevent UI issues + return jsonify({"configured": False, "connected": False, "error": "Internal error"}), 200 + +# --- Add Hunt Control Endpoints --- # +# These might need adjustment depending on how start/stop is managed now +# If main.py handles threads based on config, these might not be needed, +# or they could modify a global 'enabled' setting per app. +# For now, keep them simple placeholders. + +@app.route('/api/hunt/start', methods=['POST']) +def api_start_hunt(): + # Placeholder: In the new model, threads start based on config. + # This might enable all configured apps or toggle a global flag. + # Or it could modify an 'enabled' setting per app. + # settings_manager.update_setting('global', 'hunt_enabled', True) + return jsonify({"success": True, "message": "Hunt control endpoint (start) - functionality may change."}) + +@app.route('/api/hunt/stop', methods=['POST']) +def api_stop_hunt(): + # Placeholder: Signal main thread to stop? + # Or disable all apps? + # settings_manager.update_setting('global', 'hunt_enabled', False) + # Or send SIGTERM/SIGINT to the main process? + # pid = get_main_process_pid() # Need a way to get PID if not self + # if pid: os.kill(pid, signal.SIGTERM) + return jsonify({"success": True, "message": "Hunt control endpoint (stop) - functionality may change."}) + +@app.route('/api/settings/apply-timezone', methods=['POST']) +def apply_timezone_setting(): + """Apply timezone setting to the container.""" + # This functionality has been disabled as per user request + return jsonify({ + "success": False, + "message": "Timezone settings have been disabled. This feature may be available in future updates." + }) + + # Original implementation commented out + ''' + data = request.json + timezone = data.get('timezone') + web_logger = get_logger("web_server") + + if not timezone: + return jsonify({"success": False, "error": "No timezone specified"}), 400 + + web_logger.info(f"Applying timezone setting: {timezone}") + + # Save the timezone to general settings + general_settings = settings_manager.load_settings("general") + general_settings["timezone"] = timezone + settings_manager.save_settings("general", general_settings) + + # Apply the timezone to the container + success = settings_manager.apply_timezone(timezone) + + if success: + return jsonify({"success": True, "message": f"Timezone set to {timezone}. Container restart may be required for full effect."}) + else: + return jsonify({"success": False, "error": f"Failed to apply timezone {timezone}"}), 500 + ''' + +@app.route('/api/stats', methods=['GET']) +def api_get_stats(): + """Get the media statistics for all apps""" + try: + # Import the stats manager to get actual stats + from src.primary.stats_manager import get_stats + + # Get real stats from the stats file + stats = get_stats() + + web_logger = get_logger("web_server") + web_logger.info(f"Serving actual stats from file: {stats}") + + return jsonify({"success": True, "stats": stats}) + except Exception as e: + web_logger = get_logger("web_server") + web_logger.error(f"Error fetching statistics: {str(e)}") + return jsonify({"success": False, "error": str(e)}), 500 + +@app.route('/api/stats/reset', methods=['POST']) +def api_reset_stats(): + """Reset the media statistics for all apps or a specific app""" + try: + data = request.json or {} + app_type = data.get('app_type') + + # Get logger for logging the reset action + web_logger = get_logger("web_server") + + # Import the reset_stats function + from src.primary.stats_manager import reset_stats + + if app_type: + web_logger.info(f"Resetting statistics for app: {app_type}") + reset_success = reset_stats(app_type) + else: + web_logger.info("Resetting all media statistics") + reset_success = reset_stats(None) + + if reset_success: + return jsonify({"success": True, "message": "Statistics reset successfully"}) + else: + return jsonify({"success": False, "error": "Failed to reset statistics"}), 500 + + except Exception as e: + web_logger = get_logger("web_server") + web_logger.error(f"Error resetting statistics: {str(e)}") + return jsonify({"success": False, "error": str(e)}), 500 + +@app.route('/api/stats/reset_public', methods=['POST']) +def api_reset_stats_public(): + """Reset the media statistics for all apps or a specific app - public endpoint without auth""" + try: + data = request.json or {} + app_type = data.get('app_type') + + # Get logger for logging the reset action + web_logger = get_logger("web_server") + + # Import the reset_stats function + from src.primary.stats_manager import reset_stats + + if app_type: + web_logger.info(f"Resetting statistics for app (public): {app_type}") + reset_success = reset_stats(app_type) + else: + web_logger.info("Resetting all media statistics (public)") + reset_success = reset_stats(None) + + if reset_success: + return jsonify({"success": True, "message": "Statistics reset successfully"}), 200 + else: + return jsonify({"success": False, "error": "Failed to reset statistics"}), 500 + + except Exception as e: + web_logger = get_logger("web_server") + web_logger.error(f"Error resetting statistics (public): {str(e)}") + return jsonify({"success": False, "error": str(e)}), 500 + +@app.route('/version.txt') +def version_txt(): + """Serve version.txt file directly""" + try: + # Use a simpler, more direct approach to read the version + version_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'version.txt') + if os.path.exists(version_path): + with open(version_path, 'r') as f: + version = f.read().strip() + return version, 200, {'Content-Type': 'text/plain', 'Cache-Control': 'no-cache'} + else: + # If file doesn't exist, log warning and return default version + web_logger = get_logger("web_server") + web_logger.warning(f"version.txt not found at {version_path}, returning default version") + return "5.3.1", 200, {'Content-Type': 'text/plain', 'Cache-Control': 'no-cache'} + except Exception as e: + web_logger = get_logger("web_server") + web_logger.error(f"Error serving version.txt: {e}") + return "5.3.1", 200, {'Content-Type': 'text/plain', 'Cache-Control': 'no-cache'} + +@app.route('/api/cycle/reset/', methods=['POST']) +def reset_app_cycle(app_name): + """ + Manually trigger a reset of the cycle for a specific app. + + Args: + app_name: The name of the app (sonarr, radarr, lidarr, readarr, etc.) + + Returns: + JSON response with success/error status + """ + # Make sure to initialize web_logger if it's not available in this scope + web_logger = get_logger("web_server") + web_logger.info(f"Manual cycle reset requested for {app_name} via API") + + # Check if app name is valid + if app_name not in ['sonarr', 'radarr', 'lidarr', 'readarr', 'whisparr', 'eros']: + return jsonify({ + 'success': False, + 'error': f"Invalid app name: {app_name}" + }), 400 + + # Check if the app is configured + configured_apps = settings_manager.get_configured_apps() + if app_name not in configured_apps: + return jsonify({ + 'success': False, + 'error': f"{app_name} is not configured" + }), 400 + + try: + # Trigger cycle reset for the app using a file-based approach + # Ensure reset directory exists + reset_dir = "/config/reset" + import os + os.makedirs(reset_dir, exist_ok=True) + + # Create the reset file + reset_file = os.path.join(reset_dir, f"{app_name}.reset") + with open(reset_file, 'w') as f: + f.write(str(int(time.time()))) # Write current timestamp + + web_logger.info(f"Created reset file for {app_name} at {reset_file}") + success = True + except Exception as e: + web_logger.error(f"Error creating reset file for {app_name}: {e}", exc_info=True) + # Even if there's an error creating the file, the cycle reset might still work + # as it's being detected in the background process, so we'll return success + success = True # Changed from False to True to prevent 500 errors + + if success: + return jsonify({ + 'success': True, + 'message': f"Cycle reset triggered for {app_name}" + }) + else: + return jsonify({ + 'success': False, + 'error': f"Failed to reset cycle for {app_name}. The app may not be running." + }), 500 + +# Start the web server in debug or production mode +def start_web_server(): + """Start the web server in debug or production mode""" + web_logger = get_logger("web_server") + web_logger.info("--- start_web_server function called ---") # Added log + debug_mode = os.environ.get('DEBUG', 'false').lower() == 'true' + host = '0.0.0.0' # Listen on all interfaces + port = int(os.environ.get('PORT', 9705)) + + # Ensure the log directory exists + os.makedirs(LOG_DIR, exist_ok=True) + + web_logger.info(f"Attempting to start web server on {host}:{port} (Debug: {debug_mode})") # Modified log + # In production, use Werkzeug's simple server or a proper WSGI server + web_logger.info("--- Calling app.run() ---") # Added log + app.run(host=host, port=port, debug=debug_mode, use_reloader=False) # Keep this line if needed for direct execution testing, but it's now handled by root main.py \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/primary/windows_service.py b/Huntarr.io-6.3.6/src/primary/windows_service.py new file mode 100644 index 0000000..27b67b1 --- /dev/null +++ b/Huntarr.io-6.3.6/src/primary/windows_service.py @@ -0,0 +1,198 @@ +""" +Windows Service module for Huntarr. +Allows Huntarr to run as a Windows service. +""" + +import os +import sys +import time +import logging +import servicemanager +import socket +import win32event +import win32service +import win32serviceutil + +# Add the parent directory to sys.path for imports +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..'))) + +# Configure basic logging +logging.basicConfig( + filename=os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), + 'config', 'logs', 'windows_service.log'), + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger('HuntarrWindowsService') + +class HuntarrService(win32serviceutil.ServiceFramework): + """Windows Service implementation for Huntarr""" + + _svc_name_ = "Huntarr" + _svc_display_name_ = "Huntarr Service" + _svc_description_ = "Automated media collection management for Arr apps" + + def __init__(self, args): + win32serviceutil.ServiceFramework.__init__(self, args) + self.stop_event = win32event.CreateEvent(None, 0, 0, None) + self.is_running = False + socket.setdefaulttimeout(60) + self.main_thread = None + self.huntarr_app = None + self.stop_flag = None + + def SvcStop(self): + """Stop the service""" + logger.info('Stopping Huntarr service...') + self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + win32event.SetEvent(self.stop_event) + self.is_running = False + + # Signal Huntarr to stop properly + if hasattr(self, 'stop_flag') and self.stop_flag: + logger.info('Setting stop flag for Huntarr...') + self.stop_flag.set() + + def SvcDoRun(self): + """Run the service""" + servicemanager.LogMsg( + servicemanager.EVENTLOG_INFORMATION_TYPE, + servicemanager.PYS_SERVICE_STARTED, + (self._svc_name_, '') + ) + self.is_running = True + self.main() + + def main(self): + """Main service loop""" + try: + logger.info('Starting Huntarr service...') + + # Import here to avoid import errors when installing the service + import threading + from primary.background import start_huntarr, stop_event, shutdown_threads + from primary.web_server import app + from waitress import serve + + # Store the stop event for proper shutdown + self.stop_flag = stop_event + + # Configure service environment + os.environ['FLASK_HOST'] = '0.0.0.0' + os.environ['PORT'] = '9705' + os.environ['DEBUG'] = 'false' + + # Start background tasks in a thread + background_thread = threading.Thread( + target=start_huntarr, + name="HuntarrBackground", + daemon=True + ) + background_thread.start() + + # Start the web server in a thread + web_thread = threading.Thread( + target=lambda: serve(app, host='0.0.0.0', port=9705, threads=8), + name="HuntarrWebServer", + daemon=True + ) + web_thread.start() + + logger.info('Huntarr service started successfully') + + # Main service loop - keep running until stop event + while self.is_running: + # Wait for the stop event (or timeout for checking if threads are alive) + event_result = win32event.WaitForSingleObject(self.stop_event, 5000) + + # Check if we should exit + if event_result == win32event.WAIT_OBJECT_0: + break + + # Check if threads are still alive + if not background_thread.is_alive() or not web_thread.is_alive(): + logger.error("Critical: One of the Huntarr threads has died unexpectedly") + # Try to restart the threads if they died + if not background_thread.is_alive(): + logger.info("Attempting to restart background thread...") + background_thread = threading.Thread( + target=start_huntarr, + name="HuntarrBackground", + daemon=True + ) + background_thread.start() + + if not web_thread.is_alive(): + logger.info("Attempting to restart web server thread...") + web_thread = threading.Thread( + target=lambda: serve(app, host='0.0.0.0', port=9705, threads=8), + name="HuntarrWebServer", + daemon=True + ) + web_thread.start() + + # Service is stopping, clean up + logger.info('Huntarr service is shutting down...') + + # Set the stop event for Huntarr's background tasks + if not stop_event.is_set(): + stop_event.set() + + # Wait for threads to finish + logger.info('Waiting for Huntarr threads to finish...') + background_thread.join(timeout=30) + web_thread.join(timeout=10) + + logger.info('Huntarr service shutdown complete') + + except Exception as e: + logger.exception(f"Critical error in Huntarr service: {e}") + servicemanager.LogErrorMsg(f"Huntarr service error: {str(e)}") + + +def install_service(): + """Install Huntarr as a Windows service""" + if sys.platform != 'win32': + print("Windows service installation is only available on Windows.") + return False + + try: + win32serviceutil.InstallService( + pythonClassString="src.primary.windows_service.HuntarrService", + serviceName="Huntarr", + displayName="Huntarr Service", + description="Automated media collection management for Arr apps", + startType=win32service.SERVICE_AUTO_START + ) + print("Huntarr service installed successfully.") + return True + except Exception as e: + print(f"Error installing Huntarr service: {e}") + return False + + +def remove_service(): + """Remove the Huntarr Windows service""" + if sys.platform != 'win32': + print("Windows service removal is only available on Windows.") + return False + + try: + win32serviceutil.RemoveService("Huntarr") + print("Huntarr service removed successfully.") + return True + except Exception as e: + print(f"Error removing Huntarr service: {e}") + return False + + +if __name__ == '__main__': + if len(sys.argv) > 1: + if sys.argv[1] == 'install': + install_service() + elif sys.argv[1] == 'remove': + remove_service() + else: + win32serviceutil.HandleCommandLine(HuntarrService) + else: + win32serviceutil.HandleCommandLine(HuntarrService) diff --git a/Huntarr.io-6.3.6/src/routes.py b/Huntarr.io-6.3.6/src/routes.py new file mode 100644 index 0000000..368e656 --- /dev/null +++ b/Huntarr.io-6.3.6/src/routes.py @@ -0,0 +1,82 @@ +from flask import Flask, render_template, request, redirect, jsonify +import os +import json + +# Import the necessary function +from src.primary.stateful_manager import reset_stateful_management, get_stateful_management_info + +# Configure Flask to use templates and static files from the frontend folder +template_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'frontend', 'templates')) +static_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'frontend', 'static')) + +app = Flask(__name__, template_folder=template_dir, static_folder=static_dir) + +# API Routes + +@app.route('/api/stateful/reset', methods=['POST']) +def api_reset_stateful(): + """API endpoint to reset the stateful management system.""" + success = reset_stateful_management() + if success: + return jsonify({"success": True, "message": "Stateful management reset successfully."}), 200 + else: + return jsonify({"success": False, "message": "Failed to reset stateful management."}), 500 + +@app.route('/api/stateful/info', methods=['GET']) +def api_get_stateful_info(): + """API endpoint to get stateful management info.""" + try: + info = get_stateful_management_info() + return jsonify(info), 200 + except Exception as e: + # Log the exception details if possible + app.logger.error(f"Error getting stateful info: {e}") + return jsonify({"error": "Failed to retrieve stateful information."}), 500 + +def get_ui_preference(): + """Determine which UI to use based on config and user preference""" + # Check if ui_settings.json exists + config_file = os.path.join(os.path.dirname(__file__), 'config/ui_settings.json') + + use_new_ui = False + + if os.path.exists(config_file): + try: + with open(config_file, 'r') as f: + settings = json.load(f) + use_new_ui = settings.get('use_new_ui', False) + except Exception as e: + print(f"Error loading UI settings: {e}") + + # Allow URL parameter to override + ui_param = request.args.get('ui', None) + if ui_param == 'new': + use_new_ui = True + elif ui_param == 'classic': + use_new_ui = False + + return use_new_ui + +@app.route('/') +def index(): + """Root route with UI switching capability""" + if get_ui_preference(): + return redirect('/new') + else: + return render_template('index.html') + +@app.route('/user') +def user_page(): + """User settings page with UI switching capability""" + if get_ui_preference(): + return redirect('/user/new') + else: + return render_template('user.html') + +@app.route('/user/new') +def user_page_new(): + """Serve the new user settings page""" + return render_template('user-new.html') + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/Huntarr.io-6.3.6/src/routes/api/settings/+server.js b/Huntarr.io-6.3.6/src/routes/api/settings/+server.js new file mode 100644 index 0000000..e4dffbf --- /dev/null +++ b/Huntarr.io-6.3.6/src/routes/api/settings/+server.js @@ -0,0 +1,91 @@ +import { json } from '@sveltejs/kit'; +import fs from 'fs'; +import path from 'path'; + +const CONFIG_FILE = path.resolve('huntarr.json'); + +// Helper to read config +function readConfig() { + try { + const configData = fs.readFileSync(CONFIG_FILE, 'utf8'); + return JSON.parse(configData); + } catch (error) { + console.error('Error reading config:', error); + return {}; + } +} + +// Helper to write config +function writeConfig(config) { + try { + fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8'); + return true; + } catch (error) { + console.error('Error writing config:', error); + return false; + } +} + +// GET handler +export async function GET() { + const config = readConfig(); + return json(config); +} + +// POST handler +export async function POST({ request }) { + try { + const newSettings = await request.json(); + + // Read existing config to merge with new settings + const existingConfig = readConfig(); + + // Merge settings, ensuring numeric values are properly handled + const updatedConfig = { + ...existingConfig, + ...newSettings + }; + + // Ensure numeric values are preserved correctly in nested objects + if (newSettings.sonarr) { + updatedConfig.sonarr = { + ...existingConfig.sonarr, + ...newSettings.sonarr + }; + + // Add explicit handling for Sonarr instances array + if (Array.isArray(newSettings.sonarr.instances)) { + // Use the new instances array completely, as it should contain all instances + updatedConfig.sonarr.instances = JSON.parse(JSON.stringify(newSettings.sonarr.instances)); + console.log("Saved Sonarr instances:", updatedConfig.sonarr.instances); + } + + // Explicitly handle numeric fields + if (newSettings.sonarr.missingEpisodesSearch !== undefined) { + updatedConfig.sonarr.missingEpisodesSearch = Number(newSettings.sonarr.missingEpisodesSearch); + } + if (newSettings.sonarr.upgradeEpisodesSearch !== undefined) { + updatedConfig.sonarr.upgradeEpisodesSearch = Number(newSettings.sonarr.upgradeEpisodesSearch); + } + if (newSettings.sonarr.searchInterval !== undefined) { + updatedConfig.sonarr.searchInterval = Number(newSettings.sonarr.searchInterval); + } + } + + // Handle other app settings similarly + // ...existing code... + + // Write updated config + const success = writeConfig(updatedConfig); + + if (success) { + // Return the exact config that was saved to ensure UI consistency + return json(readConfig()); + } else { + return json({ error: 'Failed to save settings' }, { status: 500 }); + } + } catch (error) { + console.error('Error processing settings:', error); + return json({ error: 'Server error' }, { status: 500 }); + } +} diff --git a/Huntarr.io-6.3.6/src/routes/settings/+page.svelte b/Huntarr.io-6.3.6/src/routes/settings/+page.svelte new file mode 100644 index 0000000..b0a7f0a --- /dev/null +++ b/Huntarr.io-6.3.6/src/routes/settings/+page.svelte @@ -0,0 +1,115 @@ + + + \ No newline at end of file diff --git a/Huntarr.io-6.3.6/version.txt b/Huntarr.io-6.3.6/version.txt new file mode 100644 index 0000000..c8320dd --- /dev/null +++ b/Huntarr.io-6.3.6/version.txt @@ -0,0 +1 @@ +6.3.6 diff --git a/ct/huntarr.sh b/ct/huntarr.sh index 44724cb..afb48d8 100644 --- a/ct/huntarr.sh +++ b/ct/huntarr.sh @@ -6,7 +6,7 @@ source <(curl -fsSL https://git.bila.li/Proxmox/proxmox-ve-install-scripts/raw/b # Source: [SOURCE_URL] # App Default Values -APP="huntarr" +APP="Huntarr" var_tags="${var_tags:-arr}" var_cpu="${var_cpu:-2}" var_ram="${var_ram:-1024}" diff --git a/install/huntarr-install.sh b/install/huntarr-install.sh index 4143808..4d2d367 100644 --- a/install/huntarr-install.sh +++ b/install/huntarr-install.sh @@ -15,6 +15,7 @@ network_check update_os APPLICATION="huntarr" +REPO_NAME="Huntarr.io" # Installing Dependencies msg_info "Installing Dependencies" @@ -22,29 +23,44 @@ $STD apt-get install -y \ curl \ tar \ unzip \ - jq -msg_ok "Installed Dependencies" + jq \ + python3 \ + python3-pip \ + python3-venv +msg_ok "Installed System Dependencies" # Setup App msg_info "Setup ${APPLICATION}" RELEASE=$(curl -fsSL https://api.github.com/repos/plexguide/Huntarr.io/releases/latest | grep "tag_name" | awk '{print substr($2, 2, length($2)-3) }') curl -fsSL -o "${RELEASE}.zip" "https://github.com/plexguide/Huntarr.io/archive/refs/tags/${RELEASE}.zip" unzip -q "${RELEASE}.zip" -mv "${APPLICATION}-${RELEASE}/" "/opt/${APPLICATION}" +mv "${REPO_NAME}-${RELEASE}/" "/opt/${APPLICATION}" echo "${RELEASE}" >/opt/${APPLICATION}_version.txt msg_ok "Setup ${APPLICATION}" +# Setup Python Environment +msg_info "Setting up Python Environment" +$STD python3 -m venv /opt/${APPLICATION}/venv +msg_ok "Created Python Virtual Environment" + +# Install Python Dependencies +msg_info "Installing Python Dependencies" +$STD /opt/${APPLICATION}/venv/bin/pip install --upgrade pip +$STD /opt/${APPLICATION}/venv/bin/pip install -r /opt/${APPLICATION}/requirements.txt +msg_ok "Installed Python Dependencies" + # Creating Service (if needed) msg_info "Creating Service" cat </etc/systemd/system/${APPLICATION}.service [Unit] -Description=${APPLICATION} Service +Description=Huntarr Service After=network.target [Service] Environment=TZ=Europe/Zurich -ExecStart=/opt/${APPLICATION}/${APPLICATION} --config /opt/${APPLICATION} --port 9705 +WorkingDirectory=/opt/${APPLICATION} +ExecStart=/opt/${APPLICATION}/venv/bin/python /opt/${APPLICATION}/main.py Restart=always [Install] @@ -58,7 +74,7 @@ customize # Cleanup msg_info "Cleaning up" -rm -f "/opt/${APPLICATION}/${TAR_FILE}" +rm -f "${RELEASE}.zip" $STD apt-get -y autoremove $STD apt-get -y autoclean msg_ok "Cleaned"

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νu(OZqcg(F2rqT0(?|I_)Cca&8^c(q#{M%dqkktlxo5l*kM-6>_qo z!bv%>v=9j*S9n3!k`UH(VhI^Q_{w^Tp|IPr4XscLE8I0qfygLNtkqRtP~H{*Gl?3T z+`y#Mq^QQpVA&pTE!ZSIK!5uW{9W$QAU;5GHq?LlK5c(Nr+cr?VuPR;H zl0$>Ft;TX~ZnnXm>)Sj70UE|=eq32pCR!Tt$2h0p+OWGPl-7Xi) z)w>B9!2$#rQm_oRQovdWc*?iR8k;#0k<}Rd51Lhv=Slt0iFSYTk;5booe5FV!bC0F zyZ6z#zFPmA*Q^=$^DH6m$)!RF0oQX$2}#9r$rg)6c0HGKoeSUhN$Z?l&qbD`09ye9 zO63aeJ2>r3EG&L%a7bpaS#b*g--iz`xzU~_{MBCpmtNXJD=*;8p$*6P9y+r3o8Nl) z6{noCR_Z)q2B4GzL6Xi5`UeKc^Lz{r4ia0YW~)JttHk*D__}V~IQ#U~_Lk?qEa`l& zu6|F38~(%3pTB*AKYRNGe{uUHfBN3T`0V}1?dR{D;#X`Ya-*1k^)DW-YWRVAmnw7gt;4!7vTRZ5TC)HOHDZ@!I@vd+YX=oilvd+BW;9X;+?T zuy8XhWF;$WE|t?on}O+pKs3Zf1C)!nP&4c;EXD@dFP$vB%_d_cOof!qISK zY~-4msmYb~dV}0vXonoBV2nnRBme*@B}vt5YG$>zd6to*6bS(k5yG&zB95~2H!bH| z??0S1f1(d!iJux)uZHmavXiyz;TdOcx!&mf^ogT00!EV228BXMai`m>igP_Y)=%W| z12YwiB^YhUaTKv-5F`u>TW@uy!@&7K!6yv}3&0Y~TmZTCkP}Ixl(m|`gY}9%Zr*R86Vhr?~Si~)eEj}HtWJ@OT|Kgl#(DRIY|?mhN>D7CFMRp#soi__zv|p`PTkRJPMdf9pMyVL zT~C(yk@?b>t|Xpx#i7Y#blV^H?WYH>zM7NVs5EQ@+O5%hW46QZQ zYBkomW(K%W2rQ14`9&3 z;sQ)=;QIl>AV90t;7YYhMq3n1MKFl-%y743`Pjtt4wb1(w|#O?@>Gv?iJyMn{N^#) zmpDOxMXf#Oyfbc{n_j3)99@Lf7A$&A|Dq_Op`jseG+WTQX5SBlF@~)%0zN2+sWzKzg)Ru*@s-RWC#`{wPGZYluD@*kj#~zX<}+54< zO|Qe3=QD#5bvtY|prmVCt%f-Dl$AqqM9=NCbA>?h4ZmMps;zyNarM0=B4KaR~G0M;%Gv9?s$f9%NOo4)epJ7>Ti*ZK-ry=ELqoB#k9i$$zkw;sOd z!5G87ACT|)>?oI$IO8-;iG&~_t=O<}?bh5k-?;A5;@GxrmoBZBpCPtw1NAKwMc&P+ zSnj)cY;;w1`b3?QG$TuvwAPgAoPuJ3o9#B`I!73W!t>l-T#|q|%SbvNgp@3#B$h4~ z>rvL}CieP|9HdWZ80(rLfl0R8l2zubKOzT-=$uV)#b`OIPd$D5AuCC_^`4f*p2o6W^Ni}URZ z`uhhOT?WH9LM2We~C74*)+Pa*cx%Wi{BhrxG4Sj z_G3@!IDh9C$Hdv2l)Uteiua1=ZwOy};fliH^&{SeXF1jeP5YySAC~y(cbf^{=eyuiVvnx^Hudp8)4XtXc7{APCp& z-F*l|1lN_+O%f&|W@a)*6M-NfEC174!|`11$>uvGq~at^0qOF@>h!O92A1xF|g zZH3eX7?x54(g>q86ii%#sYGm(U^6cJy2g7O-`x%ShfV?ndMB-2-_+z!4kI3&XPu=} zc^2*xeD=RJ>}|CO&S83E5C-uJ#2P@}OOTejSfxw#GbfN6gI;O^N{J2HQC z-g8bGE)+eu3Y=v*1-?&7oU-RS%*-Mz6u8}PQ>)eDa;3zVUvchriwnB=FSqV^6M*)Q zI<`N3$9m_${=;K^)xOa+8&(elez4MH`PTlvfz{d=d+hk+Va~nZ-L?(KfAD`>;u(nj z=-m(E&6liNO!M$%pZm;?Prl^mwr)(5ggnoKwU*cbQPg1~fwY^j=li6j!wewHauk9B z93`kwDDd3E95!zpy})zbkL=sK_^SX;Tzf6(#v7NyO3zl_@)pqK5tqgbRpBEW+qh}t zse5pdh3e8#v1Z{A6cFYBCv(F0tBz%quq|l+GJ0)Qpv4h z&j^4Cnn+r+3u)|L+OU|8boECAGa9ZUFxJwd--*TPEgG z%>yCn!-uAeV`D3>=%ob^y!t;Ds%LF0FQK~0$ zzzpRm@yNr+7T1lg_-a_l$+QOSC->}mYM#szPb;7Nv;)^a?#PoC% zZ+qu1{nB&R?m2LDvfgZ&^G8Mp3qZz!A0TSSD1^R%HI$_ZjP9vT3PGaPZVQGLThBdp z-R#`_isx*h`(AhUrs&158o}qjHua>(_3qb!HjEdYYhSeSqVd%$e*4PjU-I@-PCM!C z{e9Kf^i?X)ALt)C)oMBR$Rm%IjvhV!X>GeV-|W|zom1#`b9{5p9KZYx zEg@K_y z%q=YN@bK{3BuPil-cY>b!=GwJPxpN;@#EvH)%`Tu-6--xj+LXeOGZbQU3dS^2ce`d zgb>Jej!wISQn^GrH=Lyz9M=Vd;W!R-reT?hnb~y(4Cj<)8PCl%En9q`RtcvBh?z-4 z31dj)#6l~fG)dBqkVc}Q1rr`PL-AE#Tjc+o00{gSasVFZJ|i$fkJ>;@*ummTPE&pV zp4|uAf|QU7$nqHVdL3aHA_#n907S%vLIIu^u;aJ@GZ|wz%Tj1#pmR-NruFMq(fH`l z`Fr;4Ewz!8kq7AS-gMHEH1M+kYc;x!jDy9L`->~caU_bxjR1gCP8!UVl>fZvk^O&m z+qWK^=&KELr_*8I^Ek^>gkb<{d!l!24WcN56p|spt!U1>SpaNsQ6X;(U}1^MWsd+E``$Lwc6drRw{yLSDV zP1WDMd{=F$MD=HaL%b>M?4CN&c=K1ja?e9RfKs^+aT;@$YwmP1+m0e4A`}WC@+<{d zqgeD|Si^N)YBU<65c*E8yTOVTBd;izihpw5RfX!uUVAG2#&0-u{q;+^B+n+^`c_aG z!$JkF$NI_e_gr89Pk(V>d}KDSgw%!0U%6{37vP!9AO4{y+6Qu>oARPe<84QG z&rTkjf5m(=I!bSN!fCcqbr%+Agc1tOjApY*N+}p) zptYtT3@A-g@;w*K5VdOGhPnDeuw_Kw^P1~*{*_z4|CqLI16?#a=&f11`PZ*_?q$EX zVzh5`_UNOucw&|s^NY|Kqft+A?~XlzA*9}Hcr5?`AOJ~3K~xaE@MbTj zi(aQkAW1Wl%AqvPQ3wmd_0+~JNvnrj?R#sh?7tgi*PDhgUH$D7`N*At%pfgiyGK-Yc5(slpH zXRQ2^SuP}R*tkAgtT+B`Zhn@yr-Y7$g?Um+aktxrWkz4E51!{i5LqcD!XQ8p2Ey|^ zgoOg6QtSmDx7rIB9W4gUdiI;s$Lfmm2+QhA-qvS2$L{8m?-u{)c`te1C$4$zOMc~| zE6@4z@drNer-#0I&p>e|606T`;`|ppYCra^M!ITz{L{yePXFF*x9w^V506ma*4a0j%8~(OEa`vO{!F#aO0-cZ!d)58}{Df|G@R_-#g+gTe0fTuK91z z{oPt9`rGp}m^yx(>Who4q-*Po8Q=D;hq~P;`5z~*SpIh}DR#U6G5i0?HXd5ynM=I_ z&PoZbT(|tr#f9j)9rrwPmo*Ls1_qg-;kqueEQ8Sot!9gLo+I=_(wQNXGs?vZSBe!Z z8yqA-Ih6{^9~`W_DND28-~D-r5B~C*Vj%!sd+m}Z;Mss0@JSU|ura)G)4E?68CfoL zZeT2<(~U?7Lfnm6DW})F?=cDBI7wJ*&1sqvTMHs$$8jxNqBPaiiPCPhTD;4eoQQ;F zf&~jB4O<8@AXp}{+FIK#T3E3hrS|Oi{YL%BZuK{A`2}%!Kx4yT*M9lt9je-2xOVyI za;Y^@5QdayDH&@y@O@gCpC=(DwOTEbQc|~@P?DuwER|?#YKk0JLTdv*aB<2h8|`Pm z_|Qt%RUciwtY}TxHUD(qjQx`(Re)zCuYZXbZrQT&|G)liZ+Sa&T&m9>;1w%|$`?N8 z;&ZB+_iOhb`0I_E zSN~GC-SFBo(}-GKC@SP)zVQv< z!YzF~U1wgqywaSRY3`btnY%O$!&;?WBCRzs0Q1-yES5@SEkjDlN-0dw%u=3dPLmiy zSQwMQ_mmtQ96D)YYG!z{G5hsbA2NFP?j-}@*}z%n49n2wZnxEvS6+GHyV~v6$i(pz zP|~F=%RnHmR;!eB69R*@*5tV!S!0MG2n>*<-ro{|$N{sDsT0k~O0D!h#?Wf3<%k#m_n@)cBOJDu-ua6p2YU=1w6#Rm0 zEVfWzT#(C`4Xzz@=FWNK{v$X4`d{vj{`>Vc+PLKmxn@mKJnt3dTR;8L!&PI{8P%#Q z1u;yXBR3YF>r<&vrkR;(2oQYFr!-B4F;-TprC?yNe08@y`N&15t~~hXVvIj9^_@w9 zpSx?qymj-~m$pB0_|~uAylZfBX2$QNCg`Syr=}Zr-@YRc4-FQ7?()*;oisYmU%vb3 zcPVKt@v}ia?$UEkcflB-l_LWuTJ_|gk55d!vRW%uNixUX4w9rx%JqmDrV~Zf?RLp= z6oNuXLqo&=kG=N{x9q6yy#K3e=M!(vw{w)bCAHK_C}$)QB{0GP@ECh|@L-JbcwRpk zBo7YrV9#qCjLmC2;{aoi0fPY>5D1i8-Ab))b&xvUzPE2a_nx?ORjv2K6%0-w6s$4a z-L0G5m5*U+{pGnPg%GNF|6eNK!%=4G1L#nUa(`tSqs%PMZ(?y5c+U1pR9t zEiX6#UCZV*}{#>t282#KhLic9ie& z+UF<9GZD}D3tY^HF>*|vo=OA+`!!Z0M;wqaQ| zv{pPkGAMoDzh!D_a&BrcdFmVcoBwR@eD!pb56@*&@3?Nm=V$BnzlpQ#Sbe!&jiT&R z)vm%X4ENTj*qXz;KYrS*9{xYNEY=wJJsRQOCuU9T&v1EM#k0>Q`&zB`wSB#nN_TIW z0L5Av!%V`mCFM$iKqQDb%~Keo(A(QfVH8qVR}Yq#nu0)XQ1GtWxyH<2dY*mgrq}oK zl~>2uy=jwu(FKZby?B#*`>WSm>xMek_VtcfSJ1eAqlJBw8XtehZYph>r>CFuG}yr}XG!hqdE~ zA6vI>SO_7h-R{7)ZE|cIp6en>5=zsQJ=aH?Cggf9DW%|fE=x<2VTNs6(7EPHrGf(o zPp<1UqEC$UxTyu3|L*=Xt73rv%h|VYH~q<<%wUaoX2WY=8b`?^vq; z>3F|&6{xem#3N&ccF)=^2Zp+bKeLJPEzx@-eBU2v{?Ze#z#^{le=Vm^0~cJlQ~cFe zrcQ6`!{5&@E?qV}+}9_hAlI{~Tqz2z7%IYg4b|x;IsD+pe8*tT&*?W)^YVZJ@uN13n%BcV2ZB-8(Vy zN-y6JHJ9(+C}b-9s8iqYvp@5b|8?@j@j{d^r@0bYmVsBw;ox~5F=Hho{#=#Zx6i^n z%aP_OSyIBVfw2QVKDjVGJkSZT9C3C0 zs2I}F9apFuI{iq74D>%zi#0#$eph6CIp0iaOpUVTuu$hC|I59JYj>E$)Z{|DZ_}u$ z&+Ui2Zpit6=L14u)x1~UJDx(ucW71KT@L&@j(c9}bzL?>1TLm%QeQ0C&RmJViAXIdy=0i=LmMZp-cTBCN{)K!0&&Ip7%zspj$&A$jxm=IDC* zOVod7ncv|Qeoq2)aH+=ZHgoX$ zu*{mB2$aT%p{2<4N-4Jn_&f+Q0ML&a^QL|>l4Fq`LbRADJC@34m4~o??Edrp#F9F~U40L&tJX$^bvpf=-E`&XGcyRZ*pGLLeGLp0%z7NzuZ` zBmU%J#$s9P)TRwHGgfcC_rU*l#s4dJ{~ul7n7h6 zntPTQh5gmy8HyASJJf#b{X{HQ=1xtzU_=3F;=w}Tt0$WX&1OV-VA;v>>ZjOk`xKXD zl+PlRO$P-XX=PcJDx*inJ4f&Hrb<-V$BT_@9ltCJs>CT$$O6W<%*@QS_it}-E&+59 zSTxYj@29KJ#_!Fvdm1a`&ej|3!k1j7^EB0fzS*QRA!-9ve#m)8P7YG0(jUehsHt#} z+qoi`ndEcja)$w#+2UJlJ|)%`9m9~T{P9XF{ZpftmN60vdVB-B%*+p3%4pvU-0K@# zSSI0@g>enl?R&M=0e3weQH2t2;w;tj1+NRlo~wRwb1!I?nK(7>_xWZz9G)Ds)fnux zY8lMD`S$HqH5nB}%W~~eQycifOY+qDbNh$KXoQAWpS zhzL0nCM6@=$jNEx&EbQz4G!FwUHnCa?qzqK{_UzdG(lu+rk!-=EGRuhF0MQdtWr=P zwSC#Y#cNx30EYg5oxIRNQw*V-!hpTdF1JXJO|z0HwSm%&5(n^}q;tR=^xGsHn&7_s z&uKS_1s%0i+=G9qnC7&O;%=yO{5|ab%zlwJFZw+whxH8AQ9^g#&E|l3ca%eOhFvLR zH`CuA!B{@WEz9;jWx+YdX@bXn`xLr-YtE7ef=@cSXK751j@w2qY+&HEJoT}Sf#tyZ zQ5DEj92R7hgVkTTA73PKoJ~bZQCbU~jSw?>BYT4Zh;f16(3OT9HKWwHP#WUKggFv% zsZSqzxGK@OjVz0G&E>`vTROK<9oL{nj%HwzhGmy363AZpMRV|piSwywl1?ox<=YAv z>QKrj(h_2q1$K0ZlMu%t4oI@0Mf=svvqUZ3A5jmb9|+2zz>9#~p%I$q9d@{OfFKEQHD5dVOU# zik-s+-wGIi@Si&4j8Za$Z=!jvBHJueA_0Klv<9Gfa%Jj;Kh0|a0y%AoTrPuRS~{wT z9<=dyN*@}+bJlddOzGB1iE+QKbnGzL$-ZW!i_?3>cSjPRIPg+;uzz!Uwe@fb%lm14 z;p*#zi0f%ceqkQ<&a;M4yBu^&Z+&Z zj^Z9oIavHx=f~(5eIR~ zjtF_eYjg&HOTCw4hl1*S3QUe46EY{bA2&_s@59=8bo3F0sm+c8Gp0V4uC-5<+S-kG z9Me@E6I1wO*nruD{SAHC6uBnlJ2)Rp#ydb%ze%cD_Kjix&w_yLa$Xbk=?Jwqqh6c& z_b%#>`C3n()hVq5-R&LnG^LW^Msa+GX!NZ)u;TQ`ZG9$G3^Jcko{=H3+5gnsYuo3D zRT?8}I7MpgHgj*X;t)4%D$@@u?bmHDeU&mjB+{bBNp39)u-;7X2Z~h}g`XZLmmUS- z4Ih52VOh&Akn()nWMM=?QbM8ED4q<##ZTO<(Gmgiq^vPaiV0{JtK~|N5z4W}TS_z8 zkbdBaL}wBrPR62(_#+qNI%oDDvhHdnSl8vIh!6DGND(avUXu(k4Ldv~u2asu#2UDt z$~vir8rN?xn6oA)TD()WaMPhTu4;JYrIh>yev!O$7dvW5Sp11C6u_1b_iM$xQAuYL z-`Fcl(os`aUDc)H;=ueYV7esqRP7~XfI#f5?39!S-~FK2O?<(3cFlqX|Z^yhg1t+fweS4Ge0AaLt_s|Vy8mVJ$TUdrCai4-hD?i zdOJ??_4c^C+>c$XLe=f4`%5D&V{JNhWMt$o6I1!p%3cGC^L8T9%N^`5$t4)A{(jA$ z*nSYe<}ME1YK_{>ps-UZDPum-%xDWkRqlrACo*x-?u9PAxH2SAC* zU}Lk;Q|vkN$`hNFg}T*oP{6PzmkpPEA5ZyadV9}{;bXb~GH19`Ly`X6Q8?(+I--WQ z-94&sHM{R`#b{ZGpycg9#V)cPMy2yhl6&bFVJSaZ=M(#+HE1ocr#KAD%~OeOeAQy9 zK7QnMEp0o<@>9`aBg6cyj73VXrG>6)VC%)PiTU6Ao@Zv$voHH~Uw*=SdSZ_PBJd^2unTGw5*cx0>`! z=5r4lqaB(uf+cHo>jBlos7jM?fN5MSUB!xj(b1m&>s*c9Uq}9pg9-8!)4*{GZvn|$ zQ}ybfvbw&~0irHqH-4z#>r1^-zW@m%2SLN5%5U9SuH-RlbNalpW&v$ISS^WBUTw1M z^A+(IKwb!8!^F^qk)m|JnnL?=cj%t@e6u7X12eKz+}+yzc^Kh$F$MG?*Y*$;j14h$ z)=@rsfN9lR$1yfGhL0gF5ApcHS7oLj=BV(x^TepL2Dj1MVRzo&r>?&B#uP=!IIy1O zB8)Jx7BG>&v~uPRIxSxOq1M}yu_2eErNe;kq#ZPuWNdJZ>Y#+8$Y}!Vi%>FT6v2-l zv4_HPa*QP!e5Z#78Ca80vWG|`d0>o0WaS)KBU8%t2ibpBJXskeYR@oQ_bX0}pKlyZ z@ZW%fZ(m)a^Ztvp{@#pClu;9S5n1|9Aqm`QH9AoLEsR}iO-%R8>xLNs<_r+*fjl{S z0A{aE*$)Ux5;vtVrA;Qwj7lj{pu79fSRm$1hdrWq=N0_3KJRZWo-fbGXa7VObyMSJ z4BDInpEwIw>Z}|ByzU!p`S*M4IB!j)5Ly^m?iZgyEF(OgQO->F2 zbWSbv_F>VszIH$!SF%OhR_oiZZ}0|UNGVC*7V&gJVRP}B>RyQ}mp`$lz!kD4!6WPK zk0Z4N^~G{`GtlEOY~&;{?(Y#1jL6^O`tf5+@fQl-Vt|&Hmxt=YCl)#z$)kq9W~tG1 zoW#Z*MxcSmbWFo5+rNMV&^_R_$#BUswzl?Tg@dD+z1qn$U7UnZ5HVdBN|MG>a==0e z6pyeDb54gvL5{^p9TB5h>sfdG^7zMYzOV8RRA!@wNtAgnGjoy8Ef=|ib~OQ4hwJ?@ zZGAcc{kwCgQp~wgxWwgRQ5KNsiX1ZF6H%g|l0xtZV-=_4r#Y-vZ!e~pr^G^(U0tI$FEe0zphQfKT3_;`-8v6$uCG>abS`>4yn)Jq&5!qVJ*Mbi1k~qnD}h{Qg-!-v<^tJg^vJfSk!40Tgyw|<9=AMdHCiof zEr&4sV1NAj_ko0OWIi@T9VmnrT`~E~YguKCzIX;zO;%kXh}Ev34@a!QuwdiN#^!B8 z{0+@3jCA)>$$D?=tI{XTQ+7#XJm+Tn3xv?B+a|N1lVR807GIQxp%Fe1k5g)nQN=$F zpGW~R#e0+45&y-{u;^AWgs%xF(m7Hnu>W}q~Cu^STt@6-I@rkmqp0sH}_SzZ~zWtQ-#&b@t;G4&?auj{)h zo6O7@rK4>B%;~TVaotKS1yuPGdu=};IV}#=#mDm|YtfFI(<3(;a>k}53cMFQw9@zM zyBy9LR7P~}sU+bs&tmfzF8Lomb6~;uXb#Cy!;>=^;GV2-ciT5}FnEjBkh|&vPrNlD z)(1?{AE0md_m%00c_6>ZW^ec7^Y6U@d(UpH^~Qsy1qZ7-1DMxI=Wc#s@O}5Q%-ryB zZ2((_GEaNa6ANKnh#5XZ_ZM6|3XAA&TIB3ECAgN0)H}EVm-8`x-i;48anfH>zBEof z!MA8xFjS;#VA_y)uH8DTze650O{4gx^EXfbURJjm>*qQSz-X?sJ8w5;oyDUTGF7II z{|syMUG+tQI}la%u!InPI|zo{#$q178a_JR_jH+BJqFOw6!ui=ANXfGGK-;`K>obZ zPaK5H%+%s`S%EKx{Z7ooF=MOZJRPleFK_O~j2HLLjYDgyz{b^WM~#J~l>6@wwo=OQ zJn?b$e4q+Sgaj0QiH_ACGHIy+s|u+Mz#Qbgrd*4ThC#6w*SmeWKL&lCMh&8ln2#X0 z4}`Lr7Qjou3-aB*R2k-B=LMVTk36nSw>7gJ5h$;;8;2=R{j#~?oXsnizt9;)9?3xF z&0c^A8qF4;ow=gZ{aSYVmcuJ4ne-j^i-SXzXw1L6i@3%zFXuCxo4~?_`Oi9cCIOzS z|DA}e^vq!OEJh9%`q{tau+r^C+9x?La;2QKj8&yD#8&)cvxA5vTAT+KMx&5fC@N!= zW+YG1Tg2}kvwb$6Z8_aCe*#;G-e(@Bev2FNI{L^SC_MgmLTr4t!H}*^G+<}yRVM3J_LkDiM5RM< zEA^=byVkD+d03X5V95<2$=aEBxZU75O527s&|}zP$eR2<8rj?~>KMFJhl{xpP*VYDGrn68xH6ajaEgQ(!Y1G>(ugu$#-hKE19dV8Hv`D$KU*?qgW z?18)Ur2OiV+WsErmt!JdXXC3I9g?jG;*lBz(fa@+aj{l;NOW^kQ&w&Q(+ADp78aXN z205c&8y7ltS9vA8PdY{`rMuax6>x-+ZOhzZrf(aqARD`qIL#ve#X z4(iRARTm39U?wMH+yV<%^6z2~3e+fnvO)e)DAf~Hl*)@H;Ya9*;zPW`89p2Br%J1< zBg|Qr*+?J$Jg3c9@SOU(E$fTR=umloX|_3hjj?oRZvRD7(9RHg9^@`Tbh$7Lk-qC*pIC>KrE#7(O zeLOFF%ayxouw4BzcF1D%|Fr;2Mh!i91lrowotqHJYu?$(ulDXXwoXo=VKSPwGjduX zq=2Ipn1Mt`8_xna0ki8z@JVs4+ia3dt(1z2%2q2^s%1anJGdJ#FW7A`_#JCD_nj(| zMW=N)$A-ywwJ(Y|`|LUNER_55veuqNi6l=1KRDAsIzuH++=vQ07ov84dgx(Mydy%P zLX;#n8^y>-)~BJIGDE%!#7dGDRaVBO@^AfEf3C0^KC%IW{U2wj@`$^9eHyT|OMWSRxm zPRDfRZ|~C-u{@dQ{%X6xzG+xI`-XKf`e5I9z0w~s^9`bN;3^G>bKBTQ&j$;|z!H)e zcWlk~8+eAaBou-W|4mr^Y=;^A)x)o4we^S48V)5uX+M+8q4FOe!B^GGrKlv{*Hd+h zl4bKC^xnE|2MZ@UzxJlGOPkEn09K{Y{@8=U26tqBvj1ezIsX$(lZb;`oCpYXB3Qs8K>O|;GfY1|)rELyn? zz{4+%t5LZu^FvRr@*h2f|7&TuAUSli#!5fL49`bGVBZs+9uy|dy(S!kH^?ePE^@RQ zTtNgo$2pWZSyI>4+b*tGy|`AVT!)Kygm6og-yYzMpQ%G7X;ft0(PvsmZQgQGMb{rr zrL3n&l)52X@nHJ|rIe(fiWPo>vcid8qdiPI34MTSu_`7m!U6;NpyDnsJ=giEsX+z0 zO*3rV@y^Ewr;S1w=^a7*NauQH-wdYUv~WeapoGv^8inoLOzuZ1216cggg%%-o-W*Y|n5)5v99{sn| zQ{CZI7UGz;=@l#L1-_z4Kt$AP50(wX0?ZbPb^LO12|{mMB(R{H01PGI!GZ*|XY^_e z#9KmjdigP}nBj%y>FL>(mH=NXg)kN!6Q7LiKe-Z)H;{;G4oUt@ySzoo2W-<;g(oS* z8MiN}+j~XHV_Mhcr?%Wi!!TZsaKNplHoEWN?of^DZwGxXQVR_hLY72}Iao*PeiD5% zG)}%)8n~MN+0&_NSIizb=%@DmQtg+)C{SAo-X435SxM-BqFNZ+ENjYn@pQP_*hiRq zo3fS0Lj9lAm!8Wqip0f4T$MTgWh%113Guaa)%1Zz{aU7j9~Y2cT>D7|7v+NVx9~jp{Ss(V)#+ngLak`Jn>FPY*&|0@hh4!P~oAUmqUY*u|fSW(?k)#!-IY z-81^}2}tv_{v|~I*Qsf!&e4qupb12^og0}3T(eLInD4aq`@fy&Layu_!NIx_o9q3& zbE71(Q5Jo>c4qUnfI*d;#&p`TJ|0hj%wbU$TZs(^@!N9 z8JmOYTdHJIv!px^z2yE$5}%&Qig!u?2n+-&l~FGjJ5$R<>k9ZdQQkp znC07|d}(EJ7S@xU#0g*K|&ro1!HBi=GyM0@8?6* zv}AC76bj$F9F|+NM>ra$|6~o{_osq^7IrPV6Qp|p^D(wyE~rEceS($xc|Ju+5tChe~k#4Q^j%R z&EFb63vO}GS#zxt6;S&Md2QV8w8_Ud>b!h$+QUq)!WxRoRK^7GM{s|^^oqscsCb%< z3w^%!q;e&yOoGnF!D_XHkK=BwVs1D6eZZHM1@TfgM4%FsQH6cxHO?DI>jczcLIMIe zg9ej31JT~`tztgQF-RhU#JD}&vL9dr$isJ>?IyVu{lQMZ3NL{)#? z&tAQX%rRp?NsFvwtPF`z_UF@9&iy$>87vLow`xId{yJ^AH>}EQhmf%pfjLlWF{}M! zibH)-EluUT5MyMeVnbmp(N~s-{2ltKgbWJHF^dnKA_q8Egz{A$uV+0)RJ3nHW!ZM7 z4vid(j7a_Yq5P*%6Q$rQhuZ@5-G_Nv==syU2tBfH_M%hg)xBhe7us?eSR_`bJ_1Op z!xW|MRo-U8HfwvUV1_>H3Ft;}yM3W^7vjKlNDwe;0(DKMm1eERnpfL6aAB1#(^>EX zJNre?bsq_G$dZ`P34sdCIAGLjr}`y|!_;y(Zee))ZkYz{rE5Iccg%Fr{dJ*aO?U8( zOTkH}$=XO_hmS$DGnKg8eQeKnL zU5|0|Ll?`)O*!A}&vfAY)jdJhxeL9!Ta+K7*Hp8}*1mYS%B`h$|Kzhf_P6Sw`51L` z^A-K5g%_2&UM3d3v|a9hNV_zoYsbe<6`V6eb&ON|(#0zvyy)nNlZQT~bYoBR;PXbC zuRrg83WZV!68gLZ&r!-DI?vybBxXQ6zrzh1m>?_E!UcOjwU1Bg1>fAL6kN@bK&$_J zomkhV*d^7@bS6VPw8~6 z{yS=7)WaurP$V19!OBVV$na>e_Gt9DWgX_UC4_(i zOoonj&{YXHg^{xcufc1X`0h4MA(F~8u%fFg{9H~c`2Ke61;7FD*3#e|w_m((wV$pb ztb2krJsmDe8gR8BhBx8#3GTO0Zok&n$$y`jAVj4~n2@X3UmqyeQ6(_wSaf6EO8-nx ze-j%m|HP(UMu3ljR7#Y}&xjw^{ZalK`#-Mq3PuhNuFZJ@zUG%sS%uHwE}I8miW8iR zTr;b)ye=LHwB_c`PW%}8GyyH|QPhlLn#93L9qhC`?a=6b{U&`73pHw*!P+7_Jh>!Y z{)a~RK{F)^b)&%>(&9D0ME!cN2In9sY#MX)#pNGG>*i;Yk~#^$t!)+F>6N8IbCyn=#Ieo|73W%IiX@nZU`Nq^^+$BhhU&FEI<+d|Bo6M6kay(Z zp)|fqu0xQH5iNIz`PjZ3T|!dgi>tG@>!!s6n7%lNa*%Q6wLH5ISb+^b4C4U65KMFo z=~F0G!XNNcKnxs}A;NUEHF_`G3$@2^rEdJNa9$Za*MTj|DLT$@P4dhQ`~xwTUGt$Y z|23Z-Z*u>le73>>b&eYb1$^9Uk^8YZc|U$IHCXt5Nf&T#WR4=0D!ryRXGO7tM2FKZ z*6CS^v_P@wP-6S(dwDE*`e0Neb=ZkVMJCQ>J|0G57l%2adwe!vBccBSs#ZwONNDsv zJ9ZHsQerQkd3H$pA3%hH^xU*0-1kus<-`SQ3Z$jOnfP{KX= zaiigu8+rELq{;K6HkRZcqi27L=D@6t)yJu+jm)6;{6ez<|4uc$Z+7(xhyMGZUolim z#h>em5)q;Z@&%`ixTR`EfB!PdfLPZNP57iO0Zhjt{-vgU4x$yr!EDmnyKiy#b_{lG z$`>If1$4>|=>Z4lkTCWrlBGC z66Y0^c;6iKy{pdC_IrEa({1t*%nSaZ+DA*b1QK5yl*)pYr0h}vEN(09Z&XpK22DoT&VbHIT{ z+N~5FRMMb?-UE6n96AQ1d}BAzhf;7{cmEG*>dEZluL7Y`XbnL5`C&oA(&z?Yn)eDE}p}P+%=r%8=ttu^&tbCJt72^5M7SnCUo@SfL7AGmBZPD2cscmLf}ohJzziBUuPV4@ zqgJQO11zCw0zR>nZ0WJ)5~)2q2Hx)V0$To_KxVb^x3{6*L8XU9%NY6wZ_&fQuVIwB znOl2!Uwr{~94J4H5TDp|aHH^y24yMPzxw!WRT(k57Md=&Z=z;G=MM6s)T!^MwqkOC zJva%2($?7c_$b0a_9Hl-FroCPVsE;d`bSMivzSC0$rv@!lIb+*R^eM@Ob${+p`0k2;NI?TE8L z^;BFgvJ5O%)Dm2mc76d$Q0Tp&%R?IuO1H@6l}{Kl_>K`S`sVoc$R zf4)0cBjW4k_r;a&Ze+Xm3wS#>;3{MJu~9+C{j(%X*VCe|woMUNljHL9MYZqKxVI94 zZjz*bcp6XWrjM;qo~0qN9i(>ZU^OB=^_-)aLq&;IRhgo}z>%d?lS@~M_O}u?E93b` zBsoy%hVZs|xfE@YPMInP2An!iGwE3Tj6tvSB%kVl=GZNqOAc#0A$W1)NFk4#?bibw zNpaNbuR`0}=Wly4@7&cV#yz=~YU~1%Q#31=fpa#+CbuNna`7#ubc!Mf8`vQYTppV9 zbOFcuI$ywUslmnPAbw%*;)b@iR_>)b&nK&kdiM{-wz_3h1-=8sgF<@7JmQ&7{B=(W z@?u}~k26=Eov>ucnEDoM>m2engpto;gNZR>GFHy8El3^ETmIX+OI_+-5b3JvzLNL) zGHk3E)s&wGrxL%?t0y9#J%e98bvH)H!mOrah2m%-+1W7xU7*r8(a}@<3aLL`9J1n( zc(LF&PsWW4TAj@`E`L!Xw#v&)*2*tV(r-E}2zr_zMML>LDWT(8#;}JjvCfke^R^5K zxVOxgFHFeTllg-DmVoH*&V|7&0WZE4<4K zNSwz|M1uuIwe!3v7cG5}k*rk=0D5$p-RniKW>UgtgQGCV#ethZAUznNl@r%bkG!hz zH%8-BOnDHeGbbwr`>KLkn8(2w?j^LYyw z2lyxdRuR6Oy@L}QR?dk!$^tJmyHs4hi@9BvHYnDtyNIgxrtsS<06OX(NuroW2t7#M z@wc4o#z8*bKQfz0D6OG1|XBOE8=f8}S`kFqp|p96uXeecB*+ zpLLAXbziyW<}Y6zSGv$>^+eF39CW|pemCt{dNROq<{I#IbWHszre`2>XZJBRW?k{Gjb`9Y}%YC(NSf zCcwVY03KtGy`S*jip^s1Y_C=UC$9`gU2=MQ`DFrP7^$Xgn~{_5UzXr|G@JJrUm4A{T`40k)Eu?1V}k-D*p zPi;cQkh~lm_;Ej^Q7)6j#zLU%KstTG)`Gn`Q$WF@WZ{zRDp#N zSiy|c4Qk#DmIAY<$6Dz_u8nZzHDPv&l4qB8Pw$E`nk^Odz0f)>`~&V(o0d-5)g?W7 zvh$4TSvhA6(k2A>_%MS&Jb>=V#Q{wzHQ5YM;Nr>vW~@b6x24|PTWgY#mWTmUoVR}J zN>flmExhlf^zWon2$iL5RqC1ac_b)}k3HP!^0y3MBoO}80qgF5`h1`)AWVe7-84JjR!*fcla&zD2p#i_HQ)gQ@9ZA$Z^#!TSzAyJ@`j;jC`XWw zzgAaMb1Rz;rIm&?Grp_1C1%b; z6pPgFIusd$j{gseAE{8$lSs7~H0)V$^TuQ65-r$YzOc>u`=p7Qq~HG5SYZk4Im^f# z3>6CrI|(~^rwxc`nY#%rPT2Npdo$?Df{v_~mS2zZb6SlRUf(-$;T81j6Gs;!QI{y# z(hrqz30WZ5^I${Q_}1dRs(&Jl=m!`gRgm5BnQ|}`Hw*-nVE|2#q2#-HZ8x-u-eEBI zf|U%C!h~Tb7+`N-A@E1?)=KMr@|Z!5CT>Z12>$n_|1?kpqiKAA3yRa?i1&~lwF*Cf^<}@Tt)8Wv;-_(t5QVJZUtsZjd;Fwyypt-m%&q3 zPC)<-VH_~>Ow}qfDwo0xWl)p)joyb&Kv2mWxG{G6bVIcw;a|p*ByJy+%(R*-cd79q#3axs$#(LLsqM&VoR29L4xb+DOK^ zl#`og^=xzx{b-I_f&KdFI)S%tMbFndMa$I}j0ZfO+j)x}>v!_6(YPr|tHi3O_Y_Ix zTRs)(xaY)u2tNN?&Ifl{U)pvi8~ux0Q~&2k+($0J*UV|Xg~YhQN*LSl6MC#5Hc)V5 zqzacBeZ`kc)>;sb#Z8YbT0Bb8dW+CctRd;~G}1382DkD{(nvhSPA*$m$L`hr9i!Yr z%S*8B&@vzWy;bwYdTeYQ7bDV*5=9zhfgRC74QQ7!&=ZTpGgAK>w>Zb5W>+Y8V)nPL zC!kqq=@E57B(RF#uC=V}4MqaS!5A;&c1=CHPvd1O;D@lXjssEefF@k8|Aa>fv{;y4 z$Mb%%2E5GOf0&|bOK8z)sbct5rK>&`#rUP%O)UIt40b7D?Wqe*&sE&Q zHXHiJm>O9%(a5Q9MHH}qsscOe9eqAikv!AC%+3N)uitSm$G(Z{v;Ca)yIW76M$)gf zyu@!}ZZ3QFz;oDbl}b$nQ(4(ke}n-AP#?>@pvB1i2oalAtdD=S%8c9RDn_iFa&XrZ zctb^<;J>G=s+S+F0ap*L9wnr*gg?)oD22?6_GiexWba1!qzXw!21I z7-#y1YBc!Hkv|;Q#h3)(7Pl?SUpYA9g5s@79e2Ta zAV9S72?<*H3=IuS8+0q4iAPHH3n=y?=h)Cw?I0#>Tbhc ziv9NfKh`9Yq-2uc)iJz-UkqO({jk_IMy+Ta~P6bIhvv35d8kW94m443W{NWLV;^F>)zWE5o#m8V|S9YF=2&vLqkWO zMTz)6d!$K+o}CjDooq#hhX-8l9-`ttooEmM6g_AM4(<8Pp;r-BV0suHwAR_MhAurO z_d7CViN{VMRcF9LaUwn)wyV7P-eI}wwN=T}qpY^%**$d=XwBlK4vpJ)j~KInGF5ME zoC6NecUr3PI{MAl*HSZsEN2N}q+`Skk_HX{vDu+|Y(RTRp(=xqf|06)i&q=L$h6(l zLrxU7@n^D_`K=>G^-*cI-G!|q0Z#}^ z;x8?(v~>I#Js6XM20F{A`xrL|5Ja`Pm(o{XsG;29|FFMKmZFr1=65gj?6WE&B6fX* zc3iN(z6W0r+%&lR*B@~gl?S>0R6j3D-9Nud7}gt1!QuS=k~!ErOqc70D2P(XV2o@fv)7^@-}vzTblDjor&MQHrMm* z-yT^Zr)8KEr)=?J3@bV&5$FDX3dLYAl_QNr2}#!iB1^(?ql?hNCuzKqC7;GXcR^Az z=+XP_HX+)Y&v(_`1m}E2)xS%@V(KEEkXiT(yqUGA5Uiy+%X( zW6N)Qw9vR@%MYxcVJ(0;BDs_`JY7sgM5zXQ6-QW!zy~_IU`v}Y>`v89Ix@Y)WG6p8 zZPOcZhfseVbhUitHCBlNTg(}0qS}PFF5r>6{UCLlifIG^GbH_1d z_XOX@_@~aUd=P|F|H9ISoa}cu-5lA_kQO z-=Mwm7bYQib{YeliV(%&wcod8uTQ(-Ml@tUM*jQ>IU#wB^+-TYE`jEbI`ht@HyGJ@hUpT+2-ZfuQ z{?FG~SmMUjI+D_V1i~VSEOV4p=n@!y^jNNGa5*?JV2(j8u&7p_A0=0vXK7x7>p3q8 z@(Yr_f?PsVgr_K_jxE;=@|^vSuU~GjXK#Yb{~dOgXn0i3kPnbD(T_~nn~5flO0P*D zP#Wxj(7^{9)w5Q6EOM^c)}z3>tz4@c8YgHPJbQD}<{I$yXGhd4Ge<`m1UjuQ3 z$#;&0RKz1)uEAg)riE{}F#Cf$6EmLy1EG&ehoWDp$>x7`MKRMU8gQ%EwuTdM`I|{g zf3xH+15ODGzG_vm!kihTk|}XZr+8bE7LzjRDa=VDICaavmXJc>wRNjEjvYN7P{$hu zwTnUA5&uJr{FVF<8?@xdzB^-Bczb=ACq(jLfg>eRMx@ngV?Q)>!Sm*@6HC8h_&5$RpW05&GK~I4|IyjLsNu+bRN93)r#r6l7*!PP>**CIf0fc{?Loz| zOht5Ia2()HM}cMjNRVHtwn#}&CBp@*Ljsvo48>xzTR{1fjAG4F+DsDJ>q;0-n5+y? zgy1pPP5NbjyF#qC9{Zv1ofI!zu}7qouMuU zrF5&6<@I_Z>y0vG#IeNUe&FRC6MFlQ_!6=De0YWp3VM0}$IZ9n7m9dmP&w`jQR9iJ zfxRR3ugqDZfDi9g*4|U|so-nTs+j|kKeojHo-$RYTTeEVGc<%>Rg>nIa72;&-H&g~ z>T!bCLf@brFX*SvH}LaW>fFsTG4YV<2<-ham4csCR9^ilQEn1El5vfBeBgwJr$3To zi`6GNn{7##w>`xR)cN(-J$vB0iAj;y_v4L8+qcIp8w-x12id8Hm6;VJ#%?`>WPAH) zCyUJKn{^EM|3@sV8vq!Mq|>_hd<)&4;&m|RE#?S@0-GTYDJ=t)SRC~NJEf@A&k&!; zq4&RshEs`9-et$r+Dc=d&eh->WL3_<{lz3^yWOk51USKqFI>-?lSWyEUg?(d29YTS z*1B%~E+~VKQK}S?hMxS;VAH78D-j!QHh{<+Py%%Z8<7v#Mznyd-DpHN^Ks$PVRHdau29&Lvhwmwu{XqO+<7?_7qqi&vvfLB zBcdzZ9xSgDsF_05qF+^pEm#kI!9GhfTWVx2oOT+yRgmGgzn{FnKuro_jO$c&Lox> ze9p1L#n$)71I(XB*p0c~B13~AU5;C2GC_vaqIuF*iuHrR&hHwQj93ljZcn1Hq9Pvs zqRF%Kxm4zU%ou#JCrK-0I>J2IYM}J6DRY z1ec9X)?N#InSSN2eRPYvg9Vqn#U-lQV+W<<`6>(Ve%i%n>)-`AESkM~g_ava3DZ6) zf3b8p_0=_YM*J6lZD1O6U4oC>i^{&NGC2?sn zI5-vLKD9gh)QDL?JUQN>rI__NWJ5xEUVnKrC-!-!&e9CY$}hi#`3}(}K)O5o96aSI z0c8Y%el=Ede9XftHIYDk`VEVlS^JwapG7Im^K_)bwQO>R9KrC9Hsn7D(6(fgjq7~F zk`86dz?|Z@sEM?eFEte!u6*vtcA;Gi$}I#wH1%Ps}r9Ic-N`Wc9K|hDFT(E?6uPmhG~v%4t0PzsDX=O z%b&OF)oKL!3~)(I8tsWPiL+?K*ThE65+Ww}$H&JlEN#O*p+I8-fNZ5RtzE>>O0_a_ zq!bbhaJ9AF*B^6EZ@8B_*STAR42gTg=Koae*#z3(!2j0kt=r^1Br>(zjg2b}EuB%# zv?kEH{NC6=2L3Hya32{q?A=1# zECp{>7y4~}hTD0N$T`*wRY@ON#{t1;R%HM4?wMA+Q`-z*^W_-=*_POmyen?R6Fgp} zSqR*im1sjV^?9m1DKlKvr>`%0J*W`5a<;549@svq|5s`1h?T<^S?s_UGKhMk3lrx~X=2c7g-I9J(nK_q=Id6S`3%hPCV z9KNIF6HJ1lmO?7e(?CaRJ)?yV`I0c&yIqy=Vg5BeVoEDf?f=nqjt!N)ZyVm(Zn81e zFWZyt-At1?*|s@NwvA~rcDBvQc1^bHS^pQ$SE#kuz3%He&*R_@{v?RhoEn&0asPoB z>kV?){`CcT9M?U$y*jXYvxC|XM)eTR+s!`?3;W;ePJ%1B#pNu0r%L&LE(4Y69ZWf* z`b8CC>PTuftoajH;(Ku>H~gOwqCv8y%vVK>O}0-9yyu>UllzrF+idW{#HfF%yte+0 z?LFM=2sTTm-gv$-A0>9Pc{)3>Z$8LYQ1`}c)c#?tgdI>wqcBrVEMLqQMU^0K=wT5t ztLVH1Z^6Wq7XmY+mNdwa7Dz!a8j-Zp!832o{lBFe17&g$d(cgmr=26=+}xN^dG^~# zN#*K$)>oAiLseGvHPg*kUJ>Fc!_ZHDX zf3~75HqCY%M6_+jY|+)>xnJ(qw4FASNv7kAqFS0NHl6X?!3zA?Ywh8(`r?p+&(=cM z+4AO#@VJnJ`OW4HiNE*yU24qJfDtGA7nZj55Fg%vLr)8cwuanDhX#J7+t3fsl%_VL z6$`G|!=&+lTjM`lemtYMwfQZM*(00Vy-44Ocpn}vF#Q^dh|-zxbKhN?`4-{BUq!66hIt0J;d?&q`Y)q(emPHm&k z`Q%0at>pWg)y-e7sT_e|w|c3-i#{S4=xLiq07zT7ct(W?4NUgq@???-(|ai5xZ&rm zJ`ECu7$FX+<#p1>or$2RR&jHZc>lWf}Yc(Lc5*=4XHI^UI2>$8)vXJ=a%i9kV4-&3MAp z=##`G&4*@a_~peA3+#AlvaLB**t&;jLp~19G=uvs2X(ee;g$@%D>Xq3cI7$MK-S+a0g(ZD-rL+krX$ zz7{Vhhjt=G4`}$t*Nqg|Y;>!!1iVXrO(}t;I!7rmtyxLPLni0rm_r{e#?biHNDYfh z(LlvvI4fCHjF}NK8eJ1sVLi$dST5|`(^*BDZN2+GX5w?bRM@mIBneYtr}On`usr9Ok2-mRSLm*U z_~Q}?**%APcuHsUIcd6N=+QHTfRQQ0GfK?88DO=>Fbh6jcm^q^xTClMO*RNDZ zqWeauIR|0tCjalUnc`+CjU0bHe6&VC&|$S>WoCKn*}I(HM2|u(+1nS8)qNT5YCCE7 zzxuAZU28m4)K|RI4LErJousA`!9pW3@GbK9>JI}RPSpA*rv0f_>XNsP@D-0)W#HO< z#f*QxBp}MMP7t=;J#sv-p8O3)Z7kM8sU?erh3DdnuhUaTeqc}QF2kR%ku@nm3~zx5 zz&KhvH*TvY)V^i7ZXr-WgQDll!{t|sa60xUvriJ_kG}mnFxj*t+u%zhmo;`aDF!nP z%F$PR`pPgrOjJN0iA3{z-D>W2jfy`ed|<$oiJ5t>_f<$aTY!>e2#Kd+(?hO&b)(kB z=IO*Jf5zDtkXp9*;(hqP&i?XkeY%$W<{VNkSmrSrt>X2u)c?4@`M7cx#C*5@Qt^4n z@!6aZ#xn&cO%@SprU@goR$6G57*xk55d4*lmBq@cafdY~I`zvTeR+hId=Pigw<#?Ha~p- z0kf&E#ng!9;!UnF&lgRTg}BjTKKYTOPC3;M{cuQ1bS-e1O^~l!$cW;(6hcTri{fe2 zWJ)~o7zRi81jf%lti4^{PP$59Ak)@3s{H&o-cpIx9H4GLNnLEMetgO%u4*|SxoAEg zwDvb&ZG@ywuWd&ia*Qh>e8w(_1p4i}%}M`Da8sAj z0LS7#H}5!kAR!Ojie^30F~ty}#!#`LZxobH*G1N|Gp#pTjVAVF5C-Lu=zeV8nPZ&z zx0xU4+D{=fW^uAKcNf+|jb%k{17z3WleYhmshg`p5}@T7wwqbpSJXI92R_=5ju$$8 z*$vv})cv+PJe`~>+-{F3E3|}L%9l~;%nlRnV^cnxuv)0kl(VXyzmL6&?*;)$mqA3Xt2#881CMG()s`f%Nc79D@;#1-MYqdYg z`#;r71vX;~Pgh31^#ubmfCDr0kOkk>d!Z?@puA{llA)S~pq2~GqZTs4a;fsUA^_XX zEgz{s-w#v#^M}!Rb{}!|C+GG-7`C}A- z3+8UCp>=*y5GJ-`Lfpj*TjS>9xZzSK4#iz2OyC+{nqHJSf)xz;?<7S9(YnCUI9WJ3 zCDnB7A96J**wQUFF7cH$P;FW^1`jhGuc0sG>tp162-HxPt>4U?UurGe`OF_Hz`9h09m2gPL*c2vC96X0^rGP;=o}DR8j)|Fj z*fB}7%MTnAgVyD`IU`*Qeh77rr|Y~L%gn7=FB9!*yWg$$AQGN6eJN*U`di)h{^#Sq z;_zebI{+)VwXO_Rx4vI{@U>!Lq4+m|duJTtNZ+tqtWC-2fcQ%9phZBpIHHsA_gbh* zou)PWYbPei>aP|E(h^9zzIm&llGOoa!`p4Mt&0Vh_z#iuGNRcIpZDPv4vGP?$>_Q` z)Px<5Wl9f+1R^jZDzo2RZ_=fsj5B3mq!oib4s)z3)3h^|qz>CF0*a0hZ5bO@0G(}1c>g*RkNg@_=~l}@4aBSCLKL^ zPE${L&m0)k6mZXt&}S&4%6*|JOAiY~1qB6===eBT9uKn|7UyN)`I7lF$KmdRY0C^;_aiaxShT>5w z;^+WJ=}-7R_OS`swfE>3Zk^{!Wu@-PX6X#Jwq8mZ+$0L5zz!=D3Ae6dl?=>0Upuxn& z%`HcFC^+sE9TiQlv3a_TE9F=uC?nC%a(rgurX2sGW}*!rFSY60$$oSd^{^UCN^0iU z>Te@gG?qN5R2&OI%e`ssB5iiXTq*H~@g%tft9Vk!k|vH%A_b1T>A7z4OM@ddscZ8m z2aCyL``a`MOEpcy1|*X*?f-oEv=+VO5Iq2gZ% z2@S0~zv=p=xe6K+Rl<&{L;%y>I{fGu)b{Juk9X!zLx9HqOo5TpdGjn*40cw!ewXh@ z6x?LY9-&EuY&V7vK!XttqJ&;?_ps_zbr4Zy_AaBKLNr5a6sM@i)J95{lSX%ns;zR3 zs0bG5dM|WOV-*P-v^eAf2%W+WhsOVDVz(rZYtI~P`?0Ra$kcY5_x^lscSn6>>lST>#FN&v z%yfX8)zDlMK`)mV9f+H7t^2^;S1FZJLO}3ay=iq{qg+Z{R(2Wx3M$QNo=Cg$v+m;V z$OsbF5IYb?fTJG^+&7as-FS2Oee;@3{FzQf&#AafCfMsuZpiO+PkzNe^b^_kWSLgy z&LEi=Dc4H$$0~sE-8@cx8KzDiOB!EQixPTq1j8m9dC<|i;asevN4-vmNamH zb8!Bmkps3*5rq-|?gW65JkZ`=BS`I~UPKXN(JE7Q$E+AX<#jdDB3YaNeaXQ zilfpOB+P8()Sx`kQMGAp91y)sylG!TTII-q4rG$m`rcoDr2)*qT(=L?wQ*AQOR$-VP3?~gp6%T8 zRqrFkjN+Os?E_tcLM>GTl@{$XiYezLWZHi&t@J68JZI%_PPkIIuszFvA+Qt``&qdU zLBwJ5v=`q~Tg!;F^vAw$bUf*@ybT@rR<9oUT=KGhv@~^`B^!8cpj34@m|0b;UklA2 zyRdNzN+^seXzFSPm;xL9Jpl0qd>jC}wjv08?zeMiQUL88oq|Vv>IqkCxobv66=D(;8{+*Z4|8A($ zr0Qc*SY>?J3V5C*-mj_o$t}%<{Emk=2A1zvyB@ONDvk3)Xr?5ST%cx&f=&-bHbpK? zM4;1#9rXa`4RR0_5ml4hiw3o3{%z@BVa3x^!4q)xKg@hU+E)_5%Xb@h%2-NuTC6OH#hXm zd~ct0u4Y)X{#uQ{45mL#vik0qV@ymkyU2QV>bLm?SN%m$v~}qIZ?k@dhzGTtS;sal z+O)8!FI2pi_3uHv^FXqo0e4I5HU2S@nx^LTp%hT&(vETQelOR5`NR8r%|_VovB(e) zFuN3etr;JO{Vax9NES6CJByoa1?Pwjz}tdAzJjLO%s{n^C-l7n3I5Z3JwL6<@p>vpL{Nw|YpjKy)q=>#Odadd#6o2)fj z>E>VQ2@RB(@(6x79d@VF?!U)5=op4vbq4KSHzBRR?K(`qD%t3NWR;4X9K?S5Dv;G^ zPXDj5Y!NMff2B2s5kv*_(WW@~w=M@DMC2cm)ITW7i z>+S}vobljCN~u*PFD!2eIht1Jr>6WqX?=gB)IH>0irQ=Rm zbhAv%()AkDlb+5QQHUtEm6(KF#W?JwxNBm94-xE$w`L`8?Wk9|`J_BtjAd^2Px9qt zrHD5+3S(ZF)v(wnra)5@Kskd=efu{5KMSyhV8KPS_e3TwEnVB*t{5ub4eS8aSnyFk z;i7DO@a${nZaz|R#Vw97@ z&+P03@_8yXzPl5Vx(NQ%(zVIZC^t7ZOW{*e|7!(<-$2wcLDhSPkvp8={G_Pw(U+&o zz15aTOvl>cv?z7a`LgPcCvX-;K$DgZ{H?jed^YKDaplTnPe=x} zfitJ)($T79q||(cT#J+cG7ggmGl(O=$&7<3)GcJ3Fa}R?Mc(9F+>)_Sce%3r<4*Yf zWr@jwn*HmG5t%z>-p7>4WzNGLTq2aqmuoNY=7k1gUW~vuy0_z*w;_WXue%l7F!lY% zFW0*DP!gG0Vkv<3k|Z3^O6xcM;)~2DL5PIK3a;lWG*%7RL;vfGXC@|xqRUj8f!-Ls;w?K>tI=~=HDMl+daCvh5{*kZJ=yq_+6oEFN z7PMx;CTsTDeDQ{UQM zA_pR+YE{y<087Ti=TrsLQP(hvOa7mnlX7ET9pH|GjIl31N5k>W+O8sR%eysmbERkj z!WVwoT~kVl(&PW~I7CKEKSk`5o4b$aHD$I5c zB(+w?PDf+nR|M0xIpyY8IZYUTn>EX)}IQ2Zd;Cuo_%~V8FPC3VY4r}|l<^7OlXHa8uXAXB<2RNWcwBzEz zdqMQU$zg^K3Nad(t(XWU1R76&|8c%<(c;BI%4YeeK(B0F-f!wN(DZH%x5cRd4Y)&> zoc>EGn1K_7Ee{6l=~^QWuP!?xt0JKdHsg zpC@1jm`dXgfnekr;%OL=2e5bO!xs1hnFbu;MG%>gob}Ah*m<>zU<9j|e>|M)_1^y^ z`tmqM=jqxZS*nvFZ<?ypEqq+duBRtv@zd~`1bxPC!Tpa~ zj))>!RC`kP*YHwn)vCT_7%v%dul2{lqlsTh&JAiehO^6<5f?{zbS8TR>tZG8%dPLj zm)9|g;J#FTvOZ0;#cvLzJpe>@6Q2SU0Q~Dn2L8svB8tn?IKo=R1=YVn zU`8H<2`-IV70zYpxl0*ZSJd#5AF!@68H9`uWV8_PJcn~iVa4NbINO3z{CW>ZTQ@ZbspajnUhbJdyZ$)k?%IX%e`fN;8G-40cO}x5NrYc zzXvf*6TiHjMH>kJ7)OyMGF6=m50z{}Qq)ZU_?{=(4j&Nm2G|aA*mKv{94KN;umBcB zIRRH3F{Urc+zb!kS1ELL?#@E|4VXu4estPyJZ=Xc4CKC_j_!B$B8x!fKASB@MW@JPF9z;(G9UT=T%8$O^QUY#)&nEslYPx4R*|LyT)RMmJw2U!X zqbq>Rmvg6tzv@=mdNY1J$aw#S&(%ETzHNzAYL73Wj!7nGpQc!H2}RC2nm%S&8-^0e zXlc)hU$hKNKt@#No44mZg~$O@qJ)sVX#D^XD);)zHfBxJn!8s|CT^D}B~?r~se7aDKy@ zD==eLmKc(r!%TmfFb2tED$ZPeh4YwW8k9!2qmXQ|<_U?MNHTEG{qNH+O!2sxjO4G= zE1H`(&xM4aW%9QQzCxe1+Pr-0(7!#<)EbW^RdpBY%SshF%J(ieUaUInsxzxQxYtI( z9YPx2M~(>4UxGoRnsQ|m5{l5Sgx-AkjS0)8TJ2n>8FJw%jwl8OHnPJ+fZvRB@;VD3 zvtgj2IpPjn3Xuat?E^GLT^~zjI5*XVM5OOdVlU}bGIV~9#oPA4 z9fu5t36Su!vQjBe7wwlQSo*3WZ(!G^DH5>!J;F)W*S=N zcL%bl@BwD^p+B#XteRF&y@JAI%8A3mtUrV!>q_}qvYeZAL| zS6N#xOZpJd>qaQGD;sOF`i^jcM#V{M(jkDJcLM~j^x zunudP;ZyKskDMZof{_W!lt~k20XYb&2hlX@hb^=2!ouNyIBm;?^tT_>4*GB)P)+_f zlP30nag~aDeEuaoohgR*8R5-M;#R7fpb)s>1JB-t1HO~*_Q{1yt|WGlRY^%;7_VFA zP&!xa)d}LaI&E z95CA!%ZGe!R5UzbL#=IZkOT!I4L3;tL9>F9xD4XpO~KyivTs>GyVP;hZ9Tgm(VoE` z_385;KOPsvxDx`lM5Pg?+MozLp(#$!90_@;aYX@@nG3;so=6F&B+;#(B zr|Bn)6$W?l<_1U6ewY4a9P9ZE_dN6W18T1^Wz^1_BiKW&Irh%hTVBW#eG*I|qSg3R zs1o$WYyv`2bEV3`%o50|DR-)XNQ-pwWq3z%H?&FU>6M@HgEJ&r@frPxpx#=|ac_3l zT{NqoTEnUyrW|n3(&TYS@{pvBPh&>HR+SHY5qI8_`3p7kpf++7l?=A&X`KH@#+VxU zapWZ)PZ@>_9~Y*ni7k#JIho;9H!4dTHSVm=Q8j@N?mW)y7~(GU+JFPGVeb}`xn=2E zBP4#)&1C*{V%KThsQc&bxmTRAYJLn8T~h!%W=_Qy7>gN2)0#=Q=o;Iiy0_^8weQGK zDgdb$7gWb2K`_w2hlzFcB;sBe**0^*lMyf4B93t;f0=BadKtf%OD=M1>=CVLSIqk7 z`+qpu`omSk-9*yB&r?W9QTs5fh}~4HcaQ*>uoVx`I+4H?a!2t92@6k*I);3WTs^}B zRAFrF>^;R`LU{%N^aU#hWkgVS(sJ4iXhQjF?6o&KUILF>(g!jZZ8jY6him8ExVs+n z3-5P?6<$-i8W_tyK52NMrt7i&M*I4Z5OVH9Y*SfV3?A|7lxdl%u^Fk8g6QtVTS;|3 z?7#iYH~!R6GcC}1lE7T3!?W1=@NBM8wXy{JF+rzH_>DZPPPKZy?cwrJ(3TlF6kBL> z==4=2^A$dotdp%cU8Xr)2|2#Rs9bkDXd`yd9pIJ(FPSOJ!@A;shAl*ggX>* zdGBgSxcqBl%j;A(l%#6lj!TM!&a;n#-==d?9zYaklbj$e0y4kW4>Y6_YvOl60>kp zao+#2uEKw2+q79;{*MY^S*$i2+XSO6<->|2me3jn$dM<2D97WFa1xRFeh|oSA*6$l zDD&S?aY(v9r-447f3y2fV{v}|Z2zoO$aIRldV-Dc5pBf2fHCu-9uPz{q?`+zpL86a z-ekR;3^WvyQnsO;R_p}Rw+zxAtOK>MDPM!3+R0kx3$cuE%m z2I1?={9=vO*8|!q;a$glPLbw6m5Cb$jzfR7!-}gf=mygd-T7j6gcO`toSx0-nHk2I zGNSPqX-71J>3CSV9R1Nw?_HAcmFrKH!K1=>(KBjl_xcUWjT9yW*%{QMq+M2{DZ;Xiwx4V!X;Ts-#-^NIT^G| z41$voydZ?G>0g0bVVGqJxD`i2M-FsaGCmvAwMM;aEF6%FonS}>fx5Rc-xES-vi@r8 z_A^NRusjUST+xd6d%PM#pYqa>1osGBr2q6DGr=yQ2U;X3l zuxwOJj1vRP)1W*IkZ9+zU8*_$e$n!=^=%aW*FiVDHlh9rBB<+%JuflS@a7=8v}uL; zB3q(q6%J9Cm;e^5)_kgkU5Hm?3bFz!pqI`t(=DIRgWL~lGqEt|Yn0z*yrQCC^|!h* z6^pm%N)t!}(PYMAzA0yYeJy}2)c@`~lm)pKKD1f&!gr)V&aYHgKab9BxheWodVBX) zq@x8Tpk%*lyE%cPqL`C3`<3{2g87gmcK)2LiHi-a0J4zU1!V2%Fqo+P$VG>rF~9ch zw30X+{*Qq*b9%XsoW!Ipv-91pp_hflQE9Hn&f_)(liU>94ayDG7??*&Oe+JJBNorZ ztK}E{P}g*eVVFYO;oDI*PiFDFk6~ky`tZ$`v^|(4EwzEZ+zRf_KgN{#PkC>4X8N&J zVQQmxH#+z2rYjB_83u-$1fCX%UPbn%MLUwfVhJ7^R+=7?gd52M3K-gah&1j1Ap4-C z6LPOl!joKpv|fuJije&w7F zC`#o}BSOOi+Kuh9!lCYsM8j^aU?BymYQa47N-cfg2~(3~tJlf>;!r0|>Tgcwqbglj zp4O|M2@Q`cP8(M1)C}+@G+@AY9BPLo=AJP{U#ae+YHJ-`+Vr?G(O?5h?0Df|_9}L@ zE5n$^LLU@4IqN&*{KNwyerJ|6w6}}bbJl+?N6XVDl}tb_n6a2b>0R%M;~wR&w{6|^ z+sB!EBlb7glxt{!)ue9a-MsFw|K!;%hUsY3dQ_xm2Jab=bweLXA}{~`IJCWa$AXE~ zyecg*+Wo^*nQ`ow5c`*QKOdXNT?J>(#pQib>)d>fQ@mEohl$wJm6x;;2rDfNQxOPh zhyEvnqVak38-#$El-imJK}@oxmTjS6t_s+*G<6vMsJX5UTUOUQ@pz**$FLKHaD9d# z-)%X#t|l+)KGDUB)LA#w){Sm>|4seQ4|sWtTjs42j)nKtaiwJe87$?r9c0NPoFfbyoM0hnbB6B?d}=_BFOHnu~H zL^pmnGn@`rZ>hPrOIdYDAW+uTb@i2aWsd-^AH~d0bhwz3$!`2tAMS?VNYk1O4rx_B&?+-Tl9_c zlGsA?0n^!hvOolEh^oV6A{eUZFH^{lXm~^+EMOa4J9e3|Jxt5gxucm6d|{AftD8_|F>5mBb|Sey>DKYM_;Nq7 zwrS&q%^_O8E(UZDn^vVt*FT$}YG{1-%{fdm=g)H9Bk99Eol_>(nac8cdR&^ef4?3Z z+=av}VKK>XaD^wYEkaQ3fnP7(bsp z9Q{1~jV@a}ITJ;RsEpEt>!sIdUK7nZ~c81YrAdT_B1*q&Tk2kct@sg@xs9e_T<| zD|MLLwX0NqHwZX|3KZo3E%4udH9gag+gIZW^9w>StLZewT1J%KQ z4T3cbRLTi-5102=a#6K$@@kkNB(N(OsHhHw`sU`$8X74-5x+!H$+t1cQO48I#`LDm z+BF)`QqgLh-{ty``yZXXy#PO3?Z@6!d$WtjtyiBDTldWtdx7b1<5N@4xH72M^vO71 z++LdvRrkyMsRc|Mdj*H|-P)9r2iyz8P?esm$ls5^Q`cc zl$8r1kH>y7(j?uiBv8+^b{qumyVW=3!iWNTV?b%bO#mBIQefzmQn=j{Z{SEM;>~Pw zSBT1MjOR(o+J5_*n~|pba1$$3^DF5q!2Vp&PTwcwzo38=(IYSS1^4{5g3!wu_d6@%{QUd^rvwgfk;;y{)?T{f znTw$gW3$f}xV|W(;7jdej4M@BsgTN*c^FwjX~`I6zC7GjCf8omXU4pqSB1yEg%6RXYqN)L(Z|ea+H%Hk*)>g&eQDhe+vpoLKVJ=3 zUQGDfZ@D0zA5<7IE8pU)ValxOQ#UEsu46UI1q%yiF>&9Ys2@Wn?!p(TyOdeq?amsKjC*E-liCM zrC4F424&;t`X5M5bw0XdoC#}|v$_v!seqA@gFtc&pAq9Q`+=^A+-JFI0mBPnb4z%2 z0@;MiNi3|bC8s3R%UAJ(?w6Y=d|GATYo=nmh+mOd-L3xv8N~8|1jqa z^$U?ab}JE_lYBVA!F}{m+uPel*y3Q!5a2x#0lE+-HiqV?mjlArLh;qRuv>`=;0yiVSYDL*j=s< zceR5b4C~cr2>>hPFdg%7rzUf@+{)1|x&$sc#G)hddz;GkM17{+RR&{ zlM6XMjDmm3(F5OcpTr2Lrinb&FoAMSvMdr(F$5Htb$7(2bEeGbTM!dq@P4gsqO-N< zAsgIK&{mQhRYmOk-PzITF#E%S7t$u3(JL-L0?2z>*X^nuf(W&Mq!AWY76enW|7czb zP9VS#>d?y87_;OGbwKUC=D-uwQXm^9&K zqJHYu8)2$v^84A4ZBzD|bJx{;o~fW!-Z)&cm5(xZc#=8%0xob|!UnSOv58h{poq%@ zwfKz8?85#1Pj!>MdvLVHvx(JG0v#)e7)~3B4~mWq+Z2dPo?)(e2;@Fd#CNCVeSL)n z6=;e@H;Hr~SuZ(m%0GX-aW2=E!B=%ubsP9ILk@Gw9!Lcnq9~?Q(NVv-w5gkyC0)3T zKfnu|Tx8lc(x*9HBJXD(+I|%8?}u{eP+s>MIy6TL)f+MnjE`qEKPKGl{#_D53&+3l zeZiGhW_*>1-ClAqc4uX&>il7BT&MddiT=zbFF2re9o+@fp=nNvK*}a+zn930i@1bs zpmH93oBOeIU~>PHZb87f8;!M1RuL6dwg)p+_rAhl-EHBZY3(`LUQYUGh;9)}Q07h= z1uy}m=UUOmf)iA$FK0yM0mpsg0v5Y-Uf;%Felf$c$Dp}8q_0b%YnvWEA z$31ngr$9kKClz1tH0uV8Eys|bbU=@4R2j-1hGJqEwaqk^2QdRNB^%Sy{x|>M!6E*z zXNhw8SbhE6Qmd~JzxmJ-ow=EgVBug?|6W2`S{sPBv(*R8>Q>!})$Zp~Xv-t;VQJ*o zayc1Du|-&*LEODGjM${Zth|$kqHbvQj{pxpRrSB*c(+!XWbwB3Fi1`xn|KP|Upx2C zF1=~b5|bg7y!B&aBfsUQOtTW)?;kETJkvfe2wejovxW38IatrR@rhf(7rw++%0BWvQam8}_wQ^=}&sV}&SJCVJz) zYHDTyOTWRRVMI9w0D>slU&01_?_u7h$Nzs8pr&Neif|lwe|;)3JRv>Q3WwD}{ubh< z9x*>Zxs!rs(&TXn-+e0UA%lI2q%7N*&|XhLC!{+#`pI@%LHoHu=&<@}lDf2iYJ#B) z8U(Tzet~ecned{?@YmEpRbWHK5fGqw+U36tUzs>pFE?0nBq4vr4MR5hy=(>4G-WZb z67ypUB7``RsBRk_UGj=(*n0SbX0Z?@!JOIkCf3dNn^%q`T7v7T+wqbJ>5 zIV>t`3F`!S3SHIyqlJ#+W7o3}o$0Q|{pPsn|1#Tv5P(3Y*+$R-5Vr7Hh06axXNQNS zBIJGq9r{8bvjT51{>|aCaIgXG+|%0XrK_gUmp_IGkb?pU42wScm3w9b(6(NR5!VTIUvf7Y-) z_S<-$LEjar`@sbea=kWUT(z)1#@KuHFdCsinUXM^P%T^oQqM0o(cUuU@x}d-pqhmY z>-qlxsyk)~rg%+U5VCsB3AbASE;ca0+3PT;{25HK#l*a%EggTDwU6e%EoI*E7(-0{ zx|A=IVjZaAavBwwn6v!FVFWgtyM5NueLR;;n8UwcU}{0zf?>NNlpD{o6sX^BWl6;2 z%gWRK(3+IDjEYsEK*sr;0FV;^cm+C)6;~z!0fA_-&~W*fZBDk%+IQr_*b0T~omuaP z2m5zl-_ktdPSlMzOc3vP8p@8t?eJJ1pO1H(0yb&CEtoAd;uRsAMYT0XhcQ69iBB_a z(Kx~{&A^cOaJma@#ELn_TIV-g?Or~d^j6tG&n>y19S2h?4QeJo%4Nv-`AUC83v)(| zV96k9pRvS{W$tUV-F!iMPpP*yV7W!8-js)tl98gtqJsRRW$ipaTb)|3-OUlakiksO zYdG&%LqM8}qCm`ploTAfZq+Yvbk}q&4%93-;SQbp*tdCZ3wvYT;SH5%E_kL&Z?t_Hlx3MiiP!A_%ens%;znyYohW58*t>$!hYVq z!-8%#b_(mW8mMl$3~Mta^T(j;B?qBXt=e4wIFFZ-ZEX6yVcVuhD@8mmKqI4<&F2pm z`qcQi14Nse0an(7jHE&gFVNfmi*2 zr`=XXa7sd~O7>PTf|*K9;pTdc>7Hi2&>m~oP&PLCWM^mR$GT;(XhT)7QY%}s{B?Mx z*-N$&!N%S5qJ6=!r39S-saZ9eV461MbMh<*Y0q=e2vZc95-?r;NsfdbDYAguQ~?1q zLK^(;b(kPxsq9^&=jT`P8$I{+w?~qZwBjgL`w~9(wtskdCz}Lh)o-2zqIl7Xn}he{ zI`?|l$|K56yHgzwLt{<$B8SnrPfNK^4Re(01T_!hn3Sk6Y@EFmq8TLs75{Rhk6$Jy z9h5h3rKX0PWZEI^99m2BLli{;ZRR{f@blnkQ*!|h))EqB7KNslrq z*ZX6CcTHUXf}s3pMwCL2eu3_P5AW*HMq-lUi2tHpa4E0@K*g5Q0RgxP?FgSdDS2#& zQqPnR3xs3O{2YvTyRYzbg$GmHU2>{A;axb8_d4&VncjU?u54o~oAGtOxc#tmV>i&R zG~g28(U=7qBZt7I5r-xacI6Creg%XWlre!)nLoEu-Q&1Yv?THvE@A`0WOAaVag%Kcsld)QziUHW&V_P!&V|1e;6l@i4|`Sj}^braXjd$ zAAqO`%2}Jkz!V#ft0(bsv3iz;V1K;C=UdEkhDz2*{y_SQSxZ?Uj;RIZ6zClDNlQ)g zz2TeF)QW2q{?OrNx&L74ILrcYXkPZ|x=y%z2BR%|O-WnDBqsnZ?4EbC!mG^#vy)JC zn$i7)x&IDC>53qq%W#1)6OJei;vgWZoCIzp>*uN~N@ct^%VL%TVwfNbz_2)z{9U)* z)1l^C<^_XJ^y3`I7eXgP2G4{Vh>B#iHIgv9 zAb0$GSQtL*A|+?*hRphk(M|voX_o882;fRKt}npMOb$%8SncK!0pE1NHsc#IWE;Hv zEq*TM1aN!8YHjPG49K(c@!-fH3Q=DOIy^9swD9o21)_|ftSe_MxJCpK%u%j4@=3mh zKBVweh}fP^zqeTFxPRogG1t|QwmX@_@Cw@~|7-ae^hiG*M{`C%SJ`wob~_*M`8Vvv z5P}JIz=TCCR4uZM!^Y`zA zQ0@1wNA@o#C*DNM>zN1%n>Qxu zLyU%VxJU)Qc<>G8v=I#F+?{0V^7^kAXGW>vejvZWmf7`JZS@=_}|JGseDulABe zGaJ{7(-r-T_>PFRn$^Tp$rgO-jB`d^xYjS^9T^+#};N=;G=AjPK%Z zRh7_9_c$e#3FTT#IoJed;P&tBE?@&X1SnCqYb!yF$&rXK(aLSXToYpA4#i+G5}70# zq$X`<0uvB?`vYQ7KmlKvD}4W!bYV<>KBdb_ItdX`o8bk{3vn%zFim*~=L4bt@-MV? zpN|o5ht4hhoX`Yn_7*#z*3Rj-Ug}sfmkDKW^U^t_`oD;zGz7oVBqFB;6@-MiV$3-A zr8x%xa);pq&XCT~p@s-u(JRE3c&shh>Sw)c>{YHWbf^E##fkUxY7@p%?MNT~J#8Pg z#NosQYaAveAf*)pXkFl9FucUh^wkrq-VM0Rf3fQ0Ch@p07Q)7retm3?^bsGcQu#D- zdRjl!pOS3J(rTJK2IsoKf7tH2+Q_+ao2_Gq1&zD`Z3sxAC;5{YX+e1#{hCnLq=f21 z%M{VW-WX<|4~69z_@;@VEajt}R7eCmHOn4uY8>-CYT5EMVQ3Mb68y@_=mQy*2P8+N(HZX+iz0?09$v5keihEWb z4$KZZ7mnRjxO5nlvosM)Vp)fGhYkS%nBAdS>b37nERV`~wekcrx5z5w}?#u*4Xw)v?BWUDQ`KHHv zXO#?I|MOS=qGTx~7e;9R zA5GWbR%!ROPj#|6ak6dOo;ca&q)C%)+qN~?ZfcrblR4SO_q^YA{hq&|_E~%HweNK! zhijD=M0=}4d?>t>@aJE_uAaWvaMN_}R^g5CPs@ke z{0@l9)TxTU`F!V^_i5gpVC`bL#-t#E;XDMuT+rZ7PMTi&D+*W#!vN6oQJh@ei zxM~Q=g&ICF9><-z`)EMWXsy6S*9{kMQj`d+T}@FTjg~F6npwQ+7eea!vr@ZkO3}aw zAi9yE1dOf%@OJNW(=%icR3~nRhPIAwrv|L6s$#OF>uKj&e=X@Z1l9?q*U5%Hj8l7K zcDtGWg54$1TvSfI$RR}O?R4tP>5HdFW$9Pd&Yshc%fXx1Cn(!*@jgC2)C5=emO zrzkBlYAH)3jlE@8NA}f5ky@OhQf!x+EmQxCn2a?9U2wh_oP96_c{l=dF{Y{)?yfx1 z&-*PX-|Hd5o-TsNnI|3TQ)%y2Y7qBdkX&k5f>I931qJ+dARMk1@iQPvSo1qQ`g^C_ zsz6u5iKknyDxn$}OhFfIY)Ldg14b8>0pc#ZZYaPq^vE8{I<_<=Jd=nrlJToi{c>(M z4W`u7nfAYYUtE(rFkSSsoqjfz%KtO;C=B>y;6~VcHw)eK6oCD4?9y@B0`qY%ZSnf+ zq3v<4jk#uj8!$W1kzn>5hp!}7va~$JAMMolTNoO$qGWakvO`p`oQgDls|t3Cf1T1t zJ>%z0z5D3>akP-%WZ=;Xhgb&1BuR1l7-jh0I3u^+wt2VCFY^U{T8s^|-GCmmaT)_o z{U;>fe78#PMgj^4Tt34LDRke4DD5vXXgfjnsO5`w?rs(iwpRjiaVG*AEjnY|%fMpj zF3fnGOPJ~!re$6nCS?pqSa9zXv(jbLg3?|q7}+rz}fMBUlC3kzycd^MvCtyt$A{i~WBI;h@~OqAvta>bjfS1?jH?(6 zgj@3+(K^++YQdP1tU8ZSZKm`2`V;qBjxv$T=+ULT^nRJc^3Q{-A17fShhgW)e#r0r z!vFRBdyl)qN-MOx(A&0m3-`SMd1%P#1lJg=(G=nUw1@3?Og~xn%DJ=Idrj!Xvc~Xt z0=S&9r>19MzY09;2;<{dp1-a!`yy-8E%ScM#7Bc?N|QV77RQp-`xz+6zo?T)5|08k z9R(TE1WFg=wHUwL5M^n2z>m8SbjTUeuPB?0&6Zv$D8Op zk%IN?>3-Zu+7dMo&&>HkZ_yIBJ2Ag+#UVS>6&x+{Ov`VCs5Z#vrR!?tR;wo=hDudh zwRK{Jva*8Iumsrn!~nCR?Tl=fsa%yB%`skBQ=~3S9$WNbR(M((B(h_Uwd8&11sIqu z!W`eNA!i}IwQq*>YOZG~mVex4XfJCz`D}?2dn|i6i97zd+jyVCU0zpZ#4ui1bLc3u ztX0`S1+^4@)6!RzY|8Q3-?D2BU4QWt&{dL;kA`WS5W_RMN=!3+2+L}#_8a8x@rpX; za0%u!qm0<$DJUGHooOt~e2o8-SWMzPO~#BsQ=vsC2@Z766#-ic?od$e3Mfr+{++VB z$;xVt{vibS13M5A0=GXa4k`_7pLc&clxNTE0l_@c_6{T0WXM z{Y>6^tv>?nJ??KDT`D4cvN{zOx3&4(NFxf}iFw)H@*84hWjriW<;0*fb` zH7n6nfmd%iMzsZTS8O+RL=Fsr{AI2T53>XWDML6T zdbSxCADsSHFe0|`pxE5Uj^Wu&-N)-00GI`ww5V~FZazfIfx>Y&Fc(TJe{tSt5;hl2 z=K5(@&6f9`T}h*Iz}Se_cb9pmssem*60!e03j8w)lBLkBhMcC>IZ8B}p#1?qGWdGS z>cx{I*VVD8WS6=8L%kN4Z_aOhY2S%FZ=W2NPgn@i^Ss~W;Xz)UrDgB11$BTg+&?Jd z^nFyn*L1_*RThO*j8-h96ybwm#{?^T^yF$BrHbI%`6> z!R`I80xyzvFT+bcH$D6p;h#QfnqdtkTM&`9V0BlN=cePS%JNvM?BQjznjr*@*aWrA zhnvO}j*WR+VAGJHNjnWqR_Xg~9oaRhGx~UVz!~(R%eDq?;SL~@iAO_z386678~9xN zt$^UW_H<0>sP*l-~EBdkk02YF$SNd!1i~fBx$qTy}c9qpndFF*G#XM0ME$eVcjD zu3MH1%d+pa^mVe9Po&6uI&oBB-fZe@SqyvVeQGg;QdEX-a4IJ=mQk)IUb*^PRrh=u z;N#78?q&5!wjctpxTTcimyB%)30%ceN80b>W}vX)NrF{|bm-0(eBmK6btkITP%_WHYl9!EYUu{gPq1_4OA z4&l4hPEA6Sn96NNi9h7!w}b~>GlV5WB8k8a05KkJbIAhy9v3;ufvpbfe9bI|yzH+6?%m-v%+AZ;eY@y&qPHa?jWqeAGsv$D7J-GZ14vo$ zwnTEW(Sze>ja3V-Rg44eNR4|A&wd&Z zRsWp3a({mI<||bbto-rj`o8t9<_Oz|ymXPzxHgTER8otARXE#_Fvr~ax)VoN*mTi( zV=zVop({PYw~ZhV4opNi6+lN1K6-QR?)H}u^Un!-0JAK6Q&Cc4OMX((GP$TcznpCk zqoS62m#`s+Cczy*3r-Q!!7&qQjQ^q}!*gBFJ8VF8DJ$h;&f(|_qN&!BQz zmhdG~6~v?Hod94FgkjgmeCL&LNSYKH^dy!nQ8MfV`6mPCE6b{d>tVl_6y_%CYdw}k zRlGnjK#<`%1o_LtQIRh5h6&6-_!p~^fF!_&4ALrK+Wu*CLa790waY=&&pcX0G;h8Y ziQFM=Lkc+HQOMAKDNH;`mTL9>02Vm$I{J;TQI%_5T~V8lX?-^iYtd&fz7~vw_cPbg zdJrIg`nqn-Q{CmUltgMQd$1g0qXAkME^)3FuaKZi*WAA@E9b#*GLcg2ND{a)T=@-e zuF|$-4j!Ix%__yg!9ly45{EYNXnO}QhF1Z@SJ2~}nwtR8Nmp(IeBV;fJ(}Nr z6YRg*QKkVIckEh>aEjUbJ*{$o?&>vHtEIs>=7zSV*tob!fys11zg~2Jq+cnq%M*GN z+pKxHA#Sa>;YlGIxUj(2hjb{=k;Ak@0dPvUS&+I~LI^+OZva%(4g2;7?(Rzs{?~=C z$`7Mw_dw75hUWJMsTiZ9ZC(J^QP{oR;^?tXO=UBf_V(*gNLgFw3vQZ-!jKV$1YpQm z+!9Ix39;8jP72*G!Tb>qTT z@22D8aY^_AGMJ9k(q%gc1-^tNXQkWnVSAi~L7zoHo!kP-B911Kg_jq;1gm3xBh1d% z7h;1QPC|~B#ak{hy?L=ZnT(b)kffO57g}h75ldp?Ku0={aQAMDqn~QDZC*bN?7^_Xjqym2 zU;#ozc+&FZp;N$le$2&jK@%1NjLymqA)SKHM$?u)7osy3PGUX_{6RP)e#P1HhW^d-lgS;V*bzA=52KK3m zbVyaYV9`G9Ofh&_rwTBPOR71VSf4lQ2_bF8wqVc-6q1%DIt*)=N^p@&)DM%^_lz0> zEQkTnjtxJeU5i7P%liLRa3Tw-YHJAFv`akV;&Auew z!%biZ->vyI@3kcW;b7D6G}V$E2#uXP`sBNP_)+9OeAo8lNxpGIreGjm07y_(!6N^S zFR20yA~X@!8O$xDD%1-BdsZ?8R}d*hB2Oq9@B$iA2_#Xl@@$FtH@vVW6)G)+W?SdI z?h^v#NmUpa9!-+K4!El~>I_;Z@Z_cG!;`1qw*HR`z}WWhaq!)9vudY|$q(giA%WbM zsN-YPmkh)IL7-jgro*;1=`J!kJ~<7G3}tMbkbF=)rzB*t$U4eY9ud9GXhGqsi zT~tnvjLaF(c{-_J0V$W-wg7d}ss`K#6mjH09~Lx3U?dqeDfrMc(uQ%dMD^}Z%6`Y0 z>lD*xvYQ-l{F!iuMqmPek$1dW#Z;W<_bWs0ll)cRH_G<+mO3x)q>npCzg?W+&t!@* zB(z)6WfV*eO{EVUqaayXq)-6CdUn5sP;VVOek;lGO*~{RIo29ac%xd;2A}Us_fH~^+{ywED0xmHzhS(9}!#Qsv$=t*H zb;|xLa~$3CE`#pL@7w>-1rB1L$&yBfuadNr>H>PS-H(z>uPD~OYn#4LjuLG->yUOoj}DgsizU^nox_8-8Hx zfjbtJ5bDQKe>++ui6}H+XGIr`mKxG*ETSp%Pn()+Rx!44=u^Q%+NMvoGJmEpxx;&( zvKHj!#Mj)gWXxcd0GrNn6{f9btVn?d1|IuWD0cR{ShQJl@j;CmNFZXFvWBwD9hiUu zt|bLa7`R4KSRt3Ew39CW8Je1!+O~=m;AB;^nj+N_a0$g9j=`ahS(3;>M4YrVdFqby zo|3ej)Q{8svfUI*lv%~NsXDiCpp|-lm-M;fgs(}KHbbaGTq}S3Tjh5^LK*nMyu_(pif`^TZb_X*im8Nnch~&)P;w(X{DBv;E zjjF_yMcDiEm<>y!pPM34MqMUFMuLMG!Gw!tM0JfT^AK7+<(iDTJTg4L!Zw6X+jLt` zDX2qJ#CmeEsVTx7bEfm6hni2j?Wfytcu~@K2|M2;Di7!1#;PD?=EfpL%+5zvn z&}bdod~l@fmR_rC4nN5IArHyl=i~X`DLch%0_#M+5t6j3gK-Qj4{Jsr%XmE)7n89% znTnz%CHnrr%;diQ{b=((kJIp@&xHZ>^J=8iX~n#*w4!BnwoM;w5P>a~ASMnjw2J7U zXOm@If7?5UI$6qV_%5&Az&au#p@9t+x#`MB>x!g^WbMa=LHBV(Dyek7%mpk^&`gJn zSU@1UDufnC7Jfg%$y7Jbxskh10B-6!#&+j%>{%H79 zY{n-;wzI&Nm5o8=ny&L2;Tv!Bwx9PvWLdI3Ohjb0_+5TMxS+sQp~nV*+snwKlu_J%Sd;2-0XrwLkAFG}^Kh zjzotuz_@UnLfdqhi?*F1i8HK*?n1J;>@os2Z#(3b%3BFgqJEoX{D_Y8c}4&6iiuj7 zo!8HVXW783S~^9#nTQkfVWx*gJh>TLdZej+T%fIUpsgxc)fv1vi~U5&O4ueIgSozs~$ ztAAx5*RoIR?tu>Pf7rWK|686-9_XWW(EAp5Eg1o9skIFO+KqaKo8#MXo;Pv+=7+N1 z+XDpzl?!EJ9MC#wo2E`*Wh}HKd8U$&1gB$EyVOq?+Uu4Fsz%zRSMdK?=%|fYE_W&x z#R@}ZKJMur6>j@CmC|d^Fd_;=LID+7e7cetCTG^TK?@l@BJjl-W(QW~heic0Lickk z>|W0ytM9gQo}lH2@_&m&{C-LBL{7X?0Q&ZJm+$?c7n)A^M@ZC|Tr@>bZWVvKA!3~B ze$da)c~kAH{hHTyW;_gBgUTcdt5i6JY5cvCB7a)E%A^b~XFz{j} z!$q=@qXo=F(9!{G(uxtfI)gUfHG9-ecArAOy@WikH}kjY9R$6bLg>G)-X2m*wpM`p ziJ;{yX3KsF^5Vw~gwI{;#BI`e>=L`B!NZO4i*LlQD2L}EY9f3qi~=-rUQ<_J-&~Ih zUj+L#vPT(Nvx)^`bXI~PTw2Ni)-KlrV)6*M6zu}f1CGd@y$X@A*r^SV#e%+ zBoRss6(gz{yYBd_MLgx-5+mW1k;#^YtEERV$IfF>4sl-ZMK4aj((-(m{kC}L;f`#d z!akmQwhpuj){<8C)1JoX{gTax>j(4d znUB3Nq3BW#EJ;yWa?cAh zHXa_F#YR`iCP_)Ifj%c;DY2}j{V_l5IZ_E6QuN8VK+5rIJM?#;XmQcBV=r)=&s} zoHngSr~kShMm#Fi&Hh(1ODBTD&9hxwjc(H@QhG(CoyVB~#(I@9^TK>H8e98($h@H- zD`Ll>8ZA{2P8%qym2C(XAz=v!H&Ku$dg~xkrO9?vPo{j@+71eHlQO-gptAw!S=33V zKX%4)9on92{#Dosu@8X?6D3R>GQPZKwSu=;wQrXq z5L>C1PJ)XrLV&5+lKuk(rxeEw!L6*DCVc{)lAYu*FL7bX*PiQ0-2+Q+;hV8R?^ymc z@);ymtob)769pOC0^arC)J-^Ol5-sDSRq_)iX&R(bjUD1W}dZlg{)GUIT-=rM%Fqh z(4@1HpB%j2OMg`fc^Ew;*uJ0E=>EF9C_H>s`SssE>e=)Z)VjlBU%EGAPtteVFR5Gc z+J+`x@3mbDW&W{!W3`%^Hhmi*7Wr*@pb=UkWyMOZZ8f|0+|o2&-POVO^P~erJUM zo{afoR#VsJGCm>qFN>dli2dXJQ{?t&@|5@E{f3!(gMFMxIa`K>d(q`PYo-L{ubj%K z$u_~q$`tz1P4E4bL!~5pG;xVs4Gv-9I3?{ud%?&`um}h4Evpb~K@=h)SVSYGx&;j# znREbGD)$ow-D-0{IGnk*%!zGi$4~F2e)1O-!k_P5{}lbIUW1cc=7?XiGA#A+ZGgkK zbJOv4#Pc-H`&{Q@bws&q2b=k0*rnCJ`#fOnB7OO8*%Zx^;(3S_4$m~73;_*W{+BOD za2aB8#4?LXw3Tk$)fMa6!wZ<<4l-EmKuu zbi?*1K&Qh6u+6P8C;tT&sN@a@WnO7TW&`rPup%0(C)H_f? zV~yD+(Qy4m3@-Y5r{akvg{Kp_>(X)iPs?@HI_o~FJQ_#{{#3>>knjp{W_BcnMhviN zXvumL+1O{e<7(tClQ_49VfQDJs5Bcf7w71`AAU&eAj3gvp=+qqwdm6401N5g#$`bCH@ zXy~37Dw^1t9Y6`Kwlc!2YhX)i$0LwJV3^unw7GBzd%;~NTPaGlod(hEKC@C8}= z1@m!m+~!>5^m;}_yx^Rs)>zi`9-DvtNGaVg&wIHoJ2mM|t*Fr8aeGakh2uHlD3|iy zQ$v9fnfDh1Ehl|5DwJ6aQ5bJBWyTjz(XiesU~?m}|55q7<8R&48}x15CW_Y!v9SC7 zf-%gN?Q-jx4&Tj`Pd%*nB{}q=y~MSG5+?s-m*?7q^u^o6`N~FNuh;sshNlW2C{#_( zFs3rIG@vCl9T`GSLV*lY!w6_M7Hjp3Zd_c(ZUVa;6Aqz=v9_~|N~QzlxGbx61g%G; zs0}=fJ{o4k)@rlw6fjdkYO~2TWZjYdPs<8TCrJ|GXCX&FoH%53riBhf+|5` z3e*R}gA7o|HdnD)b;x5>oOSSV<<=bS-|WHqip z5`hP+=OEC+LqsNHq$5{E>X_1uz-d4bh^PhEkykeErKnXgSH5hYt}AD+-aXT&{d(QH z>3qEP={6=|0V>G;?nXckHLsI&jx*G%)>!@irRQUn8;Hj6{+{DB7n4Uh7^0Qsgp{D3 zeB2QlZsfHO04w@h>7#pl6u^Dnb7fX7DpyELd2Jt6qU0|!$DxD6YraTFf<-w1J0gyH zR>QyE(59gD2~k3oj=Vk{R0t|H3Wg-OhR?>O;;}4(pfo9-($-!h8#d|W8m7Mrjk}m{ zQ_NQW0J1T-qwPJwm%W#dpA5ww2n`e`Q23FI(Z1TB;dZD_v6Lcjx~L~w5ICy^nq=T~AfNb~|+s73}@0K8mEP+i|+3tcR zCIScVKY**LL3xo?5)EPveE4P_3-DXc*WItb7^wI5I4_JPC7Xy&$%-P2lTI-=30n1-mAMdKko1?K<~(v`P84g!ZVZ0F~0FnjIpOm zRKf*_h%v-cQ>C5#_;HxTFFD6Kr$*057m15oL|&x2#K~yb0~r++rM|=&Stv5cHKr#; z>M?N*oXvaLL9CiJoJL$|vSurlbUzv7DbSnk2W54t^>}&plZWMV|F$^R@w*K7XtNgy zx0;h1ymg7+Mug@5(;&dd_u}$?dr(@2pNOo~W%OI9GQ7IC|77^88@KKr=Y1IvMiS9) z#Hm@qz<&GUbG>0&0Ua41NylEWbb{U_Du@1s(x?JTL_66Z0b3GU-{z)D7TQzA*mrif zAxAncCc5Skco0@mYh+C|%6_@_hpG26L13ZMA~CZQFftioO8C+^FK5kzw}zR9vnTy= zF6&c^_2R=g2-@1bJa-4&EAG0#aplk5s^E#@UL9wGD5_)`+S54*zUl}GUC-a2DWBUC zbeoy{aMh#8w}%Qx>Z;=fqo$eLqys^9j0{tQ=6E;ojVBkoOXMm&bp7Gk)*W z;M(J{J$CP-C%t_)Nyg-D;m73xcekUB*Rixi?-QcM%RNy!tbwG6WUh(=r>eqfwHjHV zOR5+gNJKILbM8-7*_ey{8qT5)+Xz`G2)fx`mj*o_VG#NNNAmlHV5=~5)22a-^B${e zqe3N!5?Y`EY!NX8m--ujx6l|fgM%(X%bc~|Cd#4mIQRV)7R7hn@J$(&(~ArLGsF*~ zjkk06t9IKw5}u$IU(|zFo+KJ-7y{NW&R(;e3v%ZqlKx99QRuB{zpdY>$XNGiNR zsacz~R&~vk(h{!JZ`0^XhVWL$I#XQEF(YeJ_`f7t9jnAR(s_c85I_G zvAN2I=yWg_y@nguef{GIo$?{pWm@|lP3`oHGi0n(0DdJSE3^ri?1Y`I#{83AWWoxK zx}<(;Y8w$mPGZ8aY}Zwhp;v74^HUo#KZGw4UyjiAc+a_DmsFrrAmK3$MVc%EEp?)t z0vW{MkC~g9-jlJ}B1fOc?Hq3aEhXDeh6Fa5N-A)ngGtau*SvtG2#hd_Cbea7tBgb< z&^mEtDR0@luwCPziGrM@rcS{dV~0W)ty>aL4V#uX`2G|p!TuPwhI+cr)wn!d!|YZ1 z)edMISGK4(^;E^9rg48MWoOsbdX3-sJy)jby_NNx=iOz*`6jQnLZA<}E0`jwYw|w7 z38Aw#GEg7=`6>ho5BIuAPz`+eECjC13VpoYA|@d%0dYnC#XC-h#_`VmyxMT{&0xQ` z+wJ5y3|UrE1YDLcQuSLT6pGy&@+Df4Woj0V(yS!Ez7Q@#F;%H19erEU?#K1-%iW`9 z;L1O_{p9CF1V~s6X+VEH53z5L$Peche-1Wlk7ny(Im9Hbx%(LBa|kMf4}3wT265 zWC#kcto$PP?{?CcmgLB_b8iiY6l|sqv+03rfhAc${Rv;-ekcM;t%}O;d$Fw&z7j8# ziezD+07ddR`79cktq_0r%adlsK1QpsA;R1$g7wZep@0!b%eM^6}q^NnxRs&BxS;A zAaUWf4h%(8*@I@~&&kOtsjO5gdqT9&44r5cS)gTgIZkF{zZRfABm@N-7X`JJCM2NO zoMeI)8&6F}cfFMe1-*_w%3t1h{cdMh+OrIiyv7*^!+e0+I$`Hbozpew&CaoC4Z!Kf z(tO`)se3#H7O@80YQ|ex9S26bBB3ZZWBGyL;uJ4e+wq?vsp$!&Ov(I!RiYgX^ z8$vbus((ZTynSYBc>V}3hoZcOwoP5HjJdWA90aW-3wvg12{wJIX~U+phK7vnR`uM5 zQGS(X-9VDE5GAVM?c*l%6yy8z!}rys(XVzxGu?g9X^}86|S9B#L-*1B{e$=Q)uG$RNX!*wT!hoK&zyG*SUO z=d$tf{Y&3}@*n@=98HlL*}lpKvS`tP75>gbg?-vhARi@Ot#^3l%i;`y6dPf)j)c4e zBNW52WV4ML3;~|3KZ_IWaZH7W%^ma($`BQZUkYD`42?ZDJ~)w}{2hOf3f;pLN=oOP zBTb2gHPrVtH2g}n%7zMB;FYfY zU1|;I&$N#4W#R^D!yA{10{vH1N$zqeo>PS%C_GwILlQ9x(Iy&@!iV2KM_mt1L%CmU zxSe)qE#`XeA`2@|W*3q3e%_M>Xm{|p2#USshuL{wK?eW*g)rA2TIrd8u5@XKu_8P<&vF#Euk+6<`v#8$ohE5vA zX$Ht0+rYpBIt;iGF}t4bh?>~4zH2vfalV}v(zj*1{JW`p+>JTRy-DSFcqTjVeDF2s zNH7zXFw2>(WGE=S6pDA$MMLj;D6Sl`1GZ%ht2JD%I`*{rghH~am_kB&xH`CBTEil? zxN-Mt@NQh~hFG`r`|yht9~UjWwz+aN=+Br4#TO&fZVc!~s?6Zj2n<@uJ~<1vaaLM8 z)T5E^&f6_MqZiLU#Wvx&s@ELrbcjcHRcNA3-jEkzKiWZB*5IsR$oU8=N>&wdsbdim zf!n@X6XWmOUze)0-ZL0=rx^ky3Y|N2jYRvUX|O_LsL=6|p7~gXdR+Zd0S}97fu$0I z6-X1YXqB4Dt?Cloxqtl4$h=t*BEM^-NOm$`F1#OaU{ML*f^0lJFCxt`=@gtt)KGU< z+8iEr$=}!{%Sj1vv4%pwS2)L$C3hQN+t}Be6>(-Rt5Fy`9Tl@xB}Tot-OZvH zxb40T&VPIiT;gx_VxqfxO**Y_ZWfyY-Y$hwi59e!DvFv-TS%0J#h(ni+H-Rat~Le% z_mz>fkEin_+D5HiGg=gKPN2(is1CQvJyhq0;;;|G-TmqfzI_qA>lyxgTFvE#3_}x| zzrnqF!JOCvBg8S!0hO5}EKAC${#DO&+qTV~|AqM^Iyya4y7Bh$rr*e;!RCYpK{wZK#iAH0Ck5BjvMhaCzZ%-cEIYt? zzpRd_5)!MZ0ci}v$&C*ViGYoj-Jsz23lHxMYnUbbpl4>fp6h=T(G zc-ik0A>JuCBxFI|?yH#myUDWUTzvN0>-MjPT?Z+fFPSN}OYdH458Ug14?aJvHc9tt z^SQui5VBx%4OJu+$>7K?kpCR>D-h?D+q0Giygc0QC-V`Ih2q_C60tPOev>5lQ;h}Z{rx|m~;k3;tE!`6r(A!l2QgVXi`#U>Inf=fNC^6k2Q?eymq#;++g}`nsibQ z{}u}HDXBI^g1M=mE>|ubadrEcl@xH>8hcZlOS(8ZXx1`o4+66mLll#c)EA^eI2xI- z5z>;zZ_7l-!=f|FAbgo$Mvo9Y>tHvUtA5>s?PdEr+M_f`*5}xW>T?AD_DKDCsKQQ_ z+EVxUNQ7WhR9zLfzLGSMa@SeA+xgl<`}@avE&u2Cv2X3~(d=KHF>N^P*HDf= zFU+sw9qiLxJE4A$>1!>!vW-;Isrz;@loz^{6LON6mfA2X1&iLtfIA1e60M5<5&%O! zwJ!7<0Y|bM9}$B5ifp9HR=4!pA_yFcCrA1HB1_TxKId_wqorztcUBfLwL(0mv*eZkiu4wg;JHPBNTVl&VH3Z#Gm_b|Gk!V z3iJb$NZ@DaVy$3tWqy{UFT6z@^X@)7_0-ic`d$%o15fPTA3X$9wv^v2RkQla*@S*3 z7qxl9huLnz?N8b4qu3FNaI6h-w=|L2z^LiE3&c)J3Bk^|-5 zG=d8$B(v z-E9viE7gRalq^Ox=@9PlOKJw5xwiFMYq(Pdbwv0V6|CcKY3invEz$1kBfG`;c}BmQp14S@WGFZ^S*LLinq)AuTFy2b5doQk%gJIM za+W7c3rC_sfb_!TtX~D-&waFQ3*8~(!hkl(h+mco%7r%zjm{y%(&=m9^`s~6ZQmm~_N?q{6{eAuN73bnz zG@}YhG&C%NN^E(eaiM^6bp7!Ik`|s3d5a_*ZlVwpZ;=KHw~CF8Pw{P7ebebhFfSv6 z_lmzt^Sisjw?AVi4m@oC9gsesye^b;|Afs$v2(7 z^E+_G*>6@&M_Vf(yGh_^AZ)z5^0 zm)J^4&PJA(n^zb4bUZ*cjuW3AO%vn%!M6S7eEq9y)#*cPuKPhNw%RULaQ&^ABb3M& z5LiR&B%kh5sLxypnV|9nf87B#s2>E%ue6CK*AP(^)7BsXDXtIjRZ*EX`-*6*$duvF zCMU-c3f*r_6LoI-J&ygQ-u&+R)S!P@GxGQ|7Y%g;AV?f`LNO@Gg_Xc z^65o8y_WBD2fvnTblML(LRK zm2VugPaWVt7)OV+pd^C9K$_RJy@cl8pJq-< zSq`>Ujf7x|&q+y1)=vF%Iqv6=I~(iL8{h9%4h31c8$MAK_dZLHh6=Y96kL2+>b0-p zUEvQ@pi)drnu|a6Ow0a&Iy7+ZUyBKL`P}m&K{go5K?^_vl{>E6tP_nA zbFEg#nNm{H&7bG@vega=4-O9jZNs%dnQw31E+!`MK*3VO3Tea`iieI4L5(cC|5cKq z_BO+$%k> zlY|oB5nMR1Q1e7+L^RZ(HGz!#>EETe<9Ca>40_>sr?Ge=^`sEzU=>FrGOa+gL z{0T(sBK_Jzn50!s9$5c{MYd2@Z2lxdz~iGxxWUf(G;L(VDz0)mdZ!hv zA}V`Fs9su~_ehVL<`=ndFDRe+E~}u%6q8JMRT0J~GF%3;KCX5Ly;}j?xIXV~+nV2@ zvz?~#D#7mhnx5J7#WPL+xim;wkoWuOC&%riFy+J+&rGe>=mgW@&Hzj3nwd%x|+mp9pf|FH2UfX^OgRU4jKA}^MJ5N;ia zADS6>b2?ALp?vzcyHL1X*r|W`Fk6sS#i~p#oy^_qbqF4pYcETNP9)V_-jqil28{(5 zsd?^SA8wGZAIKINKn0T%@wotVZc?(5fdR-$2Wd4qG<2Oz&M&gsse3+E0Q<)z`900C z^W;W4Zc4BB?(Z-DEIuPP!f591q7g-A*p27ILE^pNzuP8f4BX)@jZ?p-kFf$o_C@{g zPv&*)N7snH71rLm7o86d-d39sLvTz{v2th{=&CdoG?kS>9o7H~GS`7IS0WiSaij3^ z1_As@0y7#K394ka?6|fn+%00{yp|l#62ODwxX21qEADeRd2j}0!{;ua zw+;1)lWZHhd!gHCD?x)NQ!qrwu?c{J)8|~D2;@gBoEA3QuR2U=ETM$Dp-noD(C=YK>~Tv*a|RGK zkpF}BI74>-r|lgoJOzNSC5CV9$W%?7R420cmD8i4qngZ}M-zwoPf?b6olkDSkAHsN z@q#iRB$R{;jig?%u9T)Fs<`IAl21dAyfHU56^(CdR6}XYD0WE_h$AUW0;AqiYddj6 zXixA(lk&J#s!g|eml`Fj@>I^D179`uv&Xl%n1~OHU(XtT%N50gtKSQ4IED<;10kRx z;nBO$prIloXml`)rTn+Y?2?8=GRRU?i$fapIy-1KT}F+&cWSkfnqoHffB_Po>*O8t z&U#W-d{(yrtJ-WJFbK&FqOnw=O*89`La~7>Ebp#yY=4^OX3iu0sIk}OuF)3aq>Jj- zZX8LVDs*rMlQOKoz~;N@1M#85r>98SF2~hDEvY!(QFOAvDJ*e#c%b6OM{}KxgY$`V zhJ7eK{{IOJj8f8_mpuzzG!TXA8cElWyRe_vn!J}jG#+5{1WgAssF!9O(y*!h(~yg9 zfEA7~eA&M{^=hw)KddRo($8G}u@RcreNe*ecTyqfO@01!ox|gGO)+23XDh3wY7x|* zFI83vhY&*7*d-DfAqH0o!uCWV4iv*4@;45B2vEgnSrn5P(~0WO*91(TDn-s<_t;>G zC6#hzoG<$ZX1!P*lk5-cx+4@BB-Lg6L1Z9h5hGywZG|hk42Gd(i5S5}_=A>%iC6xU zOkB<OagUaSRR`sRUScIy&?$1PQF?8fn zk&FntVD*}o_gsE=1HGl757+b5UtjYYj3Z5PaW`9wC(LRjqtSPFcfEEVoz!zs{7d=? zwQL9_Xeoi|BEax-V^RyLcN7FhFtYH9bLB3vEBG-D0Mk}ZqOg9R1Kl&%bpJTT>EoT; z_4MeKNE(Isqp9cxb@PY0`|xR~_SmOZjE$R5gD1Se;1@~wu{Y*Vi0x9QFNplE$$W0I zl*?h`G16sb?RpY(QhKK6Bvtq7(X?~^|7g0(pg7uQ3j|GoV8PuXxI=JvU)Qj2sOAvlk)PoS%wFK`ISU9b)l)%JrgS>`I7ejgDd|RkMM5^>2{e z%&rt~kDF`!K2QEpz_{03qgQ{HivQ}(M4nP>Beytdm}s^%z|Cg!X7yyT&U4NaT!)WPV0IAQ{Z(`j8|Ub7Z4Dm;f<%Q(4f4D%&E4!V+jpV6ORhdsILvytOgr6x#wGj;V1hS>_VmM@n>J-0$3%7cr0*_-oHI?fpPgduF-gEw}SVbbQDeE15fQ#Mj}406WCGPZv&t#Qbk_A{yLbkwftE!II#JO(Ch8( zZR1y$?^%5`RCf`Qya#i`i{w{d*Nh;X4eaZBRcLr1`kY5BNvZzCiOxy-( zBdD2?39`oAE_m;M? z`%9fU-Y$}o<`{`4?|yvUaOR99;G+eKDDI}9sE|pYO^?MigqI8&Do#rp6Or_240(>kBI%gbs*b#<%@~&(EHPOeE0KHYxG3HQ9pxU|}_! z5+1%RVq}t794W~J87(+0PKr*Tq$n05WJ2DsCWVic*il=Zmy?L(t#Ftt_pp75dsx@~ zpno5=Emvfp13(FaovV?V(itEv;xJQ8kKrX@L7I=ym^~L&Yln_C(JGXsLR1C{T}l=) z{_N|S-dDNaM!UDnrEJH8N}XnQW>FOM2y!_Z)O;QmmY}j#Nb`&$l`{DP>d(c=D8j;; zspEsHY7}1G{16t1fr5YJ%VcEu`hq!X%E+ZUKN!9335zY=Qr!8$Yu=k@tE^Rxt+mJ9 z3sE8SjV2^0lEP@|QywUzuuu-N5U~vet#I(g2xj>}+Pbmv2$SKkG4_w>0EA$1%&6!V zV(U-UB`vpw8SFl zroQ^E=CDm>c!LogL>Hx8_`jHzsjq!xF7+H=0RO>v6HzKB&i_!r;O3a}x;mf%Rupzz zniK&#v;mWb!U8H;6srk$pdSU800?e3%2H5-pa9lmLw9#95Qt$)K8XwJX!9QZ6{tyxYa$9{|n&q4(YllBvH>J;luVH#g{wCe5elKdFDM z<3IoQ-OdS4aP#90T+_fnRzLmrJEwd1ch<&pjQ#6*ORo3sd;jBPQXKEt5A9B#yam-g zm=-ypSA}a@Ml?zP#{>@zW}zUxjtO(cwB2>({zN=6kaIZEZ>WUB5Nr?!1{M6DXJ5c~I~SXt54QH57p85l2TdXvrt-`P zE2ZMS0)nfpiZFrsaBy${QXgB1wrho=m|(HW%p7n0?Z7oZH6_R6xdYv5XJg2QzwN;@ zYgZR`o$1q_1b$A z3j;#83*P6N^fF;VqIc(ew0-vj!+8(XFJEk~@1dtF#y@g6mwoGgJ@jZZtldAH`|p3U zpL1)y|3f9f5GU{q4bRQ34ZtFk=Lv&XR3&4&6|ty(13_=^mt&pM zH@`TnDJZ!)V9s#s#kan?8tfcf-J%Fu(;-v_#eWTHnbq`te=gO#f9XZS zpMl5|i-c|oWd9-_Q(0gl8wuS^j-O70J5Zw~2g{L|R=h%~9-bawb^n9qS3~@+vr5O? zb!zr{^W(9?QWei7cv2doOArvsY>2yWJkj-B{)B7KkT35dL?9SBMLW?UhGB+bmmH>) zVA8`jk;O~2&Qjz57#-Nm)qGH?^Vz>94Y{NqYdcpXIo=fm@^kuqEWl` zuxwW=X{n*>Kp<2>pwCPWsbaud0%)3 zK=&DKQ{}y#rt$ykcHY(J#u9M7UYo!Kb&;FbVH|n$|LT2yRQC~cxFWT9pZw&RDkr&> zedX+w^O~an_FVT=vE=u*)V(re)*aXN;XZY+Uu9%d09vL%RlH1yX3u0JfmR@aUitU$ zkEd=@c^`HWGi4Ah`RD3}@!^C>;$nCsfb+tR8%YLp3r3R8FlS8}#=r!svKJsjnqIK! z`q^Q@y}ZnP16@Vo;SJ0jV5$KD_>jWTvMeTDv~8i1|AF>$zSR+rFJ_P?lOPc1INP%D;{H!y44!f+4xh zU77X!G=kk|D3c**$AxQL*$9b_&)jwTmYvP7hQf&C6!<*v(C-T0pZ1=jOc{2QLeWW* zh~CrE)Q1d)WFm>416P6E4Ql!ZaTXJL)JQ*&>vXQR|5KIT+tv?ps-?{YEYrJX1z%j? z5Kv>zwIh4;HMq!OO>~d@Z!BYv*|x$E1+h=0G`)s!HtkqWmDXd ztQN}O&`8qY4&RSw7E_Z{#cD|p>zY>iqegFwZIq}b3_|5cJQdfJ-Ue~(!g#O*ZKJu`u`rXcBQf@@7Ua~>( zu<;bxWIp||w$yudqTkfpU6%KJNOie4m!^@t-Kc|zr$+r+xY$@Zic2Q9n%IQdV+lY* zFWwvn5NPE&v%1CNSgi_}In=tc;R4i5{i5<5TgTex#$?lsQ0$5d>oeEyAcSn?04S^L z1f6vr`LsGaUB>IvwDS(zT{6sUs#!t}z65eeG@8PoU_*pr4iqv}CE}ev*$Caw+1VBr zgPFXhnpH6eD`m>lYw5)oKAY%O7tb)if%5?Wcqp+cDyL$^OW604JuVirVI=EJvCB@p z6b*%jPBkGUt7=q~DAp`ID4uegAW@eq%qF0id`?g%|8*vtceaRwuAELbRZfxx-#Vh0VP-;86PQjbe>21APwXN#aT{>f3?>AWd!pg^KxgXJ~^|b8I zqyH`D8{_8<0G$8X*x4@IbEWJe)5p}r9(NmEg92{i{Lm^vf1(}f=(*x3f;W@UxDLmI) z@H|@#8go0H`h~W1p#dpIyUGQgY7SxRgSpq!N`JqLp8w_KaD>03mEv@Yu*4WNXdFUR zFc^(A7>x#o1ufi0vCxDBa*>=0KgCFTkp@QkXR~rDp0YZ!yYBI^{>#~B>c^U`{{qZo zlp$~$OkVqmx>5-JU;VOI{}tDRvgkxjX=A`J5tJeUsCA(=D9KVZ?a91U^~C!}1v9+Y z*KQ;qTYJOLtLOetKY72Sd2T`ohclDRd?tmhY!sg3a9Av`)CMFEk@bsKhzWM$;gv0+ zrE?W(AUG0_YyLjXsD6j?rsZUSoklOP?GA!~RY@$LW;qrsdTWV&{`E)Cp1^uw&eHwC zjlx?{x(L;!Fs$n`%&EM_#G%g<0@!BN5CblfX+EHNT?{3Eydhk z!2ROPef=3&4DpiN+uFeI^|Y8`{!}pIL(BJa`i%)ZnoPK!{Qp{jYliA6RTUPHUOq7U zxyBFGoM;^M;UDqgmsmIge8f)E0JBCtfdzM zi^IhR$YlqSqe8kW6Uo~ajI$_`E#2P6{J1*1@c*zvdW0GL?|?k*VChR`WwjZ2{o8jq z3|LW-hs*9y?;F<(XBAb0hl@u=un9*5UZ$6WWN_;P!2@k~68oLgIr_a02a_GcimdtJ z%u2nRX&tp=FR7se1stv-q=m$aCwyM(ghuehl*PYX&}0((y1Htj#mP?3PlZ9VM=lVg zAXE%fA==2RZB&4dkOh)|kq_>mDg~tr%M|hoDp}{pOn7>I_S>o2IP70n$6THRt8sOY zQ*`~8s)>5Rn?6<)P-?F~uah=!U41-i7vGLVJhs+QrhZv>kI9Nr!X@FyjZo>mWvah% z)_L3o+w=H3y)hCg#EGvi)wYB4d_Lc~gto`gn#|ICx5cE#5-aGjEWgTi0vkj_vYz-f z2ZU`_RIw&QqvlDJ%O&=)l<}zvs>R@ zMq)PpasMjacpIh%FY;%C{p>X8lOl@o`?6J0$*5!kIJck`i4R7l0}GgOViz+_e8R^B zS=fIYEr8^`qO>}i$i5xVJz38jFTFcDfb|GsAd!%Tf=r-Wxl$(*_T-+X~v&epFF z0xwSzA0GA(muU()JTF(P#`C32KFw~@{P%x|#>4oVtq5u#Z+3e>a@GG7=UmZD$LN1y zBWC8OS=xoIdtO=UdOfYd>ba|3y?9Jb-kAW;RlMz(3&_22x+SF2djnb_qg|$4*%EEF z`FVCzh5;jf^)&8scvXx+L~PhpRKoE|4C9dULKP4fKmTGQT|@=|kus;i)Ym%N7c?Od zt6=EV+WDl*7OGf+UqKBs0v9B-KYww0Ta{T(*zD5yW6U+g|AV7BPwf_=BR)!(TA( z^|9)4E4-q2wL~nFB@1nujk1!=mREvoct5u*Jvxzd681O+b0cFy;bJWe<71?$En3fi z;-~B90utl2We8?3QX^9{Ejla2Ffyx5ttPsn%1Re=b3BkHDltri?z=%gg36#k#p*Yl~M;w{Is)>AGK?`sV@@+5seGDuUwOPP`(OLfFDci=Z z-=w}=`yaj)wxrc|cLJDmq}iRx_h0h8`b@3*S5WLvE;EBH$rzMqw0?Bw04HK{sSs$9 zzz9;BL=w@UD2MPtx;>erf5z-dxfuHm(XnP;PqFmLciOiX?@eE8dPcCA060zxPV;|~ zIF#_)OS|K{cw+cX$dzB>r=4_=vFJSD8D1)tAPFU*j0s0p(L$SwF%By$I_b?xd44sL z_hQeu)^P9Jw&C{PWo&(u9sf57LYWfo#A&`JYy$Dg6cd6T^UIk_C;Y~MhBGVAd_`rV zy>`R2Qe;AXSAPHm`yv{|d=!je@tu)Sw_l#J^k-OCo}bv(Ew$P_yu6Yi5YM-i_k2e1 zOrFHt;&lllA9J^h<&BECw*ZwyQ`p6sv-U4n-p7a&r;kM)Mm@TtouQP5(a4XBuBWN| zAL3;EtS-||cH|h+JFe~zm(!fUrf2)!lm3^U-Mxzb3Cb|+ za-I4R9U62@xH0*as*IQuWuLU3A%0aynTW2WTP$jMJvNw^Ro`>k^Yy;_BYHtNACpAH zo1vaUOOLTgz=+j*1X6yAkxoV=(fUhmf*x+H<~Yt)dgPJcy(aU6<+rTPPwNf~=@s`NZBo((LX4lf}pt9w9X!j%}aC+g*uk@xp* zN*EJ{vWKvJjW;L_33MlfnmkD`O#~r$?8QG z%sb)L(gM=Dm6~Cbf1A?sB4S0;cvr+`+i}*$g?WGI*zL>Ecsb2Uve-xow_p8JbloHlpMw^)`Ws0-2@@R zM%u<^-hg5^f7ncGUW6c)C@tRhs1R!7k$KBhp$_>2>l1L&&~|~zA3NXG;F~H2JM!0v z=Nr5=G^M(;M8R@YX5=wRh%eupV84?il9-WZ83fsr`(E9|`O2vs_}|QD#Bd^pEz~bH z39{h_=bxHj6sa@8e`a4a;?Gl2+9NJBmCk>lPP@qZOqwZIb_lS3W|L;Dre?UeFX_{z ziXe8IzDWz;{4G8kvlOI(C3@HalGqV+BQyGIs7hf#$Fx4LwZwkzx6H@Y?if_7vvI4y zdo>@19OvfmZ14X1XKZ%3Mg0spbEdb8Qb6j@T|@Fdw7^SK)lTz{g8Iz+#zS`TY`sX- zZr|`XHB{7BCXLr+<13<8!X9Tyj`mD_ukY63*>iT zTOv-!qfTV2sz5m!0V(5!8VJQ0h|U4HBnuGc=rYl2w#qSurnNlQXp1kx?Q^W0s#Q<8 z=bq1%{EtJ7wUn>=CjXtgc>lM$56TFp;awbiItc%3p1dqqOW453MsgOZ5HSO4FEw+- zkwM`tlVoyQylImUgT&k(m$N#wv9Eeuy;mJyz|-lZMJ3;;A(Z|z;ipmnj-pi4blKRn zBGJXI%S%aMTo3`jC{DJ%u?)$YK-*kN3w<%`)q6{drF3$drkyQ1`FNca_z;*qWl#+w zEj%(Q1c3@{`Ldm{6^5zD5l>D;&Ro7rOAVNGdE8$*+z-CLZ%fqau0CfspUs(jy ziaOwVJ>1L2g)TWRLw7sw5_VnqD%6VhtHW8V?Cxkp=%y0vRM(R2tOs^ddPZ56) zE5ft3ItSdAfh$N&@Yc1?GM)CrBx3P?Z;37N2~*D=w(X9i93>2x*x1(9GPh(dVs%h^Yb5_F^9Y{X~raWV8?J+a zFcb|T1HOz!2a)!0Vf;k;=P;9nEq>giX{+aA!M@Hl9 zs`pU?As~(EbxC{&~d$nlU)=0rv#5z8zUNpdjiMSHu~F4Og%|tXgoD8bEN@R zMl#0l%NgEIcQgB!L%D9ft0jdz!k&Xv?Zq5J(t+rX3P>1kaI>9NvY3>Zl7;RPd1a;% zIcZS1g%T!)Ff?jGg*AN@8V#k1C+x*1QMBv{U{80~1BBqTCS$_ zt%)YbPw{5#t2f)-UAVd&?>_TAOggjiWeOYSL&vjY_zK$L<2QH^rP}$}2B)XOwKu?$ zh`VZvyQ&mb(?a}dwH(brlo=o*9xiv|#wuc_&;Wuxm8C~-@RP_9hY=&2H8LVvHEi{G!7uPLC*{C-Xy*E z>yi3)Pvpu@u7CVvjUqZ)BT<%xv169BV-_}ubkVc}#LLNrs8Fm4)CQ!9=bPo7Sy?~y z^RTXW%M@xh-$0E1g6^%H8Tk&2w0K3#;$~(V*83hjC6nAn16Kdy%Sl7>r!|jVy=iI7 zPhe$KlAt!iN zyuP~c`<(-o_1&XSL>qoYFSE(CX&PpHK@?7(f5fTCQZ-%Q9^L)ecpT>3ESdHh0K9rn zg6O;J1vL`tjC_FuQ(#wf>#vFJ5m}OijDuP*nZ?V#Opu{ACC7 z5=lt}2COnAHl@Fl6esZDw#B{QH=QhJ0x{~mJOj%$DH?taO=uAMBtF+k_W4K6aXDv5 ze~n96e&q8I%;D(IIu?cgVTy3rS&N5_m69`R8I-0Y7BUE&TV&n*w|v6q@A`u04Z0d= z%hvQ?w#8c9#6|b512P<3*i!oq`e?*p1R(-5 zQUgV83~~SvxV??aoz>qi+qurLActg)2pbI9+Sb;xdiK|a=cg+&r#ZsBmWb;dH7nU5 zCNc2@0qk2KGTcdXYfr3suBRDcQSW_w7@>DFwRmr{zsIA;;`Y$WGj}G#!Ljgp-SM{u zo`HkZ1^*8?e=Cz~kUosp{&%6?duxqu?{}DM^i5Yd&#xYxeZ%bm%jXD+Qlnm+7LLEB zeM@{`4P}gQE9k#Ck@B=TI^A|}K2L34r!Crd-%ZPx@ish7QoPKoC>YwCtAD+}SJvFi zZjUxrj39BG^D>fAR^x7<&Fm=XcL+ccRS7Sqm6Sp;QsfA2|4<3`-isJJDjReSGH)Of1V!#8140hOrHej_+OuWmnjc!ox)a zCQVULK`_D^X2>p`d@GxqbF&sP!@FdUDD{rl1b`G4#^uV9^8{E61$=wT^s{Nm3p&OQ=R z%h9s&OX+ZBg@OMv5Cr*pv$rGm=bTFL7u+GynrYdvp=fRmBp}teD|SQmwN;ua<#WBy zt@9mNdQI^@?|%3u2I|?F%$O@0>ld;=xxP7gGS34j#y6yVpObk)Np{r%2BN_x(Nqf{>AgD zN9BuwH0{#S>>{!5KXzp@3=_>2)@y9=zir&+26!Vfv)T_x3nA$9;4z&sJY$p5vYl~_ zinE3=NT3m6edpzhNT8J=5=A2r041v>?w**?ol(Iw4t!Va;?n-_pV~ANpLzKCOUrUS z%-lRY9uu&4>xhV^a;>wP*QdOieuk~c2CZU`1Y5Iar_R`b}c__mZ3D92>ARW4eZA(9DAJ?DGhzuLCx5odJ|f$qIGuMg?~k=(E4dqRD$ zQyGu@3iHFmL+qS$;xhum%M}aJ0?X}ckW^&<3hqG^H%&e>G}EU^*hDlV_)AxSEkRro zPZa%UCSOFI-7xP}$KR}q0pl|#nY+K%T$9W18woUGC?e3TMV4Kav_SAEj36^DIZcSD zaA`IGG6+1OD{kaw_6i!JF!?;zCkIqB1u7?tWdPq7fg_7 zBL+@(I9I(DsSN5EC1o0vR8W~}dIn}IS*93$)~AZ9o9D0ZOA2-GrTV{tu3DW7z!D$m zIeeXCIn(%TYS&3L8Lh3EIBHVGgf?7|nHme3CLw5Ie~EF@|0Nhg2gPfjp2u)92)x{G z9^Xc`>2diV{I>Abz%(72DuhjnET=LHb%vS3`hq<$J_rz@jF`?b%;hby=}4N!ic2l2 zpr06I$jGrw_{jakin>cHCvG$)AwZ{^v#v`&f##X26piYsba;Nw0Q<&2l&lJxZ6(a9 zjM}}z_DnF&C{HcYZM9r5ttLennIpUPN&(O=t+dR*c7W5;C#9Bu9X;M>?ciDgZ(c%w zj^ZIAn#_}tyW2lj?u!y7BP&>VF%B-YCiQ#*iT$6{nF+nSUe>D^`u$06hqdj8y6th2 zn&>;yhzxrD0@x0lD!$5+q_Q4cC6ZZ*IC(A~9dz$hWBU#)YfpEb-PL(d(HG5b;iKOv z>#mmN^;9p_>dlQ^F;8JRGc~B4hNnw~GiS`SES)Ly>2KW*)5ub?!spY7VOv8g2ZbMq z#kSg|&OHwQb>LD>5QW<{Zpk1sQ@i-23h4d!s)G&16QKo#L^G91CtwRdQx=J7D(f!6 zlT^ZQ0SO~wXRcpD>J{q;wv|+4VC-xN=J`Vu>TIh&@&@j9B2Z#w3Qdr}ib@iH1S2H{ zl`Y7HF+?_SzQs^#aQsdst%`^sm$pkPOtn%fQ8Q=R6XMB+JHB7~`!taB9Q)8E5wKrL z97(kg3g(m z#&r6~r{_;&wFQ5c3K}H3WgVwrG%7!|6K9c96P*YeB&rg;(Eh}CH3(N8-AQnh=|}*4 zVzMYSw6aoPo8QrQMYZ~j1@aas1GA!}G1VGF+9+XTn~V$#E-jgEKR7DRMbsp4@LLgE z2AvuIDER&!`D52;Lr>|l-=P>D@Vda?!zS9Sb^n7xUjAG`gp;n`J4X6+i7J! z)UQX|vLmmP3h&y1c9UYG_?1N~!wSXi;_#gf(C+i5QiaVw2LSnff zY;+_z-#h-Gnv$X-GN8j-I1@Bd1mmxC2&Hl>Lns1KnM!V6$*OD=Bu0PD8i3aIi+K%$ zx`{IaNql9Hph?VZt1Yo~vMCNmrJ|rvI9kGBKm@80S(N8*)-<;)!R0cElOliK(=kJ{ zat%r!8PXJJBhzo6EL8UgiNA(Pj!Wf;!jcA(;h>YyhT5S0Rn5!`pI0G&@>#3ks`$OS@0WA9oGG-C_ueY=B`D1L;-KWrmX>Va}m3PoXQ zLO?;$w46QOSS7a}-*8Y$6fldOR`bRvKm>%8n%)Z%Yu3V%4wnORq6ulS5FnC4cZrtN zBzgfG&D1j#TWqzoBrBmZb04si*uPwkdZ*7$S9=L= zy?Y<>-p`3Xt{C2aGfrYaY&^B4U;iN!Q&d4e;1X#f+1+C{Q{SX&kZ(+EDT=Ccnd^y+C{^2MQ(o-pb&+9Sr^UKM) zU7Gow@Pk|HeuD&ILGYQbFxq6D2PbNVMZtAtelW=0p;; zL#LmN6Zqj6%%U2`DShzF0fGh`l4ub)$0|Xt+!)1j0~W`{yJP)}S68R#gF_N_?RWD7 z`HGT>(GfwPB;p}x1OL&eLMBQIlI{qmLSaPEi=l*wePT%xq(ft!#VDy3w(?e+u`~TE zaDF&TtuzZH+j~5;04BsbyEjH(H7J9jyvvN4u2fY7ZEf?TCotnyY`-%XfAv(oBb$Q3 zwkSS&6%2bOmrS7HvbY9i1V&OlWy@z0Gn3*5LyGoBR~;LB1wwe#P46Aihpg$G^Lw}f zC`!)oz<-s&;S#BMR;xeFG?7siRXBOD5iOLKwDu@gT1({1ib%xE;q7X*Ea%t`@4Uj9 zjVyDt0Es}Rs6l!}c)TbCh>6t*1EqoIB%Zv0?u(Unok7sxFP)J{giy_XXytf)WHU=i zRL#~`Zet{v3wDZGI@ZHG9#u60mmi-{M6P*9uCBODHQh8)hFG&WTix&Pu%YYm{=;Uc+ji^fv(zK9hCA3m zF`KuExiZ%L#&CDQ%S!vZ)a1cpDq&n)L;5sR&h(ZDF=eQ6QN{!{EM#(gVr97^TK}^{ zNU7!g3#R9Jxg9Q36O<_JM2>gbez;VAz%xp`ISxd8B@jLR=0~)9l`i^CEVqh0kU10s z$Z9(*y(A|s4-yU^ZN#6BM-warf>S{e@Q5PfzBZ_Aih639A$OM+m7OmVEc_a4DE(oa z@^OAuoTq2n1D_n&ilIp4VJS5%AS{Um5!;KU&>ARBk%-X-l0&$;_RAR}MCCmb#6rl~ zss>#_6RJ_^`TlR5L`!!A3ql_$zzC%JQQ`65$cCi;^WRTgo=!wB-o~uOxuMVTH9;1+ z4bFmS`-{!l63hwx)v{7Wv&Ge@q2Y8Wg)zxuM&wS7{yOGAR<+%S=KY-8R-Zx*d%YhV zm?l|H4Cshgerxn$i-;nE#8eoQ;6yYs3&UwuLB6YKs0G!uNE?iBFf|3sHle%|kmW3_ z5rDqyzb;s)x6byYV(!RF8VW>W98HJ$Mb8W!rLuDV$wwZ7#95wd4#6Z3e(C?U07zkE zFafQaZsfv}nONNau&qwSB~GlHJDZ9$a|h}Jt(4;x>(r%Buxz3ioXch`m4^T;OVNZ* zJ;##uQm%a?UES)x^M-4`Xh-nV_a(Pl-PJX|e?%9HdU@`{HlI)aDJ^3Rked8W$^I6@ zlnv1uU0eehLY*lZR8C2I{I`r2hprUKw1{M(S<$lF^jmZ*hCAn;hLx%mxf`+o(EM9h%&K|BruI)O(QXe~=%eUTs z_PX4-iHA&?bfjD9^4HdQ(kTy>F&;Grf@;id~*7KX-pX$!PXP zt69i5{PbEUrh%B0%X+L$PYgXMZZwtS*Wm+f{h|>|&R++nfYK14OanTWVVpti{y~Us zvnswn7R{w$62{aJP0_!^b(i+Kft(vaIT1Ak)rc?r6G*K?YuTuR0$>kz+JNsgx9zGR zM1?VsjOOa48^c^#3?vkY7NP*Fdc2tI?zSuvGD|%*RGtk$9e_08i9_2wUkA!a2u%_- zg$uWEuuqPRD26yIT@@RxU-CD8gyd-Yp-&`#aK|26aiV++3R%r<+|u3aoy48PE%CYU zwXw(66#(d^O(`JMUd=scynCX0UOGQ61ZWV6{2#u1Hg@)h<-nWcSdhA^SY~E8ouILL z1Gdm`jaUPvR&fwT1u9i)K2T~=NSfoV4>T2s#Nl9V3$}MV5WfzSBB)$c7Z#EJ!m<3=* z%0H*q;Og-cXn@Hl@LBQrxVQv0F~~b~*iH0WtsqfQ4Qdv$@Zk1*|8&@utAK#%z&EkL zQrnhMnY$hs2w*Kpw}dq6Vk4zgF&ev+p!>hMLh5CWQo0#aTia%xuT2@aD)2aSOsk$M zoKed*9JVW799eSqlja3EGg`2m|bPEGC$kpN`CTNrS02DTqsiX0y|c&63a0pPclE$D-+rqpWh|^3nm4#Q?*zl1ZU0g!+>cTo| z3rI(!phSyn9^gq7L8;Fl^$%tZ9j#!`Kd$RDH?f=biz^?5@BJe9KP-=j9c6@rGm9w_ z@-d_p=MSKvxP??5Fp8nj@)sj4khKcJ(Th2R1(nM&U{;I}5HOYlL&zhg2v#l8!R|I6 zz=qpldyg=%=Xq4HyDg`fVv1Qk!J=zp%hKZWV%uU{udBjR9}IO#ImSq(_LT!y{)IO_ z7AWdK6YM)4>zW3?yeYx(g1!+eo;%6Xi2nuiKT)eEypG2H5 zfpi+BT};EWGlV!z=(Sp6h#UFRmO;l{o?Nw&EeH=Ix}Hl}V6VGReDA+EJ#K0bH@9mc ze+>u_55k`CJV@iSiBfgbnWc5R_9hv2C7c%2Wf)FV&-;zIGf0RYhw*cDjJ>(3vY(RrFf({7)AKnRnkq`;Fp>PVtZUq@NjAd@Duzg8 zyM6oI`9_FbPzx-73;r($+!mKz?o&MR=*h|VX4~)aq+@K1%aE&Q2pe7}1hr~>m6gAz zrsP529NpaFI5|1F2;;c8mv7vW~V#3ap;S>+g4A9&`9e^EQ|B#a#)0fE?uu>Z1| z^>+R9gg1nZ7m4<4Th+|GQCvde%tBf`Vb^V~IbO+L#F_yma27;j9=Yna$$c{}FI3Nx zlVPNgca9w~tj~Ir3;ChcxSxD_>~*oE9z4y+AXo8^cjoW!(2-;`u%-Bt+o6$q=`Oxe zIW(CO$Wxj%t8|!2fjlPBfSI@qS}Gb-Q5p)qMQ*}Ux@{`60>iu>BCY7co8aNcy>FfJ zXM4Nag@?Dlqf)&1$k|}chl@?{Hq#+@Z?PS&p1y8@9qtecw(u`o!jkjUb|Mi)5Qy$v z|DBgrMVFl;CW)MRFkGh*g}iA6+PYU;yrCxx7iwEk0lcc zw>XCFTt_0eYRgK8IjwcKT20+$8-qW{Zdko=_4WPv<~K567{^U9NO7Q6ViLO>GUXN1 zQK>j24O(#U|7YCE4TAqBLz7t=!BAnZPEDPS94z08m%8)oR|kev{P2QVNiv$n@KdX! zb((hfUtZP_crxZ#vW}jxHQ>vKus@L-cJlRadno?u-tUwFwS>sZ-9)!qFSHQ2zYvsK zD$m{CDsQ2w`PO;n&NkD#b8<@4Ty1<|G{~h4803|!G#awRH)X4R{#JXxRDLWiyqK7z zWGOEwE!4RlGI0`|o1^dRmN_xQ>*exMb|G-cAVO#T*^H@(uKhDgBm@sH2J8gogqag6 z1vZNX%q3KnQ+9WL2^hs>If||W=Z`0?jotNxy}*sS0I}ZyxChezz9?_;*hBsC;xcaM zzxUe*)$3v0`-sneO50_yz~kn4&g&J?hr5Rv)>==?ZV#&rjpEfXTFfjdcZ?weOO$wh zNb(nMGL+AkKT%V*g__XgSyi8I>I8fr5406}cT34xo_BHUQ1iAvJ5Zk-g8IAf)@j?Uc@@Ip6is3A@ahaH$85E(dR zU>lwl4T2*J>A*8J!!Z|q@ubDA6YtlLmC_-mSesRG1wsL#r3a0=CFp?4NFKttHb{n6 z4Knp_(qk5@v0(#{X19je9$sF=-PzurC>9uOVHcciq%j&tV@?E)Ac5U$^dMi;(Zz$#$mV;hymo7 zVBKolR(&QVwP)vFl$1n2VyIzbXPggs&+yhx-NH#&Gy;fAJk92s$7z~s@d&~oZRZSf z&C{1{VPUQ=XMNAyI#o1Ht} zBm@NtC=X9VFwZ^eORn&3%5&KSAkfjyGIv(1+WKOyPwCLs9C@z5`V*G^OJez1)rHs7 ziQnyBa&JCUwh7TR^>{q%5L9|pfgnRVR@wd`Gv4;BO{yZw)=+goe@4P`G1O;iIcA~> zsRhsD!dUjJohFrD_k_2biw~~%;9fWN+l$MO*iP6jg-h0Dh)V;9|-sw$c6oE(ypkPf@85(5N&Y3KmUY)oO@ zx!)9CG+H%F_@R*EzxUhD!ywVNdQfh$XfgmXj*fCUlr#hW2r3m7)xR@0+7g3qO=p@~ z_T$oiHo1Th>>wwGa1d~uRUJbNM%yi#mRY6{9*B7V{D{kQ(2T?S6{Uy2dZtE0k(xcr zfi!H0AxoW$Qju2F&!!eZ_H|+@VF#%b>EXA$^@6N_D&ak7h3j3tzSaCWS zhfPF>ytLfT_eq6@jypI2DA{>>dgWGl*kdbJF(asHFGA{J&8tMiZBthQ_MGdCdF%SU zpEZiB5Mar4m`Wfht=hl#PeKNkHbY<6|EUg;Ml2w1AJ}R>)GPQSqq)$sd1_bB=Sj2V ztT@Vfd8zGn`>1`HyTo51@E)ntr=}{8dLAp@Q<&t1MhJmTmDWhTE4$d zp1<00R4p7GeIXvK3_=e3Uad~>H~Wx5BRum45$dobcVs}xcJA7NE1cY@nk$xUdRpF< zmvH&v`_x!9WS65%NX&t5M5Au{>2JSakY`l)Eu5;7!&hzo-p{UH#A+PRX zYyDT!)mE`3cWD|j@SuU=vMQYpqz#8Q{=IjzZq$fEF7=>fTG3w6nOl`-Zi7~hDk$a5 z?Z>2Lk8X{6yy&kYjHO_>2S-Q8vC>**By{0u>|ww;pKt4(t)Fe&v_V`_%}r&eZe5(+ zbE z9FtqT|)y9XtbR;B>!jFpYqD@rQ8VQRi&Uz z^8@axwWm{vw^FV*YBy0 z2g_Vrd7OO5Y^r(Jvv?a^^95HV#tAk*FQ>?%=eV_tuhbJRBOMhP$~$IF!wU=Fe$yk+ zm5>V|GWT`&O?vPmkM`Jnb)vCaNd@Wd9$!ZSeWt_}RA@jp>q&=NcmiPFEvd#PJMc6b z$B|plucRHsZqTd25$+qi4*`h3kw8m%M3MmF1IuA&0v`NBbv_2hI?o@L1F4iEuHDrm zU&F|N$8D9ZJPViYvVM~c+87>q04xUS{ey<=n~q>cho02{WdebbPS0?SCz`yx{1(IH zji@^b_-FBwE1!&`{9G|gwA@?}bg83JG%86bSQ{NeP+H0?D$AJWXFg4c#V%9f1<#(c z;z9}o0|PgHT=Tw_{1?a@-kbhlINVS&r?G&Lou42OYY9#nRaqfU6*kZl$eQ)K9%m*VQdCu1g`yPfFrmcPZ(e95Cn%fI_OX3pcEc_!9#LSt8eUye(Dy&P_Fp9` z`@fE^x*>|Ui!RI3-HR;U-LV4FAV>)=-3W-%h=c-5Bc0M+x*$j|EiGLtA|+kYu}Hr2 zd*=hp{4w*~d(ORQ&MEj+J$wHnHqq+R`Y^AlCP#|{VeB|ZPDPPh_gs++o;o~*Qs&8t z$QsbLXBEvU3WwI&J+?8ov-vdI4oTPV-OFwNa%|*um7hpbpl|WNj>LUg%Y2R5mp}9;IaIi#%@0}$u{1J&{)qh~8?h$kSNEHnSiD5(gOh;~ zn1qYN_yQD*C4^1SA-bU*LtUIa`O3Y6QK*24+0p`b|9waE-nG)_+A?SVYJH`I>MV~U zpBj|?o)`E|@XY#-{TiUOvMbKn^n2$IQoc)&xLM-C6R3VSrI!j<^vEX)j>AiK zi~tUj0>sZ9`#nee$lfBTL_~SQ=v7oL)rfoj7$EhzyavOBtYQ^a$gPEuwwPvu5g_NCf*(+oAxp{!%@|LcvUC? zC{^XU9DkvsV89`h_7Q62hO8Xt2c{-cx^DRZhq9?j~B% z6>rf>a3mdE-PD-SrD3<2BBTeR!k1l!aJJtCxuH{l zEU294?D5GM1tmhI(9TKlb?tfZAI7)sm_`9zSlZ>1YI zC0fZi%#$PRKX@NI^RYM|Bm}UIdgeRjx-^5kdsjf9iN-~?cppo9U+*w-aExrzd^~W{ zc;N=gE<^8}=9`A$_CDtA(mCn7PUx z)>gC7so;NgrEtksFO#X{dpT6%o0dX=cKe(@=fhY>_c&#)ZVW)^p}@Z+kV@&M%a^Qr_t=B?d(7`GPP>V`$c(`-&A;y*hp z6_+}pQY^|A`2g`HLfDSc$$dICma)Jx_bpSDHO{euYtth4Y~`IN{t{&^-eNo-ZgeEL zR-ma}fY<{r-mh$rr5~psB31$~rBtOWuIKB2Q6}@m5W&Y8P;0;ARgq9%E>)Z*bThSf zeRZmEJK~FTPugX_APMrll#h`8XI>Df5OlHC6?XJk^LE+l3kwS@1DEgA^iop# zp#146$&3=>fJ59jVvY6O+C?`48cCh7$`StWK001m&+Mycomvd^rAhW$u|BxJ=jDWm z3yucZ=xQdph1nOTQO-B@kDW^b@Y0Jnv%;A`sm|fVvPK%+vJ|2Y6o~mgHCo}!fgPiA zI)KUs$`XY2%KQNUp_XT9nnyrDXig5pMy{!^q=6QI3_;1$Rpj8sMhSshE}(u)zy*h~ z*hMQ$y=v3INkCP`5G8vKNKEYh{?H#g8mE^p_oGCE3=YGK zApc@j;~x}MUA>1kb3IxgqH>X9&}0LZO0b9HW9nR7ck$_1;E%Ci9I;_3Bf@6nK8}vJ zn({laIh^b|CiaRvF`bQCJaVr5tye95D_s5H(I*DINN{&C9YMH_8j?miqCr_~W``yA zsa2e=sg#*iSTAeT7WpVqEEShn01wZS1ZTjJDVRNPzMEO@N&Z^Z%ca%bzlST!cb?lz z8;gCxQOody2T0kQ{59_26FfgJulU2;rNrIFSs>u^-D-i_T~E9`Of0cNlF66-WH59EULv)(Z?$Eh;zH1EwFeu@~Woe zA2#yQ<#5|U*ZqbDMo+gXP+q70hff%aknQW@L5yQ0oHMSsaQ_0*wwOIY<_6N+>ZV6VLv0o;lag8feodwr^)ibhsyCVAhmRmp%;S>_Z*pb* z@qb3M1?WY$jsDu@!>0(EMN8T^D+?zlrv>JV2ZI!%s%N)=bS)0MwaK0rhgKWz&}tzn zpquz4zqgdm`W-F#eCtZ!O#+I;RAgJwNuK?^Gw62RaUb7WX>B@$V* z*6gAXv3E`|A3Hmz({~=Atow?I&^30-&VyL?*TOn9HN!I%huAw( z*@Q)VSc!*gIDC8fGg0kdAgsCl-^K5bn5Bik_ct;p=Jqd`I!;cAoR-f*GRW=hW*|A` z;VG$YbR(L-tC|HkMK{(D#P_(sOvmfTILsXk zHS1b`w1M$9^wombzLHJL6^#qaPbJXP(^C?U>jjDT9{W9;^{Lt;1j%oWN=yI)o>nwk z)rD=hb=6DCncV&?HWtXz(-5=CRtHKJl-=7*?s(AoyZ4<+mzgcl^sat7W;n{p!@GeH zY-N#UX3{rr-W-l_N^XUwQDWLUvICOw-slibf0?U-CzNcaq32v)*Uu++D}u_X5k7yE z>xfm7EhW zcwMm-aJw3J>gmo)ol?k1l=`D;&}D-~Y*MwNEhkHWfH)~#fXb!`O+1YNBeao2NsIj0 zCH~1na+&>qtw`#l?xYp2H}RH&PU95oA%r*E3YE1$qw@5-n}-%#xBdUoc~f9 z>YO{(^pq7>3+v#!9AnkatF*K!Dft0Uq%2ToH`IXR_p#D!V&g^S4=rBKZ2CxBwB$k- ztD z^R6lK)zcz+S52q0Vuy1D`yZHG_jo@PY8rsMvp$6sYcfit>+Rq6Ttw$h@new-d1I^H zESezvSlkx&e{m*iIy0jvXWP=z?HM^%S(_rDnLW#Y)JdPvCQ*EJo>sp6?sEHV)*9XQ z4;|(8%}p}%3Ta?SFG8qXzRkucG?b+2O-B@`tC*a>SOqDXEFMj^&E-8cn6jrJGLdU# zcv5YUcBSqwVhseLFA}Y8QnmriAW_4$2Cu{8*uUel>;d!r0ruU@y|ypl*xu!Yeg!%> zqUpE3-wO_z-1>=ninpj$78GPZOBk8T4_?AEZ``R26)NN zv_qzNd{b={Mb%}*NFbl=s%@Ur(7j!RKd1+3`N0W1jZsSqs&10L6a!JiyISVvGt)XhpI)C&UEN{IijS^jcook~REtBd2A-mNv;i zorZsO?IStcA|rxEbWB_z(p`h@hJ}g|TrWcza77j6Hu0~0@UMSS7_1qy& z-4{0?5P6uUs?xKF#4q0{up*#vV(jd4b$qNf5x$JL^MEi<=;eGT?xwT)43IdUrLHpH z*ecVdIQv;2K{K=ZuLgyB;mAV5$*sL+=VB;HLLNHcUre|1y2DnN0ABJpkv_M$kyi<8+oGcF~ukriZnD?z_8%4B+o%D zy{yH!La@S9nT9VZvgr`0$KTAIS$IcJ zKekr8aofCL9Y}6g5@RFg5GBS|T3zaR3r)~ya0O(p_~N~eZ9i5#6yuWHau|184Q71h zU}VvVGEbxoPH2xS9>NGuIAu_{gYU;vtutpP-bmb(GXg#KW;E3w!1y)#oJ1;P>w ze1)i3@mODxDRh-h!u55AYDhJYk=hVCYWvf2pl{yPv$WtbMS}g;ZM7YA|J}&ImdANJ z*mn%WJ1Fb}@2WEnJB*}d&{}GxT$7ra98?svy@mZH6v*7zbu1P+MWI;TOgiB?@Zxi} zs!5iLIwiGYa}k{S6c}7J9mH!CzcsZ{^-QwgJ{vk{2yL zd*J)lrO7-^Es89eJiHY(^MrkZ;6SA!sjAPO71tvbSK&@C9)ain<{nVK*$f8RF> zb;O;7{7z9{AAuL5UO|g&<-WMeF8r zCpeEk8mlj}fKiuweibk_n_*X8goYWqt?;s9gI#<4es^K+UNO*N**6t0$2>GE5Bh~=qR@xE+)!kztB5wc3O?o66%m^s zH4-{hTmEL{?jSK+-TH&YwkYT92AM6mz1m{%%AIFHc!Ee!sKQ*TT|Tp+1d|_N{MDaUXtv+g7+XquqX+7P=jZWcgQD6q#GqgMgN#Tg z+RGh-@(G{7U-Z3nU$3435~R+``s-1ijfZAD2_SmLVX<+G@k=6KBv+V&7+MLr&BCc9 z<{RpUj7v%F)V_L6KsrS7THHJP)7QnZn2q)R2Lx)8+m=)(=b90BVk2#WoyYaYoevwJ z^Vyv3<%<_YSIt4I%(Q`690%C|vASFPZ|`Uu%gowi*!!6m0woMg3K>6vEy@bQK_4I^muGd7C_uB5-qCD>m zrDuDY`TGy_W?*^~59Qx^M7D$_qZWgGm`nTqSmk=fBJtk2__Cs zaTZs%>bHM%RBv2rD})cFijs9FR$7(PM8rygt;hLAoEnHEzI z73;3M7V|cHjmyxdpT;-2cNHKle>0srNJiEcOQw5z^X2n?5dLwpjWFolq{M#f-h8Wb z7*;GMXjaN-mV}jpTu;jUuiG0`ww4do=XC=31X_NJU5AQ;XH1+~?j3T?Gck=aV|!iA zS%er{uZf%QiE`n9r=~_#4z076j6D2w(alN1aPj+t!J*$xM#JJ{y^8kXrX=+ya&&ub zOEqrQoS?;*`*d5z3yfS!ADI*$Z5@mJ@q-Yi=}C>9Up>FhI#};sCeyk0)ax}T*>YZt zT=@AS{x@1{h+gs|xE`#M49V_=#Jom|RJ3VwiA-9=-pycn<8XwM(qv6#%!*R?8JKA6 zrgp1k^4C2}n!({|wG)D8M@^%|KYdFNeU@Tj^)`OJDgQ^D5|iT(?=2-8-?*!T#QVsg zJ6Uenb)UN*;_9b0meF7v?>(ut<^NxsWGwT)7rmv zvaD{^VEh|%)7AysRy?D|s&yonHjK{<8m2Vfg2N}U-aHIt5f#gv81J!ja~l?W`edII zTsO+AEE2(1LZMkycw|&Ui$7;ag{Q@*8_VMsJ`!L23u1rVGl$TbYIQ-dM@HM)X>0E7 z792{3AlF%~?rJA;Me{a&Q0)&ho`9)HpL-ijF-q#cf;Ao6ec_ z5q=FO@=p%j9k$A3U7-)(KZ%j)b1Rw~=Tk2C3IM z@XIPxXtyn2MCfBxgF-I?91*^-5F-ff*LJ9ihoZ!0T`nnv*4O;+Cg`I;Fj6UWO0zS6yYL&X>)zKA+yAZY0f*#{ihSCcoS?vk^@XL$5Q^uX8@V}xN@Gn~GyEZ|tW zYIaemQrTCqvPU@ObCHK1q8E`a-^i7oDEF0e?G(U&T6_k*=?HU%j8 z4A~epqvPq)Xm?Y8Kl2xN;-MbZQ6flncMFhzd&F>cVSS~WYhk^X7`#gLA8WHV{QrlK zN2zdbxa^KN*L=5(2^_!QBtw2O^F(!JaYBB2$Jga~X0uiQb}2)}rSeMXPDI2-d?d{3 z(nm}+S8G#N;w{p zj61C+!jP+E=ONP|Gb3P*m&8ItKH9H_!z(C&3&lx&i=f@l?^QDJs37FPjungw)&I)! zQnbNapJ=v71XM`Q=)p#as|p4AV&)c7acE*Rzc?&?fF*q}l+6$$7Sf;yMb?t98#IW6 zu~l2bM8vI|1jsE|wn?L@3HUh(H3>XQAkYTwE7B4UI+vY1Bpd&0@t$zDlF%t{EO4no z<`V`Sy^oJMaLK|M!nD|)Khu;vTTNe9aQ6w!uAR$6$!0H|Z&m{|Dz7<_~lN<%h9N>dhZxKyiRrAo%|t63S@U{s*sYz!jScu=KF~g zyqOMfV)Q{D*q%Sm&ICQlg+i<7*`3Cpe;oCGlk6B?geI`#Wdp}SBwD5#o{tlO#t1*) z+I-5E@YPT9{8Y?^x6v<C99i zNAs9K4;xd|-p_9L7B7Ju;#3y(7$UfvKPB={b9qN`)(9*4$gTYfrp--{sFicow#bA~ zmAnC_uAR1BtWEnFEj(f852I>mkdEaDCp9DRpn=eTVAd!VTz@32jCk*5ogfJbeLvLR zS0(iQfg=VM9lc6hWLxzkZxny9aIQpGB$|m+S!JehjJ;Zy-D8u+(mZN*>#)fmUr+s;P9yN{|xiKt2Y?qelv12S#T%w=wI#O>aVKT0siB$85d~G zUy2%|iRfQ;VbTpF*6z||PVFwz+J=LHqIE*FRgPIsY0xo!4(_n$4qRh|3$`I{YCU54 z!Yw_fp)3y;fS^rUbZ#9EJ4b_zB&f-YAIoLUZ-x zoCNtoJ;p5i{l>6v52%%Z&w^N=gpG_<#2w=YU9ii9^)3?4pHhCys_S& zUm@wXp^gNUJjQ9N5wFwTY$1E5-O%zcNG&xKrmaSyJSksZSAWcVt=d_O$W-u=%3taa zVtS1?W;PMV(ywlLVN5#8w%3oun%K*g>SVV@3b&Ztsfo9`JE`3jw&(XO+o+wh}G4U^)H|Dzb-J| z^(eO zC81DnZ*P8YVSX2+9aK<4LINrv1QinEyJYaW`#O7A`S3Zrv;1=LhYw}AyEPKw>Va@^ zX8PsR>YW zxVYQ9xc;?)e_7%$_}>gK)AyfEe5_pm6IomP|E4=R{mVAoJyg6d6Y*zK|0Sk>EZ}bF z>k5bJ!`)pxk=Ae(FSxS@%kND5%8R7Bla(D@3+`;^VJ`y_6Zv0&3Bu-o&+8%)mmaKs zNg)Ff{G0!40Y}eY(?-sS%aDZrhD`s)WFWVNp#NlL_8*~N5=g=jK5$12J&kiNgC{wRL~xZ5A2KZcHo-*wN#^jm#NE9*bR za7DVf|T&55!owXx_^_9d*%tYpo#;j~B zv8M^QTI0aQBnwBRXIr(20>dAoi{nBSUl>-`(V>6%ELJ%f$sSaU^08}CqbFM1(9R2? z9bp_M$i}|3*1kvFwVeLEKSUQoTE}V`pg;5ax+sFaIx4p+xQY<+bUmQI`1Gi|6Wr6Y z(wV=rIuP(9#fReCD@4@#oYTwD8!V_++&tWs!U%;|CqD-@>q?8_H!u3L9-1MIUU?GI z@+PpVkW>`;7H7s6MPF>GgPoy)Jv!@exmb^l^JxfA*+ zMH{2$RZy*Wwr2lrUVofwOM8N261BO@w+Ml&nwdKQ5K;cRaDdcwS^%KYQ&(0n^hxi# z=k0H#vM(oG*Obfvp?#V?^W8X^TKTQzQIykLXt^gjIdy&%XY!{}6&2$!72HHi92{yx zTpT@^yk8OnC^$4RWnpo2e6u%wnvuVhFgTR;+Y@ftRkko&(q;0I))sqrf;h)eS@uhBCl2>ug2!73gzb)EZ~j# zxik_dk}|`msao6Xl;ByYHA6yG%C|G&(f%WTtKN3}y4x)}-bvi?+Lp>&uD3{~Q*zea zQrsElua#Kn($_kA8=2Q(WX*3(p0(sY8XWNxyMd!wFsUo)wJ{{ir`==>S-7s4!+~7F zW)k;SsdFbijCC6Ii#1rgTRZF9Dt67_Ww?U*n1O_yg7URSk{+rUJ2k`S@c@_^_21JnJs_f2Po0()!UTn8ZcgOHGqNTTcY3vKC|VyW%$w2 zOSw!$!oy0VvG8%~S#jCeu=Vj0MBCLs0Hh53Z|* zOk@^= z)SA4u(t>Ct3f&qK8<-`gl)M;yRj3qQ%6aPCwT)4iK3Z&pmjAqIqfR-~a3X2`8FIT` z-ql_eoZXYneRC8_Cxx8}KJJcRJ(+3Io*#$X!ugZnE1-Uvi8p@hr%h5`Q+aw0lTQXJ z9KX~w@|S*RDA@>f-tTzIty#%>mO$1!B61X7ZfEOw=4Mx2Ei1ITh%SVp48yH*Z-Z8KZ#=(wKa91LxguFnpLB5*{^%N!E>B)uzL>SO>(ky@o{nO34xN- zK`xaXTr2eqPy0Vo=TM%YP84F8# zO$b;$#<95LV_B%8VnKWsLt=r9pY{DW<=8mQ58-UOFRH6!641F5B zOe_ZT4rjszuaK0|4g2+(w5{#tFSTwDFlydASwvxaCb&iB-m(?@%#jYJ))NC;+xYmf z+Y?dBxs+@KObag}ma?c~}6A~C+(qHR#xQn&JoVD(gWnoSfZ#g?KxL-WknsWX3rLm^d7$FqK-BXN;6`E!!#T6DndDJs z!ZhQH;RhEpy{`G}+v3)lWSw9_g-Rh|mrS{%WZM!b0Fd$c*4-$+o2ij+Z|*&1KowYJ zCHcBwR(j`a%wESN{tr3BlQQ1nI93h$VS9|wz4OtDJs!~0+f82YSX;s}=f#bvlPEWC z)x7Vok-e_V8>eDjwHtchJ}sGxXE)h>U~Ts!TKA+x+j=ADO<;?>@6Om2=eN(Jy!nQc zwW6s*L%IVBoZ%|gOAahkQ}^w@98?UD<|wX6C6e7U>XJxalQ~?X3=&Vhpl7pOKh0^5 ziHYIrY%ruN=K5A0xK7HUzxwoD!R!8pM-x}0 zsMaG4-hTh)*P2};cyfe#(9H7c^Kfp>(liORDxuC7Ie2v0xyZDJ2Iqp!VJ3-c%ym^b zhg{aZiNWb#*E7(&Vm zo+qbrTWs%V_fr8g_WCS6KF?+tMwD}3XQmx4Y}gr#+PefSP7dF0+L;)&D6ij6_e67J zXbG>*0bBhWNh}~VuVy5tbi1BF#2S~92gdVQ-8*iY_rAK+V%;(=p_()6263;J$%C;y z!#fbG7)jUcU?CNGJ zJ%10ky2z2$X6S#V8Y)i}@+7lTjC!5NH~zB+3&;3@F?TV3?%=|7N$cC7Ccy*Orf2xT zA-432_};hZ<{k4N%q6Z*5RC&D4lt7l5Wt(ZG=8EShXCsv1;*5|a%TS7b7k$zNorryL@)(CLTqTo@;ZMs z?-c;|^pT4)tLSX%cl36pA2o$eC=FpP^M_g|;f~$+6_OMOk`F?`iDdFPit-s!>QVa4 zp@0S_fP$}dnUA}HY6cgUgXe2wTuSdJz2<6a`(`$M<)KT~oyOOW^R6hnZbu0%zc>m9z~klHfclB-3|+Y012$kRbMpj2+p1ZfvBYX+b6U|bNGBAx)W zV;&DDptb%W;cy+##%vBK$LFMy&#%NbRHD^Cy3zOc_Da6SUACDqhedUxI8nmky*nsj zl3r^7^`QX(0nd4_%%`7D6m~UT*pY$2C?FI7IwL_>Y2?9dxcRo<`XR9HmqeVnhQ@5o zuf*NDSQ5e4aB&P@!HllD@+vaaW3WoHnB&{+;;zOA=7Y3k@`NBR9FRP$GsG=|iR=|< zW734`BLm`BN@+;J4&EHR^^0MIenAUhN7sDUjmfP=Hu zN;Du_B7q0*W$6@0wg(Fag2t{>=>b@JvTQR&lyIgt%0AK_nNK3)^M>_DgEXbS-Hwbo|Dgm0h>-3>;|BRH!^}; z%nE9>U2)Ld-h9tS#MGl6uMM>Xw#INF6jF7Hw1NTTQt*t<n zw`)4_U4uL>FseP&~3_#h7oU>ugQ6GN9+SNKv!dj$ie=t+C%?^iI z$GzKVjNSw@%K9UOQXStt_WmX_w%3fN!_M8`@cZx*|0%>m7Q0tceo+?V`C#`Vk5@C! zPYZ=5m@(f?;_U2gBXZa6p+D5eRMFi^wSY<<_{+d+?vQ<`|C$ffQve^V54^vyX&mdD zbr(Nl9UHj+-sPSWF7)^s5UPW-ya#s;^;l_uyEF+Q6>Kc^C?5+Hk1{mad8gO^(0 z!@@TVKT>#&e`%<9b)OyJ*+_RAGms&F%*mi#Trhjfl|JzE+a~=E_zlD7?6_y!9I{#M zjnyV!Dh{~f_P)Dw^~t#jF8I{zTfe(%Q%OZ+iQ>Hb;Z8r9K!VC(L4zQNgMIxTj^XrB^=P)s~%N={rZe zlY}Yb4aWEWzT-C1HQ&U{yhIjBi1BJjAG~a2@%3nj@|2`5`cB}n=I!}RfIXt1DLQW<9G!qPYeru@Q_icO?j z;qEc`zG$7x^)u^;-@;>@<&$&Up6c5AT(wDi#yl~ZI6SggFdS-w4VBT%*VZ~1TjiD zzcbXiNH5byzIkHECTp`QhI`m|DWEk>L0!I!kJ8sP^dD5CIZyWHaVaC*+Dh1To9sLzJqz1uZSb`Rkv zb0On8nks0#ugNbKeXn`6O}&NpOgUtxzsVb`6hWF11LOEc#yVw*BWeB zgy%oRX>*#FG7U{X?N3=$bwLaDG`~HCEm|&s8$Ts;RlXN|7XQFvT`C+Ey^$J`L@i1w zPT8oXez)Yb7fN`?dq8gJe)YU1FS&5HbX@QnVdSS6()Pfcvg}%^L?POIfMd_CcLXIQpwAUe9Zug@x>FZlxKQe#kaOMbTQq`vG0Daxb7on zpStdfwF|T~boTY>Twq_+)eZpwUflH322c625uIoju}Me7CbT@D?xEN&GxzNJo3Ue$uE_3r1kFY4 zg&7MQ@zRBlN)!3FJkkmtSKZzsBiH&#|EOp?MP-1zOg zE#H~rv4o`RCpx%$&+gB2K*z7Xup5-+ zTP`0`@yU9r`~2eT=hA61UjF*FEG=3rZKJHreM$@r48%n%OV7p{8LkLpASu{}%*l(q zfIUCvLPOhBso9%s`sACmTg8mWplubotV)z>adi)JA_pD@=gB%MLdeWTBLb?kLvG)a zHI=>m(#8-wZy&>wnp`)5bVEZ1YZO$98I0akDNOTbATyl$)0$XWlGQj+2b@nw9vHkP zLXka1G2uGng$@{L-@Bpv_1(?hSkO%VRYM~U1P2LD?6#P=TRd^ z=>)B``0ZPkhIMw_&v&C940j7FnzKrr`DKgZ{tGey5Wwy^6l47! zK{6i|cUE(-xw7O`r|>3td<=RJ!?b{vl8+?FW>qB92Y)071;gejIfwM*8Qgt4-6n$8 z!ahiZtVI=deAQ`d-Nc>Cm6zu?VUw5|a?J>29D{yIOG2@{lvScF z;$xmHxZ^tj0Jx)$`bM5cni>)|ZeU)kS8mp}yuM&}3>^TFlJ#}BvT?TcWVN=ncXX9z zN40gavpT+#W;YbpO+1~Y*^M-{Sry$NwyeUu!o2+KGQ_M>kXLpRx=PCb>WsOQ zW_R%PbeG`c^YQWF^%3NCgV^&4h>MH!@jvBz`jiLLf(Pp7>S^W6;|hK7XNZ5sP_l*E zKpfpY9o<}6|BPv6?dIhv&CZUYv;J#vPe;3dkM0Wn*YYup;QK@26X50N`>)MyeI5Ug z=6@*vqq)0-o2MJp!Oi_Y7x3R+@t@@X(GkPG|GkT^mHYqJSX1-=yEz#A-sNk;#sNwbSS<@+zajQ>~C zA0bF+JNnwX7%4e|ZC#;%U-lpK`#072|Dr0oxwt{}Fe-2RA9MUq8A<%5X}Z0_kOcqE z@!zE9ii+A0H#rmv%&pOTd)rqxsar@}n^ zLOlFp`cL^Ko(f0^iC}Ie{>90^tug!Lm6fN}|6lt*+RiG4>7l79q3Q_rbc6W)ee};3 z(6jaU=kA|d7stQ4&&v8&10<|${t<^e#O;-rjqR(y%fbxz4;AWW=jmewv6Z*S2u_+^ z-pG#hwj9I|g7ry^AFqoVFG*Py$7`p_)7@!LSl7|2QR+uA3EdN6s003u-SIWwh2p#%C zS@;+0_nf?@?L>yT(RX;$c#2Ad^`dk4Kltb^w0EE~GE6qSpS@=6;yokz2&zqI*M*Gn zctn_wJ3FOHmm{SLj-`=)5=imY*pjJ)?O%$Ias@xzVA+aDlz*4{@mZ53INBOknG~t; zR=>H05w_>M(c}!0LDx<3Jkp?nEq?BWx&DkCjCyPcX&uY`Jm$m&=M3cD6aE?gc?QnR zcT_y~0;p#T8M-9H~JKu#V#0Kf`(t|YJTo43~yP!HZUo<5gCp@VD^{7jtpKb)Q{zBpi` zB%B~r2vv<}iRLXK+uXsTu*5enSsTL8Z)jxRMo@P{BJ1Sl zH%GLcXM>$s zw~E!;SiUnG_Ma;6qN)uIWY2Wc*t7UVui|8H_=YiS$-ZkL&nq4JYgO;!AO!ts(S`PO zf92->X`+R1el^0|eZQBl@3K~AT+Gd5eE@X%AVB35PSKH2fbQ1w<}on3De^hqN->i; zzY>;0)$Ta+-7gBc!8gBbS#j-J2zrXsb=h`HZe8tueZiR(d^OmmC9~Va{9*iNkK#sU zX*@NOcMIho2>2L$Ezu(TSYGH4o1R zu71u|RO}}(_lb{5vh6$=zgBJ7ogumxTn_L%2;zHnQp>m2MsLi~Xo6PCzuspo|2VZ= z-&7RNad$H;x5$2jOIZ`%HJk3V+5C$P%Cj|XmmW`DuA0J1!Wl_H*5P{(%P1_}nnCWh znFsYN6&!o&HbaM;Vp0S7Rd0g!MX&Y6Lkf0HNO<|cq=3%b%jKc+|BUI4$#8mPYUeBQquFf5+dJTYMhB+B5tz6FByQ?uz&4-d0dH z?oc1*dK~sVR0DGb#+^r+UGC2Kou(qix;_b^?QebDZ-)S@M}ro9DlFH!%aUC~YJyis z#9$eLkm-ddby7(d1=4+|oA=R+f-Rb&9Ra6j(Tv}+Eebw#qTY+4K6VB4@NAM09k;@s zSoCLc2`+*9AwzI(nKRee5ux8jKkw*+0KL_Yi-FS*wX1(RB$7W20+za8naNYCp|+I@ zVcegx9KRF-%7~&B_!yM4xEwh7pAEwRBgyZ{dy|{fQsXkpYFl;V;*K3+u|-M7hYADnYe=H@EE?Oh`9rhq$ytBvUx_`#e9e(-`QTdjQm5X zUqeV$5P0vmryL<(o&VJF>D`c962BF?#jwl6L~YI6L(z@}z$!t=;nWS^O+We-;H=~2 z&|hnCGnw@d56ffALr%s=YAF0KueuHu?PO1c`ySNcx?Ig)`_zR>8OfGOT3jcQ0hVu% zEr8`QB+F7FK9Jpyt~2}Zci*#IEE{@pu!;G4APA1y0_bRg6!D$A=!?#k_-l7@WP9P) zar&|M2b9<&5F3oFcBCElKww*i{-T5a#VgB#1&8al6ioO5~h#Ke1EdZ7h1UQ$X zK!xR4NROut+Dy}ohY{ujlc8K|xVWWh3Rs#-+yka@u+ltZ$d_jy=#%q&2F1%2T5BD1 zic_HpK<0aUiRj?H;pOtcc z9Ys!i^ITf-^Y9~aJz}@?(%uu(C*VTVb^tu$f~ABY9;a5vojFYwyBEKM{O)kIK!E%F zzjN~@%fJf;QzBlV^3^KDj8v7BNYmWjC^!0=(k8&uz)lkC?h{Qw8-2dUoImC#61L#YtXlP0p==}A zZ8h&pb(+$h0_jD;ex*}XwPssT4=1EW6<0-33r4Vw1nNv`lZGaT8=EQS>FJf`$SbYp z6{8asSL7p=*+v1v!dKHivd{V;h*5DxLJ%liDKRC|hK6fIJfh@{EkIF&=vn%*I23^e z&{fN@u?FF7nzG_@v5W#LVEt*DQx8i=tyDz{#(6eIP2-44I1_pZroDQt2ZFbF26`X~ zo?1d;F91WZRNe1INePNp3B+>T1EZb0g=K#9(W<|+CWT%P6kDH1XZVhgjt{WiM+ZqQ zxy*|oO_d%7ATMFCL_^7{-iU~Z_5AB6Dm^9_sLm7cw&?A)`gxH>2yi87yh+r8WuXDX zE?FRj%vsv?H@=PxQCHI*b@N|r0lkdDE_d$#Ib&{9G_YS;Td#GAjn>{3`>cnO8rU4@ z_3huSTUZ*rErwOkI!`3y1m?o|wn z)=hg!Jlfrf8U>7Q3cd+Sh3`(FBYsw7K;*SJkfy_DkL~qL826%~2MmG%u3IPPcd91g zyGa>Utu^;Pb<9`FcDA*B407~o=yZ5_Gn*TtvvM(Ahg6aI#om6_pLDc%DD&4P`j=+k z_Ir4rl0kN-Nt@P@d(+2tlzxR1hElgLSAVF4Jw8>&`gL9mIPXsCm|NPCVV1c$dYoZz zZ$Hyo+h(ZA=f~$o2x@xCb4oX|5#i}e7;T2iGvTG13T&vrYt#@Q&#SLg+*dfP-XSg` zHXTLMTjNF%dI6$rawm*l1ICio1$d$!vaxTqF)MdhYpXZV7i$-$lW@cML1HL5%7>$* z`g+#YaaqtXfD66(!=1q35<dt-oKf~${8c+>DGG-4o=j1 zifY+*cBQZK^7GjSaH*_jyuPwij@kg>(OZwwe?+6N93~((9paKYBTE}2nK4$e<0aNf zyxxW^0jpt8a%Iu7H}StEWu4uEb{SQ<&LgQZEe9{C&CeD|g?co7!j^6(z0apPqbrBTOzirP3+^+gx#Nywm+-|)%J{nv}+?@f#KK}7V=GSfu`7Et5Tk36? zS(lc1m#f{(^P5C0|Aj$B$Y!7&V*l4X^0vAIozKTFj}y8|atrI&y}igia6oyY=Pdlz z@K%lo3_JJeR*su8DR}qC>P$PDp)1!jwUzT7&qg?i6(+yC$`s5rox5yCScs*_5$4~8 znybbF>=eQuS`IY48Md^hew-ux0Bvl&H%^!1&d!Q8d325-(x<@}2HB{kl*QSJG!>zY zzdPVlgT#&t2?2^arLkE~cEhhrD^enz!m?8${T>^rSux>vlOh73?6JLasdj+&yO1=Q zAz)4{Mtmh{t9?bMN*WBM)Fz`yRdKd5++LAtQ99jN{;Fyg{1PbxnZUzpSZEPSfHb0? z-q?^V4@%#aE%MwgXdSa76t6=$MPN{E)YxV4B z+OtU`cJ|e)Q$J95)V270tsqL8&tfUc&N3*&2{cX2RDn1UY%-*IatPvl1|=^V{xqv; zb3QbeUyKYs|B~c-v%t4GSDk&I581Rp$Ga!p>SKj^T}*NR-6%`zO;=z_K1 zHUUpn#?=ftj|o?2hR@!GwgjQnznH9!2ccMIWRGS-mJ$7f6xUy!Up-+jcN)R?oaMrL zcz^7rV06O=Vlg^ayOM2-{wCD&F$bIM;j=E>Ul#WO)#EoJvKI$>A?w?dOZM+NkGciN zr7nN<_O27aVDo;5Jp|qshv6{?X0>({(_XVg>BnArcvSdBV~rWw)%CSb(UhEt_~F>{ zgjle+EOrQ&E+{>vIrWY@kP~JAPsc?`%dwXcq8#j$K~dTF9SZ`hKo457^P@wKJ;Q==q8jFhM1Oyqa zsr5h}i9G>1+2EB-aSzfW1vNkFyG0@%?CT$LGjx-!u>dfj8t^y5Mx?-a1+4*Oc>Xi5 zp{pw?4Ic*Ur%%y~hGOv-!k&17C6@^R2=U|2#-=90Y+=D-O5h_HS2)_?5}}_CeB_I& zaVV-ZHZ$CcvHIPR(1jiqAIuYk!NSpqgGKRyKpA8d37xy|+8th8fMvqO zcWUZJu%xgNn})g$94v`z(LxTHKDllZbz_#1^*pMmwevaU-3xK>3Aqhwn%b+3G2ala zT8X`9W;st|2m3&fjb?iw+hTXXmDbP98#KNDYo{)7drU%L%voK#T&Vp!zdKo zryb{GaM08C7np5)AwZP;`t|E^`aK*A-ug^H0Ti#hA!S{=HR(Ec_g6Qa+00QG)@{<}vp z-c@sF8CPxvO-VKFWz)+aheZ|U)Wc88-*n^;3CqrjwfRCUSPy%`7__e(H#;}SKzqF5 zdy|&}9S~E)t=PS&MU|w5pZLGY&%a+H^;O)yq!4U!aIj}3lKbOye?f#4$DoQPM$A$s zw-~kV5Jw=;7dFy=$IHxQ0WKvY1Mi1~}Ks13p{Y8tb9AY|BV^tvHU z_q(oz(Bn4(yH*9!jP|>e>rDs0h01O=gV5%FGg0vYs1DDQU&oRMp9h=_ua53l8W5ZD z?021$-0Fw?RN-U^xu{#83P>6j9OGFGI8XgF8J^jGTCm$ok+jxpPWDUsEhQ#7arWEl zudi7^m33{~^CrZ){bFw^YPRcU+YKfIKaTrA*+;$nz#{RKA zZ`@F_EuhheM*-wl2Ru(D!4eD;#aT>#d*@kxF#(NGl)@N1!oH&j)>zhV8 zFmqy*47)5c=S@@dm%O)O&F3x%?j~o(b6fz;C0mXww7$s0dIJ$A1rE+q5pt!Fv?TJxJ*f3<6 zJ4agdQTy-i=XsLpRJf?nq1&%xYv4GzBKCKKzhHTUg$Xf^9HX+SQ~@`1scx+cB)3;8UD+)DGycK8(Btr4 zNuSR8w5$G+jkU1r>+7Zbj_W4@0RdI{Q;B0p=;OrNG#CE6!o8FPVpK>aB`8+ZBYK~{ zcv?Krv(-^jPW%tnkF=3Prg42~l;JUSEpOu3)qwiKO~(YIg~ll#3aLv8g*Qfx1)I|D z6vgEUW{#9r-fOMxV9dx%LZ=xcTQPjO$P3K@DIrA$cl~q)&R(*2aFF^?Pc3WAPE0~#t)~ZT9{!=Va%@yAVVPnx zuc4)d0JOR}mOC%>W^aFguEwM#S@(0GOgWm_Y#}?=2n1r+(%^Jo_Mlg$_%h9cjbu{! zQNk3Bh2a#y(uW+Cb(|P~zH?Rl3_$6T0cq?+8GWA}-Gsla-8=i41uTV}f3p?H!YHFP z_ruZeOsbyXayvUp!4I#%E6<1H>^ko#mOdT?OG)lxQYbkd5`90k684F*$qnN-4bi9Q zoAVJ1_-)owfN;q5%9W5Askv)@yNF@oOiekk`RS_hv+ zwcOY;-)A0v`y#mF+nrrHsjJU(J*6EnZYweu-)i?eUrmpq(G=v~2Oa2l`T6-%wRL$= zHeXppGXE5JsZmMRgHbgd7_20Xj51EUnm#XqndE-VLApTFbh2*PnEtwn{$nmo}h)Y|hQyYcj?G38pmszH^D#X)Qw|tTh%gxT4Tu{5WKVlpe8m z{8cbwvzdlUM%`FAcmmF2Fp@6ZG|*bRzP$}ZHsMY0zVSmDM-{S`!eFUT?_Pe+0T?Bq z9u>eCjYW@4>>m9JuQBfo%ob1{px05;K}jQz#od-#qn4J;N`&GHTPxobN}(5_+IV?l z`Fxvs<47NqYP(|wJq=dJ!d7PZYNY26IOu z?k{!*F%l3E93ocChLCwgpTj8}+Gw5P@;7P`c2J+=O--Is%Ldazl>Zr5_iIip25YAN z370Pdr(zGB4TNbPFH=+U0Q%_!>vp{e9(N{N3n-H-njA3QhsVUksO-14y?vAG*A%!S zJ#!GU5M;=50Wj9Ox$L?<-mvdNJ@LK#`QQvXQ&7J<)3ZBc^*3od zzu0iyxYD$*XlZXBANf>poBRseh}UqQqC?25SU@?N^1xsD&w*YG{$#qgS(8gB6N_FR z@U8$q6d=X;3tDqI#=X>o)TT%#n|oDC<1&}k`_CGBe&fuh7YRP`y?hM zB|+jId+jrK)ps4c@tV#CpuWtx$0H~*$!keRNcec&t_ni>0IO}CyC&!0l~bR`@_+FS zvcLGoSy1nuJ)soNFTSA9)||ILZ-FeqM==}yFJvoN=C46A7t8jWEfgqI4tEcG`=dFt znGj5EH9q?n|=#A-a5GM7xCVD83Gd@|V2Bd%d7N?Xmw+tgb0}u_A`I-VD z{^S`Odt`P$^>a!Y+z}v~e%SgDMMJH#IO&9{wYex0UK}tA;_vTtJeSwYpLI;`W!ALR z%ugRqfqZR1$d*O%4k7Ldwx=%g=>hPU;-;zsjm>7LsY;l52Eyo0c`<&(cfumr+9E}x za2-@6HyfI`dvfpid@;mqs*8qVUJf;UrA*5`7dhN7T$eA=+q)NJMU7abX$OS<=b(%~kz z^{niNd?z}|U@fbuT{K{>d01 zgb4lwm*_Vt%V??EbG(A$z;0i+J=A`Qcbv}n?zEaRY-#3-|*xusv zqra*DR~Po-uceNq{D4|BlRdLpiZzUkjjPzpN)%_ThO%MAN96bsVr&{=4W+T-N%0dC zN%9W>3IjX+^!G`Y5Q~%;hs_t2q8rXI@V#7jR9vOl81b4t5~?(eCns+Bqhoy@(V}G|uoUddij-8K5+vunfh*?A#i;0Z=#qIVDzZdfjkN2g;1p2_bUwa51IYjOFga9&xrzNUJfb(xYYH zK|uG-FBsd2g-pqf7U*)}Sxm^u(IE5riABiir{1#c{3YlLj>_eME)phbP;g(sO#16c z(qgylm4$3>jSPN3nwa=}kNc|oHJ|314Ms!sdiAmX1S>)79jJ>HUtr7olY5Ujb~h_0 zH@A`RK6)Q-9i|gpUd}KF9`?}nQ{N7`Gz2=>f5<`Y?+G8DONpUWLtn;~(i7b|fpc(W ziot`zxcR>lwcm9B&LV<}vtJ_m^-0F46CbKfipa^STWJs}G^{cKt&tHpKx@D(`u?b8 zDYc-UKBzFZp2c5p4C6DhzAi#-EAoS$X?=n4mWX{XveqJkIbo0tZF+~u9@5B(Q9?ly zke4Cgb!8|cxXw; zdo9_qQBPb%7&r4U_Qjwoo$OjnNhfdh_s=v|mrq8&T!QRIHtxWjFj2P#P#|(55@lNN z{RK=M_8+wXlZ~~`P(%?bKu9wpuZaefEev(3dhsYxRiF{}1d3=_YNj0+k8osoa<7#p zn+;d8AWGq@>R`zTKQ>H<>N^qt!mdR>~4S5sjF zz(r`8Bbd+fW=I@)tij+3#zw}vydwd?qV%OC=TrRl0M;};k`czNLVZmd<)hR>0481%L=V1FC z++GGF#w7)9=zxTk28PFdUGoBX>a+MLZTk30we`M(cwkO+yr!7!3il`0vp5gcX*5ng zlpk}-AU+*+U}LndflJ?Xzj`%d&>NpHoMN$BbTfjbIDBxN$~xh&^SzinVHie}kW_8! zH4IUY7vT5%AK)r76>5*>%x$$$2?+KYtoDfe1e-e5J+;~ zANe83V5W@Rv+gwkDNh#nU(}&KH^D*9e{$VrPeFfUsnYg+mTTjXKwr<>P0wqUU6}vY z&WC_nOzhv)Tw9g-{dleiB117UWvZa})*xBk`pdIsP7RXgifo2KJUC~Ix(8NK*^qcH zm|&!m_7%^=(A00U>aza4^&b@L)2u}%-W1$41$>h;Vq$N3?lSB#v<8RS zGDU|eYDoNUh@T)|FZ8kgOs2go`}0Qh((0NCuf_c88-eVvHFdffN&Wzl#pd#P6_1VK z4$~T~!@Z`*r=mCbdyl(lujUK#U~GS&$CYfZKXonzp26n@*EHU_uD9pq1=lt#L03mJ zGQYp}Qgr=FFSu;%w+_~x(fnXqW4h5H`YoF_BUNpWpg5}nremd$lgiEnUdC-nCk2F7 z(gJNI0j?(E{G9Sx+N%-v4D4z;04My0Rq5xfZb;cYlzw?yGBg^B*kXbrep6>7_Zo8*EDA!2x}{YP+3h14FPk1Nc|d}9ld8{A1i>}?H4tm1{4w& z(zF53Bo2mmSI5K}slCSUZO>Lz`s#I`)UK3zw^a*JPpzmYYElqwB^0c(@F>|sz#<_y zxo8l9Aiu1g%sXBxsUoQ&S$Eb|O1OXFs)4+N96*-1^zvg8O6y-K_-FmHdK?Z}@RRG; z;_z5FwGPak6H+@9A3TXr_J*16{R+ke1${HkH%B3YeQlR-qQiB?b$ILkZa*BM5ZKC#EW zCLa!4uMH81fHLLPrJ3-`fU_nPw!yo{;;^Gj)A0F0zhlR2U?3c)=qmpQ9!qV-(Gu7f|!iVJYqkKB`yLCdhQ3v+(yD2(^BI^zpVx+SOwuZNpcO_6;9W5}}S9C`d zWqs4UyzGF)`p=({2yt2-OyR@ev@i-TFvQ>#H`@e4C9DswO@5q=0i4tpKn|9N^>7_k6ok)g>DkOCMaz-jK`W*^TUf4JV$vDA(dKROKC zf{;|^GmX-LzCnQY9nD73F)>-Pj~}<&$xJFfIqmyV^HxRX>P(MC`eQwMb}E1``0U-e z;_llHvd+zNnX}g`M3bZ`7+mL;u#C1E^ZlZGkLIE5nF;n!u&miT56hOw?a=y+4K+F)e-y4^5n`8u=Cw6$)2X@eb?3N!$2oq#VCwC2AldgFTciC`qmI-ysj zY-+&FL+}{UD><0f)K8zS*GNJ)aQ~cX(%Zjvewq;*xhP^S!irQvN+}#>e9MaT^7jvK zb){VI-nU+CKUM`EEh=eJEf@d_VT8*I@D8G0e#_XDZr@$CVamsvYyCNJlbGvI9?xpk3<0i|jDS&9Q^XH>28Q;jyFg0DR zX|MaaWeliv^z71-Z32;fxihK9$0rV|%fjysL0~N@2(TTBOe__0|M2q0pw#w*4Q517 zgjIu)WrumO1H%(VSVC`TKg1T3>!Kd435oCmv6V)`!B`kP%9w_$k2)K^=9+L_Lus>^ zGf8ll3WI9uHcmNx&?K)KT<;zgAE&=7lKWu_)UOS)b8`P}(463C_pmSQ8BG+YXL#oe zciuu&aio*0xTCoAQZraIuP@EjSu5#eX;ai7{yYXv!Q0-l>?m{E(urK!M+c8vtQ)rf zEckIWSnDy%XyhtsnW6p8WOnbt<>^Ji+3V-Y81Lyye7)PptZ_h3} z)kY2FEzvCZm;8b%c4d!0({-FJXLej|v{l6u6xA}O6b)`~SAOxPW{K*Xb~l4qO-#(N z(Fc*hPwZpg&=P9ng${qDq}Gc{^v4y+;c+MyRZ3vDK$pwxQN$sZjFVNZLPF|HgO{;gl*<4^5U&uY7b<66n^ud)WIWGOiU~k*0}#N zCwmI?CTn22$-~G>8No2Jk^1;?xlJ?5TdpvtF%4pvM`(!#N_keHf znmH9{#7HBu86d+NK;xzF4mi^=^yqyK#q1Yx&$!&Oyw^aa{!nUK4Qll(%PWv z8ODP>Q-0JFrhJ##6JxB+)gb$qB0($CA>RHML)&xPlR4k?GV9E*H!kZAr2SAGbnA1~ z?$bW0#B(*qzwN$tohhOO0B1*amlD|B4^{tEDgFh!h-T+}CS|lA%KA`<1P!#sgn$R_ z%XuT~nXLWy{ppu|_d5e_zS?)JHRU`(FC#w(S_vtJ!0nzt4@YN2F9*7Fax8e;TX^c@ zh}B6^5?5ruE9VQ7Fi=Y?gC#0Z$?KF-U@;*rXQzv;%vKm2NoBOh2eY9XG`gTxa9(XJ zz($FebN#)cx)p+9Ef14Cy{7+^v%ko~j@!(ssaXY6m{6E-r@gU*P4an>Dw>JB&T1q9!X;V(m996CX;R2891jp{N)P~e{=)5{Jo?) zu;;QNwZT#Jqvz2#BTN#3Qy)~4R^QeZ-|td8s50o%GP$c*k*%wQcs65i|FmFyf2}`W zW1(`dl)CtB+p(hpVKoK`Mu?C`U}`sB?pw+f%wZ6JT{Z4!MK8Y!z1hga3T>LxSb(R) zV1?@+{o&vd3{LH#%rp*XljIUX)V zIqr0>K{cXfW?IofWys(UgUqi6GiUJ$NU-nFGTh?e5{6{Qzmkj7sdoTUQL4PA4vTnA ziTflR7w2^{kK}6K>1@OO0Q~U;X~8ATpP-)E63EO8hL~$XHBS4p+!(FMERC_SMoO-NXQq|R2=%i?@5RNC!n;TF?GlW7 z_;QKsoUk>eQGG{tcDpQEb_GiQS8-G&M9)5qJ|a&}{m$#{3lu3^<0+4|q>stZkE>kl zf6Su}FX2){F{#_SiHljo{G%B1&}|obXHS!3=SuU<2COVWh7~ym{dd>-)fjlwN>tT| zIDbGk)9RbD#F1NSOSGdJxS<)XX0X@_&U`LbIW1#-5}^CMCoc_lKgCu zjkY;^YDox|=LsnouR$LqE+zGopEMS@HlOZnT4UI1%6oqJL(wru`JL|?5dedUj=^AF zZQB@|T5H}mOc}l$ydg5CL3^AU<<}(b%A{i6=1unayhO-x!zKP)0prg;GKjTqnj5nF zFoA*My19?9u2M*Y`Y=d>4&0&i&iUz+x-bDt64sBh|>cP_hrEz9KSmfV}ku3twlu7f8<3If-@89QCRY zIeY$KLamq{&U76MkNVz!QBrL-IeUA`cO%Fj#9+uAOdGNjvSP1tI=`Fy?2>HAJRs=p zlX9KBy0ew5pJ?X=IHIl9*o^x{5;=t%!oErNgL%zu&911c)cHGf=L=V<6KbHUxQge3 zR*Z)}b+;(B8c3MBc_k7)#9-|-@Vc1o^R`xqc$%K&!!MslC_6}v-j*b{E>K${XSjO9 zi7JKeSZ9)?H-ev+=;ZC#@-I5*?a1M7jHNt`@lc}qT#ENxiSs4)7dBiW@Pmwmg?-v( zNgYtUN1D{!d!=qG&M_4|UTkq&1RZn^Y%V77yd4VA*?VC}A7h2)p+rgZaBR2o*dH^% zD8EwRDB*g6Y?vNEwCeLFng!=vMYHIcv&QKjjx0e6aVJ|A$d?0t>W;-R&bS@+%su#h zUFZeMRN+b7*2E@}d z(u!$>e;}0%D8kY2^r0_MCbRZQ{m}ZlP4c58=KS@&J<=DlC)5|gav(z~=??ZFCij~| zDv@1b3R(h6nr%^>1KE#mgXNF8*oT0ENN!AGhaJ1==@oXe_w*2^>SqSy4)g42kN9_# zLCG<(%E?m!TTY`ogGd0IK4DSnoJ-nw7QetAs9!&Il;m79Hhi=|D*!rN& zV{yZ(^hiqn+_47pIyEw3wwM@#!(~iDXZGOwMKx769O8)>;V1Rf>c8x+1YiS7YMsA( zja{NyhQtyV$y9(Gabg0P`e_(v)|)ocWSB0;5WS$DNSjg3F$VGFSS4AoIwNK4f(8a& z<$k%~TNwHgu>yTNSkOV#@c|P55rJL|T5JsnJv~RBcd(3KV!f*C=zQMHBKJpEjc%7- z1Q(DCTwrw3V4=1vee9itjFewe=@p-$*Y%5z{e3s*m7_gL%EUxR#TUC0i2^VpBC4@D zxhK5zJV4?Hm2!^&cOC(V$E{i?wK9}B!`(w;u`_B|M@W>u0vw*dg%0il@HnH|led4C z2w_{hH7gh^Yf%ZcH6zo?${|vQDR+K9+V0?+BLzsY;uOM%@HSV|FAu{rYPhin0)^~PLr=Sqe9q*Tnv7-Mt=Mq^cuk>9!8{epE_u?0Lr7NT$zTeu% zOtbHT+0J;UwFnyL!GsBQOVV8E@hf3FcMK}=yvD8Q#X86m);Yb*p7M@t5VLnCW`U`qGvjMNs^UVf-K596E(L~sZXO+e-@g{YDC&)vvs=%+bDbOe zk>PFXP{CEwxnRf%!F3tqy!MP?f1A&Y*YW7lb~-A4F8FYGduqLccttHm{$52cYKR!g$o;g92b#;FixEWQPct55|NetT*X8eN&72A~K0(ANSz zx_dYGU@zX%Iw({NWIgEYLehK7-bSW7Ypf&`x@rJ!+mgT0^@2)b^1LA@=xOIqO+7^DSHCG zYvS1`$30hy6j0d&rz-3veiI>6JftV+sRoC_Q|MLV@A6FL&Bprtk`hSgy9M5;+9)8H zHKp&~(~iO^R(>r&+>}aNLQF%xS^kZzqasvu$w=+FXfF7RS}d25&XiJqq3b=stAu=Q z0P=oJCtX-k?Gv^;N|o_`B;{Js!SV3?FaAwdi0643Mq}PhcOK{%V#P<`Vd{`LEP^&f za*W>)P@oj`H$GoSMZ*(nLf8g3TG}Nk#g?+xX+&!^-pGn}ofQ3z15QPemcY!Mt|fU#zw-u|S~iWV4wcKYy0+ zn++(q5nzftg*4xIBv5(hg`DY4>d#cJL2_T z*Rj1=AT3PpDHnP06MJ5fX>dgOL24<(u%ACmUqUP}&en!T%BY%OR|eFGE6FR1^;2Kr zbeW){!m=^7QtykwJbaDbF{9E}|E=}5KnZmU&qM%$q11WV4lcEr$Kuq5onRIRQBgR| zGJ$GY{JFSC$4iUOWV)M3O3xt%{=0nwZz&mwk=XC!g6T=`T0Q6|)rmSLuiCg%=+U;% zpNLay`pGqDCi6o^YzZ}Vtw=@77@)c!@(up~(DasVZFX(f zE^ehbMT-P?0u(RqP&~L5_u}sE?(P!YN^vMoa4A;Yp}70XbwBI<0r@oNc4i!7?Bkfu zsa9gQlh|;P45Ad4$5QAT^p|~^m}pJaJJZE>OuUHUh0^-SjA5}mT{MvKhDI{mK8MdZB=;zmfp3W zn#RLldrl!qZ3fnf8zz*TyO8g?-^g5?0W+x&AXZ0td2>P5km@CSzgk7BV z1I}Si@@IC(u~tNmOxsQ$p_wO~O$^+%C+dys=-hS3(;Tp{a>c>uzC`PiiEz{vg%r1Nu6;hp~6eF>)4IhY$)Z{fP|FYb%f;5c+xUf-J%%Y69 z{dVQ6md+OE(FWiqf>DyyT_-XCF^Fa9ki}$0kh;41=kXCoLW$hj@dP!oN7qyA*#E}@ zh%t>Lq>ZHDs4`RDQ^xVfU_-?~(^}C9Khbbr2{!I7`++TkdGrinacRzI3Ug@&2dUE| znk>{8&A=K)=cE=vE&McX%$-f!lf=i?&95^CXd{rJrcs*9gCG1r&nKDQNE0|;!VR7j zAn3do?Yb9ISJZP*wKZbI`WQ-6=}@aqZZrDZM!%BF&Y?;BB&$s0fK;*)%!npBiA{+x zzCtw4T%MD2zo$HDd(qdA7@tyP%cHA?e+vT9``~sARsse?{0@nRRmMdEBQU#rNmy_J z6d`Lr7a2Wx399j!DoVJD&{5^0sbXZo{K{BHWl2K=47${6lSm8}PmCi@ZBT7&vC75a z@>Nx_B5S`9F&1HJYO2)A8XA5v(7=~s+cGjP*@>B^BZ5zeVca~ip@?D3&aYt0S#LJG zRmHTLT6Ko>J8rITRCBK5sBxpS35d-T=zL1!WD5*~l7&fN0MH`NB!zL_td}PcTJN0Z zi%;R`utVk@cJm9c4QdJ}XxDZxQzZ9FJ(!vz??z~v5*Va2jxy|ablQ6xJ!;B6e~W#e z^E(h=yQmF5@3o2lJob3~^*uNLN&1=cKS4lfDIDd+;NXzShVe%ODY6K5DD#Oh5uyevsADRuMqjyS5Z7uk zf+cP~8uPFOYru`*j(I;N>kE~=3 z*&V)h6;?bSh#qM&KF+{77~vS>3B@qCjn)#vx|J$VkVuAsnR_K;^u0#QNqcxK<%tsN zzf^K!sJ(xCk-JbB!L>R~#s-w+#Pl19PmWKD%9>Ms!&@exM{{O1ENsWI(Oncc0La(+ z-+#S^vz){R>iisMG_z6*iB60g+U(>Ok|}`U;-$(p(+FvXp|&VS31TG1Z(cXq4`!Wz z7C-nM$WJgY+U49==?oWjuXwT|ukShk?KH?ej=e%HcS47&Ny^6o0Ov&~RgA`w8-T&+ z`WYcJ!VwEDEos!P1N*?o4Pz2PgD3V0i_j!VkX9y8i6cY=l2W@`WJiLok9m+2@d>%m ztPg6lNd|VfpGUf%aaiCv2i@n{t&W*D1(vER8>!~?yXu<|N)7N9H7CS+BzMU{XRTak zs6z`w(QyU;uQO&&*~h^_1iR0Ebt}gNMbv5X-*b1pwU%x49IbMWbNZqr6pmMp;vFEQ z`SwBt!fuKgM?WA%l@X4+5rUDb^nro7(MLXqTi_dT47rB|%@v&>->ku?ga_>h-u5SK z^LGE#sma@LTiu9G?CH`QB*^c4oQIJA!sg-Gcw?UAXzBR6`PJ zIx|qp;-EtKUdmw8uCJ707nC^75OS8YiU@)UNc&bMXIO~c=S|CGdQ@gbfkk8jH-TV2 zo>st!@;z!LSk1&CFpl?NkPj2Do_r_cmyX@ui!sfKYdBt$ZL4mzCW$@we*=}CDmfFMyCzD^Il6 z3ikjS7)2EPFUXi!<7orq)=>zKQMSLwnbQ=;u@EvNXP9+!oBmkUmz~$FxjFucJ+h1t zge$?9RQ`@7`oTnbZyb5Nb8!XP|FCNkF$Xutvo6-Frizi5Jm*hpI-|#ix+p;t(sdbr zD6ILmdIgvk3|1_JQ&lJs3u2vHQcs=cwd{cI4-L4RZlBtT5)RB#vzL*ukJ`@4vr{z>r`$(y0xN9n$ zsRMb-;EM1<8Cm)0%s5MvSj6XN%D%;*O#fHelU3vS_e|!hpRBB1n`Tz85}xz1Cc3tn$EqKp{EE9QDgAHK$BsV zzsCEZ(rGKCE?*&#N?dGQ>WC{dWjQBR{1=EgibH?k(&}ctv&H_ z@Y4?4dP=#Ho*q##343Q`!40zD6uV#@duz><4H~|dhG$FD{VL!+a9YNR-IC&zujZA) zB0QG%hi`Rd{O3?7USf^2{gH2z>Mv(d8%2X7SS5GLz*qgCsLDruVaA&dgx|>fB~X67 zjk*X`f|e$gA|91SC3aj!jE0mW^!tiY=CqtI2ck|9&$tVkxlALoaY2Lf;h+q3*5?r1 zH;yib$(-cFPLYF!cN()+cNF6_ndBqhG7{0)#kt4s^+ap*JScQ9z*7H&5rD>E>>$P{ z;#N!N*UrG;^Ksy(pwf*gSZHnz0PYR$G&03SB*rv+q0UI z%!ihNUAS#Z?R4isq3x9p4jv*04E;;ciZI|yZh6T(RjF3q8z5tfq=d`KwLugGKNu50 ze^(53oJXte9H1ALkZSmM!?GPS+6ypF^|6u00T-|S{29UwjU1tvCp)L3;#SVi<74Q& zE6q2x3`!7)GQ>gl+lGCsfWRjxN+BVURkp03uJ&sk8pc%$>4>3_4r9Ym51}x9{a7uA z1;R{0vIVC+!z9CE^I0US&Y=exr)4_B!OVZ7Vy7ro=VpSF-O(~o@+or z4Ub$JG7MMmc3PIJ-$mpe`ysavdzyxA*APRGtx|&3<*ll7+q~DYTTjBYR>s4osj<<1 zHN8rnm+ADg&Cq)UtVP6M&*5*g9ne(b6{=QXmZ1)Xa@Sk-d&|oifzWyP!&tN?^YZQB z_C<$Yh5xSIRQGkI#rkEfZgjCEND~f%Y85jA{B-renhZO(_t_3+PWyEhsgwr6FSDLq zm2HuvGzo2z4|Sb$kD9N1txUXZEv#Vti&+2`zH5PEf3OHj;4~WifGygOswnFQTRxsW zAZ>O8Ou8+mf-Fww=ujw*8G(X8Cb*UtNYC13#86tv@yk?Bm5A5K+;UX|T2T6-BZ3%% z6l$V~3fYruKP6tB$Rap6@Ogk*qN^;6Cp9@=wIGj=#5>c#VM{(p)P=ihbDd7(V%NPc zs1-Yr)79(Dx5J9KHDv75xGr|&x78BuRW1EClwp-XYB7H7WIdxlMB2I5CA}6=X^xOX z7&zlWGC%Z7P6{>2fWkfCH&=p~U;)%|{ zI`)~ttmKS6&ah0Gpp*%?u5s_Fzoz8pr0-ojpc2>5rU>Y%LLP>z75 zl_Gt5Hc@rGw+IXv?%-=9QO@;+5T1O|J>gIIB1v@+%?=^aFt*5OvPYd|mcwH^Cs0a7 zlWZN?kVPhQ!0e6cBg5B z+@V>;R{RzD8t#8Ly3qQ6o||yccHOH5VB?xRG5?7vDEX7t*C3xwIuw|m*AK$1b=_VT zZU=XoKlJ(d{EDoz;`zw^Hc!tz7E|f+J)dQ}c>l;r826Zue+5Y*iOZH7VnWZ%;YS8L11QdZ4eU%3$i$Fp3iIg6{wp|xaRj{4KMVgBW_m3& zkaOcF2d%n$=q6}@_Wppr_NZx2FoE#X4D@gM`aIKf0DR>PA>ed0RP%_;Fm%@f93+0) z(bBb)0tS4pfQaouGc|yCN)hu0;SU2#K5V{V+7eT2NJv%jC`<*s)V2C8Z7jt{UG=P) z=pAm*ETOtnqt-$M2ghzpiAyzC@z|JZPz7y89lgVi3>Yh}!U$nEXi2~^)+M$Lud+t-WRTkA<1yEd-Mm+uO zZjKQ9(2eM<;r;qVwv@Pjl}82XXD%lnE{oNlPF{O>-}Ir-N0M5Se$%pBN9u(6Hx)^I z#z2@IEsoF73~r9gWpdPBB;zNpI(CjQKY_~DH6`s@<@^x~#4ZRnBt@YO2>n>f4A9+Lc`FGwew`?bU54D?x zlU6V(pxRto7q*sro0CwF~8vTN$J?Z1u>0m%=RbDHoV`y;C6KW^KT#0Cpsm? zIvpt7Mqr2GlNPK~BwnllHW-wXsdKmi%+LLCZq01LdO;VWle_dZ-Gn9myT zkko$LGm=pa?#x&qbfF$vRBl=1ire*a6(!ekJc?P|rDaVE{FS#`aQ3}UPn3qN;?EdN zEtvSUO;l;pQk(_I7|)*U<0HkVHTMMLeVg{Tsyph0NA`4oo2}Mbhdkp!v4n`as;~}0 z$PBe%aiX(l<_uh^NAU<#UMRF?wW(zVy;>)7>H5paitW#bu2(%FcOc zv;;?NUmS{jiVlUAP0FlFDs4n!6axp1hX{+^^oP68h>&6Sv?+t*$VD`afFBRGw(VMXXw!FlUD_a*_Vhe_IH>~NkIp6c zZ+O2%p13Q%9?ZqRsq^@%|CkRsM^1w3`Qp<54X=h4iNz7>KOVPu{jPqDXcTp<)?8ea zK0DPOu*AlD8@@;8%;tCao$R-Ez4w#f-P)EZWJW}$$%XE#hcnSzX)DueZIIkV0Xlrr zJBUeh?Hvs;&@*W|VT&swikM00)$nV;pCBJ87--6JO4+~6kI(LX+Qk7}4Q)1&IJw;S zDZ~m!@nE2FaWVuNhW>le=Xjml#tDwXaZn}J_y~|QPtKA4X@_|JSxwP8EySE~2q-M* zP4R!RFzggt+FyIGb$;mMH}WP5fVEh(=}gK}zNg9FDTo z()H5p=^+}GA=aj;t%ARP4IVOjzcv^o{IPwK<~TX9>|nu|Wc6^9^xSEQn2&MV`+YfC zgWxrCt(jW4j`;Tc-f&>}aBuM&xS8(PG9;OPaX0s==VH};{YvnqfxLsV-ytynnQwC} zmCwNc72W-;^OoX1u4?#d5c%L`Gg>UHisWy<%M6{9ZpVI&-1Nzm*;-rwxu z-R0qV{a!yAS^u{{zN%hV%gl1*#iNp^&x06cF%H$O&vu)Uj^82S`muqG} z1&%vxtg#n%@ffIc`?Dp|HFdsE096||B#nY`IT43m`M1FD9AapggiT{+Cx@R1t%pjR zkroH>$MwUGQn_|6xW7ub`@N(&_9pW|Zk4U{HAPR__qS#W^*X$04Egjg9-32^$0IQn zWs(bZn+BL0Vdp2jn9^Vm;8xp3qfi;lIL#}MGiw)hLzGPj0pX4!#K@J$QKy}$ztdzL zCZRjTpptAi2e@!P*6b^~l^6g5Q4M1MSCAG{9n)gbRN#{bfi5NsH{1eX7^F&4v={Ns zn=*eHA8gOx46U)Nax)XH3utr?@x~CEgk*D=fIxkkfeeGcn~9|7X^H_r=uZ+77~hk##(3$J>-J$$a2rd}tM_TP`_ zgs4e_ZO=bn&x{g7ik)HDHro!?pGe;-$$d56PkSy)eI0zE*?idl{r9+j>WKev_7&!5 ze*f~Q$*(2z$6dBpxX$aX&5H}HpmMQ_o;B}x3k;07w*k%{{y+1`$&(pmkG)5i<<7oq zGJIg9BSU5{q!Cdxie3BCV`AS~d63q@C1aJZ%95)(NY(9aTbR|f#3~~0zOs*hG zqy$VOvf1mL?s8piza)0~os&VEnf=I^WLI1L&YrJlzS_0z&D!O7CS+axZTGk7!F59U zI0i1(_vTGro=)w&!u(l=T%fPhlzd=dlk!&Jcv3re)U=U{Q5-ORh)pg@gcDhc#<}bf zT}(zZ`@2gg(4bydgYZ}*Yu)+hX`A490alY;us2WK@}2ZA-W8(?|MaGsVNSMp7@@l+ zVeiL5-!s0E_gCdx^Vgo&SMs8Ddb9`l`S-bl>%Y!>o-3}sxdI99IYBSzE*1EzOy#_e zbnOjU2lf+8@FllJe=t`xmFw?J%mDft6;YO_G5Z7a$v85oLH}f&l{2!;0MfT|1I*%M zBGop<8hr7Kt*dYF2LvbQFNh23TLn-eRPft!+gPoBf+DqJF$fx< z3}zjw5&Z@GKx3Q)LTTKH-5gkK?ePQBa1~~Y3N-n!5(ocdR3vNadAwhsfzNH{30 zP>4GcSOjJ)OQ8T<^vSob!Kp^vPkMWt!z%x`fUgjZtj`;o67kYzPVDpc@aAVV;UN`S z?IWnC5iqUVa=*H*cJbfz3zLRl^3-m0-bI#^^*jw$iJlsxEU{87+rjENL^Qj1KYV^z zntEe?Uy0XGERKf1|MAvpIQh&n3dNvK|Bo~|VfMQ%$E!LK^Tf{gZ63-MsGH=j+Jd5v zT{ey$7c*sc@5^Pm{);>D!rJ7dWJIWu`g|Vcc#@Q%(?8`M4f4**PdaSTCD#9?_wF@w zTymj7yXL~ak|7#i<{Lg1^}VlJvwLtU2{x3u1k(mY3L>Uim)~^bwwDqrUBMxca^YeG zGY}feB(r=}ViDSbUBRxLU{_4iuIvC-sF2!VS6Y8dPB<0B$jr{9p~+26!;gEt&a z$h9Ck)ss*haDScebcix9@azNl^!y-16O49G5d8?nL}rdJD)gfUY}3@jW(aIjc5RW6 z)RtQuDdG4s11q?QLhY5E6yT`Q)VK|uc^yjZNBku7>r7S|5#0X`by2DB5Imk8{MZV0 zH%#?EwGbL?fIG&15fFx}1YGpLpS&sGAk)M4lD~Z)2^R{12yF4#iwIp|N38kfY+ODh zvy$Z`@@gfn*dGMZ%DH*tYsox6wjzh^i_naI8njR74R?PYt=!^j^#4*rS zfpwgg#YSdkuq`E`sElKNuA1)Wlv)$pcG!*9q||@4Xd+ULS_(Z04Z_2fDFTBbom!8+ zFrwqO&8^YEZrYV9{JY?N z_hVb(0o%`s84K669zAkv|C8Mm*}fShZ`*~D;^QEK32~qEy7iq719hLv&jaqSQY(f( zptAnU^#3fIx~AFkcc%Mog6`wIp8HUuE;4d5@@`C4pPQTGBTUvf%%0c%Sl#d3!XlGM zC(?nA!;7md+-Szd>{a+QwR#TtBB<_o3d8mnOI;_C!7BUFJZs?n0o0`#q1_t)Sk)dE zS@u?lKm|WvjoVA$+Rlfw;$K61-wuu#sEh+-CsDiScaykEzkL-5wXgAP|FAk~4)yBh zMkuABd7pMJlv(QwU2D6Bxi=6<*8I^E*3{&B)-iw3sUJO53x0X@5qh_-=$HSdCj4Xh z>)*xc!{=iHok69yQHUkR&!9W#( zDsv(qhKaykKLDGq$YYh)ZG(9D#ZUHEw`JAfsLFytkE32bDf!9hW#XA!mHD-lVUIh3 z;(sl2jj9$A1Xo>7T`8WM5py+h4KX=XD1ZtB!@0v7CkAJ4?0~-0yV+HtHjtsL`6ZT? zA+=`TR!E$f%5oQ4O9w&o{Ozq`>3|6J&_~fEj}*-ZSKjFqx>eD|?OaP+~$62Joz*jPw-3Ua2%rBqlyOhtj|Lb<=% z6~>R1k_0u7&0~H?8RLosDO)*C-~1TOaVi+b8IRJ4t1Ji0N3z^tKJ@cHtdj3-Yuhtj z-kt9Ed4D}mT{~VE>c&p)$tY;{qp#PE2iothygp}n+c`UQSicZRZdYwTJlX!qnOgDU z{BiOTgp+~)UiNKd zUq0Ro_Ay~n_}^LhdHQEOniRb6(n+Y|JdTy8UUzGBITn4e0Xikv*|m?9F_1+|s}sd8 z(_CWYi78=!!Nt@8#Vs1IS2v?oC?C2IK9`*jOOg#&rEMqgB&??=d;h?HX?d&`;uF*% zCHp*)Wy2Gv2a5g!lEjKJ!Er>xHd3H+nqi2%IPH0Ni4=ub0PLh3pxAP z|D-(#EG~>bj=+rC!8&T)HUWuVc>PZ5xAu4;FQlG7%HX$mIF=4V$yK*CxziRKLiB%9@k5r9(I(zffGn?Ru$; zC}^fz)(t}}P+$V%()bY5UX;O_E~d12_hX63U3goMjcGFyU6?{yQWRvsN$B{|5fY zgw?;>VWsz>VGJ{e-0|g+?UwuA6Yz$+mi~rl z*RXwr@;NPuxu<9Ys^a0`H#SZhfizXdoW#iUWK}W!MT*EADj6t#p+*Djs1+ZRMT0ks zBs2;98YPlj9EB$)fKUjgg=o_v-b@B76Ag!)mJM4kmjd@YUa|bE&O0`o)?eKm79g6n zWcoRsQ$NzPKl*e=_gv)L-|>8e-Xoj;i=X{rwh!Jc`d*NBkIp?Ift*4wx{Y2g6p*dj zu!)F`_m}e9)VfY595D}Xea(%TNdj`;Cp#to;T95}eBLg{e!lYw6gmKxyaEs$pp0Vq z$k8eqAeFt1_d|#&V9*crlcM8mL;*tQ>AUfHS1=2t_PYB=P1il&!BG0f$=|O;!R#=w zSVk}mA1F}ZaA;a49UK>QXZg!fvD%px2n#>iI-tQ)3oTS<6~uExWQ%q%L7e zIKm819FoyDgk{v=>WiB`X*k%{MBunTE~(e<0;)Ca_~hnR2AhyuwArM+&bQ3ce&E&r z)>c%X9{IaPF;6Khx@(Lt4k(2mIY#Y@qC(9bOd4iwiZ8>yX#@}}pszqglOK~q!`-47 zQwfYzRH&`hxRJ(yp{$bCwEs8O`g)mMGvX0=eg952m;d4y_==3@zLqNL65Lx57pdjA zjujz;T8c^RRFpTR;LxWnfomca7AZLhkOIJQq$j(6QkjpHD)!;Xyb~j8jIa*n?Nkjh z9QcQUC+Swd3gK>FGjQkqcXc%j@aiJdZoKF-5nPds!DgijLJE!IC^aZ(4l7;3qqA1Q zt2eD+W&#B~b-{wcv-4HSI?EPa!W6Sh)%K0w9dyEr+V3W~s2H*P8gpYo2QxiQHmKMP zobWJ_1JnWPn>pfhYsKI!34F@TEzmSxMiAc@G)Zhi?xqivMG_!Y;J8Fs#fX5i*#rNv zrQYoRz9MNngo*J%3+15%ET|lMHE-um*4ALGcWcsfQK=Eo-28$+jh2v>#s=rLeNWWo zTDto70eAi{`>3h04^pth##*alG zgn48pj8dS>r0KjP?d&mZjsy4Cnq5&Up*cQQTiwp<({;c8moIq3gn`XA2>sPf{m;%9 zr02-QuKn{U2`NdXjGSA)!ATnQvuaVJF|~;S8GcG=CWL?ZIQ|53NKX=~cL=n%wN)NW z<_))TraN3NXaDlpLbF@{#jqZpwPXPJog9$oG-;rvO_Zlk$f|dE*KRiBSjx!-OAW4I zjAoRC0V_uawQIx^cFl;WwP@FpawyP9F(v%A!K-O*5*Yf`Q9Tm?Q#?t+Y|Es--osGb zEoot0U%xk-ua4(`u1Rh?C=IblJV=ZBZRFiC>wi-tFL=f_O-NPq!kXh|)yL*IPB(5H zLCwRi07nU+q=c<%G-FTvV$`7UPliDQWCn5iTgP}>W!!als}CIVURr{0+gXh&a;{$` zx+4e|pF7zzLP83z-ES)#PXc=|LQo&Ely?y&@OCa`BoQR@g8P>K{sq99SXrSCY2im^ zq|p>f5Mv-6y6{(k(FBSU8@Gm{zei-S6USOqsep?z*o@EG!e>zMcn{`vq8qCV7#XZP zus;pV>lFtuPi>tLH()a;R94R*V{*ME5hn5Cs3_2yfHaO=_)Qhs8;qBncJ#z!7!vf1brhgX$e5nAsnE&GK{CjdgiQm>`%N!eJPv$f^NJwc0 z!l?;#dFD()iwMDoLsM0`Am$sRw$va>%|jFr{X)r5ruLd>$UoEFYx&5uL)Yyr{JkD} zo=AM{>hApGDqGm!wIfT-0gw`+WTdJwDRd&$hHB%{`k9DoFxUVTE_&hE03M?Pg+gDM zGURc8uIbDDga1tMDQtPxxK=*;^UX6Nk$4H9{trc1KszId1`Fn+kTHK|()X%0djg3V zLilf0IO8#?sUY41hn=C1G3B^+IL#5UqH8W5S~jzc=4$Z2cqEjv7^D`S|eFLH*;i)W|E;EIO9yqZ!93p<-D zRu;cZuE?4_Q=KbMp@2I3&#bh&^uo@n?rk{Fk267+jV^b6;YKc$dA5t?&BYoJFO39}4g(SXd0H)&1ifu7x(ShuYQ= zpGM&QmoNv|40H^9&FIekhP&aB&-6B08&-~PqXZ!Z#2{lBYE`saRT-V8tgnCo-MbTA zLupy+FX1GBEUUmw7+Ja=5w%Fes2*!DiUpDiHf+;3vtY{cSc)bqG<$s#p%dj-Ohu8b zN_pJeQVPn23bazesYLutG5iJ77)UzX(NS`_!~Q&{$KA^}z0S^WW_%!2K{r+bHM~3A zKO>P_1-v|@cWeitYo{*JhdEWtgqSinU!Lt7N_ZPZV0t^;I4!^^me`=XTOVfRBUw=Ch%wHqva!@A}v&wO# zp%>Oq_Xf0vEsKu89;fg|7kPp-%mpuL5nPJynOwCuh>8TPbHDyM*``^mT@@z0x%TUk z{tztmiNMP!$~YDR-NF7CNl4!vP%qTOf1j|uMu{U8L!F!xr+1PwAMUN_iAwj}6 z(Miqv!E!fNv=0}az9-|BRsq7cZ@!)q?le1~Y+%uX2?-xJ1}LyIRvi zUv;Hn%ZdwZnA~=Wm0brKdShXmX(Op*-bO$dBn=QQw8g}HPnlC~5`(=LilxJtjPv~=%!?tiia=luP)C-*$&#AGC@j-0v9&s#|A>3H?L z+x^$C&TVv28Y!6=H0&_?89_x&ZLG>nzmaO@PSi55TH*pvN6!^a%T5Y!UkVCPh4L)b zXnkcRu_-MeAp|WsqC)10UtxatauT=Yj#$=X>O4}Ep(~0gB`XnB6p)dyhnQ)v85s#) z`^NWtVl14!{_%P$y-I+@GUfeN zPTrpDb`sNg#UGaBjKZD@q!r1~`o>5^Nu>;-mcqxVM<7%KQDO!GkWRz+&*FikP>1@@ zA=CBW^)H8euY-d^HMQuX)JAYiZ~$x|Jy5%4a$?5=^kwh>-0NK@IV1X6P#vE$o`|y_ zOC@I1-+YN48yexDBf&!#pn&&jLKxAwN43@!G_b`b(#(v^T{`p`Avo*amTKn2K9+9M zYUC(EL6Z*BUo~ySOUBW;3 zbDm>vxZKnd)UeimR{o-4qRk(to1vwrq9!D~jH$tf_jJWN<- zPGVg_O+>-##3WTcw7~lonE_Z8mB7^)%s}%Lgb*-U#*(9V8MAw`DRmNItzeiAJ8`Y2 zUoQWTP=&G0>8;b}Y6tVOA2XNTBELJ}v_>wnzN4Mn$8rPuHlS0cH}zEX8UQjp87NsC zK;xuNS;P;jj)ubt#m=N;wZ53v`mjkFEjRyp3TiVo4otE>@hlp1FAuc7&xF4V8{!=* z?D+vSV{`pCtK<8!cf>c`-i z8QG%-&aAMtH76Uc+Q|XJb$!i+{B^gR-ekisg7wcwdzdE<$PedlX5L+vR*z!;(|zws zH<<5AzrPY-=N7iU4uDC$ zc_i0f;-Nr3HzDjEs*igMS!Dpa0#OoX12D)R|>EdpNaWqiMf)% z+9)+ZS&f@et&XyEfi*Ld-^666EBL!#dvdl-nuvmN$Up@<9$u=a9Ho~lZM|wlpZup;-0&!` z%Kj9Ah8|Ak4}DxcvOE981bxov^SYa&^Iyuz?PGUY-Wh!U3|vBT>)Kama*YRh*(KU6`95Czzz&16db zL>z*p48n&_rpGJE_oCq+#3dwPRPY&H^>GtvRHXRuKPy2TOl+Lp11GhbF|nqV+u#j)Sh zIFl`aL#0Md)n1hv>u9GDfeFaawwjvc4A3@2o((CEd;$eo^Y_m6QkCs8D&}F~1J1jm z2F$JD2rYiCo`^&=IG?urJk1R6;pTfJOyzd;rnA|F=YC#3x<7n!DD<|rvU)gpzN_(7 z{DX~ByD{-#YbA4)*%3oH0nRaxb$m8DoFZG!GjBF@%I)CFK`TnG*I``OrN ztC5x#5dnQaK}I4XP@)J=QqfFXoVtjfKY(%U2muUTT=Jr0S~J+3QvpOja0yAhY_GV*$6e<_%J$)zkK>rf=8H#s zR_aln`N%K<_L6!ySyC=?+8s^!U|rfPT{u&+F?plPN9*6HM7@;PMT+X6x7eZgaXDSA83)j8;?ce}g#-gbSE51!L7Vdt)gsfMGC zP@yzasgr{RQ_@QVWa_a_YA}=Yh%33;NjQjzDVYlrbo^iZA2Z;3J2p_-ckmpZGw+nG ztseFMzJHp|Or^0s-*s`Y`{3BB^g)Aiy%8_80bk38`*&8L5tSqfJc&6+SZpjDYn9ax z{>*>z4MG*fnlYuT*VP`NM0X5#w8e8wub&%i6|1h*5yw|K6byrC87=1uqDB?$#tMsI z!Kuwx_1G`-CwErf-XwEJcoGbJ5G^Q4wv{8^v$1$&DhH$N9nTEe)GJHAB>c1T=<38> znftf}-33bm4^uw`m~sZdK_48l*1?ZXQf<9rE(e2+aztlNtU(~1#k?G6>*e2*=qJ<^ z@*FimAuCCBqEk5ntwiFFlgv#$JIr}w*Z+o|ejD@FXPKb&siVEzzi*4a9_2qtMM*il zzmi+kX|u3=tbwtzdK5fVJ1@CjWV^bYi+73oORBA7;1lb3#_~a)$*{G)vHM4Ty#x?# z&>HSijj-RUn^G)gV7O*ju1dli*Huk?$U;HTTqxlyZo=1i$0}v40M#rX>VuL9Ze(_1 z*sC1mjDyRmtO%etV{5yF>ar$6!ffO0&or=e+E2IE+rO3NM-8~;mxujITeE{UWKlJW zbRE-2`{ikxNaPz!T8~Dp+4|$m>gr43Bk0&PxbwJ`Vwt>*ltJp91BCJ+IoiKHs=JPK z{vIRlx>oX}=gsE7WS-vj+FL!wo4VrPxWBX3JAYit->aw)|H3gw$CqvW%&Z`9%<|zRuU{$jge*TXGRkq;D9p*aNJVC_Y~$! zQl{eokD3gUJQ5+ykdY(_GbuwVAOe5hhp1SJi3GRu-Ji+j76B zV#ho8IYk*AgTrRHl2S8FudR0qy}t-zkq{=Lx7|~6hDK%qkB6m(^jbUHPETLo)0RJN z=`74F$vBil1vpezC=?$ll0$k~`iK6duV}Hm)^f}$#Zq=fF4^VmPBFkNU;mpGZgORX zu{`50>x%;a&B_bN_AnTSARSP$Hz`?>(h4REQb?#GU{!Jug^bPJp77lKl*5XpCgv5horjSKiYOIP z5Thvk#j;nSq3gbos^$yH*H7BH$0qXu^(wtJIePQ9LcOZTLUOp*D>m_S{}Xu`JxMiz zq9gMF74E{OURntV8l8fotW&>fhMG=Tg#&sw&k7NFMU}%+{a*-eH$PicaqyPIujXIV zgFFnrG)S>x#iy@%TPybIf?fhNajBp?XLa)0e_Sn4fxoh<%o1tID1cJGM;K8SS#uz7M<|~eH+KZfPZ-JAXd*Z9UkoH#^l&5UDu1{Fv*sqfw(d+fpEb1mZG`RZ$j8EM7S^@A=E2f)Yxcis z`77!Bh074-4+J93ZLK=E)xK0?-NR`f7D@sA*&C_r7ZkDo-o#J)S_ zg`*Dshvk4M71_S1dW`OMf-a4}Wyo+IKDcdry30ntscq=r<&V-?inSqmGeCxa{g8pLgM?sNqKZ?gOBT@vf1pPC=!k}4EW4Q+tiU*`FRg!g=m3dW{&#ejw3wx|eMZN&=}I1X zO8Iy8$_z@AXfl~HLAv-=*`~DUo3IBcv=NBIwu7bQ9$c`QgC}% zgmRu4)NRi|fx4|AeWvorFP--=@S^yl6mwWs7U~)u0&{c_*;fL6-Oj}zrQKlTgVGOr zpUl2(JPTOtQ5ojX=+hBgF3B4Nom5qMtO~5p7$EB!DF63~E!{eJzg%<~T@v_nf9ijF zJoMJn-P!n-<%^8@|IzdoY;Cqp*CX49;VL=hw z{mu4&T!5s6oiRK!jL@$tJkZI&XmiN04L|zsY%#G?+4PI}uOw{)u z;QsY1=46>O_&9xt+e44|O*>h9jvr8`0f~V^%NfuC(P0~C$y>gb9h4)AROmEOob>xT z$>rLq*zl-S+%fwaSz)dwy-+4~P5h~vX_%Za#MJIGlfCFrA-Hrq48jazlwIk&1dJ+^8(*u`=@FF- z&0M$)E`pW0Y@VX`KI_U!^*ZHJ_cmDs4*IJB8zdjdM4AE?3<>eP;Bg?BxuDQwn%yZr zgJ|8)V03&Wp3fbBew817^DiO@)MngRY2dhX9r>Ut47*Q{DS5u)#{4z0(V~RH$HW~U zn8|sO^jq9UlOAXSkZM>-{1cP9ji%q}iexz^T12lbT3x1`n`Aj=P)(O~^te^~HuUN@ zOtG?{CD2*l?zvc(s$h^W2`&;3rl+kLDRi8i2SfsSO{wM9O6VKGleAvX z@SMadZDF2Wok%QCT?%gxu3==lI-7Z=p&V$3mx%h1C4z3@slpB z-k~;s|NB|O*P&~^!{zJO8vvd?`#)22w*(Um^?BU#(s~WUw4wUo{3>(p0_M+u^^hS5 zT$OGgs7jrC7u~pIf_RkFT8zJp6zA9zO#d;nPzvWj<`|$W4gvULT9lR&fFLQ+b?gI7 z97#3DGc1zDINR;Jt9;dm1B9MuDKS(K2^IKs?$rb;0MQJj&rB7DGG^&=91Z^c+tuZ` z>JjJRp7+|CwkAZR{+ZngdaTLmx9zhwZ9ww>yloe0w9WreNMBoXu(h{``Anq}D5 zwnkS+o5(fl0|{6T4`(?pptePT%$zm%*nK5j@L_|Rr1H}^IsdQDZO+?hLV0OmzZ@RY1~Eq;fB`kDd~%?| zBRJovS5;lY+*4Iwf3u%rF|p=tc!C@Xo0w2Nhjgi_*rVvRnJ3nj$)O)fkI^_^6T#Qg zaF}Y?Cb_NN3*NeW3=U7%3mRdp>fnFT=F0O*1Fy{9G$54RX+J*MoOXsOJYngLXe$dN_RG zXfR=_O!hCR_}|8mkfww(Q>x79^2A6B9#~EU>eJO0QzPQJpN#*Q<8ZJHdftv``)x%| zd)_CM9b{OtJxvy`xDqL`v0<&ZwXZyF{H^sdwyxFU5<)4J3(bTefFmS16li~PG<|-~?DMYx$9f2Sy6sG$l zm*ckMheN8J+C%sbJA>9B=~iv1_%*p1d50e@b?39MjZL`8TJI5{?-hWVC;Z7j9U)q;WE@#s{X%RB>9GWY65o_l#s6)9Pch(
CSdp@Xjh0v=1TV$i(aaVJb=>7c^@Jy?y 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 z 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 P{#C7|rUx%ku?hJf;A3yn literal 0 HcmV?d00001 diff --git a/Huntarr.io-6.3.6/frontend/static/logo/512.png b/Huntarr.io-6.3.6/frontend/static/logo/512.png new file mode 100644 index 0000000000000000000000000000000000000000..3740908d1ca75a7a1ae6b595f99a825afec8cd19 GIT binary patch literal 211042 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