2012年4月30日月曜日

字幕検索 その3

検索機能は、検索対象を番組情報と字幕情報の2つから選んで検索できるようにして利用しています。
番組情報の検索は、単純に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タグを解析するような動作をしているようなので、一部<を&lt;としました。

0 件のコメント:

コメントを投稿