YoutubePodcaster

De Wiki LOGre
Révision datée du 19 septembre 2019 à 13:01 par Baptiste (discussion | contributions) (Page créée avec « {{langages|YoutubePodcaster}} Category:Baptiste Category:projets == Présentation == Vous aimez une chaîne Youtube et voudriez écouter celle-ci en podcast ? Vo... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
Langue : Français

Présentation

Vous aimez une chaîne Youtube et voudriez écouter celle-ci en podcast ? Voilà comment faire !

Dans ce wiki, je vais partir de mon cas propre : un serveur web, accessible sur internet public mais non référencé, pour un usage personnel.

Pré-requis

Aperçu du système de fichier

user@server:~/youtube2podcast$  pwd
/home/user/youtube2podcast
user@server:~/youtube2podcast$ ls -la
total 1812
drwxr-xr-x 4 user user 4096        Sep 19 14:18 .
drwxr-xr-x 9 user user 4096        Sep 17 20:01 ..
drwxr-xr-x 5 user user 36864       Aug 27 10:51 output
-rw-r--r-- 1 user user 381         Aug 27 10:47 machaine.json
-rwxr-xr-x 1 user user 1765320     Aug 12 08:51 youtube-dl
-rw-r--r-- 1 user user 385         Aug 21 09:32 youtube-dl.conf
-rwxr-xr-x 1 user user 3425        Aug 21 10:18 yt2podcast.pl

user@server:~/youtube2podcast$ ls -la output
total 1812
drwxr-xr-x 2 user user 20480 Sep 19 14:50 machaine
lrwxrwxrwx 1 user user    11 Aug 13 15:23 machaine.xml

user@server:~/youtube2podcast$ ls -la output/machaine
total 1812
-rw------- 1 user user      35550 Sep 15 14:50 20190915-2Rbhqsefyw.info.json
-rw-r--r-- 1 user user   18803781 Sep 15 14:12 20190915-2Rbhqsefyw.mp3
-rw-r--r-- 1 user user   23094892 Sep 15 14:12 20190915-2Rbhqsefyw.webm
-rw------- 1 user user      33943 Sep 18 14:50 20190918-BZsefsg4vAE.info.json
-rw-r--r-- 1 user user   14789205 Sep 18 12:15 20190918-BZsefsg4vAE.mp3
-rw-r--r-- 1 user user   18060427 Sep 18 12:15 20190918-BZsefsg4vAE.webm

Fichiers utilisés

  • youtube-dl : le script de téléchargement des vidéos
  • yt2podcast.pl : le script qui, en gros, fait tout le boulot une fois la vidéo téléchargée
  • youtube-dl.conf : Le fichier de paramètrage de youtube-dl. Il faut le modifier un poil entre le mode "premier podcast" et le mode "rester à jour" mais on y viendra plus tard.
  • machaine.json : Un fichier json par chaîne à podcaster
  • output/ : Le répertoire exposé sur internet


Installation

  • Installez youtube-dl (cf leur site)
  • Créez le répertoire de destination (ici nommé output/)
  • déposez les autres fichiers au même endroit

Configuration initiale (aka premier podcast)

  • Dans le fichier yt2podcast.pl, ligne 18, remplacez la valeur de la variable par le chemin vers le dossier de l'installation (ici /home/user/youtube2podcast)
  • Remplacez les champs du fichier json. La plupart sont assez basiques, mais pour d'autres, voilà à quoi ils servent :
    • "link" : L'URL de la section "vidéos" de la chaine. D'ailleurs, normalement, ça finit pas /videos
    • "thumbnail" : Certains clients podcats affichent un thumbnail. Vous pouvez le récupérer de la page youtube de votre chaine avec un clic droit >enregistrer l'image sur le logo, ou ne rien mettre.
    • "baseURL" : L'URL du répertoire web dans lequel les fichiers seront disponibles. Attention ne pas mettre le / final du répertoire !
    • "xmlFileName": Le nom que vous voulez donner au fichier xml de podcast
    • "outputDir" : Le chemin absolu vers le répertoire dans lequel on va mettre les fichiers (et sur lequel point baseURL) Attention ne pas mettre le / final du répertoire !
  • Créez le répertoire "outputDir" de cette chaine (exemple : /home/user/youtube2podcast/output/machaine/)
  • Dans le fichier youtube-dl.conf, supprimez la dernière ligne (celle qui spécifie de ne pas télécharger plus de 3 fichiers)
  • lancez le script avec le json en paramètre : ./yt2podcast.pl machaine.json
  • Attendre que tout se télécharge bien gentiment. Ça peut prendre du temps selon le nombre de videos de la chaine, donc je recommande de faire tout ça dans un GNU Screen, et de revenir le ledemain ;)

Configuration de mise à jour

  • Remettez la dernière ligne dans le fichier youtube-dl.conf, ou retéléchargez le.
  • Mettez en place un cron job pour appeller yt2podcast.pl, par exemple :

50 5 * * * /usr/bin/perl /home/user/youtube2podcast/yt2podcast.pl /home/user/youtube2podcast/machaine.json

Configuration du client podcast

Vous avez sans doute quelque part le moyen de renseigner l'adresse du podcast que vous voulez ajouter. L'adresse est constituée du baseURL et du xmlFileName, comme dans notre exemple : https://monserveur.web/machaine/machaine.xml

