Merge pull request #37 from linkease/plex

Plex Supported
This commit is contained in:
Janson 2022-11-09 10:27:20 +08:00 committed by GitHub
commit e22ba858a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 342 additions and 0 deletions

View File

@ -0,0 +1,18 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.0.0-20221106
PKG_RELEASE:=
LUCI_TITLE:=LuCI support for Plex
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+docker +luci-lib-taskd
define Package/luci-app-plex/conffiles
/etc/config/plex
endef
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -0,0 +1,7 @@
module("luci.controller.plex", package.seeall)
function index()
entry({"admin", "services", "plex"}, alias("admin", "services", "plex", "config"), _("Plex"), 30).dependent = true
entry({"admin", "services", "plex", "config"}, cbi("plex"))
end

View File

@ -0,0 +1,65 @@
--[[
LuCI - Lua Configuration Interface
]]--
local taskd = require "luci.model.tasks"
local plex_model = require "luci.model.plex"
local m, s, o
m = taskd.docker_map("plex", "plex", "/usr/libexec/istorec/plex.sh",
translate("Plex"),
translate("Plex is an elegant solution to organise all your web applications.")
.. translate("Official website:") .. ' <a href=\"https://www.plex.tv/\" target=\"_blank\">https://www.plex.tv/</a>')
s = m:section(SimpleSection, translate("Service Status"), translate("Plex status:"))
s:append(Template("plex/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(Flag, "hostnet", translate("Host network"), translate("Plex running in host network, for DLNA application, port is always 32400 if enabled"))
o.default = 0
o.rmempty = false
o = s:option(Value, "claim_token", translate("Plex Claim"))
o.datatype = "string"
o = s:option(Value, "port", translate("Port").."<b>*</b>")
o.rmempty = false
o.default = "32400"
o.datatype = "port"
o:depends("hostnet", 0)
o = s:option(Value, "image_name", translate("Image").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
o:value("plexinc/pms-docker:latest", "plexinc/pms-docker:latest")
o:value("plexinc/pms-docker:1.29.1.6316-f4cdfea9c", "plexinc/pms-docker:1.29.1.6316-f4cdfea9c")
o.default = "plexinc/pms-docker:latest"
local blocks = plex_model.blocks()
local home = plex_model.home()
o = s:option(Value, "config_path", translate("Config path").."<b>*</b>")
o.rmempty = false
o.datatype = "string"
local paths, default_path = plex_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, "media_path", translate("Media path"))
o.datatype = "string"
o = s:option(Value, "cache_path", translate("Transcode cache path"), translate("Default use 'transcodes' in 'config path' if not set, please make sure there has enough space"))
o.datatype = "string"
local paths, default_path = plex_model.find_paths(blocks, home, "Caches")
for _, val in pairs(paths) do
o:value(val, val)
end
o.default = default_path
return m

View File

@ -0,0 +1,54 @@
local util = require "luci.util"
local jsonc = require "luci.jsonc"
local plex = {}
plex.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
plex.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["Downloads"] = uci:get_first("quickstart", "main", "dl_dir", home_dirs["main_dir"].."/Downloads")
home_dirs["Caches"] = uci:get_first("quickstart", "main", "tmp_dir", home_dirs["main_dir"].."/Caches")
return home_dirs
end
plex.find_paths = function(blocks, home_dirs, path_name)
local default_path = ''
local configs = {}
default_path = home_dirs[path_name] .. "/Plex"
if #blocks == 0 then
table.insert(configs, default_path)
else
for _, val in pairs(blocks) do
table.insert(configs, val .. "/" .. path_name .. "/Plex")
end
local without_conf_dir = "/root/" .. path_name .. "/Plex"
if default_path == without_conf_dir then
default_path = configs[1]
end
end
return configs, default_path
end
return plex

View File

@ -0,0 +1,31 @@
<%
local util = require "luci.util"
local container_status = util.trim(util.exec("/usr/libexec/istorec/plex.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"><%:Plex is running%></button>
<% else %>
<button class="cbi-button cbi-button-negative" disabled="true"><%:Plex is not running%></button>
<% end %>
</div>
</div>
<%
if container_running then
local port=util.trim(util.exec("/usr/libexec/istorec/plex.sh port"))
if port == "" then
port="32400"
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 Plex%>" onclick="window.open('http://'+location.hostname+':<%=port%>/', '_blank')">
</div>
</div>
<% end %>

View File

@ -0,0 +1,41 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "Official website:"
msgstr "官方网站:"
msgid "Plex is an streaming media service and a clientserver media player platform, made by Plex, Inc."
msgstr "Plex 是一个多媒体串流平台。"
msgid "Config path"
msgstr "配置文件路径"
msgid "Port"
msgstr "端口"
msgid "HTTP Port"
msgstr "HTTP 端口"
msgid "Service Status"
msgstr "服务状态"
msgid "Plex status:"
msgstr "Plex 的状态信息如下:"
msgid "Setup"
msgstr "安装配置"
msgid "The following parameters will only take effect during installation or upgrade:"
msgstr "以下参数只在安装或者升级时才会生效:"
msgid "Status"
msgstr "状态"
msgid "Plex is running"
msgstr "Plex 运行中"
msgid "Plex is not running"
msgstr "Plex 未运行"
msgid "Open Plex"
msgstr "打开 Plex"

View File

@ -0,0 +1,7 @@
config main
option 'hostnet' '0'
option 'claim_token' ''
option 'port' '32400'
option 'image_name' 'plexinc/pms-docker:latest'
option 'config_path' ''

View File

@ -0,0 +1,103 @@
#!/bin/sh
# Author Xiaobao(xiaobao@linkease.com)
ACTION=${1}
shift 1
do_install() {
local hostnet=`uci get plex.@main[0].hostnet 2>/dev/null`
local claim_token==`uci get plex.@main[0].claim_token 2>/dev/null`
local port=`uci get plex.@main[0].port 2>/dev/null`
local image_name=`uci get plex.@main[0].image_name 2>/dev/null`
local config=`uci get plex.@main[0].config_path 2>/dev/null`
local media=`uci get plex.@main[0].media_path 2>/dev/null`
local cache=`uci get plex.@main[0].cache_path 2>/dev/null`
[ -z "$image_name" ] && image_name="plexinc/pms-docker:latest"
echo "docker pull ${image_name}"
docker pull ${image_name}
docker rm -f plex
if [ -z "$config" ]; then
echo "config path is empty!"
exit 1
fi
[ -z "$port" ] && port=32400
local cmd="docker run --restart=unless-stopped -d -h PlexServer -v \"$config:/config\" "
if [ -d /dev/dri ]; then
cmd="$cmd\
--device /dev/dri:/dev/dri \
--privileged "
fi
if [ "$hostnet" = 1 ]; then
cmd="$cmd\
--dns=127.0.0.1 \
--network=host "
else
cmd="$cmd\
--dns=172.17.0.1 \
-p 3005:3005/tcp \
-p 8324:8324/tcp \
-p 32469:32469/tcp \
-p 32410:32410/udp \
-p 32412:32412/udp \
-p 32413:32413/udp \
-p 32414:32414/udp \
-p $port:32400 "
fi
local tz="`cat /tmp/TZ`"
[ -z "$tz" ] || cmd="$cmd -e TZ=$tz"
[ -z "$claim_token" ] || cmd="$cmd -e \"PLEX_CLAIM=$claim_token\""
[ -z "$cache" ] || cmd="$cmd -v \"$cache:/transcode\""
[ -z "$media" ] || cmd="$cmd -v \"$media:/data\""
cmd="$cmd -v /mnt:/mnt"
mountpoint -q /mnt && cmd="$cmd:rslave"
cmd="$cmd --name plex \"$image_name\""
echo "$cmd"
eval "$cmd"
}
usage() {
echo "usage: $0 sub-command"
echo "where sub-command is one of:"
echo " install Install the plex"
echo " upgrade Upgrade the plex"
echo " rm/start/stop/restart Remove/Start/Stop/Restart the plex"
echo " status Plex status"
echo " port Plex port"
}
case ${ACTION} in
"install")
do_install
;;
"upgrade")
do_install
;;
"rm")
docker rm -f plex
;;
"start" | "stop" | "restart")
docker ${ACTION} plex
;;
"status")
docker ps --all -f 'name=plex' --format '{{.State}}'
;;
"port")
local port=`uci get plex.@main[0].port 2>/dev/null`
echo $port
;;
*)
usage
exit 1
;;
esac

View File

@ -0,0 +1,16 @@
#!/bin/sh
# run in router
APPNAME=$1
if [ -z "${APPNAME}" ]; then
APPNAME=plex
fi
mkdir -p /usr/lib/lua/luci/view/${APPNAME}
cp ./luasrc/controller/${APPNAME}.lua /usr/lib/lua/luci/controller/
cp ./luasrc/view/${APPNAME}/* /usr/lib/lua/luci/view/${APPNAME}/
cp -rf ./luasrc/model/* /usr/lib/lua/luci/model/
cp -rf ./root/* /
rm -rf /tmp/luci-*