Giter Site home page Giter Site logo

buildarr / buildarr-prowlarr Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 1.0 271 KB

Prowlarr indexer manager plugin for Buildarr

Home Page: https://buildarr.github.io/plugins/prowlarr

License: GNU General Public License v3.0

Python 100.00%
buildarr prowlarr sonarr

buildarr-prowlarr's Issues

Tag v0.4.0

Checklist:

  1. Set milestone to v0.4.0
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.3.1..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #30
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6757385046
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6757393069
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Error While Trying To Access Existing Prowlarr Config

Hi! Nifty tool ๐Ÿ˜„. Always seemed odd to me that all the Arr tools were so click-ops centric. I'm looking to integrate it into my stack.

While I was trying to onboard buildarr-prowlarr, I ran into this issue any time the plugin was trying to download the existing Prowlarr config:

2023-10-18 15:13:06,493 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (prowlarr) Fetching remote configuration to check if updates are required
Traceback (most recent call last):
  File "/usr/local/bin/buildarr", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 568, in daemon
    ).start()
      ^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 113, in start
    self._initial_run()
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 226, in _initial_run
    run_apply(secrets_file_path=self._secrets_file_path)
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 287, in _run
    remote_instance_config = manager.from_remote(instance_config, instance_secrets)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 171, in from_remote
    return instance_config.from_remote(secrets)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/__init__.py", line 157, in from_remote
    settings=ProwlarrSettings.from_remote(secrets),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/indexers/indexers.py", line 654, in from_remote
    definitions[indexer.name] = Indexer._from_remote(
                                ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/indexers/indexers.py", line 280, in _from_remote
    value: Any = remote_attrs["indexerUrls"][field["value"]]
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
TypeError: list indices must be integers or slices, not str

A few items of note:

  1. This still happens even if I run the dump-config command
  2. The only configuration in my Prowlarr instance is a single indexer (OPS)
  3. I am pulling the latest version of both Prowlarr and Buildarr

Here is my builder.yml that I was trying to startup with, but I don't think the configuration affects anything since I don't think buildarr got past downloading the remote config from prowlarr. Figured I'd send it just in case:

buildarr:
  watch_config: true
  update_days:
    - "monday"
    - "tuesday"
    - "wednesday"
    - "thursday"
    - "friday"
    - "saturday"
    - "sunday"
  update_times:
    - "03:00"

prowlarr:
  # Configuration common to all prowlarr instances can be defined here.
  # settings:
  #   ...
  instances:
    # Name of the instance as referred to by prowlarr.
    # Assign instance-specific configuration to it.
    prowlarr:
      host: "host.docker.internal"
      port: 9696
      protocol: "http"
      api_key: "<redacted>"

Happy to provide any additional details or help debug. Thanks again for making this tool

Upgrade to Buildarr v0.8

Buildarr v0.8 is planned to provide a number of backwards-incompatible changes, chief of which is the upgrade to Pydantic V2.

This plugin will need to be adapted with these changes in mind.

Tag v0.5.1

Checklist:

  1. Set milestone to v0.5.1
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.5.0..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #56
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/7066342294
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/7066347476
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Radarr app setting create: TypeError: 'ApplicationResource' object is not a mapping

While trying to create the radarr app setting in prowlarr I'm getting the following error:

2023-11-05 14:42:11,944 buildarr:1 buildarr.cli.daemon [INFO] Buildarr version 0.6.1 (log level: INFO)
2023-11-05 14:42:11,944 buildarr:1 buildarr.cli.daemon [INFO] Loading configuration file '/config/buildarr.yml'
2023-11-05 14:42:11,972 buildarr:1 buildarr.cli.daemon [INFO] Finished loading configuration file
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO] Daemon configuration:
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]  - Watch configuration files: Yes
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]  - Configuration files to watch:
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - /config/buildarr.yml
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - /prowlarr/prowlarr.yaml
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]  - Update at:
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Monday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Tuesday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Wednesday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Thursday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Friday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Saturday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO]    - Sunday 03:00
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO] Scheduling update jobs
2023-11-05 14:42:11,973 buildarr:1 buildarr.cli.daemon [INFO] Finished scheduling update jobs
2023-11-05 14:42:11,974 buildarr:1 buildarr.cli.daemon [INFO] Enabling config file monitoring
2023-11-05 14:42:11,974 buildarr:1 buildarr.cli.daemon [INFO] Finished enabling config file monitoring
2023-11-05 14:42:11,974 buildarr:1 buildarr.cli.daemon [INFO] Applying initial configuration
2023-11-05 14:42:11,981 buildarr:1 buildarr.cli.run [INFO] Loaded plugins: jellyseerr (0.2.0), prowlarr (0.4.0), radarr (0.1.1), sonarr (0.5.4)
2023-11-05 14:42:11,981 buildarr:1 buildarr.cli.run [INFO] Loading instance configurations
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Finished loading instance configurations
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Running with plugins: prowlarr
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Resolving instance dependencies
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Finished resolving instance dependencies
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Rendering instance configuration dynamic attributes
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Finished rendering instance configuration dynamic attributes
2023-11-05 14:42:11,983 buildarr:1 buildarr.cli.run [INFO] Loading secrets file from '/secrets/secrets.json'
2023-11-05 14:42:11,984 buildarr:1 buildarr.cli.run [INFO] Secrets file does not exist, will create new file
2023-11-05 14:42:11,984 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Checking secrets
2023-11-05 14:42:11,984 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Connection test failed using cached secrets (or not cached), fetching secrets
2023-11-05 14:42:11,988 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Connection test successful using fetched secrets
2023-11-05 14:42:11,988 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Finished checking secrets
2023-11-05 14:42:11,988 buildarr:1 buildarr.cli.run [INFO] Saving updated secrets file to '/secrets/secrets.json'
2023-11-05 14:42:11,989 buildarr:1 buildarr.cli.run [INFO] Finished saving updated secrets file
2023-11-05 14:42:11,989 buildarr:1 buildarr.cli.run [INFO] Performing post-initialisation configuration render
2023-11-05 14:42:11,989 buildarr:1 buildarr.cli.run [INFO] Finished performing post-initialisation configuration render
2023-11-05 14:42:11,989 buildarr:1 buildarr.cli.run [INFO] Updating configuration on remote instances
2023-11-05 14:42:11,989 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Fetching remote configuration to check if updates are required
2023-11-05 14:42:12,036 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Finished fetching remote configuration
2023-11-05 14:42:12,044 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Updating remote configuration
2023-11-05 14:42:12,060 buildarr:1 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Radarr'].prowlarr_url: 'http://prowlarr.prowlarr' -> (created)
2023-11-05 14:42:12,060 buildarr:1 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Radarr'].base_url: 'http://radarr.radarr' -> (created)
2023-11-05 14:42:12,060 buildarr:1 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Radarr'].sync_level: 'full-sync' -> (created)
2023-11-05 14:42:12,060 buildarr:1 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Radarr'].sync_categories: {'movies/sd', 'movies/hd', 'movies/other', 'movies/foreign', 'movies', 'movies/dvd', 'movies/bluray', 'movies/uhd', 'movies/web-dl', 'movies/3d'} -> (created)
2023-11-05 14:42:12,060 buildarr:1 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Radarr'].tags: set() -> (created)
2023-11-05 14:42:12,060 buildarr:1 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Radarr'].api_key: '**********' -> (created)
Traceback (most recent call last):
  File "/usr/local/bin/buildarr", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 568, in daemon
    ).start()
      ^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 113, in start
    self._initial_run()
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 226, in _initial_run
    run_apply(secrets_file_path=self._secrets_file_path)
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 300, in _run
    if manager.update_remote(
       ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 192, in update_remote
    return local_instance_config.update_remote(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 272, in update_remote
    if isinstance(field, ConfigBase) and field.update_remote(
                                         ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/__init__.py", line 70, in update_remote
    self.apps.update_remote(
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 272, in update_remote
    if isinstance(field, ConfigBase) and field.update_remote(
                                         ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 740, in update_remote
    local_application._create_remote(
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 207, in _create_remote
    remote_attrs = {"name": application_name, **api_schema, **set_attrs}
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'ApplicationResource' object is not a mapping

Note that no application is created in Prowlarr. Does radarr actually need to exist for the config the successfully push? I know this is required in the Prowlarr UI but I hoped this would not be the case through buildarr/ the api.

Tag v0.4.3

Checklist:

  1. Set milestone to v0.4.3
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.4.2..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #46
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6782156880
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6782168208
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Prowlarr v1.13: Passwords and API keys are obfuscated in API responses

Prowlarr v1.13 introduced a change where any passwords or API keys returned via the API (and to the UI) are obfuscated with * characters.

This makes it impossible to idempotently check and update resources with API keys or passwords in them. It also means the values returned by the API no longer satisfy the value constraints Buildarr places on the configuration.

2024-04-25 15:32:04,558 buildarr:82 buildarr.cli.run [INFO] Finished updating configuration on remote instances
2024-04-25 15:32:04,559 buildarr:82 buildarr.cli.run [INFO] Deleting unmanaged/unused resources on remote instances
2024-04-25 15:32:04,559 buildarr:82 buildarr.cli.run [INFO] <prowlarr> (default) Refetching remote configuration to delete unused resources
Traceback (most recent call last):
  File "/usr/local/bin/buildarr", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 101, in run
    _run(use_plugins)
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 273, in _run
    remote_instance_config = manager.from_remote(instance_config, instance_secrets)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 171, in from_remote
    return instance_config.from_remote(secrets)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/__init__.py", line 169, in from_remote
    settings=ProwlarrSettings.from_remote(secrets),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 695, in from_remote
    definitions={
                ^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 698, in <dictcomp>
    ]._from_remote(
      ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 178, in _from_remote
    return cls(
           ^^^^
  File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for RadarrApplication
api_key
  ensure this value has at least 32 characters (type=value_error.any_str.min_length; limit_value=32)

As a temporary workaround to get Buildarr working for users again, loosen the restrictions

Related:

Tag v0.3.0

Checklist:

  1. Set milestone to v0.3.0
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.2.0..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #17
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6127176687
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6127184711
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Tag v0.5.2

Checklist:

  1. Set milestone to v0.5.2
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.5.1..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #63
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/8847358229
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/8847377404
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Tag v0.5.0

Checklist:

  1. Set milestone to v0.5.0
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.4.3..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #50
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6839538877
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6839546136
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Confusing Error Message Trying To Update Prowlarr

Hi once again ๐Ÿ˜„.

I am trying to use Buildarr for all my *arr setups in my repo here. Here is my builldarr config.

When I startup the pod, which is configured to update Prowlarr, I get this error message (I'm using debug level logging):

2024-06-22 23:04:35,338 buildarr:1 buildarr_prowlarr.config.settings.indexers.indexers [INFO] <prowlarr> (prowlarr) prowlarr.settings.indexers.indexers.definitions['Orpheus'].fields['torrentBaseSettings.appMinimumSeeders']: None (created)
2024-06-22 23:04:35,338 buildarr:1 buildarr_prowlarr.config.settings.indexers.indexers [INFO] <prowlarr> (prowlarr) prowlarr.settings.indexers.indexers.definitions['Orpheus'].fields['torrentBaseSettings.seedRatio']: None (created)
2024-06-22 23:04:35,338 buildarr:1 buildarr_prowlarr.config.settings.indexers.indexers [INFO] <prowlarr> (prowlarr) prowlarr.settings.indexers.indexers.definitions['Orpheus'].fields['torrentBaseSettings.seedTime']: None (created)
2024-06-22 23:04:35,338 buildarr:1 buildarr_prowlarr.config.settings.indexers.indexers [INFO] <prowlarr> (prowlarr) prowlarr.settings.indexers.indexers.definitions['Orpheus'].fields['torrentBaseSettings.packSeedTime']: None (created)
2024-06-22 23:04:35,347 buildarr:1 urllib3.connectionpool [DEBUG] <prowlarr> (prowlarr) Starting new HTTP connection (1): prowlarr.media.svc.cluster.local:80
send: b'POST /api/v1/indexer HTTP/1.1\r\nHost: prowlarr.media.svc.cluster.local\r\nAccept-Encoding: identity\r\nContent-Length: 6336\r\nAccept: application/json\r\nContent-Type: application/json\r\nUser-Agent: prowlarr-py/v0.4.1\r\nX-Api-Key: foobarbazfoobarbazfoobarbazfooba\r\n\r\n'
send: b'<REDACTED>'
reply: 'HTTP/1.1 400 Bad Request\r\n'
header: Content-Type: application/json
header: Date: Sat, 22 Jun 2024 23:04:35 GMT
header: Server: Kestrel
header: Cache-Control: no-cache,no-store
header: Expires: -1
header: Pragma: no-cache
header: Transfer-Encoding: chunked
2024-06-22 23:04:36,495 buildarr:1 urllib3.connectionpool [DEBUG] <prowlarr> (prowlarr) http://prowlarr.media.svc.cluster.local:80 "POST /api/v1/indexer HTTP/1.1" 400 None
2024-06-22 23:04:36,497 buildarr:1 prowlarr.rest [DEBUG] <prowlarr> (prowlarr) response body: b'[\n  {\n    "isWarning": false,\n    "propertyName": "",\n    "errorMessage": "Query successful, but no results were returned from your indexer. This may be an issue with the indexer, your indexer category settings, or other indexer settings such as search freeleech only etc.",\n    "severity": "error"\n  }\n]'
2024-06-22 23:04:36,498 buildarr:1 buildarr.cli.daemon [ERROR] <prowlarr> (prowlarr) An error occurred while applying initial configuration: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Content-Type': 'application/json', 'Date': 'Sat, 22 Jun 2024 23:04:35 GMT', 'Server': 'Kestrel', 'Cache-Control': 'no-cache,no-store', 'Expires': '-1', 'Pragma': 'no-cache', 'Transfer-Encoding': 'chunked'})
HTTP response body: [
  {
    "isWarning": false,
    "propertyName": "",
    "errorMessage": "Query successful, but no results were returned from your indexer. This may be an issue with the indexer, your indexer category settings, or other indexer settings such as search freeleech only etc.",
    "severity": "error"
  }
]
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 215, in _initial_run
    run_apply()
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 248, in _run
    if manager.update_remote(
       ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 192, in update_remote
    return local_instance_config.update_remote(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 272, in update_remote
    if isinstance(field, ConfigBase) and field.update_remote(
                                         ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/__init__.py", line 76, in update_remote
    self.indexers.update_remote(
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/indexers/__init__.py", line 54, in update_remote
    self.indexers.update_remote(
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/indexers/indexers.py", line 695, in update_remote
    indexer._create_remote(
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/indexers/indexers.py", line 413, in _create_remote
    prowlarr.IndexerApi(api_client).create_indexer(
  File "pydantic/decorator.py", line 40, in pydantic.decorator.validate_arguments.validate.wrapper_function
  File "pydantic/decorator.py", line 134, in pydantic.decorator.ValidatedFunction.call
  File "pydantic/decorator.py", line 206, in pydantic.decorator.ValidatedFunction.execute
  File "/usr/local/lib/python3.11/site-packages/prowlarr/api/indexer_api.py", line 76, in create_indexer
    return self.create_indexer_with_http_info(force_save, indexer_resource, **kwargs)  # noqa: E501
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "pydantic/decorator.py", line 40, in pydantic.decorator.validate_arguments.validate.wrapper_function
  File "pydantic/decorator.py", line 134, in pydantic.decorator.ValidatedFunction.call
  File "pydantic/decorator.py", line 206, in pydantic.decorator.ValidatedFunction.execute
  File "/usr/local/lib/python3.11/site-packages/prowlarr/api/indexer_api.py", line 184, in create_indexer_with_http_info
    return self.api_client.call_api(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/prowlarr/api_client.py", line 413, in call_api
    return self.__call_api(resource_path, method,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/prowlarr/api_client.py", line 228, in __call_api
    raise e
  File "/usr/local/lib/python3.11/site-packages/prowlarr/api_client.py", line 218, in __call_api
    response_data = self.request(
                    ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/prowlarr/api_client.py", line 457, in request
    return self.rest_client.post_request(url,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/prowlarr/rest.py", line 270, in post_request
    return self.request("POST", url,
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/prowlarr/rest.py", line 229, in request
    raise ApiException(http_resp=r)
prowlarr.exceptions.ApiException: (400)
Reason: Bad Request
HTTP response headers: HTTPHeaderDict({'Content-Type': 'application/json', 'Date': 'Sat, 22 Jun 2024 23:04:35 GMT', 'Server': 'Kestrel', 'Cache-Control': 'no-cache,no-store', 'Expires': '-1', 'Pragma': 'no-cache', 'Transfer-Encoding': 'chunked'})
HTTP response body: [
  {
    "isWarning": false,
    "propertyName": "",
    "errorMessage": "Query successful, but no results were returned from your indexer. This may be an issue with the indexer, your indexer category settings, or other indexer settings such as search freeleech only etc.",
    "severity": "error"
  }
]

2024-06-22 23:04:36,516 buildarr:1 buildarr.cli.daemon [WARNING] Aborted applying initial configuration
2024-06-22 23:04:36,615 buildarr:1 buildarr.cli.daemon [INFO] Setting up signal handlers
2024-06-22 23:04:36,616 buildarr:1 buildarr.cli.daemon [DEBUG] Setting up SIGINT signal handler
2024-06-22 23:04:36,616 buildarr:1 buildarr.cli.daemon [DEBUG] Setting up SIGTERM signal handler
2024-06-22 23:04:36,617 buildarr:1 buildarr.cli.daemon [DEBUG] Setting up SIGHUP signal handler
2024-06-22 23:04:36,617 buildarr:1 buildarr.cli.daemon [INFO] Finished setting up signal handlers
2024-06-22 23:04:36,618 buildarr:1 buildarr.cli.daemon [INFO] The next run will be at 2024-06-23 02:30
2024-06-22 23:04:36,619 buildarr:1 buildarr.cli.daemon [INFO] Buildarr ready.
2024-06-22 23:04:36,619 buildarr:1 buildarr.cli.daemon [DEBUG] Thread 'MainThread' releasing daemon run lock

The logs seem to indicate that we're sending an invalid request that's somehow related to the indexer results ๐Ÿค”? I'm struggling to make sense of that one. If you have some time to take a look, any pointers would be appreciated here ๐Ÿ™.

Tag v0.4.2

Checklist:

  1. Set milestone to v0.4.2
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.4.1..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #42
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6777982330
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6777989786
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Tag v0.2.0

Checklist:

  1. Set milestone to v0.2.0
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.1.1..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #12
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/4711619090
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/4711624398
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Create initial plugin

Create the Buildarr plugin for configuring and managing the Prowlarr indexer manager.

  • Use prowlarr-py to create API-compatible objects and communicate with Prowlarr instances, if possible
    • Fallback: Make direct requests to the Prowlarr API, like the Sonarr plugin does
  • Like Sonarr V4, Prowlarr is planning to enable authentication by default for the V1 release, so consider how that can be handled

Tag v0.5.3

Checklist:

  1. Set milestone to v0.5.3
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.5.2..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #68
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/8871167907
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/8871176249
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Add support for dry runs

At the moment, the Prowlarr plugin does not handle dry runs, and carries on as it normally would.

We need to add support for this.

Tag v0.4.1

Checklist:

  1. Set milestone to v0.4.1
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.4.0..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #33
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6759277345
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6759282873
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Tag v0.1.1

Checklist:

  1. Set milestone to v0.1.1
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.1.0..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #6
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/4644718992
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/4644736864
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Update plugin to newer Buildarr API standards

  • Move all resource deletion processing to the delete_remote stage
  • Remove all usage of BaseIntEnum
  • Get request_timeout from global state
  • Remove explicit definitions of validate_assignment

Add the `sync_reject_blocklisted_torrent_hashes` attribute for Arr application definitions

Discussed in buildarr/buildarr#206.

Looks like this is a new parameter for *Arr-type application definitions, added in Prowlarr v1.15.0.4631.

Add support for this field as sync_reject_blocklisted_torrent_hashes, and make the application updating code tolerant to new attributes being added in the future.

2024-04-27 15:48:06,550 buildarr:65 buildarr.cli.run [INFO] <prowlarr> (default) Fetching remote configuration to check if updates are required
2024-04-27 15:48:06,660 buildarr:65 buildarr.cli.run [INFO] <prowlarr> (default) Finished fetching remote configuration
2024-04-27 15:48:06,684 buildarr:65 buildarr.cli.run [INFO] <prowlarr> (default) Updating remote configuration
2024-04-27 15:48:06,721 buildarr:65 buildarr.config.base [INFO] <prowlarr> (default) prowlarr.settings.apps.applications.definitions['Sonarr'].api_key: '**********' -> '**********'
Traceback (most recent call last):
  File "/usr/local/bin/buildarr", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 101, in run
    _run(use_plugins)
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 248, in _run
    if manager.update_remote(
       ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 192, in update_remote
    return local_instance_config.update_remote(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 272, in update_remote
    if isinstance(field, ConfigBase) and field.update_remote(
                                         ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/__init__.py", line 70, in update_remote
    self.apps.update_remote(
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 272, in update_remote
    if isinstance(field, ConfigBase) and field.update_remote(
                                         ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 748, in update_remote
    elif local_application._update_remote(
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 233, in _update_remote
    set_attrs["fields"] = [
                          ^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 234, in <listcomp>
    {**f, "value": field_values[f["name"]]} for f in api_schema.to_dict()["fields"]
                   ~~~~~~~~~~~~^^^^^^^^^^^
KeyError: 'syncRejectBlocklistedTorrentHashesWhileGrabbing'

Set minimum Buildarr version to v0.6.1

The Prowlarr plugin requires Buildarr v0.6.1 when using email notification connections, due to that version containing built-in parsing support for NameEmail type attributes.

It otherwise works fine on v0.6.0, however, and on new Python installations v0.6.1 will be installed, so it is not as urgent an issue.

Tag v0.3.1

Checklist:

  1. Set milestone to v0.3.1
  2. Get the raw changelog using the following command:
    $ git log --oneline --decorate v0.3.0..HEAD
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #23
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6128973991
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://github.com/buildarr/buildarr-prowlarr/actions/runs/6128979262
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Tag v0.1.0

Checklist:

  1. Set milestone to v0.1.0
  2. Get the raw changelog
  3. Update the tool.poetry.version field in pyproject.toml
  4. Add release notes to docs/release-notes.md
  5. Create pull request: #2
  6. Merge pull request
  7. Check that the CI pipeline passed on main: https://github.com/buildarr/buildarr-prowlarr/actions/runs/4641942527
  8. Tag the new release
  9. Check that the release was automatically published to PyPI: https://pypi.org/project/buildarr-prowlarr/0.1.0 (manually published)
  10. Push an update to http://github.com/buildarr/buildarr-docker to release to Docker Hub
  11. Push an update to https://buildarr.github.io
  12. Close release milestone
  13. Create new release milestone
  14. Close this issue

Add Buildarr v0.7.0 support

Incompatible changes:

  • state.secrets has been replaced with state.instance_secrets (type Mapping[str, Mapping[str, SecretsPlugin])

ValueError: <AuthenticationType.EXTERNAL: 'external'> is not a valid AuthenticationMethod

According to the docs AuthenticationMethod should be set to External if authentication should be disabled but this value is not supported by buildarr.

https://wiki.servarr.com/prowlarr/faq#authentication-method

Note that this value comes from the remote config and is accepted by prowlarr:

2023-11-05 14:38:37,349 buildarr:1 buildarr.cli.daemon [INFO] Buildarr version 0.6.1 (log level: INFO)
2023-11-05 14:38:37,349 buildarr:1 buildarr.cli.daemon [INFO] Loading configuration file '/config/buildarr.yml'
2023-11-05 14:38:37,377 buildarr:1 buildarr.cli.daemon [INFO] Finished loading configuration file
2023-11-05 14:38:37,377 buildarr:1 buildarr.cli.daemon [INFO] Daemon configuration:
2023-11-05 14:38:37,377 buildarr:1 buildarr.cli.daemon [INFO]  - Watch configuration files: Yes
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]  - Configuration files to watch:
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - /config/buildarr.yml
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - /prowlarr/prowlarr.yaml
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]  - Update at:
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Monday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Tuesday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Wednesday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Thursday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Friday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Saturday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO]    - Sunday 03:00
2023-11-05 14:38:37,378 buildarr:1 buildarr.cli.daemon [INFO] Scheduling update jobs
2023-11-05 14:38:37,379 buildarr:1 buildarr.cli.daemon [INFO] Finished scheduling update jobs
2023-11-05 14:38:37,379 buildarr:1 buildarr.cli.daemon [INFO] Enabling config file monitoring
2023-11-05 14:38:37,379 buildarr:1 buildarr.cli.daemon [INFO] Finished enabling config file monitoring
2023-11-05 14:38:37,379 buildarr:1 buildarr.cli.daemon [INFO] Applying initial configuration
2023-11-05 14:38:37,386 buildarr:1 buildarr.cli.run [INFO] Loaded plugins: jellyseerr (0.2.0), prowlarr (0.4.0), radarr (0.1.1), sonarr (0.5.4)
2023-11-05 14:38:37,386 buildarr:1 buildarr.cli.run [INFO] Loading instance configurations
2023-11-05 14:38:37,387 buildarr:1 buildarr.cli.run [INFO] Finished loading instance configurations
2023-11-05 14:38:37,387 buildarr:1 buildarr.cli.run [INFO] Running with plugins: prowlarr
2023-11-05 14:38:37,388 buildarr:1 buildarr.cli.run [INFO] Resolving instance dependencies
2023-11-05 14:38:37,388 buildarr:1 buildarr.cli.run [INFO] Finished resolving instance dependencies
2023-11-05 14:38:37,388 buildarr:1 buildarr.cli.run [INFO] Rendering instance configuration dynamic attributes
2023-11-05 14:38:37,388 buildarr:1 buildarr.cli.run [INFO] Finished rendering instance configuration dynamic attributes
2023-11-05 14:38:37,388 buildarr:1 buildarr.cli.run [INFO] Loading secrets file from '/secrets/secrets.json'
2023-11-05 14:38:37,389 buildarr:1 buildarr.cli.run [INFO] Finished loading secrets file
2023-11-05 14:38:37,389 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Checking secrets
2023-11-05 14:38:37,393 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Connection test successful using cached secrets
2023-11-05 14:38:37,393 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Finished checking secrets
2023-11-05 14:38:37,393 buildarr:1 buildarr.cli.run [INFO] Saving updated secrets file to '/secrets/secrets.json'
2023-11-05 14:38:37,394 buildarr:1 buildarr.cli.run [INFO] Finished saving updated secrets file
2023-11-05 14:38:37,394 buildarr:1 buildarr.cli.run [INFO] Performing post-initialisation configuration render
2023-11-05 14:38:37,394 buildarr:1 buildarr.cli.run [INFO] Finished performing post-initialisation configuration render
2023-11-05 14:38:37,394 buildarr:1 buildarr.cli.run [INFO] Updating configuration on remote instances
2023-11-05 14:38:37,394 buildarr:1 buildarr.cli.run [INFO] <prowlarr> (default) Fetching remote configuration to check if updates are required
Traceback (most recent call last):
  File "/usr/local/bin/buildarr", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 568, in daemon
    ).start()
      ^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 113, in start
    self._initial_run()
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/daemon.py", line 226, in _initial_run
    run_apply(secrets_file_path=self._secrets_file_path)
  File "/usr/local/lib/python3.11/site-packages/buildarr/cli/run.py", line 287, in _run
    remote_instance_config = manager.from_remote(instance_config, instance_secrets)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 171, in from_remote
    return instance_config.from_remote(secrets)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/__init__.py", line 157, in from_remote
    settings=ProwlarrSettings.from_remote(secrets),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/general.py", line 585, in from_remote
    security=SecurityGeneralSettings._from_remote(remote_attrs),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/general.py", line 107, in _from_remote
    return cls(**cls.get_local_attrs(cls._remote_map, remote_attrs))
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 243, in get_local_attrs
    local_attrs[attr_name] = decoder(remote_attr)
                             ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 195, in <lambda>
    lambda v: cls._decode_attr(attr_name, v),
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 714, in _decode_attr
    return cls._decode_attr_(cls.__fields__[attr_name].outer_type_, value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 740, in _decode_attr_
    return type_tree[-1](value)
           ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/enum.py", line 712, in __call__
    return cls.__new__(cls, value)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/enum.py", line 1135, in __new__
    raise ve_exc
ValueError: <AuthenticationType.EXTERNAL: 'external'> is not a valid AuthenticationMethod

dump config key error on categories

Error when dumping existing config:

Traceback (most recent call last):
  File "/usr/local/bin/buildarr", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/cli.py", line 81, in dump_config
    .from_remote(
     ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/manager/__init__.py", line 171, in from_remote
    return instance_config.from_remote(secrets)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/__init__.py", line 157, in from_remote
    settings=ProwlarrSettings.from_remote(secrets),
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 85, in from_remote
    fields[field_name] = field.type_.from_remote(secrets)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 684, in from_remote
    definitions={
                ^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 687, in <dictcomp>
    ]._from_remote(
      ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 162, in _from_remote
    **cls.get_local_attrs(
      ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr/config/base.py", line 243, in get_local_attrs
    local_attrs[attr_name] = decoder(remote_attr)
                             ^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 120, in <lambda>
    "decoder": lambda v: cls._sync_categories_decoder(category_ids, v),
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 143, in _sync_categories_decoder
    return set(category_names[category_id] for category_id in api_sync_categories)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/buildarr_prowlarr/config/settings/apps/applications.py", line 143, in <genexpr>
    return set(category_names[category_id] for category_id in api_sync_categories)
               ~~~~~~~~~~~~~~^^^^^^^^^^^^^
KeyError: 2000

API content:

[
  {
    "syncLevel": "fullSync",
    "name": "Radarr",
    "fields": [
      {
        "order": 0,
        "name": "prowlarrUrl",
        "label": "Prowlarr Server",
        "helpText": "Prowlarr server URL as Radarr sees it, including http(s)://, port, and urlbase if needed",
        "value": "http://prowlarr:9696",
        "type": "textbox",
        "advanced": false,
        "placeholder": "http://localhost:9696",
        "isFloat": false
      },
      {
        "order": 1,
        "name": "baseUrl",
        "label": "Radarr Server",
        "helpText": "URL used to connect to Radarr server, including http(s)://, port, and urlbase if required",
        "value": "http://radarr:7878",
        "type": "textbox",
        "advanced": false,
        "placeholder": "http://localhost:7878",
        "isFloat": false
      },
      {
        "order": 2,
        "name": "apiKey",
        "label": "API Key",
        "helpText": "The ApiKey generated by Radarr in Settings/General",
        "value": "",
        "type": "textbox",
        "advanced": false,
        "isFloat": false
      },
      {
        "order": 3,
        "name": "syncCategories",
        "label": "Sync Categories",
        "helpText": "Only Indexers that support these categories will be synced",
        "value": [
          2000,
          2010,
          2020,
          2030,
          2040,
          2045,
          2050,
          2060,
          2070,
          2080
        ],
        "type": "select",
        "advanced": true,
        "selectOptions": [
          {
            "value": 0,
            "name": "Other",
            "order": 0,
            "hint": "(0)"
          },
          {
            "value": 10,
            "name": "Other/Misc",
            "order": 0,
            "hint": "(10)",
            "parentValue": 0
          },
          {
            "value": 20,
            "name": "Other/Hashed",
            "order": 0,
            "hint": "(20)",
            "parentValue": 0
          },
          {
            "value": 1000,
            "name": "Console",
            "order": 0,
            "hint": "(1000)"
          },
          {
            "value": 1010,
            "name": "Console/NDS",
            "order": 0,
            "hint": "(1010)",
            "parentValue": 1000
          },
          {
            "value": 1020,
            "name": "Console/PSP",
            "order": 0,
            "hint": "(1020)",
            "parentValue": 1000
          },
          {
            "value": 1030,
            "name": "Console/Wii",
            "order": 0,
            "hint": "(1030)",
            "parentValue": 1000
          },
          {
            "value": 1040,
            "name": "Console/XBox",
            "order": 0,
            "hint": "(1040)",
            "parentValue": 1000
          },
          {
            "value": 1050,
            "name": "Console/XBox 360",
            "order": 0,
            "hint": "(1050)",
            "parentValue": 1000
          },
          {
            "value": 1060,
            "name": "Console/Wiiware",
            "order": 0,
            "hint": "(1060)",
            "parentValue": 1000
          },
          {
            "value": 1070,
            "name": "Console/XBox 360 DLC",
            "order": 0,
            "hint": "(1070)",
            "parentValue": 1000
          },
          {
            "value": 1080,
            "name": "Console/PS3",
            "order": 0,
            "hint": "(1080)",
            "parentValue": 1000
          },
          {
            "value": 1090,
            "name": "Console/Other",
            "order": 0,
            "hint": "(1090)",
            "parentValue": 1000
          },
          {
            "value": 1110,
            "name": "Console/3DS",
            "order": 0,
            "hint": "(1110)",
            "parentValue": 1000
          },
          {
            "value": 1120,
            "name": "Console/PS Vita",
            "order": 0,
            "hint": "(1120)",
            "parentValue": 1000
          },
          {
            "value": 1130,
            "name": "Console/WiiU",
            "order": 0,
            "hint": "(1130)",
            "parentValue": 1000
          },
          {
            "value": 1140,
            "name": "Console/XBox One",
            "order": 0,
            "hint": "(1140)",
            "parentValue": 1000
          },
          {
            "value": 1180,
            "name": "Console/PS4",
            "order": 0,
            "hint": "(1180)",
            "parentValue": 1000
          },
          {
            "value": 2000,
            "name": "Movies",
            "order": 0,
            "hint": "(2000)"
          },
          {
            "value": 2010,
            "name": "Movies/Foreign",
            "order": 0,
            "hint": "(2010)",
            "parentValue": 2000
          },
          {
            "value": 2020,
            "name": "Movies/Other",
            "order": 0,
            "hint": "(2020)",
            "parentValue": 2000
          },
          {
            "value": 2030,
            "name": "Movies/SD",
            "order": 0,
            "hint": "(2030)",
            "parentValue": 2000
          },
          {
            "value": 2040,
            "name": "Movies/HD",
            "order": 0,
            "hint": "(2040)",
            "parentValue": 2000
          },
          {
            "value": 2045,
            "name": "Movies/UHD",
            "order": 0,
            "hint": "(2045)",
            "parentValue": 2000
          },
          {
            "value": 2050,
            "name": "Movies/BluRay",
            "order": 0,
            "hint": "(2050)",
            "parentValue": 2000
          },
          {
            "value": 2060,
            "name": "Movies/3D",
            "order": 0,
            "hint": "(2060)",
            "parentValue": 2000
          },
          {
            "value": 2070,
            "name": "Movies/DVD",
            "order": 0,
            "hint": "(2070)",
            "parentValue": 2000
          },
          {
            "value": 2080,
            "name": "Movies/WEB-DL",
            "order": 0,
            "hint": "(2080)",
            "parentValue": 2000
          },
          {
            "value": 2090,
            "name": "Movies/x265",
            "order": 0,
            "hint": "(2090)",
            "parentValue": 2000
          },
          {
            "value": 3000,
            "name": "Audio",
            "order": 0,
            "hint": "(3000)"
          },
          {
            "value": 3010,
            "name": "Audio/MP3",
            "order": 0,
            "hint": "(3010)",
            "parentValue": 3000
          },
          {
            "value": 3020,
            "name": "Audio/Video",
            "order": 0,
            "hint": "(3020)",
            "parentValue": 3000
          },
          {
            "value": 3030,
            "name": "Audio/Audiobook",
            "order": 0,
            "hint": "(3030)",
            "parentValue": 3000
          },
          {
            "value": 3040,
            "name": "Audio/Lossless",
            "order": 0,
            "hint": "(3040)",
            "parentValue": 3000
          },
          {
            "value": 3050,
            "name": "Audio/Other",
            "order": 0,
            "hint": "(3050)",
            "parentValue": 3000
          },
          {
            "value": 3060,
            "name": "Audio/Foreign",
            "order": 0,
            "hint": "(3060)",
            "parentValue": 3000
          },
          {
            "value": 4000,
            "name": "PC",
            "order": 0,
            "hint": "(4000)"
          },
          {
            "value": 4010,
            "name": "PC/0day",
            "order": 0,
            "hint": "(4010)",
            "parentValue": 4000
          },
          {
            "value": 4020,
            "name": "PC/ISO",
            "order": 0,
            "hint": "(4020)",
            "parentValue": 4000
          },
          {
            "value": 4030,
            "name": "PC/Mac",
            "order": 0,
            "hint": "(4030)",
            "parentValue": 4000
          },
          {
            "value": 4040,
            "name": "PC/Mobile-Other",
            "order": 0,
            "hint": "(4040)",
            "parentValue": 4000
          },
          {
            "value": 4050,
            "name": "PC/Games",
            "order": 0,
            "hint": "(4050)",
            "parentValue": 4000
          },
          {
            "value": 4060,
            "name": "PC/Mobile-iOS",
            "order": 0,
            "hint": "(4060)",
            "parentValue": 4000
          },
          {
            "value": 4070,
            "name": "PC/Mobile-Android",
            "order": 0,
            "hint": "(4070)",
            "parentValue": 4000
          },
          {
            "value": 5000,
            "name": "TV",
            "order": 0,
            "hint": "(5000)"
          },
          {
            "value": 5010,
            "name": "TV/WEB-DL",
            "order": 0,
            "hint": "(5010)",
            "parentValue": 5000
          },
          {
            "value": 5020,
            "name": "TV/Foreign",
            "order": 0,
            "hint": "(5020)",
            "parentValue": 5000
          },
          {
            "value": 5030,
            "name": "TV/SD",
            "order": 0,
            "hint": "(5030)",
            "parentValue": 5000
          },
          {
            "value": 5040,
            "name": "TV/HD",
            "order": 0,
            "hint": "(5040)",
            "parentValue": 5000
          },
          {
            "value": 5045,
            "name": "TV/UHD",
            "order": 0,
            "hint": "(5045)",
            "parentValue": 5000
          },
          {
            "value": 5050,
            "name": "TV/Other",
            "order": 0,
            "hint": "(5050)",
            "parentValue": 5000
          },
          {
            "value": 5060,
            "name": "TV/Sport",
            "order": 0,
            "hint": "(5060)",
            "parentValue": 5000
          },
          {
            "value": 5070,
            "name": "TV/Anime",
            "order": 0,
            "hint": "(5070)",
            "parentValue": 5000
          },
          {
            "value": 5080,
            "name": "TV/Documentary",
            "order": 0,
            "hint": "(5080)",
            "parentValue": 5000
          },
          {
            "value": 5090,
            "name": "TV/x265",
            "order": 0,
            "hint": "(5090)",
            "parentValue": 5000
          },
          {
            "value": 6000,
            "name": "XXX",
            "order": 0,
            "hint": "(6000)"
          },
          {
            "value": 6010,
            "name": "XXX/DVD",
            "order": 0,
            "hint": "(6010)",
            "parentValue": 6000
          },
          {
            "value": 6020,
            "name": "XXX/WMV",
            "order": 0,
            "hint": "(6020)",
            "parentValue": 6000
          },
          {
            "value": 6030,
            "name": "XXX/XviD",
            "order": 0,
            "hint": "(6030)",
            "parentValue": 6000
          },
          {
            "value": 6040,
            "name": "XXX/x264",
            "order": 0,
            "hint": "(6040)",
            "parentValue": 6000
          },
          {
            "value": 6045,
            "name": "XXX/UHD",
            "order": 0,
            "hint": "(6045)",
            "parentValue": 6000
          },
          {
            "value": 6050,
            "name": "XXX/Pack",
            "order": 0,
            "hint": "(6050)",
            "parentValue": 6000
          },
          {
            "value": 6060,
            "name": "XXX/ImageSet",
            "order": 0,
            "hint": "(6060)",
            "parentValue": 6000
          },
          {
            "value": 6070,
            "name": "XXX/Other",
            "order": 0,
            "hint": "(6070)",
            "parentValue": 6000
          },
          {
            "value": 6080,
            "name": "XXX/SD",
            "order": 0,
            "hint": "(6080)",
            "parentValue": 6000
          },
          {
            "value": 6090,
            "name": "XXX/WEB-DL",
            "order": 0,
            "hint": "(6090)",
            "parentValue": 6000
          },
          {
            "value": 7000,
            "name": "Books",
            "order": 0,
            "hint": "(7000)"
          },
          {
            "value": 7010,
            "name": "Books/Mags",
            "order": 0,
            "hint": "(7010)",
            "parentValue": 7000
          },
          {
            "value": 7020,
            "name": "Books/EBook",
            "order": 0,
            "hint": "(7020)",
            "parentValue": 7000
          },
          {
            "value": 7030,
            "name": "Books/Comics",
            "order": 0,
            "hint": "(7030)",
            "parentValue": 7000
          },
          {
            "value": 7040,
            "name": "Books/Technical",
            "order": 0,
            "hint": "(7040)",
            "parentValue": 7000
          },
          {
            "value": 7050,
            "name": "Books/Other",
            "order": 0,
            "hint": "(7050)",
            "parentValue": 7000
          },
          {
            "value": 7060,
            "name": "Books/Foreign",
            "order": 0,
            "hint": "(7060)",
            "parentValue": 7000
          },
          {
            "value": 8000,
            "name": "Other",
            "order": 0,
            "hint": "(8000)"
          },
          {
            "value": 8010,
            "name": "Other/Misc",
            "order": 0,
            "hint": "(8010)",
            "parentValue": 8000
          },
          {
            "value": 8020,
            "name": "Other/Hashed",
            "order": 0,
            "hint": "(8020)",
            "parentValue": 8000
          }
        ],
        "isFloat": false
      }
    ],
    "implementationName": "Radarr",
    "implementation": "Radarr",
    "configContract": "RadarrSettings",
    "infoLink": "https://wiki.servarr.com/prowlarr/supported#radarr",
    "tags": [],
    "id": 1
  },
  {
    "syncLevel": "fullSync",
    "name": "Sonarr",
    "fields": [
      {
        "order": 0,
        "name": "prowlarrUrl",
        "label": "Prowlarr Server",
        "helpText": "Prowlarr server URL as Sonarr sees it, including http(s)://, port, and urlbase if needed",
        "value": "http://prowlarr:9696",
        "type": "textbox",
        "advanced": false,
        "placeholder": "http://localhost:9696",
        "isFloat": false
      },
      {
        "order": 1,
        "name": "baseUrl",
        "label": "Sonarr Server",
        "helpText": "URL used to connect to Sonarr server, including http(s)://, port, and urlbase if required",
        "value": "http://sonarr:8989",
        "type": "textbox",
        "advanced": false,
        "placeholder": "http://localhost:8989",
        "isFloat": false
      },
      {
        "order": 2,
        "name": "apiKey",
        "label": "API Key",
        "helpText": "The ApiKey generated by Sonarr in Settings/General",
        "value": "",
        "type": "textbox",
        "advanced": false,
        "isFloat": false
      },
      {
        "order": 3,
        "name": "syncCategories",
        "label": "Sync Categories",
        "helpText": "Only Indexers that support these categories will be synced",
        "value": [
          5000,
          5010,
          5020,
          5030,
          5040,
          5045,
          5050,
          5070
        ],
        "type": "select",
        "advanced": true,
        "selectOptions": [
          {
            "value": 0,
            "name": "Other",
            "order": 0,
            "hint": "(0)"
          },
          {
            "value": 10,
            "name": "Other/Misc",
            "order": 0,
            "hint": "(10)",
            "parentValue": 0
          },
          {
            "value": 20,
            "name": "Other/Hashed",
            "order": 0,
            "hint": "(20)",
            "parentValue": 0
          },
          {
            "value": 1000,
            "name": "Console",
            "order": 0,
            "hint": "(1000)"
          },
          {
            "value": 1010,
            "name": "Console/NDS",
            "order": 0,
            "hint": "(1010)",
            "parentValue": 1000
          },
          {
            "value": 1020,
            "name": "Console/PSP",
            "order": 0,
            "hint": "(1020)",
            "parentValue": 1000
          },
          {
            "value": 1030,
            "name": "Console/Wii",
            "order": 0,
            "hint": "(1030)",
            "parentValue": 1000
          },
          {
            "value": 1040,
            "name": "Console/XBox",
            "order": 0,
            "hint": "(1040)",
            "parentValue": 1000
          },
          {
            "value": 1050,
            "name": "Console/XBox 360",
            "order": 0,
            "hint": "(1050)",
            "parentValue": 1000
          },
          {
            "value": 1060,
            "name": "Console/Wiiware",
            "order": 0,
            "hint": "(1060)",
            "parentValue": 1000
          },
          {
            "value": 1070,
            "name": "Console/XBox 360 DLC",
            "order": 0,
            "hint": "(1070)",
            "parentValue": 1000
          },
          {
            "value": 1080,
            "name": "Console/PS3",
            "order": 0,
            "hint": "(1080)",
            "parentValue": 1000
          },
          {
            "value": 1090,
            "name": "Console/Other",
            "order": 0,
            "hint": "(1090)",
            "parentValue": 1000
          },
          {
            "value": 1110,
            "name": "Console/3DS",
            "order": 0,
            "hint": "(1110)",
            "parentValue": 1000
          },
          {
            "value": 1120,
            "name": "Console/PS Vita",
            "order": 0,
            "hint": "(1120)",
            "parentValue": 1000
          },
          {
            "value": 1130,
            "name": "Console/WiiU",
            "order": 0,
            "hint": "(1130)",
            "parentValue": 1000
          },
          {
            "value": 1140,
            "name": "Console/XBox One",
            "order": 0,
            "hint": "(1140)",
            "parentValue": 1000
          },
          {
            "value": 1180,
            "name": "Console/PS4",
            "order": 0,
            "hint": "(1180)",
            "parentValue": 1000
          },
          {
            "value": 2000,
            "name": "Movies",
            "order": 0,
            "hint": "(2000)"
          },
          {
            "value": 2010,
            "name": "Movies/Foreign",
            "order": 0,
            "hint": "(2010)",
            "parentValue": 2000
          },
          {
            "value": 2020,
            "name": "Movies/Other",
            "order": 0,
            "hint": "(2020)",
            "parentValue": 2000
          },
          {
            "value": 2030,
            "name": "Movies/SD",
            "order": 0,
            "hint": "(2030)",
            "parentValue": 2000
          },
          {
            "value": 2040,
            "name": "Movies/HD",
            "order": 0,
            "hint": "(2040)",
            "parentValue": 2000
          },
          {
            "value": 2045,
            "name": "Movies/UHD",
            "order": 0,
            "hint": "(2045)",
            "parentValue": 2000
          },
          {
            "value": 2050,
            "name": "Movies/BluRay",
            "order": 0,
            "hint": "(2050)",
            "parentValue": 2000
          },
          {
            "value": 2060,
            "name": "Movies/3D",
            "order": 0,
            "hint": "(2060)",
            "parentValue": 2000
          },
          {
            "value": 2070,
            "name": "Movies/DVD",
            "order": 0,
            "hint": "(2070)",
            "parentValue": 2000
          },
          {
            "value": 2080,
            "name": "Movies/WEB-DL",
            "order": 0,
            "hint": "(2080)",
            "parentValue": 2000
          },
          {
            "value": 2090,
            "name": "Movies/x265",
            "order": 0,
            "hint": "(2090)",
            "parentValue": 2000
          },
          {
            "value": 3000,
            "name": "Audio",
            "order": 0,
            "hint": "(3000)"
          },
          {
            "value": 3010,
            "name": "Audio/MP3",
            "order": 0,
            "hint": "(3010)",
            "parentValue": 3000
          },
          {
            "value": 3020,
            "name": "Audio/Video",
            "order": 0,
            "hint": "(3020)",
            "parentValue": 3000
          },
          {
            "value": 3030,
            "name": "Audio/Audiobook",
            "order": 0,
            "hint": "(3030)",
            "parentValue": 3000
          },
          {
            "value": 3040,
            "name": "Audio/Lossless",
            "order": 0,
            "hint": "(3040)",
            "parentValue": 3000
          },
          {
            "value": 3050,
            "name": "Audio/Other",
            "order": 0,
            "hint": "(3050)",
            "parentValue": 3000
          },
          {
            "value": 3060,
            "name": "Audio/Foreign",
            "order": 0,
            "hint": "(3060)",
            "parentValue": 3000
          },
          {
            "value": 4000,
            "name": "PC",
            "order": 0,
            "hint": "(4000)"
          },
          {
            "value": 4010,
            "name": "PC/0day",
            "order": 0,
            "hint": "(4010)",
            "parentValue": 4000
          },
          {
            "value": 4020,
            "name": "PC/ISO",
            "order": 0,
            "hint": "(4020)",
            "parentValue": 4000
          },
          {
            "value": 4030,
            "name": "PC/Mac",
            "order": 0,
            "hint": "(4030)",
            "parentValue": 4000
          },
          {
            "value": 4040,
            "name": "PC/Mobile-Other",
            "order": 0,
            "hint": "(4040)",
            "parentValue": 4000
          },
          {
            "value": 4050,
            "name": "PC/Games",
            "order": 0,
            "hint": "(4050)",
            "parentValue": 4000
          },
          {
            "value": 4060,
            "name": "PC/Mobile-iOS",
            "order": 0,
            "hint": "(4060)",
            "parentValue": 4000
          },
          {
            "value": 4070,
            "name": "PC/Mobile-Android",
            "order": 0,
            "hint": "(4070)",
            "parentValue": 4000
          },
          {
            "value": 5000,
            "name": "TV",
            "order": 0,
            "hint": "(5000)"
          },
          {
            "value": 5010,
            "name": "TV/WEB-DL",
            "order": 0,
            "hint": "(5010)",
            "parentValue": 5000
          },
          {
            "value": 5020,
            "name": "TV/Foreign",
            "order": 0,
            "hint": "(5020)",
            "parentValue": 5000
          },
          {
            "value": 5030,
            "name": "TV/SD",
            "order": 0,
            "hint": "(5030)",
            "parentValue": 5000
          },
          {
            "value": 5040,
            "name": "TV/HD",
            "order": 0,
            "hint": "(5040)",
            "parentValue": 5000
          },
          {
            "value": 5045,
            "name": "TV/UHD",
            "order": 0,
            "hint": "(5045)",
            "parentValue": 5000
          },
          {
            "value": 5050,
            "name": "TV/Other",
            "order": 0,
            "hint": "(5050)",
            "parentValue": 5000
          },
          {
            "value": 5060,
            "name": "TV/Sport",
            "order": 0,
            "hint": "(5060)",
            "parentValue": 5000
          },
          {
            "value": 5070,
            "name": "TV/Anime",
            "order": 0,
            "hint": "(5070)",
            "parentValue": 5000
          },
          {
            "value": 5080,
            "name": "TV/Documentary",
            "order": 0,
            "hint": "(5080)",
            "parentValue": 5000
          },
          {
            "value": 5090,
            "name": "TV/x265",
            "order": 0,
            "hint": "(5090)",
            "parentValue": 5000
          },
          {
            "value": 6000,
            "name": "XXX",
            "order": 0,
            "hint": "(6000)"
          },
          {
            "value": 6010,
            "name": "XXX/DVD",
            "order": 0,
            "hint": "(6010)",
            "parentValue": 6000
          },
          {
            "value": 6020,
            "name": "XXX/WMV",
            "order": 0,
            "hint": "(6020)",
            "parentValue": 6000
          },
          {
            "value": 6030,
            "name": "XXX/XviD",
            "order": 0,
            "hint": "(6030)",
            "parentValue": 6000
          },
          {
            "value": 6040,
            "name": "XXX/x264",
            "order": 0,
            "hint": "(6040)",
            "parentValue": 6000
          },
          {
            "value": 6045,
            "name": "XXX/UHD",
            "order": 0,
            "hint": "(6045)",
            "parentValue": 6000
          },
          {
            "value": 6050,
            "name": "XXX/Pack",
            "order": 0,
            "hint": "(6050)",
            "parentValue": 6000
          },
          {
            "value": 6060,
            "name": "XXX/ImageSet",
            "order": 0,
            "hint": "(6060)",
            "parentValue": 6000
          },
          {
            "value": 6070,
            "name": "XXX/Other",
            "order": 0,
            "hint": "(6070)",
            "parentValue": 6000
          },
          {
            "value": 6080,
            "name": "XXX/SD",
            "order": 0,
            "hint": "(6080)",
            "parentValue": 6000
          },
          {
            "value": 6090,
            "name": "XXX/WEB-DL",
            "order": 0,
            "hint": "(6090)",
            "parentValue": 6000
          },
          {
            "value": 7000,
            "name": "Books",
            "order": 0,
            "hint": "(7000)"
          },
          {
            "value": 7010,
            "name": "Books/Mags",
            "order": 0,
            "hint": "(7010)",
            "parentValue": 7000
          },
          {
            "value": 7020,
            "name": "Books/EBook",
            "order": 0,
            "hint": "(7020)",
            "parentValue": 7000
          },
          {
            "value": 7030,
            "name": "Books/Comics",
            "order": 0,
            "hint": "(7030)",
            "parentValue": 7000
          },
          {
            "value": 7040,
            "name": "Books/Technical",
            "order": 0,
            "hint": "(7040)",
            "parentValue": 7000
          },
          {
            "value": 7050,
            "name": "Books/Other",
            "order": 0,
            "hint": "(7050)",
            "parentValue": 7000
          },
          {
            "value": 7060,
            "name": "Books/Foreign",
            "order": 0,
            "hint": "(7060)",
            "parentValue": 7000
          },
          {
            "value": 8000,
            "name": "Other",
            "order": 0,
            "hint": "(8000)"
          },
          {
            "value": 8010,
            "name": "Other/Misc",
            "order": 0,
            "hint": "(8010)",
            "parentValue": 8000
          },
          {
            "value": 8020,
            "name": "Other/Hashed",
            "order": 0,
            "hint": "(8020)",
            "parentValue": 8000
          }
        ],
        "isFloat": false
      },
      {
        "order": 4,
        "name": "animeSyncCategories",
        "label": "Anime Sync Categories",
        "helpText": "Only Indexers that support these categories will be synced",
        "value": [
          5070
        ],
        "type": "select",
        "advanced": true,
        "selectOptions": [
          {
            "value": 0,
            "name": "Other",
            "order": 0,
            "hint": "(0)"
          },
          {
            "value": 10,
            "name": "Other/Misc",
            "order": 0,
            "hint": "(10)",
            "parentValue": 0
          },
          {
            "value": 20,
            "name": "Other/Hashed",
            "order": 0,
            "hint": "(20)",
            "parentValue": 0
          },
          {
            "value": 1000,
            "name": "Console",
            "order": 0,
            "hint": "(1000)"
          },
          {
            "value": 1010,
            "name": "Console/NDS",
            "order": 0,
            "hint": "(1010)",
            "parentValue": 1000
          },
          {
            "value": 1020,
            "name": "Console/PSP",
            "order": 0,
            "hint": "(1020)",
            "parentValue": 1000
          },
          {
            "value": 1030,
            "name": "Console/Wii",
            "order": 0,
            "hint": "(1030)",
            "parentValue": 1000
          },
          {
            "value": 1040,
            "name": "Console/XBox",
            "order": 0,
            "hint": "(1040)",
            "parentValue": 1000
          },
          {
            "value": 1050,
            "name": "Console/XBox 360",
            "order": 0,
            "hint": "(1050)",
            "parentValue": 1000
          },
          {
            "value": 1060,
            "name": "Console/Wiiware",
            "order": 0,
            "hint": "(1060)",
            "parentValue": 1000
          },
          {
            "value": 1070,
            "name": "Console/XBox 360 DLC",
            "order": 0,
            "hint": "(1070)",
            "parentValue": 1000
          },
          {
            "value": 1080,
            "name": "Console/PS3",
            "order": 0,
            "hint": "(1080)",
            "parentValue": 1000
          },
          {
            "value": 1090,
            "name": "Console/Other",
            "order": 0,
            "hint": "(1090)",
            "parentValue": 1000
          },
          {
            "value": 1110,
            "name": "Console/3DS",
            "order": 0,
            "hint": "(1110)",
            "parentValue": 1000
          },
          {
            "value": 1120,
            "name": "Console/PS Vita",
            "order": 0,
            "hint": "(1120)",
            "parentValue": 1000
          },
          {
            "value": 1130,
            "name": "Console/WiiU",
            "order": 0,
            "hint": "(1130)",
            "parentValue": 1000
          },
          {
            "value": 1140,
            "name": "Console/XBox One",
            "order": 0,
            "hint": "(1140)",
            "parentValue": 1000
          },
          {
            "value": 1180,
            "name": "Console/PS4",
            "order": 0,
            "hint": "(1180)",
            "parentValue": 1000
          },
          {
            "value": 2000,
            "name": "Movies",
            "order": 0,
            "hint": "(2000)"
          },
          {
            "value": 2010,
            "name": "Movies/Foreign",
            "order": 0,
            "hint": "(2010)",
            "parentValue": 2000
          },
          {
            "value": 2020,
            "name": "Movies/Other",
            "order": 0,
            "hint": "(2020)",
            "parentValue": 2000
          },
          {
            "value": 2030,
            "name": "Movies/SD",
            "order": 0,
            "hint": "(2030)",
            "parentValue": 2000
          },
          {
            "value": 2040,
            "name": "Movies/HD",
            "order": 0,
            "hint": "(2040)",
            "parentValue": 2000
          },
          {
            "value": 2045,
            "name": "Movies/UHD",
            "order": 0,
            "hint": "(2045)",
            "parentValue": 2000
          },
          {
            "value": 2050,
            "name": "Movies/BluRay",
            "order": 0,
            "hint": "(2050)",
            "parentValue": 2000
          },
          {
            "value": 2060,
            "name": "Movies/3D",
            "order": 0,
            "hint": "(2060)",
            "parentValue": 2000
          },
          {
            "value": 2070,
            "name": "Movies/DVD",
            "order": 0,
            "hint": "(2070)",
            "parentValue": 2000
          },
          {
            "value": 2080,
            "name": "Movies/WEB-DL",
            "order": 0,
            "hint": "(2080)",
            "parentValue": 2000
          },
          {
            "value": 2090,
            "name": "Movies/x265",
            "order": 0,
            "hint": "(2090)",
            "parentValue": 2000
          },
          {
            "value": 3000,
            "name": "Audio",
            "order": 0,
            "hint": "(3000)"
          },
          {
            "value": 3010,
            "name": "Audio/MP3",
            "order": 0,
            "hint": "(3010)",
            "parentValue": 3000
          },
          {
            "value": 3020,
            "name": "Audio/Video",
            "order": 0,
            "hint": "(3020)",
            "parentValue": 3000
          },
          {
            "value": 3030,
            "name": "Audio/Audiobook",
            "order": 0,
            "hint": "(3030)",
            "parentValue": 3000
          },
          {
            "value": 3040,
            "name": "Audio/Lossless",
            "order": 0,
            "hint": "(3040)",
            "parentValue": 3000
          },
          {
            "value": 3050,
            "name": "Audio/Other",
            "order": 0,
            "hint": "(3050)",
            "parentValue": 3000
          },
          {
            "value": 3060,
            "name": "Audio/Foreign",
            "order": 0,
            "hint": "(3060)",
            "parentValue": 3000
          },
          {
            "value": 4000,
            "name": "PC",
            "order": 0,
            "hint": "(4000)"
          },
          {
            "value": 4010,
            "name": "PC/0day",
            "order": 0,
            "hint": "(4010)",
            "parentValue": 4000
          },
          {
            "value": 4020,
            "name": "PC/ISO",
            "order": 0,
            "hint": "(4020)",
            "parentValue": 4000
          },
          {
            "value": 4030,
            "name": "PC/Mac",
            "order": 0,
            "hint": "(4030)",
            "parentValue": 4000
          },
          {
            "value": 4040,
            "name": "PC/Mobile-Other",
            "order": 0,
            "hint": "(4040)",
            "parentValue": 4000
          },
          {
            "value": 4050,
            "name": "PC/Games",
            "order": 0,
            "hint": "(4050)",
            "parentValue": 4000
          },
          {
            "value": 4060,
            "name": "PC/Mobile-iOS",
            "order": 0,
            "hint": "(4060)",
            "parentValue": 4000
          },
          {
            "value": 4070,
            "name": "PC/Mobile-Android",
            "order": 0,
            "hint": "(4070)",
            "parentValue": 4000
          },
          {
            "value": 5000,
            "name": "TV",
            "order": 0,
            "hint": "(5000)"
          },
          {
            "value": 5010,
            "name": "TV/WEB-DL",
            "order": 0,
            "hint": "(5010)",
            "parentValue": 5000
          },
          {
            "value": 5020,
            "name": "TV/Foreign",
            "order": 0,
            "hint": "(5020)",
            "parentValue": 5000
          },
          {
            "value": 5030,
            "name": "TV/SD",
            "order": 0,
            "hint": "(5030)",
            "parentValue": 5000
          },
          {
            "value": 5040,
            "name": "TV/HD",
            "order": 0,
            "hint": "(5040)",
            "parentValue": 5000
          },
          {
            "value": 5045,
            "name": "TV/UHD",
            "order": 0,
            "hint": "(5045)",
            "parentValue": 5000
          },
          {
            "value": 5050,
            "name": "TV/Other",
            "order": 0,
            "hint": "(5050)",
            "parentValue": 5000
          },
          {
            "value": 5060,
            "name": "TV/Sport",
            "order": 0,
            "hint": "(5060)",
            "parentValue": 5000
          },
          {
            "value": 5070,
            "name": "TV/Anime",
            "order": 0,
            "hint": "(5070)",
            "parentValue": 5000
          },
          {
            "value": 5080,
            "name": "TV/Documentary",
            "order": 0,
            "hint": "(5080)",
            "parentValue": 5000
          },
          {
            "value": 5090,
            "name": "TV/x265",
            "order": 0,
            "hint": "(5090)",
            "parentValue": 5000
          },
          {
            "value": 6000,
            "name": "XXX",
            "order": 0,
            "hint": "(6000)"
          },
          {
            "value": 6010,
            "name": "XXX/DVD",
            "order": 0,
            "hint": "(6010)",
            "parentValue": 6000
          },
          {
            "value": 6020,
            "name": "XXX/WMV",
            "order": 0,
            "hint": "(6020)",
            "parentValue": 6000
          },
          {
            "value": 6030,
            "name": "XXX/XviD",
            "order": 0,
            "hint": "(6030)",
            "parentValue": 6000
          },
          {
            "value": 6040,
            "name": "XXX/x264",
            "order": 0,
            "hint": "(6040)",
            "parentValue": 6000
          },
          {
            "value": 6045,
            "name": "XXX/UHD",
            "order": 0,
            "hint": "(6045)",
            "parentValue": 6000
          },
          {
            "value": 6050,
            "name": "XXX/Pack",
            "order": 0,
            "hint": "(6050)",
            "parentValue": 6000
          },
          {
            "value": 6060,
            "name": "XXX/ImageSet",
            "order": 0,
            "hint": "(6060)",
            "parentValue": 6000
          },
          {
            "value": 6070,
            "name": "XXX/Other",
            "order": 0,
            "hint": "(6070)",
            "parentValue": 6000
          },
          {
            "value": 6080,
            "name": "XXX/SD",
            "order": 0,
            "hint": "(6080)",
            "parentValue": 6000
          },
          {
            "value": 6090,
            "name": "XXX/WEB-DL",
            "order": 0,
            "hint": "(6090)",
            "parentValue": 6000
          },
          {
            "value": 7000,
            "name": "Books",
            "order": 0,
            "hint": "(7000)"
          },
          {
            "value": 7010,
            "name": "Books/Mags",
            "order": 0,
            "hint": "(7010)",
            "parentValue": 7000
          },
          {
            "value": 7020,
            "name": "Books/EBook",
            "order": 0,
            "hint": "(7020)",
            "parentValue": 7000
          },
          {
            "value": 7030,
            "name": "Books/Comics",
            "order": 0,
            "hint": "(7030)",
            "parentValue": 7000
          },
          {
            "value": 7040,
            "name": "Books/Technical",
            "order": 0,
            "hint": "(7040)",
            "parentValue": 7000
          },
          {
            "value": 7050,
            "name": "Books/Other",
            "order": 0,
            "hint": "(7050)",
            "parentValue": 7000
          },
          {
            "value": 7060,
            "name": "Books/Foreign",
            "order": 0,
            "hint": "(7060)",
            "parentValue": 7000
          },
          {
            "value": 8000,
            "name": "Other",
            "order": 0,
            "hint": "(8000)"
          },
          {
            "value": 8010,
            "name": "Other/Misc",
            "order": 0,
            "hint": "(8010)",
            "parentValue": 8000
          },
          {
            "value": 8020,
            "name": "Other/Hashed",
            "order": 0,
            "hint": "(8020)",
            "parentValue": 8000
          }
        ],
        "isFloat": false
      },
      {
        "order": 5,
        "name": "syncAnimeStandardFormatSearch",
        "label": "Sync Anime Standard Format Search",
        "helpText": "Sync also searching for anime using the standard numbering",
        "value": false,
        "type": "checkbox",
        "advanced": true,
        "isFloat": false
      }
    ],
    "implementationName": "Sonarr",
    "implementation": "Sonarr",
    "configContract": "SonarrSettings",
    "infoLink": "https://wiki.servarr.com/prowlarr/supported#sonarr",
    "tags": [],
    "id": 2
  }
]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.