317 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			317 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 | |
| 
 |