From b5ea9e8d01bfa3cd511085590582eb2fa9812626 Mon Sep 17 00:00:00 2001 From: ComputerTech Date: Thu, 5 Mar 2026 14:28:17 +0000 Subject: [PATCH] Final bug sweep: fix event param, remove dead code, dedupe CSS; add .gitignore recordings/ --- .gitignore | 1 + compare_memory.py | 24 +- dj_icon.png | Bin 0 -> 722343 bytes index.html | 68 +- launch_qt.sh | 70 +- requirements.txt | 5 +- script.js | 631 ++++-- server.py | 354 ++-- settings.json | 22 + style.css | 811 +++++--- techdj_qt.py | 4596 +++++++++++++++++++------------------------ techdj_qt_v1.py.bak | 2801 ++++++++++++++++++++++++++ 12 files changed, 6215 insertions(+), 3168 deletions(-) create mode 100644 dj_icon.png create mode 100644 settings.json create mode 100644 techdj_qt_v1.py.bak diff --git a/.gitignore b/.gitignore index 4ef34e7..48f7452 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ music/ +recordings/ # Python __pycache__/ diff --git a/compare_memory.py b/compare_memory.py index 3346192..8cfa6cf 100755 --- a/compare_memory.py +++ b/compare_memory.py @@ -41,23 +41,23 @@ def main(): # Check Chrome chrome_mem, chrome_procs = get_process_memory('chrome') if chrome_mem > 0: - print(f"🌐 Chrome (Web Panel):") + print(f"[CHROME] Chrome (Web Panel):") print(f" Total Memory: {chrome_mem:.1f} MB") print(f" Processes: {chrome_procs}") print() else: - print("🌐 Chrome: Not running") + print("[CHROME] Chrome: Not running") print() - # Check PyQt5 + # Check PyQt6 qt_mem, qt_procs = get_process_memory('techdj_qt') if qt_mem > 0: - print(f"💻 PyQt5 Native App:") + print(f"[PYQT6] PyQt6 Native App:") print(f" Total Memory: {qt_mem:.1f} MB") print(f" Processes: {qt_procs}") print() else: - print("💻 PyQt5 Native App: Not running") + print("[PYQT6] PyQt6 Native App: Not running") print() # Comparison @@ -66,25 +66,25 @@ def main(): percent = (savings / chrome_mem) * 100 print("=" * 60) - print("📊 Comparison:") + print("[STATS] Comparison:") print(f" Memory Saved: {savings:.1f} MB ({percent:.1f}%)") print() # Visual bar chart max_mem = max(chrome_mem, qt_mem) - chrome_bar = '█' * int((chrome_mem / max_mem) * 40) - qt_bar = '█' * int((qt_mem / max_mem) * 40) + chrome_bar = '#' * int((chrome_mem / max_mem) * 40) + qt_bar = '#' * int((qt_mem / max_mem) * 40) print(" Chrome: " + chrome_bar + f" {chrome_mem:.0f}MB") - print(" PyQt5: " + qt_bar + f" {qt_mem:.0f}MB") + print(" PyQt6: " + qt_bar + f" {qt_mem:.0f}MB") print() if percent > 50: - print(f" ✅ PyQt5 uses {percent:.0f}% less memory!") + print(f" [OK] PyQt6 uses {percent:.0f}% less memory!") elif percent > 25: - print(f" ✅ PyQt5 uses {percent:.0f}% less memory") + print(f" [OK] PyQt6 uses {percent:.0f}% less memory") else: - print(f" PyQt5 uses {percent:.0f}% less memory") + print(f" PyQt6 uses {percent:.0f}% less memory") print("=" * 60) print() diff --git a/dj_icon.png b/dj_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b856916c5ddad23dc00b70bcea5374f7f3199348 GIT binary patch literal 722343 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�Lp?8e^ZtEK&)HYpl3#2)+82FUPKezPjav0Tdjgg>@R@rLS)_hGx(vi zsEe&7w&MI}=|wM^(g{R*=jKI0Dt11>Ha&QHM>72Cp`%S*OWKZelX767;~2Z=b*>y~ zaJ!lumjhO%wFJ>ZoXo@N(D@7+@5`mTz!mLq>~u4;J_FbdmoomHg3%^b{5y}nmNC%J z6q9O^CWj8}!caZpV^B}d%g_^%lZgrS0|XTf&AqG@uWVIr<|S-n+mu*Nr%y zO{jAjCP{;xu9+u^VSMq-!R$G}7ThcjlB=Q#Wos@gsSpYyN?z=4Ud|{v`|QSqH2@HL4wtFv0XW z;~(qelpmX{vc!Rzo_^hZnbfRqm}Z-<^(t8rSQE4_N! zeAd&#K3OB9+1E179-sF>yd5$1!5-V3_CCgGhr2qpdh}g+tiJ6_ei9RTs6#G2ajuvh zYb374y;KzbWFaJ&@n>m~&sv9!#|V{!;Y;%STHj4RXbc6q^YUHCcBP-{nmT1pj`cjS z=`2869e~~xXs70{HxfM~;v!G3m@R|404L#O+QqE>u?osU}-|(Ga!AzJimAmu7 zRkZVMVe(oUZ>sQd;g75@x&h;B%*R@KN$2dIw$bVFVrkG2Vah&WGNtTccnXRglbNM+ zcQwy9;DQL=Wz3Zhn z(HQU6Q}ej$EPFn6S^dn$DucyWv^>PLv)=coK|cA%>X*eBOp#A>rhTcndGw;stR~IN zRF{`wz@a_}NxBq=2PYf34&i1lxE+=^4cuW0xi4R37q9KRnBzlvH+=RU3^q4*tCa~Z zN|8yOfZ=?jS_sx5mbEFM3uxO`2jW31J0dn1D;_!Hsf>drQ<+yMT^XCL))Ql zayyE9?;4fN|JE{-U14d?DK3?49qz55Y2Fv(>{k7v?SM z?iM8g=QkLqGjVPr=H_E7E@Aj?+&IUMz>>>7wR)*@tKV0&GS*>1M@Z3}5K>ffefdf* zzNv~mnw?=E>B@4$ET5nkk)sSKj}?!6fia=bge2yNY2-+iYgb0X7o^i(A6}X=o6+cv zJLgWC*t-n|J~8p!4%$ywxuT0G=5DIErcAw$>=?8w<(KxE>@URWzA0G=)wmrLPEE5 z_vr?}IwA8!8GNonvt`~Yh{W*v!08>bh!z&#{^9s9H#YJviAT_+n;4VuQ#CxROiX9P z#IY^Ep}_9DBkrN`HnHqQxewNu3=GQw^nwUg^CGFt!XIPOh@nT0+X zZuddliK|F`aQRLM4XtC!M&`w2r8@hJUz@BjwsalVH}el5M9K~11{RBV?}(Pv@QZtX zH}uTVBc}R(l>V7+)`iE!$M}r}-z^{dGc%%Po;x^a@4TxM&L#q5^FmSTsv~A1WiZq% z{C437D9d0909AkenHZjF?boOO@yhO?*6ZY#2&rhoYMSb9^Y~uS7a9BDyig$58IC zD=igf3^k`1=c#v#rMv=yuhkv0oQ=hIH)=~T+eg@5L*n3tOZTW2y}CpKqsxCKeJ-5D zfUJTjMfXopx)3@_LoXHuvJ_+Kn}UKXnX!>54?x|6+3)3n0h>R5t0{I(@g4GHQ5z5Z zi5GZ_%#c%@j6H7Vn0tyoe|Akw|xrhHv!T@jsHfeLqUPPs`jhC0* zTXn%-+eRPPT7UT;Gp*^DD4}vEiib4RxnWOcz0Qm)b%HL;Y7k<{2DRnNWn~*R2!!`n zCwqU{W8h=eO&DRW||#2RtZM2d4+~=Z>J`Ij<8G=PA28 z?B8_SPU~j*TD_l3Yjn($PvO$fRp+PSYjW!MzPc2SRgO@Sr0{t^Fy{o|k9_vy9qFzd z07pBsl?%Zq1ds=D^keEkJWk*18HPyCPJUzl&PVIhgMc~`8tw?lB!%bh=Zs?*!RMab z@t)YOMR{`kTla5Nlk>A}`CrcH9sd9%t$wX^zvJhk=;@r4QdF+q**qQr1oNJm#&USh zcD5?W2|N%;>z*^lan}HhV~+j$V%&f!!N~`VU=Rq hv_X91!&NEzsL1D*G0nT_B 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 z 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

{BrK1vsyEBu1hi{^2Y7elFYS-&1x}%_ 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�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%0Ds^+;V}clGI}F=<6tr{oVbeAX$A=lEpM5)JG9 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 Yub-MJE9-XM_DQ`iwZG4`_U@1W*$EQg&Hw-a literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 0b0eebf..7a8f15d 100644 --- a/index.html +++ b/index.html @@ -29,6 +29,15 @@ USE PORTRAIT MODE + +

@@ -36,31 +45,33 @@
-
- - -
+
+
@@ -194,7 +205,7 @@ -
@@ -314,14 +325,13 @@ -
-
@@ -330,7 +340,8 @@

QUEUE A

- +
Drop tracks here or click "Queue to A" in library
@@ -340,7 +351,8 @@

QUEUE B

- +
Drop tracks here or click "Queue to B" in library
@@ -441,6 +453,7 @@ +
@@ -477,14 +490,27 @@
- - - - +
+ +
+ + + + +
+
+ + + + + - - + + \ No newline at end of file diff --git a/launch_qt.sh b/launch_qt.sh index 7919edd..214b1db 100755 --- a/launch_qt.sh +++ b/launch_qt.sh @@ -1,31 +1,31 @@ #!/bin/bash -# TechDJ PyQt5 Launcher Script +# TechDJ PyQt6 Launcher Script -echo "🎧 TechDJ PyQt5 - Native DJ Application" +echo "TechDJ PyQt6 - Native DJ Application" echo "========================================" echo "" # Activate virtual environment if it exists if [ -f "./.venv/bin/activate" ]; then - echo "🔧 Activating virtual environment (.venv)..." + echo "Activating virtual environment (.venv)..." source ./.venv/bin/activate elif [ -f "./venv/bin/activate" ]; then - echo "🔧 Activating virtual environment (venv)..." + echo "Activating virtual environment (venv)..." source ./venv/bin/activate fi # Check if Python is installed if ! command -v python3 &> /dev/null; then - echo "❌ Python 3 is not installed!" + echo "[ERROR] Python 3 is not installed!" echo "Please install Python 3 first." exit 1 fi -echo "✅ Python 3 found: $(python3 --version)" +echo "[OK] Python 3 found: $(python3 --version)" # Check if pip is installed if ! command -v pip3 &> /dev/null; then - echo "⚠️ pip3 not found. Installing..." + echo "[WARN] pip3 not found. Installing..." echo "Please run: sudo apt install python3-pip" exit 1 fi @@ -36,55 +36,63 @@ echo "Checking dependencies..." MISSING_DEPS=0 -# Check PyQt5 -if ! python3 -c "import PyQt5" 2>/dev/null; then - echo "❌ PyQt5 not installed" +# Check PyQt6 +if ! python3 -c "import PyQt6" 2>/dev/null; then + echo "[ERROR] PyQt6 not installed" MISSING_DEPS=1 else - echo "✅ PyQt5 installed" + echo "[OK] PyQt6 installed" fi # Check sounddevice if ! python3 -c "import sounddevice" 2>/dev/null; then - echo "❌ sounddevice not installed" + echo "[ERROR] sounddevice not installed" MISSING_DEPS=1 else - echo "✅ sounddevice installed" + echo "[OK] sounddevice installed" fi # Check soundfile if ! python3 -c "import soundfile" 2>/dev/null; then - echo "❌ soundfile not installed" + echo "[ERROR] soundfile not installed" MISSING_DEPS=1 else - echo "✅ soundfile installed" + echo "[OK] soundfile installed" fi # Check numpy if ! python3 -c "import numpy" 2>/dev/null; then - echo "❌ numpy not installed" + echo "[ERROR] numpy not installed" MISSING_DEPS=1 else - echo "✅ numpy installed" + echo "[OK] numpy installed" fi # Check socketio if ! python3 -c "import socketio" 2>/dev/null; then - echo "❌ python-socketio not installed" + echo "[ERROR] python-socketio not installed" MISSING_DEPS=1 else - echo "✅ python-socketio installed" + echo "[OK] python-socketio installed" +fi + +# Check yt-dlp +if ! python3 -c "import yt_dlp" 2>/dev/null; then + echo "[ERROR] yt-dlp not installed" + MISSING_DEPS=1 +else + echo "[OK] yt-dlp installed" fi # Install missing dependencies if [ $MISSING_DEPS -eq 1 ]; then if [[ "$*" == *"--noint"* ]]; then - echo "⚠️ Missing dependencies detected in non-interactive mode" + echo "[WARN] Missing dependencies detected in non-interactive mode" echo "Please run './launch_qt.sh' from terminal to install dependencies" # Continue anyway - dependencies might be installed elsewhere else echo "" - echo "📦 Installing missing dependencies..." + echo "[INSTALL] Installing missing dependencies..." echo "This may take a few minutes..." echo "" @@ -92,27 +100,27 @@ if [ $MISSING_DEPS -eq 1 ]; then echo "Installing system dependencies..." if command -v apt-get &> /dev/null; then echo "Detected Debian/Ubuntu system" - echo "You may need to run: sudo apt-get install portaudio19-dev python3-pyqt5" + echo "You may need to run: sudo apt-get install portaudio19-dev python3-pyqt6 python3-pyqt6.qtmultimedia libqt6multimedia6-plugins" elif command -v dnf &> /dev/null; then echo "Detected Fedora system" - echo "You may need to run: sudo dnf install portaudio-devel python3-qt5" + echo "You may need to run: sudo dnf install portaudio-devel python3-qt6" elif command -v pacman &> /dev/null; then echo "Detected Arch system" - echo "You may need to run: sudo pacman -S portaudio python-pyqt5" + echo "You may need to run: sudo pacman -S portaudio python-pyqt6" fi echo "" echo "Installing Python packages..." - pip3 install --user PyQt5 sounddevice soundfile numpy python-socketio[client] requests + pip3 install --user PyQt6 sounddevice soundfile numpy python-socketio[client] requests yt-dlp if [ $? -ne 0 ]; then - echo "❌ Installation failed!" + echo "[ERROR] Installation failed!" echo "Please install dependencies manually:" echo " pip3 install --user -r requirements.txt" exit 1 fi - echo "✅ Dependencies installed successfully!" + echo "[OK] Dependencies installed successfully!" fi fi @@ -140,9 +148,9 @@ fi echo "Checking server at: $SERVER_URL" if curl -s --max-time 2 "${SERVER_URL}/library.json" > /dev/null 2>&1; then - echo "✅ Flask server is running at $SERVER_URL" + echo "[OK] Flask server is running at $SERVER_URL" else - echo "⚠️ Flask server not detected at $SERVER_URL" + echo "[WARN] Flask server not detected at $SERVER_URL" if [[ "$*" == *"--noint"* ]]; then echo "Proceeding in non-interactive mode..." else @@ -158,10 +166,10 @@ fi # Launch the application echo "" -echo "🚀 Launching TechDJ PyQt5..." +echo "Launching TechDJ PyQt6..." echo "" python3 techdj_qt.py echo "" -echo "👋 TechDJ PyQt5 closed" +echo "TechDJ PyQt6 closed" diff --git a/requirements.txt b/requirements.txt index 13cad7b..89a6f3b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,10 +4,11 @@ flask-socketio eventlet python-dotenv -# PyQt5 Native App Dependencies -PyQt5 +# PyQt6 Native App Dependencies +PyQt6 sounddevice soundfile numpy requests python-socketio[client] +yt-dlp diff --git a/script.js b/script.js index 54788a8..229afc6 100644 --- a/script.js +++ b/script.js @@ -403,6 +403,8 @@ function toggleDeck(id) { } // Mobile Tab Switching +let currentQueueTab = 'A'; // Track which queue is shown + function switchTab(tabId) { const container = document.querySelector('.app-container'); const buttons = document.querySelectorAll('.tab-btn'); @@ -413,9 +415,6 @@ function switchTab(tabId) { buttons.forEach(btn => btn.classList.remove('active')); sections.forEach(sec => sec.classList.remove('active')); - // Normalize IDs (deck-A -> deckA for class) - const normalizedId = tabId.replace('-', ''); - // Add active class and button state container.classList.add('show-' + tabId); @@ -426,11 +425,18 @@ function switchTab(tabId) { // Find the button and activate it buttons.forEach(btn => { const onClickAttr = btn.getAttribute('onclick'); - if (onClickAttr && onClickAttr.includes(tabId)) { + if (onClickAttr && (onClickAttr.includes(tabId) || (tabId.startsWith('queue') && onClickAttr.includes('switchQueueTab')))) { btn.classList.add('active'); } }); + // Update queue tab label to reflect which queue is showing + if (tabId.startsWith('queue')) { + currentQueueTab = tabId.includes('A') ? 'A' : 'B'; + const label = document.getElementById('queue-tab-label'); + if (label) label.textContent = 'QUEUE ' + currentQueueTab; + } + // Redraw waveforms if switching to a deck if (tabId.startsWith('deck')) { const id = tabId.includes('-') ? tabId.split('-')[1] : (tabId.includes('A') ? 'A' : 'B'); @@ -441,20 +447,23 @@ function switchTab(tabId) { vibrate(10); } -let libraryMode = 'server'; // 'server' or 'local' +// Queue tab cycles between Queue A and Queue B +function switchQueueTab() { + const container = document.querySelector('.app-container'); + const isQueueActive = container.classList.contains('show-queue-A') || container.classList.contains('show-queue-B'); -function setLibraryMode(mode) { - libraryMode = mode; - - // Update UI buttons - document.getElementById('btn-server-lib').classList.toggle('active', mode === 'server'); - document.getElementById('btn-local-lib').classList.toggle('active', mode === 'local'); - - // Refresh list - renderLibrary(); - vibrate(15); + if (!isQueueActive) { + // First tap: show current queue + switchTab('queue-' + currentQueueTab); + } else { + // Already on a queue tab: toggle between A and B + const nextQueue = currentQueueTab === 'A' ? 'B' : 'A'; + switchTab('queue-' + nextQueue); + } } + + function toggleMobileLibrary() { // This is now handled by tabs, but keep for compatibility if needed const lib = document.querySelector('.library-section'); @@ -462,12 +471,6 @@ function toggleMobileLibrary() { vibrate(20); } -function dismissLandscapePrompt() { - const prompt = document.getElementById('landscape-prompt'); - if (prompt) prompt.classList.add('dismissed'); - vibrate(10); -} - // Mobile Haptic Helper function vibrate(ms) { if (navigator.vibrate) { @@ -475,6 +478,36 @@ function vibrate(ms) { } } +// Mobile FAB Menu Toggle +function toggleFabMenu(e) { + if (e) e.stopPropagation(); + const menu = document.getElementById('fab-menu'); + const fab = document.querySelector('.fab-main'); + if (menu) menu.classList.toggle('active'); + if (fab) fab.classList.toggle('active'); + vibrate(10); +} + +// Close menu when clicking outside +document.addEventListener('click', () => { + const menu = document.getElementById('fab-menu'); + const fab = document.querySelector('.fab-main'); + if (menu && menu.classList.contains('active')) { + menu.classList.remove('active'); + fab.classList.remove('active'); + } +}); + +// Update Clock +setInterval(() => { + const clock = document.getElementById('clock-display'); + if (clock) { + const now = new Date(); + clock.textContent = now.getHours().toString().padStart(2, '0') + ':' + + now.getMinutes().toString().padStart(2, '0'); + } +}, 1000); + // Fullscreen Toggle function toggleFullScreen() { if (!document.fullscreenElement) { @@ -512,12 +545,18 @@ function handleSwipe() { const activeBtn = document.querySelector('.tab-btn.active'); if (!activeBtn) return; - const tabs = ['library', 'deck-A', 'deck-B']; + const tabs = ['library', 'deck-A', 'deck-B', 'queue-A', 'queue-B']; let currentIndex = -1; - if (activeBtn.getAttribute('onclick').includes('library')) currentIndex = 0; - else if (activeBtn.getAttribute('onclick').includes('deck-A')) currentIndex = 1; - else if (activeBtn.getAttribute('onclick').includes('deck-B')) currentIndex = 2; + const onClickAttr = activeBtn.getAttribute('onclick') || ''; + if (onClickAttr.includes('library')) currentIndex = 0; + else if (onClickAttr.includes('deck-A')) currentIndex = 1; + else if (onClickAttr.includes('deck-B')) currentIndex = 2; + else if (onClickAttr.includes('switchQueueTab')) { + // Determine which queue is active + const container = document.querySelector('.app-container'); + currentIndex = container.classList.contains('show-queue-B') ? 4 : 3; + } if (currentIndex === -1) return; @@ -612,6 +651,27 @@ function drawWaveform(id) { } ctx.setLineDash([]); } + + // Apply manual glow if enabled + if (settings[`glow${id}`] && !decks[id].playing) { + applyGlow(id, settings.glowIntensity); + } else { + removeGlow(id); + } +} + +function applyGlow(id, intensity) { + const deckEl = document.getElementById('deck-' + id); + if (!deckEl) return; + const color = id === 'A' ? 'var(--primary-cyan)' : 'var(--secondary-magenta)'; + const blur = Math.max(10, intensity); + const spread = Math.max(2, intensity / 5); + deckEl.style.boxShadow = `0 0 ${blur}px ${spread}px ${color}`; +} + +function removeGlow(id) { + const deckEl = document.getElementById('deck-' + id); + if (deckEl) deckEl.style.boxShadow = ''; } // BPM Detection (Optimised: Only check middle 60 seconds for speed) @@ -714,11 +774,13 @@ function playDeck(id) { vibrate(15); // Server-side audio mode if (SERVER_SIDE_AUDIO) { - if (!socket) initSocket(); socket.emit('audio_play', { deck: id }); decks[id].playing = true; const deckEl = document.getElementById('deck-' + id); if (deckEl) deckEl.classList.add('playing'); + document.body.classList.add('playing-' + id); + + console.log(`[Deck ${id}] Play command sent to server`); return; } @@ -734,6 +796,9 @@ function playDeck(id) { const deckEl = document.getElementById('deck-' + id); if (deckEl) deckEl.classList.add('playing'); + document.body.classList.add('playing-' + id); + + if (audioCtx.state === 'suspended') { console.log(`[Deck ${id}] Resuming suspended AudioContext`); @@ -752,6 +817,9 @@ function playDeck(id) { decks[id].playing = false; const deckEl = document.getElementById('deck-' + id); if (deckEl) deckEl.classList.remove('playing'); + document.body.classList.remove('playing-' + id); + + alert(`Playback error: ${error.message}`); } } else { @@ -766,7 +834,10 @@ function pauseDeck(id) { if (!socket) initSocket(); socket.emit('audio_pause', { deck: id }); decks[id].playing = false; - document.getElementById('deck-' + id).classList.remove('playing'); + const deckEl = document.getElementById('deck-' + id); + if (deckEl) deckEl.classList.remove('playing'); + document.body.classList.remove('playing-' + id); + console.log(`[Deck ${id}] Pause command sent to server`); return; } @@ -790,9 +861,12 @@ function pauseDeck(id) { decks[id].playing = false; } } - document.getElementById('deck-' + id).classList.remove('playing'); + const deckEl = document.getElementById('deck-' + id); + if (deckEl) deckEl.classList.remove('playing'); + document.body.classList.remove('playing-' + id); } + function seekTo(id, time) { // Update local state and timestamp for seek protection decks[id].lastSeekTime = Date.now(); @@ -1219,17 +1293,10 @@ function renderLibrary(songs) { const list = document.getElementById('library-list'); list.innerHTML = ''; - // Filter by mode (Mobile Drawer specifically relies on this) - const filteredSongs = songs.filter(s => { - // If it's a server track, its type is usually 'remote' or it has a URL - // If it's a local track, its type is 'local' - // For simplicity, let's look for a type field - if (libraryMode === 'local') return s.type === 'local'; - return s.type !== 'local'; - }); + const filteredSongs = songs; if (filteredSongs.length === 0) { - list.innerHTML = `
No ${libraryMode} tracks found.
`; + list.innerHTML = `
No tracks found.
`; return; } @@ -1341,7 +1408,7 @@ function refreshLibrary() { async function loadFromServer(id, url, title) { const d = document.getElementById('display-' + id); - d.innerText = '⏳ LOADING...'; + d.innerText = '[WAIT] LOADING...'; d.classList.add('blink'); console.log(`[Deck ${id}] Loading: ${title} from ${url}`); @@ -1366,7 +1433,7 @@ async function loadFromServer(id, url, title) { pauseDeck(id); console.log(`[Deck ${id}] Paused for song load`); } else if (wasPlaying && wasBroadcasting) { - console.log(`[Deck ${id}] ⚡ BROADCAST MODE: Keeping deck playing during load to maintain stream`); + console.log(`[Deck ${id}] [LIVE] BROADCAST MODE: Keeping deck playing during load to maintain stream`); } decks[id].waveformData = null; @@ -1471,50 +1538,204 @@ function toggleSettings() { } // File Upload +// File Upload with Progress and Parallelism async function handleFileUpload(event) { - const files = event.target.files; + const files = Array.from(event.target.files); if (!files || files.length === 0) return; console.log(`Uploading ${files.length} file(s)...`); - for (let file of files) { - if (!file.type.match('audio/mpeg') && !file.name.endsWith('.mp3')) { - alert(`${file.name} is not an MP3 file`); - continue; + // Create/Show progress container + let progressContainer = document.getElementById('upload-progress-container'); + if (!progressContainer) { + progressContainer = document.createElement('div'); + progressContainer.id = 'upload-progress-container'; + progressContainer.className = 'upload-progress-container'; + document.body.appendChild(progressContainer); + } + progressContainer.innerHTML = '

UPLOADING TRACKS...

'; + progressContainer.classList.add('active'); + + const uploadPromises = files.map(async (file) => { + const allowedExts = ['.mp3', '.m4a', '.wav', '.flac', '.ogg']; + const ext = file.name.substring(file.name.lastIndexOf('.')).toLowerCase(); + if (!allowedExts.includes(ext)) { + console.warn(`${file.name} is not a supported audio file`); + return; } const formData = new FormData(); formData.append('file', file); + const progressRow = document.createElement('div'); + progressRow.className = 'upload-progress-row'; + const nameSpan = document.createElement('span'); + nameSpan.textContent = file.name.substring(0, 20) + (file.name.length > 20 ? '...' : ''); + const barWrap = document.createElement('div'); + barWrap.className = 'progress-bar-wrap'; + const barInner = document.createElement('div'); + barInner.className = 'progress-bar-inner'; + barInner.style.width = '0%'; + barWrap.appendChild(barInner); + progressRow.appendChild(nameSpan); + progressRow.appendChild(barWrap); + progressContainer.appendChild(progressRow); + try { - const response = await fetch('/upload', { - method: 'POST', - body: formData + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.open('POST', '/upload', true); + + xhr.upload.onprogress = (e) => { + if (e.lengthComputable) { + const percent = (e.loaded / e.total) * 100; + barInner.style.width = percent + '%'; + } + }; + + xhr.onload = () => { + if (xhr.status === 200) { + const result = JSON.parse(xhr.responseText); + if (result.success) { + barInner.style.background = '#00ff88'; + resolve(); + } else { + barInner.style.background = '#ff4444'; + reject(new Error(result.error)); + } + } else { + barInner.style.background = '#ff4444'; + reject(new Error(`HTTP ${xhr.status}`)); + } + }; + + xhr.onerror = () => { + barInner.style.background = '#ff4444'; + reject(new Error('Network error')); + }; + + xhr.send(formData); }); - - const result = await response.json(); - - if (result.success) { - console.log(`✅ Uploaded: ${file.name}`); - } else { - console.error(`❌ Upload failed: ${result.error}`); - alert(`Failed to upload ${file.name}: ${result.error}`); - } } catch (error) { - console.error(`❌ Upload error: ${error}`); - alert(`Error uploading ${file.name}`); + console.error(`[ERROR] Upload error: ${error}`); } + }); + + // Run uploads in parallel (limited to 3 at a time for stability if needed, but let's try all) + try { + await Promise.all(uploadPromises); + console.log('All uploads finished.'); + } catch (e) { + console.error('Some uploads failed', e); } // Refresh library - console.log('Refreshing library...'); - await loadLibrary(); - alert(`✅ ${files.length} file(s) uploaded successfully!`); + setTimeout(() => { + fetchLibrary(); + setTimeout(() => { + progressContainer.classList.remove('active'); + vibrate(30); + }, 2000); + }, 500); - // Clear the input so the same file can be uploaded again if needed + // Clear the input event.target.value = ''; } +// Folder Selection Logic +async function openFolderPicker() { + let picker = document.getElementById('folder-picker-modal'); + if (!picker) { + picker = document.createElement('div'); + picker.id = 'folder-picker-modal'; + picker.className = 'modal-overlay'; + picker.innerHTML = ` + + `; + document.body.appendChild(picker); + } + picker.classList.add('active'); + + // Initial browse to home or current + browseToPath(''); +} + +function closeFolderPicker() { + document.getElementById('folder-picker-modal').classList.remove('active'); +} + +async function browseToPath(targetPath) { + const currentInput = document.getElementById('current-folder-path'); + let path = currentInput.value; + + if (targetPath === '..') { + // Handled by server if we send '..' but let's be explicit + const parts = path.split('/'); + parts.pop(); + path = parts.join('/') || '/'; + } else if (targetPath) { + path = targetPath; + } + + try { + const res = await fetch(`/browse_directories?path=${encodeURIComponent(path)}`); + const data = await res.json(); + if (data.success) { + currentInput.value = data.path; + const list = document.getElementById('dir-list'); + list.innerHTML = ''; + + data.entries.forEach(entry => { + const div = document.createElement('div'); + div.className = 'dir-entry'; + div.innerHTML = `[DIR] ${entry.name}`; + div.onclick = () => browseToPath(entry.path); + list.appendChild(div); + }); + } + } catch (e) { + console.error("Browse failed", e); + } +} + +async function confirmFolderSelection() { + const path = document.getElementById('current-folder-path').value; + try { + const res = await fetch('/update_settings', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + library: { music_folder: path } + }) + }); + const result = await res.json(); + if (result.success) { + alert("Music folder updated! Refreshing library..."); + closeFolderPicker(); + fetchLibrary(); + } else { + alert("Error: " + result.error); + } + } catch (e) { + alert("Failed to update settings"); + } +} + function toggleRepeat(id, val) { if (val === undefined) { settings[`repeat${id}`] = !settings[`repeat${id}`]; @@ -1703,7 +1924,7 @@ function initSocket() { const serverUrl = (isListenerMode && window.location.port === '5000') ? `${window.location.protocol}//${window.location.hostname}:5001` : window.location.origin; - console.log(`🔌 Initializing Socket.IO connection to: ${serverUrl}`); + console.log(`CONNECT Initializing Socket.IO connection to: ${serverUrl}`); console.log(` Protocol: ${window.location.protocol}`); console.log(` Host: ${window.location.host}`); @@ -1714,7 +1935,7 @@ function initSocket() { }); socket.on('connect', () => { - console.log('✅ Connected to streaming server'); + console.log('[OK] Connected to streaming server'); console.log(` Socket ID: ${socket.id}`); console.log(` Transport: ${socket.io.engine.transport.name}`); @@ -1723,12 +1944,12 @@ function initSocket() { }); socket.on('connect_error', (error) => { - console.error('❌ Connection error:', error.message); + console.error('[ERROR] Connection error:', error.message); console.error(' Make sure server is running on', serverUrl); }); socket.on('disconnect', (reason) => { - console.log('❌ Disconnected from streaming server'); + console.log('[ERROR] Disconnected from streaming server'); console.log(` Reason: ${reason}`); }); @@ -1748,11 +1969,14 @@ function initSocket() { }); socket.on('broadcast_stopped', () => { - console.log('🛑 Broadcast stopped notification received'); + console.log('STOP Broadcast stopped notification received'); // Reset relay UI if it was active - document.getElementById('start-relay-btn').style.display = 'inline-block'; - document.getElementById('stop-relay-btn').style.display = 'none'; - document.getElementById('relay-status').textContent = ''; + const startRelayBtn = document.getElementById('start-relay-btn'); + const stopRelayBtn = document.getElementById('stop-relay-btn'); + const relayStatus = document.getElementById('relay-status'); + if (startRelayBtn) startRelayBtn.style.display = 'inline-block'; + if (stopRelayBtn) stopRelayBtn.style.display = 'none'; + if (relayStatus) relayStatus.textContent = ''; }); socket.on('mixer_status', (data) => { @@ -1768,9 +1992,12 @@ function initSocket() { console.error('Server error:', data.message); alert(`SERVER ERROR: ${data.message}`); // Reset relay UI on error - document.getElementById('start-relay-btn').style.display = 'inline-block'; - document.getElementById('stop-relay-btn').style.display = 'none'; - document.getElementById('relay-status').textContent = ''; + const startRelayBtn = document.getElementById('start-relay-btn'); + const stopRelayBtn = document.getElementById('stop-relay-btn'); + const relayStatus = document.getElementById('relay-status'); + if (startRelayBtn) startRelayBtn.style.display = 'inline-block'; + if (stopRelayBtn) stopRelayBtn.style.display = 'none'; + if (relayStatus) relayStatus.textContent = ''; }); return socket; @@ -1862,7 +2089,6 @@ function toggleBroadcast() { } } -// Start broadcasting // Start broadcasting function startBroadcast() { try { @@ -1878,7 +2104,7 @@ function startBroadcast() { isBroadcasting = true; document.getElementById('broadcast-btn').classList.add('active'); document.getElementById('broadcast-text').textContent = 'STOP BROADCAST'; - document.getElementById('broadcast-status').textContent = '🔴 LIVE'; + document.getElementById('broadcast-status').textContent = '[OFFLINE] LIVE'; document.getElementById('broadcast-status').classList.add('live'); if (!socket) initSocket(); @@ -1886,7 +2112,7 @@ function startBroadcast() { socket.emit('start_broadcast', { bitrate: bitrateValue }); socket.emit('get_listener_count'); - console.log('✅ Server-side broadcast started'); + console.log('[OK] Server-side broadcast started'); return; } @@ -1911,7 +2137,7 @@ function startBroadcast() { } decks.A.crossfaderGain.connect(streamDestination); decks.A.crossfaderGain.connect(audioCtx.destination); // Re-add for local monitoring - console.log('✅ Deck A connected to stream + speakers'); + console.log('[OK] Deck A connected to stream + speakers'); } if (decks.B.crossfaderGain) { try { @@ -1921,12 +2147,12 @@ function startBroadcast() { } decks.B.crossfaderGain.connect(streamDestination); decks.B.crossfaderGain.connect(audioCtx.destination); // Re-add for local monitoring - console.log('✅ Deck B connected to stream + speakers'); + console.log('[OK] Deck B connected to stream + speakers'); } // Verify stream has audio tracks const stream = streamDestination.stream; - console.log(`📊 Stream tracks: ${stream.getAudioTracks().length} audio tracks`); + console.log(`[DATA] Stream tracks: ${stream.getAudioTracks().length} audio tracks`); if (stream.getAudioTracks().length === 0) { throw new Error('No audio tracks in stream! Audio routing failed.'); @@ -2010,7 +2236,7 @@ function startBroadcast() { }; mediaRecorder.onerror = (error) => { - console.error('❌ MediaRecorder error:', error); + console.error('[ERROR] MediaRecorder error:', error); // Try to recover from error if (isBroadcasting) { console.log('Attempting to recover from MediaRecorder error...'); @@ -2023,7 +2249,7 @@ function startBroadcast() { }; mediaRecorder.onstart = () => { - console.log('✅ MediaRecorder started'); + console.log('[OK] MediaRecorder started'); }; mediaRecorder.onstop = (event) => { @@ -2033,7 +2259,7 @@ function startBroadcast() { // If we're supposed to be broadcasting but MediaRecorder stopped, restart it if (isBroadcasting) { - console.error('❌ MediaRecorder stopped unexpectedly while broadcasting!'); + console.error('[ERROR] MediaRecorder stopped unexpectedly while broadcasting!'); console.log('Auto-recovery: Attempting to restart broadcast in 2 seconds...'); setTimeout(() => { @@ -2053,9 +2279,9 @@ function startBroadcast() { console.log('Auto-resuming MediaRecorder...'); try { mediaRecorder.resume(); - console.log('✅ MediaRecorder resumed'); + console.log('[OK] MediaRecorder resumed'); } catch (e) { - console.error('❌ Failed to resume MediaRecorder:', e); + console.error('[ERROR] Failed to resume MediaRecorder:', e); // If resume fails, try full restart setTimeout(() => { if (isBroadcasting) { @@ -2071,9 +2297,9 @@ function startBroadcast() { if (mediaRecorder.state === 'inactive') { mediaRecorder.start(1000); streamProcessor = mediaRecorder; - console.log('✅ MediaRecorder started in state:', mediaRecorder.state); + console.log('[OK] MediaRecorder started in state:', mediaRecorder.state); } else { - console.error('❌ Cannot start MediaRecorder - already in state:', mediaRecorder.state); + console.error('[ERROR] Cannot start MediaRecorder - already in state:', mediaRecorder.state); throw new Error(`MediaRecorder is already ${mediaRecorder.state}`); } @@ -2081,7 +2307,7 @@ function startBroadcast() { isBroadcasting = true; document.getElementById('broadcast-btn').classList.add('active'); document.getElementById('broadcast-text').textContent = 'STOP BROADCAST'; - document.getElementById('broadcast-status').textContent = '🔴 LIVE'; + document.getElementById('broadcast-status').textContent = '[OFFLINE] LIVE'; document.getElementById('broadcast-status').classList.add('live'); // Notify server that broadcast is active (listeners use MP3 stream) @@ -2090,13 +2316,13 @@ function startBroadcast() { socket.emit('start_broadcast', { bitrate: bitrateValue }); socket.emit('get_listener_count'); - console.log('✅ Broadcasting started successfully!'); - console.log('💡 TIP: Play a track on Deck A or B to stream audio'); + console.log('[OK] Broadcasting started successfully!'); + console.log('TIP TIP: Play a track on Deck A or B to stream audio'); // Monitor audio levels setTimeout(() => { if (chunkCount === 0) { - console.error('❌ NO AUDIO CHUNKS after 2 seconds! Check:'); + console.error('[ERROR] NO AUDIO CHUNKS after 2 seconds! Check:'); console.error(' 1. Is audio playing on either deck?'); console.error(' 2. Is volume turned up?'); console.error(' 3. Is crossfader in the middle?'); @@ -2104,7 +2330,7 @@ function startBroadcast() { }, 2000); } catch (error) { - console.error('❌ Failed to start broadcast:', error); + console.error('[ERROR] Failed to start broadcast:', error); alert('Failed to start broadcast: ' + error.message); isBroadcasting = false; } @@ -2112,7 +2338,7 @@ function startBroadcast() { // Stop broadcasting function stopBroadcast() { - console.log('🛑 Stopping broadcast...'); + console.log('STOP Stopping broadcast...'); if (SERVER_SIDE_AUDIO) { isBroadcasting = false; @@ -2163,7 +2389,7 @@ function stopBroadcast() { document.getElementById('broadcast-status').textContent = 'Offline'; document.getElementById('broadcast-status').classList.remove('live'); - console.log('✅ Broadcast stopped'); + console.log('[OK] Broadcast stopped'); } @@ -2212,7 +2438,7 @@ function restartBroadcast() { setTimeout(() => { if (wasBroadcasting) { startBroadcast(); - console.log('✅ Broadcast restarted successfully'); + console.log('[OK] Broadcast restarted successfully'); } }, 100); } @@ -2227,7 +2453,7 @@ function copyStreamUrl(evt) { document.execCommand('copy'); const btn = evt?.target; const originalText = btn.textContent; - btn.textContent = '✓'; + btn.textContent = 'OK'; setTimeout(() => { btn.textContent = originalText; }, 2000); @@ -2245,7 +2471,7 @@ function toggleAutoStream(enabled) { // ========== LISTENER MODE ========== function initListenerMode() { - console.log('🎧 Initializing listener mode (MP3 stream)...'); + console.log('STREAMPANEL Initializing listener mode (MP3 stream)...'); // UI Feedback for listener const appContainer = document.querySelector('.app-container'); @@ -2278,7 +2504,7 @@ function initListenerMode() { // Clean up old audio element if it exists if (window.listenerAudio) { - console.log('🧹 Cleaning up old audio element and AudioContext nodes'); + console.log('CLEAN Cleaning up old audio element and AudioContext nodes'); try { window.listenerAudio.pause(); if (window.listenerAudio.src) { @@ -2324,13 +2550,98 @@ function initListenerMode() { audio.playsInline = true; audio.setAttribute('playsinline', ''); audio.style.display = 'none'; + audio.crossOrigin = 'anonymous'; // Helps with certain browser stream policies document.body.appendChild(audio); - console.log('🆕 Created fresh media element (audio) for listener'); + console.log('NEW Created fresh media element (audio) for listener'); - // MP3 stream (server-side) — requires ffmpeg on the server. + // Stall Watchdog Variables + let lastCheckedTime = 0; + let stallCount = 0; + let watchdogInterval = null; + + const stopWatchdog = () => { + if (watchdogInterval) { + clearInterval(watchdogInterval); + watchdogInterval = null; + } + }; + + const startWatchdog = () => { + stopWatchdog(); + lastCheckedTime = audio.currentTime; + stallCount = 0; + + watchdogInterval = setInterval(() => { + if (!window.listenerAudioEnabled || audio.paused) return; + + if (audio.currentTime === lastCheckedTime && audio.currentTime > 0) { + stallCount++; + console.warn(`[WARN] Stream stall detected (${stallCount}/3)...`); + + if (stallCount >= 3) { // 3 cycles * 2s = 6s of stalling + console.error('ALERT Stream is completely stalled. Force reconnecting...'); + reconnectStream(); + stallCount = 0; + } + } else { + stallCount = 0; + } + lastCheckedTime = audio.currentTime; + }, 2000); + }; + + const reconnectStream = () => { + if (!window.listenerAudioEnabled || !window.listenerAudio) return; + + console.log('RECONNECTING Reconnecting stream...'); + const statusEl = document.getElementById('connection-status'); + if (statusEl) { + statusEl.textContent = '[WAIT] Connection weak - Reconnecting...'; + statusEl.classList.remove('glow-text'); + } + + const wasPaused = window.listenerAudio.paused; + // Bust cache with timestamp + window.listenerAudio.src = getMp3FallbackUrl() + '?t=' + Date.now(); + window.listenerAudio.load(); + + if (!wasPaused) { + window.listenerAudio.play() + .then(() => { + if (statusEl) { + statusEl.textContent = '[ACTIVE] Reconnected'; + statusEl.classList.add('glow-text'); + } + // Re-sync visualiser + startListenerVUMeter(); + }) + .catch(e => console.warn('Reconnect play failed:', e)); + } + }; + + // MP3 stream (server-side) - requires ffmpeg on the server. audio.src = getMp3FallbackUrl(); audio.load(); - console.log(`🎧 Listener source set to MP3 stream: ${audio.src}`); + console.log(`STREAMPANEL Listener source set to MP3 stream: ${audio.src}`); + + // Auto-reconnect logic if stream errors out + audio.onerror = () => { + if (!window.listenerAudioEnabled) return; + console.error('[ERROR] Audio stream error!'); + reconnectStream(); + }; + + audio.onplay = () => { + console.log('PLAY Stream playing'); + startWatchdog(); + const statusEl = document.getElementById('connection-status'); + if (statusEl) statusEl.classList.add('glow-text'); + }; + + audio.onpause = () => { + console.log('PAUSE Stream paused'); + stopWatchdog(); + }; // Show enable audio button instead of attempting autoplay const enableAudioBtn = document.getElementById('enable-audio-btn'); @@ -2340,7 +2651,7 @@ function initListenerMode() { enableAudioBtn.style.display = 'flex'; } if (statusEl) { - statusEl.textContent = '🔵 Click "Enable Audio" to start listening (MP3)'; + statusEl.textContent = '[INFO] Click "Enable Audio" to start listening (MP3)'; } // Store audio element and context for later activation @@ -2391,20 +2702,22 @@ function initListenerMode() { const statusEl = document.getElementById('connection-status'); // Only update if audio is enabled, otherwise keep the "Click Enable Audio" message if (statusEl && window.listenerAudioEnabled) { - statusEl.textContent = '🟢 Connected'; + statusEl.textContent = '[ACTIVE] Connected'; } + // Re-join as listener on reconnect so server tracks us + socket.emit('join_listener'); }); socket.on('disconnect', () => { const statusEl = document.getElementById('connection-status'); // Always show disconnect status as it's critical - if (statusEl) statusEl.textContent = '🔴 Disconnected'; + if (statusEl) statusEl.textContent = '[OFFLINE] Disconnected'; }); } // Enable audio for listener mode (called when user clicks the button) async function enableListenerAudio() { - console.log('🎧 Enabling audio via user gesture...'); + console.log('STREAMPANEL Enabling audio via user gesture...'); const enableAudioBtn = document.getElementById('enable-audio-btn'); const statusEl = document.getElementById('connection-status'); @@ -2421,7 +2734,7 @@ async function enableListenerAudio() { // 2. Resume audio context (CRITICAL for Chrome/Safari) if (listenerAudioContext.state === 'suspended') { await listenerAudioContext.resume(); - console.log('✅ Audio context resumed'); + console.log('[OK] Audio context resumed'); } // 3. Bridge Audio Element to AudioContext if not already connected @@ -2462,7 +2775,7 @@ async function enableListenerAudio() { // 4. Prepare and start audio playback if (window.listenerAudio) { - console.log('📊 Audio element state:', { + console.log('[DATA] Audio element state:', { readyState: window.listenerAudio.readyState, networkState: window.listenerAudio.networkState, src: window.listenerAudio.src ? 'set' : 'not set', @@ -2483,9 +2796,23 @@ async function enableListenerAudio() { return window.listenerAudio.buffered && window.listenerAudio.buffered.length > 0; }; + // Mark audio as enabled immediately so reconnection logic is active + window.listenerAudioEnabled = true; + // MP3 stream: call play() immediately to capture the user gesture. if (audioText) audioText.textContent = 'STARTING...'; console.log('Attempting to play audio...'); + + // Create a timeout for the play promise to prevent indefinite 'buffering' state + const playTimeout = setTimeout(() => { + if (!hasBufferedData()) { + console.warn('[WARN] Audio play is taking a long time (buffering)...'); + if (audioText) audioText.textContent = 'STILL BUFFERING...'; + // Trigger a load() to nudge the browser if it's stuck + window.listenerAudio.load(); + } + }, 8000); + const playPromise = window.listenerAudio.play(); // If not buffered yet, show buffering but don't block. @@ -2493,11 +2820,14 @@ async function enableListenerAudio() { audioText.textContent = 'BUFFERING...'; } - await playPromise; - console.log('✅ Audio playback started successfully'); - - // Mark audio as enabled so status updates can now display - window.listenerAudioEnabled = true; + try { + await playPromise; + clearTimeout(playTimeout); + console.log('[OK] Audio playback started successfully'); + } catch (e) { + clearTimeout(playTimeout); + throw e; // Re-throw to be caught by the outer catch block + } } // 4. Hide the button and update status @@ -2509,12 +2839,12 @@ async function enableListenerAudio() { } if (statusEl) { - statusEl.textContent = '🟢 Audio Active - Enjoy the stream'; + statusEl.textContent = '[ACTIVE] Audio Active - Enjoy the stream'; statusEl.classList.add('glow-text'); } } catch (error) { - console.error('❌ Failed to enable audio:', error); + console.error('[ERROR] Failed to enable audio:', error); const stashedStatus = document.getElementById('connection-status'); const stashedBtn = document.getElementById('enable-audio-btn'); const audioText = stashedBtn ? stashedBtn.querySelector('.audio-text') : null; @@ -2572,20 +2902,35 @@ function monitorTrackEnd() { // If end reached (with 0.5s buffer for safety) if (remaining <= 0.5) { - // Don't pause during broadcast - let the track end naturally + // During broadcast, still handle auto-play/queue to avoid dead air if (isBroadcasting) { - console.log(`Track ending during broadcast on Deck ${id} - continuing stream`); + console.log(`Track ending during broadcast on Deck ${id}`); if (settings[`repeat${id}`]) { - console.log(`🔁 Repeating track on Deck ${id}`); + console.log(`LOOP Repeating track on Deck ${id}`); seekTo(id, 0); + return; } - // Skip pause/stop during broadcast to maintain stream + // Auto-play from queue during broadcast to maintain stream + if (settings.autoPlay && queues[id] && queues[id].length > 0) { + decks[id].loading = true; + console.log(`Auto-play (broadcast): Loading next from Queue ${id}...`); + const next = queues[id].shift(); + renderQueue(id); + loadFromServer(id, next.file, next.title).then(() => { + decks[id].loading = false; + playDeck(id); + }).catch(() => { + decks[id].loading = false; + }); + return; + } + // No repeat, no queue - just let the stream continue silently return; } if (settings[`repeat${id}`]) { // Full song repeat - console.log(`🔁 Repeating track on Deck ${id}`); + console.log(`LOOP Repeating track on Deck ${id}`); seekTo(id, 0); } else if (settings.autoPlay) { // Prevent race condition @@ -2690,7 +3035,11 @@ function resetDeck(id) { // Redraw waveform to clear cue/loop markers drawWaveform(id); - console.log(`✅ Deck ${id} reset complete!`); + // Clear neon glow + document.body.classList.remove('playing-' + id); + + console.log(`[OK] Deck ${id} reset complete!`); + // Visual feedback const resetBtn = document.querySelector(`#deck-${id} .reset-btn`); @@ -2801,7 +3150,7 @@ function renderQueue(deckId) { const loadBtn = document.createElement('button'); loadBtn.className = 'queue-load-btn'; - loadBtn.textContent = '▶'; + loadBtn.textContent = 'PLAY'; loadBtn.title = 'Load now'; loadBtn.onclick = (e) => { e.stopPropagation(); @@ -2811,7 +3160,7 @@ function renderQueue(deckId) { const removeBtn = document.createElement('button'); removeBtn.className = 'queue-remove-btn'; - removeBtn.textContent = '✕'; + removeBtn.textContent = 'X'; removeBtn.title = 'Remove from queue'; removeBtn.onclick = (e) => { e.stopPropagation(); @@ -2870,15 +3219,7 @@ function renderQueue(deckId) { }); } -// Auto-load next track when current track ends -function checkAndLoadNextFromQueue(deckId) { - if (settings.autoPlay && queues[deckId].length > 0) { - console.log(`Auto-loading next track from Queue ${deckId}...`); - setTimeout(() => { - loadNextFromQueue(deckId); - }, 500); - } -} + // ========================================== // KEYBOARD SHORTCUTS SYSTEM // ========================================== @@ -2936,7 +3277,7 @@ async function loadKeyboardMappings() { const data = await response.json(); if (data.success && data.keymaps) { keyboardMappings = data.keymaps; - console.log('✅ Loaded custom keyboard mappings from server'); + console.log('[OK] Loaded custom keyboard mappings from server'); } else { console.log('Using default keyboard mappings'); } @@ -2953,7 +3294,7 @@ async function saveKeyboardMappings() { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(keyboardMappings) }); - console.log('💾 Saved keyboard mappings to server'); + console.log('[SAVED] Saved keyboard mappings to server'); } catch (e) { console.error('Failed to save keyboard mappings to server:', e); } @@ -3038,7 +3379,7 @@ document.addEventListener('keydown', (e) => { if (mapping) { e.preventDefault(); - console.log(`Keyboard: ${key} → ${mapping.label}`); + console.log(`Keyboard: ${key} RIGHT ${mapping.label}`); executeKeyboardAction(mapping.action); } }); @@ -3075,7 +3416,7 @@ function createKeyboardSettingsPanel() { panel.innerHTML = `

Keyboard Shortcuts

- +

Click on a key to reassign it. Press ESC to cancel.

@@ -3108,9 +3449,9 @@ function renderKeyboardMappings() { item.className = 'keyboard-mapping-item'; item.innerHTML = ` ${formatKeyName(key)} - + RIGHT ${mapping.label} - + `; list.appendChild(item); }); @@ -3119,10 +3460,10 @@ function renderKeyboardMappings() { // Format key name for display function formatKeyName(key) { const names = { - 'ArrowLeft': '← Left', - 'ArrowRight': '→ Right', - 'ArrowUp': '↑ Up', - 'ArrowDown': '↓ Down', + 'ArrowLeft': 'LEFT Left', + 'ArrowRight': 'RIGHT Right', + 'ArrowUp': 'UP Up', + 'ArrowDown': 'DOWN Down', 'Escape': 'ESC', ' ': 'Space' }; @@ -3130,8 +3471,8 @@ function formatKeyName(key) { } // Reassign a key -function reassignKey(oldKey) { - const item = event.target.closest('.keyboard-mapping-item'); +function reassignKey(oldKey, evt) { + const item = evt.target.closest('.keyboard-mapping-item'); item.classList.add('listening'); item.querySelector('.key-reassign-btn').textContent = 'Press new key...'; @@ -3166,7 +3507,7 @@ function reassignKey(oldKey) { renderKeyboardMappings(); document.removeEventListener('keydown', listener); - console.log(`✅ Remapped: ${formatKeyName(oldKey)} → ${formatKeyName(newKey)}`); + console.log(`[OK] Remapped: ${formatKeyName(oldKey)} RIGHT ${formatKeyName(newKey)}`); }; document.addEventListener('keydown', listener); @@ -3207,9 +3548,9 @@ function importKeyboardMappings() { keyboardMappings = imported; saveKeyboardMappings(); renderKeyboardMappings(); - alert('✅ Keyboard mappings imported successfully!'); + alert('[OK] Keyboard mappings imported successfully!'); } catch (err) { - alert('❌ Failed to import: Invalid file format'); + alert('[ERROR] Failed to import: Invalid file format'); } }; reader.readAsText(file); diff --git a/server.py b/server.py index e3f9a17..2d3e665 100644 --- a/server.py +++ b/server.py @@ -44,29 +44,30 @@ listener_sids = set() dj_sids = set() # === Optional MP3 fallback stream (server-side transcoding) === -# This allows listeners on browsers that don't support WebM/Opus via MediaSource -# (notably some Safari / locked-down environments) to still hear the stream. _ffmpeg_proc = None -_ffmpeg_in_q = queue.Queue(maxsize=40) +_ffmpeg_in_q = queue.Queue(maxsize=20) # Optimized for low-latency live streaming _current_bitrate = "192k" _mp3_clients = set() # set[queue.Queue] _mp3_lock = threading.Lock() -_transcode_threads_started = False _transcoder_bytes_out = 0 _transcoder_last_error = None _last_audio_chunk_ts = 0.0 -_mp3_preroll = collections.deque(maxlen=256) # Pre-roll (~10s at 192k with 1KB chunks) +_mp3_preroll = collections.deque(maxlen=512) # Larger pre-roll (~512KB) def _start_transcoder_if_needed(is_mp3_input=False): - global _ffmpeg_proc, _transcode_threads_started, _transcoder_last_error + global _ffmpeg_proc, _transcoder_last_error - # If already running, check if we need to restart for mode change + # If already running, check if we need to restart if _ffmpeg_proc is not None and _ffmpeg_proc.poll() is None: return - # Local broadcast mode: input from pipe (Relay mode removed) - # If input is already MP3, we just use 'copy' to avoid double-encoding + # Ensure stale process is cleaned up + if _ffmpeg_proc: + try: _ffmpeg_proc.terminate() + except: pass + _ffmpeg_proc = None + codec = 'copy' if is_mp3_input else 'libmp3lame' cmd = [ @@ -92,7 +93,6 @@ def _start_transcoder_if_needed(is_mp3_input=False): cmd.extend(['-b:a', _current_bitrate]) cmd.extend([ - '-tune', 'zerolatency', '-flush_packets', '1', '-f', 'mp3', 'pipe:1', @@ -108,60 +108,58 @@ def _start_transcoder_if_needed(is_mp3_input=False): ) except FileNotFoundError: _ffmpeg_proc = None - print('⚠️ ffmpeg not found; /stream.mp3 fallback disabled') + print('WARNING: ffmpeg not found; /stream.mp3 fallback disabled') return mode_str = "PASSTHROUGH (copy)" if is_mp3_input else f"TRANSCODE ({_current_bitrate})" - print(f'🎛️ ffmpeg transcoder started for /stream.mp3 ({mode_str})') + print(f'INFO: ffmpeg transcoder started ({mode_str})') - # Reset error state _transcoder_last_error = None - # Always ensure threads are running if we just started/restarted the process - # Clear the input queue to avoid old data being sent to new process + # Clear queue to avoid stale data while not _ffmpeg_in_q.empty(): try: _ffmpeg_in_q.get_nowait() except: break - def _writer(): - global _transcoder_last_error, _transcode_threads_started - print("🧵 Transcoder writer thread started") - while True: + # Define threads INSIDE so they close over THIS specific 'proc' + def _writer(proc): + global _transcoder_last_error + print(f"[THREAD] Transcoder writer started (PID: {proc.pid})") + while proc.poll() is None: try: - chunk = _ffmpeg_in_q.get(timeout=2) - if chunk is None: - break - proc = _ffmpeg_proc - if proc is None or proc.stdin is None or proc.poll() is not None: - continue - proc.stdin.write(chunk) - proc.stdin.flush() + chunk = _ffmpeg_in_q.get(timeout=1.0) + if chunk is None: break + + if proc.stdin: + proc.stdin.write(chunk) + proc.stdin.flush() except queue.Empty: - if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None: - break continue - except Exception as e: - if _ffmpeg_proc is not None: - print(f"⚠️ Transcoder writer error: {e}") - _transcoder_last_error = f'stdin write failed: {e}' + except (BrokenPipeError, ConnectionResetError): + _transcoder_last_error = "Broken pipe in writer" break - _transcode_threads_started = False - print("🧵 Transcoder writer thread exiting") + except Exception as e: + print(f"WARNING: Transcoder writer error: {e}") + _transcoder_last_error = str(e) + break + + # Ensure process is killed if thread exits unexpectedly + if proc.poll() is None: + try: proc.terminate() + except: pass + print(f"[THREAD] Transcoder writer finished (PID: {proc.pid})") - def _reader(): - global _transcoder_bytes_out, _transcoder_last_error, _transcode_threads_started - print("🧵 Transcoder reader thread started") - proc = _ffmpeg_proc - while proc and proc.poll() is None: + def _reader(proc): + global _transcoder_bytes_out, _transcoder_last_error + print(f"[THREAD] Transcoder reader started (PID: {proc.pid})") + while proc.poll() is None: try: # Smaller read for smoother delivery (1KB) # This prevents buffering delays at lower bitrates data = proc.stdout.read(1024) - if not data: - break + if not data: break _transcoder_bytes_out += len(data) - # Store in pre-roll with _mp3_lock: _mp3_preroll.append(data) clients = list(_mp3_clients) @@ -169,87 +167,180 @@ def _start_transcoder_if_needed(is_mp3_input=False): for q in clients: try: q.put_nowait(data) - except Exception: + except queue.Full: + # Client is too slow, skip this chunk for them pass except Exception as e: - print(f"⚠️ Transcoder reader error: {e}") - _transcoder_last_error = f'stdout read failed: {e}' + print(f"WARNING: Transcoder reader error: {e}") + _transcoder_last_error = str(e) break - _transcode_threads_started = False - print("🧵 Transcoder reader thread exiting") - if not _transcode_threads_started: - _transcode_threads_started = True - threading.Thread(target=_writer, daemon=True).start() - threading.Thread(target=_reader, daemon=True).start() + # Ensure process is killed if thread exits unexpectedly + if proc.poll() is None: + try: proc.terminate() + except: pass + print(f"[THREAD] Transcoder reader finished (PID: {proc.pid})") + + # Start greenlets/threads for THIS process specifically + eventlet.spawn(_writer, _ffmpeg_proc) + eventlet.spawn(_reader, _ffmpeg_proc) def _stop_transcoder(): - global _ffmpeg_proc, _transcode_threads_started - try: - _ffmpeg_in_q.put_nowait(None) - except Exception: - pass + global _ffmpeg_proc + print("STOPPING: Transcoder process") + + # Signal threads to stop via the queue + try: _ffmpeg_in_q.put_nowait(None) + except: pass + # Shutdown the process proc = _ffmpeg_proc _ffmpeg_proc = None - # Reset thread flag so they can be re-launched if needed - # (The existing threads will exit cleanly on None/EOF) - _transcode_threads_started = False - _mp3_preroll.clear() - - if proc is None: - return - - # Signal all listening clients to finish their stream + if proc: + try: + proc.terminate() + # Drain stdout/stderr to satisfy OS buffers + proc.communicate(timeout=1.0) + except: + try: proc.kill() + except: pass + + # Clear client state with _mp3_lock: clients = list(_mp3_clients) for q in clients: - try: - q.put_nowait(None) - except: - pass + try: q.put_nowait(None) + except: pass _mp3_clients.clear() - - try: - proc.terminate() - except Exception: - pass + _mp3_preroll.clear() def _feed_transcoder(data: bytes): global _last_audio_chunk_ts if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None: - return + # If active but dead, restart it automatically + if broadcast_state.get('active'): + _start_transcoder_if_needed(is_mp3_input=broadcast_state.get('is_mp3_input', False)) + else: + return + _last_audio_chunk_ts = time.time() try: _ffmpeg_in_q.put_nowait(data) - except Exception: - # Queue full; drop to keep latency bounded. + except queue.Full: + # Drop chunk if overflow to prevent memory bloat pass -MUSIC_FOLDER = "music" +# Load settings to get MUSIC_FOLDER +def _load_settings(): + try: + if os.path.exists('settings.json'): + with open('settings.json', 'r', encoding='utf-8') as f: + return json.load(f) + except: + pass + return {} + +SETTINGS = _load_settings() +MUSIC_FOLDER = SETTINGS.get('library', {}).get('music_folder', 'music') + # Ensure music folder exists if not os.path.exists(MUSIC_FOLDER): - os.makedirs(MUSIC_FOLDER) + try: + os.makedirs(MUSIC_FOLDER) + except: + # Fallback to default if custom path fails + MUSIC_FOLDER = "music" + if not os.path.exists(MUSIC_FOLDER): + os.makedirs(MUSIC_FOLDER) # Helper for shared routes def setup_shared_routes(app): @app.route('/library.json') def get_library(): library = [] + global MUSIC_FOLDER if os.path.exists(MUSIC_FOLDER): - for filename in sorted(os.listdir(MUSIC_FOLDER)): - if filename.lower().endswith(('.mp3', '.m4a', '.wav', '.flac', '.ogg')): - library.append({ - "title": os.path.splitext(filename)[0], - "file": f"music/{filename}" - }) + # Recursively find music files if desired, or stay top-level. + # The prompt says "choose which folder", so maybe top-level of that folder is fine. + for root, dirs, files in os.walk(MUSIC_FOLDER): + for filename in sorted(files): + if filename.lower().endswith(('.mp3', '.m4a', '.wav', '.flac', '.ogg')): + rel_path = os.path.relpath(os.path.join(root, filename), MUSIC_FOLDER) + library.append({ + "title": os.path.splitext(filename)[0], + "file": f"music_proxy/{rel_path}" + }) + break # Only top level for now to keep it simple, or remove break for recursive return jsonify(library) + @app.route('/music_proxy/') + def music_proxy(filename): + return send_from_directory(MUSIC_FOLDER, filename) + + @app.route('/browse_directories', methods=['GET']) + def browse_directories(): + path = request.args.get('path', os.path.expanduser('~')) + try: + entries = [] + if os.path.exists(path) and os.path.isdir(path): + # Add parent + parent = os.path.dirname(os.path.abspath(path)) + entries.append({"name": "..", "path": parent, "isDir": True}) + + for item in sorted(os.listdir(path)): + full_path = os.path.join(path, item) + if os.path.isdir(full_path) and not item.startswith('.'): + entries.append({ + "name": item, + "path": full_path, + "isDir": True + }) + return jsonify({"success": True, "path": os.path.abspath(path), "entries": entries}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}), 500 + + @app.route('/update_settings', methods=['POST']) + def update_settings(): + try: + data = request.get_json() + # Load existing + settings = _load_settings() + + # Update selectively + if 'library' not in settings: settings['library'] = {} + if 'music_folder' in data.get('library', {}): + new_folder = data['library']['music_folder'] + if os.path.exists(new_folder) and os.path.isdir(new_folder): + settings['library']['music_folder'] = new_folder + global MUSIC_FOLDER + MUSIC_FOLDER = new_folder + else: + return jsonify({"success": False, "error": "Invalid folder path"}), 400 + + with open('settings.json', 'w', encoding='utf-8') as f: + json.dump(settings, f, indent=4) + + return jsonify({"success": True}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}), 500 + @app.route('/') def serve_static(filename): + # Block access to sensitive files + blocked = ('.py', '.pyc', '.env', '.json', '.sh', '.bak', '.log', '.pem', '.key') + # Allow specific safe JSON/JS/CSS files + allowed_extensions = ('.css', '.js', '.html', '.htm', '.png', '.jpg', '.jpeg', + '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf', '.eot', '.map') + if filename.endswith(blocked) and not filename.endswith(('.css', '.js')): + from flask import abort + abort(403) + # Prevent path traversal + if '..' in filename or filename.startswith('/'): + from flask import abort + abort(403) response = send_from_directory('.', filename) if filename.endswith(('.css', '.js', '.html')): response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, max-age=0' @@ -269,24 +360,26 @@ def setup_shared_routes(app): if file.filename == '': return jsonify({"success": False, "error": "No file selected"}), 400 - if not file.filename.endswith('.mp3'): - return jsonify({"success": False, "error": "Only MP3 files are allowed"}), 400 + allowed_exts = ('.mp3', '.m4a', '.wav', '.flac', '.ogg') + ext = os.path.splitext(file.filename)[1].lower() + if ext not in allowed_exts: + return jsonify({"success": False, "error": f"Supported formats: {', '.join(allowed_exts)}"}), 400 # Sanitize filename (keep extension) import re name_without_ext = os.path.splitext(file.filename)[0] name_without_ext = re.sub(r'[^\w\s-]', '', name_without_ext) - name_without_ext = re.sub(r'[-\s]+', '-', name_without_ext) - filename = f"{name_without_ext}.mp3" + name_without_ext = re.sub(r'\s+', ' ', name_without_ext).strip() + filename = f"{name_without_ext}{ext}" filepath = os.path.join(MUSIC_FOLDER, filename) try: file.save(filepath) - print(f"✅ Uploaded: {filename}") + print(f"UPLOADED: {filename}") return jsonify({"success": True, "filename": filename}) except Exception as e: - print(f"❌ Upload error: {e}") + print(f"ERROR: Upload error: {e}") return jsonify({"success": False, "error": str(e)}), 500 @app.route('/save_keymaps', methods=['POST']) @@ -295,10 +388,10 @@ def setup_shared_routes(app): data = request.get_json() with open('keymaps.json', 'w', encoding='utf-8') as f: json.dump(data, f, indent=4) - print("💾 Keymaps saved to keymaps.json") + print("SAVED: Keymaps saved to keymaps.json") return jsonify({"success": True}) except Exception as e: - print(f"❌ Save keymaps error: {e}") + print(f"ERROR: Save keymaps error: {e}") return jsonify({"success": False, "error": str(e)}), 500 @app.route('/load_keymaps', methods=['GET']) @@ -311,7 +404,7 @@ def setup_shared_routes(app): else: return jsonify({"success": True, "keymaps": None}) except Exception as e: - print(f"❌ Load keymaps error: {e}") + print(f"ERROR: Load keymaps error: {e}") return jsonify({"success": False, "error": str(e)}), 500 @app.route('/stream.mp3') @@ -321,8 +414,8 @@ def setup_shared_routes(app): if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None: return jsonify({"success": False, "error": "MP3 stream not available"}), 503 - print(f"👂 New listener joined stream (Bursting {_mp3_preroll.maxlen} frames)") - client_q: queue.Queue = queue.Queue(maxsize=100) + print(f"LISTENER: New listener joined stream (Bursting {_mp3_preroll.maxlen} frames)") + client_q: queue.Queue = queue.Queue(maxsize=500) with _mp3_lock: # Burst pre-roll to new client so they start playing instantly for chunk in _mp3_preroll: @@ -335,13 +428,20 @@ def setup_shared_routes(app): def gen(): try: while True: - chunk = client_q.get() + try: + chunk = client_q.get(timeout=30) + except queue.Empty: + # No data for 30s - check if broadcast is still active + if not broadcast_state.get('active'): + break + continue if chunk is None: break yield chunk finally: with _mp3_lock: _mp3_clients.discard(client_q) + print(f"LISTENER: Listener disconnected from stream") return Response(stream_with_context(gen()), content_type='audio/mpeg', headers={ 'Cache-Control': 'no-cache, no-store, must-revalidate', @@ -482,15 +582,15 @@ dj_socketio = SocketIO( @dj_socketio.on('connect') def dj_connect(): if DJ_AUTH_ENABLED and session.get('dj_authed') is not True: - print(f"⛔ DJ socket rejected (unauthorized): {request.sid}") + print(f"REJECTED: DJ socket rejected (unauthorized): {request.sid}") return False - print(f"🎧 DJ connected: {request.sid}") + print(f"STREAMPANEL: DJ connected: {request.sid}") dj_sids.add(request.sid) @dj_socketio.on('disconnect') def dj_disconnect(): dj_sids.discard(request.sid) - print("⚠️ DJ disconnected - broadcast will continue until manually stopped") + print("WARNING: DJ disconnected - broadcast will continue until manually stopped") def stop_broadcast_after_timeout(): """No longer used - broadcasts don't auto-stop""" @@ -500,19 +600,21 @@ def stop_broadcast_after_timeout(): def dj_start(data=None): broadcast_state['active'] = True session['is_dj'] = True - print("🎙️ Broadcast -> ACTIVE") + print("BROADCAST: ACTIVE") is_mp3_input = False if data: if 'bitrate' in data: global _current_bitrate _current_bitrate = data['bitrate'] - print(f"📡 Setting stream bitrate to: {_current_bitrate}") + print(f"BITRATE: Setting stream bitrate to: {_current_bitrate}") if data.get('format') == 'mp3': is_mp3_input = True + broadcast_state['is_mp3_input'] = is_mp3_input # Clear pre-roll for fresh start - _mp3_preroll.clear() + with _mp3_lock: + _mp3_preroll.clear() _start_transcoder_if_needed(is_mp3_input=is_mp3_input) @@ -527,16 +629,13 @@ def dj_get_listener_count(): def dj_stop(): broadcast_state['active'] = False session['is_dj'] = False - print("🛑 DJ stopped broadcasting") + print("STOPPED: DJ stopped broadcasting") _stop_transcoder() listener_socketio.emit('broadcast_stopped', namespace='/') listener_socketio.emit('stream_status', {'active': False}, namespace='/') - listener_socketio.emit('broadcast_stopped', namespace='/') - listener_socketio.emit('stream_status', {'active': False}, namespace='/') - @dj_socketio.on('audio_chunk') def dj_audio(data): # MP3-only mode: do not relay raw chunks to listeners; feed transcoder only. @@ -554,6 +653,15 @@ def dj_audio(data): listener_app = Flask(__name__, static_folder='.', static_url_path='') listener_app.config['SECRET_KEY'] = 'listener_secret' setup_shared_routes(listener_app) + +# Block write/admin endpoints on the listener server +@listener_app.before_request +def _restrict_listener_routes(): + """Prevent listeners from accessing DJ-only write endpoints.""" + blocked_paths = ('/update_settings', '/upload', '/save_keymaps', '/browse_directories') + if request.path in blocked_paths: + from flask import abort + abort(403) listener_socketio = SocketIO( listener_app, cors_allowed_origins="*", @@ -567,13 +675,13 @@ listener_socketio = SocketIO( @listener_socketio.on('connect') def listener_connect(): - print(f"👂 Listener Socket Connected: {request.sid}") + print(f"LISTENER: Listener Socket Connected: {request.sid}") @listener_socketio.on('disconnect') def listener_disconnect(): listener_sids.discard(request.sid) count = len(listener_sids) - print(f"❌ Listener left. Total: {count}") + print(f"REMOVED: Listener left. Total: {count}") # Notify BOTH namespaces listener_socketio.emit('listener_count', {'count': count}, namespace='/') dj_socketio.emit('listener_count', {'count': count}, namespace='/') @@ -583,7 +691,7 @@ def listener_join(): if request.sid not in listener_sids: listener_sids.add(request.sid) count = len(listener_sids) - print(f"👂 New listener joined. Total: {count}") + print(f"LISTENER: New listener joined. Total: {count}") listener_socketio.emit('listener_count', {'count': count}, namespace='/') dj_socketio.emit('listener_count', {'count': count}, namespace='/') @@ -594,13 +702,16 @@ def listener_get_count(): emit('listener_count', {'count': len(listener_sids)}) # DJ Panel Routes (No engine commands needed in local mode) -@dj_socketio.on('get_mixer_status') -def get_mixer_status(): - pass +def _transcoder_watchdog(): + """Periodic check to ensure the transcoder stays alive during active broadcasts.""" + while True: + if broadcast_state.get('active'): + if _ffmpeg_proc is None or _ffmpeg_proc.poll() is not None: + # Only log if it's actually dead and supposed to be alive + print("WARNING: Watchdog: Transcoder dead during active broadcast, reviving...") + _start_transcoder_if_needed(is_mp3_input=broadcast_state.get('is_mp3_input', False)) + eventlet.sleep(5) -@dj_socketio.on('audio_sync_queue') -def audio_sync_queue(data): - pass def _listener_count_sync_loop(): """Periodic background sync to ensure listener count is always accurate.""" @@ -613,20 +724,21 @@ def _listener_count_sync_loop(): if __name__ == '__main__': print("=" * 50) - print("🎧 TECHDJ PRO - DUAL PORT ARCHITECTURE") + print("TECHDJ PRO - DUAL PORT ARCHITECTURE") print("=" * 50) # Ports from environment or defaults dj_port = int(os.environ.get('DJ_PORT', 5000)) listen_port = int(os.environ.get('LISTEN_PORT', 5001)) - print(f"👉 DJ PANEL API: http://0.0.0.0:{dj_port}") - print(f"👉 LISTEN PAGE: http://0.0.0.0:{listen_port}") + print(f"URL: DJ PANEL API: http://0.0.0.0:{dj_port}") + print(f"URL: LISTEN PAGE: http://0.0.0.0:{listen_port}") print("=" * 50) # Audio engine DISABLED - print(f"✅ Local Radio server ready on ports {dj_port} & {listen_port}") + print(f"READY: Local Radio server ready on ports {dj_port} & {listen_port}") # Run both servers using eventlet's spawn eventlet.spawn(_listener_count_sync_loop) + eventlet.spawn(_transcoder_watchdog) eventlet.spawn(dj_socketio.run, dj_app, host='0.0.0.0', port=dj_port, debug=False) listener_socketio.run(listener_app, host='0.0.0.0', port=listen_port, debug=False) diff --git a/settings.json b/settings.json new file mode 100644 index 0000000..b797fd8 --- /dev/null +++ b/settings.json @@ -0,0 +1,22 @@ +{ + "shortcuts": { + "Deck A: Load": "Ctrl+L", + "Deck A: Queue": "Ctrl+Shift+L", + "Deck A: Play/Pause": "Space", + "Deck B: Load": "Ctrl+R", + "Deck B: Queue": "Ctrl+Shift+R", + "Deck B: Play/Pause": "Ctrl+Space" + }, + "audio": { + "recording_sample_rate": 48000, + "recording_format": "wav", + "stream_server_url": "http://54.37.246.24:5000" + }, + "ui": { + "neon_mode": 2 + }, + "library": { + "auto_scan": true, + "yt_default_format": "mp3" + } +} \ No newline at end of file diff --git a/style.css b/style.css index b66ae89..ed7ae3a 100644 --- a/style.css +++ b/style.css @@ -42,26 +42,36 @@ body { } body::before { - display: none !important; - /* Completely disabled to prevent UI blocking */ + content: ''; + position: fixed; + inset: 0; + pointer-events: none; + z-index: 10000; + opacity: var(--glow-opacity, 0.3); + transition: all 1s cubic-bezier(0.4, 0, 0.2, 1); } body.playing-A::before { - display: none !important; + box-shadow: inset 0 0 var(--glow-spread, 30px) var(--primary-cyan); } body.playing-B::before { - display: none !important; + box-shadow: inset 0 0 var(--glow-spread, 30px) var(--secondary-magenta); } body.playing-A.playing-B::before { - display: none !important; + box-shadow: + inset 0 0 var(--glow-spread, 30px) var(--primary-cyan), + inset 0 0 calc(var(--glow-spread, 30px) * 1.5) var(--secondary-magenta); } body.listener-glow::before { - display: none !important; + animation: pulse-listener 4s ease-in-out infinite; + z-index: 1; + /* Keep behind listener elements */ } + @keyframes pulse-listener { 0%, @@ -127,6 +137,54 @@ body.listener-glow::before { box-shadow: 0 0 30px var(--primary-cyan); } +/* MOBILE TOP BAR */ +.mobile-top-bar { + display: none; + height: 44px; + background: rgba(10, 10, 20, 0.95); + border-bottom: 1px solid rgba(0, 243, 255, 0.2); + align-items: center; + justify-content: space-between; + padding: 0 15px; + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10002; + backdrop-filter: blur(10px); +} + +.status-indicator { + display: flex; + align-items: center; + gap: 6px; + font-size: 0.7rem; + color: var(--primary-cyan); + font-family: 'Orbitron', sans-serif; +} + +.status-dot { + width: 6px; + height: 6px; + background: #00ff00; + border-radius: 50%; + box-shadow: 0 0 8px #00ff00; +} + +.app-logo { + font-family: 'Orbitron', sans-serif; + font-weight: bold; + font-size: 0.9rem; + letter-spacing: 2px; + color: #fff; +} + +.clock-display { + font-family: 'Orbitron', sans-serif; + font-size: 0.8rem; + color: var(--text-dim); +} + header { display: flex; justify-content: space-between; @@ -964,10 +1022,10 @@ input[type=range] { transform: rotate(360deg) scale(0.95); } -/* Transport Buttons - Make room for 4 buttons */ +/* Transport Buttons - Make room for 5 buttons */ .transport { display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr; + grid-template-columns: repeat(5, 1fr); gap: 8px; margin-top: 10px; } @@ -1630,26 +1688,40 @@ input[type=range] { overflow: hidden; } - /* Disable all edge glow effects on mobile */ - body::before, - body.playing-A::before, - body.playing-B::before, - body.playing-A.playing-B::before { - display: none !important; + /* Glow intensity is managed via --glow-opacity variable */ + body::before { + opacity: calc(var(--glow-opacity) * 0.5); + /* Less intense on mobile */ } - .app-container { - grid-template-columns: 1fr; - grid-template-rows: 1fr; - gap: 0; - padding: 0; - padding-bottom: 58px; - height: 100vh; - overflow: hidden; + + .mobile-top-bar { + display: flex; } .mobile-tabs { display: flex; + box-shadow: 0 -10px 40px rgba(0, 0, 0, 0.9); + } + + /* Adjust app container for top and bottom bars */ + .app-container { + grid-template-columns: 1fr; + grid-template-rows: 1fr; + gap: 0; + padding: 44px 0 58px 0 !important; + height: 100vh; + overflow: hidden; + } + + .pc-only { + display: none !important; + } + + /* Hide "RESET" and "integrated queue" on mobile decks to reduce clutter */ + .mob-hide, + .deck-queue { + display: none !important; } .library-section, @@ -1733,13 +1805,19 @@ input[type=range] { } .waveform-container { - height: 70px !important; - margin-bottom: 10px !important; - padding: 4px !important; + height: 60px !important; + margin-bottom: 8px !important; + padding: 3px !important; } .waveform-canvas { - height: 65px !important; + height: 55px !important; + } + + #viz-A, + #viz-B { + height: 50px !important; + margin-bottom: 5px !important; } .controls-grid { @@ -2773,6 +2851,11 @@ body.listening-active .landscape-prompt { display: none !important; } + /* Hide the pitch/tempo fader-group (all children hidden) */ + .controls-grid > .fader-group:last-child { + display: none !important; + } + /* Ultra-compact spacing */ .transport { gap: 4px !important; @@ -2878,8 +2961,8 @@ body.listening-active .landscape-prompt { } .volume-fader { - height: 180px !important; - width: 45px !important; + height: 100px !important; + width: 40px !important; } /* Better transport button spacing */ @@ -2898,16 +2981,16 @@ body.listening-active .landscape-prompt { @media (max-width: 768px) { - /* Even larger for phones */ + /* Slightly larger disk for tablets */ .dj-disk { - width: 200px; - height: 200px; + width: 130px; + height: 130px; } .disk-label { - width: 70px; - height: 70px; - font-size: 1.8rem; + width: 50px; + height: 50px; + font-size: 1.4rem; } /* Stack controls vertically */ @@ -2915,42 +2998,6 @@ body.listening-active .landscape-prompt { flex-direction: column; gap: 15px; } - - /* Larger crossfader */ - .crossfader-section { - padding: 20px; - } - - #crossfader { - height: 50px; - } - - /* Better EQ controls */ - .eq-controls, - .filter-controls { - gap: 15px; - } - - .eq-knob, - .filter-knob { - min-width: 80px; - } - - /* Larger speed control */ - .speed-control { - padding: 15px; - } - - .speed-slider { - height: 50px; - } - - /* Better pitch bend buttons */ - .pitch-bend-controls button { - min-width: 60px; - min-height: 50px; - font-size: 1.2rem; - } } @media (max-width: 480px) { @@ -3265,24 +3312,13 @@ body.listening-active .landscape-prompt { font-size: 1.2rem !important; } - /* Completely disable edge border effects */ + /* Atmosphere adjustments for landscape */ body::before { - display: none !important; - } - - body.playing-A::before { - display: none !important; - } - - body.playing-B::before { - display: none !important; - } - - body.playing-A.playing-B::before { - display: none !important; + opacity: var(--glow-opacity); } } + /* Extra compact for very small landscape screens (phones) */ @media (max-width: 768px) and (orientation: landscape) { .deck-header { @@ -3401,157 +3437,260 @@ body.listening-active .landscape-prompt { height: 100vh !important; overflow: hidden !important; background: #050510 !important; - padding: 0 !important; + padding: 44px 0 58px 0 !important; /* top bar + bottom tabs */ } - /* Restore and clean up tab system */ + /* Clean tab system */ .mobile-tabs { display: flex !important; position: fixed !important; bottom: 0 !important; left: 0 !important; right: 0 !important; - height: 65px !important; - background: #000 !important; + height: 58px !important; + background: rgba(5, 5, 16, 0.98) !important; border-top: 2px solid #222 !important; z-index: 1000 !important; justify-content: space-around !important; - padding: 5px !important; + padding: 4px 2px !important; + backdrop-filter: blur(15px) !important; } - /* Hide sections by default, show when active class is present */ + /* Hide sections by default */ .library-section, .deck, .queue-section { display: none !important; - flex: 1 !important; width: 100% !important; flex-direction: column !important; - padding: 15px !important; overflow-y: auto !important; } + /* Show active sections */ .library-section.active, - .deck.active { + .deck.active, + .queue-section.active { display: flex !important; - } - - /* Library Page Enhancements */ - .lib-mode-toggle { - display: flex !important; - gap: 10px !important; - margin-bottom: 15px !important; - } - - .lib-mode-toggle .mode-btn { flex: 1 !important; - padding: 10px !important; - background: rgba(255, 255, 255, 0.05) !important; - border: 1px solid #333 !important; - color: #888 !important; - border-radius: 8px !important; - font-family: 'Orbitron', sans-serif !important; + } + + /* ---- LIBRARY compact ---- */ + .library-section { + padding: 6px !important; + } + + .lib-header { + padding: 6px !important; + gap: 5px !important; + } + + .lib-header input { + padding: 8px !important; + font-size: 0.85rem !important; + } + + .track-row { + padding: 8px 10px !important; + margin-bottom: 4px !important; + min-height: 44px; + } + + .track-name { font-size: 0.8rem !important; - cursor: pointer !important; + max-width: 55% !important; } - .lib-mode-toggle .mode-btn.active { - background: rgba(0, 243, 255, 0.15) !important; - border-color: var(--primary-cyan) !important; - color: var(--primary-cyan) !important; - box-shadow: 0 0 10px rgba(0, 243, 255, 0.2) !important; + .load-btn { + font-size: 0.6rem !important; + padding: 4px 6px !important; + min-height: 32px; } - /* Deck Page Enhancements - Focus mode */ + /* ---- DECK compact layout ---- */ .deck { - padding-bottom: 160px !important; - /* Space for crossfader + tabs */ + padding: 8px 10px !important; + padding-bottom: 10px !important; + gap: 0 !important; + border: none !important; + box-shadow: none !important; + border-radius: 0 !important; + } + + .deck-header { + padding: 4px 8px !important; + margin-bottom: 4px !important; } .deck-title { - font-size: 1rem !important; - margin-bottom: 15px !important; + font-size: 0.9rem !important; } + .track-display { + font-size: 0.75rem !important; + max-width: 60% !important; + } + + /* Compact waveform */ .waveform-container { - height: 120px !important; - margin-bottom: 15px !important; + height: auto !important; + margin-bottom: 4px !important; + padding: 3px !important; border: 1px solid rgba(255, 255, 255, 0.1) !important; } .waveform-canvas { - height: 100px !important; + height: 50px !important; } + .time-display { + font-size: 0.7rem !important; + margin-top: 2px !important; + } + + /* Compact disk */ .disk-container { display: flex !important; justify-content: center !important; - margin: 20px 0 !important; + margin: 6px 0 !important; } .dj-disk { - width: 180px !important; - height: 180px !important; - border-width: 6px !important; + width: 100px !important; + height: 100px !important; + border-width: 3px !important; } .disk-label { - width: 60px !important; - height: 60px !important; - font-size: 1.5rem !important; + width: 38px !important; + height: 38px !important; + font-size: 1.1rem !important; } - /* Transport buttons for focused deck */ - .transport { - display: grid !important; - grid-template-columns: 1fr 1fr !important; - gap: 12px !important; - margin-top: 15px !important; - } - - .big-btn { - min-height: 55px !important; - font-size: 0.9rem !important; - } - - /* Fixed Crossfader at bottom, above tabs */ - .mixer-section { - display: flex !important; - height: 70px !important; - padding: 10px 40px !important; - background: #050510 !important; - border-top: 1px solid #222 !important; - position: fixed !important; - bottom: 65px !important; - left: 0 !important; - right: 0 !important; - z-index: 100 !important; - backdrop-filter: blur(10px) !important; - } - - /* Hidden elements for clean feel */ + /* Hide non-essential controls */ .hot-cues, .loop-controls, .auto-loop-controls, .eq-container, .filter-knobs, .pitch-bend-buttons, + .speed-slider, canvas#viz-A, canvas#viz-B { display: none !important; } - /* Navigation button adjustments */ - .settings-btn, - .streaming-btn, - .upload-btn, - .keyboard-btn { - bottom: 150px !important; - width: 45px !important; - height: 45px !important; + /* Hide the pitch/tempo fader-group (children are all hidden) */ + .controls-grid > .fader-group:last-child { + display: none !important; } - /* Hide the library toggle button - we're using tabs now */ + /* Volume control - compact horizontal */ + .controls-grid { + display: flex !important; + flex-direction: row !important; + align-items: center !important; + gap: 8px !important; + margin: 6px 0 !important; + padding: 6px 10px !important; + background: rgba(0, 0, 0, 0.2) !important; + border-radius: 6px !important; + } + + .fader-group { + display: flex !important; + flex-direction: row !important; + align-items: center !important; + gap: 10px !important; + flex: 1 !important; + } + + .fader-group label { + font-size: 0.65rem !important; + margin-bottom: 0 !important; + white-space: nowrap !important; + color: var(--text-dim) !important; + letter-spacing: 1px !important; + } + + .volume-fader { + writing-mode: horizontal-tb !important; + -webkit-appearance: none !important; + appearance: auto !important; + width: 100% !important; + height: 28px !important; + flex: 1 !important; + } + + /* Transport - single row of 4 buttons */ + .transport { + display: grid !important; + grid-template-columns: repeat(4, 1fr) !important; + gap: 4px !important; + margin-top: 6px !important; + } + + .big-btn { + min-height: 40px !important; + font-size: 0.75rem !important; + padding: 8px 2px !important; + border-radius: 6px !important; + } + + /* Inline crossfader (not fixed) */ + .mixer-section { + display: none !important; + position: relative !important; + height: auto !important; + min-height: 44px !important; + padding: 8px 20px !important; + background: rgba(0, 0, 0, 0.3) !important; + border-top: 1px solid rgba(255, 255, 255, 0.1) !important; + border-bottom: none !important; + border-left: none !important; + border-right: none !important; + border-radius: 0 !important; + flex-shrink: 0 !important; + margin: 4px 0 0 0 !important; + left: auto !important; + right: auto !important; + bottom: auto !important; + transform: none !important; + max-width: 100% !important; + width: 100% !important; + z-index: auto !important; + } + + .app-container.show-deck-A .mixer-section, + .app-container.show-deck-B .mixer-section { + display: flex !important; + } + + .mixer-section::before { + font-size: 0.9rem !important; + left: 6px !important; + } + + .mixer-section::after { + font-size: 0.9rem !important; + right: 6px !important; + } + + .xfader::-webkit-slider-thumb { + width: 44px !important; + height: 28px !important; + } + + .xfader::-moz-range-thumb { + width: 44px !important; + height: 28px !important; + } + + /* Queue sections */ + .queue-section { + padding: 10px !important; + } + + /* Hide the library toggle button - tabs handle it */ .library-toggle-mob { display: none !important; } @@ -3836,28 +3975,7 @@ body.listening-active .landscape-prompt { KEYBOARD SETTINGS PANEL ========================================== */ -.keyboard-mapping-item { - display: flex; - align-items: center; - gap: 15px; - padding: 12px; - margin-bottom: 8px; - background: rgba(255, 255, 255, 0.03); - border-radius: 6px; - border-left: 3px solid transparent; - transition: all 0.2s; -} - -.keyboard-mapping-item:hover { - background: rgba(255, 255, 255, 0.06); - border-left-color: #0ff; -} - -.keyboard-mapping-item.listening { - background: rgba(255, 255, 0, 0.1); - border-left-color: #ff0; - animation: pulse 1s infinite; -} +/* keyboard-mapping-item: grid layout defined earlier in settings panel section */ .key-display { font-family: 'Orbitron', monospace; @@ -4187,20 +4305,7 @@ body.listening-active .landscape-prompt { RESPONSIVE CROSSFADER WIDTH ========================================== */ -/* Portrait mode - narrower crossfader */ -@media (max-width: 1024px) and (orientation: portrait) { - .mixer-section { - padding: 10px 20px !important; - max-width: 70% !important; - margin: 0 auto !important; - left: 50% !important; - transform: translateX(-50%); - } - - .xfader { - width: 100% !important; - } -} +/* Portrait mode - inline crossfader (handled in portrait section above) */ /* Landscape mode - wider crossfader */ @media (max-width: 1024px) and (orientation: landscape) { @@ -4254,35 +4359,32 @@ body.listening-active .landscape-prompt { } } -/* Extra small screens - stack buttons vertically on right side */ +/* Extra small screens - compact adjustments */ @media (max-width: 480px) { - .keyboard-btn, - .streaming-btn, - .upload-btn, - .settings-btn { - right: 10px !important; - width: 45px !important; - height: 45px !important; - font-size: 0.8rem !important; + .track-name { + font-size: 0.75rem !important; + max-width: 50% !important; } - .keyboard-btn { - bottom: 250px !important; + .load-btn { + font-size: 0.55rem !important; + padding: 3px 5px !important; } - .streaming-btn { - bottom: 195px !important; + .fab-main { + width: 50px !important; + height: 50px !important; + font-size: 1.2rem !important; } - .upload-btn { - bottom: 140px !important; - } - - .settings-btn { - bottom: 85px !important; + .fab-item { + width: 42px !important; + height: 42px !important; + font-size: 0.6rem !important; } } + /* ========================================== */ /* INTEGRATED DECK QUEUE & LOOP TRACK */ /* ========================================== */ @@ -4299,8 +4401,13 @@ body.listening-active .landscape-prompt { transition: all 0.3s ease; } -#deck-A .deck-queue { border-color: rgba(0, 243, 255, 0.3); } -#deck-B .deck-queue { border-color: rgba(188, 19, 254, 0.3); } +#deck-A .deck-queue { + border-color: rgba(0, 243, 255, 0.3); +} + +#deck-B .deck-queue { + border-color: rgba(188, 19, 254, 0.3); +} .queue-header { background: rgba(255, 255, 255, 0.05); @@ -4375,17 +4482,15 @@ body.listening-active .landscape-prompt { font-size: 0.75rem; } -.deck-queue .queue-load-btn, +.deck-queue .queue-load-btn, .deck-queue .queue-remove-btn { padding: 2px 5px; font-size: 0.7rem; } -/* Mobile specific for integrated queue */ @media (max-width: 1024px) { .deck-queue { - max-height: none; - margin: 15px 0; + display: none !important; } } @@ -4408,3 +4513,251 @@ body.listening-active .landscape-prompt { opacity: 0.4; cursor: grabbing; } + +/* FAB CONTAINER FOR MOBILE */ +.fab-container { + display: none; + position: fixed; + bottom: 68px; + right: 12px; + z-index: 10004; +} + +@media (max-width: 1024px) { + .fab-container { + display: block; + } +} + +.fab-main { + width: 60px; + height: 60px; + background: var(--primary-cyan); + border: none; + border-radius: 50%; + color: #000; + font-size: 1.5rem; + cursor: pointer; + box-shadow: 0 4px 20px rgba(0, 243, 255, 0.5); + transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); + display: flex; + align-items: center; + justify-content: center; +} + +.fab-main.active { + transform: rotate(90deg); + background: #fff; +} + +.fab-menu { + position: absolute; + bottom: 70px; + right: 0; + display: flex; + flex-direction: column; + gap: 12px; + pointer-events: none; + opacity: 0; + transform: translateY(20px) scale(0.8); + transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); +} + +.fab-menu.active { + pointer-events: all; + opacity: 1; + transform: translateY(0) scale(1); +} + +.fab-item { + width: 50px; + height: 50px; + background: rgba(20, 20, 30, 0.95); + border: 2px solid var(--primary-cyan); + border-radius: 50%; + color: var(--primary-cyan); + font-family: 'Orbitron', sans-serif; + font-size: 0.7rem; + font-weight: bold; + cursor: pointer; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5); + transition: all 0.2s; +} + +.fab-item:hover { + background: var(--primary-cyan); + color: #000; +} +/* Upload Progress Styles */ +.upload-progress-container { + position: fixed; + bottom: 20px; + right: 20px; + width: 300px; + background: rgba(10, 10, 20, 0.9); + border: 2px solid var(--primary-cyan); + border-radius: 12px; + padding: 15px; + z-index: 10005; + box-shadow: 0 0 30px rgba(0, 243, 255, 0.3); + display: none; + backdrop-filter: blur(10px); +} + +.upload-progress-container.active { + display: block; + animation: slideUp 0.3s ease-out; +} + +@keyframes slideUp { + from { transform: translateY(100px); opacity: 0; } + to { transform: translateY(0); opacity: 1; } +} + +.upload-progress-container h3 { + margin: 0 0 10px 0; + font-family: 'Orbitron', sans-serif; + font-size: 0.9rem; + color: var(--primary-cyan); + letter-spacing: 1px; +} + +.upload-progress-row { + margin-bottom: 10px; +} + +.upload-progress-row span { + display: block; + font-size: 0.75rem; + margin-bottom: 4px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.progress-bar-wrap { + height: 6px; + background: rgba(255, 255, 255, 0.1); + border-radius: 3px; + overflow: hidden; +} + +.progress-bar-inner { + height: 100%; + background: var(--primary-cyan); + box-shadow: 0 0 10px var(--primary-cyan); + transition: width 0.1s linear; +} + +/* Modal / Folder Picker Styles */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.85); + display: none; + justify-content: center; + align-items: center; + z-index: 10010; + backdrop-filter: blur(5px); +} + +.modal-overlay.active { + display: flex; +} + +.modal-card { + background: #151525; + border: 2px solid var(--secondary-magenta); + border-radius: 16px; + width: 90%; + max-width: 500px; + max-height: 80vh; + display: flex; + flex-direction: column; + box-shadow: 0 0 50px rgba(188, 19, 254, 0.3); +} + +.modal-header { + padding: 20px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + display: flex; + justify-content: space-between; + align-items: center; +} + +.modal-header span { + font-family: 'Orbitron', sans-serif; + color: var(--secondary-magenta); + letter-spacing: 2px; +} + +.modal-header button { + background: none; + border: none; + color: #888; + font-size: 1.5rem; + cursor: pointer; +} + +.modal-body { + flex: 1; + overflow-y: auto; + padding: 20px; +} + +.path-nav { + display: flex; + gap: 10px; + margin-bottom: 15px; +} + +.path-nav input { + flex: 1; + background: rgba(0, 0, 0, 0.3); + border: 1px solid #444; + color: #eee; + padding: 8px; + border-radius: 4px; + font-size: 0.8rem; +} + +.dir-list { + display: flex; + flex-direction: column; + gap: 5px; +} + +.dir-entry { + padding: 10px; + background: rgba(255, 255, 255, 0.03); + border-radius: 6px; + cursor: pointer; + transition: 0.2s; +} + +.dir-entry:hover { + background: rgba(188, 19, 254, 0.15); + color: var(--secondary-magenta); +} + +.modal-footer { + padding: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.1); + text-align: right; +} + +.folder-btn { + background: rgba(188, 19, 254, 0.1); + border: 1px solid var(--secondary-magenta); + color: var(--secondary-magenta); + border-radius: 4px; + padding: 8px 12px; + cursor: pointer; + font-size: 1.2rem; + transition: all 0.3s; +} + +.folder-btn:hover { + background: rgba(188, 19, 254, 0.2); + box-shadow: 0 0 10px rgba(188, 19, 254, 0.4); +} diff --git a/techdj_qt.py b/techdj_qt.py index 828a3cf..8a227fc 100644 --- a/techdj_qt.py +++ b/techdj_qt.py @@ -1,431 +1,114 @@ #!/usr/bin/env python3 -""" -TechDJ - PyQt5 Native DJ Application -Pixel-perfect replica of the web DJ panel with neon aesthetic -""" - import sys import os import json -import requests -import numpy as np -import sounddevice as sd -import soundfile as sf -from pathlib import Path -from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, - QPushButton, QLabel, QSlider, QListWidget, QListWidgetItem, - QLineEdit, QFrame, QSplitter, QProgressBar, QMessageBox, - QDialog, QGridLayout, QCheckBox, QComboBox, QFileDialog) -from PyQt5.QtCore import Qt, QTimer, pyqtSignal, QThread, QRectF, QPropertyAnimation, QEasingCurve, QProcess, QSize -import re -from PyQt5.QtGui import (QPainter, QColor, QPen, QFont, QLinearGradient, - QRadialGradient, QBrush, QPainterPath, QFontDatabase, QIcon) -import socketio -import queue -import subprocess +import random +import math import time -import threading -from scipy import signal +import shutil +import requests +import re +import socketio +import subprocess +from pathlib import Path +import soundfile as sf +# --- BACKEND OVERRIDE --- +# On Linux, GStreamer (default) often miscalculates MP3 duration for VBR files. +# FFmpeg backend is much more reliable if available. +os.environ["QT_MULTIMEDIA_BACKEND"] = "ffmpeg" -# Color constants matching web panel -BG_DARK = QColor(10, 10, 18) -PANEL_BG = QColor(20, 20, 30, 204) # 0.8 alpha -PRIMARY_CYAN = QColor(0, 243, 255) -SECONDARY_MAGENTA = QColor(188, 19, 254) -TEXT_MAIN = QColor(224, 224, 224) -TEXT_DIM = QColor(136, 136, 136) +# --- DEPENDENCY CHECK --- +try: + import yt_dlp + HAS_YTDLP = True +except ImportError: + HAS_YTDLP = False + print("CRITICAL: yt-dlp not found. Run 'pip install yt-dlp'") +from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, + QHBoxLayout, QPushButton, QSlider, QLabel, + QListWidget, QGroupBox, QListWidgetItem, + QLineEdit, QGridLayout, QAbstractItemView, + QDialog, QMessageBox, QFrame, QComboBox, QProgressBar, + QTableWidget, QTableWidgetItem, QHeaderView, QTabWidget, + QCheckBox, QSpinBox, QFileDialog) +from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput +from PyQt6.QtCore import Qt, QUrl, QTimer, QPointF, QRectF, pyqtSignal, QProcess, QThread +from PyQt6.QtGui import QPainter, QColor, QPen, QBrush, QKeySequence, QIcon, QRadialGradient, QPainterPath, QShortcut -class AudioEngine: - """Efficient local audio processing engine""" - - def __init__(self): - self.decks = { - 'A': { - 'audio_data': None, - 'sample_rate': 44100, - 'position': 0, - 'playing': False, - 'volume': 0.8, - 'speed': 1.0, - 'eq': {'low': 0, 'mid': 0, 'high': 0}, - 'filters': {'lowpass': 100, 'highpass': 0}, - 'duration': 0, - 'filename': None, - 'cues': {}, - 'loop_start': None, - 'loop_end': None, - 'loop_active': False, - 'repeat': False, - 'queue': [], - 'needs_next_track': False, - }, - 'B': { - 'audio_data': None, - 'sample_rate': 44100, - 'position': 0, - 'playing': False, - 'volume': 0.8, - 'speed': 1.0, - 'eq': {'low': 0, 'mid': 0, 'high': 0}, - 'filters': {'lowpass': 100, 'highpass': 0}, - 'duration': 0, - 'filename': None, - 'cues': {}, - 'loop_start': None, - 'loop_end': None, - 'loop_active': False, - 'repeat': False, - 'queue': [], - 'needs_next_track': False, - } - } - - self.crossfader = 0.5 - self.master_volume = 0.8 - self.stream = None - self.running = False - self.broadcast_queue = queue.Queue(maxsize=100) - self.is_broadcasting = False - self.lock = threading.Lock() - - # Filter states for each deck [deck_id][filter_name][channel] - self._filter_states = { - 'A': { - 'low': [np.zeros(2), np.zeros(2)], - 'mid': [np.zeros(2), np.zeros(2)], - 'high': [np.zeros(2), np.zeros(2)], - 'lp': [np.zeros(2), np.zeros(2)], - 'hp': [np.zeros(2), np.zeros(2)] - }, - 'B': { - 'low': [np.zeros(2), np.zeros(2)], - 'mid': [np.zeros(2), np.zeros(2)], - 'high': [np.zeros(2), np.zeros(2)], - 'lp': [np.zeros(2), np.zeros(2)], - 'hp': [np.zeros(2), np.zeros(2)] - } - } - - # Pre-calculated filter coefficients - self._filter_coeffs = {} - self._init_filters() - - # Pre-allocate reuse buffers for the audio thread - self._target_indices = np.arange(2048, dtype=np.float32) # Matches blocksize - - def _init_filters(self): - """Pre-calculate coefficients for standard bands""" - sr = 44100 - # Use standard pass filters for initialization - self._filter_coeffs['low'] = signal.butter(1, 300 / (sr/2), 'low') - self._filter_coeffs['mid'] = signal.butter(1, [400 / (sr/2), 3500 / (sr/2)], 'bandpass') - self._filter_coeffs['high'] = signal.butter(1, 4000 / (sr/2), 'high') +# --- CONFIGURATION --- +DEFAULT_BPM = 124 +ANIMATION_FPS = 30 +ANIMATION_INTERVAL = 1000 // ANIMATION_FPS # ms between animation frames +LOOP_CHECK_INTERVAL = 20 # ms between loop boundary checks +MS_PER_MINUTE = 60000 +NUM_EQ_BANDS = 3 +MAX_SLIDER_VALUE = 100 - def _apply_processing(self, deck_id, chunk): - """Apply EQ and Filters to the audio chunk""" - sr = 44100 - deck = self.decks[deck_id] - states = self._filter_states[deck_id] - - # 1. Apply EQ (Gain-based) - # We use a simple gain filter approximation for performance - low_gain = 10**(deck['eq']['low'] / 20.0) - mid_gain = 10**(deck['eq']['mid'] / 20.0) - high_gain = 10**(deck['eq']['high'] / 20.0) - - if low_gain != 1.0 or mid_gain != 1.0 or high_gain != 1.0: - # Simple gain scaling for demo; real biquads are better but more CPU intensive in Python - # For now, let's use a simple 3-band gain model - # Re-implementing as basic biquads for "Pro" feel - for ch in range(2): - # Low Shelf - b, a = signal.butter(1, 300/(sr/2), 'lowshelf') - # Adjust b for gain: b_gain = [b[0]*G, b[1]]? No, standard biquad gain is better - # But Scipy's butter doesn't take gain. We'll use a simpler approach for now: - # Multiply signal by gain factors for the specific bands. - pass - - # Simplified "Musical" EQ: - # We'll just apply the filters and sum them with gains - # This is more robust than chaining biquads for a high-level API - pass - - # Since proper IIR chaining is complex in a Python loop, we'll implement - # a high-performance resonance filter for LP/HP which is the most audible - - try: - # Low Pass Filter - lp_val = deck['filters']['lowpass'] # 0-100 - if lp_val < 100: - freq = max(50, 20000 * (lp_val / 100.0)**2) - b, a = signal.butter(1, freq / (sr/2), 'low') - for ch in range(2): - chunk[:, ch], states['lp'][ch] = signal.lfilter(b, a, chunk[:, ch], zi=states['lp'][ch]) - - # High Pass Filter - hp_val = deck['filters']['highpass'] # 0-100 - if hp_val > 0: - freq = max(20, 15000 * (hp_val / 100.0)**2) - b, a = signal.butter(1, freq / (sr/2), 'high') - for ch in range(2): - chunk[:, ch], states['hp'][ch] = signal.lfilter(b, a, chunk[:, ch], zi=states['hp'][ch]) - except Exception as e: - # Fallback if filter design fails due to extreme values - print(f"Filter processing error: {e}") - pass - - # EQ Gain (Simple multiplier for now to ensure sliders "do something") - combined_eq_gain = (low_gain + mid_gain + high_gain) / 3.0 - return chunk * combined_eq_gain - - def start_stream(self): - if self.stream is not None: - return - self.running = True - self.stream = sd.OutputStream( - channels=2, - samplerate=44100, - blocksize=2048, - callback=self._audio_callback - ) - self.stream.start() - print("🎵 Audio stream started") - - def stop_stream(self): - self.running = False - if self.stream: - self.stream.stop() - self.stream.close() - self.stream = None - - def _audio_callback(self, outdata, frames, time_info, status): - output = np.zeros((frames, 2), dtype=np.float32) - output_samplerate = 44100 - - with self.lock: - for deck_id in ['A', 'B']: - deck = self.decks[deck_id] - - if not deck['playing'] or deck['audio_data'] is None: - continue - - # Calculate source indices via linear interpolation - rate_ratio = deck['sample_rate'] / output_samplerate - step = rate_ratio * deck['speed'] - - # Start and end in source domain - src_start = deck['position'] - num_src_samples_needed = frames * step - src_end = src_start + num_src_samples_needed - - # Bounds check - if src_start >= len(deck['audio_data']) - 1: - deck['playing'] = False - continue - - # Prepare source data - # Ensure we don't read past the end - read_end = int(np.ceil(src_end)) + 1 - if read_end > len(deck['audio_data']): - read_end = len(deck['audio_data']) - - src_chunk = deck['audio_data'][int(src_start):read_end] - - if len(src_chunk) < 2: - deck['playing'] = False - continue - - if src_chunk.ndim == 1: - src_chunk = np.column_stack((src_chunk, src_chunk)) - - # Time indices for interpolation - if len(self._target_indices) != frames: - self._target_indices = np.arange(frames, dtype=np.float32) - - x_target = self._target_indices * step - x_source = np.arange(len(src_chunk)) - - # Interp each channel - try: - resampled_l = np.interp(x_target, x_source, src_chunk[:, 0]) - resampled_r = np.interp(x_target, x_source, src_chunk[:, 1]) - chunk = np.column_stack((resampled_l, resampled_r)) - - # Apply processing (EQ and Filters) - chunk = self._apply_processing(deck_id, chunk) - - chunk = chunk * deck['volume'] - - if deck_id == 'A': - chunk = chunk * (1.0 - self.crossfader) - else: - chunk = chunk * self.crossfader - - output += chunk - - # Update position - deck['position'] += num_src_samples_needed - except Exception as e: - print(f"Audio thread error in interp: {e}") - deck['playing'] = False - continue - - # Handle looping - if deck['loop_active'] and deck['loop_start'] is not None and deck['loop_end'] is not None: - loop_start_frame = deck['loop_start'] * deck['sample_rate'] - loop_end_frame = deck['loop_end'] * deck['sample_rate'] - - if deck['position'] >= loop_end_frame: - deck['position'] = loop_start_frame + (deck['position'] - loop_end_frame) - - # Auto-stop at end - if deck['position'] >= len(deck['audio_data']): - if deck['repeat']: - # Loop current track - deck['position'] = 0 - elif len(deck['queue']) > 0: - # Mark that we need to load next track - # Can't load here (wrong thread), UI will handle it - deck['playing'] = False - deck['needs_next_track'] = True - else: - deck['playing'] = False - - output = output * self.master_volume - outdata[:] = output - - # Capture for broadcast - if self.is_broadcasting: - try: - self.broadcast_queue.put_nowait(output.tobytes()) - except queue.Full: - pass - - def load_track(self, deck_id, filepath): - try: - audio_data, sample_rate = sf.read(filepath, dtype='float32') - with self.lock: - self.decks[deck_id]['audio_data'] = audio_data - self.decks[deck_id]['sample_rate'] = sample_rate - self.decks[deck_id]['position'] = 0 - self.decks[deck_id]['duration'] = len(audio_data) / sample_rate - self.decks[deck_id]['filename'] = os.path.basename(filepath) - print(f"✅ Loaded {os.path.basename(filepath)} to Deck {deck_id}") - return True - except Exception as e: - print(f"❌ Error loading {filepath}: {e}") - return False - - def play(self, deck_id): - with self.lock: - if self.decks[deck_id]['audio_data'] is not None: - self.decks[deck_id]['playing'] = True - - def pause(self, deck_id): - with self.lock: - self.decks[deck_id]['playing'] = False - - def seek(self, deck_id, position_seconds): - with self.lock: - deck = self.decks[deck_id] - if deck['audio_data'] is not None: - deck['position'] = int(position_seconds * deck['sample_rate']) - - def set_volume(self, deck_id, volume): - with self.lock: - self.decks[deck_id]['volume'] = max(0.0, min(1.0, volume)) - - def set_speed(self, deck_id, speed): - with self.lock: - self.decks[deck_id]['speed'] = max(0.5, min(1.5, speed)) - - def set_crossfader(self, value): - with self.lock: - self.crossfader = max(0.0, min(1.0, value)) - - def get_position(self, deck_id): - with self.lock: - deck = self.decks[deck_id] - if deck['audio_data'] is not None: - return deck['position'] / deck['sample_rate'] - return 0.0 - - def set_cue(self, deck_id, cue_num): - position = self.get_position(deck_id) - with self.lock: - self.decks[deck_id]['cues'][cue_num] = position - - def jump_to_cue(self, deck_id, cue_num): - with self.lock: - if cue_num in self.decks[deck_id]['cues']: - position = self.decks[deck_id]['cues'][cue_num] - self.seek(deck_id, position) - - def set_eq(self, deck_id, band, value): - with self.lock: - self.decks[deck_id]['eq'][band] = value - - def set_filter(self, deck_id, filter_type, value): - with self.lock: - self.decks[deck_id]['filters'][filter_type] = value - - def set_repeat(self, deck_id, enabled): - """Toggle repeat/loop for a deck""" - with self.lock: - self.decks[deck_id]['repeat'] = enabled - - def set_loop_in(self, deck_id): - position = self.get_position(deck_id) - with self.lock: - self.decks[deck_id]['loop_start'] = position - # If we already have an end, activate loop - if self.decks[deck_id]['loop_end'] is not None: - self.decks[deck_id]['loop_active'] = True - - def set_loop_out(self, deck_id): - position = self.get_position(deck_id) - with self.lock: - self.decks[deck_id]['loop_end'] = position - # If we already have a start, activate loop - if self.decks[deck_id]['loop_start'] is not None: - self.decks[deck_id]['loop_active'] = True - - def exit_loop(self, deck_id): - with self.lock: - self.decks[deck_id]['loop_active'] = False - self.decks[deck_id]['loop_start'] = None - self.decks[deck_id]['loop_end'] = None - - def add_to_queue(self, deck_id, filepath): - """Add track to deck's queue""" - with self.lock: - self.decks[deck_id]['queue'].append(filepath) - - def remove_from_queue(self, deck_id, index): - """Remove track from queue by index""" - with self.lock: - if 0 <= index < len(self.decks[deck_id]['queue']): - self.decks[deck_id]['queue'].pop(index) - - def clear_queue(self, deck_id): - """Clear all tracks from queue""" - with self.lock: - self.decks[deck_id]['queue'].clear() - - def get_queue(self, deck_id): - """Get current queue (returns a copy)""" - with self.lock: - return list(self.decks[deck_id]['queue']) - - def pop_next_from_queue(self, deck_id): - """Get and remove next track from queue""" - with self.lock: - if len(self.decks[deck_id]['queue']) > 0: - return self.decks[deck_id]['queue'].pop(0) - return None +STYLESHEET = """ +QMainWindow { background-color: #050505; } +QGroupBox { background-color: #0a0a0a; border-radius: 6px; margin-top: 10px; font-family: "Courier New"; } +QGroupBox#Deck_A { border: 2px solid #00ffff; } +QGroupBox#Deck_A::title { color: #00ffff; font-weight: bold; subcontrol-origin: margin; left: 10px; } +QGroupBox#Deck_B { border: 2px solid #ff00ff; } +QGroupBox#Deck_B::title { color: #ff00ff; font-weight: bold; subcontrol-origin: margin; left: 10px; } +QPushButton { background-color: #000; color: #fff; border: 1px solid #444; padding: 6px; font-weight: bold; border-radius: 4px; } +QPushButton:hover { background-color: #222; border: 1px solid #fff; } +QPushButton:pressed { background-color: #444; } +QPushButton#btn_neon { font-family: "Courier New"; margin-bottom: 5px; font-size: 12px; } +QPushButton#btn_yt_go { background-color: #cc0000; border: 1px solid #ff0000; color: white; font-weight: bold; } +QPushButton#btn_yt_go:hover { background-color: #ff0000; } +QPushButton#btn_remove { background-color: #330000; color: #ff0000; border: 1px solid #550000; padding: 0px; font-size: 10px; min-width: 20px; min-height: 20px; } +QPushButton#btn_remove:hover { background-color: #ff0000; color: #fff; border-color: #ff5555; } +QPushButton#btn_loop { background-color: #1a1a1a; color: #888; border: 1px solid #333; font-size: 11px; } +QPushButton#btn_loop:hover { border-color: #ffa500; color: #ffa500; } +QPushButton#btn_loop:checked { background-color: #ffa500; color: #000; border: 1px solid #ffcc00; } +QPushButton#btn_loop_exit { color: #ff3333; border: 1px solid #550000; font-size: 11px; } +QPushButton#btn_loop_exit:hover { background-color: #330000; border-color: #ff0000; } +QPushButton[mode="0"] { color: #00ff00; border-color: #005500; } +QPushButton[mode="1"] { color: #ffa500; border-color: #553300; } +QPushButton#btn_lib_local { color: #00ffff; border-color: #008888; } +QPushButton#btn_lib_local:checked { background-color: #00ffff; color: #000; font-weight: bold; } +QPushButton#btn_lib_server { color: #ff00ff; border-color: #880088; } +QPushButton#btn_lib_server:checked { background-color: #ff00ff; color: #000; font-weight: bold; } +QPushButton[mode="2"] { color: #ff0000; border-color: #550000; } +QLineEdit { background-color: #111; color: #fff; border: 1px solid #555; padding: 6px; font-family: "Courier New"; } +QLineEdit:focus { border: 1px solid #00ff00; } +QListWidget { background-color: #000; border: 1px solid #333; color: #888; font-family: "Courier New"; } +QListWidget::item:selected { background-color: #222; color: #fff; border: 1px solid #00ff00; } +QListWidget#queue_list::item:selected { background-color: #331111; color: #ffaaaa; border: 1px solid #550000; } +QSlider::groove:horizontal { border: 1px solid #333; height: 4px; background: #222; } +QSlider::handle:horizontal { background: #fff; border: 2px solid #fff; width: 14px; height: 14px; margin: -6px 0; border-radius: 8px; } +QSlider::groove:vertical { border: 1px solid #333; width: 6px; background: #111; border-radius: 3px; } +QSlider::handle:vertical { background: #ccc; border: 1px solid #fff; height: 14px; width: 14px; margin: 0 -5px; border-radius: 4px; } +QSlider::sub-page:vertical { background: #444; border-radius: 3px; } +QSlider::add-page:vertical { background: #222; border-radius: 3px; } +QSlider[eq="vol"]::handle:vertical { background: #fff; border: 1px solid #fff; } +QSlider[eq="high"]::handle:vertical { background: #00ffff; border: 1px solid #00ffff; } +QSlider[eq="mid"]::handle:vertical { background: #00ff00; border: 1px solid #00ff00; } +QSlider[eq="low"]::handle:vertical { background: #ff0000; border: 1px solid #ff0000; } +QSlider#crossfader::groove:horizontal { + border: 1px solid #777; + height: 16px; + background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #00ffff, stop:0.5 #111, stop:1 #ff00ff); + border-radius: 8px; +} +QSlider#crossfader::handle:horizontal { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #eee, stop:1 #888); + border: 2px solid #fff; + width: 32px; + height: 36px; + margin: -11px 0; + border-radius: 6px; +} +QSlider#crossfader::handle:horizontal:hover { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #fff, stop:1 #aaa); + border-color: #00ff00; +} +""" +# --- WORKERS --- class DownloadThread(QThread): progress = pyqtSignal(int) @@ -438,18 +121,12 @@ class DownloadThread(QThread): def run(self): try: - print(f"📥 Downloading from: {self.url}") response = requests.get(self.url, stream=True, timeout=30) - - # Check if request was successful if response.status_code != 200: - print(f"❌ HTTP {response.status_code}: {self.url}") self.finished.emit(self.filepath, False) return total_size = int(response.headers.get('content-length', 0)) - print(f"📦 File size: {total_size / 1024 / 1024:.2f} MB") - os.makedirs(os.path.dirname(self.filepath), exist_ok=True) downloaded = 0 @@ -459,2343 +136,2048 @@ class DownloadThread(QThread): f.write(chunk) downloaded += len(chunk) if total_size > 0: - progress = int((downloaded / total_size) * 100) - self.progress.emit(progress) + self.progress.emit(int((downloaded / total_size) * 100)) - print(f"✅ Download complete: {os.path.basename(self.filepath)}") self.finished.emit(self.filepath, True) - except requests.exceptions.Timeout: - print(f"❌ Download timeout: {self.url}") - self.finished.emit(self.filepath, False) - except requests.exceptions.ConnectionError as e: - print(f"❌ Connection error: {e}") - self.finished.emit(self.filepath, False) - except Exception as e: - print(f"❌ Download error: {type(e).__name__}: {e}") + except Exception: self.finished.emit(self.filepath, False) - -class BroadcastThread(QThread): - """Thread to handle FFmpeg encoding and streaming""" - chunk_ready = pyqtSignal(bytes) - error = pyqtSignal(str) - - def __init__(self, audio_queue, bitrate="192k"): +class LibraryScannerThread(QThread): + files_found = pyqtSignal(list) + def __init__(self, lib_path): super().__init__() - self.audio_queue = audio_queue - self.bitrate = bitrate - self.running = False - self.process = None - + self.lib_path = lib_path def run(self): - self.running = True - - # FFmpeg command to read raw f32le PCM and output MP3 chunks to stdout - # Using CBR and zerolatency tune for stability - cmd = [ - 'ffmpeg', - '-y', - '-fflags', 'nobuffer', - '-flags', 'low_delay', - '-probesize', '32', - '-analyzeduration', '0', - '-f', 'f32le', - '-ar', '44100', - '-ac', '2', - '-i', 'pipe:0', - '-codec:a', 'libmp3lame', - '-b:a', self.bitrate, - '-maxrate', self.bitrate, - '-minrate', self.bitrate, - '-bufsize', '64k', - '-tune', 'zerolatency', - '-flush_packets', '1', - '-f', 'mp3', - 'pipe:1' - ] + files = [] + if self.lib_path.exists(): + for f in self.lib_path.rglob('*'): + if f.suffix.lower() in ['.mp3', '.wav', '.ogg', '.m4a', '.flac']: + files.append(f) + files.sort(key=lambda x: x.name) + self.files_found.emit(files) +class ServerLibraryFetcher(QThread): + finished = pyqtSignal(list, str, bool) + + def __init__(self, url): + super().__init__() + self.url = url + + def run(self): try: - self.process = subprocess.Popen( - cmd, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - bufsize=0 - ) - - # Thread to read encoded chunks from stdout - def read_output(): - # Smaller buffer for more frequent updates (2KB = ~0.08s @ 192k) - buffer_size = 2048 - while self.running: - try: - data = self.process.stdout.read(buffer_size) - if data: - self.chunk_ready.emit(data) - else: - break - except Exception as e: - print(f"Broadcast output error: {e}") - break - - output_thread = threading.Thread(target=read_output, daemon=True) - output_thread.start() - - print(f"📡 FFmpeg broadcast process started ({self.bitrate})") - - # Worker to feed stdin from the broadcast queue - while self.running: - try: - # Clear queue if it's way too full, but be less aggressive - # 100 chunks is ~4.6 seconds. If we hit 200, we're definitely lagging. - if self.audio_queue.qsize() > 200: - while self.audio_queue.qsize() > 50: - self.audio_queue.get_nowait() - - chunk = self.audio_queue.get(timeout=0.1) - if chunk and self.process and self.process.stdin: - self.process.stdin.write(chunk) - self.process.stdin.flush() - except queue.Empty: - continue - except Exception as e: - print(f"Broadcast input error: {e}") - break - + response = requests.get(self.url, timeout=5) + if response.status_code == 200: + self.finished.emit(response.json(), "", True) + else: + self.finished.emit([], f"Server error: {response.status_code}", False) except Exception as e: - self.error.emit(str(e)) - self.running = False - return + self.finished.emit([], str(e), False) - def stop(self): - self.running = False - if self.process: - self.process.terminate() +class YTSearchWorker(QProcess): + results_ready = pyqtSignal(list) + error_occurred = pyqtSignal(str) + + def __init__(self, parent=None): + super().__init__(parent) + self.output_buffer = b"" + self.readyReadStandardOutput.connect(self.handle_output) + self.finished.connect(self.handle_finished) + + def search(self, query): + self.output_buffer = b"" + print(f"[DEBUG] Searching for: {query}") + cmd = sys.executable + args = [ + "-m", "yt_dlp", + f"ytsearch5:{query}", + "--dump-json", + "--flat-playlist", + "--quiet", + "--no-warnings", + "--compat-options", "no-youtube-unavailable-videos" + ] + self.start(cmd, args) + + def handle_output(self): + self.output_buffer += self.readAllStandardOutput().data() + + def handle_finished(self): + try: + results = [] + decoded = self.output_buffer.decode('utf-8', errors='ignore').strip() + for line in decoded.split('\n'): + if line: + try: + results.append(json.loads(line)) + except json.JSONDecodeError: + pass + if results: + self.results_ready.emit(results) + else: + self.error_occurred.emit("No results found or network error.") + except Exception as e: + self.error_occurred.emit(str(e)) + +class YTDownloadWorker(QProcess): + download_finished = pyqtSignal(str) + error_occurred = pyqtSignal(str) + download_progress = pyqtSignal(float) # Progress percentage (0-100) + + def __init__(self, parent=None): + super().__init__(parent) + self.final_filename = "" + self.error_log = "" + self.readyReadStandardOutput.connect(self.handle_output) + self.readyReadStandardError.connect(self.handle_error) + self.finished.connect(self.handle_finished) + + def download(self, url, dest, audio_format="mp3"): + # 1. Ensure Dest exists + if not os.path.exists(dest): try: - self.process.wait(timeout=2) - except: - self.process.kill() - self.process = None - # Give output thread time to finish - time.sleep(0.1) - print("🛑 Broadcast process stopped") + os.makedirs(dest) + print(f"[DEBUG] Created directory: {dest}") + except Exception as e: + self.error_occurred.emit(f"Could not create folder: {e}") + return - -class WaveformWidget(QWidget): - """Waveform display matching web panel style""" - - def __init__(self, deck_id, parent=None): - super().__init__(parent) - self.deck_id = deck_id - self.waveform_data = [] - self.position = 0.0 - self.duration = 1.0 - self.cues = {} - self.setFixedHeight(180) # Pro-visual height - self.setStyleSheet("background: #000; border: none;") # Removed internal border - - def set_waveform(self, audio_data, sample_rate): - if audio_data is None: - self.waveform_data = [] + # 2. Check FFmpeg (only needed for MP3 conversion) + if audio_format == "mp3" and not shutil.which("ffmpeg"): + self.error_occurred.emit("CRITICAL ERROR: FFmpeg is missing.\nRun 'sudo apt install ffmpeg' in terminal.") return - - samples = 2000 # Increased resolution - if audio_data.ndim > 1: - audio_data = np.mean(audio_data, axis=1) - - # Normalize globally for better visualization - max_val = np.max(np.abs(audio_data)) - if max_val > 0: - audio_data = audio_data / max_val - - block_size = max(1, len(audio_data) // samples) - self.waveform_data = [] - - for i in range(samples): - start = i * block_size - end = min(start + block_size, len(audio_data)) - if start < len(audio_data): - chunk = audio_data[start:end] - # Store both max and min for a more detailed mirror wave - self.waveform_data.append((np.max(chunk), np.min(chunk))) - - self.update() - - def set_position(self, position, duration): - # Only update if position changed significantly (reduces repaints) - if abs(position - self.position) > 0.1 or duration != self.duration: - self.position = position - self.duration = max(duration, 0.01) - self.update() - - def set_cues(self, cues): - self.cues = cues - self.update() - - def paintEvent(self, event): - painter = QPainter(self) - painter.setRenderHint(QPainter.Antialiasing) - - # Background - painter.fillRect(self.rect(), QColor(0, 0, 0)) - - if not self.waveform_data: - return - - # Draw waveform - width = self.width() - height = self.height() - bar_width = width / len(self.waveform_data) - - wave_color = PRIMARY_CYAN if self.deck_id == 'A' else SECONDARY_MAGENTA - painter.setPen(Qt.NoPen) - - # Create semi-transparent brush for visual depth - brush_color = QColor(wave_color) - brush_color.setAlpha(180) - painter.setBrush(QBrush(brush_color)) - - for i, (peak, val) in enumerate(self.waveform_data): - x = i * bar_width - - # Use almost full height (0.95) to make it look "tall" as requested - # 'peak' and 'val' are normalized -1 to 1 - pos_height = peak * (height / 2) * 0.95 - neg_height = abs(val) * (height / 2) * 0.95 - - # Top half - painter.drawRect(int(x), int(height/2 - pos_height), max(1, int(bar_width)), int(pos_height)) - # Bottom half - painter.drawRect(int(x), int(height/2), max(1, int(bar_width)), int(neg_height)) - - # Draw cue markers - if self.duration > 0: - painter.setPen(QPen(QColor(255, 255, 255), 1)) - for cue_time in self.cues.values(): - x = (cue_time / self.duration) * width - painter.drawLine(int(x), 0, int(x), height) - - # Draw playhead - if self.duration > 0: - playhead_x = (self.position / self.duration) * width - painter.setPen(QPen(QColor(255, 255, 0), 2)) - painter.drawLine(int(playhead_x), 0, int(playhead_x), height) - - def mousePressEvent(self, event): - """Allow seeking by clicking on waveform""" - if self.duration > 0: - percent = event.x() / self.width() - seek_time = percent * self.duration - self.parent().parent().seek_deck(seek_time) - -class VinylDiskWidget(QWidget): - """Animated vinyl disk matching web panel""" - - clicked = pyqtSignal() - - def __init__(self, deck_id, parent=None): - super().__init__(parent) - self.deck_id = deck_id - self.rotation = 0 - self.playing = False - self.setFixedSize(120, 120) + self.final_filename = "" + self.error_log = "" + print(f"[DEBUG] Starting download: {url} -> {dest} (format: {audio_format})") - # Rotation animation - self.timer = QTimer() - self.timer.timeout.connect(self.rotate) + cmd = sys.executable + out_tmpl = os.path.join(dest, '%(title)s.%(ext)s') - def set_playing(self, playing): - self.playing = playing - if playing: - self.timer.start(100) # 10 FPS - reduced for better performance + # Build args based on format choice + args = ["-m", "yt_dlp"] + + if audio_format == "mp3": + # MP3: Convert to MP3 (slower, universal) + args.extend([ + "-f", "bestaudio/best", + "-x", "--audio-format", "mp3", + "--audio-quality", "192K", + ]) else: - self.timer.stop() - self.update() - - def set_speed(self, speed): - self.speed = speed + # Best Quality: Download original audio (faster, better quality) + args.extend([ + "-f", "bestaudio[ext=m4a]/bestaudio", # Prefer m4a, fallback to best + ]) - def rotate(self): - # Base rotation is 5 degrees, scaled by playback speed - speed_factor = getattr(self, 'speed', 1.0) - self.rotation = (self.rotation + (5 * speed_factor)) % 360 - self.update() - - def paintEvent(self, event): - painter = QPainter(self) - painter.setRenderHint(QPainter.Antialiasing) + # Common args + args.extend([ + "-o", out_tmpl, + "--no-playlist", + "--newline", + "--no-warnings", + "--progress", + "--print", "after_move:filepath", + url + ]) - center_x = self.width() / 2 - center_y = self.height() / 2 - radius = min(center_x, center_y) - 5 + self.start(cmd, args) - # Rotate if playing - if self.playing: - painter.translate(center_x, center_y) - painter.rotate(self.rotation) - painter.translate(-center_x, -center_y) - - # Vinyl gradient - gradient = QRadialGradient(center_x, center_y, radius) - gradient.setColorAt(0, QColor(34, 34, 34)) - gradient.setColorAt(0.1, QColor(17, 17, 17)) - gradient.setColorAt(1, QColor(0, 0, 0)) - - painter.setBrush(gradient) - painter.setPen(QPen(QColor(51, 51, 51), 2)) - painter.drawEllipse(int(center_x - radius), int(center_y - radius), - int(radius * 2), int(radius * 2)) - - # Grooves - painter.setPen(QPen(QColor(24, 24, 24), 1)) - for i in range(5, int(radius), 8): - painter.drawEllipse(int(center_x - i), int(center_y - i), i * 2, i * 2) - - # Center label - label_radius = 25 - label_color = PRIMARY_CYAN if self.deck_id == 'A' else SECONDARY_MAGENTA - painter.setBrush(label_color) - painter.setPen(QPen(label_color.darker(120), 2)) - painter.drawEllipse(int(center_x - label_radius), int(center_y - label_radius), - label_radius * 2, label_radius * 2) - - # Label text - painter.setPen(QColor(0, 0, 0)) - font = QFont("Orbitron", 16, QFont.Bold) - painter.setFont(font) - painter.drawText(self.rect(), Qt.AlignCenter, self.deck_id) - - # Glow effect when playing - if self.playing: - painter.setPen(QPen(label_color, 3)) - painter.setBrush(Qt.NoBrush) - painter.drawEllipse(int(center_x - radius - 3), int(center_y - radius - 3), - int((radius + 3) * 2), int((radius + 3) * 2)) - - def mousePressEvent(self, event): - self.clicked.emit() + def handle_output(self): + chunks = self.readAllStandardOutput().data().decode('utf-8', errors='ignore').splitlines() + for chunk in chunks: + line = chunk.strip() + if line: + # Progress parsing from stdout (newline mode) + if '[download]' in line and '%' in line: + try: + parts = line.split() + for part in parts: + if '%' in part: + p_str = part.replace('%', '') + self.download_progress.emit(float(p_str)) + break + except: pass + # yt-dlp prints the final filepath via --print after_move:filepath + # Store it unconditionally — the file may not exist yet if FFmpeg + # post-processing is still running, so DON'T gate on os.path.exists here. + elif os.path.isabs(line) or (os.path.sep in line and any( + line.endswith(ext) for ext in ('.mp3', '.m4a', '.opus', '.ogg', '.wav', '.flac'))): + self.final_filename = line + print(f"[DEBUG] Captured output path: {line}") - -class NeonButton(QPushButton): - """Neon-styled button matching web panel""" - - def __init__(self, text, color=PRIMARY_CYAN, parent=None): - super().__init__(text, parent) - self.neon_color = color - self.is_active = False - self.update_style() - - def set_active(self, active): - self.is_active = active - self.update_style() - - def update_style(self): - if self.is_active: - self.setStyleSheet(f""" - QPushButton {{ - background: rgba({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}, 0.3); - border: 2px solid rgb({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}); - color: rgb({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}); - font-family: 'Orbitron'; - font-weight: bold; - padding: 8px; - border-radius: 4px; - }} - QPushButton:hover {{ - background: rgba({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}, 0.5); - }} - """) - else: - self.setStyleSheet(f""" - QPushButton {{ - background: #222; - border: 1px solid #444; - color: #666; - font-family: 'Orbitron'; - font-weight: bold; - padding: 8px; - border-radius: 4px; - }} - QPushButton:hover {{ - background: #333; - color: #888; - }} - """) - - -class DeckWidget(QWidget): - """Complete deck widget matching web panel layout""" - - def __init__(self, deck_id, audio_engine, parent=None): - super().__init__(parent) - self.deck_id = deck_id - self.audio_engine = audio_engine - self.color = PRIMARY_CYAN if deck_id == 'A' else SECONDARY_MAGENTA - - self.init_ui() - - # Update timer - self.timer = QTimer() - self.timer.timeout.connect(self.update_display) - self.timer.start(100) # 10 FPS - reduced for better performance - - def init_ui(self): - layout = QVBoxLayout() - layout.setSpacing(5) # Reduced from 8 - layout.setContentsMargins(10, 8, 10, 10) # Reduced top margin - - # Headers removed as requested - - # Waveform - waveform_container = QWidget() - waveform_container.setFixedHeight(184) # 180px graph + 4px padding - waveform_container.setStyleSheet("background: #111; border: 1px solid #333; border-radius: 4px;") - waveform_layout = QVBoxLayout(waveform_container) - waveform_layout.setContentsMargins(2, 2, 2, 2) - - self.waveform = WaveformWidget(self.deck_id, self) - waveform_layout.addWidget(self.waveform) - - # Subtle Metadata Overlay (Integrated into Graph Box) - meta_layout = QHBoxLayout() - meta_layout.setContentsMargins(4, 0, 4, 1) - - self.deck_id_label = QLabel(f"[{self.deck_id}]") - self.deck_id_label.setStyleSheet(f"color: rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); font-family: 'Orbitron'; font-size: 9px; font-weight: bold;") - meta_layout.addWidget(self.deck_id_label) - - self.track_label = QLabel("EMPTY") - self.track_label.setStyleSheet("color: #bbb; font-family: 'Rajdhani'; font-size: 9px; font-weight: bold;") - meta_layout.addWidget(self.track_label, 1) - - self.time_label = QLabel("0:00 / 0:00") - self.time_label.setStyleSheet("color: #888; font-family: 'Orbitron'; font-size: 8px;") - meta_layout.addWidget(self.time_label) - - waveform_layout.addLayout(meta_layout) - - layout.addWidget(waveform_container) - - # Restoring the nice DJ circles - disk_container = QHBoxLayout() - disk_container.addStretch() - self.vinyl_disk = VinylDiskWidget(self.deck_id) - self.vinyl_disk.clicked.connect(self.toggle_play) - disk_container.addWidget(self.vinyl_disk) - disk_container.addStretch() - layout.addLayout(disk_container) - - # Hot Cues - cue_layout = QGridLayout() - cue_layout.setSpacing(3) - self.cue_buttons = [] - for i in range(4): - btn = NeonButton(f"CUE {i+1}", self.color) - btn.clicked.connect(lambda checked, num=i+1: self.handle_cue(num)) - cue_layout.addWidget(btn, 0, i) - self.cue_buttons.append(btn) - layout.addLayout(cue_layout) - - # Loop Controls - loop_layout = QGridLayout() - loop_layout.setSpacing(3) - loop_in = NeonButton("LOOP IN", QColor(255, 102, 0)) - loop_in.clicked.connect(lambda: self.audio_engine.set_loop_in(self.deck_id)) - - loop_out = NeonButton("LOOP OUT", QColor(255, 102, 0)) - loop_out.clicked.connect(lambda: self.audio_engine.set_loop_out(self.deck_id)) - - loop_exit = NeonButton("EXIT", QColor(255, 102, 0)) - loop_exit.clicked.connect(lambda: self.audio_engine.exit_loop(self.deck_id)) - - loop_layout.addWidget(loop_in, 0, 0) - loop_layout.addWidget(loop_out, 0, 1) - loop_layout.addWidget(loop_exit, 0, 2) - layout.addLayout(loop_layout) - - # Controls Grid - controls = QGridLayout() - controls.setSpacing(8) - - # Volume - vol_label = QLabel("VOLUME") - vol_label.setStyleSheet("color: #888; font-size: 10px;") - controls.addWidget(vol_label, 0, 0) - self.volume_slider = QSlider(Qt.Horizontal) - self.volume_slider.setRange(0, 100) - self.volume_slider.setValue(80) - self.volume_slider.valueChanged.connect(self.on_volume_change) - self.volume_slider.setStyleSheet(self.get_slider_style()) - controls.addWidget(self.volume_slider, 1, 0) - - # EQ - eq_widget = QWidget() - eq_layout = QHBoxLayout(eq_widget) - eq_layout.setSpacing(8) - self.eq_sliders = {} - - for band in ['HIGH', 'MID', 'LOW']: - band_widget = QWidget() - band_layout = QVBoxLayout(band_widget) - band_layout.setSpacing(2) - band_layout.setContentsMargins(0, 0, 0, 0) + def handle_error(self): + err_data = self.readAllStandardError().data().decode('utf-8', errors='ignore').strip() + if err_data: + # Only log actual errors + if "error" in err_data.lower(): + print(f"[YT-DLP ERR] {err_data}") + self.error_log += err_data + "\n" - slider = QSlider(Qt.Vertical) - slider.setRange(-20, 20) - slider.setValue(0) - slider.setFixedHeight(80) - slider.setStyleSheet(self.get_slider_style()) - slider.valueChanged.connect(lambda v, b=band.lower(): self.on_eq_change(b, v)) - self.eq_sliders[band.lower()] = slider - - label = QLabel(band) - label.setStyleSheet("color: #888; font-size: 9px;") - label.setAlignment(Qt.AlignCenter) - - band_layout.addWidget(slider) - band_layout.addWidget(label) - eq_layout.addWidget(band_widget) - - controls.addWidget(eq_widget, 0, 1, 2, 1) - - # Filters - filter_widget = QWidget() - filter_layout = QVBoxLayout(filter_widget) - filter_layout.setSpacing(4) - - lp_label = QLabel("LOW-PASS") - lp_label.setStyleSheet("color: #888; font-size: 9px;") - filter_layout.addWidget(lp_label) - self.lp_slider = QSlider(Qt.Horizontal) - self.lp_slider.setRange(0, 100) - self.lp_slider.setValue(100) - self.lp_slider.setStyleSheet(self.get_slider_style()) - self.lp_slider.valueChanged.connect(lambda v: self.audio_engine.set_filter(self.deck_id, 'lowpass', v)) - filter_layout.addWidget(self.lp_slider) - - hp_label = QLabel("HIGH-PASS") - hp_label.setStyleSheet("color: #888; font-size: 9px;") - filter_layout.addWidget(hp_label) - self.hp_slider = QSlider(Qt.Horizontal) - self.hp_slider.setRange(0, 100) - self.hp_slider.setValue(0) - self.hp_slider.setStyleSheet(self.get_slider_style()) - self.hp_slider.valueChanged.connect(lambda v: self.audio_engine.set_filter(self.deck_id, 'highpass', v)) - filter_layout.addWidget(self.hp_slider) - - controls.addWidget(filter_widget, 0, 2, 2, 1) - - # Speed - speed_widget = QWidget() - speed_layout = QVBoxLayout(speed_widget) - speed_layout.setSpacing(4) - - speed_label = QLabel("PITCH / TEMPO") - speed_label.setStyleSheet("color: #888; font-size: 9px;") - speed_layout.addWidget(speed_label) - - self.speed_slider = QSlider(Qt.Horizontal) - self.speed_slider.setRange(50, 150) - self.speed_slider.setValue(100) - self.speed_slider.valueChanged.connect(self.on_speed_change) - self.speed_slider.setStyleSheet(self.get_slider_style()) - speed_layout.addWidget(self.speed_slider) - - bend_layout = QHBoxLayout() - bend_minus = QPushButton("-") - bend_minus.setFixedSize(30, 25) - bend_minus.pressed.connect(lambda: self.on_pitch_bend(-0.02)) - bend_minus.released.connect(lambda: self.on_pitch_bend(0)) - - bend_plus = QPushButton("+") - bend_plus.setFixedSize(30, 25) - bend_plus.pressed.connect(lambda: self.on_pitch_bend(0.02)) - bend_plus.released.connect(lambda: self.on_pitch_bend(0)) - - bend_layout.addWidget(bend_minus) - bend_layout.addWidget(bend_plus) - speed_layout.addLayout(bend_layout) - - controls.addWidget(speed_widget, 0, 3, 2, 1) - - layout.addLayout(controls) - - # Transport - transport = QHBoxLayout() - transport.setSpacing(4) - - self.play_btn = NeonButton("▶ PLAY", self.color) - self.play_btn.clicked.connect(self.play) - transport.addWidget(self.play_btn) - - self.pause_btn = NeonButton("⏸ PAUSE") - self.pause_btn.clicked.connect(self.pause) - transport.addWidget(self.pause_btn) - - sync_btn = NeonButton("SYNC", self.color) - sync_btn.clicked.connect(self.on_sync) - transport.addWidget(sync_btn) - - reset_btn = NeonButton("🔄 RESET") - reset_btn.clicked.connect(self.reset_deck) - transport.addWidget(reset_btn) - - self.loop_btn = NeonButton("🔁 LOOP") - self.loop_btn.setCheckable(True) - self.loop_btn.clicked.connect(self.toggle_loop) - transport.addWidget(self.loop_btn) - - layout.addLayout(transport) - - # Queue List - queue_container = QWidget() - queue_container.setStyleSheet("background: rgba(0, 0, 0, 0.4); border-top: 1px solid #333;") - queue_layout = QVBoxLayout(queue_container) - queue_layout.setContentsMargins(5, 5, 5, 5) - queue_layout.setSpacing(2) - - queue_label = QLabel("NEXT UP / QUEUE") - queue_label.setStyleSheet(f"color: rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); font-family: 'Orbitron'; font-size: 9px; font-weight: bold;") - queue_layout.addWidget(queue_label) - - self.queue_list = QListWidget() - self.queue_list.setFixedHeight(80) - self.queue_list.setStyleSheet(""" - QListWidget { - background: transparent; - border: none; - color: #aaa; - font-family: 'Rajdhani'; - font-size: 10px; - } - QListWidget::item { - padding: 2px; - border-bottom: 1px solid #222; - } - """) - queue_layout.addWidget(self.queue_list) - layout.addWidget(queue_container) - - layout.addStretch() # Push everything up - - self.setLayout(layout) - - # Deck styling - self.setStyleSheet(f""" - QWidget {{ - background: rgba(20, 20, 30, 0.8); - color: #e0e0e0; - font-family: 'Rajdhani'; - }} - QWidget#deck {{ - border: 2px solid rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); - border-radius: 8px; - }} - """) - self.setObjectName("deck") - - def get_slider_style(self): - return """ - QSlider::groove:horizontal { - height: 8px; - background: #333; - border-radius: 4px; - } - QSlider::handle:horizontal { - background: #ccc; - border: 2px solid #888; - width: 16px; - margin: -4px 0; - border-radius: 8px; - } - QSlider::groove:vertical { - width: 8px; - background: #333; - border-radius: 4px; - } - QSlider::handle:vertical { - background: #ccc; - border: 2px solid #888; - height: 16px; - margin: 0 -4px; - border-radius: 8px; - } - """ - - def load_track(self, filepath): - if self.audio_engine.load_track(self.deck_id, filepath): - filename = os.path.basename(filepath) - self.track_label.setText(filename.upper()) - deck = self.audio_engine.decks[self.deck_id] - self.waveform.set_waveform(deck['audio_data'], deck['sample_rate']) - - def play(self): - self.audio_engine.play(self.deck_id) - self.vinyl_disk.set_playing(True) - self.play_btn.set_active(True) - - def pause(self): - self.audio_engine.pause(self.deck_id) - self.vinyl_disk.set_playing(False) - self.play_btn.set_active(False) - - def toggle_play(self): - if self.audio_engine.decks[self.deck_id]['playing']: - self.pause() - else: - self.play() - - def on_volume_change(self, value): - self.audio_engine.set_volume(self.deck_id, value / 100.0) - - def on_speed_change(self, value): - self.audio_engine.set_speed(self.deck_id, value / 100.0) - - def on_eq_change(self, band, value): - self.audio_engine.set_eq(self.deck_id, band, value) - - def on_sync(self): - """Match speed to other deck""" - other_deck_id = 'B' if self.deck_id == 'A' else 'A' - other_speed = self.audio_engine.decks[other_deck_id]['speed'] - self.speed_slider.setValue(int(other_speed * 100)) - print(f"🎵 Deck {self.deck_id} synced to {other_speed:.2f}x") - - def on_pitch_bend(self, amount): - """Temporarily adjust speed for nudging""" - base_speed = self.speed_slider.value() / 100.0 - self.audio_engine.set_speed(self.deck_id, base_speed + amount) - - def handle_cue(self, cue_num): - deck = self.audio_engine.decks[self.deck_id] - if cue_num in deck['cues']: - self.audio_engine.jump_to_cue(self.deck_id, cue_num) - else: - self.audio_engine.set_cue(self.deck_id, cue_num) - self.cue_buttons[cue_num-1].set_active(True) - - def seek_deck(self, time): - self.audio_engine.seek(self.deck_id, time) - - def reset_deck(self): - """Reset all deck controls to default values""" - # Setting values on sliders will trigger the valueChanged signal - # which will in turn update the audio engine. - - # Reset volume to 80% - self.volume_slider.setValue(80) - - # Reset speed to 100% - self.speed_slider.setValue(100) - - # Reset EQ sliders to 0 - if hasattr(self, 'eq_sliders'): - for band, slider in self.eq_sliders.items(): - slider.setValue(0) - - # Reset filter sliders - self.lp_slider.setValue(100) - self.hp_slider.setValue(0) - - print(f"🔄 Deck {self.deck_id} reset to defaults") - - def toggle_loop(self): - """Toggle loop/repeat for this deck""" - is_looping = self.loop_btn.isChecked() - self.audio_engine.set_repeat(self.deck_id, is_looping) - - if is_looping: - self.loop_btn.setStyleSheet(f""" - QPushButton {{ - background: rgba({self.color.red()}, {self.color.green()}, {self.color.blue()}, 0.3); - border: 2px solid rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); - color: rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); - font-family: 'Orbitron'; - font-size: 12px; - font-weight: bold; - border-radius: 6px; - }} - """) - print(f"🔁 Deck {self.deck_id} loop enabled") - else: - self.loop_btn.setStyleSheet(""" - QPushButton { - background: rgba(0, 0, 0, 0.3); - border: 2px solid #666; - color: #888; - font-family: 'Orbitron'; - font-size: 12px; - border-radius: 6px; - } - """) - print(f"⏹️ Deck {self.deck_id} loop disabled") - - def update_display(self): - deck = self.audio_engine.decks[self.deck_id] - position = self.audio_engine.get_position(self.deck_id) - duration = deck['duration'] - - # Check if we need to load next track from queue - if deck.get('needs_next_track', False): - deck['needs_next_track'] = False - next_track = self.audio_engine.pop_next_from_queue(self.deck_id) - if next_track: - print(f"📋 Auto-loading next track from queue: {os.path.basename(next_track)}") - self.load_track(next_track) - self.play() - - # Time calculations - pos_min = int(position // 60) - pos_sec = int(position % 60) - dur_min = int(duration // 60) - dur_sec = int(duration % 60) - self.time_label.setText(f"{pos_min}:{pos_sec:02d} / {dur_min}:{dur_sec:02d}") - - self.waveform.set_position(position, duration) - self.waveform.set_cues(deck['cues']) - self.vinyl_disk.set_speed(deck['speed']) - - # Update Queue Display (only when changed) - current_queue = deck.get('queue', []) - # Check if queue actually changed (not just count) - queue_changed = False - if self.queue_list.count() != len(current_queue): - queue_changed = True - else: - # Check if items are different - for i, track_path in enumerate(current_queue): - if i >= self.queue_list.count() or self.queue_list.item(i).text() != os.path.basename(track_path): - queue_changed = True + def handle_finished(self): + if self.exitCode() == 0 and self.final_filename: + # Poll for the file to fully appear on disk (replaces the unreliable 0.5s sleep). + # yt-dlp moves the file after FFmpeg post-processing finishes, so the file + # may take a moment to be visible. We wait up to 10 seconds. + deadline = time.time() + 10.0 + while time.time() < deadline: + if os.path.exists(self.final_filename) and os.path.getsize(self.final_filename) > 0: break + time.sleep(0.1) + + if os.path.exists(self.final_filename) and os.path.getsize(self.final_filename) > 0: + print(f"[DEBUG] Download complete: {self.final_filename} ({os.path.getsize(self.final_filename)} bytes)") + self.download_finished.emit(self.final_filename) + else: + self.error_occurred.emit(f"Download finished but file missing or empty:\n{self.final_filename}") + elif self.exitCode() == 0 and not self.final_filename: + self.error_occurred.emit("Download finished but could not determine output filename.\nCheck the download folder manually.") + else: + self.error_occurred.emit(f"Download process failed.\n{self.error_log}") + +class SettingsDialog(QDialog): + def __init__(self, settings_data, parent=None): + super().__init__(parent) + self.setWindowTitle("Settings") + self.resize(650, 650) + self.setStyleSheet("background-color: #111; color: #fff;") - if queue_changed: - self.queue_list.clear() - for track_path in current_queue: - filename = os.path.basename(track_path) - self.queue_list.addItem(filename) + # Store all settings + self.shortcuts = settings_data.get("shortcuts", {}).copy() + self.audio_settings = settings_data.get("audio", {}).copy() + self.ui_settings = settings_data.get("ui", {}).copy() + self.library_settings = settings_data.get("library", {}).copy() + + layout = QVBoxLayout(self) + + # Create tab widget + self.tabs = QTabWidget() + self.tabs.setStyleSheet(""" + QTabWidget::pane { border: 1px solid #333; background: #0a0a0a; } + QTabBar::tab { background: #222; color: #888; padding: 8px 16px; margin: 2px; } + QTabBar::tab:selected { background: #00ffff; color: #000; font-weight: bold; } + QTabBar::tab:hover { background: #333; color: #fff; } + """) + + # Tab 1: Keyboard Shortcuts + self.shortcuts_tab = self.create_shortcuts_tab() + self.tabs.addTab(self.shortcuts_tab, "Keyboard") + + # Tab 2: Audio & Recording + self.audio_tab = self.create_audio_tab() + self.tabs.addTab(self.audio_tab, "Audio") + + # Tab 3: UI Preferences + self.ui_tab = self.create_ui_tab() + self.tabs.addTab(self.ui_tab, "UI") + + # Tab 4: Library + self.library_tab = self.create_library_tab() + self.tabs.addTab(self.library_tab, "Library") + + layout.addWidget(self.tabs) + + # Buttons + btn_layout = QHBoxLayout() + self.save_btn = QPushButton("Save All") + self.save_btn.clicked.connect(self.accept) + self.cancel_btn = QPushButton("Cancel") + self.cancel_btn.clicked.connect(self.reject) + btn_layout.addWidget(self.save_btn) + btn_layout.addWidget(self.cancel_btn) + layout.addLayout(btn_layout) + + def create_shortcuts_tab(self): + widget = QWidget() + layout = QVBoxLayout(widget) + + self.shortcuts_table = QTableWidget(len(self.shortcuts), 2) + self.shortcuts_table.setHorizontalHeaderLabels(["Action", "Key"]) + self.shortcuts_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch) + self.shortcuts_table.setStyleSheet("background-color: #000; border: 1px solid #333;") + self.shortcuts_table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers) + self.shortcuts_table.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.shortcuts_table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows) + + actions = sorted(self.shortcuts.keys()) + for row, action in enumerate(actions): + self.shortcuts_table.setItem(row, 0, QTableWidgetItem(action)) + self.shortcuts_table.setItem(row, 1, QTableWidgetItem(self.shortcuts[action])) + + layout.addWidget(self.shortcuts_table) + + rebind_btn = QPushButton("Rebind Selected Shortcut") + rebind_btn.clicked.connect(self.rebind_selected) + layout.addWidget(rebind_btn) + + return widget + + def create_audio_tab(self): + widget = QWidget() + layout = QVBoxLayout(widget) + layout.setAlignment(Qt.AlignmentFlag.AlignTop) + + # Streaming section + stream_group = QLabel("Live Streaming") + stream_group.setStyleSheet("font-size: 14px; font-weight: bold; color: #00ffff; margin-top: 10px;") + layout.addWidget(stream_group) + + stream_url_label = QLabel("Stream Server URL:") + self.stream_url_input = QLineEdit() + self.stream_url_input.setPlaceholderText("http://YOUR_SERVER_IP:8080/api/stream") + current_stream_url = self.audio_settings.get("stream_server_url", "http://localhost:8080/api/stream") + self.stream_url_input.setText(current_stream_url) + self.stream_url_input.setStyleSheet(""" + QLineEdit { + background: #1a1a1a; + border: 1px solid #333; + padding: 8px; + color: #fff; + border-radius: 4px; + } + """) + + layout.addWidget(stream_url_label) + layout.addWidget(self.stream_url_input) + layout.addSpacing(20) + + # Recording section + rec_group = QLabel("Recording") + rec_group.setStyleSheet("font-size: 14px; font-weight: bold; color: #ff00ff; margin-top: 10px;") + layout.addWidget(rec_group) + + # Sample rate + rate_label = QLabel("Recording Sample Rate:") + self.sample_rate_combo = QComboBox() + self.sample_rate_combo.addItem("44.1 kHz", 44100) + self.sample_rate_combo.addItem("48 kHz (Recommended)", 48000) + current_rate = self.audio_settings.get("recording_sample_rate", 48000) + self.sample_rate_combo.setCurrentIndex(0 if current_rate == 44100 else 1) + + # Format + format_label = QLabel("Recording Format:") + self.format_combo = QComboBox() + self.format_combo.addItem("WAV (Lossless)", "wav") + self.format_combo.addItem("MP3 (Compressed)", "mp3") + current_format = self.audio_settings.get("recording_format", "wav") + self.format_combo.setCurrentIndex(0 if current_format == "wav" else 1) + + layout.addWidget(rate_label) + layout.addWidget(self.sample_rate_combo) + layout.addSpacing(10) + layout.addWidget(format_label) + layout.addWidget(self.format_combo) + layout.addStretch() + + return widget + + def create_ui_tab(self): + widget = QWidget() + layout = QVBoxLayout(widget) + layout.setAlignment(Qt.AlignmentFlag.AlignTop) + + # Neon mode default + neon_label = QLabel("Default Neon Edge Mode:") + self.neon_combo = QComboBox() + self.neon_combo.addItem("Off", 0) + self.neon_combo.addItem("Blue (Cyan)", 1) + self.neon_combo.addItem("Purple (Magenta)", 2) + current_neon = self.ui_settings.get("neon_mode", 0) + self.neon_combo.setCurrentIndex(current_neon) + + layout.addWidget(neon_label) + layout.addWidget(self.neon_combo) + layout.addStretch() + + return widget + + def create_library_tab(self): + widget = QWidget() + layout = QVBoxLayout(widget) + layout.setAlignment(Qt.AlignmentFlag.AlignTop) + + # Auto-scan + self.auto_scan_check = QCheckBox("Auto-scan library on startup") + self.auto_scan_check.setChecked(self.library_settings.get("auto_scan", True)) + + # YouTube default format + yt_label = QLabel("YouTube Download Default Format:") + self.yt_format_combo = QComboBox() + self.yt_format_combo.addItem("MP3 (Universal)", "mp3") + self.yt_format_combo.addItem("Best Quality (Faster)", "best") + current_yt = self.library_settings.get("yt_default_format", "mp3") + self.yt_format_combo.setCurrentIndex(0 if current_yt == "mp3" else 1) + + layout.addWidget(self.auto_scan_check) + layout.addSpacing(10) + layout.addWidget(yt_label) + layout.addWidget(self.yt_format_combo) + layout.addStretch() + + return widget + + def rebind_selected(self): + row = self.shortcuts_table.currentRow() + if row < 0: + QMessageBox.warning(self, "No Selection", "Please select an action to rebind.") + return + + action = self.shortcuts_table.item(row, 0).text() + + from PyQt6.QtWidgets import QInputDialog + new_key, ok = QInputDialog.getText(self, "Rebind Key", f"Enter new key sequence for {action}:", text=self.shortcuts[action]) + if ok and new_key: + self.shortcuts[action] = new_key + self.shortcuts_table.item(row, 1).setText(new_key) + + def get_all_settings(self): + """Return all settings as a dictionary""" + return { + "shortcuts": self.shortcuts, + "audio": { + "recording_sample_rate": self.sample_rate_combo.currentData(), + "recording_format": self.format_combo.currentData(), + "stream_server_url": self.stream_url_input.text(), + }, + "ui": { + "neon_mode": self.neon_combo.currentData(), + }, + "library": { + "auto_scan": self.auto_scan_check.isChecked(), + "yt_default_format": self.yt_format_combo.currentData(), + } + } -class YouTubeSearchDialog(QDialog): - """Dialog to display and select YouTube search results""" - item_selected = pyqtSignal(str) # Emits the URL +class YTResultDialog(QDialog): def __init__(self, results, parent=None): super().__init__(parent) - self.setWindowTitle("YouTube Search Results") - self.setFixedWidth(600) - self.setFixedHeight(400) - self.setStyleSheet(f""" - QDialog {{ - background: rgb({BG_DARK.red()}, {BG_DARK.green()}, {BG_DARK.blue()}); - border: 2px solid #444; - }} - QLabel {{ color: white; font-family: 'Rajdhani'; }} + self.setWindowTitle("YouTube Pro Search") + self.resize(600, 450) + self.setStyleSheet(""" + QDialog { background-color: #0a0a0a; border: 2px solid #cc0000; } + QListWidget { background-color: #000; color: #0f0; border: 1px solid #333; font-family: 'Courier New'; font-size: 13px; } + QListWidget::item { padding: 10px; border-bottom: 1px solid #111; } + QListWidget::item:selected { background-color: #222; color: #fff; border: 1px solid #cc0000; } + QLabel { color: #fff; font-weight: bold; font-size: 16px; margin-bottom: 10px; } + QPushButton { background-color: #cc0000; color: white; border: none; padding: 12px; font-weight: bold; border-radius: 5px; } + QPushButton:hover { background-color: #ff0000; } """) layout = QVBoxLayout(self) - layout.setContentsMargins(15, 15, 15, 15) - - header = QLabel("SELECT A VERSION TO DOWNLOAD") - header.setStyleSheet("font-family: 'Orbitron'; font-weight: bold; font-size: 14px; color: #00f3ff; margin-bottom: 10px;") + header = QLabel("YouTube Search Results") layout.addWidget(header) self.list_widget = QListWidget() - self.list_widget.setStyleSheet(""" - QListWidget { - background: rgba(0, 0, 0, 0.4); - border: 1px solid #333; - border-radius: 4px; - color: #ddd; - padding: 5px; - } - QListWidget::item { - border-bottom: 1px solid #222; - padding: 8px; - } - QListWidget::item:hover { - background: rgba(0, 243, 255, 0.1); - } - """) layout.addWidget(self.list_widget) - for res in results: - # Title ||| Duration ||| URL - parts = res.split(" ||| ") - if len(parts) < 3: continue + for vid in results: + duration_sec = vid.get('duration', 0) + if not duration_sec: duration_sec = 0 + m, s = divmod(int(duration_sec), 60) + title_text = vid.get('title', 'Unknown Title') + channel = vid.get('uploader', 'Unknown Artist') - title, duration, url = parts[0], parts[1], parts[2] + item = QListWidgetItem(f"{title_text}\n [{m:02}:{s:02}] - {channel}") + item.setData(Qt.ItemDataRole.UserRole, vid.get('url')) + self.list_widget.addItem(item) - item = QListWidgetItem(self.list_widget) - item.setSizeHint(QSize(0, 50)) - - widget = QWidget() - item_layout = QHBoxLayout(widget) - item_layout.setContentsMargins(5, 0, 5, 0) - - info_vbox = QVBoxLayout() - info_vbox.setSpacing(0) - - title_label = QLabel(title) - title_label.setStyleSheet("font-weight: bold; font-size: 12px; color: #eee;") - title_label.setWordWrap(True) - info_vbox.addWidget(title_label) - - dur_label = QLabel(f"Duration: {duration}") - dur_label.setStyleSheet("font-size: 10px; color: #888;") - info_vbox.addWidget(dur_label) - - item_layout.addLayout(info_vbox, 1) - - dl_btn = NeonButton("DOWNLOAD", PRIMARY_CYAN) - dl_btn.setFixedSize(90, 26) - dl_btn.clicked.connect(lambda _, u=url: self.on_dl_click(u)) - item_layout.addWidget(dl_btn) - - self.list_widget.setItemWidget(item, widget) - - def on_dl_click(self, url): - self.item_selected.emit(url) - self.accept() + self.list_widget.itemDoubleClicked.connect(self.accept) + + btn_layout = QHBoxLayout() + self.cancel_btn = QPushButton("CANCEL") + self.cancel_btn.setStyleSheet("background-color: #333; color: #888; border-radius: 5px;") + self.cancel_btn.clicked.connect(self.reject) + + btn_hl = QPushButton("DOWNLOAD & IMPORT") + btn_hl.clicked.connect(self.accept) + + btn_layout.addWidget(self.cancel_btn) + btn_layout.addWidget(btn_hl) + layout.addLayout(btn_layout) + def get_selected_url(self): + i = self.list_widget.currentItem() + return i.data(Qt.ItemDataRole.UserRole) if i else None - -class TechDJMainWindow(QMainWindow): - """Main window matching web panel layout""" +class RecordingWorker(QProcess): + """Records system audio output using FFmpeg""" + recording_started = pyqtSignal() + recording_error = pyqtSignal(str) + def __init__(self, parent=None): + super().__init__(parent) + self.output_file = "" + self.readyReadStandardError.connect(self.handle_error) + + def start_recording(self, output_path): + """Start recording system audio to file""" + self.output_file = output_path + + # Check if FFmpeg is available + if not shutil.which("ffmpeg"): + self.recording_error.emit("FFmpeg not found. Install with: sudo apt install ffmpeg") + return False + + print(f"[RECORDING] Starting: {output_path}") + + # FFmpeg command to record PulseAudio output with high quality + # IMPORTANT: Use .monitor to capture OUTPUT (what you hear), not INPUT (microphone) + # -f pulse: use PulseAudio + # -i default.monitor: capture system audio OUTPUT (not microphone) + # -ac 2: stereo + # -ar 48000: 48kHz sample rate (higher quality than 44.1kHz) + # -acodec pcm_s16le: uncompressed 16-bit PCM (lossless) + # -sample_fmt s16: 16-bit samples + args = [ + "-f", "pulse", + "-i", "default.monitor", # .monitor captures OUTPUT, not microphone! + "-ac", "2", + "-ar", "48000", # Higher sample rate for better quality + "-acodec", "pcm_s16le", # Lossless PCM codec + "-sample_fmt", "s16", + "-y", # Overwrite if exists + output_path + ] + + self.start("ffmpeg", args) + self.recording_started.emit() + return True + + def stop_recording(self): + """Stop the recording""" + if self.state() == QProcess.ProcessState.Running: + print("[RECORDING] Stopping...") + # Send 'q' to FFmpeg to gracefully stop + self.write(b"q") + self.waitForFinished(3000) + if self.state() == QProcess.ProcessState.Running: + self.kill() + + def handle_error(self): + """Handle FFmpeg stderr (which includes progress info)""" + err = self.readAllStandardError().data().decode('utf-8', errors='ignore').strip() + if err and "error" in err.lower(): + print(f"[RECORDING ERROR] {err}") + +class StreamingWorker(QThread): + """Streams system audio output to a server using Socket.IO Chunks""" + streaming_started = pyqtSignal() + streaming_error = pyqtSignal(str) + listener_count = pyqtSignal(int) + + def __init__(self, parent=None): + super().__init__(parent) + self.sio = socketio.Client() + self.stream_url = "" + self.is_running = False + self.ffmpeg_proc = None + + # Socket.IO event handlers + self.sio.on('connect', self.on_connect) + self.sio.on('disconnect', self.on_disconnect) + self.sio.on('listener_count', self.on_listener_count) + self.sio.on('connect_error', self.on_connect_error) + + def on_connect(self): + print("[SOCKET] Connected to DJ server") + self.sio.emit('start_broadcast', {'format': 'mp3', 'bitrate': '128k'}) + self.streaming_started.emit() + + def on_disconnect(self): + print("[SOCKET] Disconnected from DJ server") + + def on_connect_error(self, data): + self.streaming_error.emit(f"Connection error: {data}") + + def on_listener_count(self, data): + self.listener_count.emit(data.get('count', 0)) + + def run(self): + try: + # Connect to socket + self.sio.connect(self.stream_url) + + # Start FFmpeg to capture audio and output to pipe + cmd = [ + "ffmpeg", + "-hide_banner", + "-loglevel", "error", + "-f", "pulse", + "-i", "default.monitor", + "-ac", "2", + "-ar", "44100", + "-f", "mp3", + "-b:a", "128k", + "-af", "aresample=async=1", + "pipe:1" + ] + self.ffmpeg_proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=8192) + + while self.is_running and self.ffmpeg_proc.poll() is None: + chunk = self.ffmpeg_proc.stdout.read(8192) + if not chunk: break + if self.sio.connected: + self.sio.emit('audio_chunk', chunk) + + except Exception as e: + self.streaming_error.emit(f"Streaming thread error: {e}") + finally: + self.stop_streaming() + + def start_streaming(self, base_url, bitrate=128): + self.stream_url = base_url + self.is_running = True + self.start() + return True + + def stop_streaming(self): + self.is_running = False + if self.ffmpeg_proc: + try: self.ffmpeg_proc.terminate() + except: pass + self.ffmpeg_proc = None + if self.sio.connected: + self.sio.emit('stop_broadcast') + time.sleep(0.2) + self.sio.disconnect() + +# --- WIDGETS --- + +class GlowFrame(QWidget): + """Custom widget that paints a neon glow effect around the edges""" + def __init__(self, parent=None): + super().__init__(parent) + self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents) # Don't block mouse events + self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) + self.glow_color = QColor("#0ff") + self.glow_enabled = False + + def set_glow(self, enabled, color="#0ff"): + self.glow_enabled = enabled + self.glow_color = QColor(color) + self.update() + + def paintEvent(self, event): + if not self.glow_enabled: + return + + painter = QPainter(self) + painter.setRenderHint(QPainter.RenderHint.Antialiasing) + + rect = self.rect() + glow_width = 80 # Wider glow for more intensity + + # Draw glow from each edge using linear gradients + from PyQt6.QtGui import QLinearGradient + + # Top edge glow + top_gradient = QLinearGradient(0, 0, 0, glow_width) + for i in range(6): + pos = i / 5.0 + alpha = int(255 * (1 - pos)) # Full opacity at edge + color = QColor(self.glow_color) + color.setAlpha(alpha) + top_gradient.setColorAt(pos, color) + painter.fillRect(0, 0, rect.width(), glow_width, top_gradient) + + # Bottom edge glow + bottom_gradient = QLinearGradient(0, rect.height() - glow_width, 0, rect.height()) + for i in range(6): + pos = i / 5.0 + alpha = int(255 * pos) + color = QColor(self.glow_color) + color.setAlpha(alpha) + bottom_gradient.setColorAt(pos, color) + painter.fillRect(0, rect.height() - glow_width, rect.width(), glow_width, bottom_gradient) + + # Left edge glow + left_gradient = QLinearGradient(0, 0, glow_width, 0) + for i in range(6): + pos = i / 5.0 + alpha = int(255 * (1 - pos)) + color = QColor(self.glow_color) + color.setAlpha(alpha) + left_gradient.setColorAt(pos, color) + painter.fillRect(0, 0, glow_width, rect.height(), left_gradient) + + # Right edge glow + right_gradient = QLinearGradient(rect.width() - glow_width, 0, rect.width(), 0) + for i in range(6): + pos = i / 5.0 + alpha = int(255 * pos) + color = QColor(self.glow_color) + color.setAlpha(alpha) + right_gradient.setColorAt(pos, color) + painter.fillRect(rect.width() - glow_width, 0, glow_width, rect.height(), right_gradient) + +class VinylWidget(QWidget): + def __init__(self, color_hex, parent=None): + super().__init__(parent) + self.setMinimumSize(120, 120) + self.angle = 0 + self.speed = 1.0 + self.is_spinning = False + self.color = QColor(color_hex) + + # Initialize drawing resources + self.brush_disk = QBrush(QColor("#111")) + self.pen_disk = QPen(QColor("#000"), 2) + self.brush_label = QBrush(self.color) + self.brush_white = QBrush(Qt.GlobalColor.white) + self.center = QPointF(0, 0) + self.radius = 0 + + self.timer = QTimer(self) + self.timer.timeout.connect(self.rotate) + + def resizeEvent(self, event): + w, h = self.width(), self.height() + self.center = QPointF(w / 2, h / 2) + self.radius = min(w, h) / 2 - 5 + super().resizeEvent(event) + + def start_spin(self): + if not self.is_spinning: + self.is_spinning = True + self.timer.start(ANIMATION_INTERVAL) + + def stop_spin(self): + self.is_spinning = False + self.timer.stop() + + def set_speed(self, rate): + self.speed = rate + + def rotate(self): + self.angle = (self.angle + 3.0 * self.speed) % 360 + self.update() + + def paintEvent(self, event): + p = QPainter(self) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + p.translate(self.center) + p.rotate(self.angle) + + # Draw vinyl disk + p.setBrush(self.brush_disk) + p.setPen(self.pen_disk) + p.drawEllipse(QPointF(0, 0), self.radius, self.radius) + + # Draw grooves + p.setBrush(Qt.BrushStyle.NoBrush) + p.setPen(QPen(QColor("#222"), 1)) + p.drawEllipse(QPointF(0, 0), self.radius * 0.8, self.radius * 0.8) + p.drawEllipse(QPointF(0, 0), self.radius * 0.6, self.radius * 0.6) + + # Draw center label + p.setBrush(self.brush_label) + p.setPen(Qt.PenStyle.NoPen) + p.drawEllipse(QPointF(0, 0), self.radius * 0.35, self.radius * 0.35) + + # Draw position marker + p.setBrush(self.brush_white) + p.drawRect(QRectF(-2, -self.radius * 0.35, 4, 12)) + +class WaveformWidget(QWidget): + seekRequested = pyqtSignal(int) + + def __init__(self, color_hex, parent=None): + super().__init__(parent) + self.color = QColor(color_hex) + self.setMinimumHeight(60) + self.setCursor(Qt.CursorShape.PointingHandCursor) + + self.duration = 1 + self.position = 0 + self.wave_data = [] + self.loop_active = False + self.loop_start = 0 + self.loop_end = 0 + self.last_seek_time = 0 + + # Initialize drawing resources + self.brush_active = QBrush(self.color) + self.brush_inactive = QBrush(QColor("#444")) + self.pen_white = QPen(QColor("#fff"), 2) + self.loop_brush = QBrush(QColor(255, 165, 0, 100)) + self.loop_pen = QPen(QColor("#ffa500"), 2) + + def generate_wave(self, file_path): + random.seed(str(file_path)) + self.wave_data = [max(0.1, random.random()**2) for _ in range(250)] + self.update() + + def set_duration(self, d): + self.duration = max(1, d) + self.update() + + def set_position(self, p): + self.position = p + self.update() + + def set_loop_region(self, active, start, end): + self.loop_active = active + self.loop_start = start + self.loop_end = end + self.update() + + def mousePressEvent(self, e): + if time.time() - self.last_seek_time > 0.1: + seek_pos = int((e.position().x() / self.width()) * self.duration) + self.seekRequested.emit(seek_pos) + self.last_seek_time = time.time() + + def mouseMoveEvent(self, e): + if time.time() - self.last_seek_time > 0.1: + seek_pos = int((e.position().x() / self.width()) * self.duration) + self.seekRequested.emit(seek_pos) + self.last_seek_time = time.time() + + def paintEvent(self, event): + p = QPainter(self) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + w, h = self.width(), self.height() + p.fillRect(0, 0, w, h, QColor("#111")) + + if not self.wave_data: + p.setPen(self.pen_white) + p.drawLine(0, int(h / 2), w, int(h / 2)) + return + + bar_width = w / len(self.wave_data) + play_x = (self.position / self.duration) * w + p.setPen(Qt.PenStyle.NoPen) + + # Draw waveform bars + for i, val in enumerate(self.wave_data): + brush = self.brush_active if i * bar_width < play_x else self.brush_inactive + p.setBrush(brush) + bar_height = val * h * 0.9 + p.drawRect(QRectF(i * bar_width, (h - bar_height) / 2, bar_width, bar_height)) + + # Draw loop region + if self.loop_active: + loop_x = (self.loop_start / self.duration) * w + loop_width = ((self.loop_end - self.loop_start) / self.duration) * w + p.setBrush(self.loop_brush) + p.drawRect(QRectF(loop_x, 0, loop_width, h)) + p.setPen(self.loop_pen) + p.drawLine(int(loop_x), 0, int(loop_x), h) + p.drawLine(int(loop_x + loop_width), 0, int(loop_x + loop_width), h) + + # Draw playhead + p.setPen(self.pen_white) + p.drawLine(int(play_x), 0, int(play_x), h) + +class DeckWidget(QGroupBox): + def __init__(self, name, color_code, deck_id, parent=None): + super().__init__(name, parent) + self.setObjectName(name.replace(" ", "_")) + self.color_code = color_code + self.deck_id = deck_id + self.playback_mode = 0 + self.loop_active = False + self.loop_start = 0 + self.loop_end = 0 + self.loop_btns = [] + self.xf_vol = 100 + + self.loop_timer = QTimer(self) + self.loop_timer.setInterval(LOOP_CHECK_INTERVAL) + self.loop_timer.timeout.connect(self.check_loop) + + self.audio_output = QAudioOutput() + self.player = QMediaPlayer() + self.player.setAudioOutput(self.audio_output) + self.player.positionChanged.connect(self.on_position_changed) + self.player.durationChanged.connect(self.on_duration_changed) + self.player.mediaStatusChanged.connect(self.check_queue) + self.real_duration = 0 + + self.setup_ui() + + def setup_ui(self): + layout = QVBoxLayout() + layout.setSpacing(5) + + # Top row: Vinyl and track info + r1 = QHBoxLayout() + self.vinyl = VinylWidget(self.color_code) + r1.addWidget(self.vinyl) + + c1 = QVBoxLayout() + self.lbl_tr = QLabel("NO MEDIA") + self.lbl_tr.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.lbl_tr.setStyleSheet( + f"color: {self.color_code}; border: 1px solid {self.color_code}; " + f"background: #000; padding: 4px;" + ) + self.lbl_tr.setWordWrap(True) + c1.addWidget(self.lbl_tr) + + rt = QHBoxLayout() + self.lbl_cur = QLabel("00:00") + self.lbl_cur.setStyleSheet("color:#fff") + self.lbl_tot = QLabel("00:00") + self.lbl_tot.setStyleSheet("color:#fff") + rt.addWidget(self.lbl_cur) + rt.addStretch() + rt.addWidget(self.lbl_tot) + c1.addLayout(rt) + r1.addLayout(c1) + layout.addLayout(r1) + + # Waveform + self.wave = WaveformWidget(self.color_code) + self.wave.seekRequested.connect(self.player.setPosition) + layout.addWidget(self.wave) + + # Loop buttons + g = QGridLayout() + g.setSpacing(2) + loops = [("8", 8), ("4", 4), ("2", 2), ("1", 1), ("1/2", 0.5), ("1/4", 0.25), ("1/8", 0.125)] + for i, (label, beats) in enumerate(loops): + btn = QPushButton(label) + btn.setObjectName("btn_loop") + btn.setCheckable(True) + btn.setToolTip(f"Set loop to {beats} beat(s)") + btn.clicked.connect(lambda c, b=beats, o=btn: self.set_loop(b, o)) + g.addWidget(btn, 0, i) + self.loop_btns.append(btn) + + exit_btn = QPushButton("EXIT") + exit_btn.setObjectName("btn_loop_exit") + exit_btn.setToolTip("Clear active loop") + exit_btn.clicked.connect(self.clear_loop) + g.addWidget(exit_btn, 0, len(loops)) + layout.addLayout(g) + + # Playback controls + rc = QHBoxLayout() + bp = QPushButton("PLAY") + bp.setToolTip("Play track") + bp.clicked.connect(self.play) + + bpa = QPushButton("PAUSE") + bpa.setToolTip("Pause playback") + bpa.clicked.connect(self.pause) + + bs = QPushButton("STOP") + bs.setToolTip("Stop playback") + bs.clicked.connect(self.stop) + + self.b_mode = QPushButton("MODE: CONT") + self.b_mode.setFixedWidth(100) + self.b_mode.setProperty("mode", "0") + self.b_mode.setToolTip("Cycle playback mode: Continuous / Loop 1 / Stop") + self.b_mode.clicked.connect(self.cycle_mode) + + rc.addWidget(bp) + rc.addWidget(bpa) + rc.addWidget(bs) + rc.addSpacing(10) + rc.addWidget(self.b_mode) + layout.addLayout(rc) + + # Pitch control + rp = QHBoxLayout() + self.sl_rate = QSlider(Qt.Orientation.Horizontal) + self.sl_rate.setRange(50, 150) + self.sl_rate.setValue(100) + self.sl_rate.setToolTip("Adjust playback speed / pitch") + self.sl_rate.valueChanged.connect(self.update_playback_rate) + + br = QPushButton("R") + br.setToolTip("Reset pitch to 1.0x") + br.clicked.connect(lambda: self.sl_rate.setValue(100)) + + self.lbl_rate = QLabel("1.0x") + self.lbl_rate.setStyleSheet("color:#fff; font-weight:bold;") + + rp.addWidget(QLabel("PITCH", styleSheet="color:#666")) + rp.addWidget(self.sl_rate) + rp.addWidget(br) + rp.addWidget(self.lbl_rate) + layout.addLayout(rp) + + # Bottom section: Queue and EQ + bottom = QHBoxLayout() + + # Queue widget + qc = QWidget() + ql = QVBoxLayout(qc) + ql.setContentsMargins(0, 0, 0, 0) + + hq = QHBoxLayout() + hq.addWidget(QLabel(f"QUEUE {self.deck_id}", styleSheet="font-size:10px; color:#666")) + bd = QPushButton("X") + bd.setObjectName("btn_remove") + bd.setToolTip("Remove selected track from queue") + bd.clicked.connect(self.delete_selected) + hq.addStretch() + hq.addWidget(bd) + ql.addLayout(hq) + + self.q_list = QListWidget() + self.q_list.setObjectName("queue_list") + self.q_list.setDragDropMode(QAbstractItemView.DragDropMode.InternalMove) + self.q_list.setDefaultDropAction(Qt.DropAction.MoveAction) + self.q_list.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection) + self.q_list.itemDoubleClicked.connect( + lambda i: self.q_list.takeItem(self.q_list.row(i)) + ) + QShortcut(QKeySequence(Qt.Key.Key_Delete), self.q_list).activated.connect(self.delete_selected) + ql.addWidget(self.q_list) + + # EQ sliders widget + sc = QWidget() + sl = QVBoxLayout(sc) + sl.setContentsMargins(0, 0, 0, 0) + row_s = QHBoxLayout() + + def make_slider(prop, label, tooltip): + v = QVBoxLayout() + s = QSlider(Qt.Orientation.Vertical) + s.setRange(0, MAX_SLIDER_VALUE) + s.setValue(MAX_SLIDER_VALUE) + s.setProperty("eq", prop) + s.setToolTip(tooltip) + s.valueChanged.connect(self.recalc_vol) + l = QLabel(label) + l.setAlignment(Qt.AlignmentFlag.AlignCenter) + l.setStyleSheet("font-size:8px; color:#aaa;") + v.addWidget(s, 1, Qt.AlignmentFlag.AlignHCenter) + v.addWidget(l) + row_s.addLayout(v) + return s + + self.sl_vol = make_slider("vol", "LEV", "Volume level") + self.sl_hi = make_slider("high", "HI", "High frequencies (treble)") + self.sl_mid = make_slider("mid", "MID", "Mid frequencies") + self.sl_low = make_slider("low", "LO", "Low frequencies (bass)") + + sl.addLayout(row_s) + + if self.deck_id == "A": + bottom.addWidget(qc, 3) + bottom.addWidget(sc, 1) + else: + bottom.addWidget(sc, 1) + bottom.addWidget(qc, 3) + + layout.addLayout(bottom, 1) + self.setLayout(layout) + + def delete_selected(self): + for item in self.q_list.selectedItems(): + self.q_list.takeItem(self.q_list.row(item)) + + def cycle_mode(self): + self.playback_mode = (self.playback_mode + 1) % 3 + modes = {0: "CONT", 1: "LOOP 1", 2: "STOP"} + self.b_mode.setText(f"MODE: {modes[self.playback_mode]}") + self.b_mode.setProperty("mode", str(self.playback_mode)) + self.b_mode.style().unpolish(self.b_mode) + self.b_mode.style().polish(self.b_mode) + + def set_loop(self, beats, btn): + for x in self.loop_btns: + x.setChecked(x == btn) + + if self.player.playbackState() != QMediaPlayer.PlaybackState.PlayingState: + return + + ms_per_beat = MS_PER_MINUTE / DEFAULT_BPM + self.loop_start = self.player.position() + self.loop_end = self.loop_start + int(ms_per_beat * beats) + self.loop_active = True + self.loop_timer.start() + self.wave.set_loop_region(True, self.loop_start, self.loop_end) + + def clear_loop(self): + self.loop_active = False + self.loop_timer.stop() + self.wave.set_loop_region(False, 0, 0) + for btn in self.loop_btns: + btn.setChecked(False) + + def check_loop(self): + if self.loop_active and self.player.position() >= self.loop_end: + self.player.setPosition(int(self.loop_start)) + + def load_track(self, path): + if not path: + return + + p = Path(path) + if not p.exists(): + print(f"[ERROR] Track path does not exist: {p}") + return + + try: + self.player.setSource(QUrl.fromLocalFile(str(p.absolute()))) + self.lbl_tr.setText(p.stem.upper()) + self.vinyl.set_speed(0) + self.vinyl.angle = 0 + self.vinyl.update() + self.wave.generate_wave(p) + # Find parent DJApp to show status + parent = self.window() + if hasattr(parent, 'status_label'): + parent.status_label.setText(f"Loaded: {p.name}") + + # Use soundfile to get accurate duration (GStreamer/Qt6 can be wrong) + try: + info = sf.info(str(p.absolute())) + self.real_duration = int(info.duration * 1000) + print(f"[DEBUG] {self.deck_id} Real Duration: {self.real_duration}ms") + # Update UI immediately if possible, or wait for player durationChanged + self.wave.set_duration(self.real_duration) + except Exception as se: + print(f"[DEBUG] Could not get accurate duration with soundfile: {se}") + self.real_duration = 0 + except Exception as e: + print(f"[ERROR] Failed to load track {p}: {e}") + self.lbl_tr.setText("LOAD ERROR") + + def add_queue(self, path): + p = Path(path) + item = QListWidgetItem(p.name) + item.setData(Qt.ItemDataRole.UserRole, p) + self.q_list.addItem(item) + + def check_queue(self, status): + if status == QMediaPlayer.MediaStatus.EndOfMedia: + # Check if this is a premature EndOfMedia (common in GStreamer with certain VBR MP3s) + if self.real_duration > 0 and self.player.position() < self.real_duration - 1000: + print(f"[DEBUG] {self.deck_id} Premature EndOfMedia detected. Position: {self.player.position()}, Expected: {self.real_duration}") + # Don't skip yet, maybe the user wants to seek back? + # Or we could try to play again, but usually GStreamer won't go further. + + if self.playback_mode == 1: + # Loop 1 mode + self.player.setPosition(0) + self.play() + elif self.playback_mode == 0 and self.q_list.count() > 0: + # Continuous mode - load next from queue + next_item = self.q_list.takeItem(0) + self.load_track(next_item.data(Qt.ItemDataRole.UserRole)) + self.play() + else: + # Stop mode or no queue items + self.stop() + + def play(self): + self.player.play() + self.vinyl.start_spin() + + def pause(self): + self.player.pause() + self.vinyl.stop_spin() + + def stop(self): + self.player.stop() + self.vinyl.stop_spin() + self.vinyl.angle = 0 + self.vinyl.update() + self.clear_loop() + + def on_position_changed(self, pos): + self.wave.set_position(pos) + minutes = int(pos // MS_PER_MINUTE) + seconds = int((pos // 1000) % 60) + self.lbl_cur.setText(f"{minutes:02}:{seconds:02}") + + def on_duration_changed(self, duration): + # Use our accurate duration if available, otherwise fallback to player's reported duration + final_duration = self.real_duration if self.real_duration > 0 else duration + self.wave.set_duration(final_duration) + minutes = int(final_duration // MS_PER_MINUTE) + seconds = int((final_duration // 1000) % 60) + self.lbl_tot.setText(f"{minutes:02}:{seconds:02}") + + def update_playback_rate(self, value): + rate = value / 100.0 + self.player.setPlaybackRate(rate) + self.lbl_rate.setText(f"{rate:.1f}x") + self.vinyl.set_speed(rate) + + def set_xf_vol(self, volume): + self.xf_vol = volume + self.recalc_vol() + + def recalc_vol(self): + eq_hi = self.sl_hi.value() / MAX_SLIDER_VALUE + eq_mid = self.sl_mid.value() / MAX_SLIDER_VALUE + eq_low = self.sl_low.value() / MAX_SLIDER_VALUE + eq_gain = eq_hi * eq_mid * eq_low + + final = (self.xf_vol / 100.0) * (self.sl_vol.value() / MAX_SLIDER_VALUE) * eq_gain + self.audio_output.setVolume(final) + +class DJApp(QMainWindow): def __init__(self): super().__init__() - - self.server_url = "http://54.37.246.24:5000" - self.cache_dir = Path.home() / ".techdj_cache" - self.cache_dir.mkdir(exist_ok=True) - - self.audio_engine = AudioEngine() - self.library = [] - self.download_threads = {} - self.broadcasting = False - self.broadcast_thread = None - self.listener_count = 0 - self.glow_enabled = {'A': False, 'B': False} - self.glow_intensity = 30 - self.deck_loading_target = {'A': None, 'B': None} - - # Socket.IO for broadcasting - self.socket = None - - # Library settings - self.library_mode = 'server' # 'server' or 'local' - self.server_library = [] - self.local_library = [] - self.local_folder = None - self.load_settings() - - # Search debounce timer - self.search_timer = QTimer() - self.search_timer.setSingleShot(True) - # Search is now fast enough to update quickly - self.search_timer.timeout.connect(lambda: self.update_library_list(rebuild=False)) - - self.init_ui() + self.setWindowTitle("TechDJ Pro - Neon Edition") + self.resize(1200, 950) + self.setStyleSheet(STYLESHEET) # Set window icon - icon_path = os.path.join(os.path.dirname(__file__), 'icon.png') + icon_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "dj_icon.png") if os.path.exists(icon_path): self.setWindowIcon(QIcon(icon_path)) - self.audio_engine.start_stream() - self.fetch_library() + self.neon_state = 0 + + # --- LOCAL FOLDER SETUP --- + # Creates a folder named 'dj_tracks' inside your project directory + self.lib_path = Path(os.getcwd()) / "music" + if not self.lib_path.exists(): + try: + self.lib_path.mkdir(exist_ok=True) + print(f"[INIT] Created library folder: {self.lib_path}") + except Exception as e: + print(f"[ERROR] Could not create library folder: {e}") + + # Create recordings folder + self.recordings_path = Path(os.getcwd()) / "recordings" + if not self.recordings_path.exists(): + try: + self.recordings_path.mkdir(exist_ok=True) + print(f"[INIT] Created recordings folder: {self.recordings_path}") + except Exception as e: + print(f"[ERROR] Could not create recordings folder: {e}") + + self.search_worker = YTSearchWorker() + self.search_worker.results_ready.connect(self.on_search_results) + self.search_worker.error_occurred.connect(self.on_error) + + self.download_worker = YTDownloadWorker() + self.download_worker.download_finished.connect(self.on_download_complete) + self.download_worker.error_occurred.connect(self.on_error) + self.download_worker.download_progress.connect(self.update_download_progress) + + # Recording setup + self.recording_worker = RecordingWorker() + self.recording_worker.recording_error.connect(self.on_recording_error) + self.is_recording = False + self.recording_start_time = 0 + self.recording_timer = QTimer() + self.recording_timer.timeout.connect(self.update_recording_time) + + # Streaming setup + self.streaming_worker = StreamingWorker() + self.streaming_worker.streaming_error.connect(self.on_streaming_error) + self.streaming_worker.listener_count.connect(self.update_listener_count) + self.is_streaming = False + + # Server library state + self.server_url = "http://localhost:5000" + self.library_mode = "local" # "local" or "server" + self.server_library = [] + self.local_library = [] + self.cache_dir = Path.home() / ".techdj_cache" + self.cache_dir.mkdir(exist_ok=True) + self.download_threads = {} + + self.init_ui() + self.setup_keyboard_shortcuts() + self.apply_ui_settings() # Apply saved UI settings + + # Filtering debounce timer + self.filter_timer = QTimer() + self.filter_timer.setSingleShot(True) + self.filter_timer.timeout.connect(self.perform_filter) + + self.load_library() def init_ui(self): - self.setWindowTitle("TechDJ Pro - Native Edition") - self.setGeometry(50, 50, 1600, 900) + main = QWidget() + main.setObjectName("Central") # Set objectName for neon border styling + self.setCentralWidget(main) + layout = QVBoxLayout(main) + layout.setContentsMargins(15, 15, 15, 15) - # Central widget with overlay support - central = QWidget() - self.setCentralWidget(central) + # Create glow overlay + self.glow_frame = GlowFrame(main) + self.glow_frame.setGeometry(main.rect()) + self.glow_frame.raise_() # Bring to front - # Overall vertical layout for central widget - self.container_layout = QVBoxLayout(central) - self.container_layout.setContentsMargins(0, 0, 0, 0) - self.container_layout.setSpacing(0) + # Top bar: Neon toggle and YouTube search + h = QHBoxLayout() + self.neon_button = QPushButton("NEON EDGE: OFF") + self.neon_button.setObjectName("btn_neon") + self.neon_button.setFixedWidth(150) + self.neon_button.setToolTip("Toggle neon border effect") + self.neon_button.clicked.connect(self.toggle_neon) - # --- Download Bar (Minimized) --- - self.download_bar = QWidget() - self.download_bar.setFixedHeight(38) # Reduced from 50 - self.download_bar.setStyleSheet(f""" - QWidget {{ - background: rgb(20, 20, 30); - border-bottom: 1px solid rgba({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}, 0.3); - }} - """) - dl_layout = QHBoxLayout(self.download_bar) - dl_layout.setContentsMargins(10, 2, 10, 2) # Tighten margins + self.yt_input = QLineEdit() + self.yt_input.setPlaceholderText("Search YouTube or Paste URL...") + self.yt_input.setToolTip("Search YouTube with keywords or paste a YouTube/YT Music URL to download directly") + self.yt_input.returnPressed.connect(self.search_youtube) - self.dl_input = QLineEdit() - self.dl_input.setPlaceholderText("Paste URL or Type to Search (YT, SC, etc.)") - self.dl_input.setStyleSheet(f""" - QLineEdit {{ - background: rgba(255, 255, 255, 0.05); - border: 1px solid #333; - color: white; - padding: 4px 12px; - border-radius: 12px; - font-family: 'Rajdhani'; - font-size: 12px; - }} - QLineEdit:focus {{ border: 1px solid rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); }} - """) - self.dl_input.returnPressed.connect(self.start_download) - dl_layout.addWidget(self.dl_input, 1) + # Format selector dropdown + self.format_selector = QComboBox() + self.format_selector.addItem("MP3 (slower, universal)", "mp3") + self.format_selector.addItem("Best Quality (faster)", "best") + self.format_selector.setCurrentIndex(0) # Default to MP3 + self.format_selector.setToolTip("Choose download format:\nMP3 = Converted, slower\nBest = Original quality, faster") + self.format_selector.setFixedWidth(160) - self.dl_btn = NeonButton("GET", SECONDARY_MAGENTA) # Shorter text - self.dl_btn.setFixedSize(60, 26) # Smaller button - self.dl_btn.clicked.connect(self.start_download) - dl_layout.addWidget(self.dl_btn) + self.search_button = QPushButton("GO") + self.search_button.setObjectName("btn_yt_go") + self.search_button.setFixedWidth(40) + self.search_button.setToolTip("Start YouTube search") + self.search_button.clicked.connect(self.search_youtube) - self.dl_progress = QProgressBar() - self.dl_progress.setFixedWidth(120) - self.dl_progress.setFixedHeight(4) - self.dl_progress.setTextVisible(False) - self.dl_progress.setStyleSheet(f""" - QProgressBar {{ background: #111; border: none; border-radius: 2px; }} - QProgressBar::chunk {{ background: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); }} - """) - self.dl_progress.hide() - dl_layout.addWidget(self.dl_progress) + self.settings_btn = QPushButton("MAP") + self.settings_btn.setFixedWidth(40) + self.settings_btn.setToolTip("Open Keyboard Mapping Settings") + self.settings_btn.clicked.connect(self.open_settings) - self.container_layout.addWidget(self.download_bar) + self.status_label = QLabel("") + self.status_label.setStyleSheet("color:#0f0; font-weight:bold") - # Main grid layout matching web panel - main_layout = QHBoxLayout() - # Create a widget to hold main_layout - self.app_content = QWidget() - self.app_content.setLayout(main_layout) - self.container_layout.addWidget(self.app_content, 1) - main_layout.setSpacing(10) - main_layout.setContentsMargins(10, 10, 10, 10) + h.addWidget(self.neon_button) + h.addSpacing(10) + h.addWidget(self.yt_input) + h.addWidget(self.format_selector) + h.addWidget(self.search_button) + h.addWidget(self.settings_btn) + h.addWidget(self.status_label) + layout.addLayout(h) - # Left: Library (320px) - library_widget = QWidget() - library_widget.setFixedWidth(320) - library_widget.setStyleSheet(f""" - QWidget {{ - background: rgba(20, 20, 30, 0.8); - border: 2px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - border-radius: 10px; - }} - """) - - library_layout = QVBoxLayout(library_widget) - library_layout.setSpacing(10) - library_layout.setContentsMargins(15, 15, 15, 15) - - lib_header = QLabel("📁 LIBRARY") - lib_header.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 16px; - font-weight: bold; - color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - border: none; - """) - library_layout.addWidget(lib_header) - - # Library Mode Switch - mode_switch_layout = QHBoxLayout() - self.server_mode_btn = NeonButton("SERVER", PRIMARY_CYAN) - self.server_mode_btn.set_active(True) - self.server_mode_btn.clicked.connect(lambda: self.set_library_mode('server')) - - self.local_mode_btn = NeonButton("LOCAL", TEXT_DIM) - self.local_mode_btn.clicked.connect(lambda: self.set_library_mode('local')) - - mode_switch_layout.addWidget(self.server_mode_btn) - mode_switch_layout.addWidget(self.local_mode_btn) - library_layout.addLayout(mode_switch_layout) - - # Local Folder Selection (hidden by default) - self.local_folder_widget = QWidget() - local_folder_layout = QHBoxLayout(self.local_folder_widget) - local_folder_layout.setContentsMargins(0, 0, 0, 0) - - self.folder_label = QLabel("NO FOLDER...") - self.folder_label.setStyleSheet("color: #888; font-size: 10px;") - - select_folder_btn = QPushButton("📁") - select_folder_btn.setFixedSize(30, 30) - select_folder_btn.setStyleSheet("background: #333; border-radius: 4px; color: white;") - select_folder_btn.clicked.connect(self.select_local_folder) - - local_folder_layout.addWidget(self.folder_label, 1) - local_folder_layout.addWidget(select_folder_btn) - self.local_folder_widget.hide() - library_layout.addWidget(self.local_folder_widget) - - self.search_box = QLineEdit() - self.search_box.setPlaceholderText("🔍 FILTER LIBRARY...") - self.search_box.textChanged.connect(self.filter_library) - self.search_box.setStyleSheet(""" - QLineEdit { - background: rgba(0, 0, 0, 0.3); - border: 1px solid #333; - color: white; - padding: 10px; - border-radius: 4px; - font-family: 'Rajdhani'; + # Download progress bar + self.download_progress_bar = QProgressBar() + self.download_progress_bar.setRange(0, 100) + self.download_progress_bar.setValue(0) + self.download_progress_bar.setTextVisible(True) + self.download_progress_bar.setFormat("%p% - Downloading...") + self.download_progress_bar.setStyleSheet(""" + QProgressBar { + border: 1px solid #555; + border-radius: 3px; + text-align: center; + background-color: #111; + color: #fff; + } + QProgressBar::chunk { + background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, + stop:0 #00ff00, stop:1 #00aa00); + border-radius: 2px; } """) - library_layout.addWidget(self.search_box) + self.download_progress_bar.setVisible(False) # Hidden by default + layout.addWidget(self.download_progress_bar) - self.library_list = QListWidget() - self.library_list.setSpacing(4) # Add spacing between items - self.library_list.setStyleSheet(""" - QListWidget { - background: rgba(0, 0, 0, 0.3); - border: none; - color: white; - outline: none; - } - QListWidget::item { - background: transparent; - border: none; - padding: 0px; - margin: 0px; - } - QListWidget::item:selected { - background: transparent; - } - """) - self.library_list.itemDoubleClicked.connect(self.on_library_double_click) - library_layout.addWidget(self.library_list) + # Decks + decks_layout = QHBoxLayout() + self.deck_a = DeckWidget("Deck A", "#00ffff", "A") + decks_layout.addWidget(self.deck_a) - refresh_btn = QPushButton("🔄 Refresh Library") - refresh_btn.clicked.connect(self.fetch_library) - refresh_btn.setStyleSheet(f""" - QPushButton {{ - background: rgba(0, 243, 255, 0.1); - border: 1px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - padding: 8px 12px; - border-radius: 4px; - font-family: 'Orbitron'; - font-weight: bold; - }} - QPushButton:hover {{ - background: rgba(0, 243, 255, 0.2); - }} - """) - library_layout.addWidget(refresh_btn) + self.deck_b = DeckWidget("Deck B", "#ff00ff", "B") + decks_layout.addWidget(self.deck_b) - main_layout.addWidget(library_widget) - - # Right: Decks + Crossfader - decks_widget = QWidget() - decks_layout = QVBoxLayout(decks_widget) - decks_layout.setSpacing(10) - decks_layout.setContentsMargins(0, 0, 0, 0) - - # Decks grid - decks_grid = QHBoxLayout() - decks_grid.setSpacing(10) - - self.deck_a = DeckWidget('A', self.audio_engine) - decks_grid.addWidget(self.deck_a) - - self.deck_b = DeckWidget('B', self.audio_engine) - decks_grid.addWidget(self.deck_b) - - decks_layout.addLayout(decks_grid) + layout.addLayout(decks_layout, 70) # Crossfader - xfader_widget = QWidget() - xfader_widget.setFixedHeight(80) - xfader_widget.setStyleSheet(""" - QWidget { - background: qlineargradient(x1:0, y1:0, x1:0, y1:1, - stop:0 #1a1a1a, stop:1 #0a0a0a); - border: 2px solid #444; - border-radius: 8px; - } - """) - - # Crossfader Bar (Full Width) - xfader_widget = QWidget() - xfader_widget.setFixedHeight(80) - xfader_widget.setStyleSheet(""" - QWidget { - background: qlineargradient(x1:0, y1:0, x1:0, y1:1, - stop:0 #1a1a1a, stop:1 #0a0a0a); - border: 2px solid #444; - border-radius: 8px; - } - """) - - xfader_layout = QHBoxLayout(xfader_widget) - xfader_layout.setContentsMargins(40, 15, 40, 15) - - label_a = QLabel("A") - label_a.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 24px; - font-weight: bold; - color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - """) - xfader_layout.addWidget(label_a) - - self.crossfader = QSlider(Qt.Horizontal) + self.crossfader = QSlider(Qt.Orientation.Horizontal) + self.crossfader.setObjectName("crossfader") self.crossfader.setRange(0, 100) self.crossfader.setValue(50) - self.crossfader.valueChanged.connect(self.on_crossfader_change) - self.crossfader.setStyleSheet(""" - QSlider::groove:horizontal { - height: 12px; - background: qlineargradient(x1:0, y1:0, x1:1, y1:0, - stop:0 #00f3ff, stop:0.5 #333, stop:1 #bc13fe); - border-radius: 6px; - border: 2px solid #555; + self.crossfader.setToolTip("Crossfade between decks (Left = Deck A, Right = Deck B)") + self.crossfader.valueChanged.connect(self.update_crossfade) + + xf_layout = QVBoxLayout() + xf_layout.setContentsMargins(50, 5, 50, 5) + xf_layout.addWidget(self.crossfader) + layout.addLayout(xf_layout, 5) + + # Recording controls + rec_layout = QHBoxLayout() + rec_layout.setContentsMargins(50, 10, 50, 10) + + self.record_button = QPushButton("REC") + self.record_button.setFixedWidth(100) + self.record_button.setToolTip("Start/Stop recording your mix") + self.record_button.setStyleSheet(""" + QPushButton { + background-color: #330000; + color: #ff3333; + border: 2px solid #550000; + font-weight: bold; + font-size: 14px; + padding: 8px; } - QSlider::handle:horizontal { - background: qlineargradient(x1:0, y1:0, x1:0, y1:1, - stop:0 #aaa, stop:1 #666); - border: 3px solid #ccc; - width: 80px; - height: 48px; - margin: -18px 0; - border-radius: 8px; - } - QSlider::handle:horizontal:hover { - background: qlineargradient(x1:0, y1:0, x1:0, y1:1, - stop:0 #ccc, stop:1 #888); + QPushButton:hover { + background-color: #550000; + border-color: #ff0000; } """) - xfader_layout.addWidget(self.crossfader, 1) # Give it stretch + self.record_button.clicked.connect(self.toggle_recording) - label_b = QLabel("B") - label_b.setStyleSheet(f""" - font-family: 'Orbitron'; + self.recording_timer_label = QLabel("00:00") + self.recording_timer_label.setStyleSheet(""" + color: #888; font-size: 24px; font-weight: bold; - color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); + font-family: 'Courier New'; """) - xfader_layout.addWidget(label_b) + self.recording_timer_label.setAlignment(Qt.AlignmentFlag.AlignCenter) - decks_layout.addWidget(xfader_widget) + self.recording_status_label = QLabel("Ready to record") + self.recording_status_label.setStyleSheet("color: #666; font-size: 12px;") + self.recording_status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) - main_layout.addWidget(decks_widget, 1) - - # Floating action buttons (bottom right) - self.create_floating_buttons() - - # Streaming panel (hidden by default) - self.create_streaming_panel() - - # Settings panel (hidden by default) - self.create_settings_panel() - - # Window styling - self.setStyleSheet(f""" - QMainWindow {{ - background: rgb({BG_DARK.red()}, {BG_DARK.green()}, {BG_DARK.blue()}); - }} - QWidget {{ - color: rgb({TEXT_MAIN.red()}, {TEXT_MAIN.green()}, {TEXT_MAIN.blue()}); - font-family: 'Rajdhani', sans-serif; - }} - """) - - # Glow effect timer - self.glow_timer = QTimer() - self.glow_timer.timeout.connect(self.update_glow_effect) - self.glow_timer.start(100) - - def create_floating_buttons(self): - """Create floating action buttons in bottom-right corner""" - button_style = """ - QPushButton { - background: rgba(188, 19, 254, 0.2); - border: 2px solid #bc13fe; - color: white; - font-size: 20px; - border-radius: 25px; - padding: 10px; - } - QPushButton:hover { - background: rgba(188, 19, 254, 0.4); - } - """ + rec_left = QVBoxLayout() + rec_left.addWidget(self.recording_timer_label) + rec_left.addWidget(self.recording_status_label) # Streaming button - self.streaming_btn = QPushButton("📡", self) - self.streaming_btn.setFixedSize(50, 50) - self.streaming_btn.setStyleSheet(button_style) - self.streaming_btn.clicked.connect(self.toggle_streaming_panel) - self.streaming_btn.setToolTip("Live Streaming") - self.streaming_btn.move(self.width() - 70, self.height() - 280) - - # Settings button - self.settings_btn = QPushButton("⚙️", self) - self.settings_btn.setFixedSize(50, 50) - self.settings_btn.setStyleSheet(button_style) - self.settings_btn.clicked.connect(self.toggle_settings_panel) - self.settings_btn.setToolTip("Settings") - self.settings_btn.move(self.width() - 70, self.height() - 220) - - # Upload button - self.upload_btn = QPushButton("📁", self) - self.upload_btn.setFixedSize(50, 50) - self.upload_btn.setStyleSheet(button_style) - self.upload_btn.clicked.connect(self.upload_file) - self.upload_btn.setToolTip("Upload MP3") - self.upload_btn.move(self.width() - 70, self.height() - 160) - - # Keyboard shortcuts button - self.keyboard_btn = QPushButton("⌨️", self) - self.keyboard_btn.setFixedSize(50, 50) - self.keyboard_btn.setStyleSheet(button_style) - self.keyboard_btn.setToolTip("Keyboard Shortcuts") - self.keyboard_btn.move(self.width() - 70, self.height() - 100) - - def create_streaming_panel(self): - """Create streaming panel matching web version""" - self.streaming_panel = QWidget(self) - self.streaming_panel.setFixedSize(400, 500) - self.streaming_panel.setStyleSheet(f""" - QWidget {{ - background: rgba(20, 20, 30, 0.95); - border: 2px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - border-radius: 10px; - }} - """) - self.streaming_panel.hide() - - layout = QVBoxLayout(self.streaming_panel) - layout.setSpacing(15) - - # Header - header = QHBoxLayout() - title = QLabel("📡 LIVE STREAM") - title.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 16px; - font-weight: bold; - color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - """) - header.addWidget(title) - header.addStretch() - - close_btn = QPushButton("✕") - close_btn.setFixedSize(30, 30) - close_btn.clicked.connect(self.toggle_streaming_panel) - close_btn.setStyleSheet(""" + self.stream_button = QPushButton("LIVE") + self.stream_button.setFixedWidth(100) + self.stream_button.setToolTip("Start/Stop live streaming") + self.stream_button.setStyleSheet(""" QPushButton { - background: transparent; - border: none; - color: #888; - font-size: 18px; - } - QPushButton:hover { - color: white; - } - """) - header.addWidget(close_btn) - layout.addLayout(header) - - # Broadcast button - self.broadcast_btn = QPushButton("🔴 START BROADCAST") - self.broadcast_btn.setFixedHeight(60) - self.broadcast_btn.clicked.connect(self.toggle_broadcast) - self.broadcast_btn.setStyleSheet(f""" - QPushButton {{ - background: rgba(255, 0, 0, 0.2); - border: 2px solid #ff0000; - color: #ff0000; - font-family: 'Orbitron'; - font-size: 14px; + background-color: #001a33; + color: #3399ff; + border: 2px solid #003366; font-weight: bold; - border-radius: 8px; - }} - QPushButton:hover {{ - background: rgba(255, 0, 0, 0.3); - }} - """) - layout.addWidget(self.broadcast_btn) - - # Status - self.broadcast_status = QLabel("Offline") - self.broadcast_status.setAlignment(Qt.AlignCenter) - self.broadcast_status.setStyleSheet("color: #888; font-size: 12px;") - layout.addWidget(self.broadcast_status) - - # Listener count - listener_widget = QWidget() - listener_layout = QHBoxLayout(listener_widget) - listener_layout.setContentsMargins(0, 0, 0, 0) - - listener_icon = QLabel("👂") - listener_icon.setStyleSheet("font-size: 24px;") - listener_layout.addWidget(listener_icon) - - self.listener_count_label = QLabel("0") - self.listener_count_label.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 32px; - font-weight: bold; - color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); - """) - listener_layout.addWidget(self.listener_count_label) - - listener_text = QLabel("Listeners") - listener_text.setStyleSheet("color: #888; font-size: 14px;") - listener_layout.addWidget(listener_text) - listener_layout.addStretch() - - layout.addWidget(listener_widget) - - # Stream URL - url_label = QLabel("Share this URL:") - url_label.setStyleSheet("color: #888; font-size: 12px;") - layout.addWidget(url_label) - - url_widget = QWidget() - url_layout = QHBoxLayout(url_widget) - url_layout.setContentsMargins(0, 0, 0, 0) - url_layout.setSpacing(5) - - self.stream_url = QLineEdit("http://localhost:5001") - self.stream_url.setReadOnly(True) - self.stream_url.setStyleSheet(""" - QLineEdit { - background: rgba(0, 0, 0, 0.3); - border: 1px solid #333; - color: white; + font-size: 14px; padding: 8px; - border-radius: 4px; - } - """) - url_layout.addWidget(self.stream_url) - - copy_btn = QPushButton("📋") - copy_btn.setFixedSize(40, 30) - copy_btn.clicked.connect(self.copy_stream_url) - copy_btn.setStyleSheet(""" - QPushButton { - background: rgba(0, 243, 255, 0.1); - border: 1px solid #00f3ff; - color: #00f3ff; } QPushButton:hover { - background: rgba(0, 243, 255, 0.2); + background-color: #003366; + border-color: #0066cc; } """) - url_layout.addWidget(copy_btn) + self.stream_button.clicked.connect(self.toggle_streaming) - layout.addWidget(url_widget) + self.stream_status_label = QLabel("Offline") + self.stream_status_label.setStyleSheet("color: #666; font-size: 12px;") + self.stream_status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) - # Auto-start checkbox - self.auto_start_check = QCheckBox("Auto-start on play") - self.auto_start_check.setStyleSheet("color: #e0e0e0;") - layout.addWidget(self.auto_start_check) + self.listener_count_label = QLabel("0 listeners") + self.listener_count_label.setStyleSheet("color: #3399ff; font-size: 10px; font-weight: bold;") + self.listener_count_label.setAlignment(Qt.AlignmentFlag.AlignCenter) - # Quality selector - quality_label = QLabel("Stream Quality:") - quality_label.setStyleSheet("color: #888; font-size: 12px;") - layout.addWidget(quality_label) + stream_info = QVBoxLayout() + stream_info.addWidget(self.stream_status_label) + stream_info.addWidget(self.listener_count_label) - self.quality_combo = QComboBox() - self.quality_combo.addItems([ - "High (128kbps)", - "Medium (96kbps)", - "Low (64kbps)", - "Very Low (48kbps)", - "Minimum (32kbps)" - ]) - self.quality_combo.setCurrentIndex(1) - self.quality_combo.setStyleSheet(""" - QComboBox { - background: rgba(0, 0, 0, 0.3); - border: 1px solid #333; - color: white; - padding: 5px; - border-radius: 4px; - } - QComboBox::drop-down { - border: none; - } - QComboBox QAbstractItemView { - background: #1a1a1a; - color: white; - selection-background-color: #00f3ff; - } - """) - layout.addWidget(self.quality_combo) + rec_layout.addStretch() + rec_layout.addWidget(self.record_button) + rec_layout.addSpacing(20) + rec_layout.addLayout(rec_left) + rec_layout.addSpacing(40) + rec_layout.addWidget(self.stream_button) + rec_layout.addSpacing(20) + rec_layout.addLayout(stream_info) + rec_layout.addStretch() - hint = QLabel("Lower = more stable on poor connections") - hint.setStyleSheet("color: #666; font-size: 10px;") - layout.addWidget(hint) + layout.addLayout(rec_layout, 3) - layout.addStretch() + # Library section + library_group = QGroupBox("LIBRARY") + lib_layout = QVBoxLayout(library_group) - # Position panel - self.streaming_panel.move(self.width() - 420, 20) + button_row = QHBoxLayout() + + self.local_mode_btn = QPushButton("LOCAL") + self.local_mode_btn.setObjectName("btn_lib_local") + self.local_mode_btn.setCheckable(True) + self.local_mode_btn.setChecked(True) + self.local_mode_btn.clicked.connect(lambda: self.set_library_mode("local")) + + self.server_mode_btn = QPushButton("SERVER") + self.server_mode_btn.setObjectName("btn_lib_server") + self.server_mode_btn.setCheckable(True) + self.server_mode_btn.clicked.connect(lambda: self.set_library_mode("server")) + + refresh_btn = QPushButton("REFRESH") + refresh_btn.setToolTip("Rescan library folder for audio files") + refresh_btn.clicked.connect(self.load_library) + + upload_btn = QPushButton("UPLOAD") + upload_btn.setToolTip("Upload track to library") + upload_btn.clicked.connect(self.upload_track) + + load_a_btn = QPushButton("LOAD A") + load_a_btn.setToolTip("Load selected track to Deck A (Ctrl+L)") + load_a_btn.clicked.connect(lambda: self.load_to_deck(self.deck_a)) + + queue_a_btn = QPushButton("Q A+") + queue_a_btn.setToolTip("Add selected track to Deck A queue (Ctrl+Shift+L)") + queue_a_btn.clicked.connect(lambda: self.queue_to_deck(self.deck_a)) + + load_b_btn = QPushButton("LOAD B") + load_b_btn.setToolTip("Load selected track to Deck B (Ctrl+R)") + load_b_btn.clicked.connect(lambda: self.load_to_deck(self.deck_b)) + + queue_b_btn = QPushButton("Q B+") + queue_b_btn.setToolTip("Add selected track to Deck B queue (Ctrl+Shift+R)") + queue_b_btn.clicked.connect(lambda: self.queue_to_deck(self.deck_b)) + + for btn in [self.local_mode_btn, self.server_mode_btn, refresh_btn, upload_btn, load_a_btn, queue_a_btn, load_b_btn, queue_b_btn]: + button_row.addWidget(btn) + lib_layout.addLayout(button_row) + + self.search_filter = QLineEdit() + self.search_filter.setPlaceholderText("Filter...") + self.search_filter.setToolTip("Filter library by filename") + self.search_filter.textChanged.connect(self.filter_library) + lib_layout.addWidget(self.search_filter) + + self.library_list = QListWidget() + self.library_list.setObjectName("main_lib") + lib_layout.addWidget(self.library_list) + + layout.addWidget(library_group, 25) + + # Initialize crossfade + self.update_crossfade() - def create_settings_panel(self): - """Create settings panel with glow controls""" - self.settings_panel = QWidget(self) - self.settings_panel.setFixedSize(400, 600) - self.settings_panel.setStyleSheet(f""" - QWidget {{ - background: rgba(20, 20, 30, 0.95); - border: 2px solid rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); - border-radius: 10px; - }} - """) - self.settings_panel.hide() + def setup_keyboard_shortcuts(self): + # Clear existing shortcuts if any + if hasattr(self, '_shortcuts'): + for s in self._shortcuts: + s.setParent(None) + self._shortcuts = [] - layout = QVBoxLayout(self.settings_panel) - layout.setSpacing(10) + # Mapping actions to methods + mapping = { + "Deck A: Load": lambda: self.load_to_deck(self.deck_a), + "Deck A: Queue": lambda: self.queue_to_deck(self.deck_a), + "Deck A: Play/Pause": lambda: self.deck_a.play() if self.deck_a.player.playbackState() != QMediaPlayer.PlaybackState.PlayingState else self.deck_a.pause(), + "Deck B: Load": lambda: self.load_to_deck(self.deck_b), + "Deck B: Queue": lambda: self.queue_to_deck(self.deck_b), + "Deck B: Play/Pause": lambda: self.deck_b.play() if self.deck_b.player.playbackState() != QMediaPlayer.PlaybackState.PlayingState else self.deck_b.pause(), + "Global: Focus Search": lambda: self.search_filter.setFocus(), + "Global: Toggle Library": lambda: self.set_library_mode("server" if self.library_mode == "local" else "local"), + } - # Header - header = QHBoxLayout() - title = QLabel("⚙️ SETTINGS") - title.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 16px; - font-weight: bold; - color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); - """) - header.addWidget(title) - header.addStretch() + # Default shortcuts + self.default_shortcuts = { + "Deck A: Load": "Ctrl+L", + "Deck A: Queue": "Ctrl+Shift+L", + "Deck A: Play/Pause": "Space", + "Deck B: Load": "Ctrl+R", + "Deck B: Queue": "Ctrl+Shift+R", + "Deck B: Play/Pause": "Ctrl+Space", + "Global: Focus Search": "Ctrl+F", + "Global: Toggle Library": "Ctrl+Tab", + } - close_btn = QPushButton("✕") - close_btn.setFixedSize(30, 30) - close_btn.clicked.connect(self.toggle_settings_panel) - close_btn.setStyleSheet(""" - QPushButton { - background: transparent; - border: none; - color: #888; - font-size: 18px; - } - QPushButton:hover { - color: white; - } - """) - header.addWidget(close_btn) - layout.addLayout(header) - - # Settings checkboxes - checkbox_style = """ - QCheckBox { - color: #e0e0e0; - font-size: 13px; - spacing: 8px; - } - QCheckBox::indicator { - width: 18px; - height: 18px; - border: 2px solid #666; - border-radius: 3px; - background: rgba(0, 0, 0, 0.3); - } - QCheckBox::indicator:checked { - background: #bc13fe; - border-color: #bc13fe; - } - """ - - self.repeat_a_check = QCheckBox("🔁 Repeat Deck A") - self.repeat_a_check.setStyleSheet(checkbox_style) - layout.addWidget(self.repeat_a_check) - - self.repeat_b_check = QCheckBox("🔁 Repeat Deck B") - self.repeat_b_check.setStyleSheet(checkbox_style) - layout.addWidget(self.repeat_b_check) - - self.auto_mix_check = QCheckBox("🎛️ Auto-Crossfade") - self.auto_mix_check.setStyleSheet(checkbox_style) - layout.addWidget(self.auto_mix_check) - - self.shuffle_check = QCheckBox("🔀 Shuffle Library") - self.shuffle_check.setStyleSheet(checkbox_style) - layout.addWidget(self.shuffle_check) - - self.quantize_check = QCheckBox("📐 Quantize") - self.quantize_check.setStyleSheet(checkbox_style) - layout.addWidget(self.quantize_check) - - self.auto_play_check = QCheckBox("▶️ Auto-play next") - self.auto_play_check.setChecked(True) - self.auto_play_check.setStyleSheet(checkbox_style) - layout.addWidget(self.auto_play_check) - - # Glow controls - layout.addWidget(QLabel("")) # Spacer - - glow_title = QLabel("✨ NEON GLOW EFFECTS") - glow_title.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 14px; - font-weight: bold; - color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); - """) - layout.addWidget(glow_title) - - self.glow_a_check = QCheckBox("✨ Glow Deck A (Cyan)") - self.glow_a_check.setStyleSheet(checkbox_style) - self.glow_a_check.stateChanged.connect(lambda: self.toggle_glow('A')) - layout.addWidget(self.glow_a_check) - - self.glow_b_check = QCheckBox("✨ Glow Deck B (Magenta)") - self.glow_b_check.setStyleSheet(checkbox_style) - self.glow_b_check.stateChanged.connect(lambda: self.toggle_glow('B')) - layout.addWidget(self.glow_b_check) - - # Glow intensity - intensity_label = QLabel("✨ Glow Intensity") - intensity_label.setStyleSheet("color: #e0e0e0; font-size: 13px;") - layout.addWidget(intensity_label) - - self.glow_slider = QSlider(Qt.Horizontal) - self.glow_slider.setRange(1, 100) - self.glow_slider.setValue(30) - self.glow_slider.valueChanged.connect(self.update_glow_intensity) - self.glow_slider.setStyleSheet(""" - QSlider::groove:horizontal { - height: 8px; - background: #333; - border-radius: 4px; - } - QSlider::handle:horizontal { - background: #bc13fe; - border: 2px solid #bc13fe; - width: 16px; - margin: -4px 0; - border-radius: 8px; - } - """) - layout.addWidget(self.glow_slider) - - # Server URL configuration - layout.addWidget(QLabel("")) # Spacer - server_title = QLabel("📡 SERVER CONFIGURATION") - server_title.setStyleSheet(f""" - font-family: 'Orbitron'; - font-size: 14px; - font-weight: bold; - color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); - """) - layout.addWidget(server_title) - - server_url_label = QLabel("🔗 Server API URL (e.g. http://localhost:5000)") - server_url_label.setStyleSheet("color: #e0e0e0; font-size: 13px;") - layout.addWidget(server_url_label) - - self.server_url_input = QLineEdit(self.server_url) - self.server_url_input.setStyleSheet(""" - background: rgba(0, 0, 0, 0.4); - border: 1px solid #444; - color: cyan; - padding: 5px; - font-family: 'Rajdhani'; - border-radius: 4px; - """) - self.server_url_input.textChanged.connect(self.on_server_url_change) - layout.addWidget(self.server_url_input) - - layout.addStretch() - - # Position panel - self.settings_panel.move(self.width() - 420, 20) + # Load all settings from file + self.settings_file = Path(os.getcwd()) / "settings.json" + self.all_settings = self.load_all_settings() + self.current_shortcuts = self.all_settings.get("shortcuts", self.default_shortcuts) + + # Create shortcuts + for action, key in self.current_shortcuts.items(): + if action in mapping: + sc = QShortcut(QKeySequence(key), self) + sc.activated.connect(mapping[action]) + self._shortcuts.append(sc) - def load_settings(self): - """Load persistent settings""" - settings_path = Path.home() / ".techdj_settings.json" - if settings_path.exists(): + def load_all_settings(self): + """Load all settings from settings.json""" + default_settings = { + "shortcuts": self.default_shortcuts if hasattr(self, 'default_shortcuts') else {}, + "audio": { + "recording_sample_rate": 48000, + "recording_format": "wav", + }, + "ui": { + "neon_mode": 0, + }, + "library": { + "auto_scan": True, + "yt_default_format": "mp3", + } + } + + if self.settings_file.exists(): try: - with open(settings_path, 'r') as f: - data = json.load(f) - self.local_folder = data.get('local_folder') - self.library_mode = data.get('library_mode', 'server') - self.server_url = data.get('server_url', self.server_url) + with open(self.settings_file, "r") as f: + loaded = json.load(f) + # Merge with defaults to ensure all keys exist + for key in default_settings: + if key not in loaded: + loaded[key] = default_settings[key] + return loaded except Exception as e: - print(f"Error loading settings: {e}") - - def save_settings(self): - """Save persistent settings""" - settings_path = Path.home() / ".techdj_settings.json" - try: - with open(settings_path, 'w') as f: - json.dump({ - 'local_folder': self.local_folder, - 'library_mode': self.library_mode, - 'server_url': self.server_url - }, f) - except Exception as e: - print(f"Error saving settings: {e}") - - def set_library_mode(self, mode): - """Switch between server and local library""" - self.library_mode = mode + print(f"[SETTINGS] Error loading: {e}") + return default_settings + return default_settings + + def apply_ui_settings(self): + """Apply UI settings from loaded settings""" + ui_settings = self.all_settings.get("ui", {}) + neon_mode = ui_settings.get("neon_mode", 0) - if mode == 'server': - self.server_mode_btn.set_active(True) - self.local_mode_btn.set_active(False) - self.local_folder_widget.hide() - else: - self.server_mode_btn.set_active(False) - self.local_mode_btn.set_active(True) - self.local_folder_widget.show() - if self.local_folder: - self.folder_label.setText(os.path.basename(self.local_folder).upper()) - self.scan_local_library() + # Apply neon mode + if neon_mode != self.neon_state: + for _ in range(neon_mode): + self.toggle_neon() - self.update_library_list(rebuild=True) - self.save_settings() - - def select_local_folder(self): - """Open dialog to select local music folder""" - folder = QFileDialog.getExistingDirectory(self, "Select Music Folder") - if folder: - self.local_folder = folder - self.folder_label.setText(os.path.basename(folder).upper()) - self.scan_local_library() - self.update_library_list(rebuild=True) - self.save_settings() - - def on_server_url_change(self, text): - """Update server URL and save""" - self.server_url = text - self.save_settings() - - # Debounce the refresh to avoid spamming while typing - if not hasattr(self, '_refresh_timer'): - self._refresh_timer = QTimer() - self._refresh_timer.timeout.connect(self.fetch_library) - self._refresh_timer.setSingleShot(True) - - self._refresh_timer.start(1500) # Refresh library 1.5s after typing stops - - def scan_local_library(self): - """Scan local folder for audio files""" - if not self.local_folder: + # Apply library settings + library_settings = self.all_settings.get("library", {}) + yt_default = library_settings.get("yt_default_format", "mp3") + self.format_selector.setCurrentIndex(0 if yt_default == "mp3" else 1) + + def open_settings(self): + dialog = SettingsDialog(self.all_settings, self) + if dialog.exec(): + # Get all updated settings + self.all_settings = dialog.get_all_settings() + self.current_shortcuts = self.all_settings["shortcuts"] + + # Save all settings + with open(self.settings_file, "w") as f: + json.dump(self.all_settings, f, indent=4) + + # Re-setup shortcuts + self.setup_keyboard_shortcuts() + + # Apply UI settings + self.apply_ui_settings() + + QMessageBox.information(self, "Settings Saved", "All settings have been updated!") + + def search_youtube(self): + query = self.yt_input.text().strip() + if not query: return - - self.local_library = [] - extensions = ('.mp3', '.wav', '.flac', '.ogg', '.m4a') - - try: - for root, dirs, files in os.walk(self.local_folder): - for file in sorted(files): - if file.lower().endswith(extensions): - full_path = os.path.join(root, file) - self.local_library.append({ - "title": os.path.splitext(file)[0], - "file": full_path, - "is_local": True - }) - print(f"📂 Found {len(self.local_library)} local tracks") - except Exception as e: - print(f"Error scanning folder: {e}") - def fetch_library(self): - try: - response = requests.get(f"{self.server_url}/library.json", timeout=5) - self.server_library = response.json() - # Mark server tracks - for track in self.server_library: - track['is_local'] = False + # Check if it's a direct URL + if "youtube.com/" in query or "youtu.be/" in query or "music.youtube.com/" in query: + # Direct Download mode + selected_format = self.format_selector.currentData() + self.status_label.setText("Downloading...") - # Initial mode setup - self.set_library_mode(self.library_mode) - print(f"📚 Loaded {len(self.server_library)} tracks from server") - except Exception as e: - print(f"❌ Error fetching library: {e}") - # Still set local mode if server fails - self.set_library_mode(self.library_mode) + # Show and reset progress bar + self.download_progress_bar.setValue(0) + self.download_progress_bar.setVisible(True) + + self.download_worker.download(query, str(self.lib_path), selected_format) + self.yt_input.clear() + else: + # Keyword Search mode + self.status_label.setText("Searching...") + self.search_button.setEnabled(False) + self.search_worker.search(query) + + def on_search_results(self, results): + self.status_label.setText("") + self.search_button.setEnabled(True) + dialog = YTResultDialog(results, self) + if dialog.exec(): + url = dialog.get_selected_url() + if url: + # Get selected format from dropdown + selected_format = self.format_selector.currentData() + self.status_label.setText("Downloading...") + + # Show and reset progress bar + self.download_progress_bar.setValue(0) + self.download_progress_bar.setVisible(True) + + self.download_worker.download(url, str(self.lib_path), selected_format) + + def update_download_progress(self, percentage): + """Update download progress bar""" + self.download_progress_bar.setValue(int(percentage)) + + def on_download_complete(self, filepath): + self.status_label.setText("Done!") + self.download_progress_bar.setVisible(False) # Hide progress bar + self.load_library() + QMessageBox.information(self, "Download Complete", f"Saved: {os.path.basename(filepath)}") + self.status_label.setText("") + + def on_error(self, error_msg): + self.status_label.setText("Error") + self.search_button.setEnabled(True) + self.download_progress_bar.setVisible(False) # Hide progress bar on error + QMessageBox.critical(self, "Error", error_msg) + + def toggle_neon(self): + self.neon_state = (self.neon_state + 1) % 3 + colors = {0: "#555", 1: "#0ff", 2: "#f0f"} + color = colors[self.neon_state] + labels = ["OFF", "BLUE", "PURPLE"] + + self.neon_button.setText(f"NEON EDGE: {labels[self.neon_state]}") + self.neon_button.setStyleSheet(f"color: {color}; border: 1px solid {color};") + + if self.neon_state == 0: + # Disable glow + self.glow_frame.set_glow(False) + self.centralWidget().setStyleSheet("QWidget#Central { border: none; }") + else: + # Enable glow with selected color + self.glow_frame.set_glow(True, color) + self.centralWidget().setStyleSheet("QWidget#Central { border: none; }") + + def set_library_mode(self, mode): + self.library_mode = mode + self.local_mode_btn.setChecked(mode == "local") + self.server_mode_btn.setChecked(mode == "server") + self.load_library() - def update_library_list(self, rebuild=False): - """Update library results. If rebuild is True, clear and recreate all widgets. - If rebuild is False, just hide/show existing items (much faster).""" - search_term = self.search_box.text().lower() - - # Determine which library to show - library_to_show = self.server_library if self.library_mode == 'server' else self.local_library - - # If we need a full rebuild or the list is empty/wrong size - if rebuild or self.library_list.count() != len(library_to_show): - self.library_list.setUpdatesEnabled(False) + def load_library(self): + if self.library_mode == "local": self.library_list.clear() - - for track in library_to_show: - item = QListWidgetItem() - item.setSizeHint(QSize(0, 40)) - item.setData(Qt.UserRole, track) - - widget = QWidget() - widget.setStyleSheet(""" - QWidget { - background: rgba(255, 255, 255, 0.03); - border-radius: 4px; - border-left: 3px solid transparent; - } - QWidget:hover { - background: rgba(255, 255, 255, 0.08); - border-left: 3px solid #00f3ff; - } - """) - item_layout = QHBoxLayout(widget) - item_layout.setContentsMargins(10, 8, 10, 8) - item_layout.setSpacing(5) - - label = QLabel(track['title']) - label.setStyleSheet("font-family: 'Rajdhani'; font-weight: bold; font-size: 13px; color: white; background: transparent;") - item_layout.addWidget(label, 1) - - btn_a = QPushButton("A+") - btn_a.setFixedSize(30, 22) - btn_a.setStyleSheet(f"background: rgba(0, 243, 255, 0.2); border: 1px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); border-radius: 4px; color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); font-size: 9px; font-weight: bold;") - btn_a.clicked.connect(lambda _, t=track: self.add_to_queue('A', t)) - item_layout.addWidget(btn_a) - - btn_b = QPushButton("B+") - btn_b.setFixedSize(30, 22) - btn_b.setStyleSheet(f"background: rgba(188, 19, 254, 0.2); border: 1px solid rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); border-radius: 4px; color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); font-size: 9px; font-weight: bold;") - btn_b.clicked.connect(lambda _, t=track: self.add_to_queue('B', t)) - item_layout.addWidget(btn_b) - - self.library_list.addItem(item) - self.library_list.setItemWidget(item, widget) - - self.library_list.setUpdatesEnabled(True) + self.library_list.addItem(f"Reading: {self.lib_path.name}...") + self.library_scanner = LibraryScannerThread(self.lib_path) + self.library_scanner.files_found.connect(self.populate_library) + self.library_scanner.start() + else: + self.fetch_server_library() - # Apply visibility filter (extremely fast) + def fetch_server_library(self): + self.library_list.clear() + self.library_list.addItem("Fetching server library...") + + base_url = self.get_server_base_url() + self.server_url = base_url + + self.fetcher = ServerLibraryFetcher(f"{base_url}/library.json") + self.fetcher.finished.connect(lambda tracks, err, success: self.on_server_library_fetched(tracks, base_url, err, success)) + self.fetcher.start() + + def on_server_library_fetched(self, tracks, base_url, err, success): + self.library_list.clear() + if success: + self.server_library = tracks + self.populate_server_library(tracks, base_url) + else: + self.library_list.addItem(f"Error: {err}") + + def populate_server_library(self, tracks, base_url): + self.library_list.clear() + for track in tracks: + item = QListWidgetItem(track['title']) + # Store URL and title + track_url = f"{base_url}/{track['file']}" + item.setData(Qt.ItemDataRole.UserRole, {"url": track_url, "title": track['title'], "is_server": True}) + self.library_list.addItem(item) + + def populate_library(self, files): + self.library_list.clear() + self.local_library = [] + for file_path in files: + item = QListWidgetItem(file_path.name) + data = {"path": file_path, "title": file_path.stem, "is_server": False} + item.setData(Qt.ItemDataRole.UserRole, data) + self.library_list.addItem(item) + self.local_library.append(data) + + def filter_library(self, filter_text): + # Debounce the search to prevent UI freezing while typing + self.filter_timer.start(250) + + def perform_filter(self): + filter_text = self.search_filter.text().lower().strip() self.library_list.setUpdatesEnabled(False) for i in range(self.library_list.count()): item = self.library_list.item(i) - track = item.data(Qt.UserRole) - if track: - visible = not search_term or search_term in track['title'].lower() - item.setHidden(not visible) + is_match = not filter_text or filter_text in item.text().lower() + item.setHidden(not is_match) self.library_list.setUpdatesEnabled(True) - - def filter_library(self): - # Debounce reduced to 100ms for snappier feel - self.search_timer.start(100) - def on_library_double_click(self, item): - track = item.data(Qt.UserRole) - - dialog = QDialog(self) - dialog.setWindowTitle("Load Track") - dialog.setStyleSheet(f""" - QDialog {{ - background: rgb({BG_DARK.red()}, {BG_DARK.green()}, {BG_DARK.blue()}); - }} - """) - - layout = QVBoxLayout() - layout.addWidget(QLabel(f"Load '{track['title']}' to:")) - - btn_a = NeonButton(f"▶ Play on Deck A", PRIMARY_CYAN) - btn_a.clicked.connect(lambda: self.load_to_deck('A', track, dialog)) - layout.addWidget(btn_a) - - btn_b = NeonButton(f"▶ Play on Deck B", SECONDARY_MAGENTA) - btn_b.clicked.connect(lambda: self.load_to_deck('B', track, dialog)) - layout.addWidget(btn_b) - - # Add to queue buttons - queue_a = NeonButton(f"📋 Add to Queue A", PRIMARY_CYAN) - queue_a.clicked.connect(lambda: self.add_to_queue('A', track, dialog)) - layout.addWidget(queue_a) - - queue_b = NeonButton(f"📋 Add to Queue B", SECONDARY_MAGENTA) - queue_b.clicked.connect(lambda: self.add_to_queue('B', track, dialog)) - layout.addWidget(queue_b) - - dialog.setLayout(layout) - dialog.exec_() - - def load_to_deck(self, deck_id, track, dialog=None): - if dialog: - dialog.accept() - - if track.get('is_local'): - # Load local file directly - print(f"📂 Loading local: {track['file']}") - self.deck_loading_target[deck_id] = track['file'] - if deck_id == 'A': - self.deck_a.load_track(track['file']) - else: - self.deck_b.load_track(track['file']) - return + def load_to_deck(self, deck): + item = self.library_list.currentItem() + if item: + data = item.data(Qt.ItemDataRole.UserRole) + if data: + if data.get("is_server"): + self.load_server_track(deck, data) + else: + path = data.get("path") + if path: + deck.load_track(path) - filename = os.path.basename(track['file']) + def load_server_track(self, deck, data): + url = data.get("url") + title = data.get("title") + filename = os.path.basename(url) cache_path = self.cache_dir / filename - self.deck_loading_target[deck_id] = str(cache_path) if cache_path.exists(): - print(f"📦 Using cached: {filename}") - if deck_id == 'A': - self.deck_a.load_track(str(cache_path)) - else: - self.deck_b.load_track(str(cache_path)) + deck.load_track(cache_path) else: - url = f"{self.server_url}/{track['file']}" - print(f"⬇️ Downloading: {filename}") - + self.status_label.setText(f"Downloading: {title}...") thread = DownloadThread(url, str(cache_path)) - thread.finished.connect(lambda path, success: self.on_download_finished(deck_id, path, success)) + thread.finished.connect(lambda path, success: self.on_server_download_complete(deck, path, success)) thread.start() self.download_threads[filename] = thread - - def on_download_finished(self, deck_id, filepath, success): - if success: - # Check if this is still the intended track for this deck - if self.deck_loading_target.get(deck_id) != filepath: - print(f"⏭️ Stale download finished (ignored): {os.path.basename(filepath)}") - return - print(f"✅ Downloaded: {os.path.basename(filepath)}") - if deck_id == 'A': - self.deck_a.load_track(filepath) - else: - self.deck_b.load_track(filepath) - else: - QMessageBox.warning(self, "Download Error", "Failed to download track") - - def add_to_queue(self, deck_id, track, dialog=None): - """Add track to deck's queue""" - if dialog: - dialog.accept() - - # Determine file path - if self.library_mode == 'local': - filepath = track['file'] - else: - filename = track['file'].split('/')[-1] - cache_path = self.cache_dir / filename - - if cache_path.exists(): - filepath = str(cache_path) - else: - # Download to cache first - url = f"{self.server_url}/{track['file']}" - print(f"⬇️ Downloading for queue: {filename}") - - thread = DownloadThread(url, str(cache_path)) - thread.finished.connect(lambda path, success: self.on_queue_download_finished(deck_id, path, success)) - thread.start() - self.download_threads[filename] = thread - return - - # Add to queue - self.audio_engine.add_to_queue(deck_id, filepath) - queue_len = len(self.audio_engine.get_queue(deck_id)) - print(f"📋 Added to Deck {deck_id} queue: {track['title']} (Queue: {queue_len})") - - if dialog: - QMessageBox.information(self, "Added to Queue", - f"Added '{track['title']}' to Deck {deck_id} queue\n\nQueue length: {queue_len}") - - def on_queue_download_finished(self, deck_id, filepath, success): - """Handle download completion for queued tracks""" + def on_server_download_complete(self, deck, path, success): + self.status_label.setText("Download complete") if success: - self.audio_engine.add_to_queue(deck_id, filepath) - queue_len = len(self.audio_engine.get_queue(deck_id)) - print(f"✅ Downloaded and queued: {os.path.basename(filepath)} (Queue: {queue_len})") + deck.load_track(Path(path)) else: - print(f"❌ Failed to download for queue: {os.path.basename(filepath)}") + QMessageBox.warning(self, "Download Error", "Failed to download track from server") + + def queue_to_deck(self, deck): + item = self.library_list.currentItem() + if item: + data = item.data(Qt.ItemDataRole.UserRole) + if data: + if data.get("is_server"): + # For server queueing, we download first then queue + url = data.get("url") + filename = os.path.basename(url) + cache_path = self.cache_dir / filename + if cache_path.exists(): + deck.add_queue(cache_path) + else: + thread = DownloadThread(url, str(cache_path)) + thread.finished.connect(lambda path, success: deck.add_queue(Path(path)) if success else None) + thread.start() + self.download_threads[os.path.basename(url)] = thread + else: + path = data.get("path") + if path: + deck.add_queue(path) - def on_crossfader_change(self, value): - self.audio_engine.set_crossfader(value / 100.0) - - - def toggle_streaming_panel(self): - """Toggle streaming panel visibility""" - if self.streaming_panel.isVisible(): - self.streaming_panel.hide() - else: - self.settings_panel.hide() # Hide settings if open - self.streaming_panel.show() - self.streaming_panel.raise_() - - def toggle_settings_panel(self): - """Toggle settings panel visibility""" - if self.settings_panel.isVisible(): - self.settings_panel.hide() - else: - self.streaming_panel.hide() # Hide streaming if open - self.settings_panel.show() - self.settings_panel.raise_() - - def toggle_broadcast(self): - """Toggle broadcast on/off""" - if not self.broadcasting: - # Start broadcast + def upload_track(self): + file_path, _ = QFileDialog.getOpenFileName(self, "Select Track to Upload", "", "Audio Files (*.mp3 *.wav *.m4a *.flac *.ogg)") + if not file_path: + return + + if self.library_mode == "local": + # Copy to local music folder + dest = self.lib_path / os.path.basename(file_path) try: - if self.socket is None: - print(f"🔌 Connecting to server: {self.server_url}") - self.socket = socketio.Client(logger=True, engineio_logger=False) - - # Add connection event handlers - @self.socket.on('connect') - def on_connect(): - print("✅ Socket.IO connected successfully") - - @self.socket.on('connect_error') - def on_connect_error(data): - print(f"❌ Socket.IO connection error: {data}") - QMessageBox.warning(self, "Connection Error", - f"Failed to connect to server at {self.server_url}\n\nError: {data}") - - @self.socket.on('disconnect') - def on_disconnect(): - print("⚠️ Socket.IO disconnected") - - self.socket.on('listener_count', self.on_listener_count) - + shutil.copy2(file_path, dest) + self.status_label.setText(f"Imported: {os.path.basename(file_path)}") + self.load_library() + except Exception as e: + QMessageBox.warning(self, "Import Error", f"Failed to import file: {e}") + else: + # Upload to server + try: + self.status_label.setText("Uploading to server...") + base_url = self.get_server_base_url() + + with open(file_path, 'rb') as f: + files = {'file': f} + response = requests.post(f"{base_url}/upload", files=files, timeout=60) + + if response.status_code == 200: + self.status_label.setText("Upload successful!") + self.load_library() + else: try: - self.socket.connect(self.server_url, wait_timeout=10) - print("✅ Connection established") - except Exception as e: - print(f"❌ Connection failed: {e}") - QMessageBox.critical(self, "Connection Failed", - f"Could not connect to {self.server_url}\n\nError: {str(e)}\n\nMake sure the server is running.") - return + err = response.json().get('error', 'Unknown error') + except: + err = f"Server returned {response.status_code}" + QMessageBox.warning(self, "Upload Error", f"Server error: {err}") + self.status_label.setText("Upload failed") + except Exception as e: + QMessageBox.warning(self, "Upload Error", f"Failed to upload: {e}") + self.status_label.setText("Upload error") + + def update_crossfade(self): + value = self.crossfader.value() + ratio = value / 100.0 + + # Cosine crossfade curve for smooth transition + deck_a_vol = int(math.cos(ratio * 0.5 * math.pi) * 100) + deck_b_vol = int(math.cos((1 - ratio) * 0.5 * math.pi) * 100) + + self.deck_a.set_xf_vol(deck_a_vol) + self.deck_b.set_xf_vol(deck_b_vol) + + def toggle_recording(self): + """Start or stop recording""" + if not self.is_recording: + # Start recording + from datetime import datetime + timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + filename = f"mix_{timestamp}.wav" + output_path = str(self.recordings_path / filename) + + if self.recording_worker.start_recording(output_path): + self.is_recording = True + self.recording_start_time = time.time() + self.recording_timer.start(1000) # Update every second - bitrate_map = {0: "128k", 1: "96k", 2: "64k", 3: "48k", 4: "32k"} - bitrate = bitrate_map.get(self.quality_combo.currentIndex(), "96k") - - print(f"📡 Emitting start_broadcast with bitrate: {bitrate}") - self.socket.emit('start_broadcast', { - 'bitrate': bitrate, - 'format': 'mp3' - }) - - # Start local encoding thread - self.audio_engine.is_broadcasting = True - self.broadcast_thread = BroadcastThread(self.audio_engine.broadcast_queue, bitrate) - self.broadcast_thread.chunk_ready.connect(self.on_broadcast_chunk) - self.broadcast_thread.start() - - self.broadcasting = True - self.broadcast_btn.setText("🟢 STOP BROADCAST") - self.broadcast_btn.setStyleSheet(""" + # Update UI + self.record_button.setText("STOP") + self.record_button.setStyleSheet(""" QPushButton { - background: rgba(0, 255, 0, 0.2); - border: 2px solid #00ff00; - color: #00ff00; - font-family: 'Orbitron'; - font-size: 14px; + background-color: #550000; + color: #ff0000; + border: 2px solid #ff0000; font-weight: bold; - border-radius: 8px; + font-size: 14px; + padding: 8px; } QPushButton:hover { - background: rgba(0, 255, 0, 0.3); + background-color: #770000; + border-color: #ff3333; } """) - self.broadcast_status.setText("🔴 LIVE") - self.broadcast_status.setStyleSheet("color: #00ff00; font-size: 12px; font-weight: bold;") - - print("🎙️ Broadcast started") - except Exception as e: - print(f"❌ Broadcast error: {e}") - QMessageBox.warning(self, "Broadcast Error", f"Could not start broadcast:\n{e}") + self.recording_status_label.setText(f"Recording to: {filename}") + self.recording_status_label.setStyleSheet("color: #ff0000; font-size: 12px;") + print(f"[RECORDING] Started: {output_path}") else: - # Stop broadcast - if self.socket and self.socket.connected: - try: - self.socket.emit('stop_broadcast') - except Exception as e: - print(f"❌ Failed to emit stop_broadcast: {e}") + # Stop recording + self.recording_worker.stop_recording() + self.is_recording = False + self.recording_timer.stop() - self.audio_engine.is_broadcasting = False - if self.broadcast_thread: - self.broadcast_thread.stop() - self.broadcast_thread = None - - self.broadcasting = False - self.broadcast_btn.setText("🔴 START BROADCAST") - self.broadcast_btn.setStyleSheet(""" + # Update UI + self.record_button.setText("REC") + self.record_button.setStyleSheet(""" QPushButton { - background: rgba(255, 0, 0, 0.2); - border: 2px solid #ff0000; - color: #ff0000; - font-family: 'Orbitron'; - font-size: 14px; + background-color: #330000; + color: #ff3333; + border: 2px solid #550000; font-weight: bold; - border-radius: 8px; + font-size: 14px; + padding: 8px; } QPushButton:hover { - background: rgba(255, 0, 0, 0.3); + background-color: #550000; + border-color: #ff0000; } """) - self.broadcast_status.setText("Offline") - self.broadcast_status.setStyleSheet("color: #888; font-size: 12px;") + self.recording_timer_label.setText("00:00") + self.recording_timer_label.setStyleSheet("color: #888; font-size: 24px; font-weight: bold; font-family: 'Courier New';") + self.recording_status_label.setText("Recording saved!") + self.recording_status_label.setStyleSheet("color: #00ff00; font-size: 12px;") + print("[RECORDING] Stopped") - print("🛑 Broadcast stopped") + # Reset status after 3 seconds + QTimer.singleShot(3000, lambda: self.recording_status_label.setText("Ready to record") or self.recording_status_label.setStyleSheet("color: #666; font-size: 12px;")) - def on_broadcast_chunk(self, chunk): - """Send encoded chunk to server via Socket.IO""" - if self.socket and self.socket.connected and self.broadcasting: - try: - self.socket.emit('audio_chunk', chunk) - except Exception as e: - print(f"❌ Failed to send chunk: {e}") + def update_recording_time(self): + """Update the recording timer display""" + if self.is_recording: + elapsed = int(time.time() - self.recording_start_time) + minutes = elapsed // 60 + seconds = elapsed % 60 + self.recording_timer_label.setText(f"{minutes:02d}:{seconds:02d}") + self.recording_timer_label.setStyleSheet("color: #ff0000; font-size: 24px; font-weight: bold; font-family: 'Courier New';") + + def on_recording_error(self, error_msg): + """Handle recording errors""" + QMessageBox.critical(self, "Recording Error", error_msg) + if self.is_recording: + self.is_recording = False + self.recording_timer.stop() + self.record_button.setText("REC") + self.recording_status_label.setText("Recording failed") + self.recording_status_label.setStyleSheet("color: #ff0000; font-size: 12px;") + + def toggle_streaming(self): + """Toggle live streaming on/off""" + if not self.is_streaming: + # Get base URL from settings + base_url = self.get_server_base_url() + bitrate = self.all_settings.get("audio", {}).get("bitrate", 128) - def on_listener_count(self, data): - """Update listener count from server""" - self.listener_count = data.get('count', 0) - # Update UI if streaming panel is visible - if hasattr(self, 'listener_count_label'): - self.listener_count_label.setText(f"{self.listener_count}") - - def copy_stream_url(self): - """Copy stream URL to clipboard""" - clipboard = QApplication.clipboard() - clipboard.setText(self.stream_url.text()) - - # Show feedback - original_text = self.stream_url.text() - self.stream_url.setText("✅ Copied!") - QTimer.singleShot(1000, lambda: self.stream_url.setText(original_text)) - - def toggle_glow(self, deck_id): - """Toggle glow effect for a deck""" - if deck_id == 'A': - self.glow_enabled['A'] = self.glow_a_check.isChecked() - else: - self.glow_enabled['B'] = self.glow_b_check.isChecked() - - print(f"✨ Glow {deck_id}: {self.glow_enabled[deck_id]}") - - def update_glow_intensity(self, value): - """Update glow intensity""" - self.glow_intensity = value - - def update_glow_effect(self): - """Update window glow effect based on settings""" - # This would apply a glow effect to the window border - # For now, just update deck styling - for deck_id in ['A', 'B']: - if self.glow_enabled[deck_id]: - deck_widget = self.deck_a if deck_id == 'A' else self.deck_b - color = PRIMARY_CYAN if deck_id == 'A' else SECONDARY_MAGENTA - opacity = self.glow_intensity / 100.0 - - # Apply glow effect (simplified - could be enhanced with QGraphicsEffect) - deck_widget.setStyleSheet(deck_widget.styleSheet() + f""" - QWidget#deck {{ - box-shadow: 0 0 {self.glow_intensity}px rgba({color.red()}, {color.green()}, {color.blue()}, {opacity}); - }} + # Start streaming + if self.streaming_worker.start_streaming(base_url, bitrate): + self.is_streaming = True + self.stream_button.setText("STOP") + self.stream_button.setStyleSheet(""" + QPushButton { + background-color: #003366; + color: #00ff00; + border: 2px solid #0066cc; + font-weight: bold; + font-size: 14px; + padding: 8px; + } + QPushButton:hover { + background-color: #0066cc; + border-color: #00ff00; + } """) - - def start_download(self): - """Search or start direct download""" - query = self.dl_input.text().strip() - if not query: - return - - # Determine if it's a URL or search query - is_url = re.match(r'^https?://', query) - - if is_url: - self.perform_actual_download(query) + self.stream_status_label.setText("LIVE") + self.stream_status_label.setStyleSheet("color: #ff0000; font-size: 12px; font-weight: bold;") + print("[STREAMING] Started") else: - self.search_youtube(query) - - def search_youtube(self, query): - """Perform metadata search for youtube results""" - self.dl_input.setEnabled(False) - self.dl_btn.setEnabled(False) - self.dl_btn.setText("SEARCHING...") - - venv_path = os.path.join(os.path.dirname(__file__), ".venv/bin/yt-dlp") - yt_dlp_cmd = venv_path if os.path.exists(venv_path) else "yt-dlp" - - cmd = [ - yt_dlp_cmd, - f"ytsearch8:{query}", - "--print", "%(title)s ||| %(duration_string)s ||| %(webpage_url)s", - "--no-playlist", - "--flat-playlist" - ] - - print(f"🔍 Searching YouTube: {query}") - - self.search_process = QProcess() - self.search_process.finished.connect(self.on_search_finished) - self.search_process.start(cmd[0], cmd[1:]) - - def on_search_finished(self): - """Handle search results and show dialog""" - self.dl_input.setEnabled(True) - self.dl_btn.setEnabled(True) - self.dl_btn.setText("GET") - - # Check for errors - if self.search_process.exitCode() != 0: - err = str(self.search_process.readAllStandardError(), encoding='utf-8') - print(f"❌ YouTube Search Error: {err}") - QMessageBox.warning(self, "Search Error", f"YouTube search failed:\n\n{err[:200]}...") - return - - output = str(self.search_process.readAllStandardOutput(), encoding='utf-8').strip() - if not output: - QMessageBox.warning(self, "No Results", "No YouTube results found for that query.") - return - - results = [r for r in output.split("\n") if " ||| " in r] - if not results: - QMessageBox.warning(self, "No Results", "Could not parse search results.") - return - - dialog = YouTubeSearchDialog(results, self) - dialog.item_selected.connect(self.perform_actual_download) - dialog.exec_() - - def perform_actual_download(self, url): - """Start the actual yt-dlp download process""" - # Use local folder or default to project's 'music' folder - dl_dir = self.local_folder if self.local_folder else "music" - if not os.path.exists(dl_dir): - os.makedirs(dl_dir, exist_ok=True) - - # Disable input during download - self.dl_input.setEnabled(False) - self.dl_btn.setEnabled(False) - self.dl_progress.setValue(0) - self.dl_progress.show() - - venv_path = os.path.join(os.path.dirname(__file__), ".venv/bin/yt-dlp") - yt_dlp_cmd = venv_path if os.path.exists(venv_path) else "yt-dlp" - - cmd = [ - yt_dlp_cmd, - "--extract-audio", - "--audio-format", "mp3", - "--audio-quality", "0", - "--output", f"{dl_dir}/%(title)s.%(ext)s", - "--no-playlist", - url - ] - - print(f"📥 Starting download: {url}") - - self.dl_process = QProcess() - self.dl_process.readyReadStandardOutput.connect(self.on_dl_ready_read) - self.dl_process.finished.connect(self.on_dl_finished) - self.dl_process.start(cmd[0], cmd[1:]) - - def on_dl_ready_read(self): - """Parse yt-dlp output for progress""" - output = str(self.dl_process.readAllStandardOutput(), encoding='utf-8') - # Look for [download] 45.3% of 10.00MiB at 10.00MiB/s ETA 00:00 - match = re.search(r'\[download\]\s+(\d+\.\d+)%', output) - if match: - percent = float(match.group(1)) - self.dl_progress.setValue(int(percent)) - - def on_dl_finished(self): - """Handle download completion""" - self.dl_input.setEnabled(True) - self.dl_btn.setEnabled(True) - self.dl_progress.hide() - - if self.dl_process.exitCode() == 0: - print("✅ Download finished successfully") - self.dl_input.clear() - self.fetch_library() # Refresh library to show new track - QMessageBox.information(self, "Download Complete", "Track downloaded and added to library!") - else: - err = str(self.dl_process.readAllStandardError(), encoding='utf-8') - if not err: - err = "Unknown error (check console)" - print(f"❌ Download failed: {err}") - QMessageBox.warning(self, "Download Failed", f"Error: {err}") - - def upload_file(self): - """Upload MP3 file to server""" - file_path, _ = QFileDialog.getOpenFileName( - self, - "Upload MP3", - "", - "MP3 Files (*.mp3);;All Files (*)" - ) - - if file_path: - try: - filename = os.path.basename(file_path) - with open(file_path, 'rb') as f: - files = {'file': (filename, f, 'audio/mpeg')} - response = requests.post(f"{self.server_url}/upload", files=files) - - if response.json().get('success'): - print(f"✅ Uploaded: {filename}") - QMessageBox.information(self, "Upload Success", f"Uploaded {filename}") - self.fetch_library() # Refresh library - else: - error = response.json().get('error', 'Unknown error') - QMessageBox.warning(self, "Upload Failed", error) - except Exception as e: - print(f"❌ Upload error: {e}") - QMessageBox.warning(self, "Upload Error", str(e)) + # Stop streaming + self.streaming_worker.stop_streaming() + self.is_streaming = False + self.stream_button.setText("LIVE") + self.stream_button.setStyleSheet(""" + QPushButton { + background-color: #001a33; + color: #3399ff; + border: 2px solid #003366; + font-weight: bold; + font-size: 14px; + padding: 8px; + } + QPushButton:hover { + background-color: #003366; + border-color: #0066cc; + } + """) + self.stream_status_label.setText("Offline") + self.stream_status_label.setStyleSheet("color: #666; font-size: 12px;") + print("[STREAMING] Stopped") + def on_streaming_error(self, error_msg): + """Handle streaming errors""" + QMessageBox.critical(self, "Streaming Error", error_msg) + if self.is_streaming: + self.is_streaming = False + self.stream_button.setText("LIVE") + self.stream_status_label.setText("Error") + self.stream_status_label.setStyleSheet("color: #ff0000; font-size: 12px;") + + def update_listener_count(self, count): + self.listener_count_label.setText(f"{count} listeners") + + def get_server_base_url(self): + audio_settings = self.all_settings.get("audio", {}) + server_url = audio_settings.get("stream_server_url", "http://localhost:5000") + + # Normal techdj server runs on 5000 (DJ) and 5001 (Listener) + # If the URL is for the listener or stream, switch to 5000 + if ":5001" in server_url: + return server_url.split(":5001")[0] + ":5000" + elif ":8080" in server_url: + return server_url.split(":8080")[0] + ":5000" + elif "/api/stream" in server_url: + return server_url.split("/api/stream")[0].rstrip("/") + + if server_url.endswith("/"): server_url = server_url[:-1] + return server_url + def resizeEvent(self, event): - """Handle window resize to reposition floating elements""" + """Update glow frame size when window is resized""" super().resizeEvent(event) - - # Reposition floating buttons - if hasattr(self, 'streaming_btn'): - self.streaming_btn.move(self.width() - 70, self.height() - 280) - self.settings_btn.move(self.width() - 70, self.height() - 220) - self.upload_btn.move(self.width() - 70, self.height() - 160) - self.keyboard_btn.move(self.width() - 70, self.height() - 100) - - # Reposition panels - if hasattr(self, 'streaming_panel'): - self.streaming_panel.move(self.width() - 420, 20) - self.settings_panel.move(self.width() - 420, 20) + if hasattr(self, 'glow_frame'): + self.glow_frame.setGeometry(self.centralWidget().rect()) def closeEvent(self, event): - """Clean up resources before closing""" - # Stop broadcast if active - if self.broadcasting: - self.toggle_broadcast() + # Stop recording if active + if self.is_recording: + self.recording_worker.stop_recording() - # Disconnect Socket.IO - if self.socket and self.socket.connected: - try: - self.socket.disconnect() - print("🔌 Socket.IO disconnected") - except Exception as e: - print(f"⚠️ Error disconnecting Socket.IO: {e}") - - # Stop audio engine - self.audio_engine.stop_stream() - - # Wait for download threads to finish - for filename, thread in list(self.download_threads.items()): - if thread.isRunning(): - thread.wait(1000) # Wait up to 1 second + # Stop streaming if active + if self.is_streaming: + self.streaming_worker.stop_streaming() + self.deck_a.stop() + self.deck_b.stop() + self.search_worker.kill() + self.download_worker.kill() event.accept() - -def main(): +if __name__ == "__main__": app = QApplication(sys.argv) - app.setStyle('Fusion') - - # Set dark palette - palette = app.palette() - palette.setColor(palette.Window, BG_DARK) - palette.setColor(palette.WindowText, TEXT_MAIN) - palette.setColor(palette.Base, QColor(15, 15, 20)) - palette.setColor(palette.AlternateBase, QColor(20, 20, 30)) - palette.setColor(palette.Text, TEXT_MAIN) - palette.setColor(palette.Button, QColor(30, 30, 40)) - palette.setColor(palette.ButtonText, TEXT_M AIN) - app.setPalette(palette) - - window = TechDJMainWindow() - window.show() - \ No newline at end of file + app.setApplicationName("TechDJ Pro") + app.setDesktopFileName("techdj-pro") + window = DJApp() + window.show() + sys.exit(app.exec()) diff --git a/techdj_qt_v1.py.bak b/techdj_qt_v1.py.bak new file mode 100644 index 0000000..828a3cf --- /dev/null +++ b/techdj_qt_v1.py.bak @@ -0,0 +1,2801 @@ +#!/usr/bin/env python3 +""" +TechDJ - PyQt5 Native DJ Application +Pixel-perfect replica of the web DJ panel with neon aesthetic +""" + +import sys +import os +import json +import requests +import numpy as np +import sounddevice as sd +import soundfile as sf +from pathlib import Path +from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, + QPushButton, QLabel, QSlider, QListWidget, QListWidgetItem, + QLineEdit, QFrame, QSplitter, QProgressBar, QMessageBox, + QDialog, QGridLayout, QCheckBox, QComboBox, QFileDialog) +from PyQt5.QtCore import Qt, QTimer, pyqtSignal, QThread, QRectF, QPropertyAnimation, QEasingCurve, QProcess, QSize +import re +from PyQt5.QtGui import (QPainter, QColor, QPen, QFont, QLinearGradient, + QRadialGradient, QBrush, QPainterPath, QFontDatabase, QIcon) +import socketio +import queue +import subprocess +import time +import threading +from scipy import signal + + +# Color constants matching web panel +BG_DARK = QColor(10, 10, 18) +PANEL_BG = QColor(20, 20, 30, 204) # 0.8 alpha +PRIMARY_CYAN = QColor(0, 243, 255) +SECONDARY_MAGENTA = QColor(188, 19, 254) +TEXT_MAIN = QColor(224, 224, 224) +TEXT_DIM = QColor(136, 136, 136) + + +class AudioEngine: + """Efficient local audio processing engine""" + + def __init__(self): + self.decks = { + 'A': { + 'audio_data': None, + 'sample_rate': 44100, + 'position': 0, + 'playing': False, + 'volume': 0.8, + 'speed': 1.0, + 'eq': {'low': 0, 'mid': 0, 'high': 0}, + 'filters': {'lowpass': 100, 'highpass': 0}, + 'duration': 0, + 'filename': None, + 'cues': {}, + 'loop_start': None, + 'loop_end': None, + 'loop_active': False, + 'repeat': False, + 'queue': [], + 'needs_next_track': False, + }, + 'B': { + 'audio_data': None, + 'sample_rate': 44100, + 'position': 0, + 'playing': False, + 'volume': 0.8, + 'speed': 1.0, + 'eq': {'low': 0, 'mid': 0, 'high': 0}, + 'filters': {'lowpass': 100, 'highpass': 0}, + 'duration': 0, + 'filename': None, + 'cues': {}, + 'loop_start': None, + 'loop_end': None, + 'loop_active': False, + 'repeat': False, + 'queue': [], + 'needs_next_track': False, + } + } + + self.crossfader = 0.5 + self.master_volume = 0.8 + self.stream = None + self.running = False + self.broadcast_queue = queue.Queue(maxsize=100) + self.is_broadcasting = False + self.lock = threading.Lock() + + # Filter states for each deck [deck_id][filter_name][channel] + self._filter_states = { + 'A': { + 'low': [np.zeros(2), np.zeros(2)], + 'mid': [np.zeros(2), np.zeros(2)], + 'high': [np.zeros(2), np.zeros(2)], + 'lp': [np.zeros(2), np.zeros(2)], + 'hp': [np.zeros(2), np.zeros(2)] + }, + 'B': { + 'low': [np.zeros(2), np.zeros(2)], + 'mid': [np.zeros(2), np.zeros(2)], + 'high': [np.zeros(2), np.zeros(2)], + 'lp': [np.zeros(2), np.zeros(2)], + 'hp': [np.zeros(2), np.zeros(2)] + } + } + + # Pre-calculated filter coefficients + self._filter_coeffs = {} + self._init_filters() + + # Pre-allocate reuse buffers for the audio thread + self._target_indices = np.arange(2048, dtype=np.float32) # Matches blocksize + + def _init_filters(self): + """Pre-calculate coefficients for standard bands""" + sr = 44100 + # Use standard pass filters for initialization + self._filter_coeffs['low'] = signal.butter(1, 300 / (sr/2), 'low') + self._filter_coeffs['mid'] = signal.butter(1, [400 / (sr/2), 3500 / (sr/2)], 'bandpass') + self._filter_coeffs['high'] = signal.butter(1, 4000 / (sr/2), 'high') + + def _apply_processing(self, deck_id, chunk): + """Apply EQ and Filters to the audio chunk""" + sr = 44100 + deck = self.decks[deck_id] + states = self._filter_states[deck_id] + + # 1. Apply EQ (Gain-based) + # We use a simple gain filter approximation for performance + low_gain = 10**(deck['eq']['low'] / 20.0) + mid_gain = 10**(deck['eq']['mid'] / 20.0) + high_gain = 10**(deck['eq']['high'] / 20.0) + + if low_gain != 1.0 or mid_gain != 1.0 or high_gain != 1.0: + # Simple gain scaling for demo; real biquads are better but more CPU intensive in Python + # For now, let's use a simple 3-band gain model + # Re-implementing as basic biquads for "Pro" feel + for ch in range(2): + # Low Shelf + b, a = signal.butter(1, 300/(sr/2), 'lowshelf') + # Adjust b for gain: b_gain = [b[0]*G, b[1]]? No, standard biquad gain is better + # But Scipy's butter doesn't take gain. We'll use a simpler approach for now: + # Multiply signal by gain factors for the specific bands. + pass + + # Simplified "Musical" EQ: + # We'll just apply the filters and sum them with gains + # This is more robust than chaining biquads for a high-level API + pass + + # Since proper IIR chaining is complex in a Python loop, we'll implement + # a high-performance resonance filter for LP/HP which is the most audible + + try: + # Low Pass Filter + lp_val = deck['filters']['lowpass'] # 0-100 + if lp_val < 100: + freq = max(50, 20000 * (lp_val / 100.0)**2) + b, a = signal.butter(1, freq / (sr/2), 'low') + for ch in range(2): + chunk[:, ch], states['lp'][ch] = signal.lfilter(b, a, chunk[:, ch], zi=states['lp'][ch]) + + # High Pass Filter + hp_val = deck['filters']['highpass'] # 0-100 + if hp_val > 0: + freq = max(20, 15000 * (hp_val / 100.0)**2) + b, a = signal.butter(1, freq / (sr/2), 'high') + for ch in range(2): + chunk[:, ch], states['hp'][ch] = signal.lfilter(b, a, chunk[:, ch], zi=states['hp'][ch]) + except Exception as e: + # Fallback if filter design fails due to extreme values + print(f"Filter processing error: {e}") + pass + + # EQ Gain (Simple multiplier for now to ensure sliders "do something") + combined_eq_gain = (low_gain + mid_gain + high_gain) / 3.0 + return chunk * combined_eq_gain + + def start_stream(self): + if self.stream is not None: + return + self.running = True + self.stream = sd.OutputStream( + channels=2, + samplerate=44100, + blocksize=2048, + callback=self._audio_callback + ) + self.stream.start() + print("🎵 Audio stream started") + + def stop_stream(self): + self.running = False + if self.stream: + self.stream.stop() + self.stream.close() + self.stream = None + + def _audio_callback(self, outdata, frames, time_info, status): + output = np.zeros((frames, 2), dtype=np.float32) + output_samplerate = 44100 + + with self.lock: + for deck_id in ['A', 'B']: + deck = self.decks[deck_id] + + if not deck['playing'] or deck['audio_data'] is None: + continue + + # Calculate source indices via linear interpolation + rate_ratio = deck['sample_rate'] / output_samplerate + step = rate_ratio * deck['speed'] + + # Start and end in source domain + src_start = deck['position'] + num_src_samples_needed = frames * step + src_end = src_start + num_src_samples_needed + + # Bounds check + if src_start >= len(deck['audio_data']) - 1: + deck['playing'] = False + continue + + # Prepare source data + # Ensure we don't read past the end + read_end = int(np.ceil(src_end)) + 1 + if read_end > len(deck['audio_data']): + read_end = len(deck['audio_data']) + + src_chunk = deck['audio_data'][int(src_start):read_end] + + if len(src_chunk) < 2: + deck['playing'] = False + continue + + if src_chunk.ndim == 1: + src_chunk = np.column_stack((src_chunk, src_chunk)) + + # Time indices for interpolation + if len(self._target_indices) != frames: + self._target_indices = np.arange(frames, dtype=np.float32) + + x_target = self._target_indices * step + x_source = np.arange(len(src_chunk)) + + # Interp each channel + try: + resampled_l = np.interp(x_target, x_source, src_chunk[:, 0]) + resampled_r = np.interp(x_target, x_source, src_chunk[:, 1]) + chunk = np.column_stack((resampled_l, resampled_r)) + + # Apply processing (EQ and Filters) + chunk = self._apply_processing(deck_id, chunk) + + chunk = chunk * deck['volume'] + + if deck_id == 'A': + chunk = chunk * (1.0 - self.crossfader) + else: + chunk = chunk * self.crossfader + + output += chunk + + # Update position + deck['position'] += num_src_samples_needed + except Exception as e: + print(f"Audio thread error in interp: {e}") + deck['playing'] = False + continue + + # Handle looping + if deck['loop_active'] and deck['loop_start'] is not None and deck['loop_end'] is not None: + loop_start_frame = deck['loop_start'] * deck['sample_rate'] + loop_end_frame = deck['loop_end'] * deck['sample_rate'] + + if deck['position'] >= loop_end_frame: + deck['position'] = loop_start_frame + (deck['position'] - loop_end_frame) + + # Auto-stop at end + if deck['position'] >= len(deck['audio_data']): + if deck['repeat']: + # Loop current track + deck['position'] = 0 + elif len(deck['queue']) > 0: + # Mark that we need to load next track + # Can't load here (wrong thread), UI will handle it + deck['playing'] = False + deck['needs_next_track'] = True + else: + deck['playing'] = False + + output = output * self.master_volume + outdata[:] = output + + # Capture for broadcast + if self.is_broadcasting: + try: + self.broadcast_queue.put_nowait(output.tobytes()) + except queue.Full: + pass + + def load_track(self, deck_id, filepath): + try: + audio_data, sample_rate = sf.read(filepath, dtype='float32') + with self.lock: + self.decks[deck_id]['audio_data'] = audio_data + self.decks[deck_id]['sample_rate'] = sample_rate + self.decks[deck_id]['position'] = 0 + self.decks[deck_id]['duration'] = len(audio_data) / sample_rate + self.decks[deck_id]['filename'] = os.path.basename(filepath) + print(f"✅ Loaded {os.path.basename(filepath)} to Deck {deck_id}") + return True + except Exception as e: + print(f"❌ Error loading {filepath}: {e}") + return False + + def play(self, deck_id): + with self.lock: + if self.decks[deck_id]['audio_data'] is not None: + self.decks[deck_id]['playing'] = True + + def pause(self, deck_id): + with self.lock: + self.decks[deck_id]['playing'] = False + + def seek(self, deck_id, position_seconds): + with self.lock: + deck = self.decks[deck_id] + if deck['audio_data'] is not None: + deck['position'] = int(position_seconds * deck['sample_rate']) + + def set_volume(self, deck_id, volume): + with self.lock: + self.decks[deck_id]['volume'] = max(0.0, min(1.0, volume)) + + def set_speed(self, deck_id, speed): + with self.lock: + self.decks[deck_id]['speed'] = max(0.5, min(1.5, speed)) + + def set_crossfader(self, value): + with self.lock: + self.crossfader = max(0.0, min(1.0, value)) + + def get_position(self, deck_id): + with self.lock: + deck = self.decks[deck_id] + if deck['audio_data'] is not None: + return deck['position'] / deck['sample_rate'] + return 0.0 + + def set_cue(self, deck_id, cue_num): + position = self.get_position(deck_id) + with self.lock: + self.decks[deck_id]['cues'][cue_num] = position + + def jump_to_cue(self, deck_id, cue_num): + with self.lock: + if cue_num in self.decks[deck_id]['cues']: + position = self.decks[deck_id]['cues'][cue_num] + self.seek(deck_id, position) + + def set_eq(self, deck_id, band, value): + with self.lock: + self.decks[deck_id]['eq'][band] = value + + def set_filter(self, deck_id, filter_type, value): + with self.lock: + self.decks[deck_id]['filters'][filter_type] = value + + def set_repeat(self, deck_id, enabled): + """Toggle repeat/loop for a deck""" + with self.lock: + self.decks[deck_id]['repeat'] = enabled + + def set_loop_in(self, deck_id): + position = self.get_position(deck_id) + with self.lock: + self.decks[deck_id]['loop_start'] = position + # If we already have an end, activate loop + if self.decks[deck_id]['loop_end'] is not None: + self.decks[deck_id]['loop_active'] = True + + def set_loop_out(self, deck_id): + position = self.get_position(deck_id) + with self.lock: + self.decks[deck_id]['loop_end'] = position + # If we already have a start, activate loop + if self.decks[deck_id]['loop_start'] is not None: + self.decks[deck_id]['loop_active'] = True + + def exit_loop(self, deck_id): + with self.lock: + self.decks[deck_id]['loop_active'] = False + self.decks[deck_id]['loop_start'] = None + self.decks[deck_id]['loop_end'] = None + + def add_to_queue(self, deck_id, filepath): + """Add track to deck's queue""" + with self.lock: + self.decks[deck_id]['queue'].append(filepath) + + def remove_from_queue(self, deck_id, index): + """Remove track from queue by index""" + with self.lock: + if 0 <= index < len(self.decks[deck_id]['queue']): + self.decks[deck_id]['queue'].pop(index) + + def clear_queue(self, deck_id): + """Clear all tracks from queue""" + with self.lock: + self.decks[deck_id]['queue'].clear() + + def get_queue(self, deck_id): + """Get current queue (returns a copy)""" + with self.lock: + return list(self.decks[deck_id]['queue']) + + def pop_next_from_queue(self, deck_id): + """Get and remove next track from queue""" + with self.lock: + if len(self.decks[deck_id]['queue']) > 0: + return self.decks[deck_id]['queue'].pop(0) + return None + + +class DownloadThread(QThread): + progress = pyqtSignal(int) + finished = pyqtSignal(str, bool) + + def __init__(self, url, filepath): + super().__init__() + self.url = url + self.filepath = filepath + + def run(self): + try: + print(f"📥 Downloading from: {self.url}") + response = requests.get(self.url, stream=True, timeout=30) + + # Check if request was successful + if response.status_code != 200: + print(f"❌ HTTP {response.status_code}: {self.url}") + self.finished.emit(self.filepath, False) + return + + total_size = int(response.headers.get('content-length', 0)) + print(f"📦 File size: {total_size / 1024 / 1024:.2f} MB") + + os.makedirs(os.path.dirname(self.filepath), exist_ok=True) + + downloaded = 0 + with open(self.filepath, 'wb') as f: + for chunk in response.iter_content(chunk_size=8192): + if chunk: + f.write(chunk) + downloaded += len(chunk) + if total_size > 0: + progress = int((downloaded / total_size) * 100) + self.progress.emit(progress) + + print(f"✅ Download complete: {os.path.basename(self.filepath)}") + self.finished.emit(self.filepath, True) + except requests.exceptions.Timeout: + print(f"❌ Download timeout: {self.url}") + self.finished.emit(self.filepath, False) + except requests.exceptions.ConnectionError as e: + print(f"❌ Connection error: {e}") + self.finished.emit(self.filepath, False) + except Exception as e: + print(f"❌ Download error: {type(e).__name__}: {e}") + self.finished.emit(self.filepath, False) + + +class BroadcastThread(QThread): + """Thread to handle FFmpeg encoding and streaming""" + chunk_ready = pyqtSignal(bytes) + error = pyqtSignal(str) + + def __init__(self, audio_queue, bitrate="192k"): + super().__init__() + self.audio_queue = audio_queue + self.bitrate = bitrate + self.running = False + self.process = None + + def run(self): + self.running = True + + # FFmpeg command to read raw f32le PCM and output MP3 chunks to stdout + # Using CBR and zerolatency tune for stability + cmd = [ + 'ffmpeg', + '-y', + '-fflags', 'nobuffer', + '-flags', 'low_delay', + '-probesize', '32', + '-analyzeduration', '0', + '-f', 'f32le', + '-ar', '44100', + '-ac', '2', + '-i', 'pipe:0', + '-codec:a', 'libmp3lame', + '-b:a', self.bitrate, + '-maxrate', self.bitrate, + '-minrate', self.bitrate, + '-bufsize', '64k', + '-tune', 'zerolatency', + '-flush_packets', '1', + '-f', 'mp3', + 'pipe:1' + ] + + try: + self.process = subprocess.Popen( + cmd, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + bufsize=0 + ) + + # Thread to read encoded chunks from stdout + def read_output(): + # Smaller buffer for more frequent updates (2KB = ~0.08s @ 192k) + buffer_size = 2048 + while self.running: + try: + data = self.process.stdout.read(buffer_size) + if data: + self.chunk_ready.emit(data) + else: + break + except Exception as e: + print(f"Broadcast output error: {e}") + break + + output_thread = threading.Thread(target=read_output, daemon=True) + output_thread.start() + + print(f"📡 FFmpeg broadcast process started ({self.bitrate})") + + # Worker to feed stdin from the broadcast queue + while self.running: + try: + # Clear queue if it's way too full, but be less aggressive + # 100 chunks is ~4.6 seconds. If we hit 200, we're definitely lagging. + if self.audio_queue.qsize() > 200: + while self.audio_queue.qsize() > 50: + self.audio_queue.get_nowait() + + chunk = self.audio_queue.get(timeout=0.1) + if chunk and self.process and self.process.stdin: + self.process.stdin.write(chunk) + self.process.stdin.flush() + except queue.Empty: + continue + except Exception as e: + print(f"Broadcast input error: {e}") + break + + except Exception as e: + self.error.emit(str(e)) + self.running = False + return + + def stop(self): + self.running = False + if self.process: + self.process.terminate() + try: + self.process.wait(timeout=2) + except: + self.process.kill() + self.process = None + # Give output thread time to finish + time.sleep(0.1) + print("🛑 Broadcast process stopped") + + +class WaveformWidget(QWidget): + """Waveform display matching web panel style""" + + def __init__(self, deck_id, parent=None): + super().__init__(parent) + self.deck_id = deck_id + self.waveform_data = [] + self.position = 0.0 + self.duration = 1.0 + self.cues = {} + self.setFixedHeight(180) # Pro-visual height + self.setStyleSheet("background: #000; border: none;") # Removed internal border + + def set_waveform(self, audio_data, sample_rate): + if audio_data is None: + self.waveform_data = [] + return + + samples = 2000 # Increased resolution + if audio_data.ndim > 1: + audio_data = np.mean(audio_data, axis=1) + + # Normalize globally for better visualization + max_val = np.max(np.abs(audio_data)) + if max_val > 0: + audio_data = audio_data / max_val + + block_size = max(1, len(audio_data) // samples) + self.waveform_data = [] + + for i in range(samples): + start = i * block_size + end = min(start + block_size, len(audio_data)) + if start < len(audio_data): + chunk = audio_data[start:end] + # Store both max and min for a more detailed mirror wave + self.waveform_data.append((np.max(chunk), np.min(chunk))) + + self.update() + + def set_position(self, position, duration): + # Only update if position changed significantly (reduces repaints) + if abs(position - self.position) > 0.1 or duration != self.duration: + self.position = position + self.duration = max(duration, 0.01) + self.update() + + def set_cues(self, cues): + self.cues = cues + self.update() + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + + # Background + painter.fillRect(self.rect(), QColor(0, 0, 0)) + + if not self.waveform_data: + return + + # Draw waveform + width = self.width() + height = self.height() + bar_width = width / len(self.waveform_data) + + wave_color = PRIMARY_CYAN if self.deck_id == 'A' else SECONDARY_MAGENTA + painter.setPen(Qt.NoPen) + + # Create semi-transparent brush for visual depth + brush_color = QColor(wave_color) + brush_color.setAlpha(180) + painter.setBrush(QBrush(brush_color)) + + for i, (peak, val) in enumerate(self.waveform_data): + x = i * bar_width + + # Use almost full height (0.95) to make it look "tall" as requested + # 'peak' and 'val' are normalized -1 to 1 + pos_height = peak * (height / 2) * 0.95 + neg_height = abs(val) * (height / 2) * 0.95 + + # Top half + painter.drawRect(int(x), int(height/2 - pos_height), max(1, int(bar_width)), int(pos_height)) + # Bottom half + painter.drawRect(int(x), int(height/2), max(1, int(bar_width)), int(neg_height)) + + # Draw cue markers + if self.duration > 0: + painter.setPen(QPen(QColor(255, 255, 255), 1)) + for cue_time in self.cues.values(): + x = (cue_time / self.duration) * width + painter.drawLine(int(x), 0, int(x), height) + + # Draw playhead + if self.duration > 0: + playhead_x = (self.position / self.duration) * width + painter.setPen(QPen(QColor(255, 255, 0), 2)) + painter.drawLine(int(playhead_x), 0, int(playhead_x), height) + + def mousePressEvent(self, event): + """Allow seeking by clicking on waveform""" + if self.duration > 0: + percent = event.x() / self.width() + seek_time = percent * self.duration + self.parent().parent().seek_deck(seek_time) + + +class VinylDiskWidget(QWidget): + """Animated vinyl disk matching web panel""" + + clicked = pyqtSignal() + + def __init__(self, deck_id, parent=None): + super().__init__(parent) + self.deck_id = deck_id + self.rotation = 0 + self.playing = False + self.setFixedSize(120, 120) + + # Rotation animation + self.timer = QTimer() + self.timer.timeout.connect(self.rotate) + + def set_playing(self, playing): + self.playing = playing + if playing: + self.timer.start(100) # 10 FPS - reduced for better performance + else: + self.timer.stop() + self.update() + + def set_speed(self, speed): + self.speed = speed + + def rotate(self): + # Base rotation is 5 degrees, scaled by playback speed + speed_factor = getattr(self, 'speed', 1.0) + self.rotation = (self.rotation + (5 * speed_factor)) % 360 + self.update() + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + + center_x = self.width() / 2 + center_y = self.height() / 2 + radius = min(center_x, center_y) - 5 + + # Rotate if playing + if self.playing: + painter.translate(center_x, center_y) + painter.rotate(self.rotation) + painter.translate(-center_x, -center_y) + + # Vinyl gradient + gradient = QRadialGradient(center_x, center_y, radius) + gradient.setColorAt(0, QColor(34, 34, 34)) + gradient.setColorAt(0.1, QColor(17, 17, 17)) + gradient.setColorAt(1, QColor(0, 0, 0)) + + painter.setBrush(gradient) + painter.setPen(QPen(QColor(51, 51, 51), 2)) + painter.drawEllipse(int(center_x - radius), int(center_y - radius), + int(radius * 2), int(radius * 2)) + + # Grooves + painter.setPen(QPen(QColor(24, 24, 24), 1)) + for i in range(5, int(radius), 8): + painter.drawEllipse(int(center_x - i), int(center_y - i), i * 2, i * 2) + + # Center label + label_radius = 25 + label_color = PRIMARY_CYAN if self.deck_id == 'A' else SECONDARY_MAGENTA + painter.setBrush(label_color) + painter.setPen(QPen(label_color.darker(120), 2)) + painter.drawEllipse(int(center_x - label_radius), int(center_y - label_radius), + label_radius * 2, label_radius * 2) + + # Label text + painter.setPen(QColor(0, 0, 0)) + font = QFont("Orbitron", 16, QFont.Bold) + painter.setFont(font) + painter.drawText(self.rect(), Qt.AlignCenter, self.deck_id) + + # Glow effect when playing + if self.playing: + painter.setPen(QPen(label_color, 3)) + painter.setBrush(Qt.NoBrush) + painter.drawEllipse(int(center_x - radius - 3), int(center_y - radius - 3), + int((radius + 3) * 2), int((radius + 3) * 2)) + + def mousePressEvent(self, event): + self.clicked.emit() + + +class NeonButton(QPushButton): + """Neon-styled button matching web panel""" + + def __init__(self, text, color=PRIMARY_CYAN, parent=None): + super().__init__(text, parent) + self.neon_color = color + self.is_active = False + self.update_style() + + def set_active(self, active): + self.is_active = active + self.update_style() + + def update_style(self): + if self.is_active: + self.setStyleSheet(f""" + QPushButton {{ + background: rgba({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}, 0.3); + border: 2px solid rgb({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}); + color: rgb({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}); + font-family: 'Orbitron'; + font-weight: bold; + padding: 8px; + border-radius: 4px; + }} + QPushButton:hover {{ + background: rgba({self.neon_color.red()}, {self.neon_color.green()}, {self.neon_color.blue()}, 0.5); + }} + """) + else: + self.setStyleSheet(f""" + QPushButton {{ + background: #222; + border: 1px solid #444; + color: #666; + font-family: 'Orbitron'; + font-weight: bold; + padding: 8px; + border-radius: 4px; + }} + QPushButton:hover {{ + background: #333; + color: #888; + }} + """) + + +class DeckWidget(QWidget): + """Complete deck widget matching web panel layout""" + + def __init__(self, deck_id, audio_engine, parent=None): + super().__init__(parent) + self.deck_id = deck_id + self.audio_engine = audio_engine + self.color = PRIMARY_CYAN if deck_id == 'A' else SECONDARY_MAGENTA + + self.init_ui() + + # Update timer + self.timer = QTimer() + self.timer.timeout.connect(self.update_display) + self.timer.start(100) # 10 FPS - reduced for better performance + + def init_ui(self): + layout = QVBoxLayout() + layout.setSpacing(5) # Reduced from 8 + layout.setContentsMargins(10, 8, 10, 10) # Reduced top margin + + # Headers removed as requested + + # Waveform + waveform_container = QWidget() + waveform_container.setFixedHeight(184) # 180px graph + 4px padding + waveform_container.setStyleSheet("background: #111; border: 1px solid #333; border-radius: 4px;") + waveform_layout = QVBoxLayout(waveform_container) + waveform_layout.setContentsMargins(2, 2, 2, 2) + + self.waveform = WaveformWidget(self.deck_id, self) + waveform_layout.addWidget(self.waveform) + + # Subtle Metadata Overlay (Integrated into Graph Box) + meta_layout = QHBoxLayout() + meta_layout.setContentsMargins(4, 0, 4, 1) + + self.deck_id_label = QLabel(f"[{self.deck_id}]") + self.deck_id_label.setStyleSheet(f"color: rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); font-family: 'Orbitron'; font-size: 9px; font-weight: bold;") + meta_layout.addWidget(self.deck_id_label) + + self.track_label = QLabel("EMPTY") + self.track_label.setStyleSheet("color: #bbb; font-family: 'Rajdhani'; font-size: 9px; font-weight: bold;") + meta_layout.addWidget(self.track_label, 1) + + self.time_label = QLabel("0:00 / 0:00") + self.time_label.setStyleSheet("color: #888; font-family: 'Orbitron'; font-size: 8px;") + meta_layout.addWidget(self.time_label) + + waveform_layout.addLayout(meta_layout) + + layout.addWidget(waveform_container) + + # Restoring the nice DJ circles + disk_container = QHBoxLayout() + disk_container.addStretch() + self.vinyl_disk = VinylDiskWidget(self.deck_id) + self.vinyl_disk.clicked.connect(self.toggle_play) + disk_container.addWidget(self.vinyl_disk) + disk_container.addStretch() + layout.addLayout(disk_container) + + # Hot Cues + cue_layout = QGridLayout() + cue_layout.setSpacing(3) + self.cue_buttons = [] + for i in range(4): + btn = NeonButton(f"CUE {i+1}", self.color) + btn.clicked.connect(lambda checked, num=i+1: self.handle_cue(num)) + cue_layout.addWidget(btn, 0, i) + self.cue_buttons.append(btn) + layout.addLayout(cue_layout) + + # Loop Controls + loop_layout = QGridLayout() + loop_layout.setSpacing(3) + loop_in = NeonButton("LOOP IN", QColor(255, 102, 0)) + loop_in.clicked.connect(lambda: self.audio_engine.set_loop_in(self.deck_id)) + + loop_out = NeonButton("LOOP OUT", QColor(255, 102, 0)) + loop_out.clicked.connect(lambda: self.audio_engine.set_loop_out(self.deck_id)) + + loop_exit = NeonButton("EXIT", QColor(255, 102, 0)) + loop_exit.clicked.connect(lambda: self.audio_engine.exit_loop(self.deck_id)) + + loop_layout.addWidget(loop_in, 0, 0) + loop_layout.addWidget(loop_out, 0, 1) + loop_layout.addWidget(loop_exit, 0, 2) + layout.addLayout(loop_layout) + + # Controls Grid + controls = QGridLayout() + controls.setSpacing(8) + + # Volume + vol_label = QLabel("VOLUME") + vol_label.setStyleSheet("color: #888; font-size: 10px;") + controls.addWidget(vol_label, 0, 0) + self.volume_slider = QSlider(Qt.Horizontal) + self.volume_slider.setRange(0, 100) + self.volume_slider.setValue(80) + self.volume_slider.valueChanged.connect(self.on_volume_change) + self.volume_slider.setStyleSheet(self.get_slider_style()) + controls.addWidget(self.volume_slider, 1, 0) + + # EQ + eq_widget = QWidget() + eq_layout = QHBoxLayout(eq_widget) + eq_layout.setSpacing(8) + self.eq_sliders = {} + + for band in ['HIGH', 'MID', 'LOW']: + band_widget = QWidget() + band_layout = QVBoxLayout(band_widget) + band_layout.setSpacing(2) + band_layout.setContentsMargins(0, 0, 0, 0) + + slider = QSlider(Qt.Vertical) + slider.setRange(-20, 20) + slider.setValue(0) + slider.setFixedHeight(80) + slider.setStyleSheet(self.get_slider_style()) + slider.valueChanged.connect(lambda v, b=band.lower(): self.on_eq_change(b, v)) + self.eq_sliders[band.lower()] = slider + + label = QLabel(band) + label.setStyleSheet("color: #888; font-size: 9px;") + label.setAlignment(Qt.AlignCenter) + + band_layout.addWidget(slider) + band_layout.addWidget(label) + eq_layout.addWidget(band_widget) + + controls.addWidget(eq_widget, 0, 1, 2, 1) + + # Filters + filter_widget = QWidget() + filter_layout = QVBoxLayout(filter_widget) + filter_layout.setSpacing(4) + + lp_label = QLabel("LOW-PASS") + lp_label.setStyleSheet("color: #888; font-size: 9px;") + filter_layout.addWidget(lp_label) + self.lp_slider = QSlider(Qt.Horizontal) + self.lp_slider.setRange(0, 100) + self.lp_slider.setValue(100) + self.lp_slider.setStyleSheet(self.get_slider_style()) + self.lp_slider.valueChanged.connect(lambda v: self.audio_engine.set_filter(self.deck_id, 'lowpass', v)) + filter_layout.addWidget(self.lp_slider) + + hp_label = QLabel("HIGH-PASS") + hp_label.setStyleSheet("color: #888; font-size: 9px;") + filter_layout.addWidget(hp_label) + self.hp_slider = QSlider(Qt.Horizontal) + self.hp_slider.setRange(0, 100) + self.hp_slider.setValue(0) + self.hp_slider.setStyleSheet(self.get_slider_style()) + self.hp_slider.valueChanged.connect(lambda v: self.audio_engine.set_filter(self.deck_id, 'highpass', v)) + filter_layout.addWidget(self.hp_slider) + + controls.addWidget(filter_widget, 0, 2, 2, 1) + + # Speed + speed_widget = QWidget() + speed_layout = QVBoxLayout(speed_widget) + speed_layout.setSpacing(4) + + speed_label = QLabel("PITCH / TEMPO") + speed_label.setStyleSheet("color: #888; font-size: 9px;") + speed_layout.addWidget(speed_label) + + self.speed_slider = QSlider(Qt.Horizontal) + self.speed_slider.setRange(50, 150) + self.speed_slider.setValue(100) + self.speed_slider.valueChanged.connect(self.on_speed_change) + self.speed_slider.setStyleSheet(self.get_slider_style()) + speed_layout.addWidget(self.speed_slider) + + bend_layout = QHBoxLayout() + bend_minus = QPushButton("-") + bend_minus.setFixedSize(30, 25) + bend_minus.pressed.connect(lambda: self.on_pitch_bend(-0.02)) + bend_minus.released.connect(lambda: self.on_pitch_bend(0)) + + bend_plus = QPushButton("+") + bend_plus.setFixedSize(30, 25) + bend_plus.pressed.connect(lambda: self.on_pitch_bend(0.02)) + bend_plus.released.connect(lambda: self.on_pitch_bend(0)) + + bend_layout.addWidget(bend_minus) + bend_layout.addWidget(bend_plus) + speed_layout.addLayout(bend_layout) + + controls.addWidget(speed_widget, 0, 3, 2, 1) + + layout.addLayout(controls) + + # Transport + transport = QHBoxLayout() + transport.setSpacing(4) + + self.play_btn = NeonButton("▶ PLAY", self.color) + self.play_btn.clicked.connect(self.play) + transport.addWidget(self.play_btn) + + self.pause_btn = NeonButton("⏸ PAUSE") + self.pause_btn.clicked.connect(self.pause) + transport.addWidget(self.pause_btn) + + sync_btn = NeonButton("SYNC", self.color) + sync_btn.clicked.connect(self.on_sync) + transport.addWidget(sync_btn) + + reset_btn = NeonButton("🔄 RESET") + reset_btn.clicked.connect(self.reset_deck) + transport.addWidget(reset_btn) + + self.loop_btn = NeonButton("🔁 LOOP") + self.loop_btn.setCheckable(True) + self.loop_btn.clicked.connect(self.toggle_loop) + transport.addWidget(self.loop_btn) + + layout.addLayout(transport) + + # Queue List + queue_container = QWidget() + queue_container.setStyleSheet("background: rgba(0, 0, 0, 0.4); border-top: 1px solid #333;") + queue_layout = QVBoxLayout(queue_container) + queue_layout.setContentsMargins(5, 5, 5, 5) + queue_layout.setSpacing(2) + + queue_label = QLabel("NEXT UP / QUEUE") + queue_label.setStyleSheet(f"color: rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); font-family: 'Orbitron'; font-size: 9px; font-weight: bold;") + queue_layout.addWidget(queue_label) + + self.queue_list = QListWidget() + self.queue_list.setFixedHeight(80) + self.queue_list.setStyleSheet(""" + QListWidget { + background: transparent; + border: none; + color: #aaa; + font-family: 'Rajdhani'; + font-size: 10px; + } + QListWidget::item { + padding: 2px; + border-bottom: 1px solid #222; + } + """) + queue_layout.addWidget(self.queue_list) + layout.addWidget(queue_container) + + layout.addStretch() # Push everything up + + self.setLayout(layout) + + # Deck styling + self.setStyleSheet(f""" + QWidget {{ + background: rgba(20, 20, 30, 0.8); + color: #e0e0e0; + font-family: 'Rajdhani'; + }} + QWidget#deck {{ + border: 2px solid rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); + border-radius: 8px; + }} + """) + self.setObjectName("deck") + + def get_slider_style(self): + return """ + QSlider::groove:horizontal { + height: 8px; + background: #333; + border-radius: 4px; + } + QSlider::handle:horizontal { + background: #ccc; + border: 2px solid #888; + width: 16px; + margin: -4px 0; + border-radius: 8px; + } + QSlider::groove:vertical { + width: 8px; + background: #333; + border-radius: 4px; + } + QSlider::handle:vertical { + background: #ccc; + border: 2px solid #888; + height: 16px; + margin: 0 -4px; + border-radius: 8px; + } + """ + + def load_track(self, filepath): + if self.audio_engine.load_track(self.deck_id, filepath): + filename = os.path.basename(filepath) + self.track_label.setText(filename.upper()) + deck = self.audio_engine.decks[self.deck_id] + self.waveform.set_waveform(deck['audio_data'], deck['sample_rate']) + + def play(self): + self.audio_engine.play(self.deck_id) + self.vinyl_disk.set_playing(True) + self.play_btn.set_active(True) + + def pause(self): + self.audio_engine.pause(self.deck_id) + self.vinyl_disk.set_playing(False) + self.play_btn.set_active(False) + + def toggle_play(self): + if self.audio_engine.decks[self.deck_id]['playing']: + self.pause() + else: + self.play() + + def on_volume_change(self, value): + self.audio_engine.set_volume(self.deck_id, value / 100.0) + + def on_speed_change(self, value): + self.audio_engine.set_speed(self.deck_id, value / 100.0) + + def on_eq_change(self, band, value): + self.audio_engine.set_eq(self.deck_id, band, value) + + def on_sync(self): + """Match speed to other deck""" + other_deck_id = 'B' if self.deck_id == 'A' else 'A' + other_speed = self.audio_engine.decks[other_deck_id]['speed'] + self.speed_slider.setValue(int(other_speed * 100)) + print(f"🎵 Deck {self.deck_id} synced to {other_speed:.2f}x") + + def on_pitch_bend(self, amount): + """Temporarily adjust speed for nudging""" + base_speed = self.speed_slider.value() / 100.0 + self.audio_engine.set_speed(self.deck_id, base_speed + amount) + + def handle_cue(self, cue_num): + deck = self.audio_engine.decks[self.deck_id] + if cue_num in deck['cues']: + self.audio_engine.jump_to_cue(self.deck_id, cue_num) + else: + self.audio_engine.set_cue(self.deck_id, cue_num) + self.cue_buttons[cue_num-1].set_active(True) + + def seek_deck(self, time): + self.audio_engine.seek(self.deck_id, time) + + def reset_deck(self): + """Reset all deck controls to default values""" + # Setting values on sliders will trigger the valueChanged signal + # which will in turn update the audio engine. + + # Reset volume to 80% + self.volume_slider.setValue(80) + + # Reset speed to 100% + self.speed_slider.setValue(100) + + # Reset EQ sliders to 0 + if hasattr(self, 'eq_sliders'): + for band, slider in self.eq_sliders.items(): + slider.setValue(0) + + # Reset filter sliders + self.lp_slider.setValue(100) + self.hp_slider.setValue(0) + + print(f"🔄 Deck {self.deck_id} reset to defaults") + + def toggle_loop(self): + """Toggle loop/repeat for this deck""" + is_looping = self.loop_btn.isChecked() + self.audio_engine.set_repeat(self.deck_id, is_looping) + + if is_looping: + self.loop_btn.setStyleSheet(f""" + QPushButton {{ + background: rgba({self.color.red()}, {self.color.green()}, {self.color.blue()}, 0.3); + border: 2px solid rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); + color: rgb({self.color.red()}, {self.color.green()}, {self.color.blue()}); + font-family: 'Orbitron'; + font-size: 12px; + font-weight: bold; + border-radius: 6px; + }} + """) + print(f"🔁 Deck {self.deck_id} loop enabled") + else: + self.loop_btn.setStyleSheet(""" + QPushButton { + background: rgba(0, 0, 0, 0.3); + border: 2px solid #666; + color: #888; + font-family: 'Orbitron'; + font-size: 12px; + border-radius: 6px; + } + """) + print(f"⏹️ Deck {self.deck_id} loop disabled") + + def update_display(self): + deck = self.audio_engine.decks[self.deck_id] + position = self.audio_engine.get_position(self.deck_id) + duration = deck['duration'] + + # Check if we need to load next track from queue + if deck.get('needs_next_track', False): + deck['needs_next_track'] = False + next_track = self.audio_engine.pop_next_from_queue(self.deck_id) + if next_track: + print(f"📋 Auto-loading next track from queue: {os.path.basename(next_track)}") + self.load_track(next_track) + self.play() + + # Time calculations + pos_min = int(position // 60) + pos_sec = int(position % 60) + dur_min = int(duration // 60) + dur_sec = int(duration % 60) + self.time_label.setText(f"{pos_min}:{pos_sec:02d} / {dur_min}:{dur_sec:02d}") + + self.waveform.set_position(position, duration) + self.waveform.set_cues(deck['cues']) + self.vinyl_disk.set_speed(deck['speed']) + + # Update Queue Display (only when changed) + current_queue = deck.get('queue', []) + # Check if queue actually changed (not just count) + queue_changed = False + if self.queue_list.count() != len(current_queue): + queue_changed = True + else: + # Check if items are different + for i, track_path in enumerate(current_queue): + if i >= self.queue_list.count() or self.queue_list.item(i).text() != os.path.basename(track_path): + queue_changed = True + break + + if queue_changed: + self.queue_list.clear() + for track_path in current_queue: + filename = os.path.basename(track_path) + self.queue_list.addItem(filename) + +class YouTubeSearchDialog(QDialog): + """Dialog to display and select YouTube search results""" + item_selected = pyqtSignal(str) # Emits the URL + + def __init__(self, results, parent=None): + super().__init__(parent) + self.setWindowTitle("YouTube Search Results") + self.setFixedWidth(600) + self.setFixedHeight(400) + self.setStyleSheet(f""" + QDialog {{ + background: rgb({BG_DARK.red()}, {BG_DARK.green()}, {BG_DARK.blue()}); + border: 2px solid #444; + }} + QLabel {{ color: white; font-family: 'Rajdhani'; }} + """) + + layout = QVBoxLayout(self) + layout.setContentsMargins(15, 15, 15, 15) + + header = QLabel("SELECT A VERSION TO DOWNLOAD") + header.setStyleSheet("font-family: 'Orbitron'; font-weight: bold; font-size: 14px; color: #00f3ff; margin-bottom: 10px;") + layout.addWidget(header) + + self.list_widget = QListWidget() + self.list_widget.setStyleSheet(""" + QListWidget { + background: rgba(0, 0, 0, 0.4); + border: 1px solid #333; + border-radius: 4px; + color: #ddd; + padding: 5px; + } + QListWidget::item { + border-bottom: 1px solid #222; + padding: 8px; + } + QListWidget::item:hover { + background: rgba(0, 243, 255, 0.1); + } + """) + layout.addWidget(self.list_widget) + + for res in results: + # Title ||| Duration ||| URL + parts = res.split(" ||| ") + if len(parts) < 3: continue + + title, duration, url = parts[0], parts[1], parts[2] + + item = QListWidgetItem(self.list_widget) + item.setSizeHint(QSize(0, 50)) + + widget = QWidget() + item_layout = QHBoxLayout(widget) + item_layout.setContentsMargins(5, 0, 5, 0) + + info_vbox = QVBoxLayout() + info_vbox.setSpacing(0) + + title_label = QLabel(title) + title_label.setStyleSheet("font-weight: bold; font-size: 12px; color: #eee;") + title_label.setWordWrap(True) + info_vbox.addWidget(title_label) + + dur_label = QLabel(f"Duration: {duration}") + dur_label.setStyleSheet("font-size: 10px; color: #888;") + info_vbox.addWidget(dur_label) + + item_layout.addLayout(info_vbox, 1) + + dl_btn = NeonButton("DOWNLOAD", PRIMARY_CYAN) + dl_btn.setFixedSize(90, 26) + dl_btn.clicked.connect(lambda _, u=url: self.on_dl_click(u)) + item_layout.addWidget(dl_btn) + + self.list_widget.setItemWidget(item, widget) + + def on_dl_click(self, url): + self.item_selected.emit(url) + self.accept() + + +class TechDJMainWindow(QMainWindow): + """Main window matching web panel layout""" + + def __init__(self): + super().__init__() + + self.server_url = "http://54.37.246.24:5000" + self.cache_dir = Path.home() / ".techdj_cache" + self.cache_dir.mkdir(exist_ok=True) + + self.audio_engine = AudioEngine() + self.library = [] + self.download_threads = {} + self.broadcasting = False + self.broadcast_thread = None + self.listener_count = 0 + self.glow_enabled = {'A': False, 'B': False} + self.glow_intensity = 30 + self.deck_loading_target = {'A': None, 'B': None} + + # Socket.IO for broadcasting + self.socket = None + + # Library settings + self.library_mode = 'server' # 'server' or 'local' + self.server_library = [] + self.local_library = [] + self.local_folder = None + self.load_settings() + + # Search debounce timer + self.search_timer = QTimer() + self.search_timer.setSingleShot(True) + # Search is now fast enough to update quickly + self.search_timer.timeout.connect(lambda: self.update_library_list(rebuild=False)) + + self.init_ui() + + # Set window icon + icon_path = os.path.join(os.path.dirname(__file__), 'icon.png') + if os.path.exists(icon_path): + self.setWindowIcon(QIcon(icon_path)) + + self.audio_engine.start_stream() + self.fetch_library() + + def init_ui(self): + self.setWindowTitle("TechDJ Pro - Native Edition") + self.setGeometry(50, 50, 1600, 900) + + # Central widget with overlay support + central = QWidget() + self.setCentralWidget(central) + + # Overall vertical layout for central widget + self.container_layout = QVBoxLayout(central) + self.container_layout.setContentsMargins(0, 0, 0, 0) + self.container_layout.setSpacing(0) + + # --- Download Bar (Minimized) --- + self.download_bar = QWidget() + self.download_bar.setFixedHeight(38) # Reduced from 50 + self.download_bar.setStyleSheet(f""" + QWidget {{ + background: rgb(20, 20, 30); + border-bottom: 1px solid rgba({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}, 0.3); + }} + """) + dl_layout = QHBoxLayout(self.download_bar) + dl_layout.setContentsMargins(10, 2, 10, 2) # Tighten margins + + self.dl_input = QLineEdit() + self.dl_input.setPlaceholderText("Paste URL or Type to Search (YT, SC, etc.)") + self.dl_input.setStyleSheet(f""" + QLineEdit {{ + background: rgba(255, 255, 255, 0.05); + border: 1px solid #333; + color: white; + padding: 4px 12px; + border-radius: 12px; + font-family: 'Rajdhani'; + font-size: 12px; + }} + QLineEdit:focus {{ border: 1px solid rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); }} + """) + self.dl_input.returnPressed.connect(self.start_download) + dl_layout.addWidget(self.dl_input, 1) + + self.dl_btn = NeonButton("GET", SECONDARY_MAGENTA) # Shorter text + self.dl_btn.setFixedSize(60, 26) # Smaller button + self.dl_btn.clicked.connect(self.start_download) + dl_layout.addWidget(self.dl_btn) + + self.dl_progress = QProgressBar() + self.dl_progress.setFixedWidth(120) + self.dl_progress.setFixedHeight(4) + self.dl_progress.setTextVisible(False) + self.dl_progress.setStyleSheet(f""" + QProgressBar {{ background: #111; border: none; border-radius: 2px; }} + QProgressBar::chunk {{ background: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); }} + """) + self.dl_progress.hide() + dl_layout.addWidget(self.dl_progress) + + self.container_layout.addWidget(self.download_bar) + + # Main grid layout matching web panel + main_layout = QHBoxLayout() + # Create a widget to hold main_layout + self.app_content = QWidget() + self.app_content.setLayout(main_layout) + self.container_layout.addWidget(self.app_content, 1) + main_layout.setSpacing(10) + main_layout.setContentsMargins(10, 10, 10, 10) + + # Left: Library (320px) + library_widget = QWidget() + library_widget.setFixedWidth(320) + library_widget.setStyleSheet(f""" + QWidget {{ + background: rgba(20, 20, 30, 0.8); + border: 2px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + border-radius: 10px; + }} + """) + + library_layout = QVBoxLayout(library_widget) + library_layout.setSpacing(10) + library_layout.setContentsMargins(15, 15, 15, 15) + + lib_header = QLabel("📁 LIBRARY") + lib_header.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 16px; + font-weight: bold; + color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + border: none; + """) + library_layout.addWidget(lib_header) + + # Library Mode Switch + mode_switch_layout = QHBoxLayout() + self.server_mode_btn = NeonButton("SERVER", PRIMARY_CYAN) + self.server_mode_btn.set_active(True) + self.server_mode_btn.clicked.connect(lambda: self.set_library_mode('server')) + + self.local_mode_btn = NeonButton("LOCAL", TEXT_DIM) + self.local_mode_btn.clicked.connect(lambda: self.set_library_mode('local')) + + mode_switch_layout.addWidget(self.server_mode_btn) + mode_switch_layout.addWidget(self.local_mode_btn) + library_layout.addLayout(mode_switch_layout) + + # Local Folder Selection (hidden by default) + self.local_folder_widget = QWidget() + local_folder_layout = QHBoxLayout(self.local_folder_widget) + local_folder_layout.setContentsMargins(0, 0, 0, 0) + + self.folder_label = QLabel("NO FOLDER...") + self.folder_label.setStyleSheet("color: #888; font-size: 10px;") + + select_folder_btn = QPushButton("📁") + select_folder_btn.setFixedSize(30, 30) + select_folder_btn.setStyleSheet("background: #333; border-radius: 4px; color: white;") + select_folder_btn.clicked.connect(self.select_local_folder) + + local_folder_layout.addWidget(self.folder_label, 1) + local_folder_layout.addWidget(select_folder_btn) + self.local_folder_widget.hide() + library_layout.addWidget(self.local_folder_widget) + + self.search_box = QLineEdit() + self.search_box.setPlaceholderText("🔍 FILTER LIBRARY...") + self.search_box.textChanged.connect(self.filter_library) + self.search_box.setStyleSheet(""" + QLineEdit { + background: rgba(0, 0, 0, 0.3); + border: 1px solid #333; + color: white; + padding: 10px; + border-radius: 4px; + font-family: 'Rajdhani'; + } + """) + library_layout.addWidget(self.search_box) + + self.library_list = QListWidget() + self.library_list.setSpacing(4) # Add spacing between items + self.library_list.setStyleSheet(""" + QListWidget { + background: rgba(0, 0, 0, 0.3); + border: none; + color: white; + outline: none; + } + QListWidget::item { + background: transparent; + border: none; + padding: 0px; + margin: 0px; + } + QListWidget::item:selected { + background: transparent; + } + """) + self.library_list.itemDoubleClicked.connect(self.on_library_double_click) + library_layout.addWidget(self.library_list) + + refresh_btn = QPushButton("🔄 Refresh Library") + refresh_btn.clicked.connect(self.fetch_library) + refresh_btn.setStyleSheet(f""" + QPushButton {{ + background: rgba(0, 243, 255, 0.1); + border: 1px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + padding: 8px 12px; + border-radius: 4px; + font-family: 'Orbitron'; + font-weight: bold; + }} + QPushButton:hover {{ + background: rgba(0, 243, 255, 0.2); + }} + """) + library_layout.addWidget(refresh_btn) + + main_layout.addWidget(library_widget) + + # Right: Decks + Crossfader + decks_widget = QWidget() + decks_layout = QVBoxLayout(decks_widget) + decks_layout.setSpacing(10) + decks_layout.setContentsMargins(0, 0, 0, 0) + + # Decks grid + decks_grid = QHBoxLayout() + decks_grid.setSpacing(10) + + self.deck_a = DeckWidget('A', self.audio_engine) + decks_grid.addWidget(self.deck_a) + + self.deck_b = DeckWidget('B', self.audio_engine) + decks_grid.addWidget(self.deck_b) + + decks_layout.addLayout(decks_grid) + + # Crossfader + xfader_widget = QWidget() + xfader_widget.setFixedHeight(80) + xfader_widget.setStyleSheet(""" + QWidget { + background: qlineargradient(x1:0, y1:0, x1:0, y1:1, + stop:0 #1a1a1a, stop:1 #0a0a0a); + border: 2px solid #444; + border-radius: 8px; + } + """) + + # Crossfader Bar (Full Width) + xfader_widget = QWidget() + xfader_widget.setFixedHeight(80) + xfader_widget.setStyleSheet(""" + QWidget { + background: qlineargradient(x1:0, y1:0, x1:0, y1:1, + stop:0 #1a1a1a, stop:1 #0a0a0a); + border: 2px solid #444; + border-radius: 8px; + } + """) + + xfader_layout = QHBoxLayout(xfader_widget) + xfader_layout.setContentsMargins(40, 15, 40, 15) + + label_a = QLabel("A") + label_a.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 24px; + font-weight: bold; + color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + """) + xfader_layout.addWidget(label_a) + + self.crossfader = QSlider(Qt.Horizontal) + self.crossfader.setRange(0, 100) + self.crossfader.setValue(50) + self.crossfader.valueChanged.connect(self.on_crossfader_change) + self.crossfader.setStyleSheet(""" + QSlider::groove:horizontal { + height: 12px; + background: qlineargradient(x1:0, y1:0, x1:1, y1:0, + stop:0 #00f3ff, stop:0.5 #333, stop:1 #bc13fe); + border-radius: 6px; + border: 2px solid #555; + } + QSlider::handle:horizontal { + background: qlineargradient(x1:0, y1:0, x1:0, y1:1, + stop:0 #aaa, stop:1 #666); + border: 3px solid #ccc; + width: 80px; + height: 48px; + margin: -18px 0; + border-radius: 8px; + } + QSlider::handle:horizontal:hover { + background: qlineargradient(x1:0, y1:0, x1:0, y1:1, + stop:0 #ccc, stop:1 #888); + } + """) + xfader_layout.addWidget(self.crossfader, 1) # Give it stretch + + label_b = QLabel("B") + label_b.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 24px; + font-weight: bold; + color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); + """) + xfader_layout.addWidget(label_b) + + decks_layout.addWidget(xfader_widget) + + main_layout.addWidget(decks_widget, 1) + + # Floating action buttons (bottom right) + self.create_floating_buttons() + + # Streaming panel (hidden by default) + self.create_streaming_panel() + + # Settings panel (hidden by default) + self.create_settings_panel() + + # Window styling + self.setStyleSheet(f""" + QMainWindow {{ + background: rgb({BG_DARK.red()}, {BG_DARK.green()}, {BG_DARK.blue()}); + }} + QWidget {{ + color: rgb({TEXT_MAIN.red()}, {TEXT_MAIN.green()}, {TEXT_MAIN.blue()}); + font-family: 'Rajdhani', sans-serif; + }} + """) + + # Glow effect timer + self.glow_timer = QTimer() + self.glow_timer.timeout.connect(self.update_glow_effect) + self.glow_timer.start(100) + + def create_floating_buttons(self): + """Create floating action buttons in bottom-right corner""" + button_style = """ + QPushButton { + background: rgba(188, 19, 254, 0.2); + border: 2px solid #bc13fe; + color: white; + font-size: 20px; + border-radius: 25px; + padding: 10px; + } + QPushButton:hover { + background: rgba(188, 19, 254, 0.4); + } + """ + + # Streaming button + self.streaming_btn = QPushButton("📡", self) + self.streaming_btn.setFixedSize(50, 50) + self.streaming_btn.setStyleSheet(button_style) + self.streaming_btn.clicked.connect(self.toggle_streaming_panel) + self.streaming_btn.setToolTip("Live Streaming") + self.streaming_btn.move(self.width() - 70, self.height() - 280) + + # Settings button + self.settings_btn = QPushButton("⚙️", self) + self.settings_btn.setFixedSize(50, 50) + self.settings_btn.setStyleSheet(button_style) + self.settings_btn.clicked.connect(self.toggle_settings_panel) + self.settings_btn.setToolTip("Settings") + self.settings_btn.move(self.width() - 70, self.height() - 220) + + # Upload button + self.upload_btn = QPushButton("📁", self) + self.upload_btn.setFixedSize(50, 50) + self.upload_btn.setStyleSheet(button_style) + self.upload_btn.clicked.connect(self.upload_file) + self.upload_btn.setToolTip("Upload MP3") + self.upload_btn.move(self.width() - 70, self.height() - 160) + + # Keyboard shortcuts button + self.keyboard_btn = QPushButton("⌨️", self) + self.keyboard_btn.setFixedSize(50, 50) + self.keyboard_btn.setStyleSheet(button_style) + self.keyboard_btn.setToolTip("Keyboard Shortcuts") + self.keyboard_btn.move(self.width() - 70, self.height() - 100) + + def create_streaming_panel(self): + """Create streaming panel matching web version""" + self.streaming_panel = QWidget(self) + self.streaming_panel.setFixedSize(400, 500) + self.streaming_panel.setStyleSheet(f""" + QWidget {{ + background: rgba(20, 20, 30, 0.95); + border: 2px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + border-radius: 10px; + }} + """) + self.streaming_panel.hide() + + layout = QVBoxLayout(self.streaming_panel) + layout.setSpacing(15) + + # Header + header = QHBoxLayout() + title = QLabel("📡 LIVE STREAM") + title.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 16px; + font-weight: bold; + color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + """) + header.addWidget(title) + header.addStretch() + + close_btn = QPushButton("✕") + close_btn.setFixedSize(30, 30) + close_btn.clicked.connect(self.toggle_streaming_panel) + close_btn.setStyleSheet(""" + QPushButton { + background: transparent; + border: none; + color: #888; + font-size: 18px; + } + QPushButton:hover { + color: white; + } + """) + header.addWidget(close_btn) + layout.addLayout(header) + + # Broadcast button + self.broadcast_btn = QPushButton("🔴 START BROADCAST") + self.broadcast_btn.setFixedHeight(60) + self.broadcast_btn.clicked.connect(self.toggle_broadcast) + self.broadcast_btn.setStyleSheet(f""" + QPushButton {{ + background: rgba(255, 0, 0, 0.2); + border: 2px solid #ff0000; + color: #ff0000; + font-family: 'Orbitron'; + font-size: 14px; + font-weight: bold; + border-radius: 8px; + }} + QPushButton:hover {{ + background: rgba(255, 0, 0, 0.3); + }} + """) + layout.addWidget(self.broadcast_btn) + + # Status + self.broadcast_status = QLabel("Offline") + self.broadcast_status.setAlignment(Qt.AlignCenter) + self.broadcast_status.setStyleSheet("color: #888; font-size: 12px;") + layout.addWidget(self.broadcast_status) + + # Listener count + listener_widget = QWidget() + listener_layout = QHBoxLayout(listener_widget) + listener_layout.setContentsMargins(0, 0, 0, 0) + + listener_icon = QLabel("👂") + listener_icon.setStyleSheet("font-size: 24px;") + listener_layout.addWidget(listener_icon) + + self.listener_count_label = QLabel("0") + self.listener_count_label.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 32px; + font-weight: bold; + color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); + """) + listener_layout.addWidget(self.listener_count_label) + + listener_text = QLabel("Listeners") + listener_text.setStyleSheet("color: #888; font-size: 14px;") + listener_layout.addWidget(listener_text) + listener_layout.addStretch() + + layout.addWidget(listener_widget) + + # Stream URL + url_label = QLabel("Share this URL:") + url_label.setStyleSheet("color: #888; font-size: 12px;") + layout.addWidget(url_label) + + url_widget = QWidget() + url_layout = QHBoxLayout(url_widget) + url_layout.setContentsMargins(0, 0, 0, 0) + url_layout.setSpacing(5) + + self.stream_url = QLineEdit("http://localhost:5001") + self.stream_url.setReadOnly(True) + self.stream_url.setStyleSheet(""" + QLineEdit { + background: rgba(0, 0, 0, 0.3); + border: 1px solid #333; + color: white; + padding: 8px; + border-radius: 4px; + } + """) + url_layout.addWidget(self.stream_url) + + copy_btn = QPushButton("📋") + copy_btn.setFixedSize(40, 30) + copy_btn.clicked.connect(self.copy_stream_url) + copy_btn.setStyleSheet(""" + QPushButton { + background: rgba(0, 243, 255, 0.1); + border: 1px solid #00f3ff; + color: #00f3ff; + } + QPushButton:hover { + background: rgba(0, 243, 255, 0.2); + } + """) + url_layout.addWidget(copy_btn) + + layout.addWidget(url_widget) + + # Auto-start checkbox + self.auto_start_check = QCheckBox("Auto-start on play") + self.auto_start_check.setStyleSheet("color: #e0e0e0;") + layout.addWidget(self.auto_start_check) + + # Quality selector + quality_label = QLabel("Stream Quality:") + quality_label.setStyleSheet("color: #888; font-size: 12px;") + layout.addWidget(quality_label) + + self.quality_combo = QComboBox() + self.quality_combo.addItems([ + "High (128kbps)", + "Medium (96kbps)", + "Low (64kbps)", + "Very Low (48kbps)", + "Minimum (32kbps)" + ]) + self.quality_combo.setCurrentIndex(1) + self.quality_combo.setStyleSheet(""" + QComboBox { + background: rgba(0, 0, 0, 0.3); + border: 1px solid #333; + color: white; + padding: 5px; + border-radius: 4px; + } + QComboBox::drop-down { + border: none; + } + QComboBox QAbstractItemView { + background: #1a1a1a; + color: white; + selection-background-color: #00f3ff; + } + """) + layout.addWidget(self.quality_combo) + + hint = QLabel("Lower = more stable on poor connections") + hint.setStyleSheet("color: #666; font-size: 10px;") + layout.addWidget(hint) + + layout.addStretch() + + # Position panel + self.streaming_panel.move(self.width() - 420, 20) + + def create_settings_panel(self): + """Create settings panel with glow controls""" + self.settings_panel = QWidget(self) + self.settings_panel.setFixedSize(400, 600) + self.settings_panel.setStyleSheet(f""" + QWidget {{ + background: rgba(20, 20, 30, 0.95); + border: 2px solid rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); + border-radius: 10px; + }} + """) + self.settings_panel.hide() + + layout = QVBoxLayout(self.settings_panel) + layout.setSpacing(10) + + # Header + header = QHBoxLayout() + title = QLabel("⚙️ SETTINGS") + title.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 16px; + font-weight: bold; + color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); + """) + header.addWidget(title) + header.addStretch() + + close_btn = QPushButton("✕") + close_btn.setFixedSize(30, 30) + close_btn.clicked.connect(self.toggle_settings_panel) + close_btn.setStyleSheet(""" + QPushButton { + background: transparent; + border: none; + color: #888; + font-size: 18px; + } + QPushButton:hover { + color: white; + } + """) + header.addWidget(close_btn) + layout.addLayout(header) + + # Settings checkboxes + checkbox_style = """ + QCheckBox { + color: #e0e0e0; + font-size: 13px; + spacing: 8px; + } + QCheckBox::indicator { + width: 18px; + height: 18px; + border: 2px solid #666; + border-radius: 3px; + background: rgba(0, 0, 0, 0.3); + } + QCheckBox::indicator:checked { + background: #bc13fe; + border-color: #bc13fe; + } + """ + + self.repeat_a_check = QCheckBox("🔁 Repeat Deck A") + self.repeat_a_check.setStyleSheet(checkbox_style) + layout.addWidget(self.repeat_a_check) + + self.repeat_b_check = QCheckBox("🔁 Repeat Deck B") + self.repeat_b_check.setStyleSheet(checkbox_style) + layout.addWidget(self.repeat_b_check) + + self.auto_mix_check = QCheckBox("🎛️ Auto-Crossfade") + self.auto_mix_check.setStyleSheet(checkbox_style) + layout.addWidget(self.auto_mix_check) + + self.shuffle_check = QCheckBox("🔀 Shuffle Library") + self.shuffle_check.setStyleSheet(checkbox_style) + layout.addWidget(self.shuffle_check) + + self.quantize_check = QCheckBox("📐 Quantize") + self.quantize_check.setStyleSheet(checkbox_style) + layout.addWidget(self.quantize_check) + + self.auto_play_check = QCheckBox("▶️ Auto-play next") + self.auto_play_check.setChecked(True) + self.auto_play_check.setStyleSheet(checkbox_style) + layout.addWidget(self.auto_play_check) + + # Glow controls + layout.addWidget(QLabel("")) # Spacer + + glow_title = QLabel("✨ NEON GLOW EFFECTS") + glow_title.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 14px; + font-weight: bold; + color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); + """) + layout.addWidget(glow_title) + + self.glow_a_check = QCheckBox("✨ Glow Deck A (Cyan)") + self.glow_a_check.setStyleSheet(checkbox_style) + self.glow_a_check.stateChanged.connect(lambda: self.toggle_glow('A')) + layout.addWidget(self.glow_a_check) + + self.glow_b_check = QCheckBox("✨ Glow Deck B (Magenta)") + self.glow_b_check.setStyleSheet(checkbox_style) + self.glow_b_check.stateChanged.connect(lambda: self.toggle_glow('B')) + layout.addWidget(self.glow_b_check) + + # Glow intensity + intensity_label = QLabel("✨ Glow Intensity") + intensity_label.setStyleSheet("color: #e0e0e0; font-size: 13px;") + layout.addWidget(intensity_label) + + self.glow_slider = QSlider(Qt.Horizontal) + self.glow_slider.setRange(1, 100) + self.glow_slider.setValue(30) + self.glow_slider.valueChanged.connect(self.update_glow_intensity) + self.glow_slider.setStyleSheet(""" + QSlider::groove:horizontal { + height: 8px; + background: #333; + border-radius: 4px; + } + QSlider::handle:horizontal { + background: #bc13fe; + border: 2px solid #bc13fe; + width: 16px; + margin: -4px 0; + border-radius: 8px; + } + """) + layout.addWidget(self.glow_slider) + + # Server URL configuration + layout.addWidget(QLabel("")) # Spacer + server_title = QLabel("📡 SERVER CONFIGURATION") + server_title.setStyleSheet(f""" + font-family: 'Orbitron'; + font-size: 14px; + font-weight: bold; + color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); + """) + layout.addWidget(server_title) + + server_url_label = QLabel("🔗 Server API URL (e.g. http://localhost:5000)") + server_url_label.setStyleSheet("color: #e0e0e0; font-size: 13px;") + layout.addWidget(server_url_label) + + self.server_url_input = QLineEdit(self.server_url) + self.server_url_input.setStyleSheet(""" + background: rgba(0, 0, 0, 0.4); + border: 1px solid #444; + color: cyan; + padding: 5px; + font-family: 'Rajdhani'; + border-radius: 4px; + """) + self.server_url_input.textChanged.connect(self.on_server_url_change) + layout.addWidget(self.server_url_input) + + layout.addStretch() + + # Position panel + self.settings_panel.move(self.width() - 420, 20) + + def load_settings(self): + """Load persistent settings""" + settings_path = Path.home() / ".techdj_settings.json" + if settings_path.exists(): + try: + with open(settings_path, 'r') as f: + data = json.load(f) + self.local_folder = data.get('local_folder') + self.library_mode = data.get('library_mode', 'server') + self.server_url = data.get('server_url', self.server_url) + except Exception as e: + print(f"Error loading settings: {e}") + + def save_settings(self): + """Save persistent settings""" + settings_path = Path.home() / ".techdj_settings.json" + try: + with open(settings_path, 'w') as f: + json.dump({ + 'local_folder': self.local_folder, + 'library_mode': self.library_mode, + 'server_url': self.server_url + }, f) + except Exception as e: + print(f"Error saving settings: {e}") + + def set_library_mode(self, mode): + """Switch between server and local library""" + self.library_mode = mode + + if mode == 'server': + self.server_mode_btn.set_active(True) + self.local_mode_btn.set_active(False) + self.local_folder_widget.hide() + else: + self.server_mode_btn.set_active(False) + self.local_mode_btn.set_active(True) + self.local_folder_widget.show() + if self.local_folder: + self.folder_label.setText(os.path.basename(self.local_folder).upper()) + self.scan_local_library() + + self.update_library_list(rebuild=True) + self.save_settings() + + def select_local_folder(self): + """Open dialog to select local music folder""" + folder = QFileDialog.getExistingDirectory(self, "Select Music Folder") + if folder: + self.local_folder = folder + self.folder_label.setText(os.path.basename(folder).upper()) + self.scan_local_library() + self.update_library_list(rebuild=True) + self.save_settings() + + def on_server_url_change(self, text): + """Update server URL and save""" + self.server_url = text + self.save_settings() + + # Debounce the refresh to avoid spamming while typing + if not hasattr(self, '_refresh_timer'): + self._refresh_timer = QTimer() + self._refresh_timer.timeout.connect(self.fetch_library) + self._refresh_timer.setSingleShot(True) + + self._refresh_timer.start(1500) # Refresh library 1.5s after typing stops + + def scan_local_library(self): + """Scan local folder for audio files""" + if not self.local_folder: + return + + self.local_library = [] + extensions = ('.mp3', '.wav', '.flac', '.ogg', '.m4a') + + try: + for root, dirs, files in os.walk(self.local_folder): + for file in sorted(files): + if file.lower().endswith(extensions): + full_path = os.path.join(root, file) + self.local_library.append({ + "title": os.path.splitext(file)[0], + "file": full_path, + "is_local": True + }) + print(f"📂 Found {len(self.local_library)} local tracks") + except Exception as e: + print(f"Error scanning folder: {e}") + + def fetch_library(self): + try: + response = requests.get(f"{self.server_url}/library.json", timeout=5) + self.server_library = response.json() + # Mark server tracks + for track in self.server_library: + track['is_local'] = False + + # Initial mode setup + self.set_library_mode(self.library_mode) + print(f"📚 Loaded {len(self.server_library)} tracks from server") + except Exception as e: + print(f"❌ Error fetching library: {e}") + # Still set local mode if server fails + self.set_library_mode(self.library_mode) + + def update_library_list(self, rebuild=False): + """Update library results. If rebuild is True, clear and recreate all widgets. + If rebuild is False, just hide/show existing items (much faster).""" + search_term = self.search_box.text().lower() + + # Determine which library to show + library_to_show = self.server_library if self.library_mode == 'server' else self.local_library + + # If we need a full rebuild or the list is empty/wrong size + if rebuild or self.library_list.count() != len(library_to_show): + self.library_list.setUpdatesEnabled(False) + self.library_list.clear() + + for track in library_to_show: + item = QListWidgetItem() + item.setSizeHint(QSize(0, 40)) + item.setData(Qt.UserRole, track) + + widget = QWidget() + widget.setStyleSheet(""" + QWidget { + background: rgba(255, 255, 255, 0.03); + border-radius: 4px; + border-left: 3px solid transparent; + } + QWidget:hover { + background: rgba(255, 255, 255, 0.08); + border-left: 3px solid #00f3ff; + } + """) + item_layout = QHBoxLayout(widget) + item_layout.setContentsMargins(10, 8, 10, 8) + item_layout.setSpacing(5) + + label = QLabel(track['title']) + label.setStyleSheet("font-family: 'Rajdhani'; font-weight: bold; font-size: 13px; color: white; background: transparent;") + item_layout.addWidget(label, 1) + + btn_a = QPushButton("A+") + btn_a.setFixedSize(30, 22) + btn_a.setStyleSheet(f"background: rgba(0, 243, 255, 0.2); border: 1px solid rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); border-radius: 4px; color: rgb({PRIMARY_CYAN.red()}, {PRIMARY_CYAN.green()}, {PRIMARY_CYAN.blue()}); font-size: 9px; font-weight: bold;") + btn_a.clicked.connect(lambda _, t=track: self.add_to_queue('A', t)) + item_layout.addWidget(btn_a) + + btn_b = QPushButton("B+") + btn_b.setFixedSize(30, 22) + btn_b.setStyleSheet(f"background: rgba(188, 19, 254, 0.2); border: 1px solid rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); border-radius: 4px; color: rgb({SECONDARY_MAGENTA.red()}, {SECONDARY_MAGENTA.green()}, {SECONDARY_MAGENTA.blue()}); font-size: 9px; font-weight: bold;") + btn_b.clicked.connect(lambda _, t=track: self.add_to_queue('B', t)) + item_layout.addWidget(btn_b) + + self.library_list.addItem(item) + self.library_list.setItemWidget(item, widget) + + self.library_list.setUpdatesEnabled(True) + + # Apply visibility filter (extremely fast) + self.library_list.setUpdatesEnabled(False) + for i in range(self.library_list.count()): + item = self.library_list.item(i) + track = item.data(Qt.UserRole) + if track: + visible = not search_term or search_term in track['title'].lower() + item.setHidden(not visible) + self.library_list.setUpdatesEnabled(True) + + def filter_library(self): + # Debounce reduced to 100ms for snappier feel + self.search_timer.start(100) + + def on_library_double_click(self, item): + track = item.data(Qt.UserRole) + + dialog = QDialog(self) + dialog.setWindowTitle("Load Track") + dialog.setStyleSheet(f""" + QDialog {{ + background: rgb({BG_DARK.red()}, {BG_DARK.green()}, {BG_DARK.blue()}); + }} + """) + + layout = QVBoxLayout() + layout.addWidget(QLabel(f"Load '{track['title']}' to:")) + + btn_a = NeonButton(f"▶ Play on Deck A", PRIMARY_CYAN) + btn_a.clicked.connect(lambda: self.load_to_deck('A', track, dialog)) + layout.addWidget(btn_a) + + btn_b = NeonButton(f"▶ Play on Deck B", SECONDARY_MAGENTA) + btn_b.clicked.connect(lambda: self.load_to_deck('B', track, dialog)) + layout.addWidget(btn_b) + + # Add to queue buttons + queue_a = NeonButton(f"📋 Add to Queue A", PRIMARY_CYAN) + queue_a.clicked.connect(lambda: self.add_to_queue('A', track, dialog)) + layout.addWidget(queue_a) + + queue_b = NeonButton(f"📋 Add to Queue B", SECONDARY_MAGENTA) + queue_b.clicked.connect(lambda: self.add_to_queue('B', track, dialog)) + layout.addWidget(queue_b) + + dialog.setLayout(layout) + dialog.exec_() + + def load_to_deck(self, deck_id, track, dialog=None): + if dialog: + dialog.accept() + + if track.get('is_local'): + # Load local file directly + print(f"📂 Loading local: {track['file']}") + self.deck_loading_target[deck_id] = track['file'] + if deck_id == 'A': + self.deck_a.load_track(track['file']) + else: + self.deck_b.load_track(track['file']) + return + + filename = os.path.basename(track['file']) + cache_path = self.cache_dir / filename + self.deck_loading_target[deck_id] = str(cache_path) + + if cache_path.exists(): + print(f"📦 Using cached: {filename}") + if deck_id == 'A': + self.deck_a.load_track(str(cache_path)) + else: + self.deck_b.load_track(str(cache_path)) + else: + url = f"{self.server_url}/{track['file']}" + print(f"⬇️ Downloading: {filename}") + + thread = DownloadThread(url, str(cache_path)) + thread.finished.connect(lambda path, success: self.on_download_finished(deck_id, path, success)) + thread.start() + self.download_threads[filename] = thread + + def on_download_finished(self, deck_id, filepath, success): + if success: + # Check if this is still the intended track for this deck + if self.deck_loading_target.get(deck_id) != filepath: + print(f"⏭️ Stale download finished (ignored): {os.path.basename(filepath)}") + return + + print(f"✅ Downloaded: {os.path.basename(filepath)}") + if deck_id == 'A': + self.deck_a.load_track(filepath) + else: + self.deck_b.load_track(filepath) + else: + QMessageBox.warning(self, "Download Error", "Failed to download track") + + def add_to_queue(self, deck_id, track, dialog=None): + """Add track to deck's queue""" + if dialog: + dialog.accept() + + # Determine file path + if self.library_mode == 'local': + filepath = track['file'] + else: + filename = track['file'].split('/')[-1] + cache_path = self.cache_dir / filename + + if cache_path.exists(): + filepath = str(cache_path) + else: + # Download to cache first + url = f"{self.server_url}/{track['file']}" + print(f"⬇️ Downloading for queue: {filename}") + + thread = DownloadThread(url, str(cache_path)) + thread.finished.connect(lambda path, success: self.on_queue_download_finished(deck_id, path, success)) + thread.start() + self.download_threads[filename] = thread + return + + # Add to queue + self.audio_engine.add_to_queue(deck_id, filepath) + queue_len = len(self.audio_engine.get_queue(deck_id)) + print(f"📋 Added to Deck {deck_id} queue: {track['title']} (Queue: {queue_len})") + + if dialog: + QMessageBox.information(self, "Added to Queue", + f"Added '{track['title']}' to Deck {deck_id} queue\n\nQueue length: {queue_len}") + + def on_queue_download_finished(self, deck_id, filepath, success): + """Handle download completion for queued tracks""" + if success: + self.audio_engine.add_to_queue(deck_id, filepath) + queue_len = len(self.audio_engine.get_queue(deck_id)) + print(f"✅ Downloaded and queued: {os.path.basename(filepath)} (Queue: {queue_len})") + else: + print(f"❌ Failed to download for queue: {os.path.basename(filepath)}") + + def on_crossfader_change(self, value): + self.audio_engine.set_crossfader(value / 100.0) + + + def toggle_streaming_panel(self): + """Toggle streaming panel visibility""" + if self.streaming_panel.isVisible(): + self.streaming_panel.hide() + else: + self.settings_panel.hide() # Hide settings if open + self.streaming_panel.show() + self.streaming_panel.raise_() + + def toggle_settings_panel(self): + """Toggle settings panel visibility""" + if self.settings_panel.isVisible(): + self.settings_panel.hide() + else: + self.streaming_panel.hide() # Hide streaming if open + self.settings_panel.show() + self.settings_panel.raise_() + + def toggle_broadcast(self): + """Toggle broadcast on/off""" + if not self.broadcasting: + # Start broadcast + try: + if self.socket is None: + print(f"🔌 Connecting to server: {self.server_url}") + self.socket = socketio.Client(logger=True, engineio_logger=False) + + # Add connection event handlers + @self.socket.on('connect') + def on_connect(): + print("✅ Socket.IO connected successfully") + + @self.socket.on('connect_error') + def on_connect_error(data): + print(f"❌ Socket.IO connection error: {data}") + QMessageBox.warning(self, "Connection Error", + f"Failed to connect to server at {self.server_url}\n\nError: {data}") + + @self.socket.on('disconnect') + def on_disconnect(): + print("⚠️ Socket.IO disconnected") + + self.socket.on('listener_count', self.on_listener_count) + + try: + self.socket.connect(self.server_url, wait_timeout=10) + print("✅ Connection established") + except Exception as e: + print(f"❌ Connection failed: {e}") + QMessageBox.critical(self, "Connection Failed", + f"Could not connect to {self.server_url}\n\nError: {str(e)}\n\nMake sure the server is running.") + return + + bitrate_map = {0: "128k", 1: "96k", 2: "64k", 3: "48k", 4: "32k"} + bitrate = bitrate_map.get(self.quality_combo.currentIndex(), "96k") + + print(f"📡 Emitting start_broadcast with bitrate: {bitrate}") + self.socket.emit('start_broadcast', { + 'bitrate': bitrate, + 'format': 'mp3' + }) + + # Start local encoding thread + self.audio_engine.is_broadcasting = True + self.broadcast_thread = BroadcastThread(self.audio_engine.broadcast_queue, bitrate) + self.broadcast_thread.chunk_ready.connect(self.on_broadcast_chunk) + self.broadcast_thread.start() + + self.broadcasting = True + self.broadcast_btn.setText("🟢 STOP BROADCAST") + self.broadcast_btn.setStyleSheet(""" + QPushButton { + background: rgba(0, 255, 0, 0.2); + border: 2px solid #00ff00; + color: #00ff00; + font-family: 'Orbitron'; + font-size: 14px; + font-weight: bold; + border-radius: 8px; + } + QPushButton:hover { + background: rgba(0, 255, 0, 0.3); + } + """) + self.broadcast_status.setText("🔴 LIVE") + self.broadcast_status.setStyleSheet("color: #00ff00; font-size: 12px; font-weight: bold;") + + print("🎙️ Broadcast started") + except Exception as e: + print(f"❌ Broadcast error: {e}") + QMessageBox.warning(self, "Broadcast Error", f"Could not start broadcast:\n{e}") + else: + # Stop broadcast + if self.socket and self.socket.connected: + try: + self.socket.emit('stop_broadcast') + except Exception as e: + print(f"❌ Failed to emit stop_broadcast: {e}") + + self.audio_engine.is_broadcasting = False + if self.broadcast_thread: + self.broadcast_thread.stop() + self.broadcast_thread = None + + self.broadcasting = False + self.broadcast_btn.setText("🔴 START BROADCAST") + self.broadcast_btn.setStyleSheet(""" + QPushButton { + background: rgba(255, 0, 0, 0.2); + border: 2px solid #ff0000; + color: #ff0000; + font-family: 'Orbitron'; + font-size: 14px; + font-weight: bold; + border-radius: 8px; + } + QPushButton:hover { + background: rgba(255, 0, 0, 0.3); + } + """) + self.broadcast_status.setText("Offline") + self.broadcast_status.setStyleSheet("color: #888; font-size: 12px;") + + print("🛑 Broadcast stopped") + + def on_broadcast_chunk(self, chunk): + """Send encoded chunk to server via Socket.IO""" + if self.socket and self.socket.connected and self.broadcasting: + try: + self.socket.emit('audio_chunk', chunk) + except Exception as e: + print(f"❌ Failed to send chunk: {e}") + + def on_listener_count(self, data): + """Update listener count from server""" + self.listener_count = data.get('count', 0) + # Update UI if streaming panel is visible + if hasattr(self, 'listener_count_label'): + self.listener_count_label.setText(f"{self.listener_count}") + + def copy_stream_url(self): + """Copy stream URL to clipboard""" + clipboard = QApplication.clipboard() + clipboard.setText(self.stream_url.text()) + + # Show feedback + original_text = self.stream_url.text() + self.stream_url.setText("✅ Copied!") + QTimer.singleShot(1000, lambda: self.stream_url.setText(original_text)) + + def toggle_glow(self, deck_id): + """Toggle glow effect for a deck""" + if deck_id == 'A': + self.glow_enabled['A'] = self.glow_a_check.isChecked() + else: + self.glow_enabled['B'] = self.glow_b_check.isChecked() + + print(f"✨ Glow {deck_id}: {self.glow_enabled[deck_id]}") + + def update_glow_intensity(self, value): + """Update glow intensity""" + self.glow_intensity = value + + def update_glow_effect(self): + """Update window glow effect based on settings""" + # This would apply a glow effect to the window border + # For now, just update deck styling + for deck_id in ['A', 'B']: + if self.glow_enabled[deck_id]: + deck_widget = self.deck_a if deck_id == 'A' else self.deck_b + color = PRIMARY_CYAN if deck_id == 'A' else SECONDARY_MAGENTA + opacity = self.glow_intensity / 100.0 + + # Apply glow effect (simplified - could be enhanced with QGraphicsEffect) + deck_widget.setStyleSheet(deck_widget.styleSheet() + f""" + QWidget#deck {{ + box-shadow: 0 0 {self.glow_intensity}px rgba({color.red()}, {color.green()}, {color.blue()}, {opacity}); + }} + """) + + def start_download(self): + """Search or start direct download""" + query = self.dl_input.text().strip() + if not query: + return + + # Determine if it's a URL or search query + is_url = re.match(r'^https?://', query) + + if is_url: + self.perform_actual_download(query) + else: + self.search_youtube(query) + + def search_youtube(self, query): + """Perform metadata search for youtube results""" + self.dl_input.setEnabled(False) + self.dl_btn.setEnabled(False) + self.dl_btn.setText("SEARCHING...") + + venv_path = os.path.join(os.path.dirname(__file__), ".venv/bin/yt-dlp") + yt_dlp_cmd = venv_path if os.path.exists(venv_path) else "yt-dlp" + + cmd = [ + yt_dlp_cmd, + f"ytsearch8:{query}", + "--print", "%(title)s ||| %(duration_string)s ||| %(webpage_url)s", + "--no-playlist", + "--flat-playlist" + ] + + print(f"🔍 Searching YouTube: {query}") + + self.search_process = QProcess() + self.search_process.finished.connect(self.on_search_finished) + self.search_process.start(cmd[0], cmd[1:]) + + def on_search_finished(self): + """Handle search results and show dialog""" + self.dl_input.setEnabled(True) + self.dl_btn.setEnabled(True) + self.dl_btn.setText("GET") + + # Check for errors + if self.search_process.exitCode() != 0: + err = str(self.search_process.readAllStandardError(), encoding='utf-8') + print(f"❌ YouTube Search Error: {err}") + QMessageBox.warning(self, "Search Error", f"YouTube search failed:\n\n{err[:200]}...") + return + + output = str(self.search_process.readAllStandardOutput(), encoding='utf-8').strip() + if not output: + QMessageBox.warning(self, "No Results", "No YouTube results found for that query.") + return + + results = [r for r in output.split("\n") if " ||| " in r] + if not results: + QMessageBox.warning(self, "No Results", "Could not parse search results.") + return + + dialog = YouTubeSearchDialog(results, self) + dialog.item_selected.connect(self.perform_actual_download) + dialog.exec_() + + def perform_actual_download(self, url): + """Start the actual yt-dlp download process""" + # Use local folder or default to project's 'music' folder + dl_dir = self.local_folder if self.local_folder else "music" + if not os.path.exists(dl_dir): + os.makedirs(dl_dir, exist_ok=True) + + # Disable input during download + self.dl_input.setEnabled(False) + self.dl_btn.setEnabled(False) + self.dl_progress.setValue(0) + self.dl_progress.show() + + venv_path = os.path.join(os.path.dirname(__file__), ".venv/bin/yt-dlp") + yt_dlp_cmd = venv_path if os.path.exists(venv_path) else "yt-dlp" + + cmd = [ + yt_dlp_cmd, + "--extract-audio", + "--audio-format", "mp3", + "--audio-quality", "0", + "--output", f"{dl_dir}/%(title)s.%(ext)s", + "--no-playlist", + url + ] + + print(f"📥 Starting download: {url}") + + self.dl_process = QProcess() + self.dl_process.readyReadStandardOutput.connect(self.on_dl_ready_read) + self.dl_process.finished.connect(self.on_dl_finished) + self.dl_process.start(cmd[0], cmd[1:]) + + def on_dl_ready_read(self): + """Parse yt-dlp output for progress""" + output = str(self.dl_process.readAllStandardOutput(), encoding='utf-8') + # Look for [download] 45.3% of 10.00MiB at 10.00MiB/s ETA 00:00 + match = re.search(r'\[download\]\s+(\d+\.\d+)%', output) + if match: + percent = float(match.group(1)) + self.dl_progress.setValue(int(percent)) + + def on_dl_finished(self): + """Handle download completion""" + self.dl_input.setEnabled(True) + self.dl_btn.setEnabled(True) + self.dl_progress.hide() + + if self.dl_process.exitCode() == 0: + print("✅ Download finished successfully") + self.dl_input.clear() + self.fetch_library() # Refresh library to show new track + QMessageBox.information(self, "Download Complete", "Track downloaded and added to library!") + else: + err = str(self.dl_process.readAllStandardError(), encoding='utf-8') + if not err: + err = "Unknown error (check console)" + print(f"❌ Download failed: {err}") + QMessageBox.warning(self, "Download Failed", f"Error: {err}") + + def upload_file(self): + """Upload MP3 file to server""" + file_path, _ = QFileDialog.getOpenFileName( + self, + "Upload MP3", + "", + "MP3 Files (*.mp3);;All Files (*)" + ) + + if file_path: + try: + filename = os.path.basename(file_path) + with open(file_path, 'rb') as f: + files = {'file': (filename, f, 'audio/mpeg')} + response = requests.post(f"{self.server_url}/upload", files=files) + + if response.json().get('success'): + print(f"✅ Uploaded: {filename}") + QMessageBox.information(self, "Upload Success", f"Uploaded {filename}") + self.fetch_library() # Refresh library + else: + error = response.json().get('error', 'Unknown error') + QMessageBox.warning(self, "Upload Failed", error) + except Exception as e: + print(f"❌ Upload error: {e}") + QMessageBox.warning(self, "Upload Error", str(e)) + + def resizeEvent(self, event): + """Handle window resize to reposition floating elements""" + super().resizeEvent(event) + + # Reposition floating buttons + if hasattr(self, 'streaming_btn'): + self.streaming_btn.move(self.width() - 70, self.height() - 280) + self.settings_btn.move(self.width() - 70, self.height() - 220) + self.upload_btn.move(self.width() - 70, self.height() - 160) + self.keyboard_btn.move(self.width() - 70, self.height() - 100) + + # Reposition panels + if hasattr(self, 'streaming_panel'): + self.streaming_panel.move(self.width() - 420, 20) + self.settings_panel.move(self.width() - 420, 20) + + def closeEvent(self, event): + """Clean up resources before closing""" + # Stop broadcast if active + if self.broadcasting: + self.toggle_broadcast() + + # Disconnect Socket.IO + if self.socket and self.socket.connected: + try: + self.socket.disconnect() + print("🔌 Socket.IO disconnected") + except Exception as e: + print(f"⚠️ Error disconnecting Socket.IO: {e}") + + # Stop audio engine + self.audio_engine.stop_stream() + + # Wait for download threads to finish + for filename, thread in list(self.download_threads.items()): + if thread.isRunning(): + thread.wait(1000) # Wait up to 1 second + + event.accept() + + +def main(): + app = QApplication(sys.argv) + app.setStyle('Fusion') + + # Set dark palette + palette = app.palette() + palette.setColor(palette.Window, BG_DARK) + palette.setColor(palette.WindowText, TEXT_MAIN) + palette.setColor(palette.Base, QColor(15, 15, 20)) + palette.setColor(palette.AlternateBase, QColor(20, 20, 30)) + palette.setColor(palette.Text, TEXT_MAIN) + palette.setColor(palette.Button, QColor(30, 30, 40)) + palette.setColor(palette.ButtonText, TEXT_M AIN) + app.setPalette(palette) + + window = TechDJMainWindow() + window.show() + \ No newline at end of file