diff --git a/common/known-removable-phrases.js b/common/known-removable-phrases.js index 22ffd976..b9210430 100644 --- a/common/known-removable-phrases.js +++ b/common/known-removable-phrases.js @@ -126,6 +126,7 @@ const knownRemovablePhrases = [ ": Love in the Age of Anarchy", ": James Bond Season", ": japanese/ english subtitled version", + ": Symphony from Paradis", " (Japanese with English Subtitles)- Anime Season", " (Japanese)", ": Final Cut", @@ -369,6 +370,7 @@ const knownRemovablePhrases = [ "with introduction and post-film discussion", "with Introduction and Discussion", "with Introduction", + "with recorded intro", "with intro", "with Illusion-O", "with Arcana", @@ -435,6 +437,7 @@ const knownRemovablePhrases = [ "@ The Leyton Engineer", "@ ArtHouse Crouch End", "@leyton library", + "@ London Film School", "Sapphic Cinema and BFI Melodrama", "Free BFI Melodrama", 'Free: BFI "Rip it Up" Late Night', diff --git a/common/normalize-title.js b/common/normalize-title.js index 2c5c8234..b7be9b06 100644 --- a/common/normalize-title.js +++ b/common/normalize-title.js @@ -53,7 +53,7 @@ function normalizeTitle(title, options) { // Specific corrections const corrections = [ - ["&", "&"], + [/&/g, "&"], // Global, as a title can carry more than one [/^Screening Documentary/i, ""], ["HANNAH MONTANA: THE MOVIE", "HANNAH MONTANA MOVIE"], [/F1\s?®?:? The Movie/i, "F1"], @@ -65,6 +65,8 @@ function normalizeTitle(title, options) { "Birdman or (The Unexpected Virtue of Ignorance)", "Birdman or The Unexpected Virtue of Ignorance", ], + // Same again; the film is released here as "BPM (Beats Per Minute)". + [/120 BPM \(Beats Per Minute\)/i, "BPM Beats Per Minute"], // The venue follows the suffix with the language, so the rule below that // strips it from the end of the title never fires. [/^Mirzapur: The Movie\b/i, "Mirzapur"], diff --git a/common/tests/test-titles.json b/common/tests/test-titles.json index 36c9e2b4..1e42824e 100644 --- a/common/tests/test-titles.json +++ b/common/tests/test-titles.json @@ -67745,7 +67745,7 @@ }, { "input": "Attack on Titan: Symphony from Paradis", - "output": "attack on titan symphony from paradis" + "output": "attack on titan" }, { "input": "Leaves of London film screening + panel talk", @@ -101182,5 +101182,157 @@ { "input": "Film Africa: In a Whisper", "output": "in a whisper" + }, + { + "input": "Arrietty (dubbed)", + "output": "arrietty" + }, + { + "input": "IMAX preview: Godzilla Minus Zero", + "output": "godzilla minus zero" + }, + { + "input": "Moonlight 10th anniversary with recorded intro + in person panel discussion", + "output": "moonlight" + }, + { + "input": "Building Centre Film Club: 120 BPM (Beats Per Minute)", + "output": "bpm beats per minute" + }, + { + "input": "National Theatre Live: Hay Fever", + "output": "national theatre live hay fever" + }, + { + "input": "National Theatre Live: The Motive And The Cue", + "output": "national theatre live the motive the cue" + }, + { + "input": "Without Consent:Mining in Neskantaga's Ancestral Homelands", + "output": "without consent mining in neskantagas ancestral homelands" + }, + { + "input": "OffBeat presents LONDON IN THE RAW (1964)", + "output": "london in the raw (1964)" + }, + { + "input": "City of Masks + Golden Mask Meet and Greet", + "output": "city of masks" + }, + { + "input": "TRANSMISSIONS PRESENTS: Hellraiser ***VHS*** (intro by ALISON RUMFITT)", + "output": "hellraiser" + }, + { + "input": "National Theatre Live: The Motive and the Cue", + "output": "national theatre live the motive the cue" + }, + { + "input": "La Fémis @ London Film School", + "output": "la femis" + }, + { + "input": "NT Live: Hay Fever", + "output": "national theatre live hay fever" + }, + { + "input": "Coco (2017) (Omniplex Classics)", + "output": "coco (2017)" + }, + { + "input": "Hocus Pocus (1993) (Omniplex Classics)", + "output": "hocus pocus (1993)" + }, + { + "input": "Hotel Transylvania (2012) (Omniplex Classics)", + "output": "hotel transylvania (2012)" + }, + { + "input": "Monster House (2006) (Omniplex Classics)", + "output": "monster house (2006)" + }, + { + "input": "NT Live: The Motive and the Cue", + "output": "national theatre live the motive the cue" + }, + { + "input": "Practical Magic (1998) (Omniplex Classics)", + "output": "practical magic (1998)" + }, + { + "input": "Scream (1996) (Omniplex Classics)", + "output": "scream (1996)" + }, + { + "input": "The Addams Family (1991) (Omniplex Classics)", + "output": "addams family (1991)" + }, + { + "input": "The Craft (1996) (Omniplex Classics)", + "output": "the craft (1996)" + }, + { + "input": "The Exorcist (1973) (Omniplex Classics)", + "output": "the exorcist (1973)" + }, + { + "input": "The Others (2001) (Omniplex Classics)", + "output": "the others (2001)" + }, + { + "input": "The Rocky Horror Picture Show (1975) (Omniplex Classics)", + "output": "rocky horror picture show (1975)" + }, + { + "input": "National Theatre Live: Motive and the Cue", + "output": "national theatre live motive the cue" + }, + { + "input": "Line producing with Ioanna Karavela - Masterclass - TUFF 2027 (Room UG05)", + "output": "line producing with ioanna karavela" + }, + { + "input": "Doc'n Roll: THE BEST SUMMER + Q&A", + "output": "best summer" + }, + { + "input": "Attack on Titan: Symphony from Paradis (15)", + "output": "attack on titan" + }, + { + "input": "STST Film Club | Tranz Tropez", + "output": "tranz tropez" + }, + { + "input": "Black History Month: Tongues Untied", + "output": "tongues untied" + }, + { + "input": "CONSUMED: A contemporary Asian Horror showcase", + "output": "consumed a contemporary asian horror showcase" + }, + { + "input": "'RAFT' & The Parlour Collective & 'The Moon Over The Alley'", + "output": "raft the parlour collective the moon over the alley" + }, + { + "input": "Spotlight: Morvern Callar (2001)", + "output": "morvern callar (2001)" + }, + { + "input": "FILM NIGHTS at The Source 'Disclosure Day'", + "output": "disclosure day" + }, + { + "input": "FILM NIGHTS at The Source 'H is for Hawk'", + "output": "h is for hawk" + }, + { + "input": "FILM NIGHTS at The Source 'Michael' (2026)", + "output": "michael (2026)" + }, + { + "input": "FILM NIGHTS at The Source 'Reality' (2023)", + "output": "reality (2023)" } ]