forked from HPR/hpr-tools
		
	
		
			
	
	
		
			299 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			299 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/bin/bash - | ||
|  | #=============================================================================== | ||
|  | # | ||
|  | #         FILE: weekly_upload | ||
|  | # | ||
|  | #        USAGE: ./weekly_upload [-h] [-r] [-v] [-d {0|1}] start [count] | ||
|  | # | ||
|  | #  DESCRIPTION: Run the commands necessary to upload a batch of HPR shows to | ||
|  | #               archive.org | ||
|  | # | ||
|  | #      OPTIONS: --- | ||
|  | # REQUIREMENTS: --- | ||
|  | #         BUGS: --- | ||
|  | #        NOTES: --- | ||
|  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||
|  | #      VERSION: 0.0.9 | ||
|  | #      CREATED: 2018-10-12 21:54:35 | ||
|  | #     REVISION: 2020-10-13 13:54:32 | ||
|  | # | ||
|  | #=============================================================================== | ||
|  | 
 | ||
|  | set -o nounset                              # Treat unset variables as an error | ||
|  | 
 | ||
|  | SCRIPT=${0##*/} | ||
|  | #DIR=${0%/*} | ||
|  | VERSION="0.0.9" | ||
|  | 
 | ||
|  | STDOUT="/dev/fd/2" | ||
|  | 
 | ||
|  | # | ||
|  | # Select the appropriate working directory | ||
|  | # | ||
|  | case $(hostname) in | ||
|  |     i7-desktop) | ||
|  |         BASEDIR="$HOME/HPR/InternetArchive" | ||
|  |         UPLOAD="$BASEDIR/uploads" | ||
|  |         ;; | ||
|  |     hprvps|marvin|borg) | ||
|  |         BASEDIR="$HOME/IA" | ||
|  |         UPLOAD="/var/IA/uploads" | ||
|  |         ;; | ||
|  |     *) | ||
|  |         echo "Wrong host!" | ||
|  |         exit 1 | ||
|  |         ;; | ||
|  | esac | ||
|  | 
 | ||
|  | cd "$BASEDIR" || exit 1 | ||
|  | 
 | ||
|  | # | ||
|  | # Load library functions | ||
|  | # | ||
|  | LIB="$HOME/bin/function_lib.sh" | ||
|  | [ -e "$LIB" ] || { echo "Unable to source functions"; exit; } | ||
|  | # shellcheck disable=SC1090 | ||
|  | source "$LIB" | ||
|  | 
 | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: check_uploads | ||
|  | #  DESCRIPTION: Determines if files exist for uploading | ||
|  | #   PARAMETERS: 1 - filename prefix e.g. 'hpr9999' | ||
|  | #      RETURNS: True/false | ||
|  | #=============================================================================== | ||
|  | check_uploads () { | ||
|  |     local prefix=${1:?Usage: check_uploads prefix} | ||
|  |     local suff | ||
|  | 
 | ||
|  |     # | ||
|  |     # Look for files called hpr1234.flac and so on. Don't bother with the | ||
|  |     # hpr1234_source.flac one. As soon as a file is missing return with false. | ||
|  |     # | ||
|  |     for suff in flac mp3 ogg opus spx wav; do | ||
|  |         if [[ ! -e $UPLOAD/$prefix.$suff ]]; then | ||
|  |             return 1 | ||
|  |         fi | ||
|  |     done | ||
|  | 
 | ||
|  |     return 0 | ||
|  | } | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _usage | ||
|  | #  DESCRIPTION: Reports usage; always exits the script after doing so | ||
|  | #   PARAMETERS: 1 - the integer to pass to the 'exit' command | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | _usage () { | ||
|  |     local -i result=${1:-0} | ||
|  | 
 | ||
|  |     cat >$STDOUT <<-endusage | ||
|  | ${SCRIPT} - version: ${VERSION} | ||
|  | 
 | ||
|  | Usage: ./${SCRIPT} [-h] [-r] [-v] [-d {0|1}] start [count] | ||
|  | 
 | ||
|  | Generates the necessary metadata and script and uses them to upload HPR audio | ||
|  | and other show-related files held on the VPS to the Internet Archive. | ||
|  | 
 | ||
