set -euo pipefail | |
UPLOADED_FILES_RECORD="/app/uploaded_files.txt" | |
WATCH_DIR="pdf2zh_files" | |
cleanup() { | |
echo "正在退出..." | |
exit 0 | |
} | |
trap cleanup SIGTERM SIGINT | |
echo "$APP_USERS" > /app/users.txt | |
chmod 600 /app/users.txt | |
pdf2zh -i --authorized /app/users.txt & | |
if [ ! -f "$UPLOADED_FILES_RECORD" ]; then | |
touch "$UPLOADED_FILES_RECORD" | |
fi | |
if [ ! -d "$WATCH_DIR" ]; then | |
mkdir "$WATCH_DIR" | |
fi | |
upload_file() { | |
local file="$1" | |
( | |
flock -n 9 || exit 1 | |
if grep -Fxq "$file" "$UPLOADED_FILES_RECORD"; then | |
echo "文件 $file 已经上传过,跳过。" | |
exit 0 | |
fi | |
echo "正在上传 $file..." | |
encoded_file=$(python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1]))" "$file") | |
if curl -T "$WATCH_DIR/$file" "$WEBDAV_URL/$encoded_file" --user "$WEBDAV_USER:$WEBDAV_PASS"; then | |
echo "成功上传 $file" | |
echo "$file" >> "$UPLOADED_FILES_RECORD" | |
else | |
echo "上传 $file 失败" >&2 | |
fi | |
) 9>>"$UPLOADED_FILES_RECORD.lock" | |
} | |
if command -v inotifywait >/dev/null 2>&1; then | |
echo "开始监控 $WATCH_DIR 文件夹..." | |
inotifywait -m -e create -e moved_to --format '%f' "$WATCH_DIR" | | |
while read -r filename; do | |
# 检查文件是否为 PDF,并且存在 | |
if [[ "$filename" =~ \.pdf$ ]] && [ -f "$WATCH_DIR/$filename" ]; then | |
upload_file "$filename" | |
fi | |
done | |
else | |
echo "未安装 inotifywait,使用定期检查方式。您可以通过 'sudo apt-get install inotify-tools' 安装 inotifywait。" | |
while true; do | |
for local_file in "$WATCH_DIR"/*.pdf; do | |
if [ -f "$local_file" ]; then | |
filename=$(basename "$local_file") | |
# 检查文件是否已上传 | |
if ! grep -Fxq "$filename" "$UPLOADED_FILES_RECORD"; then | |
upload_file "$filename" | |
fi | |
fi | |
done | |
sleep 60 | |
done | |
fi | |