Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • client/bin/gbr

    r600e713 r43ddb7a  
    11#!/usr/bin/perl
    22
    3 # Written by Jessica Hamrick (C) 2010
     3# This script was largely written by Jessica Hamrick (jhamrick), with
     4# help from Kyle Brogle (broglek)
    45
    56use strict;
     
    1011use Getopt::Long;
    1112use Image::ExifTool qw(ImageInfo);
     13use List::Util 'shuffle';
     14use File::Find;
    1215
    13 my $usage = "Usage: gbr QUEUE FILES\n";
     16# the usage for this script
     17my $usage = <<USAGE;
     18Usage: gbr [options] [-q QUEUE] FILES
    1419
     20        -q, --queue             Specify a queue other than the default
     21        -d, --dryrun            Just list what would be done
     22        -s, --shuffle           Randomize the order that the songs are queued in
     23        -r, --recursive         Recursively find files if a directory is passed in
     24        -n, --number NUMBER     Only print NUMBER files, if more than NUMBER are given
     25                                (this will print the first NUMBER files if -s is not given)
     26        -h, --help              Print this message
     27USAGE
     28
     29# initialize the variables for the options
    1530my $q = "";
    16 GetOptions ('q|queue=s' => \$q);
     31my $dryrun = 0;
     32my $help = 0;
     33my $shuffle = 0;
     34my $recursive = 0;
     35my $number = 0;
    1736
     37# parse the options
     38GetOptions ('q|queue=s' => \$q,
     39            'd|dryrun' => \$dryrun,
     40            'h|help' => \$help,
     41            's|shuffle' => \$shuffle,
     42            'r|recursive' => \$recursive,
     43            'n|number=i' => \$number);
     44
     45# if the -h flag was passed, then print the usage and exit
     46if ($help) {
     47    print $usage;
     48    exit 0;
     49}
     50
     51# get the files to print from the arguments
    1852my @files = @ARGV[0 .. $#ARGV];
     53my @allfiles;
    1954
     55# if the recursive flag was passed, then recursively find files
     56if ($recursive) {
     57
     58    # helper function to add a file to the end of the list, but only
     59    # if it is a file (and not a directory)
     60    sub append {
     61        my $name = $File::Find::name;
     62        if (-f $name) {
     63            push(@allfiles, $name);
     64        }
     65    }
     66   
     67    # recursively find all the files and add them to @allfiles
     68    find(\&append, @files);
     69
     70    # if we're not shuffling the list, then sort the files.  If we are
     71    # shuffling the list, then don't bother sorting (since we're going
     72    # to shuffle it anyway)
     73    unless ($shuffle) {
     74        @files = sort(@allfiles);
     75    } else {
     76        @files = @allfiles;
     77    }
     78}
     79
     80# if the shuffle flag was passed, then shuffle the order of the files
     81if ($shuffle) {
     82    @files = shuffle(@files);
     83}
     84
     85# if the number flag was specified, then only play the specified
     86# number of files
     87if ($number > 0 and $number < $#files) {
     88    @files = @files[0 .. $number-1]
     89}
     90
     91# if the -q option is not specified, then assume we're using the
     92# default queue
    2093if (!$q){
    2194    $q = "DEFAULT";
    2295}
     96
     97# if there are no files specified to print, then show the usage,
     98# because the user is Doing It Wrong
    2399if (!@files) {
    24100    print $usage;
     
    26102}
    27103
     104# set configuration path, and complain if it doesn't exist
    28105my $configpath = "$ENV{'HOME'}/.gutenbach/$q";
    29106if (! -e $configpath) {
     
    32109}
    33110
     111# initialize the host and queue variables: host holds the address for
     112# the machine on which the remote queue runs, and queue holds the name
     113# of the printer
    34114my ($host, $queue);
    35115
     116# load the configuration file (this will set $host and $queue)
    36117if (-r $configpath) {
    37118    local $/;
     
    41122}
    42123
     124# initialize a new CUPS session
    43125my $cups = Net::CUPS->new();
     126# set the server to the one specified in the config file
    44127$cups->setServer("$host");
     128# set the printer name to the one specified in the config file
    45129my $printer = $cups->getDestination("$queue");
     130
     131# if $printer is not defined, then throw an error
    46132unless( $printer){
    47     print "Cannot access queue $q...do you have network connectivity and permission to view the queue?\n";
     133    print "Cannot access queue $q... do you have network connectivity and permission to view the queue?\n";
    48134    exit 1;
    49135}
     136
     137# initialize the job id and title variables for use below
    50138my ($jobid, $title);
    51139
     140# for each file that the user wants to print
    52141foreach my $file(@files) {
     142
     143    # check to see if the file is a youtube video.  If it is, then
     144    # write the URL to a temporary file, and set the number of copies
     145    # on the print job to 42 (this is the dirty hack we have in place
     146    # to indicate that the job is a youtube file instead of a normal
     147    # file)
    53148    if ($file =~ m|http://www\.youtube\.com/watch\?v=|) {
    54149        open FILE, ">", "/tmp/gutenbach-youtube" or die "Couldn't create temporary file";
     
    58153        $printer->addOption("copies", 42);
    59154    }
     155
     156    # otherwise, we assume it's a normal file.  Try to use exiftool's
     157    # ImageInfo to find out the tag information about the file (i.e.,
     158    # title, artist, and album).  If you can, then rename the job to
     159    # reflect those tags.  Otherwise, keep the normal title.
    60160    else {
    61161        my $fileinfo = ImageInfo($file);
     
    70170    }
    71171
    72     $jobid = $printer->printFile($file, $title);
    73    
    74     if ($jobid) {
    75         print "Sent job '$title' (id $jobid)\n";
    76     }
    77     else {
    78         print "Error sending job '$title'\n";
    79     }
     172    # unless it's a dry run, send the print job, given the file and
     173    # the job title
     174    unless ($dryrun) {
     175        $jobid = $printer->printFile($file, $title);
     176
     177        # if the printFile command returned a job id, then print that out
     178        # for the user to see
     179        if ($jobid) {
     180            print "Sent job '$title' (id $jobid)\n";
     181        }
     182
     183        # otherwise, let them know that an error occurred
     184        else {
     185            print "Error sending job '$title'\n";
     186        }
     187
     188    # otherwise, just print what we would do
     189    } else {
     190        print "Would send file '$file' with title '$title'\n";
     191    }   
    80192}
Note: See TracChangeset for help on using the changeset viewer.