diff options
author | Sacha Chua <sacha@sachachua.com> | 2022-11-22 08:34:20 -0500 |
---|---|---|
committer | Sacha Chua <sacha@sachachua.com> | 2022-11-22 08:34:20 -0500 |
commit | 59333798b0cd7fd285f5e0b3550bb926eab3c38c (patch) | |
tree | 1e0a86f15e17ef38afd33bae15257a036b9b5796 | |
parent | 911ca4f70fbd06602c6e8d427638e1c9ee85716a (diff) | |
download | emacsconf-el-59333798b0cd7fd285f5e0b3550bb926eab3c38c.tar.xz emacsconf-el-59333798b0cd7fd285f5e0b3550bb926eab3c38c.zip |
generate status page for live.emacsconf.org
-rw-r--r-- | emacsconf-pad.el | 84 | ||||
-rw-r--r-- | emacsconf-publish.el | 32 | ||||
-rw-r--r-- | emacsconf-schedule.el | 2 | ||||
-rw-r--r-- | emacsconf-stream.el | 136 | ||||
-rw-r--r-- | emacsconf.el | 17 |
5 files changed, 240 insertions, 31 deletions
diff --git a/emacsconf-pad.el b/emacsconf-pad.el index 5af8ba3..c7fc10c 100644 --- a/emacsconf-pad.el +++ b/emacsconf-pad.el @@ -318,14 +318,30 @@ ${next-talk-list} ;; (emacsconf-pad-export-initial-content-for-hyperlists "/ssh:media:~/backstage/hyperlists") (defun emacsconf-pad-format-shift-hyperlist (shift info) - (concat - "<h1>" (plist-get shift :id) "</h1>" - (emacsconf-replace-plist-in-string - shift - "<p>Host: ${host}, Streamer: ${streamer}, IRC: ${irc}, Pad: ${pad}, Check-in: ${checkin}</p>") - (emacsconf-replace-plist-in-string - shift - " + (let* ((prefixed (list + :start (plist-get shift :start) + :end (plist-get shift :end) + :host (emacsconf-surround "HOST-" (plist-get shift :host) "" "HOST") + :stream (emacsconf-surround "STREAM-" (plist-get shift :streamer) "" "STREAM") + :irc-volunteer (emacsconf-surround "IRC-" (plist-get shift :irc) "" "IRC") + :checkin (emacsconf-surround "CHECKIN-" (plist-get shift :checkin) "" "CHECKIN") + :pad (emacsconf-surround "PAD-" (plist-get shift :pad) "" "PAD") + :coord (emacsconf-surround "COORD-" (plist-get shift :coord) "" "COORD"))) + (shift-talks + (mapcar (lambda (o) (append prefixed o)) + (seq-filter + (lambda (talk) (string= (plist-get talk :track) (plist-get shift :track))) + (emacsconf-filter-talks-by-time (plist-get shift :start) (plist-get shift :end) info))))) + (concat + (emacsconf-replace-plist-in-string + shift + (concat + "<h1>" (plist-get shift :id) "</h1>" + "<p>Host: ${host}, Streamer: ${streamer}, IRC: ${irc}, Pad: ${pad}, Check-in: ${checkin}, Coord: ${coord}</p>")) + (emacsconf-replace-plist-in-string + prefixed + (concat + " <strong>Setup</strong> <ul><li>[ ] ${checkin}: Open the index: https://media.emacsconf.org/${year}/backstage/index-${track-id}.html</li> <li>[ ] ${host}: Open the intro pad and the index: https://media.emacsconf.org/${year}/backstage/index-${track-id}.html</li> @@ -345,22 +361,42 @@ ${next-talk-list} <li>[ ] Watch the stream with MPV on your local system: mpv https://live0.emacsconf.org/emacsconf/$TRACK.webm &</li> <li>[ ] Check 480p: mpv https://live0.emacsconf.org/emacsconf/$TRACK-480p.webm &</li> <li>[ ] Test with a sample video or Q&A session: ssh emacsconf-$TRACK@res.emacsconf.org -p 46668 \"~/bin/track-mpv meetups &\"</li> -</ul></li></ul> -") - "<ul>" - (emacsconf-pad-shift-hyperlist - (list - :start (plist-get shift :start) - :end (plist-get shift :end) - :host (emacsconf-surround "HOST-" (plist-get shift :host) "" "HOST") - :stream (emacsconf-surround "STREAM-" (plist-get shift :streamer) "" "STREAM") - :irc-volunteer (emacsconf-surround "IRC-" (plist-get shift :irc) "" "IRC") - :checkin (emacsconf-surround "CHECKIN-" (plist-get shift :checkin) "" "CHECKIN") - :pad (emacsconf-surround "PAD-" (plist-get shift :pad) "" "PAD")) - (seq-filter - (lambda (talk) (string= (plist-get talk :track) (plist-get shift :track))) - (emacsconf-filter-talks-by-time (plist-get shift :start) (plist-get shift :end) info))) - "</ul>")) +</ul></li> +<li>[ ] ${coord}: ssh -t orga@live0.emacsconf.org 'screen -S restream-${track-id}-youtube /home/orga/restream-${track-id}-youtube.sh' and then confirm</li> +<li>[ ] ${coord}: ssh -t orga@live0.emacsconf.org 'screen -S restream-${track-id}-toobnix /home/orga/restream-${track-id}-toobnix.sh' and then confirm</li> +<li>[ ] ${coord}: update the status page on live.emacsconf.org</li> +</ul> +" + "<ul>" + (mapconcat #'cdr + (sort + (append + (delq nil + (mapcar (lambda (talk) + (when (plist-get talk :checkin-time) + (emacsconf-replace-plist-in-string + (append (list :checkin-time-info + (format-time-string "%-l:%M" (plist-get talk :checkin-time) emacsconf-timezone)) + talk) + "<li>${checkin}: Double-check that the speaker for ${title} has checked in; let #emacsconf-org know if not</li>"))) + shift-talks)) + (mapcar + ;; talks + (lambda (talk) + (cons (plist-get talk :start-time) + (emacsconf-pad-talk-hyperlist + (append prefixed talk)))) + shift-talks)) + (lambda (a b) (time-less-p (car a) (car b)))) + "\n") + "</ul>" + "Teardown +<ul> +<li>[ ] ${coord}: stop the restream-${track-id}-youtube screen on live0</li> +<li>[ ] ${coord}: stop the restream-${track-id}-toobnix screen on live0</li> +<li>[ ] ${coord}: update the status page on live.emacsconf.org</li> +</ul>")) + ))) (defun emacsconf-pad-prepopulate-hyperlists () (interactive) diff --git a/emacsconf-publish.el b/emacsconf-publish.el index 2d5964a..a998779 100644 --- a/emacsconf-publish.el +++ b/emacsconf-publish.el @@ -862,7 +862,8 @@ Entries are sorted chronologically, with different tracks interleaved." :title (plist-get o :title) :url (concat "/" (plist-get o :url)) :speakers (plist-get o :speakers) - :q-and-a (plist-get o :q-and-a)) + :q-and-a (plist-get o :q-and-a) + :pad (plist-get o :pad-url)) (unless (eq emacsconf-publishing-phase 'program) (list :track (plist-get o :track) @@ -1611,11 +1612,13 @@ Entries are sorted chronologically, with different tracks interleaved." :end-info(emacsconf-surround " - <span class=\"sched-end\">" (plist-get talk :end) "</span>" "") :track-info (emacsconf-surround (format " <span class=\"sched-track %s\">" (or (plist-get talk :track) "")) (plist-get talk :track) "</span>" "") :q-info (emacsconf-surround " <span class=\"sched-q-and-a\">Q&A: " (plist-get talk :q-and-a) "</span>; " "") + :pad-info (emacsconf-surround " <span class=\"sched-pad\"> <a href=\"" + (plist-get talk :pad-url) "\">Etherpad</a></span>; " "") :slug-info (emacsconf-surround " <span class=\"sched-slug\">id:" (plist-get talk :slug) "</span>" "") :speaker-info (emacsconf-surround " <div class=\"sched-speakers\">" (plist-get talk :speakers-with-pronouns) "</div>" "") :resources-info (emacsconf-surround "<ul class=\"resources\">" (plist-get talk :resources) "</ul>" ""))) "<div data-start=\"${startutc}\" data-end=\"${endutc}\" class=\"sched-entry track-${track}\"> -<div class=\"sched-meta\"><span class=\"sched-time\">${start-info}${end-info}</span>${track-info}${q-info}${slug-info}</div> +<div class=\"sched-meta\"><span class=\"sched-time\">${start-info}${end-info}</span>${track-info}${pad-info}${q-info}${slug-info}</div> <div class=\"sched-title\"><a href=\"${base-url}${url}\">${title}</a></div> ${speaker-info} ${resources-info} @@ -1745,7 +1748,30 @@ ${title-info} <pre>mpv https://live0.emacsconf.org:9001/emacsconf/gen.webm vlc https://live0.emacsconf.org:9001/emacsconf/gen.webm ffplay https://live0.emacsconf.org:9001/emacsconf/gen.webm -</pre>" +</pre> + +<p>If you experience any disruptions, try reloading the page you're using +to watch the video. If that still doesn't work, please check our +status page at <a href=\"https://status.emacsconf.org\">https://status.emacsconf.org</a> for updates on the +status of various parts of our infrastructure, and instructions on how +to get in touch with us about disruptions.</p> + +<p>If you prefer, you can watch the livestream via Toobnix: +<a href=\"https://toobnix.org/w/7t9X8eXuSby8YpyEKTb4aj\">General track</a>, +<a href=\"https://toobnix.org/w/w6K77y3bNMo8xsNuqQeCcD\">Development track</a>. +Pre-recorded videos and replays will also be available on Toobnix in +the <a href=\"https://toobnix.org/c/emacsconf\">EmacsConf channel</a>.</p> + +<p>To participate in the Q&A, please check the talk page for the Q&A +details, including the Etherpad link, IRC channel, and optionally +a BigBlueButton room (BBB) for Q&A. If you plan to participate in +Q&A in the BigBlueButton room, please use headphones or earphones +in order to minimize audio feedback. The link on the talk page +will take you to a waiting room that will automatically refresh +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) diff --git a/emacsconf-schedule.el b/emacsconf-schedule.el index 27070db..cfd20f3 100644 --- a/emacsconf-schedule.el +++ b/emacsconf-schedule.el @@ -347,7 +347,7 @@ Each function should take the info and manipulate it as needed, returning the ne "green"))) (defun emacsconf-schedule-svg (width height &optional info) - (setq info (or info (emacsconf-get-talk-info))) + (setq info (emacsconf-prepare-for-display (or info (emacsconf-get-talk-info)))) (let ((days (seq-group-by (lambda (o) (format-time-string "%Y-%m-%d" (plist-get o :start-time) emacsconf-timezone)) (sort (seq-filter (lambda (o) diff --git a/emacsconf-stream.el b/emacsconf-stream.el index e2b4962..8fdfcbc 100644 --- a/emacsconf-stream.el +++ b/emacsconf-stream.el @@ -463,5 +463,141 @@ This uses the BBB room if available, or the IRC channel if not." ;; :channel "emacsconf-gen" ;; :qa-info "https://emacsconf.org/current/community/room/") ;; ) + +;; Updates live.emacsconf.org +(defvar emacsconf-stream-live-index "/ssh:orga@front0.emacsconf.org:/var/www/live.emacsconf.org/index.html") + +(defun emacsconf-stream-shift-days () + "Return a label for the conference days." + (let ((start + (date-to-time (car (sort (mapcar (lambda (o) (plist-get o :start)) + emacsconf-shifts) + 'string<)))) + (end + (date-to-time (car (last (sort (mapcar (lambda (o) (plist-get o :end)) + emacsconf-shifts) + 'string<)))))) + (if (string= (format-time-string "%Y-%m-%d" start emacsconf-timezone) + (format-time-string "%Y-%m-%d" end emacsconf-timezone)) + (format-time-string "%A, %b %-d, %Y" + start emacsconf-timezone) + (concat + (format-time-string "%b %-d (%a)" + start emacsconf-timezone) + " to " + (format-time-string "%b %-d (%a), %Y" + end emacsconf-timezone))))) + +(defvar emacsconf-status-timezones '("US/Eastern" "UTC" "Europe/Berlin")) +(defun emacsconf-stream-update-status-page () + (interactive) + (with-temp-file emacsconf-stream-live-index + (insert + (emacsconf-replace-plist-in-string + (list :name emacsconf-name + :year emacsconf-year + :base-url emacsconf-base-url + :days (emacsconf-stream-shift-days) + :timezone-info + (mapconcat (lambda (zone) (concat "<th>" zone "</th>")) + emacsconf-status-timezones "") + :stream-info + (mapconcat + (lambda (track) + (emacsconf-replace-plist-in-string + (append (list :stream-base emacsconf-stream-base) + track) + "<tr><td>${id}</td><td><a href=\"${stream-base}${id}.webm\">${stream-base}${id}.webm</a></td></tr> +<tr><td>${id}-480p</td><td><a href=\"${stream-base}${id}-480p.webm\">${stream-base}${id}-480p.webm</a></td></tr>")) + emacsconf-tracks "\n") + :watch-info + (mapconcat + (lambda (track) + (let ((start-time (date-to-time (concat emacsconf-date "T" (plist-get track :start) emacsconf-timezone-offset)))) + (emacsconf-replace-plist-in-string + (append + (list + :time-info + (mapconcat + (lambda (zone) + (format-time-string "<td>%l:%M %p %Z</td>" start-time zone)) + emacsconf-status-timezones + "")) + track) + "<tr> + <td><a href=\"${watch}\"><strong>${name}</strong></a></td><td class=\"status-${status}\">${status}</td>${time-info} +</tr>"))) + emacsconf-tracks "\n") + ) + "<!doctype html> +<html lang=\"en\"> + <head> + <meta charset=\"utf-8\"> + <meta name=viewport content=\"width=device-width, initial-scale=1\"> + <meta name=\"description\" content=\"${name} Livestreams\"/> + <title>${name} ${year} ~ Live</title> + <link rel=\"stylesheet\" href=\"/style.css\" /> + </head> + <body> + <header> + <h1><a href=\"${base-url}${year}/\">${name} ${year}</a> Livestreams</h1> + <h3>December 3 (Saturday) and 4 (Sunday), 2022</h3> + </header> + <main> + <table> + <thead> + <tr> + <th>track</th> + <th>status</th> +${timezone-info} + </tr> + </thead> + <tbody> +${watch-info} + </tbody> + </table> + <p> + Click on the track names above to watch the stream in your browser. + </p> + <h4>Watching the streams directly</h4> + <p> + You can also watch the streams in any media player that supports streaming. + </p> + <table> + <thead> + <tr> + <th>track</th> + <th>stream address</th> + </tr> + </thead> + <tbody> +${stream-info} + </tbody> + </table> + <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. + </p> + <p> + Examples: + </p> +<pre> +mpv URL +vlc URL +ffplay URL +</pre> + </main> + <footer> + <p> + If you experience any disruptions, please check our status page at + <a href=\"//status.emacsconf.org\">status.emacsconf.org</a> for updates + on the status of various parts of our infrastructure, and instructions + on how to get in touch with us about disruptions. + </p> + </footer> + </body> +</html> +")))) (provide 'emacsconf-stream) ;;; emacsconf-stream.el ends here diff --git a/emacsconf.el b/emacsconf.el index a67abc6..873a9ea 100644 --- a/emacsconf.el +++ b/emacsconf.el @@ -969,11 +969,17 @@ (defvar emacsconf-tracks '( (:name "General" :color "peachpuff" :id "gen" :channel "emacsconf-gen" - :tramp "/ssh:emacsconf-gen@res.emacsconf.org#46668:") + :watch "https://live.emacsconf.org/2022/watch/gen/" + :tramp "/ssh:emacsconf-gen@res.emacsconf.org#46668:" + :start "09:00" :end "17:00" + :status "offline") (:name "Development" :color "skyblue" :id "dev" :channel "emacsconf-dev" - :tramp "/ssh:emacsconf-dev@res.emacsconf.org#46668:"))) + :watch "https://live.emacsconf.org/2022/watch/dev/" + :tramp "/ssh:emacsconf-dev@res.emacsconf.org#46668:" + :start "09:00" :end "17:00" + :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") (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") (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") (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") (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") (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") (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") (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")) +(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.") (defun emacsconf-get-track (name) @@ -1155,6 +1161,11 @@ Filter by TRACK if given. Use INFO as the list of talks." (re-search-forward (concat "\\<" (regexp-quote input)) nil t) (goto-char (match-beginning 0)))) (insert "\n") + (when (< (- (line-end-position) (point)) fill-column) + (save-excursion + (goto-char (line-end-position)) + (insert " ") + (delete-char 1))) (setq last-input input) (recenter) (undo-boundary))))) |