【Python】こども写真仕分けツール完成
こんばんは。
自立に向けてとにかく手を動かしたいとっとです。
わが家では、日々スマホやNikon(長男がうまれた時に購入したD5300)でこどもの写真や動画をとっては、ローカルネットワーク内のNAS(Network Attached Storage)の仮置きフォルダに蓄積しています。
仮置きフォルダにたまった写真や動画ファイルは、定期的に4つのフリーツールを駆使して、日付フォルダでの分類・整理をしています。分類後は、田舎のじぃじとばぁばと写真を共有するため、写真ファイルのみ圧縮してGoogle photoにドラッグ&ドロップして、アップロードしています。
今回、この定期的に行っている分類・整理・Google photoアップ作業について、独学中のPythonプログラミングで自動化ツールを制作してみましたので、まとめます。
最後にソースコードものせていますので、同じようなことを考えておられる方や、部分的にでもなにか役に立てればうれしいです。
このプログラムでできること
・写真と動画ファイルを仕分け
・ファイルの日付情報から日付フォルダごとに仕分け
・写真(画像)ファイルの圧縮
・Google photoへの自動アップロード(APIを使用)
やりたいこと
NAS上の仮フォルダに、雑多にたまっている写真と動画ファイルを、このような感じで左の状態から右の状態にしたいのです。
※左の状態は、NASの仮フォルダに写真と動画が混ざっていて、しかも撮影日付関係なく放り込まれている状態です。
Before
これまでは以下のように、4つのフリーツールとドラッグ&ドロップ(右手)を駆使して、①~⑦の手順を定期的に実施していました。
もし各フリーツールの詳細が気になる方いらっしゃれば、こちらにまとめていますので、よろしければご覧ください。
After
Pythonのプログラミングにより、ツールでの処理を3つに分けて実装しました。大まかな処理は3つありますが、人はワンクリックするだけで全部やってくれます。仕分け元の仮フォルダにあったファイルと、Googleフォト用に一時的にパソコンに保存したファイルについては、処理の最後に削除して終わることができます。
①メイン画面
ツールを起動すると、こんな画面が出ます。(Tkinterを使用)
以下のパスを設定します。各設定は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プログラミング独学の履歴をまとめたマガジンです。
よろしければ、ぜひご覧ください!