forked from HPR/hpr-tools
		
	FAQ/FAQ.mkd, FAQ/Makefile: this version of the FAQ is now out of date
    and probably should be deleted.
InternetArchive/repair_item: script to upload missing shows after tie
    out errors during the normal upload; still under development.
InternetArchive/update_state: script to update show state in the
    'reservations' table in the database. Uses the CMS interface.
Link_Checker/scan_links: under development. Not currently usable.
Miscellaneous/fix_tags: audio metadata manipulation script. Recently
    added to this repo for convenience. Updates for 'experimental::try',
    the official Perl try/catch.
PostgreSQL_Database/add_hosts_to_show, PostgreSQL_Database/hpr_schema_2.pgsql,
    PostgreSQL_Database/nuke_n_pave.sh: an old experimental Pg database
    to take over from the previous MySQL version (from before 2023).
    Kept for reference; never implemented.
		
	
		
			
				
	
	
		
			343 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash -
 | 
						|
#===============================================================================
 | 
						|
#
 | 
						|
#         FILE: update_state
 | 
						|
#
 | 
						|
#        USAGE: ./update_state
 | 
						|
#
 | 
						|
#  DESCRIPTION: A script to update the state of shows which have been sent to
 | 
						|
#               the IA. It looks at the current state of the 'reservations'
 | 
						|
#               table on the HPR database and selects all shows which are in
 | 
						|
#               the state 'MEDIA_TRANSCODED'. It checks each one to see if it
 | 
						|
#               known to the IA and if so changes state to 'UPLOADED_TO_IA'.
 | 
						|
#
 | 
						|
#               The IA check can be overridden using the '-F' option, but care
 | 
						|
#               should be taken not to do this unless it is known all eligible
 | 
						|
#               shows are uploaded.
 | 
						|
#
 | 
						|
#               Note that the algorithm described here does not work for
 | 
						|
#               reserved shows like the Community News episodes since they are
 | 
						|
#               not submitted as such and have no entry in the 'reservations'
 | 
						|
#               table.
 | 
						|
#
 | 
						|
#      OPTIONS: ---
 | 
						|
# REQUIREMENTS: ---
 | 
						|
#         BUGS: ---
 | 
						|
#        NOTES: ---
 | 
						|
#       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
 | 
						|
#      VERSION: 0.0.10
 | 
						|
#      CREATED: 2022-04-19 12:50:52
 | 
						|
#     REVISION: 2024-06-01 14:19:20
 | 
						|
#
 | 
						|
#===============================================================================
 | 
						|
 | 
						|
set -o nounset                              # Treat unset variables as an error
 | 
						|
 | 
						|
