summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--emacsconf-publish.el157
1 files changed, 144 insertions, 13 deletions
diff --git a/emacsconf-publish.el b/emacsconf-publish.el
index 24c364f..3204da9 100644
--- a/emacsconf-publish.el
+++ b/emacsconf-publish.el
@@ -475,9 +475,15 @@
(let ((extra-info (mapconcat #'identity
(delq nil (list
(unless (string= (plist-get o :pronunciation) "nil")
- (emacsconf-surround "Pronunciation: " (plist-get o :pronunciation) ""))
+ (emacsconf-surround "Pronunciation: "
+ (if (string-match "\\[" (or (plist-get o :pronunciation) ""))
+ (org-export-string-as (plist-get o :pronunciation) 'md t)
+ (plist-get o :pronunciation))
+ ""))
(when (plist-get o :irc) (format "IRC: %s" (plist-get o :irc)))
- (plist-get o :public-contact)
+ (if (string-match "\\[" (or (plist-get o :public-contact) ""))
+ (org-export-string-as (plist-get o :public-contact) 'md t)
+ (plist-get o :public-contact))
(when (plist-get o :public-email) (format "<mailto:%s>" (plist-get o :public-email)))))
", ")))
(concat (plist-get o :speakers-with-pronouns)
@@ -613,7 +619,10 @@ ${categories}
(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"))
+ (plist-get o :time))
+ (if (string= (plist-get o :status) "CANCELLED")
+ "-min talk cancelled"
+ "-min talk")))
:pad-info
(if (and talk-p emacsconf-publish-include-pads (not (and (member emacsconf-publishing-phase '(schedule conference))
(string= (plist-get o :qa-type) "etherpad"))))
@@ -728,7 +737,7 @@ This includes the intro note, the schedule, and talk resources."
(setq info (or info (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))
(with-temp-file (expand-file-name (format "%s-before.md" (plist-get talk :slug))
(expand-file-name "info" (expand-file-name emacsconf-year emacsconf-directory)))
-
+ (hack-dir-local-variables-non-file-buffer)
(insert "<!-- Automatically generated by emacsconf-publish-before-page -->\n")
(insert (emacsconf-surround "" (plist-get talk :intro-note) "\n\n" ""))
(let ((is-live (emacsconf-talk-live-p talk)))
@@ -751,7 +760,7 @@ This includes the intro note, the schedule, and talk resources."
(let ((msecs (elt sub 1)))
(concat
(if (and (elt sub 4) (not (string= (elt sub 4) "")))
- (format "\n[[!template new=\"1\" text=\"\"\"%s\"\"\" start=\"%s\" video=\"%s\" id=\"subtitle\"%s]]\n\n"
+ (format "\n<div class=\"transcript-heading\">[[!template new=\"1\" text=\"\"\"%s\"\"\" start=\"%s\" video=\"%s\" id=\"subtitle\"%s]]</div>"
(string-trim (replace-regexp-in-string "^NOTE[ \n]" "" (elt sub 4)))
(concat (format-seconds "%02h:%02m:%02s" (/ (floor msecs) 1000))
"." (format "%03d" (mod (floor msecs) 1000)))
@@ -836,12 +845,13 @@ This includes captions, contact, and an invitation to participate."
;; Contact information
(with-temp-file (expand-file-name (format "%s-after.md" (plist-get talk :slug))
(expand-file-name "info" (expand-file-name emacsconf-year emacsconf-directory)))
+ (hack-dir-local-variables-non-file-buffer)
(insert
"<!-- Automatically generated by emacsconf-publish-after-page -->\n"
"\n\n"
;; main transcript
(if (plist-get talk :public) (emacsconf-publish-format-captions talk) "")
- (if (emacsconf-talk-file talk "--answers.vtt")
+ (if (and (plist-get talk :qa-public) (emacsconf-talk-file talk "--answers.vtt"))
(emacsconf-publish-format-transcript
(append
(list :chapter-file (emacsconf-talk-file talk "--answers--chapters.vtt")
@@ -1189,7 +1199,7 @@ You can also get this schedule as iCalendar files: ${icals}. Importing that into
(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)
+ ((or 'cfp 'program 'harvest 'resources)
(with-temp-file (expand-file-name "schedule-details.md"
(expand-file-name emacsconf-year emacsconf-directory))
(emacsconf-publish-program-without-times info))
@@ -1287,6 +1297,8 @@ You can also get this schedule as iCalendar files: ${icals}. Importing that into
(or (plist-get o :toobnix-url)
(plist-get o :video-file)))
"video posted")
+ (when (plist-get o :qa-public)
+ "Q&A posted")
(emacsconf-surround "video: " (plist-get o :video-duration) "" nil)
(emacsconf-surround "answers: " (and (plist-get o :qa-public)
(plist-get o :qa-video-duration))
@@ -1583,7 +1595,7 @@ answers without needing to listen to everything again. You can see <a href=\"htt
;; further tests
(pcase f
((rx (seq "--"
- (or "reencoded" "normalized" "final" "old" "bbb" "backstage")))
+ (or "reencoded" "normalized" "final" "old" "bbb" "backstage" "pad" "silences")))
nil)
((rx ".diff") nil)
((rx "--original")
@@ -2662,17 +2674,19 @@ The Q&A room for ${title} has finished. You can find more information about the
There is no live Q&A room for ${title}. You can find more information about the talk at <a href=\"${base-url}${url}\">${base-url}${url}</a>.</body></html>"
)))))))
-(defun emacsconf-publish-media-files-on-change (talk)
+(defun emacsconf-publish-media-files-on-change (talk &optional always-update)
"Publish the files and update the index."
- (interactive (list (emacsconf-complete-talk-info)))
+ (interactive (list (emacsconf-complete-talk-info) current-prefix-arg))
(let ((org-state (if (boundp 'org-state) org-state (plist-get talk :status))))
(if (plist-get talk :public)
;; Copy main files from backstage to public
(let ((public-files (emacsconf-publish-filter-public-files talk)))
(mapc (lambda (file)
- (when (not (file-exists-p (expand-file-name file emacsconf-public-media-directory)))
- (copy-file (expand-file-name file emacsconf-backstage-dir)
- (expand-file-name file emacsconf-public-media-directory) t)))
+ (when (or always-update (not (file-exists-p (expand-file-name file emacsconf-public-media-directory))))
+ (copy-file (if (file-exists-p (expand-file-name file emacsconf-backstage-dir))
+ (expand-file-name file emacsconf-backstage-dir)
+ (expand-file-name file emacsconf-cache-dir))
+ (expand-file-name file emacsconf-public-media-directory) t)))
public-files))
;; Remove files from public
(let ((files (directory-files emacsconf-public-media-directory nil
@@ -2823,6 +2837,9 @@ Tends to be quota-limited, though."
arguments) " "))
(with-current-buffer (get-buffer-create "*YouTube*")
(erase-buffer)
+ (kill-new (concat (car emacsconf-publish-youtube-upload-command)
+ " "
+ (mapconcat #'shell-quote-argument arguments " ")))
(apply #'call-process
(car emacsconf-publish-youtube-upload-command)
nil t t
@@ -3029,5 +3046,119 @@ Tends to be quota-limited, though."
(expand-file-name (concat (plist-get talk :file-prefix) "--intro.webm")
emacsconf-backstage-dir)
t))))
+
+(defun emacsconf-publish-update-transcript ()
+ (interactive)
+ (emacsconf-subed-make-chapter-file-based-on-comments)
+ (let ((talk (emacsconf-resolve-talk (emacsconf-get-slug-from-string (buffer-file-name)))))
+ (emacsconf-publish-media-files-on-change talk)
+ (emacsconf-publish-with-wiki-change
+ (emacsconf-publish-captions-in-wiki talk)
+ (emacsconf-publish-info-pages-for-talk talk))))
+
+;; for emacs.tv
+(defun emacsconf-publish-insert-video-entries (&optional info tags)
+ (interactive)
+ (setq tags (or tags (format ":emacsconf:emacsconf%s:" emacsconf-year)))
+ (dolist (talk (emacsconf-publish-prepare-for-display (or info (emacsconf-get-talk-info))))
+ (when (emacsconf-talk-file talk "--main.webm")
+ (let ((new-entry (emacsconf-replace-plist-in-string
+ (append
+ (list
+ :conf-name emacsconf-name
+ :conf-year emacsconf-year
+ :media-url (format "https://media.emacsconf.org/%s/%s--main.webm"
+ emacsconf-year
+ (plist-get talk :file-prefix))
+ :transcript-url
+ (if (emacsconf-talk-file "--main.vtt"
+ (format "https://media.emacsconf.org/%s/%s--main.vtt"
+ emacsconf-year
+ (plist-get talk :file-prefix)))
+ "")
+ :duration (or (plist-get talk :qa-video-duration)
+ (emacsconf-format-seconds
+ (/ (compile-media-get-file-duration-ms (emacsconf-talk-file talk "--main.webm"))
+ 1000)))
+ :url (concat emacsconf-base-url (plist-get talk :url))
+ :tags (if (plist-get talk :tags) (concat tags (substring (plist-get talk :tags) 1)) tags)
+ :date (format-time-string "%FT%T%z" (plist-get talk :start-time) t))
+ talk
+ (list :youtube-url "" :toobnix-url "" :speakers ""))
+ "* ${title} ${tags}
+:PROPERTIES:
+:DATE: ${date}
+:URL: ${url}
+:DURATION: ${duration}
+:MEDIA_URL: ${media-url}
+:YOUTUBE_URL: ${youtube-url}
+:TOOBNIX_URL: ${toobnix-url}
+:TRANSCRIPT_URL: ${transcript-url}
+:SPEAKERS: ${speakers}
+:SERIES: ${conf-name} ${conf-year}
+:END:
+"
+ )))
+ (with-current-buffer (find-file-noselect emacstv-index-org)
+ (if (and (plist-get talk :youtube-url) (emacstv-find-by-youtube-url (plist-get talk :youtube-url)))
+ (org-entry-put (point) "DATE" (format-time-string "%FT%T%z" (plist-get talk :start-time) t))
+ (goto-char (point-max))
+ (insert new-entry)))))))
+
+(defun emacsconf-publish-insert-video-entries-for-answers (&optional info tags)
+ (interactive)
+ (setq tags (or tags (format ":answers:emacsconf:emacsconf%s:" emacsconf-year)))
+ (dolist (talk (emacsconf-publish-prepare-for-display (or info (emacsconf-get-talk-info))))
+ (when (emacsconf-talk-file talk "--answers.webm")
+ (let ((new-entry (emacsconf-replace-plist-in-string
+ (append
+ (list
+ :conf-name emacsconf-name
+ :conf-year emacsconf-year
+ :youtube-url (plist-get talk :qa-youtube)
+ :toobnix-url (plist-get talk :qa-toobnix)
+ :media-url (format "https://media.emacsconf.org/%s/%s--answers.webm"
+ emacsconf-year
+ (plist-get talk :file-prefix))
+ :transcript-url (if (emacsconf-talk-file talk "--answers.vtt")
+ (format "https://media.emacsconf.org/%s/%s--answers.vtt"
+ emacsconf-year
+ (plist-get talk :file-prefix))
+ "")
+ :url (concat emacsconf-base-url (plist-get talk :url))
+ :duration (or (plist-get talk :qa-video-duration)
+ (emacsconf-format-seconds
+ (/ (compile-media-get-file-duration-ms (emacsconf-talk-file talk "--answers.webm"))
+ 1000)))
+ :tags (if (plist-get talk :tags) (concat tags (substring (plist-get talk :tags) 1)) tags)
+ :date (format-time-string "%FT%T%z" (plist-get talk :start-time) t))
+ talk
+ (list :youtube-url "" :toobnix-url "" :speakers ""))
+ "* Q&A: ${title} ${tags}
+:PROPERTIES:
+:DATE: ${date}
+:URL: ${url}
+:DURATION: ${duration}
+:MEDIA_URL: ${media-url}
+:YOUTUBE_URL: ${youtube-url}
+:TOOBNIX_URL: ${toobnix-url}
+:TRANSCRIPT_URL: ${transcript-url}
+:SPEAKERS: ${speakers}
+:SERIES: ${conf-name} ${conf-year}
+:END:
+"
+ )))
+ (with-current-buffer (find-file-noselect emacstv-index-org)
+ (if (and (plist-get talk :qa-youtube) (emacstv-find-by-youtube-url (plist-get talk :qa-youtube)))
+ (progn
+ (org-entry-put (point) "DATE" (format-time-string "%FT%T%z" (plist-get talk :start-time) t))
+ (org-entry-put (point)
+ "TRANSCRIPT_URL"
+ (if (emacsconf-talk-file talk "--answers.vtt")
+ (format "https://media.emacsconf.org/%s/%s--answers.vtt"
+ emacsconf-year
+ (plist-get talk :file-prefix))
+ "")))
+ (insert new-entry)))))))
;;
(provide 'emacsconf-publish)