diff options
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)) |