#!/bin/bash - #=============================================================================== # # FILE: do_index # # USAGE: ./do_index # # DESCRIPTION: Makes an index.html file in the uploads directory of a show # for upload to the show's asset directory on the HPR server. # # OPTIONS: --- # REQUIREMENTS: --- # BUGS: --- # NOTES: --- # AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com # VERSION: 0.0.5 # CREATED: 2022-10-30 15:39:28 # REVISION: 2022-12-17 17:38:00 # #=============================================================================== set -o nounset # Treat unset variables as an error SCRIPT=${0##*/} # DIR=${0%/*} VERSION="0.0.5" STDOUT="/dev/fd/2" # # Load library functions (make_file_list, range_parse, cleanup_temp) # LIB="$HOME/bin/function_lib.sh" [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; } # shellcheck source=/home/cendjm/bin/function_lib.sh source "$LIB" # # Colour codes # define_colours # {{{ -- _usage -- _dryrun -- #=== FUNCTION ================================================================ # NAME: _usage # DESCRIPTION: Report usage # PARAMETERS: None # RETURNS: Nothing #=============================================================================== _usage () { cat >$STDOUT <<-endusage Usage: ./${SCRIPT} [-h] [-d] shownumber Version: $VERSION Generates an 'index.html' file for a show with assets Options: -h Print this help -d Select dry run mode Arguments: shownumber Examples ./${SCRIPT} 3112 endusage exit } #=== FUNCTION ================================================================ # NAME: _dryrun # DESCRIPTION: Output a dry run message # PARAMETERS: List of messages # RETURNS: Nothing #=============================================================================== _dryrun () { local prefix="Dry run: " for msg in "$@"; do printf '%9s%s\n' "$prefix" "$msg" prefix= done } # }}} #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # # Option defaults # DRYRUN=0 # not dry run mode by default # # Process options # while getopts :hd opt do case "${opt}" in h) _usage;; d) DRYRUN=1;; ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;; esac done shift $((OPTIND - 1)) # # Check there's an argument after removing any options. Abort if not # if [[ $# -ne 1 ]]; then echo "${red}Missing shownumber argument${reset}" _usage fi ep="$1" printf -v show 'hpr%04d' "$ep" # # Paths to files # BASEDIR="$HOME/HPR/Show_Submission" SHOWDIR="$BASEDIR/shownotes/hpr${ep}" RAWFILE="$SHOWDIR/shownotes.txt" JSONFILE="$SHOWDIR/shownotes.json" PICDIR="$SHOWDIR/uploads" INDEXFILE="$PICDIR/index.html" ASSETS="$SHOWDIR/.assets" # Created in parse_JSON PICLIST="$SHOWDIR/.pictures" # Created in parse_JSON STATUS="$SHOWDIR/.status" # # Check the show directory exists # if [[ ! -d $SHOWDIR ]]; then echo "$SCRIPT: ${red}Directory $SHOWDIR not found${reset}" exit 1 fi # # If no assets then don't continue # if [[ ! -e $ASSETS ]]; then echo "$SCRIPT: ${red}Asset file (.assets) not found in $SHOWDIR${reset}" exit 1 fi # # Do we already have an 'index.html'? # if [[ -e $INDEXFILE ]]; then echo "${red}There's already an 'index.html'${reset}" if [[ $DRYRUN -eq 0 ]] && ! yes_no 'Overwrite this file? %s ' 'No'; then echo "${red}Aborting!${reset}" exit 1 fi fi # # Make temporary files and set traps to delete them. # # TMP1 - HTML header # TMP2 - HTML footer # TMP1=$(mktemp) || { echo "$SCRIPT: ${red}creation of temporary file failed!${reset}" exit 1 } TMP2=$(mktemp) || { echo "$SCRIPT: ${red}creation of temporary file failed!${reset}" exit 1 } trap 'cleanup_temp $TMP1 $TMP2' SIGHUP SIGINT SIGPIPE SIGTERM EXIT # # Parse these fields from the raw input file (shownotes.txt) into Bash # variables so we can make an index.html later. # # Title='' Summary='' Host_Name='' # eval \ # "$(sed -n '/^\(Title\|Summary\|Host_Name\):/{s/^\([^:]\+\):\t/\1="/;s/$/"/;p}' "$RAWFILE")" # # Parse these fields from the JSON input file (shownotes.json) into Bash # variables so we can make an index.html later. # Title='' Summary='' Host_Name='' jqprog="@sh \"Host_Name=\(.host.Host_Name) Title=\(.episode.Title) Summary=\(.episode.Summary)\"" command=$(jq -r "$jqprog" "$JSONFILE") eval "${command}" # # Make two HTML templates and two TTĀ² templates. We do this in dry-run mode # too then throw them away! # # {{{ cat > "$TMP1" < $Title (HPR Show $ep)

$Title (HPR Show $ep)

$Summary

$Host_Name


Index

    ENDHTML1 cat > "$TMP2" <
ENDHTML2 # }}} # # Make a simple index.html file. We use the .assets file and the .pictures # list (if there is one) and read them into an aray and a hash. We can then # generate HTML appropriate to their type. # if [[ $DRYRUN -eq 0 ]]; then # # Make an array of assets # if [[ -e $ASSETS ]]; then declare -a assets mapfile -t assets < "$ASSETS" else echo "$SCRIPT: ${red}No assets found!${reset}" echo "$SCRIPT: ${red}Show has no $ASSETS file!${reset}" exit 1 fi # # Make a hash of pictures. It's not an error if there are none; we still # need to process assets. # if [[ -e $PICLIST ]]; then declare -A pix while read -er pic; do pix[$pic]=1 done < "$PICLIST" else echo "$SCRIPT: ${red}No pictures found!${reset}" echo "$SCRIPT: ${blue}Processing $ASSETS only${reset}" fi # # Assemble the index from header, footer and a body of file/picture # references. If an asset is in the 'pix' hash then it's a picture, so we # generate different HTML than in the other case. # TODO: Do a better job with displaying the pictures! Maybe limit the # size? Who's going to be looking at this anyway? Could the image URL # contain a size I wonder? # ( cat "$TMP1" for asset in "${assets[@]}"; do # Don't let the index point to itself! if [[ $asset == 'index.html' ]]; then continue fi if [ -e "$PICLIST" ] && [ "${pix[$asset]+set}" == 'set' ]; then printf '
  • %s
  • \n' \ "$show" "$asset" "$asset" else printf '
  • %s
  • \n' \ "$show" "$asset" "$asset" fi done cat "$TMP2" ) > "$INDEXFILE" # # Report what happened # if [[ -e $INDEXFILE ]]; then echo "${green}Generated index in $INDEXFILE${reset}" else echo "${red}Something went wrong; can't find $INDEXFILE${reset}" fi # # Set the status for this show # echo "index" >> "$STATUS" else _dryrun "Would have generated index file ${yellow}$INDEXFILE${reset}" fi # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker