2008/01/31


いいなぁiPod touch欲しいなぁ。

Plaggerでニコニコ動画を一括ダウンロード&変換 Podcast を生成して iPod touch で見る - 2007年11月最新版
うちでは臨時予算案は可決されそうにありません。宝くじが当たるま携帯で我慢したいと思います。

今日は、ゆーすけべさんの所に置いてあるYAMLをちょこっと弄って、携帯向け変換をやろうかと思います。ちょっとだけオリジナリティを出そうとニコニコではなく、YouTubeから...
まず、こんなYAMLを用意します。

youtube_hatena_tagged.yaml
global:
  assets_path: /home/user/plagger/assets/
  timezone: Asia/Tokyo
  log:
    evel: info

plugins:

  - module: Subscription::Config
    config:
      feed:
          - url: http://b.hatena.ne.jp/t/youtube?mode=rss&sort=hot&threshold=3
          
  - module: Filter::FindEnclosures
  - module: Filter::FetchEnclosure
    config:
      dir: /home/user/plagger/out
  - module: Filter::FLVInfo
  
  - module: Filter::FFmpeg
    config:
      command: /usr/bin/ffmpeg
      ext: 3gp
      dir: /home/user/plagger/out
      encoding: utf-8
      options:
        video_codec:         mpeg4
        audio_codec:         libamr_nb
        audio_sampling_rate: 8000
        audio_bit_rate:      12.2k
        frame_size:          176x144
      extra_options: -ac 1 -f 3gp

  - module: Publish::Feed
    config:
      format: RSS
      dir: /home/user/plagger/out
      filename: youtube_hatena_tagged.xml
はてなで「youtube」タグが付いているフィードを取ってきて、Enclosureをフェッチ&解析。最後にFFmpegで変換というフェーズになります。Feed作成は意味なさそうですが、この後役に立ちます。
私の携帯SB810T向けには、映像コーデックにmpeg4、音声コーデックにamr-nb(libamr_nb)を指定します。メーカーの仕様によると、AACでも行けそうな事が書いてありますが、どうやら動画でない音声ファイルの場合のみAACが再生出来るようです。
また、サンプルレート8000はamr-nbの標準値で、オーディオチャネル(ac)は1にしないといけない様です。 もちろん
  • lib/Plagger/Plugin/Filter/FFmpeg.pm
  • lib/Plagger/Plugin/Filter/FLVInfo.pm
