SHOW:
|
|
- or go back to the newest paste.
1 | - | #!/usr/bin/perl |
1 | + | #!/usr/bin/env perl |
2 | - | # This script is a mplayer wrapper to select and play a random video file from your collection. |
2 | + | # |
3 | # MPlayer wrapper to select and play random video file(s) | |
4 | # | |
5 | ||
6 | # TODO: incorporate history-cleanse ? | |
7 | ||
8 | use strict; | |
9 | use warnings; | |
10 | ||
11 | use File::Find; | |
12 | use File::stat; | |
13 | ||
14 | #-------------------------------------------------------------------------------------------------------# | |
15 | ## BEGIN CONFIGURABLE OPTIONS : | |
16 | - | "/Volumes/Collection1", |
16 | + | |
17 | - | "/Volumes/Collection2", |
17 | + | |
18 | - | #"/Volumes/NULL", |
18 | + | |
19 | our @Collections=( | |
20 | "/Volumes/ENCRYPTED", | |
21 | #"/mnt/pr0n", | |
22 | - | # Image viewer, if filename.jpg to go along with filename.mpg, open it with -i option using: |
22 | + | |
23 | - | #our $image_viewer="feh"; # Linux |
23 | + | |
24 | - | our $image_viewer="open"; # OSX |
24 | + | # Specify Alternate image viewer, it will take one argument - related filename(s) |
25 | our $image_viewer=""; | |
26 | ||
27 | # Otherwise the defaults: | |
28 | our $def_image_viewer_osx="open"; | |
29 | our $def_image_viewer_linux="eog"; | |
30 | ||
31 | # Autoplay the files, or give a y/n prompt? 1 = auto, 0 = prompt | |
32 | our $autoplay="0"; | |
33 | ||
34 | # Path to mplayer, and any default options you want to pass along | |
35 | our $mplayer="mplayer"; | |
36 | our $mplayer_opts=""; | |
37 | #our $mplayer_opts="-display :0"; | |
38 | ||
39 | # Supported file types mplayer can handle - if it's not in this list, it won't be played, even though mplayer probably supports it | |
40 | our @Supported_videos=("mpg","mpeg","avi","wmv","asf","mov","mp4","mkv","m4v","rmvb","flv"); | |
41 | ||
42 | # Cover images - some filetypes that may exist in your collection that mplayer should ignore / will not play | |
43 | our @Supported_images=(".jpg",".png",".gif",".bmp"); | |
44 | ||
45 | # Volume Suppression. use Negative integer to decrease mplayer's volume. | |
46 | our $volume_suppression="-25"; | |
47 | - | our $version="2.2"; # Current Version. |
47 | + | |
48 | #our $volume_mods="-af volume=$volume_suppression:0"; | |
49 | ||
50 | - | our $verbose="0"; # Verbose by default ? |
50 | + | |
51 | my $version="3.1"; # Current Version. | |
52 | our $file_info_banner="1"; # Display info about the selected file ? | |
53 | our $use_colors="1"; # Colorize output ? | |
54 | - | our $cover="0"; # Open related images ? |
54 | + | our $verbose="0"; # Verbose by default ? |
55 | - | our $nosound="0"; # Nosound (unrecoverable stream) ? |
55 | + | |
56 | - | our $search="0"; # Jump to search prompt ? |
56 | + | |
57 | - | our $listing="0"; # List files by default ? |
57 | + | |
58 | our $cover="0"; # Open related images ? | |
59 | our $nosound="0"; # Nosound (unrecoverable stream) ? | |
60 | our $search="0"; # Jump to search prompt ? | |
61 | our $test_exists="0"; # Simple test for existance of file | |
62 | our $listing="0"; # List files by default ? | |
63 | - | our $debug = "0"; # Debug info by default ? |
63 | + | |
64 | - | our $pretend="0"; # No Exec ? |
64 | + | |
65 | - | our $do_exec="0"; # Probably never need to change this. |
65 | + | |
66 | our $search_char_min="2"; # Minimum search characters ? | |
67 | our $specific_result="0"; # Selected file number to play ? | |
68 | our $debug = "0"; # Debug info by default ? | |
69 | our $pretend="0"; # No Exec ? | |
70 | our $auto_sort="1"; # 1 implies -o with -t | |
71 | our $fork_bomb_protect="1"; # Prevent fork bombing the system with mplayer calls | |
72 | - | our $search_input; # Probably never need to change this. |
72 | + | our $do_exec="0"; # Probably never need to change this. |
73 | - | our $search_input_request; # Probably never need to change this. |
73 | + | |
74 | - | our $image_file; # Probably never need to change this. |
74 | + | |
75 | - | our $limit_recent="0"; # Probably never need to change this. |
75 | + | |
76 | - | our $limit_scope="0"; # Probably never need to change this. |
76 | + | |
77 | - | our $olderthan; # Probably never need to change this. |
77 | + | |
78 | our $search_term=""; # Probably never need to change this. | |
79 | our $search_input; # Probably never need to change this. | |
80 | our $search_request; # Probably never need to change this. | |
81 | our $limit_recent="0"; # Probably never need to change this. | |
82 | our $limit_time="0"; # Probably never need to change this. | |
83 | our $old_or_new; # Probably never need to change this. | |
84 | our $repeat="0"; # Repeat / Range | |
85 | our $default_repeat="5"; # Default repeat range | |
86 | our $repeat_range="0"; | |
87 | our $range_request; | |
88 | our $repetition; | |
89 | our $mplayer_max="10"; # Maximum amount of mplayer windows before limiting spawn | |
90 | our $video_width="0"; | |
91 | our $video_height="0"; | |
92 | our $target_x="0"; | |
93 | our $target_y="0"; | |
94 | our $screen_res_x="0"; | |
95 | our $screen_res_y="0"; | |
96 | our $resolution=""; | |
97 | our $mplayer_opts_geo=""; | |
98 | our $kill_players="0"; | |
99 | our $kill_signal="hup"; | |
100 | our $user_ok=""; | |
101 | our $null_term="0"; | |
102 | our $exclude_term=""; | |
103 | ||
104 | # Define highlight color codes | |
105 | my $color_bold = "\033[0;1m"; | |
106 | my $color_white = "\033[0m"; | |
107 | my $color_black = "\033[1;30m"; | |
108 | my $color_red = "\033[1;31m"; | |
109 | my $color_green = "\033[1;32m"; | |
110 | my $color_blue = "\033[1;34m"; | |
111 | my $color_yellow = "\033[1;33m"; | |
112 | my $color_cyan = "\033[1;36m"; | |
113 | my $color_purple = "\033[1;35m"; | |
114 | my $color_dark_blue = "\033[0;34m"; | |
115 | my $color_dark_red = "\033[0;31m"; | |
116 | my $color_dark_green = "\033[0;32m"; | |
117 | - | our $online_tag = "AVAILABLE"; |
117 | + | |
118 | - | our $offline_tag = "UNAVAILABLE"; |
118 | + | |
119 | - | our $warning_tag = "WARNING"; |
119 | + | |
120 | - | our $error_tag = "ERROR"; |
120 | + | |
121 | - | our $pretend_tag = "PRETEND"; |
121 | + | |
122 | - | our $exec_tag = "EXEC"; |
122 | + | |
123 | - | our $abort_tag = "ABORT"; |
123 | + | |
124 | - | our $yes_tag = "y"; |
124 | + | |
125 | - | our $no_tag = "n"; |
125 | + | |
126 | - | our $category_tag = "CATEGORY"; |
126 | + | |
127 | our $colortag_default = $color_white; | |
128 | our $colortag_online = $color_bold; | |
129 | our $colortag_offline = $color_bold; | |
130 | our $colortag_warning = $color_bold; | |
131 | our $colortag_error = $color_bold; | |
132 | our $colortag_pretend = $color_dark_purple; | |
133 | our $colortag_exec = $color_bold; | |
134 | our $colortag_vidlabel = $color_bold; | |
135 | - | our @Required=("$mplayer","$image_viewer","grep","find","which"); |
135 | + | |
136 | our $colortag_category = $color_blue; | |
137 | our $colortag_imgname = $color_purple; | |
138 | our $colortag_selection = $color_dark_red; | |
139 | ||
140 | # Text used for the static variable tags; | |
141 | our $online_label = "AVAILABLE"; | |
142 | our $offline_label = "UNAVAILABLE"; | |
143 | our $warning_label = "WARNING"; | |
144 | our $error_label = "ERROR"; | |
145 | our $pretend_label = "PRETEND"; | |
146 | our $exists_label = "FOUND"; | |
147 | our $exec_label = "EXEC"; | |
148 | our $abort_label = "ABORT"; | |
149 | our $yes_label = "y"; | |
150 | our $no_label = "n"; | |
151 | our $category_label = "CATEGORY"; | |
152 | our $vid_label = "VID FILE"; | |
153 | ||
154 | # Initial self awareness for this script | |
155 | my @ScriptPath=split(/\//,$0); | |
156 | our $script_name=$ScriptPath[$#ScriptPath]; | |
157 | - | our @Supported_images = @main::Supported_images; |
157 | + | |
158 | # Required commands used by this script | |
159 | our @Required=("$mplayer","grep"); | |
160 | ||
161 | #-------------------------------------------------------------------------------------------------------# | |
162 | &Init; ## END CONFIGURABLE OPTIONS : YOU SHOULDN'T NEED TO EDIT ANYTHING BELOW THIS POINT | |
163 | #-------------------------------------------------------------------------------------------------------# | |
164 | ||
165 | sub GlobalVars { | |
166 | ||
167 | if ($debug == 1) { | |
168 | print qq| <Enter Sub> GlobalVars\n|; | |
169 | } | |
170 | ||
171 | our $mplayer = $main::mplayer; | |
172 | our $mplayer_opts = $main::mplayer_opts; | |
173 | our $volume_suppression = $main::volume_suppression; | |
174 | - | $online_tag = $colortag_online . "$online_tag" . $colortag_default; |
174 | + | |
175 | - | $offline_tag = $colortag_offline . "$offline_tag" . $colortag_default; |
175 | + | |
176 | - | $warning_tag = $colortag_error . "$warning_tag" . $colortag_default; |
176 | + | |
177 | - | $error_tag = $colortag_error . "$error_tag" . $colortag_default; |
177 | + | |
178 | - | $pretend_tag = $colortag_pretend . "$pretend_tag" . $colortag_default; |
178 | + | |
179 | - | $exec_tag = $colortag_exec . "$exec_tag" . $colortag_default; |
179 | + | |
180 | - | $abort_tag = $colortag_abort . "$abort_tag" . $colortag_default; |
180 | + | |
181 | - | $yes_tag = $color_bold . "$yes_tag" . $colortag_default; |
181 | + | |
182 | - | $no_tag = $color_bold . "$no_tag" . $colortag_default; |
182 | + | our @Supported_images = @main::Supported_images; |
183 | our @AlreadyPicked=@main::AlreadyPicked; | |
184 | } | |
185 | - | #$category_tag = $colortag_category . "$category_tag" . $colortag_default; |
185 | + | |
186 | sub Init { | |
187 | ||
188 | - | # Set some initial requirements |
188 | + | # Set & Get some initial requirements |
189 | &GlobalVars; | |
190 | ||
191 | print qq|\n|; | |
192 | ||
193 | if (@ARGV) { | |
194 | &CheckArgs; | |
195 | } | |
196 | ||
197 | if ($debug == 1) { | |
198 | - | our $dir=$main::mydir; |
198 | + | |
199 | } | |
200 | ||
201 | - | print qq|[$dirlabel]: $dir\n\n|; |
201 | + | |
202 | if ($use_colors == 1) { | |
203 | $online_label = $colortag_online . "$online_label" . $colortag_default; | |
204 | $offline_label = $colortag_offline . "$offline_label" . $colortag_default; | |
205 | $warning_label = $colortag_error . "$warning_label" . $colortag_default; | |
206 | $error_label = $colortag_error . "$error_label" . $colortag_default; | |
207 | - | &BeginFapping; |
207 | + | $pretend_label = $colortag_pretend . "$pretend_label" . $colortag_default; |
208 | $exists_label = $colortag_pretend . "$exists_label" . $colortag_default; | |
209 | $exec_label = $colortag_exec . "$exec_label" . $colortag_default; | |
210 | $abort_label = $colortag_abort . "$abort_label" . $colortag_default; | |
211 | $yes_label = $color_bold . "$yes_label" . $colortag_default; | |
212 | - | &BeginFapping; |
212 | + | $no_label = $color_bold . "$no_label" . $colortag_default; |
213 | $vid_label = $colortag_vidlabel . $vid_label . $colortag_default; | |
214 | $script_name = $color_bold . $script_name . $colortag_default; | |
215 | #$category_label = $colortag_category . "$category_label" . $colortag_default; | |
216 | } | |
217 | ||
218 | if ($autoplay == 1) { | |
219 | our $do_exec = 1; | |
220 | - | # Process all arguments before action |
220 | + | |
221 | ||
222 | # Check some command dependancies | |
223 | - | my $arg; |
223 | + | |
224 | ||
225 | # If one of the args is a directory, play file from requested dir | |
226 | - | foreach $arg (@ARGV) { |
226 | + | |
227 | our $dir=$main::user_dir; | |
228 | ||
229 | my $dirlabel = $color_bold . "USING DIR" . $colortag_default; | |
230 | print qq| [$dirlabel]: $dir\n\n|; | |
231 | ||
232 | if ($search == 1) { | |
233 | &Search; | |
234 | } | |
235 | else { | |
236 | #Draw random file from user dir (will inherit dir) | |
237 | &BeginFlow; | |
238 | } | |
239 | } | |
240 | else { | |
241 | # Default Program flow; Play random file from collections | |
242 | &BeginFlow; | |
243 | - | elsif ($arg =~/^\-d$/) { |
243 | + | |
244 | } | |
245 | ||
246 | sub CheckArgs { | |
247 | ||
248 | # Process arguments before action | |
249 | ||
250 | if ($debug == 1) { | |
251 | print qq| <Enter Sub> CheckArgs\n|; | |
252 | } | |
253 | - | elsif ($arg =~/^\-e$/) { |
253 | + | |
254 | my $args=0; | |
255 | my $pass_opt_check=0; | |
256 | my $next; | |
257 | ||
258 | foreach my $arg (@ARGV) { | |
259 | ||
260 | if ($arg =~/^\-q$/) { | |
261 | $nosound = 1; | |
262 | } | |
263 | elsif ($arg =~/^\-i$/) { | |
264 | our $cover = 1; | |
265 | } | |
266 | elsif ($arg =~/^\-h$|^-{1,2}help$/) { | |
267 | &Usage; | |
268 | } | |
269 | elsif ($arg =~/^\-v$/) { | |
270 | our $verbose = 1; | |
271 | } | |
272 | elsif ($arg =~/^-vv$/) { | |
273 | our $verbose = 1; | |
274 | our $very_verbose = 1; | |
275 | } | |
276 | elsif ($arg =~/^-{1,2}debug$/) { | |
277 | our $debug = 1; | |
278 | } | |
279 | elsif ($arg =~/^\-a$/) { | |
280 | our $autoplay = 1; | |
281 | our $do_exec = 1; | |
282 | - | ## Limit results by date logic; |
282 | + | |
283 | elsif ($arg =~/^\-l$/) { | |
284 | our $listing = 1; | |
285 | } | |
286 | elsif ($arg =~/^\-z$/) { | |
287 | our $list_everything = 1; | |
288 | - | print qq|[$error_tag]: With -t, You must specify a time period of interest.\n\n|; |
288 | + | |
289 | } | |
290 | elsif ($arg =~/^\-c$/) { | |
291 | ||
292 | if ($use_colors == 1) { | |
293 | our $use_colors = 0; | |
294 | - | $limit_scope = $next; |
294 | + | |
295 | else { | |
296 | our $use_colors = 1; | |
297 | - | if ($limit_scope=~/^(\+?)(\d+)(\w?)$/) { |
297 | + | |
298 | } | |
299 | elsif ($arg =~/^\-o$/) { | |
300 | - | #$limit_scope=~s/\+//g; |
300 | + | |
301 | if ($sort_order == 1) { | |
302 | - | our $olderthan = $1; |
302 | + | |
303 | } | |
304 | else { | |
305 | our $sort_order = 1; | |
306 | } | |
307 | } | |
308 | elsif ($arg =~/^\-k$/) { | |
309 | - | if ($olderthan) { |
309 | + | our $kill_players = 1; |
310 | ||
311 | - | #print qq|OLDERTHAN : $number\n|; |
311 | + | chomp(my $mplayer_pid=`pidof mplayer`); |
312 | - | #exit; |
312 | + | |
313 | if ($mplayer_pid) { | |
314 | - | $limit_scope = $number * 1; |
314 | + | system("kill -s $kill_signal $mplayer_pid"); |
315 | } | |
316 | } | |
317 | - | $limit_scope = $number * 7; |
317 | + | |
318 | our $pretend = 1; | |
319 | } | |
320 | - | $limit_scope = $number * 31; |
320 | + | |
321 | our $fullscreen = 1; | |
322 | } | |
323 | - | $limit_scope = $number * 365; |
323 | + | |
324 | our $mplayer_output = 1; | |
325 | } | |
326 | - | print qq|Recent Limit: $limit_scope - "$amount" is not a valid time period... must be either d,w,m,y\n|; |
326 | + | |
327 | ||
328 | # Limit results by time logic; | |
329 | ||
330 | - | #print qq|LIMIT SCOPE: ($1:$2) $limit_scope \n|; |
330 | + | |
331 | - | #exit; |
331 | + | |
332 | if ($auto_sort == 1) { | |
333 | our $sort_order = 1; | |
334 | - | elsif ($arg =~ /^\-s$/) { |
334 | + | |
335 | - | # grab next argument following search option |
335 | + | |
336 | - | our $search = 1; |
336 | + | |
337 | ||
338 | unless ($next) { | |
339 | print qq|[$error_label]: With -t, You must specify a time period.\n\n|; | |
340 | sleep 1; | |
341 | &Usage; | |
342 | } | |
343 | ||
344 | unless ($next=~/^-(\w+)/) { | |
345 | $limit_time = $next; | |
346 | } | |
347 | ||
348 | if ($limit_time=~/^(\+?)(\d+)(\w?)$/) { | |
349 | ||
350 | $pass_opt_check=1; | |
351 | ||
352 | - | my $wrong_number="[$error_tag]: With -n, You must specify the number of a search result to play.\n"; |
352 | + | our $old_or_new = $1; |
353 | my $number = $2; | |
354 | my $amount = $3; | |
355 | ||
356 | if ($amount) { | |
357 | if ($amount eq 'd') { | |
358 | if ($old_or_new) { | |
359 | $number = $number - 1; | |
360 | } | |
361 | - | $search_input_request = $next; |
361 | + | $limit_time = $number * 1; |
362 | } | |
363 | - | if ($search_input_request=~/^(\d+)/) { |
363 | + | |
364 | $limit_time = $number * 7; | |
365 | } | |
366 | elsif ($amount eq 'm') { | |
367 | $limit_time = $number * 31; | |
368 | } | |
369 | elsif ($amount eq 'y') { | |
370 | $limit_time = $number * 365; | |
371 | } | |
372 | else { | |
373 | - | elsif (-d "$arg") { |
373 | + | print qq|Recent Limit: $limit_time - "$amount" is not a valid time period... must be either d,w,m,y\n|; |
374 | exit; | |
375 | - | our $mydir=$arg; |
375 | + | |
376 | - | $mydir=~s/\/$//; |
376 | + | |
377 | } | |
378 | } | |
379 | elsif (($arg =~ /^\-s$/) || ($arg=~ /^-e$/)) { | |
380 | ||
381 | - | print qq|[$error_tag]: Unknown Argument: "$arg"\n\n|; |
381 | + | # grab search term |
382 | ||
383 | if ($arg =~/^\-s$/) { | |
384 | our $search = 1; | |
385 | } | |
386 | elsif ($arg =~/^\-e$/) { | |
387 | our $search = 1; | |
388 | our $listing = 1; | |
389 | our $test_exists = 1; | |
390 | } | |
391 | ||
392 | my $next=$ARGV[$args+1]; | |
393 | - | sub BeginFapping { |
393 | + | |
394 | if ($next) { | |
395 | - | print qq| <Enter Sub> BeginFapping\n|; |
395 | + | |
396 | unless ($next=~/^-(\w+)/) { | |
397 | $search_term = $next; | |
398 | - | &CheckStorage; |
398 | + | |
399 | if ($search_term=~/^((\w+)|(\*)|(\.))/g) { | |
400 | $pass_opt_check=1; | |
401 | } | |
402 | } | |
403 | else { | |
404 | $search_term = ""; | |
405 | } | |
406 | } | |
407 | elsif ($arg =~ /^\-x$/) { | |
408 | ||
409 | our $null_term = 1; | |
410 | ||
411 | my $next=$ARGV[$args+1]; | |
412 | ||
413 | if ($next) { | |
414 | unless ($next=~/^-(\w+)/) { | |
415 | $exclude_term = $next; | |
416 | } | |
417 | - | my $csellection; |
417 | + | if ($exclude_term=~/^((\w+)|(\*)|(\.))/g) { |
418 | $pass_opt_check=1; | |
419 | } | |
420 | } | |
421 | - | foreach $csellection (@Collections) { |
421 | + | |
422 | $exclude_term = ""; | |
423 | } | |
424 | } | |
425 | elsif ($arg =~ /^\-n$/) { | |
426 | ||
427 | our $specific_result = 1; | |
428 | ||
429 | my $wrong_number="[$error_label]: With -n, You must specify the number of a search result to play.\n"; | |
430 | my $next = $ARGV[$args+1]; | |
431 | ||
432 | if ($next) { | |
433 | - | my $avail; |
433 | + | |
434 | - | my $unavail; |
434 | + | |
435 | print qq|$wrong_number\n|; | |
436 | sleep 1; | |
437 | &Usage; | |
438 | } | |
439 | else { | |
440 | $search_request = $next; | |
441 | } | |
442 | - | foreach $avail (@Available) { |
442 | + | if ($search_request=~/^(\d+)/) { |
443 | - | $storage_info .= qq| [$online_tag]: $avail\n|; |
443 | + | |
444 | } | |
445 | - | foreach $unavail (@Unavailable) { |
445 | + | |
446 | - | $storage_info .= qq| [$offline_tag]: $unavail\n|; |
446 | + | |
447 | print qq|$wrong_number\n|; | |
448 | sleep 1; | |
449 | &Usage; | |
450 | } | |
451 | } | |
452 | - | foreach $unavail (@Unavailable) { |
452 | + | elsif ($arg =~ /^\-r$/) { |
453 | ||
454 | - | print qq|[$warning_tag]: $unavail is currently unavailable.\n\n|; |
454 | + | our $repeat = 1; |
455 | $repeat_range = "$default_repeat"; | |
456 | - | if ($Y == $#Unavailable) { |
456 | + | |
457 | - | #print qq| Check the \@Collections configuration in this script.\n|; |
457 | + | |
458 | - | #print qq|\n|; |
458 | + | |
459 | if ($next) { | |
460 | ||
461 | # unless next var is another option, assign it as a var | |
462 | unless ($next=~/^-(\w+)/) { | |
463 | ||
464 | unless (-d $next) { | |
465 | $repeat_range = $next; | |
466 | } | |
467 | } | |
468 | ||
469 | if ($repeat_range=~/^((\d+)|all)$/g) { | |
470 | ||
471 | - | $storage_info .= qq|[$error_tag]: No collections currently available?\n\n|; |
471 | + | my $range_limit=$mplayer_max + $default_repeat; |
472 | ||
473 | - | foreach $unavail (@Unavailable) { |
473 | + | if (($repeat_range=~/^\d+/) && ($repeat_range > $range_limit)) { |
474 | ||
475 | - | $storage_info .= qq|[$offline_tag]: $unavail\n|; |
475 | + | unless ($fork_bomb_protect == 1) { |
476 | ||
477 | &PromptUser("WARNING: $repeat_range is over $range_limit processes. Continue?"); | |
478 | } | |
479 | - | $storage_info .= qq|\n $script_name ~/path/to/porn\n|; |
479 | + | |
480 | ||
481 | $pass_opt_check=1; | |
482 | } | |
483 | } | |
484 | ||
485 | $range_request = $repeat_range; | |
486 | } | |
487 | elsif ((-d "$arg")||(-l "$arg")) { | |
488 | our $custom_dir = 1; | |
489 | our $user_dir=$arg; | |
490 | $user_dir=~s/\/$//; | |
491 | } | |
492 | else { | |
493 | - | my $command; |
493 | + | |
494 | - | my $which; |
494 | + | |
495 | - | my $feh_url="http://linuxbrit.co.uk/software/feh/"; |
495 | + | |
496 | print qq|[$error_label]: Unknown Argument: "$arg"\n\n|; | |
497 | - | foreach $command (@Required) { |
497 | + | |
498 | sleep 1; | |
499 | ||
500 | - | print qq|[$error_tag]: "$command" command not found!\n\n|; |
500 | + | |
501 | exit; | |
502 | } | |
503 | $pass_opt_check=0; | |
504 | } | |
505 | $args++; | |
506 | } | |
507 | - | if ($command =~/open$/) { |
507 | + | |
508 | - | print qq|This script is currently configured to use the 'open' command of Mac OS X.\n|; |
508 | + | |
509 | - | print qq|You must edit this script's \$image_viewer variable for a suitable command line image viewer.\n|; |
509 | + | |
510 | - | print qq|Recommend using 'feh':\n$feh_url\n|; |
510 | + | sub BeginFlow { |
511 | ||
512 | - | if ($command =~/feh$/) { |
512 | + | # Silence errors of subcommands, unless ... |
513 | - | print qq|This script is currently configured to use the 'feh' image viewer.\n|; |
513 | + | |
514 | - | print qq|It's fast, light, and free... and can be found here:\n\n $feh_url\n\n|; |
514 | + | unless (($very_verbose == 1) || ($debug == 1)) { |
515 | - | print qq|Alternatively, edit this script's \$image_viewer variable to use your prefered command line image viewer.\n\n|; |
515 | + | open(STDERR, ">/dev/null") or die "Can't redirect stderr: $!"; |
516 | } | |
517 | ||
518 | if ($debug == 1) { | |
519 | print qq| <Enter Sub> BeginFlow\n|; | |
520 | } | |
521 | ||
522 | &CheckStorage; | |
523 | &GetSysInfo; | |
524 | ||
525 | if (($search == 1) || ($test_exists == 1)) { | |
526 | &Search; | |
527 | } | |
528 | else { | |
529 | &SelectFile; | |
530 | - | my $item; |
530 | + | |
531 | - | my $type; |
531 | + | |
532 | print qq|OOPS! You should not be here.\n|; | |
533 | ||
534 | - | my $ctime; |
534 | + | |
535 | - | my %ctime; |
535 | + | |
536 | ||
537 | sub GetSysInfo { | |
538 | ||
539 | # Alter commands per OS; | |
540 | my $this_os="$^O"; | |
541 | - | # List is either from a user directory, or default to indexing available collections |
541 | + | |
542 | # MAC OSX | |
543 | - | $location = &PrepPath("$main::mydir"); |
543 | + | if ($this_os =~/^(darwin)$/i) { |
544 | - | @main::Available = $main::mydir; |
544 | + | |
545 | # grab default for image viewer | |
546 | unless ($image_viewer) { | |
547 | $image_viewer = $def_image_viewer_osx; | |
548 | - | # Build list of available locations |
548 | + | |
549 | - | foreach $item (@main::Available) { |
549 | + | |
550 | # If repeating, and resolution hasn't been grabbed yet... we need it to determine window layouts | |
551 | if ($repeat == 1) { | |
552 | ||
553 | unless ($resolution) { | |
554 | ||
555 | my $getrez_cmd="system_profiler SPDisplaysDataType | grep Resolution"; | |
556 | chomp($resolution=`$getrez_cmd`); | |
557 | ||
558 | $resolution=~s/^\s+//g; | |
559 | - | ## run FIND command to generate primary list of all files; |
559 | + | $resolution=~s/Resolution: //g; |
560 | - | if ($sort_order == 1) { |
560 | + | |
561 | - | #print qq|BEGIN FIND\n|; |
561 | + | # Pull x & Y variables from result |
562 | - | #find(sub {$mtime{$File::Find::name} = -M _ if -f;}, @main::Available); |
562 | + | ($screen_res_x,$screen_res_y)=split(/\ x\ /,$resolution); |
563 | - | #while(find(sub {$mtime{$File::Find::name} = -M _ if -f;}, @main::Available)) { |
563 | + | |
564 | - | while(find(sub {$mtime{$File::Find::name} = -M _ if -f;}, @main::Available)) { |
564 | + | |
565 | - | print qq|X\n|; |
565 | + | |
566 | elsif ($this_os =~/^(linux)$/i) { | |
567 | ||
568 | # grab default for image viewer | |
569 | - | ## Limit file list to time period |
569 | + | unless ($image_viewer) { |
570 | - | elsif ($limit_recent == 1) { |
570 | + | $image_viewer = $def_image_viewer_linux; |
571 | - | unless ($olderthan eq '+') { |
571 | + | |
572 | - | $olderthan = "-"; |
572 | + | |
573 | # Same process as above.. | |
574 | if ($repeat == 1) { | |
575 | - | $limit_scope = $olderthan . $limit_scope; |
575 | + | unless($resolution) { |
576 | ||
577 | - | @AllFiles=`find $location -type f -ctime $limit_scope`; |
577 | + | my $getrez_cmd="xdpyinfo | grep dimensions | awk '{print \$2}' | awk -Fx '{print \$1, \$2}'"; |
578 | chomp($resolution=`$getrez_cmd`); | |
579 | ||
580 | - | # If not sorting, speed up slightly without the mtime check |
580 | + | # Pull x & Y variables from result |
581 | - | @AllFiles=`find $location -type f`; |
581 | + | ($screen_res_x,$screen_res_y)=split(/\ /,$resolution); |
582 | } | |
583 | } | |
584 | - | # Now we'll use a secondary list to filter search results |
584 | + | |
585 | else { | |
586 | print qq|Unsupported OS: some things may not work as expected.\n|; | |
587 | - | my $search_word; |
587 | + | |
588 | ||
589 | if ($debug == 1) { print qq| Screen Resolution: "$resolution"\n|; }; | |
590 | - | foreach $search_word (@search_words) { |
590 | + | |
591 | - | # Search 'engine' parsing is set here. |
591 | + | |
592 | sub CheckStorage { | |
593 | ||
594 | # Consider multiple sources, check for availability | |
595 | ||
596 | if ($debug == 1) { | |
597 | print qq| <Enter Sub> CheckStorage\n|; | |
598 | } | |
599 | ||
600 | our @Available; | |
601 | our @Unavailable; | |
602 | ||
603 | - | my $sub_word; |
603 | + | |
604 | - | foreach $sub_word (@sub_words) { |
604 | + | |
605 | # Check storage for availability | |
606 | foreach my $csellection (@Collections) { | |
607 | $count++; | |
608 | - | my $item; |
608 | + | |
609 | - | foreach $item (@AllFiles) { |
609 | + | |
610 | if (-d "$csellection") { | |
611 | - | #if ($item=~/kira☆kira/ig) { |
611 | + | |
612 | - | if ($item=~/$search_word/ig) { |
612 | + | |
613 | - | push(@FileList,$item); |
613 | + | |
614 | - | #print qq|$item : matches "$search_word"\n|; |
614 | + | |
615 | } | |
616 | - | if ($item=~/$sub_word/ig) { |
616 | + | |
617 | - | push(@FileList,$item); |
617 | + | |
618 | # if no collections available, print error -- unless user specified a directory to use | |
619 | my $X; | |
620 | my $Y; | |
621 | - | #print qq|\n|; |
621 | + | |
622 | ||
623 | unless ($#Available == -1) { | |
624 | ||
625 | if ($very_verbose == 1) { | |
626 | ||
627 | $storage_info .= qq| [COLLECTIONS]:\n\n|; | |
628 | ||
629 | foreach my $avail (@Available) { | |
630 | $storage_info .= qq| [$online_label]: $avail\n|; | |
631 | - | foreach $type (@Supported_videos) { |
631 | + | |
632 | foreach my $unavail (@Unavailable) { | |
633 | $storage_info .= qq| [$offline_label]: $unavail\n|; | |
634 | } | |
635 | print qq|$storage_info\n|; | |
636 | } | |
637 | else { | |
638 | $Y=0; | |
639 | ||
640 | - | foreach $type (@Supported_images) { |
640 | + | foreach my $unavail (@Unavailable) { |
641 | ||
642 | if ($verbose == 1) { | |
643 | ||
644 | print qq|[$warning_label]: $unavail is currently unavailable.\n\n|; | |
645 | ||
646 | if ($Y == $#Unavailable) { | |
647 | print qq| Consider editing the \@Collections array.\n\n|; | |
648 | } | |
649 | - | foreach $item (@FileList) { |
649 | + | |
650 | $Y++; | |
651 | } | |
652 | unless ($#Unavailable < 0) { | |
653 | #print qq|\n|; | |
654 | } | |
655 | } | |
656 | } | |
657 | else { | |
658 | unless ($custom_dir == 1) { | |
659 | ||
660 | # Display this message if no available collections | |
661 | ||
662 | $storage_info .= qq|[$error_label]: No collections currently available?\n\n|; | |
663 | ||
664 | $X=0; | |
665 | ||
666 | - | # Sorts out duplicates. I'd be lying if I said I understand how this works. |
666 | + | foreach my $unavail (@Unavailable) { |
667 | $X++; | |
668 | $storage_info .= qq|[$offline_label]: $unavail\n|; | |
669 | } | |
670 | - | @unique{@main::Videos} = (); |
670 | + | |
671 | - | my @Videos = keys %unique; |
671 | + | |
672 | $storage_info .= qq| or otherwise specify a directory to select a file from:\n|; | |
673 | - | @main::Videos=sort(@Videos); #NOTE: Don't sort this list, it should already be sorted |
673 | + | $storage_info .= qq|\n $script_name ~/path/to/videos\n|; |
674 | ||
675 | print qq|$storage_info\n|; | |
676 | ||
677 | - | @main::Videos = grep(!$unique{$_}++, @main::Videos); |
677 | + | |
678 | } | |
679 | } | |
680 | - | undef %unique; |
680 | + | |
681 | } | |
682 | ||
683 | sub DepCheck { | |
684 | ||
685 | - | undef %unique; |
685 | + | |
686 | - | @unique{@main::Rejected} = (); |
686 | + | |
687 | - | my @Rejected = keys %unique; |
687 | + | |
688 | - | @main::Rejected = sort(@Rejected); |
688 | + | |
689 | } | |
690 | ||
691 | foreach my $command (@Required) { | |
692 | ||
693 | chomp(my $which=`which $command`); | |
694 | ||
695 | unless (-e "$which") { | |
696 | ||
697 | print qq|[$error_label]: "$command" command not found!\n\n|; | |
698 | ||
699 | if ($command =~/mplayer$/) { | |
700 | print qq|This script is just a wrapper for command line mplayer.\n|; | |
701 | print qq|Please ensure mplayer is compiled & installed properly.\n|; | |
702 | - | print qq|[$error_tag]: $zero results found for "$main::search_input" in: $location\n\n|; |
702 | + | |
703 | } | |
704 | ||
705 | - | my $result_text; |
705 | + | |
706 | - | if ($limit_scope =~/^\-/) { |
706 | + | |
707 | - | $result_text = "results NEWER than $limit_scope days"; |
707 | + | |
708 | } | |
709 | - | elsif ($limit_scope =~/^\+/) { |
709 | + | |
710 | - | $result_text = "results OLDER than $limit_scope days"; |
710 | + | |
711 | ||
712 | - | print qq|[$error_tag]: $zero $result_text found for "$main::search_input" in: $location\n\n|; |
712 | + | # Filter unsupported file types and build list of available files. |
713 | ||
714 | if ($debug == 1) { | |
715 | - | print qq|[$error_tag:] $zero results found in: $location\n\n|; |
715 | + | |
716 | } | |
717 | ||
718 | our $location; | |
719 | my $Y=0; | |
720 | ||
721 | my $mtime; | |
722 | my %mtime; | |
723 | my $supported_videos; | |
724 | my $supported_images; | |
725 | my @AllFiles; | |
726 | my @FileList; | |
727 | ||
728 | # Build List from a collection directory, or user-specified path | |
729 | if ($custom_dir == 1) { | |
730 | $location = &PrepPath("$main::user_dir"); | |
731 | @main::Available = $main::user_dir; | |
732 | } | |
733 | else { | |
734 | ||
735 | $location=""; | |
736 | ||
737 | foreach my $item (@main::Available) { | |
738 | ||
739 | chomp $item; | |
740 | ||
741 | $location .= &PrepPath("$item"); | |
742 | ||
743 | if ($#main::Available > 0) { | |
744 | $location = $location . " "; | |
745 | } | |
746 | } | |
747 | } | |
748 | ||
749 | if ($debug == 1) { print qq| <FIND AND SORT FILES>\n|; } | |
750 | ||
751 | # FILE FIND: IF sorting by oder, find files in all available paths & sort by mtime (-l -o) | |
752 | if ($sort_order == 1 && $limit_recent == 0) { | |
753 | ||
754 | find(sub {$mtime{$File::Find::name} = -M _ if -f;}, @main::Available); | |
755 | @AllFiles = sort {$mtime{$b} <=> $mtime{$a}} keys %mtime; | |
756 | ||
757 | } | |
758 | # FILE FIND: (-l -o -t [x]): selective population of the $mtime{} hash for sorting, based on mtime vs $limit_time | |
759 | - | print qq|[$error_tag]: $search_input is too short ($search_char of $main::search_char_min min).\n\n|; |
759 | + | elsif ($sort_order == 1 && $limit_recent == 1) { |
760 | ||
761 | unless ($repetition) { | |
762 | ||
763 | unless ($old_or_new eq '+') { | |
764 | $old_or_new = "-"; | |
765 | } | |
766 | $limit_time = $old_or_new . $limit_time; | |
767 | } | |
768 | ||
769 | # File::Find in action; | |
770 | find( | |
771 | - | # Depends on an up-to-date list |
771 | + | sub { |
772 | - | &BuildLists; |
772 | + | if ($old_or_new eq '+') { |
773 | ||
774 | if (-f && -M >= $limit_time) { | |
775 | $mtime{$File::Find::name} = -M _; | |
776 | } | |
777 | - | my $i; |
777 | + | |
778 | elsif ($old_or_new eq '-') { | |
779 | - | my $avail; |
779 | + | |
780 | - | my $unavail; |
780 | + | $limit_time=~s/\-//; |
781 | ||
782 | - | my $item; |
782 | + | if (-f && $limit_time >= -M) { |
783 | $mtime{$File::Find::name} = -M _; | |
784 | - | my $pure_path; |
784 | + | |
785 | } | |
786 | }, @main::Available); | |
787 | ||
788 | @AllFiles = sort { $mtime{$b} <=> $mtime{$a} } keys %mtime; | |
789 | - | my $req_orig = $search_input_request; |
789 | + | |
790 | - | $selected = $search_input_request; |
790 | + | |
791 | # FIND FILE: Limit file list to time period (-l -t [x]) | |
792 | elsif ($sort_order == 0 && $limit_recent == 1) { | |
793 | - | unless ($search_input_request == 0) { |
793 | + | |
794 | - | $search_input_request = ($search_input_request - 1); |
794 | + | # THIS CONDITION IS UNREACHABLE IF $sort_order =1 is defined under -t option -- or $auto_sort = 1|; |
795 | #@AllFiles=`find $location -type f -mtime $limit_time`; | |
796 | ||
797 | - | if ($search_input_request > $#main::Videos) { |
797 | + | unless ($repetition) { |
798 | ||
799 | unless ($old_or_new eq '+') { | |
800 | $old_or_new = "-"; | |
801 | } | |
802 | - | $result_summary = qq|only $total_videos Videos for "$search_term" ... |; |
802 | + | $limit_time = $old_or_new . $limit_time; |
803 | } | |
804 | ||
805 | - | print qq|[$error_tag]: $req_orig is out of bounds, $result_summary\n\n|; |
805 | + | find( |
806 | sub { | |
807 | if ($old_or_new eq '+') { | |
808 | - | chomp($pure_path=$main::Videos[$search_input_request]); |
808 | + | if (-f && -M >= $limit_time) { |
809 | push(@AllFiles, $File::Find::name); ### FIX THIS SHIT CONDITIONAL | |
810 | } | |
811 | - | # Random spin |
811 | + | |
812 | elsif ($old_or_new eq '-') { | |
813 | - | chomp($pure_path=$main::Videos[$rand]); |
813 | + | |
814 | $limit_time=~s/\-//; | |
815 | ||
816 | if (-f && $limit_time >= -M) { | |
817 | push(@AllFiles, $File::Find::name); | |
818 | } | |
819 | } | |
820 | - | # Mangle the path to get some info |
820 | + | }, @main::Available); |
821 | - | my $playable_path=&PrepPath("$pure_path"); |
821 | + | |
822 | - | my $file_folder_path=$pure_path; |
822 | + | |
823 | - | foreach $item (@main::Available) { |
823 | + | # IF NOT sorting, no need for mtime check (just -l), slight speedup |
824 | else { | |
825 | #@AllFiles=`find $location -type f`; | |
826 | find(sub { push(@AllFiles, $File::Find::name) if -f }, @main::Available); | |
827 | } | |
828 | ||
829 | - | our $file=$folders[$#folders]; |
829 | + | # SEARCH FILTER: Now we'll use a secondary list for parsed search results |
830 | if ($search == 1) { | |
831 | ||
832 | - | # if $file contains invalid characters it gets treated as a nested regex, escape, then replace |
832 | + | |
833 | - | $file=~s/\?/\\\?/g; |
833 | + | |
834 | - | $file=~s/\[/\\\[/g; |
834 | + | foreach my $search_word (@search_words) { |
835 | - | $file=~s/\]/\\\]/g; |
835 | + | |
836 | $search_word=~s/\,\ /\,/g; | |
837 | - | $file_path=~s/$file//g; |
837 | + | |
838 | #$search_word=~s/\./\(\(\\W+\)|\(\\S+\)\)/g; | |
839 | - | $file=~s/\\\?/\?/g; |
839 | + | |
840 | - | $file=~s/\\\[/\[/g; |
840 | + | |
841 | - | $file=~s/\\\]/\]/g; |
841 | + | |
842 | #$search_word=~s/\ /\(\\W+\)/g; | |
843 | ||
844 | # Expand search if wildcard, else this will not split and var is still useable | |
845 | - | our $generic_name = $file; |
845 | + | |
846 | my @sub_words=(split(/\*/,"$search_word")); | |
847 | ||
848 | # Now, actually populate @FileList if file matches search terms | |
849 | foreach my $sub_word (@sub_words) { | |
850 | ||
851 | $sub_word=~s/^\.//g; | |
852 | ||
853 | foreach my $item (@AllFiles) { | |
854 | chomp $item; | |
855 | ||
856 | - | print qq| $unique_videos results for "$search_input" ... \n\n|; |
856 | + | # .. unless it matches an -x exclusion_term, put it in the list |
857 | - | # Set color for list |
857 | + | unless (($null_term == 1 )&& ($exclude_term ne "") && ($item=~/$exclude_term/ig)) { |
858 | ||
859 | if ($item=~/$search_word/ig) { | |
860 | - | my $result_text; |
860 | + | push(@FileList,$item); |
861 | - | if ($limit_scope =~/^\-/) { |
861 | + | |
862 | - | $result_text = "results NEWER than $limit_scope days"; |
862 | + | |
863 | if ($item=~/$sub_word/ig) { | |
864 | - | elsif ($limit_scope =~/^\+/) { |
864 | + | push(@FileList,$item); |
865 | - | $result_text = "results OLDER than $limit_scope days"; |
865 | + | |
866 | } | |
867 | } | |
868 | } | |
869 | } | |
870 | } | |
871 | else { | |
872 | # If not searching, use the complete list | |
873 | @FileList = @AllFiles; | |
874 | } | |
875 | - | my $highlighted; |
875 | + | |
876 | - | my $item; |
876 | + | |
877 | - | my $file; |
877 | + | |
878 | $Y=0; | |
879 | ||
880 | - | foreach $item (@main::Videos) { |
880 | + | foreach my $type (@Supported_videos) { |
881 | ||
882 | $supported_videos .= "\.$type\$"; | |
883 | ||
884 | unless ($Y == $#Supported_videos) { | |
885 | $supported_videos .= "|"; | |
886 | - | foreach $avail (@main::Available) { |
886 | + | |
887 | $Y++; | |
888 | } | |
889 | ||
890 | # Same style filter image types | |
891 | - | ## COLORIZE SEARCH HITS |
891 | + | |
892 | $Y=0; | |
893 | ||
894 | - | my $seperate_term; |
894 | + | foreach my $type (@Supported_images) { |
895 | ||
896 | $supported_images .= "\.$type\$"; | |
897 | ||
898 | - | foreach $seperate_term (@search_breakdown2) { |
898 | + | |
899 | $supported_images .= "|"; | |
900 | } | |
901 | $Y++; | |
902 | } | |
903 | ||
904 | - | foreach $search_word (@search_breakdown) { |
904 | + | |
905 | - | my @matches; |
905 | + | |
906 | - | my $match; |
906 | + | foreach my $item (@FileList) { |
907 | ||
908 | - | @matches = $display_name =~/($search_word)/ig; |
908 | + | |
909 | - | foreach $match (@matches) { |
909 | + | |
910 | if ($item =~/$supported_videos/i) { | |
911 | push (@main::Videos,$item); | |
912 | our $total_videos++; | |
913 | } | |
914 | elsif ($item=~/$supported_images/i) { | |
915 | push (@main::Images,$item); | |
916 | our $total_images++; | |
917 | - | # Append mtime info |
917 | + | |
918 | else { | |
919 | - | #if (($sort_order == 1 )&&($verbose == 1)) { |
919 | + | |
920 | push (@main::Rejected,$item); | |
921 | our $total_rejected++; | |
922 | } | |
923 | } | |
924 | ||
925 | # Strip out duplicates. | |
926 | my %unique; | |
927 | ||
928 | undef %unique; | |
929 | @unique{@main::Videos} = (); | |
930 | ||
931 | my @Videos = keys %unique; | |
932 | ||
933 | unless ($sort_order == 1) { | |
934 | #NOTE: Don't sort this list, it should already be sorted | |
935 | @main::Videos=sort(@Videos); | |
936 | } | |
937 | else { | |
938 | # Strip duplicates; | |
939 | @main::Videos = grep(!$unique{$_}++, @main::Videos); | |
940 | } | |
941 | ||
942 | undef %unique; | |
943 | @unique{@main::Images} = (); | |
944 | ||
945 | my @Images = keys %unique; | |
946 | ||
947 | @main::Images = sort(@Images); | |
948 | ||
949 | undef %unique; | |
950 | @unique{@main::Rejected} = (); | |
951 | - | foreach $item (@main::Images) { |
951 | + | |
952 | my @Rejected = keys %unique; | |
953 | @main::Rejected = sort(@Rejected); | |
954 | ||
955 | my $zero; | |
956 | ||
957 | if ($total_videos == 0) { | |
958 | if ($use_colors == 1) { | |
959 | - | foreach $item (@main::Rejected) { |
959 | + | |
960 | } | |
961 | else { | |
962 | $zero = "0"; | |
963 | } | |
964 | ||
965 | if ($search == 1 && $limit_recent == 0) { | |
966 | print qq|[$error_label]: $zero results found for "$main::search_input" in: $location\n\n|; | |
967 | } | |
968 | elsif ($search == 1 && $limit_recent == 1) { | |
969 | ||
970 | my $result_text=""; | |
971 | ||
972 | if ($limit_time =~/^\-/) { | |
973 | $result_text = "results NEWER than $limit_time days"; | |
974 | } | |
975 | elsif ($limit_time =~/^\+/) { | |
976 | $result_text = "results OLDER than $limit_time days"; | |
977 | } | |
978 | - | #my $unique_videos=$#main::Videos+1; #moved up in file |
978 | + | |
979 | - | my $selected_tag = $selected; |
979 | + | print qq|[$error_label]: $zero $result_text found for "$main::search_input" in: $location\n\n|; |
980 | } | |
981 | else { | |
982 | - | $selected_tag = $color_red . $selected_tag . $colortag_default; |
982 | + | print qq|[$error_label:] $zero results found in: $location\n\n|; |
983 | } | |
984 | exit; | |
985 | - | $file_info .= qq| [SELECTED]: File \# $selected_tag of $unique_videos|; |
985 | + | |
986 | ||
987 | - | unless (($listing == 1) || ($selected == 1)) { |
987 | + | |
988 | - | $file_info .= qq| (-l to list)\n|; |
988 | + | |
989 | ||
990 | sub Search { | |
991 | - | $file_info .= qq|\n|; |
991 | + | |
992 | if ($debug == 1) { | |
993 | print qq| <Enter Sub> Search: \"$main::search_term\"\n|; | |
994 | } | |
995 | ||
996 | - | foreach $item (@main::Available) { |
996 | + | |
997 | - | if ($pure_path=~/^$item/) { |
997 | + | |
998 | ||
999 | print qq|[SEARCH]: |; | |
1000 | ||
1001 | chomp($search_input=<STDIN>); | |
1002 | ||
1003 | print qq|\n|; | |
1004 | ||
1005 | } | |
1006 | else { | |
1007 | unless (-d "$main::search_term") { | |
1008 | - | $file_info .= qq| [$category_tag]: |; |
1008 | + | |
1009 | } | |
1010 | else { | |
1011 | if ($debug == 1) { | |
1012 | - | for ($i=0; $i < $#folders; $i++) { |
1012 | + | |
1013 | } | |
1014 | ||
1015 | $main::search_term = ""; | |
1016 | ||
1017 | print qq|[SEARCH]: |; | |
1018 | ||
1019 | chomp($search_input=<STDIN>); | |
1020 | ||
1021 | print qq|\n|; | |
1022 | } | |
1023 | } | |
1024 | ||
1025 | my $search_char=length($search_input); | |
1026 | ||
1027 | # if empty search input, default to random selection, else format a regex based on input | |
1028 | - | my $mtime = scalar localtime stat("$pure_path")->mtime; |
1028 | + | |
1029 | ||
1030 | print qq|[NOTICE]: No Search terms specified, selecting random file...\n\n|; | |
1031 | ||
1032 | $main::search = 0; | |
1033 | ||
1034 | &SelectFile; | |
1035 | exit; | |
1036 | } | |
1037 | elsif ($search_char < $main::search_char_min ) { | |
1038 | print qq|[$error_label]: $search_input is too short ($search_char of $main::search_char_min min).\n\n|; | |
1039 | exit; | |
1040 | } | |
1041 | - | my $filename_tag = $file; |
1041 | + | |
1042 | # Now that input is validated, Search | |
1043 | - | $filename_tag = $colortag_name . $file . $colortag_default; |
1043 | + | |
1044 | ||
1045 | &SelectFile; | |
1046 | exit; | |
1047 | - | # Bold filename if no color |
1047 | + | |
1048 | - | $filename_tag = $color_bold . $file . $colortag_default; |
1048 | + | |
1049 | ||
1050 | sub SelectFile { | |
1051 | - | $file_info .= qq| [$vid_label]: $filename_tag\n\n|; |
1051 | + | |
1052 | if ($debug == 1) { | |
1053 | print qq| <Enter Sub> SelectFile\n|; | |
1054 | } | |
1055 | - | # Don't print if -l is given |
1055 | + | |
1056 | # Only build the list once | |
1057 | unless ($repetition) { | |
1058 | &BuildLists; | |
1059 | } | |
1060 | ||
1061 | my $count; | |
1062 | my $display_name; | |
1063 | my $selected; | |
1064 | my $selected_movie_raw_path; | |
1065 | my $unique_videos=$#main::Videos+1; | |
1066 | - | # Play file and print stats |
1066 | + | |
1067 | ||
1068 | # If the range is 'all', play in order (avoid dupes) by dropping to 1st request, and jumping back to top of &SelectFile for full increment | |
1069 | if (($repeat == 1) && ($range_request =~/^all$/)) { | |
1070 | ||
1071 | $specific_result = 1; | |
1072 | $search_request = 1; | |
1073 | ||
1074 | $range_request = $total_videos; | |
1075 | - | my $play_file; |
1075 | + | $repeat_range = $range_request; |
1076 | - | my $cmd; |
1076 | + | |
1077 | - | my $silent_output; |
1077 | + | # Reset counter |
1078 | - | my $pid; |
1078 | + | $total_videos = ""; |
1079 | - | my $item; |
1079 | + | |
1080 | # Start over; | |
1081 | - | chomp($play_file="$_[0]"); |
1081 | + | |
1082 | } | |
1083 | ||
1084 | - | print qq| <Enter Sub> PlayFile $main::file\n|; |
1084 | + | |
1085 | if ($specific_result == 1) { | |
1086 | ||
1087 | my $result_summary; | |
1088 | - | $mplayer_opts .=" -fs"; |
1088 | + | my $req_orig = $search_request; |
1089 | ||
1090 | $selected = $search_request; | |
1091 | - | $mplayer_opts .=" -nosound"; |
1091 | + | |
1092 | # Alter user request to align with array | |
1093 | unless ($search_request == 0) { | |
1094 | - | $mplayer_opts .= " $volume_mods"; |
1094 | + | $search_request = ($search_request - 1); |
1095 | } | |
1096 | ||
1097 | - | # form command before mangling of paths for viewing |
1097 | + | if ($search_request > $#main::Videos) { |
1098 | - | $cmd = "$mplayer $mplayer_opts $play_file"; |
1098 | + | |
1099 | - | $silent_output="1>/dev/null 2>&1"; |
1099 | + | |
1100 | - | #$silent_output="1>/dev/null"; |
1100 | + | |
1101 | } | |
1102 | - | # Form command to silence Mplayer output unless verbose |
1102 | + | |
1103 | $result_summary = qq|only $unique_videos Videos found |; | |
1104 | if ($search == 1) { | |
1105 | $result_summary .= qq|for "$search_term" |; | |
1106 | } | |
1107 | $result_summary .= qq |...|; | |
1108 | } | |
1109 | ||
1110 | - | if ($#main::Related_images >= 0) { |
1110 | + | print qq|[$error_label]: $req_orig is out of bounds, $result_summary\n\n|; |
1111 | exit; | |
1112 | } | |
1113 | - | foreach $item (@main::Related_images) { |
1113 | + | chomp($selected_movie_raw_path=$main::Videos[$search_request]); |
1114 | - | &OpenImage("$item"); |
1114 | + | |
1115 | else { | |
1116 | # THE WHEEL OF FATE SPINS! | |
1117 | my $rand=int rand ($#main::Videos+1); | |
1118 | $selected = $rand; | |
1119 | ||
1120 | chomp($selected_movie_raw_path=$main::Videos[$rand]); | |
1121 | ||
1122 | unless ($selected == 0) { | |
1123 | $selected = ($selected + 1); | |
1124 | } | |
1125 | ||
1126 | # ..but try to avoid dupes | |
1127 | - | print qq|[$warning_tag]: Prompting User before exec ... (use '-a' to override)\n\n|; |
1127 | + | if ($repeat == 1) { |
1128 | ||
1129 | foreach my $past_select (@main::AlreadyPicked) { | |
1130 | ||
1131 | # If this selection has been drawn before... | |
1132 | if ($past_select == $selected) { | |
1133 | ||
1134 | if ($debug == 1) { | |
1135 | - | foreach $item (@main::Related_images) { |
1135 | + | print qq| PICKED $selected but ALREADY PLAYED $#main::AlreadyPicked $#main::Videos\n|; |
1136 | } | |
1137 | ||
1138 | # exit if we've gone through the full list, else roll again | |
1139 | if ($#main::AlreadyPicked >= $#main::Videos) { | |
1140 | exit; | |
1141 | - | # Ok, Now we can actually fork mplayer to play the file. |
1141 | + | |
1142 | else { | |
1143 | - | # Fork to the background and play the file |
1143 | + | &SelectFile; |
1144 | - | if ($do_exec == 1) { |
1144 | + | |
1145 | - | print qq|Launching mplayer...\n|; |
1145 | + | |
1146 | - | unless ($pid = fork) { |
1146 | + | |
1147 | - | unless (fork) { |
1147 | + | |
1148 | - | exec "$cmd" || die "no exec"; |
1148 | + | # Keep track of drawn numbers |
1149 | - | exit 0; |
1149 | + | push (@main::AlreadyPicked,$selected); |
1150 | - | } |
1150 | + | |
1151 | - | exit 0; |
1151 | + | |
1152 | - | } |
1152 | + | |
1153 | - | waitpid($pid,0); |
1153 | + | if (($selected)&&($debug == 1)) { |
1154 | print qq| <SELECTED:> "$selected"\n|; | |
1155 | print qq| <FILENAME: $selected_movie_raw_path\n|; | |
1156 | } | |
1157 | - | # Old Way, leaves mplayer attached |
1157 | + | |
1158 | # Mangle the path to seperate the $file_name from the raw $file_folder_path | |
1159 | my $playable_path=&PrepPath("$selected_movie_raw_path"); | |
1160 | my $file_folder_path=$selected_movie_raw_path; | |
1161 | ||
1162 | foreach my $item (@main::Available) { | |
1163 | - | print qq|[$pretend_tag]: no exec ...\n|; |
1163 | + | |
1164 | } | |
1165 | ||
1166 | # Extract file name from path and determine generic name of file (without extension) | |
1167 | - | print qq|\n [$exec_tag]: $cmd\n\n|; |
1167 | + | |
1168 | my $file_path=$file_folder_path; | |
1169 | my @folders=split(/\//,$file_folder_path); | |
1170 | ||
1171 | our $file_name = $folders[$#folders]; | |
1172 | ||
1173 | # if $file_name contains invalid characters it gets treated as a nested regex, escape, then replace | |
1174 | $file_name =~s/\?/\\\?/g; | |
1175 | $file_name =~s/\[/\\\[/g; | |
1176 | $file_name =~s/\]/\\\]/g; | |
1177 | ||
1178 | - | our @Related_images; |
1178 | + | $file_path=~s/$file_name//g; |
1179 | ||
1180 | - | my $item; |
1180 | + | $file_name =~s/\\\?/\?/g; |
1181 | $file_name =~s/\\\[/\[/g; | |
1182 | - | my $image_file; |
1182 | + | $file_name =~s/\\\]/\]/g; |
1183 | - | my $images_found; |
1183 | + | |
1184 | # Strip extension for a generic name to find images with | |
1185 | our $generic_name = $file_name; | |
1186 | $generic_name =~s/\.(\w{3})$//i; | |
1187 | ||
1188 | # Ok, NOW PRINT list if -l | |
1189 | if ($listing == 1) { | |
1190 | ||
1191 | if ($total_videos > 0) { | |
1192 | - | foreach $item (@main::Images) { |
1192 | + | |
1193 | ||
1194 | if ($search == 1) { | |
1195 | $total_videos = $unique_videos; | |
1196 | print qq| $total_videos results for "$search_input" ... \n\n|; | |
1197 | } | |
1198 | elsif ($limit_recent == 1) { | |
1199 | ||
1200 | my $result_text=""; | |
1201 | ||
1202 | - | foreach $image (@Related_images) { |
1202 | + | if ($limit_time =~/^\-/) { |
1203 | $result_text = "results NEWER than $limit_time days"; | |
1204 | } | |
1205 | elsif ($limit_time =~/^\+/) { | |
1206 | $result_text = "results OLDER than $limit_time days"; | |
1207 | } | |
1208 | - | $image_file = $colortag_imgname . $image_file . $colortag_default; |
1208 | + | |
1209 | print qq| $total_videos $result_text\n\n|; | |
1210 | } | |
1211 | - | print qq| [IMAGE]: $image_file\n|; |
1211 | + | |
1212 | print qq| $total_videos videos available.\n\n|; | |
1213 | } | |
1214 | ||
1215 | $count=0; | |
1216 | - | #if ($verbose == 1) { |
1216 | + | |
1217 | - | print qq| [NOTICE]: No images found for "$generic_name"\n\n|; |
1217 | + | |
1218 | - | #} |
1218 | + | foreach my $item (@main::Videos) { |
1219 | ||
1220 | $count++; | |
1221 | $display_name=$item; | |
1222 | ||
1223 | # Strip source name from file to help categorize | |
1224 | - | my $pid; |
1224 | + | |
1225 | - | my $imagepath=$_[0]; |
1225 | + | foreach my $avail (@main::Available) { |
1226 | - | chomp $imagepath; |
1226 | + | |
1227 | } | |
1228 | - | my $image_command = "$image_viewer $imagepath"; |
1228 | + | |
1229 | ||
1230 | # Colorize search-term hits | |
1231 | if (($search == 1) && ($use_colors == 1)) { | |
1232 | ||
1233 | my $search_word; | |
1234 | - | print qq| <OpenImage: $image_name>\n|; |
1234 | + | |
1235 | - | print qq| <Exec>: "$image_viewer $imagepath"\n|; |
1235 | + | |
1236 | my @search_breakdown2=split(/\,/,$search_term); | |
1237 | ||
1238 | - | #Comment out to open images even with -p |
1238 | + | foreach my $seperate_term (@search_breakdown2) { |
1239 | - | #unless ($pretend == 1) { |
1239 | + | |
1240 | - | unless ($pid = fork) { |
1240 | + | |
1241 | - | unless (fork) { |
1241 | + | |
1242 | - | exec "$image_command" || die "no exec"; |
1242 | + | |
1243 | - | exit 0; |
1243 | + | |
1244 | - | } |
1244 | + | foreach my $search_word (@search_breakdown) { |
1245 | - | exit 0; |
1245 | + | |
1246 | - | } |
1246 | + | my @matches = $display_name =~/($search_word)/ig; |
1247 | - | waitpid($pid,0); |
1247 | + | |
1248 | - | #} |
1248 | + | foreach my $match (@matches) { |
1249 | ||
1250 | my $highlighted=$colortag_search . "$match" . $colortag_default; | |
1251 | $display_name=~s/$match/$highlighted/g; | |
1252 | } | |
1253 | } | |
1254 | } | |
1255 | } | |
1256 | ||
1257 | # Include mtime info ? | |
1258 | my $mtime=""; | |
1259 | - | my $user_ok; |
1259 | + | |
1260 | if (($verbose == 1) || ($limit_recent == 1) || ($sort_order == 1)) { | |
1261 | ||
1262 | - | print qq|$prompt_msg [$yes_tag/$no_tag] ($yes_tag)|; |
1262 | + | |
1263 | - | chomp($user_ok=<STDIN>); |
1263 | + | |
1264 | # format only useful data | |
1265 | $mtime =~s/\ \ /\ /g; | |
1266 | - | return; |
1266 | + | |
1267 | $mtime = "$year $month $date"; | |
1268 | $mtime = " ($mtime)"; | |
1269 | ||
1270 | - | return; |
1270 | + | |
1271 | $mtime = $colortag_mtime . $mtime . $colortag_default; | |
1272 | } | |
1273 | - | print qq|[$abort_tag]: Not Launching.\n|; |
1273 | + | |
1274 | my $number; | |
1275 | if ($use_colors == 1) { | |
1276 | $number = $colortag_number . $count . $colortag_default; | |
1277 | - | print qq|[$abort_tag]\n|; |
1277 | + | |
1278 | else { | |
1279 | $number = $count; | |
1280 | } | |
1281 | # Finally display list item | |
1282 | print qq| [$number]:$mtime $display_name \n|; | |
1283 | ||
1284 | } | |
1285 | print qq|\n|; | |
1286 | } | |
1287 | $count=0; | |
1288 | - | print qq| <PrepPath:> $_[0]\n|; |
1288 | + | |
1289 | ||
1290 | if ($list_everything == 1) { | |
1291 | ||
1292 | print qq| [IMAGES]:\n\n|; | |
1293 | ||
1294 | foreach my $item (@main::Images) { | |
1295 | $count++; | |
1296 | print qq| [$count]: $item\n|; | |
1297 | } | |
1298 | ||
1299 | print qq|\n|; | |
1300 | $count=0; | |
1301 | ||
1302 | print qq| [OTHER FILES]:\n\n|; | |
1303 | ||
1304 | foreach my $item (@main::Rejected) { | |
1305 | $count++; | |
1306 | print qq| [$count]: $item\n|; | |
1307 | } | |
1308 | ||
1309 | - | #if (($verbose == 1)||($debug == 1)) { |
1309 | + | |
1310 | - | if (($debug == 1)) { |
1310 | + | |
1311 | ||
1312 | print qq| [VIDEOS]: $total_videos\n|; | |
1313 | print qq| [IMAGES]: $total_images\n|; | |
1314 | print qq| [OTHER]: $total_rejected\n|; | |
1315 | ||
1316 | print qq|\n|; | |
1317 | exit; | |
1318 | } | |
1319 | ||
1320 | if ($test_exists == 1) { | |
1321 | ||
1322 | $pretend = 1; | |
1323 | ||
1324 | if ($total_videos > 1) { | |
1325 | print qq| [$exists_label] $total_videos matches for "$search_term".\n\n|; | |
1326 | } | |
1327 | elsif ($total_videos == 1) { | |
1328 | print qq| [$exists_label] File "$file_name" matches.\n\n|; | |
1329 | } | |
1330 | exit; | |
1331 | } | |
1332 | ||
1333 | # If repeating, report itteration | |
1334 | if ($repeat == 1) { | |
1335 | ||
1336 | #keep track of repetitions (after earlier reset) | |
1337 | $repetition++; | |
1338 | ||
1339 | # If we've opened too many windows, bind to terminal to prevent fork bombing the system | |
1340 | if ($fork_bomb_protect == 1) { | |
1341 | ||
1342 | if ($repetition > $mplayer_max) { | |
1343 | ||
1344 | $target_x = 0; | |
1345 | $target_y = 0; | |
1346 | $mplayer_output = 1; | |
1347 | } | |
1348 | } | |
1349 | ||
1350 | # Turn off listing for repititions | |
1351 | $listing = 0; | |
1352 | - | print qq| $script_name [options] [dir]\t\t\t\t\t\t\t(v.$version)\n\n|; |
1352 | + | |
1353 | - | print qq|\t-a\t\t\tAutoplay. Bypass confirmation prompt. (edit script and set "\$autoplay=1")\n|; |
1353 | + | #if user requests 4, but there's only 3 vids, drop range to match total_videos |
1354 | - | print qq|\t-s "key1 key2"\t\tSearch files based on keywords; ("." = wildcard, "," = expanded search terms)\n|; |
1354 | + | if ($range_request >= $total_videos) { |
1355 | - | print qq|\t-n N\t\t\tPlay Nth result. (As currently numbered by the "-l" option)\n|; |
1355 | + | $range_request = $total_videos; |
1356 | - | print qq|\t-l\t\t\tList videos.\n|; |
1356 | + | |
1357 | - | print qq|\t-o\t\t\tSort file list by modification date.\n|; |
1357 | + | |
1358 | - | print qq|\t-c\t\t\tToggle \$use_colors on/off.\n|; |
1358 | + | print qq| [INSTANCE]: $repetition of $range_request\n|; |
1359 | - | print qq|\t-fs\t\t\tFull Screen.\n|; |
1359 | + | |
1360 | - | print qq|\t-i\t\t\tDisplay any related images with similar names.\n|; |
1360 | + | |
1361 | - | print qq|\t-q\t\t\tNo Volume. Play Muted.\n|; |
1361 | + | # Determine selection # of total |
1362 | - | print qq|\t-m\t\t\tAttach to Mplayer output, do not fork to background.\n|; |
1362 | + | |
1363 | - | print qq|\t-t Xx\t\t\tBuild list with only Xx most recent files. Use +X for 'older than'. Where x = (d/w/m/y). Ex: 7d = 1w\n|; |
1363 | + | |
1364 | - | print qq|\t-v\t\t\tVerbose information about the selected file. (file date)\n|; |
1364 | + | |
1365 | - | print qq|\t-vv\t\t\tVery verbose: additional info\n|; |
1365 | + | |
1366 | - | print qq|\t-p\t\t\tPretend Only. No execution.\n|; |
1366 | + | |
1367 | - | print qq|\t-h\t\t\tThis Help. \n|; |
1367 | + | my $selected_label = $selected; |
1368 | - | #print qq|\t-d\t\t\tDebug info. Include some useful info about program flow.\n|; |
1368 | + | |
1369 | - | #print qq|\t-e\t\t\tList Everything - must be combined with debug option.\n|; |
1369 | + | |
1370 | - | print qq|\n\n|; |
1370 | + | $selected_label = $colortag_selection . $selected_label . $colortag_default; |
1371 | } | |
1372 | ||
1373 | $file_info .= qq| [SELECTED]: File \# $selected_label of $unique_videos\n|; | |
1374 | ||
1375 | # Display some useful info about the file if verbose | |
1376 | if ($#Collections >= 1) { | |
1377 | ||
1378 | foreach my $item (@main::Available) { | |
1379 | ||
1380 | if ($selected_movie_raw_path=~/^$item/) { | |
1381 | ||
1382 | my $csellection = $item; | |
1383 | ||
1384 | if ($use_colors == 1) { | |
1385 | #$csellection .= $colortag_category . $csellection . $colortag_default; | |
1386 | } | |
1387 | $file_info .= qq| [SOURCE]: $csellection\n|; | |
1388 | } | |
1389 | } | |
1390 | } | |
1391 | # Unless custom dir, list some path info as 'category' - it's up to you to organize your files though | |
1392 | unless (($custom_dir == 1) || ($#folders == 1)) { | |
1393 | ||
1394 | $file_info .= qq| [$category_label]: |; | |
1395 | ||
1396 | if ($use_colors == 1) { | |
1397 | $file_info .= $colortag_category; | |
1398 | } | |
1399 | ||
1400 | for (my $i=0; $i < $#folders; $i++) { | |
1401 | ||
1402 | unless ($folders[$i] =~"^\/") { | |
1403 | ||
1404 | $file_info .= qq|$folders[$i]|; | |
1405 | ||
1406 | unless ($i == 0) { | |
1407 | $file_info .= qq|/ |; | |
1408 | } | |
1409 | } | |
1410 | } | |
1411 | if ($use_colors == 1) { | |
1412 | $file_info .= $colortag_default; | |
1413 | } | |
1414 | $file_info .= qq|\n|; | |
1415 | } | |
1416 | ||
1417 | if ($verbose == 1) { | |
1418 | ||
1419 | # Additional date | |
1420 | my $mtime = scalar localtime stat("$selected_movie_raw_path")->mtime; | |
1421 | ||
1422 | # format only useful data | |
1423 | $mtime =~s/\ \ /\ /g; | |
1424 | (my $day,my $month,my $date,my $time,my $year)=split(/\ /,$mtime); | |
1425 | $mtime = "$month $date $year"; | |
1426 | ||
1427 | if ($use_colors == 1) { | |
1428 | $mtime = $colortag_mtime . $mtime . $colortag_default; | |
1429 | } | |
1430 | $file_info .= qq| [VID DATE]: $mtime\n|; | |
1431 | } | |
1432 | ||
1433 | # Color label for filename? | |
1434 | my $filename_label = $file_name; | |
1435 | my $orig_total = $total_videos; | |
1436 | ||
1437 | if ($use_colors == 1) { | |
1438 | $filename_label = $colortag_name . $file_name . $colortag_default; | |
1439 | $total_videos = $color_red . $total_videos . $colortag_default; | |
1440 | } | |
1441 | else { | |
1442 | # Bold if no color | |
1443 | $filename_label = $color_bold . $file_name . $colortag_default; | |
1444 | $total_videos = $color_bold . $total_videos . $colortag_default; | |
1445 | } | |
1446 | ||
1447 | $file_info .= qq| [$vid_label]: $filename_label\n\n|; | |
1448 | ||
1449 | # Finally print the $file_info we've formatted | |
1450 | if (($file_info_banner == 1) || ($verbose == 1)) { | |
1451 | ||
1452 | unless (($#ARGV == 0)&&($listing == 1)) { | |
1453 | print qq|$file_info|; | |
1454 | } | |
1455 | else { | |
1456 | # Exit after -l is given | |
1457 | print qq| $total_videos videos in your collection.\n\n|; | |
1458 | exit; | |
1459 | } | |
1460 | } | |
1461 | ||
1462 | $total_videos = $orig_total; | |
1463 | ||
1464 | # Handle repitition requests | |
1465 | if ($repeat == 1) { | |
1466 | ||
1467 | # Determine geometries for multiple window layouts, unless remaining attached | |
1468 | unless ($mplayer_output == 1) { | |
1469 | ||
1470 | my $last_vid_x = $target_x; | |
1471 | my $last_vid_y = $target_y; | |
1472 | ||
1473 | # Only move across if user has played previous file, or autoplay | |
1474 | unless ($user_ok eq "n") { | |
1475 | $target_x=$target_x + $video_width; | |
1476 | } | |
1477 | ||
1478 | #$target_y= $target_y + $video_height; | |
1479 | ||
1480 | # Get video resolution | |
1481 | my $mplayer_info_cmd="mplayer -vo null -ao null -frames 0 -identify $playable_path 2>/dev/null | grep ^ID_VIDEO"; | |
1482 | my @vid_info=`$mplayer_info_cmd`; | |
1483 | ||
1484 | foreach my $info_line (@vid_info) { | |
1485 | ||
1486 | chomp $info_line; | |
1487 | ||
1488 | if ($info_line =~/^ID_VIDEO_WIDTH=/) { | |
1489 | $video_width=$info_line; | |
1490 | $video_width=~s/^ID_VIDEO_WIDTH=//; | |
1491 | } | |
1492 | if ($info_line =~/^ID_VIDEO_HEIGHT=/) { | |
1493 | $video_height=$info_line; | |
1494 | $video_height=~s/^ID_VIDEO_HEIGHT=//; | |
1495 | } | |
1496 | }; | |
1497 | ||
1498 | # Determine next geometry, and if breaching far edge, drop down to new row. | |
1499 | my $next_x = $target_x + $video_width; | |
1500 | my $next_y = $target_y + $video_height; | |
1501 | ||
1502 | if ($next_x >= $screen_res_x) { | |
1503 | $target_x = 0; | |
1504 | $target_y= $target_y + $video_height; | |
1505 | } | |
1506 | ||
1507 | if ($next_y >= $screen_res_y) { | |
1508 | #$target_y = 0; | |
1509 | } | |
1510 | ||
1511 | if ($debug == 1) { | |
1512 | print qq| vidX: $video_width : $target_x of $screen_res_x : $next_x ($resolution)\n|; | |
1513 | print qq| vidY: $video_height : $target_y of $screen_res_y : $next_y ($resolution)\n|; | |
1514 | } | |
1515 | ||
1516 | # Set next windows' mplayer geometry | |
1517 | $mplayer_opts_geo = " -geometry $target_x:$target_y"; | |
1518 | ||
1519 | } | |
1520 | ||
1521 | # Return to center if we've stacked too many | |
1522 | if ($repetition > $mplayer_max) { | |
1523 | $mplayer_opts_geo = ""; | |
1524 | } | |
1525 | ||
1526 | ## IF -n $search_request, array needs alignment elsewhere (-1), so to increment the range to +1, we must actually +2 | |
1527 | if ($search_request) { | |
1528 | $search_request = $search_request +2; | |
1529 | } | |
1530 | # If the file #1 is requested, var was = 0, so previous test fails, so we need to bump to 2 to equal back to 0 to allow file +1 | |
1531 | else { | |
1532 | $search_request = 2; | |
1533 | } | |
1534 | ||
1535 | # if repeat range has more cycles, | |
1536 | if ($repeat_range > 1) { | |
1537 | ||
1538 | # remove a cycle from requested repetitions, | |
1539 | $repeat_range--; | |
1540 | ||
1541 | # and unless this is the last cycle, spin another video | |
1542 | unless ($repetition >= $total_videos) { | |
1543 | #sleep 1; | |
1544 | &PlayFile("$playable_path"); | |
1545 | &SelectFile; | |
1546 | } | |
1547 | } | |
1548 | } | |
1549 | ||
1550 | # Under regular operation, finally open file; | |
1551 | &PlayFile("$playable_path"); | |
1552 | ||
1553 | if (($verbose == 1) || ($debug == 1)) { | |
1554 | &GetStats; | |
1555 | } | |
1556 | exit; | |
1557 | } | |
1558 | ||
1559 | sub PlayFile { | |
1560 | ||
1561 | chomp(my $play_file="$_[0]"); | |
1562 | ||
1563 | if ($debug == 1) { | |
1564 | print qq| <Enter Sub> PlayFile $play_file\n|; | |
1565 | } | |
1566 | ||
1567 | # Form the actual mplayer command | |
1568 | my $cmd = "$mplayer $mplayer_opts -title \"$main::file_name\""; | |
1569 | my $silent_output="1>/dev/null 2>&1"; | |
1570 | ||
1571 | # Append mplayer options before command is formed | |
1572 | if ($mplayer_opts_geo) { | |
1573 | $cmd .= " $mplayer_opts_geo"; | |
1574 | } | |
1575 | if ($fullscreen == 1) { | |
1576 | $cmd .=" -fs"; | |
1577 | } | |
1578 | if ($nosound == 1) { | |
1579 | $cmd .=" -nosound"; | |
1580 | } | |
1581 | else { | |
1582 | $cmd .= " $volume_mods"; | |
1583 | } | |
1584 | ||
1585 | # Feed file to command | |
1586 | $cmd = $cmd . " $play_file"; | |
1587 | ||
1588 | # Unless attaching, silence output | |
1589 | unless ($mplayer_output == 1) { | |
1590 | $cmd="$cmd $silent_output"; | |
1591 | } | |
1592 | ||
1593 | # Added Ability to open an image, even if -p | |
1594 | if ($cover == 1 && $pretend == 1) { | |
1595 | ||
1596 | &GetRelatedImages; | |
1597 | ||
1598 | if ($#main::Related_images >= 1) { | |
1599 | ||
1600 | &PromptUser("Open image only?"); | |
1601 | ||
1602 | foreach my $item (@main::Related_images) { | |
1603 | ||
1604 | # Possible to be called and return nothing, so only act on tangible items | |
1605 | unless ($item =~/^$/) { | |
1606 | &OpenImage("$item"); | |
1607 | } | |
1608 | } | |
1609 | } | |
1610 | } | |
1611 | ||
1612 | unless ($pretend == 1) { | |
1613 | ||
1614 | # Build a List | |
1615 | if ($cover == 1) { | |
1616 | &GetRelatedImages; | |
1617 | } | |
1618 | ||
1619 | unless ($do_exec == 1) { | |
1620 | ||
1621 | # SAFETY; confirmation prompt before playing the video; | |
1622 | print qq|[$warning_label]: Always wise to double-check before exec ... ('-a' to override)\n\n|; | |
1623 | ||
1624 | &PromptUser("Play file?"); | |
1625 | } | |
1626 | ||
1627 | # Now that a user will have confirmed, open all related images | |
1628 | if ($cover == 1) { | |
1629 | if ($do_exec == 1) { | |
1630 | foreach my $item (@main::Related_images) { | |
1631 | ||
1632 | # Possible to be called and return nothing, so only act on tangible items | |
1633 | unless ($item =~/^$/) { | |
1634 | &OpenImage("$item"); | |
1635 | } | |
1636 | } | |
1637 | } | |
1638 | } | |
1639 | ||
1640 | # NOW we can finally launch mplayer | |
1641 | unless ($mplayer_output == 1) { | |
1642 | ||
1643 | if ($do_exec == 1) { | |
1644 | ||
1645 | system("$cmd \&"); | |
1646 | ||
1647 | # Unless auto = 1, reset so it prompts again | |
1648 | unless ($autoplay == 1) { | |
1649 | $do_exec = 0; | |
1650 | } | |
1651 | } | |
1652 | } | |
1653 | else { | |
1654 | print qq|Mplayer output:\n--\n|; | |
1655 | system("$cmd"); | |
1656 | } | |
1657 | } | |
1658 | else { | |
1659 | print qq| [$pretend_label]: no exec ...\n\n|; | |
1660 | unless ($repeat == 1) { | |
1661 | exit; | |
1662 | } | |
1663 | } | |
1664 | if ($very_verbose == 1) { | |
1665 | print qq|\n [$exec_label]: $cmd\n\n|; | |
1666 | } | |
1667 | return; | |
1668 | } | |
1669 | ||
1670 | sub GetRelatedImages { | |
1671 | ||
1672 | # Find Associated Images; | |
1673 | ||
1674 | if ($debug == 1) { | |
1675 | print qq| <Enter Sub> GetRelatedImages for "$main::generic_name" in $main::location\n|; | |
1676 | } | |
1677 | ||
1678 | # Reset; | |
1679 | our @Related_images=""; | |
1680 | our $path_to_image; | |
1681 | ||
1682 | my $image; | |
1683 | my $image_file=""; | |
1684 | my $images_found=""; | |
1685 | my $generic_name=$main::generic_name; | |
1686 | ||
1687 | # strip non-word characters into regex, strip "part X" for multi-part video labels | |
1688 | $generic_name =~s/part((\s+)*)(\d+)/\.\*/ig; | |
1689 | $generic_name =~s/(\W+)/\.\*/g; | |
1690 | ||
1691 | # Go through all images we found and find matches for the selected video, set them aside | |
1692 | foreach my $item (@main::Images) { | |
1693 | ||
1694 | chomp $item; | |
1695 | ||
1696 | if ($item=~/$generic_name/g) { | |
1697 | push (@Related_images,$item); | |
1698 | ||
1699 | } | |
1700 | } | |
1701 | ||
1702 | # If we have some related image results, make use of them - but don't pass to OpenImage yet | |
1703 | unless ($#Related_images == -1) { | |
1704 | my $X; | |
1705 | foreach my $image (@Related_images) { | |
1706 | $X++; | |
1707 | chomp $image; | |
1708 | ||
1709 | my @image_path=split(/\//,$image); | |
1710 | $image_file=$image_path[$#image_path]; | |
1711 | ||
1712 | unless ($image =~/^$/) { | |
1713 | ||
1714 | if ($use_colors == 1) { | |
1715 | $image_file = $colortag_imgname . $image_file . $colortag_default; | |
1716 | } | |
1717 | print qq| [IMAGE]: $image_file\n|; | |
1718 | ||
1719 | # Format image file list correct, by adding space if it's the last one | |
1720 | if ($#Related_images < $X) { | |
1721 | print qq|\n|; | |
1722 | } | |
1723 | } | |
1724 | } | |
1725 | ||
1726 | } | |
1727 | else { | |
1728 | print qq| [NOTICE]: No images found for "$generic_name"\n\n|; | |
1729 | } | |
1730 | return; | |
1731 | } | |
1732 | ||
1733 | sub OpenImage { | |
1734 | ||
1735 | # Open Associated Image(s) | |
1736 | ||
1737 | chomp(my $imagepath=$_[0]); | |
1738 | $imagepath=&PrepPath("$imagepath"); | |
1739 | ||
1740 | my $image_command = "$image_viewer $imagepath 1>/dev/null 2>&1"; | |
1741 | ||
1742 | my @image_path=split(/\//,$imagepath); | |
1743 | my $image_name=$image_path[$#image_path]; | |
1744 | ||
1745 | if ($debug == 1) { | |
1746 | print qq| <OpenImageExec>: "$image_command"\n\n|; | |
1747 | } | |
1748 | ||
1749 | unless (($main::user_ok eq 'n') || ($imagepath =~/^$/)) { | |
1750 | system("$image_command \&"); | |
1751 | } | |
1752 | ||
1753 | return; | |
1754 | } | |
1755 | ||
1756 | sub PromptUser { | |
1757 | ||
1758 | # Unless otherwise stated, prompt before blatantly opening a video. | |
1759 | ||
1760 | if ($debug == 1) { | |
1761 | print qq| <PromptUser:>\n|; | |
1762 | } | |
1763 | ||
1764 | my $prompt_msg = "$_[0]"; | |
1765 | ||
1766 | unless ($autoplay == 1) { | |
1767 | ||
1768 | print qq|$prompt_msg [$yes_label/$no_label|; | |
1769 | if ($repeat == 1) { | |
1770 | print $color_bold . qq|/q| . $colortag_default; | |
1771 | } | |
1772 | print qq|] ($yes_label)|; | |
1773 | ||
1774 | chomp($main::user_ok=<STDIN>); | |
1775 | ||
1776 | if ($user_ok =~/^y$/i) { | |
1777 | $do_exec = 1; | |
1778 | #return; | |
1779 | } | |
1780 | elsif ($user_ok eq "") { | |
1781 | $do_exec = 1; | |
1782 | #return; | |
1783 | } | |
1784 | elsif ($user_ok =~/^n$/i) { | |
1785 | print qq|\n [$abort_label]: Not Launching.\n\n|; | |
1786 | #exit; | |
1787 | } | |
1788 | elsif ($user_ok =~/^q$|^quit$|^exit$/) { | |
1789 | print qq|\n [$abort_label]: Aborted.\n\n|; | |
1790 | exit; | |
1791 | } | |
1792 | else { | |
1793 | &PromptUser("$prompt_msg"); | |
1794 | } | |
1795 | ||
1796 | print qq|\n|; | |
1797 | } | |
1798 | } | |
1799 | ||
1800 | sub PrepPath { | |
1801 | ||
1802 | # Sanitize path for command executions | |
1803 | ||
1804 | if ($debug == 1) { | |
1805 | print qq| <PrepPath:> "$_[0]"\n|; | |
1806 | } | |
1807 | ||
1808 | my $esc_path; | |
1809 | chomp($esc_path=$_[0]); | |
1810 | ||
1811 | $esc_path=~s/\ /\\\ /g; | |
1812 | $esc_path=~s/\&/\\&/g; | |
1813 | $esc_path=~s/\[/\\[/g; | |
1814 | $esc_path=~s/\]/\\]/g; | |
1815 | $esc_path=~s/\(/\\(/g; | |
1816 | $esc_path=~s/\)/\\)/g; | |
1817 | $esc_path=~s/\'/\\'/g; | |
1818 | $esc_path=~s/\!/\\!/g; | |
1819 | $esc_path=~s/\;/\\;/g; | |
1820 | return $esc_path; | |
1821 | } | |
1822 | ||
1823 | sub GetStats { | |
1824 | ||
1825 | # Time this scripts execution time | |
1826 | ||
1827 | if (($verbose == 1)||($debug == 1)) { | |
1828 | ||
1829 | my $time = time - $^T; | |
1830 | my $decimal=$time/60; | |
1831 | my $minutes; | |
1832 | my $fraction; | |
1833 | my $time_report; | |
1834 | ($minutes,$fraction)=split(/\./,$decimal); | |
1835 | ||
1836 | # Square off time into minutes, subtract from overall time to get additional seconds | |
1837 | my $min_seconds=($minutes*60); | |
1838 | my $seconds=($time-$min_seconds); | |
1839 | ||
1840 | # If over an hour, break down into additional minutes | |
1841 | if ($minutes >= 60) { | |
1842 | my $decimal2 = $minutes/60; | |
1843 | my $hours; | |
1844 | ($hours,$fraction)=split(/\./,$decimal2); | |
1845 | ||
1846 | my $hour_minutes=($hours*60); | |
1847 | my $extramins=($minutes - $hour_minutes); | |
1848 | ||
1849 | $time_report = qq|$hours hours $extramins minutes $seconds seconds.\n|; | |
1850 | } | |
1851 | elsif ($minutes >= 1) { | |
1852 | $time_report = qq|$minutes minutes $seconds seconds.\n|; | |
1853 | } | |
1854 | else { | |
1855 | $time_report = qq|$seconds seconds.\n|; | |
1856 | } | |
1857 | print qq|$script_name runtime: $time_report|; | |
1858 | } | |
1859 | } | |
1860 | ||
1861 | sub Usage { | |
1862 | ||
1863 | if ($debug == 1) { | |
1864 | print qq| <Enter Sub> Usage\n|; | |
1865 | } | |
1866 | ||
1867 | if ($use_colors == 1) { | |
1868 | $script_name = $color_bold . $script_name . $colortag_default; | |
1869 | } | |
1870 | ||
1871 | print qq| $script_name [options] [dir]\n (v.$version)\n\n|; | |
1872 | print qq| -h\t\tThis Help. \n|; | |
1873 | print qq| -p\t\tPretend Only. No execution.\n|; | |
1874 | print qq| -q\t\tNo Volume. Play Muted.\n|; | |
1875 | print qq| -a\t\tAutoplay. Bypass confirmation prompt.\n|; | |
1876 | print qq| -l\t\tList available videos.\n|; | |
1877 | print qq| -o\t\tSort listing by file modification times.\n|; | |
1878 | print qq| -n [#]\tPlay Nth numbered result. (As numbered by the "-l" option)\n|; | |
1879 | print qq| -e [TERM]\tQuick check against collection and exit. Shorter than '-s -p'\n|; | |
1880 | print qq| -s [TERM]\tSearch files using keywords.\n\t\t ("." = wildcard, "," = expanded search terms)\n|; | |
1881 | print qq| -x [TERM]\tExclude a term from search results.\n|; | |
1882 | print qq| -t [#x]\tOnly list files newer than [Xx]. +X for 'older than' X.\n\t\t x = (d/w/m/y). Ex: 5d / 2w / 1m / 1y\n|; | |
1883 | print qq| -r [#][all]\tRepeat selection process X amount of times. default: $default_repeat\n\t\t Will increment to n+X if starting point specified with -n\n|; | |
1884 | print qq| -i\t\tOpen any images related to selection, if found.\n|; | |
1885 | print qq| -fs\t\tFull Screen.\n|; | |
1886 | print qq| -m\t\tAttach MPlayer output, do not fork to background.\n|; | |
1887 | print qq| -k\t\tKill any existing mplayer instances before starting new ones.\n|; | |
1888 | print qq| -c\t\tToggle \$use_colors on/off.\n|; | |
1889 | print qq| -v\t\tVerbose information about the selected file. (file date)\n|; | |
1890 | print qq| -vv\t\tVery verbose: even more info.\n|; | |
1891 | print qq| --debug\tInclude script execution debug info.\n|; | |
1892 | #print qq| -z\t\tList Every file parsed from storage locations\n|; | |
1893 | ||
1894 | print qq|\n\n Example Usages:\n\n|; | |
1895 | ||
1896 | print qq| Play a random file from the locations set in \@Collections array:\n|; | |
1897 | print qq| (\@Collections = "@Collections")\n|; | |
1898 | print qq|\t$script_name\n\n|; | |
1899 | ||
1900 | print qq| List files and play a random file from another directory:\n|; | |
1901 | print qq|\t$script_name -l ~/Downloads\n\n|; | |
1902 | ||
1903 | print qq| Order listing by mtime, select 3rd video from list:\n|; | |
1904 | print qq|\t$script_name -l -o -n 3\n\n|; | |
1905 | ||
1906 | print qq| Open multiple videos, no prompt. If not given, \$default_repeat = $default_repeat:\n|; | |
1907 | print qq|\t$script_name -r 3 -a\n\n|; | |
1908 | ||
1909 | print qq| List and play $default_repeat videos from the past month, muted, kill any already running:\n|; | |
1910 | print qq|\t$script_name -q -l -t 1m -r -k\n\n|; | |
1911 | ||
1912 | print qq| Starting at first vid, sequential play all videos that match search term:\n|; | |
1913 | print qq|\t$script_name -l -o -s "star wars" -n 1 -r all\n\n|; | |
1914 | ||
1915 | print qq|\n|; | |
1916 | ||
1917 | exit; | |
1918 | } |