2012年4月30日月曜日

字幕検索 その3

検索機能は、検索対象を番組情報と字幕情報の2つから選んで検索できるようにして利用しています。
番組情報の検索は、単純にLIKE演算子を使用して、字幕情報の検索ではブール全文検索を使用しています。

次のようにして字幕検索結果のリスト表示をしています。
my $query = 'バイク -自転車';
search_caption($query);

sub search_caption()
{
        my $query = shift @_;
        my $sql = <<END;
select
        c.dc_name,
        c.dc_ch,
        e.dv_start_time,
        date_format(addtime(e.dv_start_time, e.dv_duration), '%H%i%s'),
        e.dv_duration,
        e.dv_name,
        e.dv_favorite,
        timediff(a.dp_start_time, e.dv_start_time),
        time_to_sec(timediff(a.dp_start_time, e.dv_start_time)),
        a.dp_text
from
        da_caption as a
        inner join
                (da_event as e
                        inner join
                                da_channel as c
                        on
                                c.dc_network_id = e.dv_original_network_id
                        and
                                c.dc_service_id = e.dv_service_id
                )
        on
                a.dv_id = e.dv_id
where
        match(a.dp_text) against(? in boolean mode)
order by e.dv_start_time desc
END

        my $dsn = 'DBI:mysql:database=oneseg24;host=localhost';
        my $dbh = DBI->connect($dsn, 'user', 'password', {RaiseError => 1, AutoCommit => 0, mysql_enable_utf8 => 1});

        my $sth = $dbh->prepare($sql);
        my $rv = $sth->execute("${query}");

        my %program = ();
        my @order = ();

        while (my $ref = $sth->fetch()) {
                my @tmp = @$ref;

                my $key = "$tmp[1]-$tmp[2]";
                if ($#{$program{$key}} < 0) {
                        push(@order, $key);
                }

                push(@{$program{$key}}, [@tmp]);
        }

        $dbh->disconnect();

        print "
    = 29); print ">\n"; printf "

    %d件の一致、キーワード: %s

    < br />\n", $#order+1, $query; foreach my $k (@order) { my $i = 0; foreach my $a (sort {$a->[8] <=> $b->[8]} @{$program{$k}}) { my ($dc_name, $dc_ch, $dv_start_time, $end_time, $dv_duration, $dv_name, $dv_favorite, $dp_offset, $dp_offset_sec, $dp_text) = @$a; my $t = Time::Piece->strptime($dv_start_time, "%F %T"); my $start_time = $t->strftime("%y%m%d-%H%M%S"); my $link = join("-", ($start_time, $end_time, $dc_ch)); if ($i++ == 0) { print "<li"; print " data-icon='star'" if ($dv_favorite); print ">"; print "

    $dv_name

    "; print "

    $dc_name $dv_start_time ($dv_duration)

    \n"; } print "

    $dp_offset\t$dp_text

    \n"; } print "
    \n"; } print "
\n"; }
特に変わった処理はしていませんが、お気に入りフラグ(dv_duration)が立っている番組は、アイコンを☆マークに変えています。(以前に書いたかもしれませんが、jQuery Mobileを利用しています。)
また、お気に入りフラグが立っている番組は、ディスクの空き容量確保のためのデータ自動削除処理で、削除対象から除外されるようにしています。

<pre>タグ内で、<br />がうまく記述できないので、表記が少しおかしくなっています。

2012/5/1追記)
Internet Explorerで表示が崩れていたので修正しました。
<pre>~</pre>内でも、HTMLタグを解析するような動作をしているようなので、一部<を&lt;としました。

0 件のコメント:

コメントを投稿