2013年08月22日

Calibre を使って全文変換した RSS フィード を Kindle へ自動配信する方法

新聞よりも専門性・多様性が高い Web 上の良質な記事を自分の好みに組み合わせ Kindle へ自動配信して読むのが僕の楽しみの一つ。 これには Kindlefeeder というサービスを使っていたんですが、最近は記事の内容が省略されて配信されるようになってしまったんです。 どうも、負荷に耐えられなくなったようで今後の改善も期待出来ないみたい・・・。
もう、自作するのが確実かもしれませんね。 今日は Calibre を使って全文 RSS フィードを Kindle へ自動配信する方法をご紹介します。

send news papaer to kindle


Kindle Paperwhite へ RSS フィードを全文変換・自動配信する仕組み


仕組みはこう。 まず、気の利いた Web サイトであれば必ず用意されている RSS フィードを全文変換サービスと組み合わせて記事の全文を手に入れます。
これを自分の管理するサーバー上で Calibre を使って Kindle フォーマットの電子書籍に変換した後、Amazon の提供するメールを使った電子書籍配信( Send to Kindle )サービス経由で Kindle へ届けます。

Calibre を使ったKindle ドキュメント自動配信サーバーの構成


僕はさくらの VPS を使って Calibre 変換・メール配信しますが、必ずしも VPS を使う必要は無く、自宅で常時稼働するサーバー PC を使ってもOK。


自動配信サーバーへの Calibre インストールと mobi ファイル送信用メールアカウントの作成


僕が今回利用する OS は CentOS 6 。以下の手順で Calibre をインストールします。

まずは依存ライブラリを以下の手順でインストール(省略しますが Python も必要)

$ sudo yum install ImageMagick
$ sudo yum install libXdmcp
$ sudo python -c "import sys; py3 = sys.version_info[0] > 2; u = __import__('urllib.request' if py3 else 'urllib', fromlist=1); exec(u.urlopen('http://status.calibre-ebook.com/linux_installer').read()); main()"


コンソールで作業している場合、デスクトップ統合処理でエラーが出ることがありますが気にしないでOK。

____________________ WARNING ____________________
Setting up desktop integration failed with error:
__________________________________________________
Traceback (most recent call last):
File "site-packages/calibre/linux.py", line 712, in setup_desktop_integration
File "subprocess.py", line 542, in check_call
CalledProcessError: Command 'xdg-mime install ./calibre-mimetypes.xml' 
returned non-zero exit status 3


より詳しい方法、依存関係はこちらをどうぞ。

calibre - Download for linux


続いて、ドキュメントの送信に利用する Gmail アドレスも用意します。

create google account


作成したメールアドレスは Kindle パーソナルドキュメント設定を開き、

kindle 承認済みEメールアドレスの一覧


承認済みのメール・アドレスに追加しておきましょう。

kindle Eメールアドレスの追加


これで準備はおしまい。


RSS フィードの全文変換と Calibre を使った Kindle フォーマットの電子書籍作成・配信


まずは RSS フィードを使った電子書籍の作り方とその配信方法を学びましょう。 

Calibre には幾つかの CLI コマンドが含まれていますが、書籍の作成には ebook-convert コマンドを利用します。

次の例では epub ファイルを Kindle 標準の mobi ファイルに変換しています。

$ ebook-convert from.epub to.mobi


この ebook-convert には recipie と呼ばれるリソース定義ファイルを変換対象として指定することも出来ます。

class MyDailyFeedRecipe(BasicNewsRecipe):
  title                 = u'RSS Feeds'
  oldest_article        = 1 # oldest days
  max_articles_per_feed = 50
  language              = 'ja'
  timefmt               = ' [%Y-%m-%d %H:%M]'
  feeds                 = [
                            (u'Favorites Feed1', u'http://feed1.com/rss')
                           ,(u'Favorites Feed2', u'http://feed2.com/rss')
                           ,(u'Favorites Feed3', u'http://feed3.com/rss')
                          ]


このサンプル・レシピでは Favorites Feed1, Favorites Feed2, Favorites Feed3 という名前をつけた3つの RSS フィード URL を対象に、それぞれ過去1日( oldest_article )の間に作成され、最大でも1 RSS あたり 50 件( max_articles_per_feed )の記事を使って、RSS Feeds というタイトルの電子書籍を作成するという意味・定義が含まれています。

この他には Web ページのスタイルシートを利用しない事を明示的に宣言する no_stylesheets 
 
  no_stylesheets        = True


Calibre はコンテンツ(本文)の量に応じて、少なければ Web サイトから本文のダウンロードを試みますが、全文変換した RSS フィードであること( RSS フィードのみで電子コンテンツを作成すること)を明示的に宣言する use_embedded_content パラメーターがあります。

  use_embedded_content  = True


この2つをレシピに追加・有効化するとデザイン崩れ、電子ファイル作成速度を改善することが出来ます。

さて、登録する RSS フィードの URL が必要ですね。 例えば BLOGOS (新着)の RSS フィードは次の URL になります。

http://blogos.com/feed/article_recent/


