mirror of
https://github.com/Horizontal42/Sort_YM.git
synced 2026-11-10 15:42:02 +03:00
Раньше жанр брался только с альбома (одна строка, часто общая: rock/alternative/pop) - разные по звучанию артисты сваливались в одну крупную корзину. Теперь classify_track сводит жанр трека и жанры артиста (client.artists(), несколько тегов на артиста) на уровне под-жанра: при согласии сигналов или отсутствии одного из них берём имеющийся; при конфликте - если альбомный тег зонтичный (GENERIC_SLUGS) доверяем артисту, если точный - треку (вероятный осознанный эксперимент артиста в другом жанре). Один и тот же артист с разными по духу треками теперь раскладывается по разным плейлистам. Под-жанровые группы меньше config.small_group_min схлопываются в родительскую крупную корзину (report.build_rows, двухпроходно, без циклов - coarse_of детерминирована от fine). Попутно: artist_ids трека может быть None (артист без привязки к каталогу Яндекса, встречается у стороннего/пиратского аплоада) - раньше это улетало в client.artists() как строка "None" и валилось BadRequestError на батче; теперь такие id отфильтровываются на записи и дополнительно на чтении кэша.
73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
from __future__ import annotations
|
||
|
||
# Крупные корзины (11 штук) - используются, когда под-жанровая группа слишком мала
|
||
# и схлопывается в родителя (см. report.build_rows).
|
||
BUCKET_LABELS: dict[str, str] = {
|
||
"pop": "Поп",
|
||
"rock": "Рок",
|
||
"metal": "Метал",
|
||
"rap": "Рэп",
|
||
"electronic": "Электроника",
|
||
"jazz-blues": "Джаз и блюз",
|
||
"classical": "Классика",
|
||
"folk-world": "Фолк и world",
|
||
"indie-alt": "Инди и альтернатива",
|
||
"soundtrack": "Саундтреки",
|
||
"other": "Разное",
|
||
}
|
||
|
||
# Под-жанры (root_id из реального дерева client.genres()) - используются, когда группа
|
||
# достаточно большая, чтобы получить отдельный плейлист (см. config.small_group_min).
|
||
FINE_LABELS: dict[str, str] = {
|
||
"allrock": "Рок",
|
||
"alternative": "Альтернатива",
|
||
"indie": "Инди",
|
||
"punk": "Панк",
|
||
"metal": "Метал",
|
||
"rap": "Рэп",
|
||
"electronics": "Электроника",
|
||
"dance": "Танцевальная",
|
||
"jazz": "Джаз",
|
||
"blues": "Блюз",
|
||
"classicalmusic": "Классика",
|
||
"pop": "Поп",
|
||
"estrada": "Эстрада",
|
||
"rnb": "R&B",
|
||
"folk": "Музыка мира",
|
||
"folkgenre": "Фолк",
|
||
"bard": "Авторская песня",
|
||
"shanson": "Шансон",
|
||
"country": "Кантри",
|
||
"reggae": "Регги",
|
||
"ska": "Ска",
|
||
"islamicgenre": "Исламская музыка",
|
||
"soundtrack": "Саундтреки",
|
||
"all": "Микс",
|
||
"other": "Разное",
|
||
"relax": "Лёгкая музыка",
|
||
"children": "Детская музыка",
|
||
"forchildren": "Детская",
|
||
"poemsforchildren": "Стихи для детей",
|
||
"fairytales": "Аудиосказки",
|
||
"audiobooks": "Разговорное",
|
||
"booksnotinrussian": "Аудиокниги на ин. языке",
|
||
"fiction": "Художественная литература",
|
||
"nonfictionliterature": "Нон-фикшн",
|
||
"podcasts": "Подкасты",
|
||
"naturesounds": "Звуки природы",
|
||
}
|
||
|
||
_ALL_LABELS: dict[str, str] = {**FINE_LABELS, **BUCKET_LABELS}
|
||
|
||
LANG_LABELS: dict[str, str] = {
|
||
"RU": "RU",
|
||
"INT": "INT",
|
||
"UNKNOWN": "Не определено",
|
||
}
|
||
|
||
|
||
def playlist_name(bucket: str, lang: str) -> str:
|
||
"""bucket - либо под-жанр (root_id), либо крупная корзина (после схлопывания)."""
|
||
bucket_label = _ALL_LABELS.get(bucket, BUCKET_LABELS["other"])
|
||
lang_label = LANG_LABELS.get(lang, LANG_LABELS["UNKNOWN"])
|
||
return f"{bucket_label} — {lang_label}"
|