All Mods Resource Packs Data Packs Shaders Modpacks Plugins
CustomDiscs SVC

CustomDiscs SVC

by subkek • Downloads: 0 • Followers: 0
Description
Gallery
Changelog
Versions

Modrinth downloads

CustomDiscs

CustomDiscs brings custom, positional music discs to Minecraft servers through Simple Voice Chat. Turn a regular music disc into a custom one backed by a local MP3, WAV, or FLAC file, or stream a track from a supported remote service such as YouTube or SoundCloud.

Audio is played from the jukebox position, so players hear it naturally as they move through the world. Server owners can control playback range, volume, track limits, disc appearance, visualizations, and remote provider behavior. Developers can integrate with playback through the public API and Bukkit events.

Special thanks

CustomDiscs builds on ideas and technology from these projects:

Links

Features

  • Local playback from MP3, WAV, and FLAC files
  • Remote playback from YouTube and SoundCloud URLs
  • Positional audio powered by Simple Voice Chat
  • Per-jukebox playback radius
  • Custom model data for local and remote discs
  • Configurable particles and playback holograms
  • Configurable maximum file size and track duration
  • English and Russian translations
  • Folia-aware scheduling
  • Public API, lifecycle events, and audio packet handlers

Requirements

CustomDiscs requires the following server plugins:

Players also need the Simple Voice Chat client mod to hear custom disc audio.

Installation

  1. Install Simple Voice Chat and PacketEvents on the server.
  2. Download CustomDiscs from Modrinth.
  3. Place all three plugin files in the server's plugins directory.
  4. Start or restart the server.
  5. Review the generated configuration in plugins/CustomDiscs/config.yml.
  6. Make sure Simple Voice Chat is configured and working before testing a disc.

Creating a disc

Custom discs are created from an ordinary Minecraft music disc held in the player's main hand. Arguments containing spaces must be enclosed in double quotes.

From a local file

Place an MP3, WAV, or FLAC file in plugins/CustomDiscs/musicdata, or download one from a direct HTTP(S) URL:

/cd download "https://example.com/music/track.mp3" track.mp3

Hold a music disc and convert it:

/cd create local track.mp3 "Track name"

From a remote service

Hold a music disc and provide a supported URL:

/cd create remote "https://www.youtube.com/watch?v=..." "Track name"

Insert the resulting disc into a jukebox to start positional playback.

[!WARNING] Remote services commonly require additional configuration before playback will work reliably. YouTube may require OAuth2, a PO token, a remote cipher server, or an HTTP(S) proxy. Provider behavior can change independently of CustomDiscs. Use a secondary account for OAuth2 authorization and never publish provider credentials or tokens.

Only stream or download audio that you are authorized to use. Server owners are responsible for complying with the terms of the source service and applicable copyright law.

Commands

The full command is /customdiscs; /cd is available as a shorter alias.

Command Description Permission
/cd Root CustomdDiscs command customdiscs
/cd help Shows the commands available to the sender. customdiscs.help
/cd reload Reloads configuration and language files. customdiscs.reload
/cd download "<direct URL>" <filename> Downloads an MP3, WAV, or FLAC file into musicdata. customdiscs.download
/cd create local <filename> "<disc name>" Converts the held music disc using a local file. customdiscs.create.local
/cd create remote "<URL>" "<disc name>" Converts the held music disc using a supported remote URL. customdiscs.create.remote
/cd distance <radius> Prompts the player to select a jukebox and assigns its playback radius. customdiscs.distance

create local, create remote, and distance are player-only operations.

Permissions

Permission Default Description
customdiscs.* Operators Grants every CustomDiscs permission.
customdiscs.help Everyone Allows access to command help.
customdiscs.reload Operators Allows configuration and language reloads.
customdiscs.download Operators Allows downloading audio files to the server.
customdiscs.create Everyone Parent permission for disc creation.
customdiscs.create.local Everyone Allows creating discs from local files.
customdiscs.create.remote Everyone Allows creating discs from remote URLs.
customdiscs.create.remote.youtube Everyone Allows creating discs from YouTube URLs.
customdiscs.create.remote.soundcloud Everyone Allows creating discs from SoundCloud URLs.
customdiscs.distance Everyone Allows changing a jukebox's playback radius.

Configuration

The plugin creates and maintains plugins/CustomDiscs/config.yml. The file includes comments describing each option, so it can be configured directly without copying a complete template from this README. Important settings include:

  • language, update checks, and debug logging;
  • maximum download size and playback radius;
  • master volume and maximum track length;
  • custom model data for local, YouTube, and SoundCloud discs;
  • URL suggestions and provider matching rules;
  • particle, hologram, or combined jukebox visualizations;
  • hologram render distance, name length, position mode, and offsets;
  • YouTube OAuth2, PO token, remote cipher server, and HTTP(S) proxy settings.

