修复自定义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:
1 parent
2002ad45c5
commit
8f3653f68a
6 files changed
+38
-32
No files matched your search
+7
-1
@@ -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
@@ -1,7 +1,7 @@
|
||||
import logging
|
||||
import sys
|
||||
|
||||
__version__ = "0.4.2"
|
||||
__version__ = "0.4.3"
|
||||
|
||||
LOG_CONF = {
|
||||
'version': 1,
|
||||
|
||||
+13
-12
@@ -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
|
||||
@@ -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
@@ -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
@@ -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
|
||||
### 限制单个视频的最大大小。
|
||||
### 注意:此参数优先级高于分辨率设置,并且不包括音频部分的大小,仅仅只是视频部分的大小。
|
||||
|
||||
Reference in new issue
Block a user