#!/bin/bash # wget -O sony.sh https://cafe.cpolar.top/wkdaily/tvhelper-docker/raw/branch/master/shells/sony.sh && chmod +x sony.sh && ./sony.sh #******************************************************** source common.sh # 定义红色文本 RED='\033[0;31m' # 无颜色 NC='\033[0m' GREEN='\e[38;5;154m' YELLOW="\e[93m" BLUE="\e[96m" # 菜单选项数组 declare -a menu_options declare -A commands # 检查输入是否为整数 is_integer() { if [[ $1 =~ ^-?[0-9]+$ ]]; then return 0 # 0代表true/成功 else return 1 # 非0代表false/失败 fi } # 判断adb是否连接成功 check_adb_connected() { # 获取 adb devices 输出,跳过第一行(标题行),并检查每一行的状态 local connected_devices=$(adb devices | awk 'NR>1 {print $2}' | grep 'device$') # 检查是否有设备已连接并且状态为 'device',即已授权 if [[ -n $connected_devices ]]; then # ADB 已连接并且设备已授权 return 0 else # ADB 设备未连接或未授权 return 1 fi } # 连接adb connect_adb() { adb disconnect >/dev/null 2>&1 echo -e "${BLUE}请手动输入电视盒子的IP地址:${NC}" read ip echo -e "${BLUE}首次使用,盒子上可能会提示授权弹框,给您半分钟时间来操作...【允许】${NC}" adb connect ${ip} # 循环检测连接状态 for ((i = 1; i <= 30; i++)); do echo -e "${YELLOW}第${i}次尝试连接ADB,请在设备上点击【允许】按钮...${NC}" device_status=$(adb devices | grep "${ip}:5555" | awk '{print $2}') if [[ "$device_status" == "device" ]]; then echo -e "${GREEN}ADB 已经连接成功啦,你可以放心操作了${NC}" return 0 fi sleep 1 # 每次检测间隔1秒 done echo -e "${RED}连接超时,或者您点击了【取消】,请确认电视盒子的IP地址是否正确。如果问题持续存在,请检查设备的USB调试设置是否正确并重新连接adb${NC}" } # 显示当前时区 show_timezone() { adb shell getprop persist.sys.timezone } disconnect_adb() { adb disconnect >/dev/null 2>&1 echo "ADB 已经断开" } get_status() { if check_adb_connected; then adb_status="${GREEN}已连接且已授权${NC}" else adb_status="${RED}未连接${NC}" fi echo -e "* 与电视盒子的连接状态:$adb_status" } # 获取电视盒子型号 get_tvbox_model_name() { if check_adb_connected; then # 获取设备型号 local model=$(adb shell getprop ro.product.model) # 获取设备制造商 local manufacturer=$(adb shell getprop ro.product.manufacturer) # 清除换行符 model=$(echo $model | tr -d '\r' | tr -d '\n') manufacturer=$(echo $manufacturer | tr -d '\r' | tr -d '\n') echo -e "* 当前电视盒子型号:${BLUE}$manufacturer $model${NC}" else echo -e "* 当前电视盒子型号:${BLUE}请先连接ADB${NC}" fi } # 获取电视盒子时区 get_tvbox_timezone() { if check_adb_connected; then # 获取设备时区 device_timezone=$(adb shell getprop persist.sys.timezone) # 获取设备系统时间,格式化为“年月日 时:分” device_time=$(adb shell date "+%Y年%m月%d日 %H:%M") echo -e "* 当前电视盒子时区:${YELLOW}$device_timezone${NC}" echo -e "* 当前电视盒子时间:${YELLOW}$device_time${NC}" else echo -e "* 当前电视盒子时区:${BLUE}请先连接ADB${NC}" echo -e "* 当前电视盒子时间:${BLUE}请先连接ADB${NC}" fi } # 安装Fire TV版本Youtube install_youtube() { local apk_local_path="/tvhelper/apks/youtube.apk" if check_adb_connected; then echo -e "${GREEN}正在推送和安装fire tv版youtube,请耐心等待...${NC}" # 模拟安装进度 echo -ne "${BLUE}" while true; do echo -n ".." sleep 1 done & # 保存进度指示进程的PID PROGRESS_PID=$! install_result=$(adb install -r $apk_local_path 2>&1) # 安装完成后,终止进度指示进程 kill $PROGRESS_PID wait $PROGRESS_PID 2>/dev/null echo -e "${NC}\n" # 检查安装结果 if [[ $install_result == *"Success"* ]]; then echo -e "${GREEN}APK安装成功!请在盒子上查看${NC}" else echo -e "${RED}APK安装失败:$install_result${NC}" fi else connect_adb fi } # 安装Disney+ install_disney() { install_xapk "/tvhelper/sony/disney/disney.xapk" } # 安装MAX install_max() { install_xapk "/tvhelper/sony/max/max.xapk" } # 安装Netflix install_netflix() { local app_name_dir="netflix" install_app_bundle $app_name_dir } # 安装appletv+ install_appletv() { install_app_bundle "/tvhelper/sony/appletv" } # 安装mytvsuper install_mytvsuper() { install_xapk "/tvhelper/sony/mytvsuper/mytvsuper.xapk" } # 根据文件夹名称,安装文件夹中全部apk install_app_bundle() { local app_name_dir=$1 if check_adb_connected; then echo -e "${GREEN}正在推送和安装${app_name_dir},请耐心等待...${NC}" # 模拟安装进度 echo -ne "${BLUE}" while true; do echo -n ".." sleep 1 done & # 保存进度指示进程的PID PROGRESS_PID=$! install_result=$(adb install-multiple -r /tvhelper/sony/${app_name_dir}/*.apk 2>&1) # 安装完成后,终止进度指示进程 kill $PROGRESS_PID wait $PROGRESS_PID 2>/dev/null echo -e "${NC}\n" # 检查安装结果 if [[ $install_result == *"Success"* ]]; then echo -e "${GREEN}APK安装成功!请在盒子上查看${NC}" else echo -e "${RED}APK安装失败:$install_result${NC}" fi else connect_adb fi } # 根据xapk路径 安装单个xapk # disney.xapk、appletv.xapk install_xapk() { local xapk_local_path="$1" local xapkname=$(basename "$xapk_local_path") local timestamp=$(date +%H%M%S) # 比如 142315 表示 14:23:15 local extract_to="/tmp/xapks/${timestamp}" mkdir -p "$extract_to" if unzip -o "$xapk_local_path" -d "$extract_to"; then echo "XAPK文件解压成功: $xapkname" else echo "XAPK文件解压失败: $xapkname" return 1 fi apk_files=$(find "$extract_to" -type f -name "*.apk") echo -e "解压后的多个apk:\n$apk_files" echo -ne "${YELLOW}正在安装: $xapkname${NC} ${GREEN}" echo # 模拟安装进度 while true; do echo -n ".." sleep 1 done & PROGRESS_PID=$! install_result=$(adb install-multiple $apk_files 2>&1) kill $PROGRESS_PID >/dev/null 2>&1 wait $PROGRESS_PID 2>/dev/null echo -e "${NC}\n安装结果: $install_result" if echo "$install_result" | grep -qi "Success"; then echo -e "${GREEN} 安装成功: $xapkname ${NC}" #echo -e "${RED}正在删除临时目录 $extract_to ...${NC}" rm -rf "$extract_to" else echo -e "${RED}安装失败: $xapkname${NC}" fi } # 菜单 menu_options=( "连接ADB" "断开ADB" "安装Netflix最新版" "安装AppleTV+ Sony电视版" "安装Disney+最新版" "安装HBO MAX最新版" "安装myTVSuper最新版" "安装Youtube-FireTV版" "赞助|打赏" ) commands=( ["连接ADB"]="connect_adb" ["断开ADB"]="disconnect_adb" ["安装Netflix最新版"]="install_netflix" ["安装Disney+最新版"]="install_disney" ["安装Youtube-FireTV版"]="install_youtube" ["安装HBO MAX最新版"]="install_max" ["安装AppleTV+ Sony电视版"]="install_appletv" ["安装myTVSuper最新版"]="install_mytvsuper" ["赞助|打赏"]="sponsor" ) # 处理菜单 handle_choice() { local choice=$1 # 检查输入是否为空 if [[ -z $choice ]]; then echo -e "${RED}输入不能为空,请重新选择。${NC}" return fi # 检查输入是否为数字 if ! [[ $choice =~ ^[0-9]+$ ]]; then echo -e "${RED}请输入有效数字!${NC}" return fi # 检查数字是否在有效范围内 if [[ $choice -lt 1 ]] || [[ $choice -gt ${#menu_options[@]} ]]; then echo -e "${RED}选项超出范围!${NC}" echo -e "${YELLOW}请输入 1 到 ${#menu_options[@]} 之间的数字。${NC}" return fi local selected_option="${menu_options[$choice - 1]}" local command_to_run="${commands[$selected_option]}" # 检查是否存在对应的命令 if [ -z "$command_to_run" ]; then echo -e "${RED}无效选项,请重新选择。${NC}" return fi # 使用eval执行命令 eval "$command_to_run" } get_docker_version() { VERSION=$(grep -E '^VERSION=' /etc/environment | cut -d '=' -f2) echo $VERSION } show_menu() { clear echo "***********************************************************************" echo -e "* ${YELLOW}Sony电视专用助手Docker版 (v$(get_docker_version))${NC} " echo -e "* ${RED}请确保电视盒子和Docker宿主机处于${NC}${BLUE}同一网段${NC}\n* ${RED}且电视盒子开启了${NC}${BLUE}USB调试模式(adb开关)${NC} " echo "* 如果这些流媒体软件不是最新版 请到apkpure.com下载xapk后 " echo "* 使用首页的安装映射目录下的所有xapk功能自行安装 " echo "* Developed by @wukongdaily " echo "**********************************************************************" echo echo "$(get_status)" echo "$(get_tvbox_model_name)" echo "$(get_tvbox_timezone)" echo echo "**********************************************************************" echo "请选择操作:" for i in "${!menu_options[@]}"; do echo -e "${BLUE}$((i + 1)). ${menu_options[i]}${NC}" done } while true; do show_menu read -p "请输入选项的序号(输入q退出): " choice if [[ $choice == 'q' ]]; then break fi handle_choice $choice echo "按任意键继续..." read -n 1 # 等待用户按键 done