2021-05-05 09:28:12 +02:00
|
|
|
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
;;
|
|
|
|
;; Copyright (c) UXBOX Labs SL
|
|
|
|
|
|
|
|
(ns app.renderer.bitmap
|
|
|
|
"A bitmap renderer."
|
|
|
|
(:require
|
|
|
|
[app.browser :as bw]
|
|
|
|
[app.common.data :as d]
|
|
|
|
[app.common.exceptions :as ex :include-macros true]
|
2021-11-16 11:58:59 +01:00
|
|
|
[app.common.logging :as l]
|
2021-05-05 09:28:12 +02:00
|
|
|
[app.common.pages :as cp]
|
|
|
|
[app.common.spec :as us]
|
2022-03-22 08:12:31 +01:00
|
|
|
[app.common.uri :as u]
|
2021-05-05 09:28:12 +02:00
|
|
|
[app.config :as cf]
|
|
|
|
[cljs.spec.alpha :as s]
|
|
|
|
[cuerdas.core :as str]
|
|
|
|
[promesa.core :as p]))
|
|
|
|
|
|
|
|
(defn screenshot-object
|
2022-03-18 12:34:02 +01:00
|
|
|
[{:keys [file-id page-id object-id token scale type uri]}]
|
2022-03-22 08:12:31 +01:00
|
|
|
(p/let [params {:file-id file-id
|
|
|
|
:page-id page-id
|
|
|
|
:object-id object-id
|
|
|
|
:route "render-object"}
|
|
|
|
|
|
|
|
uri (-> (or uri (cf/get :public-uri))
|
|
|
|
(assoc :path "/render.html")
|
|
|
|
(assoc :query (u/map->query-string params)))]
|
2022-03-18 12:34:02 +01:00
|
|
|
(bw/exec!
|
|
|
|
#js {:screen #js {:width bw/default-viewport-width
|
|
|
|
:height bw/default-viewport-height}
|
|
|
|
:viewport #js {:width bw/default-viewport-width
|
|
|
|
:height bw/default-viewport-height}
|
|
|
|
:locale "en-US"
|
|
|
|
:storageState #js {:cookies (bw/create-cookies uri {:token token})}
|
|
|
|
:deviceScaleFactor scale
|
|
|
|
:userAgent bw/default-user-agent}
|
|
|
|
(fn [page]
|
|
|
|
(l/info :uri uri)
|
|
|
|
(p/do!
|
|
|
|
(bw/nav! page (str uri))
|
|
|
|
(p/let [node (bw/select page "#screenshot")]
|
|
|
|
(bw/wait-for node)
|
|
|
|
(bw/eval! page (js* "() => document.body.style.background = 'transparent'"))
|
|
|
|
(bw/sleep page 2000) ; the good old fix with sleep
|
|
|
|
(case type
|
|
|
|
:png (bw/screenshot node {:omit-background? true :type type})
|
|
|
|
:jpeg (bw/screenshot node {:omit-background? false :type type}))))))))
|
2021-05-05 09:28:12 +02:00
|
|
|
|
|
|
|
(s/def ::name ::us/string)
|
|
|
|
(s/def ::suffix ::us/string)
|
|
|
|
(s/def ::type #{:jpeg :png})
|
|
|
|
(s/def ::page-id ::us/uuid)
|
|
|
|
(s/def ::file-id ::us/uuid)
|
|
|
|
(s/def ::object-id ::us/uuid)
|
|
|
|
(s/def ::scale ::us/number)
|
|
|
|
(s/def ::token ::us/string)
|
2022-03-18 12:34:02 +01:00
|
|
|
(s/def ::uri ::us/uri)
|
2021-05-05 09:28:12 +02:00
|
|
|
|
2022-03-18 12:34:02 +01:00
|
|
|
(s/def ::params
|
2021-05-05 09:28:12 +02:00
|
|
|
(s/keys :req-un [::name ::suffix ::type ::object-id ::page-id ::scale ::token ::file-id]
|
2022-03-23 13:19:35 +01:00
|
|
|
:opt-un [::uri]))
|
2021-05-05 09:28:12 +02:00
|
|
|
|
|
|
|
(defn render
|
|
|
|
[params]
|
2022-03-18 12:34:02 +01:00
|
|
|
(us/verify ::params params)
|
2021-08-19 14:17:51 +02:00
|
|
|
(p/let [content (screenshot-object params)]
|
2022-03-18 12:34:02 +01:00
|
|
|
{:data content
|
|
|
|
:name (str (:name params)
|
|
|
|
(:suffix params "")
|
|
|
|
(case (:type params)
|
|
|
|
:png ".png"
|
|
|
|
:jpeg ".jpg"))
|
|
|
|
:size (alength content)
|
|
|
|
:mtype (case (:type params)
|
|
|
|
:png "image/png"
|
|
|
|
:jpeg "image/jpeg")}))
|
2021-05-05 09:28:12 +02:00
|
|
|
|