Merge pull request #440 from jgoguen/mp4-ios-compatible

Update MP4 format string for iOS compatibility
pull/449/head
Alex 2024-05-22 23:39:35 +03:00 committed by GitHub
commit 167095b8d7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 32 additions and 13 deletions

View File

@ -2,6 +2,7 @@ import copy
AUDIO_FORMATS = ("m4a", "mp3", "opus", "wav")
def get_format(format: str, quality: str) -> str:
"""
Returns format for download
@ -37,7 +38,13 @@ def get_format(format: str, quality: str) -> str:
vres = f"[height<={quality}]" if quality != "best" else ""
vcombo = vres + vfmt
return f"bestvideo{vcombo}+bestaudio{afmt}/best{vcombo}"
# iOS has strict requirements for video files, requiring h264 or h265
# video codec and aac audio codec in MP4 container. This format string
# attempts to get the fully compatible formats first, then the h264/h265
# video codec with any M4A audio codec (because audio is faster to
# convert if needed), and falls back to getting the best available MP4
# file.
return f"bestvideo[vcodec~='^((he|a)vc|h26[45])']{vres}+bestaudio[acodec=aac]/bestvideo[vcodec~='^((he|a)vc|h26[45])']{vres}+bestaudio{afmt}/bestvideo{vcombo}+bestaudio{afmt}/best{vcombo}"
raise Exception(f"Unkown format {format}")
@ -61,23 +68,35 @@ def get_opts(format: str, quality: str, ytdl_opts: dict) -> dict:
postprocessors = []
if format in AUDIO_FORMATS:
postprocessors.append({
postprocessors.append(
{
"key": "FFmpegExtractAudio",
"preferredcodec": format,
"preferredquality": 0 if quality == "best" else quality,
})
}
)
# Audio formats without thumbnail
if format not in ("wav") and "writethumbnail" not in opts:
opts["writethumbnail"] = True
postprocessors.append({"key": "FFmpegThumbnailsConvertor", "format": "jpg", "when": "before_dl"})
postprocessors.append(
{
"key": "FFmpegThumbnailsConvertor",
"format": "jpg",
"when": "before_dl",
}
)
postprocessors.append({"key": "FFmpegMetadata"})
postprocessors.append({"key": "EmbedThumbnail"})
if format == "thumbnail":
opts["skip_download"] = True
opts["writethumbnail"] = True
postprocessors.append({"key": "FFmpegThumbnailsConvertor", "format": "jpg", "when": "before_dl"})
postprocessors.append(
{"key": "FFmpegThumbnailsConvertor", "format": "jpg", "when": "before_dl"}
)
opts["postprocessors"] = postprocessors + (opts["postprocessors"] if "postprocessors" in opts else [])
opts["postprocessors"] = postprocessors + (
opts["postprocessors"] if "postprocessors" in opts else []
)
return opts