| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | #!/bin/bash - | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | #=============================================================================== | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #         FILE: do_index | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #        USAGE: ./do_index <epno> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  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: --- | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | #        NOTES: [[ Probably obsolete! ]] | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | 
					
						
							|  |  |  | #      VERSION: 0.0.5 | 
					
						
							|  |  |  | #      CREATED: 2022-10-30 15:39:28 | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | #     REVISION: 2024-06-18 20:28:55 | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01: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) | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | LIB="$HOME/HPR/function_lib.sh" | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; } | 
					
						
							| 
									
										
										
										
											2024-12-01 20:45:20 +00:00
										 |  |  | # shellcheck source=/home/cendjm/HPR/function_lib.sh | 
					
						
							| 
									
										
										
										
											2024-06-04 16:35:44 +01:00
										 |  |  | 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" <<ENDHTML1 | 
					
						
							|  |  |  | <!DOCTYPE html> | 
					
						
							|  |  |  | <html> | 
					
						
							|  |  |  | <head> | 
					
						
							|  |  |  |   <meta charset="utf-8"> | 
					
						
							|  |  |  |   <meta name="generator" content="pandoc"> | 
					
						
							|  |  |  |   <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> | 
					
						
							|  |  |  |   <meta name="author" content="$Host_Name"> | 
					
						
							|  |  |  |   <title>$Title (HPR Show $ep)</title> | 
					
						
							|  |  |  |   <style type="text/css">code{white-space: pre;}</style> | 
					
						
							|  |  |  |   <!--[if lt IE 9]> | 
					
						
							|  |  |  |     <script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script> | 
					
						
							|  |  |  |   <![endif]--> | 
					
						
							|  |  |  |   <link rel="stylesheet" href="https://hackerpublicradio.org/css/hpr.css"> | 
					
						
							|  |  |  | </head> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <body id="home"> | 
					
						
							|  |  |  | <div id="container" class="shadow"> | 
					
						
							|  |  |  | <header> | 
					
						
							|  |  |  | <h1 class="title">$Title (HPR Show $ep)</h1> | 
					
						
							|  |  |  | <h3 class="summary">$Summary</h3> | 
					
						
							|  |  |  | <h3 class="author">$Host_Name</h3> | 
					
						
							|  |  |  | <hr/> | 
					
						
							|  |  |  | </header> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <main id="maincontent"> | 
					
						
							|  |  |  | <article> | 
					
						
							|  |  |  | <h3 id="index">Index</h3> | 
					
						
							|  |  |  | <ul> | 
					
						
							|  |  |  | ENDHTML1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | cat > "$TMP2" <<ENDHTML2 | 
					
						
							|  |  |  | </ul> | 
					
						
							|  |  |  | </article> | 
					
						
							|  |  |  | </main> | 
					
						
							|  |  |  | </div> | 
					
						
							|  |  |  | </body> | 
					
						
							|  |  |  | </html> | 
					
						
							|  |  |  | 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 '<li><img src="https://hackerpublicradio.org/eps/%s/%s" alt="%s"></li>\n' \ | 
					
						
							|  |  |  |                     "$show" "$asset" "$asset" | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 printf '<li><a href="https://hackerpublicradio.org/eps/%s/%s">%s</a></li>\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 |