Typography

一只奶牛猫

使用biliup录制直播并上传至B站

发布于 # docker # tools

准备好在一个文件夹下编辑docker-compose.yml文件。

cat > /backup/docker/biliup/docker-compose.yml << EOF
version: '3'
services:
  biliup:
    image: ghcr.io/biliup/caution:latest
    container_name: biliup
    restart: unless-stopped
    ports:
      - "19159:19159"
    volumes:
      - ./:/opt
    command: --password simon1122qaz
EOF

再准备好一个config.yaml文件

cat > /backup/docker/biliup/config.yaml << EOF
######### 全局录播与上传设置 #########
#------录制与下载------#
### 选择全局默认的下载插件,默认为stream-gears。可选:
### 1.streamlink(streamlink配合ffmpeg混合下载模式,适合用于下载hls_fmp4与hls_ts流,因为streamlink支持多线程拉取)。
### 使用该模式下载flv流时,将会仅使用ffmpeg。请手动安装streamlink以及ffmpeg。
### 2.ffmpeg(纯ffmpeg下载),请手动安装ffmpeg。
### 3.stream-gears
#downloader: ffmpeg
### 录像单文件大小限制,单位Byte,超过此大小分段下载,下载回放时无法使用
#file_size: 2621440000
### 录像单文件时间限制,格式'00:00:00'(时分秒),超过此大小分段下载,如需使用大小分段请注释此字段
segment_time: '00:50:00'
### 小于此大小的视频文件将会被过滤删除,单位MB
filtering_threshold: 20
### 自定义录播文件名模板, 支持变量 {streamer}:你在配置里设置的直播间名 %Y-%m-%d %H_%M_%S:创建文件的时间, {title}:当场直播间标题
### 如果上传文件,文件名必须包含设定的模板名。其次,如果没有定义时间,文件分片可能会互相覆盖,所以推荐设置时间来避免分段文件名重复。
filename_prefix: '{streamer}%Y-%m-%d %H_%M_%S{title}'
### 视频分段后处理并行
### 开启后无法保证分段后处理先后执行顺序
#segment_processor_parallel: false

#------上传------#
### 选择全局默认上传插件,Noop为不上传,但会执行后处理,可选bili_web,biliup-rs(默认值)
#uploader: Noop
### b站提交接口,默认自动选择,可选web,client
#submit_api: client
### b站上传线路选择,默认为自动模式,目前可手动切换为bda2, kodo, ws, qn, bldsa, cos, cos-internal(支持腾讯云内网免流+提速)
lines: AUTO
### 单文件并发上传数,未达到带宽上限时,增大此值可提高上传速度(不要设置过大,部分线路限制为8,如速度不佳优先调整上传线路)
threads: 3

#------杂项------#
### 检测到主播下播后延迟再次检测,单位:秒,避免特殊情况提早启动上传导致漏录
### 当delay不存在时,默认延迟时间为0秒,没有快速上传的需求推荐设置5分钟(300秒)或按需设置。若设置的延迟时间超过60秒,则会启用分段检测机制,每隔60秒进行一次开播状态的检测。
delay: 300
### 平台检测间隔时间,单位:秒。比如虎牙所有主播检测完后会等待30秒 再去从新检测
event_loop_interval: 30
### 单个主播检测间隔时间,单位:秒。比如虎牙有10个主播,每个主播会间隔10秒检测
checker_sleep: 10
### 线程池1大小,负责下载事件。应设置为比主播数量略大,如不确定请设置为999。
pool1_size: 3
### 线程池2大小,负责上传事件。应设置为比主播数量略大,如不确定请设置为999。
pool2_size: 3
### 检测源码文件变化间隔,单位:秒,检测源码到变化后,程序会在空闲时自动重启
check_sourcecode: 15



######### 各平台录播设置 #########
### 使用直播间封面作为投稿封面。此封面优先级低于单个主播指定的自定义封面。(目前支持bilibili,twitch,youtube。直播封面将会保存于cover文件夹下,上传后自动删除)
#use_live_cover: true

