aboutsummaryrefslogtreecommitdiff
path: root/src/backend/tau/api/search.clj
diff options
context:
space:
mode:
authorMiguel Ángel Moreno <mail@migalmoreno.com>2022-11-21 17:55:28 +0100
committerMiguel Ángel Moreno <mail@migalmoreno.com>2022-12-20 00:54:46 +0100
commit452ccfd567f79126e108f69bb7ebca07b5993bdd (patch)
tree4bc2688977dcd461259683bc89ea7eb94848f627 /src/backend/tau/api/search.clj
feat: Initial commit
Diffstat (limited to 'src/backend/tau/api/search.clj')
-rw-r--r--src/backend/tau/api/search.clj49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/backend/tau/api/search.clj b/src/backend/tau/api/search.clj
new file mode 100644
index 0000000..4969f10
--- /dev/null
+++ b/src/backend/tau/api/search.clj
@@ -0,0 +1,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))}))))