Skip to main content

telegram-slskd-local-bot banner

telegram-slskd-local-bot

License Python Docker Pulls Docker Image Size PyPI codecov

Automated music discovery and download via Telegram bot. Resolves track metadata from Spotify, searches and downloads FLAC files from Soulseek (via slskd), renames them to Artist - Title.flac, and places them in your music library. Docker-ready.


How It Works

You: "Nancy Sinatra Bang Bang"
Bot: Found: Nancy Sinatra - Bang Bang (My Baby Shot Me Down) (2:42)
     Searching slskd for FLAC...
     #1 [free] 2:42 | 16bit/44.1kHz | 30MB
     #2 [free] 2:41 | 16bit/44.1kHz | 28MB
     [Download #1] [Download #2] [Auto-pick best] [Cancel]
You: (taps Download #1)
Bot: Downloaded! Nancy Sinatra - Bang Bang (My Baby Shot Me Down).flac -> /music/

Flow

  1. Send a song name to the Telegram bot (text message)
  2. Bot resolves the track on Spotify (artist, title, duration, album)
  3. Bot searches slskd (Soulseek) for FLAC files matching the track
  4. Results are scored by duration match, audio quality, source reliability, and filename relevance
  5. Bot presents the top matches — you pick one (or enable auto-mode)
  6. File is downloaded, renamed to Artist - Title.flac, and placed in your output directory
  7. Your existing tools (e.g., audio-transcode-watcher, Navidrome) pick it up from there

Quick Start

Prerequisites

Docker Compose

services:
  slskd-importer:
    image: drumsergio/telegram-slskd-local-bot:0.12.0
    container_name: slskd_importer
    restart: unless-stopped
    environment:
      TELEGRAM_BOT_TOKEN: "your-bot-token"
      TELEGRAM_ALLOWED_USERS: "your-telegram-user-id"
      SPOTIFY_CLIENT_ID: "your-spotify-client-id"
      SPOTIFY_CLIENT_SECRET: "your-spotify-client-secret"
      SLSKD_HOST: "http://your-slskd-host:5030"
      SLSKD_API_KEY: "your-slskd-api-key"
    volumes:
      # Read-write: the bot deletes rejected files and sweeps abandoned ones
      - /path/to/slskd/downloads:/downloads
      - /path/to/music/library:/music
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "3"

Local Development

# Clone the repo
git clone https://github.com/GeiserX/telegram-slskd-local-bot.git
cd telegram-slskd-local-bot

# Create virtual environment
python -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt
pip install -e ".[dev]"

# Copy and configure environment
cp .env.example .env
# Edit .env with your credentials

# Run
python -m music_downloader run

Environment Variables

Variable Required Default Description
TELEGRAM_BOT_TOKEN Yes Telegram bot token from @BotFather
TELEGRAM_ALLOWED_USERS Yes (deny all) Comma-separated Telegram user IDs allowed to use the bot. Empty means the bot denies everyone (fail-closed) — the denial reply shows you your ID
SPOTIFY_CLIENT_ID Yes Spotify Developer app Client ID
SPOTIFY_CLIENT_SECRET Yes Spotify Developer app Client Secret
SLSKD_HOST Yes slskd instance URL (e.g., http://192.168.1.100:5030)
SLSKD_API_KEY Yes slskd API key (Settings > Security > API Keys)
DOWNLOAD_DIR No /downloads Where slskd stores completed downloads (container path)
OUTPUT_DIR No /music Where to place renamed FLAC files (container path)
AUTO_MODE No false Default auto-download state for chats that never toggled /auto: best match is downloaded and saved without asking
MAX_RESULTS No 10 Maximum search results shown to user
DURATION_TOLERANCE_SECS No 5 Duration match tolerance in seconds
SEARCH_TIMEOUT_SECS No 30 slskd search timeout
DOWNLOAD_TIMEOUT_SECS No 600 Download completion timeout
DOWNLOAD_CLEANUP_HOURS No 24 Hours before abandoned files in DOWNLOAD_DIR are auto-deleted (hourly sweep; 0 disables). In-flight transfers are never touched
EXCLUDE_KEYWORDS No live,remix,... Comma-separated keywords to filter out
FILENAME_TEMPLATE No {artist} - {title} Output filename template
LOG_LEVEL No INFO Logging level
HEALTH_PORT No 8080 Health check HTTP port

Telegram Bot Commands

Command Description
(any text) Search for a song and show download options
/import <spotify url> Import a Spotify playlist or album — review each track or auto-save all
/cancel Cancel the active import or search
/auto Toggle auto-download per chat: best match is downloaded and saved without picking or approval (persists across restarts)
/status Show active searches and downloads
/history Show recent download history
/help Show help message

Scoring Algorithm

Search results are ranked by:

  1. Duration match (40 pts): Compared to Spotify duration. Within ±5s = perfect, ±10s = acceptable, >30s = excluded
  2. Audio quality (25 pts): Prefers 16-bit/44.1kHz (CD quality) for consistency
  3. Source reliability (20 pts): Free upload slots, fast upload speed, short queue
  4. Filename relevance (15 pts): Artist and title words found in the filename

Results containing excluded keywords (live, remix, etc.) are automatically filtered out, unless the original track title also contains that keyword.

Architecture

┌──────────────────┐     ┌──────────────┐     ┌──────────────────┐
│  Telegram Bot    │────▶│  Spotify API │     │  slskd (Soulseek)│
│  (user input)    │     │  (metadata)  │     │  (search/download)│
└──────────────────┘     └──────────────┘     └──────────────────┘
         │                       │                       │
         ▼                       ▼                       ▼
┌─────────────────────────────────────────────────────────────────┐
│                    Music Downloader Service                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────────────┐│
│  │ Resolver │─▶│ Searcher │─▶│  Scorer  │─▶│ File Processor   ││
│  │(Spotify) │  │ (slskd)  │  │(ranking) │  │(rename + move)   ││
│  └──────────┘  └──────────┘  └──────────┘  └──────────────────┘│
└─────────────────────────────────────────────────────────────────┘
                                                      │
                                                      ▼
                                              ┌──────────────┐
                                              │ Music Library │
                                              │  (FLAC files) │
                                              └──────────────┘

Related Projects

Music Pipeline:

Telegram Bots:

License

GPL-3.0

Links

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

telegram_slskd_local_bot-0.12.0.tar.gz (113.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

telegram_slskd_local_bot-0.12.0-py3-none-any.whl (71.1 kB view details)

Uploaded Python 3

File details

Details for the file telegram_slskd_local_bot-0.12.0.tar.gz.

File metadata

File hashes

Hashes for telegram_slskd_local_bot-0.12.0.tar.gz
Algorithm Hash digest
SHA256 95294f2d92b1c4032b5392e0940e62eb0572dd570f35703c2067f73db1cf5274
MD5 5e4f4701e1896ae7a0e95b230bf4e8b7
BLAKE2b-256 90bff427b08b15714f537a9563d12949a621ca6909d20dcf3cdaede726c9bcfc

See more details on using hashes here.

File details

Details for the file telegram_slskd_local_bot-0.12.0-py3-none-any.whl.

File metadata

File hashes

Hashes for telegram_slskd_local_bot-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9fc09c1209894705e358931e6e9428e63d8544717d0d649878a6ae76da48379f
MD5 ed7126708ef93546d76412b0d85ff8df
BLAKE2b-256 292b4f3d66bdbfa504ede1106997c9771baa6a5c05f8a9f6c3c91f8caccd4074

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page