简体中文 | English
Olived | A modern live stream recorder
-
build from source
go install github.com/go-olive/olive@latest -
download from releases
-
docker image
docker pull luxcgo/olive
Get olive to work simply by passing the live url.
$ olive run -u https://www.huya.com/518512
$ olive run -f xxx.toml只需要填写这几个配置项,就可以开始对一个直播间进行录制了。
[[Shows]]
# 全局唯一字符串,因为配置修改会实时监控实时更新,故以此 ID 作为标识这一个录制的配置项
ID = 'a'
# 平台名称
Platform = "bilibili"
# 房间号
RoomID = "21852"
# 主播名称
StreamerName = "old-tomato"新增配置项 OutTmpl
-
日期:
{{ now | date \"2006-01-02 15-04-05\"}} -
主播名称:
{{ .StreamerName }} -
直播标题:
{{ .RoomName }} -
直播平台:
{{ .SiteName }}
[[Shows]]
ID = 'a'
Platform = "bilibili"
RoomID = "21852"
StreamerName = "old-tomato"
# 文件名称将会是 `[2022-04-24 02-02-32][old-tomato][Hi!]`
OutTmpl = "[{{ now | date \"2006-01-02 15-04-05\"}}][{{ .StreamerName }}][{{ .RoomName }}]"新增配置项 SaveDir
文件名称中的
tmpl变量,如主播名称、直播平台等也可以在这里使用
[[Shows]]
Platform = "bilibili"
RoomID = "21852"
StreamerName = "old-tomato"
SaveDir = "/Users/luxcgo/Videos"新增配置项 Parser
[[Shows]]
Platform = "bilibili"
RoomID = "21852"
StreamerName = "old-tomato"
# 使用 `ffmpeg` 作为文件下载器
Parser = "ffmpeg"参考表
| 下载器 | 类型 | 平台 |
|---|---|---|
| streamlink | 第三方 | YouTube/Twitch |
| yt-dlp | 第三方 | YouTube |
| ffmpeg | 第三方 | 除了 YouTube/Twitch |
| flv | 原生 | 除了 YouTube/Twitch |
如果您需要使用这些第三方下载器,请务必手动将它们下载到您的本地环境中。
原生下载器已内置到 olive ,您无需下载就可畅快使用。
增加 Shows.PostCmds 配置项,在任何一个 Shows 的下面都可以自定义的配置多个命令。
在录制结束的时候会自动依次执行,若中途有命令执行失败,则提前退出。
olive 内部提供了几个已经实现好开箱即用的命令( 在[[Shows]] 的PostCmds中增加 Path 配置项 )
olivearchive: 将文件移动到当前路径下的archive文件夹中。olivetrash: 将文件删除(不可恢复)。olivebiliup: 若有配置CookieFilepath、BiliupEnable,则会根据配置自动上传至哔哩哔哩,若上传失败会执行olivearchive。oliveshell: 将常规终端指令切分成字符串数组,并配置到Args中。- olive 内置了文件路径作为环境变量,并可以通过
$FILE_PATH获取。注意环境变量只有在 shell 环境中才会正确解析,如/bin/zsh -c "echo $FILE_PATH",只执行echo $FILE_PATH则很可能获取不到路径信息。
- olive 内置了文件路径作为环境变量,并可以通过
配置文件样例
[Config]
# 开启 biliup
BiliupEnable = true
# cookies 文件路径
# cookies 文件生成可在命令行执行 `olive biliup login` 命令
CookieFilepath = '/Users/lucas/github/olive/cookies.json'
Threads = 6
# 每秒最多上传字节数,以下配置是限速 2MB/s
MaxBytesPerSecond = 2097152
[[Shows]]
ID = 'a'
Enable = false
Platform = 'bilibili'
RoomID = '1319379'
StreamerName = 'test1'
OutTmpl = '[{{ .StreamerName }}][{{ .RoomName }}][{{ now | date "2006-01-02 15-04-05"}}].flv'
Parser = 'flv'
SaveDir = ''
PostCmds = '[{"Path":"oliveshell","Args":["/bin/zsh","-c","echo $FILE_PATH"]},{"Path":"olivebiliup"},{"Path":"olivetrash"}]'模拟执行配置文件
- 录制结束
- 执行自定义命令
/bin/sh -c "echo $FILE_PATH" - 若上条命令执行成功,执行内置命令
olivebiliup - 若上条命令执行成功,执行内置命令
olivetrash
当以下任意一个条件满足是时, olive 会新创建一个文件用于录制。
- 最大视频时长:
Duration- 一个时间段字符串是一个序列,每个片段包含可选的正负号、十进制数、可选的小数部分和单位后缀,如"300ms"、"-1.5h"、"2h45m"。
- 合法的单位有"ns"、"us" /"µs"、"ms"、"s"、"m"、"h"。
- 最大视频大小(字节):
Filesize
[[Shows]]
ID = 'a'
Platform = 'bilibili'
RoomID = '1319379'
SplitRule = '{"FileSize":2000000000,"Duration":"1h"}'| Platform |
|---|
| bilibili |
| douyin |
| huya |
| kuaishou |
| lang |
| tiktok |
| twitch |
| youtube |
olive 依赖 olivetv 来支持上述网站的直播录制。
如果您的不在上述列表中,欢迎在 discussion 中留下评论或提交 pr 。
更多的一些网站被 streamlink 支持,所以就没有必要重新造轮子了。streamlink 可以作为一个插件在 olive 中使用 。只要网站在 streamlink 中被支持,你也可以在 olive 中使用它。
例子如下:
[[Shows]]
Platform = "streamlink"
RoomID = "https://twitcasting.tv/c:aiueo033000"
StreamerName = "c:aiueo033000"
OutTmpl = "[{{ .StreamerName }}][{{ now | date \"2006-01-02 15-04-05\"}}]"
[[Shows]]
Platform = "streamlink"
RoomID = "https://live.nicovideo.jp/watch/lv337855989"
StreamerName = "ラムミ"
OutTmpl = "[{{ .StreamerName }}][{{ now | date \"2006-01-02 15-04-05\"}}]"
[[Shows]]
Platform = "streamlink"
RoomID = "https://play.afreecatv.com/030b1004/241795118"
StreamerName = "덩이"
OutTmpl = "[{{ .StreamerName }}][{{ now | date \"2006-01-02 15-04-05\"}}]"一个包含所有特性的配置文件。
[Config]
PortalUsername = 'olive'
PortalPassword = 'olive'
# 日志输出目录
LogDir = '/Users/luxcgo/olive'
# 全局 OutTmpl
OutTmpl = "[{{ now | date \"2006-01-02 15-04-05\"}}][{{ .RoomName }}]"
# 全局 SaveDir,绝对路径
SaveDir = "/Users/luxcgo/olive/{{ .SiteName }}/{{ .StreamerName }}/"
# 日志等级 (0~6), 越大日志输出越多
LogLevel = 5
# 直播间状态查询间隔时间(秒)
SnapRestSeconds = 15
# 文件是否满足切割条件检测间隔时间(秒)
SplitRestSeconds = 60
# 直播间录播结束后执行命令的并发执行的个数
CommanderPoolSize = 1
# 解析器工作状态检查间隔时间(秒)
ParserMonitorRestSeconds = 10
# 部分网站需要配置 cookie
DouyinCookie = "__ac_nonce=06245c89100e7ab2dd536; __ac_signature=_02B4Z6wo00f01LjBMSAAAIDBwA.aJ.c4z1C44TWAAEx696;"
KuaishouCookie = "did=web_d86297aa2f579589b8abc2594b0ea985"
# biliup 配置项
BiliupEnable = false
CookieFilepath = '/Users/lucas/github/olive/cookies.json'
Threads = 6
MaxBytesPerSecond = 2097152
[[Shows]]
# 全局唯一字符串,因为配置修改会实时监控实时更新,故以此 ID 作为标识这一个录制的配置项
ID = 'a'
# 平台名称
Platform = "huya"
# 房间号
RoomID = "518512"
[[Shows]]
ID = 'b'
Enable = false
Platform = 'bilibili'
RoomID = '1319379'
StreamerName = 'test1'
OutTmpl = '[{{ .StreamerName }}][{{ .RoomName }}][{{ now | date "2006-01-02 15-04-05"}}].flv'
Parser = 'flv'
SaveDir = ''
PostCmds = '[{"Path":"oliveshell","Args":["/bin/zsh","-c","echo $FILE_PATH"]},{"Path":"olivebiliup"},{"Path":"olivetrash"}]'
SplitRule = '{"FileSize":2000000000,"Duration":"1h"}'