Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions common/known-removable-phrases.js
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ const knownRemovablePhrases = [
"MediCinema Previews",
"Index on Censorship Panel Event",
"Private Screening",
"Private Premiere",
"' Screening",
"Holiday with Hitch:",
"Hard of Hearing:",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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:",
Expand Down Expand Up @@ -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:",
Expand All @@ -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:",
Expand Down Expand Up @@ -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",
Expand Down
13 changes: 13 additions & 0 deletions common/normalize-title.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 -
Expand Down Expand Up @@ -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]) => {
Expand Down
132 changes: 132 additions & 0 deletions common/tests/test-titles.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
]
Loading