From 8f3653f68a0e87395eaeeed17cd929adbf72976f Mon Sep 17 00:00:00 2001 From: haha114514 <47912037+haha114514@users.noreply.github.com> Date: Wed, 15 Feb 2023 19:27:40 +1100 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=AE=9A=E4=B9=89B?= =?UTF-8?q?=E7=AB=99CDN=E4=B8=8D=E5=AD=98=E5=9C=A8=EF=BC=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=97=A0=E6=B3=95=E4=B8=8B=E8=BD=BDb=E7=AB=99?= =?UTF-8?q?=E7=9B=B4=E6=92=AD=E7=9A=84BUG=20(#335)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 为YouTube下载增加视频编码和音频编码的选择 * 修复上一版本perfCDN导致无法获取B站直播下载链接的问题 * Add files via upload * Update youtube.py * Update __init__.py * Update CHANGELOG.md * Update bilibili.py * Update bilibili.py --- CHANGELOG.md | 8 +++++++- biliup/__init__.py | 2 +- biliup/plugins/bilibili.py | 25 +++++++++++++------------ biliup/plugins/youtube.py | 12 +++--------- public/config.toml | 10 ++++++---- public/config.yaml | 13 ++++++++----- 6 files changed, 38 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32fc5e7..722c475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,14 @@ - 💡新添加的功能 - 🔧已修复的问题 - ⚠️需要手动操作的更新信息 +- +## 0.4.3 +- 更新时间:2023.02.15 +- 💡为YouTube视频下载增加指定音视频编码的设置。 [@haha114514](https://github.com/haha114514) +- ⚠️上一条由于为Config新增了一些设置,如需使用相关功能请参考最新的config示例添加缺失的部分。 +- 🔧修复上一版本由于新增的哔哩哔哩直播自定义下载CDN导致报错的问题。 [@haha114514](https://github.com/haha114514) -## 0.4.2 +## 0.4.2⚠️⚠️此版本存在重大BUG,导致很多情况下无法录制B站直播,请勿使用。 - 更新时间:2023.02.15 - 💡为YouTube视频下载增加指定封装格式,最大纵向分辨率,最大单视频大小的设置。 [@haha114514](https://github.com/haha114514) - ⚠️上一条由于为Config新增了一些设置,如需使用相关功能请参考最新的config示例添加缺失的部分。 diff --git a/biliup/__init__.py b/biliup/__init__.py index 0e18202..db45bae 100644 --- a/biliup/__init__.py +++ b/biliup/__init__.py @@ -1,7 +1,7 @@ import logging import sys -__version__ = "0.4.2" +__version__ = "0.4.3" LOG_CONF = { 'version': 1, diff --git a/biliup/plugins/bilibili.py b/biliup/plugins/bilibili.py index 056755e..bc2e1cc 100644 --- a/biliup/plugins/bilibili.py +++ b/biliup/plugins/bilibili.py @@ -32,7 +32,7 @@ class Bilibili(DownloadBase): } officialApiHost = "https://api.live.bilibili.com" protocol = config.get('bili_protocol', 'stream') - perfCDN = config.get('bili_perfCDN', 'None') + perfCDN = config.get('bili_perfCDN', '') forceScoure = config.get('bili_forceScoure', False) customApiHost = (lambda a : a if a.startswith(('http://', 'https://')) else 'http://'+a)(config.get('bili_liveapi', officialApiHost).rstrip('/')) s = requests.Session() @@ -53,7 +53,7 @@ class Bilibili(DownloadBase): params['room_id'] = roomInfo['data']['room_info']['room_id'] self.room_title = roomInfo['data']['room_info']['title'] # 当 Cookie 存在,并且自定义APi使用Cookie开关关闭时,仅使用官方 Api - if self.fake_headers['cookie'] and self.customAPI_use_cookie is False: + if config.get('user', {}).get('bili_cookie') and self.customAPI_use_cookie is False: roomPlayInfoUrl = officialApiHost else: roomPlayInfoUrl = customApiHost @@ -74,14 +74,19 @@ class Bilibili(DownloadBase): stream = streams[1] if "hls" in protocol else streams[0] ### 直播开启后需要约 2Min 缓冲时间以提供 Hevc 编码 与 fmp4 封装,故仅使用 Avc 编码 stream_info = stream['format'][0]['codec'][0] + self.raw_stream_url = stream_info['url_info'][0]['host']+stream_info['base_url']+stream_info['url_info'][0]['extra'] for url_info in stream_info['url_info']: - # 默认跳过 p2pCDN + # 跳过p2pCDN if 'mcdn' in url_info['host']: continue - if perfCDN in url_info['extra']: - if forceScoure and "cn-gotcha01" in perfCDN: + # 匹配PerfCDN + if perfCDN and perfCDN in url_info['extra']: + if forceScoure is True and "cn-gotcha01" in perfCDN: stream_info['base_url'] = re.sub(r'\_bluray(?=.*m3u8)', "", stream_info['base_url']) - self.raw_stream_url = url_info['host']+stream_info['base_url']+url_info['extra'] + self.raw_stream_url = url_info['host']+stream_info['base_url']+url_info['extra'] + logger.debug(f"获取到{url_info['host']}节点,找到了prefCDN") + break + self.raw_stream_url = url_info['host']+stream_info['base_url']+url_info['extra'] index = 0 if self.bili_cdn_fallback is True: # 检查直播流是否可用 @@ -92,10 +97,6 @@ class Bilibili(DownloadBase): try: url_info = stream_info['url_info'][index] self.raw_stream_url = url_info['host']+stream_info['base_url']+url_info['extra'] - except Exception: - self.raw_stream_url = None - # 如当前协议无可用直播流,回退到 flv 的首个链接 - if not self.raw_stream_url: - stream_info = streams[0]['format'][0]['codec'][0] - self.raw_stream_url = stream_info['url_info'][0]['host']+stream_info['base_url']+stream_info['url_info'][0]['extra'] + except Exception: # 如之后的节点无可用直播流,回退到 flv 的首个链接 + logger.debug(f"顺序回退尝试失败,回退到 flv 的首个链接{stream_info['url_info'][0]['host']}尝试下载") return True diff --git a/biliup/plugins/youtube.py b/biliup/plugins/youtube.py index a5e6f88..cf34061 100644 --- a/biliup/plugins/youtube.py +++ b/biliup/plugins/youtube.py @@ -8,18 +8,13 @@ from . import logger VALID_URL_BASE = r'https?://(?:(?:www|m)\.)?youtube\.com/(?P.*?)\??(.*?)' -format_dict = { - "webm": ("webm", "webm"), - "mkv": ("webm", "m4a"), - "mp4": ("mp4", "m4a") -} - @Plugin.download(regexp=VALID_URL_BASE) class Youtube(DownloadBase): def __init__(self, fname, url, suffix='webm'): DownloadBase.__init__(self, fname, url, suffix=suffix) self.cookiejarFile = config.get('user', {}).get('youtube_cookie') - self.youtube_format = config.get('youtube_prefer_format','webm') + self.vcodec = config.get('youtube_prefer_vcodec','av01|vp9|avc') + self.acodec = config.get('youtube_prefer_acodec','opus|mp4a') self.resolution = config.get('youtube_max_resolution','4320') self.filesize = config.get('youtube_max_videosize','100G') @@ -55,11 +50,10 @@ class Youtube(DownloadBase): return True def download(self, filename): - video_format, audio_format = format_dict.get(self.youtube_format) try: ydl_opts = { 'outtmpl': filename+ '.%(ext)s', - 'format': f'bestvideo[ext={video_format}][height<={self.resolution}][filesize<{self.filesize}]+bestaudio[ext={audio_format}]/best[height<={self.resolution}]/best', + 'format': f"bestvideo[vcodec~='^({self.vcodec})'][height<={self.resolution}][filesize<{self.filesize}]+bestaudio[acodec~='^({self.acodec})']/best[height<={self.resolution}]/best", 'cookiefile': self.cookiejarFile, # 'proxy': proxyUrl, 'ignoreerrors': True, diff --git a/public/config.toml b/public/config.toml index 2da7252..9239561 100644 --- a/public/config.toml +++ b/public/config.toml @@ -43,10 +43,12 @@ check_sourcecode = 15 #------YouTube------# ### 设置偏好的YouTube下载封装格式 ### 请务必记得安装ffmpeg -### 其中mp4封装为h264视频编码+aac音频编码,一般最高可以下载到1080p的版本; -### mkv封装为vp9/av1视频编码+aac音频编码,视频部分最高可以下载到8k,音频采样率最高44.1khz -### webm封装为vp9/av1视频编码+opus音频编码,一般opus版本音质最高。 -#youtube_prefer_format = "webm" ### 支持mkv, webm, mp4 3种封装后缀。 +### 支持同时添加多个编码,自动优选指定编码格式里最好的画质/音质版本。 +### 视频:其中avc编码最高可以下载到1080p的内容,vp9最高可以下载到4k以及很少部分8k内容,av01画质不是所有视频都有,但是大部分8k视频的8k画质只有av01编码。 +### 音频:其中opus编码最高48KHz采样,mp4a(AAC)最高44.1KHz采样,理论上来说opus音质会更好一些。 +### 如需指定封装格式,请按以下推荐设置。mp4:avc+mp4a;av01+mp4a. mkv:vp9+mp4a,avc+opus. webm:av01+opus;vp9+opus. +#youtube_prefer_vcodec = "av01|vp9|avc" ### 可用av01,vp9,avc +#youtube_prefer_acodec = "opus|mp4a" ### 可用opus,mp4a ### 设置偏好的YouTube下载最高纵向分辨率 ### 最高纵向分辨率,也就是xxxxP.如果youtube_prefer_format指定为mp4,将最高只能下载1080p的视频。 #youtube_max_resolution = "440" diff --git a/public/config.yaml b/public/config.yaml index 0f86000..ebad034 100644 --- a/public/config.yaml +++ b/public/config.yaml @@ -63,12 +63,15 @@ check_sourcecode: 15 #------YouTube------# ### 设置偏好的YouTube下载封装格式 ### 请务必记得安装ffmpeg -### 其中mp4封装为h264视频编码+aac音频编码,一般最高可以下载到1080p的版本; -### mkv封装为vp9/av1视频编码+aac音频编码,视频部分最高可以下载到8k,音频采样率最高44.1khz -### webm封装为vp9/av1视频编码+opus音频编码,一般opus版本音质最高。 -#youtube_prefer_format: "webm" ### 支持mkv, webm, mp4 3种封装后缀。 +### 支持同时添加多个编码,自动优选指定编码格式里最好的画质/音质版本。 +### 视频:其中avc编码最高可以下载到1080p的内容,vp9最高可以下载到4k以及很少部分8k内容,av01画质不是所有视频都有,但是大部分8k视频的8k画质只有av01编码。 +### 音频:其中opus编码最高48KHz采样,mp4a(AAC)最高44.1KHz采样,理论上来说opus音质会更好一些。 +### 如需指定封装格式,请按以下推荐设置。mp4:avc+mp4a;av01+mp4a. mkv:vp9+mp4a,avc+opus. webm:av01+opus;vp9+opus. +#youtube_prefer_vcodec: "av01|vp9|avc" ### 可用av01,vp9,avc +#youtube_prefer_acodec: "opus|mp4a" ### 可用opus,mp4a ### 设置偏好的YouTube下载最高纵向分辨率 -### 最高纵向分辨率,也就是xxxxP.如果youtube_prefer_format指定为mp4,将最高只能下载1080p的视频。 +### 最高纵向分辨率,也就是xxxxP。如果youtube_prefer_vcodec指定AVC,将最高只能下载1080p的视频。 +#youtube_max_videosize: "5G" #youtube_max_resolution: 1440 ### 限制单个视频的最大大小。 ### 注意:此参数优先级高于分辨率设置,并且不包括音频部分的大小,仅仅只是视频部分的大小。