blob: 1469f7783d62950c8d8b3a14e0f3261eb06081ae (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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)))
|