Ana Sayfa Keşfet Güncel Sezon Birlikte İzle Destek Talebi

Birlikte İzle

Arkadaşlarınla aynı anda anime izle! Oda oluştur veya var olan bir odaya katıl.

let currentUser = null; // Toast notification function showToast(message, type = 'info') { const toast = document.createElement('div'); toast.className = `fixed bottom-4 right-4 px-6 py-3 rounded-lg shadow-lg z-50 ${ type === 'success' ? 'bg-green-600' : type === 'error' ? 'bg-red-600' : 'bg-purple-600' }`; toast.innerHTML = message; document.body.appendChild(toast); setTimeout(() => toast.remove(), 3000); } // API request helper async function apiRequest(endpoint, options = {}) { const token = localStorage.getItem('anicixor_token'); const headers = { 'Content-Type': 'application/json' }; if (token) headers['Authorization'] = 'Bearer ' + token; const response = await fetch('/api' + endpoint, { ...options, headers }); return response.json(); } // Check auth and premium status async function checkAccess() { try { const token = localStorage.getItem('anicixor_token'); if (!token) { document.getElementById('auth-required').classList.remove('hidden'); return false; } const result = await apiRequest('/auth/me'); if (!result.success) { document.getElementById('auth-required').classList.remove('hidden'); return false; } currentUser = result.data?.user || result.data; if (!currentUser || !currentUser.id) { document.getElementById('auth-required').classList.remove('hidden'); return false; } document.getElementById('premium-required').classList.add('hidden'); // Check if watch party is enabled const config = await apiRequest('/watchparty/config'); const watchPartyEnabled = config.data?.enabled !== false; const premiumRequired = config.data?.premiumRequired === true; if (!watchPartyEnabled && currentUser.role !== 'super_admin') { showToast('Birlikte izleme özelliği şu an kapalı', 'error'); return false; } if (premiumRequired && !['admin', 'super_admin'].includes(currentUser.role)) { // Check both premium status and subscription const premiumStatus = await apiRequest('/premium/status').catch(() => ({ data: { is_premium: false } })); if (!premiumStatus.data?.is_premium) { const subscription = await apiRequest('/premium/subscription').catch(() => ({ data: null })); if (!subscription.data) { document.getElementById('premium-required').classList.remove('hidden'); return false; } } } // Show content document.getElementById('watchparty-content').classList.remove('hidden'); return true; } catch (error) { console.error('Access check error:', error); document.getElementById('auth-required').classList.remove('hidden'); return false; } } // Load animes for dropdown async function loadAnimes() { try { const result = await apiRequest('/anime/latest?limit=100'); if (result.success || result.data) { const select = document.getElementById('room-anime'); const animes = result.data || []; animes.forEach(anime => { const option = document.createElement('option'); option.value = anime.id; option.textContent = anime.title; option.dataset.slug = anime.slug; select.appendChild(option); }); } } catch (error) { console.error('Load animes error:', error); } } // Load episodes when anime is selected document.getElementById('room-anime')?.addEventListener('change', async (e) => { const animeId = e.target.value; const episodeSelect = document.getElementById('room-episode'); episodeSelect.innerHTML = ''; episodeSelect.disabled = true; if (!animeId) { episodeSelect.innerHTML = ''; return; } try { const result = await apiRequest('/episodes?anime_id=' + animeId); const episodes = result.data || []; if (episodes.length > 0) { episodeSelect.innerHTML = ''; episodes.forEach(ep => { const option = document.createElement('option'); option.value = ep.id; option.textContent = 'Bölüm ' + ep.episode_number + (ep.title ? ': ' + ep.title : ''); episodeSelect.appendChild(option); }); episodeSelect.disabled = false; } else { episodeSelect.innerHTML = ''; } } catch (error) { console.error('Load episodes error:', error); episodeSelect.innerHTML = ''; } }); // Load active rooms async function loadRooms() { try { document.getElementById('rooms-loading').classList.remove('hidden'); document.getElementById('rooms-empty').classList.add('hidden'); document.getElementById('rooms-grid').classList.add('hidden'); const result = await apiRequest('/watchparty/rooms?status=active&limit=20'); document.getElementById('rooms-loading').classList.add('hidden'); if (result.success && result.data.length > 0) { const grid = document.getElementById('rooms-grid'); grid.innerHTML = result.data.map(room => `

