first semi-working slide overview
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 19 Oct 2009 21:41:06 +0000 (23:41 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 19 Oct 2009 21:41:06 +0000 (23:41 +0200)
bin/mplayer.pl
lib/HTML5TV/Slides.pm

index a259a00..5e51751 100755 (executable)
@@ -11,6 +11,8 @@ use YAML;
 use JSON;
 use HTML::TreeBuilder;
 use Graphics::Magick;
+use lib 'lib';
+use HTML5TV::Slides;
 
 my $debug = $ENV{DEBUG} || 0;
 
@@ -79,7 +81,6 @@ sub load_subtitles;
 sub load_movie {
        warn "$movie ", -s $movie, " bytes $edl\n";
        print $to_mplayer qq|loadfile "$movie"\n|;
-       print $to_mplayer "get_property $_\n" foreach ( qw/metadata video_codec video_bitrate width height fps length/ );
        load_subtitles;
 }
 
@@ -282,32 +283,6 @@ sub html5tv {
 
        }
 
-       my $slide_overview = Graphics::Magick->new;
-
-       foreach my $slide (
-               sort {
-                       my $n_a = $1 if $a =~ m{(\d+)};
-                       my $n_b = $1 if $b =~ m{(\d+)};
-                       $n_a <=> $n_b || $a cmp $b
-               } glob("$media_dir/s/2/*")
-       ) {
-                       my $s = Graphics::Magick->new;
-                       $s->ReadImage( $slide );
-                       push @$slide_overview, $s;
-       }
-
-       my $montage = $slide_overview->Montage(
-               geometry => "320x200+5+5>",
-               tile => '3x+10+10',
-               compose => 'over',
-               background => '#ffffff',
-               font => 'Sans', pointsize => 18, fill => '#ff0', stroke => 'none',
-               shadow => 'true',
-       );
-       $montage->Set( matte => 'false' );
-       $montage->Write( filename => "$media_dir/s/overview.jpg" );
-#      $montage->Write('win:'); # blocks
-
        my ($slide_width, $slide_height, $size, $format) = Graphics::Magick->new->Ping( slide_jpg( $slide_factor => 1 ) );
 
        my $html5tv = {
@@ -624,9 +599,18 @@ sub move_subtitle {
 
 load_movie;
 
+my $slides = HTML5TV::Slides->new;
+
+print $to_mplayer "get_property $_\n" foreach grep { ! $prop->{$_} } ( qw/metadata video_codec video_bitrate width height fps length/ );
+
 while ( 1 ) {
        my @fd_selected = $select->can_read(1);
 
+       current_subtitle( sub {
+               my ($nr,$pos) = @_;
+               $slides->show( $nr, $pos );
+       } ) if ! @fd_selected;
+
        foreach my $fileno ( @fd_selected ) {
 
                if ( $fileno == $from_mplayer ) {
index 10292e0..a62661c 100644 (file)
+package HTML5TV::Slides;
+
 use warnings;
 use strict;
 
-package HTML5TV::Slides;
-
 use SDL::App;
 use SDL::Surface;
 use SDL::Rect;
 
+use Data::Dump qw/dump/;
+
 sub new {
        my $class = shift;
        my $self = {
-               border_color => SDL::Color->new( -r => 0xFF, -g => 0xCC, -b => 0x00 ),
+               last_nr => -42,
        };
        bless $self, $class;
 }
 
-our $app;
-
-my ( $x, $y ) = ( 0, 0 );
-my ( $w, $h );
+sub show {
+       my ( $self, $nr ) = @_;
 
-my @factors = ( qw/ 4 4 4 4 1 2 2 4 4 4 4 / );
+       if ( $self->{last_nr} == $nr ) {
+               $self->{app}->sync if $self->{app};
+               return;
+       }
 
-foreach my $path (
-       sort {
-               my $n_a = $1 if $a =~ m{(\d+)};
-               my $n_b = $1 if $b =~ m{(\d+)};
-               $n_a <=> $n_b || $a cmp $b
-       } glob("media/_editing/s/2/*")
-) {
+       $self->{last_nr} = $nr;
 
-       my $factor = shift @factors || '4';
-       $path =~ s{/s/[124]/}{/s/$factor/};
+       my @subtitles =
+               sort {
+                       my $n_a = $1 if $a =~ m{(\d+)};
+                       my $n_b = $1 if $b =~ m{(\d+)};
+                       $n_a <=> $n_b || $a cmp $b
+               } glob("media/_editing/s/1/*")
+       ;
 
-       my $slide = SDL::Surface->new( -name => $path );
+       my $slide = SDL::Surface->new( -name => $subtitles[0] );
+       my $w = $slide->width;
+       my $h = $slide->height;
 
-       my $rect = SDL::Rect->new(
-               -width  => $slide->width(),
-               -height => $slide->height(),
-               -x      => 0,
-               -y      => 0,
-       );
+       my @factors = ( qw/ 4 4 4 4 1 2 2 4 4 4 4 / );
 
-       my $to = SDL::Rect->new(
-               -width  => $slide->width(),
-               -height => $slide->height(),
-               -x      => $x,
-               -y      => $y,
-       );
+       my ( $x, $y ) = ( 0, 0 );
 
-       warn "$x $y $path\n";
+       my $background = SDL::Color->new( -r => 0x11, -g => 0x11, -b => 0x33 );
 
-       if ( ! $app ) {
-               $w = $slide->width()  * $factor;
-               $h = $slide->height() * $factor * 2;
+       foreach my $i ( 0 .. $#factors ) {
 
-               warn "window $w $h\n";
+               my $factor = $factors[$i] || die "no factor $i in ",dump @factors;
 
-               $app = SDL::App->new(
-                       -width  => $w,
-                       -height => $h,
-                       -depth  => 24,
-                       -title  => 'Slides',
+               my $to = SDL::Rect->new(
+                       -width  => $w / $factor,
+                       -height => $h / $factor,
+                       -x      => $x,
+                       -y      => $y,
                );
 
-       }
+               my $pos = $nr + $i - 5;
 
-               
-       $slide->blit( $rect, $app, $to );
-       $app->update( $to );
+               if ( $pos < 0 ) {
 
-       $x += $slide->width();
+                       $slide->fill( $to, $background );
 
-       if ( $x >= $w ) {
-               $x = 0;
-               $y += $slide->height();
-       }
+               } else {
 
-}
+                       my $path = $subtitles[ $pos ];
+                       $path =~ s{/s/[124]/}{/s/$factor/};
+
+                       my $slide = SDL::Surface->new( -name => $path );
 
-$app->sync;
+                       my $rect = SDL::Rect->new(
+                               -width  => $slide->width(),
+                               -height => $slide->height(),
+                               -x      => 0,
+                               -y      => 0,
+                       );
 
-warn "window $w $h\n";
+#                      warn "$x $y $path\n";
 
+                       if ( ! $self->{app} ) {
 
-<STDIN>;
+                               $self->{app} = SDL::App->new(
+                                       -width  => $w,
+                                       -height => $h * 2,
+                                       -depth  => 24,
+                                       -title  => 'Slides',
+                               );
+
+                       }
+
+                       $slide->blit( $rect, $self->{app}, $to );
+               
+               }
+
+               $self->{app}->update( $to ) if $self->{app};
+
+               $x += $w / $factor;
+
+               if ( $x >= $w ) {
+                       $x = 0;
+                       $y += $h / $factor;
+               }
+
+       }
+
+       $self->{app}->sync;
+
+}
 
+1;