aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tau/http.clj
diff options
context:
space:
mode:
authorMiguel Ángel Moreno <mail@migalmoreno.com>2022-12-20 00:38:35 +0100
committerMiguel Ángel Moreno <mail@migalmoreno.com>2022-12-20 00:55:00 +0100
commit25365baa9060769c6df37480916bb5b23fb879fd (patch)
treea1f5eb8708023778cfb91e0129730f8d37e0e673 /src/backend/tau/http.clj
parente71fdc8dbac5c77d6c2fd252f31fc12cd6375e30 (diff)
feat: Set up reitit routes and serve static index
Diffstat (limited to 'src/backend/tau/http.clj')
-rw-r--r--src/backend/tau/http.clj110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/backend/tau/http.clj b/src/backend/tau/http.clj
new file mode 100644
index 0000000..1469f77
--- /dev/null
+++ b/src/backend/tau/http.clj
@@ -0,0 +1,110 @@
+(ns tau.http
+ (:require
+ [org.httpkit.server :refer [run-server]]
+ [ring.middleware.reload :refer [wrap-reload]]
+ [ring.middleware.params :refer [wrap-params]]
+ [ring.middleware.json :refer [wrap-json-response]]
+ [ring.middleware.cors :refer [wrap-cors]]
+ [ring.util.response :refer [response]]
+ [reitit.ring :as ring]
+ [reitit.coercion :as coercion]
+ [reitit.ring.coercion :as rrc]
+ [reitit.coercion.malli]
+ [clojure.string :as str]
+ [malli.experimental.lite :as l]
+ [hiccup.page :as hiccup]
+ [tau.api.stream :as stream]
+ [tau.api.search :as search]
+ [tau.api.channel :as channel]
+ [tau.api.playlist :as playlist]
+ [tau.api.comment :as comment]
+ [tau.api.kiosk :as kiosk]
+ [tau.api.service :as service])
+ (:import
+ tau.DownloaderImpl
+ org.schabi.newpipe.extractor.NewPipe
+ org.schabi.newpipe.extractor.localization.Localization))
+
+(defn index-html
+ []
+ (hiccup/html5
+ [:head
+ [:meta {:charset "UTF-8"}]
+ [:meta {:name "viewport" :content "width=device-width, initial-scale=1"}]
+ [:title "Tau"]
+ (hiccup/include-css "/css/output.css")]
+ [:body
+ [:div#app]
+ (hiccup/include-js "/js/main.js")
+ [:script "tau.core.init();"]]))
+
+(defonce server (atom nil))
+
+(def router
+ (ring/router
+ [["/" (constantly (response (index-html)))]
+ ["/search" (constantly (response (index-html)))]
+ ["/stream" (constantly (response (index-html)))]
+ ["/channel" (constantly (response (index-html)))]
+ ["/api"
+ ["/stream" {:get (fn [{{:strs [url]} :query-params}]
+ (response (stream/get-info url)))}]
+ ["/search" {:get {:coercion reitit.coercion.malli/coercion
+ :parameters {:query {:serviceId int?
+ :q string?
+ ;; :sortFilter (l/maybe string?)
+ ;; :contentFilters (l/maybe string?)
+ ;; :nextPage (l/maybe string?)
+ }}
+ :handler (fn [{:keys [parameters]}]
+ (let [{:keys [contentFilters serviceId q sortFilter nextPage]} (:query parameters)
+ content-filters (and contentFilters (str/split contentFilters #","))]
+ (response (apply search/get-info serviceId q
+ content-filters sortFilter
+ (or nextPage '())))))}}]
+ ["/channel" {:get (fn [{{:keys [url nextPage]} :query-params}]
+ (response (channel/get-info url nextPage)))}]
+ ["/playlist" {:get (fn [{{:keys [url nextPage]} :query-params}]
+ (response (playlist/get-info url nextPage)))}]
+ ["/comments" {:get (fn [{{:keys [url nextPage]} :query-params}]
+ (response (apply comment/get-info url (or nextPage '()))))}]
+ ["/services" {:get (constantly (response (service/get-services)))}]
+ ["/kiosks"
+ ["" {:coercion reitit.coercion.malli/coercion
+ :parameters {:query {:serviceId int?}}
+ :get (fn [{:keys [parameters]}]
+ (println parameters)
+ (response (kiosk/get-kiosks (-> parameters :query :serviceId))))}]
+ ["/:kioskId" {:get {:coercion reitit.coercion.malli/coercion
+ :parameters {:query {:serviceId int?}}
+ :handler (fn [{{:keys [kioskId serviceId nextPage]} :query-params}]
+ (response (kiosk/get-info kioskId serviceId nextPage)))}}]]]]
+ ;;{:compile coercion/compile-request-coercers}
+ {:data {:middleware [rrc/coerce-request-middleware
+ rrc/coerce-response-middleware
+ rrc/coerce-exceptions-middleware]}}))
+
+(def app
+ (ring/ring-handler
+ router
+ (ring/routes
+ (ring/create-resource-handler {:path "/"})
+ (ring/create-default-handler
+ {:not-found (constantly {:status 404, :body "Not found"})}))
+ {:middleware [wrap-params
+ [wrap-json-response {:pretty true}]
+ wrap-reload]}))
+
+(defn stop-server!
+ []
+ (when @server
+ (@server :timeout 100)
+ (reset! server nil)))
+
+(defn start-server!
+ ([]
+ (start-server! 3000))
+ ([port]
+ (NewPipe/init (DownloaderImpl/init) (Localization. "en" "GB"))
+ (reset! server (run-server #'app {:port port}))
+ (println "Server running in port" port)))