feat: reddit -> spotify/bandcamp artist linker MVP (extension + resolver service)
Firefox MV2 content script that detects artist/band names in reddit comment threads and rewrites them inline into Spotify + Bandcamp links, backed by a tiny zero-dependency Node resolver that confirms each candidate against the Spotify Web API (direct links) or MusicBrainz (zero-setup, search links). Includes build + install instructions in the README. Source: project/reddit-spotify-linker (user 2026-06-12) + user message 2026-06-14 "Full vibe code, small service, minimal code." Closes task/resolver-service, closes task/firefox-extension, closes task/docs-and-publish (plan/mvp-build, objective/ship-mvp-linker). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
# Reddit → Spotify / Bandcamp linker
|
||||
|
||||
A Firefox extension that, while you browse a Reddit thread, finds **artist / band
|
||||
names** in the comments (and the post body) and turns them into inline links to
|
||||
**Spotify** and **Bandcamp** — so a recommendation thread like
|
||||
[this one](https://www.reddit.com/r/SlamDeathMetal/comments/1txh2r1/) becomes a
|
||||
list of clickable artists instead of names you have to copy-paste into search.
|
||||
|
||||
The hard part is *"which words are artists and which aren't?"*. Rather than guess
|
||||
with client-side rules, the extension hands candidate names to a tiny local
|
||||
**resolver service** that checks each one against a real music database and only
|
||||
links the names that actually match an artist.
|
||||
|
||||
```
|
||||
reddit page content script resolver service
|
||||
─────────── ────────────── ────────────────
|
||||
comment text ──extract──> candidate names ──POST /resolve──> Spotify API (direct links)
|
||||
or
|
||||
<a> links <──rewrite── confirmed links <───────────────── MusicBrainz (zero-setup)
|
||||
```
|
||||
|
||||
## Layout
|
||||
|
||||
```
|
||||
service/ tiny Node.js resolver (one file, zero npm deps)
|
||||
resolver.js
|
||||
package.json
|
||||
.env.example
|
||||
extension/ Firefox MV2 extension (content script only)
|
||||
manifest.json
|
||||
content.js
|
||||
styles.css
|
||||
```
|
||||
|
||||
## 1. Run the resolver service
|
||||
|
||||
Requirements: **Node 18+** (uses the built-in `fetch`). No `npm install` needed —
|
||||
there are no dependencies.
|
||||
|
||||
```sh
|
||||
cd service
|
||||
node resolver.js
|
||||
# resolver listening on http://localhost:8787 (provider: musicbrainz)
|
||||
```
|
||||
|
||||
That's it. With no configuration the resolver validates names against
|
||||
**MusicBrainz** (no account required) and links to Spotify/Bandcamp **search**
|
||||
pages.
|
||||
|
||||
### Optional: direct Spotify links
|
||||
|
||||
For **direct artist links** (instead of Spotify search), give the service Spotify
|
||||
API credentials:
|
||||
|
||||
1. Create a free app at <https://developer.spotify.com/dashboard> and copy its
|
||||
**Client ID** and **Client Secret**.
|
||||
2. `cp .env.example .env` and fill them in (the `.env` file is gitignored):
|
||||
|
||||
```
|
||||
SPOTIFY_CLIENT_ID=your_id
|
||||
SPOTIFY_CLIENT_SECRET=your_secret
|
||||
```
|
||||
3. Restart the service. It will report `provider: spotify` on startup.
|
||||
|
||||
(Bandcamp has no public API, so Bandcamp links are always a search URL.)
|
||||
|
||||
Quick check that it works:
|
||||
|
||||
```sh
|
||||
curl -s localhost:8787/resolve \
|
||||
-H 'content-type: application/json' \
|
||||
-d '{"candidates":["Cerebral Bore","Devourment","Notarealband Xyzzy"]}'
|
||||
# {"Cerebral Bore":{...},"Devourment":{...},"Notarealband Xyzzy":null}
|
||||
```
|
||||
|
||||
## 2. Install the extension in Firefox
|
||||
|
||||
The extension is unpacked / unsigned, so load it as a **temporary add-on**:
|
||||
|
||||
1. Open `about:debugging#/runtime/this-firefox`.
|
||||
2. **Load Temporary Add-on…**
|
||||
3. Select `extension/manifest.json`.
|
||||
|
||||
It's now active until you restart Firefox. (To keep it permanently you'd sign it
|
||||
via [AMO](https://addons.mozilla.org/developers/) or use Firefox Developer/ESR
|
||||
with `xpinstall.signatures.required = false`.)
|
||||
|
||||
## 3. Use it
|
||||
|
||||
1. Make sure the resolver service is running.
|
||||
2. Open any Reddit comments thread (a URL with `/comments/` in it).
|
||||
3. Artist names in the comments become links: the name links to **Spotify**, with
|
||||
a small superscript **`bc`** link to **Bandcamp** beside it. New comments loaded
|
||||
as you scroll are linked automatically.
|
||||
|
||||
## Configuration
|
||||
|
||||
The resolver URL is the constant `RESOLVER_URL` at the top of
|
||||
`extension/content.js` (default `http://localhost:8787`). If you change the host
|
||||
or port, update **both** that constant **and** the matching entry in
|
||||
`extension/manifest.json` → `permissions` (Firefox needs the host listed there to
|
||||
let the content script reach it).
|
||||
|
||||
## Limitations (MVP)
|
||||
|
||||
- **Detection is capitalization-based.** Names written in lowercase, or split
|
||||
across formatting (e.g. **bold** in the middle of a name), can be missed. The
|
||||
resolver's exact-name match keeps false *positives* low; the trade-off is some
|
||||
false *negatives*.
|
||||
- **Bandcamp links are searches**, not direct artist pages (no public API).
|
||||
- The resolver caches results in memory; it resets when you restart it.
|
||||
- Without Spotify credentials the MusicBrainz path is rate-limited to ~1 lookup/
|
||||
second, so the first scan of a large thread fills in gradually (cached after).
|
||||
- Built and tested as a Firefox MV2 extension.
|
||||
|
||||
## License
|
||||
|
||||
Personal project — do as you like.
|
||||
Reference in New Issue
Block a user