From 6e6411e7dc1ec2d5179418c1663dfdaae204fb24 Mon Sep 17 00:00:00 2001 From: Sacha Chua Date: Sat, 2 Nov 2024 11:31:38 -0400 Subject: Include description in Org schedule files --- emacsconf-publish.el | 251 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 154 insertions(+), 97 deletions(-) diff --git a/emacsconf-publish.el b/emacsconf-publish.el index 084ca86..b29266c 100644 --- a/emacsconf-publish.el +++ b/emacsconf-publish.el @@ -46,7 +46,9 @@ (interactive (list (emacsconf-complete-talk-info))) (let ((info (emacsconf-get-talk-info))) (emacsconf-publish-before-page talk info) - (emacsconf-publish-after-page talk info))) + (emacsconf-publish-after-page talk info) + (unless (emacsconf-publish-talk-p talk) + (emacsconf-publish-cancelled-nav-page talk)))) (defun emacsconf-publish-update-talk (talk) "Publish the schedule page and the page for this talk." @@ -65,6 +67,7 @@ (interactive) (emacsconf-publish-talk-page (emacsconf-get-talk-info-for-subtree)) (emacsconf-publish-info-pages) + (emacsconf-publish-schedule) (magit-status-setup-buffer emacsconf-directory)) (defun emacsconf-publish-update-conf-html () @@ -163,7 +166,8 @@ ;; (emacsconf-publish-format-track-as-org (car emacsconf-tracks) "US/Eastern") ;; (emacsconf-get-talk-info) (defun emacsconf-publish-format-track-as-org (track tz &optional info) - (setq info (or info (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))) + (let ((emacsconf-talk-info-functions (append emacsconf-talk-info-functions (list 'emacsconf-get-abstract-from-wiki)))) + (setq info (or info (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))) (concat "** " (plist-get track :name) " :" (plist-get track :id) ":\n:PROPERTIES:\n:CATEGORY: " (plist-get track :id) "\n:END:\n" (mapconcat @@ -208,7 +212,13 @@ (plist-get talk :qa-info)) (plist-get talk :qa-info)) "\n" "") - (emacsconf-surround "\n" (plist-get talk :intro-note) "\n" ""))) + (emacsconf-surround "\n" (plist-get talk :intro-note) "\n" "") + (emacsconf-surround "\nDescription:\n\n" + (when (plist-get talk :org-description) + (with-temp-buffer + (org-paste-subtree 3 (plist-get talk :org-description)) + (buffer-string))) + "\n" ""))) (emacsconf-filter-talks-by-track track info) "\n"))) @@ -237,7 +247,8 @@ (defun emacsconf-publish-schedule-org-files (&optional info) (interactive) - (setq info (or info (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info)))) + (let ((emacsconf-talk-info-functions (append emacsconf-talk-info-functions (list 'emacsconf-get-abstract-from-wiki)))) + (setq info (or info (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))) (mapc (lambda (tz) (emacsconf-publish-schedule-org-for-timezone tz info)) (append emacsconf-timezones @@ -506,7 +517,7 @@ Talks that are pending review will not be published yet." ('nil nil) ("TODO" nil) ("TO_REVIEW" nil) - ("TO_ACCEPT" nil) + ;; ("TO_ACCEPT" nil) ("CANCELLED" nil) (_ t))) @@ -564,24 +575,28 @@ resources." (defun emacsconf-publish-format-talk-schedule-info (o) "Format schedule information for O." (let ((friendly (concat "/" emacsconf-year "/talks/" (plist-get o :slug) )) - (timestamp (org-timestamp-from-string (plist-get o :scheduled)))) + (timestamp (org-timestamp-from-string (plist-get o :scheduled))) + (talk-p (emacsconf-publish-talk-p o))) (emacsconf-replace-plist-in-string (append o (list :format - (concat (or (plist-get o :video-time) - (plist-get o :time)) - "-min talk; Q&A: " - (pcase (plist-get o :qa-type) - ("none" "ask questions via Etherpad/IRC; we'll e-mail the speaker and post answers on this wiki page after the conference") - ("live" "BigBlueButton conference room") - ("pad" "Etherpad") - ("irc" "IRC") - (_ (plist-get o :qa-type))) - (emacsconf-surround " <" (and (member emacsconf-publishing-phase '(schedule conference)) - (plist-get o :qa-url)) ">" "")) + (if talk-p + (concat (or (plist-get o :video-time) + (plist-get o :time)) + "-min talk; Q&A: " + (pcase (plist-get o :qa-type) + ("none" "ask questions via Etherpad/IRC; we'll e-mail the speaker and post answers on this wiki page after the conference") + ("live" "BigBlueButton conference room") + ("pad" "Etherpad") + ("irc" "IRC") + (_ (plist-get o :qa-type))) + (emacsconf-surround " <" (and (member emacsconf-publishing-phase '(schedule conference)) + (plist-get o :qa-url)) ">" "")) + (concat (or (plist-get o :video-time) + (plist-get o :time)) "-min talk cancelled")) :pad-info - (if (and emacsconf-publish-include-pads (not (and (member emacsconf-publishing-phase '(schedule conference)) + (if (and talk-p emacsconf-publish-include-pads (not (and (member emacsconf-publishing-phase '(schedule conference)) (string= (plist-get o :qa-type) "etherpad")))) (format "Etherpad: \n" emacsconf-year (plist-get o :slug)) "") @@ -659,7 +674,7 @@ ${alternate-apac-info}\n"))) "\nThe following image shows where the talk is in the schedule for " (format-time-string "%a %Y-%m-%d" (plist-get talk :start-time) emacsconf-timezone) ". Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad." (format "
\n" (plist-get talk :slug)) - (let* ((width 800) (height 150) + (let* ((width 700) (height 150) (talk-date (format-time-string "%Y-%m-%d" (plist-get talk :start-time) emacsconf-timezone)) (start (date-to-time (concat talk-date "T" emacsconf-schedule-start-time emacsconf-timezone-offset))) (end (date-to-time (concat talk-date "T" emacsconf-schedule-end-time emacsconf-timezone-offset))) @@ -699,8 +714,9 @@ This includes the intro note, the schedule, and talk resources." (insert (emacsconf-surround "" (plist-get talk :intro-note) "\n\n" "")) (let ((is-live (emacsconf-talk-live-p talk))) (when is-live (emacsconf-publish-captions-in-wiki talk)) - (when (member emacsconf-publishing-phase '(schedule conference)) - (insert (emacsconf-publish-format-talk-schedule-image talk info))) + (when (emacsconf-publish-talk-p talk) + (when (member emacsconf-publishing-phase '(schedule conference)) + (insert (emacsconf-publish-format-talk-schedule-image talk info)))) (insert (emacsconf-publish-format-talk-schedule-info talk) "\n\n") (insert (if (plist-get talk :public) (emacsconf-wiki-talk-resources talk) "") @@ -834,6 +850,12 @@ This includes captions, contact, and an invitation to participate." (plist-get b :start-time)) t) (t nil))) +(defun emacsconf-publish-cancelled-nav-page (talk) + (with-temp-file (expand-file-name (format "%s-nav.md" (plist-get talk :slug)) + (expand-file-name "info" (expand-file-name emacsconf-year emacsconf-directory))) + (insert "\n
+Back to the [[talks]] \n
"))) + (defun emacsconf-publish-nav-pages (&optional talks) "Generate links to the next and previous talks. During the schedule and conference phase, the talks are sorted by time. @@ -898,7 +920,10 @@ Back to the [[talks]] \n" (emacsconf-publish-with-wiki-change (mapc (lambda (o) (emacsconf-publish-before-page o info)) - info))) + info) + (mapc (lambda (o) (emacsconf-publish-before-page o info)) + (seq-filter (lambda (o) (string= (plist-get o :status) "CANCELLED")) + (emacsconf-filter-talks info))))) (defun emacsconf-generate-main-schedule-with-tracks (&optional info) (interactive (list nil)) @@ -1012,8 +1037,12 @@ You can also get this schedule as iCalendar files: ${icals}. Importing that into "Return a list with the schedule for INFO. Entries are sorted chronologically, with different tracks interleaved." (setq info (or info (emacsconf-get-talk-info))) - (let* ((by-day (emacsconf-by-day (emacsconf-publish-prepare-for-display info))) - (cancelled (seq-filter (lambda (o) (string= (plist-get o :status) "CANCELLED")) info)) + (let* ((by-day (emacsconf-by-day (seq-remove (lambda (o) + (or + (not (plist-get o :scheduled)) + (member (plist-get o :status) '("TODO" "TO_REVIEW" "TO_ACCEPT")))) + (emacsconf-publish-prepare-for-display info)))) + (cancelled (seq-filter (lambda (o) (string= (plist-get o :status) "CANCELLED")) (emacsconf-get-talk-info))) (dates (seq-map (lambda (o) (plist-get (cadr o) :start-time)) by-day)) (links (mapcar (lambda (o) (format "%s" @@ -1056,61 +1085,59 @@ Entries are sorted chronologically, with different tracks interleaved." "") ))) -(defun emacsconf-publish-schedule (&optional info) - "Generate the schedule or program." - (interactive) - (emacsconf-publish-schedule-svg-snippets) - (setq info (or info (emacsconf-publish-prepare-for-display info))) - (with-temp-file (expand-file-name "schedule-details.md" - (expand-file-name emacsconf-year emacsconf-directory)) - (when (member emacsconf-publishing-phase '(schedule conference)) - (insert - (emacsconf-replace-plist-in-string - (list - :timezone emacsconf-timezone - :gmt-offset emacsconf-timezone-offset - :alternative-timezones - (string-join (emacsconf-timezone-strings - (format "<%s %s-%s>" - emacsconf-date - (plist-get (car emacsconf-tracks) :start) - (plist-get (car emacsconf-tracks) :end)) - nil "~%-l:%M %p") - " / ") - :icals - (concat - (format "%s.ics - " - emacsconf-media-base-url - emacsconf-year - emacsconf-id - emacsconf-id) - (mapconcat (lambda (track) - (format "%s-%s.ics" - emacsconf-media-base-url - emacsconf-year - emacsconf-id - (plist-get track :id) - emacsconf-id - (plist-get track :id))) - emacsconf-tracks " - ")) - :schedule-directory - (concat emacsconf-media-base-url emacsconf-year "/schedules/")) - "The conference is from ${alternative-timezones}. - -Times below are in ${timezone} (GMT${gmt-offset}). If you have Javascript enabled, clicking on talk pages should include times in your computer's local time setting. +(defun emacsconf-publish-schedule-with-times (&optional info) + (insert + (emacsconf-replace-plist-in-string + (list + :timezone emacsconf-timezone + :year emacsconf-year + :gmt-offset emacsconf-timezone-offset + :alternative-timezones + (string-join (emacsconf-timezone-strings + (format "<%s %s-%s>" + emacsconf-date + (plist-get (car emacsconf-tracks) :start) + (plist-get (car emacsconf-tracks) :end)) + nil "~%-l:%M %p") + " / ") + :icals + (concat + (format "%s.ics - " + emacsconf-media-base-url + emacsconf-year + emacsconf-id + emacsconf-id) + (mapconcat (lambda (track) + (format "%s-%s.ics" + emacsconf-media-base-url + emacsconf-year + emacsconf-id + (plist-get track :id) + emacsconf-id + (plist-get track :id))) + emacsconf-tracks " - ")) + :schedule-directory + (concat emacsconf-media-base-url emacsconf-year "/schedules/")) + "Times below are in ${timezone} (GMT${gmt-offset}). If you have Javascript enabled, clicking on talk pages should include times in your computer's local time setting. + +[[!inline pages=\"internal(${year}/schedule-image)\" raw=\"yes\"]] + +The conference is from ${alternative-timezones}. You can also get this schedule as iCalendar files: ${icals}. Importing that into your calendar should translate things into your local time zone. Alternatively, you can use these time-zone-translated Org files: <${schedule-directory}> -"))) - (insert - (if (member emacsconf-publishing-phase '(cfp program)) - (let ((sorted (emacsconf-publish-prepare-for-display (or info (emacsconf-get-talk-info))))) - (mapconcat - (lambda (track) - (concat - "Jump to: " - ;; links to other tracks - (string-join (seq-keep (lambda (track-link) +") + (emacsconf-publish-format-interleaved-schedule info))) + +(defun emacsconf-publish-program-without-times (&optional info) + (insert + (let ((sorted (emacsconf-publish-prepare-for-display (or info (emacsconf-get-talk-info))))) + (mapconcat + (lambda (track) + (concat + "Jump to: " + ;; links to other tracks + (string-join (seq-keep (lambda (track-link) (unless (string= (plist-get track-link :id) (plist-get track :id)) (format "%s" @@ -1118,28 +1145,42 @@ You can also get this schedule as iCalendar files: ${icals}. Importing that into (plist-get track-link :name)))) emacsconf-tracks) " | ") - "\n\n" - (let ((track-talks (seq-filter (lambda (o) (string= (plist-get o :track) + "\n\n" + (let ((track-talks (seq-filter (lambda (o) (string= (plist-get o :track) (plist-get track :name))) - sorted))) - (format - "

%s (%d talks)

\n%s" - (plist-get track :id) - (plist-get track :name) - (plist-get track :name) - (length track-talks) - (emacsconf-publish-format-main-schedule track-talks))))) - emacsconf-tracks "\n\n")) - (emacsconf-publish-format-interleaved-schedule info)))) - (when (member emacsconf-publishing-phase '(cfp program)) - (with-temp-file (expand-file-name + sorted))) + (format + "

%s (%d talk%s)

\n%s" + (plist-get track :id) + (plist-get track :name) + (plist-get track :name) + (length track-talks) + (if (= (length track-talks) 1) "" "s") + (emacsconf-publish-format-main-schedule track-talks))))) + emacsconf-tracks "\n\n")))) + +(defun emacsconf-publish-schedule (&optional info) + "Generate the schedule or program." + (interactive) + (unless (eq emacsconf-publishing-phase 'cfp) (emacsconf-publish-schedule-svg-snippets)) + (setq info (or info (emacsconf-publish-prepare-for-display info))) + (pcase emacsconf-publishing-phase + ((or 'schedule 'conference) + (with-temp-file (expand-file-name "schedule-details.md" + (expand-file-name emacsconf-year emacsconf-directory)) + (emacsconf-publish-schedule-with-times info))) + ((or 'cfp 'program) + (with-temp-file (expand-file-name "schedule-details.md" + (expand-file-name emacsconf-year emacsconf-directory)) + (emacsconf-publish-program-without-times info)) + (with-temp-file (expand-file-name "draft-schedule.md" (expand-file-name emacsconf-year emacsconf-directory)) (insert "[[!sidebar content=\"\"]]\n\n" "This is a *DRAFT* schedule.\n" (let ((emacsconf-publishing-phase 'schedule)) - (emacsconf-publish-format-interleaved-schedule info)))))) + (emacsconf-publish-format-interleaved-schedule info))))))) (defun emacsconf-format-talk-link (talk) (and talk (if (plist-get talk :slug) @@ -1174,7 +1215,8 @@ You can also get this schedule as iCalendar files: ${icals}. Importing that into (pcase emacsconf-publishing-phase ('program (list - :time (plist-get o :time))) + :time (plist-get o :time) + :note (plist-get o :sched-note))) ((or 'schedule 'conference) (list :status (pcase (plist-get o :status) @@ -1283,7 +1325,7 @@ Use FILES as the file list, or look in the cache directory." (assoc-default "TO_ASSIGN" by-status) files "to be captioned, waiting for volunteers" - "

You can e-mail sacha@sachachua.com to call dibs on editing the captions for one of these talks. We use OpenAI Whisper to provide auto-generated VTT that you can use as a starting point, but you can also write the captions from scratch if you like. The starting point for the main video ends in --main.vtt. If you're writing the captions from scratch, you can choose to include timing information, or we can probably figure them out afterwards with a forced alignment tool. More info: captioning tips

" + "

You can e-mail sacha@sachachua.com to call dibs on editing the captions for one of these talks. We use OpenAI Whisper to provide auto-generated VTT that you can use as a starting point, but you can also write the captions from scratch if you like. The VTT file has timing information and the TXT file has the plain text; you can work with either. If you're writing the captions from scratch, you can choose to include timing information, or we can figure them out afterwards with a forced alignment tool. More info: captioning tips

" (lambda (f) (append f @@ -1380,7 +1422,7 @@ If MODIFY-FUNC is specified, use it to modify the talk." (lambda (status) (format "
  • %s - %d talk(s), %d minutes: %s
  • " (if (string= status "TO_ASSIGN") - "TO_ASSIGN (waiting for captioning volunteers)" + "TO_ASSIGN (waiting for captioning volunteers)" status) (length (assoc-default status by-status)) (emacsconf-sum '(:video-time :time) (assoc-default status by-status)) @@ -1392,7 +1434,7 @@ If MODIFY-FUNC is specified, use it to modify the talk." ", "))) (pcase emacsconf-publishing-phase ((or 'program 'schedule 'conference) - '("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")) ((or 'harvest 'resources) '("TO_ARCHIVE" "TO_REVIEW_QA" "TO_INDEX_QA" "TO_CAPTION_QA" "DONE"))) "") @@ -1407,7 +1449,7 @@ If MODIFY-FUNC is specified, use it to modify the talk." ", ") "
    " (pcase emacsconf-publishing-phase - ((or 'program 'schedule 'conference) + ((or 'program 'schedule 'conference 'cfp) (concat (emacsconf-publish-backstage-list (append @@ -1428,7 +1470,11 @@ If MODIFY-FUNC is specified, use it to modify the talk." files "ready to be streamed") (emacsconf-publish-backstage-list - (assoc-default "WAITING_FOR_PREREC" by-status) files + (seq-sort + #'emacsconf-sort-by-scheduled + (append (assoc-default "WAITING_FOR_PREREC" by-status) + (assoc-default "TO_CONFIRM" by-status))) + files "we're waiting for" "Speakers might submit these, do them live, or cancel the talks."))) ((or 'harvest 'resources) @@ -2891,5 +2937,16 @@ Tends to be quota-limited, though." emacsconf-backstage-dir) t) (emacsconf-publish-update-talk slug))) + +(defun emacsconf-publish-intros-to-backstage () + (interactive) + (dolist (talk (emacsconf-get-talk-info)) + (when (file-exists-p (expand-file-name (concat (plist-get talk :slug) ".webm") + (expand-file-name "intros" emacsconf-stream-asset-dir))) + (copy-file (expand-file-name (concat (plist-get talk :slug) ".webm") + (expand-file-name "intros" emacsconf-stream-asset-dir)) + (expand-file-name (concat (plist-get talk :file-prefix) "--intro.webm") + emacsconf-backstage-dir) + t)))) ;; (provide 'emacsconf-publish) -- cgit v1.2.3