#------斗鱼------#
### 如遇到斗鱼录制卡顿可以尝试切换线路。可选以下线路
### tctc-h5(备用线路4), tct-h5(备用线路5), ali-h5(备用线路6), hw-h5(备用线路7), hs-h5(备用线路13)
#douyu_cdn: tct-h5
### 录制斗鱼弹幕,默认关闭
#douyu_danmaku: false
### 斗鱼自选画质
### 刚开播可能没有除了原画之外的画质 会先录制原画 后续视频分段(仅ffmpeg streamlink)时录制设置的画质
### 0 原画,4 蓝光4m,3 超清,2 高清
#douyu_rate:  0

#------虎牙------#
### 如遇到虎牙录制卡顿可以尝试切换线路。可选以下线路
### AL(阿里云 - 直播线路3), TX(腾讯云 - 直播线路5), HW(华为云 - 直播线路6), WS(网宿), HS(火山引擎 - 直播线路14), AL13(阿里云), HW16(华为云), HY(星域云 - 直播线路66)
#huya_cdn: AL
#huya_cdn_fallback: false
### 录制虎牙弹幕,默认关闭
#huya_danmaku: false
### 虎牙自选录制码率
### 可以避免录制如20M的码率,每小时8G左右大小,上传及转码耗时过长。
### 20000(蓝光20M), 10000(蓝光10M), 8000(蓝光8M), 2000(超清), 500(流畅)
### 设置为10000则录制小于等于蓝光10M的画质
#huya_max_ratio: 10000

#------抖音------#
### 录制抖音弹幕,默认关闭
#douyin_danmaku: false
### 抖音自选画质
### 刚开播可能没有除了原画之外的画质 会先录制原画 后续视频分段(仅ffmpeg streamlink)时录制设置的画质
### origin 原画,uhd 蓝光,hd 超清,sd 高清,ld 标清,md 流畅
### 没有选中的画质则会自动选择相近的画质优先低清晰度
#douyin_quality: origin


#------哔哩哔哩------#
### 录制BILIBILI弹幕,下载器为ffmpeg,streamlink时效果最优,默认关闭
# bilibili_danmaku: false
### 哔哩哔哩直播流协议.可选 stream(flv流),hls_ts(ts流)与hls_fmp4(fmp4流),默认为stream
### 仅国内IP可以解析到fmp4流。海外IP只能获取到flv流(ov05与ov07)和ts流(ov105)
### 由于fmp4出现需要一定时间,或者某些小主播(大部分只有原画选项的主播)无fmp4流。
### 目前的策略是,如果开播时间小于60s,将会反复尝试获取fmp4流,如果没获取到就回退到flv流。
### 由于ffmpeg只能单线程下载,并且stream-gears录制有问题,所以目前fmp4流只能使用streamlink+ffmpeg混合模式。
#bili_protocol: stream
### 哔哩哔哩直播优选CDN,默认无,支持同时填入多个CDN节点。
#bili_perfCDN: 'cn-gotcha208,ov-gotcha05'
### 哔哩哔哩强制真原画(仅限TS与FMP4流的 cn-gotcha01 CDN,且 bili_qn >= 10000),默认为关闭
### 不保证可用性。当无法强制获取到真原画时,将会自动回退到二压原画。
#bili_force_source: false
### 自定义哔哩哔哩直播API,用于获取指定区域(大陆或者海外)的直播流链接,默认使用官方API。
#bili_liveapi: 'https://api.live.bilibili.com'
### 自定义fmp4流获取不到时,重新获取一遍flv直播流的api,默认不重新使用其他api重新获取一遍。
### 海外机器玩法:bili_liveapi设置为能获取大陆直播流的API,并将bili_fallback_api设置为官方API,然后优选fmp4流并使用streamlink下载器,最后设置优选cn-gotcha208,ov-gotcha05两个节点。
### 大陆机器玩法:bili_liveapi取消注释保持默认使用官方API,并将bili_fallback_api设置为能获取到海外节点API,然后优选fmp4流并使用streamlink下载器,最后设置优选cn-gotcha208,ov-gotcha05两个节点。
### 这样大主播可以使用cn208的fmp4流稳定录制(海外机如需可以通过自建dns优选指定线路的cn208节点),没有fmp4流的小主播也可以会退到ov05录制flv流。
#bili_fallback_api: 'https://api.live.bilibili.com'
### CDN自动Fallback开关,默认为关闭,例如海外机器优选ov05之后,如果ov05流一直无法下载,将会自动fallback到ov07进行下载。
#bili_cdn_fallback: false
### 强制替换cn-gotcha01(叔叔自建)为指定的自选域名组(可多个域名,请用逗号分隔)
### 完整CDN列表请参考 https://rec.danmuji.org/dev/bilibili-cdn/ 中"B站视频云"的部分
### 如果海外机器需要使用此功能,需要在bili_liveapi中指定国内的反代API来获取cn-gotcha01的节点信息。
### 海外机的玩法:配合一个国内的机器(例如便宜的腾讯云,阿里云等等)自建反代api.live.bilibili.com。或者使用https://docs.qq.com/doc/DV2dvbXBrckNscU9x 此处提供的公用反代API。
### 如果海外机到联通或者移动网络线路还不错,就可以参考***完整CDN列表***选取一些联通或者移动的节点并填入下面
### 每次会随机返回填入的其中一个线路,并且会自动判断所填入的节点是否可用
#bili_replace_cn01:
    # - cn-jxnc-cm-01-16
    # - cn-gddg-cm-01-06
    # - cn-fjqz-cm-01-06
    # - cn-jssz-cm-01-02
    # - cn-gddg-ct-01-12
