Developers
How to write an upload plugin
Upload plugins need to be written in Perl. Please use the following template when writing a new upload plugin. Please note: You need to use Shutter 0.88 or higher when using this template.
Save it to /usr/share/shutter/resources/system/upload_plugins/upload/ when finished.
#! /usr/bin/env perl
###################################################
#
# Copyright (C) <year> <author> <<email>>
#
# This file is part of Shutter.
#
# Shutter is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Shutter is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Shutter; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
###################################################
package PROVIDER; #edit
use lib $ENV{'SHUTTER_ROOT'}.'/share/shutter/resources/modules';
use utf8;
use strict;
use POSIX qw/setlocale/;
use Locale::gettext;
use Glib qw/TRUE FALSE/;
use Data::Dumper;
use Shutter::Upload::Shared;
our @ISA = qw(Shutter::Upload::Shared);
my $d = Locale::gettext->domain("shutter-plugins");
$d->dir( $ENV{'SHUTTER_INTL'} );
my %upload_plugin_info = (
'module' => "PROVIDER", #edit (must be the same as 'package')
'url' => "http://provider.com/", #edit (the website's url)
'registration' => "http://provider.com/register", #edit (a link to the registration page)
'name' => "PROVIDER", #edit (the provider's name)
'description' => "Upload screenshots to PROVIDER",#edit (a description of the service)
'supports_anonymous_upload' => TRUE, #TRUE if you can upload *without* username/password
'supports_authorized_upload' => TRUE, #TRUE if username/password are supported (might be in addition to anonymous_upload)
'supports_oauth_upload' => FALSE, #TRUE if OAuth is used (see Dropbox.pm as an example)
);
binmode( STDOUT, ":utf8" );
if ( exists $upload_plugin_info{$ARGV[ 0 ]} ) {
print $upload_plugin_info{$ARGV[ 0 ]};
exit;
}
#don't touch this
sub new {
my $class = shift;
#call constructor of super class (host, debug_cparam, shutter_root, gettext_object, main_gtk_window, ua)
my $self = $class->SUPER::new( shift, shift, shift, shift, shift, shift );
bless $self, $class;
return $self;
}
#load some custom modules here (or do other custom stuff)
sub init {
my $self = shift;
use JSON; #example1
use LWP::UserAgent; #example2
use HTTP::Request::Common; #example3
return TRUE;
}
#handle
sub upload {
my ( $self, $upload_filename, $username, $password ) = @_;
#store as object vars
$self->{_filename} = $upload_filename;
$self->{_username} = $username;
$self->{_password} = $password;
utf8::encode $upload_filename;
utf8::encode $password;
utf8::encode $username;
#examples related to the sub 'init'
my $json_coder = JSON::XS->new;
my $browser = LWP::UserAgent->new(
'timeout' => 20,
'keep_alive' => 10,
'env_proxy' => 1,
);
#username/password are provided
if ( $username ne "" && $password ne "" ) {
eval{
########################
#put the login code here
########################
#if login failed (status code == 999) => Shutter will display an appropriate message
#unless($login == 'success'){
# $self->{_links}{'status'} = 999;
# return;
#}
};
if($@){
$self->{_links}{'status'} = $@;
return %{ $self->{_links} };
}
if($self->{_links}{'status'} == 999){
return %{ $self->{_links} };
}
}
#upload the file
eval{
#########################
#put the upload code here
#########################
#save all retrieved links to a hash, as an example:
$self->{_links}->{'direct_link'} = 'mylink1';
$self->{_links}->{'short_link'} = 'mylink2';
$self->{_links}->{'bbcode'} = 'mylink3';
#set success code (200)
$self->{_links}{'status'} = 200;
};
if($@){
$self->{_links}{'status'} = $@;
}
#and return links
return %{ $self->{_links} };
}
#you are free to implement some custom subs here, but please make sure they don't interfere with Shutter's subs
#hence, please follow this naming convention: _<provider>_sub (e.g. _imageshack_convert_x_to_y)
1;
Don’t hesitate to ask if you need any further help.


Follow Us!