音乐API更新接口

This commit is contained in:
Color_yr committed 2026-08-28 22:15:12 +08:00
1 parent df304d4d89
commit ee612df29d
18 files changed
+198 -49

No files matched your search

@@ -40,6 +40,8 @@ public class AllMusic {
public static final String SERVER_DIR = "allmusic_server/";
public static File basePath;
/**
* 客户端插件信道名
*/
@@ -282,6 +284,10 @@ public class AllMusic {
AllMusic.log.data("<light_purple>[AllMusic]<red>没有注册音乐");
}
for (IMusicApi api : MUSIC_APIS.values()) {
api.reload(basePath);
}
log.data("<light_purple>[AllMusic]<yellow>已启动-" + version);
}
@@ -405,11 +411,13 @@ public class AllMusic {
public static void init(File file) {
log.data("<light_purple>[AllMusic]<yellow>正在启动,感谢使用,本插件交流群:571239090");
try {
file.mkdir();
isRun = true;
basePath = file;
basePath.mkdir();
configFile = new File(file, "config.json");
messageFile = new File(file, "message.json");
cookieFile = new File(file, "cookie.json");
configFile = new File(basePath, "config.json");
messageFile = new File(basePath, "message.json");
cookieFile = new File(basePath, "cookie.json");
if (!configFile.exists()) {
configFile.createNewFile();
}
@@ -420,16 +428,14 @@ public class AllMusic {
cookieFile.createNewFile();
}
BanSave.init(file);
HudSave.init(file);
MusicListSave.init(file);
BanSave.init(basePath);
HudSave.init(basePath);
MusicListSave.init(basePath);
loadConfig();
apis = new File(file, "api");
apis = new File(basePath, "api");
apis.mkdirs();
isRun = true;
loadConfig();
} catch (IOException e) {
isRun = false;
log.data("<light_purple>[AllMusic]<red>启动失败");
@@ -4,12 +4,17 @@ import com.coloryr.allmusic.server.core.music.LyricSave;
import com.coloryr.allmusic.server.core.objs.music.SearchPageObj;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
import java.io.File;
import java.util.List;
public interface IMusicApi {
void reload(File path);
String getId();
SongInfoObj getMusic(String id, String player, boolean isList);
SearchPageObj search(String[] args, boolean isDefault);
SearchPageObj search(String[] args);
void setList(String id, Object sender);
@@ -22,4 +27,8 @@ public interface IMusicApi {
String getMusicId(String arg);
boolean checkId(String id);
void command(Object sender, String name, String[] args);
List<String> tab(Object sender, String name, String[] args);
}
@@ -73,9 +73,8 @@ public class CommandEX {
* @param sender 发送者
* @param name 用户名
* @param args 参数
* @param isDefault 是否是默认点歌方式
*/
public static void searchMusic(Object sender, String name, String[] args, boolean isDefault) {
public static void searchMusic(Object sender, String name, String[] args) {
String apiname = AllMusic.getConfig().defaultApi;
@@ -88,7 +87,6 @@ public class CommandEX {
obj.sender = sender;
obj.name = name;
obj.args = args;
obj.isDefault = isDefault;
obj.api = apiname;
if (AllMusic.side.onMusicAdd(sender, obj)) {
@@ -105,9 +103,8 @@ public class CommandEX {
* @param sender 发送者
* @param name 用户名
* @param args 参数
* @param isDefault 是否是默认点歌方式
*/
public static void searchMusicApi(Object sender, String name, String[] args, boolean isDefault) {
public static void searchMusicApi(Object sender, String name, String[] args) {
if (args == null || args.length < 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.error2);
return;
@@ -119,12 +116,14 @@ public class CommandEX {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.error2);
return;
}
String[] newArgs = new String[args.length - 1];
System.arraycopy(args, 1, newArgs, 0, newArgs.length);
PlayerAddMusicObj obj = new PlayerAddMusicObj();
obj.sender = sender;
obj.name = name;
obj.args = args;
obj.isDefault = isDefault;
obj.args = newArgs;
obj.api = apiname;
if (AllMusic.side.onMusicAdd(sender, obj)) {
@@ -222,7 +221,6 @@ public class CommandEX {
obj.sender = sender;
obj.id = musicID;
obj.name = name;
obj.isDefault = false;
obj.api = api;
if (AllMusic.side.onMusicAdd(sender, obj)) {
@@ -280,7 +278,7 @@ public class CommandEX {
else {
switch (AllMusic.getConfig().defaultAddMusic) {
case 1:
searchMusic(sender, name, args, true);
searchMusic(sender, name, args);
break;
case 0:
default:
@@ -8,6 +8,8 @@ import com.coloryr.allmusic.server.core.music.PlayRuntime;
import com.coloryr.allmusic.server.core.music.VoteItem;
import com.coloryr.allmusic.server.core.objs.message.ARG;
import java.util.Locale;
public class CommandAgree extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
@@ -20,15 +22,15 @@ public class CommandAgree extends ACommand {
VoteItem vote = PlayMusic.getVote();
if (vote == null) {
AllMusic.side.sendMessage(name, AllMusic.getMessage().vote.err4);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err4);
return;
}
if (vote.votePlayer.contains(name)) {
AllMusic.side.sendMessage(name, AllMusic.getMessage().vote.err5);
if (vote.votePlayer.contains(name.toLowerCase(Locale.ROOT))) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err5);
return;
}
AllMusic.side.sendMessage(name, AllMusic.getMessage().vote.agree);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.agree);
String data = AllMusic.getMessage().vote.bqAgree;
data = data.replace(ARG.player, name)
.replace(ARG.count, String.valueOf(vote.votePlayer.size()))
@@ -0,0 +1,62 @@
package com.coloryr.allmusic.server.core.command.sub;
import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.IMusicApi;
import com.coloryr.allmusic.server.core.command.ACommand;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CommandApiCommand extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length < 2) {
AllMusic.side.sendMessage(sender, "<light_purple>[AllMusic]<dark_green><red>没有指定API");
return;
}
String apiname = args[1];
IMusicApi api = AllMusic.MUSIC_APIS.get(apiname);
if (api == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.error2);
return;
}
if (args.length == 2) {
api.command(sender, name, new String[0]);
} else {
String[] newArgs = new String[args.length - 2];
System.arraycopy(args, 2, newArgs, 0, newArgs.length);
api.command(sender, name, newArgs);
}
}
@Override
public List<String> tab(Object player, String name, String[] args, int index) {
if (args.length == 1) {
return new ArrayList<>(AllMusic.MUSIC_APIS.keySet());
}
String apiname = args[1];
IMusicApi api = AllMusic.MUSIC_APIS.get(apiname);
if (api == null) {
AllMusic.side.sendMessage(player, AllMusic.getMessage().musicPlay.error2);
return Collections.emptyList();
}
if (args.length == 2) {
return api.tab(player, name, new String[0]);
} else {
String[] newArgs = new String[args.length - 2];
System.arraycopy(args, 2, newArgs, 0, newArgs.length);
return api.tab(player, name, newArgs);
}
}
}
@@ -23,8 +23,12 @@ public class CommandPush extends ACommand {
}
if (PlayMusic.getListSize() == 0 && PlayMusic.getIdleListSize() == 0) {
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().musicPlay.emptyPlay));
return;
} else if (PlayMusic.fullVoteList()) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err6);
return;
}
SongInfoObj music = null;
SongInfoObj music;
if (args.length == 1) {
music = PlayMusic.findPlayerMusic(name);
if (music == null) {
@@ -1,6 +1,7 @@
package com.coloryr.allmusic.server.core.command.sub;
import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.IMusicApi;
import com.coloryr.allmusic.server.core.command.ACommand;
public class CommandReload extends ACommand {
@@ -26,7 +26,10 @@ public class CommandSearch extends ACommand {
return;
}
String[] newArgs = new String[args.length - 1];
System.arraycopy(args, 1, newArgs, 0, newArgs.length);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.startSearch);
CommandEX.searchMusic(sender, name, args, false);
CommandEX.searchMusic(sender, name, newArgs);
}
}
@@ -40,7 +40,7 @@ public class CommandSearchApi extends ACommand {
System.arraycopy(args, 1, newArgs, 0, newArgs.length);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.startSearch);
CommandEX.searchMusicApi(sender, name, newArgs, false);
CommandEX.searchMusicApi(sender, name, newArgs);
}
@Override
@@ -16,6 +16,8 @@ public class CommandVote extends ACommand {
!AllMusic.side.checkPermission(sender, PermissionList.PERMISSION_VOTE)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.noPermission);
return;
} else if (PlayMusic.fullVoteList()) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err6);
} else if (PlayMusic.getListSize() == 0 && PlayMusic.getIdleListSize() == 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlay);
} else if (PlayMusic.nowPlayMusic == null) {
@@ -32,7 +34,7 @@ public class CommandVote extends ACommand {
return;
}
PlayMusic.removeVote(name, VoteItem.VoteType.NEXT);
AllMusic.side.sendMessage(name, AllMusic.getMessage().push.cancel1);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.cancel1);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
@@ -41,9 +43,8 @@ public class CommandVote extends ACommand {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
} else {
String player = name.toLowerCase(Locale.ROOT);
VoteItem item = new VoteItem(PlayMusic.nowPlayMusic.getApi(), PlayMusic.nowPlayMusic.getId(), player, VoteItem.VoteType.NEXT);
item.votePlayer.add(player);
VoteItem item = new VoteItem(PlayMusic.nowPlayMusic.getApi(), PlayMusic.nowPlayMusic.getId(), name, VoteItem.VoteType.NEXT);
item.votePlayer.add(name.toLowerCase(Locale.ROOT));
if (PlayMusic.startVote(item)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.doVote);
@@ -33,10 +33,10 @@ public class MusicSearch {
AllMusic.side.sendMessageTask(obj.sender, AllMusic.getMessage().musicPlay.error2);
continue;
}
SearchPageObj search = api.search(obj.args, obj.isDefault);
SearchPageObj search = api.search(obj.args);
if (search == null)
AllMusic.side.sendMessageTask(obj.sender, AllMusic.getMessage().search
.cantSearch.replace(ARG.name, obj.isDefault ? obj.args[0] : obj.args[1]));
.cantSearch.replace(ARG.name, obj.args[0]));
else {
AllMusic.side.sendMessageTask(obj.sender, AllMusic.getMessage().search.res);
addSearch(obj.name, search);
@@ -111,6 +111,13 @@ public class PlayMusic {
public static boolean startVote(VoteItem vote) {
String id = vote.getId();
String api = vote.getApi();
if (PlayMusic.vote != null && PlayMusic.vote.getType() == vote.getType()
&& PlayMusic.vote.getApi().equalsIgnoreCase(vote.getApi())
&& PlayMusic.vote.getId().equalsIgnoreCase(vote.getId())) {
return false;
}
for (VoteItem item : voteList) {
if (item.getId().equalsIgnoreCase(id) && item.getApi().equalsIgnoreCase(api)) {
return false;
@@ -158,6 +165,16 @@ public class PlayMusic {
vote = null;
}
public static List<VoteItem> cloneVoteList() {
return new ArrayList<>(voteList);
}
public static void removeVote(VoteItem vote) {
voteList.remove(vote);
}
public static boolean fullVoteList() { return voteList.size() >= AllMusic.getConfig().vote.voteListSize; }
public static void voteTick() {
voteTime--;
}
@@ -231,7 +248,7 @@ public class PlayMusic {
if (obj != null) {
IMusicApi api = AllMusic.MUSIC_APIS.get(obj.api);
if (api != null) {
addMusic(obj.sender, obj.id, api, obj.name, obj.isDefault);
addMusic(obj.sender, obj.id, api, obj.name, false);
}
}
Thread.sleep(10);
@@ -76,23 +76,33 @@ public class PlayRuntime {
private static void checkVoteNext() {
VoteItem vote = PlayMusic.getVote();
if (vote != null && vote.getType() == VoteItem.VoteType.NEXT
&& vote.getApi().equalsIgnoreCase(PlayMusic.nowPlayMusic.getApi())
&& vote.getId().equalsIgnoreCase(PlayMusic.nowPlayMusic.getId())) {
if (vote != null && vote.getType() == VoteItem.VoteType.NEXT && vote.like(PlayMusic.nowPlayMusic)) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.cancel1);
PlayMusic.removeVote();
}
for (VoteItem item : PlayMusic.cloneVoteList()) {
if (item.getType() == VoteItem.VoteType.NEXT && item.like(PlayMusic.nowPlayMusic)) {
PlayMusic.removeVote(item);
}
}
}
private static void checkVotePush() {
VoteItem vote = PlayMusic.getVote();
SongInfoObj next = PlayMusic.getNextMusic();
if (vote != null && next != null) {
if (vote.getType() == VoteItem.VoteType.PUSH
&& vote.getId().equalsIgnoreCase(next.getId())
&& vote.getApi().equalsIgnoreCase(next.getApi())) {
PlayMusic.removeVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.cancel2);
if (next != null) {
if (vote != null) {
if (vote.getType() == VoteItem.VoteType.PUSH && vote.like(next)) {
PlayMusic.removeVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.cancel2);
}
}
for (VoteItem item : PlayMusic.cloneVoteList()) {
if (item.getType() == VoteItem.VoteType.PUSH && item.like(next)) {
PlayMusic.removeVote(item);
}
}
}
}
@@ -1,5 +1,7 @@
package com.coloryr.allmusic.server.core.music;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
import java.util.HashSet;
import java.util.Set;
@@ -37,4 +39,9 @@ public class VoteItem {
this.type = type;
this.voteSender = voteSender;
}
public boolean like(SongInfoObj info) {
return api.equalsIgnoreCase(info.getApi())
&& id.equalsIgnoreCase(info.getId());
}
}
@@ -15,6 +15,7 @@ public class VoteObj {
public String err3;
public String err4;
public String err5;
public String err6;
public String cancel;
public String cancel1;
public String list;
@@ -53,6 +54,8 @@ public class VoteObj {
return true;
if (err5 == null)
return true;
if (err6 == null)
return true;
if (cancel == null)
return true;
if (cancel1 == null)
@@ -89,6 +92,8 @@ public class VoteObj {
err4 = "<light_purple>[AllMusic]<red>当前没有进行中的投票";
if (err5 == null)
err5 = "<light_purple>[AllMusic]<red>你已经通过了当前投票";
if (err6 == null)
err6 = "<light_purple>[AllMusic]<red>投票队列已满,无法发起投票";
if (next == null)
next = "<light_purple>[AllMusic]<yellow>已切换到播放下一首歌";
if (cancel == null)
@@ -21,10 +21,6 @@ public class PlayerAddMusicObj {
* 参数
*/
public String[] args;
/**
* 是否是默认点歌方式
*/
public boolean isDefault;
/**
* 歌曲Url
*/
@@ -4,6 +4,7 @@ import com.coloryr.allmusic.codec.CommandType;
import com.coloryr.allmusic.codec.HudPosObj;
import com.coloryr.allmusic.codec.MusicPack;
import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.IMusicApi;
import com.coloryr.allmusic.server.core.music.PlayMusic;
import com.coloryr.allmusic.server.core.objs.music.PlayerAddMusicObj;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
@@ -154,7 +155,13 @@ public abstract class BaseSide {
* 重载
*/
public final void reload() {
AllMusic.init(getFolder());
File basePath = getFolder();
AllMusic.init(basePath);
for (IMusicApi api : AllMusic.MUSIC_APIS.values()) {
api.reload(basePath);
}
}
/**
@@ -5,6 +5,7 @@ import com.coloryr.allmusic.server.core.IMusicApi;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
@@ -12,8 +13,11 @@ import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
public class MusicApiLoader {
private static final byte VERSION = '2';
public static List<IMusicApi> loadFromDirectory(File dir) {
List<IMusicApi> instances = new ArrayList<>();
if (!dir.exists() || !dir.isDirectory()) {
@@ -34,6 +38,23 @@ public class MusicApiLoader {
List<IMusicApi> instances = new ArrayList<>();
try (JarFile jar = new JarFile(jarFile)) {
ZipEntry entry1 = jar.getEntry("version");
if (entry1 == null) {
AllMusic.log.data("<light_purple>[AllMusic]<red>旧版API,跳过加载:" + jarFile.getName());
return instances;
}
InputStream stream = jar.getInputStream(entry1);
int size = stream.available();
byte[] temp = new byte[size];
stream.read(temp);
if (temp[0] != VERSION) {
AllMusic.log.data("<light_purple>[AllMusic]<red>旧版API,跳过加载:" + jarFile.getName());
return instances;
}
Enumeration<JarEntry> entries = jar.entries();
List<String> classNames = new ArrayList<>();