forked from HPR/hpr-tools
		
	
		
			
	
	
		
			317 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			317 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #!/usr/bin/env perl | ||
|  | #=============================================================================== | ||
|  | # | ||
|  | #         FILE: resume_workflow | ||
|  | # | ||
|  | #        USAGE: ./resume_workflow epno | ||
|  | # | ||
|  | #  DESCRIPTION: For use with an HPR show that may not be fully processed. | ||
|  | #               Determines which workflow step is the next that needs to be | ||
|  | #               run, displays what it is and the script needed to perform it, | ||
|  | #               and passes the script name to the caller. | ||
|  | # | ||
|  | #      OPTIONS: --- | ||
|  | # REQUIREMENTS: --- | ||
|  | #         BUGS: --- | ||
|  | #        NOTES: --- | ||
|  | #       AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com | ||
|  | #      VERSION: 0.0.2 | ||
|  | #      CREATED: 2024-02-10 17:53:09 | ||
|  | #     REVISION: 2024-03-10 19:15:14 | ||
|  | # | ||
|  | #=============================================================================== | ||
|  | 
 | ||
|  | use v5.16; | ||
|  | use strict; | ||
|  | use warnings; | ||
|  | use feature qw{ postderef say signatures state try }; | ||
|  | no warnings | ||
|  |     qw{ experimental::postderef experimental::signatures experimental::try }; | ||
|  | 
 | ||
|  | use Config::General; | ||
|  | 
 | ||
|  | use List::Util      qw( maxstr minstr ); | ||
|  | use List::MoreUtils qw( uniq ); | ||
|  | use File::Slurper   qw( read_text read_lines ); | ||
|  | use JSON; | ||
|  | 
 | ||
|  | use Log::Handler; | ||
|  | 
 | ||
|  | use Data::Dumper; | ||
|  | 
 | ||
|  | # | ||
|  | # Version number (Incremented by Vim) | ||
|  | # | ||
|  | our $VERSION = '0.0.2'; | ||
|  | 
 | ||
|  | # | ||
|  | # Script and directory names | ||
|  | # | ||
|  | ( my $PROG = $0 ) =~ s|.*/||mx; | ||
|  | ( my $DIR  = $0 ) =~ s|/?[^/]*$||mx; | ||
|  | $DIR = '.' unless $DIR; | ||
|  | 
 | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # Declarations | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # | ||
|  | # Constants and other declarations | ||
|  | # | ||
|  | my $basedir      = "$ENV{HOME}/HPR/Show_Submission"; | ||
|  | my $cache        = "$basedir/shownotes"; | ||
|  | my $logs         = "$basedir/logs"; | ||
|  | my $logfile      = "$logs/$PROG.log"; | ||
|  | my $j_shownotes  = 'shownotes.json'; | ||
|  | 
 | ||
|  | my $formatfile  = '.format'; | ||
|  | my $statusfile  = '.status'; | ||
|  | my $assetfile   = '.assets'; | ||
|  | my $picturefile = '.pictures'; | ||
|  | 
 | ||
|  | # | ||
|  | # Setting the environment variable 'resume_workflow_DEBUG' to greater than | ||
|  | # 0 enables debug output. Different values control different output | ||
|  | # | ||
|  | my $DEBUG = 0; | ||
|  | my $DEBUG_env = "${PROG}_DEBUG"; | ||
|  | if ( defined($ENV{"$DEBUG_env"})) { | ||
|  |     $DEBUG = $ENV{"$DEBUG_env"}; | ||
|  | } | ||
|  | 
 | ||
|  | my ($showno, $showid, $missed); | ||
|  | 
 | ||
|  | my %showdata; | ||
|  | my @statustags = qw( | ||
|  |     copied | ||
|  |     parsed | ||
|  |     format | ||
|  |     metadata | ||
|  |     pictures | ||
|  |     assets | ||
|  |     edited | ||
|  |     converted | ||
|  |     rendered | ||
|  |     uploaded | ||
|  |     database | ||
|  |     reported | ||
|  | ); | ||
|  | 
 | ||
