The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/perl -w
use strict;
use DBI;
my $config = SReview::Config::Common::setup;
my $dbh = DBI->connect($config->get('dbistring'), '', '') or die "Cannot connect to database!";
my $talkid = shift;
die "need talk ID!" unless defined($talkid);
my $configprefix = shift;
$configprefix = 'upload' unless defined($configprefix);
$dbh->prepare("UPDATE talks SET progress='running' WHERE id=?")->execute($talkid);
my $mt = Mojo::Template->new;
$mt->vars(1);
sub run_command($$$) {
my $file = shift;
my $relative = shift;
my $base = shift;
foreach my $command(@{$config->get("${configprefix}_actions")}) {
my @run;
foreach my $component(@$command) {
my $rendered = $mt->render($component, {file => $file, relative_file => $relative, base => $base });
chomp($rendered);
push @run, $rendered;
}
system(@run);
}
}
my $actions = $config->get("${configprefix}_actions");
exit 0 if(scalar(@$actions) < 1);
my $raw_file = $dbh->prepare("SELECT filename FROM raw_files JOIN talks ON raw_files.room = talks.room JOIN events ON talks.event = events.id WHERE events.name = ? AND stream='' LIMIT 1");
$raw_file->execute($config->get("event"));
$raw_file = $raw_file->fetchrow_hashref();
my $r_file = SReview::Files::Factory->create("input", $config->get('inputglob'))->get_file(relname => $raw_file->{filename});
$raw_file = Media::Convert::Asset->new(url => $r_file->filename);
my $talk_st = $dbh->prepare("SELECT event, event_output, room, room_output, starttime::date AS date, to_char(starttime, 'yyyy') AS year, name AS title, subtitle, slug FROM talk_list WHERE id = ?");
$talk_st->execute($talkid);
my $talkdata = $talk_st->fetchrow_hashref;
my $output_coll = SReview::Files::Factory->create("output", $config->get('outputdir'));
my $inter_coll = SReview::Files::Factory->create("intermediate", $config->get('pubdir'));
my $subdirs = $config->get('output_subdirs');
my @elems = ();
foreach my $subdir(@$subdirs) {
push @elems, $talkdata->{$subdir};
}
my $reldir = join('/', @elems);
my $talk = SReview::Talk->new(talkid => $talkid);
my @files = ();
if($configprefix eq "upload" && ($config->get('cleanup') eq "all" || $config->get('cleanup') eq 'previews')) {
push @files, (
$inter_coll->get_file(relname => $talk->relative_name . "/main.mkv"),
$inter_coll->get_file(relname => $talk->relative_name . "/main.webm"),
$inter_coll->get_file(relname => $talk->relative_name . "/main.mp4"),
$inter_coll->get_file(relname => $talk->relative_name . "/post.mkv"),
$inter_coll->get_file(relname => $talk->relative_name . "/post.webm"),
$inter_coll->get_file(relname => $talk->relative_name . "/post.mp4"),
$inter_coll->get_file(relname => $talk->relative_name . "/post.png"),
$inter_coll->get_file(relname => $talk->relative_name . "/pre.mkv"),
$inter_coll->get_file(relname => $talk->relative_name . "/pre.webm"),
$inter_coll->get_file(relname => $talk->relative_name . "/pre.mp4"),
$inter_coll->get_file(relname => $talk->relative_name . "/pre.png"),
$inter_coll->get_file(relname => $talk->relative_name . "/sorry.png"),
);
for my $count(0, 1, 2) {
for my $ext(qw/wav mp3 ogg/) {
push @files, $inter_coll->get_file(relname => $talk->relative_name . "/audio$count.$ext");
}
}
}
my $exts = [];
if($configprefix ne "sync") {
foreach my $profile(@{$config->get('output_profiles')}) {
push @$exts, Media::Convert::Asset::ProfileFactory->create($profile, $raw_file, $config->get('extra_profiles'))->exten();
}
} else {
$exts = $config->get('sync_extensions');
}
foreach my $ext(@$exts) {
my $basename = join('.', $talkdata->{slug}, $ext);
my $file = $output_coll->get_file(relname => join('/', $reldir, $basename));
run_command($file->valid_path_filename, $file->relname, $file->basepath);
if($config->get('cleanup') eq "all" || $config->get('cleanup') eq 'output') {
push @files, (
$file,
$output_coll->get_file(relname => $file->relname . "/multipass-0.log"),
);
}
}
if (scalar(@files) > 0) {
foreach my $file(@files) {
$file->delete;
}
}
$dbh->prepare("UPDATE talks SET progress='done' WHERE id = ?")->execute($talkid);