通过树莓派+Kodi做电视盒子,定期更新直播链接

   一、背景

    移居到外地的老人,习惯了看老家的地方频道,但是卫星电视搜不到该频道,电视直播软件(电视家等)在某个时间后也没有了该地方频道资源。近期在网上的直播网站找了该资源,但直播链接设置了时间戳和加密字符串,是个时间戳防盗链,具有一定的时效性。在无法找到其他长期有效IPTV直播源的情况下,打算通过一些方式利用该短期链接,达到长期观看的效果。

    实现方式:通过树莓派+Kodi做电视盒子,利用Kodi的插件,定期更新直播链接,实现长期观看的效果。

    直播链接的更新:在电脑上设置定期运行的python脚本,将拿到的新的直播链接,更新到Gitee对应的m3u8文件;

    在Kodi的插件上,将M3U播放列表url设置为Gitee对应的m3u8文件位置,同样定期更新该url;

   二、树莓派+Kodi

树莓派+Kodi做电视盒子可参照:

DIY电视盒子-CSDN博客

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

 四、效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值