修复自定义B站CDN不存在,导致无法下载b站直播的BUG (#335)

* 为YouTube下载增加视频编码和音频编码的选择

* 修复上一版本perfCDN导致无法获取B站直播下载链接的问题

* Add files via upload

* Update youtube.py

* Update __init__.py

* Update CHANGELOG.md

* Update bilibili.py

* Update bilibili.py
This commit is contained in:
haha114514 authored and GitHub committed 2023-02-15 08:27:40 +00:00
1 parent 2002ad45c5
commit 8f3653f68a
6 files changed
+38 -32

No files matched your search

+7 -1
View File
@@ -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示例添加缺失的部分。
+1 -1
View File
@@ -1,7 +1,7 @@
import logging
import sys
__version__ = "0.4.2"
__version__ = "0.4.3"
LOG_CONF = {
'version': 1,
+13 -12
View File
@@ -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
+3 -9
View File
@@ -8,18 +8,13 @@ from . import logger
VALID_URL_BASE = r'https?://(?:(?:www|m)\.)?youtube\.com/(?P<id>.*?)\??(.*?)'
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,
+6 -4
View File
@@ -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"
+8 -5
View File
@@ -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
### 限制单个视频的最大大小。
### 注意:此参数优先级高于分辨率设置,并且不包括音频部分的大小,仅仅只是视频部分的大小。