From 881e22c528b9e6e7e8d19068ffc913669d5a5732 Mon Sep 17 00:00:00 2001 From: Andrew Pimenov Date: Tue, 11 Aug 2026 01:42:20 +0300 Subject: [PATCH] report: --extra means all extra columns again, add per-group flags --extra alone now adds every extra column like before. Individual --timestamp/--duration/--version/--album/--artist flags let you pick just one group instead, and combine freely. --- ARCHITECTURE.md | 7 ++++--- ARCHITECTURE.ru.md | 8 ++++---- README.md | 16 ++++++++-------- README.ru.md | 14 +++++++------- sort_ym/cli.py | 22 +++++++++++++++++----- 5 files changed, 40 insertions(+), 27 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 6b27b11..aeb6ed3 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -181,9 +181,10 @@ report/apply/digest --source → source.parse_playlist_url() → (user_id, - `out/report.csv` — a preview of the playlist breakdown before `apply` (including the `fine_bucket` column — the sub-genre before any collapsing into a top-level bucket). `report --order playlist` keeps source track order instead of sorting by target playlist; - `report --extra ` adds the selected groups' columns (`timestamp`/`duration`/ - `version`/`album`/`artist`, or `all` for every group; `report.EXTRA_GROUPS` -> column list, - `report.resolve_extra_columns()` expands group names into a column list for the CLI). + individual `--timestamp`/`--duration`/`--version`/`--album`/`--artist` flags (combinable) add + that group's columns, `--extra` adds every group at once. Flag -> CSV columns mapping is + `report.EXTRA_GROUPS`; `report.resolve_extra_columns()` expands the selected groups into a + column list for the CLI. - `out/digest.md` — a compact library summary for pasting into an LLM chat (top artists, top albums, genre/language/decade breakdowns). - `out/report_source.csv`, `out/digest_source.md` — the same reports for a `--source` run; a diff --git a/ARCHITECTURE.ru.md b/ARCHITECTURE.ru.md index 44edd23..f187076 100644 --- a/ARCHITECTURE.ru.md +++ b/ARCHITECTURE.ru.md @@ -179,10 +179,10 @@ report/apply/digest --source → source.parse_playlist_url() → (user_id, - `cache/lyrics_lang.json` — язык текста песни по треку (id -> language code | null). - `out/report.csv` — предпросмотр распределения по плейлистам перед `apply` (включая колонку `fine_bucket` — под-жанр до возможного схлопывания в крупную корзину). `report --order playlist` - сохраняет исходный порядок треков вместо сортировки по целевому плейлисту; `report --extra - <группа...>` добавляет колонки выбранных групп (`timestamp`/`duration`/`version`/`album`/`artist`, - или `all` - сразу все; `report.EXTRA_GROUPS` -> список колонок, `report.resolve_extra_columns()` - разворачивает имена групп в список колонок для CLI). + сохраняет исходный порядок треков вместо сортировки по целевому плейлисту; отдельные флаги + `--timestamp`/`--duration`/`--version`/`--album`/`--artist` (можно сочетать) добавляют колонки + своей группы, `--extra` — сразу все группы. Соответствие флаг -> колонки CSV - `report.EXTRA_GROUPS`; + `report.resolve_extra_columns()` разворачивает выбранные группы в список колонок для CLI. - `out/digest.md` — сжатая сводка библиотеки для вставки в чат с LLM (топ-исполнители, топ-альбомы, распределение по жанрам, языку и десятилетиям). - `out/report_source.csv`, `out/digest_source.md` — те же отчёты, но для запуска с `--source`; diff --git a/README.md b/README.md index d221ff1..8fae56c 100644 --- a/README.md +++ b/README.md @@ -62,14 +62,14 @@ By default `report` groups/sorts tracks by target playlist with a base set of co These flags change that — from most to least commonly useful: ``` -.venv\Scripts\python -m sort_ym report --order playlist # skip playlist-based sorting - keep source track order (as in likes/the --source playlist) -.venv\Scripts\python -m sort_ym report --extra timestamp # + when the track was added (added_at) -.venv\Scripts\python -m sort_ym report --extra album # + album release date and likes (release_date, album_likes_count) -.venv\Scripts\python -m sort_ym report --extra artist # + first artist's track counts/rating -.venv\Scripts\python -m sort_ym report --extra duration # + track length (duration_ms) -.venv\Scripts\python -m sort_ym report --extra version # + track/album version tags (remix, anniversary edition, etc.) -.venv\Scripts\python -m sort_ym report --extra timestamp album # groups can be combined, space-separated -.venv\Scripts\python -m sort_ym report --extra all --order playlist # every extra column + source track order +.venv\Scripts\python -m sort_ym report --order playlist # skip playlist-based sorting - keep source track order (as in likes/the --source playlist) +.venv\Scripts\python -m sort_ym report --timestamp # + when the track was added (added_at) +.venv\Scripts\python -m sort_ym report --album # + album release date and likes (release_date, album_likes_count) +.venv\Scripts\python -m sort_ym report --artist # + first artist's track counts/rating +.venv\Scripts\python -m sort_ym report --duration # + track length (duration_ms) +.venv\Scripts\python -m sort_ym report --version # + track/album version tags (remix, anniversary edition, etc.) +.venv\Scripts\python -m sort_ym report --timestamp --album # flags can be combined +.venv\Scripts\python -m sort_ym report --extra --order playlist # --extra = every extra column at once + source track order ``` ## Full cache cleanup diff --git a/README.ru.md b/README.ru.md index e2039e1..8ca916a 100644 --- a/README.ru.md +++ b/README.ru.md @@ -63,13 +63,13 @@ python -m venv .venv ``` .venv\Scripts\python -m sort_ym report --order playlist # без сортировки по плейлистам - треки в исходном порядке источника (как в лайках/--source плейлисте) -.venv\Scripts\python -m sort_ym report --extra timestamp # + дата добавления трека (added_at) -.venv\Scripts\python -m sort_ym report --extra album # + дата релиза и лайки альбома (release_date, album_likes_count) -.venv\Scripts\python -m sort_ym report --extra artist # + счётчики/рейтинг первого артиста трека -.venv\Scripts\python -m sort_ym report --extra duration # + длительность трека (duration_ms) -.venv\Scripts\python -m sort_ym report --extra version # + пометки версии трека/альбома (ремикс, юбилейное издание и т.п.) -.venv\Scripts\python -m sort_ym report --extra timestamp album # можно комбинировать несколько групп через пробел -.venv\Scripts\python -m sort_ym report --extra all --order playlist # все доп. колонки сразу + порядок как в источнике +.venv\Scripts\python -m sort_ym report --timestamp # + дата добавления трека (added_at) +.venv\Scripts\python -m sort_ym report --album # + дата релиза и лайки альбома (release_date, album_likes_count) +.venv\Scripts\python -m sort_ym report --artist # + счётчики/рейтинг первого артиста трека +.venv\Scripts\python -m sort_ym report --duration # + длительность трека (duration_ms) +.venv\Scripts\python -m sort_ym report --version # + пометки версии трека/альбома (ремикс, юбилейное издание и т.п.) +.venv\Scripts\python -m sort_ym report --timestamp --album # флаги можно комбинировать +.venv\Scripts\python -m sort_ym report --extra --order playlist # --extra = сразу все доп. колонки + порядок как в источнике ``` ## Полная очистка кэша diff --git a/sort_ym/cli.py b/sort_ym/cli.py index a970e05..255f1e2 100644 --- a/sort_ym/cli.py +++ b/sort_ym/cli.py @@ -77,9 +77,18 @@ def _print_report_summary(rows: list[dict], out_file) -> None: print(f"\nОтчёт сохранён: {out_file}") +def _report_extra_columns(args: argparse.Namespace) -> list[str] | None: + # --extra - сразу все группы; отдельные --timestamp/--duration/... - точечный выбор, + # можно сочетать друг с другом (--timestamp --album), --extra их всех перекрывает. + if args.extra: + return report.resolve_extra_columns(["all"]) + selected = [name for name in report.EXTRA_GROUPS if getattr(args, name)] + return report.resolve_extra_columns(selected) if selected else None + + def cmd_report(args: argparse.Namespace) -> None: cfg = load_config() - extra_columns = report.resolve_extra_columns(args.extra) if args.extra else None + extra_columns = _report_extra_columns(args) if args.source: ctx = _source_context(cfg, args.source) @@ -208,11 +217,14 @@ def main(argv: list[str] | None = None) -> None: "playlist - как треки идут в источнике (в лайках или в --source плейлисте), без сортировки", ) p_report.add_argument( - "--extra", nargs="+", metavar="GROUP", choices=[*report.EXTRA_GROUPS, "all"], default=None, - help="добавить в CSV колонки указанных групп (можно несколько через пробел), или 'all' - сразу все: " - "timestamp (added_at), duration (duration_ms), version (track_version/album_version), " - "album (release_date/album_likes_count), artist (счётчики и рейтинг первого артиста трека)", + "--extra", action="store_true", + help="добавить в CSV все доп. колонки сразу (то же самое, что все флаги ниже вместе)", ) + p_report.add_argument("--timestamp", action="store_true", help="+ дата добавления трека (added_at)") + p_report.add_argument("--duration", action="store_true", help="+ длительность трека (duration_ms)") + p_report.add_argument("--version", action="store_true", help="+ пометка версии трека/альбома (ремикс, юбилейное издание и т.п.)") + p_report.add_argument("--album", action="store_true", help="+ дата релиза и лайки альбома (release_date, album_likes_count)") + p_report.add_argument("--artist", action="store_true", help="+ счётчики и рейтинг первого артиста трека") p_apply = sub.add_parser("apply", help="создать плейлисты и добавить треки") p_apply.add_argument("--yes", action="store_true", help="подтвердить внесение изменений в аккаунт")