Configuration Alma pour l’affichage des Vignettes dans Primo VE

Préambule

La procédure de gestion des vignettes pour Babord + (version Primo VE) répond à plusieurs contraintes :

  • Utiliser différents services
  • Permettre aux collègues de corriger les erreurs d’attribution de vignettes ou d’attribuer manuellement des vignettes à des notices.
  • Gérer des problématiques de conversion d’ISBN : cette opération ne peut plus être gérée du côté de Primo
  • Avoir un système opérant pour les notices en Unimarc comme pour les notices en Marc21
  • Produire une solution sans une seule ligne de code, pouvant être facilement maintenable par des bibliothécaires

La solution retenue pour répondre à toutes ces contraintes est de générer les url d’accès aux vignettes dans Alma. Ces URL sont produites dans un champ local dédié (le champ 901). Un indicateur permet au bibliothécaire d’invalider une URL. Cette dernière ne sera plus utilisée par Primo pour produire la vignette.

Liste des services utilisés

Electre

Depuis la mise à jour de la plateforme Electre les url d’accès aux vignettes sont fournies en 856

  • Exemple : https://media.electre-ng.com/images/image-id/ae620c53f700147f93a4d60fbc507dc0b1d28e66363b70d909c0726896c8d18e.jp

AbeBooks : Marketplace de livres d’occasion.

Decitre

Amazon

Pour des publications récentes, le web service d’Amazon semble répondre avec des ISBN-13, mais les ISBN-10 sont généralement privilégiés. Exemple :https://images-na.ssl-images-amazon.com/images/P/9782326003330.jpg

TMDB : The Movie Database

Projet communautaire de création d’une base de de données en ligne sur le cinéma

  • Documentation
  • Exemple : https://image.tmdb.org/t/p/w342/iQ5ztdjvteGeboxtmRdXEChJOHh.jpg

Nécessite un appel API avec authentification pour obtenir le lien d’accès à la vignette. La solution est déjà exploitée par UBM pour la récupération des jaquettes de DVD.

Configuration du Champ 901 : Vignettes personnalisées

Nous avons choisi d’utiliser le champ 901 déjà utilisé pour les jaquettes de DVD. Le champ a été configuré pour Unimarc et Marc21 avec les paramètres suivants.

  • ind. 1 : Validité du lien à la vignette
    • 1 : Lien valide
    • 0 : Lien invalide
    • 2 : Lien produit manuellement
  • ind. 2 : Nom du Service fournissant la vignette : Nous sommes obligés de gérer le nom des fournisseurs dans un indicateur, car le template d’URL Primo VE ne gère pas les champs multiples. Il s’arrête à la première occurrence rencontrée. Nous sommes donc contraints de créer un template par type de cas rencontré. À ce niveau, les tests peuvent être uniquement faits dans le contenu du sous-champ utilisé pour produire l’URL ou à partir des indicateurs du champ.
    • 1 : ELECTRE
    • 2 : AMAZON
    • 3 : ABEBOOKS
    • 4 : DECITRE
    • 5 : TMDB
  • $u URL d’accès à la vignette
  • $a Nom du Service : Ce champ fait doublon avec l’indicateur, mais permettra aux bibliothécaires d’identifier plus facilement les services utilisés. Ce champ est utilisé pour effectuer des tests dans les règles de normalisation utilisées pour définir automatiquement les url.
    Valeurs autorisées :
    • ELECTRE
    • AMAZON
    • ABEBOOKS
    • DECITRE
    • TMDB

Configuration du champ dans : Ressources > Cataloging > Metadata configuration >Profile UNIMARC Bibliographic et MARC21 Bibliographic

Configuration par chargement d’un fichier d’extension suivant.

