設定ファイルは分けるか、1つにまとめるか
動画対応を進めるにあたって最初に悩んだのが、設定ファイルstockphoto.jsonを画像用・動画用で分けるか、1つにまとめるかという点でした。
既存のstockphoto.jsonは、工程ごとにトップレベルのセクションを追加していく
設計(upscayl、analyze、exam_ok_ng_collect、shudou_delete、furiwake)になっています。
この延長で動画もanalyze_videoのようなセクションを追加する形にすれば、共通する値(python_dirやollama_urlなど)を
2ファイルに分けて更新漏れを起こすリスクがなくなります。
| 工程 | 画像用セクション | 動画用セクション |
|---|---|---|
| 解析 | analyze | analyze_video |
| 審査結果収集 | exam_ok_ng_collect | exam_ok_ng_collect_video |
| 手動削除チェック | shudou_delete | shudou_delete_video |
| OK/NG振り分け | furiwake | furiwake_video |
例えば、OK/NG振り分けは下図のようになっています。
Adobe Stockの審査結果は写真・動画が混在する
設計を進める中で判明したのが、Adobe Stockの審査待ち一覧(EXAM)は写真・動画が同じ画面に混在して表示されるという仕様でした。 試しに動画のファイル名を手動で画像用Excelに追記してみたところ、既存の画像収集スクリプトがそのまま拾ってくれることが確認できました。
気づいたポイント
収集(スクレイピング)側は媒体を区別せず全件を1つの履歴CSVに保存する仕様なので、 Excelへの書き込み処理さえ画像用・動画用で振り分ければ、収集自体は1系統のままで済むと判断しました。 二重にスクレイピングするとChrome操作の時間が単純に倍になってしまうため、無駄と考えました。
既存スクリプトへの--section引数の追加
update_exam_excel.py・update_ok_excel.py・update_ng_excel.pyは、
いずれもconfig['exam_ok_ng_collect']という形でセクション名がハードコードされていました。
ここに--section引数を追加し、動画用のセクション名を指定できるようにします。
parser.add_argument('--section', default='exam_ok_ng_collect',
help='動画用Excelを更新する場合は exam_ok_ng_collect_video を指定')
args = parser.parse_args()
config = load_config(args.config)
if args.section not in config:
print(f'[ERROR] stockphoto.json に "{args.section}" セクションがありません')
sys.exit(1)
cfg = config[args.section]
この変更により、bat側は同じスクリプトを2回呼ぶだけで画像・動画両方に対応できます。
"%PYTHON%" -X utf8 "%PY_DIR%\update_exam_excel.py" %CONFIG_ARG%
"%PYTHON%" -X utf8 "%PY_DIR%\update_exam_excel.py" %CONFIG_ARG% --section exam_ok_ng_collect_video
furiwake_okng.pyやshudou_delete.pyにも同じパターンを適用しました。
ロジックを1つのスクリプトに保ったまま、設定セクションの切り替えだけで媒体対応を広げられる設計は、
後から見返しても保守しやすい選択だったと思います。
動画Excelの列位置をどう計算したか
動画用Excelでは、解析結果だけでA〜AC列(29列)を使用しています。そのため、審査結果を書き込む列については、解析結果と重ならないようAD列(30列目)以降に配置しました。 画像用Excelとは別ファイルで管理しているため、画像・動画間での列位置の衝突を避ける必要はありません。 ここではあくまで、動画用Excel内で解析結果と審査結果の列が重ならないようにすることを目的としています。
| 画像用Excel | 動画用Excel | |
|---|---|---|
| STATUS | T (20) | AD (30) |
| EXAM開始 | U (21) | AE (31) |
| NG開始 | AA (27) | AK (37) |
| OK開始 | AC (29) | AM (39) |
furiwake_okng.py(OK/NGフォルダ振り分け)が参照するstatus_col・ng_reason_colも、
この列位置に合わせて0-basedインデックスで再計算しました。openpyxlの1-based列番号とpandasのiloc(0-based)が混在するコードだったため、
column_index_from_stringで機械的に検算してから設定値に反映しています。
実際のfuriwake_videoセクションは以下のような形になりました。動画ファイルは当面、写真と同じフォルダに混在して置かれる運用だったため、
source_dirは共有しつつfile_extensionsで対象拡張子だけを絞り込む形にしています。
"furiwake_video": {
"excel_file": "E:\\...\\analysis_results_video.xlsx",
"filename_col": 1,
"status_col": 29,
"ng_reason_col": 37,
"file_extensions": [".mp4", ".mov", ".avi", ".mkv"],
"source_dir": "E:\\...\\image_stockphoto_updone_examafter",
"dest": {
"ok": "E:\\...\\image_stockphoto_updone_examafter\\video_ok",
"ng": "E:\\...\\image_stockphoto_updone_examafter\\video_ng"
}
}
写真用の振り分け先(ok/ng)とは別にvideo_ok/video_ngという新しいサブフォルダを切ることで、
同じ親フォルダを共有しながらも媒体ごとの結果が混ざらないようにしています。分析する際は画像と動画は別視点で考えたいためです。
以下のようなイメージです。
まとめ
今回の作業を通じて、1つの設定ファイルで、画像・動画を扱えるようになりました。また、処理によって画像・動画の両方を扱うものと、別々に扱うものを決めて実装できました。 Excel管理では、画像用・動画用を別ファイルに分け、それぞれの列位置を整理することで、既存のロジックをほぼそのまま使い回せることが分かりました。 今後さらに媒体の種類が増えたとしても、同じ考え方(セクション名にサフィックスを付けて横展開し、列位置は空いている範囲を機械計算する)で対応できそうです
今回のポイントまとめ
- 設定ファイルは分割せず、_videoサフィックスのセクションで横展開する
- Adobe Stockの審査結果一覧は媒体混在。収集は1系統、書き込み先だけ振り分ける
- 既存スクリプトへの--section引数追加で、ロジックの重複を避ける
次回は、これらのバックエンド処理をStreamlit UIから画像・動画別々に操作できるようにした際の実装記録です。