Skip to content

Commit 718ac66

Browse files
committed
feat: update desktop player bar and song tile for improved UI and functionality
- Refactored lyrics toggle logic in DesktopPlayerBar to use root navigator. - Updated color scheme in DesktopPlayerBar for better contrast. - Enhanced song tile artwork display with dynamic corner radius. - Added player UI settings service for managing album art corner radius. - Updated dependencies in pubspec.yaml and pubspec.lock for versioning and new features. - Implemented GitHub release fetching in the React website for dynamic version display.
1 parent 313766f commit 718ac66

57 files changed

Lines changed: 4180 additions & 1272 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,33 @@ All notable changes to Musly will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.0.7] - 2026-02-22
9+
10+
### Added
11+
- **Spotify-style Desktop UX**: Complete redesign of the PC layout
12+
- New collapsible sidebar (`DesktopNavigationSidebar`) with 260 px expanded / 72 px collapsed states
13+
- Sidebar sections: Home, Search, Your Library (scrollable playlist list with Liked Songs shortcut), Settings, Collapse/Expand toggle
14+
- Settings navigation item restored directly in the sidebar
15+
- All sidebar strings localised via ARB (`expand`, `createPlaylist`)
16+
- **Artwork Style Editor**: Full custom editor in Settings → Display → Artwork Style
17+
- **Shape**: Rounded rectangle, Circle, or Square
18+
- **Corner Radius**: slider (0–24 px), only visible when shape is *Rounded*
19+
- **Shadow intensity**: None, Soft, Medium, Strong
20+
- **Shadow color**: Black or Accent (Musly red)
21+
- Live 108 px animated preview updates in real-time
22+
- All options persisted to `SharedPreferences` and restored on next launch (awaited before `runApp`)
23+
- **No-artwork placeholder in mobile player**: Songs without cover art now show a clean dark gradient tile with a music note icon and localised "No artwork" label instead of an infinite shimmer loader. Shimmer is still used while the image is actually fetching.
24+
25+
### Changed
26+
- **Desktop player bar accent colors**: All active-state indicators (shuffle, repeat, progress slider, volume slider, favorite heart, lyrics button) now use Musly red
27+
- **Update dialog colors**: Header gradient and download button changed from purple/blue (`#6C5CE7 → #00B4D8`) to Musly red/pink (`appleMusicRed → appleMusicPink`)
28+
- **Desktop lyrics**: Lyrics view now uses `rootNavigator: true` so it covers the full window (sidebar + content + player bar); close button pops from the root navigator correctly
29+
- **React marketing website**: Version number and release date in Hero and Download sections are now fetched live from the GitHub public API (`/repos/dddevid/Musly/releases/latest`) with a 10-minute session cache — no auth token required
30+
31+
### Fixed
32+
- **Library list alignment**: Album/artist tiles in the Library screen now use an explicit `InkWell → Padding → Row` layout so artwork and text align with section headers on all platforms
33+
- **Artwork settings not persisting**: `PlayerUiSettingsService.initialize()` is now `await`-ed before `runApp`, guaranteeing saved values are loaded into notifiers before any widget builds
34+
835
## [1.0.6] - 2026-02-20
936

1037
### Added
@@ -18,7 +45,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1845
- **Genre Support**: Enhanced genre browsing
1946
- Genres screen now shows song count per genre and a tooltip
2047
- Genre screen rebuilt with two tabs: Songs and Albums
21-
- **Easter Egg**: Fanta-bounce screensaver triggered by tapping the search button 11 times in quick succession
2248

