Raspberry Pi: server ebook con Calibre e COPS

Calibre è sicuramente il software Open Source più famoso ed utilizzato per la gestione degli ebook. Si tratta essenzialmente di un programma che permette di catalogare la nostra libreria digitale, ma non solo: è possibile modificare, convertire e addirittura creare ex-novo gli ebook. Tra i vari moduli di Calibre troviamo il servizio calibre-server, un piccolo web server che permette di distribuire in rete gli ebook della libreria. Purtroppo il suo utilizzo prevede la completa installazione della suite Calibre e questo non è proprio il massimo in sistemi con risorse limitate come la scheda Raspberry Pi.

Per ovviare a questo problema esistono alcuni progetti che, utilizzando il solo database della libreria di Calibre ed il formato standard Open Publication Distribution System (OPDS), riescono a fornire lo stesso servizio di calibre-server attraverso l’installazione di un web server leggero, come nginx o lighttpd, e poche altre dipendenze.

In questa guida vedremo come installare uno di questi programmi, chiamato COPS, nella nostra Raspberry Pi.

calibre-server

Come già accennato, Calibre non è un programma molto indicato per essere installato su Raspberry, soprattutto se prevediamo di utilizzare quest’ultima in modalità Headless. Inoltre, normalmente, i binary correnti di Calibre sono forniti solo per le architetture x86_64: per utilizzare Calibre su RPi, che utilizza processori ARM, dobbiamo quindi ricompilare il tutto da sorgente oppure accontentarci di installare tramite APT la versione fornita nei repository standard della Raspberry, sempre più vecchia della versione attuale. Per fare un confronto: la release correntemente disponibile per RPi è la 2.50, 35 versioni più vecchia dell’attuale 2.80!

In poche parole: L’installazione della suite di Calibre risulta un bel mattone da fare digerire alla Raspberry ed installare il tutto per utilizzare poi solo calibre-server non è propriamente il massimo.

COPS

COPS (Calibre OPDS (and HTML) Php Server) è un progetto di Sébastien Lucas e si tratta essenzialmente di un content server sviluppato in PHP che può essere installato in pochi minuti anche su sistemi a basse prestazioni come la Raspberry Pi. Una volta installato e configurato, COPS permette di navigare una libreria di ebook di Calibre da qualsiasi dispositivo collegato in rete, sia sotto forma di comuni pagine web, sia in formato di feed OPDS per i reader che supportano questo standard.

COPS: libreria visualizzata tramite Browser.
COPS: libreria visualizzata tramite Browser.
COPS: libreria visualizzata tramite feed OPDS via Aldiko su Android.
COPS: libreria visualizzata tramite feed OPDS via Aldiko su Android.

In entrambi i casi possiamo consultare tutte le informazioni disponibili per i titoli presenti nella libreria (copertine, trame, autori, case editrici, ecc.) così come effettuare ricerche e scaricare al volo i formati ebook che ci interessano.

Il vantaggio di utilizzare COPS al posto di calibre-server risiede nel fatto delle sue estremamente ridotte richieste di risorse per funzionare. Se poi, per progetti collaterali, abbiamo già installato un web server qualsiasi nella nostra Raspberry, l’installazione si limiterà allo scaricare l’archivio del programma (circa 900Kb), decomprimerlo in una directory accessibile al web server e ad una minima configurazione del tutto.

Requisiti.

Hardware

  • Una Raspberry Pi collegata in rete e perfettamente configurata.
  • Un PC da dove gestire la normale libreria di Calibre.

Software

  • Calibre: per lo scopo di questa guida non utilizzeremo direttamente il programma, ma solo la sua libreria. Possiamo copiare la libreria direttamente in una directory della Raspberry Pi, oppure (scelta consigliata) condividerla tramite lan o un servizio di sharing come Google Drive, Dropbox, ecc.
  • COPS: Calibre OPDS (and HTML) PHP Server. Un content server OPDS/HTML molto leggero, semplice da installare e gestire.
  • Nginx: web server leggero ad alte prestazioni. Insieme al web server installeremo inoltre alcuni moduli PHP necessari per il corretto funzionamento di COPS .

Operazioni preliminari.

Daremo per scontato che la Raspberry sia perfettmente configurata. Questo prevede che sia stata installata una versione qualsiasi delle varie distribuzioni Linux disponibili (Raspbian Jessie with Pixel/Lite, Minibian, ecc). Poiché andremo ad utilizzare la Raspberry in modalità Headless, ovvero senza monitor, tastiera e mouse, consiglio di installare la versione Lite della Raspbian che, tra l’altro, è stata appena aggiornata per il completo supporto alla nuova Raspberry Zero W. Quindi accertiamoci di aver installato correttamente il sistema operativo, di avere abilitato la connessione WiFi (o ethernet), di aver assegnato un IP statico alla RPi e che la stessa sia in grado di connettersi ad Internet.

