Commit Graph
165 Commits
Author SHA1 Message Date
Warry c1d40619aa Merge branch 'feature/json-downloaded' into fusion-refac-&-info
# Conflicts:
#	.gitignore
#	README.md
#	tidal_dl_ng/gui.py
2025-12-03 11:41:18 +01:00
Warry 4f2eaececc feat: Add download history tracking with duplicate prevention
Implement comprehensive download history system with JSON persistence
and duplicate prevention capabilities.

Features:
- Persistent JSON-based download history with atomic writes
- Duplicate prevention toggle in Tools menu
- Thread-safe operations with proper locking
- Automatic corruption recovery with backup creation
- Import/Export functionality for history portability
- Statistics view grouped by source (playlist, album, mix)
- Green console messages for improved visibility
- Custom exception handling for better error reporting

Technical Details:
- HistoryService singleton with O(1) track lookups
- Track-centric JSON structure for performance
- Atomic file operations to prevent data corruption
- Custom HistoryFormatError exception class
- Complexity reduction through helper methods
- Full AGENTS.md compliance (ruff, black, type hints)

UI Changes:
- Added "Tools" menu with two actions:
  - "View Download History..." - Opens history dialog
  - "Prevent Duplicate Downloads" - Toggle with persistence
- New Download History dialog with:
  - Tree view grouped by source
  - Statistics display
  - Import/Export buttons
  - Clear history option
  - Open folder functionality

Files Added:
- tidal_dl_ng/history.py (438 lines)
- tidal_dl_ng/dialog_history.py (325 lines)
- tidal_dl_ng/ui/dialog_history.py
- tidal_dl_ng/ui/dialog_history.ui
- tests/test_history_service.py (38 tests)
- tests/test_download_duplicate_prevention.py (10 tests)
- tests/test_gui_duplicate_prevention.py (22 tests)
- tests/test_logger_configuration.py (20 tests)
- FEATURE_DOCUMENTATION.md (900+ lines)
- tests/README.md
- CODE_QUALITY_COMPLIANCE.md
- FINAL_SUMMARY.md

Files Modified:
- tidal_dl_ng/download.py - History integration
- tidal_dl_ng/gui.py - Tools menu and handlers
- tidal_dl_ng/logger.py - Green INFO messages

Testing:
- 91 tests total, all passing (100% pass rate)
- Full test coverage for all new functionality
- Thread safety validated with concurrent tests
- Corruption recovery tested
- Import/Export functionality verified

Quality:
- Zero ruff violations (full AGENTS.md compliance)
- All pre-commit hooks passing
- Type hints on all functions
- Google-style docstrings throughout
- Black formatted
- Security reviewed (subprocess usage annotated)

Performance:
- O(1) track existence checks via dict
- Atomic writes prevent corruption
- Minimal memory footprint (~100 bytes per track)
- Fast startup (<50ms for 1000 tracks)

Breaking Changes: None
Backward Compatible: Yes (legacy format auto-migrated)
2025-11-29 18:04:54 +01:00
Warry 8905ac7e75 feat: enable rich text links for metadata fields and add search functionality
- Introduced clickable metadata links (tracks, albums, artists, playlists, videos).
- Left-click triggers in-app search; Ctrl+click or right-click opens browser search.
- Enhanced label interactions and added tooltips for actionable fields.
- Simplified artist, album, and playlist rendering with rich links.
- Extended search functionality with URL-safe encoding and type mapping.
2025-11-29 14:15:51 +01:00
Warry d2c3e8ab8f feat(hover): add track details preview on hover + fix all ruff violations
Implement comprehensive track information display on hover and resolve all
code quality issues to achieve complete ruff compliance.

MAJOR FEATURES:
- Track details preview on hover with rich metadata display
- Async BPM fetching with loading indicator
- Enhanced metadata utilities with fuzzy matching
- TIDAL API extras integration

FILES MODIFIED: 15+ files (core, UI, tests, docs)

RUFF COMPLIANCE: 0 errors (89+ violations resolved)
- Fixed E999 syntax error in metadata_utils.py
- Refactored 10+ complex functions (C901)
- Updated error handling (S110, S112, SIM105)
- Modernized type hints (UP038)
- Fixed naming conflicts (A001, F811)

