Commit Graph
1355 Commits
Author SHA1 Message Date
vicrodh 6d20baf914 feat: add remote metadata service and Tauri commands
Phase 4 of service integration:
- Add provider adapters (MusicBrainz, Discogs to unified DTOs)
- Add RemoteMetadataState with search_albums and get_album_metadata
- Create remote_metadata commands module with Tauri handlers
- Wire up state and commands in lib.rs

Available commands:
- remote_metadata_search: Search albums on MusicBrainz or Discogs
- remote_metadata_get_album: Get full album metadata with tracks
- remote_metadata_cache_stats: Get cache statistics
- remote_metadata_clear_cache: Clear the in-memory cache
2026-01-26 18:46:29 -06:00
vicrodh 25e877181a discogs: add search_releases and get_release_metadata methods
Phase 3 of service integration:
- Add DiscogsReleaseMetadata struct with full album info
- Add DiscogsArtist, DiscogsLabel, DiscogsTrack structs
- Add DiscogsSearchResultExtended for detailed search results
- Add search_releases() for release search with extended metadata
- Add get_release_metadata() for full release with tracklist
2026-01-26 18:42:41 -06:00
vicrodh b8340ad6c7 musicbrainz: add get_release_with_tracks with media/tracks support
- Add ReleaseFullResponse model with media, tracks, and tags
- Add Medium, MediumTrack, TrackRecording, Tag models
- Add get_release_with_tracks() for fetching full release details
- Add search_releases_extended() with configurable limit and catalog number
- Export new types from module
2026-01-26 18:39:47 -06:00
vicrodh 70df504af3 library: add remote_metadata module structure and unified DTOs
- Add RemoteProvider enum (MusicBrainz, Discogs)
- Add RemoteAlbumSearchResult for lightweight search results
- Add RemoteAlbumMetadata for full metadata with tracks
- Add RemoteTrackMetadata for track info
- Add RemoteMetadataCache with TTL-based expiration
- Add adapter functions for MusicBrainz and Discogs
- Add Discogs position/duration parsing utilities
2026-01-26 18:37:45 -06:00
vicrodh 50d765509d fix(TagEditor): remove Tracklist label, tone down album path display 2026-01-26 18:27:25 -06:00
vicrodh d3e046d8ef fix(LocalLibrary): restore scroll in album detail view
The virtualized-active class was being applied even when viewing album
detail, causing overflow:hidden to block scrolling. Added !selectedAlbum
check to only apply virtualized mode for list views.
2026-01-26 18:24:31 -06:00
vicrodh 79ebd66856 refactor(PlaylistDetailView): use danger CSS variables for clear artwork button 2026-01-26 18:20:48 -06:00
vicrodh 590fea538c refactor: replace hardcoded colors with CSS variables
- FocusMode: replace #000, white with theme variables
- miniplayer: replace #6366f1, #fff, #818cf8 with accent/text variables
- AlbumDetailView: replace #666666 with --text-muted
- LoginView: use --danger and --warning variables for error/timeout boxes
- PlaylistModal: use .icon-inline utility class

Add to app.css:
- Warning color variables (--warning, --warning-bg, --warning-border)
- .icon-inline and .badge-warning utility classes
2026-01-26 18:20:06 -06:00
vicrodh 8ae4f62401 refactor(ExpandedPlayer): replace hardcoded colors with CSS variables 2026-01-26 18:16:23 -06:00
vicrodh fcda0ddf36 refactor: centralize button styles in app.css
- Add global .btn, .btn-primary, .btn-secondary, .btn-danger, .btn-ghost classes
- Add --danger color CSS variables for multi-theme support
- Add .btn-sm and .btn-lg size modifiers
- Refactor all modals and views to use global button classes
- Remove 260+ lines of duplicated button CSS across components

