This document provides a comprehensive overview of the UI improvements implemented for Muine Music Player.
The implementation successfully addresses all requirements from the issue:
- ✅ Music Library view with Artist → Album → Song organization
- ✅ Search functionality across artists, albums, and songs
- ✅ Playlist view showing queued songs with metadata
- ✅ Cover art display in both views with fallback image
- ✅ Metadata editing capability including cover art
- Manages the playback queue
- Tracks current playing index
- Supports add, remove, move, next, previous operations
- Handles index adjustment when items are removed
- Represents an artist in the hierarchical library view
- Contains collection of albums by the artist
- Tracks total songs and album count
- Represents an album in the hierarchical library view
- Contains collection of songs in the album
- Displays album name, year, and cover art
- Main view model for the music library tab
- Loads and organizes songs by artist and album
- Implements search functionality
- Supports two view modes: grouped and list
- Manages the playlist queue
- Handles add/remove operations
- Tracks current playing position
- Supports song reordering
- Manages metadata editing for individual songs
- Supports editing title, artist(s), album, year, track number
- Handles cover art selection
- Saves changes to database
- Tab-based layout with two modes:
- Grouped View: Expandable Artist → Album → Song hierarchy
- List View: Flat list with search filtering
- Cover art displayed for albums and songs
- Context menu for adding to playlist and editing metadata
- Double-click to add song to playlist
- Search bar with real-time filtering
- Shows queued songs with metadata
- Cover art display for each song
- Remove button for each song
- Double-click to play song
- Clear playlist button
- Modal dialog for editing song metadata
- Fields for title, artist(s), album, year, track number
- Cover art preview with selection button
- Save/Cancel buttons
- Live validation (Save enabled only when changes made)
Updated to use TabControl with two tabs:
- Music Library
- Playlist
Improved player controls:
- Previous/Play/Stop/Next buttons
- Progress slider
- Time display
- Volume control
- Current song display
Added:
MusicLibraryViewModelandPlaylistViewModelpropertiesSelectedTabIndexfor tab navigationAddSongToPlaylist()methodAddAlbumToPlaylist()methodPlayNext()andPlayPrevious()commandsCreateMetadataEditor()methodRefreshAfterMetadataEdit()method
Added:
GetSongsGroupedByArtistAndAlbumAsync()- Groups songs by artist and albumSearchSongsAsync()- Searches across title, artist, album fields
- SVG fallback image for songs/albums without cover art
- Simple, professional design with music note icon
- Used throughout the UI when
CoverImagePathis null
The library view organizes songs in a hierarchical structure:
Artist Name (5 albums)
└─ Album Name (2024) [cover art] (12 tracks)
├─ 1. Song Title
├─ 2. Another Song
└─ ...
Features:
- Expandable/collapsible sections
- Cover art at album level
- Track numbers displayed
- Album metadata (year, track count)
- Sort by artist name, then album year
Real-time search across:
- Song titles
- Artist names
- Album names
- Performers
Implementation:
- Database query with LIKE operator
- Async search with debouncing via
OnSearchQueryChanged - Updates filtered results in real-time
- Works in both grouped and list views
Features:
- Add songs via double-click in library
- Remove songs via button or command
- Clear entire playlist
- View current queue with metadata
- Navigate with Previous/Next buttons
- Visual indication of current song (framework ready)
Queue Management:
playlist.Add(song); // Add to end
playlist.Next(); // Move to next song
playlist.Previous(); // Move to previous song
playlist.Remove(song); // Remove specific song
playlist.Clear(); // Clear allSources (in priority order):
- Song's
CoverImagePath(from database/embedded art) - Default fallback image (
/Assets/default-cover.svg)
Display locations:
- Album headers in grouped view
- Song items in list view
- Playlist items
- Metadata editor
Editable fields:
- Title
- Artist(s) - comma or semicolon separated
- Album
- Year
- Track Number
- Cover Art Image Path
Workflow:
- Right-click song in library → "Edit Metadata..."
- Edit fields in modal dialog
- Click "Save" to persist to database
- Library view refreshes automatically
Limitations:
- Currently saves to database only
- Does not write tags back to audio files
- This is documented as a future enhancement
- File → Import Music Folder
- Select folder containing music files
- Wait for scanning to complete
- Songs appear organized in Music Library tab
- Navigate to Music Library tab
- Double-click a song to add to playlist
- Switch to Playlist tab (automatic)
- Use Play/Pause/Stop/Next/Previous controls
- Go to Music Library tab
- Type in search box at top
- Results filter in real-time
- Clear search to show all songs
- Find song in Music Library
- Right-click → "Edit Metadata..."
- Modify fields as needed
- Click "Save" to persist changes
- Add songs by double-clicking in Library
- View queue in Playlist tab
- Remove unwanted songs with X button
- Clear all with "Clear Playlist" button
Grouped View:
- Hierarchical: Artist → Album → Song
- Best for browsing by artist
- Shows album art and metadata
- Collapsible sections for organization
List View:
- Flat list of all songs
- Best for searching
- Shows individual song cover art
- Faster scrolling through large libraries
Database
↓
MusicDatabaseService.GetSongsGroupedByArtistAndAlbumAsync()
↓
MusicLibraryViewModel.LoadLibraryAsync()
↓
MusicLibraryView (displays in UI)
↓
User interaction (double-click, etc.)
↓
MainWindowViewModel (coordinates)
↓
PlaylistViewModel (manages queue)
↓
PlaylistView (displays queue)
// Database query with wildcards
SELECT * FROM Songs
WHERE Title LIKE '%query%'
OR Artists LIKE '%query%'
OR Album LIKE '%query%'
OR Performers LIKE '%query%'
ORDER BY Artists, Album, DiscNumber, TrackNumberThe playlist maintains a CurrentIndex that:
- Points to the currently playing song
- Adjusts automatically when songs are removed
- Enables Previous/Next navigation
- Handles edge cases (empty playlist, last song, etc.)
All 55 existing tests pass:
- Model tests (Song, Album)
- Service tests (Database, Metadata, Scanner, Playback, CoverArt)
- Integration tests
CodeQL security scan: 0 alerts found
- Import a music folder with various artists/albums
- Test search with different queries
- Add songs to playlist and play them
- Edit metadata for a song
- Test playlist navigation (next/previous)
- Remove songs from playlist
- Test both grouped and list views
- Verify cover art display and fallback
Currently, metadata edits only save to the database. To write back to audio files:
public async Task WriteMetadataAsync(Song song)
{
var file = TagLib.File.Create(song.Filename);
file.Tag.Title = song.Title;
file.Tag.Performers = song.Artists;
file.Tag.Album = song.Album;
file.Tag.Year = uint.Parse(song.Year);
file.Tag.Track = (uint)song.TrackNumber;
// Handle cover art
if (!string.IsNullOrEmpty(song.CoverImagePath))
{
var imageData = File.ReadAllBytes(song.CoverImagePath);
var picture = new TagLib.Picture(imageData);
file.Tag.Pictures = new[] { picture };
}
await Task.Run(() => file.Save());
}- Playlist persistence (save/load playlists)
- Smart playlists (auto-generated based on criteria)
- Album art download from online services
- Bulk metadata editing
- Song ratings and play counts
- Advanced search filters
- Keyboard shortcuts
- Drag-and-drop reordering in playlist
src/Muine.Core/Models/Playlist.cssrc/Muine.App/ViewModels/ArtistViewModel.cssrc/Muine.App/ViewModels/AlbumViewModel.cssrc/Muine.App/ViewModels/MusicLibraryViewModel.cssrc/Muine.App/ViewModels/PlaylistViewModel.cssrc/Muine.App/ViewModels/MetadataEditorViewModel.cssrc/Muine.App/Views/MusicLibraryView.axamlsrc/Muine.App/Views/MusicLibraryView.axaml.cssrc/Muine.App/Views/PlaylistView.axamlsrc/Muine.App/Views/PlaylistView.axaml.cssrc/Muine.App/Views/MetadataEditorWindow.axamlsrc/Muine.App/Views/MetadataEditorWindow.axaml.cssrc/Muine.App/Assets/default-cover.svg
src/Muine.Core/Services/MusicDatabaseService.cs- Added grouping and searchsrc/Muine.App/ViewModels/MainWindowViewModel.cs- Added playlist integrationsrc/Muine.App/Views/MainWindow.axaml- Added tab navigation
This implementation successfully delivers all requested features:
- ✅ Music Library with Artist/Album organization
- ✅ Search functionality
- ✅ Playlist view with queue management
- ✅ Cover art display with fallbacks
- ✅ Metadata editing
The code follows existing patterns, passes all tests, has no security issues, and provides a solid foundation for future enhancements.