aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tau/api/search.clj
blob: 4969f106b7a0c63ab17c39d0293b1a3218c58af9 (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
(ns tau.api.search
  (:require
   [tau.api.stream :as stream]
   [tau.api.channel :as channel]
   [tau.api.playlist :as playlist]
   [clojure.java.data :as j]
   [ring.util.codec :refer [url-encode url-decode]])
  (:import
   org.schabi.newpipe.extractor.search.SearchInfo
   org.schabi.newpipe.extractor.InfoItem
   org.schabi.newpipe.extractor.NewPipe
   org.schabi.newpipe.extractor.Page))

(defrecord SearchResult
    [items next-page search-suggestion corrected-search?])

(defrecord SearchResultPage
    [items next-page])

(defn get-search-results
  [items]
  (map #(case (.name (.getInfoType %))
          "STREAM" (stream/get-stream-result %)
          "CHANNEL" (channel/get-channel-result %)
          "PLAYLIST" (playlist/get-playlist-result %))
       items))

(defn get-search-info
  ([service-id query content-filters sort-filter]
   (let [service (NewPipe/getService service-id)
         query-handler (.. service
                           (getSearchQHFactory)
                           (fromQuery query (or content-filters '()) (or sort-filter "")))
         info (SearchInfo/getInfo service query-handler)]
     (map->SearchResult
      {:items (get-search-results (.getRelatedItems info))
       :next-page (j/from-java (.getNextPage info))
       :search-suggestion (.getSearchSuggestion info)
       :corrected-search? (.isCorrectedSearch info)})))
  ([service-id query content-filters sort-filter page-url]
   (let [service (NewPipe/getService service-id)
         url (url-decode page-url)
         query-handler (.. service
                           (getSearchQHFactory)
                           (fromQuery query (or content-filters '()) (or sort-filter "")))
         info (SearchInfo/getMoreItems service query-handler (Page. url))]
     (map->SearchResultPage
      {:items (get-search-results (.getItems info))
       :next-page (j/from-java (.getNextPage info))}))))