<?xml version="1.0" encoding="UTF-8"?>
<marc_profile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:noNamespaceSchemaLocation="marc21_profile_configuration.xsd">
    <data_fields_list>
	<data_field_configuration repeatable="true" mandatory="false" tag="901">
        <description>Vignettes personnalisées</description>
        <help_url>https://rebub.u-bordeaux.fr/index.php/babord/procedures/signalement/empecher-laffichage-des-vignettes/</help_url>
        <first_indicator_configuration>
            <description>Validité du lien à la vignette</description>
            <values>
                <value code="0">Lien invalide</value>
                <value code="1">Lien valide</value>
                <value code="2">Lien produit à partir d'un ISBN 10</value>
            </values>
        </first_indicator_configuration>
        <second_indicator_configuration>
            <description>Nom du Service fournissant la vignette</description>
            <values>
                <value code="1">ELECTRE</value>
                <value code="2">AMAZON</value>
                <value code="3">ABEBOOKS</value>
                <value code="4">DECITRE</value>
                <value code="5">TMDB</value>
            </values>
        </second_indicator_configuration>
        <sub_fields_list>
            <sub_field_configuration code="a" mandatory="true" repeatable="false">
                <description>Nom du Service fournissant la vignette</description>
                <values>
                    <value code="ELECTRE">ELECTRE</value>
                    <value code="AMAZON">AMAZON</value>
                    <value code="ABEBOOKS">ABEBOOKS</value>
                    <value code="DECITRE">DECITRE</value>
                    <value code="TMDB">TMDB</value>
                </values>
            </sub_field_configuration>
            <sub_field_configuration code="u" mandatory="true" repeatable="false">
                <description>URL d'accès à la vignette</description>
            </sub_field_configuration>
        </sub_fields_list>
    </data_field_configuration>
</data_fields_list>
</marc_profile>

Récupération des liens vers les vignettes Electre

À l’import de la notice Electre, on copie l’URL en 856 en 90111$u ajout de la mention $aELECTRE.

Règle de normalisation : Electre.drl.

Ajout des instructions suivantes :

   copyField "856.u" to "901.u" if (exists "856.u.*media.electre-ng.com/images/*")
  addSubField "901.a.ELECTRE" if (exists "901.u.*media.electre-ng.com/images/*")
  changeFirstIndicator "901" to "1" if (exists "901.u.*media.electre-ng.com/images/*")
 changeSecondIndicator "901" to "1" if (exists "901.u.*media.electre-ng.com/images/*")

Création des liens vers les services Amazon, AbeBooks et Decitre

Notices Unimarc

Génération automatique des URLS

Les services Abebooks et Decitre semblent mieux fonctionner avec un ISBN 13 ou un EAN en entrée. L’API Amazon répond avec des ISBN 13 pour des ouvrages récents, mais parait mieux fonctionner avec des ISBN 10. On va donc produire automatiquement à l’enregistrement de la notice :

  • Un lien vers les vignettes Abebooks et Decitre à partir des EAN valides de la notice (073$a)
  • Un lien vers les vignettes Abebooks et Decitre à partir des ISBNS 13 valides de la notice sui celle-ci ne contient pas d’EAN
  • Un lien vers les vignettes Amazon à partir des ISBNS valides de la notice (10 ou 13)

La production des urls est réalisée au moment de l’enregistrement de la notice via la règle de normalisation Mise en forme des notices Unimarc à l’enregistrement .drl. Les 901 pour chaque service sont produites uniquement si aucune 901 existe.

Génération manuelle d’URLS vers les vignettes Decitre et Abebooks pour les notices sans EAN ou ISBN-13

Identifier les notices

Après avoir appliqué le traitement précédent, on filtre un jeu contenant des notices Unimarc avec ISBN en utilisant la Règle d’indication suivante :

rule "073 absent 901 absente e1 010 a present "
when
     (not exists "073" AND not exists "901.a.ABEBOOKS" and exists "010.a")
then
	set indication."true"
end

On exporte au format UNimarc Binaire le nouveau jeu de résultat

Génération des ISBNS 13 et des champs 901

À partir du fichier obtenu, on utilise MarcEdit pour effectuer un export csv des champs LDR, 001, 010$a au format csv. On utilise ensuite Open Refine pour construire les champs 901 on applique la valeur 2 à l’indicateur 1 pour que ces champs ne soient pas écrasés en cas de mise à jour de la notice. Voici la liste des opérations à appliquer

