Skip to content

Version Release; 0.3.0

Latest

Choose a tag to compare

@UnknownSuperficialNight UnknownSuperficialNight released this 29 Jan 02:44
· 2 commits to main since this release

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_HOME or $HOME/.config/RhythmiRust_config
  • Windows: {FOLDERID_LocalAppData}/RhythmiRust_config or C:\Users\<YourUsername>\AppData\Local\RhythmiRust_config
  • Default: Next to the .exe in folder RhythmiRust_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, and Bitrate columns to store song properties
  • Implement from_database function in SongProperties to fetch SampleRate, ChannelCount, Bitrate, and Length in a single query
  • Update the duplicate detector to use from_database with 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-demand for 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 Brotli compression and decompression for fingerprints, reducing their size by 75% on average
  • Add cached_fingerprint column to hold the compressed fingerprint
  • Add a helper function bytes_to_human_readable_binary to 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 etc were saved
  • Handle Blob data 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 Detector is 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 Editor processed message from 3 to 10 seconds

Add Deduplicate UI and settings

  • Add De-duplicate UI
  • Implement 5 setting profiles ranging from Very-Fast to Thorough to 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 properties when deciding which song to keep

Init implement audio fingerprinting and simplify some audio backend code

  • Remove dupedetect as a separate crate and move it to the main program
  • Clean-up FFmpegSource it now apon creation summons a child FFmpeg process rather than hooking into one summoned outside the Source
  • Implement fallback to FFmpeg decoding 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 Shift to change the Shuffle and add all to Add all songs this 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 Deno installation system-wide to ensure proper setup

Migrate from glow to wgpu and add Backend Info to the About page

  • Remove glow and instead use wgpu enabling support for more backends (vulkan, gles, dx12) and improving performance, particularly in complex scenes
  • Introduce a Backend Info dropdown on the About page to allow users to view the current renderer and backend in use

Add inline edit of values and columns in the Favourites menu

  • Middle-Click on a Value or a Column in the Favourites menu to edit it
  • Middle-Click on the edit bar in the favourites to close it
  • Favourites default column is now generic
  • Improve update_table_schema function to allow for advanced options like inserting a row by default apon table creation or not
  • Add generic database functions sqlite_set_column_value and sqlite_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_errors to store errors caught during processing of embedding metadata
  • Add UI for showing any errors caught while embedding
  • Add Clear All button to clear/ignore all errors

Add WordExact and Sanitise terms for GLOB

  • Add WordExact this combines WORD search with EXACT search (Example: '"Case-sensitive-term"')
  • Sanitise GLOB to map unsupported characters '*' | '[' | ']' to '?' to not ignore these characters still matching characters before and after said invalid character
  • Remove COLLATE NOCASE as does not apply to LIKE operators
  • Add better search debug support displaying Parameters alongside the Query itself
  • Add parse_into_match_type to 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_type this allows the correct sanitisation to happen per term

Add modification_date, epoch parser and maintainability cleanup

  • Add modification_date to be cached and compared via Regenerator to automatically detect file changes with no user intervention (this includes any file modifications being detected)
  • modification_date is updated automatically apon every edit
  • Standardise DESIRED_COLUMNS, DESIRED_COLUMNS_LENGTH, INSERT_DIR_DATA_BASE_QUERY, ENABLED_COLUMNS, DISABLED_COLUMNS and DESIRED_METADATA_COLUMNS_INT to all be generated based on DesiredColumn enum
  • Use DesiredColumn as 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 strum macros to help add nonstandard implementations to enums like count and iteration over enums
  • Dynamically construct all SQL queries that use DesiredColumn dynamically to ensure type safety across all insertions and database operations and type safety at compile time
  • Add parse_date_to_epoch to support multiple standard date formats and convert them to epoch when searching the modification_date column
  • Move some static SQL statements to a constant to be reused and improve maintainability
  • Standardise PROTECTED_TABLES and PROTECTED_TABLES_PERMANENT_RM to be generated based on a SqliteProtectedTables enum at compile time
  • Add column range checking for the Rating field in Metadata Editor
  • Add dd/mm/yyyy epoch to date parsing in Metadata Editor to show modification_date in a human-readable format.
  • Update bulk updates for Metadata Editor to construct full_paths once 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 Stats and dump the raw structure to disk
  • Import the raw stats structure into a constant at compile time
  • Add Git Stats dropdown in the about page
  • Add Total Project Stats and Commiter/User dropdowns in the Git Stats
  • Display various stats on the total codebase and per-user statistics

Add toggleable columns to the Metadata Editor

  • Add Columns popup to allow toggling of columns in the Metadata Editor
  • Default to common columns in the Metadata Editor making uncommon ones opt-in
  • Add individual column resets for the Column menu

Add 16+ rating option

  • If the song has a higher rating than the standard 0 to 15 range then highlight the 16+ 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-traits for 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 Dark and Light
  • Default to Dark colour 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 HashMap now its been replaced with IndexMap to retain the insertion order

