ash ray cure Life is a bitch | vofou a écrit :
Et au final, c'est quoi le moyen le plus rapide pour gérer les bibliothèques ? (classer les livres, etc...)
|
Un PHP compilé avec le support de zip (pour ouvrir les epub) et gd (pour créer des miniatures)
Ensuite suffit d'un script php pour créer une catégorie par auteur, déplacer les livres dans leur catégories respectives et créer les miniatures de chaque epub. (de base le e60 ne créé la miniature qu'à l'ouverture du livre )
Ça tombe bien je viens de terminer le mien (en me basant sur ce script de openbsdiste) :
Code :
- <?php
- ////////////////////////////////////////////////////////////////////////////
- // Permet de classer par les livres par auteur dans des catégories
- // Et de créer les vignettes des fichiers epub
- ////////////////////////////////////////////////////////////////////////////
- $dbPath = "/root/ebook.db"; //Chemin de la base du e60
- //$dbPath = "/home/ebook.db"; //Tests
- $coversDir = "/home/Books/cover"; //Répertoire contenant les couvertures
- //$coversDir = "/home/Custom/Books/cover"; //Tests
- $backupDir = "/home/Custom"; //Répertoire dans lequel sauvegarder les copies de la base
- //On créé une sauvegarde de la base de données
- if(!file_exists($backupDir . "/ebooks.first.db" )) copy($dbPath, $backupDir . "/ebooks.first.db" ); //Si c'est la première éxecution on sauvegarde la base de données initiale
- if(file_exists($backupDir . "/ebooks.last.db" )) unlink($backupDir . "/ebooks.last.db" ); //Si ce n'est pas la première éxecution, on supprime la base copiée à chaque lancement
- copy($dbPath, $backupDir . "/ebooks.last.db" ); //On copie une nouvelle version de cette base
- //Ouverture de la base sqlite
- $db = new SQLite3 ($dbPath);
- //On crée une catégorie par auteur
- $nbAuthorCreated = 0;
- $auteurs = $db->query ("select distinct id, author from BookInfo where author not in (select categoryTitle from CategoryInfo)" );
- while ($auteur = $auteurs->fetchArray ()) {
- $auteur = trim($auteur ["author"]);
- echo "Nouvel auteur : " . $auteur . "\n";
- $db->query ("insert into CategoryInfo values ('" . $auteur . "','0','0')" );
- $nbAuthorCreated++;
- }
- if($nbAuthorCreated>0) echo "\n";
- //On récupère l'index max dans CategoryBookData
- $ctr = $db->query ('select max(id) from CategoryBookData');
- $ctr = $ctr->fetchArray ();
- $ctr = ($ctr) ? $ctr = $ctr [0] + 1 : 1;
- //On recherche tous les livres n'ayant pas d'id dans une catégorie
- $nbBooksMoved = 0;
- $livres = $db->query ("select id,author, title from BookInfo where id not in (SELECT bookID FROM CategoryBookData)" );
- while ($livre = $livres->fetchArray ()) {
- //On place le livre dans la catégorie correspondante à son auteur
- $id = $livre ["id"];
- $auteur = $livre ["author"];
- $title = utf8dec($livre ["title"]);
- //On affiche le titre du livre, sur 25 caractères (pour que tout reste aligné)
- echo "Livre " . fixedSize($title, 25) . " deplace dans la categorie " . $auteur . "\n";
- $db->query ("insert into CategoryBookData (id,categoryTitle,bookID) values ('" . $ctr . "','" . $auteur . "','" . $id . "')" );
- $ctr++;
- $nbBooksMoved++;
- }
- if($nbBooksMoved>0) echo "\n";
- //On recherche le nombre de livres au format epub et sans couverture
- $nbMissingCovers = $db->query("SELECT count(id) FROM BookInfo WHERE bookFilePathName LIKE '%.epub' AND coverImagePathName = ''" );
- $nbMissingCover = $nbMissingCovers->fetchArray();
- $nbMissingCover = $nbMissingCover[0];
- $nbCoverCreated = 0;
- $nbCoverTotal = 0;
- //S'il y en a, on les liste
- if($nbMissingCover >0){
- $missingCovers = $db->query("SELECT id, title, bookFilePathName FROM BookInfo WHERE bookFilePathName LIKE '%.epub' AND coverImagePathName = ''" );
- while($missingCover = $missingCovers->fetchArray()){
- $pathName = $missingCover ["bookFilePathName"]; //Chemin de l'ebook
- $id = $missingCover["id"]; //ID du livre
- $title = utf8dec($missingCover["title"]); //Titre
- //On affiche l'avancement dans la création des couvertures
- $nbCoverTotal++;
- echo "[" . sprintf("%03d", $nbCoverTotal) . "/" . sprintf("%03d", $nbMissingCover) . "] ";
- //On affiche le titre du livre, sur 25 caractères (pour que tout reste aligné)
- echo fixedSize($title, 25) . " ";
- //Si l'epub existe, on lance la création de la couverture
- if(file_exists($pathName)){
- //On ouvre l'epup (un simple zip)
- $zip = new ZipArchive;
- if ($zip->open($pathName) === TRUE) {
- //On essaie d'ouvrir le fichier contenant la couverture
- $coverString = $zip->getFromName("cover.jpeg" );
- if(!$coverString)$coverString = $zip->getFromName("cover.jpg" );
- if(!$coverString)$coverString = $zip->getFromName("cover1.jpeg" );
- if(!$coverString)$coverString = $zip->getFromName("cover1.jpg" );
- //On ne trouve pas la couverture, on prend le premier jpg ou png qu'on trouve
- if(!$coverString){
- for($i = 0; $i < $zip->numFiles; $i++) {
- $entry = $zip->getNameIndex($i);
- if(preg_match('#\.(jpg|jpeg|png)$#i', $entry)){
- $coverString = $zip->getFromName($entry);
- break;
- }
- }
- }
- $zip->close(); //Fermeture de l'epub
- //Une couverture a été trouvée
- if($coverString){
- echo "[Cover trouvee] ";
- $im = @imagecreatefromstring($coverString);
- if($im){
- //Normalement ici on a une image, on la redimensionne en 172*200
- $cover = imagecreatetruecolor(172, 200);
- imagecopyresampled($cover, $im, 0, 0, 0, 0, 172, 200, imagesx($im), imagesy($im));
- imagedestroy($im);
- //On créé le chemin complet de l'image, avec le nom échapé de la même façon que sur les images créées par le e60
- $coverPath = $coversDir . "/" . str_replace(".epub", ".jpg", str_replace("/", "[_&]", $pathName));
- //On enregistre l'image
- imagejpeg($cover, $coverPath, 100);
- imagedestroy($cover);
- //On enregisre le chemin dans la base
- $db->query ("UPDATE BookInfo SET coverImagePathName = \"" . $coverPath . "\" WHERE id=" . $id);
- $nbCoverCreated++;
- echo "[OK]";
- }else{
- $db->query ("UPDATE BookInfo SET coverImagePathName = NULL WHERE id=" . $id);
- echo "[ERREUR] : le contenu de l'image trouvee n'a pas pu etre ouvert";
- }
- }else{
- $db->query ("UPDATE BookInfo SET coverImagePathName = NULL WHERE id=" . $id);
- echo "[ERREUR] : cover.jp(e)g introuvable";
- }
- } else {
- $db->query ("UPDATE BookInfo SET coverImagePathName = NULL WHERE id=" . $id);
- echo "[ERREUR] : Impossible d'ouvrir le fichier";
- }
- }else{
- //L'epub n'existe pas, ou plus, on place NULL (!= "" ) dans coverImagePathName pour ne pas retester ce fichier à sa prochaine éxecution
- $db->query ("UPDATE BookInfo SET coverImagePathName = NULL WHERE id=" . $id);
- echo "[ERREUR] : Le fichier '" . $pathName . "' n'existe pas, il ne sera pas testé à la prochaine éxcution";
- }
- echo "\n";
- }
- }
- if($nbCoverCreated>0) echo "\n";
- //On supprime les catégories ne contenant plus de livres
- $db->query ("DELETE FROM CategoryInfo WHERE categoryTitle NOT IN (SELECT author FROM BookInfo)" );
- if($nbAuthorCreated > 0){
- echo $nbAuthorCreated . " nouveau(x) auteur(s) ajoute(s)\n";
- }else{
- echo "Aucun nouvel auteur\n";
- }
- if($nbBooksMoved > 0){
- echo $nbBooksMoved . " livre(s) deplace(s)\n";
- }else{
- echo "Aucun livre deplace dans une categorie\n";
- }
- if($nbCoverCreated > 0){
- echo $nbCoverCreated . " couverture(s) creee(s)\n";
- }else{
- echo "Aucune couverture creee\n";
- }
- function fixedSize($string, $size){
- $string = neo_remove_accent($string);
- if(strlen($string) >= $size){
- return substr($string, 0, $size);
- }//else
- for($i=strlen($string); $i < $size; $i++)$string .= " ";
- return $string;
- }
- function neo_remove_accent($l_str){
- $l_match = array('/[àâäåãáÂÄÀÅÃÁæÆ]/','/[ß]/','/[çÇ]/','/[Ð]/','/[éèêëÉÊËÈ]/','/[ïîìíÏÎÌÍ]/','/[ñÑ]/','/[öôóòõÓÔÖÒÕ]/','/[__]/','/[ùûüúÜÛÙÚ]/','/[¥_Ý_ýÿ]/','/[__]/');
- $l_replace = array('a', 'b', 'c', 'd', 'e', 'i', 'n', 'o', 's', 'u', 'y', 'z');
- return preg_replace($l_match, $l_replace, $l_str);
- }
- function utf8dec ( $s_String ) {
- $s_String = html_entity_decode(htmlentities($s_String." ", ENT_COMPAT, 'UTF-8'));
- return substr($s_String, 0, strlen($s_String)-1);
- }
- ?>
|
C'est un peu à l'arrache, y'a sûrement moyen de l'améliorer (genre ne pas copier la base si aucune modif n'est faite dessus), mais ça marche très bien.
Ensuite, via telnet, il suffit d'exécuter ce script avec php (/chemin/de/php/php /home/Custom/script.php), tous les livres sont classés dans des bibliothèques par auteur, et tous les epub ont une miniature.
Perso je l'ai d'abord exécuté comme ça une fois, parce que les miniatures sont longues à générer (compter 2/3sec par livre). Et ensuite je l'ai rajouté au permarun.sh, ça prend ~2sec au boot (à cause de la copie de la base, ça peut se retirer), mais du coup maintenant après une synchro je reboot le e60 (là aussi ça prend quelques secondes supplémentaires, mais je rajoute pas les livres pas paquet de 100, donc ça va) et hop les nouveaux livres sont classés et ont une miniature
Pour compiler PHP, c'est le configure que j'avais donné plus haut mais avec en plus --with-zip et --with-gd. Par contre là j'ai pas réussi à le compiler aussi facilement, et au final j'ai utilisé la solution de sorg et compilé ça à travers une machine virtuelle ARM. Plus simple, mais plus long (~2h de compil . Faut dire que Qemu pour émuler la machine ARM lancé dans une VirtualBox sous Windows 7 .... forcément ça rame ).
Fin bon, si vous voulez pas vous emmerder à le compiler, je l'ai mis là : http://www.multiupload.com/G7Y814TPOP
C'est clairement pas parfait, mais ça fait toujours une petite amélioration ergonomique en attendant de pouvoir faire mieux. |