|  | # | ||
|  | # Set up the tag hash | ||
|  | # | ||
|  | # {{{ | ||
|  | my %taghash = ( | ||
|  |     'copied' => { | ||
|  |         'description' => 'Copy notes', | ||
|  |         'script'      => 'copy_shownotes', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'parsed' => { | ||
|  |         'description' => 'Parse raw', | ||
|  |         'script'      => 'do_parse', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'format' => { | ||
|  |         'description' => 'Change format', | ||
|  |         'script'      => 'do_change_format', | ||
|  |         'level'       => 2, | ||
|  |     }, | ||
|  |     'metadata' => { | ||
|  |         'description' => 'Edit metadata', | ||
|  |         'script'      => 'do_edit_shownotes', | ||
|  |         'level'       => 2, | ||
|  |     }, | ||
|  |     'pictures' => { | ||
|  |         'description' => 'Process pictures', | ||
|  |         'script'      => 'do_pictures', | ||
|  |         'level'       => 2, | ||
|  |     }, | ||
|  |     'assets' => { | ||
|  |         'description' => 'Upload assets', | ||
|  |         'script'      => 'do_asset_upload', | ||
|  |         'level'       => 2, | ||
|  |     }, | ||
|  |     'edited' => { | ||
|  |         'description' => 'Edit notes', | ||
|  |         'script'      => 'do_vim', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'converted' => { | ||
|  |         'description' => 'Run Pandoc', | ||
|  |         'script'      => 'do_pandoc', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'rendered' => { | ||
|  |         'description' => 'Run browser', | ||
|  |         'script'      => 'do_browse', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'uploaded' => { | ||
|  |         'description' => 'Upload HTML', | ||
|  |         'script'      => 'do_upload', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'database' => { | ||
|  |         'description' => 'Change database status', | ||
|  |         'script'      => 'do_update_reservations', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  |     'reported' => { | ||
|  |         'description' => 'Report change to Matrix', | ||
|  |         'script'      => 'do_report', | ||
|  |         'level'       => 1, | ||
|  |     }, | ||
|  | ); | ||
|  | # }}} | ||
|  | 
 | ||
|  | _debug($DEBUG == 3, '%taghash: ' . Dumper(\%taghash)); | ||
|  | 
 | ||
|  | # | ||
|  | # Enable Unicode mode | ||
|  | # | ||
|  | binmode STDOUT, ":encoding(UTF-8)"; | ||
|  | binmode STDERR, ":encoding(UTF-8)"; | ||
|  | 
 | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # Argument 1 must be the episode number in '1234' or 'hpr1234' form | ||
|  | #------------------------------------------------------------------------------- | ||
|  | $showno = shift; | ||
|  | die "Usage: $PROG epno\n" unless $showno; | ||
|  | if (($showno) =~ /^(?:hpr)?(\d+)$/) { | ||
|  |     # | ||
|  |     # Make an id in 'hpr1234' format | ||
|  |     # | ||
|  |     $showid = sprintf('hpr%04d',$showno); | ||
|  | } | ||
|  | else { | ||
|  |     die "Invalid episode format: $showno\n"; | ||
|  | } | ||
|  | 
 | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # Set up logging keeping the default log layout except for the date. The format | ||
|  | # is "%T [%L] %m" where '%T' is the timestamp, '%L' is the log level and '%m is | ||
|  | # the message. | ||
|  | #------------------------------------------------------------------------------- | ||
|  | my $log = Log::Handler->new(); | ||
|  | 
 | ||
|  | $log->add( | ||
|  |     file => { | ||
|  |         timeformat => "%Y/%m/%d %H:%M:%S", | ||
|  |         filename   => $logfile, | ||
|  |         minlevel   => 0, | ||
|  |         maxlevel   => 7, | ||
|  |     } | ||
|  | ); | ||
|  | 
 | ||
|  | # | ||
|  | # Check the existence of the requested show directory | ||
|  | # | ||
|  | unless (-d "$cache/$showid") { | ||
|  |     die "Directory $cache/$showid not found\n"; | ||
|  | } | ||
|  | 
 | ||
|  | $log->info("Processing show $showid"); | ||
|  | 
 | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # Collect show data | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # | ||
|  | # Declared format | ||
|  | # | ||
|  | if ( -e "$cache/$showid/$formatfile" ) { | ||
|  |     chomp($showdata{format} = read_text("$cache/$showid/$formatfile")); | ||
|  | } | ||
|  | else { | ||
|  |     $showdata{format} = undef; | ||
|  | } | ||
|  | 
 | ||
|  | # | ||
|  | # Current status | ||
|  | # | ||
|  | if ( -e "$cache/$showid/$statusfile" ) { | ||
|  |     $showdata{statuslist} = []; | ||
|  |     push(@{$showdata{statuslist}}, read_lines("$cache/$showid/$statusfile")); | ||
|  | } | ||
|  | else { | ||
|  |     $showdata{statuslist} = undef; | ||
|  | } | ||
|  | 
 | ||
|  | # | ||
|  | # Assets | ||
|  | # | ||
|  | if ( -e "$cache/$showid/$assetfile" ) { | ||
|  |     $showdata{assets} = []; | ||
|  |     push(@{$showdata{assets}}, read_lines("$cache/$showid/$assetfile")); | ||
|  |     $taghash{assets}->{level} = 1; | ||
|  | } | ||
|  | else { | ||
|  |     $showdata{assets} = undef; | ||
|  | } | ||
|  | 
 | ||
|  | # | ||
|  | # Pictures (a subset of assets) | ||
|  | # | ||
|  | if ( -e "$cache/$showid/$picturefile" ) { | ||
|  |     $showdata{pictures} = []; | ||
|  |     push(@{$showdata{pictures}}, read_lines("$cache/$showid/$picturefile")); | ||
|  |     $taghash{pictures}->{level} = 1; | ||
|  | } | ||
|  | else { | ||
|  |     $showdata{pictures} = undef; | ||
|  | } | ||
|  | 
 | ||
|  | _debug($DEBUG == 3, '%showdata: ' . Dumper(\%showdata)); | ||
|  | 
 | ||
|  | #------------------------------------------------------------------------------- | ||
|  | # Determine the incomplete steps in the workflow | ||
|  | #------------------------------------------------------------------------------- | ||
|  | $missed = 0; | ||
|  | for my $tag (@statustags) { | ||
|  |     my $th = $taghash{$tag}; | ||
|  | 
 | ||
|  |     if ( $th->{level} == 1 | ||
|  |         && scalar( grep( /$tag/, @{ $showdata{statuslist} } ) ) == 0 ) | ||
|  |     { | ||
|  |         printf "%-40s (./%s %d)\n", | ||
|  |             "Missing '$th->{description}' step", | ||
|  |             $th->{script}, $showno; | ||
|  |         $missed++; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | # | ||
|  | # Nothing missed, so say so | ||
|  | # | ||
|  | say "Nothing to do for show $showno" if ($missed == 0); | ||
|  | 
 | ||
|  | exit; | ||
|  | 
 | ||
|  | #===  FUNCTION  ================================================================ | ||
|  | #         NAME: _debug | ||
|  | #      PURPOSE: Prints debug reports | ||
|  | #   PARAMETERS: $active         Boolean: 1 for print, 0 for no print | ||
|  | #               $messages...    Arbitrary list of messages to print | ||
|  | #      RETURNS: Nothing | ||
|  | #  DESCRIPTION: Outputs messages if $active is true. It removes any trailing | ||
|  | #               newline from each one and then adds one in the 'print' to the | ||
|  | #               caller doesn't have to bother. Prepends each message with 'D>' | ||
|  | #               to show it's a debug message. | ||
|  | #       THROWS: No exceptions | ||
|  | #     COMMENTS: Differs from other functions of the same name | ||
|  | #     SEE ALSO: N/A | ||
|  | #=============================================================================== | ||
|  | sub _debug { | ||
|  |     my $active = shift; | ||
|  | 
 | ||
|  |     my $message; | ||
|  |     return unless $active; | ||
|  | 
 | ||
|  |     while ($message = shift) { | ||
|  |         chomp($message); | ||
|  |         print STDERR "D> $message\n"; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | # vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker | ||
|  | 
 |