NAME
Time::Slideshow - simple stateless slideshow with a fixed set of images
SYNOPSIS
my $slideshow= Time::Slideshow->new(
starttime => 0,
slides => [ 'picture1.jpg', 'picture2.jpg' ],
shuffle => 0, # pseudo-rng
duration => 45, # show each slide for 45 seconds
);
my $current_slide= $slideshow->current_slide; # picture1.jpg
my $next_slide= $slideshow->next_slide; # picture2.jpg
sleep $slideshow->seconds_to_next_slide;
OVERVIEW
This module abstracts the inner workings of a slideshow, selecting the
next slide to display and calculating the time until the next picture.
It is possible to use this object in an asynchronous manner across
machines as the complete slide sequence is precalculated from the
wallclock time.
The module has no methods to advance the slideshow forwards or
backwards other than through the passage of time.
METHODS
Time::Slideshow->new %options
my $slideshow= Time::Slideshow->new(
slides => [ glob '~/backgrounds/*.jpg' ],
duration => 300, # five minutes per image
shuffle => 1, # permute the order of images
)
Creates a new slideshow object and returns it. The options are
slides
Array reference to the slides. These can be filenames or URLs or
whatever else helps your program to find and display the appropriate
image.
duration
The time how long every image is displayed, in seconds. The default
value is 45.
shuffle
If you want the order of the images to be shuffled, pass a true value
to this option. See the below discussion on what different orders you
can expect from shuffling.
starttime
If you want to set up a different offset of the start time, pass this
option with the epoch value of the start time. Usually, you want to
leave this parameter at its default of 0.
$show->add_slide( @slides )
$show->add_slide( glob '~/new_backgrounds/*' );
If you want to add slides after object creation, you can use this
method.
$show->current_slide
print "Now displaying ", $show->current_slide, "\n";
Returns the name of the slide that is currently displayed.
This method is the central method for your application to get the
filename or URL of the image that your application needs to display.
$show->next_slide
print "Next up is ", $show->next_slide, "\n";
Returns the name of the slide that will be displayed after the current
slide.
You can use this method to preload the image data for the upcoming
slide.
$show->seconds_to_next_slide
my $wait= $show->seconds_to_next_slide;
sleep $wait;
Returns the time remaining to the next slide transition.
You can use this method to pause your program or perform other tasks
until the next image needs to be displayed.
$show->current_slide_index
my $current_slide_index= $show->current_slide_index;
This returns the index of the slide that is currently displayed.
Most likely, you want to use $show->current_slide instead.
$show->slide_at $index
my $slide_count= @{ $show->slides };
for my $slide ( 0..$slide_count-1 ) {
print "Slide $slide: ", $show->slide_at( $slide ), "\n";
};
Returns the name of the slide at the given index.
SHUFFLING PERMUTATIONS
This module does not use the real permutations of the slides,
INTEGRATION
Console
This is the most basic slideshow display. It demonstrates the
functionality of the module but only outputs the text. Displaying the
image itself is left to you to implement with your favourite image
display method.
use Time::Slideshow;
my $s= Time::Slideshow->new(
slides => [ glob 'slides/*.jpg' ],
);
while(1) {
print sprintf "Now showing slide '%s'\n", $s->current_slide;
print sprintf "Next up is '%s'\n', $s->next_slide;
sleep( $s->seconds_to_next_slide );
};
AnyEvent
This example uses AnyEvent to show how you can perform other tasks
while also reacting to the timer events to display a new image.
use AnyEvent;
use Time::Slideshow;
my $s= Time::Slideshow->new(
slides => [ glob 'slides/*.jpg' ],
);
my $slideshow_timer;
my $display_and_reschedule; $display_and_reschedule= sub {
print sprintf "Now showing slide '%s'\n", $s->current_slide;
print sprintf "Next up is '%s'\n', $s->next_slide;
$slideshow_timer= AnyEvent->timer(
after => $s->seconds_to_next_slide,
cb => $display_and_reschedule,
);
};
$display_and_reschedule->();
# Wait and do other stuff
AnyEvent->condvar->recv;
CGI
This example assumes that your images are available via your webserver
under the URL /slides and will display a page that shows the same image
to all users that load that page.
use CGI;
use Time::Slideshow;
my $s= Time::Slideshow->new(
slides => [ glob 'slides/*.jpg' ],
);
my $image= "/" . $s->current_slide;
my $reload= $s->seconds_to_next_slide;
my $q= CGI->new;
print $q->header('text/html');
print <<HTML;
<html>
<head>
<meta http-equiv="refresh" content="$reload">
</head>
<body><img src="$image" /></body></html>
HTML
Prima
Using Prima, we can create an application with a natve UI that displays
the images. Not implemented here are the resizing or zooming of the
images to the window size.
use Prima qw(Application ImageViewer);
use Time::Slideshow;
my $s= Time::Slideshow->new(
slides => [ glob 'demo/*.png' ],
);
my $window = Prima::MainWindow->new();
my $image = $window->insert( ImageViewer =>
growMode => gm::Client,
rect => [0, 0, $window->width, $window->height],
autoZoom => 1,
);
my $filename = $s->current_slide;
$image->imageFile($filename);
$window->insert( Timer =>
timeout => 5000, # checking every 5 seconds is enough
onTick => sub {
if( $s->current_slide ne $filename ) {
$filename = $s->current_slide;
$image->imageFile($filename);
};
}
)->start;
Prima->run;
REPOSITORY
The public repository of this module is
http://github.com/Corion/time-slideshow.
SUPPORT
The public support forum of this module is
http://perlmonks.org/.
BUG TRACKER
Please report bugs in this module via the RT CPAN bug queue at
https://rt.cpan.org/Public/Dist/Display.html?Name=Time-Slideshow or via
mail to
[email protected].
AUTHOR
Max Maischein
[email protected]
COPYRIGHT (c)
Copyright 2014-2016 by Max Maischein
[email protected].
LICENSE
This module is released under the same terms as Perl itself.