Installare nginx

Colleghiamoci alla Raspberry Pi (localmente o tramite SSH) e come prima cosa effettuiamo l’aggiornamento dei pacchetti installati:

sudo apt-get update && sudo apt-get upgrade

Poi passiamo all’installazione di nginx e le estensioni necessarie per la gestione delle pagine PHP di COPS:

sudo apt-get install nginx php5-fpm php5-gd php5-sqlite php5-json php5-intl

Caso 1: installazione ex-novo di nginx.

Se stiamo installando nginx per la prima volta oppure non abbiamo intenzione di aggiungere altri siti o servizi oltre COPS, possiamo semplicemente aprirne il file di configurazione:

sudo nano /etc/nginx/sites-enabled/default

e sostituire la sezione server {…} già presente con la seguente:

server {

    listen [::]:80;
    
    # COPS root directory
    root   /var/www/cops;

    index index.html index.htm index.php feed.php;

    #Useful only for Kobo reader
    location /download/ {
      rewrite ^/download/(\d+)/(\d+)/.*\.(.*)$ /fetch.php?data=$1&db=$2&type=$3 last;
      rewrite ^/download/(\d+)/.*\.(.*)$ /fetch.php?data=$1&type=$2 last;
      break;
    }

    #Can break loading the images - if you don't see anything, comment
    location ~ ^/images.*\.(gif|png|ico|jpg)$ {
        expires 31d;
    }

    #Can also break loading the images, comment if it happens
    location ~ .(js|css|eot|svg|woff|ttf)$ {
        expires 31d;
    }

    location /Calibre {
        root /home/pi;
        internal;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

    # Limit access to Localnet
    location / {
        allow   192.168.1.0/24;
        deny    all;
        try_files $uri $uri/ =404;
    }
}

Caso 2: nginx già utilizzato con un sito pre-esistente.

Se stiamo già utilizzando nginx, sicuramente avremo già il web server correttamente configurato per servire le pagine del nostro sito. Possiamo tenere l’installazione di COPS separata da quella degli altri miei siti/webapp che girano sotto nginx. Per fare questo esistono diversi metodi, ma per semplicità faremo servire a nginx i diversi siti su diverse porte in questo modo:

http://192.168.1.190:80  <- sito 1
http://192.168.1.190:81  <- COPS

Non è una procedura elegante, ma funziona. L’alternativa sarebbe quella di usare differenti nomi host per i differenti siti e gestirli tramite un server DNS interno alla rete come DNSmasq, ad esempio, oppure il router principale, se prevede questa opzione.

Per fare questo apriamo il file di configurazione di nginx:

sudo nano /etc/nginx/sites-enabled/default

Identifichiamo il primo blocco server {…} relativo al sito già presente ed aggiungiamo/modifichiamo le seguente dichiarazioni:

listen 80 default_server;
# modificare il percorso con quello della root del vostro sito principale.
root         /var/www/sito1/


N.B. eventuali altre dichiarazioni già presenti andranno modificate in accordo con quanto sopra riportato.

Eliminiamo l’eventuale riga della dichiarazione server_name dominiolocale.com, se presente.

Poi aggiungiamo una nuova sezione server {…} per COPS con il seguente contenuto:

server {

    listen 81;

    # COPS root directory
    root   /var/www/cops;

    index index.html index.htm index.php feed.php;

    #Useful only for Kobo reader
    location /download/ {
        rewrite ^/download/(\d+)/(\d+)/.*\.(.*)$ /fetch.php?data=$1&db=$2&type=$3 last;
        rewrite ^/download/(\d+)/.*\.(.*)$ /fetch.php?data=$1&type=$2 last;
        break;
    }

    #Can break loading the images - if you don't see anything, comment
    location ~ ^/images.*\.(gif|png|ico|jpg)$ {
        expires 31d;
    }

    #Can also break loading the images, comment if it happens
    location ~ .(js|css|eot|svg|woff|ttf)$ {
        expires 31d;
    }

    location /Calibre {
        root /home/pi;
        internal;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

    # Limit access to Localnet
    location / {
        allow   192.168.1.0/24;
        deny    all;
        try_files $uri $uri/ =404;
    }

}

Creiamo la directory dove poi copieremo il file di COPS:

sudo mkdir -p /var/www/cops

Correggiamo i permessi della dir appena creata:

sudo chmod -R 770 /var/www/cops
sudo chown -R pi:www-data /var/www/cops

Anche se dal punto di vista della sicurezza non è il massimo, per facilitare la gestione dei file nella cartella accessibile da nginx, aggiungiamo l’utente pi al gruppo www-data:

sudo usermod -a -G www-data pi

Verifichiamo che il web server funzioni correttamente creando un file index.php nella dir /var/www/cops/:

sudo nano /var/www/cops/index.php

Inseriamo il seguente contenuto nel file appena creato:

<?php phpinfo(); ?>

Salviamo, usciamo dall’editor e ricarichiamo nginx:

sudo service nginx restart

Ora da un qualsiasi browser ubicato nella nostra rete navighiamo verso l’IP della Rapsberry Pi. Se tutto funziona a dovere, dovremmo visualizzare una pagina simile a quella sotto riportata:

Nginx: schermata phpinfo.
Nginx: sembra funzionare…

Prima di procedere creiamo la directory /home/pi/Calibre dove copieremo la nostra libreria digitale:

mkdir /home/pi/Calibre

Preparare la libreria di Calibre.

Come già accennato all’inizio, il metodo migliore per distribuire la libreria di Calibre via COPS è quello di condividerla tra i due programmi tramite una share di rete o un servizio come Google Drive o Dropbox. In questo modo eviteremo di creare duplicati della libreria e manterremo i dati forniti da COPS su Raspberry allineati con i contenuti gestiti tramite Calibre su PC.

Per rendere le cose più semplici in questa guida copieremo la libreria di Calibre direttamente nella SD della Raspberry.

Come prima cosa, dal PC dove è installato Calibre, identifichiamo la sua libreria. Solitamente, in ambiente Linux e lasciando le varie opzioni di @default, la libreria viene memorizzata in ~/Calibre\ Library/. Dobbiamo copiare TUTTO il contenuto della libreria (incluse directory e sottodirectory contenenti gli ebook) nella directory /home/pi/Calibre sulla Raspberry Pi, facendo particolarmente attenzione ai file metadata_db_prefs_backup.json e metadata.db.

Per effettuare la copia utilizzeremo il comando scp, sicuramente già presente nella nostra linux box, quindi apriamo il terminale ed impartiamo i seguenti comandi:

cd ~/Calibre\ Library/
scp -r * pi@192.168.1.190:/home/pi/Calibre/

Ora che abbiamo nginx funzionante e libreria di Calibre copiata sulla scheda SD della Raspberry Pi, non rimane che passare all’installazione di COPS.

Installare e configurare COPS.

Torniamo alla Raspberry Pi. Scarichiamo e decomprimiamo l’ultima release di COPS nella directory precedentemente creata:

cd /var/www/cops
wget https://github.com/seblucas/cops/releases/tag/1.0.1
unzip cops-1.0.1.zip 

Creiamo un file di configurazione personalizzato utilizzando il file predefinito fornito da COPS:

cp config_local.php.example config_local.php

Modifichiamo il file config_local.php in modo da adattarsi alla nostra configurazione:

<?php
    if (!isset($config))
        $config = array();

    /*
     * The directory containing calibre's metadata.db file, with sub-directories
     * containing all the formats.
     * BEWARE : it has to end with a /
     */
    $config['calibre_directory'] = '/home/pi/Calibre/';

    /*
     * Catalog's title
     */
    $config['cops_title_default'] = "Libreria Ebook - rbnet.it";

    /*
     * SPECIFIC TO NGINX
     * The internal directory set in nginx config file
     * Leave empty if you don't know what you're doing
     */
    $config['calibre_internal_directory'] = '/Calibre/';

    /*
     * Full URL prefix (with trailing /)
     * useful especially for Opensearch where a full URL is often required
     * For example Mantano, Aldiko and Marvin require it.
     */

    $config['cops_full_url'] = "http://192.168.1.190/";
    /*
     * Wich header to use when downloading books outside the web directory
     * Possible values are :
     *   X-Accel-Redirect   : For Nginx
     *   X-Sendfile         : For Lightttpd or Apache (with mod_xsendfile)
     *   No value (default) : Let PHP handle the download
     */
    $config['cops_x_accel_redirect'] = "X-Accel-Redirect";

    /*
     * use URL rewriting for downloading of ebook in HTML catalog
     * See Github wiki for more information
     *  1 : enable
     *  0 : disable
     */
    $config['cops_use_url_rewriting'] = "1";

L’installazione di COPS è praticamente conclusa. Ora non resta che provare il tutto.

Usare COPS

Da un qualsiasi browser nella nostra LAN, navighiamo verso l’IP della Raspberry (es: http://192.168.1.190 oppure http:192.168.1.190:81 se abbiamo optato per l’opzione 2 durante la configurazione di nginx) e dovremmo ottenere una pagina web, simile alla seguente:

COPS: schermata principale.
COPS: schermata principale.

Di seguito alcune schermate tratte dal programma:

COPS: ultimi ebook aggiunti alla libreria.
COPS: ultimi ebook aggiunti alla libreria.
COPS: ricerca per tag. autore, titolo, ecc.
COPS: ricerca per tag. autore, titolo, ecc.

In ogni momento la flessibile ricerca interna permette di reperire gli ebook per titolo, autore, tag, casa editrice, ecc.

COPS: dettagli ebook.
COPS: dettagli ebook.

I pulsanti Epub, Mobi ecc. permettono di scaricare localmente il relativo formato ebook.

COPS: copertina ebook.
COPS: copertina ebook.
COPS: opzioni.
COPS: opzioni.

Dalla pagina delle opzioni possiamo modificare aspetto e comportamento di COPS:

COPS: template Bootstrap.
COPS: template Bootstrap.
COOPS: dettagli ebook con il template Bootstrap.
COOPS: dettagli ebook con il template Bootstrap.

COPS risulta utilizzabile anche da un device vecchio come un Kindle 4 Non-Touch tramite il browser integrato nell’e-reader. Anche il download dei formati Kindle compatibili funziona perfettamente:

COPS su Kindle: Indice ed Ebook aggiunti di recente.
COPS su Kindle: Indice ed Ebook aggiunti di recente.
COPS su Kindle: dettagli ebook.
COPS su Kindle: dettagli ebook.
COPS su Kindle: download di un ebook in formato MOBI.
COPS su Kindle: download di un ebook in formato MOBI.

Possiamo infine usare COPS senza browser, tramite un e-reader in grado di interpretare il comodo feed OPDS. Su Android due tra le app più utilizzate sono Moon + reader ed Aldiko. Una volta installate su smartphone o tablet, sarà sufficiente aggiungere un nuovo catalogo facendolo puntare al feed OPDS di COPS in questo modo:

http://IP-RASPBERRY-PI/feed.php

Vediamo come fare con Moon + reader. Dalla schermata principale fare tap sul menu in alto a destra e selezionare “Aggiungi nuovo catalogo“:

COPS: menu aggiunta feed OPDS.

Inserire poi il feed OPDS fornito da COPS (http://IP-RASPBERRY-IP/feed.php):

COPS: inserimento indirizzo feed.
COPS: inserimento indirizzo feed OPDS.

Una volta confermato l’inserimento, il catalogo sarà immediatamente disponibile e potremo navigare la nostra libreria digitale, effettuare ricerche e scaricare gli ebook nel dispositivo locale:

COPS: pagina principale del catalogo.
COPS: pagina principale del catalogo via feed OPDS.
COPS: ultimi ebook aggiunti via feed OPDS.
COPS: ultimi ebook aggiunti via feed OPDS.

Note sulla configurazione di COPS

Il file di configurazione di COPS config_local.php, che abbiamo creato per la nostra installazione, può essere ulteriormente personalizzato. Tutte le opzioni disponibili, con i valori di default, sono presenti nel file config_default.php e sono ben commentate. Questo file non deve essere mai modificato. Le opzioni vanno copiate in config_local.php e solamente qui possiamo apportare le modifiche ai valori di default. Evitare in tutti i modi di apportare cambiamenti direttamente nel file config_default.php in quanto durante gli aggiornamenti di COPS questo file verrà sovrascritto ed i valori irrimediabilmente perduti.

E con questo è tutto.

Buon divertimento!

6 commenti su “Raspberry Pi: server ebook con Calibre e COPS”

  1. Ciao, progetto molto interessante ma allo stato attuale la guida sembra non funzionare più, sarebbe possibile aggiornarla? Grazie

    Rispondi
    • Ciao Alessandro.
      Purtroppo la guida ha i suoi anni e sicuramente qualcosa è cambiato nel frattempo. Al momento non ho in progetto un aggiornamento, mi dispiace.

      Rispondi
  2. ciao, sto cercando di configurare cops su raspberry. funziona tutto tranne il download dei libri.
    mi dice

    Impossibile raggiungere il sito

    La pagina web all’indirizzo http://192.168.1.50/download/1858/………azw3
    potrebbe essere temporaneamente non disponibile oppure è stata permanentemente spostata a un nuovo indirizzo web.

    ovviamente i libri si trovano in un altro percorso.
    cosa sbaglio secondo te?

    Rispondi

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.