Files updated:
- FavoritesEditModal, FolderEditModal, FolderSettingsModal
- LocalLibraryTagEditorModal, MigrationModal, PlaylistImportModal
- PlaylistModal, Sidebar, LocalLibraryView, PlaylistManagerView
2026-01-26 18:02:58 -06:00
vicrodh 1751a83499 fix(ui): align metadata footer buttons with app style
cx
2026-01-26 17:45:08 -06:00
vicrodh c09a4233db fix(ui): align metadata editor footer buttons and spacing
cx
2026-01-26 17:42:34 -06:00
vicrodh 138f4388b7 fix(ui): ensure 5-row tracklist scroll and footer alignment
cx
2026-01-26 17:34:52 -06:00
vicrodh 6b107a8c57 fix(ui): stabilize metadata editor table and footer
cx
2026-01-26 17:19:51 -06:00
vicrodh be605dacf4 refactor(ui): polish metadata editor table and footer
cx
2026-01-26 17:05:51 -06:00
vicrodh 9889303a13 fix(ui): improve tracklist table and footer controls
cx
2026-01-26 16:55:01 -06:00
vicrodh 333c53002e fix(ui): tabular tracklist with vertical snap
cx
2026-01-26 16:49:13 -06:00
vicrodh 3ca9fe48af fix(ui): compute total discs without const tag
cx
2026-01-26 16:43:08 -06:00
vicrodh c63290b483 refactor(ui): update local metadata editor layout
cx
2026-01-26 16:40:32 -06:00
vicrodh cf41862c50 fix(ui): size local tag editor modal inputs
cx
2026-01-26 16:31:10 -06:00
vicrodh 13ee849604 fix(ui): ensure modals overlay sidebar and player
cx
2026-01-26 15:44:33 -06:00
vicrodh 4bc4bb0132 fix(ui): hide Discogs panel until fetch
cx
2026-01-26 15:36:39 -06:00
vicrodh 885b5f73b5 refactor(ui): align album artwork labels and grid
cx
2026-01-26 15:31:09 -06:00
vicrodh db45369b0a fix(ui): match Discogs cover size to preview
cx
2026-01-26 15:14:44 -06:00
vicrodh 8c99794fbf fix(ui): update album artwork button copy
cx
2026-01-26 15:13:26 -06:00
vicrodh 3ed0b19d16 fix(ui): adjust album settings modal artwork
cx
2026-01-26 15:12:56 -06:00
vicrodh 90d2bd94ae revert: album settings artwork panel polish
cx
2026-01-26 15:09:28 -06:00
vicrodh d0a0562885 fix(ui): polish album settings artwork panel
cx
2026-01-26 15:07:56 -06:00
vicrodh 4d139f78a0 refactor(ui): move Discogs results into artwork panel
cx
2026-01-26 14:47:55 -06:00
vicrodh 9dc0a87740 fix(ui): restore LocalLibrary album header layout
cx
2026-01-26 14:39:41 -06:00
vicrodh 6517cfc791 refactor(ui): align album settings actions layout
cx
2026-01-26 14:31:51 -06:00
vicrodh 249d49ab4f refactor(ui): adjust album settings header layout
cx
2026-01-26 13:45:54 -06:00
vicrodh 130f94ee43 refactor(ui): tighten album settings layout
cx
2026-01-26 13:35:56 -06:00
vicrodh 11efbd5a59 fix(ui): use alert for metadata errors
cx
2026-01-26 13:27:58 -06:00
vicrodh b8cc181974 fix(ui): refine album settings metadata entry
cx
2026-01-26 13:27:26 -06:00
vicrodh 92d601a35b feat(ui): add LocalLibrary metadata editor modal
cx
2026-01-26 13:25:00 -06:00
vicrodh 5d812f4966 feat(library): add LocalLibrary tag editor backend
cx
2026-01-26 13:24:51 -06:00
Victor RH 302fd200ae Merge branch 'fix/chromecast-parity' into pre-release 2026-01-26 11:37:02 -06:00
Victor RH 19aa5ca4a1 Adds Flatpak sandbox instructions
Provides instructions and a UI section to guide users on granting filesystem access and network sharing permissions to the Flatpak version of the app.

Removes redundant home directory permission in tauri config.
2026-01-26 11:34:32 -06:00
vicrodh 2f4b79f1bf fix(cast): cleanup Chromecast connection on app exit 2026-01-26 11:01:14 -06:00
vicrodh 1384a1d276 feat(cast): add position tracking and auto-advance for Chromecast
- Add cast_get_position command for Chromecast media position
- Add CastPositionInfo struct with position, duration, player_state, idle_reason
- Extend position polling to work with both DLNA and Chromecast
- Detect track end on Chromecast via IDLE state with FINISHED reason
- Unify polling logic for both protocols

cpvsc
2026-01-26 10:41:35 -06:00
vicrodh 5a2eba97d9 fix(cast): reset player state on cast disconnect
- Add onCastDisconnected callback to castStore
- Reset isPlaying state when cast disconnects
- Ensures play indicator stops in UI when DLNA disconnects

cpvsc
2026-01-26 10:20:32 -06:00
vicrodh 7ee12ea1b2 feat(cast): show cast badge and DLNA/Cast icon in AudioOutputBadges
- Add cast-aware badge that shows protocol name (DLNA/CAST/AIR)
- Show protocol-specific SVG icons in tooltip (dlna.svg, cast_audio.svg)
- Hide DAC passthrough and exclusive mode badges when casting
- Stop hardware polling when casting to avoid misleading info
- Add purple theme styling for cast badge consistent with cast UI

