Vendored 5 packages from iOpenPod (TheRealSavi/iOpenPod): iTunesDB_Writer/ — binary iTunesDB generation iTunesDB_Shared/ — field defs, constants, album identity SQLiteDB_Writer/ — SQLite databases for Nano 6G/7G iTunesDB_Parser/ — play stats reading from iPod ipod_device/ — device detection, FireWire ID, capabilities Rationale: iOpenPod is a standalone iPod manager app, not a library. Pulling it as a pip dependency is heavy and confusing for users. Changes: + src/vendor/ — 77 .py files + calcHashAB.wasm (506 KB) ~ ipod_nano7_db.py — _find_iop_root() now returns src/vendor/ ~ requirements.txt — iopenpod replaced with wasmtime + pycryptodome ~ .gitignore — removed iOpenPod/ exclusion (setup.py reads requirements.txt automatically)
neo-pod-desktop
Настольное приложение для управления музыкой на iPod Nano 6G/7G с встроенным iTunes-подобным плеером, конвертацией аудио, полным пайплайном обложек и генерацией iTunesDB/SQLite/ArtworkDB через iOpenPod.
Возможности
- Встроенный плеер — воспроизведение локальной библиотеки через QMediaPlayer, отображение обложек альбомов (60x60), перемотка, громкость, повтор (all/one), shuffle
- Конвертация аудио — FFmpeg конвертация в AAC/M4A (libfdk_aac с AAC-LC профилем, 160 kbps) и MP3 (libmp3lame); конвертация видео для iPod (H.264, 640x480)
- Пайплайн ArtworkDB — извлечение обложек из аудиофайлов (APIC/covr/FLAC pictures), кодирование в iPod-нативные форматы (RGB565, RGB555, UYVY, JPEG), запись ithmb + ArtworkDB (MHFD→MHII→MHNI структуры)
- Генерация баз iPod — полная регенерация iTunesDB (бинарный mhbd) и SQLite баз для Nano 6G/7G через iOpenPod, cross-reference валидация db_pid
- Синхронизация статистики — двухсторонняя синхронизация play count, rating, skip count, last played между локальным кэшем (SQLite) и iPod; автосинк при подключении; validation gate против потери данных
- Локальная библиотека — сортируемая таблица с поддержкой drag-and-drop, фильтрация по альбомам/плейлистам, поиск, разделение на source-треки (FLAC/WAV) и готовые (MP3/M4A)
- Плейлисты — создание, переименование, удаление, drag-and-drop треков; перенос плейлистов на iPod с двухпроходным сопоставлением (content hash → metadata fallback)
- Редактор метаданных — редактирование тегов и обложек для MP3/M4A/FLAC/OGG/OPUS, batch-режим, интеграция с iTunes Search API для автозаполнения
- Горячие клавиши — полностью настраиваемые шорткаты (воспроизведение, навигация, громкость, перемотка, управление библиотекой)
- Сессия воспроизведения — автоматическое сохранение и восстановление последнего трека, позиции, громкости, режимов shuffle/repeat
- Автоопределение устройств — фоновый мониторинг iPod (Linux/macOS/Windows) через DeviceMonitor с polling
- AppImage — портативная сборка через PyInstaller + appimagetool
Установка
Зависимости
- Python 3.10+
- FFmpeg (для конвертации аудио)
- libusb (для доступа к USB на Linux)
pip install -r requirements.txt
Установка FFmpeg:
- macOS:
brew install ffmpeg - Linux:
sudo apt-get install ffmpeg - Windows: Скачайте с ffmpeg.org
Использование
GUI приложение
python src/app.py
AppImage (портативная версия)
./neo-pod-desktop-x86_64.AppImage
Сборка из исходников:
./scripts/build-appimage.sh
Структура проекта
neo-pod-desktop/
├── src/
│ ├── app.py -- Главное окно, плеер (QMediaPlayer), оркестрация вкладок
│ ├── worker.py -- Фоновые потоки (конвертация, передача, синхронизация)
│ ├── audio_converter.py -- FFmpeg конвертация аудио/видео для iPod
│ ├── metadata_handler.py -- Чтение и запись ID3/MP4 тегов, встраивание обложек
│ ├── track_info.py -- TrackInfo dataclass
│ ├── config_loader.py -- Конфигурация в ~/.config/ (configparser)
│ ├── session_store.py -- Состояние сессии плеера (JSON)
│ ├── library_cache.py -- SQLite кэш библиотеки с WAL и ротацией бэкапов
│ ├── playlist_manager.py -- Управление плейлистами (JSON)
│ ├── ipod_device.py -- Детекция, монтирование и передача файлов на iPod
│ ├── ipod_nano7_db.py -- Менеджер БД iPod через iOpenPod (iTunesDB + SQLite)
│ ├── device_monitor.py -- Фоновый мониторинг подключения iPod
│ ├── hotkeys.py -- Настраиваемые горячие клавиши
│ ├── xdg_base.py -- XDG Base Directory пути (~/.config, ~/.local/share, ~/.cache)
│ ├── hashab.py -- HASHAB контрольные суммы
│ ├── ipod_mhbd_writer.py -- Бинарный писатель iTunesDB (mhbd)
│ ├── models/
│ │ └── __init__.py
│ ├── services/
│ │ └── itunes_search.py -- iTunes Search API для автозаполнения метаданных
│ ├── artwork/
│ │ ├── __init__.py -- Публичный API artwork пайплайна
│ │ ├── presets.py -- 50+ форматов artwork для iPod
│ │ ├── types.py -- ArtworkEntry, EncodedFormatPayload, IthmbLocation
│ │ ├── codecs.py -- RGB565/RGB555/UYVY/JPEG кодеки (numpy)
│ │ ├── extractor.py -- Извлечение обложек из аудиофайлов (mutagen)
│ │ ├── chunks.py -- ArtworkDB бинарный парсер/писатель (MHFD→MHII→MHNI)
│ │ ├── writer.py -- Запись ithmb + ArtworkDB
│ │ └── cache.py -- Кэш JPEG обложек для UI плеера
│ └── ui/
│ ├── library_tab.py -- Вкладка библиотеки (таблица, поиск, фильтры)
│ ├── ipod_tab.py -- Вкладка iPod (устройства, треки, экспорт/удаление)
│ ├── settings_tab.py -- Вкладка настроек (горячие клавиши, поведение)
│ ├── player_header.py -- Виджет плеера (кнопки, слайдер, обложка, время)
│ ├── sidebar_widget.py -- Боковая панель (навигация, плейлисты)
│ ├── metadata_editor.py -- Редактор метаданных (одиночный/batch)
│ ├── splash_overlay.py -- Экран загрузки со сканированием библиотеки
│ └── star_rating.py -- Виджет рейтинга (кликабельные звёзды)
├── scripts/
│ └── build-appimage.sh -- Сборка AppImage (PyInstaller + appimagetool)
├── tests/
│ └── test_basic.py
├── requirements.txt
├── setup.py
├── install.sh
└── install.bat
Ключевые технологии
| Технология | Назначение |
|---|---|
| PyQt6 | Графический интерфейс, QMediaPlayer, сигналы/слоты |
| iOpenPod | Генерация iTunesDB + SQLite + ArtworkDB для iPod Nano 6G/7G |
| FFmpeg | Конвертация аудио (AAC/MP3) и видео (H.264) |
| mutagen / eyeD3 | Чтение и запись метаданных (ID3, MP4, FLAC, OGG) |
| NumPy + Pillow | Кодирование обложек (RGB565, масштабирование) |
| SQLite | Кэш библиотеки, playcounts_log, WAL режим |
Архитектура
Приложение построено на PyQt6 с разделением на UI-слой (пакет ui/), бизнес-логику (корневые модули src/) и движок генерации баз iPod (iOpenPod и пакет artwork/).
- app.py — центральный оркестратор: создаёт плеер (QMediaPlayer + QAudioOutput), управляет вкладками (Library, iPod, Settings) и боковой панелью, обрабатывает hotkeys, сохраняет сессию
- worker.py — QThread для фоновых задач с сигналами progress/finished; поддерживает конвертацию, передачу, детекцию, монтирование, удаление, дедупликацию, синк метаданных, создание плейлистов
- ipod_nano7_db.py — делегирует генерацию iTunesDB и SQLite баз iOpenPod, управляет artwork пайплайном, мержит play stats, валидирует данные
- artwork/ — полный пайплайн: extractor → codecs (numpy) → chunks (бинарный парсер) → writer (ithmb + ArtworkDB)
- library_cache.py — SQLite база с WAL журналом, автоматической ротацией бэкапов, индексами по content_hash/uuid/artist/album
Конфигурация
- Конфиг:
~/.config/neo-pod-desktop/config.ini - Сессия:
~/.local/share/neo-pod-desktop/session.json - Плейлисты:
~/.local/share/neo-pod-desktop/playlists.json - Кэш библиотеки:
~/.local/share/neo-pod-desktop/library_cache.db - Кэш обложек:
~/.cache/neo-pod-desktop/
Сборка AppImage
./scripts/build-appimage.sh
Требует: Python 3.10+, PyInstaller, appimagetool, FFmpeg (включается в AppImage).
Лицензия
MIT
Description
Languages
Python
98.4%
Shell
1.4%
Batchfile
0.2%