Warning
RhythmiRust does not support going back to previous versions there may be breaking changes and backwards compatibility is not guaranteed
Caution
If you are updating from version 0.2.0, please execute the migrate_config inside the config directory to upgrade the database.
Configs are located at:
- Linux:
$XDG_CONFIG_HOMEor$HOME/.config/RhythmiRust_config - Windows:
{FOLDERID_LocalAppData}/RhythmiRust_configorC:\Users\<YourUsername>\AppData\Local\RhythmiRust_config - Default: Next to the
.exein folderRhythmiRust_config.
🎵 RhythmiRust Updates - 0.3.0 (2026-01-29 10:35)
Commit Statistics
- 87 commit(s) contributed to the release.
- 120 day(s) passed between the first and last commit.
- 84 commit(s) parsed as conventional.
- 0 linked issue(s) detected in commits.
- 120 day(s) passed between releases.
Changelog
🚀 Features
Add SampleRate, ChannelCount, and Bitrate columns and integrate them into the duplicate detector
- Add
SampleRate,ChannelCount, andBitratecolumns to store song properties - Implement
from_databasefunction inSongPropertiesto fetchSampleRate,ChannelCount,Bitrate, andLengthin a single query - Update the duplicate detector to use
from_databasewith a fallback to probing the file and reading its headers - Enable metadata extraction to accept a parsed file, avoiding redundant file reads
Add cache-on-demand to the duplicate detector
- Add
cache-on-demandfor fingerprints, allowing computed fingerprints to be computed once then cached in the search database and re-used, cutting down compute time and all future compute time - Use
Brotlicompression and decompression for fingerprints, reducing their size by 75% on average - Add
cached_fingerprintcolumn to hold the compressed fingerprint - Add a helper function
bytes_to_human_readable_binaryto convert bytes to more useful sizes - Add deletion tracking so when the duplicate detector removes duplicates in CLI, it will print how many
gib/bytes etcwere saved - Handle
Blobdata type in the metadata editor to display information about the blob
Add progress tracking and enhance display bar functionality
- Add progress tracking for spotify
- Improve progress bar by incorporating text inside the bar itself for easy readability
- Display exact numbers (processed/total) and percentage alongside the text in the progress for more verbosity
Duplicate Detector can now run without blocking the regeneration
- Since the
Duplicate Detectoris not changing anything while processing we dont need to block the regeneration/song imports thus we allow both to happen at the same time - Remove debug print statements
- Fix some documentation spelling
- Increase the
Metadata Editorprocessed message from3to10seconds
Add Deduplicate UI and settings
- Add De-duplicate UI
- Implement
5setting profiles ranging fromVery-FasttoThoroughto the Duplicate detector - Add De-duplicate start button to start deduplication without the entire download process
- Improve the tracking of the download process and deduplication process
- Enable bitrate to be factored in what song to keep in the duplicate detector
Improve dupedetector and redesign similarity algorithms
- Replaced the existing hashing algorithm with a new, improved algorithm to enhance accuracy and reduce collision rates
- Optimised overall processing for better performance on large datasets
- Audio fingerprinting uses song properties to assist with weighting
- Check for corrupted properties before processing
- Refactored: n-gram ranges to allow greater control and support word (token) n-grams for long filenames
- Queue tasks to threads for even load distribution, preventing idle threads while others finish
- Removed length-adjusted threshold and numeric penalties from matched strings; audio fingerprinting will catch string false positives
- Factor in
song propertieswhen deciding which song to keep
Init implement audio fingerprinting and simplify some audio backend code
- Remove
dupedetectas a separate crate and move it to the main program - Clean-up
FFmpegSourceit now apon creation summons a child FFmpeg process rather than hooking into one summoned outside theSource - Implement fallback to
FFmpegdecoding for file audio formats that fail to natively decode for the audio fingerprinter
Add tooltips to all 3 sliders in the Music Player
Add warning to the Advanced Settings -> Cache
Add Add all songs as an alternative to Shuffle and add all
- Hold
Shiftto change theShuffle and add alltoAdd all songsthis will add all the songs sequentially, bypassing the shuffle
Add external Deno JavaScript runtime required for YouTube
- Integrate
Deno, a secure runtime for JavaScript, into the commands to fully support downloading with YouTube - Include detection of
Denoinstallation system-wide to ensure proper setup
Migrate from glow to wgpu and add Backend Info to the About page
- Remove
glowand instead usewgpuenabling support for more backends (vulkan, gles, dx12) and improving performance, particularly in complex scenes - Introduce a
Backend Infodropdown on theAboutpage to allow users to view the current renderer and backend in use
Add inline edit of values and columns in the Favourites menu
Middle-Clickon aValueor aColumnin theFavouritesmenu to edit itMiddle-Clickon the edit bar in the favourites to close itFavouritesdefault column is nowgeneric- Improve
update_table_schemafunction to allow for advanced options like inserting a row by default apon table creation or not - Add generic database functions
sqlite_set_column_valueandsqlite_rename_column - Add a generic notification function to print errors in CLI and GUI
Add Metadata Errors List to show any songs that are corrupted
- Add
pending_removal_action_errorsto store errors caught during processing of embedding metadata - Add UI for showing any errors caught while embedding
- Add
Clear Allbutton to clear/ignore all errors
Add WordExact and Sanitise terms for GLOB
- Add
WordExactthis combines WORD search with EXACT search (Example:'"Case-sensitive-term"') - Sanitise
GLOBto map unsupported characters'*' | '[' | ']'to'?'to not ignore these characters still matching characters before and after said invalid character - Remove
COLLATE NOCASEas does not apply toLIKEoperators - Add better search debug support displaying
Parametersalongside theQueryitself - Add
parse_into_match_typeto remove duplicated code - Remove sanitising escape characters before parsing expressions (this caused malformed strings when using other operators)
- Move sanitising escape characters to
parse_into_match_typethis allows the correct sanitisation to happen per term
Add modification_date, epoch parser and maintainability cleanup
- Add
modification_dateto be cached and compared viaRegeneratorto automatically detect file changes with no user intervention (this includes any file modifications being detected) modification_dateis updated automatically apon every edit- Standardise
DESIRED_COLUMNS,DESIRED_COLUMNS_LENGTH,INSERT_DIR_DATA_BASE_QUERY,ENABLED_COLUMNS,DISABLED_COLUMNSandDESIRED_METADATA_COLUMNS_INTto all be generated based onDesiredColumnenum - Use
DesiredColumnas one source of truth for all metadata and search related code (this includes everything being generated from it during compile time to help maintainability) - Use
strummacros to help add nonstandard implementations to enums like count and iteration over enums - Dynamically construct all
SQLqueries that useDesiredColumndynamically to ensure type safety across all insertions and database operations and type safety at compile time - Add
parse_date_to_epochto support multiple standard date formats and convert them to epoch when searching themodification_datecolumn - Move some static
SQLstatements to a constant to be reused and improve maintainability - Standardise
PROTECTED_TABLESandPROTECTED_TABLES_PERMANENT_RMto be generated based on aSqliteProtectedTablesenum at compile time - Add column range checking for the
Ratingfield inMetadata Editor - Add
dd/mm/yyyyepoch to date parsing inMetadata Editorto showmodification_datein a human-readable format. - Update bulk updates for
Metadata Editorto constructfull_pathsonce per song rather than twice
Add compile time generated Git Stats and display them in the About page
- Add a build script to generate
Git Statsand dump the raw structure to disk - Import the raw stats structure into a constant at compile time
- Add
Git Statsdropdown in the about page - Add
Total Project StatsandCommiter/Userdropdowns in theGit Stats - Display various stats on the total codebase and per-user statistics
Add toggleable columns to the Metadata Editor
- Add
Columnspopup to allow toggling of columns in theMetadata Editor - Default to common columns in the
Metadata Editormaking uncommon ones opt-in - Add individual column resets for the
Columnmenu
Add 16+ rating option
- If the song has a higher rating than the standard
0to15range then highlight the16+text to indicate a higher rating
Notifications now take the saved theme shadow colours into consideration
- Notifications colours will be loaded apon program startup
- Notifications colours will be updated with shadow colours when the use saves or reverts the theme
- Notifications colours will be applied to the toasts dynamically when the user modifies a colour field
Add override-config-dir cli flag to choose a specific non-standard config directory
- Useful if you want to temporarily choose a different config or specifically where your config is located
Rework colour reset button to now reset to the previously saved state
- Change right click to reset on colour save button to now reset to the last saved colour state
- Remove redundant visual load twice only need to load it once
Discord RPC codec will now display bitrate alongside codec
- Added functions to parse bitrate
- Added bitrate to codec in discord RPC if bitrate fails it wont be present
Discord RPC now supports displaying your current song codec
- Discord RPC will now allow replacing branding text with the current song codec
- Fix discord RPC ui not using the correct colours
- Cleanup duplicated/redundant UI processing code
Added progress bar to the downloader
- Downloader used to have red text showing it was downloading now it has a progress bar
- Progress bar updates depending on what its doing
- Progress bar only targets the 2 heaviest parts of the downloader (getting urls and downloading)
- Progress bar only tracks download amount not the progress per download
Implement shadow configuration in the colours menu
- Can now edit shadows angles etc via the settings menu
- Import
num-traitsfor less boilerplate
Gutted and revamped the entire colour system
- Colour UI fully revamped
- From 6 theme/colour options to 50+
- Enable toggle of advanced options like (Anti-aliasing, Handle Shape, Slider Trail) and more
- Added 3 colour schemes
Dark,Super DarkandLight - Default to
Darkcolour scheme - Load colour scheme on startup
Warn users when entering non-integer values in integer columns
Add IndexMap for Metadata Editor actions
- Metadata Editor's action panel was unordered
HashMapnow its been replaced withIndexMapto retain the insertion order
Add Multi-table mode to Metadata Editor
- Added
Multi-tablemode to be able to combine multiple tables together and mass edit them - Added
Multi-tableandSingle-tabledisplay bar with extra statistics (table count, row count) - Added GUI toggle for
Multi-tablemode andCtrl+Shift+Zkeybinding
Extend album art search to support multiple override and normal file names
- Previously supported only one override and one normal album art file name
- Now supports multiple override types (e.g., override_album_art, override_cover)
- Now supports multiple normal types (e.g., album_art, cover)
- Improves flexibility and allows more album art naming conventions
🐛 Bug Fixes
Temporarily patch stopping discord_rpc upstream bug on windows
- The windows
Fileapi does not have a explicity way to close a file (other than dropping it) thus closing the connection does not work unless the file is dropped this problem is a upstream bug
Replace search tooltip to fix a mistake
- Search tooltip said
Left click to searchwhen it should sayLeft click to add to queue
Remove redundant import and check for Add all songs
Add all songsnow will not toggle when holding shift if the user is typing elsewhere
Fix force dependencies update button tooltip and label
Scrollarea was not expanding to available width consistently in Advanced Settings
- Scrollarea will now use all available width
Set fixed buffer sizes to improve audio performance
- Upstream defaults to the system buffer size, which can be undefined and quite low. This may cause issues with high sample rates
- Added a fixed default buffer size:
1024for general use2048for96000sample rate4096for sample rates above96000
- This ensures that most computers can downsample in real-time without complications
- Update 2 deps back to standard registry from git
Update Spotfetch to use authorisation with PKCE
- Spotify updated their auth to enforce
PCKEthis commit implementsPCKEauth - Remove
Implicit Grant Flowas its deprecated migrating toAuthorization Code Grant
Read metadata comment/description
- Metadata description field was not being read properly due to naming conventions between metadata containers
- Implement custom scanning for description field case-insensitive
- When editing a field with the writer make sure description is nulled forcing the usage of the comment field instead
Optimise file import deduplication
- Check for file existence before processing
- Removed redundant checks to improve efficiency
Git-stats now excludes renames from diff stats
- Previously,
Git-statsincluded renames in the diff stats, inflating file and line change counts - This update enables rename detection and excludes renamed files from the statistics, resulting in more accurate, non-inflated numbers
Offset the toggle numbers for menus to the correct numbers
- Numbers before in the main panel started from
0when it should start from1
Ensure when Rating the ui updates to show the processing is finished
Ratingwould require the user cursor to move in the window to show the processing is finished now updates to show regardless- Renamed
ui_dataforMusicstruct tomusic_player_uito make it easier to understand
Use shift_remove instead of swap_remove for Metadata Editor right panel
swap_removewas used due to efficiency but it broke the ordering of theSave Actionsin the right panel
Prevent the bottom bar from being disabled if set for regeneration in multi-table mode
- While in
multi-tablemode, if the table that was last selected insingle-tablemode was selected for regeneration, it would disable the bottom bar preventing user input
Improve handling of file watcher update signals
- Modify file watcher logic to distinguish between blocked regeneration and unexpected file updates, ensuring that manual file modifications during regeneration are not discarded
Set ThemePreference based on stored visuals
- This was not setting and causing default dark mode to be overridden on Windows or OS set to light mode
Set Clear Regenerate Search Cache and Clear Regenerate Search Cache to use error colours instead of red const
- Set
Super Darkmode error colour to (255,0,0) from (255,80,80)
Toggle multi-table mode was not working now it toggles successfully
Discord RPC would set the state to POWERED_BY_RHYTHMIRUST apon seek
- Seek was causing
POWERED_BY_RHYTHMIRUSTto be set even if it was toggled to show the codec now it correctly does adhere to the current songs settings when seeking
Discord RPC state not reverting when going back to branding and enable showing codec and bitrate in Discord RPC by default
- Fix
POWERED_BY_RHYTHMIRUSTtext will now update when the user toggles the codec feature off without needing a restart - Apon config generation it will now show codec and bitrate by default in the Discord RPC
Handle stopping ui updates when music player is not visible
- UI would continue updating in continuous mode even if the
Music Playerwindow was toggled off now it takes the window state into consideration - Remove redundant
Music Playertoggle state on the backend shuffe thread when it already the UI thread toggles the music window
Rework metadata parsing system and fallback and fix parsing semi-corrupted recoverable files
- Metadata parsing now always falls back to a
Cdecoder if the nativeRustdecoder fails regardless if the file was parsed or not - Fix bitrate parsing from the
Cdecoder - Update parsing error to print file name and reason (better formatting)
- Parsing error will attempt to fallback to the
Cdecoder if it fails trying one last time to parse the file
Propagate Metadata Editor writer errors properly
Add explicit error handling for xdg-user-dirs
Set import allocation limit for writing metadata
- It will now allow
1GiBmetadata tag read globally - It will now set
allocation limitfor the writer thread (This allows the writer thread to correctly import data, edit then write it back)
Prevent panic in get_surrounding by ensuring valid character boundaries in string slicing
get_surroundingassumed the next character was one byte not accounting for multi-byte characters
📎 Other
Update the copyright date to 2026
♻️ Refactor
Improve determine_priority and remove redundant checks
- Remove redundant string checks for final_threshold; these were leftovers
from the original duplicate detector implementation and are no longer
useful in the improved version - Redesign determine_priority to handle lossless and lossy cases and use
tiebreakers when deciding which song to delete - Remove all functions related to final_threshold that are no longer used
Enhance duplicate detector with optimizations and features
- Perf: Implement fingerprint compression via integer pre-processing, boosting compression by 18.2% with minimal overhead (<1ms) and utilizing SIMD instructions
- Fine-tune thresholds: Lower base thresholds and raise audio thresholds for more accurate results
- Add metrics: Track and display the number of songs processed and cumulative size in the terminal
- UI: Clean up
blobdisplay ellipsis in the metadata editor - Feature: Introduce
Fingerprint Onlysetting for duplicate detector, which sets string match threshold to 0%, reducing reliance on string similarity and increasing use of direct fingerprint comparisons for more accurate results, albeit at the cost of increased compute time - Feature: Add
allowed_segments_curvefor plotting duration mapping and instrumental matching metrics - Improve accuracy: Utilize both song properties in the
is_duplicatefunction to help with accuracy and further metrics - Refactor: Replace 5-second duration filter with
allowed_segments_curvefor plotting and culling problematic tracks - Metric: Introduce
match_percentage_diffto identify potential extended versions or remixes - Refactor: Replace hardcoded
similarity_weightwith an inverse quadratic decay function, significantly improving accuracy
Adjust Duplicate Detector settings and handle probe errors as warnings
- Update
Duplicate Detectorsetting profiles for better balance - Print a warning if a file cannot be probed for metadata and allow fallback to FFmpeg C decoders instead of returning an error
Finalise default light theme implementation
- Improved the light theme colours to be visually balanced and no longer use harsh colours
Multiline arguments UI and add embedding metadata
- Revamp the download arguments editing UI to use
available_widthand multiline input, placing each argument on a new line for easier addition and readability - Combine multiline arguments into a single string when saving (This makes it much easier to work with arguments)
- Add embedding metadata including genre
- Add embedding the Song URL in the comment metadata field
- Remove song ID from the title and eliminate the delimiter, as the comment URL suffices
Remove renderer link
Update search database to index Year/Date and Rating
Refactor notification handling by centralizing generic UI notifications into a single function
- Updated all calls to use the new
generic_rhythmi_notificationfunction for consistency and to reduce code duplication.
Disable IPv6 and Rate Limiting for Downloads
Ipv6is now disabled by default to enforceIpv4, as some sites (e.g., SoundCloud) do not support IPv6. Users can enableIpv6inAdvanced Settingsif needed- Removing limiting of generic downloads to
3.5MiBnow to uncapped (This was used to stop youtube complaining along time ago its no longer relevant)
Update Accepted codecs disclaimer text to be hover to view
- Update
Accepted codecstoDisclaimer (Hover over me)
Add standalone colour fields and improve the default colour themes
- Add standalone colour field for
WIDGET_OPEN_WEAK_BG - Update
WINDOW_BGandPANEL_BGdefaults forDarkcolour scheme
Rename user_rating metadata field to standard Rating/Popularimeter
- Before ratings were in their own custom field now its standardised in the
Ratingfield
Move database cleanup and optimisation from startup to program exit
- Move
vacuum_optimize_dbtohelper_backend - Run
vacuum_optimize_dbon program close after the gui closes (this means the program will keep running in the background while it optimises the database before finally closing) - Create helper function for
sqlite_poolcreation - Apon program exit ensure
Watcher,RegenerationandMusicare all shutdown gracefully - Add
stop_watcherhelper to stopWatcherandRegenerationgracefully
Update Discord RPC branding option to be more clear
Change discord RPC codec prefix to Audio Format:
Refactor: Remove redundant colour function calls in the InitialSetup
Refactor: Add GUI notification warning for failing to get duration
Use inactive_bg colour for regeneration in Metadata Editor
Theme tracking to use config instead of brightness
Modify keybinding and keybinding text and minor cleanup
- Change shuffle mode to
Alt+ZfromAlt+X - Remove redundant
Right-click any color to reset it individuallytext from setting colours UI - Set
WindowCornerRadiusmaximum to 22.0 (This is due to clipping inner content if higher than 22.0)
Remove redundant success logs
Refactor: Reorganize Metadata Extraction and Image Processing to
⚡ Performance
Optimise fallback audio decoder to convert into a f32 with one bulk operation
- Add
peek_four_byteshelper that copies the next SAMPLE_SIZE bytes in one bulk operation, handling wrap‑around with a single conditional - Refactor
Iterator::nextto use the helper, removing four per‑sample modulo calculations and individual byte loads - Improves runtime performance (fewer arithmetic ops, better memory copy) and reduces code size/complexity slightly
Improve NULL or EXISTS searches to be standardised, support integer columns and use database indexes
- Add
ValuePresenceforNULLorEXISTSqueries - Check for
EXISTSorNULLqueries on database only queries (unify for Strings or Integers) - Remove
NULLfromMatchTyperemap values toValuePresence ValuePresenceusesis nulloris not nullcheck, which allows database optimisations in the query planner (formerly did pattern matching which was inefficient)
Optimise search, add debug_timing, and misc fixes
Searcherqueries/searches are all multithreaded now, this includesShuffle SearchesandMulti-Shuffle Searches- Add
search_timing_debugthis separatessearch_debugandsearch_timing_debugthis ensures thesearch_debugdo not affect thesearch_timing_debugresults - Add
COLLATE NOCASEwhen indexing tables in theSearch Databasethis allows for faster case-insensitive string comparisons - Remove redundant code from
Searcherand add helper functions to improve maintainability Regenerationnow executes a preliminary database search to pre-compile query code and optimise database performance for future queries- Remove the redundant exclusion option in
Legacy Searcher(This was used when I was merging my previous music program into this one, thus it's no longer relevant) - Add extra suffix to debug menu options for clarification
Prune History For Dead Searchesnow loads history internally if necessary, to ensure history is available to prune
Check for system installed ffmpeg
- Check for if
ffmpegis installed system wide and if it is use it - If no system-wide
ffmpegis installed fallback to downloading or compiling (linux only) ffmpeg - Filter downloader arguments before distributing the arguments to threads
- Remove unused
fast_image_resizedependency - Add a boolean to represent system-wide
ffmpegstate so the downloader knows to edit arguments to you the system binary - Refactor CLi progress bar creation into a single function
- Add function to check if input command is in
$PATH - Conditionally remove redundant
ffmpegexecutable if its installed locally and a system-wideffmpegis detected
Do not populate song bitrate field if the discord_rpc_codec mode is false
- This potentially can reduce load time of a song if it cannot get bitrate natively and has to fallback to
C
Use enum's instead of string literals for colours
- Colours was using string literals to match values this had no compile-time checks and was hard to read thus enums(tagged unions) are now used
⏪ Reverts
Remove Use system user config button
- Due to Windows low-level read/write lock and runtime issues, this feature is too risky to expose as a button
- Instead, users can manually move the config to the specified directory (see the wiki for more information)
Tip
The year number in the releases relates to when the optimisations that binary has so if your computer is around 2020 use that version etc.
If that fails go back to the next lowest year to find a version that works
The 2020 version would be the most common version
2024 and 2022 will only work on enterprise/server level cpus with avx512
Important
Windows Defender may flag the executable as a potential threat because I do not upload executables to their database. If you have concerns about viruses, please refer to the README.md file. It contains checksums and links to VirusTotal for your peace of mind.