Set output file mtime to match embedded capture time
Some tools (Synology Photos, for videos) key off filesystem mtime rather than parsing QuickTime metadata for the capture date, so an otherwise-correct output file would sort/date wrong there. Stamp the output's mtime from the same clip whose metadata got embedded (--metadata-from) after encoding.
This commit is contained in:
@@ -31,6 +31,9 @@ This script:
|
|||||||
with a plain stream copy) and concatenates everything into one file.
|
with a plain stream copy) and concatenates everything into one file.
|
||||||
5. Carries over the original container metadata (GPS, device info, creation
|
5. Carries over the original container metadata (GPS, device info, creation
|
||||||
time, Live Photo identifiers) from one of the source clips.
|
time, Live Photo identifiers) from one of the source clips.
|
||||||
|
6. Sets the output file's filesystem modification time to match that same
|
||||||
|
capture time — some tools (e.g. Synology Photos, for videos) sort/date
|
||||||
|
by file mtime instead of parsing embedded metadata.
|
||||||
|
|
||||||
Audio stays uncompressed PCM throughout, so it never loses quality. Video
|
Audio stays uncompressed PCM throughout, so it never loses quality. Video
|
||||||
quality defaults to a bitrate slightly above the source clips' own bitrate
|
quality defaults to a bitrate slightly above the source clips' own bitrate
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ Requirements:
|
|||||||
detects clip overlap): pip install --user numpy
|
detects clip overlap): pip install --user numpy
|
||||||
"""
|
"""
|
||||||
import argparse
|
import argparse
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
@@ -365,6 +366,17 @@ def main():
|
|||||||
|
|
||||||
print(f"Encoding seamless, deduplicated output -> {output}", file=sys.stderr)
|
print(f"Encoding seamless, deduplicated output -> {output}", file=sys.stderr)
|
||||||
subprocess.run(cmd, check=True)
|
subprocess.run(cmd, check=True)
|
||||||
|
|
||||||
|
creation_dt = fetch_creation_time(clips[args.metadata_from])
|
||||||
|
if creation_dt is not None:
|
||||||
|
ts = creation_dt.timestamp()
|
||||||
|
os.utime(output, (ts, ts))
|
||||||
|
print(f"Set file mtime to {creation_dt.isoformat()} (matches embedded metadata, "
|
||||||
|
f"so apps that key off filesystem time instead of parsing video metadata "
|
||||||
|
f"still sort/date it correctly)", file=sys.stderr)
|
||||||
|
else:
|
||||||
|
print("warning: couldn't determine source creation time; leaving file mtime as-is", file=sys.stderr)
|
||||||
|
|
||||||
print(f"Done: {output}", file=sys.stderr)
|
print(f"Done: {output}", file=sys.stderr)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user