diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/AllMusic.java b/server/src/main/java/com/coloryr/allmusic/server/core/AllMusic.java index 5b1108fe..d4f07ac0 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/AllMusic.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/AllMusic.java @@ -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("[AllMusic]没有注册音乐"); } + for (IMusicApi api : MUSIC_APIS.values()) { + api.reload(basePath); + } + log.data("[AllMusic]已启动-" + version); } @@ -405,11 +411,13 @@ public class AllMusic { public static void init(File file) { log.data("[AllMusic]正在启动,感谢使用,本插件交流群: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("[AllMusic]启动失败"); diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/IMusicApi.java b/server/src/main/java/com/coloryr/allmusic/server/core/IMusicApi.java index 84589812..0f955342 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/IMusicApi.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/IMusicApi.java @@ -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 tab(Object sender, String name, String[] args); } diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/CommandEX.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/CommandEX.java index dccd8096..b7616e53 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/CommandEX.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/CommandEX.java @@ -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: diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandAgree.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandAgree.java index cf8a8ff8..39ff05a0 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandAgree.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandAgree.java @@ -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())) diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandApiCommand.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandApiCommand.java new file mode 100644 index 00000000..695e7516 --- /dev/null +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandApiCommand.java @@ -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, "[AllMusic]没有指定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 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); + } + } +} diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandPush.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandPush.java index b62f40e8..23604c53 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandPush.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandPush.java @@ -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) { diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandReload.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandReload.java index 66a459cd..3aa78247 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandReload.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandReload.java @@ -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 { diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearch.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearch.java index 70efe362..b0e90206 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearch.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearch.java @@ -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); } } diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearchApi.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearchApi.java index ce8dadff..ab05227b 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearchApi.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandSearchApi.java @@ -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 diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandVote.java b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandVote.java index eef944d1..96479404 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandVote.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/command/sub/CommandVote.java @@ -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); diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/music/MusicSearch.java b/server/src/main/java/com/coloryr/allmusic/server/core/music/MusicSearch.java index 0ff085ed..7b563b17 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/music/MusicSearch.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/music/MusicSearch.java @@ -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); diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayMusic.java b/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayMusic.java index dda44f9b..5156a7d3 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayMusic.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayMusic.java @@ -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 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); diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayRuntime.java b/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayRuntime.java index 12660f15..4f9e606e 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayRuntime.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/music/PlayRuntime.java @@ -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); + } } } } diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/music/VoteItem.java b/server/src/main/java/com/coloryr/allmusic/server/core/music/VoteItem.java index 7cc2d7d5..e4fe1ffa 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/music/VoteItem.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/music/VoteItem.java @@ -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()); + } } diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/objs/message/VoteObj.java b/server/src/main/java/com/coloryr/allmusic/server/core/objs/message/VoteObj.java index 34749430..67fce7e2 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/objs/message/VoteObj.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/objs/message/VoteObj.java @@ -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 = "[AllMusic]当前没有进行中的投票"; if (err5 == null) err5 = "[AllMusic]你已经通过了当前投票"; + if (err6 == null) + err6 = "[AllMusic]投票队列已满,无法发起投票"; if (next == null) next = "[AllMusic]已切换到播放下一首歌"; if (cancel == null) diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/objs/music/PlayerAddMusicObj.java b/server/src/main/java/com/coloryr/allmusic/server/core/objs/music/PlayerAddMusicObj.java index 0f187f35..defb660e 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/objs/music/PlayerAddMusicObj.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/objs/music/PlayerAddMusicObj.java @@ -21,10 +21,6 @@ public class PlayerAddMusicObj { * 参数 */ public String[] args; - /** - * 是否是默认点歌方式 - */ - public boolean isDefault; /** * 歌曲Url */ diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/side/BaseSide.java b/server/src/main/java/com/coloryr/allmusic/server/core/side/BaseSide.java index c1978ccc..84d01773 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/side/BaseSide.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/side/BaseSide.java @@ -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); + } } /** diff --git a/server/src/main/java/com/coloryr/allmusic/server/core/utils/MusicApiLoader.java b/server/src/main/java/com/coloryr/allmusic/server/core/utils/MusicApiLoader.java index cf02e823..0bf6e2ea 100644 --- a/server/src/main/java/com/coloryr/allmusic/server/core/utils/MusicApiLoader.java +++ b/server/src/main/java/com/coloryr/allmusic/server/core/utils/MusicApiLoader.java @@ -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 loadFromDirectory(File dir) { List instances = new ArrayList<>(); if (!dir.exists() || !dir.isDirectory()) { @@ -34,6 +38,23 @@ public class MusicApiLoader { List instances = new ArrayList<>(); try (JarFile jar = new JarFile(jarFile)) { + ZipEntry entry1 = jar.getEntry("version"); + + if (entry1 == null) { + AllMusic.log.data("[AllMusic]旧版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("[AllMusic]旧版API,跳过加载:" + jarFile.getName()); + return instances; + } + Enumeration entries = jar.entries(); List classNames = new ArrayList<>();