Downloader Plugins are used as part of LANraragi's built-in downloading feature.
Only one subroutine needs to be implemented for the module to be recognized: provide_url
, which contains your working code. You're free to implement other subroutines for cleaner code, of course.
Your plugin also needs an extra field in its metadata: url_regex
, which contains a Regular Expression that'll be used by LANraragi to know if your Downloader should be used.
For example, if your regex is https?:\/\/example.com.*
, LANraragi will invoke your plugin if the user wants to download an URL that comes from example.com
.
In case of multiple Downloaders matching the given URL, the server will invoke the first plugin that matches.
The following section deals with writing the provide_url
subroutine.
When executing your Plugin, LRR will call this subroutine and pass it the following variables:
sub provide_url {​#First lines you should have in the subroutineshift;my $lrr_info = shift; # Global info hashmy ($param1, $param2) = @_; # Plugin parameters
The variables match the parameters you've entered in the plugin_info
subroutine.
The $lrr_info
hash contains two variables you can use in your plugin:
$lrr_info->{url}: The URL that needs to be downloaded.
$lrr_info->{user_agent}: Mojo::UserAgent object you can use for web requests. If this plugin depends on a Login plugin, this UserAgent will be pre-configured with the cookies from the Login.
LRR expects Downloaders to return a hash, containing a new URL that can be downloaded directly. Said URL should directly point to a file -- Any form of HTML will trigger a failed download.
return ( download_url => "http://my.remote.service/download/secret-archive.zip" );
If your script errored out, you can tell LRR that an error occurred by returning a hash containing an "error" field:
return ( error => "my error :(" );
If you do this, the error will be logged/displayed to the user.
package LANraragi::Plugin::Download::MyNewDownloader;​use strict;use warnings;​# Plugins can freely use all Perl packages already installed on the system# Try however to restrain yourself to the ones already installed for LRR (see tools/cpanfile) to avoid extra installations by the end-user.use Mojo::UserAgent;​# You can also use LRR packages when fitting.# All packages are fair game, but only functions explicitly exported by the Utils packages are supported between versions.# Everything else is considered internal API and can be broken/renamed between versions.use LANraragi::Model::Plugins;use LANraragi::Utils::Logging qw(get_logger);​#Meta-information about your plugin.sub plugin_info {​return (#Standard metadataname => "Example.com Downloader",type => "download",namespace => "dummydl",author => "Hackerman",version => "0.1",description => "This is base boilerplate for writing LRR downloaders. Returns a static URL if you try to download a URL from http://example.com.",icon => "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABZSURBVDhPzY5JCgAhDATzSl+e/2irOUjQSFzQog5hhqIl3uBEHPxIXK7oFXwVE+Hj5IYX4lYVtN6MUW4tGw5jNdjdt5bLkwX1q2rFU0/EIJ9OUEm8xquYOQFEhr9vvu2U8gAAAABJRU5ErkJggg==",​# Downloader-specific metadataurl_regex => "https?:\/\/example.com.*");​}​## Mandatory function to be implemented by your scriptsub run_script {shift;my $lrr_info = shift; # Global info hashmy ($useposts) = @_; # Plugin parameters​my $logger = get_logger( "Dingus Downloader", "plugins" );​# Get the urlmy $url = $lrr_info->{url};$logger->debug("We have been given the following URL: $url" );​# This is the downloadable url we'll give back. It can be completely different from the base domain provided.my $reply = "https://archive.org/download/quake-essays-sep-15-fin-4-graco-l-cl/QUAKE_essays_SEP15_FIN4_GRACoL_CL.pdf";​# Just for fun, use the provided useragent to see if we've been given a real URLmy $ua = $lrr_info->{user_agent};my $res = $ua->get($url)->result;​if ($res->is_success) {return ( download_url => $reply );}elsif ($res->is_error) {return ( error => "Dingus! ".$res->message );}​}​1;