mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-09-01 03:56:21 +02:00
[pp/embedthumbnail] Fix postprocessor (#10248)
* [compat] Improve `imghdr.what` detection * [pp/embedthumbnail] Improve imghdr fail message * [pp/embedthumbnail] Fix AtomicParsley error handling Authored by: Grub4K
This commit is contained in:
parent
0953209a85
commit
f2a4ea1794
@ -1,16 +1,22 @@
|
|||||||
tests = {
|
|
||||||
'webp': lambda h: h[0:4] == b'RIFF' and h[8:] == b'WEBP',
|
|
||||||
'png': lambda h: h[:8] == b'\211PNG\r\n\032\n',
|
|
||||||
'jpeg': lambda h: h[6:10] in (b'JFIF', b'Exif'),
|
|
||||||
'gif': lambda h: h[:6] in (b'GIF87a', b'GIF89a'),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def what(file=None, h=None):
|
def what(file=None, h=None):
|
||||||
"""Detect format of image (Currently supports jpeg, png, webp, gif only)
|
"""Detect format of image (Currently supports jpeg, png, webp, gif only)
|
||||||
Ref: https://github.com/python/cpython/blob/3.10/Lib/imghdr.py
|
Ref: https://github.com/python/cpython/blob/3.11/Lib/imghdr.py
|
||||||
|
Ref: https://www.w3.org/Graphics/JPEG/itu-t81.pdf
|
||||||
"""
|
"""
|
||||||
if h is None:
|
if h is None:
|
||||||
with open(file, 'rb') as f:
|
with open(file, 'rb') as f:
|
||||||
h = f.read(12)
|
h = f.read(12)
|
||||||
return next((type_ for type_, test in tests.items() if test(h)), None)
|
|
||||||
|
if h.startswith(b'RIFF') and h.startswith(b'WEBP', 8):
|
||||||
|
return 'webp'
|
||||||
|
|
||||||
|
if h.startswith(b'\x89PNG'):
|
||||||
|
return 'png'
|
||||||
|
|
||||||
|
if h.startswith(b'\xFF\xD8\xFF'):
|
||||||
|
return 'jpeg'
|
||||||
|
|
||||||
|
if h.startswith(b'GIF'):
|
||||||
|
return 'gif'
|
||||||
|
|
||||||
|
return None
|
||||||
|
@ -119,14 +119,21 @@ def run(self, info):
|
|||||||
if not mutagen or prefer_atomicparsley:
|
if not mutagen or prefer_atomicparsley:
|
||||||
success = False
|
success = False
|
||||||
else:
|
else:
|
||||||
|
self._report_run('mutagen', filename)
|
||||||
|
f = {'jpeg': MP4Cover.FORMAT_JPEG, 'png': MP4Cover.FORMAT_PNG}
|
||||||
try:
|
try:
|
||||||
self._report_run('mutagen', filename)
|
with open(thumbnail_filename, 'rb') as thumbfile:
|
||||||
|
thumb_data = thumbfile.read()
|
||||||
|
|
||||||
|
type_ = imghdr.what(h=thumb_data)
|
||||||
|
if not type_:
|
||||||
|
raise ValueError('could not determine image type')
|
||||||
|
elif type_ not in f:
|
||||||
|
raise ValueError(f'incompatible image type: {type_}')
|
||||||
|
|
||||||
meta = MP4(filename)
|
meta = MP4(filename)
|
||||||
# NOTE: the 'covr' atom is a non-standard MPEG-4 atom,
|
# NOTE: the 'covr' atom is a non-standard MPEG-4 atom,
|
||||||
# Apple iTunes 'M4A' files include the 'moov.udta.meta.ilst' atom.
|
# Apple iTunes 'M4A' files include the 'moov.udta.meta.ilst' atom.
|
||||||
f = {'jpeg': MP4Cover.FORMAT_JPEG, 'png': MP4Cover.FORMAT_PNG}[imghdr.what(thumbnail_filename)]
|
|
||||||
with open(thumbnail_filename, 'rb') as thumbfile:
|
|
||||||
thumb_data = thumbfile.read()
|
|
||||||
meta.tags['covr'] = [MP4Cover(data=thumb_data, imageformat=f)]
|
meta.tags['covr'] = [MP4Cover(data=thumb_data, imageformat=f)]
|
||||||
meta.save()
|
meta.save()
|
||||||
temp_filename = filename
|
temp_filename = filename
|
||||||
@ -160,9 +167,10 @@ def run(self, info):
|
|||||||
stdout, stderr, returncode = Popen.run(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
stdout, stderr, returncode = Popen.run(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
if returncode:
|
if returncode:
|
||||||
self.report_warning(f'Unable to embed thumbnails using AtomicParsley; {stderr.strip()}')
|
self.report_warning(f'Unable to embed thumbnails using AtomicParsley; {stderr.strip()}')
|
||||||
|
success = False
|
||||||
# for formats that don't support thumbnails (like 3gp) AtomicParsley
|
# for formats that don't support thumbnails (like 3gp) AtomicParsley
|
||||||
# won't create to the temporary file
|
# won't create to the temporary file
|
||||||
if 'No changes' in stdout:
|
elif 'No changes' in stdout:
|
||||||
self.report_warning('The file format doesn\'t support embedding a thumbnail')
|
self.report_warning('The file format doesn\'t support embedding a thumbnail')
|
||||||
success = False
|
success = False
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user