#!/usr/bin/perl -w

# SReview, a web-based video review and transcoding system
# Copyright (c) 2016-2017, Wouter Verhelst <w@uter.be>
#
# SReview is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License along with this program.  If not, see
# <http://www.gnu.org/licenses/>.

use strict;
use warnings;

use utf8;
use DBI;
use File::Path qw/make_path/;
use File::Temp qw/tempdir/;
use Mojo::Util qw/xml_escape/;

our $config;
require "./config.pl";

my $dbh = DBI->connect($config->{dbistring}, '', '') or die "Cannot connect to database!";

$dbh->begin_work;

my $talkid = $ARGV[0];

my $talk = $dbh->prepare("SELECT * FROM talks WHERE id = ?");

$talk->execute($talkid);

my $row = $talk->fetchrow_hashref();
my $slug = $row->{slug};

my $data = $dbh->prepare("SELECT eventid, event, room, starttime::date AS startdate, slug, speakers, name, subtitle, apologynote FROM talk_list WHERE id = ?");
$data->execute($talkid);
my $drow = $data->fetchrow_hashref();
my $eid = $drow->{eventid};
my $pubdir = $config->{pubdir} . "/" . $eid . "/" . substr($drow->{room}, 0, 1);
my $outputsub = $config->{outputdir};
my $outputdir = &$outputsub($drow->{event}, $drow->{room}, $drow->{startdate});
make_path($outputdir);
my $tmpdir = tempdir( "transXXXXXX", DIR => $config->{workdir}, CLEANUP => 1);

sub process_template($$) {
	my $input = shift;
	my $output = shift;
	my $outputsvg = "$tmpdir/tmp.svg";
	my $speakers = xml_escape($drow->{speakers});
	my $room = xml_escape($drow->{room});
	my $title = xml_escape($drow->{name});
	my $subtitle = xml_escape($drow->{subtitle});
	my $startdate = xml_escape($drow->{startdate});
	my $apology = xml_escape($drow->{apologynote});

	open INPUT, "<$input";
	open my $fh, ">:encoding(UTF-8)", $outputsvg;
	$room =~ s/ \(backup\)//;
	while(<INPUT>) {
		s/\@SPEAKERS@/$speakers/g;
		s/\@ROOM@/$room/g;
		s/\@TITLE@/$title/g;
		s/\@SUBTITLE@/$subtitle/g;
		s/\@STARTTIME@/$startdate/g;
		s/\@APOLOGY@/$apology/g;
		print $fh $_;
	}
	close INPUT;
	close $fh;
	system("inkscape --export-png=$output $outputsvg");
}

my $preroll = $pubdir . "/$slug-pre.png";
if ( ! -f $preroll ) {
	process_template($config->{preroll_template}, $preroll);
}

my $postroll = $pubdir . "/$slug-post.png";
if ( ! -f $postroll ) {
	if(exists($config->{postroll_template})) {
		process_template($config->{postroll_template}, $postroll);
	} elsif(exists($config->{postroll})) {
		$postroll = $config->{postroll};
	} else {
		die "need postroll or postroll template!";
	}
}

my $apology = $pubdir . "/$slug-sorry.png";
if(defined($drow->{apologynote}) && length($drow->{apologynote}) > 0) {
	die unless exists($config->{apology_template});
	process_template($config->{apology_template}, $apology);
	system("ffmpeg -y -loop 1 -i $apology -c:v libx264 -pix_fmt yuv420p -framerate 25 -frames:v 125 $tmpdir/$slug-sorry.ts");
}

# concatenate preroll, main video, postroll
system("ffmpeg -y -loop 1 -i $preroll -c:v libx264 -pix_fmt yuv420p -framerate 25 -frames:v 125 $tmpdir/$slug-preroll.ts");
system("ffmpeg -y -i $pubdir/$slug.ts -c copy -bsf:v h264_mp4toannexb -y $tmpdir/$slug.ts");
system("ffmpeg -y -loop 1 -i $postroll -c:v libx264 -pix_fmt yuv420p -framerate 25 -frames:v 125 $tmpdir/$slug-postroll.ts");
if( -f "$tmpdir/$slug-sorry.ts") {
	system("ffmpeg -y -i \"concat:$tmpdir/$slug-preroll.ts|$tmpdir/$slug-sorry.ts|$tmpdir/$slug.ts|$tmpdir/$slug-postroll.ts\" -c copy -bsf:a aac_adstoasc $outputdir/$slug.mp4");
} else {
	system("ffmpeg -y -i \"concat:$tmpdir/$slug-preroll.ts|$tmpdir/$slug.ts|$tmpdir/$slug-postroll.ts\" -c copy -bsf:a aac_adtstoasc $outputdir/$slug.mp4");
}
system("ffmpeg -y -i $outputdir/$slug.mp4 -pass 1 -passlogfile $tmpdir/passlog-vp8 -c:v libvpx -c:a libvorbis $outputdir/$slug.vp8.webm");
system("ffmpeg -y -i $outputdir/$slug.mp4 -pass 2 -passlogfile $tmpdir/passlog-vp8 -c:v libvpx -c:a libvorbis $outputdir/$slug.vp8.webm");

my $update = $dbh->prepare("UPDATE talks SET state = state_next(state) WHERE id = ? AND state = 'generating_data'");
$update->execute($talkid);
$dbh->commit;
