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
|
||
|
|