mirror of
https://github.com/narrrl/proton-stream.git
synced 2026-11-03 16:41:26 +01:00
fix(core,meta): a folder of films is one title per film
The four Rebuild of Evangelion films in one folder were one series: `- 1.11` read as episode 1, and every file took the folder's name, so the whole folder matched a single film. A dash followed by a decimal is now part of the film's name, and a folder whose files are all unnumbered, outside any grouping folder and each named differently gives each file its own title. AniList needs every query word in a title, and a film's version number is not in it, so a search that finds nothing is retried without it. All four films now match their own entries.
This commit is contained in:
1 parent
65a669e231
commit
238ecd8220
5 files changed
+341
-9
No files matched your search
@@ -379,6 +379,12 @@ impl AniList {
|
||||
/// tokenisation: by dropping the `s` it was holding on to. It is asked for only
|
||||
/// after the name as written found nothing, which is what keeps it from
|
||||
/// broadening a search that was already working.
|
||||
///
|
||||
/// A film's version number is the same kind of miss. `Evangelion - 1.11 You
|
||||
/// Are (Not) Alone` is the file of a film AniList calls `Evangelion: 1.0 You
|
||||
/// Are (Not) Alone`, and `1.11` is not a word of that name — so the last
|
||||
/// fallback asks without it, and leaves telling the films apart to the scoring,
|
||||
/// which still sees the whole name.
|
||||
fn search_terms(name: &str) -> Vec<String> {
|
||||
let mut terms = vec![name.to_string()];
|
||||
|
||||
@@ -386,9 +392,31 @@ fn search_terms(name: &str) -> Vec<String> {
|
||||
if depossessed != name {
|
||||
terms.push(depossessed);
|
||||
}
|
||||
let unversioned = without_version_numbers(name);
|
||||
if !unversioned.is_empty() && !terms.contains(&unversioned) {
|
||||
terms.push(unversioned);
|
||||
}
|
||||
terms
|
||||
}
|
||||
|
||||
/// `Evangelion - 1.11 You Are Alone` → `Evangelion - You Are Alone`.
|
||||
///
|
||||
/// A version is digits with a dot in them (`1.11`, `3.0+1.01`); a bare number
|
||||
/// is left alone, because in `Kaijuu 8-gou` or `86` it is the name.
|
||||
fn without_version_numbers(name: &str) -> String {
|
||||
name.split(' ')
|
||||
.filter(|word| {
|
||||
let versioned = word.contains('.')
|
||||
&& word.chars().any(|c| c.is_ascii_digit())
|
||||
&& word
|
||||
.chars()
|
||||
.all(|c| c.is_ascii_digit() || matches!(c, '.' | '+'));
|
||||
!versioned
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
.join(" ")
|
||||
}
|
||||
|
||||
/// `Heavens Feel` → `Heaven Feel`.
|
||||
///
|
||||
/// Only words long enough to still mean something without it, and only where
|
||||
@@ -836,6 +864,29 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
/// **What three of the four Rebuild films matched as: nothing.** AniList
|
||||
/// requires every word, and a film's version number is not one of its
|
||||
/// title's.
|
||||
#[test]
|
||||
fn a_films_version_number_is_searched_for_again_without_it() {
|
||||
assert_eq!(
|
||||
search_terms("Evangelion - 1.11 You Are Alone"),
|
||||
vec![
|
||||
"Evangelion - 1.11 You Are Alone".to_string(),
|
||||
"Evangelion - You Are Alone".to_string(),
|
||||
]
|
||||
);
|
||||
assert_eq!(
|
||||
search_terms("Evangelion - 3.0+1.01 Thrice Upon a Time")[1],
|
||||
"Evangelion - Thrice Upon a Time"
|
||||
);
|
||||
assert_eq!(
|
||||
search_terms("Kaijuu 8-gou"),
|
||||
vec!["Kaijuu 8-gou"],
|
||||
"a number that is part of the name stays"
|
||||
);
|
||||
}
|
||||
|
||||
/// Byte slicing, on names that are not ASCII.
|
||||
#[test]
|
||||
fn a_multi_byte_name_is_not_cut_inside_a_character() {
|
||||
|
||||
Reference in new issue
Block a user