|  | Options: | ||
|  |   -h                    Print this help | ||
|  |   -v                    Run in verbose mode where more information is reported | ||
|  |   -d 0|1                Dry run: -d 1 (the default) runs the script in dry-run | ||
|  |                         mode where nothing is changed but the actions that | ||
|  |                         will be taken are reported; -d 0 turns off dry-run | ||
|  |                         mode and the actions will be carried out. | ||
|  |   -r                    Run in 'remote' mode, using the live database over an | ||
|  |                         (already established) SSH tunnel. Default is to run | ||
|  |                         against the local database. | ||
|  | Arguments: | ||
|  |     start               the starting show number to be uploaded | ||
|  |     count               (optional, default 1) the number of shows to be | ||
|  |                         uploaded; cannot exceed 20 | ||
|  | 
 | ||
|  | Notes: | ||
|  | 
 | ||
|  | 1. When running on 'marvin' the method used is to run in faux 'local' mode. | ||
|  |    This means we have an open tunnel to the HPR server (mostly left open) and | ||
|  |    the default file .hpr_db.cfg points to the live database via this tunnel. | ||
|  |    So we do not use the -r option here. This is a bit of a hack! Sorry! | ||
|  | 
 | ||
|  | 2. There are potential problems when a show has no tags which haven't been | ||
|  |    fully resolved. The make_metadata script fails in default mode when it | ||
|  |    finds such a show, but this (weekly_upload) script can continue on and run | ||
|  |    the generated script which uploads the source audio files. This can mean | ||
|  |    the IA items end up as books! In this mode the description is not stored | ||
|  |    and so there are no show notes. | ||
|  | 
 | ||
|  | endusage | ||
|  |     exit "$result" | ||
|  | } | ||
|  | 
 | ||
|  | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|  | 
 | ||
|  | # | ||
|  | # Process options | ||
|  | # | ||
|  | while getopts :d:hrv opt | ||
|  | do | ||
|  |     case "${opt}" in | ||
|  |         d) DRYRUN=$OPTARG;; | ||
|  |         h) _usage 1;; | ||
|  |         r) REMOTE=1;; | ||
|  |         v) VERBOSE=1;; | ||
|  |         *) _usage 1;; | ||
|  |     esac | ||
|  | done | ||
|  | shift $((OPTIND - 1)) | ||
|  | 
 | ||
|  | DRYRUN=${DRYRUN:-1} | ||
|  | if [[ $DRYRUN -ne 0 && $DRYRUN -ne 1 ]]; then | ||
|  |     echo "** Use '-d 0' or '-d 1'" | ||
|  |     _usage 1 | ||
|  | fi | ||
|  | 
 | ||
|  | VERBOSE=${VERBOSE:-0} | ||
|  | 
 | ||
