#!/usr/local/bin/perl -w use strict; use Gtk2 '-init'; use Gtk2::SimpleList; use POE; use POE::Wheel::Run; use POE::Filter::Stream; use YAML qw(LoadFile DumpFile); my ($home) = glob "~"; my $YAML_FILE = "$home/.ttv.dat"; my $OFFSETS = {}; my $REWIND = 10; my @VIDEOS = sort { -M $a <=> -M $b } (<*.mp4>, <*.avi>); if(-f $YAML_FILE) { $OFFSETS = LoadFile( $YAML_FILE ); } POE::Session->create( inline_states => { _start => \&ui_start, play_video => \&play_video, click => \&click, output => \&stdout_handler, play_ended => \&play_ended, }); $poe_kernel->run(); exit 0; ########################################### sub play_ended { ########################################### my($kernel, $heap) = @_[KERNEL, HEAP]; DumpFile( $YAML_FILE, $OFFSETS ); listbox_redraw($heap->{slist}); } ########################################### sub click { ########################################### my($kernel, $session, $gtk_list_data) = @_[KERNEL, SESSION, ARG1]; my ($sl, $path) = @$gtk_list_data; my $row_ref = $sl->get_row_data_from_path($path); $kernel->yield("play_video", $row_ref->[1]); } ########################################### sub ui_start { ########################################### my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; $heap->{main_window} = Gtk2::Window->new ('toplevel'); $kernel->signal_ui_destroy( $heap->{main_window}); $heap->{slist} = Gtk2::SimpleList->new ( 'Timer' => 'text', 'Video' => 'text', ); listbox_redraw( $heap->{slist} ); $heap->{slist}->signal_connect( row_activated => $session->callback("click")); $heap->{main_window}->add( $heap->{slist}); $heap->{main_window}->show_all; } ########################################### sub listbox_redraw { ########################################### my($slist) = @_; @{$slist->{data}} = ( map { [ timer($_), $_ ] } @VIDEOS ); } ########################################### sub timer { ########################################### my($video) = @_; my $sec = 0; $sec = $OFFSETS->{$video} if exists $OFFSETS->{$video}; return sprintf("%02d:%02d:%02d", int($sec/(60*60)), ($sec/60)%60, $sec%60); } ########################################### sub play_video { ########################################### my ($kernel, $session, $heap, $video) = @_[KERNEL, SESSION, HEAP, ARG0]; my $offset = 0; $offset = $OFFSETS->{ $video } - $REWIND if exists $OFFSETS->{ $video } and $OFFSETS->{ $video } > $REWIND; my $wheel = POE::Wheel::Run->new( Program => "/usr/bin/mplayer", ProgramArgs => ["-fs", "-ss", $offset, $video], StdoutFilter => POE::Filter::Stream->new(), StdoutEvent => 'output', CloseEvent => 'play_ended', ); $heap->{video} = $video; $kernel->sig_child( $wheel->PID(), 'sig_child' ); $heap->{player} = $wheel; } ########################################### sub stdout_handler { ########################################### my ($heap, $input) = @_[HEAP, ARG0]; if($input =~ /(?:^| )V:\s*([\d.]+)/m) { $OFFSETS->{$heap->{video}} = $1; } }