From 7ea0cba5d032d1be5ffd210a201074d9fdf429ce Mon Sep 17 00:00:00 2001 From: haha114514 <47912037+haha114514@users.noreply.github.com> Date: Tue, 28 Feb 2023 13:17:02 +1100 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96BILIBILI?= =?UTF-8?q?=E7=9B=B4=E6=92=AD=E9=97=B4=E5=B0=81=E9=9D=A2=E5=B9=B6=E4=BD=9C?= =?UTF-8?q?=E4=B8=BA=E6=8A=95=E7=A8=BF=E5=B0=81=E9=9D=A2=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=B8=8E=E8=AE=BE=E7=BD=AE=E3=80=82=20(#346)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update uploader.py * Update biliuprs.py * Update config.yaml * Update config.toml * Update bilibili.py * Update uploader.py --- CHANGELOG.md | 5 +++-- biliup/__init__.py | 2 +- biliup/engine/download.py | 4 +++- biliup/plugins/bilibili.py | 28 +++++++++++++++++++++++++++- biliup/plugins/biliuprs.py | 4 +++- biliup/uploader.py | 1 + public/config.toml | 9 ++++++--- public/config.yaml | 11 +++++++---- 8 files changed, 51 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2632f01..07a7560 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,9 @@ - 🔧已修复的问题 - ⚠️需要手动操作的更新信息 -## 0.4.5 (待发布) -- 更新时间:未发行 +======= +## 0.4.5 +- 更新时间:2023.02.28 - 💡新增斗鱼,虎牙,B站的弹幕录制功能,默认关闭,需要在config文件中开启,只支持FFMPEG(目前)[@KNaiFen](https://github.com/KNaiFen) (感谢:[THMonster/danmaku](https://github.com/THMonster/danmaku) ) - 🔧修复了BILIBILI录制中OV05节点的BUG[@haha114514](https://github.com/haha114514) - ⚠️由于为Config新增了弹幕录制的设置,如需使用相关功能请参考最新的config示例添加缺失的部分。 diff --git a/biliup/__init__.py b/biliup/__init__.py index 5218ff3..b2a18b6 100644 --- a/biliup/__init__.py +++ b/biliup/__init__.py @@ -1,7 +1,7 @@ import logging import sys -__version__ = "0.4.4" +__version__ = "0.4.5" LOG_CONF = { 'version': 1, diff --git a/biliup/engine/download.py b/biliup/engine/download.py index 8bdd0ce..8f3696d 100644 --- a/biliup/engine/download.py +++ b/biliup/engine/download.py @@ -27,12 +27,13 @@ class DownloadBase: self.url = url self.suffix = suffix self.title = None + self.live_cover_path = None self.downloader = config.get('downloader', 'stream-gears') # ffmpeg.exe -i http://vfile1.grtn.cn/2018/1542/0254/3368/154202543368.ssm/154202543368.m3u8 # -c copy -bsf:a aac_adtstoasc -movflags +faststart output.mp4 self.raw_stream_url = None self.filename_prefix = config.get('filename_prefix') - + self.use_live_cover = config.get('use_live_cover') self.opt_args = opt_args self.fake_headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', @@ -146,6 +147,7 @@ class DownloadBase: 'url': self.url, 'title': self.room_title, 'date': date, + 'live_cover_path': self.live_cover_path, } @staticmethod diff --git a/biliup/plugins/bilibili.py b/biliup/plugins/bilibili.py index 9dff9f4..c5b44b6 100644 --- a/biliup/plugins/bilibili.py +++ b/biliup/plugins/bilibili.py @@ -1,6 +1,7 @@ import asyncio import requests +import os import re import random from . import match1, logger @@ -19,6 +20,7 @@ class Bilibili(DownloadBase): self.fake_headers['cookie'] = config.get('user', {}).get('bili_cookie') self.customAPI_use_cookie = config.get('user', {}).get('customAPI_use_cookie') self.bili_cdn_fallback = config.get('bili_cdn_fallback', True) + self.use_live_cover = config.get('use_live_cover', False) self.bilibili_danmaku = config.get('bilibili_danmaku', False) def check_stream(self): @@ -40,7 +42,6 @@ class Bilibili(DownloadBase): force_ov05_ip = config.get('bili_force_ov05_ip') force_cn01_domain = config.get('bili_force_cn01_domains') official_api_host = "https://api.live.bilibili.com" - with requests.Session() as s: s.headers = self.fake_headers.copy() # 获取直播状态与房间标题 @@ -53,6 +54,14 @@ class Bilibili(DownloadBase): if room_info['code'] != 0 or room_info['data']['room_info']['live_status'] != 1: logger.debug(room_info['message']) return False + if self.use_live_cover is True: # 获取直播封面并保存到cover目录下 + try: + room_id = room_info['data']['room_info']['room_id'] + cover_url = room_info['data']['room_info']['cover'] + live_start_time = room_info['data']['room_info']['live_start_time'] + self.live_cover_path = get_live_cover(room_id, live_start_time, cover_url) + except: + logger.error(f"获取直播封面失败") params['room_id'] = room_info['data']['room_info']['room_id'] self.room_title = room_info['data']['room_info']['title'] custom_api = config.get('bili_liveapi') is not None @@ -146,3 +155,20 @@ def get_play_info(s, custom_api, official_api_host, params): except requests.exceptions.ConnectionError: logger.error(f"{custom_api_host}连接失败,尝试回退至官方Api") return s.get(official_api_host + '/xlive/web-room/v2/index/getRoomPlayInfo', params=params, timeout=5).json() + +def get_live_cover(room_id, live_start_time, cover_url): + headers = { + "origin": "https://www.bilibili.com", + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41" + } + response = requests.get(cover_url, headers=headers, timeout=5) + save_dir = f'cover/' + if not os.path.exists(save_dir): + os.makedirs(save_dir) + live_cover_path = f'{save_dir}{room_id}_{live_start_time}.png' + if os.path.exists(live_cover_path): + return live_cover_path + else: + with open(live_cover_path, 'wb') as f: + f.write(response.content) + return live_cover_path diff --git a/biliup/plugins/biliuprs.py b/biliup/plugins/biliuprs.py index 2432cc9..300d9ac 100644 --- a/biliup/plugins/biliuprs.py +++ b/biliup/plugins/biliuprs.py @@ -21,7 +21,9 @@ class BiliWeb(UploadBase): self.threads = threads self.tid = tid self.tags = tags - self.cover_path = cover_path + if "live_cover_path" in self.data: + self.cover_path = self.data["live_cover_path"] + self.cover_path = cover_path #自定义封面的优先级比直播封面高 self.desc = description self.dynamic = dynamic self.copyright = copyright diff --git a/biliup/uploader.py b/biliup/uploader.py index 1047ed3..3c1c676 100644 --- a/biliup/uploader.py +++ b/biliup/uploader.py @@ -26,6 +26,7 @@ def upload(data): date = data.get("date", time.localtime()) title = data.get('title', index) url = data.get('url') + live_cover_path = data.get('live_cover_path') data["format_title"] = custom_fmtstr(context.get('title', f'%Y.%m.%d{index}'), date, title, streamer, url) if context.get('description'): context['description'] = custom_fmtstr(context.get('description'), date, title, streamer, url) diff --git a/public/config.toml b/public/config.toml index f8c88d6..cc19934 100644 --- a/public/config.toml +++ b/public/config.toml @@ -49,13 +49,15 @@ check_sourcecode = 15 #douyu_danmaku = false #------虎牙------# -# 如遇到虎牙录制卡顿可以尝试切换线路,AL, HW, TX, WS +### 如遇到虎牙录制卡顿可以尝试切换线路,AL, HW, TX, WS #huyacdn = "AL" -# 录制虎牙弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 +### 录制虎牙弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 #huya_danmaku = false #------哔哩哔哩------# -# 录制BILIBILI弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 +### 获取BILIBILI直播间封面并作为投稿封面。此封面优先级低于单个主播指定的自定义封面。(直播封面将会保存于bili_cover_cache下,请自行定期删除) +#use_live_cover = true +### 录制BILIBILI弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 # bilibili_danmaku = false ### 哔哩哔哩直播流协议.可选 stream(Flv)、hls,默认为stream #bili_protocol = stream @@ -125,6 +127,7 @@ dynamic = "#空间动态#" uploader = "biliup-rs" # 覆盖全局默认上传插件,Noop为不上传,但会执行后处理 #filename_prefix = '{streamer}%Y-%m-%d %H_%M_%S{title}' # 覆盖全局自定义录播文件命名规则 user_cookie = "cookies.json" # 使用指定的账号上传 +#use_live_cover = true # 获取BILIBILI直播间封面并作为投稿封面。此封面优先级低于单个主播指定的自定义封面。 tags = [ "biliup", "视频标签" ] # 上传完成后,将按自定义顺序执行自定义操作 #postprocessor = [ diff --git a/public/config.yaml b/public/config.yaml index 5bee532..a9cff0a 100644 --- a/public/config.yaml +++ b/public/config.yaml @@ -49,11 +49,13 @@ check_sourcecode: 15 #------虎牙------# ### 如遇到虎牙录制卡顿可以尝试切换线路,AL, HW, TX, WS #huyacdn: AL -# 录制虎牙弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 +### 录制虎牙弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 #huya_danmaku: false -#------哔哩哔哩------#\ -# 录制BILIBILI弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 +#------哔哩哔哩------# +### 获取BILIBILI直播间封面并作为投稿封面。此封面优先级低于单个主播指定的自定义封面。(直播封面将会保存于bili_cover_cache下,请自行定期删除) +#use_live_cover: true +### 录制BILIBILI弹幕,只有使用FFMPEG作为下载器才支持,默认关闭 # bilibili_danmaku: false ### 哔哩哔哩直播流协议.可选 stream(Flv)、hls,默认为stream #bili_protocol: stream @@ -120,6 +122,7 @@ streamers: uploader: biliup-rs ### 覆盖全局默认上传插件,Noop为不上传,但会执行后处理 #filename_prefix: '{streamer}%Y-%m-%d %H_%M_%S{title}' ### 覆盖全局自定义录播文件命名规则 user_cookie: cookies.json ### 使用指定的账号上传 + #use_live_cover: true ### 获取BILIBILI直播间封面并作为投稿封面。此封面优先级低于单个主播指定的自定义封面。 preprocessor: ### 开始下载直播时,将按自定义顺序执行自定义操作 注:preprocessor仅支持shell指令 #- run: sh ./run.sh postprocessor: ### 上传完成后,将按自定义顺序执行自定义操作 @@ -147,7 +150,7 @@ streamers: ###在开启了自定义Cookie(bili_cookie)又同时设置了第三方API(bili_liveapi)的情况下,如果打开了允许第三方API使用Cookie,那么就使用第三方API,如果没有允许(默认),那么设置的第三方API就不生效 #customAPI_use_cookie : False - #------已过时,无视我------# + #------bili-web用(已过时,无视我)------# # cookies: # SESSDATA: your SESSDATA # bili_jct: your bili_jct