/[Frey]/trunk/lib/Frey/Web/FLVPlayer.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Frey/Web/FLVPlayer.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 883 - (hide annotations)
Tue Dec 23 21:00:14 2008 UTC (15 years, 4 months ago) by dpavlin
File size: 3868 byte(s)
added flv_subtitle callback from flash to javascript so we
can move over dump of titles (and jump to title positions)
1 dpavlin 844 package Frey::Web::FLVPlayer;
2 dpavlin 809 use Moose;
3    
4     =head1 SEE ALSO
5    
6 dpavlin 846 L<http://flv-player.net/>
7 dpavlin 809
8     =cut
9    
10     extends 'Frey';
11     with 'Frey::Web';
12     #with 'Frey::Storage';
13 dpavlin 823 with 'Frey::File::FLV';
14 dpavlin 809
15 dpavlin 850 use Video::Subtitle::SRT;
16    
17 dpavlin 847 has title => (
18     is => 'rw',
19     isa => 'Str',
20     );
21    
22 dpavlin 823 has path => (
23 dpavlin 809 is => 'rw',
24     isa => 'Str',
25     required => 1,
26 dpavlin 825 default => 'var/flv/codeswarm.flv',
27 dpavlin 809 );
28    
29 dpavlin 846 has player_swf => (
30 dpavlin 814 is => 'rw',
31     isa => 'Str',
32     required => 1,
33 dpavlin 846 default => 'http://flv-player.net/medias/player_flv_maxi.swf',
34 dpavlin 814 );
35    
36 dpavlin 850 has FlashVars => (
37     is => 'rw',
38     isa => 'ArrayRef[Str]',
39     default => sub { [] },
40     lazy => 1, # hide it from user
41     );
42    
43 dpavlin 809 sub as_markup {
44     my ($self) = @_;
45    
46 dpavlin 823 my $path = $self->path;
47     die "can't find $path" unless -e $path;
48 dpavlin 809
49 dpavlin 823 my $url = "http://localhost:3000/$path"; # FIXME
50 dpavlin 814
51 dpavlin 846 my $swf = $self->player_swf;
52 dpavlin 814
53 dpavlin 823 my %info = $self->flv_info;
54     warn "# info ", $self->dump( \%info );
55    
56 dpavlin 855 my $width = $info{video_width};
57     my $height = $info{video_height};
58 dpavlin 823
59 dpavlin 855 $self->FlashVars( [ "flv=$url", "autoload=1", "showtime=1" ] );
60 dpavlin 847
61 dpavlin 855 push @{ $self->FlashVars }, 'showvolume=1' if $info{audio_count} > 0;
62    
63 dpavlin 850 my $subtitles = $self->subtitles_as_markup;
64 dpavlin 847
65 dpavlin 850 push @{ $self->FlashVars }, 'title=' . $self->title if $self->title;
66 dpavlin 847
67 dpavlin 850 my $FlashVars = join('&amp;', @{ $self->FlashVars });
68 dpavlin 847
69 dpavlin 883 $self->add_css(q|
70     #subtitle small {
71     color: #888;
72     }
73     |);
74    
75     $self->add_js(q|
76     var _subtitle_active = -1;
77    
78     function flv_subtitle(subtitle,nr) {
79    
80     // remove current subtitle
81     if ( _subtitle_active >= 0 ) {
82     document.getElementById('subtitle-' + _subtitle_active).style.background = '#fff';
83     }
84    
85     var s = document.getElementById('subtitle');
86     if ( subtitle.message ) {
87     s.innerHTML = ''
88     + subtitle.message
89     + ' <small>'
90     + nr + ' ' +
91     + subtitle.timeStart
92     + ' ... '
93     + subtitle.timeEnd
94     + '</small>'
95     ;
96     document.getElementById('subtitle-' + nr).style.background = '#ff0';
97     _subtitle_active = nr;
98     } else {
99     s.innerHTML = '&nbsp;';
100     _subtitle_active = -1;
101     }
102     }
103     |);
104    
105 dpavlin 855 my $info = $self->dropdown( $self->path, \%info );
106 dpavlin 809 qq|
107 dpavlin 880 <object id="flvplayer" type="application/x-shockwave-flash" data="$swf" width="$width" height="$height">
108 dpavlin 846 <param name="movie" value="$swf" />
109 dpavlin 847 <param name="FlashVars" value="$FlashVars" />
110 dpavlin 883 <param name="AllowScriptAccess" value="always"> <!-- domain -->
111 dpavlin 846 </object>
112 dpavlin 883 <div id="subtitle">&nbsp;<small>no subtitle</small></div>
113     <div style="border: 1px slashed #888;">
114     <input type="button" onclick="document.getElementById('flvplayer').SetVariable('player:jsPlay', '');" value="Play" >
115     <input type="button" onclick="alert(document.getElementById('flvplayer').GetVariable('method:getPosition'))" value="getPosition" >
116     </div>
117     $subtitles
118 dpavlin 855 <div>$info</div>
119 dpavlin 809 |;
120    
121     }
122    
123 dpavlin 850 sub subtitles_as_markup {
124     my ( $self ) = @_;
125    
126     my $srt = $self->path;
127     $srt =~ s{\.flv}{.srt};
128     my $html = '';
129    
130     if ( -e $srt ) {
131     push @{ $self->FlashVars }, 'srt=1';
132    
133 dpavlin 883 my $nr = 0;
134    
135     $self->add_js(qq|
136     function play_from(position) {
137     var p = document.getElementById('flvplayer');
138     p.SetVariable('player:jsSetPosition', position);
139     p.SetVariable('player:jsPlay','');
140     return false;
141     }
142     |);
143    
144     sub jump_to {
145     my $t = shift;
146     my $position =
147     $1 * 60 * 60 +
148     $2 * 60 +
149     $3
150     if ( $t =~ m/(\d\d):(\d\d):(\d\d),\d/ );
151     ;
152    
153     qq|<a href="#$t" onclick="return play_from($position);">$t</a>|;
154     }
155    
156 dpavlin 850 my $callback = sub {
157     my $data = shift;
158 dpavlin 883 my $s = jump_to( $data->{start_time} );
159     my $e = jump_to( $data->{end_time} );
160     $html .= qq|<tr id="subtitle-$nr"><td>$s</td><td>$e</td><td> $data->{text} </td></tr>|;
161     $nr++;
162 dpavlin 850 };
163    
164     my $subtitle = Video::Subtitle::SRT->new($callback);
165     $subtitle->debug(1);
166     $subtitle->parse( $srt );
167    
168     $html = qq|
169     <table class="html">
170     <thead>
171     <tr><th>from</th><th>to</th><th>subtitle</th></tr>
172     </thead>
173     <tbody>
174     $html
175     <tbody>
176     </table>
177     |;
178     }
179    
180     return $html;
181     }
182    
183 dpavlin 809 1;

  ViewVC Help
Powered by ViewVC 1.1.26