1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
|
#+PROPERTY: header-args:emacs-lisp :tangle playbook/emacsconf-playbook.el :eval no
#+OPTIONS: toc:4
#+begin_export md
<!-- This file was automatically generated from playbook.org. Instead of editing the .md, please edit the .org and republish. Thanks! -->
#+end_export
- [[elisp:(progn (org-md-export-to-markdown) (org-babel-tangle))][Export and tangle]]
* Roles/values
:PROPERTIES:
:CUSTOM_ID: roles
:END:
| STREAM | main organizer | bandali |
| CHECK | check-ins | sachac |
| HOST | hosting, intros, reading, moving questions/answers around | zaeph |
| ${protected} | [[/ssh:front:/var/www/media.emacsconf.org/2021/protected/]] |
| ${stream-status} | [[/ssh:front:/var/www/live.emacsconf.org/index.html]] |
| ${upcoming} | upcoming.org shared over CRDT |
| ${conf} | conf.org shared over CRDT |
| ${playbook} | playbook.org shared over CRDT |
| ${dump} | [[/ssh:live:/data/]] |
| ${media} | [[/ssh:front:/var/www/media.emacsconf.org/2021/]] |
* Pre-conference dry run
:PROPERTIES:
:CUSTOM_ID: dry-run
:END:
- - DONE Working together via upcoming.org
- DONE Streaming [[https://live0.emacsconf.org/main.webm][main.webm]]
- DONE Streaming [[https://live0.emacsconf.org/main-480p.webm"][main-480p.webm]]
- CXLD Streaming [[https://live0.emacsconf.org/alt.webm"][alt.webm]]
- Doesn’t really work for corwin because of some weird setting problem
- STRT Streaming to YouTube
- [X] [[*Start streaming][Start streaming]]
- Ugh, need to figure out ffmpeg for streaming
- [ ] [[*Check in a speaker][Check in a speaker]]
- [ ] Try streaming the organizer room, HOST rehearses opening remarks
- [X] Play a prerec with subtitles
- [ ] Try switching to talk room and streaming pretend Q&A
- [ ] Try playing another prerec
- [ ] Try publication process
- [ ] Start alternate stream and check (?)
- No alternate streams at the moment
- [ ] Review the playbook
* Thursday or Friday before the conference
:PROPERTIES:
:CUSTOM_ID: days-before
:END:
- STREAM: Download prerecorded videos from ${protected}
* On the day of the conference
:PROPERTIES:
:CUSTOM_ID: day-of
:END:
** Set up
:PROPERTIES:
:CUSTOM_ID: setup
:END:
*** Arrange screens
:PROPERTIES:
:CUSTOM_ID: screens
:END:
- CHECK:
- Share ${upcoming}, ${playbook}, and ${conf} via CRDT: =conf-crdt-connect-and-share=
- Current schedule, filenames/commands for playing, Q&A preference, IRC nick, pronunciation, intro notes, prerec duration, emergency contact information
- =conf-upcoming-add-subtree=
- Have #emacsconf-org and #emacsconf open
- Start backup process for pad
#+begin_src sh :eval no :tangle playbook/backup-pad.sh
while true; do
curl https://etherpad.wikimedia.org/p/emacsconf-2021/export/html > emacsconf-$(date +"%Y%m%d-%H%M%S").html
sleep 15m
end
#+end_src
- HOST:
- Check OBS scenes for sharing windows/tabs as a virtual camera:
- chat.emacsconf.org with #emacsconf
- Etherpad
- Schedule
- next talk page
- Clock with current time on screen: =watch TZ=America/Toronto date=
- Set up backchannel for easy viewing
- ${upcoming}
- #emacsconf-org and #emacsconf channels
- Join organizer room S
- STREAM:
- Join organizer BBB room
- Check OBS scenes
- MPV and audio from MPV
- Web browser with BBB
- Browser window with organizer room, audio from organizer room
- Browser window that will have talk room, audio from talk room
- Backchannel for easy viewing
*** Start streaming :stream:
:PROPERTIES:
:CUSTOM_ID: start-streaming
:END:
- HOST: Display getting-ready message
- STREAM: Set up BBB view in organizer room to have HOST's webcam maximized
- STREAM: Start streaming from OBS to local Icecast, relay to live0 icecast
- CHECK: Confirm that the stream is live at https://live.emacsconf.org/main.webm
- STREAM: Update the status page to say that the stream is live
- CHECK: Start low-resolution stream, confirm at https://live.emacsconf.org/main-480p.webm
Call this on live0 with $CONF480PASS as the first parameter. The Icecast configuration is on =live0= at =/etc/icecast2/icecast.xml=.
#+begin_src sh :eval no :tangle "playbook/restream-lowres.sh"
PASS=$1
while true; do ffmpeg -loglevel 24 -f webm -reconnect_at_eof 1 -reconnect_streamed 1 -re -i http://localhost:8000/main.webm -vf scale=854:480 -f webm -c:a copy -b:v 500k -maxrate 1M -bufsize 1M -content_type video/webm -c:v libvpx icecast://ec2020main480pmu:$PASS@localhost:8000/main-480p.webm; done
#+end_src
- CHECK: Start Youtube stream. Call this with $YOUTUBE1PASS, $YOUTUBE2PASS, or $TOOBNIX as the parameter
#+begin_src sh :eval no :tangle "playbook/restream-flv.sh"
MOUNT=$1
while true; do ffmpeg -loglevel 24 -i http://localhost:8000/main.webm -cluster_size_limit 2M -cluster_time_limit 5100 -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -vcodec libx264 -acodec libmp3lame -f flv $MOUNT; done
#+end_src
- CHECK: Verify the alternate streams and the load on live0.
- CHECK: Verify with #emacsconf that the stream is active
** Talk process
:PROPERTIES:
:CUSTOM_ID: talk
:END:
*** Check in a speaker
:PROPERTIES:
:CUSTOM_ID: check-in
:END:
Exception: [[*CHECK is unavailable][CHECK is unavailable]]
- Speaker checks in on #emacsconf-org via IRC or via e-mail ~30m before
- CHECK notes IRC nick for speaker.
- CHECK confirms Q&A preference: live/IRC/Etherpad, preferred way of getting questions
- [? unknown] How would you like to handle questions today? Live video, #emacsconf, Etherpad?
- [? IRC] You can keep an eye on #emacsconf for questions and discussions related to your talk. Feel free to answer, skip answering, tell people that you'll follow up afterwards, etc. We'll also copy questions from the Etherpad so that you can see them in one place. Let us know if you need help or if you want to get set up for live Q&A! (If the volume gets overwhelming, we can copy questions into #emacsconf-questions for you.)
- [? Etherpad] The Etherpad is at ${etherpad-url} . Would you like to find the section for your talk and get comfortable? We'll copy questions from IRC over to the pad so that you can see them. Feel free to answer, skip answering, tell people that you'll follow up afterwards, etc. Let us know if you need help or if you want to get set up for live Q&A!
- [? live] Are you thinking of handling questions over a web
conference? I'll set you up in a BigBlueButton room so that you can
get settled in. Let us know if you want to handle questions by IRC
or Etherpad instead.
- CHECK directs speaker to available room with =/checkin <room> <nick>=
- Speaker joins talk room
- CHECK makes speaker presenter and moderator, does last-minute tech check
- Hello, thanks
- Speaker tries screen sharing and webcam (optional)
- check screen readability
- CHECK briefs speaker on process, including:
- live Q&A: reading questions themselves (can do in any order,
can skip; coach possible responses for awkward things) or asking HOST to read questions to them
- HOST can share the pad or IRC; speaker shares screen only if doing demo
- encouragement of webcam, although it's optional
- how STREAM will join shortly before the prerec ends and then
give them the go-ahead
- closing any tabs watching the stream as their talk starts
(otherwise the audio is confusing)
- If the speaker will be giving a live presentation, CHECK
collects emergency contact information (in case of technical
issues) and shares it with HOST in the CRDT buffer
- Okay to do other things until the prerec ends
- CHECK updates ${upcoming} with link to the talk room and preferences for Q&A-. CHECK will also /msg the relevant information.
*** Present talk
:PROPERTIES:
:CUSTOM_ID: present
:END:
- CHECK marks previous talk as done and notes the time finished:
- ${conf}
- ${upcoming} - remove finished one
- wiki
- PAD clears pad colours.
- [? prerec]
- STREAM and HOST switch to the organizer room in BBB.
- STREAM switches to MPV scene in OBS and plays the video (with captions if available).
- Exception: [[*Last-minute prerecording submission][Last-minute prerecording submission]]
- Exception: [[*Last-minute caption update][Last-minute caption update]]
- [[*Publish information][CHECK publishes information]]
- [[*Handle Q&A][HOST gets a head start on handling Q&A]]
- When prerec finishes, [[*Handle Q&A][STREAM joins Q&A]]
- [? live]
- Exception: [[*Speaker does not have a prerec and has not checked in][Speaker does not have a prerec and has not checked in]]
- HOST joins the BBB room and double-checks that recording is on
- STREAM joins the BBB room and gives the go-ahead
- CHECK notes that this is a live presentation and that the recording will be posted after the conference.
- CHECK notes the time that the presentation started, recalculates schedule, and publishes it.
- Speaker presents.
- Exception: [[*Technical issues during a live presentation][Technical issues during a live presentation]]
- [? talk needs to be wrapped up]
- HOST nudges speaker verbally.
*** Publish information
:PROPERTIES:
:CUSTOM_ID: publish
:END:
- CHECK updates the schedule in:
- ${conf}
- ${upcoming}
- wiki
- CHECK publishes the video to media.emacsconf.org
- CHECK updates the wiki page to include the video and any other published files.
- CHECK publishes the video on YouTube.
- Update description:
#+begin_example
This video is available under the terms of the
Creative Commons Attribution-ShareAlike 4.0 International (CC
BY-SA 4.0) license.
You can view it using free and open source software at
${url}
${description}
#+end_example
- Reupload subtitles if needed.
- Mark it as public.
- Add it to EmacsConf 2021 playlist.
- CHECK publishes the video on ToobNix.
- Copy title and description.
- Mark it as public.
- Add it to the EmacsConf 2021 playlist.
- [? live sections ]
- CHECK does a rough-cut of the recording from ${dump} to get the last X minutes or by time range. There's about a 1-2 minute delay.
Ex: =(kill-new (conf-dump-get "alt" "10:24" "10:30" "qa_"))=
- When there's an opportunity to do so:
- CHECK finetunes the rough-cut recording (trim start and end) and posts it to:
- media.emacsconf.org/2021
- wiki page for talk
*** Handle Q&A
:PROPERTIES:
:CUSTOM_ID: questions
:END:
Exceptions:
- [[*Speaker has not checked in][Speaker has not checked in]]
- [? live]
- HOST joins the BBB room
- HOST starts recording in BBB or confirms that it's already recording
- STREAM joins meeting and gives go-ahead
- HOST describes how to ask questions
- [? No questions yet]
- HOST thanks speaker, says nice things about talk, and asks a couple of prepared questions
- [? Awkward question]
- HOST can try rephrasing the question.
- HOST adds note to IRC/Etherpad that speakers can answer in any order, skip questions, answer afterwards, etc.
- [? Q&A needs to be wrapped up]
- HOST writes in Etherpad/IRC or nudges speaker verbally.
- CHECK notes the time that the live Q&A finished.
- [? IRC/pad]
- HOST and STREAM switch to organizer BBB meeting (room S)
- HOST describes Q&A method and shows it on the screen
- While there's buffer time before the next talk, HOST can read out
questions and answers, or transition to the next talk early
- HOST: It's time for the next talk, but if you want to keep
discussing the previous talk, please feel free to continue doing
so on IRC or the pad.
- [? speaker will answer after the conference]
- HOST and STREAM switch to organizer BBB meeting (room S)
- HOST says the speaker is not available right now, but we'll
forward the questions to the speaker and we'll post the speaker's
answers on the wiki page. Leave your contact information if you
want to be notified, or subscribe to the emacsconf-? mailing
list to get the announcement. Please feel free to continue
discussing the talk on IRC or the pad.
- [[*Present talk][Present next talk]]
** Break time
:PROPERTIES:
:CUSTOM_ID: break
:END:
- CHECK stops and restarts the Toobnix restreaming process, and re-checks the stream
- CHECK uses =conf-upcoming-add-subtree= to add the afternoon talks to upcoming.org
- HOST doublechecks network transfer limit and server health
** End of stream
:PROPERTIES:
:CUSTOM_ID: end
:END:
- CHECK stops ffmpeg process for Youtube
- CHECK stops ffmpeg process for main-480p
- STREAM stops streaming
** In case of...
:PROPERTIES:
:CUSTOM_ID: exceptions
:END:
*** Last-minute prerecording submission
:PROPERTIES:
:CUSTOM_ID: last-minute-prerec
:END:
- CHECK will copy it from the FTP upload server to ${protected} and name it appropriately.
- CHECK will notify STREAM with the scp command and the mpv command so that STREAM can choose.
*** Last-minute caption update
:PROPERTIES:
:CUSTOM_ID: last-minute-captions
:END:
- CHECK uploads the --main.vtt file to ${protected}
- CHECK notifies STREAM via ${upcoming}
- STREAM uses the provided commands to download the VTT file and load it into MPV with =--sub-file=
*** Speaker has not checked in
:PROPERTIES:
:CUSTOM_ID: missing
:END:
- Let the previous talk run a little longer for Q&A; end at least in time for the prerec
- After the previous Q&A wraps up, play the prerec
- [? still not around after prerec finishes]
- HOST: Speaker might be having some difficulty connecting, but we'll collect your questions on the pad and send them afterwards.
- Can play next prerec a few minutes early
*** Speaker does not have a prerec and has not checked in
:PROPERTIES:
:CUSTOM_ID: really-missing
:END:
- Let the previous talk do live Q&A/demo if ready
- Close to the time of the missing talk:
- See if any of the previous speakers want to be set up for an impromptu talk/extension in a BBB room, just in case
- HOST: The next speaker might be having some difficulty connecting. In the meantime, let's...
- OR:
- highlight ongoing discussions
- invite another speaker for an impromptu extension; mplsCorwin will keep a list of possible speakers who are still active
- replay a short prerec
- let mplsCorwin or zaeph fill in
*** CANCELLED Speaker whose talk was reallocated shows up and has a prerec
:PROPERTIES:
:CUSTOM_ID: reallocated-prerec
:END:
- CHECK copies it to ${protected}
- Plan to play prerec at the end of the day, or in any gaps if a live talk falls through
*** CANCELLED Speaker whose talk was reallocated shows up and wants to do it live
:PROPERTIES:
:CUSTOM_ID: reallocated-live
:END:
- See if there's enough time if buffers are shuffled back; if so, set up for a live presentation
- Check for alternate stream volunteers
- [? not enough time] Offer to set up a BBB room for recording or to
accept a prerecording afterwards, then include it on the site and in
post-conference communication
*** Alternate stream volunteer wants to stream (nice to have, at risk)
:PROPERTIES:
:CUSTOM_ID: alternate
:END:
- CHECK gives ALTERNATE the BBB room URL for the talk they are interested in
- ALTERNATE starts streaming to assigned end point
- CHECK confirms stream
- CHECK updates ${stream-status}
- CHECK notifies STREAM and HOST
- After prerec plays:
- HOST: This talk has an extended demo/Q&A. You can go to ${alternate-url} to watch it, and we'll post a recording afterwards.
- HOST sends ${alternate-url} to IRC: Alternate stream for ${title}: ${alternate-url}
- ALTERNATE notifies #emacsconf-org when the stream is done.
- CHECK updates ${stream-status} to note that the alternate stream is finished.
FFMPEG process for sending the desktop and audio to the $CONFALT mountpoint on Linux with X11 and Alsa:
1. Set the CONFALT environment variable to icecast://user:password@live0.emacsconf.org:8000/alt.webm
2. Install pavucontrol if you don't have it already.
3. Start the following command ([[file:playbook/stream-desktop-and-audio.sh]]:
#+begin_src sh :eval no :tangle playbook/stream-desktop-and-audio.sh
while true; do ffmpeg -loglevel 0 -ar 48000 -f alsa -channels 2 -sample_rate 48000 -i default -re -video_size 1280x720 -framerate 25 -f x11grab -i :0.0 -cluster_size_limit 2M -cluster_time_limit 5100 -content_type video/webm -c:v libvpx -b:v 1M -crf 30 -g 125 -deadline good -threads 4 -f webm $CONFALT; done
#+end_src
4. Use pavucontrol to set the recording source for the ffmpeg
command to be the audio monitor, so you get system output as
well.
*** Pad malfunction or mess-up
:PROPERTIES:
:CUSTOM_ID: pad-broken
:END:
- PAD resets the pad using https://etherpad.wikimedia.org/p/emacsconf-2021/timeslider
- [? still not recovered]
- PAD reimports the pad from backup
*** CRDT malfunctions
:PROPERTIES:
:CUSTOM_ID: crdt-broken
:END:
- HOST notifies CHECK and tries reconnecting
- [? still doesn't work]
- Switch to backup Etherpad
*** Conduct guidelines issue
:PROPERTIES:
:CUSTOM_ID: conduct
:END:
- HOST addresses it (on-camera if needed) with a reminder and/or a kick or a ban
*** CHECK is unavailable
:PROPERTIES:
:CUSTOM_ID: check-gone
:END:
- HOST does check-ins
- HOST refers to conf.org for Q&A preference etc.
- STREAM checks conf.org for prerec filenames etc.
- Dropped goals:
- Publishing recordings ASAP
- Updating schedule/wiki on the fly
*** HOST is unavailable
:PROPERTIES:
:CUSTOM_ID: host-gone
:END:
- Either STREAM or CHECK does hosting
*** Technical issues during a live presentation
:PROPERTIES:
:CUSTOM_ID: live-issues
:END:
- HOST tries to contact the speaker
- [? back on track]
- [? can be squeezed into remaining time]: Continue
- [? need extra time]: CHECK fiddles with buffer of following talks in conf.org and updates schedule
- [? need too much extra time (ex: 10min)]: HOST acknowledges
technical issues and says we may be able to follow up after the
conference
- [? can't resume]: HOST acknowledges technical issues and says we may
be able to follow up after the conference
*** Big technical issues with streaming
:PROPERTIES:
:CUSTOM_ID: stream-issues
:END:
- HOST notifies #emacsconf and #emacsconf-org and pad
- HOST updates the 2021.md wiki page
- CHECK publishes prerecordings
- media.emacsconf.org
- wiki
- Toobnix
- Peertube
- STREAM e-mails the mailing list
*** live0 can't handle the load or is close to network transfer limit
:PROPERTIES:
:CUSTOM_ID: network
:END:
- OR:
- Redirect some viewers via asking in #emacsconf:
- watch via main-480p
- watch via Toobnix (if we can get that working)
- Consider dropping the restream to Toobnix (lower audience?) or to Youtube
- Add additional node to Linode account for shared transfer pool (TODO: doublecheck)
* Before the conference
:PROPERTIES:
:CUSTOM_ID: before
:END:
** Help speakers with tech checks
:PROPERTIES:
:CUSTOM_ID: tech-checks
:END:
- Explain process
- Test audio, webcam, screensharing, collaborative pad
- Music demos and other things that use system audio will need to be prerecorded (or done through virtual loopback device, maybe? Technical risk.)
- Multi-monitor setups might not be handled well by BBB; share window instead of desktop
- Check if comfortable checking into IRC: chat.emacsconf.org/?join=emacsconf,emacsconf-org
- Get IRC nick, phone number for emergency contact, store in private wiki
- Try to record name pronunciation
- Encourage webcam for Q&A, although make it clear that it's totally optional
- Possible picture-in-picture approach to maximize screen real estate
|