設定ファイルは分けるか、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 |
結果として、1つのstockphoto.jsonに「_video」サフィックス付きのセクションを横展開していく方針に落ち着きました。
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列)を使い切っています。 画像用Excelと同じ列位置(STATUS=T列など)を動画側にも使うと、解析データを審査結果で上書きしてしまいます。 そこで、動画Excel側は空いているAD列(30列目)以降から審査結果を書き込む設計にしました。
| 画像用 | 動画用 | |
|---|---|---|
| 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という新しいサブフォルダを切ることで、
同じ親フォルダを共有しながらも媒体ごとの結果が混ざらないようにしています。
色分けをやめて白セルに統一した理由
当初、動画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
前の記事 ← 品質判定・管理Excelの設計