-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsync_emby_config_ailg.sh
227 lines (203 loc) · 9.04 KB
/
sync_emby_config_ailg.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#!/bin/bash
data=$(date +"%Y-%m-%d %H:%M:%S")
function check_start(){
SINCE_TIME=$(date +"%Y-%m-%dT%H:%M:%S")
start_time=$(date +%s)
CONTAINER_NAME=${EMBY_NAME}
TARGET_LOG_LINE_SUCCESS="All entry points have started"
while true; do
line=$(docker logs "$CONTAINER_NAME" 2>&1| tail -n 10)
echo $line
if [[ "$line" == *"$TARGET_LOG_LINE_SUCCESS"* ]]; then
break
fi
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if (( elapsed_time >= 300 )); then
echo "程序执行超时 5分钟,终止执行更新用户Policy"
exit
fi
sleep 3
done
}
if [ $3 ]; then
EMBY_NAME=$3
else
EMBY_NAME=emby
fi
if [ $2 ]; then
EMBY_URL=$(cat $2/emby_server.txt)
xiaoya_config_dir=$2
else
EMBY_URL=$(cat /etc/xiaoya/emby_server.txt)
xiaoya_config_dir=/etc/xiaoya
fi
media_lib=$1
if [ ! -d $media_lib/config_sync ]; then
mkdir $media_lib/config_sync
fi
emby_version=$(docker inspect emby | grep -E Image | grep -v sha256 | awk -F\" '{ print $4 }' | cut -d: -f2)
#local_sha=$(docker inspect --format='{{index .RepoDigests 0}}' ailg/ggbond:latest |cut -f2 -d:)
#remote_sha=$(curl -s "https://hub.docker.com/v2/repositories/ailg/ggbond/tags/latest"|grep -o '"digest":"[^"]*' | grep -o '[^"]*$' |tail -n1 |cut -f2 -d:)
#if [ ! "$local_sha" == "$remote_sha" ]; then
# docker rmi ailg/ggbond:latest
# docker pull ailg/ggbond:latest
#fi
#docker rmi ailg/ggbond:latest
docker_exist=$(docker images |grep ailg/ggbond )
if [ -z "$docker_exist" ]; then
docker pull ailg/ggbond:latest
docker_exist=$(docker images |grep ailg/ggbond )
if [ -z "$docker_exist" ]; then
echo "拉取镜像失败,请检查网络,或者翻墙后再试"
exit 1
fi
fi
SQLITE_COMMAND="docker run -i --security-opt seccomp=unconfined --rm --net=host -v $media_lib/config:/emby/config -e LANG=C.UTF-8 ailg/ggbond:latest"
SQLITE_COMMAND_2="docker run -i --security-opt seccomp=unconfined --rm --net=host -v $media_lib/config/data:/emby/config/data -v /tmp/emby_user.sql:/tmp/emby_user.sql -v /tmp/emby_library_mediaconfig.sql:/tmp/emby_library_mediaconfig.sql -e LANG=C.UTF-8 ailg/ggbond:latest"
SQLITE_COMMAND_3="docker run -i --security-opt seccomp=unconfined --rm --net=host -v $media_lib/temp/config/data:/emby/config/data -e LANG=C.UTF-8 ailg/ggbond:latest"
if [[ $(docker ps -a | grep -E "(^|\s)$EMBY_NAME(\s|$)") ]];then
#mount_paths=$(docker inspect $EMBY_NAME \
#| jq -r '.[0].Mounts[] | select(.Destination != "/media" and .Destination != "/config" and .Destination != "/etc/nsswitch.conf") | .Destination')
#echo $mount_paths
#printf "%s\n" "${mount_paths[@]}" > $media_lib/config/mount_paths.txt
docker inspect $EMBY_NAME | grep Destination | grep -vE "/config|/media|/etc/nsswitch.conf" | awk -F\" '{print $4}' > $media_lib/config/mount_paths.txt
fi
curl -s "${EMBY_URL}/Users?api_key=e825ed6f7f8f44ffa0563cddaddce14d" > /tmp/emby.response
echo "$data Emby 关闭中 ...."
docker stop ${EMBY_NAME}
sleep 4
#旧数据备份并清除旧数据库
${SQLITE_COMMAND} sqlite3 /emby/config/data/library.db ".dump UserDatas" > /tmp/emby_user.sql
${SQLITE_COMMAND} sqlite3 /emby/config/data/library.db ".dump ItemExtradata" > /tmp/emby_library_mediaconfig.sql
${SQLITE_COMMAND} /emby_userdata.sh
#read -ep "**检查sql"
mv $media_lib/config/data/library.db $media_lib/config/data/library.org.db
[[ -f $media_lib/config/data/library.db-wal ]] && mv $media_lib/config/data/library.db-wal $media_lib/config/data/library.db-wal.bak
[[ -f $media_lib/config/data/library.db-shm ]] && mv $media_lib/config/data/library.db-shm $media_lib/config/data/library.db-shm.bak
#rm $media_lib/config/data/library.db*
# 下载解压新config数据
if command -v ifconfig > /dev/null 2>&1; then
docker0=$(ifconfig docker0 | awk '/inet / {print $2}' | sed 's/addr://')
else
docker0=$(ip addr show docker0 | awk '/inet / {print $2}' | cut -d '/' -f 1)
fi
echo -e "测试xiaoya的联通性..."
if curl -siL http://127.0.0.1:5678/d/README.md | grep -v 302 | grep "x-oss-"; then
xiaoya_addr="http://127.0.0.1:5678"
elif curl -siL http://${docker0}:5678/d/README.md | grep -v 302 | grep "x-oss-"; then
xiaoya_addr="http://${docker0}:5678"
else
if [ -s ${xiaoya_config_dir}/docker_address.txt ]; then
docker_address=$(head -n1 ${xiaoya_config_dir}/docker_address.txt)
if curl -siL http://${docker_address}:5678/d/README.md | grep -v 302 | grep "x-oss-"; then
xiaoya_addr=${docker_address}
else
ERROR "请检查xiaoya是否正常运行后再试"
exit 1
fi
else
ERROR "请先配置 ${CONFIG_DIR}/docker_address.txt 后重试"
exit 1
fi
fi
echo -e "连接小雅地址为 ${xiaoya_addr}"
rm -f $media_lib/temp/config.mp4
docker run -i \
--security-opt seccomp=unconfined \
--rm \
--net=host \
-v ${media_lib}:/media \
-v ${xiaoya_config_dir}:/etc/xiaoya \
--workdir=/media/temp \
-e LANG=C.UTF-8 \
ailg/ggbond:latest \
aria2c -o config.mp4 --continue=true -x6 --conditional-get=true --allow-overwrite=true "${xiaoya_addr}/d/元数据/config.mp4"
# 在temp下面解压,最终新config文件路径为temp/config
docker run -i \
--security-opt seccomp=unconfined \
--rm \
--net=host \
-v ${media_lib}:/media \
-v ${xiaoya_config_dir}:/etc/xiaoya \
--workdir=/media/temp \
-e LANG=C.UTF-8 \
ailg/ggbond:latest \
7z x -aoa -mmt=16 config.mp4
echo -e "下载解压元数据完成"
echo "$data 检查同步数据库完整性..."
sleep 4
#read -ep "check sql\&library!"
if ${SQLITE_COMMAND_3} sqlite3 /emby/config/data/library.db ".tables" |grep Chapters3 > /dev/null ; then
echo -e "\033[32m$data 同步数据库数据完整\033[0m"
cp -f $media_lib/temp/config/data/library.db* $media_lib/config/data/
${SQLITE_COMMAND} sqlite3 /emby/config/data/library.db "DROP TABLE IF EXISTS UserDatas;"
${SQLITE_COMMAND_2} sqlite3 /emby/config/data/library.db ".read /tmp/emby_user.sql"
${SQLITE_COMMAND} sqlite3 /emby/config/data/library.db "DROP TABLE IF EXISTS ItemExtradata;"
${SQLITE_COMMAND_2} sqlite3 /emby/config/data/library.db ".read /tmp/emby_library_mediaconfig.sql"
[[ $emby_version == "4.8.0.56" ]] && ${SQLITE_COMMAND} bash -c "sqlite3 /emby/config/data/library.db < /emby/config/media_items_all.sql"
echo "$data 保存用户信息完成"
mkdir -p $media_lib/config/cache
mkdir -p $media_lib/config/metadata
cp -rf $media_lib/temp/config/cache/* $media_lib/config/cache/
cp -rf $media_lib/temp/config/metadata/* $media_lib/config/metadata/
echo "$data 复制新的 config 至 emby数据库 完成"
chmod -R 777 $media_lib/config/data $media_lib/config/cache $media_lib/config/metadata
echo "$data Emby 重启中 ...."
docker start ${EMBY_NAME}
sleep 20
else
echo -e "\033[35m$data 同步数据库不完整,跳过复制...\033[0m"
echo "$data 同步失败,正在恢复备份数据……"
mv $media_lib/config/data/library.org.db $media_lib/config/data/library.db
mv $media_lib/config/data/library.db-wal.bak $media_lib/config/data/library.db-wal
mv $media_lib/config/data/library.db-shm.bak $media_lib/config/data/library.db-shm
docker start ${EMBY_NAME}
exit
fi
check_start
if [[ ! $emby_version == 4.8.0.56 ]];then
docker stop ${EMBY_NAME}
sleep 10
${SQLITE_COMMAND} bash -c "sqlite3 /emby/config/data/library.db < /emby/config/media_items_all.sql"
docker start ${EMBY_NAME}
sleep 10
check_start
fi
rm -f $media_lib/config/*.sql
rm -f $media_lib/config/mount_paths.txt
rm -rf $media_lib/temp/config/*
EMBY_COMMAND="docker run -it --security-opt seccomp=unconfined --rm --net=host -v /tmp/emby.response:/tmp/emby.response -e LANG=C.UTF-8 ailg/ggbond:latest"
USER_COUNT=$(${EMBY_COMMAND} jq '.[].Name' /tmp/emby.response |wc -l)
#echo -e "user_count = $USER_COUNT"
#read -ep "check user_count"
for(( i=0 ; i <$USER_COUNT ; i++ ))
do
if [[ "$USER_COUNT" > 9 ]]; then
exit
fi
#<<<在绿联中不支持,改用下面的写法通用性可能更好。
#read -r id <<< "$(${EMBY_COMMAND} jq -r ".[$i].Id" /tmp/emby.response |tr -d [:space:])"
read -r id <<EOF
$(echo "$(${EMBY_COMMAND} jq -r ".[$i].Id" /tmp/emby.response | tr -d [:space:])")
EOF
#下面这个命令将id替换成jellyfin惯用的形式,不知道是否某些版本的emby要求这种格式的id来请求更新策略,留着备用。
#id=$(echo $id | sed 's/\(........\)\(....\)\(....\)\(....\)\(............\)/\1-\2-\3-\4-\5/')
#read -r name <<< "$(${EMBY_COMMAND} jq -r ".[$i].Name" /tmp/emby.response |tr -d [:space:])"
read -r name <<EOF
$(echo "$(${EMBY_COMMAND} jq -r ".[$i].Name" /tmp/emby.response | tr -d [:space:])")
EOF
#read -r policy <<< "$(${EMBY_COMMAND} jq -r ".[$i].Policy | to_entries | from_entries | tojson" /tmp/emby.response |tr -d [:space:])"
read -r policy <<EOF
$(echo "$(${EMBY_COMMAND} jq -r ".[$i].Policy | to_entries | from_entries | tojson" /tmp/emby.response |tr -d [:space:])")
EOF
USER_URL_2="${EMBY_URL}/Users/$id/Policy?api_key=e825ed6f7f8f44ffa0563cddaddce14d"
status_code=$(curl -s -w "%{http_code}" -H "Content-Type: application/json" -X POST -d "$policy" "$USER_URL_2")
# echo $status_code
# read -ep "check status"
if [ "$status_code" == "204" ]; then
echo "成功更新 $name 用户Policy"
else
echo "返回错误代码 $status_code"
fi
done