diff --git a/lib/Mediafire/.Api.pm.swp b/lib/Mediafire/.Api.pm.swp index 89b956e..ea0f127 100644 Binary files a/lib/Mediafire/.Api.pm.swp and b/lib/Mediafire/.Api.pm.swp differ diff --git a/lib/Mediafire/Api.pm b/lib/Mediafire/Api.pm index a781e3c..ce17a67 100644 --- a/lib/Mediafire/Api.pm +++ b/lib/Mediafire/Api.pm @@ -13,6 +13,7 @@ use HTTP::Request; use JSON::XS; use Mediafire::Api::UploadFile; +use Mediafire::Api::DownloadFile; use Data::Printer; @@ -234,6 +235,17 @@ sub findFileByName { return \@mediafire_files; } +sub downloadFile { + my ($self, %opt) = @_; + + my $download_file = Mediafire::Api::DownloadFile->new( + -ua => $self->{ua}, + ); + $download_file->downloadFile(%opt); + + +} + =pod Вынести в отдельный класс с проверкой наличия такой директории sub createDir { my ($self, %opt) = @_; @@ -300,6 +312,14 @@ B - Upload and Download files from mediafire.com file sharing # Get uploaded file key print "Uploaded file key: " . $mediafire_file->getDouploadKey() . "\n"; + # Find file on mediafire.com by name. Return arrayref to Mediafire::Api::File objects + my $find_result = $mediafire->findFileByName( + -filename => 'file_to_find.txt', + ); + if (@$find_result) { + print "Found files: " . join(' ', map {$_->name()} @$find_result); + } + =head1 Upload Files to server @@ -309,6 +329,44 @@ B - Upload and Download files from mediafire.com file sharing =head2 login(%opt) +=head1 Mediafire::Api::File + +=head2 name + +Set/Get name of file + $mediafire_file->name("New name"); + my $name = $mediafire->name; + +=head2 key + +Set/Get download key of file + + $mediafire_file->key("downloadfilekey"); + my $key = $mediafire_file->key; + +=head2 size + +Set/Get size of file + + $mediafire->size(2343); + my $size = $mediafire->size; + +=head2 hash + +Set/Get sha256sum hashsum of file + + $mediafire_file->hash('dffdf'); + my $hash = $mediafire_file->hash; + +=head1 Find files on mediafire.com + +=head2 findFileByName(%opt) + +Return arrayref with Mediafire::Api::file objects + + %opt: + -filename => Name of file to find + =head1 DEPENDENCE L, L, L, L, L, L, L, L diff --git a/lib/Mediafire/Api/.UploadFile.pm.swp b/lib/Mediafire/Api/.UploadFile.pm.swp deleted file mode 100644 index d58956d..0000000 Binary files a/lib/Mediafire/Api/.UploadFile.pm.swp and /dev/null differ diff --git a/lib/Mediafire/Api/DownloadFile.pm b/lib/Mediafire/Api/DownloadFile.pm new file mode 100644 index 0000000..605f910 --- /dev/null +++ b/lib/Mediafire/Api/DownloadFile.pm @@ -0,0 +1,102 @@ +package Mediafire::Api::DownloadFile; + +use 5.008001; +use utf8; +use strict; +use warnings; +use open qw(:std :utf8); +use Carp qw/croak carp/; +use URI::Escape; +use LWP::UserAgent; +use File::Basename; +use HTTP::Request; +use JSON::XS; + +use Mediafire::Api::File; + +our $VERSION = '0.01'; + +my $DEFAULT_BUFF_SIZE = 1048576; + +######################### PRIVATE METHODS ################################################## +my ($getDonwloadLink, $download); + +$getDonwloadLink = sub { + my ($self, $url) = @_; + + my %headers = ( + 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', + 'Accept-Encoding' => 'gzip, deflate', + 'Accept-Language' => 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', + 'Cache-Control' => 'max-age=0', + 'Upgrade-Insecure-Requests' => '1', + ); + + my $res = $self->{ua}->get($url, %headers); + my $code = $res->code; + if ($code ne '200') { + croak "Wrong response code on request to '$url'. Code: $code"; + } + # Find div with download link + my $content = $res->decoded_content; + if ($content =~ /]+id="download_link".+]+aria-label="Download file"[^>]*href="(.+?)".*<\/div>/s) { + return $1; + } + else { + "Can't found download link"; + } + +}; + +$download = sub { + my ($self, $download_url, $dest_file) = @_; + + my %headers = ( + ':content_file' => $dest_file, + ':read_size_hint' => $self->{buff_size}, + 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', + 'Accept-Encoding' => 'gzip, deflate', + 'Accept-Language' => 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', + 'Upgrade-Insecure-Requests' => '1', + ); + + my $res = $self->{ua}->get($download_url, %headers); + my $code = $res->code; + if ($code ne '200') { + croak "Can't download file by url '$download_url' to file '$dest_file'. Code: $code"; + } + return 1; + +}; + +sub new { + my ($class, %opt) = @_; + my $self = {}; + $self->{ua} = $opt{-ua} // croak "You must specify param '-ua' for method new"; + $self->{buff_size} = $opt{-buff_size} // $DEFAULT_BUFF_SIZE; + bless $self, $class; + return $self; +} + +sub downloadFile { + my ($self, %opt) = @_; + my $mediafire_file = $opt{-mediafire_file} // croak "You must specify '-mediafire_file' param"; + my $dest_file = $opt{-dest_file} // croak "You must specify '-dest_file' param"; + + if (ref($mediafire_file) ne 'Mediafire::Api::File') { + croak "Param '-mediafire_file' must be Mediafire::Api::File object"; + } + + my $file_name = $mediafire_file->name // croak "Can't get file name of downloaded file"; + my $file_key = $mediafire_file->key // croak "Can't get key from upload file '" . $mediafire_file->name . "'"; + my $download_page_url = 'http://www.mediafire.com/file/' . $file_key . '/' . $file_name . '/file'; + + my $download_link = $self->$getDonwloadLink($download_page_url); + + $self->$download($download_link, $dest_file); + +} + + + +1; diff --git a/lib/Mediafire/Api/UploadFile.pm b/lib/Mediafire/Api/UploadFile.pm index 2ba6c12..c21b081 100644 --- a/lib/Mediafire/Api/UploadFile.pm +++ b/lib/Mediafire/Api/UploadFile.pm @@ -8,22 +8,17 @@ use open qw(:std :utf8); use Carp qw/croak carp/; use URI::Escape; use LWP::UserAgent; -use LWP::ConnCache; use File::Basename; use HTTP::Request; use JSON::XS; use MIME::Detect; use Crypt::Digest::SHA256 qw/sha256_hex/; use Time::HiRes qw/gettimeofday/; -use IO::Socket::SSL; use Mediafire::Api::File; -use Data::Printer; - our $VERSION = '0.01'; - my $DEFAULT_BUFF_SIZE = 1048576; ############################ PRIVATE METHODS ############################################ @@ -82,8 +77,6 @@ $checkUploadFile = sub { croak "Can't checkUploadFile. Storage limit exceeded"; } - p $response; - my $file_key = $response->{preemptive_quickkey} // $response->{duplicate_quickkey}; $self->{file}->key($file_key); $self->{upload_url} = $response->{upload_url}->{resumable}; @@ -256,7 +249,7 @@ sub new { my $self = {}; $self->{ua} = $opt{-ua} // croak "You must specify param '-ua' for method new"; $self->{session_token} = $opt{-session_token} // croak "You must specify '-session_token' param"; - $self->{buff_size} = $opt{-buff_zize} // $DEFAULT_BUFF_SIZE; + $self->{buff_size} = $opt{-buff_size} // $DEFAULT_BUFF_SIZE; bless $self, $class; return $self; } diff --git a/t/001_test.t b/t/001_test.t index 0e7421f..c078e78 100644 --- a/t/001_test.t +++ b/t/001_test.t @@ -35,6 +35,7 @@ use_ok('Mediafire::Api'); my $LOGIN = $ENV{MEDIAFIRE_LOGIN}; my $PASSWORD = $ENV{MEDIAFIRE_PASSWORD}; my $UPLOAD_FILE = File::Spec->catfile($CURR_DIR, 't', 'test_upload3.f'); +my $DEST_DOWNLOAD_FILE = File::Spec->catfile($CURR_DIR, 't', 'downloaded_test_upload3.f'); SKIP: { @@ -53,8 +54,9 @@ SKIP: { skip $@; } - testUploadFile($mediafire, $UPLOAD_FILE); + my $mediafire_file = testUploadFile($mediafire, $UPLOAD_FILE); testFindFileByName($mediafire, basename($UPLOAD_FILE)); + testDownloadFile($mediafire, $mediafire_file, $DEST_DOWNLOAD_FILE); }; @@ -80,6 +82,7 @@ sub testUploadFile { my $doupload_key = $upload_file->key; ok($doupload_key, "Test upload file. DouploadKey: $doupload_key"); + return $upload_file; } sub testFindFileByName { @@ -94,4 +97,16 @@ sub testFindFileByName { } +sub testDownloadFile { + my ($mediafire, $mediafire_file, $dest_file) = @_; + + unlink($dest_file); + $mediafire->downloadFile( + -mediafire_file => $mediafire_file, + -dest_file => $dest_file, + ); + + ok (-f $dest_file, 'Test downloadFile()'); +} +