#!/usr/bin/env perl
#
# Récupérer les photographies des jolies dames de www.bonjourmadame.fr.
#
# $Id       : bonjour-madame.pl $
# $HeadURL  : https://bobotig.fr/contenu/contrib/scripts/bonjour-madame.pl $
# $Source   : https://bobotig.fr/contenu/contrib/scripts/bonjour-madame.pl $
# $Author   : BoboTiG $
# $Revision : 16 $
# $Date     : 2013/06/27 $
#
# ----------------------------------------------------------------------
#
# La 1ère madame date du 19 mars 2009.
#
# Usage : perl bonjour-madame.pl
#
# ! Attention ! Ce script va télécharger toutes les images dans le
# dossier courant.
#
# ----------------------------------------------------------------------
#
# Dépendance :
#    - cpan -i LWP::UserAgent;
#
# ----------------------------------------------------------------------
#
# Historique
#	[ 20 août 2010 ]
#		- vérifier que toutes les photos soient téléchargées
#		- télécharger seulement les photos manquantes
#	[ 25 août 2010 ]
#		- script portable, utilisation de commandes perl plutôt que sh
#		- regexp fixées, téléchargement des HD en priorité
#		- code revu, plus court et pertinent
#	[ 30 août 2010 ]
#		- suppression du comptage des images déjà téléchargées (inutile)
#		- ajout d'une variable pour ignorer certaines images
#	[ 11 septembre 2010 ]
#		- création des images en mode binaire
#		- diverses modifications
#	[ 04 avril 2011 ]
#		- ajout d'un sleep si erreur
#	[ 18 juin 2011 ]
#		- correction de la détermination de l'extension
#		- utilisation de say préférée à print
#	[ 07 juillet 2011 ]
#		- meilleure détermination de l'extension (et fonctionnelle... !)
#	[ 12 décembre 2011 ]
#		- mise à jour des regexp
#	[ 29 janvier 2012 ]
#		- amélioration de l'affichage
#	[ 31 juillet 2012 ]
#		- correction de l'affichage
#		- correction des doublons de la 637 à 709
#	[ 04 août 2012 ]
#		- correction de la récupération de certains images depuis la 1270
#		- correction de la regexp pour la récupération du lien de l'image
#		- modification du shebang
#		- revue du système d'erreur
#	[ 06 août 2012 ]
#		- prise en compte des images GIF
#		- ajout des fonctions est_windows(), existe() et type()
#		- prise en compte correcte du caractère de retour à la ligne
#	[ 15 octobre 2012 ]
#		- màj des regexp pour prendre en compte la nouvelle mise en page
#	[ 16 mai 2013 ]
#		- màj des regexp pour la capture des images
#		- màj de l'user-agent
#	[ 22 mai 2013 ]
#		- màj de la regexp pour la capture du nombre total d'images
#		- prise en compte des données compressées (GZIP)
#	[ 27 juin 2013 ]
#		- màj de la regexp pour la capture du lien de l'image
#

use 5.010;
use LWP::UserAgent;
use autodie 'close';
use strict;
use warnings;


# Variables ------------------------------------------------------------
our $VERSION = '1.4.1';
my $ua; my $requete;
my $total; my $i;
my $ignorer = 
	':366:392:639:640:642:644:646:648:650:652:654:656:658:660:662:664'.
	':666:668:670:672:678:680:682:684:686:688:690:692:692:694:696:698'.
	':700:702:704:707:709:';
my $agent = 
	'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) '.
	'Gecko/20130515 Firefox/17.0 Iceweasel/17.0.6';
my $lien = 'http://www.bonjourmadame.fr';
my $retour = "\e[A";


sub est_windows {
	my $se = $^O;
	return ( $se eq 'dos' or $se eq 'MSWin32' );
}

sub existe($) {
	my $img = shift;
	return ( -e $img.'.gif' || -e $img.'.jpg' || 
			 -e $img.'.png' || $ignorer =~ m/:($img):/ );
}
sub type($) {
	my $hex = shift;
	my $trois_octets =
		sprintf('%02x', ord(substr($hex, 0, 1))).
		sprintf('%02x', ord(substr($hex, 1, 1))).
		sprintf('%02x', ord(substr($hex, 2, 1)));
	my $ext = undef;
	if ( $trois_octets eq '474946' ) {
		$ext = '.gif';
	} elsif ( $trois_octets eq 'ffd8ff' ) {
		$ext = '.jpg';
	} elsif ( $trois_octets eq '89504e' ) {
		$ext = '.png';
	}
	return $ext;
}

# C'est parti mon kiki ! -----------------------------------------------
say ' ~ bonjour-madame.pl v'.$VERSION.' { BoboTiG }.';
$ua = LWP::UserAgent->new();
$ua->agent($agent);
$requete = $ua->get($lien);
if ( !$requete->is_success ) {
	say ' ! Connexion merdique... | Err : '.$requete->status_line;
	exit 1;
}
($total) = $requete->decoded_content =~ m#Page 1 <em>sur</em> ([0-9]+)</div>#;
if ( !defined $total ) {
	say ' ! Nombre de pages inconnu... Retente plus tard.';
	exit 1;
}
$i = $total - 1;
say ' > Total : '.$i.' ; c\'est parti mon kiki !';
$retour = "\r" unless ! est_windows();
while ( $i > 0 ) {
	my $num = $total - $i;
	if ( existe($num) ) {
		say '    + '.$num.$retour unless est_windows();
		--$i;
		next;
	}
	$requete = $ua->get($lien.'/page/'.$i);
	if ( !$requete->is_success ) {
		say ' ! Arf : '.$num.' | Err : '.$requete->status_line;
		--$i;
		next;
	}
	
	my $image;
	($image) = $requete->decoded_content =~ m#class="photo-url" href="(.+)">View Separately</a>#m;
	if ( !$image ) { ($image, undef) = $requete->decoded_content =~ m#<a href="(.+)"><img src="(.*)" alt=#m; }
	if ( !$image ) { ($image, undef) = $requete->decoded_content =~ m#<img src="(.+)" alt="(.*)"\s*/>#m; }
	if ( !$image ) { ($image) = $requete->decoded_content =~ m#<img src="(.+)" alt=""/>#m; }
	if ( !$image ) { ($image) = $requete->decoded_content =~ m#\[<a href="(.+)">2D</a>]#m; }
	if ( $image && $image =~ m#^http://www.bonjourmadame.fr/image/#m ) {
		(undef, $image) = $ua->get($image)->decoded_content =~ m#<img id="image" class="(.*)" src="(.+)"/>#m;
	}
	if ( $image )
	{
		# Récupération de la photo
		my $salut_toi = $ua->get($image);
		if ( !$salut_toi->is_success ) {
			say ' ! Arf : '.$num.' | Err : '.$salut_toi->status_line;
			say $image; exit;
			--$i;
			next;
		}
		
		# Détermination de l'extension
		my $ext = type(substr($salut_toi->content, 0, 3));
		if ( !$ext ) {
			say ' ! Arf : '.$num.' | Err : extension pourrave.';
			--$i;
			next;
		}
		
		# Création de l'image
		my $img = $num.$ext;
		if ( open my $SLT, '>>', $img ) {
			binmode $SLT;
			print {$SLT} $salut_toi->content;
			close $SLT;
			say '    + '.$num.$retour;
		} else {
			say ' ! Arf : '.$num.' | Err : '.$!;
		}
	} else {
		say ' ! Arf  : '.$num.' | Err : impossible de trouver l\'image.';
		say $requete->decoded_content
	}
	--$i;
}
say ' ^ Finito !';
exit 0;
