🌴 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

+19
View File
@@ -0,0 +1,19 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.1.1-20240822
PKG_RELEASE:=1
LUCI_TITLE:=LuCI support for jackett
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+lsblk +docker +dockerd +luci-lib-taskd
define Package/luci-app-jackett/conffiles
/etc/config/jackett
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
+7
View File
@@ -0,0 +1,7 @@
module("luci.controller.jackett", package.seeall)
function index()
entry({"admin", "services", "jackett"}, alias("admin", "services", "jackett", "config"), _("Jackett"), 30).dependent = true
entry({"admin", "services", "jackett", "config"}, cbi("jackett"))
end
@@ -0,0 +1,57 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local jackett_model = require "luci.model.jackett"
local m, s, o
m = taskd.docker_map("jackett", "jackett", "/usr/libexec/istorec/jackett.sh",
translate("Jackett"),
translate("Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.")
.. translate("Official website:") .. ' <a href=\"https://github.com/Jackett/Jackett\" target=\"_blank\">https://github.com/Jackett/Jackett</a>')
s = m:section(SimpleSection, translate("Service Status"), translate("Jackett status:"))
s:append(Template("jackett/status"))
s = m:section(TypedSection, "jackett", 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.rmempty = false
o.default = "9117"
o.datatype = "port"
o = s:option(Value, "image_name", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o:value("linuxserver/jackett:latest", "linuxserver/jackett:latest")
o.default = "linuxserver/jackett:latest"
local blocks = jackett_model.blocks()
local home = jackett_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = jackett_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, "save_path", translate("Torrent save path").."<b>*</b>", translate("Usually use the monitoring folder of the torrent download tool"))
o.rmempty = false
o.datatype = "string"
local paths, default_path = jackett_model.find_paths(blocks, home, "Public")
for _, val in pairs(paths) do
o:value(val, val)
end
o.default = default_path
o = s:option(Flag, "auto_update", translate("Auto update"))
o.default = 1
o.rmempty = false
return m
+55
View File
@@ -0,0 +1,55 @@
local util = require "luci.util"
local jsonc = require "luci.jsonc"
local jackett = {}
jackett.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
jackett.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
jackett.find_paths = function(blocks, home_dirs, path_name)
local appname = '/Jackett'
local default_path = ''
local configs = {}
if #blocks == 0 then
return configs, default_path
else
if path_name == "Public" then
appname = "/Downloads"
end
for _, val in pairs(blocks) do
table.insert(configs, val .. "/" .. path_name .. appname)
end
default_path = configs[1]
end
return configs, default_path
end
return jackett
@@ -0,0 +1,31 @@
<%
local util = require "luci.util"
local container_status = util.trim(util.exec("/usr/libexec/istorec/jackett.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"><%:Jackett is running%></button>
<% else %>
<button class="cbi-button cbi-button-negative" disabled="true"><%:Jackett is not running%></button>
<% end %>
</div>
</div>
<%
if container_running then
local port=util.trim(util.exec("/usr/libexec/istorec/jackett.sh port"))
if port == "" then
port="9117"
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 Jackett%>" onclick="window.open('http://'+location.hostname+':<%=port%>/', '_blank')">
</div>
</div>
<% end %>
+47
View File
@@ -0,0 +1,47 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps."
msgstr "Jackett 是维护索引器抓取和翻译逻辑的单一存储库 - 消除了其他应用程序的负担。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Torrent save path"
msgstr "种子保存路径"
msgid "Port"
msgstr "端口"
msgid "Auto update"
msgstr "自动更新"
msgid "Service Status"
msgstr "服务状态"
msgid "Jackett status:"
msgstr "Jackett 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "Jackett is running"
msgstr "Jackett 运行中"
msgid "Jackett is not running"
msgstr "Jackett 未运行"
msgid "Open Jackett"
msgstr "打开 Jackett"
msgid "Usually use the monitoring folder of the torrent download tool"
msgstr "通常使用BT下载工具的监控文件夹"
+1
View File
@@ -0,0 +1 @@
zh-cn
+6
View File
@@ -0,0 +1,6 @@
config jackett
option 'auto_update' '1'
option 'port' '9117'
option 'save_path' ''
option 'config_path' ''
option 'image_name' 'linuxserver/jackett:latest'
+88
View File
@@ -0,0 +1,88 @@
#!/bin/sh
ACTION=${1}
shift 1
do_install() {
local save_path=`uci get jackett.@jackett[0].save_path 2>/dev/null`
local config=`uci get jackett.@jackett[0].config_path 2>/dev/null`
local port=`uci get jackett.@jackett[0].port 2>/dev/null`
local auto_update=`uci get jackett.@jackett[0].auto_update 2>/dev/null`
local IMAGE_NAME=`uci get jackett.@jackett[0].image_name 2>/dev/null`
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
if [ -z "$save_path" ]; then
echo "save path is empty!"
exit 1
fi
[ -z "$port" ] && port=9117
[ -z "$IMAGE_NAME" ] && IMAGE_NAME="linuxserver/jackett:latest"
echo "docker pull ${IMAGE_NAME}"
docker pull ${IMAGE_NAME}
docker rm -f jackett
local cmd="docker run --restart=unless-stopped -d \
-v \"$config:/config\" \
-v \"$save_path:/downloads\" \
--dns=172.17.0.1 \
-p $port:9117 "
local tz="`uci get system.@system[0].zonename | sed 's/ /_/g'`"
[ -z "$tz" ] || cmd="$cmd -e TZ=$tz"
if [ -n "$auto_update" ]; then
if [ "$auto_update" = 1 ]; then
cmd="$cmd -e AUTO_UPDATE=true"
else
cmd="$cmd -e AUTO_UPDATE=false"
fi
fi
cmd="$cmd --name jackett \"$IMAGE_NAME\""
echo "$cmd"
eval "$cmd"
echo "Waiting 15s to setup"
sleep 15
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the jackett"
echo " upgrade Upgrade the jackett"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the jackett"
echo " status Jackett status"
echo " port Jackett port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f jackett
;;
"start" | "stop" | "restart")
docker ${ACTION} jackett
;;
"status")
docker ps --all -f 'name=^/jackett$' --format '{{.State}}'
;;
"port")
docker ps --all -f 'name=^/jackett$' --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-jackett": {
"description": "Grant UCI access for luci-app-jackett",
"read": {
"uci": [ "jackett" ]
},
"write": {
"uci": [ "jackett" ]
}
}
}