cpvsc
2026-01-26 10:16:39 -06:00
vicrodh 71ae2f92c1 feat(dlna): add position tracking and seekbar support
DLNA POSITION TRACKING:
- Added GetPositionInfo SOAP action to query current playback position
- Added GetTransportInfo SOAP action to get transport state (PLAYING/PAUSED/STOPPED)
- New dlna_get_position command returns position, duration, and transport state
- Added parse_time_string() helper for HH:MM:SS format

FRONTEND INTEGRATION:
- castStore: Added position polling (1s interval) when connected to DLNA
- castStore: New getCastPosition() for UI components
- castStore: Automatic polling start/stop on track play/disconnect
- playerStore: Subscribes to castStore for position updates
- playerStore: Updates currentTime from cast position when casting

This enables the seekbar to display accurate position during DLNA playback.
Seek functionality was already implemented (dlna_seek command).

Files modified:
- src-tauri/src/cast/dlna/device.rs
- src-tauri/src/cast/dlna/commands.rs
- src-tauri/src/cast/dlna/mod.rs
- src-tauri/src/lib.rs
- src/lib/stores/castStore.ts
- src/lib/stores/playerStore.ts
2026-01-26 09:41:11 -06:00
vicrodh 003468a28e fix(dlna): use fixed port 9876 and add extensive logging
CHANGES:
- MediaServer now uses fixed port 9876 (falls back to random if busy)
  This improves firewall compatibility for DLNA casting
- Added timeout (10s) for SOAP actions to prevent deadlocks
- Added extensive logging throughout DLNA flow:
  - Command entry point logging
  - MediaServer lifecycle (start, thread, requests)
  - SOAP action responses
  - Content-type and DIDL metadata details

VERIFIED WORKING:
- DLNA device discovery ✓
- Connection to gmediarender ✓
- SetAVTransportURI SOAP action ✓
- Play SOAP action ✓
- MediaServer serving audio to DLNA renderer ✓

Files modified:
- src-tauri/src/cast/dlna/device.rs
- src-tauri/src/cast/dlna/commands.rs
- src-tauri/src/cast/media_server.rs
2026-01-26 09:30:00 -06:00
vicrodh 892341b773 fix(dlna): use dynamic protocolInfo and add debug logging
PROBLEM:
- DLNA device detection and connection worked
- Audio playback on DLNA devices did not work

ROOT CAUSE:
- DIDL-Lite metadata had hardcoded protocolInfo='audio/flac'
- Many DLNA devices silently reject content when protocolInfo
  doesn't match the actual MIME type
- No debug logging to diagnose SOAP action failures

FIX:
- Pass actual content_type from Qobuz stream to DIDL builder
- Generate protocolInfo dynamically based on real MIME type
- Add extensive debug logging for:
  - MediaServer URL generated
  - Content-Type from Qobuz
  - Complete DIDL-Lite metadata
  - SOAP action responses (SetAVTransportURI, Play)
  - Error details when actions fail

Files modified:
- src-tauri/src/cast/dlna/device.rs
- src-tauri/src/cast/dlna/commands.rs
2026-01-26 07:56:08 -06:00
Victor RH 1ac60d1d90 Merge branch 'updates/uiux-1.1.7' into pre-release 2026-01-26 07:39:54 -06:00
vicrodh 6044213919 Add slide-in animations to AlbumCard overlay
- Genre/date block: slides in from bottom (0.4s ease-out)
- Action buttons: slide in from top (0.4s ease-out)
2026-01-26 07:39:17 -06:00
vicrodh 01c21fffb1 Rename "Play later" to "Add to queue" in all menus
Changes the menu action label from "Play later" to "Add to queue"
for better clarity and consistency with standard music player UX.

Updated in:
- AlbumMenu.svelte
- TrackMenu.svelte
- ArtistDetailView.svelte (tracks context menu)

Relates to #21
2026-01-25 23:55:48 -06:00
vicrodh e9c7e4672c Add release date display to AlbumCard overlay
- Add releaseDate prop to AlbumCard component
- Display release date below genre in overlay (format: "Jan 25, 2026")
- Update all AlbumCard usages across views to pass releaseDate:
  - ArtistDetailView (all album sections)
  - HomeView (all featured album sections)
  - SearchView (search results)
  - FavoritesView (favorite albums)
  - LabelView (label albums)
  - AlbumDetailView ("By the same artist" section)
- Add releaseDate to types and adapters
- Skip local library view (VirtualizedAlbumList)
2026-01-25 23:47:33 -06:00