master
12
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
f03ca44a8e |
feat(plugins): add lyrics provider plugin capability (#5126)
* feat(plugins): add lyrics provider plugin capability Refactor the lyrics system from a static function to an interface-based service that supports WASM plugin providers. Plugins listed in the LyricsPriority config (alongside "embedded" and file extensions) are now resolved through the plugin system. Includes capability definition, Go/Rust PDK, adapter, Wire integration, and tests for plugin fallback behavior. * test(plugins): add lyrics capability integration test with test plugin * fix(plugins): default lyrics language to 'xxx' when plugin omits it Per the OpenSubsonic spec, the server must return 'und' or 'xxx' when the lyrics language is unknown. The lyrics plugin adapter was passing an empty string through when a plugin didn't provide a language value. This defaults the language to 'xxx', consistent with all other callers of model.ToLyrics() in the codebase. * refactor(plugins): rename lyrics import to improve clarity Signed-off-by: Deluan <[email protected]> * refactor(lyrics): update TrackInfo description for clarity Signed-off-by: Deluan <[email protected]> * fix(lyrics): enhance lyrics plugin handling and case sensitivity Signed-off-by: Deluan <[email protected]> * fix(plugins): update payload type to string with byte format for task data Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
668869b6c7 |
feat(plugins): add TaskQueue host service for persistent background task queues (#5116)
* feat(plugins): define TaskQueue host service interface Add the TaskQueueService interface with CreateQueue, Enqueue, GetTaskStatus, and CancelTask methods plus QueueConfig struct. * feat(plugins): define TaskWorker capability for task execution callbacks * feat(plugins): add taskqueue permission to manifest schema Add TaskQueuePermission with maxConcurrency option. * feat(plugins): implement TaskQueue service with SQLite persistence and workers Per-plugin SQLite database with queues and tasks tables. Worker goroutines dequeue tasks and invoke nd_task_execute callback. Exponential backoff retries, rate limiting via delayMs, automatic cleanup of terminal tasks. * feat(plugins): require TaskWorker capability for taskqueue permission * feat(plugins): register TaskQueue host service in manager * feat(plugins): add test-taskqueue plugin for integration testing * feat(plugins): add integration tests for TaskQueue host service * docs: document TaskQueue module for persistent task queues Signed-off-by: Deluan <[email protected]> * fix(plugins): harden TaskQueue host service with validation and safety improvements Add input validation (queue name length, payload size limits), extract status string constants to eliminate raw SQL literals, make CreateQueue idempotent via upsert for crash recovery, fix RetentionMs default check for negative values, cap exponential backoff at 1 hour to prevent overflow, and replace manual mutex-based delay enforcement with rate.Limiter from golang.org/x/time/rate for correct concurrent worker serialization. * refactor(plugins): remove capability check for TaskWorker in TaskQueue host service Signed-off-by: Deluan <[email protected]> * fix(plugins): use context-aware database execution in TaskQueue host service Signed-off-by: Deluan <[email protected]> * refactor(plugins): streamline task queue configuration and error handling Signed-off-by: Deluan <[email protected]> * feat(plugins): increase maxConcurrency for task queue and handle budget exhaustion Signed-off-by: Deluan <[email protected]> * refactor(plugins): simplify goroutine management in task queue service Signed-off-by: Deluan <[email protected]> * feat(plugins): update TaskWorker interface to return status messages and refactor task queue service Signed-off-by: Deluan <[email protected]> * feat(plugins): add ClearQueue function to remove pending tasks from a specified queue Signed-off-by: Deluan <[email protected]> * refactor(plugins): use migrateDB for task queue schema and fix constant name collision Replaced the raw db.Exec call in createTaskQueueSchema with migrateDB, matching the pattern used by createKVStoreSchema. This enables version-tracked schema migrations via SQLite's PRAGMA user_version, allowing future schema changes to be appended incrementally. Also renamed cleanupInterval to taskCleanupInterval to resolve a redeclaration conflict with host_kvstore.go. * regenerate PDKs Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
6fd044fb09 |
feat(plugins): change websockets Data field type to []byte for binary support
Signed-off-by: Deluan <[email protected]> |
||
|
|
30df004d4d |
test(plugins): speed up integration tests (~45% improvement) (#5137)
* test(plugins): speed up integration tests with shared wazero cache Reduce plugin test suite runtime from ~22s to ~12s by: - Creating a shared wazero compilation cache directory in TestPlugins() and setting conf.Server.CacheFolder globally so all test Manager instances reuse compiled WASM binaries from disk cache - Moving 6 createTestManager* calls from inside It blocks to BeforeAll blocks in scrobbler_adapter_test.go and manager_call_test.go - Replacing time.Sleep(2s) in KVStore TTL test with Eventually polling - Reducing WebSocket callback sleeps from 100ms to 10ms Signed-off-by: Deluan <[email protected]> * test(plugins): enhance websocket tests by storing server messages for verification Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
2471bb9cf6 |
feat(plugins): add TTL support, batch operations, and hardening to kvstore (#5127)
* feat(plugins): add expires_at column to kvstore schema * feat(plugins): filter expired keys in kvstore Get, Has, List * feat(plugins): add periodic cleanup of expired kvstore keys * feat(plugins): add SetWithTTL, DeleteByPrefix, and GetMany to kvstore Add three new methods to the KVStore host service: - SetWithTTL: store key-value pairs with automatic expiration - DeleteByPrefix: remove all keys matching a prefix in one operation - GetMany: retrieve multiple values in a single call All methods include comprehensive unit tests covering edge cases, expiration behavior, size tracking, and LIKE-special characters. * feat(plugins): regenerate code and update test plugin for new kvstore methods Regenerate host function wrappers and PDK bindings for Go, Python, and Rust. Update the test-kvstore plugin to exercise SetWithTTL, DeleteByPrefix, and GetMany. * feat(plugins): add integration tests for new kvstore methods Add WASM integration tests for SetWithTTL, DeleteByPrefix, and GetMany operations through the plugin boundary, verifying end-to-end behavior including TTL expiration, prefix deletion, and batch retrieval. * fix(plugins): address lint issues in kvstore implementation Handle tx.Rollback error return and suppress gosec false positive for parameterized SQL query construction in GetMany. * fix(plugins): Set clears expires_at when overwriting a TTL'd key Previously, calling Set() on a key that was stored with SetWithTTL() would leave the expires_at value intact, causing the key to silently expire even though Set implies permanent storage. Also excludes expired keys from currentSize calculation at startup. * refactor(plugins): simplify kvstore by removing in-memory size cache Replaced the in-memory currentSize cache (atomic.Int64), periodic cleanup timer, and mutex with direct database queries for storage accounting. This eliminates race conditions and cache drift issues at negligible performance cost for plugin-sized datasets. Also unified Set and SetWithTTL into a shared setValue method, simplified DeleteByPrefix to use RowsAffected instead of a transaction, and added an index on expires_at for efficient expiration filtering. * feat(plugins): add generic SQLite migration helper and refactor kvstore schema Add a reusable migrateDB helper that tracks schema versions via SQLite's PRAGMA user_version and applies pending migrations transactionally. Replace the ad-hoc createKVStoreSchema function in kvstore with a declarative migrations slice, making it easy to add future schema changes. Remove the now-redundant schema migration test since migrateDB has its own test suite and every kvstore test exercises the migrations implicitly. Signed-off-by: Deluan <[email protected]> * fix(plugins): harden kvstore with explicit NULL handling, prefix validation, and cleanup timeout - Use sql.NullString for expires_at to explicitly send NULL instead of relying on datetime('now', '') returning NULL by accident - Reject empty prefix in DeleteByPrefix to prevent accidental data wipe - Add 5s timeout context to cleanupExpired on Close - Replace time.Sleep in unit tests with pre-expired timestamps Signed-off-by: Deluan <[email protected]> * refactor(plugins): use batch processing in GetMany Process keys in chunks of 200 using slice.CollectChunks to avoid hitting SQLite's SQLITE_MAX_VARIABLE_NUMBER limit with large key sets. * feat(plugins): add periodic cleanup goroutine for expired kvstore keys Use the manager's context to control a background goroutine that purges expired keys every hour, stopping naturally on shutdown when the context is cancelled. --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
e8863ed147 |
feat(plugins): add SubsonicAPI CallRaw, with support for raw=true binary response for host functions (#4982)
* feat: implement raw binary framing for host function responses Signed-off-by: Deluan <[email protected]> * feat: add CallRaw method for Subsonic API to handle binary responses Signed-off-by: Deluan <[email protected]> * test: add tests for raw=true methods and binary framing generation Signed-off-by: Deluan <[email protected]> * fix: improve error message for malformed raw responses to indicate incomplete header Signed-off-by: Deluan <[email protected]> * fix: add wasm_import_module attribute for raw methods and improve content-type handling Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
1afcf7775b |
feat: add ISRC matching for similar songs (#4946)
* feat: add ISRC support to similar songs matching and plugin interface Add ISRC (International Standard Recording Code) as a high-priority identifier in the provider matching algorithm, alongside MBID. The matching pipeline now uses four strategies in priority order: ID > MBID > ISRC > Title+Artist fuzzy match. - Add ISRC field to agents.Song struct - Add ISRC field to plugin capability SongRef (Go, Rust PDKs) - Add loadTracksByISRC using json_tree query on tags column - Integrate ISRC into matchSongsToLibrary, selectBestMatchingSongs, and buildTitleQueries https://claude.ai/code/session_01Dd4mTq1VQZag4RNjCVusiF * chore: regenerate plugin schema after ISRC addition Run `make gen` to update the generated YAML schema for the metadata agent capability with the new ISRC field on SongRef. https://claude.ai/code/session_01Dd4mTq1VQZag4RNjCVusiF * feat(mediafile): add GetAllByTags method to MediaFileRepository for tag-based retrieval Signed-off-by: Deluan <[email protected]> * feat(provider): speed up track matching by incorporating prior matches in ISRC and MBID lookups Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> Co-authored-by: Claude <[email protected]> |
||
|
|
fda35dd8ce |
feat(plugins): add similar songs retrieval functions and improve duration consistency (#4933)
* feat: add duration filtering for similar songs matching Signed-off-by: Deluan <[email protected]> * test: refactor expectations for similar songs in provider matching tests Signed-off-by: Deluan <[email protected]> * feat(plugins): add functions to retrieve similar songs by track, album, and artist Signed-off-by: Deluan <[email protected]> * fix(plugins): support uint32 in ndpgen Signed-off-by: Deluan <[email protected]> * fix(plugins): update duration field to use seconds as float instead of milliseconds as uint32 Signed-off-by: Deluan <[email protected]> * fix: add helper functions for Rust's skip_serializing_if with numeric types Signed-off-by: Deluan <[email protected]> * feat(provider): enhance track matching logic to fallback to title match when duration-filtered tracks fail --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
f1e75c40dc |
feat(plugins): add JSONForms-based plugin configuration UI (#4911)
* feat(plugins): add JSONForms schema for plugin configuration Signed-off-by: Deluan <[email protected]> * feat: enhance error handling by formatting validation errors with field names Signed-off-by: Deluan <[email protected]> * feat: enforce required fields in config validation and improve error handling Signed-off-by: Deluan <[email protected]> * format JS code Signed-off-by: Deluan <[email protected]> * feat: add config schema validation and enhance manifest structure Signed-off-by: Deluan <[email protected]> * feat: refactor plugin config parsing and add unit tests Signed-off-by: Deluan <[email protected]> * feat: add config validation error message in Portuguese * feat: enhance AlwaysExpandedArrayLayout with description support and improve array control testing Signed-off-by: Deluan <[email protected]> * feat: update Discord Rust plugin configuration to use JSONForm for user tokens and enhance schema validation Signed-off-by: Deluan <[email protected]> * fix: resolve React Hooks linting issues in plugin UI components * Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * format code Signed-off-by: Deluan <[email protected]> * feat: migrate schema validation to use santhosh-tekuri/jsonschema and improve error formatting Signed-off-by: Deluan <[email protected]> * address PR comments Signed-off-by: Deluan <[email protected]> * fix flaky test Signed-off-by: Deluan <[email protected]> * feat: enhance array layout and configuration handling with AJV defaults Signed-off-by: Deluan <[email protected]> * feat: implement custom tester to exclude enum arrays from AlwaysExpandedArrayLayout Signed-off-by: Deluan <[email protected]> * feat: add error boundary for schema rendering and improve error messages Signed-off-by: Deluan <[email protected]> * feat: refine non-enum array control logic by utilizing JSONForms schema resolution Signed-off-by: Deluan <[email protected]> * feat: add error styling to ToggleEnabledSwitch for disabled state Signed-off-by: Deluan <[email protected]> * feat: adjust label positioning and styling in SchemaConfigEditor for improved layout Signed-off-by: Deluan <[email protected]> * feat: implement outlined input controls renderers to replace custom fragile CSS Signed-off-by: Deluan <[email protected]> * feat: remove margin from last form control inside array items for better spacing Signed-off-by: Deluan <[email protected]> * feat: enhance AJV error handling to transform required errors for field-level validation Signed-off-by: Deluan <[email protected]> * feat: set default value for User Tokens in manifest.json to improve user experience Signed-off-by: Deluan <[email protected]> * format Signed-off-by: Deluan <[email protected]> * feat: add margin to outlined input controls for improved spacing Signed-off-by: Deluan <[email protected]> * feat: remove redundant margin rule for last form control in array items Signed-off-by: Deluan <[email protected]> * feat: adjust font size of label elements in SchemaConfigEditor for improved readability Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> |
||
|
|
03a45753e9 |
feat(plugins): New Plugin System with multi-language PDK support (#4833)
* chore(plugins): remove the old plugins system implementation Signed-off-by: Deluan <[email protected]> * feat(plugins): implement new plugin system with using Extism Signed-off-by: Deluan <[email protected]> * feat(plugins): add capability detection for plugins based on exported functions Signed-off-by: Deluan <[email protected]> * feat(plugins): add auto-reload functionality for plugins with file watcher support Signed-off-by: Deluan <[email protected]> * feat(plugins): add auto-reload functionality for plugins with file watcher support Signed-off-by: Deluan <[email protected]> * refactor(plugins): standardize variable names and remove superfluous wrapper functions Signed-off-by: Deluan <[email protected]> * fix(plugins): improve error handling and logging in plugin manager Signed-off-by: Deluan <[email protected]> * refactor(plugins): implement plugin function call helper and refactor MetadataAgent methods Signed-off-by: Deluan <[email protected]> * fix(plugins): race condition in plugin manager * tests(plugins): change BeforeEach to BeforeAll in MetadataAgent tests Signed-off-by: Deluan <[email protected]> * tests(plugins): optimize tests Signed-off-by: Deluan <[email protected]> * tests(plugins): more optimizations Signed-off-by: Deluan <[email protected]> * test(plugins): ignore goroutine leaks from notify library in tests Signed-off-by: Deluan <[email protected]> * feat(plugins): add Wikimedia plugin for Navidrome to fetch artist metadata Signed-off-by: Deluan <[email protected]> * feat(plugins): enhance plugin logging and set User-Agent header Signed-off-by: Deluan <[email protected]> * feat(plugins): implement scrobbler plugin with authorization and scrobbling capabilities Signed-off-by: Deluan <[email protected]> * feat(plugins): integrate logs Signed-off-by: Deluan <[email protected]> * refactor(plugins): clean up manifest struct and improve plugin loading logic Signed-off-by: Deluan <[email protected]> * feat(plugins): add metadata agent and scrobbler schemas for bootstrapping plugins Signed-off-by: Deluan <[email protected]> * feat(hostgen): add hostgen tool for generating Extism host function wrappers - Implemented hostgen tool to generate wrappers from annotated Go interfaces. - Added command-line flags for input/output directories and package name. - Introduced parsing and code generation logic for host services. - Created test data for various service interfaces and expected generated code. - Added documentation for host services and annotations for code generation. - Implemented SubsonicAPI service with corresponding generated code. * feat(subsonicapi): update Call method to return JSON string response Signed-off-by: Deluan <[email protected]> * feat(plugins): implement SubsonicAPI host function integration with permissions Signed-off-by: Deluan <[email protected]> * fix(generator): error-only methods in response handling Signed-off-by: Deluan <[email protected]> * feat(plugins): generate client wrappers for host functions Signed-off-by: Deluan <[email protected]> * refactor(generator): remove error handling for response.Error in client templates Signed-off-by: Deluan <[email protected]> * feat(scheduler): add Scheduler service interface with host function wrappers for scheduling tasks * feat(plugins): add WASI build constraints to client wrapper templates, to avoid lint errors Signed-off-by: Deluan <[email protected]> * feat(scheduler): implement Scheduler service with one-time and recurring scheduling capabilities Signed-off-by: Deluan <[email protected]> * refactor(manifest): remove unused ConfigPermission from permissions schema Signed-off-by: Deluan <[email protected]> * feat(scheduler): add scheduler callback schema and implementation for plugins Signed-off-by: Deluan <[email protected]> * refactor(scheduler): streamline scheduling logic and remove unused callback tracking Signed-off-by: Deluan <[email protected]> * refactor(scheduler): add Close method for resource cleanup on plugin unload Signed-off-by: Deluan <[email protected]> * docs(scheduler): clarify SchedulerCallback requirement for scheduling functions Signed-off-by: Deluan <[email protected]> * fix: update wasm build rule to include all Go files in the directory Signed-off-by: Deluan <[email protected]> * feat: rewrite the wikimedia plugin using the XTP CLI Signed-off-by: Deluan <[email protected]> * refactor(scheduler): replace uuid with id.NewRandom for schedule ID generation Signed-off-by: Deluan <[email protected]> * refactor: capabilities registration Signed-off-by: Deluan <[email protected]> * test: add scheduler service isolation test for plugin instances Signed-off-by: Deluan <[email protected]> * refactor: update plugin manager initialization and encapsulate logic Signed-off-by: Deluan <[email protected]> * feat: add WebSocket service definitions for plugin communication Signed-off-by: Deluan <[email protected]> * feat: implement WebSocket service for plugin integration and connection management Signed-off-by: Deluan <[email protected]> * feat: add Crypto Ticker example plugin for real-time cryptocurrency price updates via Coinbase WebSocket API Also add the lifecycle capability Signed-off-by: Deluan <[email protected]> * fix: use context.Background() in invokeCallback for scheduled tasks Signed-off-by: Deluan <[email protected]> * refactor: rename plugin.create() to plugin.instance() Signed-off-by: Deluan <[email protected]> * refactor: rename pluginInstance to plugin for consistency across the codebase Signed-off-by: Deluan <[email protected]> * refactor: simplify schedule cloning in Close method and enhance plugin cleanup error handling Signed-off-by: Deluan <[email protected]> * feat: implement Artwork service for generating artwork URLs in Navidrome plugins - WIP Signed-off-by: Deluan <[email protected]> * refactor: moved public URL builders to avoid import cycles Signed-off-by: Deluan <[email protected]> * feat: add Cache service for in-memory TTL-based caching in plugins Signed-off-by: Deluan <[email protected]> * feat: add Discord Rich Presence example plugin for Navidrome integration Signed-off-by: Deluan <[email protected]> * refactor: host function wrappers to use structured request and response types - Updated the host function signatures in `nd_host_artwork.go`, `nd_host_scheduler.go`, `nd_host_subsonicapi.go`, and `nd_host_websocket.go` to accept a single parameter for JSON requests. - Introduced structured request and response types for various cache operations in `nd_host_cache.go`. - Modified cache functions to marshal requests to JSON and unmarshal responses, improving error handling and code clarity. - Removed redundant memory allocation for string parameters in favor of JSON marshaling. - Enhanced error handling in WebSocket and cache operations to return structured error responses. * refactor: error handling in various plugins to convert response.Error to Go errors - Updated error handling in `nd_host_scheduler.go`, `nd_host_websocket.go`, `nd_host_artwork.go`, `nd_host_cache.go`, and `nd_host_subsonicapi.go` to convert string errors from responses into Go errors. - Removed redundant error checks in test data plugins for cleaner code. - Ensured consistent error handling across all plugins to improve reliability and maintainability. * refactor: rename fake plugins to test plugins for clarity in integration tests Signed-off-by: Deluan <[email protected]> * feat: add help target to Makefile for plugin usage instructions Signed-off-by: Deluan <[email protected]> * feat: add Cover Art Archive plugin as an example of Python plugin Signed-off-by: Deluan <[email protected]> * feat: update Makefile and README to clarify Go plugin usage Signed-off-by: Deluan <[email protected]> * feat: include plugin capabilities in loading log message Signed-off-by: Deluan <[email protected]> * feat: add trace logging for plugin availability and error handling in agents Signed-off-by: Deluan <[email protected]> * feat: add Now Playing Logger plugin to showcase calling host functions from Python plugins Signed-off-by: Deluan <[email protected]> * feat: generate Python client wrappers for various host services Signed-off-by: Deluan <[email protected]> * feat: add generated host function wrappers for Scheduler and SubsonicAPI services Signed-off-by: Deluan <[email protected]> * feat: update Python plugin documentation and usage instructions for host function wrappers Signed-off-by: Deluan <[email protected]> * feat: add Webhook Scrobbler plugin in Rust to send HTTP notifications on scrobble events Signed-off-by: Deluan <[email protected]> * feat: enable parallel loading of plugins during startup Signed-off-by: Deluan <[email protected]> * docs: update README to include WebSocket callback schema in plugin documentation Signed-off-by: Deluan <[email protected]> * feat: extend plugin watcher with improved logging and debounce duration adjustment Signed-off-by: Deluan <[email protected]> * add trace message for plugin recompiles Signed-off-by: Deluan <[email protected]> * feat: implement plugin cache purging functionality Signed-off-by: Deluan <[email protected]> * test: move purgeCacheBySize unit tests Signed-off-by: Deluan <[email protected]> * feat(plugins UI): add plugin repository and database support Signed-off-by: Deluan <[email protected]> * feat(plugins UI): add plugin management routes and middleware Signed-off-by: Deluan <[email protected]> * feat(plugins UI): implement plugin synchronization with database for add, update, and remove actions Signed-off-by: Deluan <[email protected]> * feat(plugins UI): add PluginList and PluginShow components with plugin management functionality Signed-off-by: Deluan <[email protected]> * feat(plugins): optimize plugin change detection Signed-off-by: Deluan <[email protected]> * refactor(plugins UI): improve PluginList structure Signed-off-by: Deluan <[email protected]> * feat(plugins UI): enhance PluginShow with author, website, and permissions display Signed-off-by: Deluan <[email protected]> * feat(plugins UI): refactor to use MUI and RA components Signed-off-by: Deluan <[email protected]> * feat(plugins UI): add error handling for plugin enable/disable actions Signed-off-by: Deluan <[email protected]> * refactor(plugins): inject PluginManager into native API Signed-off-by: Deluan <[email protected]> * refactor(plugins): update GetManager to accept DataStore parameter Signed-off-by: Deluan <[email protected]> * feat(plugins): add subsonicRouter to Manager and refactor host service registration Signed-off-by: Deluan <[email protected]> * refactor(plugins): enhance debug logging for plugin actions and recompile logic Signed-off-by: Deluan <[email protected]> * refactor(plugins): break manager.go into smaller, focused files Signed-off-by: Deluan <[email protected]> * refactor(plugins): streamline error handling and improve plugin retrieval logic Signed-off-by: Deluan <[email protected]> * refactor(plugins): update newWebSocketService to use WebSocketPermission for allowed hosts Signed-off-by: Deluan <[email protected]> * refactor(plugins): introduce ToggleEnabledSwitch for managing plugin enable/disable state Signed-off-by: Deluan <[email protected]> * docs: update READMEs Signed-off-by: Deluan <[email protected]> * feat(library): add Library service for metadata access and filesystem integration Signed-off-by: Deluan <[email protected]> * feat(plugins): add Library Inspector plugin for periodic library inspection and file size logging Signed-off-by: Deluan <[email protected]> * docs: update README to reflect JSON configuration format for plugins Signed-off-by: Deluan <[email protected]> * fix(build): update target to wasm32-wasip1 for improved WASI support Signed-off-by: Deluan <[email protected]> * feat(plugins): implement configuration management UI with key-value pairs support Signed-off-by: Deluan <[email protected]> * feat(ui): adjust grid layout in InfoRow component for improved responsiveness Signed-off-by: Deluan <[email protected]> * feat(plugins): rename ErrorIndicator to EnabledOrErrorField and enhance error handling logic Signed-off-by: Deluan <[email protected]> * feat(i18n): add Portuguese translations for plugin management and notifications Signed-off-by: Deluan <[email protected]> * feat(plugins): add support for .ndp plugin packages and update build process Signed-off-by: Deluan <[email protected]> * docs: update README for .ndp plugin packaging and installation instructions Signed-off-by: Deluan <[email protected]> * feat(plugins): implement KVStore service for persistent key-value storage Signed-off-by: Deluan <[email protected]> * docs: enhance README with Extism plugin development resources and recommendations Signed-off-by: Deluan <[email protected]> * feat(plugins): integrate event broker into plugin manager Signed-off-by: Deluan <[email protected]> * feat(plugins): update config handling in PluginShow to track last record state Signed-off-by: Deluan <[email protected]> * feat(plugins): add Rust host function library and example implementation of Discord Rich Presence plugin in Rust Signed-off-by: Deluan <[email protected]> * feat(plugins): generate Rust lib.rs file to expose host function wrappers Signed-off-by: Deluan <[email protected]> * refactor(plugins): update JSON field names to camelCase for consistency Signed-off-by: Deluan <[email protected]> * refactor: reduce cyclomatic complexity by refactoring main function Signed-off-by: Deluan <[email protected]> * feat(plugins): enhance Rust code generation with typed struct support and improved type handling Signed-off-by: Deluan <[email protected]> * feat(plugins): add Go client library with host function wrappers and documentation Signed-off-by: Deluan <[email protected]> * feat(plugins): generate Go client stubs for non-WASM platforms Signed-off-by: Deluan <[email protected]> * feat(plugins): update client template file names for consistency Signed-off-by: Deluan <[email protected]> * feat(plugins): add initial implementation of the Navidrome Plugin Development Kit code generator - Pahse 1 Signed-off-by: Deluan <[email protected]> * feat(plugins): implementation of the Navidrome Plugin Development Kit with generated client wrappers and service interfaces - Phase 2 Signed-off-by: Deluan <[email protected]> * feat(plugins): implementation of the Navidrome Plugin Development Kit with generated client wrappers and service interfaces - Phase 2 (2) Signed-off-by: Deluan <[email protected]> * feat(plugins): implementation of the Navidrome Plugin Development Kit with generated client wrappers and service interfaces - Phase 3 Signed-off-by: Deluan <[email protected]> * feat(plugins): implementation of the Navidrome Plugin Development Kit with generated client wrappers and service interfaces - Phase 4 Signed-off-by: Deluan <[email protected]> * feat(plugins): implementation of the Navidrome Plugin Development Kit with generated client wrappers and service interfaces - Phase 5 Signed-off-by: Deluan <[email protected]> * refactor(plugins): consistent naming/types across PDK Signed-off-by: Deluan <[email protected]> * refactor(plugins): streamline plugin function signatures and error handling Signed-off-by: Deluan <[email protected]> * refactor(plugins): update scrobbler interface to return errors directly instead of response structs Signed-off-by: Deluan <[email protected]> * test: make all test plugins use the PDK Signed-off-by: Deluan <[email protected]> * refactor(plugins): reorganize and sort type definitions for consistency Signed-off-by: Deluan <[email protected]> * refactor(plugins): update error handling for methods to return errors directly Signed-off-by: Deluan <[email protected]> * refactor(plugins): update function signatures to return values directly instead of response structs Signed-off-by: Deluan <[email protected]> * refactor(plugins): update request/response types to use private naming conventions Signed-off-by: Deluan <[email protected]> * build: mark .wasm files as intermediate for cleanup after building .ndp Signed-off-by: Deluan <[email protected]> * refactor(plugins): consolidate PDK module path and update Go version to 1.25 Signed-off-by: Deluan <[email protected]> * feat: implement Rust PDK Signed-off-by: Deluan <[email protected]> * refactor(plugins): reorganize Rust output structure to follow standard conventions Signed-off-by: Deluan <[email protected]> * refactor(plugins): update Discord Rich Presence and Library Inspector plugins to use nd-pdk for service calls and implement lifecycle management Signed-off-by: Deluan <[email protected]> * refactor(plugins): update macro names for websocket and metadata registration to improve clarity and consistency Signed-off-by: Deluan <[email protected]> * refactor(plugins): rename scheduler callback methods for consistency and clarity Signed-off-by: Deluan <[email protected]> * refactor(plugins): update export wrappers to use `//go:wasmexport` for WebAssembly compatibility Signed-off-by: Deluan <[email protected]> * docs: update plugin registration docs Signed-off-by: Deluan <[email protected]> * fix(plugins): generate host wrappers Signed-off-by: Deluan <[email protected]> * test(plugins): conditionally run goleak checks based on CI environment Signed-off-by: Deluan <[email protected]> * docs: update README to reflect changes in plugin import paths Signed-off-by: Deluan <[email protected]> * refactor(plugins): update plugin instance creation to accept context for cancellation support Signed-off-by: Deluan <[email protected]> * fix(plugins): update return types in metadata interfaces to use pointers Signed-off-by: Deluan <[email protected]> * fix(plugins): enhance type handling for Rust and XTP output in capability generation Signed-off-by: Deluan <[email protected]> * fix(plugins): update IsAuthorized method to return boolean instead of response object Signed-off-by: Deluan <[email protected]> * test(plugins): add unit tests for rustOutputType and isPrimitiveRustType functions Signed-off-by: Deluan <[email protected]> * feat(plugins): implement XTP JSONSchema validation for generated schemas Signed-off-by: Deluan <[email protected]> * fix(plugins): update response types in testMetadataAgent methods to use pointers Signed-off-by: Deluan <[email protected]> * docs: update Go and Rust plugin developer sections for clarity Signed-off-by: Deluan <[email protected]> * docs: correct example link for library inspector in README Signed-off-by: Deluan <[email protected]> * docs: clarify artwork URL generation capabilities in service descriptions Signed-off-by: Deluan <[email protected]> * docs: update README to include Rust PDK crate information for plugin developers Signed-off-by: Deluan <[email protected]> * fix: handle URL parsing errors and use atomic upsert in plugin repository Added proper error handling for url.Parse calls in PublicURL and AbsoluteURL functions. When parsing fails, PublicURL now falls back to AbsoluteURL, and AbsoluteURL logs the error and returns an empty string, preventing malformed URLs from being generated. Replaced the non-atomic UPDATE-then-INSERT pattern in plugin repository Put method with a single atomic INSERT ... ON CONFLICT statement. This eliminates potential race conditions and improves consistency with the upsert pattern already used in host_kvstore.go. * feat: implement mock service instances for non-WASM builds using testify/mock Signed-off-by: Deluan <[email protected]> * refactor: Discord RPC struct to encapsulate WebSocket logic Signed-off-by: Deluan <[email protected]> * feat: add support for experimental WebAssembly threads Signed-off-by: Deluan <[email protected]> * feat: add PDK abstraction layer with mock support for non-WASM builds Signed-off-by: Deluan <[email protected]> * feat: add unit tests for Discord plugin and RPC functionality Signed-off-by: Deluan <[email protected]> * fix: update return types in minimalPlugin and wikimediaPlugin methods to use pointers Signed-off-by: Deluan <[email protected]> * fix: context cancellation and implement WebSocket callback timeout for improved error handling Signed-off-by: Deluan <[email protected]> * feat: conditionally include error handling in generated client code templates Signed-off-by: Deluan <[email protected]> * feat: implement ConfigService for plugin configuration management Signed-off-by: Deluan <[email protected]> * feat: enhance plugin manager to support metrics recording Signed-off-by: Deluan <[email protected]> * refactor: make MockPDK private Signed-off-by: Deluan <[email protected]> * refactor: update interface types to use 'any' in plugin repository methods Signed-off-by: Deluan <[email protected]> * refactor: rename List method to Keys for clarity in configuration management Signed-off-by: Deluan <[email protected]> * test: add ndpgen plugin tests in the pipeline and update Makefile Signed-off-by: Deluan <[email protected]> * feat: add users permission management to plugin system Signed-off-by: Deluan <[email protected]> * refactor: streamline users integration tests and enhance plugin user management Signed-off-by: Deluan <[email protected]> * refactor: remove UserID from scrobbler request structure Signed-off-by: Deluan <[email protected]> * test: add integration tests for UsersService enable gate behavior Signed-off-by: Deluan <[email protected]> * feat: implement user permissions for SubsonicAPI and scrobbler plugins Signed-off-by: Deluan <[email protected]> * fix: show proper error in the UI when enabling a plugin fails Signed-off-by: Deluan <[email protected]> * feat: add library permission management to plugin system Signed-off-by: Deluan <[email protected]> * feat: add user permission for processing scrobbles in Discord Rich Presence plugin Signed-off-by: Deluan <[email protected]> * fix: implement dynamic loading for buffered scrobbler plugins Signed-off-by: Deluan <[email protected]> * feat: add GetAdmins method to retrieve admin users from the plugin Signed-off-by: Deluan <[email protected]> * feat: update Portuguese translations for user and library permissions Signed-off-by: Deluan <[email protected]> * reorder migrations Signed-off-by: Deluan <[email protected]> * fix: remove unnecessary bulkActionButtons prop from PluginList component * feat: add manual plugin rescan functionality and corresponding UI action Signed-off-by: Deluan <[email protected]> * feat: implement user/library and plugin management integration with cleanup on deletion Signed-off-by: Deluan <[email protected]> * feat: replace core mock services with test-specific implementations to avoid import cycles * feat: add ID fields to Artist and Song structs and enhance track loading logic by prioritizing ID matches Signed-off-by: Deluan <[email protected]> * feat: update plugin permissions from allowedHosts to requiredHosts for better clarity and consistency * feat: refactor plugin host permissions to use RequiredHosts directly for improved clarity * fix: don't record metrics for plugin calls that aren't implemented at all Signed-off-by: Deluan <[email protected]> * fix: enhance connection management with improved error handling and cleanup logic Signed-off-by: Deluan <[email protected]> * feat: introduce ArtistRef struct for better artist representation and update track metadata handling Signed-off-by: Deluan <[email protected]> * feat: update user configuration handling to use user key prefix for improved clarity Signed-off-by: Deluan <[email protected]> * feat: enhance ConfigCard input fields with multiline support and vertical resizing Signed-off-by: Deluan <[email protected]> * fix: rust plugin compilation error Signed-off-by: Deluan <[email protected]> * feat: implement IsOptionPattern method for better return type handling in Rust PDK generation Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
66eaac2762 |
fix(plugins): add metrics on callbacks and improve plugin method calling (#4304)
* refactor: implement OnSchedulerCallback method in wasmSchedulerCallback Added the OnSchedulerCallback method to the wasmSchedulerCallback struct, enabling it to handle scheduler callback events. This method constructs a SchedulerCallbackRequest and invokes the corresponding plugin method, facilitating better integration with the scheduling system. The changes improve the plugin's ability to respond to scheduled events, enhancing overall functionality. Signed-off-by: Deluan <[email protected]> * fix(plugins): update executeCallback method to use callMethod Modified the executeCallback method to accept an additional parameter, methodName, which specifies the callback method to be executed. This change ensures that the correct method is called for each WebSocket event, improving the accuracy of callback execution for plugins. Signed-off-by: Deluan <[email protected]> * fix(plugins): capture OnInit metrics Signed-off-by: Deluan <[email protected]> * fix(plugins): improve logging for metrics in callMethod Updated the logging statement in the callMethod function to include the elapsed time as a separate key in the log output. This change enhances the clarity of the logged metrics, making it easier to analyze the performance of plugin requests and troubleshoot any issues that may arise. Signed-off-by: Deluan <[email protected]> * fix(plugins): enhance logging for schedule callback execution Signed-off-by: Deluan <[email protected]> * refactor(server): streamline scrobbler stopping logic Refactored the logic for stopping scrobbler instances when they are removed. The new implementation introduces a `stoppableScrobbler` interface to simplify the type assertion process, allowing for a more concise and readable code structure. This change ensures that any scrobbler implementing the `Stop` method is properly stopped before removal, improving the overall reliability of the plugin management system. Signed-off-by: Deluan <[email protected]> * fix(plugins): improve plugin lifecycle management and error handling Enhanced the plugin lifecycle management by implementing error handling in the OnInit method. The changes include the addition of specific error conditions that can be returned during plugin initialization, allowing for better management of plugin states. Additionally, the unregisterPlugin method was updated to ensure proper cleanup of plugins that fail to initialize, improving overall stability and reliability of the plugin system. Signed-off-by: Deluan <[email protected]> * refactor(plugins): remove unused LoadAllPlugins and related methods Eliminated the LoadAllPlugins, LoadAllMediaAgents, and LoadAllScrobblers methods from the manager implementation as they were not utilized in the codebase. This cleanup reduces complexity and improves maintainability by removing redundant code, allowing for a more streamlined plugin management process. Signed-off-by: Deluan <[email protected]> * fix(plugins): update logging configuration for plugins Configured logging for multiple plugins to remove timestamps and source file/line information, while adding specific prefixes for better identification. Signed-off-by: Deluan <[email protected]> * fix(plugins): clear initialization state when unregistering a plugin Added functionality to clear the initialization state of a plugin in the lifecycle manager when it is unregistered. This change ensures that the lifecycle state is accurately maintained, preventing potential issues with plugins that may be re-registered after being unregistered. The new method `clearInitialized` was implemented to handle this state management. Signed-off-by: Deluan <[email protected]> * test: add unit tests for convertError function, rename to checkErr Added comprehensive unit tests for the convertError function to ensure correct behavior across various scenarios, including handling nil responses, typed nils, and responses implementing errorResponse. These tests validate that the function returns the expected results without panicking and correctly wraps original errors when necessary. Signed-off-by: Deluan <[email protected]> * fix(plugins): update plugin base implementation and method calls Refactored the plugin base implementation by renaming `wasmBasePlugin` to `baseCapability` across multiple files. Updated method calls in the `wasmMediaAgent`, `wasmSchedulerCallback`, and `wasmScrobblerPlugin` to align with the new base structure. These changes improve code clarity and maintainability by standardizing the plugin architecture, ensuring consistent usage of the base capabilities across different plugin types. Signed-off-by: Deluan <[email protected]> * fix(discord): handle failed connections and improve heartbeat checks Added a new method to clean up failed connections, which cancels the heartbeat schedule, closes the WebSocket connection, and removes cache entries. Enhanced the heartbeat check to log failures and trigger the cleanup process on the first failure. These changes ensure better management of user connections and improve the overall reliability of the RPC system. Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> |
||
|
|
f1fc2cd9b9 |
feat(plugins): experimental support for plugins (#3998)
* feat(plugins): add minimal test agent plugin with API definitions Signed-off-by: Deluan <[email protected]> * feat: add plugin manager with auto-registration and unique agent names Introduced a plugin manager that scans the plugins folder for subdirectories containing plugin.wasm files and auto-registers them as agents using the directory name as the unique agent name. Updated the configuration to support plugins with enabled/folder options, and ensured the plugin manager is started as a concurrent task during server startup. The wasmAgent now returns the plugin directory name for AgentName, ensuring each plugin agent is uniquely identifiable. This enables dynamic plugin discovery and integration with the agents orchestrator. * test: add Ginkgo suite and test for plugin manager auto-registration Added a Ginkgo v2 suite bootstrap (plugins_suite_test.go) for the plugins package and a test (manager_test.go) to verify that plugins in the testdata folder are auto-registered and can be loaded as agents. The test uses a mock DataStore and asserts that the agent is registered and its AgentName matches the plugin directory. Updated go.mod and go.sum for wazero dependency required by plugin WASM support. * test(plugins): ensure test WASM plugin is always freshly built before running suite; add real-plugin Ginkgo tests. Add BeforeSuite to plugins suite to build plugins/testdata/agent/plugin.wasm using Go WASI build command, matching README instructions. Remove plugin.wasm before build to guarantee a clean build. Add full real-plugin Ginkgo/Gomega tests for wasmAgent, covering all methods and error cases. Fix manager_test.go to use pointer to Manager. This ensures plugin tests are always run against a freshly compiled WASM binary, increasing reliability and reproducibility. Signed-off-by: Deluan <[email protected]> * feat(plugins): implement persistent compilation cache for WASM agent plugins Signed-off-by: Deluan <[email protected]> * feat(plugins): implement instance pooling for wasmAgent to improve resource management Signed-off-by: Deluan <[email protected]> * feat(plugins): enhance logging for wasmAgent and plugin manager operations Signed-off-by: Deluan <[email protected]> * feat(plugins): implement HttpService for handling HTTP requests in WASM plugins Also add a sample Wikimedia plugin Signed-off-by: Deluan <[email protected]> * feat(plugins): standardize error handling in wasmAgent and MinimalAgent Signed-off-by: Deluan <[email protected]> * refactor: clean up wikimedia plugin code Standardized error creation using 'errors.New' where formatting was not needed. Introduced a constant for HTTP request timeouts. Removed commented-out log statement. Improved code comments for clarity and accuracy. * refactor: use unified SPARQLResult struct and parser for SPARQL responses Introduced a single SPARQLResult struct to represent all possible SPARQL response fields (sitelink, wiki, comment, img). Added a parseSPARQLResult helper to unmarshal and check for empty results, simplifying all fetch functions and improving type safety and maintainability. * feat(plugins): improve error handling in HTTP request processing Signed-off-by: Deluan <[email protected]> * fix: background plugin compilation, logging, and race safety Implemented background WASM plugin compilation with concurrency limits, proper closure capture, and global compilation cache to avoid data races. Added debug and warning logs for plugin compilation results, including elapsed time. Ensured plugin registration is correct and all tests pass. * perf: implement true lazy loading for agents Changed agent instantiation to be fully lazy. The Agents struct now stores agent names in order and only instantiates each agent on first use, caching the result. This preserves agent call order, improves server startup time, and ensures thread safety. Updated all agent methods and tests to use the new pattern. No changes to agent registration or interface. All tests pass. * fix: ensure wasm plugin instances are closed via runtime.AddCleanup Introduced runtime.AddCleanup to guarantee that the Close method of WASM plugin instances is called, even if they are garbage collected from the sync.Pool. Modified the sync.Pool.New function in manager.go to register a cleanup function for each loaded instance that implements Close. Updated agent.go to handle the pooledInstance wrapper containing the instance and its cleanup handle. Ensured cleanup.Stop() is called before explicitly closing an instance (on error or agent shutdown) to prevent double closing. This fixes a potential resource leak where instances could be GC'd from the pool without proper cleanup. * refactor: break down long functions in plugin manager and agent Refactored plugins/manager.go and plugins/agent.go to improve readability and reduce function length. Extracted pool initialization logic into newPluginPool and background compilation/agent factory logic into precompilePlugin/createAgentFactory in manager.go. Extracted pool retrieval/validation and cleanup function creation into getValidPooledInstance/createPoolCleanupFunc in agent.go. Signed-off-by: Deluan <[email protected]> * refactor(plugins): rename wasmAgent to wasmArtistAgent Signed-off-by: Deluan <[email protected]> * feat(api): add AlbumMetadataService with AlbumInfo and AlbumImages requests Signed-off-by: Deluan <[email protected]> * refactor(plugin): rename MinimalAgent for artist metadata service Signed-off-by: Deluan <[email protected]> * feat(api): implement wasmAlbumAgent for album metadata service with GetAlbumInfo and GetAlbumImages methods Signed-off-by: Deluan <[email protected]> * refactor(plugins): simplify wasmAlbumAgent and wasmArtistAgent by using wasmBasePlugin Signed-off-by: Deluan <[email protected]> * feat(plugins): add support for ArtistMetadataService and AlbumMetadataService in plugin manager Signed-off-by: Deluan <[email protected]> * feat(plugins): enhance plugin pool creation with custom runtime and precompilation support Signed-off-by: Deluan <[email protected]> * refactor(plugins): implement generic plugin pool and agent factory for improved service handling Signed-off-by: Deluan <[email protected]> * refactor(plugins): reorganize plugin management Signed-off-by: Deluan <[email protected]> * refactor(plugins): improve function signatures for clarity and consistency Signed-off-by: Deluan <[email protected]> * feat(plugins): implement background precompilation for plugins and agent factory creation Signed-off-by: Deluan <[email protected]> * refactor(plugins): include instanceID in logging for better traceability Signed-off-by: Deluan <[email protected]> * test(plugins): add tests for plugin pre-compilation and agent factory synchronization Signed-off-by: Deluan <[email protected]> * feat(plugins): add minimal album test agent plugin for AlbumMetadataService Signed-off-by: Deluan <[email protected]> * feat(plugins): rename fake artist and album test agent plugins for metadata services Signed-off-by: Deluan <[email protected]> * feat(makefile): add Makefile for building plugin WASM binaries Signed-off-by: Deluan <[email protected]> * feat(plugins): add FakeMultiAgent plugin implementing Artist and Album metadata services Signed-off-by: Deluan <[email protected]> * refactor(plugins): remove log statements from FakeArtistAgent and FakeMultiAgent methods Signed-off-by: Deluan <[email protected]> * refactor: split AlbumInfoRetriever and AlbumImageRetriever, update all usages Split the AlbumInfoRetriever interface into two: AlbumInfoRetriever (for album metadata) and AlbumImageRetriever (for album images), to better separate concerns and simplify implementations. Updated all agents, providers, plugins, and tests to use the new interfaces and methods. Removed the now-unnecessary mockAlbumAgents in favor of the shared mockAgents. Fixed a missing images slice declaration in lastfm agent. All tests pass except for known ignored persistence tests. This change reduces code duplication, improves clarity, and keeps the codebase clean and organized. * feat(plugins): add Cover Art Archive AlbumMetadataService plugin for album cover images Signed-off-by: Deluan <[email protected]> * refactor: remove wasm module pooling it was causing issues with the GC and the Close methods Signed-off-by: Deluan <[email protected]> * refactor: rename metadata service files to adapter naming convention Signed-off-by: Deluan <[email protected]> * refactor: unify album and artist method calls by introducing callMethod function Signed-off-by: Deluan <[email protected]> * refactor: unify album and artist method calls by introducing callMethod function Signed-off-by: Deluan <[email protected]> * fix: handle nil values in data redaction process Signed-off-by: Deluan <[email protected]> * fix: add timeout for plugin compilation to prevent indefinite blocking Signed-off-by: Deluan <[email protected]> * feat: implement ScrobblerService plugin with authorization and scrobbling capabilities Signed-off-by: Deluan <[email protected]> * refactor: simplify generalization Signed-off-by: Deluan <[email protected]> * fix: tests Signed-off-by: Deluan <[email protected]> * refactor: enhance plugin management by improving scanning and loading mechanisms Signed-off-by: Deluan <[email protected]> * refactor: update plugin creation functions to return specific interfaces for better type safety Signed-off-by: Deluan <[email protected]> * refactor: enhance wasmBasePlugin to support specific plugin types for improved type safety Signed-off-by: Deluan <[email protected]> * refactor: implement MediaMetadataService with combined artist and album methods Signed-off-by: Deluan <[email protected]> * refactor: improve MediaMetadataService plugin implementation and testing structure Signed-off-by: Deluan <[email protected]> * refactor: add tests for Adapter Media Agent and improve plugin documentation Signed-off-by: Deluan <[email protected]> * docs: add README for Navidrome Plugin System with detailed architecture and usage guidelines Signed-off-by: Deluan <[email protected]> * refactor: enhance agent management with plugin loading and caching Signed-off-by: Deluan <[email protected]> * refactor: update agent discovery logic to include only local agent when no config is specified Signed-off-by: Deluan <[email protected]> * refactor: encapsulate agent caching logic in agentCache struct\n\nReplaced direct map/mutex usage for agent caching in Agents with a dedicated agentCache struct. This improves readability, maintainability, and testability by centralizing TTL and concurrency logic. Cleaned up comments and ensured all linter and test requirements are met. Signed-off-by: Deluan <[email protected]> * fix: correct file extension filter in goimports command Signed-off-by: Deluan <[email protected]> * refactor: use defer to unlock the mutex Signed-off-by: Deluan <[email protected]> * chore: move Cover Art Archive AlbumMetadataService plugins to an example folder Signed-off-by: Deluan <[email protected]> * fix: handle errors when creating media metadata and scrobbler service plugins Signed-off-by: Deluan <[email protected]> * fix: increase compilation timeout to one minute Signed-off-by: Deluan <[email protected]> * feat: add configurable plugin compilation timeout Signed-off-by: Deluan <[email protected]> * feat: implement plugin scrobbler support in PlayTracker Signed-off-by: Deluan <[email protected]> * feat: add context management and Stop method to buffered scrobbler Signed-off-by: Deluan <[email protected]> * feat: add username field to scrobbler requests and update logging Signed-off-by: Deluan <[email protected]> * fix: data race in test Signed-off-by: Deluan <[email protected]> * refactor: rename http proto files to host and update references Signed-off-by: Deluan <[email protected]> * refactor: remove unused plugin registration methods from manager Signed-off-by: Deluan <[email protected]> * feat: extend plugin manifests and implement plugin management commands Signed-off-by: Deluan <[email protected]> * Update utils/files.go Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * fix for code scanning alert no. 43: Arbitrary file access during archive extraction ("Zip Slip") Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * feat: add plugin dev workflow support Added new CLI commands to improve plugin development workflow: 'plugin dev' to create symlinks from development directories to plugins folder, 'plugin refresh' to reload plugins without restarting Navidrome, enhanced 'plugin remove' to handle symlinked development plugins correctly, and updated 'plugin list' to display development plugins with '(dev)' indicator. These changes make the plugin development workflow more efficient by allowing developers to work on plugins in their own directories, link them to Navidrome without copying files, refresh plugins after changes without restart, and clean up safely. Signed-off-by: Deluan <[email protected]> * feat(plugins): implement timer service with register and cancel functionality - WIP Signed-off-by: Deluan <[email protected]> * feat(plugins): implement timer service with register and cancel functionality - WIP Signed-off-by: Deluan <[email protected]> * feat(plugins): implement timer service with register and cancel functionality - WIP Signed-off-by: Deluan <[email protected]> * feat(plugins): implement timer service with register and cancel functionality Signed-off-by: Deluan <[email protected]> * fix: lint errors Signed-off-by: Deluan <[email protected]> * feat(README): update documentation to include TimerCallbackService and its functionality Signed-off-by: Deluan <[email protected]> * feat(plugins): add InitService with OnInit method and initialization tracking - WIP Signed-off-by: Deluan <[email protected]> * feat(plugins): add tests for InitService and plugin initialization tracking Signed-off-by: Deluan <[email protected]> * feat(plugins): expand documentation on plugin system implementation and architecture Signed-off-by: Deluan <[email protected]> * fix: panic Signed-off-by: Deluan <[email protected]> * feat(plugins): redirect plugins' stderr to logs Signed-off-by: Deluan <[email protected]> * feat(plugins): add safe accessor methods for TimerService Signed-off-by: Deluan <[email protected]> * feat(plugins): add plugin-specific configuration support in InitRequest and documentation Signed-off-by: Deluan <[email protected]> * feat(plugins): add TimerCallbackService plugin adapter and integration Signed-off-by: Deluan <[email protected]> * refactor(plugins): rename services for consistency and clarity Signed-off-by: Deluan <[email protected]> * feat(plugins): add mutex for configuration access and clone plugin config Signed-off-by: Deluan <[email protected]> * refactor(tests): remove configtest dependency to prevent data races in integration tests Signed-off-by: Deluan <[email protected]> * refactor(plugins): remove PluginName method from WASM plugin implementations and update LoadPlugin to accept service type Signed-off-by: Deluan <[email protected]> * feat(plugins): implement instance pooling for wasmBasePlugin to improve performance - WIP Signed-off-by: Deluan <[email protected]> * feat(plugins): add wasmInstancePool for managing WASM plugin instances with TTL and max size Signed-off-by: Deluan <[email protected]> * fix(plugins): correctly pass error to done function in wasmBasePlugin Signed-off-by: Deluan <[email protected]> * refactor(plugins): rename service types to capabilities for consistency Signed-off-by: Deluan <[email protected]> * refactor(plugins): simplify instance management in wasmBasePlugin by removing error handling in closure Signed-off-by: Deluan <[email protected]> * refactor(plugins): update wasmBasePlugin and wasmInstancePool to return errors for better error handling Signed-off-by: Deluan <[email protected]> * refactor(plugins): rename InitService to LifecycleManagement for consistency Signed-off-by: Deluan <[email protected]> * refactor(plugins): fix instance ID logging in wasmBasePlugin Signed-off-by: Deluan <[email protected]> * refactor(plugins): extract instance ID logging to a separate function in wasmBasePlugin, to avoid vet error Signed-off-by: Deluan <[email protected]> * refactor(plugins): make timers be isolated per plugin Signed-off-by: Deluan <[email protected]> * refactor(plugins): make timers be isolated per plugin Signed-off-by: Deluan <[email protected]> * refactor(plugins): rename HttpServiceImpl to httpServiceImpl for consistency and improve logging Signed-off-by: Deluan <[email protected]> * feat(plugins): add config service for plugin-specific configuration management Signed-off-by: Deluan <[email protected]> * Update plugins/manager.go Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * Update plugins/manager.go Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * feat(crontab): implement crontab service for scheduling and canceling jobs Signed-off-by: Deluan <[email protected]> * fix(singleton): fix deadlock issue when a constructor calls GetSingleton again Signed-off-by: Deluan <[email protected]> (+1 squashed commit) Squashed commits: [325a96ea2] fix(singleton): fix deadlock issue when a constructor calls GetSingleton again Signed-off-by: Deluan <[email protected]> * feat(scheduler): implement Scheduler for one-time and recurring job scheduling, merging CrontabService and TimerService Signed-off-by: Deluan <[email protected]> * fix(scheduler): race condition in the scheduleOneTime and scheduleRecurring methods when replacing jobs with the same ID Signed-off-by: Deluan <[email protected]> * refactor(scheduler): consolidate job scheduling logic into a single helper function Signed-off-by: Deluan <[email protected]> * refactor(plugin): rename GetInstance method to Instantiate for clarity Signed-off-by: Deluan <[email protected]> * feat(plugins): add WebSocket service for handling connections and messages Signed-off-by: Deluan <[email protected]> * feat(crypto-ticker): add WebSocket plugin for real-time cryptocurrency price tracking Signed-off-by: Deluan <[email protected]> * feat(websocket): enhance connection management and callback handling Signed-off-by: Deluan <[email protected]> * feat(manager): only create one adapter instance for each adapter/capability pair Signed-off-by: Deluan <[email protected]> * fix(websocket): ensure proper resource management by closing response body and use defer to unlocking mutexes Signed-off-by: Deluan <[email protected]> * fix: flaky test Signed-off-by: Deluan <[email protected]> * feat(plugin): refactor WebSocket service integration and improve error logging Signed-off-by: Deluan <[email protected]> * feat(plugin): add SchedulerCallback support and improve reconnection logic Signed-off-by: Deluan <[email protected]> * fix: test panic Signed-off-by: Deluan <[email protected]> * docs: add crypto-ticker plugin example to README Signed-off-by: Deluan <[email protected]> * feat(manager): add LoadAllPlugins and LoadAllMediaAgents methods with slice.Map integration Signed-off-by: Deluan <[email protected]> * feat(api): add Timestamp field to ScrobblerNowPlayingRequest and update related methods Signed-off-by: Deluan <[email protected]> * feat(websocket): add error field to response messages for better error handling Signed-off-by: Deluan <[email protected]> * feat(cache): implement CacheService with string, int, float, and byte operations Signed-off-by: Deluan <[email protected]> * feat(tests): update buffered scrobbler tests for improved scrobble verification and use RWMutex in mock repo Signed-off-by: Deluan <[email protected]> * refactor(cache): simplify cache service implementation and remove unnecessary synchronization Signed-off-by: Deluan <[email protected]> * feat(tests): add build step for test plugins in the test suite Signed-off-by: Deluan <[email protected]> * wip Signed-off-by: Deluan <[email protected]> * feat(scheduler): implement named scheduler callbacks and enhance Discord plugin integration Signed-off-by: Deluan <[email protected]> * feat(rpc): enhance activity image processing and improve error handling in Discord integration Signed-off-by: Deluan <[email protected]> * feat(discord): enhance activity state with artist list and add large text asset Signed-off-by: Deluan <[email protected]> * fix tests Signed-off-by: Deluan <[email protected]> * feat(artwork): implement ArtworkService for retrieving artwork URLs Signed-off-by: Deluan <[email protected]> * Add playback position to scrobble NowPlaying (#4089) * test(playtracker): cover playback position * address review comment Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> * fix merge Signed-off-by: Deluan <[email protected]> * refactor: remove unnecessary check for empty slice in Map function Signed-off-by: Deluan <[email protected]> * fix: update reflex.conf to include .wasm file extension Signed-off-by: Deluan <[email protected]> * fix(scanner): normalize attribute strings and add edge case tests for PID calculation Relates to https://github.com/navidrome/navidrome/issues/4183#issuecomment-2952729458 Signed-off-by: Deluan <[email protected]> * test(ui): fix warnings (#4187) * fix(ui): address test warnings * ignore lint error in test Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> * refactor(server): optimize top songs lookup (#4189) * optimize top songs lookup * Optimize title matching queries * refactor: simplify top songs matching * improve error handling and logging in track loading functions Signed-off-by: Deluan <[email protected]> * test: add cases for fallback to title matching and combined MBID/title matching Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> * fix(ui): playlist details overflow in spotify-based themes (#4184) * test: ensure playlist details width * fix(test): simplify expectation for minWidth in NDPlaylistDetails Signed-off-by: Deluan <[email protected]> * fix(test): test all themes Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> * chore(deps): update TagLib to version 2.1 (#4185) * chore: update cross-taglib * fix(taglib): add logging for TagLib version Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> * test: verify agents fallback (#4191) * build(docker): downgrade Alpine version from 3.21 to 3.19, oldest supported version. This is to reduce the image size, as we don't really need the latest. Signed-off-by: Deluan <[email protected]> * fix tests Signed-off-by: Deluan <[email protected]> * feat(runtime): implement pooled WASM runtime and module for better instance management Signed-off-by: Deluan <[email protected]> * fix(discord-plugin): adjust timer delay calculation for track completion Signed-off-by: Deluan <[email protected]> * resolve PR comments Signed-off-by: Deluan <[email protected]> * feat(plugins): implement cache cleanup by size functionality Signed-off-by: Deluan <[email protected]> * fix(manager): return error from getCompilationCache and handle it in ScanPlugins Signed-off-by: Deluan <[email protected]> * fix possible rce condition Signed-off-by: Deluan <[email protected]> * feat(docs): update README to include Cache and Artwork services Signed-off-by: Deluan <[email protected]> * feat(manager): add permissions support for host services in custom runtime - WIP Signed-off-by: Deluan <[email protected]> * feat(manifest): add permissions field to plugin manifests - WIP Signed-off-by: Deluan <[email protected]> * test(permissions): implement permission validation and testing for plugins - WIP Signed-off-by: Deluan <[email protected]> * feat(plugins): add unauthorized_plugin to test permission enforcement - WIP Signed-off-by: Deluan <[email protected]> * feat(docs): add Plugin Permission System section to README - WIP Signed-off-by: Deluan <[email protected]> * feat(manifest): add detailed reasons for permissions in plugin manifests - WIP Signed-off-by: Deluan <[email protected]> * feat(permissions): implement granular HTTP permissions for plugins - WIP Signed-off-by: Deluan <[email protected]> * feat(permissions): implement HTTP and WebSocket permissions for plugins - WIP Signed-off-by: Deluan <[email protected]> * refactor Signed-off-by: Deluan <[email protected]> * refactor: unexport all plugins package private symbols Signed-off-by: Deluan <[email protected]> * update docs Signed-off-by: Deluan <[email protected]> * refactor: rename plugin_lifecycle_manager Signed-off-by: Deluan <[email protected]> * docs: add discord-rich-presence plugin example to README Signed-off-by: Deluan <[email protected]> * feat: add support for PATCH, HEAD, and OPTIONS HTTP methods Signed-off-by: Deluan <[email protected]> * feat: use folder names as unique identifiers for plugins Signed-off-by: Deluan <[email protected]> * fix: read config just once, to avoid data race in tests Signed-off-by: Deluan <[email protected]> * refactor: rename pluginName to pluginID for consistency across services Signed-off-by: Deluan <[email protected]> * fix: use symlink name instead of folder name for plugin registration Signed-off-by: Deluan <[email protected]> * feat: update plugin output format to include ID and enhance README with symlink usage Signed-off-by: Deluan <[email protected]> * refactor: implement shared plugin discovery function to streamline plugin scanning and error handling Signed-off-by: Deluan <[email protected]> * feat: show plugin permissions in `plugin info` Signed-off-by: Deluan <[email protected]> * feat: add JSON schema for Navidrome Plugin manifest and generate corresponding Go types - WIP Signed-off-by: Deluan <[email protected]> * feat: implement typed permissions for plugins to enhance permission handling Signed-off-by: Deluan <[email protected]> * feat: refactor plugin permissions to use typed schema and improve validation - WIP Signed-off-by: Deluan <[email protected]> * feat: update HTTP permissions handling to use typed schema for allowed URLs - WIP Signed-off-by: Deluan <[email protected]> * feat: remove unused JSON schema validation for plugin manifests Signed-off-by: Deluan <[email protected]> * feat: remove unused fields from PluginPackage struct in package.go Signed-off-by: Deluan <[email protected]> * feat: update file permissions in tests and remove unused permission parsing function Signed-off-by: Deluan <[email protected]> * feat: refactor test plugin creation to use typed permissions and remove legacy helper Signed-off-by: Deluan <[email protected]> * feat: add website field to plugin manifests and update test cases Signed-off-by: Deluan <[email protected]> * refactor: permission schema to use basePermission structure for consistency Signed-off-by: Deluan <[email protected]> * feat: enhance host service management by adding permission checks for each service Signed-off-by: Deluan <[email protected]> * refactor: reorganize code files Signed-off-by: Deluan <[email protected]> * refactor: simplify custom runtime creation by removing compilation cache parameter Signed-off-by: Deluan <[email protected]> * doc: add WebSocketService and update ConfigService for plugin-specific configuration Signed-off-by: Deluan <[email protected]> * feat: implement WASM loading optimization to enhance plugin instance creation speed Signed-off-by: Deluan <[email protected]> * refactor: rename custom runtime functions and update related tests for clarity Signed-off-by: Deluan <[email protected]> * refactor: enhance plugin structure with compilation handling and error reporting Signed-off-by: Deluan <[email protected]> * refactor: improve logging and context tracing in runtime and wasm base plugin Signed-off-by: Deluan <[email protected]> * refactor: enhance runtime management with scoped runtime and caching improvements Signed-off-by: Deluan <[email protected]> * refactor: implement EnsureCompiled method for improved plugin compilation handling Signed-off-by: Deluan <[email protected]> * refactor: implement cached module management with TTL for improved performance Signed-off-by: Deluan <[email protected]> * refactor: replace map with sync.Map Signed-off-by: Deluan <[email protected]> * refactor: adjust time tolerance in scrobble buffer repository tests to avoid flakiness Signed-off-by: Deluan <[email protected]> * refactor: enhance image processing with fallback mechanism for improved error handling Signed-off-by: Deluan <[email protected]> * docs: review test plugins readme Signed-off-by: Deluan <[email protected]> * feat: set default timeout for HTTP client to 10 seconds Signed-off-by: Deluan <[email protected]> * feat: enhance wasm instance pool with concurrency limits and timeout settings Signed-off-by: Deluan <[email protected]> * feat(discordrp): implement caching for processed image URLs with configurable TTL Signed-off-by: Deluan <[email protected]> --------- Signed-off-by: Deluan <[email protected]> Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> |