From 285e0dedd014a1d41b18fcd80ab4970eb161e634 Mon Sep 17 00:00:00 2001 From: Kiran Shila Date: Sun, 2 Jan 2022 12:14:52 -0800 Subject: [PATCH] Working on Readarr --- src/doplarr/backends/radarr.clj | 10 ++++---- src/doplarr/backends/readarr.clj | 37 +++++++++++++++++++++++++++ src/doplarr/backends/readarr/impl.clj | 37 +++++++++++++++++++++++++++ src/doplarr/backends/sonarr.clj | 10 ++++---- src/doplarr/backends/specs.clj | 9 +++++-- src/doplarr/config.clj | 3 ++- src/doplarr/config/specs.clj | 15 ++++++++--- src/doplarr/core.clj | 5 ++-- src/doplarr/discord.clj | 6 ++--- 9 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 src/doplarr/backends/readarr.clj create mode 100644 src/doplarr/backends/readarr/impl.clj diff --git a/src/doplarr/backends/radarr.clj b/src/doplarr/backends/radarr.clj index 8862e80..3e311ea 100644 --- a/src/doplarr/backends/radarr.clj +++ b/src/doplarr/backends/radarr.clj @@ -35,15 +35,15 @@ [result ::bs/result] (a/go (let [quality-profiles (a/> quality-profiles first :id) - default-quality-profile (->> quality-profiles - (filter #(= default-quality-profile (:name %))) - first - :id) + default-radarr-quality-profile (->> quality-profiles + (filter #(= default-radarr-quality-profile (:name %))) + first + :id) :else quality-profiles)}))) (defn-spec request-embed any? diff --git a/src/doplarr/backends/readarr.clj b/src/doplarr/backends/readarr.clj new file mode 100644 index 0000000..d0e8ffa --- /dev/null +++ b/src/doplarr/backends/readarr.clj @@ -0,0 +1,37 @@ +(ns doplarr.backends.readarr + (:require + [config.core :refer [env]] + [clojure.core.async :as a] + [orchestra.core :refer [defn-spec]] + [doplarr.utils :as utils] + [doplarr.backends.specs :as bs] + [doplarr.backends.readarr.impl :as impl])) + +(defn-spec search any? + [term string?] + (utils/request-and-process-body + impl/GET + #(->> (utils/from-camel %) + impl/filter-books) + "/book/lookup" + {:query-params {:term term}})) + +(defn-spec additional-options any? + [result ::bs/result] + (a/go + (let [quality-profiles (a/> quality-profiles + first + :id) + (->> quality-profiles + (filter #(= default-readarr-quality-profile (:name %))) + first + :id))}))) + +(defn request []) + +#_(defn request-embed [{:keys [title]}] + (a/go + (let [details (a/! (impl/get-from-id))]))) diff --git a/src/doplarr/backends/readarr/impl.clj b/src/doplarr/backends/readarr/impl.clj new file mode 100644 index 0000000..ea409b6 --- /dev/null +++ b/src/doplarr/backends/readarr/impl.clj @@ -0,0 +1,37 @@ +(ns doplarr.backends.readarr.impl + (:require + [orchestra.core :refer [defn-spec]] + [config.core :refer [env]] + [doplarr.utils :as utils] + [clojure.core.async :as a] + [doplarr.backends.specs :as bs])) + +(def base-url (delay (str (:readarr-url env) "/api/v1"))) +(def api-key (delay (:readarr-api env))) + +(defn GET [endpoint & [params]] + (utils/http-request :get (str @base-url endpoint) @api-key params)) + +(defn POST [endpoint & [params]] + (utils/http-request :post (str @base-url endpoint) @api-key params)) + +(def rootfolder (delay (a/> search-results + (map #(select-keys % [:title :foreign-book-id :author])) + (map #(assoc % :author (get-in % [:author :author-name]))))) + +(defn quality-profiles [] + (utils/request-and-process-body + GET + #(map utils/process-profile %) + "/qualityprofile")) + +(defn metadata-profiles [] + (utils/request-and-process-body + GET + #(map utils/process-profile %) + "/metadataprofile")) + +(defn get-from-id [id]) diff --git a/src/doplarr/backends/sonarr.clj b/src/doplarr/backends/sonarr.clj index b892a07..5d0a8a8 100644 --- a/src/doplarr/backends/sonarr.clj +++ b/src/doplarr/backends/sonarr.clj @@ -46,7 +46,7 @@ (map #(let [ssn (:season-number %)] (hash-map :id ssn :name (str ssn))))) {:keys [default-language-profile - default-quality-profile + default-sonarr-quality-profile partial-seasons]} env] {:season (cond (= 1 (count seasons)) (->> seasons @@ -58,10 +58,10 @@ (= 1 (count quality-profiles)) (->> quality-profiles first :id) - default-quality-profile (->> quality-profiles - (filter #(= default-quality-profile (:name %))) - first - :id) + default-sonarr-quality-profile (->> quality-profiles + (filter #(= default-sonarr-quality-profile (:name %))) + first + :id) :else quality-profiles) :language-profile-id (cond (= 1 (count language-profiles)) (->> language-profiles diff --git a/src/doplarr/backends/specs.clj b/src/doplarr/backends/specs.clj index 4adacf0..2b5ad63 100644 --- a/src/doplarr/backends/specs.clj +++ b/src/doplarr/backends/specs.clj @@ -26,9 +26,14 @@ (spec/def ::ignore-episodes-with-files boolean?) (spec/def ::search-for-missing-episodes boolean?) +; Books +(spec/def ::foreign-book-id pos-int?) +(spec/def ::author string?) + ; Searching -(spec/def ::result (spec/keys :req-un [::title ::year - (or ::id ::tvdb-id ::tmdb-id)])) +(spec/def ::result (spec/keys :req-un [::title + (or ::year ::author) + (or ::id ::tvdb-id ::tmdb-id ::foreign-book-id)])) ; Doplarr Internals (spec/def ::status (or #{:unauthorized :unknown :pending :processing :partially-available :available} diff --git a/src/doplarr/config.clj b/src/doplarr/config.clj index 6660416..3e71d96 100644 --- a/src/doplarr/config.clj +++ b/src/doplarr/config.clj @@ -8,8 +8,9 @@ (spec/explain-data ::specs/config env)) (defn available-backends [] - (let [{:keys [sonarr-url radarr-url overseerr-url]} env] + (let [{:keys [sonarr-url radarr-url overseerr-url readarr-url]} env] (cond-> #{} + readarr-url (conj :readarr) sonarr-url (conj :sonarr) radarr-url (conj :radarr) overseerr-url (conj :overseerr)))) diff --git a/src/doplarr/config/specs.clj b/src/doplarr/config/specs.clj index 36bdb72..01e7ad5 100644 --- a/src/doplarr/config/specs.clj +++ b/src/doplarr/config/specs.clj @@ -5,18 +5,25 @@ (spec/def ::sonarr-url string?) (spec/def ::radarr-url string?) (spec/def ::overseerr-url string?) +(spec/def ::readarr-url string?) ; Backend API keys (spec/def ::sonarr-api string?) (spec/def ::radarr-api string?) (spec/def ::overseerr-api string?) +(spec/def ::readarr-api string?) ; Discord bot token (spec/def ::bot-token string?) +; Additional required keys +(spec/def ::readarr-quality-profile string?) +(spec/def ::readarr-metadata-profile string?) + ; Optional settings (spec/def ::partial-seasons boolean?) -(spec/def ::default-quality-profile string?) +(spec/def ::default-radarr-quality-profile string?) +(spec/def ::default-sonarr-quality-profile string?) (spec/def ::default-language-profile string?) (spec/def ::role-id string?) (spec/def ::max-results pos-int?) @@ -24,10 +31,12 @@ ; Complete Config (spec/def ::config (spec/keys :req-un [(or (and ::sonarr-url ::sonarr-api) (and ::radarr-url ::radarr-api) - (and ::overseerr-url ::overseerr-api)) + (and ::overseerr-url ::overseerr-api) + (and ::readarr-url ::readarr-api ::readarr-quality-profile ::readarr-metadata-profile)) ::bot-token] :opt-un [::partial-seasons - ::default-quality-profile + ::default-radarr-quality-profile + ::default-sonarr-quality-profile ::default-language-profile ::role-id ::max-results])) diff --git a/src/doplarr/core.clj b/src/doplarr/core.clj index 18155b2..dcd8091 100644 --- a/src/doplarr/core.clj +++ b/src/doplarr/core.clj @@ -13,11 +13,12 @@ (:gen-class)) ;;;;;;;;;;;;;;;;;;;;;;;; Backend public interfaces -(def backends [:radarr :sonarr :overseerr]) +(def backends [:radarr :sonarr :overseerr :readarr]) (def backend-fns [:search :request :additional-options :request-embed]) (def media-backends {:movie [:overseerr :radarr] - :series [:overseerr :sonarr]}) + :series [:overseerr :sonarr] + :book [:readarr]}) (defn derive-backend! [backend] (derive (keyword "backend" (name backend)) :doplarr/backend)) diff --git a/src/doplarr/discord.clj b/src/doplarr/discord.clj index d58cc51..729d5fb 100644 --- a/src/doplarr/discord.clj +++ b/src/doplarr/discord.clj @@ -15,8 +15,8 @@ :options (into [] (for [media media-types] {:type 1 - :name media - :description (str "Request " media) + :name (name media) + :description (str "Request " (name media)) :options [{:type 3 :name "query" :description "Query" @@ -75,7 +75,7 @@ (defn select-menu-option [index result] {:label (or (:title result) (:name result)) - :description (:year result) + :description (or (:year result) (:author result)) :value index}) (defn dropdown [content id options]