Skip to content

A desktop widget for Windows that surfaces the current playback session using a customizable Rust/egui interface. It mirrors the Windows system media controls, shows album art and metadata, and lets you drive playback with modern, skinable controls.

License

Notifications You must be signed in to change notification settings

DarkishLocket10/nowplaying-widget

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Now Playing Widget

Now Playing 1 Now Playing 2 New player view
Player wide 1 Player wide 2

A desktop widget for Windows that surfaces the current playback session using a customizable Rust/egui interface. It mirrors the Windows system media controls, shows album art and metadata, and lets you drive playback with modern, skinable controls.

I was tired of the current media control dashboards, so I just made a super minimal one in Rust, with a theme and layout engine, so users can customize their own skins to their liking.

Table of Contents

Features

  • Windows system media integration via the Global System Media Transport Controls API.
  • Dynamic album art with automatic scaling, rounded corners, and optional decorative borders.
  • Responsive layouts and skins defined entirely in TOML with hot reload support.
  • Modern controls using glyph-based transport buttons and keyboard/mouse-friendly spacing.
  • Settings drawer for switching skins, layouts, and toggling hot reload at runtime.
  • Vinyl thumbnail renderer: swirl-distorted disc with spinning animation toggle it on the fly or let skins opt out entirely.
  • Safety-first error handling with in-app warnings surfaced when skins or assets are misconfigured.

Requirements

  • Windows 10 or later (uses Windows Runtime media APIs).
  • Rust 1.76 or newer with the cargo build tool.
  • Microsoft Visual C++ Build Tools (required by the windows crate when building from source).

Quick Start

  1. Clone the repository:

    git clone https://github.com/<your-org>/nowplaying-widget.git
    cd nowplaying-widget/app
  2. Build and run in debug mode:

    cargo run

    Use cargo run --release for a production-ready binary.

  3. The widget will appear with the default skin (Cutesy Pastels). Press the gear icon to open the settings drawer and experiment with alternative skins/layouts.

Usage

  • Playback controls: Previous, Play/Pause, and Next buttons map directly to the active media session.
  • Timeline: Displays current position, duration, and allows seeking when supported by the session.
  • Settings drawer: Use the left-aligned gear button to toggle. You can switch skins, choose a layout variant, enable hot reload, and flip between vinyl and standard artwork.
  • Artwork display: Click the album art itself to swap between the spinning vinyl disc and the original square thumbnail.
  • Skin warnings: When a skin fails to load assets or references missing values, a warning panel appears. Expand it to debug issues quickly.

Skinning and Layouts

Skin authors can tailor every visual aspect:

  • Theme (theme.toml): Controls colors, typography, button styles, slider behavior, and album art framing (rounded corners and optional border PNGs).
  • Layout (layout.toml): Declares how components are arranged for each variant (rows, columns, and responsive parameters).
  • Assets (assets/): Store fonts, images, slider thumbs, and decorative overlays for per-skin customization.

Bundled reference skins:

  • Cutesy Pastels | default playful look with soft gradients.
  • Graphite Mono | dark, minimal theme tuned for desktops.
  • Mobile Glow | compact layout optimized for narrower windows.
  • Gradient Demo | showcases the configurable gradient background support.
  • Aurora Vinyl | neon turntable aesthetic designed to spotlight the vinyl thumbnail renderer.

See the following guides for in-depth skin authoring details:

Project Structure

app/
├── src/                # Application entry point and rendering logic
├── skins/              # Bundled skins, each with theme/layout/assets
├── assets/fonts/       # Shared font assets (Lato regular/bold)
├── docs/               # Project documentation
├── tests/              # Integration tests
├── Cargo.toml          # Rust crate manifest
└── README.md           # This file

Development

  • Format code with cargo fmt and lint via cargo clippy (optional but recommended).
  • Run unit/integration tests with cargo test.
  • Use cargo run while editing skins; enable hot reload from the widget settings drawer to live-reload TOML changes.
  • Vinyl rendering is enabled when the active skin allows it; you can switch modes from the UI or pin a default in config.toml (see below).
  • Refer to docs/development.md for detailed contributor guidelines, coding standards, and release steps.

Configuration

Drop a config.toml in the repository root (alongside Cargo.toml) or beside the built binary to customize experimental UI features:

[ui]
[ui.vinyl_thumbnail]
enabled = true        # preferred startup mode when the skin allows vinyl
swirl_strength = 2.5  # radians of angular distortion at the outer edge
label_ratio = 0.35    # radius of the untouched center label (0.1 to 0.6)

The vinyl renderer is interactive. It transforms album artwork into a spinning vinyl disc with polar-coordinate swirl, concentric grooves, center label preservation, subtle sheen, and a spindle hole. Click the artwork (or use the settings drawer toggle) to fall back to the untouched thumbnail at any time. The disc rotates in real-time during playback and respects the system's reduced-motion preference on Windows.

Skins can explicitly disable vinyl rendering by setting disable_vinyl_thumbnail = true in their [meta] section (see docs/theme.md).

Troubleshooting

Symptom Resolution
Widget launches but shows "Unknown" state Ensure a media session is active (Spotify, Groove, etc.).
Album art missing or blank Verify the media session provides artwork; otherwise the widget displays a placeholder panel.
Skin fails to load Check the on-screen warnings and inspect the referenced file paths in the skin’s assets directory.
Build errors referencing windows crate Install the latest Windows SDK and C++ build tools, then retry cargo run.

Additional Resources

About

A desktop widget for Windows that surfaces the current playback session using a customizable Rust/egui interface. It mirrors the Windows system media controls, shows album art and metadata, and lets you drive playback with modern, skinable controls.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages