Thêm một cách tự động gửi ảnh từ máy lên Internet

Bạn cũng muốn tự động gửi ảnh vừa chụp lên Internet nhưng lại không có thiết bị chạy iOS hoặc không có tiền mua ứng dụng ShutterSnitch hoặc đơn giản là bạn cũng võ vẽ tí shell script mà máy ảnh của bạn lại có tính năng gửi ảnh lên máy chủ ftp và tất nhiên là bạn có máy chủ, thế thì tội gì mà không thử.

Bài viết sẽ không hướng dẫn cấu hình để máy ảnh gửi ảnh lên máy chủ ftp, vì trong sách hướng dẫn đã có. Ở đây, tôi sẽ cho ảnh được gửi trực tiếp từ máy ảnh vào thư mục /home/canon/photos trên máy chủ.

Tôi tạo thêm thư mục /home/canon/sync kèm với hai thư mục con ./watermarked./original cùng một đoạn mã có tên là sync.sh với nội dung như sau:

#!/bin/bash

TARGET_DIR=DropboxCanon:Shared/Shooting
WATERMARK=yes
PHOTO_DIR=/home/canon/photos
BASE_DIR=/home/canon/sync
LOGO=/home/canon/sync/logo.png
SYNC_ACTION=move

if [ $WATERMARK == "yes" ]; then
        SOURCE_DIR=${BASE_DIR}/watermarked
else
        SOURCE_DIR=${BASE_DIR}/original
fi

cd "$BASE_DIR"

# Quit if this script may be running

if [ -f lock ]; then
        echo "Another process running at " $(date +"%Y-%m-%d %H:%M:%S") | tee -a log.log 
        exit 0
fi;

# Quit if no photo exists

if ! ls -1 "$PHOTO_DIR"/*.JPG > /dev/null 2>&1; then
        echo "No photos found" && exit 0
fi;

# Create the lock file

touch lock

# Processing photos

for photo in `ls -1 "$PHOTO_DIR" | grep -e ".JPG$"`; do

        echo "Processing $photo"

        # Check whether file completely uploaded or not
        # `lsof' is very quick but needs root permission :(
        # `identify -verbose' is kind of slow, files smaller than 2MB is acceptable

        if ! identify -verbose "${PHOTO_DIR}/${photo}" | grep "Corrupt JPEG data"; then

                if [ $WATERMARK == "yes" ]; then 

                        /usr/bin/composite -blend 80 -gravity SouthEast \
                                -geometry 300x300+30+30 \
                                "${PHOTO_DIR}/${photo}" ./watermarked/"$photo"

                fi 
                
                echo "Move un-edited photos to original folder"

                mv "${PHOTO_DIR}/${photo}" ./original/

        else
                echo "File is not ready. Skipped."
        fi


done

echo '[rclone] Syncing FTP Server -> Web Service.'

# Now sync the processed photos

rclone "$SYNC_ACTION" "$SOURCE_DIR" "$TARGET_DIR" && echo 'Finished FTP Server -> Web Service.'

# And remove the lock file

rm lock

Ở đây tôi sẽ chuyển ảnh đã đóng dấu tới thư mục Shared/Shooting trên Dropbox của mình và dùng rclone để làm việc này.

Tôi dùng cron để tự động chạy sync.sh mỗi phút một lần.

Để theo dõi quá trình xử lí thì tôi dùng inotifywatch, xem cho vui thôi chứ không liên quan gì đến quá trình tải ảnh này.

inotifywait -r -m ./sync -m ./photos -e create -e close_write -e move -e delete | while read path action file; do echo "$file appeared in $path via $action"; done

Còn đây là video ghi lại thử nghiệm thực tế:

Tôi không rõ là ShutterSnitch có cho phép kết nối nhiều máy ảnh cùng lúc không, nhưng cách này thì bao nhiêu máy cũng được, miễn là đường truyền đủ nhanh.

Tất nhiên là đây là giải pháp rất khó sử dụng đối với người không biết Linux và tương đối bất tiện nếu muốn thay đổi cấu hình. Nhưng các báo lớn, có đội CNTT giỏi thì tôi nghĩ chuyện này chỉ là chuyện nhỏ.

Bình luận

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.