diff --git a/common/known-removable-phrases.js b/common/known-removable-phrases.js index 86118eac..efef5277 100644 --- a/common/known-removable-phrases.js +++ b/common/known-removable-phrases.js @@ -362,6 +362,7 @@ const knownRemovablePhrases = [ "MediCinema Previews", "Index on Censorship Panel Event", "Private Screening", + "Private Premiere", "' Screening", "Holiday with Hitch:", "Hard of Hearing:", @@ -500,6 +501,7 @@ const knownRemovablePhrases = [ "- sold out", " x After the Credits", " x Flower Workshop", + " x Koshin-san Workshop", " x Free Vocafest Screening", " x FIST CLUB for IWD", " x Film House: Pride Edition", @@ -953,6 +955,7 @@ const knownRemovablePhrases = [ "Film Club x Bounce Cinema:", "Film Club & Brunch:", "From Lumière to ", + "From Shadows to Light:", "= Premier Film Screening", "Film Screening & Live Q&A:", "Film Screening:", @@ -1353,7 +1356,9 @@ const knownRemovablePhrases = [ "Film & Discussion", "Screening & Social", "Screening & Workshop", + "Workshop & Screening", " plus workshop", + "Paint-By-Numbers Workshop", "Screening & Q&A:", "Screening + Q&A:", "Screening+ Q&A:", @@ -1362,6 +1367,7 @@ const knownRemovablePhrases = [ "Screening+Karaoke", "Screening 流麻溝十五號放映會", "Screening at Close-Up", + "screening at Divine", // Before "Screening:", which would otherwise leave "Relaxed-" behind. "Relaxed-Screening:", "Screening:", @@ -1707,6 +1713,7 @@ const knownRemovablePhrases = [ "initial screening", "a solidarity screening", "NEW DATE:", + "Drink-Along", "DRINK-AND-SING-ALONG", "A Sing-A-Long Event", "A Sing-Along Event", diff --git a/common/normalize-title.js b/common/normalize-title.js index d38f4e1c..34e3be3a 100644 --- a/common/normalize-title.js +++ b/common/normalize-title.js @@ -412,6 +412,17 @@ function normalizeTitle(title, options) { [/\s+(?:english\s+)?dub?$/i, ""], [/\s+sub?$/i, ""], // subbed [/\s+(?:live\s+)?(?:in\s+)?(3|2)d$/i, ""], // 3d or 2d, with optional "live in" prefix + // Ahead of the year rule below, which would otherwise take the "2026" this + // matches on. Billed without its episodes, so it is given the title the + // same double bill carries elsewhere. + [ + "Thunderbirds 4k Restoration Double Bill 2026", + "Thunderbirds 4K Double Bill - Atlantic Inferno / Attack of the Alligators!", + ], + // The series' name, billed ahead of a dash. Removed here rather than in the + // phrase list, which runs after the separator rule has already cut the + // title at the dash and kept the series name instead of the film. + [/^Soft Limit Cinema - /i, ""], // Year - except CatVideoFest's, which is part of the title: TheMovieDB // has a film per year ("CatVideoFest 2026"). Anchored to the end, this // also misses a year followed by a subtitle ("CatVideoFest 2026 - @@ -2120,6 +2131,8 @@ function normalizeTitle(title, options) { ["Aakasamlo Oka Tara", "Aakasam Lo Oka Tara"], // The venue bills the film by its initials, run into the venue's name ["LBN at The Cinema", "La Bola Negra"], + [/THE THREE DUMAS$/i, "The Three Dumas (2007)"], + ["Two Gentleman Sharing", "Two Gentlemen Sharing"], ]; corrections.forEach(([phrase, replacement]) => { diff --git a/common/tests/test-titles.json b/common/tests/test-titles.json index 06a2630b..a742467b 100644 --- a/common/tests/test-titles.json +++ b/common/tests/test-titles.json @@ -108338,5 +108338,137 @@ { "input": "The Food Chain Fundraiser: It’s a Wonderful Life", "output": "its a wonderful life" + }, + { + "input": "Shara Soju x Koshin-san Workshop", + "output": "shara soju" + }, + { + "input": "The Muppet Christmas Carol Drink-Along", + "output": "muppet christmas carol" + }, + { + "input": "The Muppet Christmas Carol Workshop & Screening", + "output": "muppet christmas carol" + }, + { + "input": "Soft Limit Cinema - 'Head Over Heels' UK Premiere", + "output": "head over heels" + }, + { + "input": "F — Private Premiere", + "output": "f" + }, + { + "input": "Cinematic Cocktails Presents: Shaun of the Dead", + "output": "shaun of the dead" + }, + { + "input": "A BLACK STAR (LDN SCREENING)", + "output": "black star" + }, + { + "input": "Dog Day Evening", + "output": "dog day evening" + }, + { + "input": "A Ribbon of Film | Կտոր մը երիզ: Western Armenian Film Programme", + "output": "ribbon of film" + }, + { + "input": "A Taste of Golden Apricot + Q&A", + "output": "taste of golden apricot" + }, + { + "input": "AFSLab 2026", + "output": "afslab" + }, + { + "input": "Armenian Film Festival Masterclass: How To Make an Award-Winning Poetry Film", + "output": "armenian film festival masterclass how to make an awardwinning poetry film" + }, + { + "input": "Aurora's Sunrise + Q&A", + "output": "auroras sunrise" + }, + { + "input": "British Armenian Focus shorts", + "output": "british armenian focus shorts" + }, + { + "input": "Dr. Akagi", + "output": "dr akagi" + }, + { + "input": "From Shadows to Light: Karine", + "output": "karine" + }, + { + "input": "UK PREMIERE Here, Elsewhere + Q&A", + "output": "here elsewhere" + }, + { + "input": "UK PREMIERE Outliving Shakespeare + Q&A", + "output": "outliving shakespeare" + }, + { + "input": "Love Actually - Festive Film Screening", + "output": "love actually" + }, + { + "input": "Love Actually Film Screening", + "output": "love actually" + }, + { + "input": "Twilight Paint-By-Numbers Workshop", + "output": "twilight" + }, + { + "input": "The 70th Anniversary London Screening of \"The Girl Can't Help It\"", + "output": "girl cant help it" + }, + { + "input": "Thunderbirds 4k Restoration Double Bill 2026", + "output": "thunderbirds double bill atlantic inferno" + }, + { + "input": "Esther Anderson Retrospective: A WARM DECEMBER + Q&A", + "output": "warm december" + }, + { + "input": "Esther Anderson Retrospective: BOB MARLEY — THE MAKING OF A LEGEND", + "output": "bob marley the making of a legend" + }, + { + "input": "Esther Anderson Retrospective: MYSTERY MOVIE", + "output": "mystery movie" + }, + { + "input": "Esther Anderson Retrospective: THE THREE DUMAS", + "output": "three dumas (2007)" + }, + { + "input": "Esther Anderson Retrospective: TWO GENTLEMAN SHARING + SHORT ENDS", + "output": "two gentlemen sharing" + }, + { + "input": "Persona (60th Anniversary)", + "output": "persona" + }, + { + "input": "Festival of Film", + "output": "festival of film" + }, + { + "input": "'HOUND' (80 mins) screening at Divine.", + "output": "hound" + }, + { + "input": "Abominable", + "output": "abominable" + }, + { + "input": "The Sword in the Stone", + "output": "sword in the stone" } ]