From a951b6302383e867a76564d54946a6424dd48c67 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 22 Sep 2026 09:02:07 +0000 Subject: [PATCH 1/3] Limit md2html CHANGED_FILES to md/ep*.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CHANGED_FILES の grep が ".*\.md" と緩く、リポジトリ直下の .md (CLAUDE.md や README.md) だけを変更した push で entrypoint.sh が md/epREADME.md.md.tmp を探しに行き pandoc が落ちていた。 実際に CLAUDE.md 追加時の run #320 がこれで失敗している。 grep を "^md/ep.*\.md$" に限定して変換対象だけを拾うようにした。 あわせて、このワークフローの癖 (feature ブランチでは最後の push 先が 常に master なので必ず失敗すること、CHANGED_FILES が tip コミットの 差分しか見ないこと) を CLAUDE.md に記録した。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FztSKSUKQtUjZdRcy8omvH --- .github/workflows/md2html.yml | 6 ++++-- CLAUDE.md | 21 ++++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/.github/workflows/md2html.yml b/.github/workflows/md2html.yml index b0ea865..1ea427e 100644 --- a/.github/workflows/md2html.yml +++ b/.github/workflows/md2html.yml @@ -13,8 +13,10 @@ jobs: - name: create CHANGED_FILES list # https://stackoverflow.com/a/57862507/11480802 # https://docs.github.com/ja/actions/reference/environment-variables - # .md の変更がないとこの行で失敗するので注意 - run: git diff --name-only ${GITHUB_SHA}^..$GITHUB_SHA | grep -e ".*\.md" > CHANGED_FILES + # md/ep*.md の変更がないとこの行で失敗するので注意 + # 対象を md/ep*.md に限定しないと、CLAUDE.md や README.md だけの変更で + # entrypoint.sh が md/epREADME.md.md.tmp を探しに行き pandoc が落ちる + run: git diff --name-only ${GITHUB_SHA}^..$GITHUB_SHA | grep -e "^md/ep.*\.md$" > CHANGED_FILES - uses: ./ env: FDL_KEY: ${{ secrets.FDL_KEY }} diff --git a/CLAUDE.md b/CLAUDE.md index 260743f..2be3ee5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -79,7 +79,26 @@ PY なお `html/ep60.html` / `ep62.html` / `ep65.html` は対応する md と内容がずれている (md 更新後に再生成されていない)。手元での再現結果が合わなくても、それが原因のことがある。 +## ワークフロー (md2html) の癖 + +実際に踏んだので記録しておく。 + +**feature ブランチでは最後に必ず失敗する。** 最後の `ad-m/github-push-action` に `branch` の +指定が無く、常に `master` へ push しようとするため。`master` 以外で走らせると +`! [rejected] HEAD -> master` で終わる。pandoc 変換や `episodes.yml` の更新自体は +その手前まで正常に終わっているので、**ログの前半を見て判断すること**。 +`html/ep.html` がブランチ上に出来ないのはこのためで、master にマージされた時点で生成される。 + +**CHANGED_FILES は tip コミットの差分しか見ない。** `git diff ${GITHUB_SHA}^..${GITHUB_SHA}` +なので、`md/ep.md` を最後のコミットに含めないと変換されない。ep68 追加の後に +CLAUDE.md のコミットを重ねたせいで、ep68 の HTML が生成されずに終わった実例がある。 +**md を追加したコミットは push 時の先頭に置く**か、後続コミットを重ねないこと。 + +対象の grep は `^md/ep.*\.md$` に限定してある。以前は `.*\.md` だったため、 +`CLAUDE.md` や `README.md` だけを変更すると `md/epREADME.md.md.tmp` を探しに行って +pandoc が落ちていた。 + ## その他 - URL 短縮 (Firebase Dynamic Links) はサービス終了に伴い `entrypoint.sh` で無効化済み -- ワークフローは push 時に走るが、`.md` の変更が1つも無いと CHANGED_FILES 作成の行で失敗する +- `md/ep*.md` の変更が1つも無い push では CHANGED_FILES 作成の行で失敗する (grep が空振りする) From aac1608024258d1b826aa14f9fe3d2a064a0a51f Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 22 Sep 2026 09:11:24 +0000 Subject: [PATCH 2/3] Fix md2html failures seen in the run logs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 実際にログに出ていたエラーに対応する。 1. ##[error] @ create CHANGED_FILES list (run #313/#314/#316/#322) md/ep*.md を含まない push で grep が空振りし、ジョブごと失敗していた。 スキップして正常終了するようにした。 2. pandoc: md/epCLAUDE.md.md.tmp: does not exist (run #320) grep が ".*\.md" と緩く、直下の .md まで拾っていた。 "^md/ep.*\.md$" に限定 (a951b63 で対応済み、本コミットで維持)。 3. Push to branch master → ! [rejected] HEAD -> master (run #320) ad-m/github-push-action が branch 未指定で常に master へ push していた。 素の git push で github.ref_name へ送るようにし、 permissions: contents: write を付与。あわせて コミットする差分が無い場合も正常終了するようにした。 4. ##[warning] actions/checkout@v4 targets Node.js 20 (deprecated) v5 に更新。 pandoc/latex:2.6 (Alpine 3.9) はログ上エラーが出ていないため据え置き。 将来の移行時の注意点は CLAUDE.md に記載した。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FztSKSUKQtUjZdRcy8omvH --- .github/workflows/md2html.yml | 36 ++++++++++++++++++++++++----------- CLAUDE.md | 29 ++++++++++++++-------------- 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/.github/workflows/md2html.yml b/.github/workflows/md2html.yml index 1ea427e..6696835 100644 --- a/.github/workflows/md2html.yml +++ b/.github/workflows/md2html.yml @@ -6,29 +6,43 @@ jobs: convert_via_pandoc: name: Convert via Pandoc runs-on: ubuntu-24.04 + permissions: + contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 2 - name: create CHANGED_FILES list + id: changed # https://stackoverflow.com/a/57862507/11480802 # https://docs.github.com/ja/actions/reference/environment-variables - # md/ep*.md の変更がないとこの行で失敗するので注意 # 対象を md/ep*.md に限定しないと、CLAUDE.md や README.md だけの変更で # entrypoint.sh が md/epREADME.md.md.tmp を探しに行き pandoc が落ちる - run: git diff --name-only ${GITHUB_SHA}^..$GITHUB_SHA | grep -e "^md/ep.*\.md$" > CHANGED_FILES + run: | + git diff --name-only "${GITHUB_SHA}^..${GITHUB_SHA}" \ + | grep -e "^md/ep.*\.md$" > CHANGED_FILES || true + if [ -s CHANGED_FILES ]; then + echo "found=true" >> "$GITHUB_OUTPUT" + cat CHANGED_FILES + else + echo "found=false" >> "$GITHUB_OUTPUT" + echo "md/ep*.md の変更が無いので変換をスキップします" + fi - uses: ./ + if: steps.changed.outputs.found == 'true' env: FDL_KEY: ${{ secrets.FDL_KEY }} - - name: Commit files + - name: Commit and push + if: steps.changed.outputs.found == 'true' + env: + BRANCH: ${{ github.ref_name }} run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git add html/*.html - git add md/*.md - git add chapters/episodes.yml + git add html/*.html md/*.md chapters/episodes.yml + if git diff --cached --quiet; then + echo "コミットする変更が無いので終了します" + exit 0 + fi git commit -m "update html by GitHub Action" - - name: Push changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} + git push origin "HEAD:$BRANCH" diff --git a/CLAUDE.md b/CLAUDE.md index 2be3ee5..0bf69b0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -81,24 +81,25 @@ PY ## ワークフロー (md2html) の癖 -実際に踏んだので記録しておく。 - -**feature ブランチでは最後に必ず失敗する。** 最後の `ad-m/github-push-action` に `branch` の -指定が無く、常に `master` へ push しようとするため。`master` 以外で走らせると -`! [rejected] HEAD -> master` で終わる。pandoc 変換や `episodes.yml` の更新自体は -その手前まで正常に終わっているので、**ログの前半を見て判断すること**。 -`html/ep.html` がブランチ上に出来ないのはこのためで、master にマージされた時点で生成される。 - **CHANGED_FILES は tip コミットの差分しか見ない。** `git diff ${GITHUB_SHA}^..${GITHUB_SHA}` -なので、`md/ep.md` を最後のコミットに含めないと変換されない。ep68 追加の後に +なので、`md/ep.md` を**最後のコミットに含めないと変換されない**。ep68 追加の後に CLAUDE.md のコミットを重ねたせいで、ep68 の HTML が生成されずに終わった実例がある。 -**md を追加したコミットは push 時の先頭に置く**か、後続コミットを重ねないこと。 +md を追加したコミットは push 時の先頭に置くか、後続コミットを重ねないこと。 +(マージコミットは第一親との差分になるので、master へマージした時点で拾われる) + +変換対象の grep は `^md/ep.*\.md$`。以前は `.*\.md` と緩く、`CLAUDE.md` や `README.md` +だけを変更すると `md/epREADME.md.md.tmp` を探しに行って pandoc が落ちていた (run #320)。 + +`md/ep*.md` の変更が無い push では、変換とコミットをスキップして正常終了する。 +以前はこの場合 grep が空振りしてジョブごと失敗していた (run #313/#314/#316/#322)。 -対象の grep は `^md/ep.*\.md$` に限定してある。以前は `.*\.md` だったため、 -`CLAUDE.md` や `README.md` だけを変更すると `md/epREADME.md.md.tmp` を探しに行って -pandoc が落ちていた。 +生成物は `github.ref_name` へ push するので、feature ブランチでも完走する。 +以前は `ad-m/github-push-action` が常に `master` へ push しようとして +`! [rejected] HEAD -> master` で必ず失敗していた。 ## その他 - URL 短縮 (Firebase Dynamic Links) はサービス終了に伴い `entrypoint.sh` で無効化済み -- `md/ep*.md` の変更が1つも無い push では CHANGED_FILES 作成の行で失敗する (grep が空振りする) +- Docker イメージは `pandoc/latex:2.6` (Alpine 3.9、EOL 済み) のまま。今は動いているが、 + Alpine のミラーが消えた時点で壊れる。その際は runner に pandoc を直接入れる形へ移行する。 + その場合も **`--wrap=none` を必ず付ける**こと (付けないと既存の出力と数十文字ずれる) From 6448daccc595f23556d3e4cd4e621626720c9b40 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 22 Sep 2026 09:26:09 +0000 Subject: [PATCH 3/3] Add chapters/add-chapters.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit これまでリポジトリ外で実行していたラッパーを取り込んだ。 add-chapters.py は episodes.yml と cover_art.jpg を相対パスで開くため CWD が chapters/ である必要がある (元のスクリプトが pushd していた理由)。 リポジトリ内に置くと配置の前提が変わるので、音声の場所を AUDIO_DIR で 指定できるようにし、既定をリポジトリと同じ階層の finished_audio とした (従来どおり show-notes と finished_audio が並んでいる配置に一致する)。 元のスクリプトからの変更点: - set -euo pipefail、パスのクォート、MP3 が無い場合のエラー - コメントアウトされていた全件処理を --all オプションとして復活 - pushd/popd をやめて cd (スクリプト終了時に戻る必要がない) あわせて requirements.txt の PyYAML==5.4 を >=6.0 に緩めた。 5.4 は Cython 3 系でビルドが通らず、Python 3.11 では "Getting requirements to build wheel did not run successfully" で install できないため。mutagen==1.44.0 はそのまま。 README は使い方・ファイル名の制約・episodes.yml との関係を追記。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FztSKSUKQtUjZdRcy8omvH --- CLAUDE.md | 10 +++++++ chapters/README.md | 45 +++++++++++++++++++++++++++-- chapters/add-chapters.sh | 61 +++++++++++++++++++++++++++++++++++++++ chapters/requirements.txt | 4 ++- 4 files changed, 116 insertions(+), 4 deletions(-) create mode 100755 chapters/add-chapters.sh diff --git a/CLAUDE.md b/CLAUDE.md index 0bf69b0..d8a6c10 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -97,6 +97,16 @@ md を追加したコミットは push 時の先頭に置くか、後続コミ 以前は `ad-m/github-push-action` が常に `master` へ push しようとして `! [rejected] HEAD -> master` で必ず失敗していた。 +## MP3 のチャプター付け + +`chapters/add-chapters.sh` (既定で最新1件、`--all` で全件)。音声の場所は `AUDIO_DIR`、 +既定はリポジトリと同じ階層の `finished_audio`。詳細は `chapters/README.md`。 + +`add-chapters.py` は `episodes.yml` と `cover_art.jpg` を**相対パスで開く**ので、 +直接呼ぶ場合は `chapters/` に `cd` してから。ラッパーはこれを吸収している。 + +`episodes.yml` は Actions 生成物なので、新しい回を処理する前に master を pull すること。 + ## その他 - URL 短縮 (Firebase Dynamic Links) はサービス終了に伴い `entrypoint.sh` で無効化済み diff --git a/chapters/README.md b/chapters/README.md index b5b4b05..b2b8310 100644 --- a/chapters/README.md +++ b/chapters/README.md @@ -1,5 +1,44 @@ -# add-chapters.py +# add-chapters + +MP3 にチャプターとメタデータ (タイトル・アートワーク) を付ける。 + +## 準備 + +```sh +pip3 install -r requirements.txt +``` + +## 使い方 + +```sh +chapters/add-chapters.sh # finished_audio 内の最新 MP3 1件だけ +chapters/add-chapters.sh --all # ファイル名に old を含むものを除く全件 +``` + +音声の置き場所は `AUDIO_DIR` で変えられる。既定はリポジトリと同じ階層の `finished_audio` +(`show-notes` と `finished_audio` が並んでいる従来の配置を想定)。 + +```sh +AUDIO_DIR=/path/to/mp3 chapters/add-chapters.sh +``` + +個別に実行したい場合は、`chapters/` に移動してから `add-chapters.py` を直接呼ぶ +(`episodes.yml` と `cover_art.jpg` を相対パスで開くため、CWD が `chapters/` である必要がある)。 + +```sh +cd chapters && python3 add-chapters.py /path/to/68.mp3 +``` + +## 注意 + +- MP3 のファイル名は `68.mp3` / `19.5.mp3` のように**エピソード番号のみ**である必要がある。 + この番号で `episodes.yml` を引く。 +- `episodes.yml` は `../md/ep*.md` を元に GitHub Actions が生成する。 + 新しい回のチャプターを付ける前に、**最新の master を pull しておくこと**。 +- タイムスタンプの無い見出し (「お知らせ」など) はチャプターにならない。 +- 実行すると `add-chapters.py` が該当回に当たるまで全エピソードを標準出力に吐くが、 + デバッグ出力なので無視してよい。 + +## 出典 - Forked from [rui314/add-chapters.py](https://gist.github.com/rui314/6e435fcebe3998333d37904e893c8c12). -- `../md` を元に GitHub Actions で `episodes.yml` が作られるので、その後 `add-chapters.py` を実行することで MP3 にチャプターを付けることができる。 -- MP3 のファイル名は現状 `1.mp3` のような形式のみ受け付ける。 diff --git a/chapters/add-chapters.sh b/chapters/add-chapters.sh new file mode 100755 index 0000000..591c59f --- /dev/null +++ b/chapters/add-chapters.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# +# finished_audio 内の MP3 にチャプターとメタデータを付ける。 +# +# chapters/add-chapters.sh # 最新の1件だけ (既定) +# chapters/add-chapters.sh --all # ファイル名に old を含むものを除く全件 +# +# 音声の置き場所は AUDIO_DIR で変えられる。既定はリポジトリと同じ階層の +# finished_audio (従来どおり show-notes と finished_audio が並んでいる前提)。 +# +# AUDIO_DIR=/path/to/mp3 chapters/add-chapters.sh +# +# episodes.yml は md/ep*.md から GitHub Actions が生成するので、 +# 先に最新の master を pull しておくこと。 + +set -euo pipefail + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +REPO_ROOT=$(cd "$SCRIPT_DIR/.." && pwd) +AUDIO_DIR=${AUDIO_DIR:-$(dirname "$REPO_ROOT")/finished_audio} + +if [ ! -d "$AUDIO_DIR" ]; then + echo "音声ディレクトリが見つかりません: $AUDIO_DIR" >&2 + echo "AUDIO_DIR=/path/to/mp3 で指定してください。" >&2 + exit 1 +fi + +# add-chapters.py は episodes.yml と cover_art.jpg を相対パスで開くので +# chapters/ に移動してから実行する。 +cd "$SCRIPT_DIR" + +mp3s=() +while IFS= read -r line; do + mp3s+=("$line") +done < <(ls -1t "$AUDIO_DIR"/*.mp3 2>/dev/null || true) + +if [ "${#mp3s[@]}" -eq 0 ]; then + echo "MP3 が見つかりません: $AUDIO_DIR" >&2 + exit 1 +fi + +targets=() +if [ "${1:-}" = "--all" ]; then + for mp3 in "${mp3s[@]}"; do + case "$(basename "$mp3")" in + *old*) echo "skip: $mp3" ;; + *) targets+=("$mp3") ;; + esac + done +elif [ $# -gt 0 ]; then + echo "不明な引数: $1" >&2 + echo "使い方: $0 [--all]" >&2 + exit 1 +else + targets=("${mp3s[0]}") +fi + +for mp3 in "${targets[@]}"; do + echo "add-chapters for $mp3" + python3 add-chapters.py "$mp3" +done diff --git a/chapters/requirements.txt b/chapters/requirements.txt index 6316a6a..62a8365 100644 --- a/chapters/requirements.txt +++ b/chapters/requirements.txt @@ -1,2 +1,4 @@ mutagen==1.44.0 -PyYAML==5.4 +# PyYAML 5.4 は Cython 3 系でビルドが通らず、新しめの Python では install できない +# (Python 3.11 で "Getting requirements to build wheel did not run successfully") +PyYAML>=6.0