Compare commits

...

2 Commits

Author SHA1 Message Date
大葱 1a8c337ce8
Update NoobIPTV.sh 11 months ago
大葱 58e045bafd
Update NoobIPTV.sh 11 months ago
  1. 554
      NoobIPTV.sh

@ -3,22 +3,13 @@
# 名称: NoobIPTV (IPTV 项目相关脚本集合 @小白神器)
# 作者: YanG-1989
# 项目地址:https://github.com/YanG-1989
# 最新版本:2.0.9
# 最新版本:2.1.1
###############################
# 设置路径
SCRIPT_PATH="$HOME/NoobIPTV.sh" # 定义脚本路径
CONFIG_FILE="$HOME/.NoobIPTV" # 配置文件路径
# 设置默认环境变量
REVERSE_PROXY="docker.zhai.cm" # 设置反向代理地址
PORT="52055" # 默认端口
MYTVSUPER_TOKEN="" # myTV 参数
HAMI_SESSION_ID="" # Hami 参数
HAMI_SERIAL_NO="" # Hami 参数
HAMI_SESSION_IP="" # Hami 参数
HTTP_PROXY="" # 设置代理
HTTPS_PROXY="" # 设置代理
# 设置颜色变量
RED="\033[1;31m" # 红
@ -33,9 +24,6 @@ RESET="\033[0m" # 重置
# 显示 菜单
show_menu() {
echo "-------------------"
echo " NoobIPTV 工具盒子 "
echo " 输入 y 快捷启动 "
echo "-------------------"
echo " 请选择一个项目: "
echo "-------------------"
@ -52,7 +40,6 @@ show_menu() {
echo "0) 退出 "
echo " [ Ctrl+C ] "
echo "-------------------"
}
# Pixman 菜单
@ -60,11 +47,9 @@ show_pixman_menu() {
echo "-------------------"
echo " Pixman 菜单: "
echo "-------------------"
echo "1) 安装 Pixman 项目"
echo "2) 设置 Pixman 参数"
echo "3) 生成 Pixman 订阅"
echo "4) 转换 myTV 订阅"
echo "5) 卸载 Pixman 项目"
echo "1) 安装 Pixman 项目"
echo "2) 卸载 Pixman 项目"
echo "3) 设置 反向代理 地址"
echo "-------------------"
echo "0) 返回主菜单 "
echo "-------------------"
@ -108,7 +93,7 @@ show_watchtower_menu() {
echo "0) 返回主菜单 "
echo "----------------------"
}
# 工具箱 菜单
show_toolbox_menu() {
echo "---------------------"
@ -177,132 +162,95 @@ show_subs_menu() {
############# Pixman #############
# 加载 Pixman 参数
reload_configuration() {
if docker ps -a --format '{{.Names}}' | grep -q "pixman"; then
check_and_install_jq
check_and_install_grep
extract_container_parameters
source "$CONFIG_FILE"
else
return 1
fi
}
# 提取 Pixman 参数
extract_container_parameters() {
container_info=$(docker inspect "pixman")
PORT=$(echo "$container_info" | jq -r '.[0].HostConfig.PortBindings."5000/tcp"[0].HostPort // empty')
if [ -z "$PORT" ]; then
PORT=5000
fi
MYTVSUPER_TOKEN=$(echo "$container_info" | jq -r '.[0].Config.Env[] | select(startswith("MYTVSUPER_TOKEN="))' | cut -d= -f2)
HAMI_SESSION_ID=$(echo "$container_info" | jq -r '.[0].Config.Env[] | select(startswith("HAMI_SESSION_ID="))' | cut -d= -f2)
HAMI_SERIAL_NO=$(echo "$container_info" | jq -r '.[0].Config.Env[] | select(startswith("HAMI_SERIAL_NO="))' | cut -d= -f2)
HAMI_SESSION_IP=$(echo "$container_info" | jq -r '.[0].Config.Env[] | select(startswith("HAMI_SESSION_IP="))' | cut -d= -f2)
HTTP_PROXY=$(echo "$container_info" | jq -r '.[0].Config.Env[] | select(startswith("HTTP_PROXY="))' | cut -d= -f2)
HTTPS_PROXY=$(echo "$container_info" | jq -r '.[0].Config.Env[] | select(startswith("HTTPS_PROXY="))' | cut -d= -f2)
echo "PORT=$PORT" > "$CONFIG_FILE"
echo "MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN" >> "$CONFIG_FILE"
echo "HAMI_SESSION_ID=$HAMI_SESSION_ID" >> "$CONFIG_FILE"
echo "HAMI_SERIAL_NO=$HAMI_SERIAL_NO" >> "$CONFIG_FILE"
echo "HAMI_SESSION_IP=$HAMI_SESSION_IP" >> "$CONFIG_FILE"
echo "HTTP_PROXY=$HTTP_PROXY" >> "$CONFIG_FILE"
echo "HTTPS_PROXY=$HTTPS_PROXY" >> "$CONFIG_FILE"
}
# 保存 Pixman 参数
save_parameters() {
{
echo "REVERSE_PROXY=$REVERSE_PROXY"
echo "SCRIPT_PATH=$SCRIPT_PATH"
[ -n "$PORT" ] && echo "PORT=$PORT"
[ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN"
[ -n "$HAMI_SESSION_ID" ] && echo "HAMI_SESSION_ID=$HAMI_SESSION_ID"
[ -n "$HAMI_SERIAL_NO" ] && echo "HAMI_SERIAL_NO=$HAMI_SERIAL_NO"
[ -n "$HAMI_SESSION_IP" ] && echo "HAMI_SESSION_IP=$HAMI_SESSION_IP"
[ -n "$HTTP_PROXY" ] && echo "HTTP_PROXY=$HTTP_PROXY"
[ -n "$HTTPS_PROXY" ] && echo "HTTPS_PROXY=$HTTPS_PROXY"
} > "$CONFIG_FILE"
}
# 设置 Pixman 参数
set_parameters() {
local original_port="$PORT"
local original_token="$MYTVSUPER_TOKEN"
local original_session_id="$HAMI_SESSION_ID"
local original_serial_no="$HAMI_SERIAL_NO"
local original_session_ip="$HAMI_SESSION_IP"
local original_http_proxy="$HTTP_PROXY"
local original_https_proxy="$HTTPS_PROXY"
read -p "请输入反向代理地址 (回车跳过保持当前值: $REVERSE_PROXY, 输入null清空): " input_reverse_proxy
if [ -n "$input_reverse_proxy" ]; then
[ "$input_reverse_proxy" = "null" ] && REVERSE_PROXY="" || REVERSE_PROXY="$input_reverse_proxy"
fi
# 判断 Pixman 容器
judge_Pixman() {
local NETWORK_MODE PORT env_vars
read -p "请输入端口 (回车跳过保持当前值: $PORT, 输入null清空): " input_port
if [ -n "$input_port" ]; then
[ "$input_port" = "null" ] && PORT="" || PORT="$input_port"
fi
echo "正在安装 Pixman 项目 作者: @Pixman..."
read -p "请输入 MYTVSUPER_TOKEN (回车跳过保持当前值: $MYTVSUPER_TOKEN, 输入null清空): " input_token
if [ -n "$input_token" ]; then
[ "$input_token" = "null" ] && MYTVSUPER_TOKEN="" || MYTVSUPER_TOKEN="$input_token"
fi
if docker ps -a --format '{{.Names}}' | grep -q "^pixman$"; then
local MODE ENV_VARS
read -p "请输入 HAMI_SESSION_ID (回车跳过保持当前值: $HAMI_SESSION_ID, 输入null清空): " input_id
if [ -n "$input_id" ]; then
[ "$input_id" = "null" ] && HAMI_SESSION_ID="" || HAMI_SESSION_ID="$input_id"
fi
ENV_VARS=$(docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' pixman)
MYTVSUPER_TOKEN=$(echo "$ENV_VARS" | grep -oP 'MYTVSUPER_TOKEN=\K.*')
HAMI_SESSION_ID=$(echo "$ENV_VARS" | grep -oP 'HAMI_SESSION_ID=\K.*')
HAMI_SERIAL_NO=$(echo "$ENV_VARS" | grep -oP 'HAMI_SERIAL_NO=\K.*')
HAMI_SESSION_IP=$(echo "$ENV_VARS" | grep -oP 'HAMI_SESSION_IP=\K.*')
HTTP_PROXY=$(echo "$ENV_VARS" | grep -oP 'HTTP_PROXY=\K.*')
HTTPS_PROXY=$(echo "$ENV_VARS" | grep -oP 'HTTPS_PROXY=\K.*')
echo -e "${CYAN}检测到已存在的 Pixman 容器,将进行重新安装...${RESET}"
echo -e "当前 ${GREEN}Pixman${RESET} 配置参数:"
[ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN" || echo "MYTVSUPER_TOKEN: 未设置"
[ -n "$HAMI_SESSION_ID" ] && echo "HAMI_SESSION_ID: $HAMI_SESSION_ID" || echo "HAMI_SESSION_ID: 未设置"
[ -n "$HAMI_SERIAL_NO" ] && echo "HAMI_SERIAL_NO: $HAMI_SERIAL_NO" || echo "HAMI_SERIAL_NO: 未设置"
[ -n "$HAMI_SESSION_IP" ] && echo "HAMI_SESSION_IP: $HAMI_SESSION_IP" || echo "HAMI_SESSION_IP: 未设置"
[ -n "$HTTP_PROXY" ] && echo "HTTP_PROXY: $HTTP_PROXY" || echo "HTTP_PROXY: 未设置"
[ -n "$HTTPS_PROXY" ] && echo "HTTPS_PROXY: $HTTPS_PROXY" || echo "HTTPS_PROXY: 未设置"
read -p "请输入 HAMI_SERIAL_NO (回车跳过保持当前值: $HAMI_SERIAL_NO, 输入null清空): " input_serial
if [ -n "$input_serial" ]; then
[ "$input_serial" = "null" ] && HAMI_SERIAL_NO="" || HAMI_SERIAL_NO="$input_serial"
fi
read -p "请输入 HAMI_SESSION_IP (回车跳过保持当前值: $HAMI_SESSION_IP, 输入null清空): " input_ip
if [ -n "$input_ip" ]; then
[ "$input_ip" = "null" ] && HAMI_SESSION_IP="" || HAMI_SESSION_IP="$input_ip"
docker rm -f pixman > /dev/null 2>&1
docker rmi -f "$IMAGE_SOURCE" > /dev/null 2>&1
install_Pixman "$MYTVSUPER_TOKEN" "$HAMI_SESSION_ID" "$HAMI_SERIAL_NO" "$HAMI_SESSION_IP" "$HTTP_PROXY" "$HTTPS_PROXY"
else
install_Pixman
fi
}
read -p "请输入 HTTP_PROXY (回车跳过保持当前值: $HTTP_PROXY, 输入null清空): " input_http_proxy
if [ -n "$input_http_proxy" ]; then
[ "$input_http_proxy" = "null" ] && HTTP_PROXY="" || HTTP_PROXY="$input_http_proxy"
fi
# 安装 Pixman 容器
install_Pixman() {
local PORT=$(check_and_allocate_port 5000)
local ARCH IMAGE_SOURCE PROXY_IMAGE_SOURCE
local MYTVSUPER_TOKEN="$1"
local HAMI_SESSION_ID="$2"
local HAMI_SERIAL_NO="$3"
local HAMI_SESSION_IP="$4"
local HTTP_PROXY="$5"
local HTTPS_PROXY="$6"
read -p "请输入 HTTPS_PROXY (回车跳过保持当前值: $HTTPS_PROXY, 输入null清空): " input_https_proxy
if [ -n "$input_https_proxy" ]; then
[ "$input_https_proxy" = "null" ] && HTTPS_PROXY="" || HTTPS_PROXY="$input_https_proxy"
fi
echo -e "${CYAN}开始配置 Pixman 参数...${RESET}"
save_parameters
echo "请选择 Pixman 部署方式(默认: 2):"
echo "1) 使用 host 网络模式 (建议:软路由)"
echo "2) 使用 bridge 网络模式 (建议:VPS)"
read -rp "输入选项 (1 或 2): " option_fourgtv
option_fourgtv=${option_fourgtv:-2}
case "$option_fourgtv" in
1) NETWORK_MODE="host" ;;
2) NETWORK_MODE="bridge" ;;
*)
echo -e "${RED}无效选项,使用默认的 bridge 模式。${RESET}"
NETWORK_MODE="bridge"
;;
esac
if [[ "$PORT" != "$original_port" || \
"$MYTVSUPER_TOKEN" != "$original_token" || \
"$HAMI_SESSION_ID" != "$original_session_id" || \
"$HAMI_SERIAL_NO" != "$original_serial_no" || \
"$HAMI_SESSION_IP" != "$original_session_ip" || \
"$HTTP_PROXY" != "$original_http_proxy" || \
"$HTTPS_PROXY" != "$original_https_proxy" ]]; then
echo -e "${CYAN}检测到参数变化,正在卸载旧的 Pixman 容器...${RESET}"
docker rm -f pixman > /dev/null 2>&1
check_update
if [[ "$NETWORK_MODE" == "bridge" ]]; then
read -p "请输入 Pixman 容器端口 (当前值: $PORT 输入null清空): " input_port
if [ -n "$input_port" ]; then
[ "$input_port" = "null" ] && PORT="" || PORT=$(check_and_allocate_port "$input_port")
fi
else
echo -e "${CYAN}参数未发生变化,无需重启 Pixman 容器${RESET}"
return 0
PORT=""
fi
echo "是否需要设置其他环境变量?[y/n](默认:n)"
read -rp "输入选项: " configure_all_vars
configure_all_vars=${configure_all_vars:-n}
if [[ "$configure_all_vars" =~ ^[Yy]$ ]]; then
local env_vars=("MYTVSUPER_TOKEN" "HAMI_SESSION_ID" "HAMI_SERIAL_NO" "HAMI_SESSION_IP" "HTTP_PROXY" "HTTPS_PROXY")
for var in "${env_vars[@]}"; do
local current_value=$(eval echo \$$var)
read -p "请输入 ${var} (当前值: ${current_value:-未设置}, 输入null清空): " input_value
if [ -n "$input_value" ]; then
[ "$input_value" = "null" ] && eval $var="" || eval $var="$input_value"
fi
done
else
echo -e "${YELLOW}已跳过所有环境变量的设置。${RESET}"
fi
}
# 判断 Pixman 容器
check_update() {
ARCH=$(uname -m)
if [[ "$ARCH" == "armv7"* ]]; then
IMAGE_SOURCE="pixman/pixman-armv7"
PROXY_IMAGE_SOURCE="$REVERSE_PROXY/pixman-armv7"
@ -311,152 +259,45 @@ check_update() {
PROXY_IMAGE_SOURCE="$REVERSE_PROXY/pixman/pixman"
fi
echo "正在安装 Pixman 项目 作者: @Pixman..."
if docker ps -a --format '{{.Names}}' | grep -q "^pixman$"; then
current_image_version=$(docker inspect --format='{{index .Config.Labels "org.opencontainers.image.version"}}' pixman)
MODE=$(docker inspect --format='{{.HostConfig.NetworkMode}}' pixman)
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理...${RESET}"
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${RED}安装 Pixman 失败,请检查反向代理或网络连接。${RESET}"
exit 1
fi
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
pull_image "$IMAGE_SOURCE" "$PROXY_IMAGE_SOURCE"
latest_image_version=$(docker inspect --format='{{index .Config.Labels "org.opencontainers.image.version"}}' "$IMAGE_SOURCE")
local docker_command="docker run -d --name pixman --restart always"
if [ "$current_image_version" != "$latest_image_version" ]; then
echo -e "${GREEN}发现新版本 ($latest_image_version),正在更新...${RESET}"
docker rm -f pixman > /dev/null 2>&1
docker rmi -f "$IMAGE_SOURCE" > /dev/null 2>&1
docker pull "$IMAGE_SOURCE" > /dev/null 2>&1
start_container "$IMAGE_SOURCE" "$MODE"
else
echo -e "${GREEN}当前版本 ($current_image_version),无需更新...${RESET}"
fi
if [[ "$NETWORK_MODE" == "host" ]]; then
docker_command+=" --net=host"
else
if ! docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^pixman/pixman$"; then
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo "尝试使用代理..."
if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then
echo "使用代理拉取失败,请检查反向代理或网络连接。"
return 1
fi
latest_image_version=$(docker inspect --format='{{index .Config.Labels "org.opencontainers.image.version"}}' "$IMAGE_SOURCE")
echo -e "${GREEN}目前版本 ($latest_image_version),正在安装...${RESET}"
IMAGE_SOURCE="$PROXY_IMAGE_SOURCE"
fi
fi
start_container "$IMAGE_SOURCE"
fi
}
# 部署 Pixman 容器
start_container() {
local image_source="$1"
local mode="$2"
local port="${PORT:-52055}"
echo -e "${CYAN}启动 Pixman 容器...${RESET}"
if [ "$mode" != "bridge" ] && [ "$mode" != "host" ]; then
echo "请选择 Pixman 部署方式(默认: 2):"
echo "1) 使用 host 网络模式 (建议:软路由)"
echo "2) 使用 bridge 网络模式 (建议:VPS)"
read -p "输入选择 [1/2]: " user_choice
user_choice=${user_choice:-2}
if [ "$user_choice" == "1" ]; then
mode="host"
else
mode="bridge"
fi
docker_command+=" --net=bridge -p $PORT:5000"
fi
if [[ "$mode" == "host" ]]; then
echo "目前使用 host 模式,默认端口: 5000。"
docker_command="docker run -d --name pixman --restart always --net=host"
else
echo "目前使用 bridge 模式,默认端口: $port"
docker_command="docker run -d --name pixman --restart always -p $port:5000"
fi
for var in MYTVSUPER_TOKEN HAMI_SESSION_ID HAMI_SERIAL_NO HAMI_SESSION_IP HTTP_PROXY HTTPS_PROXY; do
local value=$(eval echo \$$var)
[ -n "$value" ] && docker_command+=" -e $var=$value"
done
[ -n "$MYTVSUPER_TOKEN" ] && docker_command+=" -e MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN"
[ -n "$HAMI_SESSION_ID" ] && docker_command+=" -e HAMI_SESSION_ID=$HAMI_SESSION_ID"
[ -n "$HAMI_SERIAL_NO" ] && docker_command+=" -e HAMI_SERIAL_NO=$HAMI_SERIAL_NO"
[ -n "$HAMI_SESSION_IP" ] && docker_command+=" -e HAMI_SESSION_IP=$HAMI_SESSION_IP"
[ -n "$HTTP_PROXY" ] && docker_command+=" -e HTTP_PROXY=$HTTP_PROXY"
[ -n "$HTTPS_PROXY" ] && docker_command+=" -e HTTPS_PROXY=$HTTPS_PROXY"
docker_command+=" $IMAGE_SOURCE"
docker_command+=" $image_source"
echo -e "${CYAN}正在启动 Pixman 容器...${RESET}"
eval "$docker_command"
echo -e "${GREEN}Pixman 容器已启动。${RESET}"
echo -e "${GREEN}Pixman 容器已成功启动!${RESET}"
if check_internet_connection; then
install_watchtower "pixman"
else
echo "---------------------------------------------------------"
fi
}
# 卸载 Pixman 项目
uninstall_pixman() {
echo "是否确定要卸载 Pixman 项目?[y/n](默认:n)"
read -r -t 10 input
input=${input:-n}
if [[ "$input" =~ ^[Yy]$ ]]; then
echo -e "${CYAN}正在卸载 Pixman 项目...${RESET}"
docker stop pixman > /dev/null 2>&1
docker rm -f pixman > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'pixman/pixman' | xargs -r docker rmi > /dev/null 2>&1
# rm -f "$SCRIPT_PATH"
# rm -f "$CONFIG_FILE"
# sed -i '/alias y=/d' ~/.bashrc
uninstall_watchtower "pixman"
echo -e "${RED}Pixman 项目 已成功卸载。${RESET}"
else
echo -e "${GREEN}取消卸载操作。${RESET}"
fi
live_Pixman "$PORT"
}
# 生成 Pixman 订阅
live_pixman() {
local public_ip
local port
local container_id
container_id=$(docker ps -aq -f name=pixman 2>/dev/null)
if [ -z "$container_id" ]; then
echo -e "${RED}错误: Pixman 容器不存在。${RESET}"
return 1
fi
MODE=$(docker inspect --format='{{.HostConfig.NetworkMode}}' pixman)
if [[ "$MODE" == "host" ]]; then
port=5000
else
port=$(docker inspect -f '{{ (index (index .HostConfig.PortBindings "5000/tcp") 0).HostPort }}' pixman 2>/dev/null)
fi
if check_if_in_china; then
public_ip="{路由IP}"
else
public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
# 生成 Pixman 订阅
live_Pixman() {
local public_ip=$(get_public_ip)
local port="$1"
echo "◆ 订阅地址:"
if check_internet_connection; then
echo "■ 四季線上 4GTV : http://${public_ip}:${port}/4gtv.m3u (部分失效)"
echo "■ MytvSuper : http://${public_ip}:${port}/mytvsuper.m3u (需填写会员参数)"
echo "■ Hami Video : http://${public_ip}:${port}/hami.m3u (需填写会员参数)"
fi
echo "■ 四季線上 4GTV : http://$public_ip:$port/4gtv.m3u (部分失效)"
echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u (需填写会员参数)"
echo "■ Hami Video : http://$public_ip:$port/hami.m3u (需填写会员参数)"
echo "---------------------------------------------------------"
echo "--- Pixman 详细使用说明: https://pixman.io/topics/17 ---"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
@ -465,57 +306,22 @@ live_pixman() {
read -p "按 回车键 返回 主菜单 ..."
}
# 生成 myTV 订阅
Convert_pixman() {
local public_ip
local port
local container_id
container_id=$(docker ps -aq -f name=pixman 2>/dev/null)
if [ -z "$container_id" ]; then
echo -e "${RED}错误: Pixman 容器不存在。${RESET}"
return 1
fi
if [ -n "$MYTVSUPER_TOKEN" ]; then
if ping -c 1 google.com > /dev/null 2>&1; then
MODE=$(docker inspect --format='{{.HostConfig.NetworkMode}}' pixman)
if [[ "$MODE" == "host" ]]; then
port=5000
else
port=$(docker inspect -f '{{ (index (index .HostConfig.PortBindings "5000/tcp") 0).HostPort }}' pixman 2>/dev/null)
fi
if check_if_in_china; then
public_ip="{路由IP}"
else
public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
echo "生成订阅中..."
docker exec pixman sh -c 'flask mytvsuper_tivimate'
echo "---------------------------------------------------------"
echo "■ MytvSuper-tivimate : http://${public_ip}:${port}/mytvsuper-tivimate.m3u"
(crontab -l; echo "0 */12 * * * /usr/bin/docker exec pixman sh -c 'flask mytvsuper_tivimate'") | crontab -
# 卸载 Pixman 项目
uninstall_Pixman() {
echo "是否确定要卸载 Pixman 项目?[y/n](默认:n)"
read -r -t 10 input
input=${input:-n}
echo "■ 定时任务已设置,每 12 小时自动更新 M3U。"
else
echo -e "${RED}网络环境不支持,目前已禁用 myTV 服务。${RESET}"
return 1
fi
if [[ "$input" =~ ^[Yy]$ ]]; then
echo -e "${CYAN}正在卸载 Pixman 项目...${RESET}"
docker stop pixman > /dev/null 2>&1
docker rm -f pixman > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'pixman/pixman' | xargs -r docker rmi > /dev/null 2>&1
uninstall_watchtower "pixman"
echo -e "${RED}Pixman 项目 已成功卸载。${RESET}"
else
echo -e "${CYAN}MYTVSUPER_TOKEN 参数不能为空,无法生成订阅。${RESET}"
return 1
echo -e "${GREEN}取消卸载操作。${RESET}"
fi
echo "---------------------------------------------------------"
echo "--- Pixman 详细使用说明: https://pixman.io/topics/17 ---"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
echo "---------------------------------------------------------"
read -p "按 回车键 返回 主菜单 ..."
}
############# Fourgtv #############
@ -524,12 +330,8 @@ Convert_pixman() {
install_Fourgtv() {
local public_ip
local ENV_VARS
if check_if_in_china; then
public_ip="{路由IP}"
else
public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
local public_ip=$(get_public_ip)
local port=$(check_and_allocate_port 8000)
IMAGE_SOURCE="liuyong1987/fourgtv"
PROXY_IMAGE_SOURCE="$REVERSE_PROXY/liuyong1987/fourgtv"
@ -538,23 +340,18 @@ install_Fourgtv() {
if docker ps -a --format '{{.Names}}' | grep -q "^fourgtv$"; then
echo -e "${CYAN}检测到已存在的 Fourgtv 容器,将进行重新安装...${RESET}"
ENV_VARS=$(docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' fourgtv)
port=$(echo "$ENV_VARS" | grep -oP 'PORT=\K\d+')
port=${PORT:-8000}
NOWSESSIONID=$(echo "$ENV_VARS" | grep -oP 'NOWSESSIONID=\K.*')
NOWUSERAGENT=$(echo "$ENV_VARS" | grep -oP 'NOWUSERAGENT=\K.*')
MYTVSUPER_TOKEN=$(echo "$ENV_VARS" | grep -oP 'MYTVSUPER_TOKEN=\K.*')
echo -e "${CYAN}当前 Fourgtv 配置参数:${RESET}"
echo "端口: $port"
[ -n "$NOWSESSIONID" ] && echo "NOWSESSIONID: $NOWSESSIONID"
[ -n "$NOWUSERAGENT" ] && echo "NOWUSERAGENT: $NOWUSERAGENT"
[ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN"
echo -e "当前 ${GREEN}Fourgtv${RESET} 配置参数:"
[ -n "$NOWSESSIONID" ] && echo "NOWSESSIONID: $NOWSESSIONID" || echo "NOWSESSIONID: 未设置"
[ -n "$NOWUSERAGENT" ] && echo "NOWUSERAGENT: $NOWUSERAGENT" || echo "NOWUSERAGENT: 未设置"
[ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN" || echo "MYTVSUPER_TOKEN: 未设置"
docker stop fourgtv > /dev/null 2>&1
docker rm -f fourgtv > /dev/null 2>&1
docker images --format '{{.Repository}}:{{.Tag}}' | grep 'liuyong1987/fourgtv' | xargs -r docker rmi > /dev/null 2>&1
else
local port=$(check_and_allocate_port 8000)
fi
pull_image "$IMAGE_SOURCE" "$PROXY_IMAGE_SOURCE"
@ -623,9 +420,10 @@ live_Fourgtv() {
echo "◆ 订阅地址:"
echo "■ iTV : http://$public_ip:$port/itv.m3u (需消耗服务器流量)"
echo "■ Beesport : http://$public_ip:$port/beesport.m3u (部分地区可直连)"
echo "■ Now : http://$public_ip:$port/now.m3u (需填写会员参数,且需要原生IP)"
echo "■ 4GTV : http://$public_ip:$port/4gtv.m3u (部分节目需要解锁台湾IP)"
echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u (需填写会员参数)"
echo "■ 4GTV : http://$public_ip:$port/4gtv.m3u (部分节目需要解锁台湾IP)"
echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u(需填写会员参数)"
echo "■ Now : http://$public_ip:$port/now.m3u (收费频道,需填写会员参数、原生IP)"
echo "■ Now : http://$public_ip:$port/now-free.m3u (免费频道,需填写会员参数、原生IP)"
echo "■ YouTube : http://$public_ip:$port/youtube/{房间号} (支持列表 list/{列表号} )"
echo "---------------------------------------------------------"
echo "--- Fourgtv 详细使用说明: https://t.me/livednowgroup ---"
@ -657,7 +455,7 @@ uninstall_Fourgtv() {
# 安装 Doubebly
install_Doubebly() {
local public_ip
local public_ip=$(get_public_ip)
echo "请选择安装方式:"
echo "1) 安装 Doube-ofiii"
@ -667,12 +465,6 @@ install_Doubebly() {
read -rp "输入选项 (1, 2 或 3): " option
option=${option:-1}
if check_if_in_china; then
public_ip="{路由IP}"
else
public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
IMAGE_SOURCE_OFIII="doubebly/doube-ofiii"
IMAGE_SOURCE_ITV="doubebly/doube-itv"
PROXY_IMAGE_SOURCE_OFIII="$REVERSE_PROXY/doubebly/doube-ofiii"
@ -786,7 +578,7 @@ live_Doubebly() {
echo "■ iTV : http://${public_ip}:${port_itv}/help (浏览器获取订阅地址)"
fi
echo "---------------------------------------------------------"
echo "--- Doubebly 详细使用说明: https://t.me/doubebly003 ---"
echo "--- Doubebly 详细使用说明: https://t.me/doubebly003 ----"
echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---"
echo "---------------------------------------------------------"
@ -1098,18 +890,14 @@ uninstall_watchtower() {
# 安装 3X-UI
install_3x_ui() {
local public_ip=$(get_public_ip)
echo "请选择部署方式:"
echo "1) 使用 host 网络模式 (添加节点方便)"
echo "2) 使用 bridge 网络模式 (添加节点,需映射端口)"
echo "3) 使用 sh 脚本 直接安装 (推荐)"
read -rp "输入选项 (1-3): " option
if check_if_in_china; then
local public_ip="{路由IP}"
else
local public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
case $option in
1)
echo "正在使用 host 网络模式安装 3X-UI 面板..."
@ -1225,11 +1013,7 @@ install_o11() {
echo "系统架构: $ARCH,支持安装 o11。"
echo "正在安装 o11 面板..."
local port=$(check_and_allocate_port 1234)
if check_if_in_china; then
local public_ip="{路由IP}"
else
local public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
local public_ip=$(get_public_ip)
docker run -d --restart=always -p $port:1234 --name o11 wechatofficial/o11:latest
@ -1247,6 +1031,8 @@ install_o11() {
# 卸载 o11
uninstall_o11() {
local public_ip=$(get_public_ip)
read -p "您确定要卸载 o11 面板吗?[y/n](默认:n)" confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "卸载操作已取消。"
@ -1309,12 +1095,6 @@ install_sub_store() {
local PROXY_IMAGE_SOURCE="$REVERSE_PROXY/xream/sub-store"
local frontend_backend_key=$(openssl rand -base64 15 | tr -dc 'a-zA-Z0-9' | head -c 20)
if check_if_in_china; then
local public_ip="{路由IP}"
else
local public_ip=$(curl -s ifconfig.me || echo "{公网IP}")
fi
echo "拉取 Sub Store 镜像中..."
if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then
echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}"
@ -1393,6 +1173,8 @@ pull_image() {
echo -e "${RED}安装失败,请检查反向代理或网络连接。${RESET}"
exit 1
fi
docker tag "$proxy_image" "$image"
docker rmi "$proxy_image"
fi
}
@ -1423,6 +1205,15 @@ check_if_in_china() {
return 1
}
# 获取公网 IP
get_public_ip() {
if check_if_in_china; then
echo "{路由IP}"
else
curl -s ifconfig.me || echo "{公网IP}"
fi
}
# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
@ -1546,18 +1337,18 @@ check_and_install_grep() {
fi
}
# 设置反向代理参数
proxy_allinone() {
read -p "请输入反向代理地址 (回车跳过保持当前值: $REVERSE_PROXY, 输入null清空): " input_reverse_proxy
proxy() {
source "$CONFIG_FILE"
read -p "请输入反向代理地址 (当前值: ${REVERSE_PROXY:-未设置}, 输入null清空): " input_reverse_proxy
if [ -n "$input_reverse_proxy" ]; then
[ "$input_reverse_proxy" = "null" ] && REVERSE_PROXY="" || REVERSE_PROXY="$input_reverse_proxy"
fi
echo "反向代理地址已更新为: ${REVERSE_PROXY:-<空>}"
save_parameters
echo "REVERSE_PROXY=${REVERSE_PROXY:-}" > "$CONFIG_FILE"
}
# 清理 Docker 工具
@ -1642,6 +1433,19 @@ setup_shortcut() {
fi
}
# 彩图横幅
show_NoobIPTV() {
echo -e "${CYAN}───────────────────────────────────────────────────────────────────────${RESET}
${RED} ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██╗██████╗ ████████╗██╗ ██╗${RESET}
${RED} ████╗ ██║██╔═══██╗██╔═══██╗██╔══██╗██║██╔══██╗╚══██╔══╝██║ ██║${RESET}
${RED} ██╔██╗ ██║██║ ██║██║ ██║██████╔╝██║██████╔╝ ██║ ██║ ██║${RESET}
${RED} ██║╚██╗██║██║ ██║██║ ██║██╔══██╗██║██╔═══╝ ██║ ╚██╗ ██╔╝${RESET}
${RED} ██║ ╚████║╚██████╔╝╚██████╔╝██████╔╝██║██║ ██║ ╚████╔╝ ${RESET}
${RED} ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ${RESET}
${GREEN} 欢迎关注我们的 ${YELLOW}Telegram ${GREEN}频道: ${CYAN}@Y_anGGGGGG${RESET}
${CYAN}───────────────────────────────────────────────────────────────────────${RESET}
${YELLOW} NoobIPTV小白必备的搭建脚本和便捷工具箱,输入 ${GREEN}y${YELLOW} 快捷启动!${RESET}"
}
# 检查是否是第一次运行
check_first_run() {
@ -1654,7 +1458,7 @@ check_first_run() {
if [ ! -f "$first_run_flag" ]; then
echo -e "${CYAN}首次运行,正在进行初始化设置...${RESET}"
reload_configuration # 加载配置参数
[ ! -f "$CONFIG_FILE" ] && echo "REVERSE_PROXY=$REVERSE_PROXY" > "$CONFIG_FILE" # 设置配置文件
setup_shortcut # 设置快捷键
touch "$first_run_flag"
fi
@ -1662,6 +1466,7 @@ check_first_run() {
# 脚本信息
script_log() {
show_NoobIPTV
echo "------------------------------------------------"
echo "项目名称:NoobIPTV"
echo "项目地址:https://github.com/YanG-1989"
@ -1680,6 +1485,7 @@ script_log() {
############# 主程序逻辑 #############
show_NoobIPTV # 展示横幅
check_first_run # 检查是否是第一次运行
download_NoobIPTV # 检查并更新 SH 脚本
[ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE" # 加载配置文件中的参数
@ -1692,33 +1498,13 @@ while true; do
1) # 部署 pixman
while true; do
show_pixman_menu
read -p "请输入选项 (0-5): " pixman_choice
read -p "请输入选项 (0-3): " pixman_choice
case "$pixman_choice" in
1)
check_docker
check_update
live_pixman
;;
2)
set_parameters
live_pixman
;;
3)
live_pixman
;;
4)
Convert_pixman
;;
5)
uninstall_pixman
;;
0)
echo "返回主菜单。"
break
;;
*)
echo "无效的选项,请输入 0-5。"
;;
1) check_docker ; judge_Pixman ;;
2) uninstall_Pixman ;;
3) proxy ;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
done
;;
@ -1729,7 +1515,7 @@ while true; do
case "$fourgtv_choice" in
1) check_docker ; install_Fourgtv ;;
2) uninstall_Fourgtv ;;
3) proxy_allinone ;;
3) proxy ;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac
@ -1742,7 +1528,7 @@ while true; do
case "$doubebly_choice" in
1) check_docker ; install_Doubebly ;;
2) uninstall_Doubebly ;;
3) proxy_allinone ;;
3) proxy ;;
0) echo "返回主菜单。" ; break ;;
*) echo "无效的选项,请输入 0-3。" ;;
esac

Loading…
Cancel
Save