package Plugins::ifolder;
#
# ifolder.pm module is a part of Web Share Downloader
# Copyright (C) 2006-2008 by Aleksey Luzin
#
#

use strict;
use warnings;
use lib '..';
use sql;
use WSD::Download qw/&direct_download &create_request/;
use Common;
use HTTP::Request::Common qw(POST);
use MIME::Base64;
use Data::Dumper;
use Exporter ();
use vars qw($VERSION);

our (@ISA, @EXPORT);
@ISA = qw(Exporter);
@EXPORT = qw(&check_link &download);
$VERSION = "1.6" ;


sub check_link {
	shift;
	my $link = shift;
	if (($link =~ /ifolder\.ru/)|| ($link =~ /fastfile\.ru/)|| ($link =~ /rapidshara\.ru/) || ($link =~ /filearchiv\.ru/)) {
		return 1;
	}
	return 0;
}
sub step1 {
	$log->write(2,"ifolder::Step1");
	my $link = shift;
	my $id = shift;
	my $pasw = 0;
	$link =~ m|(http\://[^/]*)|;
	my $prefix = $1;
	$prefix||='http://ifolder.ru';
	my $link0 = $link;
	my $req = create_request($link);
	my $response = $browser->request($req);
	unless ($response->is_success) {return '';  }
	my $content = $response->content;
	$content =~ /name="session" value="(.*?)">/;
	my $ssid = $1;
	$content =~ /name="file_id" value="(.*?)">/;
	my $file_id = $1;
	if ($content =~ /type="password" name="pswd"/) {$pasw = 1;}
	my $ssid2 = '';
	my $ssid3 = '';
	if(($content =~ /       /)||($content =~ /       /)|| ($content =~ /Данный файл может быть скачан только после просмотра/) ||
	    ($content =~ /    /)|| ($content =~ /    /)||($content =~ /На данный момент иностранный трафик/) ||
	    ($content =~ /   /)|| ($content =~ /   /)||($content =~ /Файл помещен в архив/)
	) {
		$content =~ m~(http://ints.ifolder.ru.*?)[\"\']~;
		my $adlink1 = $1;
		$log->write(2, 'adlink1: '.$adlink1);
		my $resp = $browser->get($adlink1);
		my $cont = $resp->content();
		$cont =~ m~(http://s.agava.ru.*?)\>~;
		my $adlink2 = $1;
		$log->write(2, 'adlink2: '.$adlink2);
		$req = create_request($adlink2);
		$resp = $browser->request($req);
		$cont = $resp->content();
		$cont =~ /f_top\"\s*?src\=\"([^\"]*?)\"/;
		my $adlink3 = 'http://ints.ifolder.ru'.$1;
		$log->write(2, 'adlink3: '.$adlink3);
#		my $adlink4 = $resp->header('location');
#		$log->write(2, 'adlink4: '.$adlink4);
		$req = create_request($adlink3);
		$resp = $browser->request($req);
		sleep(30);
		$resp = $browser->request($req);
		$cont = $resp->content();
		$prefix = 'http://ints.ifolder.ru';
		$adlink3 =~ /session\=(.*)/;
		$ssid = $1;
		$link0 = $adlink3;
		$file_id = '';

		if ($cont =~ /interstitials_session/) {
			$cont =~ /tag.value.*?[\'\"]([^\'\"]+)/;
			$ssid2 = $1;	
		}
		if($cont =~ /var v \=/) {
			$cont =~ /var v =.*?name=[\"\']([^\'\"]+)/;
			$ssid3 = $1;
		}
	}
	open FD, "> $config->{logdir}/ifolder1.html";
	print FD $content;
	close FD;
	my $hc = '';
	if($content =~ /hidden_code'[^\']*?'([^\']*?)\'/) {
		$hc = $1;
		$hc =~ s/^.//;
		$log->write(2, $hc);
	}
	$log->write(2, $prefix.'/random/images/?session='.$ssid.'&mem');
	$response = $browser->get($prefix.'/random/images/?session='.$ssid.'&mem');
	$content = $response->content;
	my $image = encode_base64($content);
	my $rnd = int(rand(1000000));
#wait for input image numbers
	my $tmp = 'rnd='.$rnd.'|ssid='.$ssid;
	$tmp.='|file_id='.$file_id.'|pasw='.$pasw.'|hc='.$hc.'|link0='.encode_base64($link0);
	$tmp.='|ssid2='.$ssid2;
	$tmp.='|ssid3='.$ssid3;
	$tmp.='|image='.$image;
	$links->setstatus($id, {status=>5, statustext=>'Waiting for input', tmp=>$tmp,input=>'', nexttry=>'3 minute', hostname=>$config->{host}});
	return '';   
}
sub strtohash {
	my $str = shift;
	my %hash;
	my @a = split(/\|/, $str);
	foreach my $a (@a) {
		my @a1 = split('=', $a);
		$hash{$a1[0]} = $a1[1];
	}
	return \%hash;
}

sub step2 {
	my $link = shift;
	$log->write(2,"ifolder::Step2");
	my $h = strtohash($link->{tmp});
	my $content = ['session'=>$h->{ssid}, 'file_id'=>$h->{file_id},  action=>1, hidden_code=>$h->{hc},activate_ads_free=>0,'confirmed_number'=>$link->{input},];
	if($h->{ssid2}) {
		push @{$content}, 'interstitials_session';
		push @{$content}, $h->{ssid2};
	}
	if($h->{ssid3}) {
		push @{$content}, $h->{ssid3};
		push @{$content}, 1;
	}
	if(($h->{pasw})&&($link->{comment}=~ /pass=\"(.*?)\"/)) {
		$content = ['session'=>$h->{ssid}, 'file_id'=>$h->{file_id},'pswd'=>$1,  'confirmed_number'=>$link->{input}, 'session'=>$h->{ssid}, action=>1];
	} 
	print STDERR Dumper($content);
	my $req = POST decode_base64($h->{link0}),
		Referer=>decode_base64($h->{link0}),
		Content => $content;
	$log->write(2, $req->as_string());
	my $response = $browser->request($req);
	if($response->code==301) {
		$response = $browser->get($response->header('location'));
	}
	$content = $response->content;
	if($content =~ /неверный код,</) {
			
	}
	open FD, "> $config->{logdir}/ifolder2.html";
	print FD $content;
	close FD;
#	$log->write(3, $content);
	$content =~ m~a href=\"(.*?download/.*?)\"~;
	$log->write(2,"Dlink::$1");
	return $1;
}
sub download {
	shift;
	my $id = shift;
	my $link = $links->getlink($id);
	my $dlink = '';
	if(($link->{status} == '5')&&($link->{nexttry} > $link->{now})) {
		$links->setstatus($id, {status=>1});
		$dlink = step2($link) if($link->{input});
	} else {
		$links->setstatus($id, {status=>1});
		step1($link->{link}, $id);
		return '';
	}
	if ($dlink) {
		my $req = create_request($dlink);
		WSD::Download::direct_download($id, $req);    
	} else {
		my $error = '    ';
		$links->setstatus($id, {status=>3, statustext=>$error, nexttry=>"5 minute"});
	}
}

1;