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.1.8, 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.2.0 (2025-10-01 04:14)
Commit Statistics
- 58 commit(s) contributed to the release.
- 78 day(s) passed between the first and last commit.
- 58 commit(s) parsed as conventional.
- 0 linked issue(s) detected in commits.
- 78 day(s) passed between releases.
🚀 Features
Add download repo link to the about section
Create new audio stream per song for bit-perfect playback
- Implement dynamic
sample_rateandchannel_countwhen building streams, allowing playback of any sample rate or channel count (e.g., 6 channels, not just stereo) - Optimise seek performance for the fallback Opus decoder
- Redesign music player backend: now creates a new stream for each song, ensuring the stream matches the song's properties (previously, a single stream was reused at 44.1kHz stereo)
Default to using 48 kHz sample rate
- Default it was using
44.1 kHznow forced48 kHzon stream creation
Add Ctrl+Shift functionality for cell selection in Metadata Editor
- Implemented logic to select matching cells based on the starting cell when
Ctrl+Shiftis pressed, allowing for more efficient selection - Used
eq_ignore_ascii_casefor case-insensitive comparison of cell values - Optimized by locking selected_cells once before the loop to reduce overhead
Add !! syntax support for Column Searches
- Support queries like
(language:!!)to find rows where the language column is NULL - Searching for any non-null value is done with
(language:)
Add Enter to search to the Metadata Search bars
Set edit bar value when selecting a single cell in the Metadata Editor
- Selecting one cell now updates the edit bar to that cell's value
- If multiple cells are selected, the edit bar resets
- This improvement makes it easier to add to a pre-existing value without needing to retype the entire text
Implement search fields for Folder and Song, and add shortcut for quick song access in metadata
- Added
FolderandSongsearch fields to filter metadata effectively - Enabled right-click functionality on the rating button for quick access to the song in the
Metadata Editor
Increased the maximum volume AGC can go to
- AGC (Automatic Gain Control) can now go to a max amplitude of
7from5
Added Commandline Arguments and download-headless
- Added a commandline parser to handle commandline arguments
- Added
download-headlessor-dargument to execute the downloader directly without GUI (Good for scripts)
Add tracking for seekbar state
- Seekbar will now be remembered and remain in the same state apon next restart
Cleaned up the UI to be more consistent
- Now buttons try to fill the available width to make everything look tidier
Add controls for speed via keyboard
- Added
Ctrl+ArrowKeysto control speed via the keyboard
Discord RPC status_display_type to show the current playing song
- Show the current playing song on server lists instead of the
application name
Implement Discord RPC progress bar
- Add state storage fields to
DiscordRpcClientto remember last RPC parameters - Add
update_timing_onlymethod that reuses stored state to avoid code duplication - Add
TimeUpdatevariant toRpcUpdateTypeenum for timing-only updates - Modify
custom_rpcto accept update_stored_state flag controlling state persistence - Update execute_once to handle
TimeUpdatevariant and process timing updates - Enable Discord progress bar updates when users seek to different song positions
- Remove the old timer based method
Add on_hover tooltip for the Rating Popup
While Song Rating is processing colour it in yellow
- While
Song Ratingis writing the rating to database and embedding into the song colour the button in yellow until processing is finished
Implement a user_rating option in the Music UI
- Added logic to the Music Player UI to allow users to set a rating for a son
- Stored the current song rating in a UI data structure
- When a user clicks on a rating button, the rating is updated in the UI and a background thread is spawned to update the database and metadata
- Displayed a popup menu when a user clicks over the rating button to allow them to choose a rating
- Added logic to prevent the user from setting the rating while its setting a previous one
Add 7 more IMAGE_EFFECTS
- Add (SoftDiagonalGlitch, CrystalShatter, PlasmaEnergy, FractalTessellation, LiquidMetalFlow, GeometricTunnelsGlitched3D, WaveInterference)
🐛 Bug Fixes
Propagate errors for failing set user_rating in the metadata
- GUI notification for
user_ratingfailing using the rating button - Propagate errors up from the metadata backend to let the UI handle the notification
- Skip songs if they fail to (open,parse,load)
- Rename notification for search cache generation
- Import
thiserrorzero-cost abstraction crate
Implement fallback for audio stream creation
- The audio stream will attempt to match the song
sample_rateandchannel_countbut if your system is old and does not support either then it will fallback to whatever your system supports - Add debug for audio stream config
Increase the allocation limit for metadata to 256MB
- Before it was not applying this increase from the default
16MBto256MBallocation increase on each thread thus causing errors importing large music files
Metadata Search was locking up apon a search that had multiple matches
- It was killing the metadata thread when finding multiple results and no exact or case-insensitive matches
- Now it handles ambiguous matches without killing the thread
Implement case-sensitivity matching on Metadata Search and resolve panic apon available_tables acquisition
- Background thread was acquiring the
available_tablesand causing a potential panic - Match quick search terms in order of (case-sensitive) -> (case-insensitive) -> (len == 1)
Execute a search upon refresh after saving in the Metadata Editor
- The
Metadata Editorrefreshes the tables after saving, but it was not applying the search. This change triggers the search again to ensure the displayed results are updated
file_watcher was not killing the previous thread
file_watcherwas not killing the previous thread when the user changed targeted directoriesfile_watcherwas not waiting for the previous thread to die thus causing 2 threads to spawn and undefined behaviour
Windows subsystem crate updated
windows-sysupdated and broke down some features into seperate feature flags thus i need to importWin32_System_Threading
Update Discord RPC to reflect playback speed
- Adjusted the update logic to account for song playback speed
- Ensures Discord RPC remains accurate, preventing drift from the actual playback speed
- Triggers an update every 2 seconds only if the playback speed differs from the default (1.00)
Prevent Discord RPC from overwriting queued song title updates
- Implemented a check to disable the seekbar updates in Discord RPC when a song title update is queued
- This ensures the song title is updated before allowing any seekbar edits
Spelling mistake and remove currently playing suffix
- Fix spelling mistake on GUI
duplicate_finder_and_batch_remove - Remove
(Currently Playing)suffix - Add
15second timeout to database transactions for downloader incase the user skips a song
Rework metadata regeneration to not panic and handle smoothly
- Remove all edits to a table if it just got queued for regeneration (No point queueing edits when there is nothing to edit as its regenerating)
- Disable the central UI to prevent editing tables that are queued for regeneration
- Logic is purely event based for efficiency
Rename default download argument values to fit the new standard
Preserve special columns in escape_special_characters
- Previously, special characters in column names like
user_ratingwere escaped, breaking search. Now these columns remain unchanged to keep them queryable
Offset 'Song Rating' button to not overlap with the scrollbar
- Scrollbar was slightly overlapping the
Song Ratingbutton causing it to be slightly harder to click
soft_diagonal_glitch was not accounting for the entire image
- Changed diagonal_range from -(height - 1)..=(width - 1) to -(width - 1)..=(height - 1)
- Ensures all diagonals are processed, including those covering the top-right corner
- Fixes issue where top-right part of the image was previously unaffected
Add better error handling to tagged_file instead of a panicking
Give Backend Panel its own unique ID and clean up the UI
🔧 Maintenance
Add compile script to fully automate release compilation
- Add a
gitignorerule to prevent commiting the release builds - Add
Compile.shscript for automated compilation, uploading to VirusTotal, and changelog/readme generation
Clippy fixes
📎 Other
Add error handling if a table is not found in the downloader
- Added a error for if adding a value to a table that does not exist
- Added a error notification for the error
Update cliff to allow clippy chore
♻️ Refactor
Replace Discord Invite with Github Link
Improve Music Player backend to display errors in GUI
- Added
AudioPlaybackErrorenum to handle various potential errors - Added
notify_errorclosure to handle printing error messages to GUI and stderr
enable_high_resolution_images is on by default
Remove Clear time on next song Buttons for Discord RPD
- This is no longer needed as we use the playbar instead of the timer so there is no time to clear on the next song
Update styling and comments for the metadata_editor
- Updated styling and comments for the entire
metadata_editorbackend and frontend
Major overhaul of global memory structure and data organization
- Rename all structures and re-design them to be easier to maintain and understand
Add tooltips to checkboxes for Settings -> Images
Remove dither effect applied on all images
Implement scaling to screen size for 7 image_padding effects
- Standardise image per pixel calculations into
process_image_simdfunction to setup the groundwork for simd instructions and parallelize and chunk the pixel calculations - Add
calculate_exponentiated_screen_ratio_from_base_valuefunction to adjust the intensity of effects based on the screen size - Remove cloning the original image instead allocate a empty image and process the source image copying each completed chunk into the empty image filling it up
- Fix GUI locking on selecting randomizer effects
- Allow dependencies to have
CDLA-Permissive-2.0license
Add error handling for stream builder
- Audio stream builder now will print a error if it fails with a error code
⚡ Performance
Enable Symphonia (audio decoder) to use SIMD operations
- On profiles with
avxorsseenabled it will also compile symphonia with those intructions - Added support for features flags per profile on the
Compile.shscript
Replace unreachable_unchecked with safe unreachable!() in Search Backend
- Use the safe
unreachable!()macro to indicate unreachable code paths, allowing the compiler to optimize checks while avoiding undefined behavior risks
Set database cache_size to 64 MB
Keep rolling a count of actions to perform
- For optimal GUI rendering we need a amount of actions to perform however previously this was calculated each frame on the UI thread now instead we keep a rolling count
Performance improvement: - Before: O(n) iteration through all nested
HashMaps on every UI frame - After: O(1) atomic load operation
Add SIMD operations for resizing
- Added the
resize_rgb_image_simdfunction for standardisation efficient SIMD image resizing (3 seconds to 100ms) - Allow
ImageProcessingErrorto supportImageErrorandStringError - Add comments to all functions in
image_padderlib - Support
debug_modein more parts ofimage_padder
Remove cloning the image from 5 image padders
- Instead of cloning the a huge image make a empty image and fill it in in parallel
Optimise image-padder and image loading
- Image-padder now uses
rgb8instead ofrgba8 - Instead of storing and passing around a
Vec<u8>raw bytes pass around aRgbImagetype this reduces 6 conversions to just 2 conversions (i.e. convert to rgb and convert to a texture) - Remove duplicates
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
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.