BUG FIXES:
- Added missing _on_update_cover() method (11 test failures)
- Fixed BPM display and async loading
- Improved thread safety

TESTING: 30 passed, 1 skipped
DOCUMENTATION: Windows PowerShell support, tox troubleshooting
2025-11-29 12:10:06 +01:00
Robert Honz d06dfa90a8 feat(gui): ✨ add functionality to download albums from favorites
- Introduced a new context menu option to download all albums from selected favorites.
- Implemented methods to handle downloading albums from favorite albums, artists, and tracks.
- Enhanced logging for better tracking of the download process and errors.
2025-11-12 15:31:44 +01:00
Robert Honz 03266db087 feat(gui): ✨ add favorites download functionality
* Implemented `on_download_favorites` method to allow users to download all items from a favorites category.
* Added context menu option for downloading all items from favorites.
* Enhanced error handling and logging for better user feedback.
2025-11-12 15:27:05 +01:00
Robert Honz 3f936038ae feat(gui): ✨ add folder support for media downloads
* Implemented context menu options for downloading playlists and albums from folders.
* Added methods to fetch playlists and tracks from a folder.
* Enhanced user experience by allowing bulk downloads from folder structures.
2025-11-12 15:20:11 +01:00
Robert Honz 9baea9b82c feat(gui): ✨ enhance user media handling with folder support
* Updated `user_media_lists` to return a dictionary containing both `playlists` and `mixes`, including `Folder` objects.
* Modified `on_populate_tree_lists` to handle `Folder` items and display their contents.
* Introduced new methods for loading and displaying folder contents in the user interface.
2025-11-12 15:05:20 +01:00
Robert Honz 777a5e394d chore(gui): 🎨 update data file inclusion pattern for icons
* Adjusted the pattern for including icon files to ensure proper matching.
* This change enhances the flexibility of file inclusion during the build process.
2025-10-22 22:50:25 +02:00
Robert Honz 8f0c784187 refactor(gui): ✨ update album download options and improve session validation
* Added a new action to download all albums in a playlist.
* Removed the deprecated `validate_session` method and replaced it with a direct call to `self.tidal.session.check_login()`.
* Adjusted the UI layout in `dialog_settings` to accommodate new options and improved sizing.
2025-10-22 21:52:20 +02:00
exislowandGitHub b485292807 Merge pull request #596 from Winman486/fix/rate-limiting-playlist-downloads
Fix/rate limiting playlist downloads
2025-10-22 21:38:30 +02:00
exislowandGitHub 0cf3516fb0 Merge pull request #573 from Rikrdoga/Dolby_Atmos
Implement Dolby Atmos Support & API Key Selection
2025-10-22 21:34:02 +02:00
Winman486 e9070eef66 refactor: Make rate limiting configurable and move session validation to Tidal class
- Add api_rate_limit_batch_size and api_rate_limit_delay_sec to Settings (cfg.py)
- Move validate_session() and is_authentication_error() to Tidal class (config.py)
- Update _load_albums_with_rate_limiting() to use config values instead of hardcoded 20/3
- Update _handle_album_load_error() to use Tidal.is_authentication_error()
- Remove _validate_session() from gui.py (now uses Tidal.validate_session())
- Addresses maintainer feedback: configurable tweaking variables and proper separation of concerns
2025-10-21 15:23:18 -05:00
Robert Honz d3ec0398b4 fix(gui): 🐛 integrate ansi2html for improved log message formatting
* Added `Ansi2HTMLConverter` to convert ANSI color codes in log messages to HTML.
* Updated the `MainWindow` class to utilize the new converter for displaying logs.
* Removed dependency on `coloredlogs.converter` for log message display.
2025-10-21 07:58:00 +02:00
Rikrdoga 70cfc1b6eb Apply formatter and fix TRY003 2025-10-20 20:46:36 -06:00
Rikrdoga cb32c2fa8b Refactor Dolby Atmos Implementation 2025-10-20 20:23:14 -06:00
Winman486 6c1704e3c4 fix: Remove duplicate menu entry and reduce code complexity
- Removed duplicate 'Download Full Album' context menu entry
- Refactored on_download_all_albums_from_playlist to reduce C901 complexity
- Extracted helper methods: _extract_album_ids_from_tracks, _load_albums_with_rate_limiting, _validate_session, _handle_album_load_error, _queue_loaded_albums
- All make check errors and warnings now resolved
2025-10-20 18:58:46 -05:00
Winman486 3c835c2d19 Merge upstream/master and resolve conflicts
- Resolved conflict in dialog_settings.py (kept both cb_use_primary_album_artist and cb_mark_explicit checkboxes)
- Fixed code quality issues found by make check:
  * Removed duplicate on_download_album_from_track function (F811)
  * Updated isinstance calls to use X | Y syntax instead of (X, Y) (UP038)
  * Fixed unused loop variable album_stub (B007)
  * Applied automatic formatting fixes (black, prettier, trailing whitespace)