はCodeReposから取得して下さい。
殆んどyusukebeさん(yousukebeさんではありません。ここ大事)のと同じです。大概はffmpegのオプションでなんとか出来るかと思います。ただ現状Plaggerのtrunkに入ってるFind-Enclosuresのyoutube.plでは、jp.youtube.comドメインのリソースが対象外になっていますので、以下のパッチを当てます。
Index: assets/plugins/Filter-FindEnclosures/youtube.pl
===================================================================
--- assets/plugins/Filter-FindEnclosures/youtube.pl (revision 1988)
+++ assets/plugins/Filter-FindEnclosures/youtube.pl (working copy)
@@ -3,7 +3,7 @@
 
 sub handle {
     my ($self, $url) = @_;
-    $url =~ qr!http://(?:www.)?youtube.com/(?:watch(?:\.php)?)?\?v=.+!;
+    $url =~ qr!http://(?:www.|jp.)?youtube.com/(?:watch(?:\.php)?)?\?v=.+!;
 }
 
 sub find {
※パッチが当たった物はCodeReposに入れてあります。チンして食べてください。ただGData APIでないのでカッコよくはありませんが。
あとは # plagger -c youtube_hatena_tagged.yaml を実行すると、上のYAMLで指定している「out」フォルダにゴッチョリと3gpファイルが出来上がっている筈です。
携帯の場合はPodcast出来ませんし、動画のサイズが大きくなるとメールで送ったりHTTPでダウンロードする事も出来ません。結局はメモリ転送になりますが、Feed.pmにちょっとだけ手を加えて...
Index: lib/Plagger/Plugin/Publish/Feed.pm
===================================================================
--- lib/Plagger/Plugin/Publish/Feed.pm  (revision 1988)
+++ lib/Plagger/Plugin/Publish/Feed.pm  (working copy)
@@ -122,6 +122,15 @@
     open my $output, ">:utf8", $filepath or $context->error("$filepath: $!");
     print $output $xml;
     close $output;
+
+    if ($self->conf->{command_after}) {
+        my $command = $self->conf->{command_after};
+        my $dir = $self->conf->{dir};
+        $filepath =~ s!\\!/!g;
+        $command =~ s!\$\(filename\)!$filepath!g;
+        $command =~ s!\$\(dir\)!$dir!g;
+        system($command);
+    }
 }
 
 sub make_author {
こんなパッチを当てると、フィード出力時に「command_after」が実行されますので   - module: Publish::Feed
    config:
      format: RSS
      dir: /home/user/plagger/out
      filename: youtube_hatena_tagged.xml
      command_after: find $(dir) -name "*.3gp" -exec cp \{\} /media/usbdisk/private/myfolder/My Items/Video
こんなYAMLにしておけば、出来上がった3GPがUSB越しに携帯のmicroSDカードにズコーーーーンと転送されるって仕組です。
microSD-card
ズゴーーーーン
まぁ、Podcastと違って出来上がるまで、良い子ちゃんで待ってなきゃいけないですが...

追記
plagger流儀で言えば、Notify::Commandを使うべきですね。
Posted at by




私は、Plaggerを使用して、はてなブックマークを別のソーシャルブックマークに同期していますが、その際ブックマークタグがどのように扱われるかについて以下説明します。
はてなブックマークのフィードは
RSS形式
http://b.hatena.ne.jp/[hatena account]/rss もしくは
AtomFeed形式
http://b.hatena.ne.jp/[hatena account]/atomfeed というURLで提供され、データには以下の様な物が含まれています。 ※以下の例はRSSの場合
<item rdf:about="http://coderepos.org/share/changeset/552">
    <title>Changeset 552 - CodeRepos::Share - Trac</title>
    <link>http://coderepos.org/share/changeset/552</link>
    <description>笑わせて頂きました</description>
    <content:encoded>
      &lt;blockquote cite="http://coderepos.org/share/changeset/552" title="Changeset 552 - CodeRepos::Share - Trac"&gt;
        
        &lt;cite&gt;&lt;a href="http://coderepos.org/share/changeset/552"&gt;Changeset 552 - CodeRepos::Share - Trac&lt;/a&gt; &lt;a href="http://b.hatena.ne.jp/entry/http://coderepos.org/share/changeset/552"&gt;&lt;img src="http://b.hatena.ne.jp/images/entry.gif" title="このエントリーを含むブックマーク" alt="このエントリーを含むブックマーク" border="0"&gt;&lt;/a&gt;&lt;/cite&gt;
      &lt;/blockquote&gt;
      &lt;p&gt;笑わせて頂きました&lt;/p&gt;
    </content:encoded>
    <dc:date>2007-10-19T21:19:44+09:00</dc:date>
    <dc:creator>mattn</dc:creator>
    <dc:subject>coderepos</dc:subject>
    <dc:subject>erogeek</dc:subject>
    <taxo:topics>
      <rdf:Bag>
      <rdf:li resource="http://b.hatena.ne.jp/t/coderepos" />
      <rdf:li resource="http://b.hatena.ne.jp/t/erogeek" />
      </rdf:Bag>
    </taxo:topics>
</item>
ブックマークした元リンクのtitle/linkに加え、ブックマークコメントが格納されたdescription、およびblockquote/citeタグを使用して引用元形式に表現されたcontent:encoded、さらにはブックマークタグを表現するdc:subjectが記述されています。
Plaggerの場合、descriptionよりもcontant:encodedを優先しており、コメントとしては冗長な引用部分が転送されてしまいます。これについては先日書いた「Plaggerで、はてなブックマークをdel.icio.usにミラーする時に、descriptionフィールドを衛生的に修正するフィルタプラグイン書いた」にある様にdescriptionをcontent:encodedに上書きしてやる事で対応出来ます。
先日この記事を書いた際、otsuneさんから「この目的であれば、 b.hatena.ne.jp/[hatena user]/atomを Filter::AtomLinkRelated すればOk」というブックマークコメント頂きました。
昨日、頂いたアドバイスの通りAtomFeedで試して見た所、複数設定した筈のブックマークタグが一つだけしか適応されないという現象が発生しました。
IRC(#plagger-ja)でotsuneさん、国内滞在説のあるmiyagawaさんに相談しながら原因を当たった所、昨日の夜にXML::Feedでのdc:subjectの扱い方に問題があるのではないかという事が分かりました。

ここで見て頂きたいのはdc:subjectというノード。dc:subjectは私の記憶ではAtom0.3では厳密に個数は規定されておらず、複数記述する事も出来てしまっています。結果、規定されていないことで色んな実装が表れてしまっています。
はてなの様に複数のdc:subjectを使って表現する物もあれば、del.icio.usの様に一つのdc:subject内に空白(スペース)等でセパレートしてタグを記述している物もあります。
以下、私が簡単に調べた各サービスのフィード出力状況と、そのフィード内のdc:subjectの扱われ方です。
サービス フィード形式 dc:subjectの扱い
はてなブックマーク RSS1.0
Atom0.3
タグ毎にdc:subject
del.icio.us RSS1.0 単一のdc:subjectを空白でセパレート
Livedoor Clip RSS2.0 タグ毎にdc:subject
Buzzurl RSS1.0 タグ毎にdc:subject
Goo Bookmark RSS1.0 出力されない
FC2 Bookmark RSS2.0
※1
出力されない
Pookmark Airlines RSS1.0 タグ毎にdc:subject
※2
Nifty Clip RSS1.0 タグ毎にdc:subject
※3
Blue Dot RSS2.0 単一のdc:subjectをカンマでセパレート
Digg RSS2.0 出力されない
※1 このフィードはちょっと頂けない
※2 入力UIは単一行だがダブルクオート記述出来る
※3 入力UIはjavascriptで追加形式(POSTは1個もしくは配列)
各サービス毎にdc:subjectの扱われ方はまちまちです。
これらの仕様をXML::Feedがどのように扱っているかが原因ではないかと思いました。
現状、XML-Feed-0.12のソースでは

lib/XML/Feed/Atom.pm(146): sub category {
    my $entry = shift;
    my $ns = XML::Atom::Namespace->new(dc => 'http://purl.org/dc/elements/1.1/');
    if (@_) {
        $entry->{entry}->add_category({ term => $_[0] });
    } else {
        my $category = $entry->{entry}->category;
        $category ? ($category->label || $category->term) : $entry->{entry}->get($ns, 'subject');
    }
}
となっていますが、上記"get"ではXML::Atomの"get"が呼ばれ、ARRAYの先頭しか返りません。
XML::Atomには"get"ではなく"getlist"も用意されており、こちらの方はARRAYを返してくれる仕様になっています。
(XML::Feed::RSSの方は元々categoryでARRAYを返す場合もある為、baseであるEntryは既にARRAYを返されても問題ない準備が出来ています)

dc:subjectが単一とは規定されていない事、XML::Atomで"getlist"が用意されている事を、XML::FeedのAUTHORであるBenjamin Trott氏にメールし、パッチも付けて送付しました。
どんな返事が返って来るか分かりませんが、これが正しい修正だとすればXML::Feedのアップグレードで直って来るかもしれません。

しばらくは、はてなブックマークからの同期はrssフィードを使いdescriptionからcontent:encodeを上書きするようなトリックを使うか、AtomFeedを使ってしかも上記の様な修正を入れて対応するかになります。
もしかしたら、Plagger側にcontent:encoded->summaryではなく、description->summaryとなるようなオプション入れても良いかも知れませんね。
それかtsupoさんのbookeyを使うってのもアリですね。
Posted at by




終わり無き戦い...
/lang/perl/plagger/lib/Plagger/Plugin/Publish/Magnolia.pm - CodeRepos::Share - Trac
Ma.gnolia.com...意外とUIが好き。

これで、私が同期しているソーシャルブックマークは
  • Publish::Delicious
  • Publish::LivedoorClip
  • Publish::Buzzurl
  • Publish::LivedoorCilp
  • Publish::Buzzurl
  • Publish::GooBookmark
  • Publish::NiftyClip
  • Publish::Pookmark
  • Publish::YahooBookmark
  • Publish::BlueDot という名の Pubilsh::Delicious
  • Publish::Magnolia
となった。
収拾がつかなくなってきた。
さて、明日は何作ろう

追記
otsuneさんのの方がよい。
CodeRepsに上げてあるMagnolia.pmは、plaggerのsvn/trunkが変わったタイミングで消します。
Posted at by