diff --git a/static/js/main.js b/static/js/main.js index c3e4fc0..f4ceaa1 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -18,89 +18,42 @@ document.addEventListener('DOMContentLoaded', () => { */ function initializeForms() { // Search form - document.getElementById('searchInput').addEventListener('keypress', (e) => { - if (e.key === 'Enter') { - handleSearch(); - } - }); + const searchInput = document.getElementById('searchInput'); + if (searchInput) { + searchInput.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + handleSearch(); + } + }); + } // Direct download form - document.getElementById('downloadForm').addEventListener('submit', handleDirectDownload); + const downloadForm = document.getElementById('downloadForm'); + if (downloadForm) { + downloadForm.addEventListener('submit', handleDirectDownload); + } } /** - * Load providers dynamically + * Load providers dynamically (legacy support) + * Note: This is kept for compatibility but the new interface uses static tabs */ async function loadProviders() { try { const data = await getProvidersInfo(); - // Update anime tabs - const animeTabsContainer = document.querySelector('.tabs'); - const existingAnimeTabs = animeTabsContainer.querySelectorAll('.tab[data-tab-type="anime"]'); - existingAnimeTabs.forEach(tab => tab.remove()); - - // Add anime provider tabs - Object.entries(data.anime_providers).forEach(([id, provider]) => { - // Check if tab doesn't exist - if (!document.querySelector(`.tab[data-provider="${id}"]`)) { - const button = document.createElement('button'); - button.className = 'tab'; - button.setAttribute('data-tab-type', 'anime'); - button.setAttribute('data-provider', id); - button.innerHTML = `${provider.icon} ${provider.name}`; - button.onclick = () => switchTab(`anime-${id}`); - animeTabsContainer.appendChild(button); - - // Create corresponding tab content - const tabContent = document.createElement('div'); - tabContent.id = `tab-anime-${id}`; - tabContent.className = 'tab-content'; - tabContent.innerHTML = createAnimeTabContent(id, provider); - document.querySelector('.container').insertBefore( - tabContent, - document.getElementById('downloadsList') - ); - } - }); - - // Add series provider tabs - const existingSeriesTabs = animeTabsContainer.querySelectorAll('.tab[data-tab-type="series"]'); - existingSeriesTabs.forEach(tab => tab.remove()); - - Object.entries(data.series_providers || {}).forEach(([id, provider]) => { - // Check if tab doesn't exist - if (!document.querySelector(`.tab[data-provider="${id}"]`)) { - const button = document.createElement('button'); - button.className = 'tab'; - button.setAttribute('data-tab-type', 'series'); - button.setAttribute('data-provider', id); - button.innerHTML = `${provider.icon} ${provider.name}`; - button.onclick = () => switchTab(`series-${id}`); - animeTabsContainer.appendChild(button); - - // Create corresponding tab content - const tabContent = document.createElement('div'); - tabContent.id = `tab-series-${id}`; - tabContent.className = 'tab-content'; - tabContent.innerHTML = createSeriesTabContent(id, provider); - document.querySelector('.container').insertBefore( - tabContent, - document.getElementById('downloadsList') - ); - } - }); - - // Update supported hosts badges + // Update supported hosts badges (if element exists) const hostsContainer = document.querySelector('.supported-hosts'); - hostsContainer.innerHTML = ''; + if (hostsContainer) { + hostsContainer.innerHTML = ''; - Object.values(data.file_hosts).forEach(host => { - const badge = document.createElement('span'); - badge.className = 'host-badge'; - badge.textContent = `${host.icon} ${host.name}`; - hostsContainer.appendChild(badge); - }); + Object.values(data.file_hosts).forEach(host => { + const badge = document.createElement('span'); + badge.className = 'host-badge'; + badge.textContent = `${host.icon} ${host.name}`; + hostsContainer.appendChild(badge); + }); + } } catch (error) { console.error('Error loading providers:', error); @@ -260,6 +213,15 @@ function switchTab(tabName) { btn.classList.add('active'); } else if (tabType === 'direct' && tabName === 'direct') { btn.classList.add('active'); + } else if (tabType === 'anime' && tabName === 'anime') { + // Static anime tab + btn.classList.add('active'); + } else if (tabType === 'series' && tabName === 'series') { + // Static series tab + btn.classList.add('active'); + } else if (tabType === 'providers' && tabName === 'providers') { + // Static providers tab + btn.classList.add('active'); } else if (tabType === 'anime' && btn.getAttribute('data-provider') === tabName.replace('anime-', '')) { btn.classList.add('active'); } else if (tabType === 'series' && btn.getAttribute('data-provider') === tabName.replace('series-', '')) { diff --git a/static/js/tabs.js b/static/js/tabs.js new file mode 100644 index 0000000..1dec73a --- /dev/null +++ b/static/js/tabs.js @@ -0,0 +1,205 @@ +/** + * New tabs functionality + */ + +// Load anime releases for the Anime tab +async function loadAnimeReleases() { + try { + const container = document.getElementById('animeReleasesList'); + if (!container) return; + + container.innerHTML = '
Chargement des dernières sorties anime...
'; + + // Use the existing releases API + const response = await fetch(`${API_BASE}/releases/latest?limit=12`); + const data = await response.json(); + + if (data.releases && data.releases.length > 0) { + container.innerHTML = ``; + } else { + container.innerHTML = '
Aucune sortie trouvée
'; + } + } catch (error) { + console.error('Error loading anime releases:', error); + const container = document.getElementById('animeReleasesList'); + if (container) container.innerHTML = '
Erreur lors du chargement
'; + } +} + +// Load series releases for the Series tab +async function loadSeriesReleases() { + try { + const container = document.getElementById('seriesReleasesList'); + if (!container) return; + + container.innerHTML = '
Chargement des dernières sorties séries...
'; + + // For series, we'll show the same releases but could filter later + const response = await fetch(`${API_BASE}/releases/latest?limit=12`); + const data = await response.json(); + + if (data.releases && data.releases.length > 0) { + container.innerHTML = ``; + } else { + container.innerHTML = '
Aucune sortie trouvée
'; + } + } catch (error) { + console.error('Error loading series releases:', error); + const container = document.getElementById('seriesReleasesList'); + if (container) container.innerHTML = '
Erreur lors du chargement
'; + } +} + +// Load providers grid for the Providers tab +async function loadProvidersGrid() { + try { + const container = document.getElementById('providersGrid'); + if (!container) return; + + container.innerHTML = '
Chargement des fournisseurs...
'; + + const response = await fetch(`${API_BASE}/providers`); + const data = await response.json(); + + let html = ''; + + // Section Anime providers + html += '

🎬 Sites Anime

'; + html += '
'; + + const animeProviders = Object.entries(data.anime_providers || {}); + if (animeProviders.length > 0) { + animeProviders.forEach(([id, provider]) => { + const domains = provider.domains || []; + html += ` +
+
+
${provider.icon} ${provider.name}
+
+ ${domains.length > 0 ? ` + + ` : ''} +
+ ${domains.length > 0 ? ` + + ` : ''} + +
+
+ `; + }); + } else { + html += '
Aucun fournisseur anime disponible
'; + } + + html += '
'; + + // Section File hosts + html += '

💾 Hébergeurs de fichiers

'; + html += '
'; + + const fileHosts = Object.entries(data.file_hosts || {}); + if (fileHosts.length > 0) { + fileHosts.forEach(([id, host]) => { + html += ` +
+
+
${host.icon} ${host.name}
+
+
+ +
+
+ `; + }); + } else { + html += '
Aucun hébergeur disponible
'; + } + + html += '
'; + container.innerHTML = html; + + } catch (error) { + console.error('Error loading providers:', error); + const container = document.getElementById('providersGrid'); + if (container) { + container.innerHTML = ` +
+

❌ Erreur lors du chargement des fournisseurs

+

${error.message}

+ +
+ `; + } + } +} + +// Show provider search (redirects to search tab) +function showProviderSearch(providerId) { + switchTab('search'); + // Could pre-fill search with provider-specific content +} + +// Show download info (explains how to download) +function showDownloadInfo() { + alert('💡 Pour télécharger un fichier:\n\n1. Utilisez l\'onglet "Recherche"\n2. Entrez le nom de l\'anime/série\n3. Cliquez sur "Télécharger" sur un épisode\n\nOu bien:\n- Copiez directement un lien de téléchargement dans la barre d\'adresse de votre navigateur'); +} + +// Make additional functions available globally +window.showProviderSearch = showProviderSearch; +window.showDownloadInfo = showDownloadInfo; + +// Initialize new tabs when they're first opened +document.addEventListener('DOMContentLoaded', () => { + // Wait for main.js to be loaded + setTimeout(() => { + // Override switchTab to load content when opening new tabs + const originalSwitchTab = window.switchTab; + if (originalSwitchTab) { + window.switchTab = function(tabName) { + // Call original switchTab first + originalSwitchTab(tabName); + + // Load content for new tabs (after a small delay for DOM to update) + setTimeout(() => { + if (tabName === 'anime') { + if (!window.animeTabLoaded) { + loadAnimeReleases(); + window.animeTabLoaded = true; + } + } else if (tabName === 'series') { + if (!window.seriesTabLoaded) { + loadSeriesReleases(); + window.seriesTabLoaded = true; + } + } else if (tabName === 'providers') { + if (!window.providersTabLoaded) { + loadProvidersGrid(); + window.providersTabLoaded = true; + } + } + }, 100); + }; + } + }, 500); +}); + +// Make functions available globally +window.loadAnimeReleases = loadAnimeReleases; +window.loadSeriesReleases = loadSeriesReleases; +window.loadProvidersGrid = loadProvidersGrid; diff --git a/templates/base.html b/templates/base.html index d2c441f..343c777 100644 --- a/templates/base.html +++ b/templates/base.html @@ -9,13 +9,14 @@ - - - - - - - + + + + + + + +
diff --git a/templates/components/header.html b/templates/components/header.html index fb0367f..b877c35 100644 --- a/templates/components/header.html +++ b/templates/components/header.html @@ -1,7 +1,7 @@

⚡ Ohm Stream Downloader

-

Téléchargez vos vidéos et animes depuis vos hébergeurs préférés

+

Téléchargez vos vidéos, animes et séries depuis vos hébergeurs préférés

- +
- - + + +
diff --git a/templates/components/home_section.html b/templates/components/home_section.html index f7c4862..88aee1f 100644 --- a/templates/components/home_section.html +++ b/templates/components/home_section.html @@ -14,7 +14,7 @@ Actualiser
-
+ @@ -28,6 +28,6 @@ Actualiser -
+ diff --git a/templates/index.html b/templates/index.html index 6e2d9a9..2a8101f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,7 +7,43 @@ {% include "components/search_tab.html" %} -{% include "components/direct_tab.html" %} + +
+
+

🎬 Anime

+
+ +
+
+ +
+ +
+
+

📺 Séries TV

+
+ +
+
+ +
+ +
+
+

📦 Fournisseurs de Streaming

+
+
+
{% include "components/downloads_section.html" %} {% endblock %}