Instytut Misesa publikuje sporą część tekstów wraz z wersjami na czytniki e-książek, ale nie oznacza tych wersyj w odpowiedni sposób, a do tego pakuje je w pliki RAR. Mimo to można zautomatyzować ich pobieranie i dodawanie do własnej biblioteki. Poniżej znajdują się:

  • Skrypt Fisha pobierający wybrany wpis ze strony Instytutu Misesa i dodający go do biblioteki Calibre.
  • Korzystający z powyższego kawałek kodu w Emacs Lispie, dzięki któremu wpisy Instytutu Misesa pobierane przez elfeed będą (o ile posiadają wersje czytnikowe) automatycznie oznaczane jako przeczytane i dodawane do biblioteki Calibre.

Skrypt do dodawania wpisów do biblioteki

Format e-książek można ustawić za pomocą zmiennej środowiskowej MISES_EBOOK_FORMAT (MOBI lub EPUB, domyślnie MOBI). Skrypt należy zapisać pod nazwą mises_calibre_fetch i umieścić z prawami do wykonywania gdzieś w $PATH. Do działania wymagane są curl oraz unar.

#!/usr/bin/env fish

if not count $MISES_EBOOK_FORMAT
    set MISES_EBOOK_FORMAT MOBI
end

set html_dest_path /tmp/(head -n 10 /dev/urandom | sha256sum | sed 's/ .*//')
set rar_dest_path /tmp/(head -n 10 /dev/urandom | sha256sum | sed 's/ .*//')
set unrar_dir /tmp/(head -n 10 /dev/urandom | sha256sum | sed 's/ .*//')

if curl -o $html_dest_path $argv[1]
    if grep $MISES_EBOOK_FORMAT $html_dest_path
        set rar_url (grep $MISES_EBOOK_FORMAT $html_dest_path | sed "s/.*href=\"\([^\"]*\)\"[^>]*>$MISES_EBOOK_FORMAT<.*/\1/")
        curl -o $rar_dest_path $rar_url
        unar -o $unrar_dir $rar_dest_path
        find $unrar_dir -type f -print0 | xargs -0 calibre --detach
    else
        echo "$MISES_EBOOK_FORMAT version not found on $argv[1]."
        exit 1
    end
else
    echo "Could not fetch HTML from $argv[1]."
    exit 1
end

Dodawanie do biblioteki wpisów pobranych w elfeed

Poniższy kawałek kodu należy umieścić gdzieś w plikach inicjalizacyjnych Emacsa, przy czym odpowiedni plik musi mieć włączone leksykalne wiązanie zmiennych:

;; -*- lexical-binding: t -*-
(defun elfeed-entry-fetch-mises-ebook (entry)
  (if (string-match "://mises.pl/" (elfeed-feed-url (elfeed-entry-feed entry)))
      (let* ((url (elfeed-entry-link entry))
             (fetch-proc (start-process "Calibre fetch" "*calibre-fetch*" "mises_calibre_fetch" url)))
        (set-process-sentinel
         fetch-proc
         (lambda (proc event)
           (unless (process-live-p proc)
             (if (eq (process-exit-status proc) 0)
                 (progn
                   (elfeed-untag entry 'unread)
                   (elfeed-search-update-entry entry)))))))))

(add-hook 'elfeed-new-entry-hook 'elfeed-entry-fetch-mises-ebook)

Jeśli nie chcesz automatycznie dodawać do biblioteki każdego wpisu, tylko każdorazowo o tym decydować, zastąp ostatnią linijkę przez:

(defun elfeed-search-fetch-mises-ebooks ()
  (interactive)
  (progn
    (mapc #'elfeed-entry-fetch-mises-ebook (elfeed-search-selected))
    (unless (use-region-p) (forward-line))))

(define-key elfeed-search-mode-map "m" #'elfeed-search-fetch-mises-ebooks)

Naciśnięcie m na liście wpisów będzie wtedy uruchamiać skrypt pobierania dla podświetlonych wpisów Instytutu Misesa.