SmallStyle


2008-03-07

_ Plagger::Plugin::Filter::FetchNicoVideo でニコニコ動画(SP1) 対応(2)

H.264動画対応に加えてニコニコムービーメーカで作成されたものにも対応させておく.

Index: FetchNicoVideo.pm
===================================================================
--- FetchNicoVideo.pm   (revision 7618)
+++ FetchNicoVideo.pm   (working copy)
@@ -73,8 +73,16 @@
     if ( $self->conf->{filename_encode} ) {
         Encode::from_to( $filename, "utf-8", $self->conf->{filename_encode} );
     }
-    my $path = File::Spec->catfile( $self->conf->{dir}, $filename . ".flv" );
 
+    $enclosure->url =~ m!^http://[^/]+(?:smilevideo|nicovideo)\.jp/smile\?(\w)=(?:[^.]+)\.\d+(?:low)?!;
+    my %video_type_of = (
+      v => 'flv',
+      m => 'mp4',
+      s => 'swf',
+    );
+    my $ext = exists( $video_type_of{$1} ) ? $video_type_of{$1} : "unknown";
+
+    my $path = File::Spec->catfile( $self->conf->{dir}, $filename . ".$ext" );
     unless ( -e $path ) {
        #access video page
        $ua->get("http://www.nicovideo.jp/watch/$video_id");
@@ -112,6 +120,7 @@
     if  ($res->header('Content-Length') ) {
         $enclosure->length( $res->header('Content-Length') );
     }
+    $enclosure->type( Plagger::Util::mime_type_of($path) );
     $entry->add_enclosure($enclosure);
 }

2008-03-06

_ Plagger::Plugin::Filter::FetchNicoVideo でニコニコ動画(SP1) H.264 形式対応

2008-03-07 追記:Plagger::Plugin::Filter::FetchNicoVideo でニコニコ動画(SP1)対応(2)でニコニコムービーメーカにも対応した形に変更しています.

ニコニコ動画が H.264 に対応したので,Plagger::Plugin::Filter::FetchNicoVideo で FLV と H.264 を判別するようにしてみました.H.264 の動画は拡張子が mp4 でダウンロードするようにしています.とりあえず diff だけ.

Index: FetchNicoVideo.pm
===================================================================
--- FetchNicoVideo.pm   (revision 7529)
+++ FetchNicoVideo.pm   (working copy)
@@ -73,8 +73,12 @@
     if ( $self->conf->{filename_encode} ) {
         Encode::from_to( $filename, "utf-8", $self->conf->{filename_encode} );
     }
-    my $path = File::Spec->catfile( $self->conf->{dir}, $filename . ".flv" );

+    $enclosure->url =~ m!^http://[^/]+(?:smilevideo|nicovideo)\.jp/smile\?(v|m)=(?:[^.]+)\.\d+(?:low)?!;
+    my $ext = $1 eq 'v' ? 'flv' : 'mp4';
+
+    my $path = File::Spec->catfile( $self->conf->{dir}, $filename . ".$ext" );
+
     unless ( -e $path ) {
        #access video page
        $ua->get("http://www.nicovideo.jp/watch/$video_id");
@@ -112,6 +116,7 @@
     if  ($res->header('Content-Length') ) {
         $enclosure->length( $res->header('Content-Length') );
     }
+    $enclosure->type( Plagger::Util::mime_type_of($path) );
     $entry->add_enclosure($enclosure);
 }

これまでだと,ダウンロードした FLV を MP4 に変換という部分が,H.264 動画の場合は必要ないこともあるかと思うので,enclosure の type を見るようにすると,振り分けることが可能です.config.yaml の一部はこんな感じ.

- module: Filter::FFmpeg
  rule:
    - expression: $args->{entry}->enclosure->type eq "video/x-flv"
つづき: 2008-03-07

2008-03-04

_ Yahoo!路線情報から運行情報をとってくるEFT

Plagger を使った運行情報の取得には livedoor 路線案内の運行情報を利用した,LDTrafficLDTrain があるけど,Yahoo!路線情報の運行情報からだと,EFT でひっぱってこれた.

# http://transit.yahoo.co.jp/railway/area?ac=<code>&an=<name>
author: hb@smallstyle
custom_feed_handle: http://transit\.yahoo\.co\.jp/railway
custom_feed_follow_link: /detail\?ac=\d+&line=\d+&cp=\d+
handle: http://transit\.yahoo\.co\.jp/railway/detail\?ac=\d+&line=\d+&cp=\d+
extract_xpath:
  title: //h2/b/text()
  body: //div[@id="info_display"]/text()
  date: //div[@id="info_time"]/text()
extract_after_hook: |
  my $regex = decode("utf-8","(平常通り|再開|遅れ|運転変更|見合わせ|運休)");
  my @status;
  while($data->{body} =~ /$regex/g){push(@status, $1);}
  $data->{title} = "[$status[$#status]] $data->{title} $data->{date}";

extract_after_hook でステータスをタイトルに付け加えています.

一部列車に運転変更が出ていましたが、12:00現在、ほぼ平常通り運転しています。

上のような"運転変更"と"平常通り"のキーワードが同時にでたときに,Yahoo!路線情報では最後のキーワードがそれらしい感じ.正規表現は最初にマッチしたキーワードで評価されるため,いったんステータスにマッチするキーワードをすべて取り出してから,最後のキーワードを取り出すというまわりくどいことをしてます.

これで各エリアごとの運行情報を取得することができたので,あとは Filter::Rule で自分が利用する路線だけを対象にしておくと必要なものだけになってすっきりする.で,config.yaml の一部はこんな感じに.

global:
  cache:
    expires: 5 sec

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://transit.yahoo.co.jp/railway/area?ac=6&an=%93%8C%8AC

  - module: Filter::EntryFullText
  
  - module: Filter::Rule
    rule:
      module: Deduped
      compare_body: 1

  - module: Filter::Rule
    rule:
      expression: $args->{entry}->title =~ /(名古屋本線|東海道本線)/

cache の expires を設定しておかないと,最新情報がとってこられないことがあるみたいなので,ひとまず 5 秒後には消してしまうようにしてみました.

EFT を CodeRepos に commit しました.


about me

いろいろと興味を持ったことを書いてます.ちょっとしたことは hb(@smallstyle) on Twitter で書いてます.

Archive

2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|12|