- Only remaining issue is C901 complexity warning in on_download_all_albums_from_playlist (expected per maintainer feedback)
2025-10-20 16:12:46 -05:00
Rikrdoga 2c2cc0283a Refactor Dolby Atmos feature to be internal and seamless 2025-10-20 10:47:43 -06:00
Rikrdoga 302b552ed7 Add support for Dolby Atmos 2025-10-20 10:33:01 -06:00
Robert Honz aaca12cacc fix(gui): 🐛 improve album download action and update docstring
* Refactored the menu action for downloading the full album from a track.
* Enhanced the docstring for `on_download_album_from_track` to clarify its functionality and error handling.
2025-10-20 09:37:01 +02:00
Winman486 90ff7ea52e feat(gui): add rate limiting to Download All Albums feature - Process 20 albums at a time with 3-second delays - Add session validity checks to prevent OAuth errors - Handle unavailable albums gracefully - Add informative logging for rate limiting progress 2025-10-17 23:40:31 -05:00
Winman486 ac3bf51c56 feat(gui): add 'Download Full Album', 'Download All Albums', and 'Single album folder (primary artist)' preference 2025-10-17 15:17:02 -05:00
Rikrdoga 9321ac03da feat: Add 'Download Full Album' from track context menu 2025-10-17 14:05:48 -06:00
Robert Honz 2594232cb9 Queue button should indicate the action that will occur when clicked — currently it shows present state
Fixes #561
2025-10-17 11:55:39 +02:00
Robert Honz 49fd7a100f fix(gui): 🐛 adjust MainWindow initialization and clean up close event method
* Added a missing line in the `MainWindow` constructor to ensure proper settings initialization.
* Removed unnecessary blank line in the `closeEvent` method for cleaner code.
2025-09-30 22:43:22 +02:00
exislowandGitHub 0d6381ab6e Merge pull request #517 from joshuacant/master
Adds: window size/position saving, dynamic column widths, double-click row action
2025-09-30 22:40:54 +02:00
Joshua Cantara 060c185920 move window size and position restore into the correct function 2025-09-08 09:59:29 -04:00
Robert Honz 541527be32 feat(tidal): ✨ add url_ending_clean function and refactor URL handling. Fixes #523
* Introduced `url_ending_clean` to sanitize URLs by removing trailing "/u" or "?u".
* Updated `_process_url` and GUI search logic to utilize cleaned URLs for better validation and processing.
2025-09-07 18:27:30 +02:00
Joshua Cantara 3462f5a26a set column widths dynamically based on window width 2025-09-01 15:34:29 -04:00
Joshua Cantara 4c0d78b5ed save and restore main window position and size 2025-09-01 14:49:24 -04:00
Joshua Cantara 64597bc2f6 double click a result row to download it 2025-09-01 13:18:50 -04:00
Robert Honz ef507b56ed feat(gui): enhance app icons with multi-resolution support
Improves the application's icon handling by introducing multi-resolution
support, replacing a single PNG file with multiple resolution-specific icons.

- ✨ **Added** multiple resolution icons (16x16, 32x32, 48x48, 64x64, 256x256, 512x512).
- 🔄 **Updated** GUI setup to use multi-resolution icons for better scalability.
- 🗑️ **Removed** the old single-resolution `icon.png`.