### 哔哩哔哩自选画质
### 刚开播可能没有除了原画之外的画质 会先录制原画 后续视频分段(仅ffmpeg streamlink)时录制设置的画质
### 30000 杜比,20000 4K,10000 原画,401 蓝光(杜比),400 蓝光,250 超清,150 高清,80 流畅,0 B站默认(多数情况下是蓝光 400)
### 没有选中的画质则会自动选择相近的画质
#bili_qn: 10000

#------YouTube------#
### 设置偏好的YouTube下载封装格式
### 默认不限制
### 请务必记得安装ffmpeg
### 如无特殊需求不建议筛选封装格式 特别是录制直播时 多数直播mp4都是不可用的
### bilibili支持 mp4 mkv webm 无需筛选也能上传
### 支持同时添加多个编码,自动优选指定编码格式里最好的画质/音质版本。
### 视频:其中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下载最高纵向分辨率
### 默认不限制
### 可以用此限制画质
### 例如设置为1080最高只会下载1080P画质
#youtube_max_resolution: 1080
### 限制单个视频的最大大小
### 默认不限制
### 直播无此功能
### 注意:此参数优先级高于分辨率设置,并且不包括音频部分的大小,仅仅只是视频部分的大小。
### 此功能在一部分视频上无法使用 推荐使用画质限制不开启此功能
#youtube_max_videosize: "10G" ###参考格式,例如100M,5G,10G。
### 仅下载该日期之后的视频
### 默认不限制
#youtube_after_date: '20220201'
### 仅下载该日期之前的视频(可与上面的youtube_after_date配合使用,构成指定下载范围区间)
### 默认不限制
#youtube_before_date: '20230501'
### 是否下载直播 默认开启
### 关闭后将忽略直播下载(可以下载回放) 避免网络被风控(有些网络只能下载回放无法下载直播)的时候还会尝试下载直播
### 大量下载时极易风控 如对实时性要求不高推荐关闭
### 一个人同时开启多个直播只能录制最新录制的那个
### 如果正在录制直播将无法下载回放
### 例如录制https://www.youtube.com/@NeneAmanoCh/streams,关闭后将忽略正在直播
#youtube_enable_download_live: true
### 是否下载直播回放 默认开启
### 关闭后将忽略直播下载回放(不会影响正常的视频下载) 只想录制直播的可以开启
### 如果正在下载回放将无法录制直播
### 例如录制https://www.youtube.com/@NeneAmanoCh/streams,关闭后将忽略直播回放
#youtube_enable_download_playback: true