2349
### Fixed
2450
- **[#29](https://github.com/dddevid/Musly/issues/29) Offline Playlists**: Playlists are now correctly restored from local cache when the server is unreachable

android/app/src/main/AndroidManifest.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,13 @@
110110
<!-- Google Cast Options Provider -->
111111
<meta-data
112112
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
113-
android:value="com.google.android.gms.cast.framework.media.CastMediaOptionsProvider" />
113+
android:value="com.felnanuke.google_cast.GoogleCastOptionsProvider" />
114+
115+
<!-- Media notification service for cast controls -->
116+
<service
117+
android:name="com.google.android.gms.cast.framework.media.MediaNotificationService"
118+
android:exported="false"
119+
android:foregroundServiceType="mediaPlayback" />
114120
</application>
115121

116122
<!-- Required to query activities that can process text, see:

installer.nsi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
; Version (passed via /DMUSLY_VERSION=x.x.x from CI, or fallback)
55

66
!ifndef MUSLY_VERSION
7-
!define MUSLY_VERSION "1.0.6"
7+
!define MUSLY_VERSION "1.0.7"
88
!endif
99

1010
;--------------------------------
@@ -106,7 +106,7 @@ Section "Musly" SecMain
106106
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Musly" \
107107
"Publisher" "dddevid"
108108
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Musly" \
109-
"DisplayVersion" "1.0.6"
109+
"DisplayVersion" "1.0.7"
110110
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Musly" \
111111
"URLInfoAbout" "https://github.com/dddevid/Musly"
112112

lib/l10n/app_en.arb

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,12 @@
11601160
"collapse": "Collapse",
11611161
"@collapse": { "description": "Tooltip/label for the sidebar collapse button" },
11621162

1163+
"expand": "Expand",
1164+
"@expand": { "description": "Tooltip/label for the sidebar expand button" },
1165+
1166+
"createPlaylist": "Create playlist",
1167+
"@createPlaylist": { "description": "Tooltip/label for the create-playlist button in the sidebar library header" },
1168+
11631169
"likedSongsSidebar": "Liked Songs",
11641170
"@likedSongsSidebar": { "description": "Liked Songs item label in the desktop sidebar" },
11651171

@@ -1380,5 +1386,67 @@
13801386
"@musicFoldersHint": { "description": "Hint text in the music folders selection dialog" },
13811387

13821388
"musicFoldersSaved": "Music folder selection saved",
1383-
"@musicFoldersSaved": { "description": "Snackbar shown after saving music folder selection" }
1389+
"@musicFoldersSaved": { "description": "Snackbar shown after saving music folder selection" },
1390+
1391+
"artworkStyleSection": "Artwork Style",
1392+
"@artworkStyleSection": { "description": "Display settings section header for artwork customisation" },
1393+
1394+
"artworkCornerRadius": "Corner Radius",
1395+
"@artworkCornerRadius": { "description": "Label for the album art corner radius slider" },
1396+
1397+
"artworkCornerRadiusSubtitle": "Adjust how round the corners of album covers appear",
1398+
"@artworkCornerRadiusSubtitle": { "description": "Subtitle for the album art corner radius slider" },
1399+
1400+
"artworkCornerRadiusNone": "None",
1401+
"@artworkCornerRadiusNone": { "description": "Label shown when corner radius is set to 0 (no rounded corners)" },
1402+
1403+
"artworkShape": "Shape",
1404+
"@artworkShape": { "description": "Label for the artwork shape selector" },
1405+
1406+
"artworkShapeRounded": "Rounded",
1407+
"@artworkShapeRounded": { "description": "Rounded rectangle artwork shape option" },
1408+
1409+
"artworkShapeCircle": "Circle",
1410+
"@artworkShapeCircle": { "description": "Circle artwork shape option" },
1411+
1412+
"artworkShapeSquare": "Square",
1413+
"@artworkShapeSquare": { "description": "Square (no rounding) artwork shape option" },
1414+
1415+
"artworkShadow": "Shadow",
1416+
"@artworkShadow": { "description": "Label for the artwork shadow intensity selector" },
1417+
1418+
"artworkShadowNone": "None",
1419+
"@artworkShadowNone": { "description": "No shadow option for artwork" },
1420+
1421+
"artworkShadowSoft": "Soft",
1422+
"@artworkShadowSoft": { "description": "Soft shadow option for artwork" },
1423+
1424+
"artworkShadowMedium": "Medium",
1425+
"@artworkShadowMedium": { "description": "Medium shadow option for artwork" },
1426+
1427+
"artworkShadowStrong": "Strong",
1428+
"@artworkShadowStrong": { "description": "Strong shadow option for artwork" },
1429+
1430+
"artworkShadowColor": "Shadow Color",
1431+
"@artworkShadowColor": { "description": "Label for the artwork shadow color selector" },
1432+
1433+
"artworkShadowColorBlack": "Black",
1434+
"@artworkShadowColorBlack": { "description": "Black shadow color option" },
1435+
1436+
"artworkShadowColorAccent": "Accent",
1437+
"@artworkShadowColorAccent": { "description": "Accent color shadow (matches app accent color)" },
1438+
1439+
"artworkPreview": "Preview",
1440+
"@artworkPreview": { "description": "Label shown above the live artwork style preview" },
1441+
1442+
"artworkCornerRadiusLabel": "{value}px",
1443+
"@artworkCornerRadiusLabel": {
1444+
"description": "Formatted corner radius value label",
1445+
"placeholders": {
1446+
"value": { "type": "int" }
1447+
}
1448+
},
1449+
1450+
"noArtwork": "No artwork",
1451+
"@noArtwork": { "description": "Placeholder label shown in the player when a song has no cover art" }
13841452
}

