Skip to content

Commit

Permalink
更新解析器和开发相关文档说明
Browse files Browse the repository at this point in the history
  • Loading branch information
snowie2000 committed Dec 27, 2024
1 parent eba6c86 commit e9d72fc
Show file tree
Hide file tree
Showing 2 changed files with 167 additions and 158 deletions.
171 changes: 92 additions & 79 deletions doc/Development_cn.md
Original file line number Diff line number Diff line change
@@ -1,80 +1,93 @@
# 开发

## 解释器指令

内置的httpRedirect解释器支持从源的返回值中读取规定的部分json指令,从而实现模拟头部通过认证等功能。

以下为解释器支持的完整json格式:
```json
{
"logo": "https://example.com/logo.png", // 可选频道logo
"headers": {
"header1": "value1",
"header2": "value2"
... // 可选,自定义头部
}
}
```

logo将在m3u中作为频道图标输出。

headers将在获取m3u8时自动添加到请求中,如果代理了流,则代理时也会使用这些头部。

以下是一个能支持该功能的php直播流解释器示例:
```php
<?php
// 主体跳转到真实直播流地址
header("Location: https://example.com/live.m3u8");
// 返回的内容是一个json
header('Content-Type: application/json');
// 直播地址需要header认证,所以我们指示livetv添加header
echo json_encode([
"logo" => "https://example.com/logo.png",
"headers" => [
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Referer" => "https://example.com"
]
]);
?>
```

## 开发解析器

欢迎开发者为livetv开发新的解析器。

解析器位于`plugin`文件夹下,每个解析器相互独立,也可互相嵌套。

解析器目前支持以下接口,您可以根据需要实现:

```go
// 该接口必须实现,输入直播源地址和代理信息,返回解析后的直播信息
// previousExtraInfo 包含了上一次解析时记录的额外信息
type Plugin interface {
Parse(liveUrl string, proxyUrl string, previousExtraInfo string) (info *model.LiveInfo, error error)
}

// 可选
// 在请求m3u8实际地址前回调,可以对请求进行修改
type Transformer interface {
Transform(req *http.Request, info *model.LiveInfo) error
}

// 可选
// 对接收到的m3u8内容进行健康检查,返回错误将触发重新解析(有重试限制)
type HealthCheck interface {
Check(content string, info *model.LiveInfo) error
}

// 可选
// 给予频道的具体信息,直接处理频道的数据,如果不返回错误,则外部将不再按标准m3u8流程继续处理
// 可用于serve非m3u8的直播源,如rtmp, rtsp等
type FeedHost interface {
Host(c *gin.Context, info *model.LiveInfo) error
}

// 可选
// 对最终ts链接进行转换,可用于添加头部,自定义代理等
type TsTransformer interface {
TransformTs(rawLink string, tsLink string, info *model.LiveInfo) string
}
# 开发

## 解释器指令

内置的http解释器支持从源的返回值中读取规定的部分json指令,从而实现模拟头部通过认证等功能。

以下为解释器支持的完整json格式:
```json
{
"logo": "https://example.com/logo.png", // 可选频道logo
"headers": {
"header1": "value1",
"header2": "value2"
... // 可选,自定义头部
}
}
```

logo将在m3u中作为频道图标输出。

headers将在获取m3u8时自动添加到请求中,如果代理了流,则代理时也会使用这些头部。

以下是一个能支持该功能的php直播流解释器示例:
```php
<?php
// 主体跳转到真实直播流地址
header("Location: https://example.com/live.m3u8");
// 返回的内容是一个json
header('Content-Type: application/json');
// 直播地址需要header认证,所以我们指示livetv添加header
echo json_encode([
"logo" => "https://example.com/logo.png",
"headers" => [
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Referer" => "https://example.com"
]
]);
?>
```

## 开发解析器

欢迎开发者为livetv开发新的解析器。

解析器位于`plugin`文件夹下,每个解析器相互独立,也可互相嵌套。

解析器目前支持以下接口,您可以根据需要实现:

```go
// 该接口必须实现,输入直播源地址和代理信息,返回解析后的直播信息
// previousExtraInfo 包含了上一次解析时记录的额外信息
type Plugin interface {
Parse(liveUrl string, proxyUrl string, previousExtraInfo string) (info *model.LiveInfo, error error)
}

