Giải pháp upload của piflickr là
- Kiểm tra file đã có trên flickr.com hay chưa, nếu chưa thì upload
- Kiểm tra xem album đã có trên flickr.com hay chưa, nếu chưa thì tạo mới
- Thêm ảnh vào album
A. Một số vấn đề kỹ thuật
- Để có thể upload song song, ta cần xây dựng một script có thể gọi từ dòng lệnh để upload một photo/movie, sau đó có thể gọi chạy dòng lệnh bằng GNU parallel.
- Có thể chạy một câu lệnh/core CPU. RPi 3 có 4 core thì chạy đồng thời 4 câu lệnh upload. Có thể chạy ổn định 3 câu lệnh/core, tổng cộng có 12 công việc upload trên RPi 3. Tất nhiên còn phụ thuộc vào tốc độ đường truyền.
- Tuy nhiên, trong thời điểm cá mập cắn cáp, flickr.com cũng gặp vấn đề. Khi ta cho RPi chạy hết công suất thì flickr.com cũng có thể ngẻn mạng, khi đó nó tự động ngắt kết nối với RPi. Vì các hàm flickrapi không nhận biết được tình trạng ngắt kết nối nên RPi vẫn miệt mài upload vô công.
- flickr.com quản lý quyền truy cập đến kho ảnh bằng access token. Tuy nhiên có một vấn đề khó hiểu là access token có thể quá hạn bất cứ lúc nào mà không báo trước. Ngoài ra nếu server bận quá thì flickr.com ngắt kết nối và thông báo bằng một trang html có đầy javascript. Tóm lại đây là hai trở ngại chính cho việc upload bằng script.
- flickr.com quản lý file theo photo_id, được tạo ra khi upload, nên chúng ta không thể biết một ảnh cụ thể đã được upload hay chưa? Vì vậy chúng ta kèm theo file upload một tag được xác định duy nhất theo file, một ứng viên là đường dẫn đến file trên đĩa. Tuy nhiên fullname này có thể chứa khoảng trắng và có thể là chuổi utf-8 mà flickr.com chưa hổ trợ trong các hàm api dùng với tag, một ứng viên khác có thể là md5(fullname)
- Ngoài ra, flickr.com cập nhật database chậm nên nếu upload song song ta không thể biết một album vừa được tạo ra hay chưa hay một file vừa được upload chưa? Hậu quả là có thể tạo ra nhiều album trùng title (thường gặp) hay nhiều copy của cùng một ảnh (ít gặp hơn)
- Cuối cùng, vì chúng ta dùng thư viện Python flickrapi nên phải viết script bằng Python, rồi kết hợp với parallel trong Bash script. Python cho phép chạy song song, nhưng chúng ta khó kiểm soát hơn như khi dùng GNU parallel.
- Gói piflickr dùng với python3. Hướng dẫn cài đặt xem readme
B. Script Python khởi tạo việc upload ảnh là pifstart.py, cú pháp
pifstart.py photo_dir
thực hiện các nhiệm vụ:
- Tạo danh sách các thư mục con của photo_dir cùng với số file có trong thư mục con đó
- Kiểm đếm với flickr để xóa trong danh sách các thư mục đã được upload xong
- Trộn các thư mục cùng title trên flickr.com
- Tiến hành upload file theo danh sách
Việc tạo danh sách các thư mục và upload theo danh sách này có mục đích chỉ reupload file theo danh sách, tránh reupload các thư mục đã hoàn thành rồi. Đây là giải pháp tình thế làm giảm thời gian kiểm đếm file và album trên flickr.com trong tình huống flickr.com liên tục cho access token quá hạn và ngắt kết nối đến server của nó.
C. Để tự động upload khi có file mới, dùng inotify quan sát thư mục ảnh, khi có sự kiện CLOSE_WRITE, DELETE thì chuyển giao tên file cho piflickr1 để upload hay xóa
watch.sh photo_dir
D. Các file thành phần của piflickr
- user.py
Thông tin về user flickr. Sửa lại API_KEY, API_SECRET, USER_ID, PHOTO_DIR tùy theo user, được gọi từ pifstart.py - pifstart.py
Khởi động upload song song theo danh sách - pilist.sh
Tạo danh sách các thư mục con và số file bên trong, được gọi từ pifstart.py - piflickr.sh
Upload song song tất cả file trong danh sách, được gọi từ pifstart.py - piflickr1
Ứng dụng Python chính: làm nhiệm vụ upload file, trộn các album trùng title…, được gọi từ pifstart.py - watch.sh
Quan sát thư mục ảnh, nếu có ảnh thêm vào/xóa đi thì upload lên/xóa ở flickr.com - merge.sh
Ghép làm một các album cùng title - readme.en, readme.vi
E. Tải về
Tãi về piflickr v1.0 và mở nén.
Hướng dẫn cài đặt xem file README