通常 RSS フィードは記事の更新と内容の一部を知る為に利用しますが、この RSS フィードを fullrss.net を使って全文 RSS に変換してみます。 

まずは RSS フィードの URL を入力して convert ボタンをクリック。

まるごとRSS


すると全文に変換された RSS フィードの URL と変換データが表示されたはずです。

まるごとRSS変換完了


この URL をコピーして先ほどの recipe ファイルに反映しましょう。

class MyDailyFeedRecipe(BasicNewsRecipe):
  title                 = u'RSS Feeds'
  oldest_article        = 1 # oldest days
  max_articles_per_feed = 50
  language              = 'ja'
  timefmt               = ' [%Y-%m-%d %H:%M]'
  no_stylesheets        = True
  use_embedded_content  = True
  feeds                 = [
                            (u'BLOGOS', u'http://fullrss.net/a/http/blogos.com/feed/article_recent/')
                          ]

※日本語もOK。但し、ファイルの文字コードは UTF-8 にすること。

今回は一つだけ登録するのでこれでおしまい。

さあ、この recipe ファイルを使って Kindle Paperwhite 向け電子書籍を作ってみます。

$ ebook-convert /path/to/my.recipe /path/to/converted.mobi --output-profile=kindle_pw

※ --output-profile ではモデル名に kindle_pw を指定していますが、Calibre のバージョンが古い場合サポートしていない場合があります。その場合には kindle を指定しましょう。

少し時間は掛かりますが指定した場所に converted.mobi というファイルが作られたはず。

このファイルを calibre-smtp コマンドと用意した Gmail アドレスを使って Kindle のメール・アドレスへ送信します。

$ calibre-smtp -a /path/to/converted.mobi --relay smtp.gmail.com --port 587 \
-u gmail-userid -p gmail-password -e TLS your@gmail.com your@kindle.com ''

your@gmail.com: 貴方の Gmail アドレス
-u: gmailユーザID
-p: gmailパスワード
your@kindle.com: Kindle 端末の管理で確認出来る Kindle メール・アドレス


しばらく待つと手元の Kindle に自動配信されて・・・。

send to kindle で受信したパーソナルドキュメント


Kindle フォーマットで全文変換された Web ページが読めました!

kindle で RSS フィードを読む


レシピ・ファイルの詳しい説明、その他オプションはこちらをどうぞ。


Calibre による電子書籍の作成と Kindle へのドキュメント配信を自動化する


もう基本的な仕組みは分かりましたよね。 後は自動配信するシェル・スクリプトを用意するだけ。

例えばこう。

#!/bin/sh

SEND_HOME=$(cd $(dirname $0) && pwd)

# mobi file name. ex. RSSFeeds_201308220730
MOBI="RSSFeeds_`date +'%Y%m%d%H%M'`.mobi"

# mail configuration
KINDLE_ADDR=your@kindle.com
GMAL_ADDR=gmail-userid@gmail.com
GMAIL_USER=gmail-userid
GMAIL_PASSWD=gmail-password

# kindle, kindle_dx, kindle_fire, kindle_pw
OUTPUT_PROFILE=kindle_pw

if [ -f /etc/profile ]; then
    . /etc/profile
fi

if [ ! -f $SEND_HOME/$1 ];
then
  log "ERROR: recipe($1) not found."
  exit 1
fi


CONV_OPTS="--output-profile=$OUTPUT_PROFILE"
EBOOKCONVERT="ebook-convert $SEND_HOME/$1 $SEND_HOME/$MOBI $CONV_OPTS"

echo "starting ebook-convert ..."
$EBOOKCONVERT

if [ $? -eq 0 -a -f $SEND_HOME/$MOBI ];
then
  echo "starting ebook-smtp ..."
  calibre-smtp -a $SEND_HOME/$MOBI \
  --relay smtp.gmail.com --port 587 -e TLS \
  -u $GMAIL_USER -p $GMAIL_PASSWD $GMAL_ADDR $KINDLE_ADDR \
  -s 'RSS Feeds to Kindle' ''
  if [ $? -eq 0 ];
  then
    echo "SUCCESS: send to kindle $MOBI"
    rm -f $SEND_HOME/$MOBI
  else
    echo "ERROR: calibre-smtp failed."
  fi
else
  echo "ERROR: ebook-convert failed."
fi


メール送信に関わる設定を変更、シェルに実行権限を付与したらレシピ・ファイルと同じ場所に置いて、

$ chmod 775 sendtokindle.sh
$ ls
my.recipe  sendtokindle.sh


crontab を編集して自動配信したい時間に呼び出します。 次の例では毎朝 7:00 にシェル・スクリプトを呼び出し、自動配信しています。

# cron for kindle
0 7 * * * /path/to/sendtokindle.sh my.recipe > /dev/null 2>&1

これで自分だけの定期配信システムが出来ましたね!

それでは、より良い Kindle ライフを。


Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Kevin Hemenway Tara Calishain
オライリー・ジャパン
売り上げランキング: 133,702


Posted by netbuffalo at 19:00│Comments(0)TrackBack(0) モバイルデバイス | kindle


この記事へのトラックバックURL

コメントする

名前
 
  絵文字