Add Multi-table mode to Metadata Editor

  • Added Multi-table mode to be able to combine multiple tables together and mass edit them
  • Added Multi-table and Single-table display bar with extra statistics (table count, row count)
  • Added GUI toggle for Multi-table mode and Ctrl+Shift+Z keybinding

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 File api 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 search when it should say Left click to add to queue

Remove redundant import and check for Add all songs

  • Add all songs now 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:
    • 1024 for general use
    • 2048 for 96000 sample rate
    • 4096 for sample rates above 96000
  • 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 PCKE this commit implements PCKE auth
  • Remove Implicit Grant Flow as its deprecated migrating to Authorization 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-stats included 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 0 when it should start from 1

Ensure when Rating the ui updates to show the processing is finished

  • Rating would require the user cursor to move in the window to show the processing is finished now updates to show regardless
  • Renamed ui_data for Music struct to music_player_ui to make it easier to understand

Use shift_remove instead of swap_remove for Metadata Editor right panel

  • swap_remove was used due to efficiency but it broke the ordering of the Save Actions in the right panel

Prevent the bottom bar from being disabled if set for regeneration in multi-table mode

  • While in multi-table mode, if the table that was last selected in single-table mode 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 Dark mode 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_RHYTHMIRUST to 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_RHYTHMIRUST text 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 Player window was toggled off now it takes the window state into consideration
  • Remove redundant Music Player toggle 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 C decoder if the native Rust decoder fails regardless if the file was parsed or not
  • Fix bitrate parsing from the C decoder
  • Update parsing error to print file name and reason (better formatting)
  • Parsing error will attempt to fallback to the C decoder 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 1GiB metadata tag read globally
  • It will now set allocation limit for 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_surrounding assumed 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 blob display ellipsis in the metadata editor
  • Feature: Introduce Fingerprint Only setting 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_curve for plotting duration mapping and instrumental matching metrics
  • Improve accuracy: Utilize both song properties in the is_duplicate function to help with accuracy and further metrics
  • Refactor: Replace 5-second duration filter with allowed_segments_curve for plotting and culling problematic tracks
  • Metric: Introduce match_percentage_diff to identify potential extended versions or remixes
  • Refactor: Replace hardcoded similarity_weight with an inverse quadratic decay function, significantly improving accuracy

Adjust Duplicate Detector settings and handle probe errors as warnings

  • Update Duplicate Detector setting 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_width and 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_notification function for consistency and to reduce code duplication.

Disable IPv6 and Rate Limiting for Downloads

  • Ipv6 is now disabled by default to enforce Ipv4, as some sites (e.g., SoundCloud) do not support IPv6. Users can enable Ipv6 in Advanced Settings if needed
  • Removing limiting of generic downloads to 3.5MiB now 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 codecs to Disclaimer (Hover over me)

Add standalone colour fields and improve the default colour themes

  • Add standalone colour field for WIDGET_OPEN_WEAK_BG
  • Update WINDOW_BG and PANEL_BG defaults for Dark colour scheme

Rename user_rating metadata field to standard Rating/Popularimeter

  • Before ratings were in their own custom field now its standardised in the Rating field

Move database cleanup and optimisation from startup to program exit

  • Move vacuum_optimize_db to helper_backend
  • Run vacuum_optimize_db on 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_pool creation
  • Apon program exit ensure Watcher, Regeneration and Music are all shutdown gracefully
  • Add stop_watcher helper to stop Watcher and Regeneration gracefully

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+Z from Alt+X
  • Remove redundant Right-click any color to reset it individually text from setting colours UI
  • Set WindowCornerRadius maximum 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_bytes helper that copies the next SAMPLE_SIZE bytes in one bulk operation, handling wrap‑around with a single conditional
  • Refactor Iterator::next to 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 ValuePresence for NULL or EXISTS queries
  • Check for EXISTS or NULL queries on database only queries (unify for Strings or Integers)
  • Remove NULL from MatchType remap values to ValuePresence
  • ValuePresence uses is null or is not null check, which allows database optimisations in the query planner (formerly did pattern matching which was inefficient)

Optimise search, add debug_timing, and misc fixes

  • Searcher queries/searches are all multithreaded now, this includes Shuffle Searches and Multi-Shuffle Searches
  • Add search_timing_debug this separates search_debug and search_timing_debug this ensures the search_debug do not affect the search_timing_debug results
  • Add COLLATE NOCASE when indexing tables in the Search Database this allows for faster case-insensitive string comparisons
  • Remove redundant code from Searcher and add helper functions to improve maintainability
  • Regeneration now 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 Searches now loads history internally if necessary, to ensure history is available to prune

Check for system installed ffmpeg

  • Check for if ffmpeg is installed system wide and if it is use it
  • If no system-wide ffmpeg is installed fallback to downloading or compiling (linux only) ffmpeg
  • Filter downloader arguments before distributing the arguments to threads
  • Remove unused fast_image_resize dependency
  • Add a boolean to represent system-wide ffmpeg state 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 ffmpeg executable if its installed locally and a system-wide ffmpeg is 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.