- Add isClearing flag to prevent auto-refresh conflicts during deletion
- Use Promise.all() to delete all tasks in parallel instead of sequential await
- Add error handling with try/catch/finally block
- Skip loadDownloads() when isClearing is true
This fixes the infinite network request loop that occurred when clicking cleanup.
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Change the 'Nettoyer' (Cleanup) button behavior to remove unwanted downloads:
Before:
- Only removed completed downloads
Now:
- Removes cancelled downloads
- Removes failed downloads
- Removes completed downloads
- Keeps only: downloading, paused, pending downloads
- Shows detailed count by status in confirmation dialog
- Better title tooltip explaining what gets deleted
The confirmation message now shows exactly what will be deleted:
- 'Supprimer X annulé(s) Y échoué(s) Z terminé(s)?'
This makes it easy to clean up the download history while keeping
active downloads safe.
Fix the issue where groups would collapse but immediately reopen on next refresh:
Problem:
- Groups collapsed correctly but reopened after 1 second due to auto-refresh
- The toggleGroup function used classList.contains('collapsed') to check state
- But displayDownloads() regenerated HTML every second, losing the collapsed state
Solution:
- Add collapsedGroups Set to store which group IDs are collapsed
- Check collapsedGroups.has(groupId) instead of DOM class
- Save state in memory when toggling (add/delete from Set)
- Apply collapsed state when generating HTML (inline styles and CSS class)
- Groups now stay collapsed across auto-refresh cycles
The collapsed state persists:
- Across auto-refresh (every second)
- When filters change (commented out optional reset)
- Until user manually expands the group again
Change from using 'this' pointer to using unique IDs for group toggling:
- Generate unique IDs for each group (group-0, group-1, etc.)
- Pass group ID to toggleGroup() function instead of DOM element
- Use getElementById() and previousElementSibling to find elements
- Add error handling with console.error for missing elements
- Add console.log statements for debugging
This approach is more reliable than relying on inline onclick handlers
with 'this' keyword, especially when the HTML is dynamically generated.
Fix the toggleGroup() function to properly collapse/expand grouped downloads:
- Use classList.contains('collapsed') to check state instead of checking style.display
- Properly add/remove 'collapsed' class on toggle
- Groups now correctly collapse when clicked and expand when clicked again
- Arrow rotates correctly with CSS transition
The previous implementation checked items.style.display which was initially empty,
causing the toggle to not work correctly. Now we use the CSS class as the source of truth.
- Add collapsible arrow indicator for groups (▼)
- Improve extractSeriesName() to handle edge cases better
- Fix displayDownloads() to properly handle grouping
- Add proper sorting for group names
- Groups are now properly displayed with visual toggle state
- Better handling of filenames with special characters
- Remove trailing dashes/underscores from series names
Implement a comprehensive download history management system with powerful filtering, sorting, and grouping capabilities.
New Features:
1. Statistics Dashboard
- Real-time stats: total, downloading, paused, completed, failed
- Color-coded badges for quick visual overview
- Auto-updates every second with downloads
2. Advanced Filtering System
- Filter by status: All, In Progress, Paused, Completed, Cancelled, Failed
- Real-time search by filename or URL
- Multiple filters can be combined
3. Multiple Sorting Options
- Date (newest/oldest first)
- Name (alphabetical A-Z / Z-A)
- File size
4. Smart Grouping System
- Group by Series: Automatically detects anime series names
* Removes episode numbers, seasons, quality markers
* Groups episodes of same anime together
- Group by Status: Organizes by download state
- Group by Day: Aujourd'hui, Hier, or specific date
- Collapsible groups for cleaner UI
5. Bulk Actions
- Clear all completed downloads with one click
- Confirmation dialog to prevent accidents
UI Improvements:
- Modern filter controls with dark theme
- Responsive layout that works on all screen sizes
- Collapsible group headers with episode counts
- Empty state messages when no downloads match filters
- Visual indicators for each status type
Technical Details:
- extractSeriesName() function with regex patterns for:
* Episode numbers (Ep, Episode, Épisode, SxxExx)
* Quality markers (1080p, 720p, 480p)
* Language tags (VOSTFR, VF, MULTI)
* File extensions and brackets
- getDayString() for intelligent date grouping
- filterDownloads() for real-time filtering without API calls
- groupDownloads() for automatic series detection
- updateStats() for live statistics
User Experience:
- Filters persist during auto-refresh (every second)
- Group headers are clickable to toggle visibility
- Search works instantly as you type
- Statistics update in real-time
- Smooth animations and transitions
Example Use Cases:
- "Show me all completed One Piece episodes"
- "List all failed downloads from yesterday"
- "Find all Naruto episodes sorted by name"
- "Clean up all completed downloads at once"
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Features:
- Added rich metadata extraction for all anime providers (Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree)
- New AnimeMetadata model with synopsis, genres, rating, release year, studio, poster/banner images, episode count, and status
- New /api/anime/metadata endpoint for fetching metadata of specific anime
- Enhanced /api/anime/search endpoint with optional include_metadata parameter
- Updated web interface with metadata display (expandable synopsis, genres, rating, year)
- Added metadata toggle checkbox in search UI (disabled by default for performance)
Bug Fixes:
- Fixed episode selection bug where select would reset to default after any change
- Removed onchange event from select element that was causing unwanted reloads
- Fixed download button disappearing after episode download
- Episodes can now be downloaded multiple times without page refresh
Enhancements:
- Metadata displayed with icons (📅 year, ⭐ rating, 🏷️ genres, 📺 episodes, 📡 status)
- Expandable synopsis section for detailed descriptions
- Better visual organization of anime information
- Maintains backward compatibility (metadata is optional)
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Add ability to download all episodes of a season with one click.
Backend changes:
- New POST /api/anime/download-season endpoint
- Retrieves all episodes and creates download tasks for each
- Returns list of task IDs and total episode count
Frontend changes:
- Add "Toute la saison" button next to episode selector
- Button shown immediately when episodes are loaded
- Confirmation dialog before starting batch download
- Success message showing number of episodes queued
Features:
- Respects max_parallel limit (default: 3 concurrent downloads)
- Proper episode naming (e.g., "Hells Paradise - Episode 01.mp4")
- Works with all anime providers (Anime-Sama, Anime-Ultime, etc.)
Example usage:
- Click "Toute la saison" button on any anime card
- Confirm the dialog
- All episodes are queued and download automatically
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Add complete support for SendVid video hosting service used by Anime-Sama
for anime series like Hell's Paradise.
Changes:
- Create SendVidDownloader class with proper headers to avoid 403 errors
- Add SendVid detection and handling in AnimeSamaDownloader
- Update download_manager to include SendVid-specific headers
- Support custom episode naming (e.g., "Hells Paradise - Episode 01.mp4")
Technical details:
- SendVid embed pages require User-Agent and Referer headers
- Direct MP4 URLs extracted from <source> tags with IP/time-based parameters
- Tested with Hell's Paradise Episode 01 (7MB, 24min, 1280x720)
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>