From 4696aa1fed214fe1084d7c3deecaaa289bc0a1fd Mon Sep 17 00:00:00 2001 From: Sacha Chua Date: Mon, 31 Oct 2022 21:53:15 -0400 Subject: Update OBS, renamepublish and edit --- README.org | 15 +- common-playbook.yml | 12 +- group_vars/all.yml | 5 + inventory.yml | 12 +- roles/caption/tasks/main.yml | 2 +- roles/caption/templates/process-captions.py | 2 +- roles/edit/defaults/main.yml | 7 + roles/edit/tasks/main.yaml | 11 + roles/edit/templates/emacsconf-edit.el | 34 ++ roles/obs/tasks/firefox.yml | 36 -- roles/obs/tasks/main.yml | 76 +-- roles/obs/tasks/mpv.yml | 21 +- roles/obs/tasks/obs-setup.yml | 40 +- roles/obs/tasks/pulse.yml | 6 +- roles/obs/tasks/tigervnc.yml | 39 +- roles/obs/tasks/track.yml | 83 +++ roles/obs/tasks/user.yml | 14 + roles/obs/templates/bashrc | 116 ++++ roles/obs/templates/global.ini | 36 ++ roles/obs/templates/i3-config | 26 +- roles/obs/templates/mpv-track | 2 +- roles/obs/templates/mpv.conf | 27 +- roles/obs/templates/obs-track | 2 +- roles/obs/templates/scenes.json | 644 ++++++++++++++++++++++- roles/obs/templates/vnc-track | 2 +- roles/obs/templates/xstartup-track | 6 +- roles/publish/defaults/main.yml | 9 + roles/publish/tasks/emacs.yml | 38 ++ roles/publish/tasks/main.yml | 94 ++++ roles/publish/templates/emacsconf-config.el | 21 + roles/stream/defaults/main.yml | 1 + roles/stream/templates/icecast.xml | 2 +- roles/wiki-edit/defaults/main.yml | 7 - roles/wiki-edit/tasks/main.yaml | 11 - roles/wiki-edit/templates/emacsconf-edit.el | 34 -- roles/wiki-publish/defaults/main.yml | 9 - roles/wiki-publish/tasks/emacs.yml | 38 -- roles/wiki-publish/tasks/main.yml | 94 ---- roles/wiki-publish/templates/emacsconf-config.el | 21 - 39 files changed, 1232 insertions(+), 423 deletions(-) create mode 100644 roles/edit/defaults/main.yml create mode 100644 roles/edit/tasks/main.yaml create mode 100644 roles/edit/templates/emacsconf-edit.el delete mode 100644 roles/obs/tasks/firefox.yml create mode 100644 roles/obs/tasks/track.yml create mode 100644 roles/obs/templates/bashrc create mode 100644 roles/obs/templates/global.ini create mode 100644 roles/publish/defaults/main.yml create mode 100644 roles/publish/tasks/emacs.yml create mode 100644 roles/publish/tasks/main.yml create mode 100644 roles/publish/templates/emacsconf-config.el delete mode 100644 roles/wiki-edit/defaults/main.yml delete mode 100644 roles/wiki-edit/tasks/main.yaml delete mode 100644 roles/wiki-edit/templates/emacsconf-edit.el delete mode 100644 roles/wiki-publish/defaults/main.yml delete mode 100644 roles/wiki-publish/tasks/emacs.yml delete mode 100644 roles/wiki-publish/tasks/main.yml delete mode 100644 roles/wiki-publish/templates/emacsconf-config.el diff --git a/README.org b/README.org index 5e1a87c..31a24af 100644 --- a/README.org +++ b/README.org @@ -10,7 +10,8 @@ Docker: needs docker-vars.yml, see docker-vars.yml.sample 1. Install ansible on your local machine and check out this repo. 2. Copy the ansible_vars block from conf.org to prod-vars.yml in this repo (alongside inventory.yml), or set emacsconf-ansible-directory in Emacs and then use emacsconf-ansible-tangle-vars to tangle the file. -3. Find the ansible-playbook command you want to run and try it out. +3. scp orga@res.emacsconf.org:~/authorized_keys . (if you're setting up any user accounts) +4. Find the ansible-playbook command you want to run and try it out. * Wiki ** Ikiwiki @@ -186,17 +187,11 @@ ffmpeg -y -i handwritten/reencode.webm -t 60 -vcodec copy -acodec copy test.webm nodemon -w . -e yml -x 'ansible-playbook -i inventory.yml prod-playbook.yml --tags vnc; true' * OBS -sudo su - orga -c vncserver -ssh -L 15902:127.0.0.1:5902 res - Resizing VNC after connection xrandr -s 1280x720 -pacmd load-module module-null-sink sink_name=DevelopmentSink sink_properties=device.description="DevelopmentSink" - -pavucontrol -vncserver -kill :1 -vncserver -kill :2 - Firefox profiles like to be created in an X environment firefox -no-remote -CreateProfile "{{ emacsconf_id }}-{{ item.item.id }} + +Update scenes from the dev copy: +ssh emacsconf-dev@res.emacsconf.org "cat ~/.config/obs-studio/basic/scenes/dev.json" | jq 'walk(if type == "string" then gsub("emacsconf"; "{{ emacsconf_id }}") | gsub("dev"; "{{ item.id }}") else . end)' > scenes.json diff --git a/common-playbook.yml b/common-playbook.yml index 2adfdff..5c6cf83 100644 --- a/common-playbook.yml +++ b/common-playbook.yml @@ -3,16 +3,16 @@ tags: wiki roles: - wiki -- name: Set up wiki for publishing +- name: Set up publishing hosts: res tags: wiki-publish roles: - - wiki-publish -- name: Set up wiki for interactive editing + - publish +- name: Set up interactive editing hosts: res - tags: wiki-edit + tags: edit roles: - - wiki-edit + - edit - name: Set up pad hosts: pad tags: pad @@ -53,6 +53,6 @@ - media - name: Set up OBS hosts: obs - tags: obs + tags: obs, wip roles: - obs diff --git a/group_vars/all.yml b/group_vars/all.yml index 7ab7c6b..360c7af 100644 --- a/group_vars/all.yml +++ b/group_vars/all.yml @@ -12,10 +12,15 @@ emacsconf_tracks: watch: https://emacsconf.org/{{ emacsconf_year }}/watch/gen/ watch_lowres: https://live.emacsconf.org/{{ emacsconf_year }}/watch/gen-480p/ vnc_id: 5 + vnc_port: 5905 + obs_websocket_port: 6005 - name: Development id: dev watch: https://emacsconf.org/{{ emacsconf_year }}/watch/dev/ watch_lowres: https://live.emacsconf.org/{{ emacsconf_year }}/watch/dev-480p/ vnc_id: 6 + vnc_port: 5906 + obs_websocket_port: 6006 icecast_emacsconf_user: emacsconf emacsconf_home: /home/{{ emacsconf_user }} +emacsconf_font: "Sans Serif" diff --git a/inventory.yml b/inventory.yml index f3603b0..adccf66 100644 --- a/inventory.yml +++ b/inventory.yml @@ -6,6 +6,12 @@ prod: ansible_become: true emacsconf_group: org cpus: 12 + publish: + ansible_host: res.emacsconf.org + ansible_python_interpreter: /usr/bin/python3 + ansible_become: true + emacsconf_group: org + cpus: 12 obs: ansible_host: res.emacsconf.org ansible_python_interpreter: /usr/bin/python3 @@ -24,12 +30,6 @@ prod: ansible_ssh_user: orga ansible_python_interpreter: /usr/bin/python3 ansible_become: true - publish: - ansible_host: front0.emacsconf.org - remote_user: orga - ansible_ssh_user: orga - ansible_python_interpreter: /usr/bin/python3 - ansible_become: true pad: ansible_host: front0.emacsconf.org remote_user: orga diff --git a/roles/caption/tasks/main.yml b/roles/caption/tasks/main.yml index 3fa997c..c1511cf 100644 --- a/roles/caption/tasks/main.yml +++ b/roles/caption/tasks/main.yml @@ -33,7 +33,7 @@ path: "{{ emacsconf_caption_dir }}" state: directory - name: Copy the script for processing the files - tags: process-captions, wip + tags: process-captions template: src: process-captions.py dest: "{{ emacsconf_caption_dir }}/process-captions.py" diff --git a/roles/caption/templates/process-captions.py b/roles/caption/templates/process-captions.py index da99203..50c62d1 100755 --- a/roles/caption/templates/process-captions.py +++ b/roles/caption/templates/process-captions.py @@ -142,7 +142,7 @@ def generate_captions(work): result = clean_up_timestamps(result) with open(new_file, 'w') as vtt: whisper.utils.write_vtt(result['segments'], file=vtt) - with open(work['base'] + '.txt') + with open(work['base'] + '.txt'): whisper.utils.write_txt(result['segments'], file=txt) work['vtt'] = new_file if 'srv2' in work: del work['srv2'] diff --git a/roles/edit/defaults/main.yml b/roles/edit/defaults/main.yml new file mode 100644 index 0000000..ea0fbdb --- /dev/null +++ b/roles/edit/defaults/main.yml @@ -0,0 +1,7 @@ +emacsconf_edit_packages: + - consult + - embark + - embark-consult + - vertico + - magit + - modus-themes diff --git a/roles/edit/tasks/main.yaml b/roles/edit/tasks/main.yaml new file mode 100644 index 0000000..f77535f --- /dev/null +++ b/roles/edit/tasks/main.yaml @@ -0,0 +1,11 @@ +--- +- name: Set up Emacs configuration for interactive editing + template: + src: emacsconf-edit.el + dest: "{{ emacs_config_dir }}/emacsconf-edit.el" +- name: Check if Emacs base configuration already exists + lineinfile: + dest: "{{ emacs_config_dir }}/init.el" + state: present + regexp: "emacsconf-edit" + line: "(load-file \"emacsconf-edit.el\")" diff --git a/roles/edit/templates/emacsconf-edit.el b/roles/edit/templates/emacsconf-edit.el new file mode 100644 index 0000000..2e360c7 --- /dev/null +++ b/roles/edit/templates/emacsconf-edit.el @@ -0,0 +1,34 @@ +;; {{ ansible_managed }} + +(let ((packages '({% for package in emacsconf_edit_packages %}{{ package }}{% endfor %}))) + (mapc (lambda (package) (unless (package-installed-p package) (package-install package))) packages)) +;; Configuration +(vertico-mode) +(show-paren-mode) +(fset 'yes-or-no-p 'y-or-n-p) +(global-set-key (kbd "C-x g") 'magit-status) +(global-set-key (kbd "C-x b") 'consult-buffer) +(global-set-key (kbd "M-g t") 'emacsconf-go-to-talk) +(global-set-key (kbd "C-.") 'embark-act) +(global-set-key (kbd "C-c .") 'embark-act) +(global-set-key (kbd "C-;") 'embark-act) +(modus-themes-load-vivendi) +(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (shell . t))) +(setq backup-directory-alist '(("." . "~/.emacs.d/backups"))) +(find-file "{{ emacsconf_private_dir }}/conf.org") +(split-window-horizontally) +(magit-status "{{ emacsconf_edit_wiki_dir }}") +(global-auto-revert-mode 1) +(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) +(projectile-mode +1) +(setq projectile-completion-system 'default) +(setq projectile-enable-caching t) +(setq projectile-indexing-method 'alien) +(add-to-list 'projectile-globally-ignored-files "node_modules") +(add-to-list 'projectile-globally-ignored-files ".cache") +(add-to-list 'projectile-globally-ignored-files "_cache") + +(setq completion-styles '(orderless)) +(setq completion-category-defaults nil) +(setq completion-category-overrides '((file (styles orderless)))) +(require 'ox-md) diff --git a/roles/obs/tasks/firefox.yml b/roles/obs/tasks/firefox.yml deleted file mode 100644 index d96e330..0000000 --- a/roles/obs/tasks/firefox.yml +++ /dev/null @@ -1,36 +0,0 @@ -- name: Add Firefox - apt: - name: firefox-esr - when: ansible_distribution == "Debian" -- name: Add Firefox - apt: - name: firefox-esr - when: ansible_distribution == "Ubuntu" -- name: Check if Firefox profiles exist - lineinfile: - dest: "{{ emacsconf_home }}/.mozilla/firefox/profiles.ini" - line: "Name={{ emacsconf_id }}-{{ item.id }}" - check_mode: yes - register: find_profiles - failed_when: no - loop: "{{ emacsconf_tracks }}" -- name: Fail if there are missing profiles - fail: - msg: "Please use firefox -no-remote -CreateProfile {{ emacsconf_id }}-{{ item.item.id }} in an X session to create the profiles." - when: item.changed - loop: "{{ find_profiles.results }}" -- name: Create scripts for tracks - template: - src: firefox-track - dest: "{{ emacsconf_home }}/bin/{{ item.id }}/-firefox" - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" - mode: 0775 - loop: "{{ emacsconf_tracks }}" - - # - debug: -# var: find_profiles.results -# - name: Create profile if it doesn't exist -# shell: xinit firefox -no-remote -CreateProfile "{{ emacsconf_id }}-{{ item.item.id }}" -# when: item.changed -# loop: "{{ find_profiles.results }}" diff --git a/roles/obs/tasks/main.yml b/roles/obs/tasks/main.yml index cb981b1..36e14c3 100644 --- a/roles/obs/tasks/main.yml +++ b/roles/obs/tasks/main.yml @@ -19,61 +19,39 @@ - dbus-x11 - obs-studio - xserver-xorg-dev + - xdotool update_cache: yes -- name: Set up user - include: user.yml -- name: Set up track bins for addition to paths - file: - path: "{{ emacsconf_home }}/bin/{{ item.id }}" - state: directory - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" - loop: "{{ emacsconf_tracks }}" +- name: Add Firefox + apt: + name: firefox-esr + when: ansible_distribution == "Debian" +- name: Add Firefox + apt: + name: firefox-esr + when: ansible_distribution == "Ubuntu" - name: Copy X11 config template: src: xorg.conf dest: /etc/X11/xorg.conf -- name: Set up VNC - include: tigervnc.yml - tags: vnc, wip - name: Set up MPV and MPVC tags: mpv include: mpv.yml -- name: Set up OBS profiles and scenes - tags: obs-profile - include: obs-setup.yml -- name: Add FFMPEG script for streaming - template: - src: stream-desktop-with-ffmpeg.sh - dest: /home/{{ emacsconf_user }}/bin/{{ item.id }}/stream-desktop-with-ffmpeg - mode: 0775 - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" +- name: Set up track-specific things + include: track.yml loop: "{{ emacsconf_tracks }}" -- name: Copy logo - copy: - src: logo.png - dest: "{{ emacsconf_home }}/logo.png" -# - name: Start jack -# shell: jackd -r -ddummy -# async: 2592000 -- name: Set up pulse - include: pulse.yml - tags: pulse -- name: Set up Firefox - tags: firefox - include: firefox.yml -- name: Set up I3 directory - tags: wip - file: - path: "{{ emacsconf_home }}/.config/i3" - state: directory - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" -- name: Set up I3 - tags: wip - template: - src: i3-config - dest: "{{ emacsconf_home }}/.config/i3/config" - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" +- debug: + var: emacsconf_home +- name: Add packages + apt: + name: + - tigervnc-standalone-server + - tigervnc-common + tags: vnc +- name: Allow SSH for the users + replace: + dest: /etc/ssh/sshd_config.d/emacsconf_ssh.conf + regexp: '(AllowUsers(?!.*\b{{ emacsconf_id }}-{{ item.id }}\b).*)$' + replace: \1 {{ emacsconf_id }}-{{ item.id }} + loop: "{{ emacsconf_tracks }}" + + diff --git a/roles/obs/tasks/mpv.yml b/roles/obs/tasks/mpv.yml index 581472a..9fbdc05 100644 --- a/roles/obs/tasks/mpv.yml +++ b/roles/obs/tasks/mpv.yml @@ -8,18 +8,6 @@ - name: Install mpv apt: name: mpv=0.34.1+fruit.2 -- name: Create MPV profile directory - file: - path: "{{ emacsconf_home }}/.config/mpv" - state: directory - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" -- name: Add MPV profile - template: - src: mpv.conf - dest: "{{ emacsconf_home }}/.config/mpv/mpv.conf" - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" - name: Download MPVC git: repo: https://github.com/lwilletts/mpvc.git @@ -28,11 +16,4 @@ make: chdir: /usr/src/mpvc target: install -- name: Create mpv scripts for tracks - template: - src: mpv-track - dest: "{{ emacsconf_home }}/bin/{{ item.id }}/-mpv" - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" - mode: 0775 - loop: "{{ emacsconf_tracks }}" + diff --git a/roles/obs/tasks/obs-setup.yml b/roles/obs/tasks/obs-setup.yml index be82a8f..1da678a 100644 --- a/roles/obs/tasks/obs-setup.yml +++ b/roles/obs/tasks/obs-setup.yml @@ -1,37 +1,53 @@ - name: Create OBS scene directory file: - path: "{{ emacsconf_home }}/.config/obs-studio/basic/scenes" - state: directory + path: "~{{ emacsconf_user }}/.config/obs-studio/basic/scenes" owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" + state: directory - name: Create profile directories file: - path: "{{ obs_profile_path }}/{{ item.name }}" + path: "~{{ emacsconf_user }}/.config/obs-studio/basic/{{ item.name }}" state: directory owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" mode: 0775 - loop: "{{ emacsconf_tracks }}" +- name: Install OBS global profile + tags: wip + template: + src: global.ini + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + dest: "~{{ emacsconf_user }}/.config/obs-studio/global.ini" - name: Install OBS profiles template: src: profile.ini - dest: "{{ obs_profile_path }}/{{ item.name }}/basic.ini" owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" - force: no + dest: "~{{ emacsconf_user }}/.config/obs-studio/basic/{{ item.name }}/basic.ini" mode: 0664 - loop: "{{ emacsconf_tracks }}" - name: Install OBS scenes + tags: obs-scene template: src: scenes.json - dest: "{{ emacsconf_home }}/.config/obs-studio/basic/scenes/{{ item.id }}.json" - force: no - loop: "{{ emacsconf_tracks }}" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + dest: "~{{ emacsconf_user }}/.config/obs-studio/basic/scenes/{{ item.id }}.json" +- name: Create text files for OBS sources + copy: + content: "Initializing..." + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + dest: "~{{ emacsconf_user }}/{{ item }}.txt" + mode: 0664 + loop: + - news + - url + - bottom - name: Create OBS scripts for tracks template: src: obs-track - dest: "{{ emacsconf_home }}/bin/{{ item.id }}/-obs" + dest: "~{{ emacsconf_user }}/bin/track-obs" owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" mode: 0775 - loop: "{{ emacsconf_tracks }}" + diff --git a/roles/obs/tasks/pulse.yml b/roles/obs/tasks/pulse.yml index 1cb71c5..f9a18f7 100644 --- a/roles/obs/tasks/pulse.yml +++ b/roles/obs/tasks/pulse.yml @@ -1,7 +1,7 @@ - name: Create pulse directory file: state: directory - path: "{{ emacsconf_home }}/.config/pulse/" + path: "~{{ emacsconf_user }}/.config/pulse/" owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" - name: Set up pulse configuration @@ -9,12 +9,12 @@ src: pulse owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" - dest: "{{ emacsconf_home }}/.config/pulse/default.pa" + dest: "~{{ emacsconf_user }}/.config/pulse/default.pa" mode: 0755 - name: Change ownership file: state: directory - path: "{{ emacsconf_home }}/.config/pulse/" + path: "~{{ emacsconf_user }}/.config/pulse/" owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" recurse: true diff --git a/roles/obs/tasks/tigervnc.yml b/roles/obs/tasks/tigervnc.yml index 539b70e..e895bec 100644 --- a/roles/obs/tasks/tigervnc.yml +++ b/roles/obs/tasks/tigervnc.yml @@ -1,36 +1,27 @@ -- name: Add packages - apt: - name: - - tigervnc-standalone-server - - tigervnc-common - name: Create VNC dirs file: - path: /home/{{ emacsconf_user }}/.vnc + path: ~{{ emacsconf_user }}/.vnc state: directory - mode: 0755 owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + mode: 0755 # https://github.com/sdarwin/Ansible-VNC/blob/master/tasks/main.yml - name: Set VNC password - become: "{{ emacsconf_user }}" shell: | set -o pipefail - printf "{{ vnc_password }}\n{{ vnc_password }}\n\n" | vncpasswd /home/{{ emacsconf_user }}/.vnc/passwd + printf "{{ vnc_password }}\n{{ vnc_password }}\n\n" | vncpasswd ~{{ emacsconf_user }}/.vnc/passwd args: - chdir: "/home/{{ emacsconf_user }}/.vnc" - creates: "/home/{{ emacsconf_user }}/.vnc/passwd" + chdir: "~{{ emacsconf_user }}/.vnc" + creates: "~{{ emacsconf_user }}/.vnc/passwd" executable: /bin/bash -- name: Set up xstartup - template: - src: xstartup - dest: ~{{ emacsconf_user }}/.vnc/xstartup - mode: 0700 - name: Set up xstartup for the tracks template: src: xstartup-track - dest: ~{{ emacsconf_user }}/.vnc/xstartup-{{ item.id }} + dest: ~{{ emacsconf_user }}/.vnc/xstartup + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" mode: 0700 - loop: "{{ emacsconf_tracks }}" -- name: Set up xstartup +- name: Set up xresources template: src: xresources dest: ~{{ emacsconf_user }}/.Xresources @@ -40,15 +31,7 @@ - name: Set up VNC scripts template: src: vnc-track - dest: "{{ emacsconf_home }}/bin/{{ item.id }}/-vnc" + dest: "~{{ emacsconf_user }}/bin/track-vnc" mode: 0755 owner: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" - loop: "{{ emacsconf_tracks }}" -- name: Set permissions and ownership - file: - path: "/home/{{ emacsconf_user }}/.vnc" - owner: "{{ emacsconf_user }}" - group: "{{ emacsconf_group }}" - mode: "u+rwX,g-rwx,o-rwx" - recurse: t diff --git a/roles/obs/tasks/track.yml b/roles/obs/tasks/track.yml new file mode 100644 index 0000000..93b789d --- /dev/null +++ b/roles/obs/tasks/track.yml @@ -0,0 +1,83 @@ +- name: Set vars + tags: wip, obs-scene, mpv + set_fact: + old_emacsconf_user: "{{ emacsconf_user }}" + old_emacsconf_home: "{{ emacsconf_home }}" + emacsconf_user: "{{ emacsconf_id }}-{{ item.id }}" + emacsconf_home: "/home/{{ emacsconf_id }}-{{ item.id }}" +- debug: + var: emacsconf_home +- name: Set up user + include: user.yml +- name: Set up user-related things + become: "{{ emacsconf_user }}" + block: + - name: Set up track bins for addition to paths + file: + path: "~{{ emacsconf_user }}/bin/{{ item.id }}" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + state: directory + - name: Set up VNC + include: tigervnc.yml + - name: Create MPV profile directory + file: + path: "~{{ emacsconf_user }}/.config/mpv" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + state: directory + - name: Add MPV profile + template: + src: mpv.conf + dest: "~{{ emacsconf_user }}/.config/mpv/mpv.conf" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + - name: Create mpv scripts for tracks + template: + src: mpv-track + dest: "~{{ emacsconf_user }}/bin/track-mpv" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + mode: 0775 + - name: Set up OBS profiles and scenes + tags: obs-profile + include: obs-setup.yml + - name: Add FFMPEG script for streaming + template: + src: stream-desktop-with-ffmpeg.sh + dest: "~{{ emacsconf_user }}/bin/stream-desktop-with-ffmpeg" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + mode: 0775 + loop: "{{ emacsconf_tracks }}" + - name: Copy logo + copy: + src: logo.png + dest: "~{{ emacsconf_user }}/logo.png" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + # - name: Start jack + # shell: jackd -r -ddummy + # async: 2592000 + - name: Set up pulse + include: pulse.yml + tags: pulse + - name: Set up I3 directory + file: + path: "~{{ emacsconf_user }}/.config/i3" + state: directory + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + - name: Set up I3 + template: + src: i3-config + dest: "~{{ emacsconf_user }}/.config/i3/config" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" +- name: Reset vars + tags: wip, obs-scene, mpv + set_fact: + old_emacsconf_user: "{{ emacsconf_user }}" + old_emacsconf_home: "{{ emacsconf_home }}" + emacsconf_user: "{{ old_emacsconf_user }}" + emacsconf_home: "{{ old_emacsconf_home }}" diff --git a/roles/obs/tasks/user.yml b/roles/obs/tasks/user.yml index c1493dd..a941d7f 100644 --- a/roles/obs/tasks/user.yml +++ b/roles/obs/tasks/user.yml @@ -2,9 +2,11 @@ group: name: "{{ emacsconf_group }}" - name: Add user + tags: wip user: name: "{{ emacsconf_user }}" group: "{{ emacsconf_group }}" + shell: /bin/bash # password: "{{ emacsconf_unix_password }}" - name: Create SSH folder file: @@ -23,3 +25,15 @@ recurse: true owner: "{{ emacsconf_user }}" mode: "u+rwX,g-rwx,o-rwx" +- name: Create bin dir + file: + path: "/home/{{ emacsconf_user }}/bin" + state: directory + owner: "{{ emacsconf_user }}" +- name: Set up bashrc + template: + src: bashrc + dest: "/home/{{ emacsconf_user }}/.bashrc" + owner: "{{ emacsconf_user }}" + group: "{{ emacsconf_group }}" + diff --git a/roles/obs/templates/bashrc b/roles/obs/templates/bashrc new file mode 100644 index 0000000..3677017 --- /dev/null +++ b/roles/obs/templates/bashrc @@ -0,0 +1,116 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# If set, the pattern "**" used in a pathname expansion context will +# match all files and zero or more directories and subdirectories. +#shopt -s globstar + +# make less more friendly for non-text input files, see lesspipe(1) +#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color|*-256color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + #alias grep='grep --color=auto' + #alias fgrep='fgrep --color=auto' + #alias egrep='egrep --color=auto' +fi + +# colored GCC warnings and errors +#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + +# some more ls aliases +#alias ll='ls -l' +#alias la='ls -A' +#alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi + +export PATH=$PATH:$HOME/bin +export DISPLAY=${DISPLAY:-:{{ item.vnc_id }}} diff --git a/roles/obs/templates/global.ini b/roles/obs/templates/global.ini new file mode 100644 index 0000000..c9b058f --- /dev/null +++ b/roles/obs/templates/global.ini @@ -0,0 +1,36 @@ +[Basic] +SceneCollection=dev +SceneCollectionFile=dev +Profile=emacsconf-dev +ProfileDir=Development + +[General] +Pre19Defaults=false +Pre21Defaults=false +Pre23Defaults=false +Pre24.1Defaults=false +FirstRun=true +LastVersion=469762051 + +[BasicWindow] +gridMode=false +geometry=AdnQywADAAAAAAAAAAAAEgAAAn8AAALPAAAAAgAAABIAAAJ9AAACzQAAAAAAAAAABQAAAAACAAAAEgAAAn0AAALN +DockState=AAAA/wAAAAD9AAAAAQAAAAMAAAJ8AAAA4PwBAAAABvsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAAHwAAACgAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAACAAAAAfAAAAKAA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAABAAAAAHwAAADeAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAQAAAYAAAAB8AAAAoAD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAAIAAAAAfAAAAJ4A////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAABIgAAAQQAAAK8AAAAyAAAAnwAAAGoAAAABAAAAAQAAAAIAAAACPwAAAAA +PreviewEnabled=true +AlwaysOnTop=false +SceneDuplicationMode=true +SwapScenesMode=true +EditPropertiesMode=false +PreviewProgramMode=false +DocksLocked=false + +[OBSWebSocket] +FirstLoad=false +ServerEnabled=true +ServerPort={{ item.obs_websocket_port }} +ServerPassword={{ obs_websocket_password }} +AlertsEnabled=false +AuthRequired=true + +[ScriptLogWindow] +geometry=AdnQywADAAAAAAAAAAAAFAAAAlcAAAGjAAAAAAAAABQAAAJXAAABowAAAAAAAAAABQAAAAAAAAAAFAAAAlcAAAGj diff --git a/roles/obs/templates/i3-config b/roles/obs/templates/i3-config index ce22fd3..1787b64 100644 --- a/roles/obs/templates/i3-config +++ b/roles/obs/templates/i3-config @@ -1,3 +1,4 @@ +# {{ ansible_managed }} # i3 config file (v4) # # Please see https://i3wm.org/docs/userguide.html for a complete reference! @@ -189,18 +190,13 @@ bindsym Mod1+r mode "resize" # Start i3bar to display a workspace bar (plus the system information i3status # finds out, if available) -bar { - status_command i3status -} - -####################################################################### -# automatically start i3-config-wizard to offer the user to create a -# keysym-based config which used their favorite modifier (alt or windows) -# -# i3-config-wizard will not launch if there already is a config file -# in ~/.config/i3/config (or $XDG_CONFIG_HOME/i3/config if set) or -# ~/.i3/config. -# -# Please remove the following exec line: -####################################################################### -exec i3-config-wizard +# bar { +# status_command i3status +# } + +# EmacsConf tweaks +# Start with tabbed layout +workspace_layout tabbed +# MPV starts full-screen +for_window [class="mpv"] fullscreen enable +for_window [title=".*mpv"] fullscreen enable diff --git a/roles/obs/templates/mpv-track b/roles/obs/templates/mpv-track index b34df70..ee359f1 100755 --- a/roles/obs/templates/mpv-track +++ b/roles/obs/templates/mpv-track @@ -2,4 +2,4 @@ # Run MPV with the output set to the right sink and with an IPC socket # {{ ansible_managed }} -mpv --input-ipc-server={{ emacsconf_home }}/mpv-socket-{{ emacsconf_id }}-{{ item.id }} --audio-device=pulse/{{ item.id }}-vid --profile={{ emacsconf_id }}-talks $* +DISPLAY="${DISPLAY:-:{{ item.vnc_id }}}" mpv --input-ipc-server={{ emacsconf_home }}/mpv-socket-{{ emacsconf_id }}-{{ item.id }} --audio-device=pulse/{{ item.id }}-vid --profile={{ emacsconf_id }}-talks $* & diff --git a/roles/obs/templates/mpv.conf b/roles/obs/templates/mpv.conf index 5c73681..9aff3ee 100644 --- a/roles/obs/templates/mpv.conf +++ b/roles/obs/templates/mpv.conf @@ -5,9 +5,34 @@ profile={{ emacsconf_id }}-talks # Then you can load it with `--profile={{ emacsconf_id }}-talks` +# This puts the video in the top right so that there's room on the left for the logo and some text [{{ emacsconf_id }}-talks] # Positioning video-zoom=-0.15 +video-align-x=1 +video-align-y=-1 +sub-use-margins=yes +sub-scale-by-window=yes +sub-pos=103 +sub-margin-x=120 +sub-margin-y=40 +sub-align-x=left +# Style +sub-font="{{ emacsconf_font }}" +sub-color="1/0.82/0" +sub-blur=0.2 +sub-scale=0.9 +sub-font-size=40 +sub-border-size=0 +sub-border-color=0/1 +sub-shadow-color=0/1 +sub-shadow-offset=1.2 +sub-ass-force-style=Kerning=yes +sub-ass-line-spacing=0 + +[{{ emacsconf_id }}-old] +# Positioning +video-zoom=-0.15 video-pan-y=-0.055 sub-use-margins=yes sub-scale-by-window=yes @@ -15,7 +40,7 @@ sub-pos=103 sub-margin-x=150 sub-margin-y=40 # Style -sub-font="Clear Sans Bold" +sub-font="{{ emacsconf_font }}" sub-color="1/0.82/0" sub-blur=0.2 sub-scale=0.9 diff --git a/roles/obs/templates/obs-track b/roles/obs/templates/obs-track index 5763d30..3029715 100755 --- a/roles/obs/templates/obs-track +++ b/roles/obs/templates/obs-track @@ -1,3 +1,3 @@ #!/bin/bash # {{ ansible_managed }} -obs --profile "{{ emacsconf_id }}-{{ item.id }}" --collection "{{ item.id }}" -m +obs --profile "{{ emacsconf_id }}-{{ item.id }}" --collection "{{ item.id }}" -m --websocket_port "{{ item.obs_websocket_port }}" --websocket_password "{{ obs_websocket_password }}" diff --git a/roles/obs/templates/scenes.json b/roles/obs/templates/scenes.json index 5e19f16..4e6e4bd 100644 --- a/roles/obs/templates/scenes.json +++ b/roles/obs/templates/scenes.json @@ -2,14 +2,168 @@ "current_program_scene": "All track audio and screen", "current_scene": "All track audio and screen", "current_transition": "Fade", - "groups": [], + "groups": [ + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": { + "libobs.hide_scene_item.Logo": [], + "libobs.hide_scene_item.News": [], + "libobs.hide_scene_item.URL": [], + "libobs.show_scene_item.Logo": [], + "libobs.show_scene_item.News": [], + "libobs.show_scene_item.URL": [] + }, + "id": "group", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "{{ emacsconf_id }} base", + "prev_ver": 469762051, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "custom_size": true, + "cx": 103, + "cy": 507, + "id_counter": 0, + "items": [ + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "hide_transition": { + "duration": 0 + }, + "id": 8, + "locked": false, + "name": "News", + "pos": { + "x": 22, + "y": 390 + }, + "private_settings": {}, + "rot": -90, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "hide_transition": { + "duration": 0 + }, + "id": 7, + "locked": false, + "name": "URL", + "pos": { + "x": 55, + "y": 389 + }, + "private_settings": {}, + "rot": -90, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "hide_transition": { + "duration": 0 + }, + "id": 6, + "locked": false, + "name": "Logo", + "pos": { + "x": 0, + "y": 404 + }, + "private_settings": {}, + "rot": 0, + "scale": { + "x": 0.40234375, + "y": 0.40234375 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + } + ] + }, + "sync": 0, + "versioned_id": "group", + "volume": 1 + } + ], "modules": { "auto-scene-switcher": { "active": false, "interval": 300, - "non_matching_scene": "", - "switch_if_not_matching": false, - "switches": [] + "non_matching_scene": "All track audio and screen", + "switch_if_not_matching": true, + "switches": [ + { + "scene": "Video audio and screen", + "window_title": ".*mpv" + } + ] }, "output-timer": { "autoStartRecordTimer": false, @@ -63,6 +217,95 @@ } ], "sources": [ + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "text_ft2_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "News", + "prev_ver": 469762051, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "font": { + "face": "Sans Serif", + "flags": 0, + "size": 24, + "style": "" + }, + "from_file": true, + "text_file": "/home/{{ emacsconf_id }}-{{ item.id }}/news.txt" + }, + "sync": 0, + "versioned_id": "text_ft2_source_v2", + "volume": 1 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "text_ft2_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "URL", + "prev_ver": 469762051, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "font": { + "face": "Sans Serif", + "flags": 0, + "size": 24, + "style": "" + }, + "from_file": true, + "text_file": "/home/{{ emacsconf_id }}-{{ item.id }}/url.txt" + }, + "sync": 0, + "versioned_id": "text_ft2_source_v2", + "volume": 1 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "image_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Logo", + "prev_ver": 469762051, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "file": "/home/{{ emacsconf_id }}-{{ item.id }}/logo.png" + }, + "sync": 0, + "versioned_id": "image_source", + "volume": 1 + }, { "balance": 0.5, "deinterlace_field_order": 0, @@ -101,12 +344,16 @@ "flags": 0, "hotkeys": { "OBSBasic.SelectScene": [], + "libobs.hide_scene_item.Bottom": [], "libobs.hide_scene_item.Screen Capture (XSHM)": [], - "libobs.hide_scene_item.{{ item.id }}-qa": [], - "libobs.hide_scene_item.{{ item.id }}-vid": [], + "libobs.hide_scene_item.dev-qa": [], + "libobs.hide_scene_item.dev-vid": [], + "libobs.hide_scene_item.emacsconf base": [], + "libobs.show_scene_item.Bottom": [], "libobs.show_scene_item.Screen Capture (XSHM)": [], - "libobs.show_scene_item.{{ item.id }}-qa": [], - "libobs.show_scene_item.{{ item.id }}-vid": [] + "libobs.show_scene_item.dev-qa": [], + "libobs.show_scene_item.dev-vid": [], + "libobs.show_scene_item.emacsconf base": [] }, "id": "scene", "mixers": 0, @@ -121,7 +368,7 @@ "push-to-talk-delay": 0, "settings": { "custom_size": false, - "id_counter": 14, + "id_counter": 22, "items": [ { "align": 5, @@ -145,14 +392,14 @@ "locked": false, "name": "Screen Capture (XSHM)", "pos": { - "x": 0, + "x": 115, "y": 0 }, "private_settings": {}, "rot": 0, "scale": { - "x": 1, - "y": 1 + "x": 0.91015625, + "y": 0.9097222089767456 }, "scale_filter": "disable", "show_transition": { @@ -233,6 +480,191 @@ "duration": 0 }, "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": true, + "hide_transition": { + "duration": 0 + }, + "id": 8, + "locked": false, + "name": "News", + "pos": { + "x": 31, + "y": 595 + }, + "private_settings": {}, + "rot": -90, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": true, + "hide_transition": { + "duration": 0 + }, + "id": 7, + "locked": false, + "name": "URL", + "pos": { + "x": 64, + "y": 594 + }, + "private_settings": {}, + "rot": -90, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": true, + "hide_transition": { + "duration": 0 + }, + "id": 6, + "locked": false, + "name": "Logo", + "pos": { + "x": 9, + "y": 609 + }, + "private_settings": {}, + "rot": 0, + "scale": { + "x": 0.40234375, + "y": 0.40234375 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "hide_transition": { + "duration": 0 + }, + "id": 21, + "locked": false, + "name": "{{ emacsconf_id }} base", + "pos": { + "x": 9, + "y": 205 + }, + "private_settings": {}, + "rot": 0, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "hide_transition": { + "duration": 0 + }, + "id": 22, + "locked": false, + "name": "Bottom", + "pos": { + "x": 112, + "y": 654 + }, + "private_settings": {}, + "rot": 0, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true } ] }, @@ -302,9 +734,11 @@ "hotkeys": { "OBSBasic.SelectScene": [], "libobs.hide_scene_item.Screen Capture (XSHM)": [], - "libobs.hide_scene_item.{{ item.id }}-vid": [], + "libobs.hide_scene_item.dev-vid": [], + "libobs.hide_scene_item.emacsconf base": [], "libobs.show_scene_item.Screen Capture (XSHM)": [], - "libobs.show_scene_item.{{ item.id }}-vid": [] + "libobs.show_scene_item.dev-vid": [], + "libobs.show_scene_item.emacsconf base": [] }, "id": "scene", "mixers": 0, @@ -319,7 +753,7 @@ "push-to-talk-delay": 0, "settings": { "custom_size": false, - "id_counter": 5, + "id_counter": 11, "items": [ { "align": 5, @@ -394,12 +828,192 @@ "duration": 0 }, "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": true, + "hide_transition": { + "duration": 0 + }, + "id": 8, + "locked": false, + "name": "News", + "pos": { + "x": 31, + "y": 580 + }, + "private_settings": {}, + "rot": -90, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": true, + "hide_transition": { + "duration": 0 + }, + "id": 7, + "locked": false, + "name": "URL", + "pos": { + "x": 64, + "y": 579 + }, + "private_settings": {}, + "rot": -90, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": true, + "hide_transition": { + "duration": 0 + }, + "id": 6, + "locked": false, + "name": "Logo", + "pos": { + "x": 9, + "y": 594 + }, + "private_settings": {}, + "rot": 0, + "scale": { + "x": 0.40234375, + "y": 0.40234375 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true + }, + { + "align": 5, + "blend_method": "default", + "blend_type": "normal", + "bounds": { + "x": 0, + "y": 0 + }, + "bounds_align": 0, + "bounds_type": 0, + "crop_bottom": 0, + "crop_left": 0, + "crop_right": 0, + "crop_top": 0, + "group_item_backup": false, + "hide_transition": { + "duration": 0 + }, + "id": 11, + "locked": false, + "name": "{{ emacsconf_id }} base", + "pos": { + "x": 9, + "y": 190 + }, + "private_settings": {}, + "rot": 0, + "scale": { + "x": 1, + "y": 1 + }, + "scale_filter": "disable", + "show_transition": { + "duration": 0 + }, + "visible": true } ] }, "sync": 0, "versioned_id": "scene", "volume": 1 + }, + { + "balance": 0.5, + "deinterlace_field_order": 0, + "deinterlace_mode": 0, + "enabled": true, + "flags": 0, + "hotkeys": {}, + "id": "text_ft2_source", + "mixers": 0, + "monitoring_type": 0, + "muted": false, + "name": "Bottom", + "prev_ver": 469762051, + "private_settings": {}, + "push-to-mute": false, + "push-to-mute-delay": 0, + "push-to-talk": false, + "push-to-talk-delay": 0, + "settings": { + "font": { + "face": "Sans Serif", + "flags": 0, + "size": 28, + "style": "" + }, + "from_file": true, + "text_file": "/home/{{ emacsconf_id }}-{{ item.id }}/bottom.txt" + }, + "sync": 0, + "versioned_id": "text_ft2_source_v2", + "volume": 1 } ], "transition_duration": 300, diff --git a/roles/obs/templates/vnc-track b/roles/obs/templates/vnc-track index b987d8b..99b0ce8 100644 --- a/roles/obs/templates/vnc-track +++ b/roles/obs/templates/vnc-track @@ -1 +1 @@ -vncserver :{{ item.vnc_id }} -geometry {{ res_x }}x{{ res_y }} -useold -xstartup {{ emacsconf_home }}/.vnc/xstartup-{{ item.id }} -desktop {{ emacsconf_id }}-{{ item.id }} \ No newline at end of file +vncserver :{{ item.vnc_id }} -geometry {{ res_x }}x{{ res_y }} -useold -xstartup {{ emacsconf_home }}/.vnc/xstartup -desktop {{ emacsconf_id }}-{{ item.id }} -rfbport {{ item.vnc_port }} \ No newline at end of file diff --git a/roles/obs/templates/xstartup-track b/roles/obs/templates/xstartup-track index 140f836..b80caac 100755 --- a/roles/obs/templates/xstartup-track +++ b/roles/obs/templates/xstartup-track @@ -1,11 +1,13 @@ #!/bin/bash export MPV_SOCKET={{ emacsconf_home }}/{{ item.id }}-mpv-socket export TRACK={{ item.id }} -export PATH="/usr/local/bin:/usr/bin:/bin:{{ emacsconf_home }}/bin/{{ item.id }}" +export PATH="/usr/local/bin:/usr/bin:/bin:{{ emacsconf_home }}/bin" xrdb $HOME/.Xresources pulseaudio --start pacmd set-default-sink {{ item.id }}-qa -firefox file://data/emacsconf/{{ emacsconf_year }}/index-{{ item.id }}.html -P "{{ emacsconf_id }}-{{ item.id }}" & +firefox file:///data/emacsconf/{{ emacsconf_year }}/index-{{ item.id }}.html & +$HOME/bin/track-obs & +termit & # $HOME/{{ item.id }}-obs & # $HOME/{{ item.id }}-mpv $HOME/logo.png & exec i3 diff --git a/roles/publish/defaults/main.yml b/roles/publish/defaults/main.yml new file mode 100644 index 0000000..4de7445 --- /dev/null +++ b/roles/publish/defaults/main.yml @@ -0,0 +1,9 @@ +emacsconf_org_file: "{{ emacsconf_private_dir }}/conf.org" +emacsconf_publishing_phase: schedule +emacsconf_el_dir: ~{{ emacsconf_user }}/emacsconf-el +emacsconf_edit_wiki_dir: ~{{ emacsconf_user }}/emacsconf-wiki +emacsconf_private_dir: ~{{ emacsconf_user }}/emacsconf-2022-private +emacs_config_dir: ~{{ emacsconf_user }}/.emacs.d +emacs_version: 28.2 +emacs_build_parent: /usr/src/emacs +emacs_build_dir: "{{ emacs_build_parent }}/emacs-{{ emacs_version }}" diff --git a/roles/publish/tasks/emacs.yml b/roles/publish/tasks/emacs.yml new file mode 100644 index 0000000..8d75979 --- /dev/null +++ b/roles/publish/tasks/emacs.yml @@ -0,0 +1,38 @@ +- name: Install dependencies + apt: + name: + - build-essential + - libncurses5-dev + - git + - gnutls-bin + - pkg-config + - libjansson-dev + - libgnutls28-dev + - automake + - texinfo + state: present +- name: Create directory + file: + path: "{{ emacs_build_parent }}" + state: directory +- name: Download Emacs + unarchive: + src: https://ftp.gnu.org/gnu/emacs/emacs-{{emacs_version}}.tar.gz + remote_src: yes + dest: "{{ emacs_build_parent }}" + creates: "{{ emacs_build_dir }}" +- name: Configure + command: ./configure --with-x-toolkit=no + args: + chdir: "{{ emacs_build_dir }}" + creates: '{{ emacs_build_dir }}/Makefile' +- name: Build + command: make -j{{ cpus }} + args: + chdir: "{{ emacs_build_dir }}" + creates: '{{ emacs_build_dir }}/src/emacs' +- name: Install + command: make install + args: + chdir: "{{ emacs_build_dir }}" + creates: '/usr/local/bin/emacs' diff --git a/roles/publish/tasks/main.yml b/roles/publish/tasks/main.yml new file mode 100644 index 0000000..28566a5 --- /dev/null +++ b/roles/publish/tasks/main.yml @@ -0,0 +1,94 @@ +--- +- name: Set up SSH directory + ansible.builtin.file: + path: "/home/{{ emacsconf_user }}/.ssh" + state: directory + mode: '0700' +- name: Install SSH key for EmacsConf wiki + ansible.builtin.get_url: + url: https://emacsconf.org/id_rsa_anon_git_emacsconf + dest: "/home/{{ emacsconf_user }}/.ssh/id_rsa_anon_git_emacsconf" + mode: '0600' +- name: Install the SSH key for orga + template: + src: id_rsa + dest: "/home/{{ emacsconf_user }}/.ssh/id_rsa" + mode: '0600' +- name: Change ownership of SSH directory + file: + path: "/home/{{ emacsconf_user }}/.ssh" + recurse: true + owner: "{{ emacsconf_user }}" + +- name: Set up Emacs + include: emacs.yml +- name: Ensure configuration directory exists + file: + path: "{{ emacs_config_dir }}" + state: directory +- name: Set up Emacs configuration for non-interactive publishing + template: + src: emacsconf-config.el + dest: "{{ emacs_config_dir }}/emacsconf-config.el" + +- name: Check if Emacs base configuration already exists + become: true + lineinfile: + dest: "{{ emacs_config_dir }}/init.el" + state: present + regexp: "emacsconf-config" + line: "(load-file \"emacsconf-config.el\")" + create: yes +- name: Set up or update repositories + become: false + tags: publish + block: + - name: Check out wiki repository + ansible.builtin.git: + repo: git://git.emacsconf.org/emacsconf-wiki + dest: "{{ emacsconf_edit_wiki_dir }}" + register: wiki_clone + failed_when: + - wiki_clone.failed + - not 'Local modifications exist in repository' in wiki_clone.msg + - not 'Failed to checkout branch' in wiki_clone.msg + - name: Check out emacsconf-el + ansible.builtin.git: + repo: git@git.emacsconf.org:pub/emacsconf-el + dest: "{{ emacsconf_el_dir }}" + register: elisp + failed_when: + - elisp.failed + - not 'Local modifications exist in repository' in elisp.msg + - not 'Failed to checkout branch' in elisp.msg + - name: Check out emacsconf-2022-private + ansible.builtin.git: + repo: git@git.emacsconf.org:emacsconf-2022-private + dest: "{{ emacsconf_private_dir }}" + register: private + failed_when: + - private.failed + - not 'Local modifications exist in repository' in private.msg + - not 'Failed to checkout branch' in private.msg +- name: Change ownership + file: + path: "{{ item }}" + owner: "{{ emacsconf_user }}" + recurse: true + with_items: + - "{{ emacsconf_config_dir }}" + - "{{ emacsconf_el_dir }}" + - "{{ emacsconf_private_dir }}" + - "{{ emacsconf_edit_wiki_dir }}" +- name: Publish + tags: publish + block: + - name: Publish the schedule + command: emacs -l "{{ emacsconf_config_dir }}/emacsconf-config.el" --batch --exec '(emacsconf-generate-main-schedule)' + when: (force_publish|d(false)) or ((private.changed or elisp.changed) and slug is not defined) + - name: Update a specific talk's nav page + tags: publish-talk + command: emacs -l "{{ emacsconf_config_dir }}/emacsconf-config.el" --batch --exec '(emacsconf-with-talk-heading "{{ slug }}" (emacsconf-update-talk))' + when: slug is defined + - name: Commit the wiki and push + shell: cd {{ emacsconf_edit_wiki_dir }}; git commit -m 'Update from ansible' -a; git push diff --git a/roles/publish/templates/emacsconf-config.el b/roles/publish/templates/emacsconf-config.el new file mode 100644 index 0000000..cfb554e --- /dev/null +++ b/roles/publish/templates/emacsconf-config.el @@ -0,0 +1,21 @@ +;; {{ ansible_managed }} + +(add-to-list 'load-path "{{ emacsconf_el_dir }}") +(require 'emacsconf) +(require 'emacsconf-publish) +(require 'emacsconf-schedule) +(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (shell . t))) +(setq emacsconf-year "{{ emacsconf_year }}") +(setq emacsconf-org-file "{{ emacsconf_org_file }}") +(setq emacsconf-directory "{{ emacsconf_edit_wiki_dir }}") +{% if emacsconf_streaming_nick is defined %} +(setq emacsconf-streaming-nick "{{ emacsconf_streaming_nick }}") +{% endif %} +{% if emacsconf_org_tag is defined %} +(setq emacsconf-org-tag "{{ emacsconf_org_tag }}") +{% endif %} +{% if emacsconf_ansible_directory is defined %} +(setq emacsconf-ansible-directory "{{ emacsconf_ansible_directory }}") +{% endif %} +(setq emacsconf-pad-api-key "{{ etherpad_api_key }}") +(setq emacsconf-publishing-phase '{{ emacsconf_publishing_phase }}) diff --git a/roles/stream/defaults/main.yml b/roles/stream/defaults/main.yml index 5ce637e..f013dba 100644 --- a/roles/stream/defaults/main.yml +++ b/roles/stream/defaults/main.yml @@ -4,3 +4,4 @@ icecast_lowres_scale: "854:480" icecast_user: icecast2 icecast_group: icecast icecast_restream_dir: /etc/icecast2/restream +icecast_save_dump: false diff --git a/roles/stream/templates/icecast.xml b/roles/stream/templates/icecast.xml index e09e6a0..f9c3916 100644 --- a/roles/stream/templates/icecast.xml +++ b/roles/stream/templates/icecast.xml @@ -192,7 +192,7 @@ /emacsconf/{{ track.id }}.webm {{ icecast_emacsconf_user }} {{ icecast_emacsconf_password }} - /data/{{ emacsconf_id }}-{{ emacsconf_year }}-{{ track.id }}_%Y-%m-%d_%H-%M-%S.webm + {% if icecast_save_dump %}/data/{{ emacsconf_id }}-{{ emacsconf_year }}-{{ track.id }}_%Y-%m-%d_%H-%M-%S.webm{% endif %} {{ emacsconf_name }} {{ emacsconf_year }} - {{ track.name }} track The livestream for the {{ track.name }} track of {{ emacsconf_name }} {{ emacsconf_year }} {{ track.watch }} diff --git a/roles/wiki-edit/defaults/main.yml b/roles/wiki-edit/defaults/main.yml deleted file mode 100644 index ea0fbdb..0000000 --- a/roles/wiki-edit/defaults/main.yml +++ /dev/null @@ -1,7 +0,0 @@ -emacsconf_edit_packages: - - consult - - embark - - embark-consult - - vertico - - magit - - modus-themes diff --git a/roles/wiki-edit/tasks/main.yaml b/roles/wiki-edit/tasks/main.yaml deleted file mode 100644 index f77535f..0000000 --- a/roles/wiki-edit/tasks/main.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Set up Emacs configuration for interactive editing - template: - src: emacsconf-edit.el - dest: "{{ emacs_config_dir }}/emacsconf-edit.el" -- name: Check if Emacs base configuration already exists - lineinfile: - dest: "{{ emacs_config_dir }}/init.el" - state: present - regexp: "emacsconf-edit" - line: "(load-file \"emacsconf-edit.el\")" diff --git a/roles/wiki-edit/templates/emacsconf-edit.el b/roles/wiki-edit/templates/emacsconf-edit.el deleted file mode 100644 index 2e360c7..0000000 --- a/roles/wiki-edit/templates/emacsconf-edit.el +++ /dev/null @@ -1,34 +0,0 @@ -;; {{ ansible_managed }} - -(let ((packages '({% for package in emacsconf_edit_packages %}{{ package }}{% endfor %}))) - (mapc (lambda (package) (unless (package-installed-p package) (package-install package))) packages)) -;; Configuration -(vertico-mode) -(show-paren-mode) -(fset 'yes-or-no-p 'y-or-n-p) -(global-set-key (kbd "C-x g") 'magit-status) -(global-set-key (kbd "C-x b") 'consult-buffer) -(global-set-key (kbd "M-g t") 'emacsconf-go-to-talk) -(global-set-key (kbd "C-.") 'embark-act) -(global-set-key (kbd "C-c .") 'embark-act) -(global-set-key (kbd "C-;") 'embark-act) -(modus-themes-load-vivendi) -(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (shell . t))) -(setq backup-directory-alist '(("." . "~/.emacs.d/backups"))) -(find-file "{{ emacsconf_private_dir }}/conf.org") -(split-window-horizontally) -(magit-status "{{ emacsconf_edit_wiki_dir }}") -(global-auto-revert-mode 1) -(define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map) -(projectile-mode +1) -(setq projectile-completion-system 'default) -(setq projectile-enable-caching t) -(setq projectile-indexing-method 'alien) -(add-to-list 'projectile-globally-ignored-files "node_modules") -(add-to-list 'projectile-globally-ignored-files ".cache") -(add-to-list 'projectile-globally-ignored-files "_cache") - -(setq completion-styles '(orderless)) -(setq completion-category-defaults nil) -(setq completion-category-overrides '((file (styles orderless)))) -(require 'ox-md) diff --git a/roles/wiki-publish/defaults/main.yml b/roles/wiki-publish/defaults/main.yml deleted file mode 100644 index 4de7445..0000000 --- a/roles/wiki-publish/defaults/main.yml +++ /dev/null @@ -1,9 +0,0 @@ -emacsconf_org_file: "{{ emacsconf_private_dir }}/conf.org" -emacsconf_publishing_phase: schedule -emacsconf_el_dir: ~{{ emacsconf_user }}/emacsconf-el -emacsconf_edit_wiki_dir: ~{{ emacsconf_user }}/emacsconf-wiki -emacsconf_private_dir: ~{{ emacsconf_user }}/emacsconf-2022-private -emacs_config_dir: ~{{ emacsconf_user }}/.emacs.d -emacs_version: 28.2 -emacs_build_parent: /usr/src/emacs -emacs_build_dir: "{{ emacs_build_parent }}/emacs-{{ emacs_version }}" diff --git a/roles/wiki-publish/tasks/emacs.yml b/roles/wiki-publish/tasks/emacs.yml deleted file mode 100644 index 8d75979..0000000 --- a/roles/wiki-publish/tasks/emacs.yml +++ /dev/null @@ -1,38 +0,0 @@ -- name: Install dependencies - apt: - name: - - build-essential - - libncurses5-dev - - git - - gnutls-bin - - pkg-config - - libjansson-dev - - libgnutls28-dev - - automake - - texinfo - state: present -- name: Create directory - file: - path: "{{ emacs_build_parent }}" - state: directory -- name: Download Emacs - unarchive: - src: https://ftp.gnu.org/gnu/emacs/emacs-{{emacs_version}}.tar.gz - remote_src: yes - dest: "{{ emacs_build_parent }}" - creates: "{{ emacs_build_dir }}" -- name: Configure - command: ./configure --with-x-toolkit=no - args: - chdir: "{{ emacs_build_dir }}" - creates: '{{ emacs_build_dir }}/Makefile' -- name: Build - command: make -j{{ cpus }} - args: - chdir: "{{ emacs_build_dir }}" - creates: '{{ emacs_build_dir }}/src/emacs' -- name: Install - command: make install - args: - chdir: "{{ emacs_build_dir }}" - creates: '/usr/local/bin/emacs' diff --git a/roles/wiki-publish/tasks/main.yml b/roles/wiki-publish/tasks/main.yml deleted file mode 100644 index 28566a5..0000000 --- a/roles/wiki-publish/tasks/main.yml +++ /dev/null @@ -1,94 +0,0 @@ ---- -- name: Set up SSH directory - ansible.builtin.file: - path: "/home/{{ emacsconf_user }}/.ssh" - state: directory - mode: '0700' -- name: Install SSH key for EmacsConf wiki - ansible.builtin.get_url: - url: https://emacsconf.org/id_rsa_anon_git_emacsconf - dest: "/home/{{ emacsconf_user }}/.ssh/id_rsa_anon_git_emacsconf" - mode: '0600' -- name: Install the SSH key for orga - template: - src: id_rsa - dest: "/home/{{ emacsconf_user }}/.ssh/id_rsa" - mode: '0600' -- name: Change ownership of SSH directory - file: - path: "/home/{{ emacsconf_user }}/.ssh" - recurse: true - owner: "{{ emacsconf_user }}" - -- name: Set up Emacs - include: emacs.yml -- name: Ensure configuration directory exists - file: - path: "{{ emacs_config_dir }}" - state: directory -- name: Set up Emacs configuration for non-interactive publishing - template: - src: emacsconf-config.el - dest: "{{ emacs_config_dir }}/emacsconf-config.el" - -- name: Check if Emacs base configuration already exists - become: true - lineinfile: - dest: "{{ emacs_config_dir }}/init.el" - state: present - regexp: "emacsconf-config" - line: "(load-file \"emacsconf-config.el\")" - create: yes -- name: Set up or update repositories - become: false - tags: publish - block: - - name: Check out wiki repository - ansible.builtin.git: - repo: git://git.emacsconf.org/emacsconf-wiki - dest: "{{ emacsconf_edit_wiki_dir }}" - register: wiki_clone - failed_when: - - wiki_clone.failed - - not 'Local modifications exist in repository' in wiki_clone.msg - - not 'Failed to checkout branch' in wiki_clone.msg - - name: Check out emacsconf-el - ansible.builtin.git: - repo: git@git.emacsconf.org:pub/emacsconf-el - dest: "{{ emacsconf_el_dir }}" - register: elisp - failed_when: - - elisp.failed - - not 'Local modifications exist in repository' in elisp.msg - - not 'Failed to checkout branch' in elisp.msg - - name: Check out emacsconf-2022-private - ansible.builtin.git: - repo: git@git.emacsconf.org:emacsconf-2022-private - dest: "{{ emacsconf_private_dir }}" - register: private - failed_when: - - private.failed - - not 'Local modifications exist in repository' in private.msg - - not 'Failed to checkout branch' in private.msg -- name: Change ownership - file: - path: "{{ item }}" - owner: "{{ emacsconf_user }}" - recurse: true - with_items: - - "{{ emacsconf_config_dir }}" - - "{{ emacsconf_el_dir }}" - - "{{ emacsconf_private_dir }}" - - "{{ emacsconf_edit_wiki_dir }}" -- name: Publish - tags: publish - block: - - name: Publish the schedule - command: emacs -l "{{ emacsconf_config_dir }}/emacsconf-config.el" --batch --exec '(emacsconf-generate-main-schedule)' - when: (force_publish|d(false)) or ((private.changed or elisp.changed) and slug is not defined) - - name: Update a specific talk's nav page - tags: publish-talk - command: emacs -l "{{ emacsconf_config_dir }}/emacsconf-config.el" --batch --exec '(emacsconf-with-talk-heading "{{ slug }}" (emacsconf-update-talk))' - when: slug is defined - - name: Commit the wiki and push - shell: cd {{ emacsconf_edit_wiki_dir }}; git commit -m 'Update from ansible' -a; git push diff --git a/roles/wiki-publish/templates/emacsconf-config.el b/roles/wiki-publish/templates/emacsconf-config.el deleted file mode 100644 index cfb554e..0000000 --- a/roles/wiki-publish/templates/emacsconf-config.el +++ /dev/null @@ -1,21 +0,0 @@ -;; {{ ansible_managed }} - -(add-to-list 'load-path "{{ emacsconf_el_dir }}") -(require 'emacsconf) -(require 'emacsconf-publish) -(require 'emacsconf-schedule) -(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (shell . t))) -(setq emacsconf-year "{{ emacsconf_year }}") -(setq emacsconf-org-file "{{ emacsconf_org_file }}") -(setq emacsconf-directory "{{ emacsconf_edit_wiki_dir }}") -{% if emacsconf_streaming_nick is defined %} -(setq emacsconf-streaming-nick "{{ emacsconf_streaming_nick }}") -{% endif %} -{% if emacsconf_org_tag is defined %} -(setq emacsconf-org-tag "{{ emacsconf_org_tag }}") -{% endif %} -{% if emacsconf_ansible_directory is defined %} -(setq emacsconf-ansible-directory "{{ emacsconf_ansible_directory }}") -{% endif %} -(setq emacsconf-pad-api-key "{{ etherpad_api_key }}") -(setq emacsconf-publishing-phase '{{ emacsconf_publishing_phase }}) -- cgit v1.2.3