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..3fe9430d 100644 --- a/common/normalize-title.js +++ b/common/normalize-title.js @@ -246,6 +246,14 @@ 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. + // 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. [/^Touch(?:stone|tsone) Tuesdays\s*-\s*/i, "Touchstone Tuesdays: "], @@ -682,6 +690,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 +1757,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 8de408e4..484383a6 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 ", @@ -100962,5 +100962,145 @@ { "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": "Film Africa: O Profeta", + "output": "o profeta" + }, + { + "input": "Premada Ooralia", + "output": "premada oorali" + }, + { + "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": "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": "merry christmas aubrey flint" + }, + { + "input": "Derek Jarman's Sebastiane: the Reunion!", + "output": "sebastiane" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 1 + Q&A", + "output": "short film competition" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 2 + Q&A", + "output": "short film competition" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 3 + Q&A", + "output": "short film competition" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 5 + Q&A", + "output": "short film competition" + }, + { + "input": "Turn Up Film Festival - Short Film Competition Part 6 + Q&A", + "output": "short film competition" + }, + { + "input": "Turn Up Film Festival -Short Film Competition Part 4 + Q&A", + "output": "short film competition" + }, + { + "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" + }, + { + "input": "Alfred Hitchcock’s Blackmail (Silent Version 1929) with World Premier Live Score", + "output": "blackmail" + }, + { + "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 movie camera (1929)" + }, + { + "input": "Metropolis Centenary Screening with Live Score", + "output": "metropolis" + }, + { + "input": "Strange Case of Dr Jekyll and Mr Hyde – In Concert, Live To Film", + "output": "dr jekyll mr hyde" } ]