diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2021-11-09 06:19:09 +0100 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2021-11-09 06:19:09 +0100 |
commit | 9a67efa11b0fb9add6325cf68f8c0f8c7fcff861 (patch) | |
tree | 9580b0f0e5f6808baf1c1e1c270d6cfc0be7594e /lisp/net/shr.el | |
parent | 5ba738eb0a24e54852e3a5fb11894a3f39355b7e (diff) | |
download | emacs-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.el | 42 |
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)) |