Contribute: Plugins/ImportPluginsAWS: Difference between revisions
⧼vector-appearance-label⧽
m →CSV.pm |
|||
| Line 3: | Line 3: | ||
= AWS.pm = | = AWS.pm = | ||
<pre> | <pre> | ||
package EPrints::Plugin::Import::MyPlugins::AWS; | |||
use EPrints::Plugin::Import::TextFile; | |||
use strict; | |||
use URI::Escape; | |||
our @ISA = ('EPrints::Plugin::Import::TextFile'); | |||
my $endpoint = "http://ecs.amazonaws.co.uk/onca/xml"; | |||
my $accesskey = '<YOURAMAZONWSKEY>'; | |||
my $service = "AWSECommerceService"; | |||
my $operation = "ItemLookup"; | |||
my $version = "2007-07-16"; | |||
sub new | |||
{ | |||
my( $class, %params ) = @_; | |||
my $self = $class->SUPER::new( %params ); | |||
$self->{name} = 'AWS'; | |||
$self->{visible} = 'all'; | |||
$self->{produce} = [ 'list/eprint' , 'dataobj/eprint']; | |||
my $rc = EPrints::Utils::require_if_exists('LWP::UserAgent'); | |||
unless ($rc) | |||
{ | |||
$self->{visible} = ''; | |||
$self->{error} = 'Module LWP::UserAgent not found.'; | |||
} | |||
return $self; | |||
} | |||
sub input_fh | |||
{ | |||
my( $plugin, %opts ) = @_; | |||
my @ids; | |||
my $fh = $opts{fh}; | |||
my @records = <$fh>; | |||
foreach my $input_data (@records) | |||
{ | |||
my $epdata = $plugin->convert_input($input_data); | |||
next unless defined $epdata; | |||
my $dataobj = $plugin->epdata_to_dataobj($opts{dataset},$epdata); | |||
if( defined $dataobj ) | |||
{ | |||
push @ids, $dataobj->get_id; | |||
} | |||
} | |||
return EPrints::List->new( | |||
dataset => $opts{dataset}, | |||
session => $plugin->{session}, | |||
ids=>\@ids ); | |||
} | |||
sub convert_input | |||
{ | |||
my ($plugin, $input) = @_; | |||
my %output = (); | |||
$input =~ m/([0-9]+)/; | |||
$input = $1; | |||
#Perform the request | |||
my $request = | |||
"$endpoint?". | |||
"Service=$service&". | |||
"AWSAccessKeyId=$accesskey&". | |||
"Operation=$operation&". | |||
"ItemId=$input&". | |||
"Version=$version&". | |||
"ResponseGroup=Large,EditorialReview&"; | |||
#Send the request | |||
my $ua = LWP::UserAgent->new; | |||
$ua->timeout(30); | |||
my $response = $ua->get($request); | |||
#Create domtree | |||
my $dom = EPrints::XML::parse_xml_string($response->content); | |||
#Get and check Amazon Response | |||
my $rep = | |||
$dom->getElementsByTagName("Items")->item(0)-> | |||
getElementsByTagName("Request")->item(0); | |||
my $reptext = | |||
EPrints::Utils::tree_to_utf8($rep->getElementsByTagName("IsValid")->item(0)); | |||
unless ($reptext eq 'True') | |||
{ | |||
$plugin->error("Invalid AWS Request"); | |||
return undef; | |||
} | |||
#Get Item Object | |||
my $item = | |||
$dom->getElementsByTagName("Items")->item(0)-> | |||
getElementsByTagName("Item")->item(0); | |||
unless (defined $item) | |||
{ | |||
$plugin->error("No Item element found"); | |||
return undef; | |||
} | |||
#Get Attribute Object | |||
my $attr = $item->getElementsByTagName("ItemAttributes")->item(0); | |||
#Check this is a book | |||
my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0)); | |||
unless ($pg eq 'Book') | |||
{ | |||
$plugin->error("Product is not a book."); | |||
return undef; | |||
} | |||
#Populate Hash | |||
$output{type} = "book"; | |||
$output{refereed} = "FALSE"; | |||
$output{ispublished} = "pub"; | |||
#Add Title | |||
my $title = $attr->getElementsByTagName("Title")->item(0); | |||
$output{title} = EPrints::Utils::tree_to_utf8($title); | |||
#Add URL | |||
my $url = $item->getElementsByTagName("DetailPageURL")->item(0); | |||
$output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url)); | |||
#Add ISBN | |||
my $isbn = $attr->getElementsByTagName("ISBN")->item(0); | |||
if (defined $isbn) | |||
{ | |||
$output{isbn} = EPrints::Utils::tree_to_utf8($isbn); | |||
} | |||
#Add Number of Pages | |||
my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0); | |||
if (defined $pages) | |||
{ | |||
$output{pages} = EPrints::Utils::tree_to_utf8($pages); | |||
} | |||
#Add Publisher/Publication Date | |||
my $publisher = $attr->getElementsByTagName("Publisher")->item(0); | |||
if (defined $publisher) | |||
{ | |||
$output{publisher} = EPrints::Utils::tree_to_utf8($publisher); | |||
} | |||
my $pubdate = $attr->getElementsByTagName("PublicationDate")->item(0); | |||
if (defined $pubdate) | |||
{ | |||
$output{date} = EPrints::Utils::tree_to_utf8($pubdate); | |||
} | |||
return \%output; | |||
} | |||
1; | |||
</pre> | </pre> | ||
Revision as of 11:30, 25 September 2007
Import Plugin Tutorial 2: Amazon Web Services
Before You Start
AWS.pm
package EPrints::Plugin::Import::MyPlugins::AWS;
use EPrints::Plugin::Import::TextFile;
use strict;
use URI::Escape;
our @ISA = ('EPrints::Plugin::Import::TextFile');
my $endpoint = "http://ecs.amazonaws.co.uk/onca/xml";
my $accesskey = '<YOURAMAZONWSKEY>';
my $service = "AWSECommerceService";
my $operation = "ItemLookup";
my $version = "2007-07-16";
sub new
{
my( $class, %params ) = @_;
my $self = $class->SUPER::new( %params );
$self->{name} = 'AWS';
$self->{visible} = 'all';
$self->{produce} = [ 'list/eprint' , 'dataobj/eprint'];
my $rc = EPrints::Utils::require_if_exists('LWP::UserAgent');
unless ($rc)
{
$self->{visible} = '';
$self->{error} = 'Module LWP::UserAgent not found.';
}
return $self;
}
sub input_fh
{
my( $plugin, %opts ) = @_;
my @ids;
my $fh = $opts{fh};
my @records = <$fh>;
foreach my $input_data (@records)
{
my $epdata = $plugin->convert_input($input_data);
next unless defined $epdata;
my $dataobj = $plugin->epdata_to_dataobj($opts{dataset},$epdata);
if( defined $dataobj )
{
push @ids, $dataobj->get_id;
}
}
return EPrints::List->new(
dataset => $opts{dataset},
session => $plugin->{session},
ids=>\@ids );
}
sub convert_input
{
my ($plugin, $input) = @_;
my %output = ();
$input =~ m/([0-9]+)/;
$input = $1;
#Perform the request
my $request =
"$endpoint?".
"Service=$service&".
"AWSAccessKeyId=$accesskey&".
"Operation=$operation&".
"ItemId=$input&".
"Version=$version&".
"ResponseGroup=Large,EditorialReview&";
#Send the request
my $ua = LWP::UserAgent->new;
$ua->timeout(30);
my $response = $ua->get($request);
#Create domtree
my $dom = EPrints::XML::parse_xml_string($response->content);
#Get and check Amazon Response
my $rep =
$dom->getElementsByTagName("Items")->item(0)->
getElementsByTagName("Request")->item(0);
my $reptext =
EPrints::Utils::tree_to_utf8($rep->getElementsByTagName("IsValid")->item(0));
unless ($reptext eq 'True')
{
$plugin->error("Invalid AWS Request");
return undef;
}
#Get Item Object
my $item =
$dom->getElementsByTagName("Items")->item(0)->
getElementsByTagName("Item")->item(0);
unless (defined $item)
{
$plugin->error("No Item element found");
return undef;
}
#Get Attribute Object
my $attr = $item->getElementsByTagName("ItemAttributes")->item(0);
#Check this is a book
my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0));
unless ($pg eq 'Book')
{
$plugin->error("Product is not a book.");
return undef;
}
#Populate Hash
$output{type} = "book";
$output{refereed} = "FALSE";
$output{ispublished} = "pub";
#Add Title
my $title = $attr->getElementsByTagName("Title")->item(0);
$output{title} = EPrints::Utils::tree_to_utf8($title);
#Add URL
my $url = $item->getElementsByTagName("DetailPageURL")->item(0);
$output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url));
#Add ISBN
my $isbn = $attr->getElementsByTagName("ISBN")->item(0);
if (defined $isbn)
{
$output{isbn} = EPrints::Utils::tree_to_utf8($isbn);
}
#Add Number of Pages
my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0);
if (defined $pages)
{
$output{pages} = EPrints::Utils::tree_to_utf8($pages);
}
#Add Publisher/Publication Date
my $publisher = $attr->getElementsByTagName("Publisher")->item(0);
if (defined $publisher)
{
$output{publisher} = EPrints::Utils::tree_to_utf8($publisher);
}
my $pubdate = $attr->getElementsByTagName("PublicationDate")->item(0);
if (defined $pubdate)
{
$output{date} = EPrints::Utils::tree_to_utf8($pubdate);
}
return \%output;
}
1;