diff --git a/personal/music-download-practices.md b/personal/music-download-practices.md index d836f8c4..b308c210 100644 --- a/personal/music-download-practices.md +++ b/personal/music-download-practices.md @@ -162,6 +162,11 @@ done | sort | uniq -c ``` Music/ ├── !A Not sorted/ +│ └── SD-card-2026-05/ ← новые треки (май 2026, ~160 mp3) +│ ├── Агата Кристи/ +│ ├── Аквариум/ +│ ├── ... (Artist/Track.mp3) +│ └── Юрий Визбор/ ├── !Pop, Club, Любэ/ ├── !Retro/ ├── !Rock&Folk/ ← основная рок-коллекция @@ -170,8 +175,45 @@ Music/ └── z Другое, Enigma, Ленинград/ ``` +### Соглашение по именованию (SD-card-2026-05) + +- Структура: `Исполнитель/Название трека.mp3` +- Один исполнитель — одна папка (даже для 1 трека) +- Папки дублей на латинице (Andervud, OtavaYo) — артефакт, можно слить с кириллическими +- Класика хранится в папке `Классика/` (Бах, Орф, Пахмутова и др.) +- Саундтреки — в `Саундтреки/` +- Исполнитель с одним треком (Елена Камбурова, Тамара Миансарова) — отдельная папка + +### Загрузка файлов на NAS + +**Рабочий метод** — python3 скрипт через ssh+scp (май 2026): +- rsync с `!` в пути назначения ломается (bash history expansion) +- scp напрямую из bash тоже ломается на кавычках с пробелами +- **Решение:** python subprocess с отдельными аргументами, ssh mkdir + scp per-file + +```python +# Шаблон: /tmp/upload_nas.py +subprocess.run(["ssh", "-i", KEY, f"user@host", f"mkdir -p '{nas_dir}'"]) +subprocess.run(["scp", "-i", KEY, local_path, f"user@host:{nas_path}"]) +``` + **WMA на NAS:** 565 файлов (в основном The Prodigy, Дискотека Авария, старые радиозаписи). Конвертация не делалась — отдельная задача при необходимости. +### Валидация перед загрузкой + +```bash +# Проверить все mp3 через ffmpeg (только ошибки) +find ~/Downloads/music -name "*.mp3" | while read f; do + r=$(ffmpeg -v error -i "$f" -f null - 2>&1) + [ -n "$r" ] && echo "ERR: $f | $(echo "$r" | head -1)" +done + +# Частые проблемы: +# "invalid RIFF header" — файл обёрнут в WAV-контейнер → найти RIFF offset и перекодировать +# "Failed to find two consecutive MPEG frames" — нулевой или битый файл → перекачать +# "Header missing" — частичная порча → перекодировать через libmp3lame +``` + ### HTML-ссылки на треки TrueNAS без дополнительных сервисов HTTP не отдаёт. Варианты: