diff --git a/package/lean/luci-app-qbittorrent/Makefile b/package/lean/luci-app-qbittorrent/Makefile
index 693dfa64c..ccca6c75d 100644
--- a/package/lean/luci-app-qbittorrent/Makefile
+++ b/package/lean/luci-app-qbittorrent/Makefile
@@ -1,16 +1,15 @@
# Copyright (C) 2019 Openwrt.org
#
-# This is a free software, use it under Apache Licene 2.0 & GNU General Public License v3.0.
+# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
-LUCI_TITLE:=qbittorrent-nox for LuCI
+LUCI_TITLE:=LuCI support for qBittorrent
LUCI_DEPENDS:=+qBittorrent +python
LUCI_PKGARCH:=all
-PKG_NAME:=luci-app-qbittorrent
PKG_VERSION=1.0
-PKG_RELEASE:=9
+PKG_RELEASE:=13
include $(TOPDIR)/feeds/luci/luci.mk
diff --git a/package/lean/luci-app-qbittorrent/luasrc/controller/qbittorrent.lua b/package/lean/luci-app-qbittorrent/luasrc/controller/qbittorrent.lua
old mode 100755
new mode 100644
index 11d169c6c..77d58b971
--- a/package/lean/luci-app-qbittorrent/luasrc/controller/qbittorrent.lua
+++ b/package/lean/luci-app-qbittorrent/luasrc/controller/qbittorrent.lua
@@ -13,4 +13,4 @@ function act_status()
e.running=luci.sys.call("pgrep qbittorrent-nox >/dev/null")==0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
-end
+end
\ No newline at end of file
diff --git a/package/lean/luci-app-qbittorrent/luasrc/model/cbi/qbittorrent.lua b/package/lean/luci-app-qbittorrent/luasrc/model/cbi/qbittorrent.lua
old mode 100755
new mode 100644
index b5dbe9d7e..60fa83c5d
--- a/package/lean/luci-app-qbittorrent/luasrc/model/cbi/qbittorrent.lua
+++ b/package/lean/luci-app-qbittorrent/luasrc/model/cbi/qbittorrent.lua
@@ -1,5 +1,5 @@
local e=require"luci.model.uci".cursor()
-local o=e:get_first("qbittorrent","Preferences","port") or 8080
+local o=e:get_first("qbittorrent","main","Port") or 8080
local a=(luci.sys.call("pidof qbittorrent-nox > /dev/null")==0)
@@ -8,25 +8,365 @@ if a then
t="
"
end
+function titlesplit(Value)
+ return "
" .. translate(Value) .. "
" +end + m = Map("qbittorrent", translate("qBittorrent"), translate("qBittorrent is a cross-platform free and open-source BitTorrent client")..t) -m:section(SimpleSection).template="qbittorrent/qbittorrent_status" +s = m:section(NamedSection, "main", "qbittorrent") -s_basic = m:section(TypedSection, "basic", translate("Basic Settings")) -s_basic.anonymous = true +s:tab("basic", translate("Basic Settings")) -enable = s_basic:option(Flag, "enable", translate("Enable")) -profile_dir = s_basic:option(Value,"profile_dir",translate("profile_dir"),translate("Store configuration files in the Path")) -profile_dir.default = "/root" +o = s:taboption("basic", Flag, "enabled", translate("Enabled")) +o.default = "1" -s_download = m:section(TypedSection, "Preferences", translate("Download Settings")) -s_download.anonymous = true -download_dir = s_download:option(Value,"download_dir",translate("download_dir"),translate("Store download files in the Path")) -download_dir.default = "/root/download" +o = s:taboption("basic", ListValue, "user", translate("Run daemon as user")) +local u +for u in luci.util.execi("cat /etc/passwd | cut -d ':' -f1") do + o:value(u) +end -s_webui = m:section(TypedSection, "Preferences", translate("WEBUI Settings")) -s_webui.anonymous = true -port = s_webui:option(Value,"port",translate("port"),translate("WEBUI listening port")) -port.default = "8080" +o = s:taboption("basic", Value, "profile", translate("Parent Path for Profile Folder"), translate("The path for storing profile folder using by command: --profile [PATH].")) +o.default = '/tmp' -return m \ No newline at end of file +o = s:taboption("basic", Value, "configuration", translate("Profile Folder Suffix"), translate("Suffix for profile folder, for example, qBittorrent_[NAME].")) + +o = s:taboption("basic", Value, "Locale", translate("Locale Language")) +o:value("en", translate("English")) +o:value("zh", translate("Chinese")) +o.default = "en" + +o = s:taboption("basic", Flag, "Enabled", translate("Enable Log"), translate("Enable logger to log file.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("basic", Value, "Path", translate("Log Path"), translate("The path for qbittorrent log.")) +o:depends("Enabled", "true") + +o = s:taboption("basic", Flag, "Backup", translate("Enable Backup"), translate("Backup log file when oversize the given size.")) +o:depends("Enabled", "true") +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("basic", Flag, "DeleteOld", translate("Delete Old Backup"), translate("Delete the old log file.")) +o:depends("Enabled", "true") +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("basic", Value, "MaxSizeBytes", translate("Log Max Size"), translate("The max size for qbittorrent log (Unit: Bytes).")) +o:depends("Enabled", "true") +o.placeholder = "66560" + +o = s:taboption("basic", Value, "SaveTime", translate("Log Saving Period"), translate("The log file will be deteted after given time. 1d -- 1 day, 1m -- 1 month, 1y -- 1 year")) +o:depends("Enabled", "true") +o.datatype = "string" + +s:tab("connection", translate("Connection Settings")) + +o = s:taboption("connection", Flag, "UPnP", translate("Use UPnP for Connections"), translate("Use UPnP/ NAT-PMP port forwarding from my router. Refer to the " + .. "wiki.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("connection", Flag, "UseRandomPort", translate("Use Random Port"), translate("Use different port on each startup voids the first" + .. " option, and randomly assigns a different port every time qBittorrent starts up.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("connection", Value, "PortRangeMin", translate("Connection Port"), translate("Generate Randomly")) +o:depends("UseRandomPort", false) +o.datatype = "range(1024,65535)" +o.template = "qbittorrent/qbt_value" +o.btnclick = "randomToken();" + +o = s:taboption("connection", Value, "GlobalDLLimit", translate("Global Download Speed"), translate("Global Download Speed Limit(KiB/s).")) +o.datatype = "float" +o.placeholder = "0" + +o = s:taboption("connection", Value, "GlobalUPLimit", translate("Global Upload Speed"), translate("Global Upload Speed Limit(KiB/s).")) +o.datatype = "float" +o.placeholder = "0" + +o = s:taboption("connection", Value, "GlobalDLLimitAlt", translate("Alternative Download Speed"), translate("Alternative Download Speed Limit(KiB/s).")) +o.datatype = "float" +o.placeholder = "10" + +o = s:taboption("connection", Value, "GlobalUPLimitAlt", translate("Alternative Upload Speed"), translate("Alternative Upload Speed Limit(KiB/s).")) +o.datatype = "float" +o.placeholder = "10" + +o = s:taboption("connection", ListValue, "BTProtocol", translate("Enabled protocol"), translate("The protocol that was enabled.")) +o:value("Both", translate("TCP and UTP")) +o:value("TCP", translate("TCP")) +o:value("UTP", translate("UTP")) +o.default = "Both" + +o = s:taboption("connection", Value, "InetAddress", translate("Inet Address"), translate("The address that respond to the trackers.")) + +s:tab("downloads", translate("Downloads Settings")) + +o = s:taboption("downloads", Flag, "CreateTorrentSubfolder", translate("Create Subfolder"), translate("Create subfolder for torrents with multiple files.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("downloads", Flag, "StartInPause", translate("Start In Pause"), translate("Do not start the download automatically.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("downloads", Flag, "AutoDeleteAddedTorrentFile", translate("Auto Delete Torrent File"), translate("The .torrent files will be deleted afterwards.")) +o.enabled = "IfAdded" +o.disabled = "Never" +o.default = o.disabled + +o = s:taboption("downloads", Flag, "PreAllocation", translate("Pre Allocation"), translate("Pre-allocate disk space for all files.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("downloads", Flag, "UseIncompleteExtension", translate("Use Incomplete Extension"), translate("The incomplete task will be added the extension of !qB.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("downloads", Value, "SavePath", translate("Save Path")) +o.placeholder = "/tmp/download" + +o = s:taboption("downloads", Flag, "TempPathEnabled", translate("Temp Path Enabled")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("downloads", Value, "TempPath", translate("Temp Path"), translate("The absolute and relative path can be set.")) +o:depends("TempPathEnabled", "true") +o.placeholder = "temp/" + +o = s:taboption("downloads", Value, "DiskWriteCacheSize", translate("Disk Cache Size (MiB)"), translate("The value -1 is auto and 0 is disable. In default, it is set to 64MiB.")) +o.datatype = "integer" +o.placeholder = "64" + +o = s:taboption("downloads", Value, "DiskWriteCacheTTL", translate("Disk Cache TTL (s)"), translate("In default, it is set to 60s.")) +o.datatype = "integer" +o.placeholder = "60" + +o = s:taboption("downloads", DummyValue, "Saving Management", titlesplit("Saving Management")) + +o = s:taboption("downloads", ListValue, "DisableAutoTMMByDefault", translate("Default Torrent Management Mode")) +o:value("true", translate("Manual")) +o:value("false", translate("Automaic")) +o.default = "true" + +o = s:taboption("downloads", ListValue, "CategoryChanged", translate("Torrent Category Changed"), translate("Choose the action when torrent category changed.")) +o:value("true", translate("Switch torrent to Manual Mode")) +o:value("false", translate("Relocate torrent")) +o.default = "false" + +o = s:taboption("downloads", ListValue, "DefaultSavePathChanged", translate("Default Save Path Changed"), translate("Choose the action when default save path changed.")) +o:value("true", translate("Switch affected torrent to Manual Mode")) +o:value("false", translate("Relocate affected torrent")) +o.default = "true" + +o = s:taboption("downloads", ListValue, "CategorySavePathChanged", translate("Category Save Path Changed"), translate("Choose the action when category save path changed.")) +o:value("true", translate("Switch affected torrent to Manual Mode")) +o:value("false", translate("Relocate affected torrent")) +o.default = "true" + +o = s:taboption("downloads", Value, "TorrentExportDir", translate("Torrent Export Dir"), translate("The .torrent files will be copied to the target directory.")) + +o = s:taboption("downloads", Value, "FinishedTorrentExportDir", translate("Finished Torrent Export Dir"), translate("The .torrent files for finished downloads will be copied to the target directory.")) + +s:tab("bittorrent", translate("Bittorrent Settings")) + +o = s:taboption("bittorrent", Flag, "DHT", translate("Enable DHT"), translate("Enable DHT (decentralized network) to find more peers")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("bittorrent", Flag, "PeX", translate("Enable PeX"), translate("Enable Peer Exchange (PeX) to find more peers")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("bittorrent", Flag, "LSD", translate("Enable LSD"), translate("Enable Local Peer Discovery to find more peers")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("bittorrent", Flag, "uTP_rate_limited", translate("uTP Rate Limit"), translate("Apply rate limit to µTP protocol.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("bittorrent", ListValue, "Encryption", translate("Encryption Mode"), translate("Enable DHT (decentralized network) to find more peers")) +o:value("0", translate("Prefer Encryption")) +o:value("1", translate("Require Encryption")) +o:value("2", translate("Disable Encryption")) +o.default = "0" + +o = s:taboption("bittorrent", Value, "MaxConnecs", translate("Max Connections"), translate("The max number of connections.")) +o.datatype = "integer" +o.placeholder = "500" + +o = s:taboption("bittorrent", Value, "MaxConnecsPerTorrent", translate("Max Connections Per Torrent"), translate("The max number of connections per torrent.")) +o.datatype = "integer" +o.placeholder = "100" + +o = s:taboption("bittorrent", Value, "MaxUploads", translate("Max Uploads"), translate("The max number of connected peers.")) +o.datatype = "integer" +o.placeholder = "8" + +o = s:taboption("bittorrent", Value, "MaxUploadsPerTorrent", translate("Max Uploads Per Torrent"), translate("The max number of connected peers per torrent.")) +o.datatype = "integer" +o.placeholder = "4" + +o = s:taboption("bittorrent", Value, "MaxRatio", translate("Max Ratio"), translate("The max ratio for seeding. -1 is to disable the seeding.")) +o.datatype = "float" +o.placeholder = "-1" + +o = s:taboption("bittorrent", ListValue, "MaxRatioAction", translate("Max Ratio Action"), translate("The action when reach the max seeding ratio.")) +o:value("0", translate("Pause them")) +o:value("1", translate("Remove them")) +o.defaule = "0" + +o = s:taboption("bittorrent", Value, "GlobalMaxSeedingMinutes", translate("Max Seeding Minutes"), translate("Units: minutes")) +o.datatype = "integer" + +o = s:taboption("bittorrent", DummyValue, "Queueing Setting", titlesplit("Queueing Setting")) + +o = s:taboption("bittorrent", Flag, "QueueingEnabled", translate("Enable Torrent Queueing")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("bittorrent", Value, "MaxActiveDownloads", translate("Maximum Active Downloads")) +o.datatype = "integer" +o.placeholder = "3" + +o = s:taboption("bittorrent", Value, "MaxActiveUploads", translate("Max Active Uploads")) +o.datatype = "integer" +o.placeholder = "3" + +o = s:taboption("bittorrent", Value, "MaxActiveTorrents", translate("Max Active Torrents")) +o.datatype = "integer" +o.placeholder = "5" + +o = s:taboption("bittorrent", Flag, "IgnoreSlowTorrents", translate("Ignore Slow Torrents"), translate("Do not count slow torrents in these limits.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("bittorrent", Value, "SlowTorrentsDownloadRate", translate("Download rate threshold"), translate("Units: KiB/s")) +o.datatype = "integer" +o.placeholder = "2" + +o = s:taboption("bittorrent", Value, "SlowTorrentsUploadRate", translate("Upload rate threshold"), translate("Units: KiB/s")) +o.datatype = "integer" +o.placeholder = "2" + +o = s:taboption("bittorrent", Value, "SlowTorrentsInactivityTimer", translate("Torrent inactivity timer"), translate("Units: seconds")) +o.datatype = "integer" +o.placeholder = "60" + +s:tab("webgui", translate("WebUI Settings")) + +o = s:taboption("webgui", Flag, "UseUPnP", translate("Use UPnP for WebUI"), translate("Using the UPnP / NAT-PMP port of the router for connecting to WebUI.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("webgui", Value, "Username", translate("Username"), translate("The login name for WebUI.")) +o.placeholder = "admin" + +o = s:taboption("webgui", Value, "Password", translate("Password"), translate("The login password for WebUI.")) +o.password = true + +o = s:taboption("webgui", Value, "Port", translate("Listen Port"), translate("The listening port for WebUI.")) +o.datatype = "port" +o.placeholder = "8080" + +o = s:taboption("webgui", Flag, "CSRFProtection", translate("CSRF Protection"), translate("Enable Cross-Site Request Forgery (CSRF) protection.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("webgui", Flag, "ClickjackingProtection", translate("Clickjacking Protection"), translate("Enable clickjacking protection.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("webgui", Flag, "HostHeaderValidation", translate("Host Header Validation"), translate("Validate the host header.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("webgui", Flag, "LocalHostAuth", translate("Local Host Authentication"), translate("Force authentication for clients on localhost.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("webgui", Flag, "AuthSubnetWhitelistEnabled", translate("Enable Subnet Whitelist")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("webgui", DynamicList, "AuthSubnetWhitelist", translate("Subnet Whitelist")) +o:depends("AuthSubnetWhitelistEnabled", "true") + +s:tab("advanced", translate("Advance Settings")) + +o = s:taboption("advanced", Flag, "AnonymousMode", translate("Anonymous Mode"), translate("When enabled, qBittorrent will take certain measures to try" + .. " to mask its identity. Refer to the wiki")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("advanced", Flag, "SuperSeeding", translate("Super Seeding"), translate("The super seeding mode.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("advanced", Flag, "IncludeOverhead", translate("Limit Overhead Usage"), translate("The overhead usage is been limitted.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("advanced", Flag, "IgnoreLimitsLAN", translate("Ignore LAN Limit"), translate("Ignore the speed limit to LAN.")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("advanced", Flag, "osCache", translate("Use os Cache")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +o = s:taboption("advanced", Value, "OutgoingPortsMax", translate("Max Outgoing Port"), translate("The max outgoing port.")) +o.datatype = "port" + +o = s:taboption("advanced", Value, "OutgoingPortsMin", translate("Min Outgoing Port"), translate("The min outgoing port.")) +o.datatype = "port" + +o = s:taboption("advanced", ListValue, "SeedChokingAlgorithm", translate("Choking Algorithm"), translate("The strategy of choking algorithm.")) +o:value("RoundRobin", translate("Round Robin")) +o:value("FastestUpload", translate("Fastest Upload")) +o:value("AntiLeech", translate("Anti-Leech")) +o.default = "FastestUpload" + +o = s:taboption("advanced", Flag, "AnnounceToAllTrackers", translate("Announce To All Trackers")) +o.enabled = "true" +o.disabled = "false" +o.default = o.disabled + +o = s:taboption("advanced", Flag, "AnnounceToAllTiers", translate("Announce To All Tiers")) +o.enabled = "true" +o.disabled = "false" +o.default = o.enabled + +return m diff --git a/package/lean/luci-app-qbittorrent/luasrc/view/qbittorrent/qbt_value.htm b/package/lean/luci-app-qbittorrent/luasrc/view/qbittorrent/qbt_value.htm new file mode 100644 index 000000000..001625a7f --- /dev/null +++ b/package/lean/luci-app-qbittorrent/luasrc/view/qbittorrent/qbt_value.htm @@ -0,0 +1,36 @@ +<%# + Copyright 2019 xxx