Make Amazon.com Chrome/Safari-compatible
This commit is contained in:
parent
db8237f619
commit
e1433bb4bf
|
@ -1,18 +1,18 @@
|
|||
{
|
||||
"translatorID":"96b9f483-c44d-5784-cdad-ce21b984fe01",
|
||||
"label":"Amazon.com",
|
||||
"creator":"Sean Takats and Michael Berkowitz",
|
||||
"target":"^https?://(?:www\\.)?amazon",
|
||||
"minVersion":"1.0.0b4.r1",
|
||||
"maxVersion":"",
|
||||
"priority":100,
|
||||
"inRepository":"1",
|
||||
"translatorType":4,
|
||||
"lastUpdated":"2011-01-11 04:31:00"
|
||||
"translatorID": "96b9f483-c44d-5784-cdad-ce21b984fe01",
|
||||
"label": "Amazon.com",
|
||||
"creator": "Sean Takats and Michael Berkowitz",
|
||||
"target": "^https?://(?:www\\.)?amazon",
|
||||
"minVersion": "2.1",
|
||||
"maxVersion": "",
|
||||
"priority": 100,
|
||||
"inRepository": true,
|
||||
"translatorType": 4,
|
||||
"browserSupport": "gcs",
|
||||
"lastUpdated": "2011-07-03 04:56:24"
|
||||
}
|
||||
|
||||
function detectWeb(doc, url) {
|
||||
|
||||
function detectWeb(doc, url) {
|
||||
var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
|
||||
var suffixMatch = suffixRe.exec(url);
|
||||
var suffix = suffixMatch[1];
|
||||
|
@ -21,14 +21,9 @@ function detectWeb(doc, url) {
|
|||
if(searchRe.test(doc.location.href)) {
|
||||
return "multiple";
|
||||
} else {
|
||||
var namespace = doc.documentElement.namespaceURI;
|
||||
var nsResolver = namespace ? function(prefix) {
|
||||
if (prefix == 'x') return namespace; else return null;
|
||||
} : null;
|
||||
|
||||
var xpath = '//input[@name="ASIN"]';
|
||||
if(doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
|
||||
var elmt = doc.evaluate('//input[@name="storeID"]', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
|
||||
if(doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null).iterateNext()) {
|
||||
var elmt = doc.evaluate('//input[@name="storeID"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
|
||||
if(elmt) {
|
||||
var storeID = elmt.value;
|
||||
Zotero.debug("store id: " + storeID);
|
||||
|
@ -52,16 +47,11 @@ function detectWeb(doc, url) {
|
|||
}
|
||||
}
|
||||
|
||||
var suffix;
|
||||
function doWeb(doc, url) {
|
||||
var namespace = doc.documentElement.namespaceURI;
|
||||
var nsResolver = namespace ? function(prefix) {
|
||||
if (prefix == 'x') return namespace; else return null;
|
||||
} : null;
|
||||
|
||||
|
||||
var suffixRe = new RegExp("https?://(?:www\.)?amazon\.([^/]+)/");
|
||||
var suffixMatch = suffixRe.exec(url);
|
||||
var suffix = suffixMatch[1];
|
||||
suffix = suffixMatch[1];
|
||||
|
||||
var searchRe = new RegExp('^https?://(?:www\.)?amazon\.' + suffix + '/(gp/search/|exec/obidos/search-handle-url/|s/|[^/]+/lm/|gp/richpub/)');
|
||||
var m = searchRe.exec(doc.location.href);
|
||||
|
@ -81,7 +71,7 @@ function doWeb(doc, url) {
|
|||
} else { // Show selector for Search results
|
||||
var xpath = '//div[@class="productTitle"]/a | //a[span[@class="srTitle"]] | //div[@class="title"]/a[@class="title"]';
|
||||
}
|
||||
var elmts = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null);
|
||||
var elmts = doc.evaluate(xpath, doc, null, XPathResult.ANY_TYPE, null);
|
||||
var elmt = elmts.iterateNext();
|
||||
var asins = new Array();
|
||||
var i = 0;
|
||||
|
@ -96,25 +86,26 @@ function doWeb(doc, url) {
|
|||
i++;
|
||||
}
|
||||
} while (elmt = elmts.iterateNext());
|
||||
var items = Zotero.selectItems(availableItems);
|
||||
|
||||
|
||||
if(!items) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for(var i in items) {
|
||||
var timestamp = encodeURIComponent(generateISODate());
|
||||
var params = "AWSAccessKeyId=AKIAIPYIWJ24AGZJ64AA&ItemId=" + Zotero.Utilities.trim(asins[i]) + "&Operation=ItemLookup&ResponseGroup=ItemAttributes&Service=AWSECommerceService&Timestamp="+timestamp+"&Version=2006-06-28";
|
||||
var signString = "GET\necs.amazonaws."+suffix+"\n/onca/xml\n"+params;
|
||||
var signature = b64_hmac_sha256("054vk/Lt3LJMxch1srIHUbvI+2T/fZ6E5c0qwlbj", signString);
|
||||
signature = encodeURIComponent(signature);
|
||||
uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?"+params+"&Signature="+signature+"%3D"); //wants the %3D for some reason
|
||||
}
|
||||
|
||||
Zotero.selectItems(availableItems, function(items) {
|
||||
if(!items) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for(var i in items) {
|
||||
var timestamp = encodeURIComponent(generateISODate());
|
||||
var params = "AWSAccessKeyId=AKIAIPYIWJ24AGZJ64AA&ItemId=" + Zotero.Utilities.trim(asins[i]) + "&Operation=ItemLookup&ResponseGroup=ItemAttributes&Service=AWSECommerceService&Timestamp="+timestamp+"&Version=2006-06-28";
|
||||
var signString = "GET\necs.amazonaws."+suffix+"\n/onca/xml\n"+params;
|
||||
var signature = b64_hmac_sha256("054vk/Lt3LJMxch1srIHUbvI+2T/fZ6E5c0qwlbj", signString);
|
||||
signature = encodeURIComponent(signature);
|
||||
uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?"+params+"&Signature="+signature+"%3D"); //wants the %3D for some reason
|
||||
}
|
||||
|
||||
Zotero.Utilities.HTTP.doGet(uris, parseXML, function() {Zotero.done();}, null);
|
||||
});
|
||||
|
||||
} else {
|
||||
var elmts = doc.evaluate('//input[@name = "ASIN"]', doc,
|
||||
nsResolver, XPathResult.ANY_TYPE, null);
|
||||
var elmts = doc.evaluate('//input[@name = "ASIN"]', doc, null, XPathResult.ANY_TYPE, null);
|
||||
var elmt;
|
||||
while(elmt = elmts.iterateNext()) {
|
||||
var asin = elmt.value;
|
||||
|
@ -125,107 +116,94 @@ function doWeb(doc, url) {
|
|||
var signature = b64_hmac_sha256("054vk/Lt3LJMxch1srIHUbvI+2T/fZ6E5c0qwlbj", signString);
|
||||
signature = encodeURIComponent(signature);
|
||||
uris.push("http://ecs.amazonaws." + suffix + "/onca/xml?"+params+"&Signature="+signature+"%3D"); //wants the %3D for some reason
|
||||
Zotero.Utilities.HTTP.doGet(uris, parseXML, function() {Zotero.done();}, null);
|
||||
}
|
||||
Zotero.Utilities.HTTP.doGet(uris, function(text) {
|
||||
text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
|
||||
var texts = text.split("<Items>");
|
||||
texts = texts[1].split("</ItemLookupResponse>");
|
||||
text = "<Items>" + texts[0];
|
||||
var xml = new XML(text);
|
||||
var publisher = "";
|
||||
|
||||
if (!xml..Errors.length()) {
|
||||
if (xml..Publisher.length()){
|
||||
publisher = Zotero.Utilities.trimInternal(xml..Publisher[0].text().toString());
|
||||
}
|
||||
|
||||
var binding = "";
|
||||
if (xml..Binding.length()){
|
||||
binding = Zotero.Utilities.trimInternal(xml..Binding[0].text().toString());
|
||||
}
|
||||
|
||||
var productGroup = "";
|
||||
if (xml..ProductGroup.length()){
|
||||
productGroup = Zotero.Utilities.trimInternal(xml..ProductGroup[0].text().toString());
|
||||
}
|
||||
|
||||
if (productGroup=="Book") {
|
||||
var newItem = new Zotero.Item("book");
|
||||
newItem.publisher = publisher;
|
||||
}
|
||||
else if (productGroup == "Music") {
|
||||
var newItem = new Zotero.Item("audioRecording");
|
||||
newItem.label = publisher;
|
||||
newItem.audioRecordingType = binding;
|
||||
for(var i=0; i<xml..Artist.length(); i++) {
|
||||
newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Artist[i].text().toString(), "performer"));
|
||||
}
|
||||
}
|
||||
else if (productGroup == "DVD" | productGroup == "Video") {
|
||||
var newItem = new Zotero.Item("videoRecording");
|
||||
newItem.studio = publisher;
|
||||
newItem.videoRecordingType = binding;
|
||||
for(var i=0; i<xml..Actor.length(); i++) {
|
||||
newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Actor[i].text().toString(), "castMember"));
|
||||
}
|
||||
for(var i=0; i<xml..Director.length(); i++) {
|
||||
newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Director[i].text().toString(), "director"));
|
||||
}
|
||||
}
|
||||
else{
|
||||
var newItem = new Zotero.Item("book");
|
||||
newItem.publisher = publisher;
|
||||
}
|
||||
|
||||
if(xml..RunningTime.length()){
|
||||
newItem.runningTime = Zotero.Utilities.trimInternal(xml..RunningTime[0].text().toString());
|
||||
}
|
||||
|
||||
// Retrieve authors and other creators
|
||||
for(var i=0; i<xml..Author.length(); i++) {
|
||||
newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Author[i].text().toString(), "author"));
|
||||
}
|
||||
if (newItem.creators.length == 0){
|
||||
for(var i=0; i<xml..Creator.length(); i++) {
|
||||
newItem.creators.push(Zotero.Utilities.cleanAuthor(xml..Creator[i].text().toString()));
|
||||
}
|
||||
}
|
||||
|
||||
if (xml..PublicationDate.length()){
|
||||
newItem.date = Zotero.Utilities.trimInternal(xml..PublicationDate[0].text().toString());
|
||||
} else if (xml..ReleaseDate.length()){
|
||||
newItem.date = Zotero.Utilities.trimInternal(xml..ReleaseDate[0].text().toString());
|
||||
}
|
||||
if (xml..Edition.length()){
|
||||
newItem.edition = Zotero.Utilities.trimInternal(xml..Edition[0].text().toString());
|
||||
}
|
||||
if (xml..ISBN.length()){
|
||||
newItem.ISBN = Zotero.Utilities.trimInternal(xml..ISBN[0].text().toString());
|
||||
}
|
||||
// Uncomment when numPages field is added to schema
|
||||
// if (xml..NumberOfPages.length()){
|
||||
// newItem.numPages = Zotero.Utilities.trimInternal(xml..NumberOfPages[0].text().toString());
|
||||
// }
|
||||
var title = Zotero.Utilities.trimInternal(xml..Title[0].text().toString());
|
||||
if(title.lastIndexOf("(") != -1 && title.lastIndexOf(")") == title.length-1) {
|
||||
title = title.substring(0, title.lastIndexOf("(")-1);
|
||||
}
|
||||
if (xml..ASIN.length()){
|
||||
var url = "http://www.amazon." + suffix + "/dp/" + Zotero.Utilities.trimInternal(xml..ASIN[0].text().toString());
|
||||
newItem.attachments.push({title:"Amazon.com Link", snapshot:false, mimeType:"text/html", url:url});
|
||||
}
|
||||
|
||||
if (xml..OriginalReleaseDate.length()){
|
||||
newItem.extra = Zotero.Utilities.trimInternal(xml..OriginalReleaseDate[0].text().toString());
|
||||
}
|
||||
|
||||
newItem.title = title;
|
||||
newItem.complete();
|
||||
}
|
||||
}, function() {Zotero.done();}, null);
|
||||
Zotero.wait();
|
||||
}
|
||||
|
||||
function parseXML(text) {
|
||||
text = text.replace(/<!DOCTYPE[^>]*>/, "").replace(/<\?xml[^>]*\?>/, "");
|
||||
var texts = text.split("<Items>");
|
||||
texts = texts[1].split("</ItemLookupResponse>");
|
||||
text = "<Items>" + texts[0];
|
||||
var xml = (new DOMParser()).parseFromString(text, "text/xml");
|
||||
var publisher = "";
|
||||
|
||||
if (!ZU.xpath(xml, "//Errors").length) {
|
||||
var publisher = getXPathNodeTrimmed(xml, "Publisher");
|
||||
var binding = getXPathNodeTrimmed(xml, "Binding");
|
||||
var productGroup = getXPathNodeTrimmed(xml, "ProductGroup");
|
||||
|
||||
if (productGroup=="Book") {
|
||||
var newItem = new Zotero.Item("book");
|
||||
newItem.publisher = publisher;
|
||||
}
|
||||
else if (productGroup == "Music") {
|
||||
var newItem = new Zotero.Item("audioRecording");
|
||||
newItem.label = publisher;
|
||||
newItem.audioRecordingType = binding;
|
||||
getCreatorNodes(xml, "Artist", newItem, "performer");
|
||||
}
|
||||
else if (productGroup == "DVD" | productGroup == "Video") {
|
||||
var newItem = new Zotero.Item("videoRecording");
|
||||
newItem.studio = publisher;
|
||||
newItem.videoRecordingType = binding;
|
||||
getCreatorNodes(xml, "Actor", newItem, "castMember");
|
||||
getCreatorNodes(xml, "Director", newItem, "director");
|
||||
}
|
||||
else{
|
||||
var newItem = new Zotero.Item("book");
|
||||
newItem.publisher = publisher;
|
||||
}
|
||||
|
||||
newItem.runningTime = getXPathNodeTrimmed(xml, "RunningTime");
|
||||
|
||||
// Retrieve authors and other creators
|
||||
getCreatorNodes(xml, "Author", newItem, "author");
|
||||
if (newItem.creators.length == 0){
|
||||
getCreatorNodes(xml, "Creator", newItem, "author");
|
||||
}
|
||||
|
||||
newItem.date = getXPathNodeTrimmed(xml, "PublicationDate");
|
||||
if (!newItem.date){
|
||||
newItem.date = getXPathNodeTrimmed(xml, "ReleaseDate");
|
||||
}
|
||||
newItem.edition = getXPathNodeTrimmed(xml, "Edition");
|
||||
newItem.ISBN = getXPathNodeTrimmed(xml, "ISBN");
|
||||
newItem.numPages = getXPathNodeTrimmed(xml, "NumberOfPages");
|
||||
var title = getXPathNodeTrimmed(xml, "Title");
|
||||
if(title.lastIndexOf("(") != -1 && title.lastIndexOf(")") == title.length-1) {
|
||||
title = title.substring(0, title.lastIndexOf("(")-1);
|
||||
}
|
||||
var ASIN = getXPathNodeTrimmed(xml, "ASIN");
|
||||
if (ASIN){
|
||||
var url = "http://www.amazon." + suffix + "/dp/" + ASIN;
|
||||
newItem.attachments.push({title:"Amazon.com Link", snapshot:false, mimeType:"text/html", url:url});
|
||||
}
|
||||
|
||||
newItem.extra = getXPathNodeTrimmed(xml, "OriginalReleaseDate");
|
||||
|
||||
newItem.title = title;
|
||||
newItem.complete();
|
||||
}
|
||||
}
|
||||
|
||||
function getXPathNodeTrimmed(xml, name) {
|
||||
var node = ZU.xpath(xml, "//"+name);
|
||||
var val = "";
|
||||
if(node.length){
|
||||
val = Zotero.Utilities.trimInternal(node[0].textContent);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
function getCreatorNodes(xml, name, newItem, creatorType) {
|
||||
var nodes = ZU.xpath(xml, "//"+name);
|
||||
for(var i=0; i<nodes.length; i++) {
|
||||
newItem.creators.push(Zotero.Utilities.cleanAuthor(nodes[i].textContent, creatorType));
|
||||
}
|
||||
}
|
||||
|
||||
function generateISODate(){
|
||||
var ts = new Date();
|
||||
var isodate = ts.getUTCFullYear()+"-"+Zotero.Utilities.lpad(ts.getUTCMonth()+1, "0", 2)+"-"+Zotero.Utilities.lpad(ts.getUTCDate(), "0", 2)+"T"+Zotero.Utilities.lpad(ts.getUTCHours(), "0", 2)+":"+Zotero.Utilities.lpad(ts.getUTCMinutes(), "0", 2)+":"+Zotero.Utilities.lpad(ts.getUTCSeconds(), "0", 2)+"Z";
|
||||
|
@ -570,3 +548,121 @@ function safe_add (x, y)
|
|||
return (msw << 16) | (lsw & 0xFFFF);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** BEGIN TEST CASES **/
|
||||
var testCases = [
|
||||
{
|
||||
"type": "web",
|
||||
"url": "http://www.amazon.com/Test-William-Sleator/dp/0810989891/ref=sr_1_1?ie=UTF8&qid=1308010556&sr=8-1",
|
||||
"items": [
|
||||
{
|
||||
"itemType": "book",
|
||||
"creators": [
|
||||
{
|
||||
"firstName": "William",
|
||||
"lastName": "Sleator",
|
||||
"creatorType": "author"
|
||||
}
|
||||
],
|
||||
"notes": [],
|
||||
"tags": [],
|
||||
"seeAlso": [],
|
||||
"attachments": [
|
||||
{
|
||||
"title": "Amazon.com Link",
|
||||
"snapshot": false,
|
||||
"mimeType": "text/html",
|
||||
"url": false
|
||||
}
|
||||
],
|
||||
"publisher": "Amulet Books",
|
||||
"date": "2010-04-01",
|
||||
"edition": "Reprint",
|
||||
"ISBN": "0810989891",
|
||||
"numPages": "320",
|
||||
"title": "Test",
|
||||
"libraryCatalog": "Amazon.com"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "web",
|
||||
"url": "http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Dstripbooks&field-keywords=foot&x=0&y=0",
|
||||
"items": "multiple"
|
||||
},
|
||||
{
|
||||
"type": "web",
|
||||
"url": "http://www.amazon.com/Loveless-My-Bloody-Valentine/dp/B000002LRJ/ref=ntt_mus_ep_dpi_1",
|
||||
"items": [
|
||||
{
|
||||
"itemType": "audioRecording",
|
||||
"creators": [
|
||||
{
|
||||
"firstName": "My Bloody",
|
||||
"lastName": "Valentine",
|
||||
"creatorType": "performer"
|
||||
}
|
||||
],
|
||||
"notes": [],
|
||||
"tags": [],
|
||||
"seeAlso": [],
|
||||
"attachments": [
|
||||
{
|
||||
"title": "Amazon.com Link",
|
||||
"snapshot": false,
|
||||
"mimeType": "text/html",
|
||||
"url": false
|
||||
}
|
||||
],
|
||||
"label": "Sire / London/Rhino",
|
||||
"audioRecordingType": "Audio CD",
|
||||
"date": "1991",
|
||||
"extra": "1991-11-05",
|
||||
"title": "Loveless",
|
||||
"libraryCatalog": "Amazon.com"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "web",
|
||||
"url": "http://www.amazon.com/Adaptation-Superbit-Collection-Nicholas-Cage/dp/B00005JLRE/ref=sr_1_1?ie=UTF8&qid=1309683150&sr=8-1",
|
||||
"items": [
|
||||
{
|
||||
"itemType": "videoRecording",
|
||||
"creators": [
|
||||
{
|
||||
"firstName": "Nicholas",
|
||||
"lastName": "Cage",
|
||||
"creatorType": "castMember"
|
||||
},
|
||||
{
|
||||
"firstName": "Chris",
|
||||
"lastName": "Cooper",
|
||||
"creatorType": "castMember"
|
||||
}
|
||||
],
|
||||
"notes": [],
|
||||
"tags": [],
|
||||
"seeAlso": [],
|
||||
"attachments": [
|
||||
{
|
||||
"title": "Amazon.com Link",
|
||||
"snapshot": false,
|
||||
"mimeType": "text/html",
|
||||
"url": false
|
||||
}
|
||||
],
|
||||
"studio": "Sony Pictures Home Entertainment",
|
||||
"videoRecordingType": "DVD",
|
||||
"runningTime": "114",
|
||||
"date": "2003-05-20",
|
||||
"ISBN": "0767879805",
|
||||
"extra": "2002-12-06",
|
||||
"title": "Adaptation",
|
||||
"libraryCatalog": "Amazon.com"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
/** END TEST CASES **/
|
Loading…
Reference in New Issue
Block a user