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

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

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

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

結果として、1つのstockphoto.jsonに「_video」サフィックス付きのセクションを横展開していく方針に落ち着きました。

Adobe Stockの審査結果は写真・動画が混在する

設計を進める中で判明したのが、Adobe Stockの審査待ち一覧(EXAM)は写真・動画が同じ画面に混在して表示されるという仕様でした。試しに動画のファイル名を手動で画像用Excelに追記してみたところ、既存の収集スクリプトがそのまま拾ってくれることが確認できました。

気づいたポイント

収集(スクレイピング)側は媒体を区別せず全件を1つの履歴CSVに保存する仕様なので、Excelへの書き込み処理さえ画像用・動画用で振り分ければ、収集自体は1系統のままで済むと判断しました。二重にスクレイピングするとChrome操作の時間が単純に倍になってしまうため、これは重要な判断でした。

既存スクリプトへの--section引数の追加

update_exam_excel.pyupdate_ok_excel.pyupdate_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.pyshudou_delete.pyにも同じパターンを適用しました。 ロジックを1つのスクリプトに保ったまま、設定セクションの切り替えだけで媒体対応を広げられる設計は、後から見返しても保守しやすい選択だったと思います。

動画Excelの列位置をどう計算したか

動画用Excelは、前回記事の解析結果だけで既にA〜AC列(29列)を使い切っています。 画像用Excelと同じ列位置(STATUS=T列など)を動画側にも使うと、解析データを審査結果で上書きしてしまいます。 そこで、動画Excel側は空いているAD列(30列目)以降から審査結果を書き込む設計にしました。

画像用動画用
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_colng_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という新しいサブフォルダを切ることで、 同じ親フォルダを共有しながらも媒体ごとの結果が混ざらないようにしています。

色分けをやめて白セルに統一した理由

当初、動画Excelにも画像側と同じ「列グループごとの交互背景色」や「NG行を赤く塗る」仕組みを実装していました。 しかし実際の運用者からのフィードバックで、この装飾は不要という判断に至りました。

「1行毎に色かえなくてもいいですよ。むしろNG行とOK行で色塗りたいぐらい」
「審査結果収集前はすべて白セル(色なしセル)でいいかなと」

ここで整理できたのが、「AIによる事前チェック結果(指NG/目NG/ロゴNG)」と「Adobe Stockの実際の審査結果(STATUS列のOK/NG/EXAM)」は性質が異なる2種類の情報だという点です。前者は解析時点で即座に確定しますが、後者は申請後、実際の審査を経て初めて分かります。混同して色を塗ると、どちらの結果を見ているのか分かりにくくなります。

最終的に、データ行の背景色は完全に排除し、フォント色のみ(エラー行は赤字)というシンプルな形に統一しました。色分けはSTATUS列側(審査結果側)で改めて設計する方針です。

まとめ

今回の作業を通じて、「1つのExcelファイル・1つの設定ファイルに、画像・動画のセクションを横に並べていく」という設計方針が固まりました。列位置の衝突さえ機械的に計算して避ければ、既存のロジックをほぼそのまま使い回せることが分かったのは大きな収穫でした。今後さらに媒体の種類が増えたとしても、同じ考え方(セクション名にサフィックスを付けて横展開し、列位置は空いている範囲を機械計算する)を繰り返すだけで対応できる見通しが立った点も安心材料です。

今回のポイントまとめ

  • 設定ファイルは分割せず、_videoサフィックスのセクションで横展開する
  • Adobe Stockの審査結果一覧は媒体混在。収集は1系統、書き込み先だけ振り分ける
  • 既存スクリプトへの--section引数追加で、ロジックの重複を避ける
  • 色分けのような装飾は、後から要不要を判断できるよう最初はシンプルにしておく

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

FAQ

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

前の記事
← 品質判定・管理Excelの設計
次の記事 Streamlit UIの画像/動画設定分離 →