// 可选
// 在请求m3u8实际地址前回调,可以对请求进行修改
type Transformer interface {
Transform(req *http.Request, info *model.LiveInfo) error
}

// 可选
// 对接收到的m3u8内容进行健康检查,返回错误将触发重新解析(有重试限制)
type HealthCheck interface {
Check(content string, info *model.LiveInfo) error
}

// 可选
// 给予频道的具体信息,直接处理频道的数据,如果不返回错误,则外部将不再按标准m3u8流程继续处理
// 可用于serve非m3u8的直播源,如rtmp, rtsp等
type FeedHost interface {
Host(c *gin.Context, info *model.LiveInfo) error
}

// 可选
// 解析器可提供子节目列表(虚拟节目单),如果提供了该接口,将会在节目单中显示子节目
// 同时该节目单本身会在列表中隐藏
type ChannalProvider interface {
Channels(parentChannel *model.Channel, liveInfo *model.LiveInfo) []*model.Channel
}

// 可选
// 对最终ts链接进行转换,可用于添加头部,自定义代理等
type TsTransformer interface {
TransformTs(rawLink string, tsLink string, info *model.LiveInfo) string
}

// 可选
// 允许解析器自由构建m3u8内容而不通过默认的从互联网获取m3u8
type Forger interface {
ForgeM3U8(info *model.LiveInfo) (baseUrl string, body string, err error)
}
```
154 changes: 75 additions & 79 deletions doc/Parser_cn.md
Original file line number Diff line number Diff line change
@@ -1,80 +1,76 @@

# 解析器
选择正确的解析器可以帮助您访问之前无法播放的源,并减少对php等解析脚本的调用,避免频繁调用解析API导致ip被封禁,或者速度缓慢的问题。

您可以使用linux或Windows10以后系统自带的curl来判断您源的类型。

以下会对目前的每个解析器做相应的描述并帮助您选择正确的解析器。


### httpRedirect
用途:
- 该解析器可以识别http跳转,解析出真实的m3u8地址
- 如果您在php脚本中看到了类似`header('Location: https://某个网址/任何内容');`的代码,您应该选择这个解析器
- 该解析器可以解析主播放列表并自动选择其中质量最高的源

判断方法:
请执行以下命令
```bash
curl http://example.com/live.php?channel=xxx -vv 2>&1 | grep ocation
```
如果以上命令返回了类似这样的内容:
> File STDIN:
< Location: http://(或https://)某个网址/任何内容

则您应该选择`httpRedirect`解析器

### rtmp
用途:
- 该解析器可以解析rtmp直播地址
- 该解析器可以解析http跳转到rtmp的地址
- 该解析器可以将rtmp协议转换为flv协议,以便tvbox等软件播放
- **使用该解析器将通过livetv代理流,因此如果在云服务器上部署,请注意流量使用!**

判断方法:
- 在httpRedirect一节的命令中,如果返回值不是http或https开头,而是rtmp开头则您应该选择`rtmp`解析器
- 如果您的视频地址本来就是rtmp协议的,则您应该选择`rtmp`解析器

### direct
用途:
- 该解析器接受一个m3u8地址,并补全地址后转发
- 如果您的php脚本直接返回了m3u8地址,您应该选择这个解析器
- 该解析器可以解析主播放列表并自动选择其中质量最高的源

判断方法:
请执行
```bash
curl http://example.com/live.php?channel=xxx -vv 2>&1 | grep M3U
```
如果以上命令返回了任意内容,则您应该选择`direct`解析器

### repeater
用途:
- 该解析器接受一个m3u8地址,并直接转发不做任何修改
- 如果您使用的是一个静态源,只是想在livetv中统一管理,您应该选择这个解析器

判断方法:
如果您的源是类似
`http://example.com/xxx.m3u8`这样的地址,您应该选择`repeater`解析器


### youtube
用途:
- 该解析器可以解析youtube直播地址
- 该解析器会直接选择youtube直播中质量最高的源
- 支持任意格式的youtube直播地址,移动端pc端均可

如果您使用youtube直播作为您iptv的源,请选择此解析器

