From 5db735abea3f7b22bee5c991fc40c768a1cdd2b2 Mon Sep 17 00:00:00 2001 From: alistairjcbrown <635903+alistairjcbrown@users.noreply.github.com> Date: Mon, 29 Jun 2026 22:44:14 +0000 Subject: [PATCH] Update title normalization test --- common/known-removable-phrases.js | 9 + common/normalize-title.js | 2 + common/tests/test-titles.json | 548 ++++++++++++++++++++++++++++++ 3 files changed, 559 insertions(+) diff --git a/common/known-removable-phrases.js b/common/known-removable-phrases.js index 9d63b4b0..f24b7879 100644 --- a/common/known-removable-phrases.js +++ b/common/known-removable-phrases.js @@ -74,6 +74,7 @@ const knownRemovablePhrases = [ "at Rio Cinema!", "at The Cinema Museum", "at the PCC", + "at Picturehouse Central", "and Johannas Traum", ": 4K World Premiere with Immersive Reception", "(Live Immersive Virtual Experiment) Immersive Screening", @@ -303,6 +304,8 @@ const knownRemovablePhrases = [ "with an Introduction, Prologue, and a mark of respect by the Monks", "with a live Q&A with The Cast", "with a Talk by Paul Merton", + "With Bonus Footage", + "w/ Bonus Footage", "with subtitles for the D/deaf", "with intro and post-film discussion", "with introduction and post-film discussion", @@ -334,6 +337,7 @@ const knownRemovablePhrases = [ "with wine tasting", "with Molly Miles", "with Illustrated Lecture!", + "with In-Person Pre-Show", "with Live Acoustic Guitar & Introduction", "with Live Organ Improvisation", "with Live Performance", @@ -502,6 +506,7 @@ const knownRemovablePhrases = [ "Black to the Beginning-", "The Black Music Coalition:", "Bar Screening x Muse:", + "Bar Trash: Queer Horror & Double Bill", "BAR TRASH Positive East Fundraiser:", "Bar Trash: A toast to David Lynch:", "Bar Trash: Season Launch:", @@ -837,6 +842,7 @@ const knownRemovablePhrases = [ "Live From Prague The Movie", "Live From Prague", "live from mexico city", + "Livestream Premiere", "Lob-sters Tennis Anniversary Screening:", "Lost Reels", "LOTR:", @@ -1075,8 +1081,10 @@ const knownRemovablePhrases = [ "Team Picks:", "TALENTED U:", "Tate Collective Moments", + "T A P E Collective:", "Taste Film presents", "Tatau to Tattoo:", + "TFFF:", "Tibet Film Festival London:", "Tim Burton's ", "Times+:", @@ -1281,6 +1289,7 @@ const knownRemovablePhrases = [ "Panel Discussion", "U.K. Premiere & Q&A & Fine Wine Reception", "UK Cinema Premiere & Q&A:", + "UK Theatrical Premiere", "Exclusive UK Premiere", "UK Premiere", "World Premiere", diff --git a/common/normalize-title.js b/common/normalize-title.js index a122504a..c6852e63 100644 --- a/common/normalize-title.js +++ b/common/normalize-title.js @@ -438,6 +438,7 @@ function normalizeTitle(title, options) { "BAR TRASH Positive East Fundraiser /", "BAR TRASH Positive East Fundraiser: ", ], + ["Bar Trash: Queer Horror / ", "Bar Trash: Queer Horror & "], [/^BAR TRASH: (.+) \+ (.+)$/i, "BAR TRASH: $1 & $2"], ["Guest Event - ", "Guest Event: "], ["Throwback - ", "Throwback: "], @@ -847,6 +848,7 @@ function normalizeTitle(title, options) { "What's Up Daiquiris, bag switcheroos: ", ], ["One Day in Whitechapel + ", "One Day in Whitechapel & "], + ["Backrooms: Everything Must Go", "Backrooms"], ]; corrections.forEach(([phrase, replacement]) => { diff --git a/common/tests/test-titles.json b/common/tests/test-titles.json index 4a98f2a5..7add2189 100644 --- a/common/tests/test-titles.json +++ b/common/tests/test-titles.json @@ -78586,5 +78586,553 @@ { "input": "FILM: One Day in Whitechapel + Sandstorm by Seemab Gul", "output": "one day in whitechapel sandstorm" + }, + { + "input": "The Empire Strikes Back", + "output": "empire strikes back" + }, + { + "input": "A nos amours", + "output": "a nos amours" + }, + { + "input": "A nos amours + intro", + "output": "a nos amours" + }, + { + "input": "Alice", + "output": "alice" + }, + { + "input": "Annette", + "output": "annette" + }, + { + "input": "Barbara Kopple Double Bill + intro by Dr Alice Pember", + "output": "barbara kopple double bill" + }, + { + "input": "BFI Member Poll: Paddington 2", + "output": "paddington 2" + }, + { + "input": "Child’s Play", + "output": "childs play" + }, + { + "input": "Clever Girls", + "output": "clever girls" + }, + { + "input": "Clever Girls + intro by writer Richard Dyer", + "output": "clever girls" + }, + { + "input": "Culloden", + "output": "culloden" + }, + { + "input": "Doctor Who: 20 Years On – The Tenth Doctor", + "output": "doctor who 20 years on the tenth doctor" + }, + { + "input": "Don’t Hug Me I’m Scared + Q&A with creators Becky Sloan and Joe Pelling", + "output": "dont hug me im scared" + }, + { + "input": "Dream of a World", + "output": "dream of a world" + }, + { + "input": "Edvard Munch", + "output": "edvard munch" + }, + { + "input": "Evening Land", + "output": "evening land" + }, + { + "input": "Funday: The Magic Faraway Tree", + "output": "magic faraway tree" + }, + { + "input": "Godzilla", + "output": "godzilla" + }, + { + "input": "Grand Hotel", + "output": "grand hotel" + }, + { + "input": "Hotel du Nord", + "output": "hotel du nord" + }, + { + "input": "Hotel Monterey + intro by scholar and critic Erika Balsom", + "output": "hotel monterey" + }, + { + "input": "I Am Cuba + intro by film curator and writer Jonathan Ali", + "output": "i am cuba" + }, + { + "input": "I Know That You Know That I Know", + "output": "i know that you know that i know" + }, + { + "input": "I Married You For Fun", + "output": "i married you for fun" + }, + { + "input": "I Married You For Fun + intro by writer and researcher Olga Campofreda", + "output": "i married you for fun" + }, + { + "input": "Key Largo", + "output": "key largo" + }, + { + "input": "L’avventura", + "output": "lavventura" + }, + { + "input": "L’eclisse", + "output": "leclisse" + }, + { + "input": "L’eclisse + intro by season curator Catherine O’Rawe", + "output": "leclisse" + }, + { + "input": "L’enfance nue", + "output": "lenfance nue" + }, + { + "input": "La Commune", + "output": "la commune" + }, + { + "input": "La maison des bois (Episodes 1, 2 and 3)", + "output": "la maison des bois (episodes 1 2 3)" + }, + { + "input": "La maison des bois (Episodes 1, 2 and 3) + intro", + "output": "la maison des bois (episodes 1 2 3)" + }, + { + "input": "La maison des bois (Episodes 4 and 5)", + "output": "la maison des bois (episodes 4 5)" + }, + { + "input": "La maison des bois (Episodes 6 and 7)", + "output": "la maison des bois (episodes 6 7)" + }, + { + "input": "La notte", + "output": "la notte" + }, + { + "input": "La notte + pre-recorded intro by writer Joanna Biggs", + "output": "la notte" + }, + { + "input": "Little Shop of Horrors (Director’s Cut)", + "output": "little shop of horrors" + }, + { + "input": "Magic", + "output": "magic" + }, + { + "input": "Member exclusive: Teenage Sex and Death at Camp Miasma", + "output": "teenage sex death at camp miasma" + }, + { + "input": "Member Library Lates: Puppets", + "output": "puppets" + }, + { + "input": "Member Picks: The Adventures of Baron Munchausen", + "output": "adventures of baron munchausen" + }, + { + "input": "Modesty Blaise", + "output": "modesty blaise" + }, + { + "input": "Monica Vitti Season Introduction: More than a Muse", + "output": "monica vitti season introduction more than a muse" + }, + { + "input": "Muppets and Fraggles: A Celebration + Q&A with Fraggle Rock co-creator and writer Jocelyn Stevenson", + "output": "muppets fraggles a celebration" + }, + { + "input": "New Writings: Reboot Culture with William Proctor", + "output": "new writings reboot culture with william proctor" + }, + { + "input": "Nightshift", + "output": "nightshift" + }, + { + "input": "Nightshift + intro by writer and film programmer Sophia Satchell-Baeza", + "output": "nightshift" + }, + { + "input": "Passe ton bac d’abord...", + "output": "passe ton bac dabord" + }, + { + "input": "Peter Watkins and the Playcraft Film Unit", + "output": "peter watkins the playcraft film unit" + }, + { + "input": "Peter Watkins: Resistance Isn’t Futile", + "output": "resistance isnt futile" + }, + { + "input": "Preview: Lady + Q&A with actor Sian Clifford and director Samuel Abrahams", + "output": "lady" + }, + { + "input": "Privilege", + "output": "privilege" + }, + { + "input": "Radical Cinema: Past, Present and Future Histories + Onyeka Igwe in conversation with William Fowler", + "output": "and future histories" + }, + { + "input": "Relaxed screening: Doctor Who and the Daleks + extended intro by Lillian Crawford", + "output": "doctor who the daleks" + }, + { + "input": "Relaxed Screening: Ish", + "output": "ish" + }, + { + "input": "Relaxed Screening: Teenage Sex and Death at Camp Miasma", + "output": "teenage sex death at camp miasma" + }, + { + "input": "Secret Scandal", + "output": "secret scandal" + }, + { + "input": "Seniors’ Free Matinee: After Hours + intro by Hannah Strong, Film Critic", + "output": "after hours" + }, + { + "input": "Seniors’ Free Matinee: All About My Mother + intro", + "output": "all about my mother" + }, + { + "input": "Seniors’ Paid Matinee: Ish", + "output": "ish" + }, + { + "input": "Somewhere", + "output": "somewhere" + }, + { + "input": "Stardust", + "output": "stardust" + }, + { + "input": "Stardust + intro by season curator Catherine O’Rawe", + "output": "stardust" + }, + { + "input": "Strings", + "output": "strings" + }, + { + "input": "Team America: World Police", + "output": "team america world police" + }, + { + "input": "Television Puppets", + "output": "television puppets" + }, + { + "input": "Teresa the Thief", + "output": "teresa the thief" + }, + { + "input": "The 70s People", + "output": "70s people" + }, + { + "input": "The Adventures of Prince Achmed + panel discussion with Hugo Max and Tashi Petter", + "output": "adventures of prince achmed" + }, + { + "input": "The Amazing Quest of Ernest Bliss (aka The Amazing Adventure) + intro by Charles Drazin", + "output": "amazing quest of ernest bliss" + }, + { + "input": "The Double Life of Veronique", + "output": "double life of veronique" + }, + { + "input": "The Freethinker", + "output": "the freethinker" + }, + { + "input": "The Girl with a Pistol", + "output": "girl with a pistol" + }, + { + "input": "The Gladiators", + "output": "the gladiators" + }, + { + "input": "The Journey (Parts 1 to 4)", + "output": "the journey" + }, + { + "input": "The Journey (Parts 13 to 16)", + "output": "the journey" + }, + { + "input": "The Journey (Parts 17 to 19)", + "output": "the journey" + }, + { + "input": "The Journey (Parts 5 to 8)", + "output": "the journey" + }, + { + "input": "The Journey (Parts 9 to 12)", + "output": "the journey" + }, + { + "input": "The Last Laugh + intro by programmer Margaret Deriaz", + "output": "last laugh" + }, + { + "input": "The Media Project", + "output": "media project" + }, + { + "input": "The Oberwald Mystery", + "output": "oberwald mystery" + }, + { + "input": "The Puppetoon Movie", + "output": "puppetoon movie" + }, + { + "input": "The Shining (Extended Version)", + "output": "the shining" + }, + { + "input": "The Silence", + "output": "the silence" + }, + { + "input": "The Trap", + "output": "the trap" + }, + { + "input": "The Universal Clock: The Resistance of Peter Watkins", + "output": "universal clock the resistance of peter watkins" + }, + { + "input": "The War Game + conversation with Samira Ahmed, Kevin Brownlow, Kodwo Eshun and Kristofer Woods", + "output": "war game" + }, + { + "input": "The War Game + intro by season co-curator William Fowler", + "output": "war game" + }, + { + "input": "To Catch a Thief", + "output": "to catch a thief" + }, + { + "input": "Tosca", + "output": "tosca" + }, + { + "input": "TV Preview: Bookish Series 2: Episode 1 + Q&A with Mark Gatiss and cast tbc", + "output": "bookish series 2 episode 1" + }, + { + "input": "TV Preview: Vigil Series 3: Episode 1 + Q&A with cast members and series creator tbc", + "output": "vigil series 3 episode 1" + }, + { + "input": "UK Premiere of 4K Restoration: Letty Lynton + intro by Caroline Cassin, Women & Cocaine film curator", + "output": "letty lynton" + }, + { + "input": "Waiting to Exhale + intro", + "output": "waiting to exhale" + }, + { + "input": "What Did You Eat Today? Rose Lowder + Q&A with the filmmakers William English and Sandra Cross", + "output": "what did you eat today? rose lowder" + }, + { + "input": "Yonderland + Q&A with Jim Howick and Laurence Rickard", + "output": "yonderland" + }, + { + "input": "Moana (Live Action) (2026)", + "output": "moana (2026)" + }, + { + "input": "Parent & Baby: The Invite", + "output": "the invite" + }, + { + "input": "Visionaries Film Club: Ocean with David Attenborough", + "output": "david attenborough ocean" + }, + { + "input": "Hocus Pocus in Concert", + "output": "hocus pocus" + }, + { + "input": "Bar Trash: Queer Horror / Double Feature: HOMICIDAL + I SAW WHAT YOU DID!", + "output": "homicidal i saw what you did" + }, + { + "input": "Faces of Death (1978) - TFFF", + "output": "faces of death (1978)" + }, + { + "input": "Hi, Mom! (1970, Brian De Palma) 4K Restoration - TFFF", + "output": "hi mom" + }, + { + "input": "The Dancing Hawk (1978, Grzegorz Królikiewicz) UK Theatrical Premiere - TFFF", + "output": "dancing hawk" + }, + { + "input": "All Power to the People: The Black Panther Party at 60", + "output": "all power to the people the black panther party at 60" + }, + { + "input": "Remember the Times - Black History Masterclass with Bro Andrew Muhammad", + "output": "remember the times" + }, + { + "input": "Jet Lag: Japanorama Livestream Premiere at Picturehouse Central", + "output": "jet lag japanorama" + }, + { + "input": "Jet Lag: Japanorama Livestream Premiere with In-Person Pre-Show", + "output": "jet lag japanorama" + }, + { + "input": "Jet Lag: Japanorama Premiere + Live Q&A", + "output": "jet lag japanorama" + }, + { + "input": "Jet Lag: Tag Across Europe Director’s Commentary", + "output": "jet lag tag across europe directors commentary" + }, + { + "input": "Jet Lag: The Game Pub Trivia Live", + "output": "jet lag the game pub trivia live" + }, + { + "input": "Jet Lag: The Layover Podcast Live", + "output": "jet lag the layover podcast live" + }, + { + "input": "BACKROOMS: EVERYTHING MUST GO", + "output": "backrooms" + }, + { + "input": "Backrooms: Everything Must Go With Bonus Footage", + "output": "backrooms" + }, + { + "input": "Mum, I'm Alien Pregnant - UK Premiere + Mystery 35mm Trailer Reel", + "output": "mum im alien pregnant" + }, + { + "input": "The Kirlian Frequency - UK Premiere + Mystery 35mm Rare Trailer Reel", + "output": "kirlian frequency" + }, + { + "input": "Gentlemen’s Agreement + Live Organ", + "output": "gentlemens agreement" + }, + { + "input": "Supergirl (12A)", + "output": "supergirl" + }, + { + "input": "BACKROOMS: EVERYTHING MUST GO W/ BONUS FOOTAGE", + "output": "backrooms" + }, + { + "input": "Carers & Babies: SHOOT THE PEOPLE", + "output": "shoot the people" + }, + { + "input": "Carers & Babies: THE INVITE", + "output": "the invite" + }, + { + "input": "SHOOT THE PEOPLE", + "output": "shoot the people" + }, + { + "input": "T A P E Collective: BOUCHRA (Preview)", + "output": "bouchra" + }, + { + "input": "Practical Magic - Girls' Night Out", + "output": "practical magic" + }, + { + "input": "Imploding Fictions presents: Laplace's Demon & When Fiction Talks Back", + "output": "laplaces demon when fiction talks back" + }, + { + "input": "Imploding Fictions presents: Laplace’s Demon & When Fiction Talks Back", + "output": "laplaces demon when fiction talks back" + }, + { + "input": "Planet Israel + Q&A", + "output": "planet israel" + }, + { + "input": "TFFF: AFFECTION/AFFECTION + Q&A", + "output": "affection/affection" + }, + { + "input": "TFFF: BELIEF IS NOT WITHOUT PATHOS + Q&A", + "output": "belief is not without pathos" + }, + { + "input": "TFFF: ERASMUS + Q&A", + "output": "erasmus" + }, + { + "input": "TFFF: HARD TIME LOVER", + "output": "hard time lover" + }, + { + "input": "TFFF: NATIONAL SPORT + Q&A", + "output": "national sport" + }, + { + "input": "TFFF: PLANE FILM + Q&A", + "output": "plane film" + }, + { + "input": "TFFF: SITTING IDLE + Q&A", + "output": "sitting idle" + }, + { + "input": "TFFF: SOFTSHELL + Q&A", + "output": "softshell" } ]