refactor: dynamic iOpenPod discovery, add to requirements

- Replace hardcoded /tmp/iOpenPod with importlib.util.find_spec lookup
  with fallback to /tmp/iOpenPod and ~/iOpenPod for dev/backward compat
- Add iopenpod>=1.0.53 to requirements.txt
- Remove deprecated mkdir temp/downloads/converted from install.sh
  (all paths now XDG-compliant)
This commit is contained in:
Maksim Totmin 2026-06-01 00:40:06 +07:00
parent cbc888660f
commit e3666c8c64
3 changed files with 29 additions and 5 deletions

View File

@ -39,10 +39,6 @@ source venv/bin/activate
echo "Installing dependencies..." echo "Installing dependencies..."
pip3 install -r requirements.txt pip3 install -r requirements.txt
# Create necessary directories
echo "Creating necessary directories..."
mkdir -p temp downloads converted
echo "" echo ""
echo "Installation complete!" echo "Installation complete!"
echo "" echo ""

View File

@ -10,3 +10,4 @@ tqdm>=4.65.0
musicbrainzngs>=0.7.1 musicbrainzngs>=0.7.1
PyQt6>=6.5.0 PyQt6>=6.5.0
numpy>=1.24.0 numpy>=1.24.0
iopenpod>=1.0.53

View File

@ -21,6 +21,7 @@ Public API preserved for main.py compatibility:
""" """
import importlib import importlib
import importlib.util
import os import os
import sys import sys
import hashlib import hashlib
@ -38,7 +39,33 @@ from mutagen.easyid3 import EasyID3
from artwork import prepare_artwork_for_track, ArtworkEntry, write_artworkdb from artwork import prepare_artwork_for_track, ArtworkEntry, write_artworkdb
_IOP_ROOT = "/tmp/iOpenPod" def _find_iop_root() -> str:
"""Find iOpenPod's installed location.
Tries in order:
1. pip-installed package (via importlib.util.find_spec)
2. /tmp/iOpenPod (backward compat / development)
"""
for pkg in ("iTunesDB_Writer", "SQLiteDB_Writer", "ipod_device"):
spec = importlib.util.find_spec(pkg)
if spec and spec.origin:
parent = os.path.dirname(spec.origin)
if os.path.basename(parent) == pkg:
return os.path.dirname(parent)
fallbacks = [
"/tmp/iOpenPod",
os.path.join(os.path.expanduser("~"), "iOpenPod"),
]
for path in fallbacks:
if os.path.isdir(path):
return path
raise ImportError(
"iOpenPod not found. Install with: pip install iopenpod"
)
_IOP_ROOT = _find_iop_root()
_IOP_CACHE: dict[str, Any] = {} _IOP_CACHE: dict[str, Any] = {}
_IOP_READY = False _IOP_READY = False