From a8dd8d3bc8e2f580ffe5c19bd0b385ae22f53afc Mon Sep 17 00:00:00 2001 From: Andrew Pimenov Date: Mon, 6 Jul 2026 12:15:27 +0300 Subject: [PATCH] fix ROOT_BUCKET to use verified genre roots instead of guessed slugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Живой каталог client.genres() показал, что настоящий корень для рока - "allrock" (title "Рок"), а не "rock", как было угадано изначально. Из-за этого весь рок (559 из ~1900 треков, почти треть библиотеки) молча падал в "Разное". Таблица переписана по полному списку из 34 реальных корней (cache/genre_catalog.json), а не по предположениям об именах слагов. --- sort_ym/genres.py | 69 ++++++++++++++++++++++---------------------- tests/test_genres.py | 14 +++++---- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/sort_ym/genres.py b/sort_ym/genres.py index 7b78081..001cc8f 100644 --- a/sort_ym/genres.py +++ b/sort_ym/genres.py @@ -10,57 +10,58 @@ from .ymclient import with_retries GENRE_CATALOG_FILE = "genre_catalog.json" # Корневые жанры каталога Яндекс.Музыки -> наши крупные корзины. -# Список получен из реального дерева client.genres() и может дополняться: -# если жанр трека не находится ни в одном известном корне, он попадает в "other" — +# Таблица построена по реальному дереву client.genres() (все 34 актуальных корня на момент +# написания), а не по предположениям об именах слагов — проверено на живом каталоге +# (cache/genre_catalog.json). Если Яндекс добавит новый корневой жанр, он попадёт в "other" — # смотрите разбивку "other" в выводе команды report, чтобы дополнить таблицу. ROOT_BUCKET: dict[str, str] = { - "pop": "pop", - "ruspop": "pop", - "estrada": "pop", - "rnb": "pop", - "disco": "pop", - "rock": "rock", - "rusrock": "rock", - "hardrock": "rock", - "prog": "rock", + # рок + "allrock": "rock", + # инди / альтернатива / панк "alternative": "indie-alt", "indie": "indie-alt", "punk": "indie-alt", - "postrock": "indie-alt", + # метал "metal": "metal", - "extreme": "metal", - "industrial": "metal", + # рэп "rap": "rap", - "rusrap": "rap", - "hip": "rap", - "hiphop": "rap", - "trap": "rap", + # электроника / танцевальная "electronics": "electronic", "dance": "electronic", - "house": "electronic", - "techno": "electronic", - "trance": "electronic", - "dnb": "electronic", - "dubstep": "electronic", + # джаз и блюз "jazz": "jazz-blues", "blues": "jazz-blues", - "soul": "jazz-blues", - "funk": "jazz-blues", + # классика "classicalmusic": "classical", - "classical": "classical", - "opera": "classical", + # поп + "pop": "pop", + "estrada": "pop", + "rnb": "pop", + # фолк и world "folk": "folk-world", + "folkgenre": "folk-world", "bard": "folk-world", - "author": "folk-world", - "avtorskaya": "folk-world", "shanson": "folk-world", - "world": "folk-world", - "reggae": "folk-world", "country": "folk-world", - "films": "soundtrack", + "reggae": "folk-world", + "ska": "folk-world", + "islamicgenre": "folk-world", + # саундтреки "soundtrack": "soundtrack", - "musical": "soundtrack", - "cartoon": "soundtrack", + # не музыка / нераспределяемое -> "other" + "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", } diff --git a/tests/test_genres.py b/tests/test_genres.py index d5dfc07..e4c48eb 100644 --- a/tests/test_genres.py +++ b/tests/test_genres.py @@ -5,11 +5,14 @@ from sort_ym import genres @pytest.fixture def catalog(): + # Форма реального дерева client.genres(): "rock"/"rusrock" - подгенры, реальный + # корень называется "allrock", а не "rock" (проверено на живом каталоге). return { - "rock": {"title": "Рок", "root_id": "rock"}, - "rusrock": {"title": "Русский рок", "root_id": "rock"}, - "postrock": {"title": "Пост-рок", "root_id": "postrock"}, - "rap": {"title": "Рэп", "root_id": "rap"}, + "allrock": {"title": "Рок", "root_id": "allrock"}, + "rock": {"title": "Иностранный рок", "root_id": "allrock"}, + "rusrock": {"title": "Русский рок", "root_id": "allrock"}, + "alternative": {"title": "Альтернатива", "root_id": "alternative"}, + "rap": {"title": "Рэп и хип-хоп", "root_id": "rap"}, "trap": {"title": "Трэп", "root_id": "rap"}, } @@ -17,9 +20,10 @@ def catalog(): @pytest.mark.parametrize( "genre_raw,expected", [ + ("allrock", "rock"), ("rock", "rock"), ("rusrock", "rock"), - ("postrock", "indie-alt"), + ("alternative", "indie-alt"), ("rap", "rap"), ("trap", "rap"), (None, "other"),