Raspberry Pi – Ein eigener eBook Server
Raphael | On 13, Jan 2014
Vor einiger Zeit habe ich ja bereits einen Artikel geschrieben wie man mit dem Raspberry Pi einen WIFI Repeater für kleines Geld selbst zusammen bauen kann. Dieses mal soll es um einen eBook Server gehen.
Der wohl bekannteste und – meiner Meinung nach – beste eBook Content Server dürfte sicherlich Calibre sein. Ich selbst benutze Calibre schon eine ganze weile sowohl auf dem Mac als auch auf dem PC um meine eBooks zu verwalten. Allerdings wollte ich das ganze nun gerne auf den Pi auslagern, damit ich jederzeit und überall an meine eBooks heran komme, ohne jedes mal vorher einen Rechner hochfahren zu müssen.
Mit dem Content Server von Calibre kann ich nicht viel anfangen, mir gefällt das Design einfach nicht, außerdem ist es eher schwer den Content Server ohne die vielen abhängigkeiten von Calibre zu installieren… Versteht mich nicht Falsch, Calibre ist toll und ich nutze es sehr gerne, allerdings geht es mir in diesem Fall nur darum eine Calibre Library verfügbar zu machen.
Vor einiger Zeit bin ich auf BicBucStriim gestossen, damals noch in den Kinderschuhen und das jQuery Mobile interface hat mich auch nicht unbedingt von den Socken gehauhen. Daher habe ich mich dazu entschlossen meinen eigenen Content Server für meine Library zu schreiben: library a.k.a CPS
Im gegensatz zu BicBucStriim basiert library komplett auf Python. Dies hatte für mich den Vorteil dass ich einfach und ohne viel stress (webserver einrichtung) meine library ans netz bekomme und dabei trotzdem nicht an ein bestimmtes OS gebunden bin.
Ich habe mich auch dazu entschieden ein User Management einzubauen, so können mehrere User angelegt werden und diesen verschiedene rollen zugewiesen werden. Eine kleine Besonderheit ist vielleicht noch, dass im Gegensatz zu anderen mir bekannten “Calibre Servern” library erlaubt vorhandene Bücher zu editieren und KEINEN neustart benötigt wenn die library von der Desktop Version von Calibre aktuallisiert wurde. Neue Bücher sind also sofort verfügbar.
Da ich selbst viel auf meinem Kindle lese, habe ich außerdem die Funktion “an kindle senden” eingefügt, so kann ein buch bequem aus dem browser heraus an die Kindle Mail geschickt werden und ist sofort auf dem Kindle verfügbar. Natürlich gibt es auch einen OPDS feed für diverse Reader Apps, dort werden Feeds für die Neusten Bücher, Autoren A-Z sowie eine Suche ausgegeben.
Das ganze ist bei mir bereits seit mehreren Wochen erfolgreich im Einsatz und ich möchte es nicht mehr missen, dennoch bleibt zu sagen das das ganze noch im Beta Stadium ist!
weitere Informationen und benötigte Daten findet ihr auf der Projekt Seite: http://bitbucket.org/raphaelmutschler/calibreserver
Nachtrag: Philipp von typomedia.org hat für das ganze ein init-Script für Debian geschrieben.
-
Hallo Raphael,
ich habe Schwierigkeiten den CalibreServer (Raspbian) anzuwerfen:
pi@rpi:/var/calibreserver$ sudo python cps.py
Traceback (most recent call last):
File “cps.py”, line 9, in
from cps import web
File “/var/calibreserver/cps/web.py”, line 7, in
from cps import db, config, ub, helper
File “/var/calibreserver/cps/db.py”, line 23, in
conn = engine.connect()
File “/var/calibreserver/lib/sqlalchemy/engine/base.py”, line 1641, in connect
return self._connection_cls(self, **kwargs)
File “/var/calibreserver/lib/sqlalchemy/engine/base.py”, line 59, in __init__
self.__connection = connection or engine.raw_connection()
File “/var/calibreserver/lib/sqlalchemy/engine/base.py”, line 1699, in raw_connection
return self.pool.unique_connection()
File “/var/calibreserver/lib/sqlalchemy/pool.py”, line 220, in unique_connection
return _ConnectionFairy(self).checkout()
File “/var/calibreserver/lib/sqlalchemy/pool.py”, line 431, in __init__
rec = self._connection_record = pool._do_get()
File “/var/calibreserver/lib/sqlalchemy/pool.py”, line 867, in _do_get
return self._create_connection()
File “/var/calibreserver/lib/sqlalchemy/pool.py”, line 225, in _create_connection
return _ConnectionRecord(self)
File “/var/calibreserver/lib/sqlalchemy/pool.py”, line 318, in __init__
self.connection = self.__connect()
File “/var/calibreserver/lib/sqlalchemy/pool.py”, line 379, in __connect
connection = self.__pool._creator()
File “/var/calibreserver/lib/sqlalchemy/engine/strategies.py”, line 80, in connect
return dialect.connect(*cargs, **cparams)
File “/var/calibreserver/lib/sqlalchemy/engine/default.py”, line 283, in connect
return self.dbapi.connect(*cargs, **cparams)
sqlalchemy.exc.OperationalError: (OperationalError) unable to open database file None NonePython 2.7.3 ist installiert. Wie bringe ich den CalibreServer zum Laufen?
Danke für Deine Hilfe und Gruß,
Alex
-
Hallo, erst mal vielen vielen Dank! Tolles Tool!
Bei mir läuft das ganze sehr gut, jedoch möchte ich die OPDS feed Anbindung nutzen,
wie lautet hierfür die adresse?Vielen Dank! ;)
-
Hallo,
am besten find ich deine Funktion “send to kindle”. Mein Problem ist nur ,dass ich kindlegen nicht zum laufen bekomme. Ich habe es auf der Seite runtergeladen und auf der raspberry extrahiert. Wenn ich versuche kindlegen auszuführen, bekomme ich nur den Fehler “command not found”. Läuft kindlegen gar nicht auf der PI? Wäre es dann vll möglich die Konvertierung via calibre einzubauen (http://manual.calibre-ebook.com/cli/ebook-convert.html)
Kenn mich dazu leider nicht genug mit Python aus :(Gruß,
Arndt -
Hi Raphael,
danke für den Server ! Lief bei mir auf Anhieb – super.
Meine Frau (liest auf kindle) findet es auch gut, nur mit den englischen Bezeichnungen kann sie sich nicht so recht anfreunden. Kann man das irgendwo umstellen ? Oder ist Fummelei in index.html und index2.html die einzige Lösung ?
Kann man die Bücher auch nach Sprachen auflisten ? Bei COPS geht das, aber Deine Variante gefällt mir erheblich besser.Nochmal danke und viele Grüsse
Joshi -
Hallo,
Klasse – die Updates klingen super – wurde gestern zufällig gefragt, ob man auch nach Sprachen sortieren kann – und zack ist es eingebaut =)
Ich hab jetzt noch zwei Fragen:
1) Wie Update ich den Server ohne das die Shelves und Benutzer verloren gehen? Bzw. wie sind die Shelves implementiert? Wenn ich die DB überschreibe – bleiben die dann vorhanden?2) Gibt es eine schicke Möglichkeit das Script in den AutoStart zu hängen? Momentan starte ich bei Bücher die Raspberry neu, gehe ins Verzeichnis und gebe sudo nohup python cps.py 1> /dev/null 2> /dev/null & ein. Per ‘Bootscript’ hat es nicht funktioniert, da die Umgebungsvariablen da noch nicht gesetzt sind.
Gruß,
Arndt -
Hi,
vielen Dank für diese interessante Projektidee.
Dachte mir, das ist genau die richtige Aufgabe fuer meinen ersten raspbery pi, den ich vor wenigen tagen erhalten habe. Bin noch absoluter Neuling was den RPI betrifft, und wollte mal fragen, welches OS sich dafuer besonders empfiehlt. Hab mit dem RPI auch eine vorinstallierte Noobs SD Card erhalten, auf der unterschiedliche Systeme enthalten sind.LG Armand
-
Wie ist denn der port des Servers?
-
Hat sich erledigt ist Port 8083
-
-
Hallo!
Vielen Dank fürs Programm. Ich habe den Server am laufen gekriegt aber die Funktion “Send ebook to Kindle” scheint nicht zu funktionieren. Ich vermute, ich habe 2 Probleme:
1. Konfiguration von Gmail-Konto: kannst du bitte mir sagen, wie ich in die config.ini-Datei die Konfiguration meines Gmail-Accounts richtig eingeben kann?
2. kindlegen: es gibt keine Binär-Dateien für ARM, nur für i386 und deswegen, kriege ich das Programm nicht auf dem Raspi zum laufen (-bash: ./kindlegen: cannot execute binary file). Gibt es hier alternativen?Vielen Dank für deine Arbeit und für deine Hilfe!
Gruß,
Ricardo.
-
Vielen Dank für das Projekt. Ich habe es auf einem CubieTruck laufen, mit Hilfe von
http://blog.scphillips.com/2013/07/getting-a-python-script-to-run-in-the-background-as-a-service-on-boot/ läuft es jetzt auch im Hintergrund und wird mit init.d gestartet.
Anm: Wer es nachmachen will, muss in cps.py zusätzlich die Zeile #!/usr/bin/env python einfügen und in dem init.d-script die Zeile, welches den Background-Prozess startet(start-stop-daemon …), mit der Option –chdir $DIR ergänzen.
Nur eins habe ich noch nicht geschnallt oder übersehen. Wie kriege ich jetzt meine Bibliothek aus dem Desktop-Calibre auf den Content-Server hochgeladen?-
Hallo Knut, ich kriege mein Init.d-Script nicht zum Laufen! Wie ich weiter unten geschrieben habe, funktioniert es nur mit einem angemeldeten Benutzer und ich habe keine Idee mehr an was es liegen könnte. Kannst du dein Script mal posten oder auf GitHub stellen? Das wäre cool! Scheinbar hast du das einzige funktionierende Script ;)
-
-
Servus, bei mir gibt es keine config.ini. Wo sollte sie sein?
-
Für Debian gibt es ein Init-Script auf https://gist.github.com/typomedia/a7c6cc268ee4169a8b6f
In der cps/config.py muss noch der Pfad zur config.ini absolut gesetzt werden. -
Klar! Kannste gerne verlinken. Leider kämpfe ich aktuell noch mit dem Problem, dass zwar Starten, Stoppen und Restarten funktioniert, allerdings nicht beim Starten des Systems. Ich vermute, dass in der Python-App Umgebungsvariablen verwendet werden, die nur einem angemeldeten User zur Verfügung stehen – denn angemeldet geht’s ja. Eine Idee?
-
hallo,
Also ich finde die Oberfläche echt super!Aber wenn ich einen Benutzer Anlege, wird die Kindle Email Adresse nicht gespeichert,
auch wenn ich den benutzer weiter bearbeiten will kommt keine Fehlermeldung, aber die änderungen werden auch nicht übernommen :/ jemand nen Tipp? -
Nun habe ich es geschafft die Kindle Adressen einzutragen, aber nur wenn der user admin ist und dann selbst ändert, wenn der User kein admin ist und was ändern will hängt sich der server weg :/
-
Und noch eine Frage, wo soll den das Kindlegen gespeichert werden unter debian? er sagt mir immer “there was an error sending this book”
habe es unter /bin/ versucht, ohen erfolgt,
im root des servers ebenfalls und im Ordner Kidlegen im server versucht :( -
Hallo,
wie bekomme ich das auf einer Diskstation zum Laufen?
Greetz
-
Hallo, ich habe den Server zum laufen gebracht, allerdings funktioniert es noch nicht mit dem init-Script und ich bekomme eine Reihe von Fehlern gemeldet, wenn ich versuche einen Benutzer anzulegen.
U.a. “ValueError: invalid literal for int() with base 10: ‘None'”
Damit kann ich als Linux-Laie wenig anfangen..
Ich habe hier einen Raspberry I mit Raspbian. Git und Screen sind installiert und so läuft auch das Programm mit “screen cps.py”. Gibt es eine Möglichkeit den Server mit HTTPS zu betreiben? Auch habe ich nicht verstanden an welcher Stelle genau die Datei /calibreserver/cps/config.py angepasst werden soll. (Wird weiter oben in den Kommentaren empfohlen)
Muss das init-Script, ausser dem Benutzername noch an anderer Stelle angepasst werden?
Vielen Dank!-
Hallo,
ich habe auch Interesse daran das ganze per HTTPS zu betreiben, da ich es aus dem Internet zugänglich machen möchte. Desweiteren währe es gut, wenn man ohne Login auch keine Bücher sieht…
Bezüglich des HTTPS habe ich schon eine Idee – allerdings im Augenblick keine Zeit diese umzusetzen:
http://flask.pocoo.org/snippets/111/Damit sollte es theoretisch gehen. Dies müsste in web.py eingebaut werden. Aber vielleicht komme ich die Tage noch dazu das einmal zu testen…
Gruß
Bastian-
Also ich bin weitergekommen…
in cps.py muss man ändern. Allerdings bekomme ich die https Verbindung nur lokal, über die Portweiterleitung der Fritz!Box bekomme ich nur gesagt, das die Website nicht verfügbar ist.
if config.DEVELOPMENT:
web.app.run(host=”0.0.0.0″, port=config.PORT, debug=True)
else:
http_server = HTTPServer(WSGIContainer(web.app), ssl_options={
“certfile”: “./cert.pem”,
“keyfile”: “./privkey.pem”
})
http_server.listen(config.PORT)
IOLoop.instance().start()Das Zertifikat für meine Domain habe ich mir über https://letsencrypt.org/ erstellt…
Gruß
Bastian-
Wenn die Portweiterleitung 1:1 ist, dann funktioniert das an der Fritz!Box
-
-
-
-
Hallo Raphael,
tolle Idee und gut umgesetzt. Ich vermisse jedoch bei mir den Button “Send to Kindle” Auch die Sprachumstellung finde ich nicht. Mache ich was falsch, oder hab ich eine falsche Version herunter geladen.
Gruß Wolfgang
-
Ouch…. ich bin so blöde. Falsche Version schätze ich mal- :-)
-
Satz mit X – diese Version benutze ich raphaelmutschler-calibreserver-285e5d7d5450. Habe ich eine Neuere Version übersehen?
Gruß Wolfgang
Comments