Создана структура документации, описывающая функциональность, установку, использование CLI, архитектуру и интеграции с TorrAPI и OpenRouter. Добавлены примеры конфигурации и метаданных, а также описание структуры выходных данных.
5.7 KiB
Структура результатов
После обработки все аудиокниги раскладываются по структурированным папкам.
Корневая папка результатов — result/ (или dir.out из config.yaml, или флаг -result).
Основная структура
result/
├── А/
│ └── Акунин Борис/
│ ├── Акунин Борис — Азазель [2003]/
│ │ ├── metadata.json
│ │ ├── cover.jpg
│ │ ├── 001.mp3
│ │ └── 002.mp3
│ └── Акунин Борис — Турецкий гамбит [2003]/
│ ├── metadata.json
│ └── ...
├── Д/
│ └── Достоевский Федор/
│ └── ...
├── ERROR/
│ ├── Неизвестная_книга_123/
│ │ ├── _error.txt
│ │ └── <аудиофайлы...>
│ └── ...
└── DUPLICATE/
└── А/
└── Акунин Борис/
├── Акунин Борис — Азазель [2003]/
│ ├── metadata.json
│ └── ...
└── Акунин Борис — Азазель [2003]_2/
└── ...
Правила формирования имён
- Первый уровень — первая буква фамилии автора (кириллица/латиница).
- Второй уровень —
Фамилия Имяавтора. - Третий уровень —
Автор — Название [Год]/(год добавляется только если известен).
Специальные символы (/, \, :, *, ?, ", <, >, |) в именах папок заменяются безопасными аналогами.
metadata.json
Создаётся в каждой папке с книгой. Пример:
{
"title": "Азазель",
"authors": ["Акунин Борис"],
"year": 2003,
"genre": "Детектив",
"comment": "Первый роман серии «Приключения Эраста Фандорина»...",
"duration": "8h23m",
"format": "mp3",
"files_count": 24,
"cover_found": true,
"source": {
"folder": "Акунин - Азазель",
"file": "001.mp3"
},
"torrent": {
"id": "123456",
"tracker": "rutracker",
"title": "Акунин Б. — Азазель (Б. Дьяченко) [2003, MP3, 96 kbps]",
"seeds": 42,
"size": "198 MB",
"url": "https://rutracker.org/forum/viewtopic.php?t=123456"
}
}
Поля metadata.json
| Поле | Тип | Описание |
|---|---|---|
title |
string | Нормализованное название книги |
authors |
[]string | Список авторов |
year |
int | Год издания (0 если неизвестен) |
genre |
string | Жанр |
comment |
string | Описание из тегов / трекера |
duration |
string | Длительность первого трека |
format |
string | Формат аудиофайлов |
files_count |
int | Кол-во аудиофайлов в папке |
cover_found |
bool | Найдена ли обложка |
source.folder |
string | Исходное имя папки |
source.file |
string | Файл, из которого читались теги |
torrent.* |
object | Данные с трекера (если найдено) |
Папка ERROR/
Книги, которые не удалось найти ни на одном трекере после всех попыток.
result/ERROR/
└── Исходное_имя_папки/
├── _error.txt ← причина (не найдено / таймаут / API недоступен)
├── 001.mp3
└── 002.mp3
Файл _error.txt
Ошибка обработки: aудиокнига не найдена на трекерах
Папка: Автор - Название
Попыток: 3
Последняя ошибка: no results found for query "Название"
Время: 2024-01-15 14:23:45
Папка DUPLICATE/
Книга с таким же именем целевой папки уже существует в result/.
result/DUPLICATE/
└── А/
└── Акунин Борис/
├── Акунин Борис — Азазель [2003]/ ← первый дубликат
├── Акунин Борис — Азазель [2003]_2/ ← второй
└── Акунин Борис — Азазель [2003]_3/ ← третий
Суффиксы _2, _3, ... добавляются итеративно до первого свободного имени.
Обложка (cover.jpg)
Загружается из URL обложки в данных раздачи с трекера.
Если URL недоступен или скачивание завершилось ошибкой — книга сохраняется без cover.jpg, в лог пишется WARN.
Аудиофайлы
Аудиофайлы перемещаются (не копируются) из исходной папки в папку результата.
Исходная папка после успешного переноса становится пустой (или удаляется, в зависимости от ОС).
Поддерживаемые расширения: mp3, m4b, m4a, ogg, opus, flac, aac, wma, wav, aiff.