# $Id: MediaFire 11377 2010-05-05 01:10:51Z sparky $
# Get::MediaFire - File getter plugin for rsget.pl
#
# 2009-2010 (c) Przemysław Iskra <sparky@pld-linux.org>
#		This program is free software,
# you may distribute it under GPL v2 or newer.

name: MediaFire
short: MF
web: "http://www.mediafire.com/"
tos: "http://www.mediafire.com/terms_of_service.php"
uri: qr{mediafire\.com/(file/|\?|download\.php\?)[a-z0-9]+}
cookie: mf
slots: max
status: OK 2010-05-05

unify:
	return "http://www.mediafire.com/?$1" if
		m{mediafire\.com/(?:file/|\?|download\.php\?)([a-z0-9]+)};

start:
	GET( $-{_uri} );

stage_init:
	if ( $-{_referer} =~ /error\.php/ ) {
		ERROR( "file not found" ) if /Invalid or Deleted File/;
		ERROR( "some error" );
	}

	! m{<div class="download_file_title".*> (.+?) <div.*>\(($STDSIZE)\)</div> </div>}o;
	INFO( name => $1, asize => $2 );

	my %func = m/function (\S+)\(qk,pk,r\)\{.*?io=document\.getElementById\('([0-9a-f]+)'\)/g;

	! m/(\S+=unescape.*?eval|eval\(".*?"\))/;
	! $_ = jseval( $1 );

	! /^(\S+)\('(.*?)','(.*?)','(.*?)'\)$/;
	$-{func_id} = $func{ $1 };

	GET( "/dynamic/download.php?qk=$2&pk=$3&r=$4", keep_referer => 1 );

	! /^\s*(var.*var.*var.*)\s*function/m;
	my $vars = $1;
	my %vars = map { /var (.*?)='(.*?)'/ } split /;/, $vars;

	my @esc = m/(\S+=unescape.*?eval|eval\(".*?"\))/g;
	if ( scalar @esc ) {
		foreach my $e ( @esc ) {
			$_ = jseval( $e );
			if ( /getElementById\('([0-9a-f]+)'\)/ ) {
				last if $-{func_id} eq $1;
			}
		}
	} else {
		while ( s/^.*?getElementById\('([0-9a-f]+)'\)//s ) {
			last if $-{func_id} eq $1;
		}
	}

	! m{href=\\"http://"\s*\+\s*(.*)\s*\+\s*'(/.*?)">};
	my $order = $1; my $name = $2;
	my $code = join "", map { /'(.*)'/ ? $1 : $vars{ $_ } } split /\s*\+\s*/, $order;
	my $uri = "http://" . $code . $name;

	DOWNLOAD( $uri );

	GOTO stage_init;

perl:

sub jseval
{
	local $_ = shift;
	while ( /eval/ ) {
		if ( m/=unescape\('(.*?)'\);.*?fromCharCode\(\S+?\.charCodeAt\(\S+?\)\^([0-9\^]+)\)\);eval/ ) {
			my $c = chr eval $2;
			my $u = uri_unescape( $1 );
			$_ = $u ^ ($c x length $u);
		} elsif ( m/eval\("(.*?)"\)/ ) {
			$_ = $1;
			$_ =~ s/\\'/'/g;
		} else {
			last;
		}
	}
	return $_;
}

# vim: filetype=perl:ts=4:sw=4
