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