Git Product home page Git Product logo

doplarr's Introduction

GitHub Actions Workflow Status Discord Code

An *arr Request Bot for Discord

Why does this exist

  • Uses modern Discord slash commands and components, which provides a clean, performant UI on desktop and mobile. This has the added benefit of not requiring privileged intents, so this bot will never look at message content
  • Small codebase as code is not an asset
  • Simple configuration, no need to have a whole web frontend just for configuration
  • Powered by Clojure and Discljord, a markedly good combination 😛

Ready to try? Head to the docs

Screenshots

doplarr's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

doplarr's Issues

Unable to send commands

08-01.18-24-17.mp4

Sending a command will result in the request hanging or failing.
Ran using systemd and tried manually running it but resulted in error

$ java -jar /opt/Doplarr/doplarr.jar -Dconfig=/opt/Doplarr/config.edn
18:58:40,148 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
18:58:40,148 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
18:58:40,148 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/opt/Doplarr/doplarr.jar!/logback.xml]
18:58:40,155 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@6f3f0fae - URL [jar:file:/opt/Doplarr/doplarr.jar!/logback.xml] is not of type file
18:58:40,215 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
18:58:40,216 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
18:58:40,220 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
18:58:40,259 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - This appender no longer admits a layout as a sub-component, set an encoder instead.
18:58:40,259 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
18:58:40,259 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
18:58:40,259 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
18:58:40,259 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
18:58:40,259 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
18:58:40,260 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@21a66d45 - Registering current configuration as safe fallback point

Docker build doesn't appear to be working.

I'm running the docker, as suggested in the readme, but when it launches, this is all that is received in the logs:

  20:52:16,269 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
  20:52:16,269 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
  20:52:16,270 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/app/target/Doplarr.jar!/logback.xml]
  20:52:16,301 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@7a606260 - URL [jar:file:/app/target/Doplarr.jar!/logback.xml] is not of type file
  20:52:16,491 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
  20:52:16,492 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
  20:52:16,503 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
  20:52:16,648 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - This appender no longer admits a layout as a sub-component, set an encoder instead.
  20:52:16,648 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
  20:52:16,648 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
  20:52:16,649 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ERROR
  20:52:16,649 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
  20:52:16,650 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
  20:52:16,652 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5dbab232 - Registering current configuration as safe fallback point

This is the run command I used, with important things obfuscated:

docker run \
-e SONARR_URL='http://192.168.1.105:8989' \
-e RADARR_URL='http://192.168.1.105:7878' \
-e SONARR_API='hdhdhdhdhdhdhdhdhdhdhdhd' \
-e RADARR_API='hdhdhdhdhdhdhdhdhdhdhdhd' \
-e BOT_TOKEN='hdhdhdhdhdhdhdhdhdhdhdhd' \
-e ROLE_ID='hdhdhdhdhdhdhdhdhdhdhdhd' \
--name doplarr ghcr.io/kiranshila/doplarr:latest

Multiple rootfolders

We were talking in the discussion page, and I didn't realize sonarr/radarr can have multiple root folders configured. We should deal with that somehow.

It was brought up, though, that we could make categories of settings that select the groups of those types of things so it only is one dropdown instead of selecting each one every time.

The config could look like

{:sonarr/categories [{:name "Anime"
                      :rootfolder "/straight/into/the/trash"
                      :language-profile "Japanese"
                      :tags ["weeb" "tv"]
                      :quality-profile "4K"}
                     {:name "Normal TV"
                      :rootfolder "/normal/root/folder"
                      :language-profile "Any"
                      :tags ["tv"]
                      :quality-profile "Any"}]}

Unraid Template

Shouldn't be too hard - pull in docker image and break out the env variables as options. I don't use unraid, so it will take some research on my end.

Build are non-deterministic

Very very strange bug - sometimes builds just fail on CI with errors such as

Syntax error (IllegalAccessError) compiling at (clojure/tools/reader.clj:1:1).
indexing-reader? does not exist

These are nonsense and re-running the builds make them go away.

Set default quality profile for sonarr/radarr

Description of current behaviour:
When requesting a movie or tv-show (sonarr/radarr) the user needs to choose the quality profile.

Enhancement:
Implement a default quality profile for sonarr/radarr so the user won't have to choose. This is especially nice when there is only one profile

