summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2022-11-22 08:34:20 -0500
committerSacha Chua <sacha@sachachua.com>2022-11-22 08:34:20 -0500
commit59333798b0cd7fd285f5e0b3550bb926eab3c38c (patch)
tree1e0a86f15e17ef38afd33bae15257a036b9b5796
parent911ca4f70fbd06602c6e8d427638e1c9ee85716a (diff)
downloademacsconf-el-59333798b0cd7fd285f5e0b3550bb926eab3c38c.tar.xz
emacsconf-el-59333798b0cd7fd285f5e0b3550bb926eab3c38c.zip
generate status page for live.emacsconf.org
-rw-r--r--emacsconf-pad.el84
-rw-r--r--emacsconf-publish.el32
-rw-r--r--emacsconf-schedule.el2
-rw-r--r--emacsconf-stream.el136
-rw-r--r--emacsconf.el17
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&amp;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)))))