source: client/bin/gbr @ 267d44e

debianmacno-cups
Last change on this file since 267d44e was 267d44e, checked in by Jessica B. Hamrick <jhamrick@…>, 14 years ago

Fix bug with recursive option in gbr

  • Property mode set to 100755
File size: 5.4 KB
Line 
1#!/usr/bin/perl
2
3# This script was largely written by Jessica Hamrick (jhamrick), with
4# help from Kyle Brogle (broglek)
5
6use strict;
7use warnings;
8
9use Net::CUPS;
10use Net::CUPS::Destination;
11use Getopt::Long;
12use Image::ExifTool qw(ImageInfo);
13use List::Util 'shuffle';
14use File::Find;
15
16# the usage for this script
17my $usage = <<USAGE;
18Usage: gbr [options] [-q QUEUE] FILES
19
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
30my $q = "";
31my $dryrun = 0;
32my $help = 0;
33my $shuffle = 0;
34my $recursive = 0;
35my $number = 0;
36
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
52my @files = @ARGV[0 .. $#ARGV];
53my @allfiles;
54
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        if (-f $_) {
62            push(@allfiles, $_);
63        }
64    }
65   
66    # recursively find all the files and add them to @allfiles     
67    find({ wanted => \&append, no_chdir => 1}, @files);
68
69    # if we're not shuffling the list, then sort the files.  If we are
70    # shuffling the list, then don't bother sorting (since we're going
71    # to shuffle it anyway)
72    unless ($shuffle) { 
73        @files = sort(@allfiles);
74    } else {
75        @files = @allfiles;
76    }
77}
78
79# if the shuffle flag was passed, then shuffle the order of the files
80if ($shuffle) {
81    @files = shuffle(@files);
82}
83
84# if the number flag was specified, then only play the specified
85# number of files
86if ($number > 0 and $number < $#files) {
87    @files = @files[0 .. $number-1]
88}
89
90# if the -q option is not specified, then assume we're using the
91# default queue
92if (!$q){
93    $q = "DEFAULT";
94}
95
96# if there are no files specified to print, then show the usage,
97# because the user is Doing It Wrong
98if (!@files) {
99    print $usage;
100    exit 1
101}
102
103# set configuration path, and complain if it doesn't exist
104my $configpath = "$ENV{'HOME'}/.gutenbach/$q";
105if (! -e $configpath) {
106    print "Queue '$q' does not exist!  Did you forget to add it with 'gutenbach-client-config'?\n";
107    exit 1;
108}
109
110# initialize the host and queue variables: host holds the address for
111# the machine on which the remote queue runs, and queue holds the name
112# of the printer
113my ($host, $queue);
114
115# load the configuration file (this will set $host and $queue)
116if (-r $configpath) {
117    local $/;
118    my $fh;
119    open $fh, $configpath;
120    eval <$fh>;
121}
122
123# initialize a new CUPS session
124my $cups = Net::CUPS->new();
125# set the server to the one specified in the config file
126$cups->setServer("$host");
127# set the printer name to the one specified in the config file
128my $printer = $cups->getDestination("$queue");
129
130# if $printer is not defined, then throw an error
131unless( $printer){
132    print "Cannot access queue $q... do you have network connectivity and permission to view the queue?\n";
133    exit 1;
134}
135
136# initialize the job id and title variables for use below
137my ($jobid, $title);
138
139# for each file that the user wants to print
140foreach my $file(@files) {
141
142    # check to see if the file is a youtube video.  If it is, then
143    # write the URL to a temporary file, and set the number of copies
144    # on the print job to 42 (this is the dirty hack we have in place
145    # to indicate that the job is a youtube file instead of a normal
146    # file)
147    if ($file =~ m|http://www\.youtube\.com/watch\?v=|) {
148        open FILE, ">", "/tmp/gutenbach-youtube" or die "Couldn't create temporary file";
149        print FILE $file;
150        $title = $file;
151        $file = "/tmp/gutenbach-youtube";
152        $printer->addOption("copies", 42);
153    }
154
155    # otherwise, we assume it's a normal file.  Try to use exiftool's
156    # ImageInfo to find out the tag information about the file (i.e.,
157    # title, artist, and album).  If you can, then rename the job to
158    # reflect those tags.  Otherwise, keep the normal title.
159    else {
160        my $fileinfo = ImageInfo($file);
161        my $magic = $fileinfo->{FileType};
162
163        if ($magic && exists($fileinfo->{Title}) && exists($fileinfo->{Artist}) && exists($fileinfo->{Album})) {
164            $title = $fileinfo->{'Title'}." - ".$fileinfo->{'Artist'}." - ".$fileinfo->{'Album'};
165        }
166        else {
167            $title = $file;
168        }
169    }
170
171    # unless it's a dry run, send the print job, given the file and
172    # the job title
173    unless ($dryrun) {
174        $jobid = $printer->printFile($file, $title);
175
176        # if the printFile command returned a job id, then print that out
177        # for the user to see
178        if ($jobid) {
179            print "Sent job '$title' (id $jobid)\n";
180        }
181
182        # otherwise, let them know that an error occurred
183        else {
184            print "Error sending job '$title'\n";
185        }
186
187    # otherwise, just print what we would do
188    } else {
189        print "Would send file '$file' with title '$title'\n";
190    }   
191}
Note: See TracBrowser for help on using the repository browser.