#!/usr/bin/perl # Author: Alan J. Pippin # Description: Find videos from a watched dir and move them to the video processing destination directory use File::Copy; use File::Basename; use Getopt::Std; use File::stat; use Time::localtime; use File::Pid; #################################################################################################### # Configuration parameters $mydir = `cd \$(dirname $0) 2>/dev/null; pwd`; chomp($mydir); unshift @INC,("$mydir"); # Default configuration values require "organize_videos.conf"; # Override defaults with local customizations if( -f "$mydir/organize_videos.conf.local") { require "organize_videos.conf.local"; } #################################################################################################### # Sanity check if(! -d $srcpathname) { print "-E- Can't find srcpath: $srcpathname\n"; exit 1; } getopts("hfvt"); sub usage { print "usage: $0 [-v] [-t]\n"; print " -v verbose; print file being moved (to).\n"; print " -f force it to run by ignoring the \$minage setting in organize_videos.conf\n"; print " -t test; print what will happen, but don't do anything\n"; return 1; } # Sanity checks / Option processing if(defined $opt_h) { usage(); exit 1; } # Only one instance of this script running at a time my $pidfile = File::Pid->new({file => "$pid_file", pid => "$$"}); print "pid_file: $pid_file\n" if($opt_v); exit if $pidfile->running(); $pidfile->write(); print "watchpathname: $watchpathname\n" if($opt_v); foreach $watchpath (split(';', $watchpathname)) { if(! -d $watchpath) { print "-E- Can't find watchpath: $watchpath\n"; exit 1; } print "checking $watchpath\n" if($opt_v); # Our srcpathname is actually our dstpathname $new_find_changed_cmd = $find_changed_cmd; $new_find_cmd_with_mkv = $find_cmd_with_mkv; $new_find_changed_cmd =~ s/$srcpathname/$watchpath/g; $new_find_cmd_with_mkv =~ s/$srcpathname/$watchpath/g; $dstpathname = $srcpathname; # Only proceed if no files have changed in the past $cmin minutes $changed_files_found=`$new_find_changed_cmd`; print "finding videos: $new_find_changed_cmd\n" if($opt_v); if(!$opt_f && $changed_files_found) { next; } # Only proceed if there are video files to organize $video_files_found=`$new_find_cmd_with_mkv`; print "finding videos: $new_find_cmd_with_mkv\n" if($opt_v); if(!$video_files_found) { next; } # Print the date system("date"); my $errno = 0; # Move the videos over to the destination path chdir "$watchpath"; print "found: $video_files_found\n" if($opt_v); foreach $file (`$new_find_cmd_with_mkv`) { chomp($file); $srcdir = dirname($file); $file = basename($file); $srcfile = $file; $dstfile = "$dstpathname/$file"; # Make sure srcdir is group writable if(not -w "$srcdir") { print "-W- srcdir is not group writable, can't move videos out of it: $srcdir\n"; next; } # Make sure we have a unique dstfile if($overwrite_dest == 0 && -f "$dstfile") { $video_ext = $srcfile; $video_ext =~ s/.*\.(\S+)$/$1/; $suffix = 0; $newdstfile_base = $dstfile; $newdstfile_base =~ s/\.[^.]*$//; do { $newdstfile = "${newdstfile_base}_${suffix}.${video_ext}"; $suffix++; } while(-f "$newdstfile"); $dstfile = $newdstfile; } print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n"; if(!defined $opt_t) { # Make sure the dstfile doesn't exist, if it does, add a unique number to the end #if(! -f "$dstfile") { $errno=system("mv \"$srcdir/$srcfile\" \"$dstfile\" 2>/dev/null"); if($errno) { print "-E- Error moving srcfile to dstfile: $srcdir/$srcfile -> $dstfile\n"; next; } #} else { # print "-E- Unable to mv $srcdir/$srcfile -> $dstfile because it already exists\n"; #} # Fix the permissions system("chown $owner \"$dstfile\""); system("chgrp $group \"$dstfile\""); system("chmod $mode \"$dstfile\""); } } # Update nextcloud file cache so it knows what files we have moved $watchpath =~ s/$nextcloudbase//g; system("$occ files:scan --path \"$watchpath\" > /dev/null"); } $pidfile->remove(); #print "\n\n";