Xtream Code Club [2025]

.favorite-item:hover, .recent-item:hover { background: #f0f0f0; }

// API Routes app.post('/api/connect', async (req, res) => { const { server, port, username, password } = req.body; const client = new XtreamClient(server, port, username, password); const auth = await client.authenticate();

.login-container { display: flex; justify-content: center; align-items: center; height: 100vh; } xtream code club

.favorites, .recently-watched { margin-bottom: 30px; }

.category-item { padding: 8px 12px; margin: 5px 0; cursor: pointer; border-radius: 5px; transition: background 0.3s; } .recent-item:hover { background: #f0f0f0

.favorite-item button, .recent-item button { padding: 5px 10px; background: #667eea; color: white; border: none; border-radius: 3px; cursor: pointer; }

async getShortEPG(streamId) { try { const response = await axios.get(`${this.baseUrl}/player_api.php`, { params: { username: this.username, password: this.password, action: 'get_short_epg', stream_id: streamId, limit: 5 } }); return response.data; } catch (error) { return []; } } } } // API Routes app.post('/api/connect'

async getEPG(limit = 100, offset = 0) { try { const response = await axios.get(`${this.baseUrl}/player_api.php`, { params: { username: this.username, password: this.password, action: 'get_simple_data_table', stream_id: limit } }); return response.data; } catch (error) { return []; } }

app.get('/api/categories', async (req, res) => { if (!req.app.locals.client) { return res.status(401).json({ error: 'Not connected' }); } const categories = await req.app.locals.client.getCategories(); res.json(categories); });

.channel-actions button:last-child { background: #ffd700; }