Catalystで携帯画像の出しわけ。ただし拡張子のみ。

タイトルの通り。

携帯で画像の出しわけしたい時のプラグインを作ってみました。

基本はC::P::Static::Simpleを利用します。

パスの解決をする部分でちょっとした小細工をするわけです。

で考えたのがC::P::Static::Simple::Mobileというモジュールです。

package Catalyst::Plugin::Static::Simple::Mobile;

use strict;
use warnings;
use File::Spec;
use List::MoreUtils ();

our $VERSION = '0.01';

sub _locate_static_file {
    my ( $c , $path ) = @_;
    
    return $c->NEXT::_locate_static_file($path)
        if $path =~ /.*\.(?:\S{1,})$/xms;
    
    my $config = $c->config->{static};
    my $target_dirs = $config->{mobile_image_ext}->{dirs} || [];
    $target_dirs = [$target_dirs] unless ref $target_dirs eq 'ARRAY';
    
    if ( @$target_dirs ) {
        my %target_dirs;
        @target_dirs{@$target_dirs} = ();
        unless ( List::MoreUtils::any { exists $target_dirs{$_} } File::Spec->splitdir($path) ) {
            return $c->NEXT::_locate_static_file($path);
        }
    }
    
    my $ext_table = $config->{mobile_image_ext}->{ext} || {
        i => 'gif',
        e => 'gif',
        s => 'pnz',
        v => 'pnz',
    };
    
    # Catalyst::Plugin::MobileAgent
    $path .= sprintf ".%s", lc $ext_table->{$c->req->mobile_agent->carrier}||'';
    $c->_debug_msg($path) if $config->{debug};
    
    $c->NEXT::_locate_static_file($path);
}

1;

MyApp.pmには

 use Catalyst qw/
     Static::Simple::Mobile
     Static::Simple
 /;

上記のように書く。先にMobileの方が呼ばれて欲しいので継承の順番に気をつけよう。

でmyapp.ymlは

static:
  include_path:
    - __path_to(templates)__
  dirs:
    - css
    - images
    - img
  mobile_image_ext:
    dirs:
      - img
      - images
    ext:
      i: jpg
      e: gif
      v: pnz

こんな感じ。staticのところに定義します。mobile_image_extというのが今回追加した定義です。

実装の説明ですが、HTMLにて

 <img src="/img/top_logo">

のように拡張子が書かれていないパスを見つけたらmobile_image_extのextで定義されてる通りにキャリア毎に指定した拡張子をくっつけてくれます。

ちなみにキャリアの判別にはお馴染みのC::P::MobileAgentを利用しています。

コレ、今回は急ぎだったので拡張子だけの対応にしたんですが、もっと汎用的に作れば携帯端末毎の画像のサイズの出しわけとかも簡単にできそうですね。

っていうかもっと頑張れば携帯の着うた着メロとかの汎用的なダウンロードシステムを作れそう。

前の仕事の時にそーゆーの作ったんだけどかなり微妙だったんだよね。

でもCatalystプラグインとして作ればかなり綺麗でナイスな実装できそうだ。ちょっとやる気出てきた。

ただ実際作ってもNDA違反になりそうなんで公開できなさそうなのが残念・・・。

携帯業界のそーゆーオープンじゃないとこが微妙やんねー。まったく。