# SoulSync requirements
# Web application dependencies only
# All dependencies pinned for reproducible builds.

# Core web framework
Flask==3.1.3
Flask-Limiter==4.1.1

# Music service APIs
spotipy==2.26.0
PlexAPI==4.18.1

# HTTP and async support
requests==2.33.1
aiohttp==3.13.5

# Security and encryption
cryptography==48.0.0

# Media metadata handling
mutagen==1.47.0
Pillow==12.2.0

# Text processing
Unidecode==1.4.0
beautifulsoup4==4.14.3

# System monitoring
psutil==7.2.2

# IANA timezone data — required by ``zoneinfo`` on Windows hosts and
# minimal Docker base images that ship without the system tz database.
# Consumed by ``core/automation/schedule.py`` for daily / weekly /
# monthly schedule next-run computation in the user's local timezone.
# Loose-pinned because IANA tz data changes a few times a year for
# real-world DST policy updates; pinning to one snapshot would freeze
# the app's tz knowledge to the build date.
tzdata>=2024.1

# Cross-platform IANA timezone detection — returns the server's local
# tz as a string ('America/Los_Angeles', not 'PDT'). Consumed by the
# automation engine to preserve historic behaviour for daily / weekly
# trigger rows that don't carry an explicit ``tz`` field: the old
# engine computed delays from naive ``datetime.now()``, which is
# implicitly the server's local tz, so falling back to the same tz
# keeps existing schedules running at the same wall-clock time.
tzlocal>=5.0

# YouTube support -- unpinned; yt-dlp must track upstream releases to stay functional
yt-dlp>=2026.3.17

# Lyrics support
lrclibapi==0.3.1

# Audio fingerprinting for download verification
pyacoustid==1.3.1

# WebSocket client for Hydrabase connection
websocket-client==1.9.0

# Tidal download support
tidalapi==0.8.11

# WebSocket server for real-time UI updates
flask-socketio==5.6.1
gunicorn==26.0.0
simple-websocket==1.1.0

# Full public-playlist link imports (no Spotify credentials). The "Spotify link"
# tab scrapes Spotify's embed widget, which caps at ~100 tracks; SpotipyFree
# (the no-creds spotipy drop-in spotDL uses) pulls the full list. It is GPL-3.0,
# used here as a normal pip dependency — aggregation, exactly like spotDL (also
# MIT). It is NOT vendored into SoulSync's own code, so the project stays MIT.
# The code soft-imports it and falls back to the embed scraper (~100 tracks) if
# it's missing or fails, so this is never a hard runtime requirement.
spotipyFree>=1.1.2,<2
websockets>=12  # required by SpotipyFree/spotapi, not pulled in automatically
