番組情報の検索は、単純にLIKE演算子を使用して、字幕情報の検索ではブール全文検索を使用しています。
次のようにして字幕検索結果のリスト表示をしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 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 "<ul data-role=" listview " " ;= "" print = "" "=" " data-filter=" true " if=" " ($#order=" ">= 29); print ">\n" ; printf "<h1>%d件の一致、キーワード: %s</h1>< 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 "><a href=" ${player}? $link ">" ; print "<h2>$dv_name</h2>" ; print "<p>$dc_name $dv_start_time ($dv_duration)</p>\n" ; } print " <p>$dp_offset\t$dp_text</p>\n" ; } print "</a>\n" ; } print "</ul>\n" ; } |
dv_duration
)が立っている番組は、アイコンを☆マークに変えています。(以前に書いたかもしれませんが、jQuery Mobileを利用しています。)また、お気に入りフラグが立っている番組は、ディスクの空き容量確保のためのデータ自動削除処理で、削除対象から除外されるようにしています。
<pre>
タグ内で、<br />
がうまく記述できないので、表記が少しおかしくなっています。
2012/5/1追記)
Internet Explorerで表示が崩れていたので修正しました。
<pre>~</pre>内でも、HTMLタグを解析するような動作をしているようなので、一部<を<としました。