summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2022-11-28 19:59:34 -0500
committerSacha Chua <sacha@sachachua.com>2022-11-28 19:59:34 -0500
commit94adfdf2ea92cdb3e711af11017332735ba5e5ff (patch)
treea3f78086e3e2939631d5daae1f5292356cd77560
parentd78066a7d5f8fdca09a525a8d49eb9cd15bd9074 (diff)
downloademacsconf-el-94adfdf2ea92cdb3e711af11017332735ba5e5ff.tar.xz
emacsconf-el-94adfdf2ea92cdb3e711af11017332735ba5e5ff.zip
hyperlist updates
-rw-r--r--emacsconf-erc.el2
-rw-r--r--emacsconf-mail.el29
-rw-r--r--emacsconf-pad.el11
-rw-r--r--emacsconf-publish.el152
-rw-r--r--emacsconf.el12
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."