Liste des fichiers

yt2podcast.pl

#!/usr/bin/perl

use utf8;
use strict;
use warnings;
use JSON;
use Encode qw(decode) ;

my $infile = '';
if($#ARGV!=0){
  print "Usage : yt2podcast.pl <json file>\n";
  exit;
}else{
  $infile = $ARGV[0];
}


my $ytdlDir = '/home/user/youtube2podcast';


my $jsonparams = '';
open( my $in, "<:encoding(utf-8)","$infile");

while(my $line  = <$in>){
  chomp $line;
  $jsonparams .= $line;
}

my $params = JSON->new->utf8(0)->decode($jsonparams);


my $ytdlCommand = "$ytdlDir/youtube-dl --config-location $ytdlDir/ -o '$params->{'outputDir'}/%(upload_date)s-%(id)s.%(ext)s' '$params->{'link'}' ";


print "$ytdlCommand \n";
#exit;

system($ytdlCommand);


open(my $out,'>:encoding(utf-8)', "$params->{'outputDir'}/$params->{'xmlFileName'}");

print $out '<?xml version="1.0" encoding="UTF-8" ?>';
print $out '<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcastRF="https://wiki.logre.eu/index.php?YoutubePodcaster" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" version="2.0">';
print $out "\n";
print $out '<channel>';
print $out "\n";
print $out '<title>'.$params->{'title'}.'</title>';
print $out "\n";
print $out '<link>';
print $out "\n";
print $out $params->{'link'};
print $out "\n";
print $out '</link>';
print $out "\n";
print $out '<description>';
print $out "\n";
print $out $params->{'description'};
print $out "\n";
print $out '</description>';
print $out "\n";
print $out '<language>fr</language>';
print $out "\n";
print $out '<copyright></copyright>';
print $out "\n";
print $out '<lastBuildDate>';
print $out `date '+%a, %d %b %Y %T %z'`;
print $out '</lastBuildDate>';
print $out "\n";
print $out '<generator>https://wiki.logre.eu/index.php?YoutubePodcaster</generator>';
print $out "\n";
print $out '<image>';
print $out "\n";
print $out "<url>";
print $out $params->{'thumbnail'};
print $out "</url>";
print $out "\n";
print $out '<title>'.$params->{'title'}.'</title>';
print $out "\n";
print $out "<link>";
print $out $params->{'link'};
print $out "</link>";
print $out "\n";
print $out '</image>';
print $out "\n";


my @files = `ls -1 $params->{'outputDir'}/*.info.json`;

while( my $file = pop(@files)){
        chomp $file;
        my $json = `cat $file`;
        my $data = JSON->new->utf8(0)->decode($json);
        my $upload_date = '0';
        my $fulltitle = 'N/A';
        my $url= 'N/A';
        my $fileName = $file;
        $fileName =~ s!.*/(.*).info.json!$1!;
        my $urlmp3 = "$params->{'baseURL'}/$fileName.mp3";
        my $filesize = `du -b $params->{'outputDir'}/$fileName.mp3 | cut -f1`;
        chomp $filesize;
        my $description = 'void';

        if($json =~ m/"upload_date":\s?"([0-9]{4})([0-9]{2})([0-9]{2})"/){
                $upload_date = "$1/$2/$3";
        }
        if($json =~ m/"fulltitle":\s?"([^"]*)"/){
                $fulltitle = $data->{'fulltitle'};
                $fulltitle =~ s/&/&amp;/;
                $fulltitle =~ s/</&lt;/;
                $fulltitle =~ s/>/&gt;/;
        }
        if($json =~ m/"webpage_url":\s?"([^"]*)"/){
                $url = $1;
        }
        if($json =~ m/"description":\s?"([^"]*)"/){
                $description = decode('UTF-8',$1);
                $description = $data->{'description'};
                $description =~ s!\n!<br />!g;
        }

        print $out "<item>\n";
        print $out "<title>$fulltitle</title>\n";
        print $out "<link>$url</link>\n";
        print $out "<description><![CDATA[$description]]></description>\n";
        print $out "<enclosure url='$urlmp3' length='$filesize' type='audio/mpeg'/>\n";
        print $out "<guid>$urlmp3</guid>\n";
        print $out "<pubDate>$upload_date</pubDate>\n";
        print $out "</item>\n";


}



print $out "</channel></rss>\n";
close($out);

youtube-dl.conf

#extract audio
-x --audio-format mp3

#format of files
#-o '%(upload_date)s-%(id)s.%(ext)s'

#write metadata in info.json file
--write-info-json

#do no overwrite files and keep them
-w -k --no-post-overwrites

#sleep timers to avoid errors
--sleep-interval 20 --max-sleep-interval 180

#format selection
-f 'bestaudio/best'

#max number of episodes in one go
--playlist-end 3

machaine.json

{
"title":"Ma chaine a moi",
"description": "Une description",
"link": "https://www.youtube.com/user/xxx/videos",
"thumbnail": "https://yt3.ggpht.com/a/blabla",
"baseURL":"https://monserveur.web/machaine",
"xmlFileName": "machaine.xml",
"outputDir":"/home/user/youtube2podcast/output/machaine"

}