A bash tool for splitting single FLAC files with CUE sheets into individual, properly tagged tracks with album art.
  • Go 99.7%
  • Makefile 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Vlad Samoylik 5d31b7921d Strip ripper catalog junk from CUE album titles for tags and covers.
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>
2026-07-05 22:57:23 +03:00
cmd/flacsplit Replace cuetag.sh with built-in tagging; rewrite README in Russian. 2026-07-05 22:44:30 +03:00
internal Strip ripper catalog junk from CUE album titles for tags and covers. 2026-07-05 22:57:23 +03:00
testdata Initial commit: flacsplit CLI 2026-02-08 14:56:11 +03:00
.gitignore .gitignore: ignore /flacsplit binary only, keep cmd/flacsplit tracked; log tag track per title 2026-02-08 21:38:10 +03:00
flacsplit.example.yaml Add configurable output format: FLAC or ALAC (.m4a). 2026-07-03 23:18:37 +03:00
go.mod Fix audit issues: standalone module, split safety, and robustness. 2026-07-03 23:33:55 +03:00
go.sum Fix audit issues: standalone module, split safety, and robustness. 2026-07-03 23:33:55 +03:00
Makefile Fix audit issues: standalone module, split safety, and robustness. 2026-07-03 23:33:55 +03:00
README.md Replace cuetag.sh with built-in tagging; rewrite README in Russian. 2026-07-05 22:44:30 +03:00

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.yamlflacsplit.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:

  1. Discovery — поиск CUE; если их несколько, треки пишутся в подкаталог по имени CUE
  2. Decode — чтение CUE (UTF-8 / cp1251)
  3. Parse — треки, FILE, INDEX 00/01, pregap
  4. Resolve — сопоставление FILE "..." с .flac/.ape/.wav/.wv/.tta в каталоге
  5. Split — ffmpeg: -ss, -t, -map 0:a:0, -metadata title=…; пропуск, если файл есть (без -f)
  6. Validate — ffprobe: размер ≥ 8 КБ, codec (flac/alac), duration > 0.1 с
  7. Tag — встроенное тегирование: Vorbis Comments (FLAC) или ffmpeg metadata (ALAC)
  8. Cover — MusicBrainz → Cover Art Archive; fallback Last.fm (если есть API key)
  9. 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 для CUE
  • golang.org/x/net — SOCKS5
  • gopkg.in/yaml.v3 — конфиг

Парсинг CUE реализован в репозитории, без внешней cue-библиотеки.

Лицензия

Используйте и модифицируйте по своему усмотрению.