SCRIPT=${0##*/}
 | 
						|
# DIR=${0%/*}
 | 
						|
 | 
						|
# shellcheck disable=SC2034
 | 
						|
VERSION="0.0.10"
 | 
						|
 | 
						|
STDOUT="/dev/fd/2"
 | 
						|
 | 
						|
#
 | 
						|
# Load library functions
 | 
						|
#
 | 
						|
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
 | 
						|
 | 
						|
# {{{ ---- Functions: ---- _usage _DEBUG
 | 
						|
 | 
						|
#===  FUNCTION  ================================================================
 | 
						|
#         NAME: _usage
 | 
						|
#  DESCRIPTION: Report usage
 | 
						|
#   PARAMETERS: None
 | 
						|
#      RETURNS: Nothing
 | 
						|
#===============================================================================
 | 
						|
_usage () {
 | 
						|
    local -i res="${1:-0}"
 | 
						|
 | 
						|
    cat >$STDOUT <<-endusage
 | 
						|
Usage: ./${SCRIPT} [-h] [-D] [-d] [-F] [-l N] [-m]
 | 
						|
 | 
						|
Version: $VERSION
 | 
						|
 | 
						|
Script to update the status in the 'reservations' table after a show has been
 | 
						|
processed.
 | 
						|
 | 
						|
Options:
 | 
						|
  -h            Print this help
 | 
						|
  -D            Enable DEBUG mode where a lot of information about the working
 | 
						|
                of the script is displayed
 | 
						|
  -d            Dry-run mode. Reports what it would do but doesn't do it
 | 
						|
  -F            Force the update(s) without checking the state of the show on
 | 
						|
                the IA
 | 
						|
  -l N          Limit the number of shows processed to N
 | 
						|
  -m            Monochrome mode - no colours
 | 
						|
  -R            Normally, if a show is not in the IA, the script retries
 | 
						|
                waiting for it to be uploaded (assuming it's being worked on
 | 
						|
                by the IA servers). Including -R limits the retries to one
 | 
						|
                which is useful when uploading multiple shows one at a time.
 | 
						|
 | 
						|
Examples
 | 
						|
  ./${SCRIPT} -h
 | 
						|
  ./${SCRIPT} -m
 | 
						|
  ./${SCRIPT} -d
 | 
						|
  ./${SCRIPT} -dm
 | 
						|
  ./${SCRIPT} -Dd
 | 
						|
  ./${SCRIPT} -F
 | 
						|
  ./${SCRIPT} -l1
 | 
						|
  ./${SCRIPT} -m
 | 
						|
  ./${SCRIPT} -R
 | 
						|
  ./${SCRIPT}
 | 
						|
 | 
						|
endusage
 | 
						|
    exit "$res"
 | 
						|
}
 | 
						|
 | 
						|
#===  FUNCTION  ================================================================
 | 
						|
#         NAME: _DEBUG
 | 
						|
#  DESCRIPTION: Writes a message if in DEBUG mode
 | 
						|
#   PARAMETERS: List of messages
 | 
						|
#      RETURNS: Nothing
 | 
						|
#===============================================================================
 | 
						|
_DEBUG () {
 | 
						|
    [ "$DEBUG" == 0 ] && return
 | 
						|
    for msg in "$@"; do
 | 
						|
        printf 'D> %s\n' "$msg"
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
# }}}
 | 
						|
 | 
						|
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
#
 | 
						|
# Configure depending whether local or on borg
 | 
						|
#
 | 
						|
case $HOSTNAME in
 | 
						|
    hprvps|marvin|borg)
 | 
						|
#       UPLOADS="/data/IA/uploads"
 | 
						|
        BASEDIR="$HOME/IA" ;;
 | 
						|
    i7-desktop)
 | 
						|
#       UPLOADS="$HOME/HPR/IA/uploads"
 | 
						|
        BASEDIR="$HOME/HPR/IA" ;;
 | 
						|
    *)
 | 
						|
        echo "Wrong host!"; exit 1 ;;
 | 
						|
esac
 | 
						|
 | 
						|
cd "$BASEDIR" || { echo "Can't cd to $BASEDIR"; exit 1; }
 | 
						|
 | 
						|
 | 
						|
#
 | 
						|
# Tools
 | 
						|
#
 | 
						|
BASECOM='curl -K ./.hpradmin_curlrc -s'
 | 
						|
URL="https://hub.hackerpublicradio.org/cms/status.php"
 | 
						|
QUERY1="${BASECOM} ${URL}"
 | 
						|
QUERY2="${BASECOM} -o - ${URL}"
 | 
						|
 | 
						|
#
 | 
						|
# Fallback URLs and commands
 | 
						|
#
 | 
						|
URL_BAK="http://hub.hackerpublicradio.org/cms/status.php"
 | 
						|
QUERY1_BAK="${BASECOM} ${URL_BAK}"
 | 
						|
QUERY2_BAK="${BASECOM} -o - ${URL_BAK}"
 | 
						|
 | 
						|
#
 | 
						|
# Number of retries per show
 | 
						|
#
 | 
						|
RETRIES=3
 | 
						|
 | 
						|
#
 | 
						|
# Option defaults
 | 
						|
#
 | 
						|
COLOUR=1        # use colours by default
 | 
						|
DRYRUN=0        # live mode by default
 | 
						|
DEBUG=0
 | 
						|
FORCE=0
 | 
						|
RETRYING=1      # retry if a show's not on the IA
 | 
						|
DEFLIMIT=20
 | 
						|
 | 
						|
#
 | 
						|
# Process options
 | 
						|
#
 | 
						|
while getopts :hdDFl:mR opt
 | 
						|