Run /cd reload after editing the configuration. Language files are stored in plugins/CustomDiscs/language and can also be customized.

Developer API

The API artifact is published from the project's Maven repository. Replace the version below if a newer API release is available.

Gradle (Kotlin DSL)

repositories {
    maven("https://repo.subkek.space/maven-public/")
}

dependencies {
    compileOnly("space.subkek:customdiscs-api:1.0.0-SNAPSHOT")
}

Maven

<repository>
    <id>subkek</id>
    <url>https://repo.subkek.space/maven-public/</url>
</repository>

<dependency>
    <groupId>space.subkek</groupId>
    <artifactId>customdiscs-api</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>

Declare CustomDiscs and Simple Voice Chat as server dependencies in your Paper plugin descriptor. You can then obtain the registered API service:

import space.subkek.customdiscs.api.CustomDiscsAPI;

CustomDiscsAPI api = CustomDiscsAPI.get();
if (api ==null)
    throw new IllegalStateException("CustomDiscs is not loaded");
boolean customDisc = api.isCustomDisc(itemStack);
api.getLavaPlayerManager().play(jukeboxBlock, audioIdentifier, null);

The API exposes:

  • CustomDiscsAPI for service discovery, disc identification, and playback manager access;
  • LavaPlayerManager for starting, stopping, and inspecting positional playback;
  • packet handlers for observing or filtering encoded audio frames;
  • CustomDiscInsertEvent and CustomDiscEjectEvent for jukebox interaction;
  • LavaPlayerStartPlayingEvent and LavaPlayerStopPlayingEvent for playback lifecycle hooks.

The LavaPlayer lifecycle events may run asynchronously or on a region thread. Schedule Bukkit world operations on the appropriate server or region scheduler.

Building from source

The project requires JDK 21 and includes the Gradle Wrapper:

./gradlew build

The distributable plugin JAR is produced in build/libs.

All Versions

+ Add Version
Name Game version Platforms Published Downloads Actions
26.3 26.2 26.1.x +1
Folia Paper Purpur
1d ago 1
26.1.x 1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Bukkit Folia Paper Purpur
1d ago 1
1.21.x 1.20.6
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21.x 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.21 1.20.x 1.19.x +3
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.20.x 1.19.x 1.18.x +2
Bukkit Folia Paper Purpur Spigot
1d ago 1
1.20.x 1.19.x 1.18.x +2
Folia Paper Purpur Spigot
1d ago 1
1.20.x 1.19.x 1.18.x +2
Folia Paper Purpur Spigot
1d ago 1
1.20.x 1.19.x 1.18.x +2
Folia Paper Purpur Spigot
1d ago 1
1.20.x 1.19.x 1.18.x +2
Folia Paper Purpur Spigot
1d ago 1
1.20.x 1.19.x 1.18.x
Folia Paper Purpur
1d ago 1
1.20.x
Folia Paper Purpur
1d ago 1
1.20.x
Folia Paper Purpur
1d ago 1
1.20.x
Folia Paper Purpur
1d ago 1
1.20.x
Folia Paper Purpur
1d ago 1
# CustomDiscs-SVC 2.7.0

> [!IMPORTANT]
> This update is being released solely to restore remote source playback. It is an interim release ahead of a larger update that will improve the plugin, simplify its behavior, and make it easier to understand and use.

## Fixed

  • Restored remote source playback by updating the YouTube source implementation and expanding the available YouTube clients.
  • Improved jukebox playback and visualization cleanup when discs are stopped or ejected.

## Added

  • Added configurable jukebox visualizations with four modes: particles, hologram, both, and off.
  • Added configurable hologram render distance, track name length, position mode, and position offsets.
  • Added localized hologram text for English and Russian.
  • Added custom disc insert handling for hopper and redstone-driven jukebox interactions.
  • Added packet-based jukebox handling to keep custom playback behavior synchronized with the client.

## Changed

  • Refactored the command system around Paper's native Brigadier command API.
  • Improved command permission checks, subcommand registration, and quoted argument suggestions.
  • Refactored Bukkit event handlers into dedicated listener classes.
  • Reworked jukebox visualization rendering and activation-side positioning.
  • Updated the README with current installation, command, permission, configuration, API, and compatibility information.
  • Shaded and relocated Simple YAML into the plugin jar to simplify runtime dependency loading.
  • Updated Paper API, Simple Voice Chat API, Lavaplayer, PacketEvents, FoliaLib, Commons IO, Lombok, Shadow, Paper YML, and the Gradle wrapper.
  • Updated supported Minecraft versions to 1.21.6 and newer, including 26.2.

## Internal

  • Applied project-wide Java style cleanup and general code simplification.
  • Simplified the command class hierarchy and removed obsolete event-handler code.

## 2.6.0

### Changed
  • Completely removed the CommandAPI dependency. The plugin's command architecture has been refactored to use the native Paper Brigadier CLI.
  • Optimized the dynamic permission verification system for both root commands and subcommands.

