X-Git-Url: https://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/29f61501f309a719be91a47fd43872437435cd1a..e0f983c0d55e301fc646d956039cc425ad18076d:/gnu/packages/ebook.scm diff --git a/gnu/packages/ebook.scm b/gnu/packages/ebook.scm index aab4155d3d..504171ca8b 100644 --- a/gnu/packages/ebook.scm +++ b/gnu/packages/ebook.scm @@ -2,10 +2,12 @@ ;;; Copyright © 2015, 2016 Andreas Enge ;;; Copyright © 2016, 2018 Efraim Flashner ;;; Copyright © 2016, 2017 Alex Griffin -;;; Copyright © 2017, 2019, 2020 Brendan Tildesley +;;; Copyright © 2017, 2019, 2020, 2021 Brendan Tildesley ;;; Copyright © 2017 Roel Janssen -;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice +;;; Copyright © 2018–2021 Tobias Geerinckx-Rice ;;; Copyright © 2020 Marius Bakke +;;; Copyright © 2020, 2021 Vinicius Monego +;;; Copyright © 2020 Zheng Junjie <873216071@qq.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,33 +28,44 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix utils) #:use-module (guix git-download) + #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) + #:use-module (guix build-system meson) #:use-module (guix build-system python) #:use-module (gnu packages) #:use-module (gnu packages compression) #:use-module (gnu packages curl) #:use-module (gnu packages databases) + #:use-module (gnu packages file) #:use-module (gnu packages fonts) #:use-module (gnu packages fontutils) #:use-module (gnu packages freedesktop) #:use-module (gnu packages fribidi) #:use-module (gnu packages gcc) + #:use-module (gnu packages gettext) #:use-module (gnu packages gtk) #:use-module (gnu packages gnome) #:use-module (gnu packages glib) + #:use-module (gnu packages gstreamer) #:use-module (gnu packages icu4c) #:use-module (gnu packages image) #:use-module (gnu packages javascript) #:use-module (gnu packages libusb) #:use-module (gnu packages libreoffice) + #:use-module (gnu packages music) #:use-module (gnu packages pdf) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) + #:use-module (gnu packages python-build) + #:use-module (gnu packages python-compression) + #:use-module (gnu packages python-crypto) #:use-module (gnu packages python-web) #:use-module (gnu packages python-xyz) #:use-module (gnu packages qt) #:use-module (gnu packages serialization) + #:use-module (gnu packages speech) #:use-module (gnu packages sqlite) #:use-module (gnu packages time) #:use-module (gnu packages tls) @@ -79,10 +92,30 @@ (description "CHMLIB is a library for dealing with ITSS/CHM format files.") (license license:lgpl2.1+))) +(define-public python-pychm + (package + (name "python-pychm") + (version "0.8.6") + (source + (origin + (method url-fetch) + (uri (pypi-uri "pychm" version)) + (sha256 + (base32 + "0wpn9ijlsmrpyiwg3drmgz4dms1i1i347adgqw37bkrh3vn6yq16")))) + (build-system python-build-system) + (inputs + `(("chmlib" ,chmlib))) + (home-page "https://github.com/dottedmag/pychm") + (synopsis "Handle CHM files") + (description "This package provides a Python module for interacting +with Microsoft Compiled HTML (CHM) files") + (license license:gpl2+))) + (define-public calibre (package (name "calibre") - (version "4.18.0") + (version "5.14.0") (source (origin (method url-fetch) @@ -91,7 +124,7 @@ version ".tar.xz")) (sha256 (base32 - "0w9pcfvskjh4v00vjw3i6hzrafy863pgsmmqdx4lffip3p856brw")) + "0w8j9r9qa56r8gm9b10dwh8zrzqlv79s2br82jqg02lrnrbwwv0q")) (modules '((guix build utils))) (snippet '(begin @@ -103,8 +136,6 @@ "")) ;; Remove unneeded resources. - (delete-file "resources/viewer.js") - (delete-file "resources/viewer.html") (delete-file "resources/mozilla-ca-certs.pem") (delete-file "resources/calibre-portable.bat") (delete-file "resources/calibre-portable.sh") @@ -116,57 +147,60 @@ (native-inputs `(("pkg-config" ,pkg-config) ("qtbase" ,qtbase) ; for qmake - ("python2-flake8" ,python2-flake8) + ("python-flake8" ,python-flake8) + ("python-pyqt-builder" ,python-pyqt-builder) ("xdg-utils" ,xdg-utils))) (inputs - `(("chmlib" ,chmlib) - ("fontconfig" ,fontconfig) + `(("fontconfig" ,fontconfig) ("font-liberation" ,font-liberation) ("glib" ,glib) ("hunspell" ,hunspell) ("hyphen" ,hyphen) ("icu4c" ,icu4c) - ("js-mathjax" ,js-mathjax) ("libmtp" ,libmtp) ("libpng" ,libpng) + ("libjpeg" ,libjpeg-turbo) + ("libjxr" ,libjxr) ("libusb" ,libusb) ("openssl" ,openssl) ("optipng" ,optipng) ("podofo" ,podofo) ("poppler" ,poppler) - ("python" ,python-2) - ("python2-apsw" ,python2-apsw) - ("python2-beautifulsoup4" ,python2-beautifulsoup4) - ("python2-chardet" ,python2-chardet) - ("python2-cssselect" ,python2-cssselect) - ("python2-css-parser" ,python2-css-parser) - ("python2-dateutil" ,python2-dateutil) - ("python2-dbus" ,python2-dbus) - ("python2-dnspython" ,python2-dnspython) - ("python2-dukpy" ,python2-dukpy) - ("python2-feedparser" ,python2-feedparser) - ("python2-html2text" ,python2-html2text) - ("python2-html5-parser" ,python2-html5-parser) - ("python2-html5lib" ,python2-html5lib) - ("python2-lxml" ,python2-lxml) - ("python2-markdown" ,python2-markdown) - ("python2-mechanize" ,python2-mechanize) - ;; python2-msgpack is needed for the network content server to work. - ("python2-msgpack" ,python2-msgpack) - ("python2-netifaces" ,python2-netifaces) - ("python2-odfpy" ,python2-odfpy) - ("python2-pillow" ,python2-pillow) - ("python2-psutil" ,python2-psutil) - ("python2-pygments" ,python2-pygments) - ("python2-pyqtwebengine" ,python2-pyqtwebengine) - ("python2-pyqt" ,python2-pyqt) - ("python2-sip" ,python2-sip) - ("python2-regex" ,python2-regex) + ("python-apsw" ,python-apsw) + ("python-beautifulsoup4" ,python-beautifulsoup4) + ("python-cchardet" ,python-cchardet) + ("python-css-parser" ,python-css-parser) + ("python-cssselect" ,python-cssselect) + ("python-dateutil" ,python-dateutil) + ("python-dbus" ,python-dbus) + ("python-dnspython" ,python-dnspython-1.16) + ("python-dukpy" ,python-dukpy) + ("python-feedparser" ,python-feedparser) + ("python-html2text" ,python-html2text) + ("python-html5-parser" ,python-html5-parser) + ("python-html5lib" ,python-html5lib) + ("python-lxml" ,python-lxml) + ("python-markdown" ,python-markdown) + ("python-mechanize" ,python-mechanize) + ;; python-msgpack is needed for the network content server to work. + ("python-msgpack" ,python-msgpack) + ("python-netifaces" ,python-netifaces) + ("python-odfpy" ,python-odfpy) + ("python-pillow" ,python-pillow) + ("python-psutil" ,python-psutil) + ("python-py7zr" ,python-py7zr) + ("python-pychm" ,python-pychm) + ("python-pycryptodome" ,python-pycryptodome) + ("python-pygments" ,python-pygments) + ("python-pyqt" ,python-pyqt) + ("python-pyqtwebengine" ,python-pyqtwebengine) + ("python-regex" ,python-regex) + ("python-speechd" ,speech-dispatcher) + ("python-zeroconf" ,python-zeroconf) ("qtwebengine" ,qtwebengine) ("sqlite" ,sqlite))) (arguments - `(#:python ,python-2 - ;; Calibre is using setuptools by itself, but the setup.py is not + `(;; Calibre is using setuptools by itself, but the setup.py is not ;; compatible with the shim wrapper (taken from pip) we are using. #:use-setuptools? #f #:phases @@ -198,18 +232,27 @@ (add-before 'build 'configure (lambda* (#:key inputs outputs #:allow-other-keys) (let ((podofo (assoc-ref inputs "podofo")) - (pyqt (assoc-ref inputs "python2-pyqt")) - (python-sip (assoc-ref inputs "python2-sip")) + (pyqt (assoc-ref inputs "python-pyqt")) + (python-sip (assoc-ref inputs "python-sip")) (out (assoc-ref outputs "out"))) - (substitute* "setup/build_environment.py" - (("= get_sip_dir\\(\\)") - (string-append "= '" pyqt "/share/sip'"))) - + (substitute* "setup/build.py" + (("\\[tool.sip.bindings.pictureflow\\]") + "[tool.sip.bindings.pictureflow] +tags = [\"WS_X11\"]") + (("\\[tool.sip.project\\]") + (string-append "[tool.sip.project] +sip-include-dirs = [\"" pyqt "/share/sip" "\"]"))) (substitute* "src/calibre/ebooks/pdf/pdftohtml.py" (("PDFTOHTML = 'pdftohtml'") (string-append "PDFTOHTML = \"" (assoc-ref inputs "poppler") "/bin/pdftohtml\""))) - + ;; get_exe_path looks in poppler's output for these binaries. Make + ;; it not do that. + (substitute* "src/calibre/utils/img.py" + (("get_exe_path..jpegtran..") (string-append "'" (which "jpegtran") "'")) + (("get_exe_path..cjpeg..") (string-append "'" (which "cjpeg") "'")) + (("get_exe_path..optipng..") (string-append "'" (which "optipng") "'")) + (("get_exe_path..JxrDecApp..") (string-append "'" (which "JxrDecApp") "'"))) ;; Calibre thinks we are installing desktop files into a home ;; directory, but here we butcher the script in to installing ;; to calibres /share directory. @@ -228,7 +271,6 @@ "/share/fonts") "/tmp/.fonts") - (setenv "SIP_BIN" (string-append python-sip "/bin/sip")) (setenv "PODOFO_INC_DIR" (string-append podofo "/include/podofo")) (setenv "PODOFO_LIB_DIR" (string-append podofo "/lib")) ;; This informs the tests we are a continuous integration @@ -239,13 +281,12 @@ ;; fix it, so I'm not sure how to fix it. TODO: Fix test and remove this. (setenv "SKIP_QT_BUILD_TEST" "true") #t))) - (add-after 'build 'build-extra + (add-after 'install 'install-rapydscript (lambda* (#:key inputs #:allow-other-keys) - (invoke "python2" "setup.py" "mathjax""--system-mathjax" - "--path-to-mathjax" (string-append - (assoc-ref inputs "js-mathjax") - "/share/javascript/mathjax")) - (invoke "python2" "setup.py" "rapydscript"))) + ;; Unset so QtWebengine doesn't dump temporary files here. + (unsetenv "XDG_DATA_HOME") + (invoke "python" "setup.py" "rapydscript") + #t)) (add-after 'install 'install-man-pages (lambda* (#:key outputs #:allow-other-keys) (copy-recursively @@ -262,6 +303,28 @@ "/share/fonts/truetype"))) (delete-file-recursively font-dest) (symlink font-src font-dest)) + #t)) + ;; Make run-time dependencies available to the binaries. + (add-after 'wrap 'wrap-program + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (qtwebengine (assoc-ref inputs "qtwebengine"))) + (with-directory-excursion (string-append out "/bin") + (for-each + (lambda (binary) + (wrap-program binary + ;; Make QtWebEngineProcess available. + `("QTWEBENGINEPROCESS_PATH" = + ,(list (string-append + qtwebengine + "/lib/qt5/libexec/QtWebEngineProcess"))))) + ;; Wrap all the binaries shipping with the package, except + ;; for the wrappings created during the 'wrap standard + ;; phase. This extends existing .calibre-real wrappers + ;; rather than create ..calibre-real-real-s. For more + ;; information see: https://issues.guix.gnu.org/43249. + (find-files "." (lambda (file stat) + (not (wrapper? file))))))) #t))))) (home-page "https://calibre-ebook.com/") (synopsis "E-book library management software") @@ -284,6 +347,32 @@ e-books for convenient reading.") license:silofl1.1 license:cc-by-sa3.0)))) +(define-public ebook-tools + (package + (name "ebook-tools") + (version "0.2.2") + (source + (origin + (method url-fetch) + (uri (string-append "mirror://sourceforge/ebook-tools/ebook-tools/" + version "/ebook-tools-" version ".tar.gz")) + (sha256 + (base32 + "1bi7wsz3p5slb43kj7lgb3r6lb91lvb6ldi556k4y50ix6b5khyb")))) + (arguments + `(#:tests? #f)) ; No 'test' target + (build-system cmake-build-system) + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("libzip" ,libzip) + ("libxml2" ,libxml2))) + (home-page "http://ebook-tools.sourceforge.net") + (synopsis "Tools and library for dealing with various ebook file formats") + (description "This package provides command-line tools and a library for +accessing and converting various ebook file formats.") + (license license:expat))) + (define-public liblinebreak (package (name "liblinebreak") @@ -382,10 +471,109 @@ following formats: @end enumerate") (license license:gpl2+))) +(define-public cozy + (package + (name "cozy") + (version "0.7.8") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/geigi/cozy") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0z2wj9g32aa5g9pw81q49iv1smb6yvlv9zs0vrzbx6mw8cj3c5d2")))) + (build-system meson-build-system) + (arguments + `(#:glib-or-gtk? #t + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-desktop-file + (lambda _ + (substitute* "data/com.github.geigi.cozy.desktop" + (("Exec=com.github.geigi.cozy") "Exec=cozy")) + #t)) + (add-after 'install 'patch-executable-name + (lambda* (#:key outputs #:allow-other-keys) + (with-directory-excursion + (string-append (assoc-ref outputs "out") "/bin") + (rename-file "com.github.geigi.cozy" "cozy")) + #t)) + (add-after 'wrap 'wrap-libs + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (pylib (string-append + out "/lib/python" + ,(version-major+minor + (package-version python)) + "/site-packages")) + (gi-typelib-path (getenv "GI_TYPELIB_PATH")) + (gst-plugin-path (getenv "GST_PLUGIN_SYSTEM_PATH")) + (libmagic-path (string-append + (assoc-ref %build-inputs "file") + "/lib")) + (python-path (getenv "PYTHONPATH"))) + (wrap-program (string-append out "/bin/cozy") + `("LD_LIBRARY_PATH" ":" prefix (,libmagic-path)) + `("GI_TYPELIB_PATH" ":" prefix (,gi-typelib-path)) + `("GST_PLUGIN_SYSTEM_PATH" ":" prefix (,gst-plugin-path)) + `("PYTHONPATH" ":" prefix (,python-path ,pylib)))) + #t))))) + (native-inputs + `(("desktop-file-utils" ,desktop-file-utils) + ("gettext" ,gettext-minimal) + ("glib:bin" ,glib "bin") + ("gobject-introspection" ,gobject-introspection) + ("gtk+:bin" ,gtk+ "bin") + ("pkg-config" ,pkg-config) + ("python" ,python-wrapper))) + (inputs + `(("file" ,file) + ("gsettings-desktop-schemas" ,gsettings-desktop-schemas) + ("gst-libav" ,gst-libav) + ("gst-plugins-bad" ,gst-plugins-bad) + ("gst-plugins-good" ,gst-plugins-good) + ("gst-plugins-ugly" ,gst-plugins-ugly) + ("gtk+" ,gtk+) + ("libhandy" ,libhandy) + ("python-distro" ,python-distro) + ("python-gst" ,python-gst) + ("python-mutagen" ,python-mutagen) + ("python-packaging" ,python-packaging) + ("python-peewee" ,python-peewee) + ("python-pycairo" ,python-pycairo) + ("python-pygobject" ,python-pygobject) + ("python-pytz" ,python-pytz) + ("python-requests" ,python-requests))) + (home-page "https://cozy.geigi.de/") + (synopsis "Modern audiobook player using GTK+") + (description + "Cozy is a modern audiobook player written in GTK+. + +Some of the current features: + +@itemize +@item Import your audiobooks into Cozy to browse them comfortably +@item Sort your audio books by author, reader & name +@item Remembers your playback position +@item Sleep timer +@item Playback speed control +@item Search your library +@item Offline mode +@item Add multiple storage locations +@item Drag & Drop to import new audio books +@item Support for DRM free mp3, m4a (aac, ALAC, …), flac, ogg, opus, wav files +@item Mpris integration (Media keys & playback info for desktop environment) +@end itemize") + ;; TODO: Unbundle python-inject. + (license (list license:gpl3+ ;cozy + license:asl2.0)))) ;python-inject (bundled dependency) + (define-public xchm (package (name "xchm") - (version "1.31") + (version "1.32") (source (origin (method url-fetch) (uri (string-append "https://github.com/rzvncj/xCHM" @@ -393,7 +581,7 @@ following formats: version "/xchm-" version ".tar.gz")) (sha256 (base32 - "0aw6bysqiwbw75n3ad229ihlmh7chqs1wlxm0398z3lfp2y6n7qf")))) + "0b12ym7cn65wy268kbksyhakicwb053c8xfn76q2dawrvbras9dj")))) (build-system gnu-build-system) (inputs `(("wxwidgets" ,wxwidgets)