diff options
Diffstat (limited to 'roles')
26 files changed, 112 insertions, 258 deletions
diff --git a/roles/base/vars/main.yml b/roles/base/vars/main.yml index 927d641..2a01fbf 100644 --- a/roles/base/vars/main.yml +++ b/roles/base/vars/main.yml @@ -42,7 +42,55 @@ init_users: state: present shell: /bin/bash create_home: true - + jman: + name: jman + group: jman + groups: org-admin + state: present + shell: /bin/bash + create_home: true + corwin: + name: corwin + group: corwin + groups: org-admin + state: present + shell: /bin/bash + create_home: true + orga: + name: orga + group: orga + groups: org-admin + state: present + shell: /bin/bash + create_home: true + bremner: + name: bremner + group: bremner + groups: org-admin + state: present + shell: /bin/bash + create_home: true + dto: + name: bremner + group: bremner + groups: org-admin + state: present + shell: /bin/bash + create_home: true + vk: + name: bremner + group: bremner + groups: org-admin + state: present + shell: /bin/bash + create_home: true + bhavin192: + name: bhavin192 + group: bhavin192 + groups: org-admin + state: present + shell: /bin/bash + create_home: true sudoers_files: - sudoers.d/10_ansible - sudoers.d/20_org_admin diff --git a/roles/caption/tasks/main.yml b/roles/caption/tasks/main.yml index df35645..b34a67d 100644 --- a/roles/caption/tasks/main.yml +++ b/roles/caption/tasks/main.yml @@ -46,15 +46,15 @@ src: talks.json dest: "{{ emacsconf_caption_dir }}/talks.json" mode: 0664 -- name: Install init.d configuration - tags: system - become: true - template: - src: captions.init.d - dest: /etc/init.d/captions - owner: root - group: root - mode: 0755 +# - name: Install init.d configuration +# tags: system +# become: true +# template: +# src: captions.init.d +# dest: /etc/init.d/captions +# owner: root +# group: root +# mode: 0755 - name: Change the group for all the files file: dest: "{{ emacsconf_caption_dir }}" diff --git a/roles/caption/templates/process-captions.py b/roles/caption/templates/process-captions.py index 9b345fe..dc7ef29 100755 --- a/roles/caption/templates/process-captions.py +++ b/roles/caption/templates/process-captions.py @@ -114,7 +114,7 @@ def extract_audio(work): log("Extracting audio from %s acodec %s" % (work['video'], acodec)) output = subprocess.check_output(['ffmpeg', '-y', '-i', work['video'], '-acodec', acodec, '-vn', new_file], stderr=subprocess.STDOUT) work['audio'] = new_file - subprocess.call(["/data/emacsconf/2022/scripts/upload.sh", work['audio']]) + subprocess.call(["/data/emacsconf/{{ emacsconf_year }}/scripts/upload.sh", work['audio']]) return work def to_sec(time_str): @@ -149,7 +149,7 @@ def generate_captions(work): whisper.utils.write_txt(result['segments'], file=txt) work['vtt'] = new_file work['txt'] = work['base'] + '.txt' - subprocess.call(["/data/emacsconf/2022/scripts/upload.sh", work['vtt'], work['txt']]) + subprocess.call(["/data/emacsconf/{{ emacsconf_year }}/scripts/upload.sh", work['vtt'], work['txt']]) if 'srv2' in work: del work['srv2'] return work diff --git a/roles/media/defaults/main.yml b/roles/media/defaults/main.yml index 3cdf81c..2ecd784 100644 --- a/roles/media/defaults/main.yml +++ b/roles/media/defaults/main.yml @@ -1,2 +1,2 @@ -media_protect_root: false media_server_name: media.emacsconf.org + diff --git a/roles/media/tasks/main.yml b/roles/media/tasks/main.yml index f49bcd2..6eb3ab6 100644 --- a/roles/media/tasks/main.yml +++ b/roles/media/tasks/main.yml @@ -1,6 +1,3 @@ -- name: Set media_protect_root - set_fact: - media_protect_root: not test_mode - name: Install package for setting htpasswd package: name: python3-passlib diff --git a/roles/media/templates/nginx-include b/roles/media/templates/nginx-include index 922bebb..03a7bfa 100644 --- a/roles/media/templates/nginx-include +++ b/roles/media/templates/nginx-include @@ -8,11 +8,16 @@ rewrite ^/{{ emacsconf_year }}/backstage/current/room/([^/]*)$ https://{{ media_ rewrite ^/{{ emacsconf_year }}/backstage/current/([^/]*)/pad/?$ https://{{ etherpad_server_name }}/{{ emacsconf_year }}-$1 redirect; rewrite ^/{{ emacsconf_year }}/backstage/current/([^/]*)/room/?$ https://{{ media_server_name }}/{{ emacsconf_year }}/backstage/assets/redirects/open/bbb-$1.html redirect; } - {% if media_protect_root %} + {% if media_protect_root|bool %} location /{{ emacsconf_year }} { - auth_basic "Restricted"; - auth_basic_user_file /etc/nginx/sites-available/{{ host_name }}-{{ emacsconf_year }}-htpasswd; + # TODO: Figure out how to make this properly controlled by the variable + # auth_basic "Restricted"; + # auth_basic_user_file /etc/nginx/sites-available/{{ host_name }}-{{ emacsconf_year }}-htpasswd; autoindex on; + } + {% else %} + location /{{ emacsconf_year }} { + autoindex on; } {% endif %} location /{{ emacsconf_year }}/{{ emacsconf_id }}.ics { diff --git a/roles/obs/overlay.svg b/roles/obs/overlay.svg index b3314f6..09f6c83 100644 --- a/roles/obs/overlay.svg +++ b/roles/obs/overlay.svg @@ -5,7 +5,7 @@ viewBox="0 0 338.66667 190.5" version="1.1" id="svg2360" - inkscape:version="1.2 (1:1.2.1+202207142221+cd75a1ee6d)" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" sodipodi:docname="overlay.svg" xml:space="preserve" inkscape:export-filename="video.svg" @@ -28,13 +28,13 @@ inkscape:pageshadow="2" inkscape:zoom="0.62998576" inkscape:cx="129.368" - inkscape:cy="373.81797" + inkscape:cy="391.27869" inkscape:document-units="in" inkscape:current-layer="layer1" inkscape:document-rotation="0" showgrid="false" units="in" - inkscape:window-width="699" + inkscape:window-width="824" inkscape:window-height="709" inkscape:window-x="667" inkscape:window-y="0" @@ -48,220 +48,13 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"><image - width="28.984987" - height="28.984987" + width="15.411261" + height="15.411261" preserveAspectRatio="none" - xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC -AK7OHOkAAAMAUExURUxpcVhRpFhSpohOtnVRsZdMun1Qs1lVqZxMvHpQsoFPtJJNuWlTrVlUp3dQ -sYRPtWZUrHNRsHFSr1tVqV5VqmJUq3tXtW5Rrm1SrlxSp1lSpW1SrGJTq2BRp29Tr2pQq4ViuVtS -pVlRol1Spl5TqnJPrVlUqFxSp3ZPrmdSrFpTpnNRr2dPppaRxFxTqXtOr3BRrnJRr1pSpoFOsKFK -vJNLtXFrtYllu15Qo3pPr4dMsqxKwMvI469Jwbat2HJRrqpKv3p1uurp85VLto6HxKtKv9vZ68rI -44ZMsqxKv8vI5O3r9WZgr/Hr941OtdfW6/Px+Kuo093b0dHEzf///1lQn1lQoFpQn1pQoFpRn11Q -oahKvrNJwcBIxZ9LvadKvrVIwo9Nt2BPo6JLvaRLvmdPpYtNtrxIxK5JwFhQomRPpKpKv1tQoL5H -xLpIw8JMxLhIw8dXw2xPp3BOqcRQxF5TocVUw8phwclewtFxv9uMvFpPoNeAvXVOqv7+/9mGvN2R -u+ist89swMhbwvf2+lhPoKxKv3hOrMxlwYJNr+OfueWluN+WutV8vvr5/P38/uqxt21ZpP7lsHlx -sodMsuGbus1owZNLtrFJwWRWonFprfLx+H1NrvDBtKeizWVcpey2turn82BXo51Lue27tdN4vtJ1 -v5uWxvPItNPR5u/s9mpiqfvdsdrY6nNipL252rSv1JhMt+Xi8PfUspCKv+Dd7qCbyYuFvK2p0c/M -48PA3Xxnpa5cuoZzpfXOs353tY1Yr35Vq4Z/uri115Ntq4NdqoplqnhYqIJ8uMjF4Kdps7ZruJON -wdzO6aaczLtav5disJR9p6mIzKN/rMGMs8uVtMem2550radsxZ9Xt/bksMV3urGTrOzgsLKEsJdX -uLx6tr+irsy44LdQwaBis5t7xLSh1LJytbqZrZyOp6pRu9zBrs2isdbD5ruU1L51zs6Autmq4siF -t960tODbsN+otdems/np6OC55ePJru7S6cy0seizy9aX1od9r/ziv2qV4xcAAABldFJOUwD+/v7+ -/v79/v7+/v3+/v7+/v39/v0MEv607CBP/v3+BdX34mD+eZDsLci29v08atp+n9ZUOf7+9Zemic+y -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 -" + xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC AK7OHOkAAAMAUExURUxpcVhRpFhSpohOtnVRsZdMun1Qs1lVqZxMvHpQsoFPtJJNuWlTrVlUp3dQ sYRPtWZUrHNRsHFSr1tVqV5VqmJUq3tXtW5Rrm1SrlxSp1lSpW1SrGJTq2BRp29Tr2pQq4ViuVtS pVlRol1Spl5TqnJPrVlUqFxSp3ZPrmdSrFpTpnNRr2dPppaRxFxTqXtOr3BRrnJRr1pSpoFOsKFK vJNLtXFrtYllu15Qo3pPr4dMsqxKwMvI469Jwbat2HJRrqpKv3p1uurp85VLto6HxKtKv9vZ68rI 44ZMsqxKv8vI5O3r9WZgr/Hr941OtdfW6/Px+Kuo093b0dHEzf///1lQn1lQoFpQn1pQoFpRn11Q oahKvrNJwcBIxZ9LvadKvrVIwo9Nt2BPo6JLvaRLvmdPpYtNtrxIxK5JwFhQomRPpKpKv1tQoL5H xLpIw8JMxLhIw8dXw2xPp3BOqcRQxF5TocVUw8phwclewtFxv9uMvFpPoNeAvXVOqv7+/9mGvN2R u+ist89swMhbwvf2+lhPoKxKv3hOrMxlwYJNr+OfueWluN+WutV8vvr5/P38/uqxt21ZpP7lsHlx sodMsuGbus1owZNLtrFJwWRWonFprfLx+H1NrvDBtKeizWVcpey2turn82BXo51Lue27tdN4vtJ1 v5uWxvPItNPR5u/s9mpiqfvdsdrY6nNipL252rSv1JhMt+Xi8PfUspCKv+Dd7qCbyYuFvK2p0c/M 48PA3Xxnpa5cuoZzpfXOs353tY1Yr35Vq4Z/uri115Ntq4NdqoplqnhYqIJ8uMjF4Kdps7ZruJON wdzO6aaczLtav5disJR9p6mIzKN/rMGMs8uVtMem2550radsxZ9Xt/bksMV3urGTrOzgsLKEsJdX uLx6tr+irsy44LdQwaBis5t7xLSh1LJytbqZrZyOp6pRu9zBrs2isdbD5ruU1L51zs6Autmq4siF t960tODbsN+otdems/np6OC55ePJru7S6cy0seizy9aX1od9r/ziv2qV4xcAAABldFJOUwD+/v7+ /v79/v7+/v3+/v7+/v39/v0MEv607CBP/v3+BdX34mD+eZDsLci29v08atp+n9ZUOf7+9Zemic+y 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 " id="image234" - x="2.9323115" - y="161.16402" + x="18.075499" + y="174.7963" style="stroke-width:2.33685" /><text xml:space="preserve" style="font-size:5.64444px;line-height:70%;font-family:AbcCursiveDottedLined;-inkscape-font-specification:AbcCursiveDottedLined;text-decoration:none;text-decoration-line:none;text-decoration-color:#000000;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-rule:evenodd;stroke-width:2.8448;stop-color:#000000" diff --git a/roles/obs/tasks/main.yml b/roles/obs/tasks/main.yml index 806e9f2..946d1d7 100644 --- a/roles/obs/tasks/main.yml +++ b/roles/obs/tasks/main.yml @@ -91,3 +91,4 @@ - play-with-intro - intro - bbb + - pad diff --git a/roles/obs/templates/bbb b/roles/obs/templates/bbb index 74c6976..240a122 100755 --- a/roles/obs/templates/bbb +++ b/roles/obs/templates/bbb @@ -1,5 +1,5 @@ #!/bin/bash -# Play intro (or display in-between slide and wait for input), then play files +# Open the Big Blue Button room using the backstage link # {{ ansible_managed }} # Kill the background music if playing @@ -10,5 +10,4 @@ fi # Update the overlay SLUG=$1 overlay $SLUG -# Play the video firefox https://media.emacsconf.org/{{ emacsconf_year }}/backstage/current/room/$SLUG diff --git a/roles/obs/templates/intro b/roles/obs/templates/intro index 85ee895..7b5d4ab 100755 --- a/roles/obs/templates/intro +++ b/roles/obs/templates/intro @@ -5,17 +5,19 @@ if screen -list | grep -q background; then screen -S background -X quit fi # Update the overlay +SLUG=$1 FILE=$1 if [[ ! -f $FILE ]]; then - LIST=(/data/emacsconf/assets/stream/emacsconf-2022-$FILE*.webm) + LIST=(/data/emacsconf/assets/stream/emacsconf-{{ emacsconf_year }}-$FILE--*.webm) FILE="${LIST[0]}" BY_SLUG=1 +else + SLUG=$(echo "$FILE" | perl -ne 'if (/emacsconf-[0-9]*-(.*?)--/) { print $1; } else { print; }') fi shift -SLUG=$(echo "$FILE" | perl -ne 'if (/emacsconf-[0-9]*-(.*?)--/) { print $1; } else { print; }') overlay $SLUG if [[ -f /data/emacsconf/assets/intros/$SLUG.webm ]]; then mpv /data/emacsconf/assets/intros/$SLUG.webm else firefox /data/emacsconf/assets/in-between/$SLUG.png -fi
\ No newline at end of file +fi diff --git a/roles/obs/templates/mpv-track b/roles/obs/templates/mpv-track index 87849e1..a7f3c62 100755 --- a/roles/obs/templates/mpv-track +++ b/roles/obs/templates/mpv-track @@ -10,7 +10,7 @@ fi # Update the overlay FILE=$1 if [[ ! -f $FILE ]]; then - LIST=(/data/emacsconf/assets/stream/emacsconf-2022-$FILE*.webm) + LIST=(/data/emacsconf/assets/stream/emacsconf-{{ emacsconf_year }}-$FILE*.webm) FILE="${LIST[0]}" BY_SLUG=1 fi diff --git a/roles/obs/templates/mpv.conf b/roles/obs/templates/mpv.conf index f529ff3..b9efaae 100644 --- a/roles/obs/templates/mpv.conf +++ b/roles/obs/templates/mpv.conf @@ -12,7 +12,7 @@ video-align-y=-1 sub-use-margins=yes sub-scale-by-window=yes sub-pos=103 -sub-margin-x=110 +sub-margin-x=104 sub-margin-y=60 sub-align-x=left # Style diff --git a/roles/obs/templates/pad b/roles/obs/templates/pad new file mode 100755 index 0000000..e9953a1 --- /dev/null +++ b/roles/obs/templates/pad @@ -0,0 +1,8 @@ +#!/bin/bash +# Display the Etherpad collaborative document +# {{ ansible_managed }} + +# Update the overlay +SLUG=$1 +overlay $SLUG +firefox https://pad.emacsconf.org/{{ emacsconf_year }}-$SLUG diff --git a/roles/obs/templates/play b/roles/obs/templates/play index 277a49e..4f437a8 100755 --- a/roles/obs/templates/play +++ b/roles/obs/templates/play @@ -10,7 +10,7 @@ fi # Update the overlay FILE=$1 if [[ ! -f $FILE ]]; then - LIST=(/data/emacsconf/assets/stream/emacsconf-2022-$FILE*.webm) + LIST=(/data/emacsconf/assets/stream/emacsconf-{{ emacsconf_year }}-$FILE*--main.webm) FILE="${LIST[0]}" BY_SLUG=1 fi diff --git a/roles/obs/templates/play-with-intro b/roles/obs/templates/play-with-intro index 4f928c3..75ce10d 100755 --- a/roles/obs/templates/play-with-intro +++ b/roles/obs/templates/play-with-intro @@ -10,7 +10,7 @@ fi # Update the overlay FILE=$1 if [[ ! -f $FILE ]]; then - LIST=(/data/emacsconf/assets/stream/emacsconf-2022-$FILE*.webm) + LIST=(/data/emacsconf/assets/stream/emacsconf-{{ emacsconf_year }}-$FILE*.webm) FILE="${LIST[0]}" BY_SLUG=1 fi diff --git a/roles/obs/templates/set-overlay b/roles/obs/templates/set-overlay index cc2e26f..212df71 100644 --- a/roles/obs/templates/set-overlay +++ b/roles/obs/templates/set-overlay @@ -1,6 +1,6 @@ FILE=$1 if [[ ! -f $FILE ]]; then - LIST=(/data/emacsconf/assets/stream/emacsconf-2022-$FILE*.webm) + LIST=(/data/emacsconf/assets/stream/emacsconf-[0-9][0-9][0-9][0-9]-$FILE*.webm) FILE="${LIST[0]}" BY_SLUG=1 fi diff --git a/roles/obs/templates/vnc-track b/roles/obs/templates/vnc-track index 45a177a..4b18c29 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 -desktop {{ emacsconf_id }}-{{ item.id }} -rfbport {{ item.vnc_port }} -AlwaysShared -randr {{ res_x }}x{{ res_y }}
\ 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 }} -AlwaysShared
\ No newline at end of file diff --git a/roles/pad-proxy/templates/etherpad.nginx.conf b/roles/pad-proxy/templates/etherpad.nginx.conf index 3131178..144185f 100644 --- a/roles/pad-proxy/templates/etherpad.nginx.conf +++ b/roles/pad-proxy/templates/etherpad.nginx.conf @@ -38,7 +38,7 @@ server { {% if use_wikimedia %} location ~ ^/$ { - return 302 https://etherpad.wikimedia.org/p/emacsconf-2022; + return 302 https://etherpad.wikimedia.org/p/emacsconf-{{ emacsconf_year }}; } location / { rewrite /(.*) https://etherpad.wikimedia.org/p/emacsconf-$1 redirect; @@ -49,7 +49,7 @@ server { proxy_pass http://etherpad_upstream; } location / { - rewrite ^/?$ https://pad.emacsconf.org/2022 redirect; + rewrite ^/?$ https://pad.emacsconf.org/{{ emacsconf_year }} redirect; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/roles/pad/defaults/main.yml b/roles/pad/defaults/main.yml index 2d54195..6de2403 100644 --- a/roles/pad/defaults/main.yml +++ b/roles/pad/defaults/main.yml @@ -6,5 +6,5 @@ etherpad_database_user: etherpad etherpad_user: etherpad etherpad_group: etherpad etherpad_base: emacsconf -etherpad_year: 2022 +etherpad_year: {{ emacsconf_year }} etherpad_load_test: false diff --git a/roles/pad/templates/settings.json b/roles/pad/templates/settings.json index f81d232..dbbbda1 100644 --- a/roles/pad/templates/settings.json +++ b/roles/pad/templates/settings.json @@ -217,7 +217,7 @@ /* * The default text of a pad */ - "defaultPadText" : "Conference info, how to watch/participate: https://emacsconf.org/2022/\nGuidelines for conduct: https://emacsconf.org/conduct/\nSee end of file for license (CC Attribution-ShareAlike 4.0 + GPLv3 or later)\n----------------------------------------------------------------\nQuestions and discussion go here:\n- \n- \n- \n- \n- \n- \n- \n\n----------------------------------------------------------------\nExcept where otherwise noted, the material on the EmacsConf pad are dual-licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 International Public License; and the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) an later version. Copies of these two licenses are included in the EmacsConf wiki repository, in the COPYING.GPL and COPYING.CC-BY-SA files (https://emacsconf.org/COPYING/)\n\nBy contributing to this pad, you agree to make your contributions available under the above licenses. You are also promising that you are the author of your changes, or that you copied them from a work in the public domain or a work released under a free license that is compatible with the above two licenses. DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION.", + "defaultPadText" : "Conference info, how to watch/participate: https://emacsconf.org/{{ emacsconf_year }}/\nGuidelines for conduct: https://emacsconf.org/conduct/\nSee end of file for license (CC Attribution-ShareAlike 4.0 + GPLv3 or later)\n----------------------------------------------------------------\nQuestions and discussion go here:\n- \n- \n- \n- \n- \n- \n- \n\n----------------------------------------------------------------\nExcept where otherwise noted, the material on the EmacsConf pad are dual-licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 International Public License; and the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) an later version. Copies of these two licenses are included in the EmacsConf wiki repository, in the COPYING.GPL and COPYING.CC-BY-SA files (https://emacsconf.org/COPYING/)\n\nBy contributing to this pad, you agree to make your contributions available under the above licenses. You are also promising that you are the author of your changes, or that you copied them from a work in the public domain or a work released under a free license that is compatible with the above two licenses. DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION.", /* * Default Pad behavior. diff --git a/roles/prerec/templates/process-prerec.sh b/roles/prerec/templates/process-prerec.sh index 4544b43..69787f2 100755 --- a/roles/prerec/templates/process-prerec.sh +++ b/roles/prerec/templates/process-prerec.sh @@ -10,9 +10,9 @@ if ! ( screen -ls | grep -q $SLUG ); then screen -dmS $SCREEN fi ( cd /data/emacsconf/cache; ./update-cache ) -# /data/emacsconf/2022/scripts/talk $SLUG "WAITING_FOR_PREREC" "PROCESSING" +# /data/emacsconf/{{ emacsconf_year }}/scripts/talk $SLUG "WAITING_FOR_PREREC" "PROCESSING" #if [[ ! -f "$REENCODED" ]]; then -screen -S $SCREEN -X screen -t reencode-$SLUG /bin/bash -c "/data/emacsconf/2022/scripts/reencode.sh \"$ORIGINAL\" \"$REENCODED\" && /data/emacsconf/2022/scripts/upload.sh $REENCODED $MAIN && /data/emacsconf/2022/scripts/thumbnail.sh \"$MAIN\" && /data/emacsconf/2022/scripts/upload.sh $(echo "$MAIN" | sed s/webm$/png/) exec /bin/bash" & +screen -S $SCREEN -X screen -t reencode-$SLUG /bin/bash -c "/data/emacsconf/{{ emacsconf_year }}/scripts/reencode.sh \"$ORIGINAL\" \"$REENCODED\" && /data/emacsconf/{{ emacsconf_year }}/scripts/upload.sh $REENCODED $MAIN && /data/emacsconf/{{ emacsconf_year }}/scripts/thumbnail.sh \"$MAIN\" && /data/emacsconf/{{ emacsconf_year }}/scripts/upload.sh $(echo "$MAIN" | sed s/webm$/png/) exec /bin/bash" & #fi -screen -S $SCREEN -X screen -t captions-$SLUG /bin/bash -c "/data/emacsconf/2022/scripts/process-captions.py $(dirname $ORIGINAL); exec /bin/bash" +screen -S $SCREEN -X screen -t captions-$SLUG /bin/bash -c "/data/emacsconf/{{ emacsconf_year }}/scripts/process-captions.py $(dirname $ORIGINAL); exec /bin/bash" screen -x $SCREEN diff --git a/roles/prerec/templates/run-aeneas.sh b/roles/prerec/templates/run-aeneas.sh index 6f40134..8246c85 100755 --- a/roles/prerec/templates/run-aeneas.sh +++ b/roles/prerec/templates/run-aeneas.sh @@ -3,7 +3,7 @@ # {{ ansible_managed }} # AUDIO=$(ls *.opus *.ogg | head -n1) -BASE=$(echo $AUDIO | perl -pe 's/^(emacsconf-2022-.*?--.*?--.*?)--.*/$1/') +BASE=$(echo $AUDIO | perl -pe 's/^(emacsconf-{{ emacsconf_year }}-.*?--.*?--.*?)--.*/$1/') echo $AUDIO echo $BASE if [ ! -f $BASE--whisper.vtt ]; then @@ -11,4 +11,4 @@ if [ ! -f $BASE--whisper.vtt ]; then fi python3 -m aeneas.tools.execute_task $AUDIO *.txt "task_language=eng|os_task_file_format=vtt|is_text_type=plain" ${BASE}--aeneas.vtt cp ${BASE}--aeneas.vtt ${BASE}--main.vtt -/data/emacsconf/2022/scripts/upload.sh ${BASE}--main.vtt +/data/emacsconf/{{ emacsconf_year }}/scripts/upload.sh ${BASE}--main.vtt diff --git a/roles/publish/tasks/main.yml b/roles/publish/tasks/main.yml index 064f40f..fed1847 100644 --- a/roles/publish/tasks/main.yml +++ b/roles/publish/tasks/main.yml @@ -92,9 +92,9 @@ - not 'Local modifications exist in repository' in elisp.msg - not 'Failed to checkout branch' in elisp.msg debugger: on_failed - - name: Check out emacsconf-2022-private + - name: Check out emacsconf-{{ emacsconf_year }}-private ansible.builtin.git: - repo: git@git.emacsconf.org:emacsconf-2022-private + repo: "git@git.emacsconf.org:emacsconf-{{ emacsconf_year }}-private" dest: "{{ emacsconf_private_dir }}" register: private failed_when: diff --git a/roles/publish/templates/emacsconf-config.el b/roles/publish/templates/emacsconf-config.el index 366255c..9acad16 100644 --- a/roles/publish/templates/emacsconf-config.el +++ b/roles/publish/templates/emacsconf-config.el @@ -18,7 +18,7 @@ (setq emacsconf-publishing-phase '{{ emacsconf_publishing_phase }}) (setq emacsconf-backstage-password "{{ emacsconf_backstage_password }}") -(setq emacsconf-backstage-dir "/ssh:orga@media.emacsconf.org:/var/www/media.emacsconf.org/2022/backstage") +(setq emacsconf-backstage-dir "/ssh:orga@media.emacsconf.org:/var/www/media.emacsconf.org/{{ emacsconf_year }}/backstage") (setq emacsconf-upload-dir "/ssh:orga@media.emacsconf.org:/srv/upload") {% if ansible_host == "res.emacsconf.org" %} diff --git a/roles/upload/defaults/main.yml b/roles/upload/defaults/main.yml index 188420c..e814b25 100644 --- a/roles/upload/defaults/main.yml +++ b/roles/upload/defaults/main.yml @@ -1,2 +1,3 @@ upload_user: upload upload_dir: /home/upload/files + diff --git a/roles/wiki/templates/emacsconf.setup b/roles/wiki/templates/emacsconf.setup index 81b089b..4b4ca83 100644 --- a/roles/wiki/templates/emacsconf.setup +++ b/roles/wiki/templates/emacsconf.setup @@ -280,7 +280,7 @@ locked_pages: 'edit' # attachment plugin # enhanced PageSpec specifying what attachments are allowed #allowed_attachments: virusfree() and mimetype(image/*) and maxsize(50kb) -allowed_attachments: (mimetype(text/*) or *.m3u or *.svg) and maxsize(300kb) +allowed_attachments: (mimetype(text/*) or *.m3u or *.svg or *.org) and maxsize(400kb) # virus checker program (reads STDIN, returns nonzero if virus found) #virus_checker: clamdscan - |