[
  {
    "op": "core/multivalued-cell-split",
    "columnName": "010$a",
    "keyColumnName": "001",
    "mode": "separator",
    "separator": ";",
    "regex": false,
    "description": "Split multi-valued cells in column 010$a"
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [
        {
          "type": "range",
          "name": "ISBN 13",
          "expression": "value.length()",
          "columnName": "ISBN 13",
          "from": 8,
          "to": 12.94,
          "selectNumeric": true,
          "selectNonNumeric": true,
          "selectBlank": true,
          "selectError": true
        }
      ],
      "mode": "row-based"
    },
    "baseColumnName": "010$a",
    "expression": "grel:value.replace(\"-\", \"\").length()",
    "onError": "set-to-blank",
    "newColumnName": "Contrôle",
    "columnInsertIndex": 3,
    "description": "Create column Contrôle at index 3 based on column 010$a using expression grel:value.replace(\"-\", \"\").length()"
  },
  {
    "op": "core/row-removal",
    "engineConfig": {
      "facets": [
        {
          "type": "range",
          "name": "ISBN 13",
          "expression": "value.length()",
          "columnName": "ISBN 13",
          "from": 8,
          "to": 12.94,
          "selectNumeric": true,
          "selectNonNumeric": true,
          "selectBlank": true,
          "selectError": true
        },
        {
          "type": "text",
          "name": "Contrôle",
          "columnName": "Contrôle",
          "query": "10",
          "mode": "text",
          "caseSensitive": false,
          "invert": true
        }
      ],
      "mode": "row-based"
    },
    "description": "Remove rows"
  },
  {
    "op": "core/row-removal",
    "engineConfig": {
      "facets": [
        {
          "type": "range",
          "name": "ISBN 13",
          "expression": "value.length()",
          "columnName": "ISBN 13",
          "from": 8,
          "to": 12.94,
          "selectNumeric": true,
          "selectNonNumeric": true,
          "selectBlank": true,
          "selectError": true
        },
        {
          "type": "list",
          "name": "001",
          "expression": "isBlank(value)",
          "columnName": "001",
          "invert": false,
          "omitBlank": false,
          "omitError": false,
          "selection": [
            {
              "v": {
                "v": true,
                "l": "true"
              }
            }
          ],
          "selectBlank": false,
          "selectError": false
        }
      ],
      "mode": "row-based"
    },
    "description": "Remove rows"
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "010$a",
    "expression": "grel:with('978'+value.replace(\"-\", \"\")[0,9],v,v+((10-(sum(forRange(0,12,1,i,toNumber(v[i])*(1+(i%2*2)) )) %10)) %10).toString()[0])",
    "onError": "set-to-blank",
    "newColumnName": "ISBN13",
    "columnInsertIndex": 3,
    "description": "Create column ISBN13 at index 3 based on column 010$a using expression grel:with('978'+value.replace(\"-\", \"\")[0,9],v,v+((10-(sum(forRange(0,12,1,i,toNumber(v[i])*(1+(i%2*2)) )) %10)) %10).toString()[0])"
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "ISBN13",
    "expression": "grel:\"https://images-na.ssl-images-amazon.com/images/P/\" + value + \".jpg\"",
    "onError": "set-to-blank",
    "newColumnName": "90122$u",
    "columnInsertIndex": 4,
    "description": "Create column 90122$u at index 4 based on column ISBN13 using expression grel:\"https://images-na.ssl-images-amazon.com/images/P/\" + value + \".jpg\""
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "90122$u",
    "expression": "grel:\"AMAZON\"",
    "onError": "set-to-blank",
    "newColumnName": "90122$a",
    "columnInsertIndex": 5,
    "description": "Create column 90122$a at index 5 based on column 90122$u using expression grel:\"AMAZON\""
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "ISBN13",
    "expression": "grel:\"https://pictures.abebooks.com/isbn/\"+value+\".jpg\"",
    "onError": "set-to-blank",
    "newColumnName": "90123$u",
    "columnInsertIndex": 4,
    "description": "Create column 90123$u at index 4 based on column ISBN13 using expression grel:\"https://pictures.abebooks.com/isbn/\"+value+\".jpg\""
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "90123$u",
    "expression": "grel:\"ABEBOOKS\"",
    "onError": "set-to-blank",
    "newColumnName": "90123$a",
    "columnInsertIndex": 5,
    "description": "Create column 90123$a at index 5 based on column 90123$u using expression grel:\"ABEBOOKS\""
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "ISBN13",
    "expression": "grel:\"https://products-images.di-static.com/image/jean-robert-touvron-histoire/\"+value+\"-475x500-1.webp\"",
    "onError": "set-to-blank",
    "newColumnName": "90124$u",
    "columnInsertIndex": 4,
    "description": "Create column 90124$u at index 4 based on column ISBN13 using expression grel:\"https://products-images.di-static.com/image/jean-robert-touvron-histoire/\"+value+\"-475x500-1.webp\""
  },
  {
    "op": "core/column-addition",
    "engineConfig": {
      "facets": [],
      "mode": "row-based"
    },
    "baseColumnName": "90124$u",
    "expression": "grel:\"DECITRE\"",
    "onError": "set-to-blank",
    "newColumnName": "90124$a",
    "columnInsertIndex": 5,
    "description": "Create column 90124$a at index 5 based on column 90124$u using expression grel:\"DECITRE\""
  },
  {
    "op": "core/column-rename",
    "oldColumnName": "000",
    "newColumnName": "LDR",
    "description": "Rename column 000 to LDR"
  },
  {
    "op": "core/column-reorder",
    "columnNames": [
      "LDR",
      "001",
      "90122$a",
      "90122$u",
      "90123$a",
      "90123$u",
      "90124$a",
      "90124$u",
      "073$a"
    ],
    "description": "Reorder columns"
  },
  {
    "op": "core/column-removal",
    "columnName": "073$a",
    "description": "Remove column 073$a"
  }
]