do
 | 
						|
    case "${opt}" in
 | 
						|
        h) _usage;;
 | 
						|
        d) DRYRUN=1;;
 | 
						|
        D) DEBUG=1;;
 | 
						|
        F) FORCE=1;;
 | 
						|
        l) LIMIT=$OPTARG;;
 | 
						|
        m) COLOUR=0;;
 | 
						|
        R) RETRYING=0;;
 | 
						|
        ?) echo "$SCRIPT: Invalid option; aborting"; exit 1;;
 | 
						|
    esac
 | 
						|
done
 | 
						|
shift $((OPTIND - 1))
 | 
						|
 | 
						|
#
 | 
						|
# Cancel colours if requested
 | 
						|
#
 | 
						|
if [[ $COLOUR -eq 0 ]]; then
 | 
						|
    undefine_colours
 | 
						|
fi
 | 
						|
 | 
						|
LIMIT=${LIMIT:-$DEFLIMIT}
 | 
						|
if [[ $LIMIT -lt 1 || $LIMIT -gt $DEFLIMIT ]]; then
 | 
						|
    echo "** Use '-l 1' up to '-l $DEFLIMIT' or omit the option"
 | 
						|
    _usage 1
 | 
						|
fi
 | 
						|
 | 
						|
if [[ $FORCE -eq 1 ]]; then
 | 
						|
    coloured 'yellow' "Forcing updates without checking the IA state"
 | 
						|
fi
 | 
						|
 | 
						|
if [[ $RETRYING -eq 0 ]]; then
 | 
						|
    coloured 'yellow' "Not retrying updates if the show is missing"
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
# Check the argument count after any options
 | 
						|
#
 | 
						|
