#!/usr/bin/perl # Copyright (C) 2019 Quentin GIBEAUX # Copyright (C) 2019 Frédéric COUCHET # Copyright (C) 2019 Christian Pierre MOMON # # 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 . 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; 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 < }; 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; $short_description =~ /^#(\d+)\s+-/ ; my $no_emission = $1 ; 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; } } # 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; } } # duration my $command = "mediainfo --Inform=\"Audio;%Duration/String3%\" $source_name.$format > $source_name.$format.duration"; if($dryrun) { print "$command\n"; } else { my @ret = `$command`; if($?) { print "Error while generation duration of $source_name.$format\n"; if($verbose) { print Dumper @ret; print Dumper $data; } return 0; } } # size my $command = "du -b $source_name.$format |awk '{print \$1}' > $source_name.$format.size"; if($dryrun) { print "$command\n"; } else { my @ret = `$command`; if($?) { print "Error while generation size of $source_name.$format\n"; if($verbose) { print Dumper @ret; print Dumper $data; } return 0; } } } binmode(STDOUT, ":utf8"); my $url = "https://libreavous.org/" . $no_emission ; print "\nListe des actions à faire après la découpe des podcasts : \n\n"; print "Note importante : Si lors de l'émission un sujet n'a pas pu être traité, avant de faire l'import il faut d'abord supprimer le chapître de l'article Spip, pour éviter tout bug possible\n\n"; print "Penser à faire un git commit puis un git push du fichier json modifié de l'émission (sinon l'import Spip ne se fera pas)\n\n"; print "Se connecter sur le site web de l'émission sur l'article qui correspond à l'émission : https://libreavous.org/" . "$no_emission\n\n"; print "Cliquer sur le bouton « Article » qui est en bas de la page dans la zone grisée\n\n"; print "Cliquer sur le bouton « Importer l'émission »\n\n"; print "Les requêtes effectuées sont affichées et normalement aucune erreur est affichée\n\n"; print "Aller sur la page https://www.libreavous.org/ecrire/?exec=admin_vider, vider le le « répertoire cache » en cliquant sur « Vider le cache » (le premier bouton)\n\n"; print "Retourner sur la page de l'émission : $url\n\n"; print "Si le site web semblé (affichage bizarre) c'est que le vidage du cache a généré un bug\n\n"; print "Dans ce cas, il faut se connecter sur la VM Spip et faire\n\n"; print "cd /var/lib/spip/sites/www.libreavous.org/tmp/cache\n\n"; print "rm -rf *\n\n"; print "Si l'import s'est passé correctement, le lecteur pour le podcast de l'émission apparaît ainsi que les boutons pour les podcasts individuels (dans « Sujet principal » et dans « Et aussi »)\n\n"; print "Aller sur https://www.libreavous.org. Les liens vers les podcasts doivent être présents\n\n"; print "Aller sur https://www.libreavous.org/rss. Les items des podcasts pour le flux RSS doivent être présents\n\n"; if(! $mp3) { print "MP3 files not generated, please use --mp3 option to generate them\n"; } } process($config,$mp3,$verbose,$dryrun);