summaryrefslogtreecommitdiff
path: root/lisp/net/shr.el
diff options
context:
space:
mode:
authorLars Ingebrigtsen <larsi@gnus.org>2021-11-09 06:19:09 +0100
committerLars Ingebrigtsen <larsi@gnus.org>2021-11-09 06:19:09 +0100
commit9a67efa11b0fb9add6325cf68f8c0f8c7fcff861 (patch)
tree9580b0f0e5f6808baf1c1e1c270d6cfc0be7594e /lisp/net/shr.el
parent5ba738eb0a24e54852e3a5fb11894a3f39355b7e (diff)
downloademacs-9a67efa11b0fb9add6325cf68f8c0f8c7fcff861.tar.gz
emacs-9a67efa11b0fb9add6325cf68f8c0f8c7fcff861.tar.bz2
emacs-9a67efa11b0fb9add6325cf68f8c0f8c7fcff861.zip
Optionally use use xwidgets to display <video> elements in shr
* doc/misc/eww.texi (Advanced): Document it. * lisp/net/shr.el (shr-use-xwidgets-for-media): New user option. (shr-tag-video): Use xwidgets to display <video> elements.
Diffstat (limited to 'lisp/net/shr.el')
-rw-r--r--lisp/net/shr.el42
1 files changed, 38 insertions, 4 deletions
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index cb8ee73c14c..295ffddf059 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -1626,6 +1626,14 @@ url if no type is specified. The value should be a float in the range 0.0 to
:version "24.4"
:type '(alist :key-type regexp :value-type float))
+(defcustom shr-use-xwidgets-for-media nil
+ "If non-nil, use xwidgets to display video and audio elements.
+This also depends on Emacs being built with xwidgets capability.
+Note that this is experimental, and may lead to instability on
+some platforms."
+ :type 'boolean
+ :version "29.1")
+
(defun shr--get-media-pref (elem)
"Determine the preference for ELEM.
The preference is a float determined from `shr-prefer-media-type'."
@@ -1668,10 +1676,36 @@ The preference is a float determined from `shr-prefer-media-type'."
(start (point)))
(unless url
(setq url (car (shr--extract-best-source dom))))
- (if (> (length image) 0)
- (shr-indirect-call 'img nil image)
- (shr-insert " [video] "))
- (shr-urlify start (shr-expand-url url))))
+ (if (and shr-use-xwidgets-for-media
+ (fboundp 'make-xwidget))
+ ;; Play the video.
+ (progn
+ (let ((widget (make-xwidget
+ 'webkit
+ "Video"
+ (truncate (* (window-pixel-width) 0.8))
+ (truncate (* (window-pixel-width) 0.8 0.75))))
+ (file (make-temp-file "shr" nil ".html")))
+ (run-at-time 1 nil (lambda ()
+ (ignore-errors
+ (delete-file file))))
+ (insert
+ (propertize
+ " [video] "
+ 'display (list 'xwidget :xwidget widget)))
+ (with-temp-buffer
+ (insert
+ (format
+ "<video autoplay loop muted><source src=%S type=\"video/mp4\"></source></video>"
+ url))
+ (write-region (point-min) (point-max) file nil 'silent))
+ (xwidget-webkit-goto-uri widget
+ (concat "file://" file))))
+ ;; No xwidgets.
+ (if (> (length image) 0)
+ (shr-indirect-call 'img nil image)
+ (shr-insert " [video] "))
+ (shr-urlify start (shr-expand-url url)))))
(defun shr-tag-audio (dom)
(let ((url (dom-attr dom 'src))