Hatena::Groupsubtech

NaN days

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

2011-09-15

AutoPagerize の SITEINFO を利用して Web ページを Kindle で読めるようにする

| 21:06 | AutoPagerize の SITEINFO を利用して Web ページを Kindle で読めるようにする - NaN days を含むブックマーク はてなブックマーク - AutoPagerize の SITEINFO を利用して Web ページを Kindle で読めるようにする - NaN days

以前書いた Kindlenap (https://github.com/motemen/Kindlenap) に、AutoPagerize の効くページなら自動で次のページを読み込んで一つの HTML ファイルにするオプション機能を追加しました。

例えばファミ通文庫の『平家さんって幽霊じゃね?』を読みたいときは、以下のようにします。

kindlenap.pl --autopagerize --title '平家さんって幽霊じゃね? 前編' --author '石川博品' http://www.enterbrain.co.jp/fb/pc/03novels/13th-horror_ishikawa/tan1/01.html

--autopagerize オプションをつけて、--title と --author は自動では分からないので手動で付与しています。スクリプトは一秒おきに次のページへ HTTP リクエストを行い、次のページがなくなるか Ctrl-C が入力されるまでページをめくり続けます。終了すると out/ ディレクトリに HTML ファイルが生成されているので、これを kindlegen に渡して .mobi を作れば完了です。

AutoPagerize の SITEINFO には、ページのコンテンツ本体を指す XPath が pageElement という項目に指定されていることがあるので、使える場合にはこれを利用しています。なければ今までどおり HTML::ExtractContent で本文を抽出します。

コンテンツが画像の場合もあわせてダウンロードしてくれるので、出来上がったものを問題なく読めます。今回はちょっと文字が小さくて読みづらかったですが……。

2011-10-06

miyagawa さんにパッチを取り込んでいただいておりました!ありがとうございます!という訳で cpan から HTML::AutoPagerize-0.02 を入れれば以下は不要になります。

ちなみに SITEINFO には microformats 対応のためあらゆるウェプページにマッチするルールが入っていて、これがよく誤爆するので、HTML::AutoPagerize に以下のパッチを当てる必要があります。

https://gist.github.com/1216969

どうぞご利用ください。

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/