[compat] Implement `compat.imghdr`

Python 3.11 deprecates `imghdr` module
pull/3775/head
pukkandan 3 years ago
parent 7a96d0b39c
commit 5792c950bf
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39

@ -806,7 +806,7 @@ class YoutubeDL:
if self.params.get('logger'): if self.params.get('logger'):
self.params['logger'].error(message) self.params['logger'].error(message)
else: else:
self._write_string(f'{self._bidi_workaround(message)}\n' , self._out_files.error, only_once=only_once) self._write_string(f'{self._bidi_workaround(message)}\n', self._out_files.error, only_once=only_once)
def _send_console_code(self, code): def _send_console_code(self, code):
if compat_os_name == 'nt' or not self._out_files.console: if compat_os_name == 'nt' or not self._out_files.console:

@ -0,0 +1,14 @@
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'),
}
def what(path):
"""Detect format of image (Currently supports jpeg, png, webp only)
Ref: https://github.com/python/cpython/blob/3.10/Lib/imghdr.py
"""
with open(path, 'rb') as f:
head = f.read(12)
return next((type_ for type_, test in tests.items() if test(head)), None)

@ -1,11 +1,11 @@
import base64 import base64
import imghdr
import os import os
import re import re
import subprocess import subprocess
from .common import PostProcessor from .common import PostProcessor
from .ffmpeg import FFmpegPostProcessor, FFmpegThumbnailsConvertorPP from .ffmpeg import FFmpegPostProcessor, FFmpegThumbnailsConvertorPP
from ..compat import imghdr
from ..dependencies import mutagen from ..dependencies import mutagen
from ..utils import ( from ..utils import (
Popen, Popen,

@ -7,7 +7,7 @@ import subprocess
import time import time
from .common import AudioConversionError, PostProcessor from .common import AudioConversionError, PostProcessor
from ..compat import compat_str from ..compat import imghdr
from ..utils import ( from ..utils import (
ISO639Utils, ISO639Utils,
Popen, Popen,
@ -27,6 +27,7 @@ from ..utils import (
traverse_obj, traverse_obj,
variadic, variadic,
write_json_file, write_json_file,
write_string,
) )
EXT_TO_OUT_FORMATS = { EXT_TO_OUT_FORMATS = {
@ -1030,8 +1031,8 @@ class FFmpegSplitChaptersPP(FFmpegPostProcessor):
self.to_screen('Chapter %03d; Destination: %s' % (number, destination)) self.to_screen('Chapter %03d; Destination: %s' % (number, destination))
return ( return (
destination, destination,
['-ss', compat_str(chapter['start_time']), ['-ss', str(chapter['start_time']),
'-t', compat_str(chapter['end_time'] - chapter['start_time'])]) '-t', str(chapter['end_time'] - chapter['start_time'])])
@PostProcessor._restrict_to(images=False) @PostProcessor._restrict_to(images=False)
def run(self, info): def run(self, info):
@ -1059,18 +1060,16 @@ class FFmpegThumbnailsConvertorPP(FFmpegPostProcessor):
super().__init__(downloader) super().__init__(downloader)
self.format = format self.format = format
@staticmethod @classmethod
def is_webp(path): def is_webp(cls, path):
with open(encodeFilename(path), 'rb') as f: write_string(f'DeprecationWarning: {cls.__module__}.{cls.__name__}.is_webp is deprecated')
b = f.read(12) return imghdr.what(path) == 'webp'
return b[0:4] == b'RIFF' and b[8:] == b'WEBP'
def fixup_webp(self, info, idx=-1): def fixup_webp(self, info, idx=-1):
thumbnail_filename = info['thumbnails'][idx]['filepath'] thumbnail_filename = info['thumbnails'][idx]['filepath']
_, thumbnail_ext = os.path.splitext(thumbnail_filename) _, thumbnail_ext = os.path.splitext(thumbnail_filename)
if thumbnail_ext: if thumbnail_ext:
thumbnail_ext = thumbnail_ext[1:].lower() if thumbnail_ext.lower() != '.webp' and imghdr.what(thumbnail_filename) == 'webp':
if thumbnail_ext != 'webp' and self.is_webp(thumbnail_filename):
self.to_screen('Correcting thumbnail "%s" extension to webp' % thumbnail_filename) self.to_screen('Correcting thumbnail "%s" extension to webp' % thumbnail_filename)
webp_filename = replace_extension(thumbnail_filename, 'webp') webp_filename = replace_extension(thumbnail_filename, 'webp')
os.replace(thumbnail_filename, webp_filename) os.replace(thumbnail_filename, webp_filename)

Loading…
Cancel
Save