TextUID : Propositions pour un identifiant unique d’un livre, commun à ses différentes éditions, générable automatiquement

Dans cet article, je propose des pistes pour une méthode facilement reproductible permettant de générer automatiquement un identifiant de texte. Ce n’est pas une méthode parfaite, mais plutôt la « moins mauvaise » méthode, aussi je suis ouvert à toute suggestion permettant de l’améliorer.

MAJ 08/06/2014 : ajout des règles 6 et 7 et de deux nouveaux exemples. Merci à @edasfr pour ces remarques.

Pourquoi ?

Lorsque je développe un site ou un outil pour les libraires, un besoin récurent celui est de pouvoir identifier les différents livres correspondant à un même texte (nouvelle édition, réédition en poche, version numérique ou audio, etc.).

Par exemple, le site de la librairie Scylla, sur chaque fiche livre, propose le même livre dans d’autres formats ou d’anciennes éditions épuisés disponibles d’occasion. Autre exemple, la librairie Charybde, pour le calcul de ses meilleures ventes, souhaite que les ventes d’un même texte chez différents éditeurs soient additionnés et pas considérés comme des livres différents.

Aujourd’hui, ce recoupement demande que les librairies (ou autres utilisateurs de Biblys) créent manuellement ces relations, opération fastidieuse qui peut être source d’erreur.

Cahiers des charges

La méthode de génération de l’identifiant doit :

  • être facilement à mettre en œuvre afin que n’importe qui puisse générer un identifiant sans passer par une autorité centrale ;
  • être suffisamment détaillée et prévoir tous les pièges possibles : deux acteurs générant un identifiant pour le même texte doivent parvenir systématiquement au même résultat.

D’autres (mauvaises) solutions

  • Le titre du livre, de toute évidence, ne peut convenir puisque que, si deux editions d’un livre ont a priori le même titre, il n’est pas rare que deux livres sans aucun rapport ait également le même titre. Par exemple, dans la base Biblys (qui est loin d’être exhaustive), il y a pas moins de cinq titres d’auteurs différents intitulé « Les Insoumis« …
  • Les ISBN sont propres à chaque édition d’un livre, il arrive parfois qu’un même livre chez un même éditeur puisse obtenir des ISBN différents au fil des réimpressions, ils ne peuvent donc convenir à cet usage.
  • La norme ISTC (pour International Standard Text Code) se rapproche de nos besoins, mais elle a deux désavantages. D’abord, elle ne nécessite de passer par une autorité centrale, une agence (en France, Électre) qui ne peut créer de nouveaux codes qu’à la demande d’un éditeur ou d’un ayant droit. De plus, elle semble peu utilisée aujourd’hui.

Description de la norme TextUID

Elle se présente sous la forme un ensemble de règles, dont le but est de décrire la méthode de génération de l’identifiant en tentant de prévoir un maximum de cas particuliers pour indiquer la marche à suivre le cas échéant. De nouvelles règles pourront donc être ajoutées si de nouveaux cas particuliers problématique sont découverts.

Règle 1

Le TextUID est une empreinte MD5 généré d’après une chaîne de caractères précises, encodé en UTF-8, en majuscules, contenant :
TITRE ORIGINAL du livre
barre oblique entouré d’espaces : ‘ / ‘
NOM PRÉNOM de l’auteur (ou NOM uniquement le cas échéant)

Soit : TITRE ORIGINAL / NOM PRÉNOM

Règle 2

Le titre du livre doit être dans la langue de publication originale, afin que les différentes traductions d’une oeuvre possèdent bien le même identifiant que l’original.

Règle 3

Si le livre a plusieurs auteurs, on les ajoute dans l’ordre alphabétique, l’un après l’autre, séparés par une virgule et une espace : NOM PRÉNOM, NOM PRÉNOM (ou NOM uniquement le cas échéant)

Soit : TITRE ORIGINAL / NOM PRÉNOM, NOM, NOM PRÉNOM

Règle 4

S’il existe plusieurs graphies pour un titre de livre, on utilise celui mentionné sur la couverture de la première édition.

Règle 5

S’il existe plusieurs graphies pour un nom d’auteur, on utilise celui mentionné sur la couverture de la première édition de son premier livre publié.

Règle 6

Si le livre fait partie d’une série, on utilise le titre du tome uniquement. Si le tome n’a pas de titre, on utilise le nom de la série, suivi d’un tiret et du numéro du tome.

Règle 7

Si le livre est un ouvrage collectif et qu’un ou plusieurs directeurs d’ouvrage sont mentionnés (« Sous la direction de… »), ce sont ces noms qui seront utilisés au lieu du nom des auteurs.

Quelques exemples :

Le Petit Prince

Chaîne : LE PETIT PRINCE / DE SAINT-EXUPÉRY ANTOINE
Empreinte MD5 : 31943e821c39ccd479441a2b0bdcf2b7

L’Attrape-coeurs

Chaîne : THE CATCHER IN THE RYE / SALINGER J. D.
Empreinte MD5 : 9c93c0d32ee994bddf65bb6f3bcfa421

Les Soldats de la mer

Chaîne : LES SOLDATS DE LA MER / RÉMY ADA, RÉMY YVES
Empreinte MD5 : d44c3bf585ee56cf1ae02f043492de81

À la recherche du temps perdu, tome 2

Chaîne : À L’OMBRE DES JEUNES FILLES EN FLEURS / PROUST MARCEL
Empreinte MD5 : 736ac35cc4ce8b67dfbaaa901c03f398

L’énergie à découvert, sous la direction de…

