[compat] Implement compat.imghdr

Python 3.11 deprecates `imghdr` module
This commit is contained in:
pukkandan 2022-05-17 19:39:28 +05:30
parent 7a96d0b39c
commit 5792c950bf
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39
4 changed files with 25 additions and 12 deletions

View File

@ -806,7 +806,7 @@ def to_stderr(self, message, only_once=False):
if self.params.get('logger'):
self.params['logger'].error(message)
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):
if compat_os_name == 'nt' or not self._out_files.console:

14
yt_dlp/compat/imghdr.py Normal file
View File

@ -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)

View File

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

View File

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