### yt-dlp
用途:
- 该解析器可以解析youtube直播地址
- 该解析器会直接选择youtube直播中质量最高的源
- 支持任意格式的youtube直播地址,移动端pc端均可
- 该解析器使用yt-dlp来解析youtube直播地址,可以解析更多的youtube直播地址
- 使用本解析器,您需要提前下载yt-dlp程序,并将其放在livetv程序的同一目录下,否则将解析失败
- 使用yt-dlp解析器将调用第三方程序,因此速度较慢,并会占用更多系统资源,但可能解析一些内建youtube解析器不能正常处理的情况。

----


# 解析器
选择正确的解析器可以帮助您访问之前无法播放的源,并减少对php等解析脚本的调用,避免频繁调用解析API导致ip被封禁,或者速度缓慢的问题。

您可以使用linux或Windows10以后系统自带的curl来判断您源的类型。

以下会对目前的每个解析器做相应的描述并帮助您选择正确的解析器。


### http
用途:
- 该解析器可以识别m3u8地址
- 该解析器可以识别http跳转,解析出真实的m3u8地址
- 如果您的视频地址是一个http跳转,那么该解析器还能遵守地址返回的额外信息并模拟请求头
- 该解析器可以解析主播放列表并自动选择其中质量最高的源

**变更:** 从1.4版本开始,旧版的httpRedirect和direct解析器已经合并,统一为http解析器,您不在需要区分源地址是哪种类型。

### rtmp
用途:
- 该解析器可以解析rtmp直播地址
- 该解析器可以解析http跳转到rtmp的地址
- 该解析器可以将rtmp协议转换为flv协议,以便tvbox等软件播放
- **使用该解析器将通过livetv代理流,因此如果在云服务器上部署,请注意流量使用!**

判断方法:
- 在http一节的命令中,如果返回值不是http或https开头,而是rtmp开头则您应该选择`rtmp`解析器
- 如果您的视频地址本来就是rtmp协议的,则您应该选择`rtmp`解析器

### repeater
用途:
- 该解析器接受一个m3u8地址,并直接转发不做任何修改
- 如果您使用的是一个静态源,只是想在livetv中统一管理,您应该选择这个解析器

判断方法:
如果您的源是类似
`http://example.com/xxx.m3u8`这样的地址,您应该选择`repeater`解析器

### playlist
用途:
- 该解析器可以解析主播放列表并自动解析播放列表中包含的所有节目
- 该解析器可以支持m3u格式和DIYP格式(tvbox,影视仓等也使用该格式)
- 所有节目将自动使用http解析器解析,如果其中含有flv协议等将被识别为节目不在线
- 所有播放列表中的节目将统一使用主播放列表选项中的设置来决定是否使用代理

您可以使用本解析器将无法在当前网络访问或访问不佳的节目通过流代理转换为可以流畅播放的节目单

### playlist-repeater
用途:
- 该解析器可以解析主播放列表并自动解析播放列表中包含的所有节目
- 该解析器可以支持m3u格式和DIYP格式(tvbox,影视仓等也使用该格式)
- 所有节目将自动使用repeater解析器解析,因此并不会对源节目进行任何代理和转换
- 该解析器无法代理流

由于repeater不能代理流,因此本解析器只能用作节目单归集管理使用,不能解决节目播放卡顿的问题,如有此需求请使用playlist解析器

### youtube
用途:
- 该解析器可以解析youtube直播地址
- 该解析器会直接选择youtube直播中质量最高的源
- 支持任意格式的youtube直播地址,移动端pc端均可

如果您使用youtube直播作为您iptv的源,请选择此解析器

### yt-dlp
用途:
- 该解析器可以解析youtube直播地址
- 该解析器会直接选择youtube直播中质量最高的源
- 支持任意格式的youtube直播地址,移动端pc端均可
- 该解析器使用yt-dlp来解析youtube直播地址,可以解析更多的youtube直播地址
- 使用本解析器,您需要提前下载yt-dlp程序,并将其放在livetv程序的同一目录下,否则将解析失败
- 使用yt-dlp解析器将调用第三方程序,因此速度较慢,并会占用更多系统资源,但可能解析一些内建youtube解析器不能正常处理的情况。

----

下一章:[流代理](TSProxy_cn.md)

0 comments on commit e9d72fc

Please sign in to comment.