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 = `${data.releases.map(anime =>
+ renderReleaseCard(anime)
+ ).join('')}
`;
+ } 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 = `${data.releases.map(anime =>
+ renderReleaseCard({...anime, title: anime.title + ' [Série]'})
+ ).join('')}
`;
+ } 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 += '';
+ html += '';
+
+ const animeProviders = Object.entries(data.anime_providers || {});
+ if (animeProviders.length > 0) {
+ animeProviders.forEach(([id, provider]) => {
+ const domains = provider.domains || [];
+ html += `
+
+
+ ${domains.length > 0 ? `
+
+ Domaines:
+ ${domains.map(d => `${d}`).join('')}
+
+ ` : ''}
+
+ ${domains.length > 0 ? `
+
+ 🔗 Visiter le site
+
+ ` : ''}
+
+ 🔍 Rechercher
+
+
+
+ `;
+ });
+ } else {
+ html += '
Aucun fournisseur anime disponible
';
+ }
+
+ html += '
';
+
+ // Section File hosts
+ html += '';
+ html += '';
+
+ const fileHosts = Object.entries(data.file_hosts || {});
+ if (fileHosts.length > 0) {
+ fileHosts.forEach(([id, host]) => {
+ html += `
+
+
+
+
+ 📥 Télécharger un fichier
+
+
+
+ `;
+ });
+ } 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}
+
+ 🔄 Réessayer
+
+
+ `;
+ }
+ }
+}
+
+// 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
-
+
@@ -15,11 +15,24 @@
Recherche
-
+
-
+
+
- Lien direct
+ Anime
-
+
+
+
+
+ Série
+
+
+
+
+
+ Fournisseurs
+
+
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" %}
+
+
+
+
+
+
{% include "components/downloads_section.html" %}
{% endblock %}