4.8 KiB
TechDJ Pro
TechDJ Pro is a local DJ web app with a dual-port architecture:
- DJ Panel (mix/load tracks + start broadcast):
http://localhost:5000 - Listener Page (receive the live stream):
http://localhost:5001
It supports:
- Local library playback (files in
music/) - Downloading audio from URLs (via
yt-dlpwhen available, with fallback) - Live streaming from the DJ browser to listeners using Socket.IO
- Live listening via an MP3 stream (
/stream.mp3) generated server-side with ffmpeg.
Requirements
System packages
- Python: 3.10+ recommended
- ffmpeg: strongly recommended (required for reliable downloads/transcoding and MP3 fallback)
Linux (Debian/Ubuntu):
sudo apt update
sudo apt install -y ffmpeg
macOS (Homebrew):
brew install ffmpeg
Windows:
- Install ffmpeg from https://ffmpeg.org/download.html
- Ensure
ffmpegis on your PATH
Python dependencies
All Python dependencies are listed in requirements.txt:
- flask
- flask-socketio
- eventlet
- yt-dlp
- python-dotenv
- requests
Install (from scratch)
git clone https://git.computertech.dev/computertech/techdj.git
cd techdj
# Create venv
python3 -m venv .venv
# Activate venv
source .venv/bin/activate
# Ensure pip exists (some environments require this)
python -m ensurepip --upgrade || true
# Upgrade tooling (recommended)
python -m pip install --upgrade pip setuptools wheel
# Install deps
pip install -r requirements.txt
Optional configuration (.env)
Create a .env file in the project root if you want YouTube search results to work in the UI:
YOUTUBE_API_KEY=YOUR_KEY_HERE
Notes:
- If you don’t set
YOUTUBE_API_KEY, you can still paste a YouTube URL directly into a deck/download box.
Optional DJ panel password (config.json)
By default, anyone who can reach the DJ server (:5000) can open the DJ panel.
If you want to lock it while you’re playing live, create a config.json (not committed) in the project root:
{
"dj_panel_password": "your-strong-password"
}
Behavior:
- If
dj_panel_passwordis empty/missing, the DJ panel is unlocked (default). - If set, visiting
http://<DJ_MACHINE_IP>:5000shows a login prompt. - Listener (
:5001) is not affected.
Run
Start the server:
source .venv/bin/activate
python server.py
You should see output like:
- DJ panel:
http://localhost:5000 - Listener page:
http://localhost:5001
Using the app
DJ workflow
- Open the DJ Panel:
http://localhost:5000 - Click INITIALIZE SYSTEM
- Load/play music
- Upload MP3s (folder/upload button)
- Or download from URLs (paste into deck input / download controls)
- Open the streaming panel and click START BROADCAST
Listener workflow
-
Open the Listener Page:
-
Same machine:
http://localhost:5001 -
Another device on your LAN/Wi‑Fi:
http://<DJ_MACHINE_IP>:5001
-
-
Click ENABLE AUDIO if prompted
- Browsers block autoplay by default; user interaction is required.
Multi-device / LAN setup
Find your DJ machine IP
Linux:
ip addr
Windows:
ipconfig
macOS:
ifconfig
Use the LAN IP (commonly 192.168.x.x or 10.x.x.x).
Firewall
Make sure the DJ machine allows inbound connections on:
- TCP
5000(DJ Panel) - TCP
5001(Listener)
If listeners can’t connect, this is often the cause.
Streaming
TechDJ serves the listener audio as an MP3 HTTP stream:
- MP3 stream endpoint:
http://<DJ_MACHINE_IP>:5001/stream.mp3
This requires ffmpeg installed on the DJ/server machine.
Debug endpoint
-
Stream debug JSON:
http://<DJ_MACHINE_IP>:5001/stream_debug
This shows whether ffmpeg is running and whether MP3 bytes are being produced.
Troubleshooting
Listener says “Browser blocked audio”
- Click ENABLE AUDIO
- Try a normal click (not keyboard-only)
- Disable strict autoplay blocking for the site, if your browser supports it
Listener says “NotSupportedError”
-
Your browser likely doesn’t support the default WebM/Opus MediaSource path
-
Ensure
ffmpegis installed on the server -
Try opening the MP3 fallback directly:
http://<DJ_MACHINE_IP>:5001/stream.mp3
DJ says broadcast is live but listeners hear nothing
- Confirm:
- A deck is actually playing
- Crossfader isn’t fully on the silent side
- Volumes aren’t at 0
- Check
http://<DJ_MACHINE_IP>:5001/stream_debugand see iftranscoder_bytes_outincreases
pip missing inside venv
Some Python installs create venvs without pip. Fix:
python -m ensurepip --upgrade
python -m pip install --upgrade pip
Dev notes
- Main server:
server.py - Client UI logic:
script.js - Downloader:
downloader.py - Static assets:
index.html,style.css
License
No license specified.