嘿,我有一个(至少对我来说)相当难的问题。
我的 Ubuntu 服务器上安装了 plex 媒体服务器。我正在编写一个脚本,该脚本将每 12 小时自动检查 plex 服务器是否有更新,如果有更新,它会自动下载。它是用 bash 编写的,因为这是我唯一知道的语言。
#! /bin/bash
ogpath=$(pwd)
path=$(locate -br '^12hpmscheck.sh$' | xargs dirname)
cd "$path"
#step 1
oldlink="https://downloads.plex.tv/plex-media-server-new/1.21.1.3830-6c22540d5/debian/plexmediaserver_1.21.1.3830-6c22540d5_amd64.deb"
newlink=$(sudo wget https://plex.tv/pms/downloads/5.json && sudo chmod 777 "$path/5.json" && sudo chmod a+rwx "$path/5.json" && grep -o 'Ubuntu (16.04+) / Debian (8+) - Intel/AMD 64-bit","build":"linux-x86_64","distro":"debian","url":"https://downloads.plex.tv/plex-media-server-new/.*/debian/plexmediaserver_.*_amd64.deb","checksum":".*"},{"label":"Ubuntu (16.04+) / Debian (8+) - ARMv8' "$path/5.json" | grep -o 'https://.*.deb')
if [[ "$oldlink" == "$newlink" ]]
then
echo "no new version"
rm "$path/5.json"
cd "$ogpath"
sleep 12h
$path/12hpmscheck.sh
else
echo "new version"
#step 3
wget "$newlink"
echo "downloaded new version"
sed -i "s|$oldlink|$newlink|" "$path/12hpmscheck.sh"
echo "updated old link"
#step 4
sudo systemctl stop plexmediaserver.service
echo "stopped plexmediaserver.service"
#step 5
sudo dpkg -i plexmediaserver*.deb
echo "installed new version"
#step 6
sudo systemctl start plexmediaserver.service
echo "started plexmediaserver.service"
#step 7
rm 5.json
rm plexmediaserver*.deb
cd "$ogpath"
sleep 12h
$path/12hpmscheck.sh
fi
解释:它首先检查脚本的路径和运行脚本的路径(变量 ogpath 和 path)。某些命令需要这些变量。
然后我们有 var oldlink。除非发现新链接,否则该链接是最新链接。除非有新版本,否则此链接不会改变。
然后我们有 var newlink。此变量每 12 小时更新一次。长话短说,它会下载 plex 网站以下载服务器并找到 Ubuntu 64 位的链接。如果有更新,除了版本号外,结果将与 oldlink 相同。
if-then-else 部分:如果 oldlink 和 newlink 相同(即没有新版本),它会休眠 12 小时,然后再次运行。如果它们不匹配(即有新版本),它会下载 newlink、停止 pms、更新 pms、启动 pms、更新 oldlink 以成为新版本,然后再次休眠 12 小时。
现在您可能已经注意到了 #step 1,3,4,5,6,7。之所以有这些,是因为我在编写脚本之前给自己做了一个笔记。我制定了步骤以及这些步骤中需要发生的事情。这让我清楚我需要做什么。但没有步骤 2。这是因为步骤 2 如下:如果有人现在正在观看 plex(另外两个人可以访问服务器并可以观看内容),请等待 20 分钟,然后再次运行脚本。如果没有人观看,请继续。
我原本计划通过 wget 链接至 plex-dashboard(您可以在其中查看是否有人在观看)并 grep 一个只有有人观看时才会出现的字符串来检查这一点。在该页面的代码中,当有人观看时可以找到以下字符串(当没有人观看时找不到):NowPlaying-nowPlayingList。我会 grep 该字符串,当输出与“NowPlaying-nowPlayingList”匹配时,则有人在观看,它会等待 20 分钟。当输出为空时,它会继续。
问题是我无法 wget 该仪表板页面,因为其中有 #,人们告诉我这意味着它是一个“动态 java”页面。我无法 wget 它。所以我搜索了其他检查方法,并想到可以从本地代码中 grep 该字符串。Pms 安装在我的服务器上,因此机器上必须有它的代码。如果我找到与该仪表板相关的代码,我可以在那里搜索字符串。
问题是:我找不到任何与 pms 的纯功能相关的代码,更不用说仪表板的代码了。我在哪里可以找到代码,或者有没有我没想过的其他方法来检查这一点。我更喜欢使用 bash,但如果必须的话,我可以改用其他语言。不过我必须重写整个脚本。
如果有办法更好/更快地编写代码的其他部分,我们也欢迎提出建议!
希望您能帮忙。谢谢!
答案1
一些建议和指示太多,无法评论:
作为@cmak.fr指出,您应该使用 a
cron
而sleep
不是:跑步:
$ crontab -e
并添加如下一行:
0 */12 * * * /path/to/my/script
然后您的脚本将每 12 小时运行一次。如果没有新版本,请确保退出脚本。
直接使用
curl
或wget -O-
和grep
输出,而不是使用下载文件。因为这是
json
输出,所以忘记我刚才说的话吧。不要使用grep
!使用json
解析器(例如jq
)安装:
sudo apt install jq
用法:
newlink=$(curl plex.tv/... | jq '.url')
(类似的东西,我不知道完整的 plex
json
输出)通过某些 JavaScript 加载的网站抓取内容是可能的,但并不容易,而且通常没有必要。JavaScript 将查询一些 API,您应该直接查询。
打开 plex.tv 网站并检查开发人员工具的“网络”选项卡,查找除主 html 之外加载的内容。
-或更好-
与其尝试猜测,不如检查一下plex API 手册:;-)
尝试,
curl http://ip:port/status/sessions
“这将检索 PMS 的“正在播放”信息。”