Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Perl/Tk front-end to mplayer

by zentara (Archbishop)
on Dec 23, 2004 at 17:36 UTC ( #417164=sourcecode: print w/replies, xml ) Need Help??
Category: GUI Programming
Author/Contact Info zentara
Description: This is just a way of viewing mpgs within a Tk window. There is alot of complexity in the way mplayer handles stdin and 'slave' mode, and this was the best I could do, without alot of detailed programming. Run this in a directory full of mpg videos, mp3's, or avi's. Hitting the Next button will let you breeze thru the directory as a sampler.

Update Sep 1,2006 Added .flv files to assist in playing Youtube.com downloads, as shown in YouTube Video Downloader

#!/usr/bin/perl -w
use strict;
use Tk;
use Proc::Killfam;
use Tk::DialogBox;

# by zentara of perlmonks.org 
# a Perl/Tk frontend to mplayer 
# a hack to work around the quirkiness 
# of mplayer's 'slave mode' 
# it has many drawbacks: must respawn mplayer 
# to change sound or playback rate, it blocks while 
# getting a url, and uses a continuous loop 
# to avoid mplayer exiting , and it needs an init.mpg 

# but it works pretty fair for browsing thru local 
# files 

# I found mplayer's stdin command handling too 
# difficult to control, so I resorted to this 
# piped open "creativity :-) 

# It will make a default playlist and init.mpg  
# when it starts, if you don't provide one. 
# The init.mpg is like a splash screen, I provide 
# a black screen. 

# There are 2 playlist methods. One will automatically 
# play the list and loop. The other will play each file 
# on the list, and loop until you hit "next". 
# This is the best use for this program, to quickly 
# cycle thru a directory full of mpegs, sampling each one. 

# The viewport is set at 500x400, so you may need to 
# change that for odd screen aspect ratios, and the 
# viewport can be dragged smaller, and navigated with 
# scrollbars. 


$|++;

$SIG{INT} = sub { &close_it_up };
$SIG{PIPE} = 'IGNORE';

my $fps = 25;  #default frames per second 
my $mpg_in = shift || ''; #mpg to play from command line 
# needs an init.mpg which will be created if you 
# don't supply one 
if( ! -e 'init.mpg'){ &make_init}

#setup default playlist 
if( ! -e 'playlist'){
    my @files = <*.mpg *.mpeg *.mp3 *.avi *.flv>;
    @files = grep{ $_ ne 'init.mpg'} @files;
    open(FH, '> playlist') or warn "$!\n";
    foreach(@files){print FH  "$_\n" }
    close FH;
}

open(FH, '< playlist') or warn "$!\n";
my @list = (<FH>);
close FH;

my $cur_play;

my $mw = MainWindow->new(-background =>'black');
$mw->geometry('530x450+20+30');

$mw->Tk::bind("<q>", sub{&close_it_up});
$mw->Tk::bind("<Escape>", sub{&close_it_up});

my $cframe1 = $mw->Frame(-background =>'black')
            ->pack( -fill =>'x');

my $cframe2 = $mw->Frame(-background =>'black')
            ->pack( -fill =>'x');

my $canv = $mw->Scrolled('Canvas',
     -bg => 'black',
     -borderwidth => 0,
     -highlightthickness => 0,
     -relief => 'sunken',
     -width =>  500,
     -height => 400,
     -scrollregion=>[0,0,500,400],
     -scrollbars=>'osoe',
     )->pack();

my $contWidth = 500;
my $contHeight = 400;

## this Frame is needed for including the window in Tk::Canvas 
my $Container = $canv->Frame(-container => 1);
my $xtid = $Container->id();
# converting the id from HEX to decimal as xterm requires a decimal Id
+ 
my ($xtId) = sprintf hex $xtid;

my $dcontitem = $canv->createWindow(10,10,
   -anchor=>'nw',
   -window => $Container,
   -width => $contWidth,
   -height => $contHeight,
   -state => 'hidden',
   -tags => ['viewport'],
   );

my $pid;
my @options = (  '-slave','-loop 0', '-zoom',
                 "-x $contWidth", "-y $contHeight",
                 '-really-quiet',
                 "-wid $xtId",
               );

my $loadf_but = $cframe1->Button(-text => 'Load file',
             -padx => 0,
             -command => sub{
                my $file = &get_file;
                &play($file);
             })->pack(-side =>'left',-padx=>5 );

my $loadu_but = $cframe1->Button(-text => 'Load URL',
             -padx => 0,
             -command => sub{
                my $url = &get_url;
                &play($url);
             })->pack(-side =>'left',-padx=>10 );


my $next_but = $cframe1->Button(-text => 'Next',
              -padx => 0,
             -command => sub{
                &play($list[0]);
                push (@list,shift(@list));
              })->pack(-side =>'left' );

my $loadl_but = $cframe1->Button(-text => 'PlayAuto',
              -padx => 0,
              -command => sub{
                 syswrite(MP, "loadlist playlist\n");
                 $mw->configure(-title=>'playlist auto');
             })->pack(-side =>'left',-padx=>10 );

$cframe1->Button(-text => "Exit",
             -padx => 0,
            -command => [sub{&close_it_up}] )
             ->pack(-side=>'right', -padx =>10 );

$cframe1->Label(-text => 'FPS ',
            -padx => 0,
            -background => 'lightyellow',
                 )->pack( -side => 'left');
my $fps_lab = $cframe1->Entry(-textvariable => \$fps,
                -background => 'lightyellow',
                -width => 2
                 )->pack( -side => 'left');
$fps_lab->Tk::bind("<Return>", \&set_fps);

my $sound = 1;
$cframe1->Checkbutton(
        -text => 'Sound',
        -background => 'lightblue',
        -variable => \$sound,
        -command  => \&set_sound,
            )->pack(-fill =>'y' );

my $ltext = 'SpaceBar->Pause    q or esc -> exit'.
            'left and right arrow key ->navigate';

$cframe2->Label(-text => $ltext,
                -background => 'black',
                -foreground => 'lightgreen',
                 )->pack(-expand=>1 );

&start_player;
if($mpg_in ne ''){ &play($mpg_in)}


MainLoop();
######################################################### 
sub get_url{

my $url;
my $dialog = $mw->DialogBox(
        -buttons => [qw/Ok Cancel/],
        -title => "Enter Url",
        -background => 'lightsteelblue',
    );

   my $dialogE = $dialog->add("Entry");
   $dialogE->pack(qw/-padx 10 -pady 10/);

   my $dbEntry = $dialog->Subwidget('entry');
   $dbEntry->configure(-background =>'white',
                       -width => 60,
                      );

   ## Determine whether or not the user hit "Ok" 
   my $button = $dialog->Show();

     if ($button eq "Ok") {
      $url = $dbEntry->get();
      print "$url was submitted\n";
    }

return $url;

}
########################################################## 
sub get_file{
  my @types =( ["mpeg,mp3,avi", [qw/.mpg .mpeg .mp3 .avi .flv/]],);
  my $file = $mw->getOpenFile( -filetypes => \@types );
  return $file;
}
########################################################### 
sub set_sound{
   &stop;
  if($sound == 1 ){ @options = grep{ $_ ne '-nosound'} @options;}
  else{ unshift @options, '-nosound';}
  &start_player;
  &play($cur_play);
}
############################################################## 
sub start_player{
  $pid = open(MP, "| mplayer @options  init.mpg >/dev/null 2>&1 ");
  $canv->itemconfigure($dcontitem,-state => 'normal');
}
############################################################## 
sub play {
      my $mpg = shift || 'init.mpg';
      syswrite(MP, "loadfile $mpg\n");
      $cur_play = $mpg;
      my $filename = substr ($mpg, rindex ($mpg, "/") + 1);
      $mw->configure(-title=>$filename);
 }
################################################################### 
sub stop{
       syswrite(MP, "quit\n");
       $canv->itemconfigure($dcontitem,-state => 'hidden');
       killfam 9, $pid;
       close MP;
}
################################################################# 
sub close_it_up{
&stop;
exit;
}
################################################################### 
sub make_init{
use MIME::Base64;
my $init_mpg ='  
UklGRvYUAABBVkkgTElTVOgRAABoZHJsYXZpaDgAAABAQg8AfJIAAAAAAAAQCQAAAwAAAA
+AAAAAB 
AAAAAAAQAMAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAExJU1SQEAAAc3RybHN0cmg4AAAAdm
+lkc0RJ 
VlgAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAAAAAQAP////8ARAEAAAAAAMAAkABzdH
+JmKAAA 
ACgAAADAAAAAkAAAAAEAGABESVZYAEQBAAAAAAAAAAAAAAAAAAAAAABKVU5LFBAAAAQAAA
+AAAAAA 
MDBkYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAEpVTksEAQAAb2RtbGRtbGj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMSVNUwgIAAG
+1vdmkw 
MGRjbAEAAAAAAbABAAABtYkTAAABAAAAASAAxI2IAA0GBBIUYwAAAbJGRm1wZWcwLjQuOG
+I0Njgw 
AH8AAAGzABAHAAABthYPGC/bfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfx
+tt/G23 
8bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbf
+xtt/G2 
38bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bb
+fxtt/G 
238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238b
+bfxtt/ 
G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238bbfxtt/G238
+bbfxtt 
/G238bbfxtt/G238bbfxtt/G238bbfxtt/G2378wMGRjIwEAAAAAAbZrgRC+5wX3OC+5wX
+3OC+5w 
X3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5w
+X3OC+5 
wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5
+wX3OC+ 
5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+
+5wX3OC 
+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC
++5wX3O 
C+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OC+5wX3OfwAwMGRjFQAAAA
+AAAbZr 
AR//////////////////fwBpZHgxMAAAADAwZGMQAAAABAAAAGwBAAAwMGRjAAAAAHgBAA
+AjAQAA 
MDBkYwAAAACkAgAAFQAAAA==';

open(FH,"> init.mpg") or die "$!\n";
print FH decode_base64($init_mpg);
close FH;
}

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://417164]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2020-09-23 22:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If at first I donít succeed, I Ö










    Results (132 votes). Check out past polls.

    Notices?