#!/usr/bin/perl -w use strict; use Getopt::Long; ############################################# ############# CAM RUN-TIME OPTIONS ########## ############################################# my $feh = "feh"; # additional feh cmdline options my $PRE = " -q -G -Twebcam -1 0 -0 1 "; my $POST = ""; ############################################# ############################################# # Options my $help = ''; my $fullscreen = ''; my $geometry = ''; my $list = ''; my $verbose = ''; my $add = ''; my $keep = ''; my $deftitle = '%cCAM - %u'; my $title = ''; my $bp = $ENV{HOME}."/.cam_bookmarks"; my $DEBUG = 0; # check args &print_usage_and_exit unless (@ARGV); print STDERR "Note: feh-cam will be removed from the feh distribution in 2013.\n"; print STDERR "Please mail derf\@finalrewind.org if you still use it.\n"; # Url, Refresh, and bookmarks my $url = ""; my $ref = ""; my %bms = (); GetOptions('help|?|h' => \$help, 'full-screen|f|giblets-mom' => \$fullscreen, 'list|l' => \$list, 'geometry|g=s' => \$geometry, 'verbose|v' => \$verbose, 'add|a' => \$add, 'keep-images|k|save-pr0n' => \$keep, 'title|t=s' => \$title, 'debug|d' => \$DEBUG, 'bookmarks|b=s' => \$bp ); my $key = shift @ARGV; &print_usage_and_exit if ($help); if ($verbose) { $PRE .= " -V "; } if ($fullscreen) { $PRE =~ s/-w//; $PRE .= " --full-screen --auto-zoom "; } if ($geometry) { $PRE .= " --geometry $geometry "; } # if requested, add a key/url pair to bookmarks file if ($add) { my $mytitle = ''; ($url,$ref,$mytitle) = @ARGV; die "Bad key syntax\n" unless ($key && $url && $ref); $mytitle="" unless ($mytitle); open(BMF, ">>$bp") or die "Couldn't open bookmarks file \"$bp\": $!\n"; print BMF "$key=$ref,$url \"$mytitle\"\n"; close BMF; print "Added URL key \"$key\" = $url, $ref.\n"; # its useful to have this even if you arent debugging --richlowe exit 0; } if ($keep) { $PRE .= " -k "; } # load bookmarks open(BMF, "$bp") or die "Couldn't open bookmarks file \"$bp\": $!\n"; foreach (<BMF>) { next unless /^(.*?)=(.*)$/; $bms{$1} = $2; print "key=$1, url=$2\n" if ($DEBUG); } close BMF; # if requested, dump a list of key/url pair values if ($list) { foreach (sort keys %bms) { my $t = $bms{$_}; $t =~ s/^(.+?),(.+?)(^ "(.*)"|)?$/$2/; chomp $t; print "$_ = $t, $1, $3\n"; } exit 0; } # main loop MAIN: { do { $title=""; $url = $bms{$key}; die "Couldn't find URL key \"$key.\"\n" unless($url); $url =~ s/^(.+?),(.+?)( "(.*)")?$/$2/; $ref = $1; if ($4) { $title = $4; } else { $title = $deftitle; } if ($title) { $title =~ s/\%c/$key/g; $title =~ s/\%u/$url/g; $title =~ s/\%r/$ref/g; $title =~ s/\%\%/\%/g; $title = " --title \"$title\" "; } my $cmd = "$feh $PRE $title -T".$key."cam -R $ref $url $POST"; print "$cmd\n" if ($DEBUG); FORK: { my $pid; if ($pid = fork) { # We're a daddy! :) } elsif (defined $pid) { # child exec "$cmd" or die "Couldnt exec() $feh: $!\n"; } elsif ( $! =~ /No more process/) { sleep 5; redo FORK; } else { # wtf? die "Unrecoverable fork() error: $!\n"; } } } while ($key = shift @ARGV); } sub print_usage_and_exit() { print <<END_USAGE; $0 0.4 by Paul Duncan <pabs\@pablotron.org>, and Richard Lowe <richlowe\@btinternet.com> Description: A convenient webcam wrapper for feh. Usage: $0 <keys> Load the urls specified by the given keys. key : a url key stored in the bookmarks file (\"$bp\"). $0 <-a|--add> key url refresh Add a key to the bookmarks file. key : short key (ex \"jenni\"), url : url (ex \"http://www.jennicam.org/webcam/cam.jpg\"), refresh : refresh, in seconds (ex 120) $0 <-l|--list> List each url key in the bookmarks file (\"$bp\"). $0 [-f|--full-screen] keys Start feh in full-screen mode (aka --giblets-mom \"viewing\" mode). $0 [-k|--keep-images] keys Save each image in the current directory (aka --save-pr0n). $0 [-g|--geometry] xxx Use window geometry xxx (e.g. 640x480). $0 [-v|--verbose] options Start feh in verbose mode (feh -V). $0 <-h|-?|--help> Display usage information (this screen). Notes: Thanks to giblet for feh, an awesome image and webcam viewing program, and raster for Imlib2. END_USAGE exit(-1); }