Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2011-06-17

pixiv の小説作品を Kindle で読む

| 09:53 | pixiv の小説作品を Kindle で読む - NaN days を含むブックマーク はてなブックマーク - pixiv の小説作品を Kindle で読む - NaN days

最近 Kindle を買ったので pixiv 小説を Kindle で読もうと思いました。

最初は pdf を作ったりテキストファイルにしたりして モテメン@free.kindle.com にメールを送ることでなんとかしようとしていたけれど、メタデータがうまく埋まらなかったりテキストファイルの見え方が気に入らなかったり (段落の字下げが大きい、改行ひとつだと文が繋がる) で、結局 HTML ファイルを作り kindlegen に通して .mobi を生成するのがよさそうということになった。

pixiv 小説から本文を抽出するだけのスクリプトを書いていたけど、どうせなら昔作った HTML::ExtractContent で野良 epub - NaN days - subtech も使えるかなということで、任意のページにとりあえず使える妙に汎用的な感じのスクリプトになった。pixiv 小説の場合はきちんと対応していて、改ページや挿絵の埋め込みがちゃんと表示される。それ以外のサイトではいまのとこ画像に対応してません。 → 対応しました。

f:id:motemen:20110617193128j:image:w400


コードはこちら: https://github.com/motemen/Kindlenap

kindlenap.pl に URL を与えると、out ディレクトリに適当な名前の HTML ファイルが生成される。

% kindlenap.pl 'http://www.pixiv.net/novel/show.php?id=116084'
out/第一話・ぼくが失ったもの.pn116084.html

kindlegen に HTML ファイルを渡すと <title> の中身が書籍名、<meta name="author"> の内容が著者名として埋め込まれるので、そのように HTML ファイルを生成する。著者は ; で区切れば複数指定できるみたいだけど、著者名に数値文字参照 (&#x3042; とか) を使うと誤爆してしまう。(&quot; とかはいける)

でまあ折角スクリプトを書いたので、URL を指定して自分の Kindle に送れるサービスを作った。認証などしていないので誰でも使えます。(嫌になったらやめます)

no title

コードはだいたいこんな感じ。Cute 使ってます!!1 (使うまでもなかった!!1)

package KindlenapGateway::Default;
use strict;
use warnings;
use Cute;
use Encode;
use Digest::SHA1 qw(sha1_hex);
use LWPx::ParanoidAgent;
use Kindlenap::Document;

get '/' => sub {
    my ($self, $c) = @_;
};

post '/' => sub {
    my ($self, $c) = @_;
    my $class = ref $self;

    if (my $url = $c->req->param('url')) {
        my $work_dir = $class->root->subdir('work');

        my $document = Kindlenap::Document->from_url($url);
        $document->ua(LWPx::ParanoidAgent->new);
        $document->outdir($work_dir);
        $document->scrape;
        $document->author($c->req->env->{HTTP_X_FORWARDED_FOR}) unless $document->author;

        my $html_file = $document->write;
        my $mobi_file = sha1_hex($html_file) . '.' . time() . '.mobi';

        system 'kindlegen', $html_file, '-o', $mobi_file;

        $mobi_file = $document->outdir->file($mobi_file);

        system "mutt -a $mobi_file -- motemen\@free.kindle.com < /dev/null";

        $c->stash(mobi_generated => decode_utf8 $document->title);
    }
};

1;

mutt で日本語ファイルを添付して送ると Kindle のサービスが添付ファイルを見落すので、わざわざアルファベットにして送ってる。

参考リンク

BrandiceBrandice2011/07/02 18:41Fell out of bed feilneg down. This has brightened my day!

foeemhlxkefoeemhlxke2011/07/03 22:25fRbeBj , [url=http://ugyzhsewdgpd.com/]ugyzhsewdgpd[/url], [link=http://txewqqwwdoxw.com/]txewqqwwdoxw[/link], http://yiuqdhrahfzi.com/