IPTV_AutoMation 是受flyfishes/IPTV-M3U-Checker2、AmbitiousJun/iptv-server和ssili126/tv项目启发,由 ChatGPT 使用 Python 编写的 IPTV 自动化工具,用于定期搜索 IPTV 资源、检测节目源质量、聚合网关,并实现局域网推流管理。主要用于emby、plex等自建媒体服务器使用。仅支持 x86 架构。
- 搜索 IPTV 资源: 从 GitHub 和网络空间搜索引擎搜索包含“直播源”关键字的直播源,筛选最近推送的直播源文件并下载保存。
- 节目源质量检测: 检测搜索下载的直播源和用户自行导入的直播源,根据延迟、视频分辨率、下载速度和连通性为直播源评分,将可用的直播源保存为m3u8文件。
- Flask 服务器: 使用 Flask 生成局域网播放文件,在播放时根据频道自动选择评分最高的直播源跳转播放。
iptv_automation/
│
├── data/
│ ├── downloaded_sources/ # github下载的直播源文件保存目录
│ ├── user_uploaded/ # 用户手动保存直播源的目录
│ ├── hotel_search/ # 网络空间搜索引擎搜索的直播源保存目录
│ ├── logs/ # 日志保存目录
│ ├── filter_conditions.xlsx # Excel 文件,存储频道名称列表
│ ├── iptv_sources.db # SQLite 数据库文件,存储项目运行的数据
│ ├── filtered_sources.xlsx # Excel 文件,检测筛选后可播放的直播源列表
│ ├── filtered_sources.m3u8 # 检测筛选后可播放的直播源文件
│ └── aggregated_channels.m3u8 # 用于局域网播放的可自行切换最优直播源的文件
│
├── github_search.py # GitHub 搜索和下载模块
├── hotel_search.py # 网络空间搜索引擎搜索和下载模块
├── domain_batch_query.py # IP转域名
├── db_setup.py # 频道列表模块,将 Excel 频道模板导入到 SQLite 的 `iptv_sources` 表中
├── import_playlists.py # 将 GitHub 搜索下载的直播源导入 SQLite 的 `iptv_playlists` 表中
├── calculate_score.py # 直播源评分机制
├── ffmpeg_source_checker.py # IPTV 源初步筛选,调用 ffmpeg 检测直播源的延迟、分辨率和视频格式,并保存到 SQLite 的 `filtered_playlists` 表中
├── daily_monitor.py # 延迟和下载速度检测模块,对 `filtered_playlists` 表中的直播源进行检测
├── update_emby_guide.py # emby_server频道自动更新
├── flask_server.py # Flask 服务器模块,生成本地固定频道网址,根据评分机制选择最优质频道
├── clean_failed_sources.py # 废弃直播源清理模块,对 SQLite 的 `failed_sources` 表进行重置
├── scheduler.py # 初始化、定期检测、文件监测和定时更新模块
├── logging_config.py # 日志记录模块
├── requirements.txt # Python 依赖库列表
├── config.json # 项目核心参数配置文件
├── entrypoint.sh # 启用脚本
└── filter_conditions.xlsx # filter_conditions.xlsx 备份,Docker 镜像默认从它复制到 data 文件夹中
- 修复chrome僵尸进程的bug
- 修复在检测期间直播源无法播放的bug
- 增加空间引擎搜索IP反向解析域名功能
- 增加检测结束后自动刷新emby电视指南功能
- 增加自定义flask_server端口功能
version: '2.1'
services:
iptv_automation:
image: iptv_auto_mation:2.1 # 替换为你的镜像名称
container_name: iptv_auto_mation-2.1
init: true # 使用 tini 初始化
environment:
GITHUB_SEARCH_QUERY: "直播源,iptv,高清电视,电视直播" # github搜索关键字,可自行添加
GITHUB_SEARCH_DAYS: 3 # 搜索github最近3天更新的直播源
GITHUB_TOKEN: "" # 在此处添加你的 GitHub Token
THREADS: 3 # 下载速度检测使用的CPU线程数,建议根据处理器性能调整,AMD Ryzen V1500B设置为3
THREAD_LIMIT: 0 # 分辨率和连通性检测使用的CPU线程数,0表示使用线程数为CPU总线程数-1
HEIGHT_LIMIT: 1080 # 只保留1080P以上分辨率直播源
CODEC_EXCLUDE_LIST: "Unknown" # 排除无法检测出分辨率的源
LATENCY_LIMIT: 3000 # 检测中允许直播源的最大的延迟
RETRY_LIMIT: 0 # 检测失败重试次数
FAILURE_THRESHOLD: 6 # 直播源检测失败标记为废弃源的次数
SCHEDULER_INTERVAL_MINUTES: 30 # 下载速度检测任务间隔分钟
SEARCH_INTERVAL_HOURS: 24 # 定期搜索任务间隔小时
FAILED_SOURCES_CLEANUP_DAYS: 20 # 废弃源定期清理任务间隔天数
ffmpeg_check_frequency_minutes: 360 # 分辨率和连通性检测任务间隔分钟
EMBY_SERVER_URL: "http://your-emby-server-address:8096" # 修改为你的emby内网地址,没有emby就删除该参数
API_KEY: "your_emby_api_key" # 修改为你的emby的api_key,没有emby就删除该参数
HOST_IP: "" # 运行docker主机的 IP 地址
SUBDIVISION: "Henan,Hubei" # 建议只填写所在省
PORT: 5000 # 设置容器中的 Flask 服务器端口为 5000
volumes:
- ./data:/app/data # 将主机的 ./data 目录映射到容器中的 /app/data
network_mode: "host" # 使用 host 网络模式
参数 | 默认值 | 可用值 |
---|---|---|
GITHUB_SEARCH_QUERY | 直播源,iptv,高清电视,电视直播 |
可设置为任意文字 |
GITHUB_SEARCH_DAYS | 10 |
10 ,15 ,20 等任意整数 |
GITHUB_TOKEN | |
必填 |
THREADS | 0 |
不大于宿主机 CPU 2倍的线程数 |
THREAD_LIMIT | 0 |
不大于宿主机 CPU 2倍的线程数 |
HEIGHT_LIMIT | 1080 |
null 保存全部, 0 保存除 Unknown 外全部, 大于 0 的任意整数 不保存低于该值的分辨率 |
CODEC_EXCLUDE_LIST | Unknown |
Unknown ,hevc ,h264 等等 |
LATENCY_LIMIT | 3000 |
建议在 2000 -10000 ms 之间 |
RETRY_LIMIT | 0 |
任意整数 |
FAILURE_THRESHOLD | 6 |
任意整数 |
SCHEDULER_INTERVAL_MINUTES | 30 |
任意整数 |
SEARCH_INTERVAL_HOURS | 4 |
任意整数 |
FAILED_SOURCES_CLEANUP_DAYS | 20 |
任意整数 |
ffmpeg_check_frequency_minutes | 360 |
任意整数 |
HOST_IP | |
主机IP |
SUBDIVISION | Henan,Hubei |
建议保留你所在省的名称即可,首字母大写 |
/app/data | ./data | 宿主机映射路径,自行修改 |
EMBY_SERVER_URL | http://your-emby-server-address:8096 |
emby内网地址,没有emby就删除该参数 |
API_KEY | your_emby_api_key |
emby的api_key,没有emby就删除该参数 |
PORT | 5000 |
任意端口 |
-
GITHUB_SEARCH_QUERY
- 类型:
字符串
- 说明: 在 GitHub 上进行搜索的关键词。该查询参数将被用来搜索 GitHub 项目中的文件、仓库等。
- 作用: 当项目运行
github_search.py
脚本时,GitHub API 会根据此关键词在公开仓库中查找后缀为.m3u
、.m3u8
、.txt
的文件。推荐关键字:iptv
,直播源
,高清电视
,电视直播
,tv
,央视
,卫视
,4k直播
等等。如果不想使用github搜索,输入任意字符即可。 - 示例:
"直播源,iptv,高清电视"
- 类型:
-
GITHUB_SEARCH_DAYS
- 类型:
整数
- 说明: 这是 GitHub 搜索文件的最后更新日期限制。它决定了只搜索在指定天数内更新的文件。
- 作用: 搜索的文件必须是在过去
GITHUB_SEARCH_DAYS
天内更新的。建议数值3
。数值越大,搜索出来的(废弃)直播源越多,项目定期对直播源检测花费的时间也就越长。 - 示例:
30
(表示搜索过去 3 天内更新的仓库内的后缀为.m3u
、.m3u8
、.txt
的文件)
- 类型:
-
GITHUB_TOKEN
- 类型:
字符串
- 说明: GitHub API 的访问令牌。申请地址
- 作用: 没有令牌的情况下,GitHub API 的调用频率为60 次请求/小时。使用令牌允许 API 请求的频率为5000 次请求/小时,并获得更多的权限。注意,这里的次数不是脚本运行的次数,而是通过api访问的次数,关键字越多,仓库越多、文件越多访问的次数就会越多
- 示例:
"ghp_XXXXXXXXXXXXXXXXXXXXXX"
(GitHub 提供的个人访问令牌)
- 类型:
-
THREADS
- 类型:
整数
- 说明: 设置最大线程数,用于控制下载速度检测任务的(多)线程数量。
- 作用: 原则不宜超过最大值CPU线程数的2倍,过大的线程数可能会导致并发访问某个IP下的直播源,因连接数过多无法测出真实的实时速率;超出CPU线程数可能会降低IO速度;过低的线程数在应对上万的直播源会花费更多时间检测,如果
SCHEDULER_INTERVAL_MINUTES
、ffmpeg_check_frequency_minutes
设置时间较短,可能会造成大量任务堆积。默认的0
代表宿主机CPU的线程数。在7个线程情况下2000个直播源测速需要20-30分钟(AMD Ryzen V1500B),docker启动初始化运行完毕才会生成可用m3u8文件。 - 示例:
8
(表示最多允许 8 个任务同时执行)
- 类型:
-
THREAD_LIMIT
- 类型:
整数
- 说明: 设置最大线程数,用于控制视频分辨率检测任务的(多)线程数量。
- 作用: 原则不宜超过最大值CPU线程数的2倍,过大的线程数可能会导致并发访问某个IP下的直播源,因连接数过多无法测出真实的实时速率;超出CPU线程数可能会降低IO速度;过低的线程数在应对上万的直播源会花费更多时间检测,如果
SCHEDULER_INTERVAL_MINUTES
、ffmpeg_check_frequency_minutes
设置时间较短,可能会造成大量任务堆积。默认的0
代表宿主机CPU的线程数的1.5倍。在7个线程情况下34137个直播源分辨率检测需要40分钟(AMD Ryzen V1500B) - 示例:
8
(表示最多允许 8 个任务同时执行)
- 类型:
-
HEIGHT_LIMIT
- 类型:
整数
- 说明: 设置视频流的最大允许分辨率高度(单位为像素)。
- 作用: 在流媒体检测过程中,任何低于此分辨率的视频流将被过滤掉。例如,
HEIGHT_LIMIT=1080
将过滤掉所有分辨率低于 1080p 的视频流。 - 示例:
1080
(表示允许的最高分辨率为 1080p)
- 类型:
-
CODEC_EXCLUDE_LIST
- 类型:
字符串(逗号分隔)
- 说明: 视频编码格式排除列表,这些编码格式的视频流将被忽略。
- 作用: 在流媒体检测时,任何使用此列表中编码格式的视频流将被排除。例如,如果
CODEC_EXCLUDE_LIST
包含Unknown
,则所有编码格式为Unknown
(也就是检测不到直播源信息)的流将被忽略。 - 示例:
"Unknown"
(表示排除编码格式为Unknown
的流)
- 类型:
-
LATENCY_LIMIT
- 类型:
整数
- 说明: 指定检测视频流时允许的最大延迟时间,单位为毫秒。
- 作用: 在检测视频流时,任何延迟超过此值的流都会被排除。这有助于确保只选择低延迟的视频流,以提高频道切换速度。
- 示例:
3000
(表示延迟超过 3000 毫秒的流将被排除)
- 类型:
-
RETRY_LIMIT
- 类型:
整数
- 说明: 视频流检测失败时允许的最大重试次数。
- 作用: 如果检测任务失败,系统将最多重试
RETRY_LIMIT
次。超过此次数后,流将被标记为失败并跳过。 - 示例:
1
(表示失败后最多重试 1 次)
- 类型:
-
FAILURE_THRESHOLD
- 类型:
整数
- 说明: 允许视频流检测失败的最大次数。
- 作用: 如果某个视频流的检测失败次数达到该值,该流将被移至废弃源列表,并不会再进行检测。
- 示例:
6
(表示检测失败 6 次后该流将被移除)
-
SCHEDULER_INTERVAL_MINUTES
- 类型:
整数
- 说明: 定时任务的执行间隔,单位为分钟。
- 作用: 该参数控制定时评分机制的运行频率。例如,设置为
30
表示每 30 分钟会触发一次检测任务。建议设置30-60分钟。 - 示例:
30
(表示调度器每 30 分钟执行一次检测任务)
- 类型:
-
SEARCH_INTERVAL_HOURS
- 类型:
整数
- 说明: 控制 GitHub 搜索任务的执行间隔,单位为小时。
- 作用: 该参数控制项目中定期进行 GitHub 搜索、网络空间搜索引擎搜索任务的运行频率。设置为
4
表示每 4 小时执行一次搜索。 - 示例:
4
(表示每 4 小时搜索一次)
- 类型:
-
FAILED_SOURCES_CLEANUP_DAYS
- 类型:
整数
- 说明: 定期清理失败源的时间间隔,单位为天。
- 作用: 系统会定期清理检测失败(废弃)的源,这个参数设置了清理的时间间隔。例如,设置为
20
表示每 20 天清理一次失败的源。 - 示例:
20
(表示每 20 天执行一次清理任务)
- 类型:
-
ffmpeg_check_frequency_minutes
- 类型:
整数
- 说明: FFMPEG 检测任务的执行间隔,单位为分钟。
- 作用: 该参数控制 FFMPEG 检测任务的运行频率。主要是用于处理检测失败(废弃)的直播源。
- 示例:
360
(表示每 6 小时运行一次 FFMPEG 检测任务)
- 类型:
-
HOST_IP
- 类型:
字符串
- 说明: Flask 服务器绑定的主机 IP 地址,用于指定服务器监听的 IP 地址。
- 作用: 该参数指定 Flask 服务器的 IP 地址,默认为
0.0.0.0
监听所有接口。该参数必须正确设置为项目运行主机的IP,否则无法实现局域网推流管理。 - 示例:
"192.168.10.15"
- 类型:
-
SUBDIVISION
- 类型:
字符串(逗号分隔)
- 说明: 网络空间搜索任务中使用的地理区域划分,用于限制搜索的地理范围。
- 作用: 该参数用于 ZoomEye 或其他网络空间搜索工具,指定搜索结果所在的地理区域。例如,设置为
"Henan,Hubei"
表示只搜索来自河南和湖北的直播源。 - 示例:
"Henan,Hubei"
(表示只搜索河南和湖北的网络空间资源)
- 类型:
-
EMBY_SERVER_URL
- 类型:
字符串
- 说明: emby内网http地址。
- 作用: 该参数用于配合 API_KEY 在更新 aggregated_channels.m3u8 后刷新emby服务器电视直播的刷新指南功能。
- 示例:
"http://192.168.1.2:8096"
- 类型:
-
API_KEY
- 类型:
字符串
- 说明: emby_server的api密钥。
- 作用: 该参数用于配合 API_KEY 在更新 aggregated_channels.m3u8 后刷新emby服务器电视直播的刷新指南功能。
- 示例:
"0578sa723ba34f30239"
- 类型:
-
PORT
- 类型:
正整数
- 说明: 设置容器中的 Flask 服务器端口运行端口。
- 作用: 该参数用于确定 aggregated_channels.m3u8 内的内网播放地址端口和flask_server.py运行的端口号,如果使用Bridge模式还要增加端口映射
ports: "5000:5000"
。
- 类型:
http://HOST_IP:PORT/aggregated_channels.m3u8
建议选择 host
或 macvlan
模式,并启用 IPV6
。
-
延迟(Latency) - 权重:0.3
- 延迟是指从请求到响应的时间,延迟越低,得分越高。
- 评分公式:
latency_score = max(0, 1 - (latency / max_latency))
max_latency
被设置为 10 秒,意味着 10 秒以上的延迟会得到最低分,而低于 10 秒的延迟则按比例评分。
- 影响:延迟越低,得分越高,满分为 1。
-
下载速度(Download Speed) - 权重:0.3
- 下载速度直接影响视频的播放质量,速度越高,播放越流畅。
- 评分公式:
download_speed_score = min(download_speed / max_download_speed, 1)
max_download_speed
被设定为 80 Mbps,下载速度越接近这个上限,得分越高。
- 影响:下载速度越高,得分越高,满分为 1。
-
分辨率(Resolution) - 权重:0.15
- 分辨率代表视频的画质,分辨率越高,得分越高。
- 分辨率得分映射:
- 480p:0.5
- 576p:1.0
- 720p:1.5
- 1080p:2.0
- 2K:2.5
- 4K:3.0
- Unknown:0.5
- 影响:高分辨率的视频得分更高,最高可达 3.0。
-
视频编码格式(Format) - 权重:0.1
- 视频编码格式的效率和兼容性也会影响评分。
- 格式得分映射:
- HEVC(h265):1.2
- H.264:1.0
- AVS2:0.8
- MPEG2:0.7
- CAVS:0.5
- Unknown:0.1
- 影响:格式越高效,得分越高。
-
稳定性(Stability) - 权重:0.075
- 稳定性反映直播源的连接可靠性,通过成功率和失败率调整。
- 评分公式:
- 成功时:
min(previous_stability + 0.01, 1.0)
- 失败时:
max(previous_stability - 0.05, 0.0)
- 成功时:
- 影响:稳定性越高,评分越高。
-
成功率(Success Rate) - 权重:0.075
- 成功率代表直播源的连接成功率,连接成功越多,得分越高。
- 评分公式:
- 成功时:
min(previous_success_rate + 0.01, 1.0)
- 失败时:
max(previous_success_rate - 0.05, 0.0)
- 成功时:
- 影响:成功率越高,得分越高。
score = (weight_latency * latency_score +
weight_download_speed * download_speed_score +
weight_resolution * resolution_score +
weight_format * format_score +
weight_stability * stability +
weight_success_rate * success_rate)
-
延迟(Latency):0.3
-
下载速度(Download Speed):0.3
-
分辨率(Resolution):0.08
-
视频格式(Format):0.07
-
稳定性(Stability):0.15
-
成功率(Success Rate):0.1
-
延迟 和 下载速度 是评分机制中权重最高的两个因素,各占 30%。
-
分辨率 和 格式 会影响视频的质量,分辨率权重为 8%,格式权重为 7%。
-
稳定性 和 成功率 稳定性权重为 15%,成功率权重为 10%,用于反映直播源的可靠性和连接成功情况。
-
最终评分为加权平均值,并结合之前的评分进行累计,通过这些因素的加权评分,最终生成一个综合得分,评估直播源的整体质量。
-
直播源根据
ffmpeg_check_frequency_minutes
参数值定期对数据库 iptv_playlists 的直播源进行检测。-
当连续
FAILURE_THRESHOLD
次检测失败后将废弃该直播源,保存到数据库 failed_sources 表中, failed_sources 表会在FAILED_SOURCES_CLEANUP_DAYS
后清空,期间新导入的直播源如和 failed_sources 表中相同,直接废弃。 -
检测成功的直播源进入数据库 filtered_playlists 表中,然后根据
SCHEDULER_INTERVAL_MINUTES
参数值定期检测延迟和下载速度,当连续FAILURE_THRESHOLD
次失败后退回 iptv_playlists 表再次进入循环。
-