lav-outils/podcasts/scripts/make-all-podcasts.pl
Frédéric Couchet a6c588d481 Ajout de la génération des fichiers .size (taille du fichier podcast) et .duration
(durée du fichier podcast). Ces fichiers sont nécessaires pour le script
d'import des fichiers JSON permettant de faciliter la création de la page
consacrée à l'émission sur le nouveau site libreavous.org.
2021-09-27 09:14:05 +02:00

310 lines
8.0 KiB
Perl
Executable File

#!/usr/bin/perl
# Copyright (C) 2019 Quentin GIBEAUX <qgibeaux@april.org>
# Copyright (C) 2019 Frédéric COUCHET <fcouchet@april.org>
# Copyright (C) 2019 Christian Pierre MOMON <cmomon@april.org>
#
# This file is part of lav-outils from "April/Libre à vous !"
#
# This script 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 Getopt::Long;
use JSON;
use Data::Dumper;
use utf8;
my ($help,$config,$verbose,$dryrun);
my $meta_data_script = "lav-outils/podcasts/scripts/make-metadata-image-podcast.sh";
my $verbose;
my $mp3;
my $textwebpage="<ul>\n";
GetOptions ("help" => \$help,
"config=s" => \$config,
"mp3" => \$mp3,
"verbose" => \$verbose,
"dryrun" => \$dryrun);
if($help) {
usage();
} elsif( not $config ) {
print " /!\\ Missing config arg\n\n";
usage();
}
sub usage {
print <<EOS
Exec commands to cut and process LAV! podcast with json file containing the timestamps and sections to be cut.
Needs JSON perl library (apt install libjson-perl)
$0 --config conf_file.json
--config conf_file.json the configuration file containing stuff
--mp3 generate mp3 files
--help show this message
--verbose increase verbosity
--dryrun print commands without executing them
EOS
;
}
sub read_config {
my ($filename) = @_;
my $json_text = do { #read all the file in one shot
open(my $json_fh, '<:encoding(UTF-8)', $filename)
or die("Can't open \$filename\": $!\n");
local $/;
<$json_fh>
};
my $json = JSON->new;
my $data = $json->decode($json_text);
return $data;
}
sub process {
my ($config,$mp3,$verbose,$dryrun)=@_;
my $data = read_config($config);
my $short_date = $data->{short_date};
my $year = substr $short_date,0,4;
my $long_date = $data->{long_date};
my $source_name = "libre-a-vous-$short_date";
my $title = "Libre à vous ! du $long_date sur Cause Commune";
my $short_description = $data->{short_description};
my $ffmpeg_bin = $data->{ffmpeg_bin};
my $option_mp3_meta_data_script;
my @formats_files;
if($mp3) {
@formats_files = qw/ogg mp3/;
$option_mp3_meta_data_script = "yes";
}
else {
@formats_files = qw/ogg/;
$option_mp3_meta_data_script = "no";
}
for my $chapter (values @{$data->{chapters}}) {
my $start = $chapter->{start_timestamp};
my $end = $chapter->{end_timestamp};
my $short_chapter_name = $chapter->{short_chapter_name};
my $chapter_title = $chapter->{chapter_title};
# cutting chapter
my $command = "$ffmpeg_bin -y -i $source_name.ogg -vn -acodec copy -ss \"$start\" -to \"$end\" $source_name-$short_chapter_name.ogg";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while cutting $short_chapter_name\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# putting metadata
my $url = "https://media.april.org/audio/radio-cause-commune/libre-a-vous/emissions/$short_date/$source_name-$short_chapter_name.ogg";
my $command = "$meta_data_script -s \"$source_name-$short_chapter_name.ogg\" -d \"output\" -u \"$url\" -t \"$title - Partie $chapter_title\" -p \"$ffmpeg_bin\" -y \"$year\" -m \"$option_mp3_meta_data_script\"";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while setting metadata in $short_chapter_name\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# Update string for web site
my $command = "mediainfo --Inform=\"Audio;%Duration/String%\" output.ogg";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while updating string for web site\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
} else {
chomp($ret[0]);
$ret[0] =~ s/s/secondes/ig;
$ret[0] =~ s/min/minutes/ig;
my $url2 = $url =~ s/\.ogg/\.mp3/r;
$textwebpage = $textwebpage . "<li><a href=\"$url\">$chapter_title</a> (format OGG) (et <a href=\"$url2\">format MP3</a>) ($ret[0])</li>\n";
}
}
# renaming to target OGG and MP3
foreach my $format (@formats_files) {
my $target_name = "$source_name-$short_chapter_name.$format";
my $command = "mv output.$format $target_name";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while renaming $short_chapter_name.$format\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# hashing
my $command = "sha1sum $target_name > $target_name.sha1";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while hashing $target_name\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# generate .size
my $command = "du -b $target_name |awk '{print $1}' > $target_name.size";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while generation size of $target_name\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# generate duration
# my $command = "ffprobe $target_name -show_entries format=duration -sexagesimal 2> /dev/null |grep duration |sed '1,\$s/duration=//' > $target_name.duration";
my $command = "mediainfo --Inform='General;%Duration/String3%' $target_name > $target_name.duration";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while generation duration of $target_name\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
}
}
# putting metadata in main podcast
my $url = "https://media.april.org/audio/radio-cause-commune/libre-a-vous/emissions/$short_date/$source_name.ogg";
my $command = "$meta_data_script -s \"$source_name.ogg\" -d \"output\" -u \"$url\" -t \"$title - $short_description\" -p \"$ffmpeg_bin\" -y \"$year\" -m \"$option_mp3_meta_data_script\"";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while setting metadata in $source_name\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# renaming to target OGG and MP3
foreach my $format (@formats_files) {
my $command = "mv output.$format $source_name.$format";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while renaming $source_name.$format\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
# hashing
my $command = "sha1sum $source_name.$format > $source_name.$format.sha1";
if($dryrun) {
print "$command\n";
} else {
my @ret = `$command`;
if($?) {
print "Error while hashing $source_name.$format\n";
if($verbose) {
print Dumper @ret;
print Dumper $data;
}
return 0;
}
}
}
$textwebpage = $textwebpage . "</ul>\n\n";
binmode(STDOUT, ":utf8");
my $url = "https://www.april.org/libre-a-vous-diffusee-mardi-$long_date-sur-radio-cause-commune";
$url=~s/ /-/g;
print "\nText for the web page of the radio program : $url\n\n";
print "$textwebpage\n\n";
print "Add the html code on $url\n\n";
print "And remove the line : <p>Les podcasts seront disponibles après la diffusion de l'émission (quelques jours après en général).</p>\n\n";
if(! $mp3) {
print "MP3 files not generated, please use --mp3 option to generate them\n";
}
}
process($config,$mp3,$verbose,$dryrun);