X-Git-Url: http://git.pippins.net/embedvideo/.git/?a=blobdiff_plain;f=make_mkv;fp=make_mkv;h=f0481165d5a0dde18e56d347cb8952ad0d2e921b;hb=aea4af9869a2086c5085afb34a1bd790940c8b7d;hp=bf983252ee2d5c6c442265f67807c872f5b0202d;hpb=2675e038e4a9ef7bf5cee7ff32a77a6f31799965;p=videoscripts%2F.git diff --git a/make_mkv b/make_mkv index bf98325..f048116 100755 --- a/make_mkv +++ b/make_mkv @@ -17,6 +17,10 @@ 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 = DateTime::Format::Strptime->new(pattern=>'%Y-%m-%dT%H:%M:%S', time_zone => 'UTC', on_error => 'croak'); #################################################################################################### # Configuration parameters @@ -66,7 +70,15 @@ 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}'`; + if($creation_time) { + my $date_taken = $ffmpeg_time_format->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 +203,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) { @@ -273,7 +289,15 @@ 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}'`; + if($creation_time) { + my $date_taken = $ffmpeg_time_format->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 +333,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) {