${room.name}

${room.has_password ? '' : ''} ${room.is_private ? '' : ''}

${room.anime_title || 'Anime'}

${room.current_users || 1}/${room.max_users} ${room.host_name || 'Anonim'}
`).join(''); grid.classList.remove('hidden'); } else { document.getElementById('rooms-empty').classList.remove('hidden'); } } catch (error) { console.error('Load rooms error:', error); document.getElementById('rooms-loading').classList.add('hidden'); document.getElementById('rooms-empty').classList.remove('hidden'); } } // Create room document.getElementById('create-room-form')?.addEventListener('submit', async (e) => { e.preventDefault(); const name = document.getElementById('room-name').value; const animeId = document.getElementById('room-anime').value; const episodeId = document.getElementById('room-episode').value; const maxUsers = document.getElementById('room-max-users').value; const isPrivate = document.getElementById('room-private').checked; const password = document.getElementById('room-password')?.value || ''; try { const result = await apiRequest('/watchparty/rooms', { method: 'POST', body: JSON.stringify({ name, episodeId: episodeId, max_users: parseInt(maxUsers), is_private: isPrivate, password: password || null }) }); if (result.success) { showToast('Oda oluşturuldu!', 'success'); window.location.href = '/watchparty/' + result.data.room_code; } else { showToast(result.error || 'Oda oluşturulamadı', 'error'); } } catch (error) { showToast('Bir hata oluştu', 'error'); } }); // Join room document.getElementById('join-room-form')?.addEventListener('submit', async (e) => { e.preventDefault(); let code = document.getElementById('room-code').value.trim(); // Extract code from URL if full link is pasted if (code.includes('/watchparty/')) { code = code.split('/watchparty/').pop(); } joinRoom(code); }); async function joinRoom(code) { try { const password = document.getElementById('join-password')?.value || ''; const result = await apiRequest('/watchparty/rooms/' + code + '/join', { method: 'POST', body: JSON.stringify({ password }) }); if (result.success) { window.location.href = '/watchparty/' + code; } else if (result.requires_password) { document.getElementById('join-password-section')?.classList.remove('hidden'); showToast('Bu oda sifre korunmali. Lutfen sifreyi girin.', 'warning'); } else { showToast(result.error || 'Odaya katilamadi', 'error'); } } catch (error) { showToast('Bir hata oluştu', 'error'); } } // Copy room link function copyRoomLink(code) { navigator.clipboard.writeText(window.location.origin + '/watchparty/' + code); showToast('Oda linki kopyalandı!', 'success'); } // Auto-fill from URL params (coming from watch page) function autoFillFromParams() { const params = new URLSearchParams(window.location.search); const animeId = params.get('anime'); const episodeId = params.get('episode'); if (animeId) { setTimeout(async () => { const select = document.getElementById('room-anime'); if (select) { // Wait for animes to load await new Promise(r => setTimeout(r, 1500)); for (let opt of select.options) { if (opt.value === animeId) { select.value = animeId; select.dispatchEvent(new Event('change')); if (episodeId) { await new Promise(r => setTimeout(r, 1500)); const epSelect = document.getElementById('room-episode'); for (let opt of epSelect.options) { if (opt.value === episodeId) { epSelect.value = episodeId; break; } } } break; } } } }, 500); } } // Initialize document.addEventListener('DOMContentLoaded', async () => { const hasAccess = await checkAccess(); if (hasAccess) { loadAnimes(); loadRooms(); autoFillFromParams(); } });