🌴 Sync 2026-03-05 23:51:42

This commit is contained in:
github-actions[bot] committed 2026-03-05 23:51:42 +08:00
1 parent 97c049ed0a
commit 0acff03804
14253 files changed
+3893239

No files matched your search

+18
View File
@@ -0,0 +1,18 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.0.2-20240822
PKG_RELEASE:=1
LUCI_TITLE:=LuCI support for Xteve
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+lsblk +docker +dockerd +luci-lib-taskd +luci-lib-docker
define Package/luci-app-xteve/conffiles
/etc/config/xteve
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
+7
View File
@@ -0,0 +1,7 @@
module("luci.controller.xteve", package.seeall)
function index()
entry({"admin", "services", "xteve"}, alias("admin", "services", "xteve", "config"), _("Xteve"), 30).dependent = true
entry({"admin", "services", "xteve", "config"}, cbi("xteve"))
end
+58
View File
@@ -0,0 +1,58 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local docker = require "luci.docker"
local xteve_model = require "luci.model.xteve"
local m, s, o
m = taskd.docker_map("xteve", "xteve", "/usr/libexec/istorec/xteve.sh",
translate("Xteve"),
translate("Xteve is M3U Proxy for Plex DVR and Emby Live TV.")
.. translate("Official website:") .. ' <a href=\"https://github.com/xteve-project/xTeVe\" target=\"_blank\">https://github.com/xteve-project/xTeVe</a>')
local dk = docker.new({socket_path="/var/run/docker.sock"})
local dockerd_running = dk:_ping().code == 200
local docker_info = dockerd_running and dk:info().body or {}
s = m:section(SimpleSection, translate("Service Status"), translate("Xteve status:"))
s:append(Template("xteve/status"))
s = m:section(TypedSection, "main", translate("Setup"), translate("The following parameters will only take effect during installation or upgrade:"))
s.addremove=false
s.anonymous=true
o = s:option(Value, "port", translate("Port").."<b>*</b>")
o.default = "32400"
o.datatype = "port"
o = s:option(Value, "image_name", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
if "x86_64" == docker_info.Architecture or "aarch64" == docker_info.Architecture then
o:value("jjm2473/xteve_guide2go", "jjm2473/xteve_guide2go")
o.default = "jjm2473/xteve_guide2go"
else
o:value("", translate("Unsupported Architecture"))
o.default = ""
end
local blocks = xteve_model.blocks()
local home = xteve_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = xteve_model.find_paths(blocks, home, "Configs")
for _, val in pairs(paths) do
o:value(val, val)
end
o.default = default_path
o = s:option(Value, "time_zone", translate("Timezone"))
o.datatype = "string"
o:value("Asia/Shanghai", "Asia/Shanghai")
return m
+55
View File
@@ -0,0 +1,55 @@
local util = require "luci.util"
local jsonc = require "luci.jsonc"
local xteve = {}
xteve.blocks = function()
local f = io.popen("lsblk -s -f -b -o NAME,FSSIZE,MOUNTPOINT --json", "r")
local vals = {}
if f then
local ret = f:read("*all")
f:close()
local obj = jsonc.parse(ret)
for _, val in pairs(obj["blockdevices"]) do
local fsize = val["fssize"]
if fsize ~= nil and string.len(fsize) > 10 and val["mountpoint"] then
-- fsize > 1G
vals[#vals+1] = val["mountpoint"]
end
end
end
return vals
end
xteve.home = function()
local uci = require "luci.model.uci".cursor()
local home_dirs = {}
home_dirs["main_dir"] = uci:get_first("quickstart", "main", "main_dir", "/root")
home_dirs["Configs"] = uci:get_first("quickstart", "main", "conf_dir", home_dirs["main_dir"].."/Configs")
home_dirs["Public"] = uci:get_first("quickstart", "main", "pub_dir", home_dirs["main_dir"].."/Public")
home_dirs["Downloads"] = uci:get_first("quickstart", "main", "dl_dir", home_dirs["Public"].."/Downloads")
home_dirs["Caches"] = uci:get_first("quickstart", "main", "tmp_dir", home_dirs["main_dir"].."/Caches")
return home_dirs
end
xteve.find_paths = function(blocks, home_dirs, path_name)
local default_path = ''
local configs = {}
default_path = home_dirs[path_name] .. "/Xteve"
if #blocks == 0 then
table.insert(configs, default_path)
else
for _, val in pairs(blocks) do
table.insert(configs, val .. "/" .. path_name .. "/Xteve")
end
local without_conf_dir = "/root/" .. path_name .. "/Xteve"
if default_path == without_conf_dir then
default_path = configs[1]
end
end
return configs, default_path
end
return xteve
@@ -0,0 +1,31 @@
<%
local util = require "luci.util"
local container_status = util.trim(util.exec("/usr/libexec/istorec/xteve.sh status"))
local container_install = (string.len(container_status) > 0)
local container_running = container_status == "running"
-%>
<div class="cbi-value">
<label class="cbi-value-title"><%:Status%></label>
<div class="cbi-value-field">
<% if container_running then %>
<button class="cbi-button cbi-button-success" disabled="true"><%:Xteve is running%></button>
<% else %>
<button class="cbi-button cbi-button-negative" disabled="true"><%:Xteve is not running%></button>
<% end %>
</div>
</div>
<%
if container_running then
local port=util.trim(util.exec("/usr/libexec/istorec/xteve.sh port"))
if port == "" then
port="34400"
end
-%>
<div class="cbi-value cbi-value-last">
<label class="cbi-value-title">&nbsp;</label>
<div class="cbi-value-field">
<input type="button" class="btn cbi-button cbi-button-apply" name="start" value="<%:Open Xteve%>" onclick="window.open('http://'+location.hostname+':<%=port%>/web/', '_blank')">
</div>
</div>
<% end %>
+44
View File
@@ -0,0 +1,44 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "Xteve is M3U Proxy for Plex DVR and Emby Live TV."
msgstr "Xteve 是一个在线电视源的代理工具。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Port"
msgstr "端口"
msgid "HTTP Port"
msgstr "HTTP 端口"
msgid "Service Status"
msgstr "服务状态"
msgid "Xteve status:"
msgstr "Xteve 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "Xteve is running"
msgstr "Xteve 运行中"
msgid "Xteve is not running"
msgstr "Xteve 未运行"
msgid "Open Xteve"
msgstr "打开 Xteve"
msgid "Unsupported Architecture"
msgstr "不支持此架构"
+1
View File
@@ -0,0 +1 @@
zh-cn
+4
View File
@@ -0,0 +1,4 @@
config main
option 'port' '34400'
option 'config_path' ''
+83
View File
@@ -0,0 +1,83 @@
#!/bin/sh
# Author Xiaobao(xiaobao@linkease.com)
ACTION=${1}
shift 1
do_install() {
local port=`uci get xteve.@main[0].port 2>/dev/null`
local image_name=`uci get xteve.@main[0].image_name 2>/dev/null`
local config=`uci get xteve.@main[0].config_path 2>/dev/null`
local tz=`uci get xteve.@main[0].time_zone 2>/dev/null`
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
if [ -z "$image_name" ]; then
local arch=`uname -m`
[ "$arch" = "x86_64" -o "$arch" = "aarch64" ] && image_name="jjm2473/xteve_guide2go"
if [ -z "$image_name" ]; then
echo "$arch is unsupported!" >&2
exit 1
fi
fi
echo "docker pull ${image_name}"
docker pull ${image_name}
docker rm -f xteve
[ -z "$port" ] && port=34400
local cmd="docker run --restart=unless-stopped -d \
-v $config:/root/.xteve:rw \
-v $config/_config:/config:rw \
-v $config/_guide2go:/guide2go:rw \
-v /tmp/xteve:/tmp/xteve:rw \
-p $port:34400 "
if [ -z "$tz" ]; then
tz="`uci get system.@system[0].zonename | sed 's/ /_/g'`"
fi
[ -z "$tz" ] || cmd="$cmd -e TZ=$tz"
cmd="$cmd --name xteve \"$image_name\""
echo "$cmd"
eval "$cmd"
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the xteve"
echo " upgrade Upgrade the xteve"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the xteve"
echo " status Xteve status"
echo " port Xteve port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f xteve
;;
"start" | "stop" | "restart")
docker ${ACTION} xteve
;;
"status")
docker ps --all -f 'name=^/xteve$' --format '{{.State}}'
;;
"port")
docker ps --all -f 'name=^/xteve$' --format '{{.Ports}}' | grep -om1 '0.0.0.0:[0-9]*' | sed 's/0.0.0.0://'
;;
*)
usage
exit 1
;;
esac
@@ -0,0 +1,11 @@
{
"luci-app-xteve": {
"description": "Grant UCI access for luci-app-xteve",
"read": {
"uci": [ "xteve" ]
},
"write": {
"uci": [ "xteve" ]
}
}
}