番組情報の検索は、単純に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 "dv_duration)が立っている番組は、アイコンを☆マークに変えています。(以前に書いたかもしれませんが、jQuery Mobileを利用しています。)また、お気に入りフラグが立っている番組は、ディスクの空き容量確保のためのデータ自動削除処理で、削除対象から除外されるようにしています。
<pre>タグ内で、<br />がうまく記述できないので、表記が少しおかしくなっています。
2012/5/1追記)
Internet Explorerで表示が崩れていたので修正しました。
<pre>~</pre>内でも、HTMLタグを解析するような動作をしているようなので、一部<を<としました。