見出し画像

【Python】こども写真仕分けツール完成

こんばんは。

自立に向けてとにかく手を動かしたいとっとです。


わが家では、日々スマホNikon(長男がうまれた時に購入したD5300)でこどもの写真や動画をとっては、ローカルネットワーク内のNAS(Network Attached Storage)の仮置きフォルダに蓄積しています。


仮置きフォルダにたまった写真や動画ファイルは、定期的に4つのフリーツールを駆使して、日付フォルダでの分類・整理をしています。分類後は、田舎のじぃじとばぁばと写真を共有するため、写真ファイルのみ圧縮してGoogle photoにドラッグ&ドロップして、アップロードしています。


今回、この定期的に行っている分類・整理・Google photoアップ作業について、独学中のPythonプログラミングで自動化ツールを制作してみましたので、まとめます。

最後にソースコードものせていますので、同じようなことを考えておられる方や、部分的にでもなにか役に立てればうれしいです。

このプログラムでできること
・写真と動画ファイルを仕分け
・ファイルの日付情報から日付フォルダごとに仕分け
・写真(画像)ファイルの圧縮
・Google photoへの自動アップロード(APIを使用)


やりたいこと

NAS上の仮フォルダに、雑多にたまっている写真と動画ファイルを、このような感じで左の状態から右の状態にしたいのです。

画像1

※左の状態は、NASの仮フォルダに写真と動画が混ざっていて、しかも撮影日付関係なく放り込まれている状態です。


Before

これまでは以下のように、4つのフリーツールドラッグ&ドロップ(右手)を駆使して、①~⑦の手順を定期的に実施していました。

画像2

もし各フリーツールの詳細が気になる方いらっしゃれば、こちらにまとめていますので、よろしければご覧ください。


After

Pythonのプログラミングにより、ツールでの処理を3つに分けて実装しました。大まかな処理は3つありますが、人はワンクリックするだけで全部やってくれます。仕分け元の仮フォルダにあったファイルと、Googleフォト用に一時的にパソコンに保存したファイルについては、処理の最後に削除して終わることができます。

画像3


①メイン画面

ツールを起動すると、こんな画面が出ます。(Tkinterを使用)

画像4


以下のパスを設定します。各設定はiniファイルで読み込ませることもできます。

仕分け元のフォルダ
仕分け先のフォルダ(写真)
仕分け先のフォルダ(動画)
Googleフォトアップロード用の一時フォルダ
アップロードしたいGoogleフォトのアルバム名


仕分け開始ボタンを押すと、以下の作業を連続して自動でやってくれます。

①仕分け
②画像圧縮
③Google photoにアップロード


処理中の進捗状況を表示するため、プログレスバーを3つ設けました。それぞれ(①仕分け、②画像圧縮、③Google photo)の処理状況について、処理を完了したファイル数をもって進捗を表示してくれます。


②仕分け機能

プログラム

ファイル:sort_bydate.py 
関数  :func_sort()


処理内容

・ファイルの日付を確認
・振分先として日付フォルダを作成
・拡張子を見て行先を振り分け
・画像ファイルを一時フォルダにコピー

写真ファイルと動画ファイルが混ざった状態の仮置きフォルダを、os.walk関数でサブフォルダまで検索し、画像ファイルか動画ファイルか、を拡張子で判別しながら、仕分け先フォルダを作成しつつ、分類していきます。

ちなみにこのos.walk関数は、Pythonならではの強力なライブラリで、他のプログラミング言語ではあまり見ないものです。(他の言語だと再帰処理が必要だったり。)

仕分け先フォルダは日付で命名したいので、参照したファイルの更新日付を取得していきます。

また、画像ファイルについては後でGoogle photoにアップロードするため、分類処理と平行して一時フォルダにコピーをとっていきます。


③画像圧縮機能

プログラム

ファイル:compress_image.py
関数  :func_compress()


処理内容

・画像ファイルを圧縮

Google photoにアップロードするために一時フォルダにコピーした画像ファイルを、圧縮していきます。

圧縮度の設定(パラメータ名:quality)は、いくつか試しましたが30がよさそうでした。この値をいろいろ変えて圧縮し、圧縮後の画像を拡大して確認しました。30ぐらいが目視での劣化判別ができないギリギリな感じでした。


参考サイト


④Google photoアルバムアップロード機能

プログラム

ファイル:upload_by_API.py
関数  :upload_photos()


処理内容

・Google photoアルバムに画像をアップ

圧縮した画像ファイルたちを、予め家族と共有しているGoogle photoアルバムにアップロードします。

今回分かったことは、Google photo APIを使ってのアップロードでは、事前に作成したGoogle photo アルバムにはアップロードできず、APIを使って作成したアルバムにならアップロードできる、ということです。

これまで家族と共有していたアルバムにアップロードしようとすると、以下のようにpermissionエラーが出ました。

response2=b'{\n  "error": {\n    "code"400,\n    "message""No permission to add media items to this album.",\n    "status""INVALID_ARGUMENT"\n  }\n}\n'

そこで、一旦APIを使ってGoogle photo アルバムを作成し、そのアルバムを共有設定にして家族にアクセス権を付与し、今後はツールからもアップロードできるようにしました。


参考記事

参考サイト


まとめ

これまで定期的に行っていた、こどもたちの写真・動画ファイル整理作業について、独学中のPythonプログラミングにより自動化しました。

なにげに30分は軽く拘束される作業だったのですが、1クリック作業にすることができたので、かなり効率化されました。


今回のPython独学では、以下のことを学びました。

・フォルダ探索(os.walk)
・ファイルのコピー・移動(shutil.copyfile、shutil.move)
・フォルダの作成(os.mkdir)
・ファイルの更新日付取得(datetime.date.fromtimestamp)
・画像ファイルのExifデータ参照
・画像ファイルの圧縮
・Google photo APIの使い方


余談ですが、Beforeで紹介した仕分けちゃんというフリーツールの利用コンセプトが、なにげにすばらしいなぁ、とあらためておもいました。

仕分けしたいファイルを複数選択して、右クリックで実行し、仕分けする、という使い方をするのですが、これはかなりフットワークが良くなります。

今後は、制作したツールもこういう使い方ができるといいなぁ、とおもっていますので、また独学してみたいとおもいます。ついでに動画ファイルの圧縮もできないか、と思ってます。


ソースコード


関連記事


最後まで読んでいただき、ありがとうございました!



==

わたしのPythonプログラミング独学の履歴をまとめたマガジンです。

よろしければ、ぜひご覧ください!


この記事が気に入ったらサポートをしてみませんか?