This update ensures better compatibility and visual quality across
different platforms and screen resolutions.
2025-08-12 16:02:41 +02:00
Robert Honz fd16a620f2 refactor(gui): ✨ Enhance type annotations and improve method signatures
* Updated type hints for various methods in  and  classes.
* Changed list types from  to  for better clarity and consistency.
* Improved function signatures to include return types for better type safety.
2025-07-02 08:47:59 +02:00
Robert Honz 99b4347b9a refactor(gui): ✨ Improve filter handling in MainWindow
* Refactored the filter extraction logic to directly use `header.filter_text(i)` for better clarity.
* Updated the filters list to store tuples of index and text, enhancing the data structure used.
* Ensured that the `proxy_model.filters` is set directly, simplifying the code.
2025-07-01 15:58:51 +02:00
Robert Honz 76f6010a12 refactor(gui): ✨ Enhance type annotations and improve method signatures
* Updated type hints for several methods in `MainWindow` class to improve code clarity and type safety.
* Changed return types to `None` where applicable.
* Refined parameter types for better type checking and consistency.
2025-07-01 15:52:30 +02:00
Robert Honz d8a6c26d65 refactor(gui): ✨ Enhance documentation for MainWindow methods
* Added detailed docstrings for methods in the `MainWindow` class.
* Improved clarity on parameters and return types for better understanding.
* Aims to facilitate future development and maintenance.
2025-07-01 14:30:10 +02:00
Robert Honz aa532f62fc refactor(gui): ✨ Improve search_result_to_model method and extract helper functions
* Refactored `search_result_to_model` to use type hints with `list` instead of `[*SearchTypes]`.
* Added detailed docstring for better understanding of parameters and return types.
* Extracted logic into helper methods for better readability and maintainability.
* Improved handling of item availability and explicit content representation.
2025-07-01 13:35:17 +02:00
Robert Honz 70e8b5fb13 ✨ Either date added or date released will be shown, depending if a list is selected or a search was performed. Fixes #424 2025-06-30 10:44:51 +02:00
Robert Honz 98f5230ccd 🛠️ Favorites won't getting duplicated after user hits the list reload button. Fixes #409 2025-06-30 08:39:33 +02:00
Robert Honz bbc65c8577 🛠️ Cover won't be removed, if clicked on the same item multiple times. 2025-06-29 21:53:50 +02:00
Robert Honz 5bdd48e471 ✨ Spinner will be shown, if search results are expanded. 2025-06-29 21:50:12 +02:00
Robert Honz e8ca69fefa 🛠️ GUI dos not hang if searched media is not available anymore. 2025-06-29 21:29:06 +02:00
Robert Honz 039546ffe8 👷 Lists and cover will be loaded in background. Gui won't hang anymore. Fixes #423 2025-06-29 20:33:22 +02:00
Juan Jesús Alejo SilleroandGitHub cee11e6ebd Fix: Prevent UnboundLocalError in on_populate_tree_lists
- Added a safeguard to skip items in `user_lists` that do not match expected types (`UserPlaylist`, `Playlist`, or `Mix`).
- Ensured `twi_child` is only accessed when properly initialized.
- This prevents crashes during GUI interaction when unexpected data is encountered.
2025-04-26 01:15:45 +02:00
Robert Honz 9a0a60d9ad Fixed: Relative import error. 2025-03-23 21:28:58 +01:00
Robert Honz 9b428dfa16 🛠️ Clipboard is not thread safe. Executing in a synchronous way. Fixes #382 2025-03-23 10:46:16 +01:00
Robert Honz 0684994850 ✨ Downloads can be now paused / resumed. Fixes #149 & 324
👷 Shutdown is handled more gracefully.
2025-03-03 09:31:37 +01:00
Robert Honz 463453b4f5 🛠️ Fix: Missing module prefix on import. Fixes #335 2025-01-14 07:56:50 +01:00
Robert Honz 2055606d0b 👷 File extension guesser improved. Fixes #322 2025-01-12 17:42:09 +01:00