#------Twitch直播录制------#
### 录制Twitch弹幕,默认关闭
#twitch_danmaku: false
### 去除Twitch广告功能,默认开启
### 这个功能会导致Twitch录播分段,因为遇到广告就自动断开了,这就是去广告。若需要录播完整一整段可以关闭这个,但是关了之后就会有紫色屏幕的CommercialTime
### 还有一个不想视频分段的办法是去花钱开一个Turbo会员,能不看广告,然后下面的user里把twitch的cookie填上,也能不看广告,自然就不会分段了
#twitch_disable_ads: true

#------TwitCasting------#
### 录制Twitch弹幕,默认关闭
#twitcasting_danmaku: false
### TwitCasting直播间密码 (可在录制主播设置中为主播单独配置)
#twitcasting_password:

######### 录制主播设置 #########
streamers:
### 完整可选配置示例
    余小C录播:
        url:
            - https://www.douyu.com/1126960
        title: "余小C录播" ### 自定义标题的时间格式, {title}代表当场直播间标题 {streamer}代表在本config里面设置的主播名称 {url}代表设置的该主播的第一条直播间链接
        tid: 171 ### 投稿分区码,171为电子竞技分区
        copyright: 2 ### 1为自制
        # cover_path: /cover/up.jpg ###封面
        description: |- ### 支持strftime, {title}, {streamer}, {url}占位符。注:此处请注意缩进,确保所有文字的缩进都与"视频简介"相同或者更多。
         视频简介: {title} %Y-%m-%d
         {streamer}主播直播间地址:https://www.douyu.com/1126960
        ### 如需在简介中@别人 请使用以下模版
        # credits:
        #    - username: 需要@的用户名
        #      uid: 需要@的uid
        #description: |-
        # 视频简介: {title} %Y-%m-%d %H:%M:%S
        # {streamer}主播直播间地址:{url}
        # 【@credit】
        # ---
        # Powered By biliup - Github: https://github.com/ForgQi/biliup
        dynamic: '#空间动态#'
        #dtime: 14_400 ### 设置延时发布时间,距离提交大于2小时,格式为时间戳
        #dolby: 0 ### 是否开启杜比音效, 1为开启
        #hires: 0 ### 是否开启Hi-Res, 1为开启
        #open_elec: 0 ### 是否开启充电面板, 1为开启
        #no_reprint: 0 ### 自制声明, 1为未经允许禁止转载
        uploader: biliup-rs ### 覆盖全局默认上传插件,Noop为不上传,但会执行后处理
        #filename_prefix: '{streamer}%Y-%m-%d %H_%M_%S{title}'  ### 覆盖全局自定义录播文件命名规则
        user_cookie: cookies.json ### 使用指定的账号上传
        #use_live_cover: true ### 获取BILIBILI直播间封面并作为投稿封面。此封面优先级低于单个主播指定的自定义封面。
        tags:
            - 余小C
            - 阿亮
            - 英雄联盟
            - 直播录像
        #preprocessor: ### 开始下载直播时触发,将按自定义顺序执行自定义操作 注:preprocessor仅支持shell指令
            #- run: sh ./run.sh, ### 执行任意命令,等同于在shell中运行,preprocessor输出的数据为JSON格式,包含主播名字(name)、开播地址(url)和开播时间(start_time)(时间戳)
        ### 分段时触发 返回当前生成的文件
        #segment_processor:
        #    - run: sh ./run.sh, ### 执行任意命令,等同于在shell中运行
        ### 准备上传直播时触发,将按自定义顺序执行自定义操作 注:downloaded_processor仅支持shell指令
        ### room_title 在重启后会丢失 默认为当前配置名称
        ### start_time end_time在重启后会丢失时间 默认为当前时间
        ### 如果对上传的视频进行修改需要保证和filename_prefix命名规则一致 会自动检测上传
        ### 上传顺序会按照文件创建时间排序
        #downloaded_processor:
        #    - run: sh ./run.sh, ### 执行任意命令,等同于在shell中运行,downloaded_processor输出的数据为JSON格式,包含主播名字(name)、直播间地址(url)、直播间标题(room_title)、开播时间(start_time)(时间戳)、下播时间(end_time)(时间戳)和视频列表(file_list)
        #postprocessor: ### 上传完成后触发,将按自定义顺序执行自定义操作 当postprocessor不存在时 默认执行删除文件操作
        #    - run: echo hello! ### 执行任意命令,等同于在shell中运行,视频文件路径作为标准输入传入
        #    - mv: backup/ ### 移动文件到backup目录下
        #    - run: python3 path/to/mail.py ### 执行一个 Python 脚本,可以用来发送邮件等。自动发信通知脚本示例 https://biliup.github.io/biliup/Guide.html#%E4%B8%8A%E4%BC%A0%E5%AE%8C%E6%88%90%E5%90%8E%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E9%80%9A%E7%9F%A5
        #    - run: sh ./run.sh ### 执行一个shell脚本,用途多样,主要调用系统内的cli工具。自动上传网盘脚本示例 https://gist.github.com/UVJkiNTQ/ae4282e8f9fe4e45b3144b57605b4178
            #- rm ### 删除文件,为默认操作
        #format: mp4 ### 视频保存格式。如需使用mp4格式,必须切换downloader为ffmpeg或者streamlink,youtube不支持。
        #opt_args: ### ffmpeg参数
        #    - '-ss'
        #    - '00:00:16' # 跳过开始的16秒
    暴走的暴走的银剑君丶录播:
        url:
            - https://www.douyu.com/251783
        title: "暴走的暴走的银剑君丶录播" ### 自定义标题的时间格式, {title}代表当场直播间标题 {streamer}代表在本config里面设置的主播名称 {url}代表设置的该主播的第一条直播间链接
        tid: 171 ### 投稿分区码,171为电子竞技分区
        copyright: 2 ### 1为自制
        # cover_path: /cover/up.jpg ###封面
        description: |- ### 支持strftime, {title}, {streamer}, {url}占位符。注:此处请注意缩进,确保所有文字的缩进都与"视频简介"相同或者更多。
         视频简介: {title} %Y-%m-%d
         {streamer}主播直播间地址:https://www.douyu.com/251783
        ### 如需在简介中@别人 请使用以下模版
        # credits:
        #    - username: 需要@的用户名
        #      uid: 需要@的uid
        #description: |-
        # 视频简介: {title} %Y-%m-%d %H:%M:%S
        # {streamer}主播直播间地址:{url}
        # 【@credit】
        # ---
        # Powered By biliup - Github: https://github.com/ForgQi/biliup
        dynamic: '#空间动态#'
        #dtime: 14_400 ### 设置延时发布时间,距离提交大于2小时,格式为时间戳
        #dolby: 0 ### 是否开启杜比音效, 1为开启
        #hires: 0 ### 是否开启Hi-Res, 1为开启
        #open_elec: 0 ### 是否开启充电面板, 1为开启
        #no_reprint: 0 ### 自制声明, 1为未经允许禁止转载
        uploader: biliup-rs ### 覆盖全局默认上传插件,Noop为不上传,但会执行后处理
        #filename_prefix: '{streamer}%Y-%m-%d %H_%M_%S{title}'  ### 覆盖全局自定义录播文件命名规则
        user_cookie: cookies.json ### 使用指定的账号上传
        #use_live_cover: true ### 获取BILIBILI直播间封面并作为投稿封面。此封面优先级低于单个主播指定的自定义封面。
        tags:
            - 暴走的暴走的银剑君丶
            - 银剑君
            - 英雄联盟
            - 直播录像


