[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

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 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,

View File

@ -7,7 +7,7 @@
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 @@
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 @@ def _ffmpeg_args_for_chapter(self, number, chapter, info):
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 @@ def __init__(self, downloader=None, format=None):
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)