Screenshot 2021-09-28 at 10 30 04

Make role-gating optional

Don't edit-command-permissions if the role-id isn't set - defaulting to anyone can use the bot on the server.

Help with bot config

Hey, pulled this on docker to check it out seems pretty cool!

I am a bit of a docker noob so I am not really 100% what I am doing, but how exactly would you go about finding the config.eon, like where is that stored for the docker container? My only issue is that I need to change the quality profile so it isn't constantly trying to download 60GB files. Thanks for the help and look forward to using this!

Show requests publicly in specified channel

Is your feature request related to a problem? Please describe.
It would be nice to be able to limit requests to certain channels and have an option to publicly show the requests in that channel. With slash commands only the person executing the command can see it (as far as I know).

Describe the solution you'd like
Add a setting to limit requests in a specific channel and/or publicly show requests in a specified channel.

Describe alternatives you've considered
None, just a nice-to-have feature, not required in any way.

Additional context
I was using requestrr before and it would be nice to have the same option again with this application.

Bots cannot use this endpoint

Describe the bug
I seemed to have followed the instructions to the letter but running into an issue where on start up I get the following error and the role/role id set gets permission error.

Logs

2022-04-26T05:16:09.275Z 92edc4b5d72b INFO [doplarr.core:43] - Connected to guild
2022-04-26T05:16:09.410Z 92edc4b5d72b INFO [doplarr.core:49] - Setting role id. Reminder, even the server owner needs this role.
2022-04-26T05:16:09.486Z 92edc4b5d72b FATAL [doplarr.discord:165] - Error in setting command permissions
                               java.lang.Thread.run              Thread.java:  831
 java.util.concurrent.ThreadPoolExecutor$Worker.run  ThreadPoolExecutor.java:  630
  java.util.concurrent.ThreadPoolExecutor.runWorker  ThreadPoolExecutor.java: 1130
                                                ...                               
                clojure.core/binding-conveyor-fn/fn                 core.clj: 2050
             discljord.messaging.impl/step-agent/fn                 impl.clj: 1191
             discljord.messaging.impl/make-request!                 impl.clj: 1146
discljord.messaging.impl/make-request!/make-request                 impl.clj: 1141
                                                ...                               
                        discljord.messaging.impl/fn                 impl.clj:  924
clojure.lang.ExceptionInfo: Attempted to set invalid command permissions
       code: 20001
    message: "Bots cannot use this endpoint"

URL used:
https://discord.com/api/oauth2/authorize?client_id=HIDDEN&permissions=0&scope=applications.commands%20bot

docker compose:

doplarr:
    container_name: doplarr
    image: lscr.io/linuxserver/doplarr
    restart: unless-stopped
    environment:
      - PUID=${UID_VAL}
      - PGID=${GID_VAL}
      - TZ=${TIMEZONE_VAL}
      - DISCORD__TOKEN=1
      - OVERSEERR__API=1
      - OVERSEERR__URL=http://172.19.0.26:5055
      - DISCORD__ROLE_ID=1
      - OVERSEERR__DEFAULT_ID=1
    volumes:
      - /opt/doplarr/config:/config

Additional context
I feel like I am missing a step or something and probably something stupid on my end so I apologize in advance.

Show all results - Add alert for duplicate

Right now, existing results are excluded from the drop down menu - it makes more sense to show all results, but then add an indication that those have already been requested. Omitting them from the search seems more like the search is wrong.

Request for series with too many seasons never load

