Various changes/updates
[videoscripts/.git] / organize_videos
diff --git a/organize_videos b/organize_videos
new file mode 100755 (executable)
index 0000000..c606da3
--- /dev/null
@@ -0,0 +1,188 @@
+#!/usr/bin/perl
+
+use File::Copy;
+use File::Basename;
+use Getopt::Std;
+use File::stat;
+use Time::localtime;
+
+# Configuration parameters
+my $srcpathname = "/naspool/pictures/New Photos"; # Path to look for photos to move from
+my $dstpathname = "/naspool/videos/HomeVideos"; # Path to move the photos to
+my $merge_videos_by_day = "/naspool/videos/bin/merge_videos_by_day";
+my $minage = "+10"; # Files must be older than X minutes to move
+my $owner = "ajp"; # The owner of the files after they are moved
+my $group = "pip"; # The group of the files after they are moved
+my $mode = "664"; # The mode to set on each file after they are moved
+my $find_cmd = "find \"$srcpathname/\" -cmin $minage -a \\( -iregex \".*\.mov\" -o -iregex \".*\.3gp\" -o -iregex \".*\.mp4\" -o -iregex \".*\.mts\" -o -iregex \".*\.mkv\" \\)";
+
+# Sanity check
+if(! -d $srcpathname) { print "-E- Can't find srcpath: $srcpathname\n"; exit 1; }
+if(! -d $dstpathname) { print "-E- Can't find dstpath: $dstpathname\n"; exit 1; }
+if(! -x $merge_videos_by_day) { print "-E- Can't find required script: $merge_videos_by_day\n"; exit 1; }
+
+my %monthname2month = (
+                      "Jan" => "01",
+                      "Feb" => "02",
+                      "Mar" => "03",
+                      "Apr" => "04",
+                      "May" => "05",
+                      "Jun" => "06",
+                      "Jul" => "07",
+                      "Aug" => "08",
+                      "Sep" => "09",
+                      "Oct" => "10",
+                      "Nov" => "11",
+                      "Dec" => "12"
+                      );
+
+my %month2monthname = (
+                      "01" => "Jan",
+                      "02" => "Feb",
+                      "03" => "Mar",
+                      "04" => "Apr",
+                      "05" => "May",
+                      "06" => "Jun",
+                      "07" => "Jul",
+                      "08" => "Aug",
+                      "09" => "Sep",
+                      "10" => "Oct",
+                      "11" => "Nov",
+                      "12" => "Dec"
+                      );
+
+getopts("htv");
+
+sub usage {
+    print "usage: $0 [-v] [-t]\n";
+    print "   -v = verbose; print file being moved (to)\n";
+    print "   -t = test; print what will happen, but don't do anything\n";
+    return 1;
+}
+
+sub is_folder_empty {
+    my $dirname = shift;
+    opendir(my $dh, $dirname) or die "Not a directory";
+    return scalar(grep { $_ ne "." && $_ ne ".." } readdir($dh)) == 0;
+}
+
+if(defined $opt_h) { usage(); exit 1; }
+
+# Only proceed if there are video files to organize
+$video_files_found=`$find_cmd`;
+if(!$video_files_found) { exit 0; }
+
+# Only one instance of this script running at a time
+use File::Pid;
+my $pidfile = File::Pid->new({file => "/tmp/organize_videos.pid"});
+exit if $pidfile->running();
+$pidfile->write();
+
+# Print the date
+system("date");
+
+# Merge videos prior to copying them over to the destination path
+my $errno = 0;
+if(defined $opt_t) { 
+    $errno=system("$merge_videos_by_day -s \"$srcpathname\" -t");
+} else {
+    $errno=system("$merge_videos_by_day -s \"$srcpathname\"");
+}
+if($errno > 0) { $errno = $errno - 255; }
+if($errno) { die "-E- $merge_videos_by_day encountered some errors with exit code $errno\n"; }
+
+# Copy the videos over to the destination path
+chdir "$srcpathname";
+print "$find_cmd\n" if($opt_v);
+foreach $file (`$find_cmd`) {
+
+    chomp($file);
+    $srcdir = dirname($file);
+    $file = basename($file);
+    $srcfile = $file;
+    $ext = $file; $ext =~ s/.*\.(\S+)$/$1/; $ext = lc($ext);
+    
+    print "Found movie: srcdir: $srcdir srcfile: $srcfile ext: $ext\n" if($opt_v);
+
+    # Throw out files not in the current srcpath
+    if((! -f "$srcfile") && (! -f "$srcdir/$srcfile")) { next; }
+    
+    # Change all spaces to underscores in the filename
+    #$srcfile =~ s/ /_/g;
+        
+    # Make a note of the month, year, and day this video was taken (from the modification time of the file)
+    $date_taken = ctime(stat("$srcdir/$srcfile")->mtime);
+
+    # Get the date taken from the filename
+    if($srcfile =~ /^(\d+)-(\d+)-(\d+)/) {
+       $year = $1;
+       $month = $2;
+       $day = sprintf("%02d",$3);
+       $monthnum = $month;
+       $monthname = lc($month2monthname{$month});
+    }
+    # Get the date taken from the modification time
+    elsif($date_taken =~ /\S+\s+(\S+)\s+(\d+)\s+\S+\s+(\d+)/) {
+       $year = $3;
+       $month = $1;
+       $day = sprintf("%02d",$2);
+       $monthnum = $monthname2month{$month};
+       $monthname = lc($month2monthname{$month});
+    } else {
+       print "-E- Unable to parse year and month from this file: $srcdir/$srcfile\n";
+       next;
+    }
+
+    # We are ready to pick a destination folder to put the picture in
+    $dstdir = $dstpathname . "/" . $year;
+    $dstfile = $dstdir . "/" . $year . "-" . $monthnum . "-" . $day;
+
+    # Check for duplicate filenames at the destination
+    $newfile = $dstfile . "." . "000";
+    if(-e "$newfile.$ext") {
+       foreach $i ('001' .. '999') {
+           $newfile = $dstfile . "." . $i;
+           if(! -e "$newfile.$ext") { last; }
+       }
+       $dstfile = $newfile;
+    }
+    $dstfile = "$newfile.$ext";
+
+    if(defined $opt_t) {
+       print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n";
+    } else {
+       # Make sure the destination directories exist
+       $errno=system("mkdir -p \"$dstdir\"");
+       if($errno) { print "-E- Error creating dstdir: $dstdir\n"; next; }
+       # Perform the move operation from $srcdir/$srcfile -> $dstfile
+       if($opt_v) { print "-> Moving \"$srcdir/$srcfile\" to \"$dstfile\"\n"; }
+       # Make sure the dstfile doesn't exist, if it does, don't do the move
+       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 {
+           if($opt_v) { print "-> Skipping \"$srcdir/$srcfile\". Destfile \"$dstfile\" already exists.\n"; }
+       }
+       # Fix the permissions
+       system("chown $owner \"$dstfile\"");
+       system("chgrp $group \"$dstfile\"");
+       system("chmod $mode \"$dstfile\"");
+    }
+
+    # Check to see if there is an empty sub directory to remove
+    if(($srcdir ne $srcpathname) && ($srcpathname ne ".")) { 
+      if(is_folder_empty($srcdir)) { 
+         print "-> Subdir detected for videos ($srcdir != $srcpathname)\n" if($opt_v);
+         if(! defined $opt_t) { 
+             $tmpdir=`tempfile`;
+             system("rm $tmpdir");
+             system("mv \"$srcdir\" $tmpdir > /dev/null 2>/dev/null");
+             print "-> Moved empty subdir $srcdir to $tmpdir\n" if($opt_v);
+         }
+      }
+    }
+}
+
+$pidfile->remove();
+
+print "\n\n";