if [[ $# -ne 0 ]]; then
 | 
						|
    coloured 'red' "** ${SCRIPT} takes no arguments"
 | 
						|
    _usage 1
 | 
						|
fi
 | 
						|
 | 
						|
#
 | 
						|
# Collect the current table of shows requiring work. We expect something like:
 | 
						|
# timestamp_epoc,ep_num,ep_date,key,status,email
 | 
						|
# 1651286617,3617,2022-06-14,fda088e0e3bd5d0353ea6b7569e93b87626ca25976a0a,UPLOADED_TO_IA,lurkingprion@gmail.com
 | 
						|
# 1651648589,3619,2022-06-16,e7d3810afa098863d81663418d8640276272284de68f1,UPLOADED_TO_IA,monochromec@gmail.com
 | 
						|
# TODO: Check for a failure in the query?
 | 
						|
# NOTE: Problem encountered 2022-09-23 because the SSL certificate has expired
 | 
						|
#
 | 
						|
reservations=$($QUERY2) || {
 | 
						|
    coloured 'red' "Problem querying $URL"
 | 
						|
    coloured 'yellow' "Falling back to $URL_BAK"
 | 
						|
    reservations=$($QUERY2_BAK) || {
 | 
						|
        coloured 'red' "Failed with fallback URL - aborting"
 | 
						|
        exit 1
 | 
						|
    }
 | 
						|
}
 | 
						|
_DEBUG "reservations = $reservations"
 | 
						|
 | 
						|
#
 | 
						|
# Check which shows are on the IA and can be flagged as such. We get the work
 | 
						|
# "queue" from the variable 'reservations' which contains lines returned from
 | 
						|
# querying the CMS status interface.
 | 
						|
#
 | 
						|
showcount=0
 | 
						|
while read -r line; do
 | 
						|
    if [[ $line =~ ^([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),.*$ ]]; then
 | 
						|
        state="${BASH_REMATCH[5]}"
 | 
						|
        show="${BASH_REMATCH[2]}"
 | 
						|
 | 
						|
        #
 | 
						|
        # Process shows in just one of the states
 | 
						|
        #
 | 
						|
        if [[ $state = 'MEDIA_TRANSCODED' ]]; then
 | 
						|
            _DEBUG "show = $show, state = $state"
 | 
						|
 | 
						|
            #
 | 
						|
            # If we're retrying (waiting for a show to be uploaded) then loop
 | 
						|
            # $RETRIES times, otherwise don't retry at all
 | 
						|
            #
 | 
						|
            if [[ $RETRYING -eq 1 ]]; then
 | 
						|
                retry_count=$RETRIES
 | 
						|
            else
 | 
						|
                retry_count=1
 | 
						|
            fi
 | 
						|
 | 
						|
            while [ $retry_count -gt 0 ]; do
 | 
						|
                #
 | 
						|
                # Look for the show on the IA. If not found we sleep 30
 | 
						|
                # seconds and look again. This happens a limited number of
 | 
						|
                # times, controlled by $RETRIES, then we give up this show. If
 | 
						|
                # there are more shows then we keep going.
 | 
						|
                #
 | 
						|
                if [ $FORCE -eq 1 ] || ia metadata "hpr$show" --exists > /dev/null 2>&1; then
 | 
						|
#               if [ $FORCE -eq 1 ] || ia list "hpr$show" > /dev/null 2>&1; then
 | 
						|
                    command="${QUERY1}?ep_num=${show}&status=UPLOADED_TO_IA"
 | 
						|
                    command_bak="${QUERY1_BAK}?ep_num=${show}&status=UPLOADED_TO_IA"
 | 
						|
 | 
						|
                    #
 | 
						|
                    # In dry-run mode we count this iteration as success. In
 | 
						|
                    # live mode we exit if the command fails. Otherwise we
 | 
						|
                    # assume the command succeeds and exit the retry loop.
 | 
						|
                    #
 | 
						|
                    if [[ $DRYRUN -eq 1 ]]; then
 | 
						|
                        echo -e "Dry-run: would have run\n${yellow}$command${reset}"
 | 
						|
                    else
 | 
						|
                        coloured 'yellow' "$command"
 | 
						|
                        $command || {
 | 
						|
                            coloured 'red' "Problem querying $URL"
 | 
						|
                            coloured 'yellow' "Falling back to $URL_BAK"
 | 
						|
                            $command_bak || {
 | 
						|
                                coloured 'red' "Failed with fallback URL - aborting"
 | 
						|
                                exit 1
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        RES=$?
 | 
						|
                        if [[ $RES -ne 0 ]]; then
 | 
						|
                            coloured 'red' "** Problem running $command; aborting"
 | 
						|
                            exit 1
 | 
						|
                        fi
 | 
						|
                    fi
 | 
						|
 | 
						|
                    #
 | 
						|
                    # Success. Stop the loop
 | 
						|
                    #
 | 
						|
                    break
 | 
						|
                else
 | 
						|
                    #
 | 
						|
                    # Failed to find the show, have another go after a wait
 | 
						|
                    #
 | 
						|
                    coloured 'red' "Show $show is not yet uploaded"
 | 
						|
                    sleep 30
 | 
						|
                fi
 | 
						|
                ((retry_count--))
 | 
						|
            done
 | 
						|
 | 
						|
            #
 | 
						|
            # Are all retries done, and are we retrying anyway?
 | 
						|
            #
 | 
						|
            if [[ $retry_count -eq 0 && $RETRYING -eq 1 ]]; then
 | 
						|
                coloured 'red' "Failed to update show $show; retry count reached"
 | 
						|
                coloured 'yellow' "The command 'ia list hpr$show' repeatedly returned \"failure\""
 | 
						|
                coloured 'yellow' "Database updates not done"
 | 
						|
                coloured 'yellow' "Try again later with './${SCRIPT}'"
 | 
						|
            fi
 | 
						|
 | 
						|
            #
 | 
						|
            # Stop the loop if we have reached the limiting number
 | 
						|
            #
 | 
						|
            ((showcount++))
 | 
						|
            [[ $showcount -eq $LIMIT ]] && {
 | 
						|
                echo "Upload limit ($LIMIT) reached"
 | 
						|
                ((--showcount))
 | 
						|
                break
 | 
						|
            }
 | 
						|
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
done <<< "$reservations"
 | 
						|
 | 
						|
if [[ $DRYRUN -eq 0 ]]; then
 | 
						|
    echo "Number of shows processed successfully: $showcount"
 | 
						|
fi
 | 
						|
 | 
						|
exit
 | 
						|
 | 
						|
# vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21:fdm=marker
 |