Files
Discodrome/manifest.json
T
deluan 875c29b2d1 Add optional image hosting for non-public Navidrome instances
When Navidrome is behind a private network (e.g. Tailscale), Discord
cannot fetch artwork URLs. This adds optional integration with imgbb
(24h expiry, requires API key) and uguu.se (3h expiry, no key needed)
to upload cover art to a public host.

Closes #1

# Conflicts:
#	go.mod
#	go.sum
2026-02-07 14:20:19 -05:00

133 lines
4.1 KiB
JSON

{
"$schema": "https://raw.githubusercontent.com/navidrome/navidrome/refs/heads/master/plugins/manifest-schema.json",
"name": "Discord Rich Presence",
"author": "Navidrome Team",
"version": "0.1.0",
"description": "Discord Rich Presence integration for Navidrome",
"website": "https://github.com/navidrome/discord-rich-presence-plugin",
"permissions": {
"users": {
"reason": "To process scrobbles on behalf of users"
},
"http": {
"reason": "To communicate with Discord API for gateway discovery and image uploads",
"requiredHosts": ["discord.com", "api.imgbb.com", "uguu.se"]
},
"websocket": {
"reason": "To maintain real-time connection with Discord gateway",
"requiredHosts": ["gateway.discord.gg"]
},
"cache": {
"reason": "To store connection state and sequence numbers"
},
"scheduler": {
"reason": "To schedule heartbeat messages and activity clearing"
},
"artwork": {
"reason": "To get track artwork URLs for rich presence display"
},
"subsonicapi": {
"reason": "To fetch track artwork data for image hosting upload"
}
},
"config": {
"schema": {
"type": "object",
"properties": {
"clientid": {
"type": "string",
"title": "Discord Application Client ID",
"description": "The Client ID from your Discord Developer Application. Create one at https://discord.com/developers/applications",
"minLength": 17,
"maxLength": 20,
"pattern": "^[0-9]+$"
},
"imagehost": {
"type": "string",
"title": "Image Hosting Service",
"description": "Upload artwork to a public image host so Discord can display it. Required when Navidrome is not publicly accessible.",
"enum": ["imgbb", "uguu"]
},
"imgbbapikey": {
"type": "string",
"title": "imgbb API Key",
"description": "API key from imgbb.com. Get one at https://api.imgbb.com/"
},
"users": {
"type": "array",
"title": "User Tokens",
"description": "Discord tokens for each Navidrome user. WARNING: Store tokens securely!",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"username": {
"type": "string",
"title": "Navidrome Username",
"description": "The Navidrome username to associate with this Discord token",
"minLength": 1
},
"token": {
"type": "string",
"title": "Discord Token",
"description": "The user's Discord token (keep this secret!)",
"minLength": 1
}
},
"required": ["username", "token"]
}
}
},
"required": ["clientid", "users"]
},
"uiSchema": {
"type": "VerticalLayout",
"elements": [
{
"type": "Control",
"scope": "#/properties/clientid"
},
{
"type": "Control",
"scope": "#/properties/imagehost"
},
{
"type": "Control",
"scope": "#/properties/imgbbapikey",
"options": { "format": "password" },
"rule": {
"effect": "SHOW",
"condition": {
"scope": "#/properties/imagehost",
"schema": { "const": "imgbb" }
}
}
},
{
"type": "Control",
"scope": "#/properties/users",
"options": {
"elementLabelProp": "username",
"detail": {
"type": "HorizontalLayout",
"elements": [
{
"type": "Control",
"scope": "#/properties/username"
},
{
"type": "Control",
"scope": "#/properties/token",
"options": {
"format": "password"
}
}
]
}
}
}
]
}
}
}