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.
This commit is contained in:
Andrew Pimenov 2026-08-11 01:42:20 +03:00
parent b991236ffa
commit 881e22c528
5 changed files with 40 additions and 27 deletions

View file

@ -181,9 +181,10 @@ report/apply/digest --source <url> → source.parse_playlist_url() → (user_id,
- `out/report.csv` — a preview of the playlist breakdown before `apply` (including the - `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). `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 --order playlist` keeps source track order instead of sorting by target playlist;
`report --extra <group...>` adds the selected groups' columns (`timestamp`/`duration`/ individual `--timestamp`/`--duration`/`--version`/`--album`/`--artist` flags (combinable) add
`version`/`album`/`artist`, or `all` for every group; `report.EXTRA_GROUPS` -> column list, that group's columns, `--extra` adds every group at once. Flag -> CSV columns mapping is
`report.resolve_extra_columns()` expands group names into a column list for the CLI). `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 - `out/digest.md` — a compact library summary for pasting into an LLM chat (top artists, top
albums, genre/language/decade breakdowns). albums, genre/language/decade breakdowns).
- `out/report_source.csv`, `out/digest_source.md` — the same reports for a `--source` run; a - `out/report_source.csv`, `out/digest_source.md` — the same reports for a `--source` run; a

View file

@ -179,10 +179,10 @@ report/apply/digest --source <url> → source.parse_playlist_url() → (user_id,
- `cache/lyrics_lang.json` — язык текста песни по треку (id -> language code | null). - `cache/lyrics_lang.json` — язык текста песни по треку (id -> language code | null).
- `out/report.csv` — предпросмотр распределения по плейлистам перед `apply` (включая колонку - `out/report.csv` — предпросмотр распределения по плейлистам перед `apply` (включая колонку
`fine_bucket` — под-жанр до возможного схлопывания в крупную корзину). `report --order playlist` `fine_bucket` — под-жанр до возможного схлопывания в крупную корзину). `report --order playlist`
сохраняет исходный порядок треков вместо сортировки по целевому плейлисту; `report --extra сохраняет исходный порядок треков вместо сортировки по целевому плейлисту; отдельные флаги
<группа...>` добавляет колонки выбранных групп (`timestamp`/`duration`/`version`/`album`/`artist`, `--timestamp`/`--duration`/`--version`/`--album`/`--artist` (можно сочетать) добавляют колонки
или `all` - сразу все; `report.EXTRA_GROUPS` -> список колонок, `report.resolve_extra_columns()` своей группы, `--extra` — сразу все группы. Соответствие флаг -> колонки CSV - `report.EXTRA_GROUPS`;
разворачивает имена групп в список колонок для CLI). `report.resolve_extra_columns()` разворачивает выбранные группы в список колонок для CLI.
- `out/digest.md` — сжатая сводка библиотеки для вставки в чат с LLM (топ-исполнители, топ-альбомы, - `out/digest.md` — сжатая сводка библиотеки для вставки в чат с LLM (топ-исполнители, топ-альбомы,
распределение по жанрам, языку и десятилетиям). распределение по жанрам, языку и десятилетиям).
- `out/report_source.csv`, `out/digest_source.md` — те же отчёты, но для запуска с `--source`; - `out/report_source.csv`, `out/digest_source.md` — те же отчёты, но для запуска с `--source`;

View file

@ -63,13 +63,13 @@ 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 --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 --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 --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 --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 --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 --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 --timestamp --album # flags can be combined
.venv\Scripts\python -m sort_ym report --extra all --order playlist # every extra column + source track order .venv\Scripts\python -m sort_ym report --extra --order playlist # --extra = every extra column at once + source track order
``` ```
## Full cache cleanup ## Full cache cleanup

View file

@ -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 --order playlist # без сортировки по плейлистам - треки в исходном порядке источника (как в лайках/--source плейлисте)
.venv\Scripts\python -m sort_ym report --extra timestamp # + дата добавления трека (added_at) .venv\Scripts\python -m sort_ym report --timestamp # + дата добавления трека (added_at)
.venv\Scripts\python -m sort_ym report --extra album # + дата релиза и лайки альбома (release_date, album_likes_count) .venv\Scripts\python -m sort_ym report --album # + дата релиза и лайки альбома (release_date, album_likes_count)
.venv\Scripts\python -m sort_ym report --extra artist # + счётчики/рейтинг первого артиста трека .venv\Scripts\python -m sort_ym report --artist # + счётчики/рейтинг первого артиста трека
.venv\Scripts\python -m sort_ym report --extra duration # + длительность трека (duration_ms) .venv\Scripts\python -m sort_ym report --duration # + длительность трека (duration_ms)
.venv\Scripts\python -m sort_ym report --extra version # + пометки версии трека/альбома (ремикс, юбилейное издание и т.п.) .venv\Scripts\python -m sort_ym report --version # + пометки версии трека/альбома (ремикс, юбилейное издание и т.п.)
.venv\Scripts\python -m sort_ym report --extra timestamp album # можно комбинировать несколько групп через пробел .venv\Scripts\python -m sort_ym report --timestamp --album # флаги можно комбинировать
.venv\Scripts\python -m sort_ym report --extra all --order playlist # все доп. колонки сразу + порядок как в источнике .venv\Scripts\python -m sort_ym report --extra --order playlist # --extra = сразу все доп. колонки + порядок как в источнике
``` ```
## Полная очистка кэша ## Полная очистка кэша

View file

@ -77,9 +77,18 @@ def _print_report_summary(rows: list[dict], out_file) -> None:
print(f"\nОтчёт сохранён: {out_file}") 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: def cmd_report(args: argparse.Namespace) -> None:
cfg = load_config() 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: if args.source:
ctx = _source_context(cfg, args.source) ctx = _source_context(cfg, args.source)
@ -208,11 +217,14 @@ def main(argv: list[str] | None = None) -> None:
"playlist - как треки идут в источнике (в лайках или в --source плейлисте), без сортировки", "playlist - как треки идут в источнике (в лайках или в --source плейлисте), без сортировки",
) )
p_report.add_argument( p_report.add_argument(
"--extra", nargs="+", metavar="GROUP", choices=[*report.EXTRA_GROUPS, "all"], default=None, "--extra", action="store_true",
help="добавить в CSV колонки указанных групп (можно несколько через пробел), или 'all' - сразу все: " help="добавить в CSV все доп. колонки сразу (то же самое, что все флаги ниже вместе)",
"timestamp (added_at), duration (duration_ms), version (track_version/album_version), "
"album (release_date/album_likes_count), artist (счётчики и рейтинг первого артиста трека)",
) )
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 = sub.add_parser("apply", help="создать плейлисты и добавить треки")
p_apply.add_argument("--yes", action="store_true", help="подтвердить внесение изменений в аккаунт") p_apply.add_argument("--yes", action="store_true", help="подтвердить внесение изменений в аккаунт")