|  | REMOTE=${REMOTE:-0} | ||
|  | if [[ $REMOTE -eq 0 ]]; then | ||
|  |     dbconfig="$BASEDIR/.hpr_db.cfg" | ||
|  |     [[ $VERBOSE -eq 1 ]] && echo "Local database mode" | ||
|  | else | ||
|  |     dbconfig="$BASEDIR/.hpr_livedb.cfg" | ||
|  |     [[ $VERBOSE -eq 1 ]] && echo "Remote database mode" | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Check argument count | ||
|  | # | ||
|  | if [[ ! ( $# -eq 1 || $# -eq 2 ) ]]; then | ||
|  |     echo "Wrong number of arguments" | ||
|  |     _usage 1 | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Validate arguments | ||
|  | # | ||
|  | for arg; do | ||
|  |     if [[ ! $arg =~ ^[0-9]{1,4}$ ]]; then | ||
|  |         echo "Invalid number: $arg" | ||
|  |         echo "Use a plain number" | ||
|  |         exit 1 | ||
|  |     fi | ||
|  | done | ||
|  | 
 | ||
|  | start=$1 | ||
|  | count=${2:-1} | ||
|  | if [[ $count -gt 20 ]]; then | ||
|  |     echo "Can't process more than 20 shows at a time" | ||
|  |     exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | [[ $VERBOSE -eq 1 && $DRYRUN -eq 1 ]] && echo "Dry run mode" | ||
|  | 
 | ||
|  | # | ||
|  | # Two paths; one for a single episode, the other for multiple episodes | ||
|  | # | ||
|  | if [[ $count -eq 1 ]]; then | ||
|  |     # | ||
|  |     # Single episode | ||
|  |     # -------------- | ||
|  | 
 | ||
|  |     # | ||
|  |     # Check existence of files | ||
|  |     # | ||
|  |     if ! check_uploads "hpr$start"; then | ||
|  |         echo "Missing files for show $start. Aborted!" | ||
|  |         exit 1 | ||
|  |     fi | ||
|  | 
 | ||
|  |     # | ||
|  |     # Define files | ||
|  |     # | ||
|  |     metadata="metadata_${start}.csv" | ||
|  |     script="script_${start}.sh" | ||
|  | 
 | ||
|  |     if [[ $DRYRUN -eq 1 ]]; then | ||
|  |         echo "Dry run: Would have uploaded $start" | ||
|  |         echo "Dry run: Would have created $metadata and $script" | ||
|  |         echo "Dry run: Would have uploaded $metadata and run $script" | ||
|  |         echo "Dry run: Would have used $dbconfig" | ||
|  |     else | ||
|  |         echo "Uploading $start" | ||
|  |         if yes_no "OK to continue? %s " "N"; then | ||
|  |             # shellcheck disable=SC2086 | ||
|  |             { | ||
|  |                 # | ||
|  |                 # Make the metadata | ||
|  |                 # | ||
|  |                 $BASEDIR/make_metadata -dbconf=${dbconfig} -from=$start -verb -out -script | ||
|  |                 RES=$? | ||
|  |                 if [[ $RES -eq 0 ]]; then | ||
|  |                     ia upload --retries=3 --spreadsheet=${metadata} \ | ||
|  |                         -H x-archive-keep-old-version:0 && ./${script} | ||
|  |                 else | ||
|  |                     echo "Upload aborted due to errors" | ||
|  |                 fi | ||
|  |             } | ||
|  |         else | ||
|  |             echo "Not uploaded" | ||
|  |         fi | ||
|  |     fi | ||
|  | else | ||
|  |     # | ||
|  |     # Multiple episodes | ||
|  |     # ----------------- | ||
|  |     # | ||
|  |     # Compute end show number | ||
|  |     # | ||
|  |     ((end = start + count - 1)) | ||
|  | 
 | ||
|  |     # | ||
|  |     # Check existence of files | ||
|  |     # | ||
|  |     for (( i = start; i < end; i++ )); do | ||
|  |         if ! check_uploads "hpr$i"; then | ||
|  |             echo "Missing files for show $i. Aborted!" | ||
|  |             exit 1 | ||
|  |         fi | ||
|  |     done | ||
|  | 
 | ||
|  |     # | ||
|  |     # Define files | ||
|  |     # | ||
|  |     metadata="metadata_${start}-${end}.csv" | ||
|  |     script="script_${start}-${end}.sh" | ||
|  | 
 | ||
|  |     if [[ $DRYRUN -eq 1 ]]; then | ||
|  |         echo "Dry run: Would have uploaded $start to $end inclusive" | ||
|  |         echo "Dry run: Would have created $metadata and $script" | ||
|  |         echo "Dry run: Would have uploaded $metadata and run $script" | ||
|  |         echo "Dry run: Would have used $dbconfig" | ||
|  |     else | ||
|  |         echo "Uploading $start to $end inclusive" | ||
|  |         if yes_no "OK to continue? %s " "N"; then | ||
|  |             # shellcheck disable=2086 | ||
|  |             { | ||
|  |                 # | ||
|  |                 # Make the metadata | ||
|  |                 # | ||
|  |                 $BASEDIR/make_metadata -dbconf=${dbconfig} -from=$start -count=$count -verb -out -script | ||
|  |                 RES=$? | ||
|  |                 if [[ $RES -eq 0 ]]; then | ||
|  |                     ia upload --retries=3 --spreadsheet=${metadata} \ | ||
|  |                         -H x-archive-keep-old-version:0 && ./${script} | ||
|  |                 else | ||
|  |                     echo "Upload aborted due to errors" | ||
|  |                 fi | ||
|  |             } | ||
|  |         else | ||
|  |             echo "Not uploaded" | ||
|  |         fi | ||
|  |     fi | ||
|  | fi | ||
|  | 
 | ||
|  | exit | ||
|  | 
 | ||
|  | # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21 | ||
|  | 
 |