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

(defrecord Playlist
    [id name playlist-type thumbnail-url uploader-name uploader-url
     uploader-avatar banner-url next-page stream-count related-streams])

(defrecord PlaylistResult
    [name thumbnail-url url upload-author stream-count])

(defrecord PlaylistPage
    [next-page related-streams])

(defn get-playlist-result
  [playlist]
  (map->PlaylistResult
   {:name (.getName playlist)
    :thumbnail-url (.getThumbnailUrl playlist)
    :url (.getUrl playlist)
    :upload-author (.getUploaderName playlist)
    :stream-count (.getStreamCount playlist)}))

(defn get-playlist-info
  ([url]
   (let [service (NewPipe/getServiceByUrl (url-decode url))
         info (PlaylistInfo/getInfo service (url-decode url))]
     (map->Playlist
      {:id (.getId info)
       :name (.getName info)
       :playlist-type (j/from-java (.getPlaylistType info))
       :thumbnail-url (.getThumbnailUrl info)
       :banner-url (.getBannerUrl info)
       :uploader-name (.getUploaderName info)
       :uploader-url (.getUploaderUrl info)
       :uploader-avatar (.getUploaderAvatarUrl info)
       :stream-count (.getStreamCount info)
       :next-page (j/from-java (.getNextPage info))
       :related-streams (map #(stream/get-stream-result %) (.getRelatedItems info))})))
  ([url page-url]
   (let [service (NewPipe/getServiceByUrl (url-decode url))
         info (PlaylistInfo/getMoreItems service url (Page. (url-decode page-url)))]
     (map->PlaylistPage
      {:next-page (j/from-java (.getNextPage info))
       :related-streams (map #(stream/get-stream-result %) (.getItems info))}))))