downloader_impl.clj 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. (ns tubo.downloader-impl
  2. (:import
  3. [org.schabi.newpipe.extractor.downloader Response Request]
  4. [okhttp3 Request$Builder OkHttpClient$Builder RequestBody]))
  5. (gen-class
  6. :name tubo.DownloaderImpl
  7. :constructors {[okhttp3.OkHttpClient$Builder] []}
  8. :extends org.schabi.newpipe.extractor.downloader.Downloader
  9. :init downloader-impl)
  10. (gen-class
  11. :name tubo.DownloaderImpl
  12. :constructors {[okhttp3.OkHttpClient$Builder] []}
  13. :extends org.schabi.newpipe.extractor.downloader.Downloader
  14. :prefix "-"
  15. :main false
  16. :state state
  17. :init downloader-impl
  18. :methods [#^{:static true} [init [] tubo.DownloaderImpl]
  19. #^{:static true} [getInstance [] tubo.DownloaderImpl]])
  20. (def user-agent "Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0")
  21. (def instance (atom nil))
  22. (defn -downloader-impl [builder]
  23. [[] (atom {:client
  24. (.. builder
  25. (readTimeout 30 (java.util.concurrent.TimeUnit/SECONDS))
  26. (build))})])
  27. (defn -init
  28. ([]
  29. (-init (OkHttpClient$Builder.)))
  30. ([builder]
  31. (reset! instance (tubo.DownloaderImpl. builder))))
  32. (defn -getInstance []
  33. (or @instance (-init)))
  34. (defn -execute [this request]
  35. (let [http-method (.httpMethod request)
  36. url (.url request)
  37. headers (.headers request)
  38. data-to-send (.dataToSend request)
  39. request-body (when data-to-send (RequestBody/create nil data-to-send))
  40. request-builder (.. (Request$Builder.)
  41. (method http-method request-body)
  42. (url url)
  43. (addHeader "User-Agent" user-agent))]
  44. (doseq [pair (.entrySet headers)]
  45. (let [header-name (.getKey pair)
  46. header-value-list (.getValue pair)]
  47. (if (> (.size header-value-list) 1)
  48. (do
  49. (.removeHeader request-builder header-name)
  50. (doseq [header-value header-value-list]
  51. (.addHeader request-builder header-name header-value)))
  52. (if (= (.size header-value-list) 1)
  53. (.header request-builder header-name (.get header-value-list 0))))))
  54. (let [response (.. (@(.state this) :client) (newCall (.build request-builder)) (execute))
  55. body (.body response)
  56. response-body-to-return (when body (.string body))
  57. latest-url (.. response (request) (url) (toString))]
  58. (when (= (.code response) 429)
  59. (.close response))
  60. (Response. (.code response)
  61. (.message response)
  62. (.. response (headers) (toMultimap))
  63. response-body-to-return
  64. latest-url))))