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.

 




4 Comments

  1. Yassine Sedrani

    this tool is awesome !
    there is a way to capture a website in localhost, when i try i get this errors (img below):

    https://drive.google.com/file/d/0B6OAZ64r40cvSWJoTElQWXVldlk/view?usp=sharing

  2. TSKrich

    Great Program, Thanks for creating this tool.

  3. Is there any know challenges to creating a Google Drive plugin?

    • I think no. Google Drive has a consistent API. I would make a Gdrive plugin but I am not a Perl guy anyway…

Leave a Reply