183 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			183 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/bin/bash - | ||
|  | #=============================================================================== | ||
|  | # | ||
|  | #         FILE: generate_asset_list | ||
|  | # | ||
|  | #        USAGE: ./generate_asset_list episode [episode [episode ...]] | ||
|  | # | ||
|  | #  DESCRIPTION: Produces SQL for uploading assets for a show without them. | ||
|  | #               This is very rough and ready and can only be run on 'borg' | ||
|  | #               with access to the 'uploads' and 'done' directories. It's | ||
|  | #               based on Ken Fallon's suggested way of doing this, but has | ||
|  | #               been adjusted somewhat. | ||
|  | # | ||
|  | #               2023-08-17: Modified to accept multiple episodes per run. | ||
|  | # | ||
|  | #      OPTIONS: --- | ||
|  | # REQUIREMENTS: --- | ||
|  | #         BUGS: --- | ||
|  | #        NOTES: --- | ||
|  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||
|  | #      VERSION: 0.0.4 | ||
|  | #      CREATED: 2023-06-26 21:50:14 | ||
|  | #     REVISION: 2023-08-18 00:00:13 | ||
|  | # | ||
|  | #=============================================================================== | ||
|  | 
 | ||
|  | set -o nounset                              # Treat unset variables as an error | ||
|  | 
 | ||
|  | SCRIPT=${0##*/} | ||
|  | # DIR=${0%/*} | ||
|  | 
 | ||
|  | # VERSION="0.0.4" | ||
|  | 
 | ||
|  | # | ||
|  | # Needs an argument | ||
|  | # | ||
|  | if [[ $# -eq 0 ]]; then | ||
|  |     echo "Usage: $SCRIPT episode [episode [episode ...]]" | ||
|  |     exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | # | ||
|  | # Make temporary files and set traps to delete them | ||
|  | # | ||
|  | TMP1=$(mktemp) || { echo "$SCRIPT: creation of temporary file failed!"; exit 1; } | ||
|  | trap 'cleanup_temp $TMP1' SIGHUP SIGINT SIGPIPE SIGTERM EXIT | ||
|  | 
 | ||
|  | # | ||
|  | # Configure depending whether local or on borg | ||
|  | # | ||
|  | case $HOSTNAME in | ||
|  |     borg) | ||
|  |         BASEDIR="$HOME/IA" | ||
|  |         UPLOADS="/data/IA/uploads" | ||
|  |         DONE="/data/IA/done" | ||
|  |         ;; | ||
|  |     i7-desktop) | ||
|  |         BASEDIR="$HOME/HPR/IA" | ||
|  |         UPLOADS="$BASEDIR/uploads" | ||
|  |         DONE="$BASEDIR/done" | ||
|  |         ;; | ||
|  |     *) | ||
|  |         echo "Wrong host!" | ||
|  |         exit 1 | ||
|  |         ;; | ||
|  | esac | ||
|  | 
 | ||
|  | # | ||
|  | # It's easiest to work here | ||
|  | # | ||
|  | cd "$BASEDIR" || { echo "Failed to cd to $BASEDIR"; exit 1; } | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: cleanup_temp | ||
|  | #  DESCRIPTION: Cleanup temporary files in case of a keyboard interrupt | ||
|  | #               (SIGINT) or a termination signal (SIGTERM) and at script | ||
|  | #               exit | ||
|  | #   PARAMETERS: * - names of temporary files to delete | ||
|  | #      RETURNS: Nothing | ||
|  | #=============================================================================== | ||
|  | function cleanup_temp { | ||
|  |     for tmp; do | ||
|  |         [ -e "$tmp" ] && rm --force "$tmp" | ||
|  |     done | ||
|  |     exit 0 | ||
|  | } | ||
|  | 
 | ||
|  | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|  | 
 | ||
|  | # | ||
|  | # Count number of arguments processed | ||
|  | # | ||
|  | argcount=0 | ||
|  | 
 | ||
|  | # | ||
|  | # Loop through arguments | ||
|  | # | ||
|  | for arg; do | ||
|  |     failed=0 | ||
|  | 
 | ||
