A simple GUI music player inspired by foobar2000 written in Rust using egui. The goal of this project is to learn about making gui/ native apps, audio, databases / text search. It is not meant to be used as a serious audio player.
- Basic music player functionality. Play, pause, stop.
- Create a music library, which is indexed for searching.
- Parse id3 tags from tracks for use with indexing.
- Create playlists, which can be saved, opened, edited, reordered
- Drag n' Drop tracks from the music library into the playlist.
- Save last state of the app when closing.
- See if I can make right-click context menus.
- Visualizations
- Stream audio
- Swappable frontend so I can try other Rust cross platform gui libaries.
- Scrubbable audio. ie. Keep position in audio and arbitrarily move to any position
- Reference playlists by index or actual reference (not a clone...), so info is not lost when changing playlist context
- Double clicking track automatically starts to play it.
- Remove playlists.
- Un-named playlists get
(idx)
appended - Playlist tab section stacks playlist tabs when they don't fit.
- Add Next and Previous controls
- Pause is a toggle
- Play restarts the track
- Add volume control slider
- Implement library
- Refactor so the items parsed in the library are the primary data type passed around instead of separate library items and tracks.
- Set currently playing track as app Title
- Display playlist as a table [Playing, Track #, Artist, Album Title, etc... ]
- Add player indicators next to the track
- Improve library build performance and probably offload to a non-ui thread.
- Add toolbar with File, Properties, Help, etc...
- Save app state on close (just get it working bare min with a random file).
- Use Confy for app state load/save
- Refactor into more sensible responsibilities (think components / widgets / features).
- Investigate performance regression with a large library (this is due to sorting/grouping the view on every frame)
- Fix library view performance. Don't need to keep computing the grouping every frame - persist it in app state with a new data structure.
- Fix all egui deprecation errors... should be just one for using
CollapsingState
instead ofCollapsingHeader
- Fix Dark mode now that egui has made some changes in 0.18
- Figure out error handling (anyhow, eyre, thiserror, etc...)
- Remove tracks from playlist.
- Reorder items in playlist.
- Support multiple directories for library
- Figure out how to use at least one hotkey and key event.
- Define key events for the application
- Selected track is highlighted.
- Playlist plays to end after track is selected.
- Save playlists.
- Handle files which can't be decoded correctly into audio.
- Implement library search.
- Differentiate between a selected track and the currently playing one.
- Library display options [ album, artist, year, genre, folder structure, etc...]
- Library Item hashable?
- Discovery on how to make the library state smaller when saved (compression, better data structure, maybe save separate from app state, etc...)
- Surface logs to the user in the UI
- Stop with all the cloning... seriously. Everything is cloned.