From e3a714c056c58161ef184326f8c80832179c9222 Mon Sep 17 00:00:00 2001 From: vrag Date: Thu, 23 May 2019 12:30:01 +0300 Subject: [PATCH] Added dowmloadFile() method --- lib/Mediafire/.Api.pm.swp | Bin 32768 -> 32768 bytes lib/Mediafire/Api.pm | 58 +++++++++++++++ lib/Mediafire/Api/.UploadFile.pm.swp | Bin 36864 -> 0 bytes lib/Mediafire/Api/DownloadFile.pm | 102 +++++++++++++++++++++++++++ lib/Mediafire/Api/UploadFile.pm | 9 +-- t/001_test.t | 17 ++++- 6 files changed, 177 insertions(+), 9 deletions(-) delete mode 100644 lib/Mediafire/Api/.UploadFile.pm.swp create mode 100644 lib/Mediafire/Api/DownloadFile.pm diff --git a/lib/Mediafire/.Api.pm.swp b/lib/Mediafire/.Api.pm.swp index 89b956e7c75a1a29e27fe4cfdb866a19f04cad79..ea0f127e86793f9e0cc397a588131e344c1d8588 100644 GIT binary patch delta 2001 zcmZ|QZERCj7{KwfQMa*CHnzm55q37awL?~5pe*fL#~hm`ZUG^hkd3BWZ)v-=xAtYF zE~LZ6FNz11z#%RD7j6tI;VnTxPi;0SW|8v`}+ti!<(tFS8 zJ?2 zcoseAf*to`Jyzq-RYIJ^3|_)6v|t_9;(877@J@}$h&U%<^h3goN}R72;vD8Mjpq=B z8!j}$glj8>coVNchOC)e>U zF5!I~$IEyDhY>;$JJ5)AxIqR~x_-d-Q0bb%tB69!ForNsmagDST*RmN1ap;?z#9)pm$WQ& zdsL)$w`zA9|N74^o7Ly{`~226rx3ff#Kug&mXPs)x8s2aBtT(uG%pWQ>ajKZ3VTLn zg1OqEwPQDdA^sC*>V zxUkX#TK&>$QALqmKQx#*Xe^;x>}V_)Nyz3tJz1;@hisO18PbChn^jsj$gnpmCoP`* zQ`*`N%5IA)RZmQdC&v>!kQyfFm$s$ta? z!MIJ;;G!r?R;%5udemHc(t|2J#vS*S3j1GmEl1Kuy6iH)soF}rijB8?PpOe*VNc~^ zLq}I+)T{g~)JLj?A9dWSiiSs`4bN#V+6#t*HyCtrD% zVucneT3u!vJ7sy&n?2CkWHPQ#bl%(0yXecnnrkVW$WCv&^DdX{_Bcg6IU>&UE delta 727 zcmXxhO-NKx6u|NGo>PwV(R;cwQ)ZGFF-@lkLKIR*hykY=5MClu8G$%{WR67O$9p2y zCJMa-t%`zZ6UA^h5wvg<1WwW-0+TidNo|6Jg39_oq6!RIfMa@0@viILH zw&N+c+!EQ@C-M!Oc#j2m7)Cdaz{F-$WEGEa5oeJ@2E9n)07?;&H9SKBr_hO$u&@&r z*}(0vxN?hN1l?#wBR+*hK4J^2c#IXC$2oK%fe6+sL|(x|9w{`V9<_KA6nTvjrcuBM z`p_ASi8K%-uv;!NfEa$!Bfn2Mefi*4K=mi;Re!cY&m`QSu5I0pM-Ovzp6q`A)2cG} z)SaNPab$5C8T>E0nYao2QH^`lco%-{H*pP1n8Pg2z(EdK9K%ukAmeuwF^Nm?UojOD zZ3dbu)V!0_ADk6K{Tb-hR|jvDxj#APlG1-@4Ih8)GV|Y9L;)FmVZNX75DH^RA%<;c z>d*Z-^5{V$EWG9Jb=<*qEWv}Hb3P(rnIo7*dsrKRCn41_I-}agUYa8M#ppuWgGu`@ D#~*uo 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 d58956d6e72e4b05a674b1a3e9d9dd6a8a4d1da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 Fe*nus+a3S_ 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()'); +} +