Updated for Ubuntu 22.04. Also fixed merge videos cmin check
[videoscripts/.git] / make_mkv
index bf983252ee2d5c6c442265f67807c872f5b0202d..ac85eab8a48cdfa444ac0bfd9925c78e3ab839c4 100755 (executable)
--- a/make_mkv
+++ b/make_mkv
@@ -17,6 +17,11 @@ use Data::Dumper;
 use DateTime;
 use DateTime::Duration;
 use DateTime::Format::Duration;
+use DateTime::Format::Strptime qw( );
+
+# Set our ffmpeg creation_time format
+$ffmpeg_time_format_utc = DateTime::Format::Strptime->new(pattern=>'%Y-%m-%dT%H:%M:%S', time_zone => 'UTC', on_error => 'croak');
+$ffmpeg_time_format_local = DateTime::Format::Strptime->new(pattern=>'%Y-%m-%dT%H:%M:%S', time_zone => 'local', on_error => 'croak');
 
 ####################################################################################################
 # Configuration parameters
@@ -66,7 +71,19 @@ sub epoch_to_date {
 my %videos;
 foreach $video (split(/,/, $opt_i)) {
     if(! -r "$video") { die "-E- Unable to read input video file: $video\n"; }
-    my $mtime_epoch = stat("$video")->mtime;
+    my $mtime_epoch = 0;
+    my $creation_time = `$ffmpeg -i "$video" 2>&1 | grep "creation_time" | head -n 1 | awk '{print \$3}'`;
+    my $brands = `$ffmpeg -i "$video" 2>&1 | grep "compatible_brands" | tail -n 1`; chomp($brands);
+    if($creation_time) {
+       my $date_taken = $ffmpeg_time_format_utc->parse_datetime($creation_time);
+       if ($brands && $brands =~ /$local_tz_brands/) {
+           $date_taken = $ffmpeg_time_format_local->parse_datetime($creation_time);
+       }
+       $date_taken->set_time_zone('local');
+       $mtime_epoch = $date_taken->epoch;
+    } else {
+       $mtime_epoch = stat("$video")->mtime;
+    }
     my $mdate = epoch_to_date($mtime_epoch);
     $videos{$video} = $mtime_epoch;
 }
@@ -191,6 +208,10 @@ foreach my $video (sort{$videos{$a} <=> $videos{$b}} keys %videos) {
                    unlink "$video_mp4";
                    die "-E- handbrake encountered some errors with exit code $errno\n";
                }
+               # Restore the metadata from the original video to the intermediate video to preserve the creation_time of the original video metadata in it
+               `$ffmpeg -i \"$video\" -i \"$video_mp4\" -map 1 -map_metadata 0 -c copy -movflags use_metadata_tags \"$video_mp4.fixed.mp4\" >> \"$tmpfile\" 2>&1`;
+               $errno=system("mv \"$video_mp4.fixed.mp4\" \"$video_mp4\" 2>/dev/null");
+               if($errno) { print "-E- Error moving fixed metadata video back to dstfile: $video_mp4.fixed.mp4 -> $video_mp4\n"; }
            }
        } else {
            if($no_recompress) { 
@@ -257,7 +278,7 @@ if($opt_v) {
 # 3) Create a chapter file for each destination video file
 
 # tmp chapter file used by handbrake when creating mkv, but remove the 0 byte file it creates, we'll create it if we need it
-my $chapter_file = `tempfile`; chomp($chapter_file); unlink "$chapter_file";
+my $chapter_file = `mktemp`; chomp($chapter_file); unlink "$chapter_file";
 
 foreach my $key (keys %merge_videos) {   
     # Create the chapters file for each output mkv file.
@@ -273,7 +294,19 @@ foreach my $key (keys %merge_videos) {
        my $hour = 0;
        my $min  = 5;
        my $sec  = 0;
-       my $mtime_epoch = stat("$video")->mtime;
+       my $mtime_epoch = 0;
+       my $creation_time = `$ffmpeg -i "$video" 2>&1 | grep "creation_time" | head -n 1 | awk '{print \$3}'`;
+       my $brands = `$ffmpeg -i "$video" 2>&1 | grep "compatible_brands" | tail -n 1`; chomp($brands);
+       if($creation_time) {
+            my $date_taken = $ffmpeg_time_format_utc->parse_datetime($creation_time);
+            if ($brands && $brands =~ /$local_tz_brands/) {
+                $date_taken = $ffmpeg_time_format_local->parse_datetime($creation_time);
+            }
+           $date_taken->set_time_zone('local');
+           $mtime_epoch = $date_taken->epoch;
+       } else {
+           $mtime_epoch = stat("$video")->mtime;
+       }
        my $mdate = epoch_to_date($mtime_epoch);
        my $duration = `$ffmpeg -i "$video" 2>&1 | grep Duration`;
        if($duration =~ /Duration: (\d+):(\d+):(\d+)\.(\d+)/) {
@@ -309,7 +342,7 @@ foreach my $key (keys %merge_videos) {
     }
     print "\n$merge_cmd\n";
     if(! defined $opt_s) {
-       if(-f "$opt_o.$key.mkv") { die "-E- Output video file $opt_o already exists. This is unexpected for key $key!"; }
+       #if(-f "$opt_o.$key.mkv") { die "-E- Output video file $opt_o already exists. This is unexpected for key $key!"; }
        my $errno = system("$merge_cmd");
        $errno = $errno >> 8;
        if($errno > 1) {