lib/l10n/app_localizations.dart

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1996,6 +1996,18 @@ abstract class AppLocalizations {
19961996
/// **'Collapse'**
19971997
String get collapse;
19981998

1999+
/// Tooltip/label for the sidebar expand button
2000+
///
2001+
/// In en, this message translates to:
2002+
/// **'Expand'**
2003+
String get expand;
2004+
2005+
/// Tooltip/label for the create-playlist button in the sidebar library header
2006+
///
2007+
/// In en, this message translates to:
2008+
/// **'Create playlist'**
2009+
String get createPlaylist;
2010+
19992011
/// Liked Songs item label in the desktop sidebar
20002012
///
20012013
/// In en, this message translates to:
@@ -2343,6 +2355,120 @@ abstract class AppLocalizations {
23432355
/// In en, this message translates to:
23442356
/// **'Music folder selection saved'**
23452357
String get musicFoldersSaved;
2358+
2359+
/// Display settings section header for artwork customisation
2360+
///
2361+
/// In en, this message translates to:
2362+
/// **'Artwork Style'**
2363+
String get artworkStyleSection;
2364+
2365+
/// Label for the album art corner radius slider
2366+
///
2367+
/// In en, this message translates to:
2368+
/// **'Corner Radius'**
2369+
String get artworkCornerRadius;
2370+
2371+
/// Subtitle for the album art corner radius slider
2372+
///
2373+
/// In en, this message translates to:
2374+
/// **'Adjust how round the corners of album covers appear'**
2375+
String get artworkCornerRadiusSubtitle;
2376+
2377+
/// Label shown when corner radius is set to 0 (no rounded corners)
2378+
///
2379+
/// In en, this message translates to:
2380+
/// **'None'**
2381+
String get artworkCornerRadiusNone;
2382+
2383+
/// Label for the artwork shape selector
2384+
///
2385+
/// In en, this message translates to:
2386+
/// **'Shape'**
2387+
String get artworkShape;
2388+
2389+
/// Rounded rectangle artwork shape option
2390+
///
2391+
/// In en, this message translates to:
2392+
/// **'Rounded'**
2393+
String get artworkShapeRounded;
2394+
2395+
/// Circle artwork shape option
2396+
///
2397+
/// In en, this message translates to:
2398+
/// **'Circle'**
2399+
String get artworkShapeCircle;
2400+
2401+
/// Square (no rounding) artwork shape option
2402+
///
2403+
/// In en, this message translates to:
2404+
/// **'Square'**
2405+
String get artworkShapeSquare;
2406+
2407+
/// Label for the artwork shadow intensity selector
2408+
///
2409+
/// In en, this message translates to:
2410+
/// **'Shadow'**
2411+
String get artworkShadow;
2412+
2413+
/// No shadow option for artwork
2414+
///
2415+
/// In en, this message translates to:
2416+
/// **'None'**
2417+
String get artworkShadowNone;
2418+
2419+
/// Soft shadow option for artwork
2420+
///
2421+
/// In en, this message translates to:
2422+
/// **'Soft'**
2423+
String get artworkShadowSoft;
2424+
2425+
/// Medium shadow option for artwork
2426+
///
2427+
/// In en, this message translates to:
2428+
/// **'Medium'**
2429+
String get artworkShadowMedium;
2430+
2431+
/// Strong shadow option for artwork
2432+
///
2433+
/// In en, this message translates to:
2434+
/// **'Strong'**
2435+
String get artworkShadowStrong;
2436+
2437+
/// Label for the artwork shadow color selector
2438+
///
2439+
/// In en, this message translates to:
2440+
/// **'Shadow Color'**
2441+
String get artworkShadowColor;
2442+
2443+
/// Black shadow color option
2444+
///
2445+
/// In en, this message translates to:
2446+
/// **'Black'**
2447+
String get artworkShadowColorBlack;
2448+
2449+
/// Accent color shadow (matches app accent color)
2450+
///
2451+
/// In en, this message translates to:
2452+
/// **'Accent'**
2453+
String get artworkShadowColorAccent;
2454+
2455+
/// Label shown above the live artwork style preview
2456+
///
2457+
/// In en, this message translates to:
2458+
/// **'Preview'**
2459+
String get artworkPreview;
2460+
2461+
/// Formatted corner radius value label
2462+
///
2463+
/// In en, this message translates to:
2464+
/// **'{value}px'**
2465+
String artworkCornerRadiusLabel(int value);
2466+
2467+
/// Placeholder label shown in the player when a song has no cover art
2468+
///
2469+
/// In en, this message translates to:
2470+
/// **'No artwork'**
2471+
String get noArtwork;
23462472
}
23472473

23482474
class _AppLocalizationsDelegate

lib/l10n/app_localizations_bn.dart

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,12 @@ class AppLocalizationsBn extends AppLocalizations {
10221022
@override
10231023
String get collapse => 'Collapse';
10241024

1025+
@override
1026+
String get expand => 'Expand';
1027+
1028+
@override
1029+
String get createPlaylist => 'Create playlist';
1030+
10251031
@override
10261032
String get likedSongsSidebar => 'Liked Songs';
10271033

@@ -1215,4 +1221,64 @@ class AppLocalizationsBn extends AppLocalizations {
12151221

12161222
@override
12171223
String get musicFoldersSaved => 'Music folder selection saved';
1224+
1225+
@override
1226+
String get artworkStyleSection => 'Artwork Style';
1227+
1228+
@override
1229+
String get artworkCornerRadius => 'Corner Radius';
1230+
1231+
@override
1232+
String get artworkCornerRadiusSubtitle =>
1233+
'Adjust how round the corners of album covers appear';
1234+
1235+
@override
1236+
String get artworkCornerRadiusNone => 'None';
1237+
1238+
@override
1239+
String get artworkShape => 'Shape';
1240+
1241+
@override
1242+
String get artworkShapeRounded => 'Rounded';
1243+
1244+
@override
1245+
String get artworkShapeCircle => 'Circle';
1246+
1247+
@override
1248+
String get artworkShapeSquare => 'Square';
1249+
1250+
@override
1251+
String get artworkShadow => 'Shadow';
1252+
1253+
@override
1254+
String get artworkShadowNone => 'None';
1255+
1256+
@override
1257+
String get artworkShadowSoft => 'Soft';
1258+
1259+
@override
1260+
String get artworkShadowMedium => 'Medium';
1261+
1262+
@override
1263+
String get artworkShadowStrong => 'Strong';
1264+
1265+
@override
1266+
String get artworkShadowColor => 'Shadow Color';
1267+
1268+
@override
1269+
String get artworkShadowColorBlack => 'Black';
1270+
1271+
@override
1272+
String get artworkShadowColorAccent => 'Accent';
1273+
1274+
@override
1275+
String get artworkPreview => 'Preview';
1276+
1277+
@override
1278+
String artworkCornerRadiusLabel(int value) {
1279+
return '${value}px';
1280+
}
1281+
1282+
@override
1283+
String get noArtwork => 'No artwork';
12181284
}

0 commit comments

Comments
 (0)