Chaîne : L’ÉNERGIE À DÉCOUVERT / JEANDEL CATHERINE, MOSSERI REMY
Empreinte MD5 : 97ff30f497e277265045e3cbdf08a37c

Exemples de code

PHP

<?php

function textuid($title, $authors)
{
    foreach ($authors as $author)
    {
        if (!isset($authors_string)) $authors_string = NULL;
        else $authors_string .= ', ';
        $authors_string .= trim($author['last_name'].' '.$author['first_name']);
    }
    $string = mb_strtoupper($title.' / '.$authors_string, 'UTF-8');
    $hash = md5($string);
    return array('string' => $string, 'hash' => $hash);
}

$book_title = "Les Soldats de la mer";
$book_authors = array(
    array('first_name' => 'Ada', 'last_name' => 'Rémy'),
    array('first_name' => 'Yves', 'last_name' => 'Rémy')
);

var_dump(textuid($book_title, $book_authors));

Voir aussi ici le code en action.

Conclusion

J’utilise déjà cette méthode, à des fins de test, pour la base Biblys. Je la partage ici car je pense qu’elle pourrait être utile à d’autres en interne, mais aussi parce qu’elle prendrait un tout autre intérêt dans le cadre d’un échange de données entre des bases différentes.

Je suis conscient que cette méthode ne pourra jamais fonctionner à 100%, mais je pense que la première règle doit pouvoir couvrir 99% des cas et que les suivantes doivent pouvoir permettre de se rapprocher au maximum de la perfection… tout en sachant qu’on ne pourra jamais l’atteindre ! Mais c’est sans doute le prix à payer pour une génération automatique, sans vérification humaine.

Je suis donc bien entendu ouvert à toute question, remarque ou proposition de règles qui pourrait permettrait d’améliorer la méthode !

PHP : Conversion ISBN/EAN, la classe !

J’ai proposé ici-même, ces dernières années, plusieurs fonctions PHP permettant la manipulation, la conversion et la validation de codes ISBN, que j’utilise notamment dans le cadre de Biblys ou Citriq.  Entre temps, j’ai découvert la programmation orienté objet : voici donc une classe pour réunir toutes ses fonctions.

Télécharger php-isbn-class sur Github

Un autre intérêt de cette classe par rapport à mes précédentes fonctions est qu’elle ne se limite pas aux ISBN francophones (978-2 et 979-10) mais qu’elle fonctionne avec n’importe quel code, grâce au fichier range.xml qui l’accompagne.

Cette classe peut être utilisée pour :

  • Valider un code ISBN
  • Convertir des codes entre les formats ISBN-10, ISBN-13 et EAN (sans tirets)
  • Calculer le caractère de contrôle
  • Afficher l’agence d’enregistrement du code (pays ou langage)

Démo

Une démo est disponible à l’adresse : http://labs.nokto.net/php-isbn-class/

Installation

  • Incluez ISBN.class.php dans votre script PHP
  • Procurez-vous une version récente du fichier range.xml auprès de l’ISBN International Agency (ou utilisez celle fournie)
  • Définissez la constante ISBN_RANGES_FILE avec le chemin du fichier range.xml
  • Utilisez les autres constantes pour définir vos messages d’erreurs (en anglais par défaut).

Utilisation

 <?php
     require_once('ISBN.class.php');
     $isbn = new ISBN('9791091146098'); // créer un objet ISBN
     if ($isbn->isValid()) // vérifie si le code est un ISBN valide
     {
         echo $isbn->format('ISBN-13'); // affiche le code au format ISBN-13
         echo $isbn->format('ISBN-10'); // affiche le code au format ISBN-10
         echo $isbn->getChecksum(); // calcule et affiche le caractère de contrôle
         echo $isbn->getAgency(); // affiche l'agence d'enregistrement
     }
     else
     {
         echo $isbn->getErrors(); // show validation errors
     }
 ?>

Image de une : Barcode CC BY-SA  Martin Fisch

PHP : Convertir un code EAN-13 (sans tirets) en ISBN-13 (avec tirets)

Il y a quelques temps, je proposais ici-même une fonction php pour convertir ISBN-10 en EAN-13 (en recalculant la clé de contrôle) mais aussi une tentative de méthode pour convertir un EAN-13 en ISBN. Seul petit souci, aujourd’hui les ISBN sont à 13 chiffres, comme les EAN, la seule différence entre les deux formats étant les tirets qui les sépare, mais je n’avais aucune idée de la marche à suivre pour retrouver la place de ces fameux tirets dans le code. J’ai longtemps cherché comment faire, ayant besoin de convertir des EAN-13 en ISBN-13 dans le cadre de mon moteur Tys, qui propulse notamment la Librairie Ys, la Librairie Soleil Vert et le site des Editions du Bélial. Et bien, grâce au coup de pouce d’un gentil commentateur, c’est maintenant chose faite. Continuer la lecture de « PHP : Convertir un code EAN-13 (sans tirets) en ISBN-13 (avec tirets) »

PHP : Convertir un ISBN-10 en EAN-13 (et vice-versa)

Quand on est développeur web et libraire (et un peu nerd sur les bords), on peut se retrouver à faire ce genre de choses : convertir des codes ISBN en code EAN et réciproquement via PHP. Comme je n’ai rien trouvé d’équivalent ailleurs, j’ai du créer ma propre petite fonction. Et comme j’ai pensé qu’elle pouvait à d’autres, je vous en livre le code ci-dessous. Ainsi que quelques interrogations.

Continuer la lecture de « PHP : Convertir un ISBN-10 en EAN-13 (et vice-versa) »