Skip to content
CAI
Software that uses CAICheck a score

li-yuan-fang/EasyK

48.4

Weak · 1 October 2026

11.3k

lines of production code

VB.NET

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a desktop-based music playback and streaming application that integrates with DLNA devices and a web-based request interface. It features advanced audio processing capabilities, including real-time vocal removal for accompaniment, and supports complex lyric synchronization with per-character furigana for DLNA output. The application manages song queues via a command-line interface and web API, handling playback control, volume management, and device discovery while maintaining a structured logging and configuration system.

Features

DLNA music mode now supports per-character lyrics with furigana

The DLNA music playback experience has been enhanced to support complex, per-character lyric synchronization, including Japanese furigana (reading aids) for each character. This change introduces new data models for verbatim lyrics and a provider framework that allows lyric plugins to supply detailed timing and phonetic data, enabling more precise and visually rich lyric displays during DLNA streaming.

DLNA/Music · high confidence

New accompaniment engine with multi-channel vocal removal

Added a new accompaniment processing module in K/Audio/Accompaniment that supports vocal removal (center channel cancellation) for stereo, 4-channel, 5.1, and 7.1 audio formats. The implementation includes a time-domain processor (CenterAccompaniment) and an STFT-based processor (STFTAccompaniment) with configurable window types (Hann, Hamming, Blackman, Rectangular), reduction factors, and magnitude gain. The system handles PCM-16 and float32 audio streams via IWaveProvider and ISampleProvider interfaces, enabling real-time accompaniment generation with adjustable vocal suppression intensity.

K/Audio/Accompaniment · high confidence

New audio processing and device management components

Added new files in K/Audio to handle accompaniment processing (AccompanimentProvider, AccompanimentProviderFloat), CEF and VLC audio streaming (CefAudioHandler, VlcAudioHandler), audio device change detection (DeviceChangeHandler), and a central dummy player (DummyPlayer) that manages volume, accompaniment modes, and device reloading.

K/Audio · high confidence

New toast notification system and enhanced QR code interaction

The application now features a new toast notification system (AlertManager) that displays transient, icon-based status messages (such as volume, mute, or track changes) on the player window, replacing previous alert mechanisms. Additionally, the QR code display has been significantly enhanced: users can now drag the QR code window to reposition it, and zoom it in or out using the mouse wheel while holding Control. The QR code window also remembers its last position and size across sessions. These changes are supported by a refactoring of the main player window (FrmPlayer) and the underlying QR code rendering logic.

K/View · high confidence

New utility libraries and enhanced system interaction capabilities

The Utils module has been significantly expanded with new helper classes: AsyncUtils provides an asynchronous computation framework with concurrency limiting and core-count detection; AudioUtils enables reading and setting system and process-specific volume levels via NAudio; ColorUtils adds image-based color schema extraction and JSON serialization for colors; ConsoleUtils exposes Windows console control handler APIs; JsonUtils and XmlUtils provide safe, resilient parsing for JSON and XML (including DLNA DIDL-Lite namespace fixes); ScreenUtils retrieves detailed monitor information (including EDID data) and calculates screen overlaps; NetUtils adds local IP detection, TCP port usage monitoring, and URL validation; and TimeUtils now supports fractional time parsing. Additionally, the legacy MouseUtils class was removed, and FormUtils was updated to include a SetPropW P/Invoke.

Utils · high confidence

Behavioural changes

Command system refactoring and new control features

The command implementation files have been refactored to use consistent namespaces and a centralized logging system (replacing direct Console.WriteLine with Logger calls). This update introduces several new capabilities: a 'fair' mode command to toggle fairness algorithms, a 'replay' command to re-sing the current song, and an 'auto-deploy' feature via the 'restore' command to save and restore player screen configurations. DLNA device names can now be viewed or set using the 'dlna' command, and the 'port' command allows changing the HTTP server port with automatic QR code refresh. The 'exit' command now supports a 'save' argument to persist song records before quitting, and the 'push' command has been updated to force skip songs. Additionally, the 'seek' command now accepts specific second offsets, the 'top' command displays the source of moved songs, and the 'pass' command automatically refreshes the QR code upon updating the authorization key. The legacy 'lock' command has been removed and replaced by the new 'block' command for locking top songs, and the Bilibili login flow has been simplified to remove manual cookie persistence logic.

Commands/Implements · high confidence

DLNA device name customization and configurable access control

Users can now customize the DLNA device name displayed on the network, with changes automatically updating the SSDP description. Access to DLNA services is now governed by a configurable check function (defaulting to allowing all), replacing the previous hardcoded logic that relied on specific EasyK mirror states and strict IP permission settings. Additionally, the ConnectionManager service now allows unconditional access to improve compatibility with certain client software.

DLNA · high confidence

DLNA playback and volume control logic refactored

The DLNA service layer has been restructured to delegate playback control to a dedicated DLNAPlayer instance rather than using direct mirror triggers. AVTransport now registers and unregisters this player, handling state transitions (playing, paused, stopped) and seeking through the player object, which improves synchronization for buffered resources. RenderingControl has been updated to manage volume and mute states directly via the player's volume property, including caching the previous volume level to correctly restore it when unmuting, and adding support for GetVolume and GetMute requests.

DLNA/Services · high confidence

