fix ROOT_BUCKET to use verified genre roots instead of guessed slugs

Живой каталог client.genres() показал, что настоящий корень для рока -
"allrock" (title "Рок"), а не "rock", как было угадано изначально. Из-за
этого весь рок (559 из ~1900 треков, почти треть библиотеки) молча падал
в "Разное". Таблица переписана по полному списку из 34 реальных корней
(cache/genre_catalog.json), а не по предположениям об именах слагов.
This commit is contained in:
Andrew Pimenov 2026-07-06 12:15:27 +03:00
parent f69d961064
commit a8dd8d3bc8
2 changed files with 44 additions and 39 deletions

View file

@ -10,57 +10,58 @@ from .ymclient import with_retries
GENRE_CATALOG_FILE = "genre_catalog.json" GENRE_CATALOG_FILE = "genre_catalog.json"
# Корневые жанры каталога Яндекс.Музыки -> наши крупные корзины. # Корневые жанры каталога Яндекс.Музыки -> наши крупные корзины.
# Список получен из реального дерева client.genres() и может дополняться: # Таблица построена по реальному дереву client.genres() (все 34 актуальных корня на момент
# если жанр трека не находится ни в одном известном корне, он попадает в "other" — # написания), а не по предположениям об именах слагов — проверено на живом каталоге
# (cache/genre_catalog.json). Если Яндекс добавит новый корневой жанр, он попадёт в "other" —
# смотрите разбивку "other" в выводе команды report, чтобы дополнить таблицу. # смотрите разбивку "other" в выводе команды report, чтобы дополнить таблицу.
ROOT_BUCKET: dict[str, str] = { ROOT_BUCKET: dict[str, str] = {
"pop": "pop", # рок
"ruspop": "pop", "allrock": "rock",
"estrada": "pop", # инди / альтернатива / панк
"rnb": "pop",
"disco": "pop",
"rock": "rock",
"rusrock": "rock",
"hardrock": "rock",
"prog": "rock",
"alternative": "indie-alt", "alternative": "indie-alt",
"indie": "indie-alt", "indie": "indie-alt",
"punk": "indie-alt", "punk": "indie-alt",
"postrock": "indie-alt", # метал
"metal": "metal", "metal": "metal",
"extreme": "metal", # рэп
"industrial": "metal",
"rap": "rap", "rap": "rap",
"rusrap": "rap", # электроника / танцевальная
"hip": "rap",
"hiphop": "rap",
"trap": "rap",
"electronics": "electronic", "electronics": "electronic",
"dance": "electronic", "dance": "electronic",
"house": "electronic", # джаз и блюз
"techno": "electronic",
"trance": "electronic",
"dnb": "electronic",
"dubstep": "electronic",
"jazz": "jazz-blues", "jazz": "jazz-blues",
"blues": "jazz-blues", "blues": "jazz-blues",
"soul": "jazz-blues", # классика
"funk": "jazz-blues",
"classicalmusic": "classical", "classicalmusic": "classical",
"classical": "classical", # поп
"opera": "classical", "pop": "pop",
"estrada": "pop",
"rnb": "pop",
# фолк и world
"folk": "folk-world", "folk": "folk-world",
"folkgenre": "folk-world",
"bard": "folk-world", "bard": "folk-world",
"author": "folk-world",
"avtorskaya": "folk-world",
"shanson": "folk-world", "shanson": "folk-world",
"world": "folk-world",
"reggae": "folk-world",
"country": "folk-world", "country": "folk-world",
"films": "soundtrack", "reggae": "folk-world",
"ska": "folk-world",
"islamicgenre": "folk-world",
# саундтреки
"soundtrack": "soundtrack", "soundtrack": "soundtrack",
"musical": "soundtrack", # не музыка / нераспределяемое -> "other"
"cartoon": "soundtrack", "all": "other",
"other": "other",
"relax": "other",
"children": "other",
"forchildren": "other",
"poemsforchildren": "other",
"fairytales": "other",
"audiobooks": "other",
"booksnotinrussian": "other",
"fiction": "other",
"nonfictionliterature": "other",
"podcasts": "other",
"naturesounds": "other",
} }

View file

@ -5,11 +5,14 @@ from sort_ym import genres
@pytest.fixture @pytest.fixture
def catalog(): def catalog():
# Форма реального дерева client.genres(): "rock"/"rusrock" - подгенры, реальный
# корень называется "allrock", а не "rock" (проверено на живом каталоге).
return { return {
"rock": {"title": "Рок", "root_id": "rock"}, "allrock": {"title": "Рок", "root_id": "allrock"},
"rusrock": {"title": "Русский рок", "root_id": "rock"}, "rock": {"title": "Иностранный рок", "root_id": "allrock"},
"postrock": {"title": "Пост-рок", "root_id": "postrock"}, "rusrock": {"title": "Русский рок", "root_id": "allrock"},
"rap": {"title": "Рэп", "root_id": "rap"}, "alternative": {"title": "Альтернатива", "root_id": "alternative"},
"rap": {"title": "Рэп и хип-хоп", "root_id": "rap"},
"trap": {"title": "Трэп", "root_id": "rap"}, "trap": {"title": "Трэп", "root_id": "rap"},
} }
@ -17,9 +20,10 @@ def catalog():
@pytest.mark.parametrize( @pytest.mark.parametrize(
"genre_raw,expected", "genre_raw,expected",
[ [
("allrock", "rock"),
("rock", "rock"), ("rock", "rock"),
("rusrock", "rock"), ("rusrock", "rock"),
("postrock", "indie-alt"), ("alternative", "indie-alt"),
("rap", "rap"), ("rap", "rap"),
("trap", "rap"), ("trap", "rap"),
(None, "other"), (None, "other"),