################### 用户cookie ###################
### 在使用下方配置时,请确认下方第一行(user:)取消了注释。
#user:
    #------哔哩哔哩------#
    #------哔哩哔哩获取直播流用COOKIE------#
    ### 请至少填入以下项目。推荐使用 biliup-rs(https://github.com/biliup/biliup-rs) 来获取。
    #bili_cookie: 'SESSDATA=none;bili_jct=none;DedeUserID__ckMd5=none;DedeUserID=123;'
    ### 同时存在时,优先使用文件。只支持 biliup-rs 生成的文件。
    #bili_cookie_file: 'cookies.json'
    ### 重要!!!
    ### 因 哔哩哔哩 修改画质策略,不使用 Cookie 只返回最低画质,故不再控制 Cookie 使用与否。
    ### 将 Cookie 传入不信任的第三方API可能会导致账号被盗,自行斟酌使用。

    #------抖音------#
    ### 如需要录制抖音www.douyin.com/user/类型链接或被风控
    ### 请在此填入cookie需要__ac_nonce、__ac_signature、sessionid的值请不要将所有cookie填入
    #douyin_cookie: '__ac_nonce=123456; __ac_signature=123456; sessionid=123456;'

    #------Twitch直播录制------#
    ### 只在录制twitch直播时才生效
    ### 如录制Twitch时遇见视频流中广告过多的情况,可尝试在此填入cookie,可以大幅减少视频流中的twitch广告(经测试需要在该Cookie所属账号开了TwitchTurbo会员才有用)
    ### 该cookie有过期风险,cookie过期后会在日志输出警告请及时更换cookie,cookie失效的情况下后续录制将忽略cookie(我个人用了四个月都没过期)
    ### twitch_cookie获取方式:在浏览器中打开Twitch.tv,F12调出控制台,在控制台中执行:document.cookie.split("; ").find(item=>item.startsWith("auth-token="))?.split("=")[1]
    ### twitch_cookie需要在downloader= "ffmpeg"时候才会生效
    #twitch_cookie: 'aisjdoiuasdoihansdoh3ooi209'

    #------YouTube------#
    ### 使用Cookies登陆YouTube帐号,可用于下载会限,私享等未登录账号无法访问的内容。请使用Netscape 格式的 Cookies 文本路径。
    ### 可以使用Chrome插件Get cookies.txt来生成txt文件。
    #youtube_cookie: 'cookiejar.txt'

    #------NICO------#
    ### The email or phone number associated with your Niconico account
    ### 【翻译:与您的Niconico账户相关的电子邮件或电话号码】
    #niconico-email: xxxxxxxxxxx
    ### The password of your Niconico account
    ### 【翻译:您的Niconico账户的密码】
    #niconico-password: xxxxxxxxxxxx
    ### Value of the user-session token. Can be used as an alternative to providing a password.
    ### 【翻译:用户会话令牌的值。可作为提供密码的替代方法。】
    #niconico-user-session: xxxxxxxxxxx
    ### Purge cached Niconico credentials to initiate a new session and reauthenticate.
    ### 【翻译:清除缓存的 Niconico 凭证,以启动一个新的会话并重新认证。】
    #niconico-purge-credentials: xxxxxxxxxxxx

    #------AfreecaTV------#
    ### 录制部分直播时需要登陆
    ### AfreecaTV 用户名
    #afreecatv_username: xxxxxxxxxxx
    ### AfreecaTV 密码
    #afreecatv_password: xxxxxxxxxxxx



######### 日志输出配置 #########
LOGGING:
    formatters:
        verbose:
            format: '%(asctime)s %(filename)s[line:%(lineno)d](Pid:%(process)d Tname:%(threadName)s) %(levelname)s %(message)s'
            datefmt: '%Y-%m-%d %H:%M:%S'
        simple:
            format: '%(filename)s%(lineno)d[%(levelname)s]Tname:%(threadName)s %(message)s'
    handlers:
        console:
            level: DEBUG
            class: logging.StreamHandler
            formatter: simple
            stream: ext://sys.stdout
        file:
            level: DEBUG
            class: biliup.common.log.SafeRotatingFileHandler
            when: W0
            interval: 1
            backupCount: 1
            filename: ds_update.log
            formatter: verbose
            encoding: utf-8
    root:
        handlers: [ console ]
        level: INFO
    loggers:
        biliup:
            handlers: [ file ]
            level: INFO

### 默认通过网页接口上传,可选通过操作chrome上传,此时需要填写chromedriver路径
#chromedriver_path: /usr/local/bin/chromedriver
EOF

之后运行命令

docker compose up -d

打开网址,输入账号密码即可配置 http://ip:19159

参考项目: https://github.com/biliup/biliup