Fixed various bugs in video copy and merge scripts
[videoscripts/.git] / merge_videos_by_day
index 146ac84bad6b8c38187ad78fc1a0ca96cdabc24f..193a7bdf32da50c262e3e686a0bab9df9f3621dd 100755 (executable)
@@ -7,6 +7,11 @@ use File::Basename;
 use Getopt::Std;
 use File::stat;
 use Time::localtime;
+use DateTime::Format::Strptime qw( );
+
+# Set our ffmpeg creation_time format
+$ffmpeg_time_format = DateTime::Format::Strptime->new(pattern=>'%Y-%m-%dT%H:%M:%S', time_zone => 'UTC', on_error => 'croak');
+$ctime_format = DateTime::Format::Strptime->new(pattern=>'%a %b %d %H:%M:%S %Y', time_zone => 'local', on_error => 'croak');
 
 # Early command line options processing
 getopts("qzkh:tvs:");
@@ -96,12 +101,28 @@ foreach $file (sort `$find_cmd`) {
     if($srcfile =~ /.hb.mp4/) { next; }
 
     print "Found video: srcdir: $srcdir srcfile: $srcfile srcext: $srcext dstext: $ext\n" if($opt_v);
-            
-    # 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);
-    
+
+    # Make a note of the month, year, and day this video was taken
+    $creation_time = `$ffmpeg -i "$srcdir/$srcfile" 2>&1 | grep "creation_time" | head -n 1 | awk '{print \$3}'`;
+    if($creation_time) {
+       $date_taken = $ffmpeg_time_format->parse_datetime($creation_time);
+    } else {
+       # From the modification time of the file since we couldn't find it in the video file
+       $date_modified = ctime(stat("$srcdir/$srcfile")->mtime);
+    }
+
+    # Get the date taken from the ffmpeg creation_time
+    if(!$merge_by_modification_time && $date_taken) {
+       $date_taken->set_time_zone('local');
+       $year = $date_taken->year;
+       $month = sprintf("%02d",$date_taken->month);
+       $day = sprintf("%02d",$date_taken->day);
+       $monthnum = sprintf("%02d",$date_taken->month);
+       $monthname = lc($month2monthname{$month});
+       #print "date_taken: $year-$month-$day ".$date_taken->hour.":".$date_taken->minute.":".$date_taken->second." ".$date_taken->time_zone."\n";
+    }
     # Get the date taken from the filename
-    if(!$merge_by_modification_date && $srcfile =~ /^(\d\d\d\d)-(\d\d)-(\d\d)/) {
+    elsif(!$merge_by_modification_date && $srcfile =~ /^(\d\d\d\d)-(\d\d)-(\d\d)/) {
        $year = $1;
        $month = $2;
        $day = sprintf("%02d",$3);
@@ -124,7 +145,7 @@ foreach $file (sort `$find_cmd`) {
        $monthname = lc($month2monthname{$month});
     }
     # Get the date taken from the modification time
-    elsif($date_taken =~ /\S+\s+(\S+)\s+(\d+)\s+\S+\s+(\d+)/) {
+    elsif($date_modified =~ /\S+\s+(\S+)\s+(\d+)\s+\S+\s+(\d+)/) {
        $year = $3;
        $month = $1;
        $day = sprintf("%02d",$2);