### Compatibility
  • Confirmed compatibility with Minecraft 26.1.2.

### Dependencies
  • youtube-source 1.18.0 → 1.18.1

## 2.5.2

### Added
  • HTTP/HTTPS proxy support for LavaPlayer (only YouTube yet) via providers.youtube.http-proxy in config.yml
  • Format: [scheme://][user:pass@]host:port
  • Supports basic auth and both http:// and https:// proxy schemes

### Fixed
  • Server no longer lags on startup when LavaPlayerManagerImpl initializes — all registrations (YouTube, SoundCloud, proxy setup) now happen asynchronously; disc playback waits for initialization to complete before starting
  • data.yml was being rewritten on every autosave tick even when nothing changed — introduced a dirty flag so the file is only saved when data has actually been modified
  • data.yml was not saved on plugin shutdown
  • allow-hoppers config option is now true by default

### Security
  • DownloadSubCommand: reject URLs with non-http/https schemes (e.g. file://, jar://) to prevent local file read via download command
  • DownloadSubCommand: replaced contains("../") filename check with Path.normalize() boundary validation to properly block all path traversal variants
  • HTTPRequestUtils: reject non-http/https schemes in all outgoing HTTP requests
  • LegacyUtil: validate LOCAL_DISC PDC value on read to prevent path traversal via NBT-edited disc items

### Language
  • Added error.command.invalid-url key to en_US and ru_RU
  • Removed unused key error.play.no-permission from both locales
  • Removed unused key error.command.no-youtube-support from en_US

### Dependencies
  • commandapi 11.1.0 → 11.2.0
  • packetevents 2.11.2 → 2.12.0
  • shadow (Gradle plugin) 9.4.0 → 9.4.1


  • Added more YouTube clients to prevent decoding issues.
  • Updated LavaPlayer.
  • The plugin now features its own API.
  • Improved overall stability.
  • Fixed a language backup issue on Windows.
  • Resolved a rare issue where LavaPlayerManagerImpl threads could cause infinite CPU load.
  • Dependencies are now resolved via the deps.json JAR resource.
  • Restricted customdiscs.download permission to OP players by default.
  • Fixed several concurrency issues within LavaPlayerManagerImpl.
  • Migrated to SLF4J logger instead of component logger.

  • Fix remote disc create permission error

  • Force CustomDiscs load after dependencies

### Features & Improvements
  • Migrated** local file playback to **Lavaplayer**.
  • Implemented** Paper Library Loader for more efficient dependency resolution.
  • Improved** cipher password validation for better security.
  • Added** additional anti-dupe checks.
### Build & Internal
  • Updated** dependencies and build system.
  • Renamed** package group from io.github.subkek to space.subkek.
  • Fixed** an unnecessary debug key in the configuration.
### Deprecations & Removals
  • Dropped support** for non-Paper servers (e.g., Spigot, Bukkit).
  • Removed Italian language support** (zero active users according to bStats).

## P.S _If the server freezes when you first launch this version, don't worry, the plugin is downloading libraries (I forgot to add the log)._

  • Add support for 1.21.11
  • Automatic library download (lavaplayer-lib is no longer required)
  • Dependency updates
  • Command refactoring
  • Permission system refactor (⚠️ replace old permissions with the new ones)
  • Configuration update
  • Update dependencies
  • Support 1.21.8
  • 1.21.7 support
  • Update dependencies
  • Support 1.21.6
Youtube Fixed... Again... **x3**

  • (If you have problems, recreate .youtube-token)*
Youtube Fixed... Again... Again...
Youtube Fixed... Again...
Updated Lavaplayer Youtube Source
  • Fix youtube. Need delete .youtube-token
  • Youtube fixed
  • Youtube token now saves instantly upon receipt.
  • Fixed Youtube oauth2
  • <=1.21.4 support

What you need to do if you have already authorized before:
  • Delete the file plugins/CustomDiscs/.youtube-token
  • Check that the providers.youtube.youtube.use-oauth2 option is set to true.
  • Check that providers.youtube.po-token data is **blank**
  • Restart the server
  • Insert disk into jukebox
  • Follow the instructions in the console
  • Add poToken support
Fixed physics manager duplicates and eates discs.
Update libraries to fix some issues with youtube api
  • Fully rewite code
  • Switch to CommandAPI
  • Add distance command
  • Add config migration
  • Optimize players
  • Fixed disks created from local files not stopping automatically
  • Rewritten PlayerManager
  • Fixed double physics update
  • Fix wrong redstone physics
  • Fix dupes and some issues

this has very small redstone bug(fixed in next version)
  • Rewrite code
  • Fix hoppers and redstone emit
  • Testing hopper support
  • Update youtube source
CustomDiscs SVC Icon
Download CustomDiscs SVC
Select game version
Select platform