diff options
Diffstat (limited to 'bin')
| -rwxr-xr-x | bin/copy_demos.sh | 20 | ||||
| -rwxr-xr-x | bin/copy_videos.sh | 20 | ||||
| -rwxr-xr-x | bin/make_archives.sh | 58 | ||||
| -rwxr-xr-x | bin/make_html_archives.sh | 31 | ||||
| -rwxr-xr-x | bin/make_html_index.sh | 34 | ||||
| -rwxr-xr-x | bin/make_html_table.sh | 89 | ||||
| -rwxr-xr-x | bin/make_thumbnails.sh | 24 |
7 files changed, 276 insertions, 0 deletions
diff --git a/bin/copy_demos.sh b/bin/copy_demos.sh new file mode 100755 index 0000000..dc827e4 --- /dev/null +++ b/bin/copy_demos.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +SOURCE_DIR="demos" +DEST_DIR="public/demos" + +mkdir -p "$DEST_DIR" + +for demo in "$SOURCE_DIR"/*; do + [ -f "$demo" ] || continue + + filename=$(basename -- "$demo") + dest="$DEST_DIR/$filename" + + [ -f "$dest" ] && continue + + echo " copying demo: $filename" + + cp "$demo" "$dest" +done + diff --git a/bin/copy_videos.sh b/bin/copy_videos.sh new file mode 100755 index 0000000..d8d1fe6 --- /dev/null +++ b/bin/copy_videos.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +SOURCE_DIR="videos" +DEST_DIR="public/videos" + +mkdir -p "$DEST_DIR" + +for video in "$SOURCE_DIR"/*; do + [ -f "$video" ] || continue + + filename=$(basename -- "$video") + dest="$DEST_DIR/$filename" + + [ -f "$dest" ] && continue + + echo " copying video: $filename" + + cp "$video" "$dest" +done + diff --git a/bin/make_archives.sh b/bin/make_archives.sh new file mode 100755 index 0000000..02bec66 --- /dev/null +++ b/bin/make_archives.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +CSV_FILE="tricks.csv" +VIDEO_DIR="videos" +DEMO_DIR="demos" +ARCHIVE_DIR="public/archives" + +mkdir -p "$ARCHIVE_DIR" + +declare -A montage_videos +declare -A montage_demos + +while IFS=',' read -r name players train_videos ingame_videos demos montage; do + key="$(echo "$montage" | xargs)" + videos_raw=$(echo "$ingame_videos" | xargs) + demos_raw=$(echo "$demos" | xargs) + key="$(echo "$key" | sed 's/ /_/g')" + + videos="" + IFS=';' read -ra video_items <<< "$videos_raw" + for item in "${video_items[@]}"; do + videos+="${VIDEO_DIR}/${item}.mp4 " + done + + demos="" + IFS=';' read -ra demo_items <<< "$demos_raw" + for item in "${demo_items[@]}"; do + demos+="${DEMO_DIR}/${item} " + done + + if [[ -z "$key" ]]; then + key="Unused" + fi + + if [[ -n "${montage_videos[$key]}" ]]; then + montage_videos[$key]="${montage_videos[$key]} $videos" + else + montage_videos[$key]="$videos" + fi + + if [[ -n "${montage_demos[$key]}" ]]; then + montage_demos[$key]="${montage_demos[$key]} $demos" + else + montage_demos[$key]="$demos" + fi +done < <(tail -n +2 "$CSV_FILE") + +for montage in "${!montage_videos[@]}"; do + [[ -n "${montage_videos[$montage]}" ]] \ + && zip -r "${ARCHIVE_DIR}/${montage}_videos.zip" ${montage_videos[$montage]} + continue +done + +for montage in "${!montage_demos[@]}"; do + [[ -n "${montage_demos[$montage]}" ]] \ + && zip -r "${ARCHIVE_DIR}/${montage}_demos.zip" ${montage_demos[$montage]} +done + diff --git a/bin/make_html_archives.sh b/bin/make_html_archives.sh new file mode 100755 index 0000000..239f878 --- /dev/null +++ b/bin/make_html_archives.sh @@ -0,0 +1,31 @@ +#/bin/sh + +ARCHIVE_DIR="public/archives" + +for file in $ARCHIVE_DIR/*_demos.zip $ARCHIVE_DIR/*_videos.zip; do + [ -f "$file" ] || continue + base="${file%_demos.zip}" + base="${base%_videos.zip}" + base="${base#$ARCHIVE_DIR/}" + bases="$bases +$base" +done + +[ -n "$bases" ] && printf "\n<h2>Archives</h2>\n\n" + +for base in $(echo "$bases" | sort -u); do + title=$(echo "$base" | tr '_' ' ') + + line="<p>$title tricks archive:" + + video_archive="$ARCHIVE_DIR/${base}_videos.zip" + demo_archive="$ARCHIVE_DIR/${base}_demos.zip" + + [ -f "$video_archive" ] && line="$line <a href=\"archives/${base}_videos.zip\">videos</a>" + [ -f "$demo_archive" ] && [ -f "$video_archive" ] && line="$line, " + [ -f "$demo_archive" ] && line="$line <a href=\"archives/${base}_demos.zip\">demos</a>" + + echo "$line" + +done + diff --git a/bin/make_html_index.sh b/bin/make_html_index.sh new file mode 100755 index 0000000..cba5479 --- /dev/null +++ b/bin/make_html_index.sh @@ -0,0 +1,34 @@ +#/bin/sh + +DIR="$(dirname "$0")" +OUTDIR="$DIR/../public" + +exec >"$OUTDIR/index.html" + +cat <<'EOF' +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Liber Dolorum</title> + <link rel='stylesheet' type='text/css' href="style.css"> + <link rel="icon" type="image/png" href="favicon.png"> +</head> + +<body> +<h1>Liber Dolorum</h1> +<p><em>"Another trick in the book"</em></p> + +EOF + +"$DIR/make_html_table.sh" +"$DIR/make_html_archives.sh" + +cat <<'EOF' + +<p>alpha 0.1</p> + +</body> + +</html> +EOF diff --git a/bin/make_html_table.sh b/bin/make_html_table.sh new file mode 100755 index 0000000..c820f27 --- /dev/null +++ b/bin/make_html_table.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +CSV_FILE="${1:-tricks.csv}" + +make_video_cell() { + local field="$1" + if [[ -n "$field" ]]; then + echo " <td>" + IFS=';' read -ra files <<< "$field" + for f in "${files[@]}"; do + f_trimmed=$(echo "$f" | xargs) + echo " <video width=\"256\" controls preload=\"none\" poster=\"thumbnails/$f_trimmed.jpg\">" + echo " <source src=\"videos/$f_trimmed.mp4\" type=\"video/mp4\">" + echo " Your browser does not support the video tag." + echo " </video>" + done + echo " </td>" + else + echo " <td></td>" + fi +} + +make_demo_cell() { + local field="$1" + if [[ -n "$field" ]]; then + echo " <td>" + IFS=';' read -ra files <<< "$field" + for f in "${files[@]}"; do + f_trimmed=$(echo "$f" | xargs) + echo " <a href=\"demos/$f_trimmed\" download>demo</a><br>" + done + echo " </td>" + else + echo " <td></td>" + fi +} + +make_montage_cell() { + local montage="$1" + + if [ -z "$montage" ]; then + echo " <td></td>" + return + fi + + case "$montage" in + 'Cowboy Teebop') montage_url='https://www.youtube.com/watch?v=eJgiPbio9BY' ;; + 'Tee Jams') montage_url='https://www.youtube.com/watch?v=ReoM0rVXduQ' ;; + 'On Noby Street') montage_url='https://www.youtube.com/watch?v=lxVu5XX9Rmk' ;; + 'Any Trickers') montage_url='https://www.youtube.com/watch?v=u2CbuvmiXCc' ;; + *) echo "ERROR: invalid montage name '$montage'" >&2; exit 1 ;; + esac + echo " <td><a href=\"$montage_url\" target=\"_blank\" rel=\"noopener\">$montage</a></td>" +} + +cat <<'EOF' +<table> + <tr> +EOF + +IFS=',' read -r -a headers < "$CSV_FILE" + +for header in "${headers[@]}"; do + echo " <th><strong>$header</strong></th>" +done + +echo " </tr>" + +while IFS=',' read -r name players train_videos ingame_videos demos montage; do + [[ -z "$name" ]] && continue + + echo " <tr>" + echo " <td><strong>$name</strong></td>" + + players_html=$(echo "$players" | sed 's/;/,<br>/g') + echo " <td>$players_html</td>" + + make_video_cell "$train_videos" + make_video_cell "$ingame_videos" + make_demo_cell "$demos" + make_montage_cell "$montage" + + echo " </tr>" +done < <(tail -n +2 "$CSV_FILE") + +cat <<'EOF' +</table> +EOF + diff --git a/bin/make_thumbnails.sh b/bin/make_thumbnails.sh new file mode 100755 index 0000000..9371d7a --- /dev/null +++ b/bin/make_thumbnails.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +WIDTH="${1:-320}" + +VIDEO_DIR="videos" +THUMB_DIR="public/thumbnails" + +mkdir -p "$THUMB_DIR" + +for video in "$VIDEO_DIR"/*; do + [ -f "$video" ] || continue + + filename=$(basename -- "$video") + name="${filename%.*}" + thumbnail="$THUMB_DIR/$name.jpg" + + [ -f "$thumbnail" ] && continue + + echo " creating image: $thumbnail" + + ffmpeg -i "$video" -ss 00:00:01 -vframes 1 -vf "scale=${WIDTH}:-1" -q:v 7 "$thumbnail" -y >/dev/null 2>&1 + +done + |
