diff options
-rw-r--r-- | emacsconf-erc.el | 2 | ||||
-rw-r--r-- | emacsconf-mail.el | 29 | ||||
-rw-r--r-- | emacsconf-pad.el | 11 | ||||
-rw-r--r-- | emacsconf-publish.el | 152 | ||||
-rw-r--r-- | emacsconf.el | 12 |
5 files changed, 132 insertions, 74 deletions
diff --git a/emacsconf-erc.el b/emacsconf-erc.el index 6c9a742..56c6ed7 100644 --- a/emacsconf-erc.el +++ b/emacsconf-erc.el @@ -63,7 +63,7 @@ (defcustom emacsconf-erc-org "#emacsconf-org" "Channel for organizers") (defcustom emacsconf-topic-templates - '(("#emacsconf" "${emacsconf-name} ${year} | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") + '(("#emacsconf" "EmacsConf 2022 | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") ("#emacsconf-gen" "General track | https://emacsconf.org/2022/watch/gen/ | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") ("#emacsconf-dev" "Development track | https://emacsconf.org/2022/watch/dev/ | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") ("#emacsconf-accessible" "EmacsConf 2022 accessibility - help by describing what's happening | Subscribe to https://lists.gnu.org/mailman/listinfo/emacsconf-discuss for updates") diff --git a/emacsconf-mail.el b/emacsconf-mail.el index 5b93acd..179dcc3 100644 --- a/emacsconf-mail.el +++ b/emacsconf-mail.el @@ -244,5 +244,34 @@ Include some other things, too, such as emacsconf-year, title, name, email, url, (kill-buffer buffer)))) (buffer-list))) +(defun emacsconf-mail-notmuch-search-for-talk (talk) + "Search for e-mail related to TALK." + (interactive (list (emacsconf-complete-talk-info))) + (notmuch-search + (concat + (mapconcat + (lambda (o) + (format "from:%s or to:%s" o o)) + (split-string (plist-get talk :email) " *, *") + " or ") + " or (" emacsconf-id " and " (plist-get talk :slug) ")"))) + +;;; Volunteers + +(defun emacsconf-mail-volunteers (volunteers) + (interactive + (list + (completing-read-multiple + "Volunteers: " (emacsconf-volunteer-emails-for-completion)))) + (compose-mail (string-join volunteers ", "))) + +(defun emacsconf-mail-notmuch-search-for-volunteer (volunteer) + (interactive + (list + (completing-read + "Volunteer: " (emacsconf-volunteer-emails-for-completion)))) + (let ((email (if (string-match "<\\(.*?\\)>" volunteer) (match-string 1) volunteer))) + (notmuch-search (format "from:%s or to:%s" email email)))) + (provide 'emacsconf-mail) ;;; emacsconf-mail.el ends here diff --git a/emacsconf-pad.el b/emacsconf-pad.el index 756a65e..f9cd655 100644 --- a/emacsconf-pad.el +++ b/emacsconf-pad.el @@ -360,12 +360,14 @@ ${next-talk-list} (concat " <p>Ctrl-5 is the shortcut for striking through on Etherpad.</p> +Don't use this for notes since it gets overwritten. <strong>Setup</strong> <ul> <li>[ ] ${checkin}: Open ${checkin-pad}</li> <li>[ ] ${irc-volunteer}: Watch the #emacsconf-${track-id} channel and open ${base-url}${year}/talks for links to the pads</li> <li>[ ] ${pad}: Open ${base-url}${year}/talks for links to the pads</li> +<li>[ ] ${coord}: ssh orga@live0.emacsconf.org and run screen-fallbacks; confirm that the streams are showing fallbacks</li> <li>[ ] ${stream}: Start recording with OBS <li>[ ] Copy the password file if you don't already have it: <strong>scp emacsconf-${track-id}@res.emacsconf.org:~/.vnc/passwd vnc-passwd-${track-id} -p ${ssh-port}</strong></li> <li>[ ] Forward your local ports: <strong>ssh emacsconf-${track-id}@res.emacsconf.org -N -L ${vnc-port}:127.0.0.1:${vnc-port} -p ${ssh-port} &</strong></li> @@ -510,8 +512,8 @@ ${bbb-checklist}</li>") (t (let ((pronoun (pcase (plist-get talk :pronouns) ((rx "she") "She") + ((or 'nil "nil" (rx string-start "he") (rx "him")) "He") ((rx "they") "They") - ((rx "she") "He") (_ (or (plist-get talk :pronouns) ""))))) (format "The next talk is called \"%s\"\", by %s.%s" (plist-get talk :title) (replace-regexp-in-string ", \\([^,]+\\)$" @@ -577,13 +579,14 @@ ${bbb-checklist}</li>") (emacsconf-surround "<li><strong>" (plist-get talk :hyperlist-note) "</strong></li>" "") (if (file-exists-p (expand-file-name (concat (plist-get talk :slug) ".webm") (expand-file-name "intros" emacsconf-stream-asset-dir))) - "<li>This talk has a recorded intro that should automatically play when you mark the talk as playing. If it doesn't play, go to the ~/assets/intros directory and use track-mpv to play the video file.</li>" - "<li>[ ] ${stream}: Display the in-between slide: ${ssh-track} and run <em>firefox ${in-between-url} &</em></li> + "<li>This talk has a recorded intro that should automatically play when you mark the talk as playing. If it doesn't play, go to the ~/assets/intros directory and use track-mpv to play the video file. If that doesn't work, display the in-between slide: ${ssh-track} and run <em>firefox ~/assets/in-between/${slug}.png</em> . ${host} can join Mumble and say: <strong>${intro-note}</strong></li>" + "<li>[ ] ${stream}: Display the in-between slide: ${ssh-track} and run <em>firefox ~/assets/in-between/${slug}.png</em></li> <li>[ ] ${host}: Connect to the ${mumble} channel in Mumble and introduce the talk: <strong>${intro-note}</strong></li> ") (if (plist-get talk :video-file) - "<li>[ ] ${stream}: Mark the talk as playing: ${ssh-playing} and confirm that it plays. If it doesn't play, go to the ~/stream directory and use track-mpv to play the video file.</li>" + "<li>[ ] ${stream}: Mark the talk as playing: ${ssh-playing} and confirm that it plays. If it doesn't play, go to the ~/stream directory and use track-mpv to play the video file.</li> +<li>[ ] ${coord}: emacsconf-publish-update-talk ${slug} and then commit and push the wiki. Confirm that the video is visible" "<li>[ ] ${stream}: <strong>LIVE talk:</strong> Mark the talk as playing: ${ssh-playing} and arrange windows (backup URL for BBB if it doesn't open: ${bbb-backstage}). Adjust audio as needed</li>") (pcase (or (plist-get talk :q-and-a) "") ((rx "live") diff --git a/emacsconf-publish.el b/emacsconf-publish.el index a3371ea..a4b09fe 100644 --- a/emacsconf-publish.el +++ b/emacsconf-publish.el @@ -41,6 +41,13 @@ (defcustom emacsconf-public-media-directory (concat "/ssh:orga@media.emacsconf.org:/var/www/media.emacsconf.org/" emacsconf-year "/") "Can be over TRAMP" :type 'string :group 'emacsconf) +(defun emacsconf-publish-info-pages-for-talk (talk) +"Publish the before and after pages for this talk." + (interactive (list (emacsconf-complete-talk-info))) + (let ((info (emacsconf-get-talk-info))) + (emacsconf-publish-before-page talk info) + (emacsconf-publish-after-page talk info))) + (defun emacsconf-publish-update-talk (talk) "Publish the schedule page and the page for this talk." (interactive (list (emacsconf-complete-talk-info))) @@ -1821,7 +1828,7 @@ ${title-info} (emacsconf-publish-page-nav nav "watch") " | ${stream-nav}</div> -<video controls><source src=\"${stream}\" type=\"video/webm\" /></video> +<video controls class=\"reload\"><source src=\"${stream}\" type=\"video/webm\" /></video> <div>Alternatively, load <a href=\"${stream-hires}\">${stream-hires}</a> or <a href=\"${480p}\">${480p}</a> (low-res) in a streaming media player such as MPV.</div> <hr size=\"1\"><div>" (emacsconf-publish-page-nav nav "links") " | ${stream-nav}</div>" "<div>${brief}</div> @@ -1843,35 +1850,58 @@ ${title-info} (defun emacsconf-publish-watch-pages () "Update /year/watch pages." (interactive) - (let ((tracks - (mapcar (lambda (track) - (append (list - :year emacsconf-year - :stream (concat emacsconf-stream-base (plist-get track :id) ".webm") - :stream-hires (concat emacsconf-stream-base (plist-get track :id) ".webm") - :480p (concat emacsconf-stream-base (plist-get track :id) "-480p.webm")) - track)) - emacsconf-tracks))) - (let* ((info (emacsconf-prepare-for-display (emacsconf-get-talk-info))) - (emacsconf-publishing-phase 'schedule) - (emacsconf-use-absolute-url t)) - (when emacsconf-directory - (emacsconf-publish-with-wiki-change - (make-directory (expand-file-name "watch" (expand-file-name emacsconf-year emacsconf-directory)) t) - (with-temp-file (expand-file-name "watch/info.md" (expand-file-name emacsconf-year emacsconf-directory)) - (insert "[[!sidebar content=\"\"]]" (emacsconf-publish-format-watch-index info))) - (mapc (lambda (track) - (with-temp-file (expand-file-name (format "%s/watch/%s.md" emacsconf-year (plist-get track :id)) - emacsconf-directory) - (insert (emacsconf-publish-format-watch-track (append track (list :title "")) info)))) - tracks))) - ;; Update live.emacsconf.org - (when emacsconf-publish-watch-directory - (make-directory (expand-file-name "watch" (expand-file-name emacsconf-year emacsconf-publish-watch-directory)) t) - (with-temp-file (expand-file-name "watch/index.html" (expand-file-name emacsconf-year emacsconf-publish-watch-directory)) - (insert "<html><head><title>Watch EmacsConf</title><link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"></link></head><body>" (emacsconf-publish-format-watch-index info) - - " <p> + (let* ((tracks + (mapcar (lambda (track) + (append (list + :year emacsconf-year + :stream (concat emacsconf-stream-base (plist-get track :id) ".webm") + :stream-hires (concat emacsconf-stream-base (plist-get track :id) ".webm") + :480p (concat emacsconf-stream-base (plist-get track :id) "-480p.webm")) + track)) + emacsconf-tracks)) + (reload-js " +<script> + // @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt txt CC0-1.0 + // Copyright (c) 2022 Sacha Chua - CC0 Public Domain +var video = document.querySelector('video.reload'); +if (video) { + var myVar = setInterval(reloadAsNeeded, 1000); + var oldTime = ''; + function reloadAsNeeded() { + if ((video.paused != true && (video.currentTime - oldTime) == 0 && video.currentTime != 0)) { + var source = video.querySelector('source'); + var oldVideo = source.src; + source.src = ''; + source.src = oldVideo; + video.load(); + video.play(); + } + oldTime = video.currentTime; + }; +} +// @license-end +</script> +") + (info (emacsconf-prepare-for-display (emacsconf-get-talk-info))) + (emacsconf-publishing-phase 'schedule) + (emacsconf-use-absolute-url t)) + (when emacsconf-directory + (emacsconf-publish-with-wiki-change + (make-directory (expand-file-name "watch" (expand-file-name emacsconf-year emacsconf-directory)) t) + (with-temp-file (expand-file-name "watch/info.md" (expand-file-name emacsconf-year emacsconf-directory)) + (insert "[[!sidebar content=\"\"]]" (emacsconf-publish-format-watch-index info))) + (mapc (lambda (track) + (with-temp-file (expand-file-name (format "%s/watch/%s.md" emacsconf-year (plist-get track :id)) + emacsconf-directory) + (insert (emacsconf-publish-format-watch-track (append track (list :title "")) info)))) + tracks))) + ;; Update live.emacsconf.org + (when emacsconf-publish-watch-directory + (make-directory (expand-file-name "watch" (expand-file-name emacsconf-year emacsconf-publish-watch-directory)) t) + (with-temp-file (expand-file-name "watch/index.html" (expand-file-name emacsconf-year emacsconf-publish-watch-directory)) + (insert "<html><head><title>Watch EmacsConf</title><link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"></link></head><body>" (emacsconf-publish-format-watch-index info) + + " <p> Depending on which media player you use, you may enter the stream address in a graphical user interface or provide it as an argument to the program when launching it from the terminal. @@ -1906,36 +1936,38 @@ when the host has opened the Q&A.</p> " - "</body></html>")) - (mapc (lambda (track) - (make-directory (expand-file-name (format "%s/watch/%s" emacsconf-year (plist-get track :id)) emacsconf-publish-watch-directory) t) - (make-directory (expand-file-name (format "%s/watch/%s-480p" emacsconf-year (plist-get track :id)) emacsconf-publish-watch-directory) t) - (with-temp-file (expand-file-name (format "%s/watch/%s/index.html" emacsconf-year (plist-get track :id)) - emacsconf-publish-watch-directory) - (insert - (emacsconf-replace-plist-in-string - track - "<html><head><title>Watch EmacsConf ${name} track</title><link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"></link></head><body>") - (emacsconf-publish-format-watch-track (append track - (list :title - (emacsconf-replace-plist-in-string - track - "EmacsConf ${year}: ${name} track"))) - info) - "</body></html>")) - (with-temp-file (expand-file-name (format "%s/watch/%s-480p/index.html" emacsconf-year (plist-get track :id)) - emacsconf-publish-watch-directory) - (insert - (emacsconf-replace-plist-in-string - track - "<html><head><title>Watch EmacsConf ${name} track (low-res)</title><link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"></link></head><body>") - (emacsconf-publish-format-watch-track - (append (list :stream (plist-get track :480p) - :title (emacsconf-replace-plist-in-string track "EmacsConf ${year}: ${name} track (low-res)")) - track) - info) - "</body></html>"))) - tracks))))) + "</body></html>")) + (mapc (lambda (track) + (make-directory (expand-file-name (format "%s/watch/%s" emacsconf-year (plist-get track :id)) emacsconf-publish-watch-directory) t) + (make-directory (expand-file-name (format "%s/watch/%s-480p" emacsconf-year (plist-get track :id)) emacsconf-publish-watch-directory) t) + (with-temp-file (expand-file-name (format "%s/watch/%s/index.html" emacsconf-year (plist-get track :id)) + emacsconf-publish-watch-directory) + (insert + (emacsconf-replace-plist-in-string + track + "<html><head><title>Watch EmacsConf ${name} track</title><link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"></link></head><body>") + (emacsconf-publish-format-watch-track (append track + (list :title + (emacsconf-replace-plist-in-string + track + "EmacsConf ${year}: ${name} track"))) + info) + reload-js + "</body></html>")) + (with-temp-file (expand-file-name (format "%s/watch/%s-480p/index.html" emacsconf-year (plist-get track :id)) + emacsconf-publish-watch-directory) + (insert + (emacsconf-replace-plist-in-string + track + "<html><head><title>Watch EmacsConf ${name} track (low-res)</title><link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\"></link></head><body>") + (emacsconf-publish-format-watch-track + (append (list :stream (plist-get track :480p) + :title (emacsconf-replace-plist-in-string track "EmacsConf ${year}: ${name} track (low-res)")) + track) + info) + reload-js + "</body></html>"))) + tracks)))) (defvar emacsconf-publish-current-dir "/ssh:orga@media.emacsconf.org:/var/www/media.emacsconf.org/2022/current" diff --git a/emacsconf.el b/emacsconf.el index 378d722..25964e7 100644 --- a/emacsconf.el +++ b/emacsconf.el @@ -91,6 +91,8 @@ (defvar emacsconf-res-dir (format "/ssh:orga@res.emacsconf.org:/data/emacsconf/%s" emacsconf-year)) (defvar emacsconf-media-extensions '("webm" "mkv" "mp4" "webm" "avi" "ts" "ogv" "wav" "ogg" "mp3")) (defvar emacsconf-ftp-upload-dir "/ssh:orga@media.emacsconf.org:/srv/ftp/anon/upload-here") +(defvar emacsconf-backstage-user "emacsconf") +(defvar emacsconf-backstage-password nil "Password for backstage area") (defvar emacsconf-notebook (expand-file-name "index.org" @@ -1038,8 +1040,7 @@ :vnc-port "5906" :status "offline"))) -(defvar emacsconf-shifts (list (list :id "sat-am-gen" :track "General" :start "2022-12-03T08:00:00-0500" :end "2022-12-03T12:00:00-0500" :host "zaeph" :streamer "corwin" :checkin "sachac" :irc "sachac" :pad "publicvoit" :coord "sachac") (list :id "sat-pm-gen" :track "General" :start "2022-12-03T13:00:00-0500" :end "2022-12-03T18:00:00-0500" :host "zaeph" :streamer "corwin" :checkin "FlowyCoder" :irc "dto" :pad "publicvoit" :coord "sachac") (list :id "sat-am-dev" :track "Development" :start "2022-12-03T08:00:00-0500" :end "2022-12-03T12:00:00-0500" :host "bandali" :streamer "bandali" :checkin "sachac" :irc "dto" :coord "sachac") (list :id "sat-pm-dev" :track "Development" :start "2022-12-03T13:00:00-0500" :end "2022-12-03T18:00:00-0500" :host "vetrivln" :streamer "bandali" :checkin "FlowyCoder" :irc "vetrivln" :coord "sachac") (list :id "sun-am-gen" :track "General" :start "2022-12-04T08:00:00-0500" :end "2022-12-04T12:00:00-0500" :host "zaeph" :streamer "corwin" :checkin "sachac" :irc "sachac" :pad "publicvoit" :coord "sachac") (list :id "sun-pm-gen" :track "General" :start "2022-12-04T13:00:00-0500" :end "2022-12-04T18:00:00-0500" :host "zaeph" :streamer "jman" :checkin "FlowyCoder" :irc "dto" :pad "publicvoit" :coord "sachac") (list :id "sun-am-dev" :track "Development" :start "2022-12-04T08:00:00-0500" :end "2022-12-04T12:00:00-0500" :host "bandali" :streamer "bandali" :checkin "sachac" :irc "dto" :coord "sachac") (list :id "sun-pm-dev" :track "Development" :start "2022-12-04T13:00:00-0500" :end "2022-12-04T18:00:00-0500" :host "vetrivln" :streamer "bandali" :checkin "FlowyCoder" :irc "vetrivln" :coord "sachac")) - "Shift information derived from the organizer's notebook.") +(setq emacsconf-shifts (list (list :id "sat-am-gen" :track "General" :start "2022-12-03T08:00:00-0500" :end "2022-12-03T12:00:00-0500" :host "zaeph" :streamer "sachac" :checkin "corwin" :irc "bandali" :pad "publicvoit" :coord "sachac") (list :id "sat-pm-gen" :track "General" :start "2022-12-03T13:00:00-0500" :end "2022-12-03T18:00:00-0500" :host "zaeph" :streamer "sachac" :checkin "FlowyCoder" :irc "dto" :pad "publicvoit" :coord "sachac") (list :id "sat-am-dev" :track "Development" :start "2022-12-03T08:00:00-0500" :end "2022-12-03T12:00:00-0500" :host "bandali" :streamer "sachac" :checkin "corwin" :irc "dto" :coord "sachac") (list :id "sat-pm-dev" :track "Development" :start "2022-12-03T13:00:00-0500" :end "2022-12-03T18:00:00-0500" :host "vetrivln" :streamer "bandali" :checkin "FlowyCoder" :irc "vetrivln" :coord "sachac") (list :id "sun-am-gen" :track "General" :start "2022-12-04T08:00:00-0500" :end "2022-12-04T12:00:00-0500" :host "zaeph" :streamer "sachac" :checkin "corwin" :irc "bandali" :pad "publicvoit" :coord "sachac") (list :id "sun-pm-gen" :track "General" :start "2022-12-04T13:00:00-0500" :end "2022-12-04T18:00:00-0500" :host "zaeph" :streamer "jman" :checkin "FlowyCoder" :irc "dto" :pad "publicvoit" :coord "sachac") (list :id "sun-am-dev" :track "Development" :start "2022-12-04T08:00:00-0500" :end "2022-12-04T12:00:00-0500" :host "bandali" :streamer "sachac" :checkin "corwin" :irc "dto" :coord "sachac") (list :id "sun-pm-dev" :track "Development" :start "2022-12-04T13:00:00-0500" :end "2022-12-04T18:00:00-0500" :host "vetrivln" :streamer "bandali" :checkin "FlowyCoder" :irc "vetrivln" :coord "sachac"))) (defun emacsconf-get-track (name) (when (listp name) (setq name (plist-get name :track))) @@ -1191,13 +1192,6 @@ Filter by TRACK if given. Use INFO as the list of talks." (complete-with-action action choices string predicate)))))) (elt info (seq-position choices choice)))) -(defun emacsconf-email-volunteers (volunteers) - (interactive - (list - (completing-read-multiple - "Volunteers: " (emacsconf-volunteer-emails-for-completion)))) - (compose-mail (string-join volunteers ", "))) - ;;; Reflowing (defun emacsconf-reflow () "Help reflow text files." |