diff options
author | Sacha Chua <sacha@sachachua.com> | 2022-09-22 10:01:35 -0400 |
---|---|---|
committer | Sacha Chua <sacha@sachachua.com> | 2022-09-22 10:01:35 -0400 |
commit | a640801ad9c6b57000e4c733b4fe007ab46dffe7 (patch) | |
tree | 18dbbf991ea7da690a0f8fe644e829b87d99b73d /2022 | |
parent | a31c25c4ca16024e32bb16b57d1d93ba9d10e726 (diff) | |
download | emacsconf-wiki-a640801ad9c6b57000e4c733b4fe007ab46dffe7.tar.xz emacsconf-wiki-a640801ad9c6b57000e4c733b4fe007ab46dffe7.zip |
Copy the code for extracting QA recordings
Diffstat (limited to '2022')
-rw-r--r-- | 2022/organizers-notebook.md | 528 | ||||
-rw-r--r-- | 2022/organizers-notebook.org | 188 |
2 files changed, 559 insertions, 157 deletions
diff --git a/2022/organizers-notebook.md b/2022/organizers-notebook.md index 21030e64..e9a5781b 100644 --- a/2022/organizers-notebook.md +++ b/2022/organizers-notebook.md @@ -4,63 +4,65 @@ # Table of Contents - [Current tasks / status](#current) - - [Organizers: Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible early speaker notification, Oct 7 for everything](#orgddc556d) - - [zaeph: Write preparation instructions and decide on deadline for prerecs](#org19cef11):zaeph: - - [zaeph: Write viewing instructions](#org0b02b66) - - [sacha: add more submissions (CFP deadline Sept 30)](#org089c395):sachac: - - [sacha: copy things over from previous notebooks](#org3bad705):sachac: - - [corwin: Double-check sachac’s timezone conversions for availability](#org92f1df1):corwin: - - [corwin: Investigate streaming options, maybe OBS in the cloud](#org1690409):corwin: - - [corwin: document such that someone else could use/fix it](#org0807626):corwin: - - [corwin: recruit at least one more person to help operate the "video bouncer"](#org281354d):corwin: - - [corwn, zaeph: Work on the OBS scenes](#orgbc9df7d):zaeph:corwin: - - [???: Figure out web-based file upload](#org03da255):needsowner: - - [sacha: Prepare to export talk information to wiki](#orgcd47f37):sachac: - - [zaeph: Give access to emacsconf-2022-private to dto](#orgacacb7c):zaeph: - - [dto: create Org heading for scheduling caption team's live IRC duty shifts](#org33496b1):dto: + - [Organizers: Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible early speaker notification, Oct 7 for everything](#org47fdecd) + - [zaeph: Write preparation instructions and decide on deadline for prerecs](#org7302333):zaeph: + - [zaeph: Write viewing instructions](#org090a982) + - [sacha: add more submissions (CFP deadline Sept 30)](#org30e9f02):sachac: + - [sacha: copy things over from previous notebooks](#org4dec4be):sachac: + - [corwin: Double-check sachac’s timezone conversions for availability](#org1c9b7a4):corwin: + - [corwin: Investigate streaming options, maybe OBS in the cloud](#org618806d):corwin: + - [corwin: document such that someone else could use/fix it](#orge1e83c6):corwin: + - [corwin: recruit at least one more person to help operate the "video bouncer"](#org5a1f41a):corwin: + - [corwn, zaeph: Work on the OBS scenes](#org09dc923):zaeph:corwin: + - [???: Figure out web-based file upload](#orgddbb125):needsowner: + - [sacha: Prepare to export talk information to wiki](#org2796c71):sachac: + - [zaeph: Give access to emacsconf-2022-private to dto](#org7c8026b):zaeph: + - [dto: create Org heading for scheduling caption team's live IRC duty shifts](#org18d122a):dto: - [Things to figure out / decisions to make](#decisions) - - [What ideas do we want to borrow from other conferences?](#org3b0d4c2) - - [Do we want to make the ikiwiki web-editable?](#org219b613) - - [How do we want to make better use of Etherpad?](#org70cb665) - - [How many pads do we want?](#orgbc2dfc4) - - [Do we want to host our own?](#org3a5f626) - - [Do we want to embed the pad as an iframe on the watch page? on talk pages?](#org769522d) - - [Shall we put a generic e-mail address for sending feedback, maybe with different mailtos?](#orga961fb2) - - [Can we nudge people to ask IRC questions in a way that will make it easier for us to follow them?](#orgac39d92) - - [How many BBB rooms do we want to set up?](#org23205f6) - - [Do we want to do alt-stream the same way again this year?](#orgc29f6d8) + - [What ideas do we want to borrow from other conferences?](#org26d721d) + - [Do we want to make the ikiwiki web-editable?](#org96cc462) + - [How do we want to make better use of Etherpad?](#org22c73bf) + - [How many pads do we want?](#org7af5634) + - [Do we want to host our own?](#orgfb9b47c) + - [Do we want to embed the pad as an iframe on the watch page? on talk pages?](#org8e82dcd) + - [Shall we put a generic e-mail address for sending feedback, maybe with different mailtos?](#org9fee706) + - [Can we nudge people to ask IRC questions in a way that will make it easier for us to follow them?](#org461396b) + - [How many BBB rooms do we want to set up?](#org0560e60) + - [Do we want to do alt-stream the same way again this year?](#org1a9f230) - [Roles needed](#roles) -- [Other tasks and processes](#org04a1eaa) - - [Sacha: Organize volunteer information](#orgd0980ad):sachac: - - [Once talks are approved](#org28df094) - - [As prerecorded talks come in](#org8df9a92) - - [Compress the video](#orgd5e46a1) - - [When a talk is captioned](#org9f86fce) - - [Other tasks before the conference](#orgf6a1cd1) - - [Test stream setup](#org7c63f42) - - [Set up MPV for captions](#org3e9d2b0) - - [mpv profile](#orgec35b7a) - - [Font: Clear Sans](#orga4624db) +- [Other tasks and processes](#orge3b2d99) + - [Sacha: Organize volunteer information](#orga4ce513):sachac: + - [Once talks are approved](#orgf017723) + - [As prerecorded talks come in](#org2c203bc) + - [Compress the video](#org1ec072d) + - [When a talk is captioned](#org2d4c997) + - [Other tasks before the conference](#orgc0ca1fc) + - [Test stream setup](#org8a16dda) + - [Set up MPV for captions](#orgdbc1f2a) + - [mpv profile](#org1acf8fc) + - [Font: Clear Sans](#org7917c94) - [Download prerecorded videos from ${protected}](#days-before) - - [During the conference](#org7189eb6) + - [During the conference](#orgd0fb988) - [Set up](#setup) - [Arrange screens](#screens) - [Start streaming](#start-streaming):stream: - [Check in a speaker](#check-in) - - [bandali's check-in steps](#orgf89a012) + - [bandali's check-in steps](#org566d71c) - [Present talk](#present) - [Publish information](#publish) - [Handle Q&A](#questions) - [During each talk](#each-talk) - [Break time](#break) - [End of stream](#end) - - [After the conference](#orgadd2650) - - [Send thanks](#orgf0fdcb7) - - [Update the wiki](#org76cb6a5) - - [Update captions](#org8c05b84) - - [Downsize the server](#org961ffb4):bandali: + - [After the conference](#orgbc72f52) + - [Send thanks](#orgde20b80) + - [Extract the opening and closing remarks](#orgb65263f) + - [Extract the Q&A recordings, trimming as needed](#org8058a71) + - [Update the wiki](#orgc66b68f) + - [Update captions](#org594586f) + - [Downsize the server](#org9d5d1be):bandali: - [In case of](#exceptions) - - [Stuck wiki](#orgef5ca4d) + - [Stuck wiki](#orgbbf8bd9) - [Last-minute prerecording submission](#last-minute-prerec) - [Last-minute caption update](#last-minute-captions) - [Speaker has not checked in](#missing) @@ -76,40 +78,40 @@ - [Technical issues during a live presentation](#live-issues) - [Big technical issues with streaming](#stream-issues) - [live0 can't handle the load or is close to network transfer limit](#network) - - [People have a hard time seeing dark-mode presentations (or light-mode)](#org306a5da) -- [Communications](#org494ac39) - - [Ask emacsconf-org-private for feedback on early submissions](#orgfe08ecf) - - [Early speaker notification](#org279d25b) - - [Option A: Early speaker notification(?)](#org16c3ff5) - - [Option B: Just letting them know it's been postponed](#orgc1bf18f) - - [Future](#orgea86cf9) - - [Acceptance](#org876b5b1) - - [Code](#orgf30d2ea) - - [Template](#org99acc50) - - [Acknowledge pre-rec submission](#org3b113c3) - - [Captions for approval](#org894314e) - - [Speakers we haven't confirmed e-mail communications with](#orgcc530c0) - - [Speakers who are missing prerecs](#orgd12f4ad) - - [Template](#orgb93fe71) - - [Check-in instructions](#org469018d) - - [Code](#orgdaae293) - - [E-mail for speakers who are planning to be at the conference](#orge33dd81) - - [E-mail for speakers who are not planning to be around, but who have sent us their prerecs](#org0aa5c87) - - [Last email before the conference](#orga206fb7) - - [Thank you, next steps](#org72a9b8c) - - [Code](#orgd6d3c1c) - - [Text](#org853e5c5) - - [Archive](#org2dedcc1) - - [Second announcement: CFP](#org3c12f6f) - - [First announcement: CFP](#org41bfd48) -- [Supporting code](#orgf50211a) - - [General](#orgc95be02) - - [Publish this page](#org44e8b5a) - - [Export to markdown](#org469bf4c) - - [Tangle and publish on save](#orgc36030d) -- [Lessons learned](#org7ff95be) - - [From previous years](#org88f1e2f) - - [Lessons learned for next year](#org76f3018) + - [People have a hard time seeing dark-mode presentations (or light-mode)](#orge238c57) +- [Communications](#org190e551) + - [Ask emacsconf-org-private for feedback on early submissions](#org3aa9b2b) + - [Early speaker notification](#orgb87b16c) + - [Option A: Early speaker notification(?)](#org5c76f2a) + - [Option B: Just letting them know it's been postponed](#org958aff9) + - [Future](#org84c175e) + - [Acceptance](#orgb16d553) + - [Code](#org3eb0f51) + - [Template](#org7713bb6) + - [Acknowledge pre-rec submission](#org23edffe) + - [Captions for approval](#org7693814) + - [Speakers we haven't confirmed e-mail communications with](#org6791af6) + - [Speakers who are missing prerecs](#org5d3671c) + - [Template](#org6d369e7) + - [Check-in instructions](#org5a9f09f) + - [Code](#org300954e) + - [E-mail for speakers who are planning to be at the conference](#org71df6de) + - [E-mail for speakers who are not planning to be around, but who have sent us their prerecs](#org02f0f6c) + - [Last email before the conference](#orgeae2ff0) + - [Thank you, next steps](#org6978481) + - [Code](#org66f27b8) + - [Text](#orgc7117aa) + - [Archive](#org8f7d8ea) + - [Second announcement: CFP](#org812cef8) + - [First announcement: CFP](#org22c0ca7) +- [Supporting code](#orgdded910) + - [General](#org003c575) + - [Publish this page](#orgd6e57fe) + - [Export to markdown](#org14afaeb) + - [Tangle and publish on save](#org004bb2d) +- [Lessons learned](#org2e5e840) + - [From previous years](#org8fbec7e) + - [Lessons learned for next year](#orgda47cb6) <a id="current"></a> @@ -203,14 +205,14 @@ Planned dates and phases: Current phase: No prerecs to process yet, so it's a good time to focus on infrastructure -<a id="orgddc556d"></a> +<a id="org47fdecd"></a> -## TODO Organizers: Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible [early speaker notification](#org279d25b), Oct 7 for everything +## TODO Organizers: Review the submissions in the pad (see emacsconf-org-private or conf.org for the link) and add any objections or comments by Sept 26 for possible [early speaker notification](#orgb87b16c), Oct 7 for everything - zaeph: will start reviewing on Sep 21 -<a id="org19cef11"></a> +<a id="org7302333"></a> ## TODO zaeph: Write preparation instructions and decide on deadline for prerecs :zaeph: @@ -231,7 +233,7 @@ Extra stuff to consider adding: - “Please don’t squeeze your talk by fast-forwarding your speech. Trimming silences and filler words can help, though. Sometimes it's easier to write, record, and edit your voiceover, and then record the video to go along with it." -<a id="org0b02b66"></a> +<a id="org090a982"></a> ## TODO zaeph: Write viewing instructions @@ -240,24 +242,24 @@ Extra stuff to consider adding: - Suggestions for mpv-filter to invert colourscape. -<a id="org089c395"></a> +<a id="org30e9f02"></a> ## WAITING sacha: add more submissions (CFP deadline Sept 30) :sachac: - Sacha: Add submissions to emacsconf-2022-private, draft 2-day schedule by Oct 10 -<a id="org3bad705"></a> +<a id="org4dec4be"></a> ## DONE sacha: copy things over from previous notebooks :sachac: -<a id="org92f1df1"></a> +<a id="org1c9b7a4"></a> ## TODO corwin: Double-check sachac’s timezone conversions for availability :corwin: -<a id="org1690409"></a> +<a id="org618806d"></a> ## TODO corwin: Investigate streaming options, maybe OBS in the cloud :corwin: @@ -266,24 +268,24 @@ Extra stuff to consider adding: **\*** TODO corwin: plan an approach to use a centralized OBS/nginix "bouncer" :corwin: -<a id="org0807626"></a> +<a id="orge1e83c6"></a> ### TODO corwin: document such that someone else could use/fix it :corwin: -<a id="org281354d"></a> +<a id="org5a1f41a"></a> ### TODO corwin: recruit at least one more person to help operate the "video bouncer" :corwin: -<a id="orgbc9df7d"></a> +<a id="org09dc923"></a> ## TODO corwn, zaeph: Work on the OBS scenes :zaeph:corwin: - [ ] corwin is out from Nov 11-20, and we should start working on them before then. -<a id="org03da255"></a> +<a id="orgddbb125"></a> ## TODO ???: Figure out web-based file upload :needsowner: @@ -291,7 +293,7 @@ Lesson learned from last year: "Since people kept running into ftp problems, we Maybe we could ask some of the volunteers who wanted to help us with the infra? It shouldn’t be complicated to deploy a ready-made solution. -<a id="orgcd47f37"></a> +<a id="org2796c71"></a> ## DONE sacha: Prepare to export talk information to wiki :sachac: @@ -303,12 +305,12 @@ emacsconf-generate-main-schedule emacsconf-generate-talk-pages -<a id="orgacacb7c"></a> +<a id="org7c8026b"></a> ## DONE zaeph: Give access to emacsconf-2022-private to dto :zaeph: -<a id="org33496b1"></a> +<a id="org18d122a"></a> ## TODO dto: create Org heading for scheduling caption team's live IRC duty shifts :dto: @@ -318,7 +320,7 @@ emacsconf-generate-talk-pages # Things to figure out / decisions to make -<a id="org3b0d4c2"></a> +<a id="org26d721d"></a> ## What ideas do we want to borrow from other conferences? @@ -335,7 +337,7 @@ emacsconf-generate-talk-pages - libreadventure, minetest? -<a id="org219b613"></a> +<a id="org96cc462"></a> ## Do we want to make the ikiwiki web-editable? @@ -352,7 +354,7 @@ Options: - Reduces merge conflict potential -<a id="org70cb665"></a> +<a id="org22c73bf"></a> ## How do we want to make better use of Etherpad? @@ -362,7 +364,7 @@ Pain points: - Takes some effort to move questions from IRC to the pad -<a id="orgbc2dfc4"></a> +<a id="org7af5634"></a> ### How many pads do we want? @@ -377,7 +379,7 @@ Pain points: - Can send people directly to the pad -<a id="org3a5f626"></a> +<a id="orgfb9b47c"></a> ### Do we want to host our own? @@ -387,7 +389,7 @@ Pain points: - Might be able to use API to append questions to it, if we want to get super fancy -<a id="org769522d"></a> +<a id="org8e82dcd"></a> ### Do we want to embed the pad as an iframe on the watch page? on talk pages? @@ -403,7 +405,7 @@ Options: - Embed the IRC channel instead -<a id="orga961fb2"></a> +<a id="org9fee706"></a> ## Shall we put a generic e-mail address for sending feedback, maybe with different mailtos? @@ -423,7 +425,7 @@ Options: - Private feedback that can be forwarded to the speaker -<a id="orgac39d92"></a> +<a id="org461396b"></a> ## Can we nudge people to ask IRC questions in a way that will make it easier for us to follow them? @@ -449,7 +451,7 @@ Ideas: - Maybe a volunteer can have an ERC command that copies a question into a buffer, or even into the Etherpad -<a id="org23205f6"></a> +<a id="org0560e60"></a> ## How many BBB rooms do we want to set up? @@ -463,7 +465,7 @@ Ideas: - Worked fine last time -<a id="orgc29f6d8"></a> +<a id="org1a9f230"></a> ## Do we want to do alt-stream the same way again this year? @@ -524,17 +526,17 @@ Each role comprises different responsibilities. A person may have multiple role - Perk: Get access to prerecorded videos -<a id="org04a1eaa"></a> +<a id="orge3b2d99"></a> # Other tasks and processes -<a id="orgd0980ad"></a> +<a id="orga4ce513"></a> ## DONE Sacha: Organize volunteer information :sachac: -<a id="org28df094"></a> +<a id="orgf017723"></a> ## Once talks are approved @@ -544,7 +546,7 @@ Each role comprises different responsibilities. A person may have multiple role - Confirm e-mail communication with all of the speakers -<a id="org8df9a92"></a> +<a id="org2c203bc"></a> ## As prerecorded talks come in @@ -555,7 +557,7 @@ Each role comprises different responsibilities. A person may have multiple role - Make sure all the links/resources mentioned are written down somewhere (web page and enriched captions for pasting into #emacsconf-accessible) -<a id="orgd5e46a1"></a> +<a id="org1ec072d"></a> ### Compress the video @@ -570,31 +572,31 @@ Usage: `compress-video.sh original-file output-file`: We tried using q56 before, but it was a little too aggressive. Q=32 is the default and is probably a reasonable space vs. quality compromise. -<a id="org9f86fce"></a> +<a id="org2d4c997"></a> ## When a talk is captioned -<a id="orgf6a1cd1"></a> +<a id="orgc0ca1fc"></a> ## Other tasks before the conference - Coordinate volunteer schedules so all the roles are covered -<a id="org7c63f42"></a> +<a id="org8a16dda"></a> ### Test stream setup -[Stream](#orgf36de15) +[Stream](#orgd7c3d86) -<a id="org3e9d2b0"></a> +<a id="orgdbc1f2a"></a> ### Set up MPV for captions -<a id="orgec35b7a"></a> +<a id="org1acf8fc"></a> #### mpv profile @@ -629,7 +631,7 @@ Add the following profile to `~/.config/mpv/mpv.conf`: (Thanks, zaeph) -<a id="orga4624db"></a> +<a id="org7917c94"></a> #### Font: Clear Sans @@ -648,7 +650,7 @@ Links: rsync -avzue ssh front:/var/www/media.emacsconf.org/2021/protected/*--main.webm . -<a id="org7189eb6"></a> +<a id="orgd0fb988"></a> ## During the conference @@ -785,7 +787,7 @@ Exception: [CHECK is unavailable](#check-gone) information. -<a id="orgf89a012"></a> +<a id="org566d71c"></a> #### bandali's check-in steps @@ -930,24 +932,236 @@ Exceptions: - bandali figures out the downstream -<a id="orgadd2650"></a> +<a id="orgbc72f52"></a> ## After the conference -<a id="orgf0fdcb7"></a> +<a id="orgde20b80"></a> ### Send thanks -[Thank you, next steps](#org72a9b8c) +[Thank you, next steps](#org6978481) + + +<a id="orgb65263f"></a> + +### Extract the opening and closing remarks + + +<a id="org8058a71"></a> + +### Extract the Q&A recordings, trimming as needed + +From <https://bbb.emacsverse.org/b/admins/recordings> + + console.log([...document.querySelectorAll('.email-link')].map((o) => '| ' + o.closest('tr').querySelector('time').getAttribute('datetime') + ' | ' + o.closest('tr').querySelector('#recording-text').innerHTML.trim() + ' | ' + o.getAttribute('data-pres-link').trim() + ' |').join('\n')) + +Make an `ids.txt` with the IDs extracted from BBB. + +In the same directory: + + while read p; do + mkdir -p "$p"; + cd "$p"; + wget "https://bbb.emacsverse.org/presentation/${p}/slides_new.xml" \ + "https://bbb.emacsverse.org/presentation/${p}/video/webcams.webm" \ + "https://bbb.emacsverse.org/presentation/${p}/deskshare.xml" \ + "https://bbb.emacsverse.org/presentation/${p}/deskshare/deskshare.webm" \ + "https://bbb.emacsverse.org/presentation/${p}/metadata.xml" + cd ..; + done <ids.txt + +Resource explanation: + +- **slides\_new.xml:** Text chat +- **webcams.webm:** Webcam as video stream, also has audio +- **deskshare.xml:** start and stop time of desktop sharing, if any +- **deskshare.webm:** Shared desktop as video +- metadata.xml + +Probably focus on grabbing the audio first and seeing what's worth keeping + + (defun emacsconf-extract-chat (slug speaker) + (interactive (list + (emacsconf-complete-talk) + (completing-read "Speaker: " + (seq-uniq + (mapcar (lambda (node) (dom-attr node 'name)) + (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline))) + ))) + (let ((text + (mapconcat (lambda (node) + (when (string= (dom-attr node 'target) "chat") + (let ((message + (replace-regexp-in-string + "\\(^[^ +]?\\): " "" + (replace-regexp-in-string "<a href=\"\\(.+?\\)\" rel=\"nofollow\"><u>\\(.+?\\)</u></a>" + "<\\1>" (dom-attr node 'message))))) + (if (string-match speaker (dom-attr node 'name)) + (format "- %s: %s\n" speaker message) + (format "- %s\n" message))))) + (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline) + ""))) + (emacsconf-edit-wiki-page slug) + (if (re-search-forward "# Discussion" nil t) + (progn + (goto-char (match-end 0)) + (insert "\n\n")) + (goto-char (point-max))) + (kill-new text))) + ;; TODO: Combine lines from same nick, or identify speakers with anon1/2/etc. + (defun emacsconf-extract-chat-from-dired () + (interactive) + (find-file (expand-file-name "slides_new.xml" (dired-get-file-for-visit))) + (call-interactively 'emacsconf-extract-chat)) + + (defun emacsconf-make-webcams-deskshare-spans (deskshare start-ms stop-ms strategy source-dir) + (let ((secs (/ start-ms 1000.0)) + (webcam-video (expand-file-name "webcams.webm" source-dir)) + (deskshare-video (expand-file-name "deskshare.webm" source-dir)) + spans) + (mapc (lambda (o) + (unless (or (= secs (string-to-number (dom-attr o 'start_timestamp))) + (= (string-to-number (dom-attr o 'start_timestamp)) 0) + (> secs (/ stop-ms 1000.0))) + (setq spans (cons (list :source webcam-video + :start-ms (* secs 1000) + :stop-ms + (* 1000 + (if (eq strategy 'test) + (+ secs 3) + (max secs (string-to-number (dom-attr o 'start_timestamp)))))) + spans))) + (when (and (<= (string-to-number (dom-attr o 'start_timestamp)) + (/ stop-ms 1000.0)) + (>= (string-to-number (dom-attr o 'stop_timestamp)) + (/ start-ms 1000.0))) + (setq spans (cons (list :source deskshare-video + :start-ms (max (* 1000 (string-to-number (dom-attr o 'start_timestamp))) + start-ms) + :stop-ms + (if (eq strategy 'test) + (* 1000 (+ (string-to-number (dom-attr o 'start_timestamp)) 3)) + (min (* 1000 (string-to-number (dom-attr o 'stop_timestamp))) + stop-ms))) + spans)) + (setq secs (string-to-number (dom-attr o 'stop_timestamp))))) + (dom-by-tag deskshare 'event)) + (unless (>= (floor (* secs 1000)) stop-ms) + (setq spans (cons (list :source webcam-video + :start-ms (* 1000 secs) + :stop-ms (if (eq strategy 'test) + (* 1000 (+ secs 3)) + stop-ms)) + spans))) + (if (eq strategy 'test) + `((video ,@(reverse spans)) + (audio ,@(mapcar (lambda (o) + (list :source webcam-video + :start-ms (plist-get o :start-ms) + :stop-ms (plist-get o :stop-ms))) + (reverse spans)))) + `((video ,@(nreverse spans)) + (audio (:source ,webcam-video :start-ms ,start-ms :stop-ms ,stop-ms)))))) + + (defun emacsconf-get-ffmpeg-to-splice-webcam-and-recording (slug start-ms stop-ms info &optional strategy) + "Return FFMPEG command for slicing. + Strategies: + - 'fast-cut-start-keyframe - find the keyframe before the start ms and cut from there, doing a fast copy. + - 'start-keyframe-and-reencode - find the keyframe before the start ms and cut from there, reencoding. + - 'cut-and-concat - seek to the keyframe before, slowly find the start-ms, reencode the snippet, and then do a fast copy of the remaining. May have encoding errors. + - default: copy from start-ms to stop-ms, reencoding. + " + (let* ((source-dir (expand-file-name (concat "../questions/by-slug/" slug) emacsconf-captions-directory)) + (video-slug (plist-get (seq-find (lambda (o) (string= (plist-get o :slug) slug)) info) :video-slug)) + (output (expand-file-name (concat video-slug "--answers.webm") emacsconf-captions-directory)) + (webcam-video (expand-file-name "webcams.webm" source-dir))) + (if (file-exists-p (expand-file-name "deskshare.webm" source-dir)) + ;; Has deskshare + (let* ((deskshare (xml-parse-file (expand-file-name "deskshare.xml" source-dir))) + (final-size (compile-media-max-dimensions + (expand-file-name "deskshare.webm" source-dir) + (expand-file-name "webcams.webm" source-dir))) + (duration (compile-media-get-file-duration-ms (expand-file-name "webcams.webm" source-dir))) + (spans (emacsconf-make-webcams-deskshare-spans deskshare start-ms stop-ms strategy source-dir)) + (compile-media-output-video-width (car final-size)) + (compile-media-output-video-height (cdr final-size))) + (compile-media-get-command spans output)) + ;; Just webcams + (compile-media-get-command + (compile-media-split-tracks + (list (list :source webcam-video :start-ms start-ms :stop-ms stop-ms))) + output)))) + +Make a table of the form + +<table id="org4fbb901" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> + +<col class="org-left" /> + +<col class="org-left" /> +<col class="org-left" /> -<a id="org76cb6a5"></a> +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Start</td> +<td class="org-left">End</td> +<td class="org-left">Slug</td> +<td class="org-left">Notes</td> +<td class="org-left">URL</td> +<td class="org-left">Timestamp</td> +</tr> +</tbody> +</table> + + (defun emacsconf-process-qa-recordings (qa dir) + ;; (setq conf-qa-recordings qa) + ;; (memoize 'conf-ffmpeg-get-closest-keyframe-in-msecs) + ;; (memoize 'conf-ffmpeg-get-keyframes-between) + ;; (memoize 'conf-video-dimensions) + ;; (memoize 'compile-media-get-file-duration-ms) + ;; (memoize-restore 'conf-ffmpeg-get-keyframes-around) + + (let ((info (emacsconf-get-talk-info))) + (replace-regexp-in-string + "captions/" "answers-slow/" + (replace-regexp-in-string + dir "" + (string-join + (nreverse + (sort + (delq nil + (mapcar + (lambda (o) + (when (> (length (car o)) 0) + (emacsconf-get-ffmpeg-to-splice-webcam-and-recording + (elt o 2) + (compile-media-timestamp-to-msecs (elt o 0)) + (compile-media-timestamp-to-msecs (elt o 1)) + info))) + ; (seq-take qa 2) + qa + )) + (lambda (a b) (string-match "trim" a)))) + "\n"))))) + + +<a id="orgc66b68f"></a> ### Update the wiki -<a id="org8c05b84"></a> +<a id="org594586f"></a> ### Update captions @@ -973,7 +1187,7 @@ Exceptions: - Update ${conf-year}/${captions}/${slug}.md in the wiki. To make this from scratch, use `M-x conf-prepare-transcript-directives` from the talk heading in the conference Org file. -<a id="org961ffb4"></a> +<a id="org9d5d1be"></a> ### BLOCKED Downsize the server :bandali: @@ -983,7 +1197,7 @@ Exceptions: ## In case of -<a id="orgef5ca4d"></a> +<a id="orgbbf8bd9"></a> ### Stuck wiki @@ -1170,19 +1384,19 @@ sudo -iu ikiwiki – ikiwiki –setup ~ikiwiki/emacsconf.setup - Add additional node to Linode account for shared transfer pool (TODO: doublecheck) -<a id="org306a5da"></a> +<a id="orge238c57"></a> ### People have a hard time seeing dark-mode presentations (or light-mode) mpv –vf=negate $url -<a id="org494ac39"></a> +<a id="org190e551"></a> # Communications -<a id="orgfe08ecf"></a> +<a id="org3aa9b2b"></a> ## DONE Ask emacsconf-org-private for feedback on early submissions @@ -1207,14 +1421,14 @@ Thanks! Sacha -<a id="org279d25b"></a> +<a id="orgb87b16c"></a> ## TODO Early speaker notification We can accept early or send people a note saying notification of acceptance will be on Oct 15, because of the extended CFP. -<a id="org16c3ff5"></a> +<a id="org5c76f2a"></a> ### Option A: Early speaker notification(?) @@ -1255,7 +1469,7 @@ Thank you so much! Sacha -<a id="orgc1bf18f"></a> +<a id="org958aff9"></a> ### Option B: Just letting them know it's been postponed @@ -1268,17 +1482,17 @@ for your patience! Sacha -<a id="orgea86cf9"></a> +<a id="org84c175e"></a> ## Future -<a id="org876b5b1"></a> +<a id="orgb16d553"></a> ### Acceptance -<a id="orgf30d2ea"></a> +<a id="org3eb0f51"></a> #### Code @@ -1336,7 +1550,7 @@ Sacha (save-excursion (conf-replace-plist-in-string attrs (plist-get attrs :body))))) -<a id="org99acc50"></a> +<a id="org7713bb6"></a> #### Template @@ -1367,7 +1581,7 @@ EmacsConf organization team P.S. Please keep emacsconf-submit@gnu.org in To or Cc when replying. -<a id="org3b113c3"></a> +<a id="org23edffe"></a> ### Acknowledge pre-rec submission @@ -1400,7 +1614,7 @@ P.S. Please keep emacsconf-submit@gnu.org in To or Cc when replying. "Thank you so much for all the work you put into preparing a talk for EmacsConf ${year}, and thank you for submitting the prerecorded video before the conference!\n\nSacha")))) -<a id="org894314e"></a> +<a id="org7693814"></a> ### Captions for approval @@ -1417,7 +1631,7 @@ ${url} . Thanks again for your contribution! Sacha -<a id="orgcc530c0"></a> +<a id="org6791af6"></a> ### Speakers we haven't confirmed e-mail communications with @@ -1462,7 +1676,7 @@ Sacha Chua (Please use Reply to All to keep emacsconf-submit@gnu.org in the loop. Thanks!) -<a id="orgd12f4ad"></a> +<a id="org5d3671c"></a> ### Speakers who are missing prerecs @@ -1483,7 +1697,7 @@ Sacha Chua (conf-get-talk-info)))))) -<a id="orgb93fe71"></a> +<a id="org6d369e7"></a> #### Template @@ -1539,7 +1753,7 @@ stream for you. Hope to hear from you soon! Sacha -<a id="org469018d"></a> +<a id="org5a9f09f"></a> ### Check-in instructions @@ -1557,7 +1771,7 @@ Goals: - They’re joined by the streamer and host. -<a id="orgdaae293"></a> +<a id="org300954e"></a> #### Code @@ -1614,7 +1828,7 @@ Slightly more complex because of the conditionals (buffer-list))) -<a id="orge33dd81"></a> +<a id="org71df6de"></a> #### E-mail for speakers who are planning to be at the conference @@ -1642,7 +1856,7 @@ Looking forward to seeing you soon! Sacha -<a id="org0aa5c87"></a> +<a id="org02f0f6c"></a> #### E-mail for speakers who are not planning to be around, but who have sent us their prerecs @@ -1664,7 +1878,7 @@ Thank you again for being part of EmacsConf ${year}! Sacha -<a id="orga206fb7"></a> +<a id="orgeae2ff0"></a> ### Last email before the conference @@ -1683,12 +1897,12 @@ Sacha > also be the time at which the talk will be made available on the same page. -<a id="org72a9b8c"></a> +<a id="org6978481"></a> ### Thank you, next steps -<a id="orgd6d3c1c"></a> +<a id="org66f27b8"></a> #### Code @@ -1720,7 +1934,7 @@ Sacha (plist-get template :body))))))) -<a id="org853e5c5"></a> +<a id="orgc7117aa"></a> #### Text @@ -1750,12 +1964,12 @@ Thanks again for speaking at EmacsConf! Sacha -<a id="org2dedcc1"></a> +<a id="org8f7d8ea"></a> ## Archive -<a id="org3c12f6f"></a> +<a id="org812cef8"></a> ### DONE Second announcement: CFP @@ -1786,7 +2000,7 @@ emacsconf-discuss list, so as to help avoid generating extra off-topic chatter in the other lists cc'd on this message. Thank you. -<a id="org41bfd48"></a> +<a id="org22c0ca7"></a> ### DONE First announcement: CFP @@ -1816,12 +2030,12 @@ emacsconf-discuss list, so as to help avoid generating extra off-topic chatter in the other lists Cc'd on this message. Thank you. -<a id="orgf50211a"></a> +<a id="orgdded910"></a> # Supporting code -<a id="orgc95be02"></a> +<a id="org003c575"></a> ## General @@ -1881,7 +2095,7 @@ chatter in the other lists Cc'd on this message. Thank you. (message "Back to safety. Phew!") -<a id="org44e8b5a"></a> +<a id="orgd6e57fe"></a> ## Publish this page @@ -1894,7 +2108,7 @@ chatter in the other lists Cc'd on this message. Thank you. (call-interactively #'magit-push-current-to-pushremote)) -<a id="org469bf4c"></a> +<a id="org14afaeb"></a> ### Export to markdown @@ -1921,7 +2135,7 @@ chatter in the other lists Cc'd on this message. Thank you. (message "Hook is no longer active")) -<a id="orgc36030d"></a> +<a id="org004bb2d"></a> ## Tangle and publish on save @@ -1948,12 +2162,12 @@ chatter in the other lists Cc'd on this message. Thank you. (message "Hook is no longer active")) -<a id="org7ff95be"></a> +<a id="org2e5e840"></a> # Lessons learned -<a id="org88f1e2f"></a> +<a id="org8fbec7e"></a> ## From previous years @@ -1985,7 +2199,7 @@ chatter in the other lists Cc'd on this message. Thank you. - [ ] we can see if bot + pads + merging will help next year, and we can also experiment with multiple streams if there are enough people to pull it off so that speakers don't feel like they've just been dropped in a room and left to their own devices :) -<a id="org76f3018"></a> +<a id="orgda47cb6"></a> ## Lessons learned for next year diff --git a/2022/organizers-notebook.org b/2022/organizers-notebook.org index 3ece421b..21bd976d 100644 --- a/2022/organizers-notebook.org +++ b/2022/organizers-notebook.org @@ -621,6 +621,194 @@ Exceptions: ** After the conference *** Send thanks [[*Thank you, next steps][Thank you, next steps]] +*** Extract the opening and closing remarks +*** Extract the Q&A recordings, trimming as needed +From https://bbb.emacsverse.org/b/admins/recordings +#+begin_src js2 :eval no :tangle no +console.log([...document.querySelectorAll('.email-link')].map((o) => '| ' + o.closest('tr').querySelector('time').getAttribute('datetime') + ' | ' + o.closest('tr').querySelector('#recording-text').innerHTML.trim() + ' | ' + o.getAttribute('data-pres-link').trim() + ' |').join('\n')) +#+end_src + +Make an ~ids.txt~ with the IDs extracted from BBB. + +In the same directory: +#+begin_src bash :eval no +while read p; do + mkdir -p "$p"; + cd "$p"; + wget "https://bbb.emacsverse.org/presentation/${p}/slides_new.xml" \ + "https://bbb.emacsverse.org/presentation/${p}/video/webcams.webm" \ + "https://bbb.emacsverse.org/presentation/${p}/deskshare.xml" \ + "https://bbb.emacsverse.org/presentation/${p}/deskshare/deskshare.webm" \ + "https://bbb.emacsverse.org/presentation/${p}/metadata.xml" + cd ..; +done <ids.txt +#+end_src + +Resource explanation: + +- slides_new.xml :: Text chat +- webcams.webm :: Webcam as video stream, also has audio +- deskshare.xml :: start and stop time of desktop sharing, if any +- deskshare.webm :: Shared desktop as video +- metadata.xml + +Probably focus on grabbing the audio first and seeing what's worth keeping + +#+begin_src emacs-lisp +(defun emacsconf-extract-chat (slug speaker) + (interactive (list + (emacsconf-complete-talk) + (completing-read "Speaker: " + (seq-uniq + (mapcar (lambda (node) (dom-attr node 'name)) + (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline))) + ))) + (let ((text + (mapconcat (lambda (node) + (when (string= (dom-attr node 'target) "chat") + (let ((message + (replace-regexp-in-string + "\\(^[^ +]?\\): " "" + (replace-regexp-in-string "<a href=\"\\(.+?\\)\" rel=\"nofollow\"><u>\\(.+?\\)</u></a>" + "<\\1>" (dom-attr node 'message))))) + (if (string-match speaker (dom-attr node 'name)) + (format "- %s: %s\n" speaker message) + (format "- %s\n" message))))) + (dom-by-tag (xml-parse-region (point-min) (point-max)) 'chattimeline) + ""))) + (emacsconf-edit-wiki-page slug) + (if (re-search-forward "# Discussion" nil t) + (progn + (goto-char (match-end 0)) + (insert "\n\n")) + (goto-char (point-max))) + (kill-new text))) +;; TODO: Combine lines from same nick, or identify speakers with anon1/2/etc. +(defun emacsconf-extract-chat-from-dired () + (interactive) + (find-file (expand-file-name "slides_new.xml" (dired-get-file-for-visit))) + (call-interactively 'emacsconf-extract-chat)) +#+end_src + +#+begin_src emacs-lisp :eval no +(defun emacsconf-make-webcams-deskshare-spans (deskshare start-ms stop-ms strategy source-dir) + (let ((secs (/ start-ms 1000.0)) + (webcam-video (expand-file-name "webcams.webm" source-dir)) + (deskshare-video (expand-file-name "deskshare.webm" source-dir)) + spans) + (mapc (lambda (o) + (unless (or (= secs (string-to-number (dom-attr o 'start_timestamp))) + (= (string-to-number (dom-attr o 'start_timestamp)) 0) + (> secs (/ stop-ms 1000.0))) + (setq spans (cons (list :source webcam-video + :start-ms (* secs 1000) + :stop-ms + (* 1000 + (if (eq strategy 'test) + (+ secs 3) + (max secs (string-to-number (dom-attr o 'start_timestamp)))))) + spans))) + (when (and (<= (string-to-number (dom-attr o 'start_timestamp)) + (/ stop-ms 1000.0)) + (>= (string-to-number (dom-attr o 'stop_timestamp)) + (/ start-ms 1000.0))) + (setq spans (cons (list :source deskshare-video + :start-ms (max (* 1000 (string-to-number (dom-attr o 'start_timestamp))) + start-ms) + :stop-ms + (if (eq strategy 'test) + (* 1000 (+ (string-to-number (dom-attr o 'start_timestamp)) 3)) + (min (* 1000 (string-to-number (dom-attr o 'stop_timestamp))) + stop-ms))) + spans)) + (setq secs (string-to-number (dom-attr o 'stop_timestamp))))) + (dom-by-tag deskshare 'event)) + (unless (>= (floor (* secs 1000)) stop-ms) + (setq spans (cons (list :source webcam-video + :start-ms (* 1000 secs) + :stop-ms (if (eq strategy 'test) + (* 1000 (+ secs 3)) + stop-ms)) + spans))) + (if (eq strategy 'test) + `((video ,@(reverse spans)) + (audio ,@(mapcar (lambda (o) + (list :source webcam-video + :start-ms (plist-get o :start-ms) + :stop-ms (plist-get o :stop-ms))) + (reverse spans)))) + `((video ,@(nreverse spans)) + (audio (:source ,webcam-video :start-ms ,start-ms :stop-ms ,stop-ms)))))) + +(defun emacsconf-get-ffmpeg-to-splice-webcam-and-recording (slug start-ms stop-ms info &optional strategy) + "Return FFMPEG command for slicing. +Strategies: +- 'fast-cut-start-keyframe - find the keyframe before the start ms and cut from there, doing a fast copy. +- 'start-keyframe-and-reencode - find the keyframe before the start ms and cut from there, reencoding. +- 'cut-and-concat - seek to the keyframe before, slowly find the start-ms, reencode the snippet, and then do a fast copy of the remaining. May have encoding errors. +- default: copy from start-ms to stop-ms, reencoding. +" + (let* ((source-dir (expand-file-name (concat "../questions/by-slug/" slug) emacsconf-captions-directory)) + (video-slug (plist-get (seq-find (lambda (o) (string= (plist-get o :slug) slug)) info) :video-slug)) + (output (expand-file-name (concat video-slug "--answers.webm") emacsconf-captions-directory)) + (webcam-video (expand-file-name "webcams.webm" source-dir))) + (if (file-exists-p (expand-file-name "deskshare.webm" source-dir)) + ;; Has deskshare + (let* ((deskshare (xml-parse-file (expand-file-name "deskshare.xml" source-dir))) + (final-size (compile-media-max-dimensions + (expand-file-name "deskshare.webm" source-dir) + (expand-file-name "webcams.webm" source-dir))) + (duration (compile-media-get-file-duration-ms (expand-file-name "webcams.webm" source-dir))) + (spans (emacsconf-make-webcams-deskshare-spans deskshare start-ms stop-ms strategy source-dir)) + (compile-media-output-video-width (car final-size)) + (compile-media-output-video-height (cdr final-size))) + (compile-media-get-command spans output)) + ;; Just webcams + (compile-media-get-command + (compile-media-split-tracks + (list (list :source webcam-video :start-ms start-ms :stop-ms stop-ms))) + output)))) +#+end_src + +Make a table of the form + +#+NAME: QA_RECORDINGS +| Start | End | Slug | Notes | URL | Timestamp | +|-------+-----+------+-------+-----+-----------| + +#+begin_src emacs-lisp :var qa=QA_RECORDINGS :eval no :dir="videos/" +(defun emacsconf-process-qa-recordings (qa dir) +;; (setq conf-qa-recordings qa) +;; (memoize 'conf-ffmpeg-get-closest-keyframe-in-msecs) +;; (memoize 'conf-ffmpeg-get-keyframes-between) +;; (memoize 'conf-video-dimensions) +;; (memoize 'compile-media-get-file-duration-ms) +;; (memoize-restore 'conf-ffmpeg-get-keyframes-around) + +(let ((info (emacsconf-get-talk-info))) + (replace-regexp-in-string + "captions/" "answers-slow/" + (replace-regexp-in-string + dir "" + (string-join + (nreverse + (sort + (delq nil + (mapcar + (lambda (o) + (when (> (length (car o)) 0) + (emacsconf-get-ffmpeg-to-splice-webcam-and-recording + (elt o 2) + (compile-media-timestamp-to-msecs (elt o 0)) + (compile-media-timestamp-to-msecs (elt o 1)) + info))) +; (seq-take qa 2) + qa + )) + (lambda (a b) (string-match "trim" a)))) + "\n"))))) +#+end_src + *** Update the wiki *** Update captions |