# $Id: MediaFire 11315 2010-04-08 13:35:58Z 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.

# TODO: some links have problems

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

unify:
	return "http://www.mediafire.com/?$1" if
		m{mediafire\.com/(?:file/|\?)([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;
	! scalar @esc;
	foreach my $e ( @esc ) {
		$_ = jseval( $e );
		if ( /getElementById\('([0-9a-f]+)'\)/ ) {
			last if $-{func_id} eq $1;
		}
	}

	! m{href=\\"http://"\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
