Some checks failed
Pipeline: Test, Lint, Build / Get version info (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test Go code (push) Has been cancelled
Pipeline: Test, Lint, Build / Test JS code (push) Has been cancelled
Pipeline: Test, Lint, Build / Lint i18n files (push) Has been cancelled
Pipeline: Test, Lint, Build / Check Docker configuration (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (darwin/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v5) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v6) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm/v7) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (linux/arm64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/386) (push) Has been cancelled
Pipeline: Test, Lint, Build / Build (windows/amd64) (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to GHCR (push) Has been cancelled
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Has been cancelled
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Has been cancelled
Pipeline: Test, Lint, Build / Build Windows installers (push) Has been cancelled
Pipeline: Test, Lint, Build / Package/Release (push) Has been cancelled
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
POEditor import / update-translations (push) Has been cancelled
200 lines
5.8 KiB
JSON
200 lines
5.8 KiB
JSON
{
|
|
"$id": "navidrome://plugins/manifest",
|
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
"title": "Navidrome Plugin Manifest",
|
|
"description": "Schema for Navidrome Plugin manifest.json files",
|
|
"type": "object",
|
|
"required": [
|
|
"name",
|
|
"author",
|
|
"version",
|
|
"description",
|
|
"website",
|
|
"capabilities",
|
|
"permissions"
|
|
],
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Name of the plugin"
|
|
},
|
|
"author": {
|
|
"type": "string",
|
|
"description": "Author or organization that created the plugin"
|
|
},
|
|
"version": {
|
|
"type": "string",
|
|
"description": "Plugin version using semantic versioning format"
|
|
},
|
|
"description": {
|
|
"type": "string",
|
|
"description": "A brief description of the plugin's functionality"
|
|
},
|
|
"website": {
|
|
"type": "string",
|
|
"format": "uri",
|
|
"description": "Website URL for the plugin or its documentation"
|
|
},
|
|
"capabilities": {
|
|
"type": "array",
|
|
"description": "List of capabilities implemented by this plugin",
|
|
"minItems": 1,
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [
|
|
"MetadataAgent",
|
|
"Scrobbler",
|
|
"SchedulerCallback",
|
|
"LifecycleManagement",
|
|
"WebSocketCallback"
|
|
]
|
|
}
|
|
},
|
|
"permissions": {
|
|
"type": "object",
|
|
"description": "Host services the plugin is allowed to access",
|
|
"additionalProperties": true,
|
|
"properties": {
|
|
"http": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "HTTP service permissions",
|
|
"required": ["allowedUrls"],
|
|
"properties": {
|
|
"allowedUrls": {
|
|
"type": "object",
|
|
"description": "Map of URL patterns (e.g., 'https://api.example.com/*') to allowed HTTP methods. Redirect destinations must also be included.",
|
|
"additionalProperties": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [
|
|
"GET",
|
|
"POST",
|
|
"PUT",
|
|
"DELETE",
|
|
"PATCH",
|
|
"HEAD",
|
|
"OPTIONS",
|
|
"*"
|
|
]
|
|
},
|
|
"minItems": 1,
|
|
"uniqueItems": true
|
|
},
|
|
"minProperties": 1
|
|
},
|
|
"allowLocalNetwork": {
|
|
"type": "boolean",
|
|
"description": "Whether to allow requests to local/private network addresses",
|
|
"default": false
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"config": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "Configuration service permissions"
|
|
}
|
|
]
|
|
},
|
|
"scheduler": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "Scheduler service permissions"
|
|
}
|
|
]
|
|
},
|
|
"websocket": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "WebSocket service permissions",
|
|
"required": ["allowedUrls"],
|
|
"properties": {
|
|
"allowedUrls": {
|
|
"type": "array",
|
|
"description": "List of WebSocket URL patterns that the plugin is allowed to connect to",
|
|
"items": {
|
|
"type": "string",
|
|
"pattern": "^wss?://.*$"
|
|
},
|
|
"minItems": 1,
|
|
"uniqueItems": true
|
|
},
|
|
"allowLocalNetwork": {
|
|
"type": "boolean",
|
|
"description": "Whether to allow connections to local/private network addresses",
|
|
"default": false
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"cache": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "Cache service permissions"
|
|
}
|
|
]
|
|
},
|
|
"artwork": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "Artwork service permissions"
|
|
}
|
|
]
|
|
},
|
|
"subsonicapi": {
|
|
"allOf": [
|
|
{ "$ref": "#/$defs/basePermission" },
|
|
{
|
|
"type": "object",
|
|
"description": "SubsonicAPI service permissions",
|
|
"properties": {
|
|
"allowedUsernames": {
|
|
"type": "array",
|
|
"description": "List of usernames the plugin can pass as u. Any user if empty",
|
|
"items": { "type": "string" }
|
|
},
|
|
"allowAdmins": {
|
|
"type": "boolean",
|
|
"description": "If false, reject calls where the u is an admin",
|
|
"default": false
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"$defs": {
|
|
"basePermission": {
|
|
"type": "object",
|
|
"required": ["reason"],
|
|
"properties": {
|
|
"reason": {
|
|
"type": "string",
|
|
"minLength": 1,
|
|
"description": "Explanation of why this permission is needed"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
}
|