Goal: collect every line spoken by the narrator across a whole anime series (Jujutsu Kaisen S1-S3, 59 episodes, mixed BluRay/WEB releases) from local MKVs.
What worked: extract every English ASS track (ffmpeg -i ep.mkv -map 0:s:N -c copy out.ass, iterate over ffprobe -select_streams s -show_entries stream=index:stream_tags=language), parse the [Events] Format: line, and filter Dialogue: rows where the Name field OR the Style field contains Narrat. Releases disagree on where they put it:
Dialogue: 10,0:16:05.45,0:16:10.58,Default,Narrator,0,0,0,,At exactly 7:00 PM on October 31st, 2018,
Dialogue: 10,0:05:54.96,...,Narration,Narrator,0,0,0,,The Death Paintings are \Na mix of curse and human.
Dialogue: 10,0:10:54.06,...,Default,Narration,0,0,0,,Locust plague.Result: 245 narrator lines from 16 episodes, with official-translation wording and timestamps; far better than web transcripts (ForeverDreaming, Fandom), which have no speaker labels.
Gotchas:
- Coverage is partial even inside tagged episodes. S3E2 has
Narratorrows and alsoDefault,,(empty Name) narration: "Cursed Wombs: Death Paintings One through Three were powerful enough to be classified as special-grades." Season 1 BluRay subs mostly have empty Name throughout. Treat the tag as a high-precision, low-recall seed; run a second pass (LLM classification on context windows) for the rest. - Episodes ship several English tracks (Dialogue, Honorifics, Signs & Songs, Dubtitle/SDH); pick per episode the track with the most narrator hits rather than a fixed index.
- Signs tracks put huge counts of rows under Name values like
Screen/Sign, and Style values likeEyecatch/OP2; never count those as dialogue. - Strip override blocks
{...}and\N/\hbefore using text.