Skip to content

Translator Amazon pour acquéreurs : ce qui a été changé

04/04/2011

Comme expliqué en plusieurs occasions, la fonction d’export en UnimarcXML exporte le champ « Résumé » pour le mettre en 010$$d, là où on trouve habituellement le prix en Unimarc.

Cela implique que l’utilisateur de cette fonction ait mis le prix dans la zone de résumé.

Mais il y avait plus « simple » : disposer d’une fonction d’import de notices récupérant le prix pour le stocker directement à cet endroit, comme il récupère l’auteur ou l’ISBN. J’ai donc dupliqué le translator Amazon existant, pour y apporter quelques modifications :

1. Métadonnées globales du fichier

D’abord, changement du nom même du fichier. Ma version de Zotero a donc désormais un fichier Amazon.com.js et un fichier Amazon.com.acq.js.

Ensuite, chaque translator a un identifiant unique. J’ai modifié celui du translator initial (c’est la première ligne du fichier).

Enfin, Zotero se retrouve avec deux translators susceptibles d’être activés sur les mêmes sites. Heureusement, la confrontation est prévue : il y a un critère de priorité entre les translators. De deux translators, celui qui a la priorité la plus basse l’emporte.

Comme le translator Amazon standard a une priorité (standard) de « 100 », j’ai mis le mien à « 80 ».

Ainsi toute personne qui aura pris la peine d’installer le translator « Amazon pour acquereurs » verra celui-ci activé par préférence à l’autre, même après une mise à jour de Zotero.

2. Comment le translator Amazon récupère les métadonnées sur Amazon ?

Dans chaque notice détaillée (format HTML) Amazon, est stocké l’identifiant unique de la notice : l’ASIN. Le translator récupère cet ASIN, et construit ensuite une URL pour utiliser l’API disponible qui, quand on lui envoie un ASIN (sous forme d’une URL de recherche ressemblant à peu près à ceci : http://ecs.amazonaws.com/onca/xml?AWSAccessKeyId=AKIAIPYIWJ24AGZJ64AA&ItemId=2014572127) retourne une notice XML (comme celle-ci).

Une fois qu’il a trouvé la notice XML, Zotero associe les champs Zotero aux balises XML, sous la forme :
if (xml..Edition.length()){
newItem.edition = Zotero.Utilities.trimInternal(xml..Edition[0].text().toString());
}

xml..Edition.length() est un chemin XPath, sur le même modèle que celui déjà exposé sur ce blog et que ceux qui ont suivi la série XSL reconnaîtront. Sauf que pour dire « chercher une balise <Edition> n’importe où, XSL cherchera : //Edition, alors que dans ce fichier JavaScript, c’est ..Edition. Le test if {} consiste à dire qu’on ne crée la correspondance entre le champ edition de Zotero et la balise <Edition> de la notice Amazon, que si cette balise a un contenu de plus de 0 caractères. Si c’est le cas, Zotero récupère la première occurrence de cette balise et la stocke dans le champ edition de l’enregistrement Zotero.

Pour ajouter le prix dans le champ Résumé, il suffisait donc :

  1. de dupliquer ce qui était déjà rédigé pour la mention d’édition
  2. de chercher dans le fichier XML d’Amazon dans quelle balise se trouve le prix
  3. comment désigner le champ « Résumé » dans Zotero

Réponse au point 2 : dans la balise <FormattedPrice>, sous la forme suivante

Il arrive, pour des raisons encore mystérieuses pour moi, que le prix, pourtant affiché sur la page web, ne soit pas fourni dans le fichier XML correspondant. Dans ce cas le translator est évidemment incapable de le récupérer (exemple). C’est bien triste !

Réponse au point 3 : abstractNote (je connaissais déjà la réponse pour avoir travaillé sur l’export UnimarcXML)

Ce qui donne :
if (xml..FormattedPrice.length()){
newItem.abstractNote = Zotero.Utilities.trimInternal(xml..FormattedPrice[0].text().toString());
}

Et ensuite, comme je ne connais rien au JavaScript, j’ai honteusement exploité Sylvain (je n’aurai donc jamais fini de chanter ses louanges !) parce que l’idée d’avoir la devise puis le prix m’ennuyait. Donc voici le code pour récupérer d’abord la valeur après le caractère d’espace (donc le prix), puis le concaténer avec la valeur avant l’espace du champ <FormattedPrice> (càd la devise).

if (xml..FormattedPrice.length()){
var price = Zotero.Utilities.trimInternal(xml..FormattedPrice[0].text().toString());
price = price.replace(/^([^ ]*) ([\d\.,]*)$/, "$2 $1");
newItem.abstractNote = price;
}

Et c’est tout.

Les commentaires sont fermés.

%d blogueurs aiment cette page :