4 # Copyright (C) 2010-2011 Toni Gundogdu <legatvs@cpan.org>
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 binmode STDOUT
, ":utf8";
27 binmode STDERR
, ":utf8";
29 use version
0.77 (); our $VERSION = version
->declare("0.2.0");
31 use Getopt
::ArgvFile
(home
=> 1, startupFilename
=> [qw(.umphrc)]);
32 use Getopt
::Long
qw(:config bundling);
39 eval "require Umph::Prompt";
40 my $p = $@ ?
"" : ", Umph::Prompt version $Umph::Prompt::VERSION";
41 say "umph version $VERSION$p
42 Copyright (C) 2010-2011 Toni Gundogdu
43 This is free software; see the source for copying conditions. There is NO
44 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.";
51 Pod
::Usage
::pod2usage
(-exitstatus
=> 0, -verbose
=> 1);
54 use constant MAX_RESULTS_LIMIT
=> 50; # Refer to http://is.gd/OcSjwU
57 sub check_max_results_value
59 if ($config{max_results
} > MAX_RESULTS_LIMIT
)
62 "WARNING --max-results exceeds max. accepted value, using "
65 $config{max_results
} = MAX_RESULTS_LIMIT
;
71 if ($config{'interactive'} and not eval 'require Umph::Prompt')
74 qq/WARNING Umph::Prompt not found, ignoring --interactive option/;
75 $config{interactive
} = 0;
84 'start_index|start-index|s=i',
85 'max_results|max-results|m=i',
93 'version' => \
&print_version
,
94 'help' => \
&print_help
,
97 print_help
if scalar @ARGV == 0;
99 $config{type
} ||= 'p'; # Default to "playlist".
100 $config{start_index
} ||= 1; # Default to 1.
101 $config{max_results
} ||= 25; # Default 25.
103 check_max_results_value
;
107 sub spew_qe
{print STDERR
@_ unless $config{quiet
}}
114 spew_qe
"Checking ... ";
117 my $a = new LWP
::UserAgent
;
118 $a->env_proxy; # http://search.cpan.org/perldoc?LWP::UserAgent
119 $a->proxy('http', $config{proxy
}) if $config{proxy
};
120 $a->no_proxy('') if $config{no_proxy
};
123 my $p = new XML
::DOM
::Parser
(LWP_UserAgent
=> $a);
124 my $s = $config{start_index
};
125 my $m = $config{all
} ? MAX_RESULTS_LIMIT
: $config{max_results
};
129 my $doc = $p->parsefile(from_arg
($ARGV[0], $s, $m));
130 my $root = $doc->getDocumentElement;
132 for my $entry ($root->getElementsByTagName("entry"))
134 my $t = to_item
($entry, "title")->getFirstChild->getNodeValue;
136 to_item
($entry, "link")->getAttributeNode("href")->getValue;
137 my %data = (title
=> $t, url
=> $l, selected
=> 1);
139 spew_qe
((++$n % 5 == 0) ?
" " : ".");
144 last if $n == 0 or not $config{all
};
149 croak
"error: nothing found\n" if scalar @items == 0;
151 open_prompt
() if $config{interactive
};
153 say qq/{\n "video": [/ if $config{json
};
159 if ($_->{selected
} or not $config{interactive
})
163 my $t = $_->{title
} || "";
170 say qq/ "title": "$t",/;
171 say qq/ "url": "$_->{url}"/;
174 elsif ($config{csv
}) {say qq/"$t","$_->{url}"/}
175 else {say "$_->{url}"}
179 say "\n ]\n}" if $config{json
};
183 use constant GURL
=> "http://gdata.youtube.com/feeds/api";
187 my ($arg0, $s, $m) = @_;
190 if ($config{type
} eq "u" or $config{type
} eq "uploads")
192 $u = GURL
. "/users/$arg0/uploads?v=2";
194 elsif ($config{type
} eq "f" or $config{type
} eq "favorites")
196 $u = GURL
. "/users/$arg0/favorites?v=2";
200 $u = GURL
. "/playlists/$arg0?v=2";
203 $u .= "&start-index=$s";
204 $u .= "&max-results=$m";
209 my ($entry, $name) = @_;
210 $entry->getElementsByTagName($name)->item(0);
215 my $p = new Umph
::Prompt
(
221 $p->exit(\
@items, $args);
225 $p->display(\
@items, $args);
229 $p->max_shown_items(@
{$args});
233 $p->select(\
@items, $args);
239 {cmd
=> 'normal', desc
=> 'print results in default format'};
240 push @a, {cmd
=> 'json', desc
=> 'print results in json'};
241 push @a, {cmd
=> 'csv', desc
=> 'print results in csv'};
247 say STDERR
"=> print in default format";
252 say STDERR
"=> print in json";
257 say STDERR
"=> print in csv";
261 # Callbacks. All of these are optional.
264 $p->toggle(\
@items, $args);
266 onitems
=> sub {return \
@items},
269 $p->display(\
@items, $args);
272 # Other (required) settings
273 total_items
=> scalar @items,
274 prompt_msg
=> 'umph',
275 max_shown_items
=> 20
278 say STDERR
qq/Enter prompt. Type "help" to get a list of commands./;
286 umph [-q] [-i] [-a] [--csv | --json] [-t E<lt>typeE<gt>]
287 [--proxy E<lt>addrE<gt> | --no-proxy]
288 [E<lt>playlist_idE<gt> | E<lt>usernameE<gt>]
292 --help Print help and exit
293 --version Print version and exit
295 -i, --interactive Run in interactive mode
296 -t, --type arg (=p) Get feed type
297 -s, --start-index arg (=1) Index of first matching result
298 -m, --max-results arg (=25) Max number of results included
299 -a, --all Get all items
300 --json Print details in JSON
301 --csv Print details in CSV
302 --proxy arg (=http_proxy) Use proxy for HTTP connections
303 --no-proxy Disable use of HTTP proxy
307 # vim: set ts=2 sw=2 tw=72 expandtab: