🏡 index : ironmagma/quintodrome.git

# Wikimedia Plugin for Navidrome

A Navidrome plugin that fetches artist metadata from Wikidata, DBpedia, and Wikipedia.

## Generating the Plugin

This plugin was generated using the XTP CLI:

```bash
xtp plugin init \
  --schema-file plugins/schemas/metadata_agent.yaml \
  --template go \
  --path ./wikimedia \
  --name wikimedia-plugin
```

## Features

- **Artist URL**: Fetches Wikipedia URL for an artist using Wikidata (by MBID or name), DBpedia, or falls back to a Wikipedia search URL
- **Artist Biography**: Fetches the introductory text from the artist's Wikipedia page
- **Artist Images**: Fetches artist images from Wikidata

## Building

### Using TinyGo

```bash
tinygo build -target wasip1 -buildmode=c-shared -o plugin.wasm .
zip -j wikimedia.ndp manifest.json plugin.wasm
```

### Using the Makefile

From the `plugins/examples` directory:

```bash
make wikimedia.ndp
```

### Using XTP CLI

```bash
xtp plugin build
zip -j wikimedia.ndp manifest.json dist/plugin.wasm
```

## Installation

Copy the `.ndp` file to your Navidrome plugins folder:

```bash
cp wikimedia.ndp /path/to/navidrome/plugins/
```

Then enable plugins in your `navidrome.toml`:

```toml
[Plugins]
Enabled = true
Folder = "/path/to/navidrome/plugins"
```

Add the plugin to your agents list:

```toml
Agents = "lastfm,wikimedia"
```

## Testing with Extism CLI

Install the [Extism CLI](https://extism.org/docs/install):

```bash
brew install extism/tap/extism  # macOS
# or see https://extism.org/docs/install for other platforms
```

Extract the wasm file from the package and test:

```bash
# Extract wasm from package
unzip -p wikimedia.ndp plugin.wasm > wikimedia.wasm

# Test artist URL lookup with MBID (The Beatles)
extism call wikimedia.wasm nd_get_artist_url --wasi \
  --input '{"id":"1","name":"The Beatles","mbid":"b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d"}' \
  --allow-host "query.wikidata.org"
```

Expected output:
```json
{"url":"https://en.wikipedia.org/wiki/The_Beatles"}
```

### Test artist biography

```bash
extism call wikimedia.wasm nd_get_artist_biography --wasi \
  --input '{"id":"1","name":"The Beatles","mbid":"b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d"}' \
  --allow-host "query.wikidata.org" \
  --allow-host "en.wikipedia.org"
```

### Test artist images

```bash
extism call wikimedia.wasm nd_get_artist_images --wasi \
  --input '{"id":"1","name":"The Beatles","mbid":"b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d"}' \
  --allow-host "query.wikidata.org"
```

Expected output:
```json
{"images":[{"url":"http://commons.wikimedia.org/wiki/Special:FilePath/Beatles%20ad%201965%20just%20the%20beatles%20crop.jpg","size":0}]}
```

## Project Structure

```
wikimedia/
├── main.go       # Plugin implementation with Wikimedia API logic
├── pdk.gen.go    # Generated types and export wrappers (DO NOT EDIT)
├── go.mod        # Go module file
├── go.sum        # Go module checksums
├── prepare.sh    # Build preparation script
└── xtp.toml      # XTP plugin configuration
```

## API Endpoints Used

| Service   | Endpoint                             | Purpose                                                   |
|-----------|--------------------------------------|-----------------------------------------------------------|
| Wikidata  | `https://query.wikidata.org/sparql`  | SPARQL queries for Wikipedia URLs and images              |
| DBpedia   | `https://dbpedia.org/sparql`         | Fallback SPARQL queries for Wikipedia URLs and short bios |
| Wikipedia | `https://en.wikipedia.org/w/api.php` | MediaWiki API for article extracts                        |

## Implemented Functions

| Function                  | Description                                   |
|---------------------------|-----------------------------------------------|
| `nd_manifest`             | Returns plugin manifest with HTTP permissions |
| `nd_get_artist_url`       | Returns Wikipedia URL for an artist           |
| `nd_get_artist_biography` | Returns artist biography from Wikipedia       |
| `nd_get_artist_images`    | Returns artist image URLs from Wikidata       |