When requesting a series with too many seasons (I'm guessing 25+ seasons), the "Which season?" prompt never appears.

Examples that replicate this behavior:

  • Survivor (2000) (41 Seasons)
  • Dr. Who (1963) (26 Seasons)
  • The Simpsons (33 Seasons)

Example that works as expected:

  • South Park (24 Seasons)

After selecting the series, it thinks for a second (3 animated dots next to the select box), but the bot does not update to display the season selection menu.

The following screenshot contains an attempted request for "Survivor", "South Park" and "Dr. Who", in that order.

image

Feature - Create issues in Oversser

Is your feature request related to a problem? Please describe.
Ability to make overseer media issue reports.

Describe the solution you'd like
Ability to make overseer media issue reports from discord just like requesting media.

Describe alternatives you've considered
none

Additional context

standard_init_linux.go:228: exec user process caused: exec format error

Device: Raspberry Pi 4
OS: PiOS 11

Using Portainer, I added all fields shown in the guide (see attached image)

Screen Shot 2022-02-26 at 8 43 50 AM

Upon running, I received one error constantly:
standard_init_linux.go:228: exec user process caused: exec format error

I'm not technically savvy, but does this error mean Doplarr is not compatible with ARM, or is it a different issue?

Not sure if bad configuration or bug?

I was testing the bot in another test server and then added him to my main server. I am using Overseer and got everything working on the test server. When I added him to the main server he spit this error out.

Troubleshooting taken: restarted the bot while he was joined to the main server and while he wasn't. Kicked him from the test server. The only other bot running slash commands on the main server is muse.

Thank you for this project! I hope I am not being silly and overlooking something incredibly grave.

==============================================
2022-03-22T14:35:40.104Z 9700eab42371 FATAL [doplarr.discord:159] - Error in registering commands

�[37mjava.lang.Thread.run�[m �[32m Thread.java: 831�[m
�[37mjava.util.concurrent.ThreadPoolExecutor$Worker.run�[m �[32mThreadPoolExecutor.java: 630�[m
�[37mjava.util.concurrent.ThreadPoolExecutor.runWorker�[m �[32mThreadPoolExecutor.java: 1130�[m
�[37m...�[m �[32m �[m
�[33mclojure.core/binding-conveyor-fn/�[1;33mfn�[m �[32m core.clj: 2038�[m
�[33mdiscljord.messaging.impl/step-agent/�[1;33mfn�[m �[32m impl.clj: 1191�[m
�[33mdiscljord.messaging.impl/�[1;33mmake-request!�[m �[32m impl.clj: 1146�[m
�[33mdiscljord.messaging.impl/make-request!/�[1;33mmake-request�[m �[32m impl.clj: 1141�[m
�[37m...�[m �[32m �[m
�[33mdiscljord.messaging.impl/�[1;33mfn�[m �[32m impl.clj: 905�[m
�[1;31mclojure.lang.ExceptionInfo�[m: �[3mAttempted to overwrite with invalid guild commands�[m
�[1mcode�[m: 50001
�[1mmessage�[m: "Missing Access"

Slash commands greyed out

I followed the short guide and ended up with the slash commands greyed out whenever I tried to type them.
Also when setting up the OAuth2 url I had to choose permissions (I chose admin to rule this out as a reason for not working), otherwise the bot would appear offline. The rest of the environment variables were set properly. Any idea why this happens?

Request failure

We have a screen that indicated the request was completed successfully, but not failure.

Requesting existing movie results in unspecified error

Describe the bug
If a movie is already added to radarr and it is requested again through doplarr, the request will result in the error message Unspecified error on request, check logs.

The log message shows "errorMessage" "This movie has already been added" (see full log below).

Expected behavior
This should not result in an error but be handled gracefully and shown to the discord user issuing the command.

Possible solutions:

  • Show a message in discord that the requested movie has already been added upon sending the request.
  • Gray out existing movies in the dropdown in discord (maybe add "Already requested" in dropdown").
  • Do not show the movie in the dropdown in discord if it has already been added.

The first option is probably the easiest and most user friendly one.

Screenshots
none

Logs
Please copy out the log in it's entirety, please make sure to hide any potential secrets/API keys - although they should be censored via the logging program.

2022-02-19T13:40:50.244Z 73d17e4cbef0 INFO [doplarr.interaction-state-machine:28] - Performing search for movie the batman
2022-02-19T13:40:58.629Z 73d17e4cbef0 FATAL [doplarr.interaction-state-machine:124] - Non 403 error on request {:mention-everyone false, :mentions [], :application-id "secret", :pinned false, :content "Unspecified error on request, check logs", :attachments [], :webhook-id "secret", :mention-roles [], :type 20, :interaction {:id "secret", :type 2, :name "request", :user {:id "secret", :username "secret", :avatar "secret", :discriminator "secret", :public-flags 256}}, :author {:id "secret", :username "doplarr", :avatar "secret", :discriminator "secret", :public-flags 0, :bot true}, :components [], :id "secret", :channel-id "secret", :embeds [], :timestamp "2022-02-19T13:40:50.151000+00:00", :flags 64, :tts false, :edited-timestamp "2022-02-19T13:40:58.554363+00:00"} {:request-time 11, :request {:user-info nil, :as :json-string-keys, :headers {"X-API-Key" "secret", "content-type" "application/json", "accept-encoding" "gzip, deflate"}, :server-port 7878, :url "http://radarr:7878/api/v3/movie", :content-type "application/json", :coerce :always, :http-request #object[jdk.internal.net.http.HttpRequestImpl 0x6d17598c "http://radarr:7878/api/v3/movie POST"], :uri "/api/v3/movie", :server-name "radarr", :query-string nil, :body "{\"title\":\"The Batman\",\"tmdbId\":414906,\"qualityProfileId\":4,\"monitored\":true,\"rootFolderPath\":\"/zpool/radarr\",\"addOptions\":{\"searchForMovie\":true}}", :scheme :http, :async? true, :request-method :post}, :http-client #object[jdk.internal.net.http.HttpClientFacade 0x63d0ba5e "jdk.internal.net.http.HttpClientImpl@4825c646(21)"], :headers {"cache-control" "no-cache,no-store", "content-type" "application/json", "date" "Sat, 19 Feb 2022 13:40:58 GMT", "expires" "-1", "pragma" "no-cache", "server" "Kestrel", "transfer-encoding" "chunked"}, :status 400, :content-type :application/json, :uri "http://radarr:7878/api/v3/movie", :content-type-params {}, :version :http-1.1, :body [{"propertyName" "TmdbId", "errorMessage" "This movie has already been added", "attemptedValue" 414906, "severity" "error", "errorCode" "MovieExistsValidator", "formattedMessageArguments" [], "formattedMessagePlaceholderValues" {"propertyName" "Tmdb Id", "propertyValue" 414906}}]}

Additional context

  • Using linuxserver.io doplarr container
  • Requests limited to one role

Lidarr support

Just wanted to show my support that a discord bot should finally be able to request music as well as shows and movies.

Sometimes Profile ID is 0

Seen with requests through Sonarr

Exception in thread "async-dispatch-1" clojure.lang.ExceptionInfo: Non 403 error on request {:request-time 74, :request {:user-info nil, :as :json, :headers {"X-API-Key" "898a124b1af34259b0174618527416c0", "content-type" "application/json", "accept-encoding" "gzip, deflate"}, :server-port 8989, :url "http://localhost:8989/api/series", :content-type "application/json", :http-request #object[jdk.internal.net.http.HttpRequestImpl 0xcd30d4b "http://localhost:8989/api/series POST"], :uri "/api/series", :server-name "localhost", :query-string nil, :body "{\"tags\":[],\"seasonFolder\":true,\"imdbId\":\"tt8042500\",\"languageProfileId\":0,\"qualityProfileId\":0,\"sortTitle\":\"y last man\",\"images\":[{\"coverType\":\"banner\",\"url\":\"https://artworks.thetvdb.com/banners/v4/series/362250/banners/61376b12a3091.jpg\"},{\"coverType\":\"poster\",\"url\":\"https://artworks.thetvdb.com/banners/v4/series/362250/posters/611f995929dd5.jpg\"},{\"coverType\":\"fanart\",\"url\":\"https://artworks.thetvdb.com/banners/v4/series/362250/backgrounds/6116c9489ad4b.jpg\"}],\"added\":\"0001-01-01T00:00:00Z\",\"cleanTitle\":\"ylastman\",\"firstAired\":\"2021-09-13T00:00:00Z\",\"genres\":[\"Action\",\"Drama\",\"Science Fiction\"],\"tvdbId\":362250,\"monitored\":true,\"tvRageId\":0,\"overview\":\"All of the men are dead. But one. Based on DC Comics' acclaimed series, Y: The Last Man traverses a post-apocalyptic world in which a cataclysmic event has decimated every male save for one lone human. The new world order of women will explore gender, race, class and survival.\",\"airTime\":\"00:00\",\"seasonCount\":1,\"title\":\"Y: The Last Man\",\"year\":2021,\"rootFolderPath\":\"Z:\\\\Shows\\\\\",\"seasons\":[{\"seasonNumber\":1,\"monitored\":true}],\"status\":\"continuing\",\"certification\":\"TV-MA\",\"runtime\":54,\"seriesType\":\"standard\",\"remotePoster\":\"https://artworks.thetvdb.com/banners/v4/series/362250/posters/611f995929dd5.jpg\",\"profileId\":null,\"addOptions\":{\"ignoreEpisodesWithFiles\":true,\"searchForMissingEpisodes\":true},\"tvMazeId\":42668,\"network\":\"Hulu\",\"useSceneNumbering\":false,\"ratings\":{\"votes\":0,\"value\":0.0},\"titleSlug\":\"y-the-last-man\"}", :scheme :http, :async? true, :request-method :post}, :http-client #object[jdk.internal.net.http.HttpClientFacade 0x3c68460b "jdk.internal.net.http.HttpClientImpl@ddce97d(4)"], :headers {"cache-control" "no-cache, no-store, must-revalidate, max-age=0", "content-type" "application/json; charset=utf-8", "date" "Fri, 24 Sep 2021 16:49:16 GMT", "expires" "0", "pragma" "no-cache", "server" "Microsoft-HTTPAPI/2.0", "transfer-encoding" "chunked", "x-application-version" "3.0.6.1265"}, :status 400, :content-type :application/json, :uri "http://localhost:8989/api/series", :content-type-params {:charset "utf-8"}, :version :http-1.1, :body "[\r\n  {\r\n    \"propertyName\": \"ProfileId\",\r\n    \"errorMessage\": \"'Profile Id' must be greater than '0'.\",\r\n    \"attemptedValue\": 0,\r\n    \"severity\": \"error\",\r\n    \"errorCode\": \"GreaterThanValidator\",\r\n    \"formattedMessageArguments\": [],\r\n    \"formattedMessagePlaceholderValues\": {\r\n      \"comparisonValue\": 0,\r\n      \"comparisonProperty\": \"\",\r\n      \"propertyName\": \"Profile Id\",\r\n      \"propertyValue\": 0\r\n    },\r\n    \"resourceName\": \"GreaterThanValidator\"\r\n  },\r\n  {\r\n    \"propertyName\": \"ProfileId\",\r\n    \"errorMessage\": \"QualityProfile does not exist\",\r\n    \"attemptedValue\": 0,\r\n    \"severity\": \"error\",\r\n    \"errorCode\": \"ProfileExistsValidator\",\r\n    \"formattedMessageArguments\": [],\r\n    \"formattedMessagePlaceholderValues\": {\r\n      \"propertyName\": \"Profile Id\",\r\n      \"propertyValue\": 0\r\n    }\r\n  }\r\n]"}
        at doplarr.interaction_state_machine$fn__19144$fn__19212$state_machine__8301__auto____19219$fn__19221$inst_19197__19238.invoke(interaction_state_machine.clj:129)
        at fmnoise.flow$fn__10996.invokeStatic(flow.cljc:23)
        at fmnoise.flow$fn__10996.invoke(flow.cljc:10)
        at fmnoise.flow$fn__10945$G__10938__10952.invoke(flow.cljc:4)
        at fmnoise.flow$else.invokeStatic(flow.cljc:125)
        at fmnoise.flow$else.invoke(flow.cljc:122)
        at doplarr.interaction_state_machine$fn__19144$fn__19212$state_machine__8301__auto____19219$fn__19221.invoke(interaction_state_machine.clj:106)
        at doplarr.interaction_state_machine$fn__19144$fn__19212$state_machine__8301__auto____19219.invoke(interaction_state_machine.clj:106)
        at clojure.core.async.impl.ioc_macros$run_state_machine.invokeStatic(ioc_macros.clj:978)
        at clojure.core.async.impl.ioc_macros$run_state_machine.invoke(ioc_macros.clj:977)
        at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invokeStatic(ioc_macros.clj:982)
        at clojure.core.async.impl.ioc_macros$run_state_machine_wrapped.invoke(ioc_macros.clj:980)
        at clojure.core.async.impl.ioc_macros$take_BANG_$fn__8319.invoke(ioc_macros.clj:991)
        at clojure.core.async.impl.channels.ManyToManyChannel$fn__3152$fn__3153.invoke(channels.clj:95)
        at clojure.lang.AFn.run(AFn.java:22)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at clojure.core.async.impl.concurrent$counted_thread_factory$reify__3055$fn__3056.invoke(concurrent.clj:29)
        at clojure.lang.AFn.run(AFn.java:22)
        at java.base/java.lang.Thread.run(Thread.java:829)

More Documentation

Is your feature request related to a problem? Please describe.
Many people are requesting more details in the setup of this bot, including configuration on Windows and integration with other notification methods such as Tautulli, Notifiarr, and generic webhooks.

Describe the solution you'd like
Expand our documentation to include these details and/or videos that walk though the steps to make it easier.

Allow modification of allowed Root Folders

Some people have multiple root folders defined in sonarr/radarr/etc for their media. When requesting via Doplarr, there could be a default setting depending on series/movie type.

This can be useful for when you don't want requesters to see some root paths.

Example:
You have 3 rooth paths defined in Sonarr

  • /media/smallDrive/television
  • /media/mediumDrive/television
  • /media/largeDrive/television

If smallDrive is full, you wouldn't want requesters to set that as the path. It would be useful to remove that as an option.

Depnding on request type (ie, anime) , maybe there can also be a default path.
Exposing less options to users is a general good rule imo.

Typo in optional settings matrix in readme file.

In the optional settings section of the readme the Sonarr Language Profile is described as being a language profile for radarr, not sonarr.

SONARR__LANGUAGE_PROFILE

The name of the language profile to use by default for Radarr

I am unsure on etiquette for readme file typos, my apologies if your preference is for a PR.

[Bug] Requesting 1 season shows with "All"

When requesting shows that only have 1 season with ALL from the dropdown doesn't request the series via Overseerr, selecting Season 1 makes the series show up as requested with ALL seasons in Overseerr though.

Error in creating search responses

Expected behavior
I expect to be able to request a movie from my discord bot but always receive "Error in creating search responses"

Logs
Please copy out the log in it's entirety, please make sure to hide any potential secrets/API keys - although they should be censored via the logging program.

[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] 01-envfile: executing... 
[cont-init.d] 01-envfile: exited 0.
[cont-init.d] 01-migrations: executing... 
[migrations] started
[migrations] no migrations found
[cont-init.d] 01-migrations: exited 0.
[cont-init.d] 02-tamper-check: executing... 
[cont-init.d] 02-tamper-check: exited 0.
[cont-init.d] 10-adduser: executing... 

-------------------------------------
          _         ()
         | |  ___   _    __
         | | / __| | |  /  \
         | | \__ \ | | | () |
         |_| |___/ |_|  \__/


Brought to you by linuxserver.io
-------------------------------------

To support the app dev(s) visit:
kiranshila: https://github.com/sponsors/kiranshila

To support LSIO projects visit:
https://www.linuxserver.io/donate/
-------------------------------------
GID/UID
-------------------------------------

User uid:    1000
User gid:    100
-------------------------------------

[cont-init.d] 10-adduser: exited 0.
[cont-init.d] 19-armless: executing... 
[cont-init.d] 19-armless: exited 0.
[cont-init.d] 30-config: executing... 
[cont-init.d] 30-config: exited 0.
[cont-init.d] 90-custom-folders: executing... 
[cont-init.d] 90-custom-folders: exited 0.
[cont-init.d] 99-custom-files: executing... 
[custom-init] no custom files found exiting...
[cont-init.d] 99-custom-files: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
2022-03-17T17:31:50.803Z 024ddd456b72 INFO [doplarr.config:63] - Configuration is valid
2022-03-17T17:31:51.359Z 024ddd456b72 INFO [discljord.messaging.impl:?] - Starting messaging process
2022-03-17T17:31:51.368Z 024ddd456b72 INFO [discljord.connections.impl:?] - Connecting shard 0
2022-03-17 13:31:51.408:INFO::async-dispatch-4: Logging initialized @3920ms to org.eclipse.jetty.util.log.StdErrLog
2022-03-17T17:31:52.077Z 024ddd456b72 INFO [doplarr.core:38] - Discord connection successful
2022-03-17T17:31:52.086Z 024ddd456b72 INFO [doplarr.core:43] - Connected to guild
2022-03-17T17:31:52.219Z 024ddd456b72 INFO [doplarr.core:49] - Setting role id. Reminder, even the server owner needs this role.
2022-03-17T17:32:08.795Z 024ddd456b72 INFO [doplarr.interaction-state-machine:28] - Performing search for movie Rambo
2022-03-17T17:32:09.748Z 024ddd456b72 FATAL [doplarr.interaction-state-machine:41] - Error in creating search responses
                               java.lang.Thread.run              Thread.java:  831
 java.util.concurrent.ThreadPoolExecutor$Worker.run  ThreadPoolExecutor.java:  630
  java.util.concurrent.ThreadPoolExecutor.runWorker  ThreadPoolExecutor.java: 1130
                                                ...                               
                clojure.core/binding-conveyor-fn/fn                 core.clj: 2038
             discljord.messaging.impl/step-agent/fn                 impl.clj: 1191
             discljord.messaging.impl/make-request!                 impl.clj: 1146
discljord.messaging.impl/make-request!/make-request                 impl.clj: 1141
                                                ...                               
                        discljord.messaging.impl/fn                 impl.clj:  943
clojure.lang.ExceptionInfo: Attempted to :edit-original-interaction-response with invalid parameters
       code: 10015
    message: "Unknown Webhook"

Additional context
Running through docker-compose V2.1

---
version: "2.1"
services:
  doplarr:
    image: lscr.io/linuxserver/doplarr
    container_name: doplarr
    environment:
      - PUID=1000
      - PGID=100
      - TZ=America/New_York
      - DISCORD__TOKEN=*REDACTED*
      - OVERSEERR__API=*REDACTED*
      - OVERSEERR__URL=http://*REDACTED*:5055
      - DISCORD__MAX_RESULTS=25 #optional
      - DISCORD__ROLE_ID=*REDACTED* #optional
      - DISCORD__REQUESTED_MSG_STYLE=:plain #optional
      - PARTIAL_SEASONS=true #optional
      - LOG_LEVEL=:info #optional
    volumes:
      - *REDACTED*:/config
    restart: unless-stopped

Ombi Support

Is your feature request related to a problem? Please describe.
Overseerr is great but if you do not use Plex and use Jellyfin or Emby, you cannot use it. With the developers of Overseerr not planning on adding support for these anytime soon, it would be great to include it here.

Describe the solution you'd like
Exactly how Overseerr works, just for Ombi.

Describe alternatives you've considered
There is none at all.

Error Code 400 when adding movie to Radarr running Docker Instance

Prerequisites:

I am running the Doplarr bot with the following docker-compose statement:

version: "3.8"
services:
  doplarr:
    image: ghcr.io/kiranshila/doplarr:main
    container_name: doplarr
    environment:
      SONARR_URL: 'https://sonarr.${GLOBAL_DOMAIN}'
      RADARR_URL: 'https://radarr.${GLOBAL_DOMAIN}'
      SONARR_API: '${SONARR_API}'
      RADARR_API: '${RADARR_API}'
      MAX_RESULTS: 10
      BOT_TOKEN: '${DOPLARR_BOT_TOKEN}'
      ROLE_ID: '${DOPLARR_ROLE_ID}'

For the URLs I also tried the local IP addresses of both *arrs, i.e.: SONARR_URL: 'http://192.168.178.27:50001'
The *arr-Instances are running in the same Docker Network on the same server as Doplarr.

Problem description:

I execute a "/"-command to request a movie and type the name of the movie.
Doplarr suggests a couple hits and I choose one.
When I hit the Request-Button I instantly get a message saying "This has been requested!" for the chosen movie.
A couple of seconds later the initial message when searching says "This interaction failed".
image

The movie never makes its way to Radarr.
The docker logs print out the following error:

16:57:57.008 [main] ERROR discljord.events -
      Exception occurred in event handler.
clojure.lang.ExceptionInfo: status: 400
        at hato.middleware$exceptions_response.invokeStatic(middleware.clj:149)
        at hato.middleware$exceptions_response.invoke(middleware.clj:140)
        at hato.middleware$wrap_exceptions$fn__1017.invoke(middleware.clj:158)
        at hato.middleware$wrap_accept$fn__1103.invoke(middleware.clj:315)
        at hato.middleware$wrap_accept_encoding$fn__1110.invoke(middleware.clj:337)
        at hato.middleware$wrap_multipart$fn__1271.invoke(middleware.clj:707)
        at hato.middleware$wrap_content_type$fn__1097.invoke(middleware.clj:298)
        at hato.middleware$wrap_form_params$fn__1198.invoke(middleware.clj:536)
        at hato.middleware$wrap_nested_params$fn__1265.invoke(middleware.clj:687)
        at hato.middleware$wrap_method$fn__1166.invoke(middleware.clj:470)
        at hato.client$request.invokeStatic(client.clj:327)
        at hato.client$request.doInvoke(client.clj:321)
        at clojure.lang.RestFn.invoke(RestFn.java:410)
        at doplarr.arr_utils$http_request.invokeStatic(arr_utils.clj:5)
        at doplarr.arr_utils$http_request.doInvoke(arr_utils.clj:4)
        at clojure.lang.RestFn.invoke(RestFn.java:467)
        at doplarr.radarr$request.invokeStatic(radarr.clj:16)
        at doplarr.radarr$request.invoke(radarr.clj:15)
        at doplarr.core$perform_request.invokeStatic(core.clj:210)
        at doplarr.core$perform_request.invoke(core.clj:205)
        at doplarr.core$continue_request.invokeStatic(core.clj:234)
        at doplarr.core$continue_request.invoke(core.clj:215)
        at doplarr.core$fn__17192.invokeStatic(core.clj:250)
        at doplarr.core$fn__17192.invoke(core.clj:245)
        at clojure.lang.MultiFn.invoke(MultiFn.java:234)
        at discljord.events$message_pump_BANG_$fn__17048.invoke(events.clj:18)
        at discljord.events$message_pump_BANG_.invokeStatic(events.clj:18)
        at discljord.events$message_pump_BANG_.invoke(events.clj:8)
        at doplarr.core$run.invokeStatic(core.clj:274)
        at doplarr.core$run.invoke(core.clj:266)
        at doplarr.core$_main.invokeStatic(core.clj:281)
        at doplarr.core$_main.doInvoke(core.clj:279)
        at clojure.lang.RestFn.invoke(RestFn.java:397)
        at clojure.lang.AFn.applyToHelper(AFn.java:152)
        at clojure.lang.RestFn.applyTo(RestFn.java:132)
        at doplarr.core.main(Unknown Source)

Let me know if I can assist further in the resolution of this issue!

Docker

Get on docker hub, should be straightforward

[Feature Request] Option to request on both profiles, if user tries to request in 4K, and item is not present in Plex (Overseerr)

[Feature Request] Option for the 4K requests

For the sake of explanation, when I refer to "requesting in 4K" or "4K", I refer to the 4K instances and profiles of Sonarr/Radarr enabled in Overseerr. When I refer to "requesting in 1080p" or "1080p", I refer to the regular/standard instances and profiles of Sonarr/Radarr enabled in Overseerr:
https://i.imgur.com/IGTVQ36.png

Is your feature request related to a problem? Please describe.
Sometimes when users request items in 4K, they don't check if they're available already in 1080p in Plex. If they request an item in 4K, that's not already present in 1080p, it can sometimes cause weird issues with Overseerr.. Like Overseerr refusing to request the item in the 1080p associated profiles.

Describe the solution you'd like
Therefore, it would be awesome with an option in Doplarr, that does a sort of check, if a user presses "Request 4K"... Like so:

  • User uses /request movie {term}
  • User selects the movie and presses Request 4K, without checking if it's already on Plex in 1080p
  • Doplarr checks with Overseerr if the movie is already available on Plex
  • If movie is NOT available on Plex, it'll request both in 1080p and in 4K
  • If movie IS present on Plex in 1080p, it'll just send the 4K request as intended by the user

This should also apply to series' ofc:

  • User uses /request series {term}
  • User selects the series and presses Request 4K, without checking if it's already on Plex in 1080p
  • Doplarr checks with Overseerr if the series is already available on Plex
  • If series is NOT available on Plex, it'll request both in 1080p and in 4K
  • If series IS present on Plex in 1080p, it'll just send the 4K request as intended by the user

Additional context
I hope I make sense. This option would be awesome. Especially to avoid problems in Overseerr - but also because it's nice to have the movie available in both instances of Radarr/Sonarr.

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.