summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmacsConf <emacsconf-org@gnu.org>2025-12-07 12:50:07 -0500
committerEmacsConf <emacsconf-org@gnu.org>2025-12-07 12:50:07 -0500
commita1825000a2468ceb54dc3bb1083d4c7112ec49ee (patch)
treebb231e0e61dc8b220cccb74fd8e05e6229715183
parentbd0a698983bdd12fa96db5da7d3c794338f52317 (diff)
parent8fcb36f42440939835fd18809edd449f1191d42e (diff)
downloademacsconf-el-a1825000a2468ceb54dc3bb1083d4c7112ec49ee.tar.xz
emacsconf-el-a1825000a2468ceb54dc3bb1083d4c7112ec49ee.zip
Merge branch 'main' of git.emacsconf.org:pub/emacsconf-el
Diffstat (limited to '')
-rw-r--r--emacsconf-hyperlist.el4
-rw-r--r--emacsconf-pad.el70
-rw-r--r--emacsconf-publish.el93
-rw-r--r--emacsconf.el28
4 files changed, 105 insertions, 90 deletions
diff --git a/emacsconf-hyperlist.el b/emacsconf-hyperlist.el
index df1ed02..bbc3f41 100644
--- a/emacsconf-hyperlist.el
+++ b/emacsconf-hyperlist.el
@@ -138,7 +138,7 @@
(defun emacsconf-hyperlist-day-events (day &optional track info)
(let* ((talks
- (emacsconf-prepare-for-display
+ (emacsconf-publish-prepare-for-display
(emacsconf-filter-talks-by-time
(concat day "T00:00:00" emacsconf-timezone-offset)
(concat day "T23:59:59" emacsconf-timezone-offset)
@@ -163,7 +163,7 @@
(time-less-p (car a) (car b))))))
(defun emacsconf-hyperlist-format-streamer-day (day &optional track info)
- (setq info (emacsconf-prepare-for-display
+ (setq info (emacsconf-publish-prepare-for-display
(if info (mapcar #'emacsconf-resolve-talk info)
(emacsconf-get-talk-info))))
(when track (setq info (emacsconf-filter-talks-by-track track info)))
diff --git a/emacsconf-pad.el b/emacsconf-pad.el
index 3078167..fe52fd1 100644
--- a/emacsconf-pad.el
+++ b/emacsconf-pad.el
@@ -369,7 +369,7 @@ ${next-talk-list}
(replace-regexp-in-string
"https://studio\\.youtube\\.com/video/\\([^/]+\\)/livestreaming" "https://youtube.com/live/\\1"
(assoc-default "YouTube URL" shift-rtmp 'string=))
- :checkin-pad (concat emacsconf-pad-base "private-" emacsconf-private-pad-prefix "-checkin-" (downcase (format-time-string "%a" (date-to-time (plist-get shift :start)))))))
+ :checkin-pad (concat emacsconf-pad-base "private-" emacsconf-private-pad-prefix "-" emacsconf-year "-checkin-" (downcase (format-time-string "%a" (date-to-time (plist-get shift :start)))))))
(shift-talks
(mapcar (lambda (o) (append prefixed o))
(seq-filter
@@ -489,7 +489,7 @@ ${next-talk-list}
(plist-get talk :timezone)
"%-l:%M %p"))
"<ul>
-<li>Message for the speaker: Thanks for checking in! Your BigBlueButton web conference room is at ${backstage-url}. If you don't have the backstage username and password saved, let me know and I can send you a direct message with the info. Please join me there so that I can set you as a moderator and go through the preflight checklist with you.
+<li>Message for the speaker: Thanks for checking in! Your BigBlueButton web conference room is at ${backstage-url}. If you don't have the backstage username and password saved, let me know and I can send you a direct message with the info. Please join me there so that I can set you as a moderator and go through the preflight checklist with you.</li>
<li>Direct message for the speaker if needed: Your BigBlueButton web conference room is at ${backstage-url-with-password}, or username \"${backstage-user}\" and password \"${backstage-password}\".</li>
<li>Pronunciation: ${pronunciation}</li>
<li>Checklist<ul>
@@ -498,9 +498,9 @@ ${next-talk-list}
<li>[ ] Speaker can hear others</li>
<li>[ ] No audio feedback issues (may need headphones or earphones)</li>
<li>[ ] Screen sharing: (optional)
-<ul><li>[ ] Window or screen can be shared
-<li>[ ] Text is readable</li></ul>
-<li>[ ] Webcam sharing (optional)</li></ul></li>
+<ul><li>[ ] Window or screen can be shared</li>
+<li>[ ] Text is readable</li></ul></li>
+<li>[ ] Webcam sharing (optional)</li>
<li>[ ] What kind of facilitation would the speaker like? (Host reads questions, chats a lot, etc.)</li></ul></li>
<li>OK to do other things until going live at <strong>${live}</strong></li>
<li>People will add questions to the pad or IRC channel; host can read them to you, or you can read them</li>
@@ -528,7 +528,8 @@ ${bbb-checklist}</li>")
(emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))))
(mapc
(lambda (day)
- (let ((pad-id (concat "private-" emacsconf-private-pad-prefix "-checkin-" (downcase (format-time-string "%a" (plist-get (cadr day) :checkin-time))))))
+ (let ((base-pad (concat "private-" emacsconf-private-pad-prefix "-" emacsconf-year))
+ (pad-id (concat "private-" emacsconf-private-pad-prefix "-" emacsconf-year "-checkin-" (downcase (format-time-string "%a" (plist-get (cadr day) :checkin-time))))))
(emacsconf-pad-create-pad pad-id)
(emacsconf-pad-set-html
pad-id
@@ -536,17 +537,20 @@ ${bbb-checklist}</li>")
"<em>${checkin}:</em> " ""
(concat
(car day)
+ "\n"
+ emacsconf-pad-base base-pad "\n"
"<p>If anyone's still missing by the specified time, please let us know in #emacsconf-org so we can call them.</p>"
"<ul>"
- (mapconcat
- (lambda (talk)
- (emacsconf-pad-format-checkin-hyperlist talk))
- (seq-sort
- (lambda (a b)
- (time-less-p (plist-get a :checkin-time)
- (plist-get b :checkin-time)))
- (seq-filter (lambda (talk) (plist-get talk :checkin-time)) day))
- "\n")
+ (let ((body (mapconcat
+ (lambda (talk)
+ (emacsconf-pad-format-checkin-hyperlist talk))
+ (seq-sort
+ (lambda (a b)
+ (time-less-p (plist-get a :checkin-time)
+ (plist-get b :checkin-time)))
+ (seq-filter (lambda (talk) (plist-get talk :checkin-time)) day))
+ "\n")))
+ body)
"</ul>")))))
(seq-group-by (lambda (talk)
(format-time-string "%A, %b %-e, %Y" (plist-get talk :checkin-time)))
@@ -691,6 +695,7 @@ ${bbb-checklist}</li>")
(format-time-string "%-l:%M %p" (plist-get talk :start-time) emacsconf-timezone))
(plist-get talk :hyperlist-note) "</li>" "")
:next-talk-in-5 (if next-talk (format-time-string "%-l:%M %p" (time-subtract (plist-get next-talk :start-time) (seconds-to-time 300)) emacsconf-timezone) "")
+ :next-talk-in-2 (if next-talk (format-time-string "%-l:%M %p" (time-subtract (plist-get next-talk :start-time) (seconds-to-time 120)) emacsconf-timezone) "")
:next-talk-in-1 (if next-talk (format-time-string "%-l:%M %p" (time-subtract (plist-get next-talk :start-time) (seconds-to-time 60)) emacsconf-timezone) ""))
talk)
(concat
@@ -698,7 +703,7 @@ ${bbb-checklist}</li>")
(if (emacsconf-talk-recorded-p talk)
"<li>Backup: ${start-hhmm} ${slug}: it should play a prerecorded intro and talk, but if it doesn't, join ${mumble} in Mumble and introduce talk: ${expanded-intro} (pronunciation: ${pronunciation}); then <em>play ${slug}</em></li>"
;; live talk, join BBB
- "<li><strong>${start-hhmm} ${slug} live talk</strong>: it should play a prerecorded intro, but if it doesn't, join ${bbb-backstage} (mod code <strong>${bbb-mod-code}</strong> ) and introduce talk, then turn it over to speaker for <strong>live talk</strong>: ${expanded-intro} (pronunciation: ${pronunciation})</li>")
+ "<li><strong>${start-hhmm} ${slug} live talk</strong>: it should play a prerecorded intro, but if it doesn't, use mod code <strong>${bbb-mod-code}</strong> to join ${bbb-backstage} and introduce talk, then turn it over to speaker for <strong>live talk</strong>: ${expanded-intro} (pronunciation: ${pronunciation})</li>")
;; Q&A
(if (and (not (emacsconf-talk-recorded-p talk))
(not (string= (or (plist-get talk :qa-type) "none") "none")))
@@ -716,7 +721,7 @@ ${bbb-checklist}</li>")
"<li>[ ] <strong>${qa-hhmm}</strong> ${slug} Q&A mumble: Join ${mumble} in Mumble. Bring the speaker into the right channel if needed. Invite people to put their questions in the Etherpad and read questions and answers from there. ${pad-url} Paste questions into Mumble chat or read them out loud.</li>")
((rx "live")
(concat
- "<li>[ ] <strong>${qa-hhmm} ${slug} Q&A live</strong> (on stream until ${end-of-qa}): Join ${bbb-backstage} (mod code <strong>${bbb-mod-code}</strong> ). START RECORDING. Invite people to put their questions in the Etherpad, and read questions from there. ${pad-url}</li>
+ "<li>[ ] <strong>${qa-hhmm} ${slug} Q&A live</strong> (on stream until ${end-of-qa}): Use mod code <strong>${bbb-mod-code}</strong> to join ${bbb-backstage} . START RECORDING. Invite people to put their questions in the Etherpad, and read questions from there. ${pad-url}</li>
${open-qa}
"
(if next-talk
@@ -743,7 +748,8 @@ ${bbb-checklist}</li>")
(interactive)
(emacsconf-pad-prepopulate-shift-hyperlists)
(emacsconf-pad-prepopulate-checkins)
- (emacsconf-pad-prepopulate-host-hyperlists))
+ (emacsconf-pad-prepopulate-host-hyperlists)
+ (emacsconf-pad-prepopulate-index))
(defun emacsconf-pad-expand-intro (talk)
"Make an intro for TALK."
@@ -839,18 +845,18 @@ ${bbb-checklist}</li>")
(emacsconf-surround "<li><strong>" (plist-get talk :hyperlist-note) "</strong></li>" "")
"<li>Recorded intro: <a href=\"${media-base}${year}/backstage/${file-prefix}--intro.webm\">${media-base}${year}/backstage/${file-prefix}--intro.webm</a>"
(if (emacsconf-talk-recorded-p talk)
- "<li>[ ] [? stream didn't auto-play] ${stream}: <em>handle-session ${slug}</em>; if that doesn't work, <em>play ${slug}</em>; if that still doesn't work, <em>track-mpv ~/current/cache/${conf-id}-${year}-${slug}*--intro.webm</em> and <em>track-mpv ~/current/cache/${conf-id}-${year}-${slug}*--main.webm</em></li>"
+ "<li>[? stream didn't auto-play] ${stream}: <em>handle-session ${slug}</em></li>"
(concat
"<li>Live talk:<ul>"
- "<li>[ ] [? stream didn't auto-join] ${stream}: <a href=\"${bbb-backstage}\">${bbb-backstage}</a></li>"
- "<li>[ ] ${host}: Join <a href=\"${bbb-backstage}\">${bbb-backstage}</a> and turn over to speaker.</li></ul></li>"))
+ "<li>[? stream didn't auto-join] ${stream}: mod code ${bbb-mod-code} <a href=\"${bbb-backstage}\">${bbb-backstage}</a></li>"
+ "<li>[ ] ${host}: mod code ${bbb-mod-code} , join <a href=\"${bbb-backstage}\">${bbb-backstage}</a> and turn over to speaker.</li></ul></li>"))
(pcase (or (plist-get talk :qa-type) "")
((rx "live")
(concat
"<li>Live Q&A start ${qa-start}, on stream until ${qa-end}<ul>
<li>[ ] ${host}: Copy the modcode <strong>${bbb-mod-code}</strong> , join the Q&A room at <a href=\"${bbb-backstage}\">${bbb-backstage}</a>, and open the pad at <a href=\"${pad-url}\">${pad-url}</a>; optionally open IRC for ${channel} (<a href=\"${webchat-url}\">${webchat-url}</a>)</li>
-<li>[ ] [? speaker missing?] ${host}: Let #emacsconf-org know so that we can text or call the speaker</li>
-<li>[ ] [? stream didn't auto-join?] ${stream}: <em>bbb ${slug}</em>
+<li> [? speaker missing?] ${host}: Let #emacsconf-org know so that we can text or call the speaker</li>
+<li> [? stream didn't auto-join?] ${stream}: <em>bbb ${slug}</em>
<ul>
<li>Backup URL for BBB: <a href=\"${bbb-backstage}\">${bbb-backstage}</a></li>
<li>Backup URL for pad: <a href=\"${pad-url}\">${pad-url}</a></li>
@@ -858,12 +864,10 @@ ${bbb-checklist}</li>")
</li>
<li>[ ] ${stream}: Give the host the go-ahead via Mumble or #emacsconf-org</li>
<li>[ ] ${host}: Announce that people can join using the URL on the talk page or ask questions on the pad or IRC channel. START RECORDING.</li>
-<li>[ ] ${stream}: Adjust the audio levels as needed: ${ssh-audio}</li>
"
(if emacsconf-qa-start-open
""
- "<li>[ ] ${host}: Decide when to open the Q&A and let ${stream} know</li>
-<li>[ ] ${stream}: Update the task status (no visible changes): ${ssh-openq}</li>")
+ "<li>[ ] ${host}: Decide when to open the Q&A and let ${stream} know</li>")
"
<li>[ ] ${stream}: Confirm BBB redirect at <a href=\"${bbb-redirect}\">${bbb-redirect}</a> goes to BBB room, let host know; backup: <em>ssh orga@media.emacsconf.org \"~/bin/bbb-open ${slug}\"</em></li>
<li>${next-talk-in-5} [? Open Q&A is still going on and it's about five minutes before the next talk]
@@ -878,30 +882,24 @@ ${bbb-checklist}</li>")
</ul></li></ul></li>"))
((rx "irc")
"
-<li>[ ] ${stream}: Update the task status, which should open the pad and IRC; arrange windows: ${ssh-closedq}
-<ul><li>Backup link to pad: <a href=\"${pad-url}\">${pad-url}</a></li>
-<li>Backup link to #${channel}: <a href=\"${webchat-url}\">${webchat-url}</a></li></ul></li>
-<li>[ ] ${stream}: Update the task status (no visible changes): ${ssh-openq}</li>
-<li>[ ] ${host}: Announce that people can ask questions in the ${channel} IRC channel.</li>
+<li>Backup link to pad: <a href=\"${pad-url}\">${pad-url}</a></li>
+<li>Backup link to #${channel}: <a href=\"${webchat-url}\">${webchat-url}</a></li>
")
((rx "Mumble")
"
<li>[ ] ${stream}: Bring the speaker's Mumble login over to the ${channel} channel in Mumble. Confirm that Mumble is audible and adjust audio as needed: ssh emacsconf-${track-id}@res.emacsconf.org -p 46668 \"mum-vol 85%%\" (or mum-louder, mum-quieter)</li>
<li>[ ] ${stream}: Mark the Q&A as closed: ${ssh-closedq} . This should display the QA slide (backup: ${ssh-track} and run <em>firefox ${qa-slide-url} &</em>)</li>
-<li>[ ] ${stream}: Update the task status (no visible changes): ${ssh-openq}</li>
-
<li>[ ] ${host}: Announce that people can ask questions in the pad or on the ${channel} IRC channel.</li>
")
((rx "after")
"
-<li>[ ] ${stream}: Update the task status: ${ssh-closedq} # this should open the pad and IRC; arrange the windows
<ul><li>Backup link to pad: ${pad-url}</li>
<li>Backup link to #${channel}: ${webchat-url}</li></ul></li>
<li>[ ] ${host}: Announce that people can ask questions in the pad or on the ${channel} IRC channel, and that the speaker will follow up later.</li>
-<li>[ ] ${stream}: Update the task status: ${ssh-openq} # this should not make any visible changes, just update the task status</li>"
+"
)
((rx "pad")
- "<li>[ ] [? pad didn't auto-open] ${stream}: ${pad-url}</li>")
+ "<li>[? pad didn't auto-open] ${stream}: ${pad-url}</li>")
(_
"<li>[ ] ${stream}: Open the IRC channel (${channel}) and the pad, and arrange the windows: ${ssh-closedq}</li>
"))))))
diff --git a/emacsconf-publish.el b/emacsconf-publish.el
index dee9e2f..1c651c1 100644
--- a/emacsconf-publish.el
+++ b/emacsconf-publish.el
@@ -159,7 +159,17 @@
:audio-html (or (plist-get video :audio) "")
:chapter-list (or (plist-get video :chapter-list) "")
:resources (or (plist-get video :resources) "")
- :extra (or (plist-get talk :extra) "")
+ :extra
+ (concat
+ (if (plist-get talk :backstage)
+ ;; include schedule
+ (concat
+ "Starts: "
+ (format-time-string "%-I:%M %#p"
+ (plist-get talk :start-time))
+ " - Q&A: " (plist-get talk :q-and-a) "\n")
+ "")
+ (or (plist-get talk :extra) ""))
:speaker-info (or (plist-get talk :speakers-with-pronouns) ""))))
(emacsconf-replace-plist-in-string
talk
@@ -204,6 +214,7 @@
(plist-get track :watch)
"web-based player")
"\n"
+ "- You can also watch it in VLC by choosing menu - Media - Open Network Stream and putting in " (plist-get track :stream) "\n"
(emacsconf-surround "- Q&A: "
(if (plist-get talk :qa-url)
(org-make-link-string
@@ -470,6 +481,10 @@
(and (plist-get talk :backstage)
(plist-get talk :bbb-backstage))
"\">Open backstage BigBlueButton</a></li>" "")
+ (emacsconf-surround "<li>BBB mod code: "
+ (and (plist-get talk :backstage)
+ (plist-get talk :bbb-mod-code))
+ "</li>" "")
(emacsconf-surround "<li><a href=\""
(and (member emacsconf-publishing-phase '(schedule conference))
(plist-get talk :qa-url))
@@ -1536,7 +1551,7 @@ If MODIFY-FUNC is specified, use it to modify the talk."
", ")))
(pcase emacsconf-publishing-phase
((or 'program 'schedule 'conference)
- '("TO_CONFIRM" "WAITING_FOR_PREREC" "PROCESSING" "TO_ASSIGN" "TO_CAPTION" "TO_CHECK" "TO_STREAM"))
+ '("TO_CONFIRM" "WAITING_FOR_PREREC" "PROCESSING" "TO_ASSIGN" "TO_CAPTION" "TO_CHECK" "TO_STREAM" "TO_ARCHIVE" "TO_REVIEW_QA"))
((or 'harvest 'resources)
'("TO_ARCHIVE" "TO_REVIEW_QA" "TO_INDEX_QA" "TO_CAPTION_QA" "DONE")))
"")
@@ -1797,7 +1812,7 @@ ${include}
:links
(unless (eq emacsconf-publishing-phase 'resources)
(emacsconf-surround "<li><a href=\""
- (plist-get o :bbb-rec)
+ (plist-get f :bbb-rec)
"\">Play recording from BigBlueButton</a></li>" ""))
:files
@@ -1891,25 +1906,31 @@ ${include}
""))))
(defun emacsconf-publish-link-file-formats-as-list (talk)
- (seq-map
- (lambda (file)
- (let ((cache-file (expand-file-name (file-name-nondirectory file) emacsconf-cache-dir)))
- (format "<a href=\"%s%s\">Download %s%s</a>%s"
- (or (plist-get talk :base-url) "")
- (file-name-nondirectory file)
- (replace-regexp-in-string (concat "^" (regexp-quote (plist-get talk :file-prefix))) "" (file-name-nondirectory file))
- (if (and (file-exists-p cache-file)
- (> (file-attribute-size (file-attributes cache-file)) 1000000))
- (format " (%sB)" (file-size-human-readable (file-attribute-size (file-attributes cache-file))))
- "")
- (if (and (string-match "--\\(main\\|answers\\)\\.vtt" file)
- (not (emacsconf-captions-edited-p (expand-file-name file emacsconf-cache-dir))))
- " (unedited)"
- ""))))
- (or (plist-get talk :files)
- (if (plist-get talk :backstage)
- (emacsconf-publish-talk-files talk)
- (emacsconf-publish-filter-public-files talk)))))
+ (let ((public-files (emacsconf-publish-filter-public-files talk)))
+ (seq-map
+ (lambda (file)
+ (let ((cache-file (expand-file-name (file-name-nondirectory file) emacsconf-cache-dir)))
+ (format "<a href=\"%s%s\">Download %s%s</a>%s%s"
+ (or (plist-get talk :base-url) "")
+ (file-name-nondirectory file)
+ (replace-regexp-in-string (concat "^" (regexp-quote (plist-get talk :file-prefix))) "" (file-name-nondirectory file))
+ (if (and (file-exists-p cache-file)
+ (> (file-attribute-size (file-attributes cache-file)) 1000000))
+ (format " (%sB)" (file-size-human-readable (file-attribute-size (file-attributes cache-file))))
+ "")
+ (if (and (string-match "--\\(main\\|answers\\)\\.vtt" file)
+ (not (emacsconf-captions-edited-p (expand-file-name file emacsconf-cache-dir))))
+ " (unedited)"
+ "")
+ (if (and (plist-get talk :backstage)
+ (not (member file public-files)))
+ " (backstage)"
+ "")
+ )))
+ (or (plist-get talk :files)
+ (if (plist-get talk :backstage)
+ (emacsconf-publish-talk-files talk)
+ public-files)))))
(defun emacsconf-publish-talks-json ()
"Return JSON format with a subset of talk information."
@@ -2221,11 +2242,11 @@ This video is available under the terms of the Creative Commons Attribution-Shar
(interactive (list (emacsconf-complete-talk-info
(seq-remove
(lambda (talk)
- (or (not (emacsconf-talk-file talk "--main.webm"))
+ (or (not (plist-get talk :video-file))
(plist-get talk :youtube-url)))
(emacsconf-get-talk-info)))))
- (kill-new (emacsconf-talk-file talk "--main.webm"))
- (y-or-n-p (format "Video: %s - create video and upload this filename. Done?" (emacsconf-talk-file talk "--main.webm")))
+ (kill-new (plist-get talk :video-file))
+ (y-or-n-p (format "Video: %s - create video and upload this filename. Done?" (plist-get talk :video-file)))
(kill-new (emacsconf-publish-video-description talk t))
(y-or-n-p "Copied description. Paste into description, move first line to title, add to playlist. Done?")
(when (emacsconf-talk-file talk "--main.vtt")
@@ -2241,26 +2262,26 @@ This video is available under the terms of the Creative Commons Attribution-Shar
(catch 'done
(while t
(let ((talk (seq-find (lambda (o)
- (and (member (plist-get o :status) '("TO_STREAM" "TO_CHECK" "PLAYING"))
+ (and (member (plist-get o :status) '("TO_STREAM" "TO_CHECK" "PLAYING" "TO_ARCHIVE"))
(not (plist-get o :youtube-url))
- (emacsconf-talk-file o "--main.webm")))
+ (plist-get o :video-file)))
(emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))))
(unless talk
(message "All done so far.")
(throw 'done t))
- (emacsconf-youtube-step-through-publishing talk)))))
+ (emacsconf-publish-youtube-step-through-publishing-talk talk)))))
(defun emacsconf-publish-toobnix-step-through-publishing-talk (talk)
(interactive (list (emacsconf-complete-talk-info
(seq-remove
(lambda (talk)
- (or (not (emacsconf-talk-file talk "--main.webm"))
+ (or (not (plist-get talk :video-file))
(plist-get talk :toobnix-url)))
(emacsconf-get-talk-info)))))
- (kill-new (emacsconf-talk-file talk "--main.webm"))
+ (kill-new (plist-get talk :video-file))
(y-or-n-p
(format "Video: %s - create video and upload this filename. Done?"
- (emacsconf-talk-file talk "--main.webm")))
+ (plist-get talk :video-file)))
(kill-new (emacsconf-publish-video-description talk t))
(y-or-n-p "Copied description. Paste into description, move first line to title, add to playlist. Done?")
(when (emacsconf-talk-file talk "--main.vtt")
@@ -2283,7 +2304,7 @@ This video is available under the terms of the Creative Commons Attribution-Shar
(unless talk
(message "All done so far.")
(throw 'done t))
- (emacsconf-toobnix-step-through-publishing-talk talk)))))
+ (emacsconf-publish-toobnix-step-through-publishing-talk talk)))))
;; (emacsconf-publish-video-description (emacsconf-find-talk-info "async") t)
@@ -2305,7 +2326,8 @@ This video is available under the terms of the Creative Commons Attribution-Shar
(emacsconf-with-talk-heading talk
(let* ((video-file-name (emacsconf-get-preferred-video (plist-get talk :file-prefix)))
(video-file (and video-file-name (expand-file-name video-file-name emacsconf-cache-dir)))
- (qa-file (emacsconf-talk-file talk "--answers.webm"))
+ (qa-file (or (emacsconf-talk-file talk "--answers.webm")
+ (emacsconf-get-preferred-video (concat (plist-get talk :file-prefix) "--answers"))))
(intro-file (expand-file-name (concat (plist-get talk :slug) ".webm")
(expand-file-name "intros" emacsconf-stream-asset-dir)))
duration)
@@ -2331,7 +2353,7 @@ This video is available under the terms of the Creative Commons Attribution-Shar
(org-entry-delete (point) "VIDEO_DURATION")
(org-entry-delete (point) "VIDEO_TIME")
(org-entry-delete (point) "CAPTIONS_EDITED"))
- (if qa-file
+ (if (and qa-file (file-exists-p qa-file))
(progn
(org-entry-put (point) "QA_VIDEO_FILE" (file-name-nondirectory qa-file))
(org-entry-put (point) "QA_VIDEO_FILE_SIZE" (file-size-human-readable (file-attribute-size (file-attributes qa-file))))
@@ -2554,6 +2576,7 @@ For better performance, we recommend watching <a href=\"${stream-hires}\">${stre
<li>mpv ${stream-hires}</li>
<li>vlc ${stream-hires}</li>
<li>ffplay ${stream-hires}</li>
+<li>You can also watch it in VLC by choosing menu - Media - Open Network Stream and putting in " (plist-get track :stream) "</li>
</ul>
If you have limited bandwidth, you can watch the low-res stream <a href=\"${480p}\">${480p}</a>.
@@ -2657,6 +2680,8 @@ vlc https://live0.emacsconf.org/gen.webm
ffplay https://live0.emacsconf.org/gen.webm
</pre>
+<p>You can also watch it in VLC by using menu - Media - Open Network Stream and putting in <code>https://live0.emacsconf.org/gen.webm</code></p>.
+
<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
diff --git a/emacsconf.el b/emacsconf.el
index 417f4ae..8f1da84 100644
--- a/emacsconf.el
+++ b/emacsconf.el
@@ -138,7 +138,7 @@
(defvar emacsconf-backstage-dir "/ssh:orga@media.emacsconf.org:/var/www/media.emacsconf.org/2022/backstage")
(defvar emacsconf-upload-dir "/ssh:orga@media.emacsconf.org:/srv/upload")
(defvar emacsconf-res-dir (format "/ssh:orga@res.emacsconf.org:/data/emacsconf/shared/%s" emacsconf-year))
-(defvar emacsconf-media-extensions '("webm" "mkv" "mp4" "webm" "mov" "avi" "mpv" "ts" "ogv" "wav" "ogg" "mp3" ))
+(defvar emacsconf-media-extensions '("webm" "mkv" "mp4" "m4v" "mov" "avi" "mpv" "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.")
@@ -1493,9 +1493,9 @@ If TIMEZONES is a string, split it by commas."
:webchat-url "https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-dev,emacsconf-gen"
:stream ,(concat emacsconf-stream-base "gen.webm")
:480p ,(concat emacsconf-stream-base "gen-480p.webm")
- ;; :youtube-url "https://www.youtube.com/watch?v=UEJ88c7MJq0"
- ;; :youtube-studio-url "https://studio.youtube.com/video/UEJ88c7MJq0/livestreaming"
- ;; :toobnix-url "https://toobnix.org/w/7t9X8eXuSby8YpyEKTb4aj"
+ :youtube-url "https://www.youtube.com/live/FI3eGeGCyQM"
+ :youtube-studio-url "https://studio.youtube.com/video/FI3eGeGCyQM/livestreaming"
+ :toobnix-url "https://toobnix.org/w/oLwaPU7MgMFDAWPhaFdW1t"
:start "09:00" :end "17:00"
:uid 2002
:vnc-display ":5"
@@ -1504,11 +1504,11 @@ If TIMEZONES is a string, split it by commas."
:status "online")
(:name "Development" :color "skyblue" :id "dev" :channel "emacsconf-dev"
:watch ,(format "https://live.emacsconf.org/%s/watch/dev/" emacsconf-year)
- :webchat-url "https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-dev"
+ :webchat-url "https://chat.emacsconf.org/?join=emacsconf,emacsconf-org,emacsconf-accessible,emacsconf-gen,emacsconf-de"
:tramp "/ssh:emacsconf-dev@res.emacsconf.org#46668:"
- ;; :toobnix-url "https://toobnix.org/w/w6K77y3bNMo8xsNuqQeCcD"
- ;; :youtube-url "https://www.youtube.com/watch?v=PMaoF-xa1b4"
- ;; :youtube-studio-url "https://studio.youtube.com/video/PMaoF-xa1b4/livestreaming"
+ :toobnix-url "https://toobnix.org/w/uXGmcRigZD82UWr5nehKeL"
+ :youtube-url "https://youtube.com/live/KCZthyBhHtg"
+ :youtube-studio-url "https://studio.youtube.com/video/KCZthyBhHtg/livestreaming"
:stream ,(concat emacsconf-stream-base "dev.webm")
:480p ,(concat emacsconf-stream-base "dev-480p.webm")
:uid 2003
@@ -1773,16 +1773,8 @@ Room.all.each { |x| puts x.friendly_id + " " + x.name }; nil
(defun emacsconf-volunteer-insert-email (&optional info)
(interactive)
- (insert (completing-read
- (mapcar
- (lambda (o)
- (emacsconf-surround
- (if (assoc-default "ITEM" o)
- (concat (assoc-default "ITEM" o) " <")
- "<")
- (assoc-default "EMAIL" o)
- ">" ""))
- (or info (emacsconf-get-volunteer-info))))))
+ (insert (assoc-default "EMAIL" (emacsconf-complete-volunteer info) #'string=)))
+
(defun emacsconf-complete-volunteer (&optional info)
(setq info (or info (emacsconf-get-volunteer-info)))
(let* ((choices