設定ファイルは分けるか、1つにまとめるか

動画対応を進めるにあたって最初に悩んだのが、設定ファイルstockphoto.jsonを画像用・動画用で分けるか、1つにまとめるかという点でした。

既存のstockphoto.jsonは、工程ごとにトップレベルのセクションを追加していく 設計(upscayl、analyze、exam_ok_ng_collect、shudou_delete、furiwake)になっています。 この延長で動画もanalyze_videoのようなセクションを追加する形にすれば、共通する値(python_dirやollama_urlなど)を 2ファイルに分けて更新漏れを起こすリスクがなくなります。

工程画像用セクション動画用セクション
解析analyzeanalyze_video
審査結果収集exam_ok_ng_collectexam_ok_ng_collect_video
手動削除チェックshudou_deleteshudou_delete_video
OK/NG振り分けfuriwakefuriwake_video

例えば、OK/NG振り分けは下図のようになっています。

json設定ファイルの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
STATUST (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という新しいサブフォルダを切ることで、 同じ親フォルダを共有しながらも媒体ごとの結果が混ざらないようにしています。分析する際は画像と動画は別視点で考えたいためです。

以下のようなイメージです。

OK/NG振り分けの結果格納先フォルダ

まとめ

今回の作業を通じて、1つの設定ファイルで、画像・動画を扱えるようになりました。また、処理によって画像・動画の両方を扱うものと、別々に扱うものを決めて実装できました。 Excel管理では、画像用・動画用を別ファイルに分け、それぞれの列位置を整理することで、既存のロジックをほぼそのまま使い回せることが分かりました。 今後さらに媒体の種類が増えたとしても、同じ考え方(セクション名にサフィックスを付けて横展開し、列位置は空いている範囲を機械計算する)で対応できそうです

今回のポイントまとめ

  • 設定ファイルは分割せず、_videoサフィックスのセクションで横展開する
  • Adobe Stockの審査結果一覧は媒体混在。収集は1系統、書き込み先だけ振り分ける
  • 既存スクリプトへの--section引数追加で、ロジックの重複を避ける

次回は、これらのバックエンド処理をStreamlit UIから画像・動画別々に操作できるようにした際の実装記録です。

FAQ

Q. なぜ動画Excelの列をAD列(30列目)から始めることにしたのですか?
動画用Excelでは、解析結果だけでA〜AC列(29列)を使用しているためです。解析結果を書き込んでいる列と審査結果の列が重ならないように、 審査結果は空いているAD列以降に配置しました。画像用Excelとは別ファイルで管理しているため、画像Excelとの列位置の衝突を避けることが目的ではありません。
Q. 設定ファイル(stockphoto.json)は画像用・動画用で分けるべきですか?
分けずに1つのファイルへ_videoサフィックス付きのセクションを追加する方針にしました。共通する値(python_dirやollama_urlなど)を2ファイルに分けて管理すると更新漏れのリスクがあるためです。
Q. Adobe Stockの審査結果(EXAM/OK/NG)は画像・動画で別々に収集する必要がありますか?
収集自体は1系統のままで済みます。審査待ち一覧(EXAM)は写真・動画が混在して表示される仕様のため、既存の収集スクリプトが動画のファイル名もそのまま拾えることを確認しています。Excelへの書き込み処理だけ--section引数で振り分けます。

前の記事
← video_analyzer.pyの実装と初回エラー
次の記事 Streamlit UIの画像/動画設定分離 →