# CDisc Music 1.7
1.6 shipped speaker groups with a caveat: per-speaker channel and volume only
did anything on Plasmo Voice. **That caveat is gone.** Simple Voice Chat now
honours both, and a jukebox carried on Simple Voice Chat no longer breaks up
while you run.
The second headline is **search you can pick from**. A query that isn't a link
lists what it found in the chat, and you click the track you meant instead of
taking whatever came first.
Two things for server owners: **API keys move out of `config.yml` into their
own file**, and CDisc gains **permissions and limits** on what a player can
make your server fetch.
---
## Simple Voice Chat catches up
**Per-speaker channel and volume now work.** Simple Voice Chat was handed
audio that had already been encoded, so every output of a group received
byte-identical sound — the settings saved to the block, showed up in the GUI,
and had nothing to act on. Each output is now encoded separately, so a pair of
speakers can split a stereo image the way it always could on Plasmo.
*Stereo* folds to mono there, because Simple Voice Chat has no stereo stream to
offer — its encoder is single-channel throughout. *Left* and *right* stay
genuinely different, which is what splitting an image across two speakers
actually needs.
**A carried jukebox stays clean.** Carrying one used to make the music break up
while moving: the audio came from a source sitting on your own ears, and at
zero distance the direction from listener to source is undefined, so it swung
on every step. The carrier now gets a channel with no position at all — steady
in both ears — while everyone else keeps hearing it from where you're standing.
The swap overlaps in both directions, so picking a jukebox up and putting it
down have no gap and no click.
This costs one Opus encode per playing output where Simple Voice Chat
previously had none. It is the price of telling two speakers apart. It also
removes an old penalty: a global `volume` below 100 used to force a full
re-encode of every track, and no longer does.
## Search you can pick from
```
/cdisc create yt:daft punk one more time
```
A query that isn't a link now **lists what it found in the chat** — number,
title, artist, length — and every line is clickable. Click one and it's written
to the disc in your hand.
Ask for a specific number of results by putting it on the end:
```
/cdisc create yt:one more time:10
```
Five by default, ten at most. A trailing `:something` is only read as a count
when it really is a number, so `yt:nightcore: reloaded` stays one query, and
links aren't parsed for it at all.
The disc records the **track's own address**, not your query. A disc written
from a search keeps playing the track you picked even if the same words return
something else next year.
Three rules keep the list honest: it belongs to whoever searched, so someone
else clicking it does nothing; choosing consumes it, so one search writes one
disc; and it expires after three minutes rather than quietly writing a track
you'd forgotten about.
## Keys live in their own file
`config.yml` held Spotify secrets, Yandex tokens and VK credentials in among
the ordinary settings — the one file you'd paste into an issue report or hand
to somebody helping you debug.
Configuration is now four files:
| File | Holds |
| --- | --- |
| `config.yml` | Plugin settings |
| `sources.yml` | Which sources are on, and their options |
| `permissions.yml` | Rights and limits |
| `tokens.json` | **Every key and secret** |
**Nothing to do on update.** The split happens on first start: the new files
are written, then the moved sections are removed, and the original is kept
beside them as `config-before-split.yml.bak`. Nothing is deleted until the
replacements are safely on disk.
`tokens.json` is the one file to keep out of screenshots and bug reports.
## Permissions and limits
Every command now sits behind a node, registered with the server at startup so
LuckPerms and friends can see them by name:
```
cdisc.create cdisc.create.playlist cdisc.clear
cdisc.player cdisc.pair cdisc.portable
cdisc.messages cdisc.admin
```
**The defaults match how CDisc behaved before it had permissions**, so updating
changes nothing until you change something.
Then there are limits, and they exist for a specific reason: `/cdisc create`
makes *your server* fetch a URL that a *player* chose.
| Setting | Default | What it does |
| --- | --- | --- |
| `create-cooldown-seconds` | `5` | Wait between two creates by the same player |
| `max-track-seconds` | `0` | Longest track allowed on a disc; 0 is unlimited |
| `allow-live` | `true` | Whether live streams may go on a disc |
| `allowed-hosts` | empty | Fill it in and only these hosts are permitted |
| `blocked-hosts` | empty | Hosts refused outright |
A leading `www.` is ignored and subdomains count, so `youtube.com` also covers
`music.youtube.com`. Search queries aren't URLs and neither list touches them —
they can only ever reach the source they name.
Refusals always say why, in chat. `cdisc.admin` ignores all of it.
## Playback survives a restart
```yaml
resume-playback: true
```
Jukeboxes pick up where they left off — same track, same second — instead of
going silent until somebody re-triggers them.
Resuming waits for the **chunk to load**, so a jukebox in an empty corner of
the map costs nothing until a player walks over. A jukebox that was **paused**
stays paused, since resuming it would be starting music nobody asked for. Live
streams come back at the live edge rather than a stale position.
## Sound settings for a jukebox on its own
The channel, volume, name and particle settings introduced in 1.6 were reachable
only through the speaker-group screen, which meant a single jukebox couldn't be
turned down without pairing it to something first. **Sound** now opens the same
screen from the player GUI on any jukebox.
## The update checker actually tells you
Three separate reasons it stayed quiet, all fixed:
- It **only checked at startup**. A release published while your server was
already up was invisible until the next restart. It now re-checks on a timer,
every six hours by default (`update-checker.interval-hours`).
- It **hid releases over their version list**. A build that didn't name your
exact Minecraft version was treated as not existing. Versions are now matched
by family, so a server on `26.2.build.56` matches a release listing `26.x`.
- Notices are **warnings**, so they stand out in a console instead of scrolling
past among the info lines.
## Documentation
CDisc has a documentation site: 19 pages in English and Russian, with search,
per-page contents and a dark theme. Everything below the surface of this
changelog is written up there properly.
---
## Smaller things
- `/cdisc create` with a playlist link tells you how many tracks it left
behind, and points at `create-playlist`.
- Source settings moved to `sources.yml`, so turning YouTube's fallback API on
no longer means editing the same file as your speaker-group limits.
- A source with no key is skipped with a line in the console at startup, rather
than registering itself and failing later.
## Fixes
- **An unconfigured Spotify registered itself anyway.** The shipped placeholder
was the literal text `null`, which every check treated as a real client ID —
so the source came up with `null` as its credentials and failed on use
instead of standing aside.
---
## Compatibility
Minecraft **1.20 through 26.x**, on Spigot and Paper.
**Per-speaker channel and volume now work on both voice backends**, which
supersedes the note in 1.6 that they needed Plasmo Voice. The one difference
left: a *stereo* setting folds to mono on Simple Voice Chat, since it has no
stereo stream. Left, right and mono behave identically on both.
Optional dependencies
Simple Voice Chat
Any compatible version
Plasmo Voice
Any compatible version
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }