Paranoja z tymi datami!

Posted on Sat 22 May 2021 in Linux, Tips text {sed, awk, perl, etc.} • 2 min read

Pliki video mogą zawierać wśród swoich metadanych datę modyfikacji. Dla przykładu: pobierając za pomocą narzędzia youtube-dl klip video z YouTube, można tę metadaną zapisać. Robi się to tak:

youtube-dl --add-metadata  -o "%(id)s.%(ext)s" https://youtu.be/NCEOPRuiyQo

Zapisanie to jedna sprawa ale odczytanie to już nie takie "hop! siup!".

Można użyć programu o nazwie Mediainfo:

mediainfo -- --Inform="General;%File_Modified_Date_Local%" "NCEOPRuiyQo"
I dowiadujemy się, że plik został wrzucony na YT: 2019-12-17 23:41:09
Ale, niestety, jazda zaczyna się gdy plik ma w nazwie nieciekawe znaki, np. myślniki, a zdarza się to w przypadku YT dość często.
Konia z rzędem temu komu uda się odczytać taki plik, escaping za pomocą opcji "--" nie działa, podobnie jak escapowanie backslashami. Poniżej przykład z życia:
mediainfo --Inform="General;%File_Modified_Date_Local%" "--uGAxPFHVk.mp4"

Ok, no to może spróbujmy czegoś innego. FFmpeg to prawdziwy szwajcarski scyzoryk jeśli chodzi o zabawę z plikami video, do pakietu dołączony jest program ffprobe:

ffprobe -loglevel 0 -print_format json -show_format -show_streams NCEOPRuiyQo.mp4

Wprawdzie czyta pliki z nietypowymi znakami w nazwie ale, NIESTETY, zamiast pełnej daty ISO pokazuje tylko rok, miesiąc i dzień. A nam równie mocno zależy na godzinach, minutach i sekundach.

Kur...dybanek!

Ok, weźmy exiftool:

exiftool  -s -time:FileModifyDate NCEOPRuiyQo.mp4
FileModifyDate                  : 2019:12:17 23:41:09+01:00

Jest! Cała data! Hurrra!

No, to bierzemy się za wycięcie samej daty:

exiftool  -s -time:FileModifyDate NCEOPRuiyQo.mp4 | cut -d: -f2
2019

Kur...dybanek!

Format outputu w tych narzędziach zależy od widzimisię autora, w przypadku exiftoola na szczęścia są przełączniki, które pozwalają na ustawienie innego znaku rozdzielającego:

 exiftool  -t -time:FileModifyDate NCEOPRuiyQo.mp4 | cut -d"   " -f2| sed 's/+.*$//'
2019:12:17 23:41:09
~$ DATA=$(exiftool  -t -time:FileModifyDate NCEOPRuiyQo.mp4 | cut -d"    " -f2 | sed 's/+.*$//')
~$ echo $DATA
~$ 2019:12:17 23:41:09

Aha, i co bardzo ważne, exiftool radzi sobie z dziwnymi plikami, trzeba tylko użyć przełącznika "--" (end of options) w tej kolejności (jak nazwa sugeruje):

exiftool  -s -time:FileModifyDate -- uGAxPFHVk.mp4