On exporte ensuite les données au format csv pour les réimporter dans Alma en utilisant le profil « Import 901 (Url des vignettes ) pour notices avec isbn 10 »

Gestion de la mise à jour des champs 901

Voici les règles auxquelles obéit le service :

  • Une 901 Electre ou TMDB (ind2 =1 ou 5) ne peut pas être modifiée par la règle de normalisation courante puisqu’elles sont calculées à partir de procédures externes
  • Une 901 dont le lien est signalé comme Invalide (ind1 = 0) ou Produit manuellement (Ind1 = 2) ne fait pas être écrasées par la règle de normalisation courante.
  • Les autres 901 doivent pouvoir être mises à jour en cas de correction des EANs ou ISBNs

Pour gérer ces contraintes, on s’appuie sur la règle de fusion Fusion Passerelle SUDOC. À la fusion de la notice SUDOC avec la notice Alma, on conserve les 901 de la notice locale à l’exclusion des 901 Decitre, Abebooks et Amazon (901$a) qui ont été générés automatiquement (Ind1 =1). Ces champs seront régénérés automatiquement à l’enregistrement de la notice.

  	remove MARC."XXX" excluding "330,461,463,606,901,993,995,996,998"
        remove MARC."901.{1,*}" if exists subfield "a.AMAZON"
        remove MARC."901.{1,*}" if exists subfield "a.ABEBOOKS"
        remove MARC."901.{1,*}" if exists subfield "a.DECITRE" 

La règle de normalisation Mise en forme des notices Unimarc à l’enregistrement .drl recréé un champ 901 que si auncun champ n’est présent pour le service traité.

Notices Marc 21

Pour les notices Marc 21, les URLS sont produites à partir des ISBNS de la version imprimée (776$z). On utilise l’ISBN 13 pour les services DECITRE et ABEBOOKS et on prend l’ISBN existant pour le service Amazon.

Les 901 sont produites à l’enregistrement de la notice via la règle Marc 21 Modif lors de l’enregistrement. La règle ne traite pas les notices de la zone communautaire.

Gestion des vignettes pour les documents vidéos

La récupération des vignettes depuis TMDB exigent des traitements qui ne peuvent pas être mis en place dans Alma. POur l’instant, nous proposons de déléguer ces traitements à UBM

Configuration Primo VE

Configuration > Décourverte > Configuration d’affichage > Configuration de vignette

Prilmo VE permet configurer un template d’URL en s’appuyant sur n’importe quel champ Alma (voir documentation d’Exlibris). Dans notre cas, on récupère simplement l’URL en 901$u si cette dernière n’est pas signalée comme invalide (901 ind.1 = 0). Le template d’URL Primo VE ne gère pas les champs répétés. Il s’arrête à la première occurrence rencontrée. Nous sommes donc contraints de créer un template par type de cas rencontré.

Date de publication

Mis à jour le

Attention ! Certains établissements utilisent parfois de procédures complémentaires