一、背景
移居到外地的老人,习惯了看老家的地方频道,但是卫星电视搜不到该频道,电视直播软件(电视家等)在某个时间后也没有了该地方频道资源。近期在网上的直播网站找了该资源,但直播链接设置了时间戳和加密字符串,是个时间戳防盗链,具有一定的时效性。在无法找到其他长期有效IPTV直播源的情况下,打算通过一些方式利用该短期链接,达到长期观看的效果。
实现方式:通过树莓派+Kodi做电视盒子,利用Kodi的插件,定期更新直播链接,实现长期观看的效果。
直播链接的更新:在电脑上设置定期运行的python脚本,将拿到的新的直播链接,更新到Gitee对应的m3u8文件;
在Kodi的插件上,将M3U播放列表url设置为Gitee对应的m3u8文件位置,同样定期更新该url;
二、树莓派+Kodi
树莓派+Kodi做电视盒子可参照:
Kodi 设置中文页面,可参照:
Kodi如何设置为中文语言? - Kodi教程 - Kodi中文网 里面介绍了设置中文界面遇到的问题和解决方式
Kodi 安装PVR IPTV Simple Client,可参照:
Kodi看电视直播教程 安装PVR IPTV Simple Client - Kodi教程 - Kodi中文网
Kodi 遥控器设置上下键换台:
如果Kodi安装在电视盒子上,使用遥控器控制,默认情况下换台要按“确认”键。可打开Kodi设置 - PRV和直播电视 - 播放,“按'确定'确认频道切换”改为关闭。使用上下键就能换台了;
树莓派启用3.5mm音频输出:
通过树莓派安装kodi做电视盒子,完成后,接3.5mm插孔外置音响,但是没有声音出来-CSDN博客
其他Kodi的玩法及相关设置,可自己寻找相关资料;
三、链接定期更新
3.1 Gitee 直播源制作
Gitee 直播源制作,可参考:
3.2 获取直播链接
通过requests,BeautifulSoup,或者其他方式,获取到具有一定的时效性的直播链接。
3.3 更新到Gitee
可以通过pygit2库,将直播链接更新到Gitee对应的m3u8文件。用pygit2库,是因为用它可以不用在电脑安装git;
代码:
1、查看是否有本地仓库,没有的话,克隆远程仓库到本地,有的话,拉取远程仓库,更改合并到本地仓库;
2、修改目标文件;
3、保存修改,提交更改;
4、更改推送到远程仓库;
import os
import pygit2
# 设置认证凭证(用户名和个人访问令牌)
credentials = pygit2.UserPass('xxx', 'xxxx')
# 本地仓库路径
local_path = './repo'
# 使用 HTTPS 协议的 Git 仓库 URL
remote_url = 'https://gitee.com/xxx/xxx.git' # https的链接,在gitee上面,点击下载/克隆,里面验证信息都有
try:
# 打开本地仓库
repo = pygit2.Repository(local_path)
print("本地仓库已存在,开始拉取最新更改...")
# 获取远程仓库
remote = repo.remotes["origin"]
# 设置认证回调
callbacks = pygit2.RemoteCallbacks(credentials=credentials)
# 拉取远程更改
remote.fetch(callbacks=callbacks)
print("远程更改已拉取。")
# 获取远程分支最新提交哈希
remote_branch = "refs/remotes/origin/master" # 远程主分支名称,主要是最后那个,看gitee上面是master还是main
remote_commit = repo.lookup_reference(remote_branch).target
# 合并远程分支的最新更改到本地
repo.merge(remote_commit)
# 检查是否有冲突
if repo.index.conflicts: # 检查是否有冲突
print("Merge conflicts detected. Please resolve them manually.")
else:
# 创建合并提交
author = pygit2.Signature('xxx', 'xxxx@user.noreply.gitee.com') # 提交作者信息
committer = pygit2.Signature('xxx', 'xxxx@user.noreply.gitee.com') # 提交者信息
repo.create_commit(
"refs/heads/master",
author,
committer,
"Merged remote changes",
repo.index.write_tree(),
[repo.head.target, remote_commit]
)
print("远程更改已合并到本地。")
except pygit2.GitError:
print("本地仓库不存在,开始克隆远程仓库...")
# 克隆仓库
repo = pygit2.clone_repository(
remote_url,
local_path,
callbacks=pygit2.RemoteCallbacks(credentials=credentials)
)
print("仓库已成功克隆到本地。")
# 修改目标文件
file_path = 'xxx.m3u8' # 仓库中的目标文件路径
full_file_path = os.path.join(local_path, file_path)
# 读取文件内容并修改
with open(full_file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 在文本上修改,index从0开始,下面修改的是第4行文本
lines[3] = '新的内容\n'
# 保存修改
with open(full_file_path, 'w', encoding='utf-8') as file:
file.writelines(lines)
print(f"文件 {file_path} 已修改并保存。")
# 添加更改到索引
repo.index.add(file_path)
repo.index.write()
# 提交更改
author = pygit2.Signature('xxx', 'xxxx@user.noreply.gitee.com') # 提交作者信息
committer = pygit2.Signature('xxx', 'xxxx@user.noreply.gitee.com') # 提交者信息
message = "修改了 xxx.m3u8 文件的内容"
tree = repo.index.write_tree()
parent_commit = repo.head.target # 获取当前分支的最新提交
repo.create_commit(
"refs/heads/master", # 提交到的分支,通常是 main 或 master
author,
committer,
message,
tree,
[parent_commit], # 父提交
)
print("更改已提交到本地仓库。")
# 推送更改到远程仓库
remote = repo.remotes["origin"]
callbacks = pygit2.RemoteCallbacks(credentials=credentials)
remote.push(["refs/heads/master"], callbacks=callbacks)
print("更改已推送到远程仓库。")
3.4 设置定时任务,定期执行脚本
为了方便没有安装python环境的电脑运行这个脚本,把这个脚本打包成.exe,再通过windows的定时任务,定期执行该文件。
脚本打包成.exe,可参考:
Python脚本打包成exe,看这一篇就够了!_python 打包-CSDN博客
在windows设置定时任务,可参考:
https://zhuanlan.zhihu.com/p/430602325