#!/usr/bin/perl
use strict;
#use warnings;
use XML::RSS;
# pour supprimer les doublons
use List::MoreUtils qw(uniq);
# pour le timer
use Timer::Simple;
# on ne travaille qu'en utf-8
use open qw/ :std :encoding(UTF-8)/;
# on instancie un timer commencant à 0.0s par défaut
my $t = Timer::Simple->new();
# on lance le timer
$t->start;
# --------------------------------------------------------------------------------
# $ARGV[0] = repertoire dans lequel chercher les fichiers xml rss
# $ARGV[1] = code de la catégorie
# --------------------------------------------------------------------------------
# on recupere le premier argument (repertoire)
my $folder = $ARGV[0];
# on recupere le second argument (code de la catégorie)
my $code = $ARGV[1];
my $categories = {3208 => "une", 3210 => "international", 3214 => "europe", 3224 => "societe", 3232 => "idees", 3234 => "economie",
3236 => "actualite_medias", 3242 => "sport", 3244 => "planete", 3246 => "culture", 3260 => "livres", 3476 => "cinema",
3546 => "voyage", 6518 => "technologies", 8233 => "politique", "env_sciences" => "sciences"};
# si le code de la categorie est introuvable, on met fin au script
die "Code de categorie introuvable !\n" unless exists($categories->{$code});
# on ouvre les deux fichiers de resultats
open my $output_xml, ">:encoding(utf-8)", "$categories->{$code}.xml" or die "$!";
open my $output_txt, ">:encoding(utf-8)", "$categories->{$code}.txt" or die "$!";
# écriture de l'en-tete du fichier xml de sortie
print $output_xml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print $output_xml "<root>\n";
# liste de tous les fichiers xml rss correspondant à la catégorie (reference anonyme à un array)
my $xmls = [];
# on fait appel à la subroutine parcourir
&parcourir($folder);
# on parse les fichiers xml rss
&parsefiles;
sub parcourir{
# on recupere l'argument de la subroutine
my $folder = shift @_;
# on supprime le / final si il existe
$folder =~ s/\/$//;
# on recupere les fichiers et dossier du repertoire
opendir(DIR, $folder);
# on liste tous les fichiers et dossiers du repertoire
my @files = readdir(DIR);
# on ferme le repertoire
closedir(DIR);
# pour chaque fichier/dossier
foreach my $file(@files){
next if $file =~ /^\.\.?$/;
# on constitue le chemin d'acces complet du fichier/dossier
my $f = $folder."/".$file;
# si c'est un dossier, on fait appel à la récursivité
if (-d $f){
&parcourir($f);
}
# si c'est un fichier xml rss, on va appliquer un traitement XML::RSS
# on l'ajoute au tableau @$xmls
if (-f $f && $f =~ /$code.*\.xml/){
push @$xmls, $f;
}
}
}
sub parsefiles{
# liste contenant les titres + descriptions concanténés (reference anonyme à un array)
my $titres_descriptions = [];
# pour chaque fichier xml rss correspondant à la catégorie
foreach my $file(@$xmls){
# on parse le fichier xml en question
my $rss=new XML::RSS;
eval {$rss->parsefile($file); };
if( $@ ) {
$@ =~ s/at \/.*?$//s; # remove module line number
print STDERR "\nERROR in '$file':\n$@\n";
next;
}
# on parcours chaque item du fichier xml d'entrée
foreach my $item (@{$rss->{'items'}}){
# on recupere les titres et description de l'item
my $description=$item->{'description'};
my $titre=$item->{'title'};
# on nettoie le texte
$titre = &nettoietexte($titre);
$description = &nettoietexte($description);
my $xml_file = $file;
my $date = format_date($file);
# on ajoute le titre et la description dans l'array @$titre_description
my $title_desc = $titre."||".$description."||".$xml_file."||".$date;
push @$titres_descriptions, $title_desc;
}
}
# on supprime tous les doublons grace à uniq() qui renvoie un array de valeurs uniques
my @unique = uniq @$titres_descriptions;
# on crée un nouveau dictionnaire avec en valeur la date de publication
my %hash_items = map {$_ =~ /^.+\|\|(.+)$/; $_ => $1;} @unique;
my $compteur = 1;
foreach my $key(sort { $hash_items{$a} <=> $hash_items{$b} or $a cmp $b } keys %hash_items){
# on recupere le titre et la description avec split avec comme séparateur ||
# $t_d[0] = titre
# $t_d[1] = description
my @t_d = split(/\|\|/, $key);
# on écrit les données dans le fichier xml avec numero, date, et fichier pour l'item en question son titre et sa description
print $output_xml "<item numero=\"$compteur\" date=\"$hash_items{$key}\" fichier=\"$t_d[2]\"><titre>$t_d[0]</titre>\n";
print $output_xml "<description>$t_d[1]</description>\n</item>\n";
print $output_txt "$t_d[0]\n";
print $output_txt "$t_d[1]\n";
$compteur++;
}
# fin du fichier xml
print $output_xml "</root>\n";
# on ferme les fichiers de sortie
close $output_xml;
close $output_txt;
# temps écoulé depuis le lancement du programme
print "time so far: ", $t->elapsed, " seconds\n";
}
sub nettoietexte{
my $texte=shift;
$texte =~ s/</</g;
$texte =~ s/>/>/g;
$texte =~ s/<a href[^>]+>//g;
$texte =~ s/<img[^>]+>//g;
$texte =~ s/<\/a>//g;
$texte =~ s/&#39;/'/g;
$texte =~ s/&#34;/"/g;
$texte =~ s/<[^>]+>//g;
$texte =~ s/ / /g;
# ajout du point en fin de chaîne
$texte=~s/$/\./g;
$texte=~s/\.+$/\./g;
return $texte;
}
sub format_date{
my $file = shift;
$file =~ m/(\d+)\/(\d+)\/(\d+)\//;
return $1.$2.$3;
}