Difference between revisions of "Contribute: Plugins/ImportPluginsAWS"
(→In More Detail) |
m (→AWS.pm: Removed comments) |
||
Line 69: | Line 69: | ||
$input = $1; | $input = $1; | ||
− | |||
my $request = | my $request = | ||
"$endpoint?". | "$endpoint?". | ||
Line 79: | Line 78: | ||
"ResponseGroup=Large,EditorialReview&"; | "ResponseGroup=Large,EditorialReview&"; | ||
− | |||
− | |||
my $ua = LWP::UserAgent->new; | my $ua = LWP::UserAgent->new; | ||
$ua->timeout(30); | $ua->timeout(30); | ||
my $response = $ua->get($request); | my $response = $ua->get($request); | ||
− | |||
my $dom = EPrints::XML::parse_xml_string($response->content); | my $dom = EPrints::XML::parse_xml_string($response->content); | ||
− | |||
my $rep = | my $rep = | ||
$dom->getElementsByTagName("Items")->item(0)-> | $dom->getElementsByTagName("Items")->item(0)-> | ||
Line 113: | Line 108: | ||
} | } | ||
− | |||
my $attr = $item->getElementsByTagName("ItemAttributes")->item(0); | my $attr = $item->getElementsByTagName("ItemAttributes")->item(0); | ||
− | |||
my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0)); | my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0)); | ||
Line 125: | Line 118: | ||
} | } | ||
− | |||
$output{type} = "book"; | $output{type} = "book"; | ||
$output{refereed} = "FALSE"; | $output{refereed} = "FALSE"; | ||
$output{ispublished} = "pub"; | $output{ispublished} = "pub"; | ||
− | |||
my $title = $attr->getElementsByTagName("Title")->item(0); | my $title = $attr->getElementsByTagName("Title")->item(0); | ||
$output{title} = EPrints::Utils::tree_to_utf8($title); | $output{title} = EPrints::Utils::tree_to_utf8($title); | ||
− | |||
my $url = $item->getElementsByTagName("DetailPageURL")->item(0); | my $url = $item->getElementsByTagName("DetailPageURL")->item(0); | ||
$output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url)); | $output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url)); | ||
− | |||
my $isbn = $attr->getElementsByTagName("ISBN")->item(0); | my $isbn = $attr->getElementsByTagName("ISBN")->item(0); | ||
if (defined $isbn) | if (defined $isbn) | ||
Line 145: | Line 134: | ||
} | } | ||
− | |||
my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0); | my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0); | ||
if (defined $pages) | if (defined $pages) | ||
Line 152: | Line 140: | ||
} | } | ||
− | |||
my $publisher = $attr->getElementsByTagName("Publisher")->item(0); | my $publisher = $attr->getElementsByTagName("Publisher")->item(0); | ||
if (defined $publisher) | if (defined $publisher) |
Revision as of 11:31, 25 September 2007
Contents
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; my $request = "$endpoint?". "Service=$service&". "AWSAccessKeyId=$accesskey&". "Operation=$operation&". "ItemId=$input&". "Version=$version&". "ResponseGroup=Large,EditorialReview&"; my $ua = LWP::UserAgent->new; $ua->timeout(30); my $response = $ua->get($request); my $dom = EPrints::XML::parse_xml_string($response->content); 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; } my $attr = $item->getElementsByTagName("ItemAttributes")->item(0); 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; } $output{type} = "book"; $output{refereed} = "FALSE"; $output{ispublished} = "pub"; my $title = $attr->getElementsByTagName("Title")->item(0); $output{title} = EPrints::Utils::tree_to_utf8($title); my $url = $item->getElementsByTagName("DetailPageURL")->item(0); $output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url)); my $isbn = $attr->getElementsByTagName("ISBN")->item(0); if (defined $isbn) { $output{isbn} = EPrints::Utils::tree_to_utf8($isbn); } my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0); if (defined $pages) { $output{pages} = EPrints::Utils::tree_to_utf8($pages); } 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;
In More Detail
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;