|  |     # | ||
|  |     # Accept a bare number or 'hpr<number>'. Parse out the pieces we'll need later | ||
|  |     # | ||
|  |     if [[ $arg =~ (hpr)?([0-9]{1,4}) ]]; then | ||
|  |         printf -v show 'hpr%04d' "${BASH_REMATCH[2]}" | ||
|  |         printf -v episode_id '%d' "${BASH_REMATCH[2]}" | ||
|  |     else | ||
|  |         echo "Argument '$arg' must be '<number>' or hpr<number>'" | ||
|  |         echo "Skipping this argument" | ||
|  |         continue | ||
|  |     fi | ||
|  | 
 | ||
|  |     # | ||
|  |     # Argument is OK, so prepare for the inner loop | ||
|  |     # | ||
|  |     echo 'INSERT INTO assets (episode_id,filename,extension,size,sha1sum,mime_type,file_type) VALUES' >> "$TMP1" | ||
|  | 
 | ||
|  |     # | ||
|  |     # Loop through the audio types. Keep in this order since the 'wav' | ||
|  |     # extension needs to be the last one. | ||
|  |     # | ||
|  |     for extension in mp3 ogg spx flac opus wav; do | ||
|  | 
 | ||
|  |         f1="$UPLOADS/${show}.${extension}" | ||
|  |         f2="$DONE/${show}.${extension}" | ||
|  | 
 | ||
|  |         # | ||
|  |         # Find the file in either of the two directories. | ||
|  |         # If any file type in the list is missing abort. | ||
|  |         # TODO: This will leave a partial output which isn't good! | ||
|  |         # | ||
|  |         if [[ -f "$f1" ]]; then | ||
|  |             filename="$f1" | ||
|  |         elif [[ -f "$f2" ]]; then | ||
|  |             filename="$f2" | ||
|  |         else | ||
|  |             echo "Can't find $f1 or $f2" | ||
|  |             echo "Aborting the processing of $show" | ||
|  |             failed=1 | ||
|  |             break | ||
|  |         fi | ||
|  | 
 | ||
|  |         # | ||
|  |         # Collect file statistics and attributes | ||
|  |         # | ||
|  |         size="$( stat --printf='%s' "${filename}" )" | ||
|  |         sha1sum="$( sha1sum "${filename}" | cut -f1 -d' ' )" | ||
|  |         mime_type=$( file --dereference --brief --mime "${filename}" ) | ||
|  |         file_type=$( file --dereference --brief "${filename}" ) | ||
|  | 
 | ||
|  |         # | ||
|  |         # Generate the next list of values to insert | ||
|  |         # | ||
|  |         printf "(%s,'%s','%s',%s,'%s','%s','%s')" \ | ||
|  |             "${episode_id}" "${show}.${extension}" "${extension}" "${size}" "${sha1sum}" "${mime_type}" "${file_type}" >> "$TMP1" | ||
|  | 
 | ||
|  |         # | ||
|  |         # End with a comma or a semicolon | ||
|  |         # | ||
|  |         if [[ $extension == 'wav' ]]; then | ||
|  |             echo ";" >> "$TMP1" | ||
|  |         else | ||
|  |             echo "," >> "$TMP1" | ||
|  |         fi | ||
|  | 
 | ||
|  |     done | ||
|  | 
 | ||
|  |     # | ||
|  |     # Add the `UPDATE` too, unless we failed to find a file and aborted. | ||
|  |     # | ||
|  |     if [[ $failed -eq 0 ]]; then | ||
|  |         printf 'UPDATE eps SET valid = 1 WHERE id = %s;\n' "${episode_id}" >> "$TMP1" | ||
|  |         ((argcount++)) | ||
|  |     fi | ||
|  | 
 | ||
|  | done | ||
|  | 
 | ||
|  | if [[ $argcount -gt 0 ]]; then | ||
|  |     cat "$TMP1" | ||
|  | fi | ||
|  | 
 | ||
|  | # vim: syntax=sh:ts=8:sw=4:ai:et:tw=78:fo=tcrqn21 |