DLNA protocol implementation refinements and stability fixes

The DLNA protocol layer now handles event subscriptions and remote actions more robustly. Event broadcasts can now include special update values alongside standard state changes, ensuring subscribers receive all relevant notifications. HTTP responses for subscriptions and remote actions now use standard status codes (e.g., 412 Precondition Failed, 400 Bad Request) for better compliance. Remote action handling includes an access control check and safer XML parsing to prevent crashes on malformed requests. Additionally, logging has been standardized to use the central Logger, and internal timing loops for broadcasts have been optimized to reduce CPU usage.

DLNA/Protocol · high confidence

Enhanced stability, logging, and exit safety

The application now features a structured logging system (KLogger) that replaces direct console writes, ensuring consistent output and better error tracking. A safe exit mechanism has been implemented using a dedicated handler and lock to prevent deadlocks and ensure graceful shutdown of services (WebServer, DLNA, KCore) and configuration saving. Console input/output encoding is now set to Unicode for correct character display. Additionally, the solution now supports x86 builds alongside x64, and the default HTTP connection limit has been increased to 1024 to improve network handling.

(repo-wide) · high confidence

Expanded settings for audio, DLNA, and system behavior

The application now exposes granular configuration options for real-time accompaniment (including Fourier transform parameters and volume gain), DLNA playback (such as device naming, strict permission enforcement, and lyric display modes), and general system behavior (including fairness mode, safe exit timeouts, and upload size limits). Additionally, the legacy cookie container for Bilibili login persistence has been removed in favor of a dedicated keep-login setting, and the logging system has been updated to use a structured Logger instead of console output.

Settings · high confidence

Improved HTTP server resilience and standardized API responses

The web server now automatically recovers from port-binding conflicts by adjusting Hyper-V dynamic port ranges, restarting the WinNAT service, and switching to an available port within the configured range, preventing manual intervention for common startup errors. The API endpoints have been standardized to use explicit HTTP status codes (e.g., 400, 403, 404, 416, 500) instead of generic integers, and the /rank endpoint now supports specific ranking adjustments rather than just moving songs to the top. Additionally, the upload system now validates file hashes upon completion and the request models have been updated to support new fields like 'hash' and 'rank'.

Web · high confidence

Introduction of DLNA Player with Music Mode and Lyric Customization

The DLNA/Player area introduces a new DLNAPlayer class and a StoredMusic data structure, enabling DLNA-based music playback with specific support for a 'Music Mode'. This implementation adds capabilities for dynamic lyric color customization (via LyricColor in StoredMusic) and manages playback states such as buffering and waiting for connections, effectively replacing or augmenting previous DLNA handling logic with a more structured approach to lyric display and music-specific attributes.

DLNA/Player · medium confidence

Refactored command system to use reflection-based loading and namespace scoping

The command infrastructure has been restructured to improve maintainability and extensibility. The base \Command\ class is now encapsulated within the \Commands\ namespace, and the \CommandParser\ no longer manually instantiates commands in a hardcoded list. Instead, it uses reflection to automatically discover and load all classes inheriting from \Command\ within the \EasyK.Commands\ namespace, resolving dependencies via constructor injection. This change also fixes a bug where the \CommandTop\ instruction was defined twice, as the new system deduplicates or manages registrations more cleanly, and prepares the system for asynchronous loading optimizations.

Commands · high confidence

Refactored core architecture and introduced new playback features

The application's core logic has been refactored to support new capabilities including accompaniment mode, DLNA device name modification, and lyric offset/contrast adjustments. The main window class has been removed in favor of a new player form, and CEFSharp settings have been updated to persist login sessions and use D3D11 rendering. Additionally, a new logging system and song request record structures have been implemented to improve stability and data handling.

K · high confidence

Version bump to 1.1.4.0 and addition of UI icon resources

The application version has been updated to 1.1.4.0. Additionally, new SVG icon resources for accompaniment, mute, original, pause, play, push, and volume have been added to the project resources, and the application manifest now explicitly requests administrator privileges.

My Project · high confidence

Dependencies

Upgrade CefSharp to 126.2 and add NAudio dependencies

The embedded browser engine has been upgraded from CefSharp 109 to version 126.2.70, which includes a switch to the new ChromiumEmbeddedFramework runtime packages. Additionally, the NAudio library suite (version 2.3.0) has been added to support audio processing features, while Microsoft.Graph.Core and Microsoft.Kiota.Authentication.Azure dependencies were removed.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 48 → 48 (+0.0)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 85 → 85 (+0.0)
  • Architecture 90 → 90 (+0.0)
  • Maturity 46 → 46 (+0.2)
  • Readiness 27 → 27 (+0.0)
  • Security 100 → 100 (+0.0)

Resolved (6)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Hotspot: DLNA/Music/DLNAMusicProviders.vb (DLNA/Music/DLNAMusicProviders.vb)
  • Hotspot: K/EasyK.vb (K/EasyK.vb)
  • Hotspot: Utils/ColorUtils.vb (Utils/ColorUtils.vb)
  • Hotspot: Web/UploadManager.vb (Web/UploadManager.vb)

Architecture

  • Unchanged — 1 containers · 0 contexts · 0 edges

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

li-yuan-fang/EasyK was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 0f509c46c65342eb4bc373c0656829c7a22fe25e — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.