Genre priorities for album covers section
This commit is contained in:
@@ -594,8 +594,8 @@ pub fn top_genres(conn: &Connection, period: &str, limit: i64) -> Result<Vec<Top
|
|||||||
// Deprioritised genres (e.g. "ambient") always rank below specific
|
// Deprioritised genres (e.g. "ambient") always rank below specific
|
||||||
// genres regardless of play count. They still appear in the list if
|
// genres regardless of play count. They still appear in the list if
|
||||||
// they are the only genres present.
|
// they are the only genres present.
|
||||||
let a_dep = is_deprioritised(&a.genre);
|
let a_dep = is_deprioritised_genre(&a.genre);
|
||||||
let b_dep = is_deprioritised(&b.genre);
|
let b_dep = is_deprioritised_genre(&b.genre);
|
||||||
match (a_dep, b_dep) {
|
match (a_dep, b_dep) {
|
||||||
(true, false) => std::cmp::Ordering::Greater,
|
(true, false) => std::cmp::Ordering::Greater,
|
||||||
(false, true) => std::cmp::Ordering::Less,
|
(false, true) => std::cmp::Ordering::Less,
|
||||||
@@ -743,7 +743,7 @@ pub fn uncached_albums(conn: &Connection) -> Result<Vec<UncachedAlbum>> {
|
|||||||
/// Single-word genres ("rock", "electronic", "ambient") are broad descriptors
|
/// Single-word genres ("rock", "electronic", "ambient") are broad descriptors
|
||||||
/// that appear as secondary tags on many artists. Multi-word genres ("prog
|
/// that appear as secondary tags on many artists. Multi-word genres ("prog
|
||||||
/// rock", "alternative metal") are more specific and should rank first.
|
/// rock", "alternative metal") are more specific and should rank first.
|
||||||
fn is_deprioritised(genre: &str) -> bool {
|
pub fn is_deprioritised_genre(genre: &str) -> bool {
|
||||||
canonical_genre_key(genre).split_whitespace().count() < 2
|
canonical_genre_key(genre).split_whitespace().count() < 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1539,16 +1539,23 @@ fn html_attr_escape(s: &str) -> String {
|
|||||||
html_escape(s).replace('"', """)
|
html_escape(s).replace('"', """)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Split a comma-separated genre list and keep only the first `max_labels`
|
/// Split a comma-separated genre list and return the top `max_labels` labels,
|
||||||
/// cleaned labels.
|
/// applying the same deprioritisation rule as `top_genres`: multi-word genres
|
||||||
|
/// rank before single-word broad descriptors ("rock", "electronic", etc.).
|
||||||
fn top_genre_labels(genre_csv: &str, max_labels: usize) -> Vec<String> {
|
fn top_genre_labels(genre_csv: &str, max_labels: usize) -> Vec<String> {
|
||||||
genre_csv
|
let mut labels: Vec<String> = genre_csv
|
||||||
.split(',')
|
.split(',')
|
||||||
.map(str::trim)
|
.map(str::trim)
|
||||||
.filter(|s| !s.is_empty())
|
.filter(|s| !s.is_empty())
|
||||||
.take(max_labels)
|
|
||||||
.map(|s| s.to_string())
|
.map(|s| s.to_string())
|
||||||
.collect()
|
.collect();
|
||||||
|
|
||||||
|
// Stable sort so that multi-word genres always precede single-word ones,
|
||||||
|
// preserving the original MusicBrainz order within each group.
|
||||||
|
labels.sort_by_key(|g| db::is_deprioritised_genre(g));
|
||||||
|
|
||||||
|
labels.truncate(max_labels);
|
||||||
|
labels
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -1610,6 +1617,9 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_top_genre_labels_caps_to_three() {
|
fn test_top_genre_labels_caps_to_three() {
|
||||||
|
// "alternative rock" and "industrial" are multi-word → rank first.
|
||||||
|
// "electronic" and "darkwave" are single-word → deprioritised.
|
||||||
|
// With limit 3 we get both multi-word genres + one single-word.
|
||||||
let labels = top_genre_labels("alternative rock, electronic, industrial, darkwave", 3);
|
let labels = top_genre_labels("alternative rock, electronic, industrial, darkwave", 3);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
labels,
|
labels,
|
||||||
|
|||||||
Reference in New Issue
Block a user