From 5792c950bfd9f8b6730659b3046b41c1aea64c98 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Tue, 17 May 2022 19:39:28 +0530 Subject: [PATCH] [compat] Implement `compat.imghdr` Python 3.11 deprecates `imghdr` module --- yt_dlp/YoutubeDL.py | 2 +- yt_dlp/compat/imghdr.py | 14 ++++++++++++++ yt_dlp/postprocessor/embedthumbnail.py | 2 +- yt_dlp/postprocessor/ffmpeg.py | 19 +++++++++---------- 4 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 yt_dlp/compat/imghdr.py diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index c9de2437d..d1094a01b 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -806,7 +806,7 @@ class YoutubeDL: 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: diff --git a/yt_dlp/compat/imghdr.py b/yt_dlp/compat/imghdr.py new file mode 100644 index 000000000..734b0d876 --- /dev/null +++ b/yt_dlp/compat/imghdr.py @@ -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) diff --git a/yt_dlp/postprocessor/embedthumbnail.py b/yt_dlp/postprocessor/embedthumbnail.py index d36e0008e..e031d344f 100644 --- a/yt_dlp/postprocessor/embedthumbnail.py +++ b/yt_dlp/postprocessor/embedthumbnail.py @@ -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, diff --git a/yt_dlp/postprocessor/ffmpeg.py b/yt_dlp/postprocessor/ffmpeg.py index d1d8e1687..09eb33b8d 100644 --- a/yt_dlp/postprocessor/ffmpeg.py +++ b/yt_dlp/postprocessor/ffmpeg.py @@ -7,7 +7,7 @@ import subprocess 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 @@ from ..utils import ( traverse_obj, variadic, write_json_file, + write_string, ) EXT_TO_OUT_FORMATS = { @@ -1030,8 +1031,8 @@ class FFmpegSplitChaptersPP(FFmpegPostProcessor): 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 @@ class FFmpegThumbnailsConvertorPP(FFmpegPostProcessor): 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)