- Go 99.7%
- Makefile 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Normalize titles like "Exercises (AIRAC-1201)" to "Exercises" for tagging and MusicBrainz/Last.fm lookup; always fall back to Last.fm when MB misses. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
| cmd/flacsplit | ||
| internal | ||
| testdata | ||
| .gitignore | ||
| flacsplit.example.yaml | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| README.md | ||
flacsplit
CLI-утилита для нарезки образов CD по CUE sheet и lossless-аудио на отдельные треки с тегами и обложкой.
Поддерживает исходники FLAC, APE, WAV, WV, TTA. На выходе — FLAC (по умолчанию) или ALAC (.m4a) через конфиг. Обложка ищется в MusicBrainz / Cover Art Archive и Last.fm.
Возможности
- Split — нарезка по CUE через ffmpeg, учёт INDEX 00 (pregap)
- Теги — album/artist/track/date из распарсенного CUE: FLAC — pure Go (Vorbis Comments), ALAC — ffmpeg
-c copy - Обложка — загрузка и встраивание (FLAC — pure Go, ALAC — ffmpeg)
- Кодировки CUE — UTF-8 (с BOM) или cp1251
- Рекурсия — обход каталогов с ограничением глубины
- Clean — удаление исходников, CUE, логов, картинок и пустых папок после split
- Проверка результата — ffprobe проверяет размер, codec и duration после split и embed
- Отчёт — итоговая сводка: scanned / processed / skipped / failed
Требования
| Инструмент | Назначение |
|---|---|
| ffmpeg | нарезка, теги ALAC, embed обложки в ALAC |
| ffprobe | длительность и валидация треков |
brew install ffmpeg # macOS
sudo apt install ffmpeg # Debian/Ubuntu
Проверка:
which ffmpeg ffprobe
cuetools / cuetag.sh / metaflac не нужны — тегирование встроено в flacsplit.
Тегирование
Метаданные берутся из распарсенного CUE (internal/cue/parse.go) и пишутся в каждый трек (internal/tag/apply.go):
| Поле | Источник в CUE |
|---|---|
| TITLE | TRACK → TITLE |
| ALBUM | TITLE (уровень диска) |
| ARTIST | PERFORMER (уровень диска) |
| DATE | REM DATE |
| TRACKNUMBER / TRACKTOTAL | номер трека / всего треков |
- FLAC — Vorbis Comments через pure Go (
internal/cover/flac/vorbis.go) - ALAC (.m4a) — ffmpeg copy с
-metadata(без перекодирования аудио)
Ошибка tagging — warning в сводке; нарезанные файлы остаются на диске.
Сборка
make build # бинарник ./flacsplit
make install # go install
make test # тесты
Или вручную:
GOWORK=off go build -o flacsplit ./cmd/flacsplit
Быстрый старт
# текущая директория: CUE + один image-файл
flacsplit
# рекурсивно: текущая + один уровень вложенных папок
flacsplit -r
# пересобрать уже существующие треки
flacsplit -f
# посмотреть план без изменений
flacsplit -n
Использование
flacsplit [опции] [путь]
путь — каталог с CUE и аудио. По умолчанию — текущая директория.
Опции
| Флаг | Описание |
|---|---|
-f |
Перенарезать, даже если треки уже существуют |
-r |
Рекурсивная обработка подкаталогов |
-d N |
Глубина рекурсии: 0 — только указанный каталог, 1 — + один уровень вниз (по умолчанию: 1) |
-c |
Режим очистки: удалить лишние файлы и пустые папки (см. ниже) |
-p URL |
SOCKS5-прокси для MusicBrainz / Last.fm |
-n |
Dry-run: только план, без записи |
-q |
Тихий режим: меньше логов |
По умолчанию логирование включено.
Конфигурация
Скопируйте flacsplit.example.yaml → flacsplit.yaml в текущий каталог или ~/.config/flacsplit.yaml.
Параметры из конфига используются, если соответствующий флаг CLI не задан.
# Формат выходных треков: flac (по умолчанию) или alac (.m4a)
format: "alac"
# SOCKS5-прокси
proxy: "socks5://127.0.0.1:8080"
# API-ключ Last.fm (https://www.last.fm/api/account/create)
lastfm:
api_key: "your_lastfm_api_key"
FLAC — обложка встраивается без ffmpeg (pure Go).
ALAC — нарезка и embed обложки через ffmpeg; для Apple-устройств.
Примеры
# одна папка
flacsplit "/Volumes/Music/Album"
# рекурсия на 2 уровня вглубь
flacsplit -r -d 2 "/Volumes/Music/Collection"
# ALAC в конфиге + принудительная перенарезка
flacsplit -r -f
# очистка после split
flacsplit -c "/Volumes/Music/Album"
# через прокси (флаг перекрывает конфиг)
flacsplit -p socks5://127.0.0.1:8080 -r
# dry-run рекурсивно
flacsplit -r -n
Режим очистки (-c)
Рекурсивно удаляет из каталога:
.flac/.m4a, не начинающиеся с двух цифр (не треки)- исходное аудио:
.wv,.ape,.wav,.tta .cue,.log- изображения и текстовые файлы (
.jpg,.png,.txt,.nfoи т.д.) - пустые подкаталоги
Треки вида 01 - Title.flac / 03 - Song.m4a не трогаются.
flacsplit -c # очистка текущей папки
flacsplit -c -n # показать, что будет удалено
Как это работает
Для каждого каталога с .cue:
- Discovery — поиск CUE; если их несколько, треки пишутся в подкаталог по имени CUE
- Decode — чтение CUE (UTF-8 / cp1251)
- Parse — треки, FILE, INDEX 00/01, pregap
- Resolve — сопоставление
FILE "..."с.flac/.ape/.wav/.wv/.ttaв каталоге - Split — ffmpeg:
-ss,-t,-map 0:a:0,-metadata title=…; пропуск, если файл есть (без-f) - Validate — ffprobe: размер ≥ 8 КБ, codec (flac/alac), duration > 0.1 с
- Tag — встроенное тегирование: Vorbis Comments (FLAC) или ffmpeg metadata (ALAC)
- Cover — MusicBrainz → Cover Art Archive; fallback Last.fm (если есть API key)
- Embed — встраивание обложки; повторная validate после embed
При ошибке split tagging и cover не выполняются. Ошибка tagging — warning, пайплайн продолжается.
Имена треков: NN - Title.flac или NN - Title.m4a.
Типичные сценарии
Обработка коллекции
cd "/Volumes/Music/Collection"
flacsplit -r # depth=1: текущая + подпапки первого уровня
flacsplit -r -d 3 # глубже
ALAC для iPhone / Apple Music
~/.config/flacsplit.yaml:
format: "alac"
lastfm:
api_key: "..."
flacsplit -r -f # -f если треки уже были в другом формате
Исправить битые треки после неудачного embed
Если файл подозрительно мал (~16 КБ) — validate отклонит его. Пересоздайте:
flacsplit -f -r
Только split без обложки
Не задавайте Last.fm key и не используйте прокси, если MusicBrainz недоступен — split и теги отработают, cover будет пропущен с предупреждением.
Ошибки и коды выхода
- Ошибки выводятся как
[stage] dir/cue: причина - В конце — сводка: scanned, processed, skipped, failed, warnings
- Exit code
1при наличии failed
Стадии: discovery, decode-cue, parse-cue, resolve-sources, split, validate, mkdir.
Зависимости (Go)
golang.org/x/text— cp1251 для CUEgolang.org/x/net— SOCKS5gopkg.in/yaml.v3— конфиг
Парсинг CUE реализован в репозитории, без внешней cue-библиотеки.
Лицензия
Используйте и модифицируйте по своему усмотрению.