From cea92e22e52cc244e40fa907eaf40bc4aa75f588 Mon Sep 17 00:00:00 2001 From: alistairjcbrown <635903+alistairjcbrown@users.noreply.github.com> Date: Wed, 7 Oct 2026 22:34:54 +0000 Subject: [PATCH 1/3] Update title normalization test --- common/tests/test-titles.json | 148 ++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/common/tests/test-titles.json b/common/tests/test-titles.json index 8de408e4..f524749b 100644 --- a/common/tests/test-titles.json +++ b/common/tests/test-titles.json @@ -100962,5 +100962,153 @@ { "input": "Heritage in Frame 衣映千年-中国影视与舞台服饰展", "output": "heritage in frame 衣映千年-中国影视与舞台服饰展" + }, + { + "input": "That'll Be the Day", + "output": "thatll be the day" + }, + { + "input": "Moving Waves Movie Premiere", + "output": "moving waves" + }, + { + "input": "Creativity, AI and Digital Craftsmanship", + "output": "creativity ai digital craftsmanship" + }, + { + "input": "Film Africa: O Profeta", + "output": "o profeta" + }, + { + "input": "Premada Ooralia", + "output": "premada ooralia" + }, + { + "input": "Kung Fu Soccer", + "output": "kung fu soccer" + }, + { + "input": "TRANSMISSIONS PRESENTS: Alien 3 (Assembly Cut)", + "output": "alien 3" + }, + { + "input": "In The Shadows + Q&A", + "output": "in the shadows" + }, + { + "input": "WICFF Closing Celebrations + Short Films + Pressure + Art + After Party", + "output": "wicff closing celebrations" + }, + { + "input": "Let's Make Zines", + "output": "lets make zines" + }, + { + "input": "Poraattam", + "output": "poraattam" + }, + { + "input": "Changing Rooms: Celebrating Trans Domesticities", + "output": "changing rooms celebrating trans domesticities" + }, + { + "input": "Screen Unseen (21 October)", + "output": "mystery movie" + }, + { + "input": "World Premiere - Merry Christmas Aubrey Flint", + "output": "world premiere - merry christmas aubrey flint" + }, + { + "input": "Derek Jarman's Sebastiane: the Reunion!", + "output": "derek jarmans sebastiane the reunion" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 1 + Q&A", + "output": "turn up film festival" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 2 + Q&A", + "output": "turn up film festival" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 3 + Q&A", + "output": "turn up film festival" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 5 + Q&A", + "output": "turn up film festival" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 6 + Q&A", + "output": "turn up film festival" + }, + { + "input": "Turn Up Film Festival -Short Film Competition Part 4 + Q&A", + "output": "turn up film festival" + }, + { + "input": "Whiplash in Concert (15)", + "output": "whiplash" + }, + { + "input": "Cine-Real presents: The Evil Dead", + "output": "evil dead" + }, + { + "input": "Orlando: My Political Biography - Trans Awareness Programme 2026", + "output": "orlando my political biography" + }, + { + "input": "Ponyboi - Trans Awareness Programme 2026", + "output": "ponyboi" + }, + { + "input": "Queens of the Dead - Trans Awareness Programme 2026", + "output": "queens of the dead" + }, + { + "input": "Wolfwalkers - Trans Awareness Programme 2026", + "output": "wolfwalkers" + }, + { + "input": "Mississippi Records presents - A PEOPLE'S HISTORY OF MUSIC ", + "output": "peoples history of music" + }, + { + "input": "Dead Good Cinema presents COCO with Day of the Dead workshop", + "output": "coco with day of the dead workshop" + }, + { + "input": "Alfred Hitchcock’s Blackmail (Silent Version 1929) with World Premier Live Score", + "output": "alfred blackmail with world premier" + }, + { + "input": "Battleship Potemkin (1925) with Live Score", + "output": "battleship potemkin (1925)" + }, + { + "input": "Buster Keaton’s Steamboat Bill Jr (1928) with Live Score", + "output": "steamboat bill jr (1928)" + }, + { + "input": "Harold Lloyd’s Speedy (1929) with Live Score", + "output": "speedy (1929)" + }, + { + "input": "Harold Lloyd’s The Freshman (1925) with Live Score", + "output": "the freshman (1925)" + }, + { + "input": "Man With a Cinema Camera (1929) with Live Score", + "output": "man with a cinema camera (1929)" + }, + { + "input": "Metropolis Centenary Screening with Live Score", + "output": "metropolis centenary" + }, + { + "input": "Strange Case of Dr Jekyll and Mr Hyde – In Concert, Live To Film", + "output": "strange case of dr jekyll mr hyde live to film" } ] From 36a77ea382ab42c94c5bd9b9c0ad026ad43c3a8f Mon Sep 17 00:00:00 2001 From: Alistair Brown Date: Thu, 8 Oct 2026 00:31:43 +0100 Subject: [PATCH 2/3] Apply title normalisation review feedback - Flag the CSM AI talk and Let's Make Zines as non-film events - Correct Premada Ooralia to Premada Oorali, Man With a Cinema Camera to Man with a Movie Camera, and drop "the Reunion!" from Sebastiane and "Strange Case of" from Dr Jekyll and Mr Hyde - Turn "World Premiere - " and "Turn Up Film Festival - " prefixes into colons so the prefix comes off; anchored, so a premiere billed after the title keeps it - Add Derek Jarman's, Turn Up Film Festival:, with Day of the Dead workshop, Alfred Hitchcock's, with World Premier Live Score, Centenary Screening with Live Score and Live To Film to known removable phrases Co-Authored-By: Claude Opus 5.5 --- common/is-non-film-event.js | 4 +++ common/known-removable-phrases.js | 10 +++++++ common/normalize-title.js | 9 ++++++ common/tests/is-non-film-event.test.js | 2 ++ common/tests/test-titles.json | 40 +++++++++++--------------- 5 files changed, 41 insertions(+), 24 deletions(-) diff --git a/common/is-non-film-event.js b/common/is-non-film-event.js index f411080c..ac8d2081 100644 --- a/common/is-non-film-event.js +++ b/common/is-non-film-event.js @@ -209,8 +209,12 @@ const nonFilmEvents = [ /^Innovation and the Future of Fashion Design$/i, /^Innovation at CSM:/i, /^Regenerative Futures$/i, + /^Creativity AI and Digital Craftsmanship$/i, // A poetry collection's book launch, with no film attached to it. /^Yvonne Green Collected Poems: Book Launch$/i, + // A zine-making workshop, with no film attached to it. Anchored, because + // the phrase could as easily be a film's own title. + /^Let's Make Zines$/i, ]; const isNonFilmEvent = ({ title }) => diff --git a/common/known-removable-phrases.js b/common/known-removable-phrases.js index 5c28db28..b1ec200c 100644 --- a/common/known-removable-phrases.js +++ b/common/known-removable-phrases.js @@ -189,6 +189,10 @@ const knownRemovablePhrases = [ " with Live Q&A at The Prince Charles Cinema", " with Pet Shop Boys Score", " x PET SHOP BOYS", + // Before " with Live Score", which would otherwise leave the billing + // in front of it. + " Centenary Screening with Live Score", + " with World Premier Live Score", " with Live Score", " w/ Live Score", " with live music from millie turner", @@ -214,6 +218,7 @@ const knownRemovablePhrases = [ ": conversation about hate and healing", "– 10 Year Anniversary Screening with Q&A", "– In Concert", + "Live To Film", " Live in Concert", " in concert", "- UK PREMIERE", @@ -341,6 +346,8 @@ const knownRemovablePhrases = [ "Holiday with Hitch:", "Hard of Hearing:", "Hitchcock for Halloween:", + // Before "Hitchcock's", which would otherwise leave the first name behind. + "Alfred Hitchcock's", "Hitchcock's", "Hitch-October:", "March To Hitchcock:", @@ -990,6 +997,9 @@ const knownRemovablePhrases = [ "French Film Fest UK:", "Black Is Boundless:", "Film Installation:", + "Derek Jarman's", + "Turn Up Film Festival:", + " with Day of the Dead workshop", "Holding Back the Years:", "Horror with Hitchcock:", "Horror for a Cause:", diff --git a/common/normalize-title.js b/common/normalize-title.js index 31d5933f..4543a6cf 100644 --- a/common/normalize-title.js +++ b/common/normalize-title.js @@ -246,6 +246,8 @@ function normalizeTitle(title, options) { ["SEEN Charity Film Screening - ", "SEEN Charity Film Screening: "], ["Romford Horror Festival - ", "Romford Horror Festival: "], ["The Funny Life Film Festival - ", "The Funny Life Film Festival: "], + // One of the festival's listings drops the space after the dash. + [/^Turn Up Film Festival\s*-\s*/i, "Turn Up Film Festival: "], ["The Peter Greenaway Season - ", "The Peter Greenaway Season: "], // The strand is billed with "Touchstone" misspelt on some of its films. [/^Touch(?:stone|tsone) Tuesdays\s*-\s*/i, "Touchstone Tuesdays: "], @@ -682,6 +684,9 @@ function normalizeTitle(title, options) { ["Cinema Club - ", "Cinema Club: "], ["Suicide Prevention Short Film Premiere", "Suicide Prevention"], ["Film Premiere - ", "Film Premiere: "], + // Anchored, because a premiere billed after the title ("TURN IT DOWN — + // World Premiere - An absurd neighbour story") is followed by a tagline. + [/^World Premiere - /i, "World Premiere: "], ["Karaoke, crafts + ", "Karaoke, crafts & "], ["FOLIES MEURTRIÈRES + ", "FOLIES MEURTRIÈRES & "], [/^(.+)- National Theatre Live$/i, "National Theatre Live: $1"], @@ -1746,6 +1751,10 @@ function normalizeTitle(title, options) { ], [/Momo and the Time Thieves/i, "Momo"], ["Return of the Blind Dead", "Attack of the Blind Dead"], + ["Premada Ooralia", "Premada Oorali"], + ["Man With a Cinema Camera", "Man with a Movie Camera"], + ["Sebastiane: the Reunion!", "Sebastiane"], + ["Strange Case of Dr Jekyll and Mr Hyde", "Dr Jekyll and Mr Hyde"], // The film's a mystery, but here's a hint ... ["FREE Kids Movie Club: A Whole New World", "aladdin"], ["FREE Kids Movie Club: Carnival Weekend", "princess and the frog"], diff --git a/common/tests/is-non-film-event.test.js b/common/tests/is-non-film-event.test.js index b23ec27c..930b46e0 100644 --- a/common/tests/is-non-film-event.test.js +++ b/common/tests/is-non-film-event.test.js @@ -98,6 +98,8 @@ describe("isNonFilmEvent", () => { ["Innovation at CSM: Beyond the Scroll"], ["Regenerative Futures"], ["Yvonne Green, Collected Poems: Book Launch"], + ["Creativity, AI and Digital Craftsmanship"], + ["Let's Make Zines"], ])("flags '%s' as a non-film event", (title) => { expect(isNonFilmEvent({ title })).toBe(true); }); diff --git a/common/tests/test-titles.json b/common/tests/test-titles.json index f524749b..34bee406 100644 --- a/common/tests/test-titles.json +++ b/common/tests/test-titles.json @@ -18525,7 +18525,7 @@ }, { "input": "Derek Jarman’s Sketchbooks", - "output": "derek jarmans sketchbooks" + "output": "sketchbooks" }, { "input": "Andre Rieu’s 2025 Maastricht Concert", @@ -62185,7 +62185,7 @@ }, { "input": "DEREK JARMAN'S BLUE ", - "output": "derek jarmans blue" + "output": "blue" }, { "input": "GREY GARDENS ", @@ -100971,17 +100971,13 @@ "input": "Moving Waves Movie Premiere", "output": "moving waves" }, - { - "input": "Creativity, AI and Digital Craftsmanship", - "output": "creativity ai digital craftsmanship" - }, { "input": "Film Africa: O Profeta", "output": "o profeta" }, { "input": "Premada Ooralia", - "output": "premada ooralia" + "output": "premada oorali" }, { "input": "Kung Fu Soccer", @@ -100999,10 +100995,6 @@ "input": "WICFF Closing Celebrations + Short Films + Pressure + Art + After Party", "output": "wicff closing celebrations" }, - { - "input": "Let's Make Zines", - "output": "lets make zines" - }, { "input": "Poraattam", "output": "poraattam" @@ -101017,35 +101009,35 @@ }, { "input": "World Premiere - Merry Christmas Aubrey Flint", - "output": "world premiere - merry christmas aubrey flint" + "output": "merry christmas aubrey flint" }, { "input": "Derek Jarman's Sebastiane: the Reunion!", - "output": "derek jarmans sebastiane the reunion" + "output": "sebastiane" }, { "input": "Turn Up Film Festival - Short Film Competition Part 1 + Q&A", - "output": "turn up film festival" + "output": "short film competition 1" }, { "input": "Turn Up Film Festival - Short Film Competition Part 2 + Q&A", - "output": "turn up film festival" + "output": "short film competition 2" }, { "input": "Turn Up Film Festival - Short Film Competition Part 3 + Q&A", - "output": "turn up film festival" + "output": "short film competition 3" }, { "input": "Turn Up Film Festival - Short Film Competition Part 5 + Q&A", - "output": "turn up film festival" + "output": "short film competition 5" }, { "input": "Turn Up Film Festival - Short Film Competition Part 6 + Q&A", - "output": "turn up film festival" + "output": "short film competition 6" }, { "input": "Turn Up Film Festival -Short Film Competition Part 4 + Q&A", - "output": "turn up film festival" + "output": "short film competition 4" }, { "input": "Whiplash in Concert (15)", @@ -101077,11 +101069,11 @@ }, { "input": "Dead Good Cinema presents COCO with Day of the Dead workshop", - "output": "coco with day of the dead workshop" + "output": "coco" }, { "input": "Alfred Hitchcock’s Blackmail (Silent Version 1929) with World Premier Live Score", - "output": "alfred blackmail with world premier" + "output": "blackmail" }, { "input": "Battleship Potemkin (1925) with Live Score", @@ -101101,14 +101093,14 @@ }, { "input": "Man With a Cinema Camera (1929) with Live Score", - "output": "man with a cinema camera (1929)" + "output": "man with a movie camera (1929)" }, { "input": "Metropolis Centenary Screening with Live Score", - "output": "metropolis centenary" + "output": "metropolis" }, { "input": "Strange Case of Dr Jekyll and Mr Hyde – In Concert, Live To Film", - "output": "strange case of dr jekyll mr hyde live to film" + "output": "dr jekyll mr hyde" } ] From eaab236135c0603d16bc732de668ba1cd6d080b9 Mon Sep 17 00:00:00 2001 From: Alistair Brown Date: Thu, 8 Oct 2026 00:37:27 +0100 Subject: [PATCH 3/3] Group the Turn Up short film competition's parts together The competition is screened in numbered parts of one programme, so drop the part number for them to share a title. Co-Authored-By: Claude Opus 5.5 --- common/normalize-title.js | 6 ++++++ common/tests/test-titles.json | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/common/normalize-title.js b/common/normalize-title.js index 4543a6cf..3fe9430d 100644 --- a/common/normalize-title.js +++ b/common/normalize-title.js @@ -247,6 +247,12 @@ function normalizeTitle(title, options) { ["Romford Horror Festival - ", "Romford Horror Festival: "], ["The Funny Life Film Festival - ", "The Funny Life Film Festival: "], // One of the festival's listings drops the space after the dash. + // The competition is screened in numbered parts, all one programme, so the + // part number comes off for them to group together. + [ + /^Turn Up Film Festival\s*-\s*Short Film Competition Part \d+/i, + "Turn Up Film Festival: Short Film Competition", + ], [/^Turn Up Film Festival\s*-\s*/i, "Turn Up Film Festival: "], ["The Peter Greenaway Season - ", "The Peter Greenaway Season: "], // The strand is billed with "Touchstone" misspelt on some of its films. diff --git a/common/tests/test-titles.json b/common/tests/test-titles.json index 34bee406..484383a6 100644 --- a/common/tests/test-titles.json +++ b/common/tests/test-titles.json @@ -101017,27 +101017,27 @@ }, { "input": "Turn Up Film Festival - Short Film Competition Part 1 + Q&A", - "output": "short film competition 1" + "output": "short film competition" }, { "input": "Turn Up Film Festival - Short Film Competition Part 2 + Q&A", - "output": "short film competition 2" + "output": "short film competition" }, { "input": "Turn Up Film Festival - Short Film Competition Part 3 + Q&A", - "output": "short film competition 3" + "output": "short film competition" }, { "input": "Turn Up Film Festival - Short Film Competition Part 5 + Q&A", - "output": "short film competition 5" + "output": "short film competition" }, { "input": "Turn Up Film Festival - Short Film Competition Part 6 + Q&A", - "output": "short film competition 6" + "output": "short film competition" }, { "input": "Turn Up Film Festival -Short Film Competition Part 4 + Q&A", - "output": "short film competition 4" + "output": "short film competition" }, { "input": "Whiplash in Concert (15)",