forked from HPR/hpr-tools
		
	Show_Submission/copy_shownotes: Changed the location of the function library
Show_Submission/do_brave: Updates to the way local stand-alone HTML is generated for
    review purposes.
Show_Submission/do_index: Changed the location of the function library
Show_Submission/do_pandoc: Changed the location of the function library; now uses
    'author_title.pl' to generate YAML for Pandoc
Show_Submission/do_parse: Trivial change
Show_Submission/do_pictures: Changed the location of the function library; better
    handling of the show specification
Show_Submission/do_report: Changed the location of the function library
Show_Submission/do_update_reservations: Changed the location of the function library
Show_Submission/fix_relative_links: Added features 'say' and 'state'
Show_Submission/parse_JSON: New checks: notes too short, trailing spaces on title,
    summary and tags (needing JSON changes). Check for Markdown in the
    assets (see 'do_pandoc_assets'). New 'trim' function.
		
	
		
			
				
	
	
		
			314 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			314 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash -
 | |
| #===============================================================================
 | |
| #
 | |
| #         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: ---
 | |
| #        NOTES: [[ Probably obsolete! ]]
 | |
| #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
 | |
| #      VERSION: 0.0.5
 | |
| #      CREATED: 2022-10-30 15:39:28
 | |
| #     REVISION: 2024-06-18 20:28:55
 | |
| #
 | |
| #===============================================================================
 | |
| 
 | |
| 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/HPR/function_lib.sh"
 | |
| [ -e "$LIB" ] || { echo "$SCRIPT: Unable to source functions"; exit 1; }
 | |
| # shellcheck source=/home/cendjm/HPR/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" <<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
 |