Initial commit

This commit is contained in:
thehrz 2025-02-05 18:09:54 +08:00
commit eecc3178b1
Signed by: thehrz
GPG Key ID: C84CBCE7D5F88855
121 changed files with 10602 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
.idea
.vscode

42
build.gradle.kts Normal file
View File

@ -0,0 +1,42 @@
plugins {
kotlin("jvm") version "2.0.10"
id("java")
id("com.github.johnrengelman.shadow") version "8.1.1"
}
group = "io.github.thehrz.allmusicreload"
version = "1.0.0"
repositories {
mavenCentral()
maven("https://hub.spigotmc.org/nexus/content/groups/public")
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
maven("https://jitpack.io")
maven(" https://mvnrepository.com/artifact/mysql/mysql-connector-java")
maven("https://maven.citizensnpcs.co/repo")
maven("https://nexus.velocitypowered.com/repository/maven-public/")
}
dependencies {
compileOnly("net.md-5:bungeecord-api:1.20-R0.1-SNAPSHOT")
compileOnly("com.github.MilkBowl:VaultAPI:1.7.1")
compileOnly("com.velocitypowered:velocity-api:3.0.0")
compileOnly("me.clip:placeholderapi:2.11.6")
implementation("org.xerial:sqlite-jdbc:3.46.0.1")
api("com.squareup.okhttp3:okhttp:4.12.0")
api("com.google.code.gson:gson:2.11.0")
annotationProcessor("com.velocitypowered:velocity-api:3.0.0")
}
val targetJavaVersion = 17
kotlin {
jvmToolchain(targetJavaVersion)
}
tasks.shadowJar {
exclude("kotlin/**")
}
tasks.build {
dependsOn("shadowJar")
}

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Mon Feb 03 17:44:49 CST 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

234
gradlew vendored Executable file
View File

@ -0,0 +1,234 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

89
gradlew.bat vendored Normal file
View File

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

2
settings.gradle.kts Normal file
View File

@ -0,0 +1,2 @@
rootProject.name = "AllMusicReload"

View File

@ -0,0 +1,60 @@
package io.github.thehrz.allmusicreload;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.velocity.*;
import com.google.inject.Inject;
import com.velocitypowered.api.command.CommandMeta;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.event.proxy.ProxyShutdownEvent;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.ProxyServer;
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier;
import org.slf4j.Logger;
import java.nio.file.Path;
@Plugin(id = "allmusicreload", name = "AllMusicReload", version = AllMusic.version,
authors = {"Color_yr", "thehrz"})
public class AllMusicVelocity {
public static AllMusicVelocity plugin;
public static ChannelIdentifier channel;
public static ChannelIdentifier channelBC;
public final ProxyServer server;
public final Path dataDirectory;
private final Logger logger;
@Inject
public AllMusicVelocity(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) {
this.server = server;
this.logger = logger;
this.dataDirectory = dataDirectory;
}
@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
plugin = this;
AllMusic.log = new LogVelocity(logger);
AllMusic.side = new SideVelocity();
new AllMusic().init(dataDirectory.toFile());
CommandMeta meta = server.getCommandManager().metaBuilder("music")
.build();
channel = () -> AllMusic.channel;
channelBC = MinecraftChannelIdentifier.from(AllMusic.channelBC);
server.getChannelRegistrar().register(channelBC);
server.getCommandManager().register(meta, new CommandVelocity());
server.getEventManager().register(this, new ListenerVelocity());
AllMusic.start();
}
@Subscribe
public void onStop(ProxyShutdownEvent event) {
AllMusic.stop();
}
}

View File

@ -0,0 +1,51 @@
package io.github.thehrz.allmusicreload.codec;
import io.github.thehrz.allmusicreload.core.objs.enums.ComType;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.nio.charset.StandardCharsets;
public class PacketCodec {
public static ByteBuf pack(ComType type, String data, int data1) {
ByteBuf buf = Unpooled.buffer(0);
buf.writeByte(type.ordinal());
switch (type) {
case HUD:
case LYRIC:
case LIST:
case INFO:
case IMG:
case PLAY:
writeString(buf, data);
break;
case POS:
buf.writeInt(data1);
break;
}
return buf;
}
public static void pack(ByteBuf buf, ComType type, String data, int data1) {
buf.writeByte(type.ordinal());
switch (type) {
case HUD:
case LYRIC:
case LIST:
case INFO:
case IMG:
case PLAY:
writeString(buf, data);
break;
case POS:
buf.writeInt(data1);
break;
}
}
private static void writeString(ByteBuf buf, String text) {
byte[] temp = text.getBytes(StandardCharsets.UTF_8);
buf.writeInt(temp.length);
buf.writeBytes(temp);
}
}

View File

@ -0,0 +1,448 @@
package io.github.thehrz.allmusicreload.core;
import io.github.thehrz.allmusicreload.core.music.api.APIMain;
import io.github.thehrz.allmusicreload.core.music.play.MusicSearch;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayRuntime;
import io.github.thehrz.allmusicreload.core.objs.CookieObj;
import io.github.thehrz.allmusicreload.core.objs.config.ConfigObj;
import io.github.thehrz.allmusicreload.core.objs.message.MessageObj;
import io.github.thehrz.allmusicreload.core.objs.music.SearchPageObj;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import io.github.thehrz.allmusicreload.core.side.BaseSide;
import io.github.thehrz.allmusicreload.core.side.IMyLogger;
import io.github.thehrz.allmusicreload.core.sql.DataSql;
import io.github.thehrz.allmusicreload.core.sql.IEconomy;
import io.github.thehrz.allmusicreload.core.utils.Logs;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.*;
public class AllMusic {
public static final Gson gson = new Gson();
/**
* 客户端插件信道名
*/
public static final String channel = "allmusic:channel";
/**
* BC插件信道名
*/
public static final String channelBC = "allmusic:channelbc";
/**
* 插件版本号
*/
public static final String version = "1.0.0";
/**
* 配置文件版本号
*/
public static final String configVersion = "203";
/**
* 语言文件配置版本号
*/
public static final String messageVersion = "206";
/**
* 搜歌结果
* 玩家名 结果
*/
private static final Map<String, SearchPageObj> searchSave = new HashMap<>();
/**
* 正在播放的玩家
*/
private static final Set<String> nowPlayPlayer = new HashSet<>();
/**
* 日志
*/
public static IMyLogger log;
/**
* 服务器端操作
*/
public static BaseSide side;
/**
* 是否在运行
*/
public static boolean isRun;
/**
* Cookie对象
*/
public static CookieObj cookie;
/**
* 经济插件对象
*/
public static IEconomy economy;
/**
* 网易API
*/
private static APIMain apiMusic;
/**
* 配置对象
*/
private static ConfigObj config;
/**
* 语言对象
*/
private static MessageObj message;
/**
* 配置文件
*/
private static File configFile;
/**
* Cookie文件
*/
private static File cookieFile;
/**
* 语言文件
*/
private static File messageFile;
/**
* 检查配置文件完整性
*/
public static void configCheck() {
if (config == null || config.check()) {
config = ConfigObj.make();
log.warning("§d[AllMusic3]§c配置文件config.json错误已覆盖");
saveConfig();
}
}
/**
* 检查语言文件完整性
*/
private static void messageCheck() {
if (message == null || message.check()) {
message = MessageObj.make();
log.warning("§d[AllMusic3]§c配置文件message.json错误已覆盖");
saveMessage();
}
}
/**
* 检查是否需要
*
* @param name 用户名
* @param server 服务器名
* @param checkList 是否检查正在播放的列表
* @return 结果
*/
public static boolean isSkip(String name, String server, boolean checkList) {
try {
name = name.toLowerCase();
if (server != null && AllMusic.getConfig().muteServer.contains(server))
return true;
if (AllMusic.getConfig().mutePlayer.contains(name))
return true;
if (!checkList)
return false;
return AllMusic.containNowPlay(name);
} catch (NoSuchElementException e) {
return true;
}
}
/**
* 是否存在正在播放的玩家
*
* @param player 用户名
* @return 是否存在
*/
public static boolean containNowPlay(String player) {
player = player.toLowerCase();
return !nowPlayPlayer.contains(player);
}
/**
* 获取配置文件
*
* @return 配置对象
*/
public static ConfigObj getConfig() {
if (config == null) {
log.warning("§d[AllMusic3]§c配置文件config.json错误已使用默认配置文件");
config = ConfigObj.make();
}
return config;
}
/**
* 获取语言文件
*
* @return 语言对象
*/
public static MessageObj getMessage() {
if (message == null) {
log.warning("§d[AllMusic3]§c配置文件message.json错误已使用默认配置文件");
message = MessageObj.make();
}
return message;
}
/**
* 添加搜歌结果
*
* @param player 用户名
* @param page 结果
*/
public static void addSearch(String player, SearchPageObj page) {
player = player.toLowerCase();
searchSave.put(player, page);
}
/**
* 获取搜歌结果
*
* @param player 用户名
* @return 结果
*/
public static SearchPageObj getSearch(String player) {
player = player.toLowerCase();
return searchSave.get(player);
}
/**
* 删除搜歌结果
*
* @param player 用户名
*/
public static void removeSearch(String player) {
player = player.toLowerCase();
searchSave.remove(player);
}
/**
* 添加正在播放的玩家
*
* @param player 用户名
*/
public static void addNowPlayPlayer(String player) {
player = player.toLowerCase();
nowPlayPlayer.add(player);
}
/**
* 删除正在播放的玩家
*
* @param player 用户名
*/
public static void removeNowPlayPlayer(String player) {
player = player.toLowerCase();
nowPlayPlayer.remove(player);
}
/**
* 清空正在播放玩家的列表
*/
public static void clearNowPlayer() {
nowPlayPlayer.clear();
}
/**
* 保存配置文件
*/
public static void saveConfig() {
try {
String data = new GsonBuilder().setPrettyPrinting().create().toJson(config);
FileOutputStream out = new FileOutputStream(configFile);
OutputStreamWriter write = new OutputStreamWriter(
out, StandardCharsets.UTF_8);
write.write(data);
write.close();
out.close();
} catch (Exception e) {
log.warning("§d[AllMusic3]§c配置文件保存错误");
e.printStackTrace();
}
}
public static void saveMessage() {
try {
String data = new GsonBuilder().setPrettyPrinting().create().toJson(message);
FileOutputStream out = new FileOutputStream(messageFile);
OutputStreamWriter write = new OutputStreamWriter(
out, StandardCharsets.UTF_8);
write.write(data);
write.close();
out.close();
} catch (Exception e) {
log.warning("§d[AllMusic3]§c配置文件保存错误");
e.printStackTrace();
}
}
/**
* 保存Cookie
*/
public static void saveCookie() {
try {
String data = new GsonBuilder().setPrettyPrinting().create().toJson(cookie);
FileOutputStream out = new FileOutputStream(cookieFile);
OutputStreamWriter write = new OutputStreamWriter(
out, StandardCharsets.UTF_8);
write.write(data);
write.close();
} catch (Exception e) {
log.warning("§d[AllMusic3]§c配置文件保存错误");
e.printStackTrace();
}
}
/**
* 启动插件
*/
public static void start() {
AllMusic.apiMusic = new APIMain();
PlayMusic.start();
PlayRuntime.start();
MusicSearch.start();
DataSql.start();
log.info("§d[AllMusic3]§e已启动-" + version);
}
/**
* 停止插件
*/
public static void stop() {
try {
PlayMusic.clearVote();
PlayMusic.clearPush();
Logs.stop();
side.sendStop();
MusicSearch.stop();
PlayMusic.stop();
PlayRuntime.stop();
DataSql.stop();
} catch (IOException e) {
e.printStackTrace();
}
log.info("§d[AllMusic3]§2§e已停止感谢使用");
}
/**
* 获取音乐API
*
* @return 音乐API
*/
public static APIMain getMusicApi() {
return apiMusic;
}
/**
* 加载配置文件
*/
private static void loadConfig() {
try {
InputStreamReader reader = new InputStreamReader(
Files.newInputStream(configFile.toPath()), StandardCharsets.UTF_8);
BufferedReader bf = new BufferedReader(reader);
config = new Gson().fromJson(bf, ConfigObj.class);
bf.close();
reader.close();
configCheck();
reader = new InputStreamReader(Files.newInputStream(messageFile.toPath()), StandardCharsets.UTF_8);
bf = new BufferedReader(reader);
message = new Gson().fromJson(bf, MessageObj.class);
bf.close();
reader.close();
messageCheck();
log.info("§d[AllMusic3]§e当前语言配置文件版本为" + messageVersion
+ ",你的语言文件版本为:" + message.version);
if (!message.version.equalsIgnoreCase(messageVersion)) {
log.warning("§d[AllMusic3]§c语言文件版本号错误运行可能会发生问题请删除后重载");
}
reader = new InputStreamReader(Files.newInputStream(cookieFile.toPath()), StandardCharsets.UTF_8);
bf = new BufferedReader(reader);
cookie = new Gson().fromJson(bf, CookieObj.class);
bf.close();
reader.close();
if (cookie == null || cookie.cookieStore == null) {
cookie = new CookieObj();
saveCookie();
}
log.info("§d[AllMusic3]§e当前插件配置文件版本为" + configVersion
+ ",你的配置文件版本为:" + config.version);
if (!AllMusic.configVersion.equalsIgnoreCase(config.version)) {
log.warning("§d[AllMusic3]§c请及时更新配置文件");
}
} catch (Exception e) {
log.warning("§d[AllMusic3]§c读取配置文件错误");
e.printStackTrace();
}
}
/**
* 加入时播放
*
* @param player 用户名
*/
public static void joinPlay(String player) {
player = player.toLowerCase();
if (getConfig().mutePlayer.contains(player) || nowPlayPlayer.contains(player)) {
return;
}
String finalPlayer = player;
AllMusic.side.runTask(() -> {
SongInfoObj music = PlayMusic.nowPlayMusic;
if (music != null && PlayMusic.url != null) {
AllMusic.side.sendHudPos(finalPlayer);
AllMusic.side.sendMusic(finalPlayer, PlayMusic.url);
if (!music.isUrl()) {
AllMusic.side.sendPic(finalPlayer, music.getPicUrl());
}
AllMusic.side.sendPos(finalPlayer, (int)PlayMusic.musicNowTime);
}
}, 40);
}
/**
* 读取配置文件
*
* @param file 配置文件文件夹
*/
public void init(File file) {
log.info("§d[AllMusic3]§2§e正在启动感谢使用本插件交流群571239090");
try {
if (!file.exists())
file.mkdir();
if (configFile == null)
configFile = new File(file, "config.json");
if (messageFile == null)
messageFile = new File(file, "message.json");
if (cookieFile == null)
cookieFile = new File(file, "cookie.json");
if (Logs.file == null)
Logs.file = new File(file, "logs.log");
if (DataSql.sqlFile == null)
DataSql.sqlFile = new File(file, "data.db");
if (!configFile.exists()) {
configFile.createNewFile();
}
if (!messageFile.exists()) {
messageFile.createNewFile();
}
if (!cookieFile.exists()) {
cookieFile.createNewFile();
}
if (!Logs.file.exists()) {
Logs.file.createNewFile();
}
loadConfig();
isRun = true;
} catch (IOException e) {
isRun = false;
log.warning("§d[AllMusic3]§c启动失败");
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,67 @@
package io.github.thehrz.allmusicreload.core;
import io.github.thehrz.allmusicreload.core.objs.config.SaveObj;
import io.github.thehrz.allmusicreload.core.objs.enums.HudType;
import io.github.thehrz.allmusicreload.core.utils.HudUtils;
public class AllMusicAPI {
/**
* 发送播放音乐
*
* @param name 用户名
* @param url 链接
*/
public static void playMusic(String name, String url) {
AllMusic.side.sendMusic(name, url);
}
/**
* 更新玩家Hud数据
*
* @param name 用户名
* @param pos 位置
* @param data 数据
*/
public static void sendHud(String name, HudType pos, String data) {
AllMusic.side.sendHud(name, pos, data);
}
/**
* 发送图片
*
* @param name 用户名
* @param url 图片地址
*/
public static void sendPic(String name, String url) {
AllMusic.side.sendPic(name, url);
}
/**
* 停止播放
*
* @param name 用户名
*/
public static void sendStop(String name) {
AllMusic.side.sendStop(name);
}
/**
* 获取玩家Hud信息
*
* @param player 玩家
* @return Hud信息
*/
public static SaveObj getHud(String player) {
return HudUtils.get(player);
}
/**
* 设置玩家Hud
*
* @param player 玩家
* @param hud Hud信息
*/
public static void setHud(String player, SaveObj hud) {
HudUtils.set(player, hud);
}
}

View File

@ -0,0 +1,11 @@
package io.github.thehrz.allmusicreload.core.command;
import java.util.Collections;
import java.util.List;
public abstract class ACommand implements ICommand {
@Override
public List<String> tab(String name, String[] args, int index) {
return Collections.emptyList();
}
}

View File

@ -0,0 +1,11 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.objs.enums.HudType;
public abstract class AHudCommand extends ACommand {
protected final HudType type;
public AHudCommand(HudType type) {
this.type = type;
}
}

View File

@ -0,0 +1,31 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.utils.Function;
public class CommandAddList extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
String musicID;
if (args[1].contains("id=") && !args[1].contains("/?userid")) {
if (args[1].contains("&user"))
musicID = Function.getString(args[1], "id=", "&user");
else
musicID = Function.getString(args[1], "id=", null);
} else
musicID = args[1];
if (Function.isInteger(musicID)) {
AllMusic.getMusicApi().setList(musicID, sender);
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2添加空闲音乐列表" + musicID);
} else {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2请输入有效的音乐列表ID");
}
}
}

View File

@ -0,0 +1,43 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import io.github.thehrz.allmusicreload.core.utils.Function;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CommandBan extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
if (Function.isInteger(args[1])) {
AllMusic.getConfig().addBanMusic(args[1]);
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2已禁止点歌" + args[1]);
} else {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2请输入有效的ID");
}
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index || (args.length == index + 1 && args[index].isEmpty())) {
List<String> list = new ArrayList<>();
if (PlayMusic.nowPlayMusic != null) {
list.add(PlayMusic.nowPlayMusic.getID());
}
for (SongInfoObj item : PlayMusic.getList()) {
list.add(item.getID());
}
return list;
}
return Collections.emptyList();
}
}

View File

@ -0,0 +1,28 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
public class CommandBanPlayer implements ICommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
AllMusic.getConfig().addBanPlayer(args[1].toLowerCase(Locale.ROOT));
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2已禁止玩家" + args[1] + "点歌");
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index || (args.length == index + 1 && args[index].isEmpty())) {
return AllMusic.side.getPlayerList();
}
return Collections.emptyList();
}
}

View File

@ -0,0 +1,70 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CommandCancel implements ICommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 1) {
SongInfoObj id = PlayMusic.findPlayerMusic(name);
if (id == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.err1);
return;
}
if (!id.getCall().equalsIgnoreCase(name)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.err2.replace(PAL.musicName, id.getName())
.replace(PAL.musicAuthor, id.getAuthor()));
return;
}
PlayMusic.remove(id);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.done);
} else if (args.length == 2) {
try {
int index = Integer.parseInt(args[1]);
SongInfoObj id = PlayMusic.findMusicIndex(index);
if (id == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.err3
.replace(PAL.index, args[1]));
return;
}
if (!id.getCall().equalsIgnoreCase(name)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.err2.replace(PAL.musicName, id.getName())
.replace(PAL.musicAuthor, id.getAuthor()));
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.done);
} catch (Exception e) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cancel.err4);
}
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == 1 || (args.length == 2 && args[1].isEmpty())) {
List<String> list = new ArrayList<>();
List<SongInfoObj> list1 = PlayMusic.getList();
if (list1.size() > 1) {
for (int a = 1; a < list1.size(); a++) {
SongInfoObj item = list1.get(a);
if (item.getCall().equalsIgnoreCase(name)) {
list.add(String.valueOf(a));
}
}
}
return list;
}
return Collections.emptyList();
}
}

View File

@ -0,0 +1,12 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
public class CommandClearList extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
PlayMusic.clearIdleList();
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2添加空闲音乐列表已清空");
}
}

View File

@ -0,0 +1,57 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.UserCookie;
import com.google.gson.reflect.TypeToken;
import okhttp3.Cookie;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class CommandCookie extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§c没有Cookie数据");
return;
}
if (AllMusic.side.isPlayer(sender)) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§c请在控制台上操作");
return;
}
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§d设置网易云账户");
try {
String cookie = args[1];
String[] cookies = cookie.split(";");
Map<String, Cookie> list1 = new HashMap<>();
for (String item : cookies) {
String[] cookieitem = item.split("=");
if (cookieitem.length == 1) {
if (list1.containsKey(cookieitem[0])) {
continue;
}
list1.put(cookieitem[0], new Cookie.Builder()
.name(cookieitem[0])
.domain("163.com")
.expiresAt(Long.MAX_VALUE)
.build());
} else {
list1.put(cookieitem[0], new Cookie.Builder()
.name(cookieitem[0])
.value(cookieitem[1])
.domain("163.com")
.expiresAt(Long.MAX_VALUE)
.build());
}
}
AllMusic.cookie.cookieStore.put("music.163.com", new ArrayList<>(list1.values()));
AllMusic.saveCookie();
} catch (Exception e) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§c错误的cookie");
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,47 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.utils.Function;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CommandDelete extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
if (!args[1].isEmpty() && Function.isInteger(args[1])) {
int music = Integer.parseInt(args[1]);
if (music == 0) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2请输入有效的序列ID");
return;
}
if (music > PlayMusic.getListSize()) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2序列号过大");
return;
}
PlayMusic.remove(music - 1);
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2已删除序列" + music);
} else {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2请输入有效的序列ID");
}
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == 1 || (args.length == 2 && args[1].isEmpty())) {
List<String> list = new ArrayList<>();
for (int a = 0; a < PlayMusic.getListSize(); a++) {
list.add(String.valueOf(a + 1));
}
return list;
}
return Collections.emptyList();
}
}

View File

@ -0,0 +1,303 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.MusicSearch;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.MusicObj;
import io.github.thehrz.allmusicreload.core.utils.Function;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CommandEX {
public static final Map<String, ICommand> commandList = new HashMap<>();
public static final Map<String, ICommand> commandAdminList = new HashMap<>();
private static final List<String> normal = new ArrayList<String>() {{
this.add("stop");
this.add("cancel");
this.add("list");
this.add("vote");
this.add("mute");
this.add("search");
this.add("hud");
this.add("push");
}};
/**
* 管理员的指令
*/
private static final List<String> admin = new ArrayList<String>() {{
this.add("reload");
this.add("next");
this.add("ban");
this.add("delete");
this.add("addlist");
this.add("clearlist");
this.add("cookie");
this.add("test");
}};
/**
* 搜歌的指令
*/
private static final List<String> search = new ArrayList<String>() {{
this.add("select");
this.add("nextpage");
this.add("lastpage");
}};
static {
commandList.put("stop", new CommandStop());
commandList.put("help", new CommandHelp());
commandList.put("list", new CommandList());
commandList.put("vote", new CommandVote());
commandList.put("mute", new CommandMute());
commandList.put("search", new CommandSearch());
commandList.put("select", new CommandSelect());
commandList.put("nextpage", new CommandNextPage());
commandList.put("lastpage", new CommandLastPage());
commandList.put("hud", new CommandHud());
commandList.put("reload", new CommandReload());
commandList.put("push", new CommandPush());
commandList.put("cancel", new CommandCancel());
commandAdminList.put("next", new CommandNext());
commandAdminList.put("ban", new CommandBan());
commandAdminList.put("banplayer", new CommandBanPlayer());
commandAdminList.put("url", new CommandUrl());
commandAdminList.put("delete", new CommandDelete());
commandAdminList.put("addlist", new CommandAddList());
commandAdminList.put("clearlist", new CommandClearList());
commandAdminList.put("cookie", new CommandCookie());
commandAdminList.put("test", new CommandTest());
}
/**
* 搜索音乐
*
* @param sender 发送者
* @param name 用户名
* @param args 参数
* @param isDefault 是否是默认点歌方式
*/
public static void searchMusic(Object sender, String name, String[] args, boolean isDefault) {
MusicObj obj = new MusicObj();
obj.sender = sender;
obj.name = name;
obj.args = args;
obj.isDefault = isDefault;
if (AllMusic.side.onMusicAdd(sender, obj)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.cancel);
return;
}
MusicSearch.addSearch(obj);
}
/**
* 检查金额是否够
*
* @param sender 发送者
* @param name 用户名
* @param cost 金额
* @return 结果
*/
public static boolean checkMoney(Object sender, String name, int cost) {
if (!AllMusic.getConfig().cost.useCost || AllMusic.economy == null) {
return false;
}
if (!AllMusic.economy.check(name, cost)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cost.noMoney);
return true;
}
return false;
}
/**
* 扣钱
*
* @param sender 发送者
* @param name 用户名
* @param cost 金额
* @param message 结果消息
* @return 结果
*/
public static boolean cost(Object sender, String name, int cost, String message) {
if (!AllMusic.getConfig().cost.useCost || AllMusic.economy == null) {
return false;
}
if (AllMusic.economy.cost(name, cost)) {
AllMusic.side.sendMessage(sender, message
.replace(PAL.cost, String.valueOf(cost)));
return false;
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().cost.costFail);
return true;
}
}
/**
* 添加音乐
*
* @param sender 发送者
* @param name 用户名
* @param args 参数
*/
public static void addMusic(Object sender, String name, String[] args) {
String musicID;
if (args[0].contains("id=") && !args[0].contains("/?userid")) {
if (args[0].contains("&uct2")) {
musicID = Function.getString(args[0], "id=", "&uct2");
}
else if (args[0].contains("&user"))
musicID = Function.getString(args[0], "id=", "&user");
else
musicID = Function.getString(args[0], "id=", null);
} else if (args[0].contains("song/")) {
if (args[0].contains("/?userid"))
musicID = Function.getString(args[0], "song/", "/?userid");
else
musicID = Function.getString(args[0], "song/", null);
} else
musicID = args[0];
if (Function.isInteger(musicID)) {
if (PlayMusic.getListSize() >= AllMusic.getConfig().maxPlayList) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.listFull);
} else if (AllMusic.getConfig().banMusic.contains(musicID)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.banMusic);
} else if (PlayMusic.haveMusic(musicID)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.existMusic);
} else if (PlayMusic.isPlayerMax(name)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.playerToMany);
} else if (AllMusic.getConfig().banPlayer.contains(name)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.playerBan);
} else {
if (checkMoney(sender, name, AllMusic.getConfig().cost.addMusicCost)) {
return;
}
if (cost(sender, name, AllMusic.getConfig().cost.addMusicCost,
AllMusic.getMessage().cost.addMusic)) {
return;
}
AllMusic.getConfig().removeNoMusicPlayer(name);
if (AllMusic.side.needPlay()) {
MusicObj obj = new MusicObj();
obj.sender = sender;
obj.id = musicID;
obj.name = name;
obj.isDefault = false;
if (AllMusic.side.onMusicAdd(sender, obj)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.cancel);
return;
}
PlayMusic.addTask(obj);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.success);
} else
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.noPlayer);
}
} else
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.noID);
}
private static boolean isAdmin(String name)
{
for (String item : AllMusic.getConfig().adminList) {
if (item.equalsIgnoreCase(name)) {
return true;
}
}
return false;
}
/**
* 执行命令
*
* @param sender 发送者
* @param name 用户名
* @param args 参数
*/
public static void execute(Object sender, String name, String[] args) {
if (args.length == 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
ICommand command = commandList.get(args[0]);
if (command != null) {
command.execute(sender, name, args);
return;
}
if (isAdmin(name) || AllMusic.side.checkPermission(sender)) {
command = commandAdminList.get(args[0]);
if (command != null) {
command.execute(sender, name, args);
return;
}
}
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(sender, "allmusic.addmusic"))
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.noPer);
else {
switch (AllMusic.getConfig().defaultAddMusic) {
case 1:
searchMusic(sender, name, args, true);
break;
case 0:
default:
addMusic(sender, name, args);
}
}
}
/**
* 获取Tab指令列表
*
* @param name 用户名
* @param arg 参数
* @return 指令列表
*/
public static List<String> getTabList(String name, String[] arg) {
List<String> arguments = new ArrayList<>();
if (arg.length == 0) {
arguments.addAll(normal);
if (AllMusic.side.checkPermission(name)) {
arguments.addAll(admin);
}
if (AllMusic.getSearch(name) != null) {
return search;
}
} else {
if (arg[0] == null || arg[0].isEmpty() || arg.length == 1) {
arguments.addAll(normal);
if (AllMusic.side.checkPermission(name)) {
arguments.addAll(admin);
}
if (arg[0] == null || arg[0].isEmpty()) {
if (AllMusic.getSearch(name) != null) {
return search;
}
}
} else {
ICommand command = CommandEX.commandList.get(arg[0]);
if (command != null) {
arguments.addAll(command.tab(name, arg, 1));
}
if (AllMusic.side.checkPermission(name)) {
command = CommandEX.commandAdminList.get(arg[0]);
if (command != null) {
arguments.addAll(command.tab(name, arg, 1));
}
}
}
}
return arguments;
}
}

View File

@ -0,0 +1,78 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
public class CommandHelp extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().help.normal.head);
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.base,
AllMusic.getMessage().click.clickCheck, "/music ");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.stop,
AllMusic.getMessage().click.clickRun, "/music stop");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.list,
AllMusic.getMessage().click.clickRun, "/music list");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.cancel,
AllMusic.getMessage().click.clickRun, "/music cancel");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.vote,
AllMusic.getMessage().click.clickRun, "/music vote");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.vote1,
AllMusic.getMessage().click.clickRun, "/music vote cancel");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.push,
AllMusic.getMessage().click.clickRun, "/music push");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.push1,
AllMusic.getMessage().click.clickRun, "/music push cancel");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.mute,
AllMusic.getMessage().click.clickRun, "/music mute");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.search,
AllMusic.getMessage().click.clickCheck, "/music search ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.select,
AllMusic.getMessage().click.clickCheck, "/music select ");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.nextpage,
AllMusic.getMessage().click.clickRun, "/music nextpage");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.lastpage,
AllMusic.getMessage().click.clickRun, "/music lastpage");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.hud9,
AllMusic.getMessage().click.clickRun, "/music hud enable");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.normal.hud10,
AllMusic.getMessage().click.clickRun, "/music hud reset");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud1,
AllMusic.getMessage().click.clickCheck, "/music hud ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud2,
AllMusic.getMessage().click.clickCheck, "/music hud ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud6,
AllMusic.getMessage().click.clickCheck, "/music hud ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud7,
AllMusic.getMessage().click.clickCheck, "/music hud ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud8,
AllMusic.getMessage().click.clickCheck, "/music hud ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud3,
AllMusic.getMessage().click.clickCheck, "/music hud pic size ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud4,
AllMusic.getMessage().click.clickCheck, "/music hud pic rotate ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.normal.hud5,
AllMusic.getMessage().click.clickCheck, "/music hud pic speed ");
if (AllMusic.side.checkPermission(name)) {
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.admin.reload,
AllMusic.getMessage().click.clickRun, "/music reload");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.admin.next,
AllMusic.getMessage().click.clickRun, "/music next");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.ban,
AllMusic.getMessage().click.clickCheck, "/music ban ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.banPlayer,
AllMusic.getMessage().click.clickCheck, "/music banplayer ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.url,
AllMusic.getMessage().click.clickCheck, "/music url ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.delete,
AllMusic.getMessage().click.clickCheck, "/music delete ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.addList,
AllMusic.getMessage().click.clickCheck, "/music addlist ");
AllMusic.side.sendMessageRun(sender, AllMusic.getMessage().help.admin.clearList,
AllMusic.getMessage().click.clickRun, "/music clearlist");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.cookie,
AllMusic.getMessage().click.clickCheck, "/music cookie ");
AllMusic.side.sendMessageSuggest(sender, AllMusic.getMessage().help.admin.test,
AllMusic.getMessage().click.clickCheck, "/music test ");
}
}
}

View File

@ -0,0 +1,95 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.enums.HudType;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.utils.HudUtils;
import java.util.*;
public class CommandHud extends ACommand {
/**
* Hud的指令
*/
private static final List<String> hudlist = new ArrayList<String>() {{
this.add("enable");
this.add("reset");
this.add("info");
this.add("list");
this.add("lyric");
this.add("pic");
}};
private final Map<String, ICommand> commandList = new HashMap<>();
public CommandHud() {
commandList.put("enable", new HudEnable());
commandList.put("reset", new HudReset());
commandList.put("info", new CommandHudSet(HudType.INFO));
commandList.put("list", new CommandHudSet(HudType.LIST));
commandList.put("lyric", new CommandHudSet(HudType.LYRIC));
commandList.put("pic", new CommandHudSet(HudType.PIC));
}
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 1) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
} else {
ICommand command = commandList.get(args[1]);
if (command != null) {
command.execute(sender, name, args);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
}
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
return hudlist;
} else {
ICommand command = commandList.get(args[index]);
if (command != null) {
return command.tab(name, args, index + 1);
}
}
return Collections.emptyList();
}
private static class HudEnable extends ACommand {
private static final List<String> tf = new ArrayList<String>() {{
this.add("true");
this.add("false");
}};
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 2 || args.length == 3) {
boolean temp = HudUtils.setHudEnable(name, null, args.length == 3 ? args[2] : null);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.state
.replace(PAL.state, temp ? "启用" : "关闭")
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(null)));
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
return tf;
}
return Collections.emptyList();
}
}
private static class HudReset extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
HudUtils.reset(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.reset
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(null)));
}
}
}

View File

@ -0,0 +1,285 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.enums.HudDirType;
import io.github.thehrz.allmusicreload.core.objs.enums.HudType;
import io.github.thehrz.allmusicreload.core.objs.hud.PosObj;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.utils.HudUtils;
import java.util.*;
public class CommandHudSet extends AHudCommand {
/**
* Hud的指令
*/
private static final List<String> hud = new ArrayList<String>() {{
this.add("enable");
this.add("pos");
this.add("dir");
this.add("reset");
}};
private static final List<String> pic = new ArrayList<String>() {{
this.add("size");
this.add("rotate");
this.add("speed");
}};
private static final List<String> info = new ArrayList<String>() {{
this.add("color");
this.add("shadow");
}};
private static final List<String> tf = new ArrayList<String>() {{
this.add("true");
this.add("false");
}};
private final Map<String, ICommand> commandList = new HashMap<>();
public CommandHudSet(HudType type) {
super(type);
commandList.put("enable", new HudEnable(type));
commandList.put("reset", new HudReset(type));
commandList.put("pos", new HudPos(type));
commandList.put("dir", new HudDir(type));
if (type == HudType.PIC) {
commandList.put("size", new PicSize());
commandList.put("rotate", new PicRotate());
commandList.put("speed", new PicRotateSpeed());
} else {
commandList.put("color", new HudColor(type));
commandList.put("shadow", new HudShadow(type));
}
}
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
} else {
ICommand command = commandList.get(args[2]);
if (command != null) {
command.execute(sender, name, args);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
}
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
List<String> list = new ArrayList<>(hud);
if (type == HudType.PIC) {
list.addAll(pic);
} else {
list.addAll(info);
}
return list;
} else {
ICommand command = commandList.get(args[index]);
if (command != null) {
return command.tab(name, args, index + 1);
}
}
return Collections.emptyList();
}
private static class HudEnable extends AHudCommand {
public HudEnable(HudType type) {
super(type);
}
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 3 || args.length == 4) {
boolean temp = HudUtils.setHudEnable(name, type, args.length == 4 ? args[3] : null);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.state
.replace(PAL.state, temp
? AllMusic.getMessage().hudList.enable
: AllMusic.getMessage().hudList.disable)
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(type)));
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
return tf;
}
return Collections.emptyList();
}
}
private static class HudReset extends AHudCommand {
public HudReset(HudType type) {
super(type);
}
@Override
public void execute(Object sender, String name, String[] args) {
HudUtils.reset(name, type);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.reset
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(type)));
}
}
private static class HudPos extends AHudCommand {
public HudPos(HudType type) {
super(type);
}
@Override
public void execute(Object sender, String name, String[] args) {
try {
if (args.length != 5) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
PosObj obj = HudUtils.setHudPos(name, type, args[3], args[4]);
if (obj == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.set
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(type))
.replace(PAL.x, args[3])
.replace(PAL.y, args[4]));
} catch (Exception e) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
}
}
private static class HudDir extends AHudCommand {
private static final List<String> dir = new ArrayList<String>() {{
for (HudDirType type : HudDirType.values()) {
this.add(type.name());
}
}};
public HudDir(HudType type) {
super(type);
}
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 4) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
HudDirType type1 = HudUtils.setDir(name, type, args[3]);
if (type1 == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.set1
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(type))
.replace(PAL.dir, AllMusic.getMessage().hudList.getDir(type1)));
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
return dir;
}
return Collections.emptyList();
}
}
private static class HudColor extends AHudCommand {
public HudColor(HudType type) {
super(type);
}
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 4) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
if (!HudUtils.setColor(name, type, args[3])) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.set2
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(type))
.replace(PAL.color, args[3]));
}
}
private static class HudShadow extends AHudCommand {
public HudShadow(HudType type) {
super(type);
}
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 3 || args.length == 4) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.set3
.replace(PAL.hud, AllMusic.getMessage().hudList.getHud(type))
.replace(PAL.state, HudUtils.setShadow(name, type, args.length == 4 ? args[3] : null)
? AllMusic.getMessage().hudList.enable
: AllMusic.getMessage().hudList.disable));
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
return tf;
}
return Collections.emptyList();
}
}
private static class PicSize extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 4 || !HudUtils.setPicSize(name, args[3])) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
AllMusic.side.sendMessage(sender,
AllMusic.getMessage().hud.picSize.replace(PAL.size, args[2]));
}
}
private static class PicRotate extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length == 3 || args.length == 4) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().hud.picRotate
.replace(PAL.state, HudUtils.setPicRotate(name, args.length == 4 ? args[3] : null)
? AllMusic.getMessage().hudList.enable
: AllMusic.getMessage().hudList.disable));
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == index + 1) {
return tf;
}
return Collections.emptyList();
}
}
private static class PicRotateSpeed extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 4 || !HudUtils.setPicRotateSpeed(name, args[3])) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
AllMusic.side.sendMessage(sender,
AllMusic.getMessage().hud.picSpeed.replace(PAL.size, args[3]));
}
}
}

View File

@ -0,0 +1,24 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.MusicSearch;
import io.github.thehrz.allmusicreload.core.objs.music.SearchPageObj;
public class CommandLastPage extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(name, "allmusic.search")) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.noPer);
return;
}
SearchPageObj obj = AllMusic.getSearch(name);
if (obj == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.emptySearch);
} else if (obj.lastPage()) {
MusicSearch.showSearch(sender, obj);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.cantLast);
}
}
}

View File

@ -0,0 +1,29 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
public class CommandList extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (PlayMusic.nowPlayMusic == null || PlayMusic.nowPlayMusic.isNull()) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlayingMusic);
} else {
String info = AllMusic.getMessage().musicPlay.nowPlay;
info = info.replace(PAL.musicName, PlayMusic.nowPlayMusic.getName())
.replace(PAL.musicAuthor, PlayMusic.nowPlayMusic.getAuthor())
.replace(PAL.musicAl, PlayMusic.nowPlayMusic.getAl())
.replace(PAL.musicAlia, PlayMusic.nowPlayMusic.getAlia())
.replace(PAL.player, PlayMusic.nowPlayMusic.getCall());
AllMusic.side.sendMessage(sender, info);
}
if (PlayMusic.getListSize() == 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlay);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.listMusic.head
.replace(PAL.count, "" + PlayMusic.getListSize()));
AllMusic.side.sendMessage(sender, PlayMusic.getAllList());
}
}
}

View File

@ -0,0 +1,13 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
public class CommandMute extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
AllMusic.side.sendStop(name);
AllMusic.side.clearHud(name);
AllMusic.getConfig().addNoMusicPlayer(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.mute);
}
}

View File

@ -0,0 +1,14 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
public class CommandNext extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
PlayMusic.musicLessTime = 1;
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2已强制切歌");
AllMusic.getConfig().removeNoMusicPlayer(name);
}
}

View File

@ -0,0 +1,24 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.MusicSearch;
import io.github.thehrz.allmusicreload.core.objs.music.SearchPageObj;
public class CommandNextPage extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(name, "allmusic.search")) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.noPer);
return;
}
SearchPageObj obj = AllMusic.getSearch(name);
if (obj == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.emptySearch);
} else if (obj.nextPage()) {
MusicSearch.showSearch(sender, obj);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.cantNext);
}
}
}

View File

@ -0,0 +1,113 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CommandPush extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(name, "allmusic.push")) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.noPermission);
return;
}
if (PlayMusic.getListSize() == 0 && PlayMusic.getIdleListSize() == 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlay);
}
SongInfoObj music = null;
if (args.length == 1) {
music = PlayMusic.findPlayerMusic(name);
if (music == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.noId);
return;
}
SongInfoObj id1 = PlayMusic.findMusicIndex(1);
if (id1 != null && id1.getID().equalsIgnoreCase(music.getID())) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.pushErr);
return;
}
} else if (args.length == 2) {
if (args[1].equalsIgnoreCase("cancel")) {
if (!name.equalsIgnoreCase(PlayMusic.getPushSender())) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err1);
return;
}
if (PlayMusic.getPushTime() <= 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err2);
return;
}
PlayMusic.clearPush();
AllMusic.side.broadcast(AllMusic.getMessage().push.cancel);
return;
} else {
try {
int index = Integer.parseInt(args[1]);
music = PlayMusic.findMusicIndex(index);
} catch (Exception e) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.noId);
return;
}
if (music == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.noId1.replace(PAL.index, args[1]));
return;
}
}
} else if (args.length > 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
if (PlayMusic.getPushTime() <= 0) {
if (music == null) {
return;
}
PlayMusic.startPush(name, music);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.doVote);
String data = AllMusic.getMessage().push.bq;
AllMusic.side.broadcast(data
.replace(PAL.player, name)
.replace(PAL.time, String.valueOf(AllMusic.getConfig().voteTime))
.replace(PAL.musicName, music.getName())
.replace(PAL.musicAuthor, music.getAuthor()));
AllMusic.side.broadcastWithRun(AllMusic.getMessage().push.bq1, AllMusic.getMessage().push.bq2, "/music push");
} else {
if (music != null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err3);
return;
}
if (!PlayMusic.containPush(name)) {
PlayMusic.addPush(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.agree);
String data = AllMusic.getMessage().push.bqAgree;
data = data.replace(PAL.player, name)
.replace(PAL.count, String.valueOf(PlayMusic.getVoteCount()));
AllMusic.side.broadcast(data);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.arAgree);
}
}
AllMusic.getConfig().removeNoMusicPlayer(name);
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == 1 || (args.length == 2 && args[1].isEmpty())) {
List<String> list = new ArrayList<>();
List<SongInfoObj> list1 = PlayMusic.getList();
for (int a = 1; a < list1.size(); a++) {
SongInfoObj item = list1.get(a);
if (item.getCall().equalsIgnoreCase(name)) {
list.add(String.valueOf(a));
}
}
return list;
}
return Collections.emptyList();
}
}

View File

@ -0,0 +1,11 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
public class CommandReload extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
AllMusic.side.reload();
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2已重读配置文件");
}
}

View File

@ -0,0 +1,24 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
public class CommandSearch extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(name, "allmusic.search")) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.noPer);
return;
}
if (CommandEX.checkMoney(sender, name, AllMusic.getConfig().cost.searchCost)) {
return;
}
if (CommandEX.cost(sender, name, AllMusic.getConfig().cost.searchCost,
AllMusic.getMessage().cost.search)) {
return;
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.startSearch);
CommandEX.searchMusic(sender, name, args, false);
}
}

View File

@ -0,0 +1,54 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.SearchPageObj;
import io.github.thehrz.allmusicreload.core.utils.Function;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CommandSelect extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(name, "allmusic.search")) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.noPer);
return;
}
SearchPageObj obj = AllMusic.getSearch(name);
if (obj == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.emptySearch);
} else if (!args[1].isEmpty() && Function.isInteger(args[1])) {
int a = Integer.parseInt(args[1]);
if (a == 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.errorNum);
return;
}
String[] ID = new String[1];
ID[0] = obj.getSong((obj.getPage() * 10) + (a - 1));
AllMusic.side.sendMessage(sender,
AllMusic.getMessage().search.choice.replace(PAL.index, "" + a));
CommandEX.addMusic(sender, name, ID);
AllMusic.removeSearch(name);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().search.errorNum);
}
}
@Override
public List<String> tab(String name, String[] args, int index) {
if (args.length == 1 || (args.length == 2 && args[1].isEmpty())) {
List<String> list = new ArrayList<>();
SearchPageObj obj = AllMusic.getSearch(name);
if (obj != null) {
for (int a = 0; a < obj.getIndex(); a++) {
list.add(String.valueOf(a));
}
}
return list;
}
return Collections.emptyList();
}
}

View File

@ -0,0 +1,15 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.utils.HudUtils;
public class CommandStop extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
AllMusic.side.clearHud(name);
AllMusic.side.sendStop(name);
HudUtils.clearHud(name);
AllMusic.removeNowPlayPlayer(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.stopPlaying);
}
}

View File

@ -0,0 +1,35 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import io.github.thehrz.allmusicreload.core.utils.Function;
public class CommandTest extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
if (Function.isInteger(args[1])) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2正在测试解析" + args[1]);
try {
SongInfoObj info = AllMusic.getMusicApi().getMusic(args[1], "test", false);
if (info == null) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2测试解析失败");
return;
}
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2音乐名称 " + info.getName());
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2音乐作者 " + info.getAuthor());
String url = AllMusic.getMusicApi().getPlayUrl(args[1]);
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2播放地址 " + url);
} catch (Exception e) {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2测试解析错误");
e.printStackTrace();
}
} else {
AllMusic.side.sendMessage(sender, "§d[AllMusic3]§2请输入有效的ID");
}
}
}

View File

@ -0,0 +1,21 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.music.MusicObj;
public class CommandUrl extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (args.length != 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
MusicObj obj = new MusicObj();
obj.sender = sender;
obj.isUrl = true;
obj.url = args[1];
PlayMusic.addTask(obj);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().addMusic.success);
}
}

View File

@ -0,0 +1,57 @@
package io.github.thehrz.allmusicreload.core.command;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
public class CommandVote extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(name, "allmusic.vote")) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.noPermission);
return;
} else if (PlayMusic.getListSize() == 0 && PlayMusic.getIdleListSize() == 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlay);
} else if (PlayMusic.nowPlayMusic == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlayingMusic);
} else if (args.length == 2) {
if (args[1].equalsIgnoreCase("cancel")) {
if (!name.equalsIgnoreCase(PlayMusic.getVoteSender())) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err1);
return;
} else if (PlayMusic.getVoteTime() <= 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err2);
return;
}
AllMusic.side.broadcast(AllMusic.getMessage().vote.cancel);
PlayMusic.clearVote();
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
return;
} else if (args.length > 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
} else if (PlayMusic.getVoteTime() <= 0) {
PlayMusic.startVote(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.doVote);
String data = AllMusic.getMessage().vote.bq;
AllMusic.side.broadcast(data.replace(PAL.player, name)
.replace(PAL.time, String.valueOf(AllMusic.getConfig().voteTime)));
AllMusic.side.broadcastWithRun(AllMusic.getMessage().vote.bq1, AllMusic.getMessage().vote.bq2, "/music vote");
} else {
if (!PlayMusic.containVote(name)) {
PlayMusic.addVote(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.agree);
String data = AllMusic.getMessage().vote.bqAgree;
data = data.replace(PAL.player, name)
.replace(PAL.count, String.valueOf(PlayMusic.getVoteCount()));
AllMusic.side.broadcast(data);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.arAgree);
}
}
AllMusic.getConfig().removeNoMusicPlayer(name);
}
}

View File

@ -0,0 +1,10 @@
package io.github.thehrz.allmusicreload.core.command;
import java.util.List;
public interface ICommand {
void execute(Object sender, String name, String[] args);
List<String> tab(String name, String[] args, int index);
}

View File

@ -0,0 +1,536 @@
/*
* 11/19/04 1.0 moved to LGPL.
*
* 11/17/04 Uncomplete frames discarded. E.B, javalayer@javazoom.net
*
* 12/05/03 ID3v2 tag returned. E.B, javalayer@javazoom.net
*
* 12/12/99 Based on Ibitstream. Exceptions thrown on errors,
* Temporary removed seek functionality. mdm@techie.com
*
* 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net
*
* 04/14/97 : Added function prototypes for new syncing and seeking
* mechanisms. Also made this file portable. Changes made by Jeff Tsay
*
* @(#) ibitstream.h 1.5, last edit: 6/15/94 16:55:34
* @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
* @(#) Berlin University of Technology
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
import java.io.*;
/**
* The <code>Bistream</code> class is responsible for parsing
* an MPEG audio bitstream.
*
* <b>REVIEW:</b> much of the parsing currently occurs in the
* various decoders. This should be moved into this class and associated
* inner classes.
*/
public final class Bitstream implements BitstreamErrors {
/**
* Maximum size of the frame buffer.
*/
private static final int BUFFER_INT_SIZE = 433;
/**
* Synchronization control constant for the initial
* synchronization to the start of a frame.
*/
static byte INITIAL_SYNC = 0;
// max. 1730 bytes per frame: 144 * 384kbit/s / 32000 Hz + 2 Bytes CRC
/**
* Synchronization control constant for non-initial frame
* synchronizations.
*/
static byte STRICT_SYNC = 1;
/**
* The frame buffer that holds the data for the current frame.
*/
private final int[] framebuffer = new int[BUFFER_INT_SIZE];
private final int[] bitmask = {0, // dummy
0x00000001, 0x00000003, 0x00000007, 0x0000000F,
0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
0x0001FFFF};
private final PushbackInputStream source;
private final Header header = new Header();
private final byte[] syncbuf = new byte[4];
/**
* The bytes read from the stream.
*/
private final byte[] frame_bytes = new byte[BUFFER_INT_SIZE * 4];
private final Crc16[] crc = new Crc16[1];
/**
* Number of valid bytes in the frame buffer.
*/
private int framesize;
//private int current_frame_number;
//private int last_frame_number;
/**
* Index into <code>framebuffer</code> where the next bits are
* retrieved.
*/
private int wordpointer;
/**
* Number (0-31, from MSB to LSB) of next bit for get_bits()
*/
private int bitindex;
/**
* The current specified syncword
*/
private int syncword;
/**
* Audio header position in stream.
*/
private int header_pos = 0;
/**
*
*/
private boolean single_ch_mode;
private byte[] rawid3v2 = null;
private boolean firstframe = true;
/**
* Construct a IBitstream that reads data from a
* given InputStream.
*
* @param in The InputStream to read from.
*/
public Bitstream(InputStream in) {
if (in == null) throw new NullPointerException("in");
in = new BufferedInputStream(in);
loadID3v2(in);
firstframe = true;
//source = new PushbackInputStream(in, 1024);
source = new PushbackInputStream(in, BUFFER_INT_SIZE * 4);
closeFrame();
//current_frame_number = -1;
//last_frame_number = -1;
}
/**
* Return position of the first audio header.
*
* @return size of ID3v2 tag frames.
*/
public int header_pos() {
return header_pos;
}
/**
* Load ID3v2 frames.
*
* @param in MP3 InputStream.
* @author JavaZOOM
*/
private void loadID3v2(InputStream in) {
int size = -1;
try {
// Read ID3v2 header (10 bytes).
in.mark(10);
size = readID3v2Header(in);
header_pos = size;
} catch (IOException e) {
} finally {
try {
// Unread ID3v2 header (10 bytes).
in.reset();
} catch (IOException e) {
}
}
// Load ID3v2 tags.
try {
if (size > 0) {
rawid3v2 = new byte[size];
in.read(rawid3v2, 0, rawid3v2.length);
}
} catch (IOException e) {
}
}
/**
* Parse ID3v2 tag header to find out size of ID3v2 frames.
*
* @param in MP3 InputStream
* @return size of ID3v2 frames + header
* @throws IOException
* @author JavaZOOM
*/
private int readID3v2Header(InputStream in) throws IOException {
byte[] id3header = new byte[4];
int size = -10;
in.read(id3header, 0, 3);
// Look for ID3v2
if ((id3header[0] == 'I') && (id3header[1] == 'D') && (id3header[2] == '3')) {
in.read(id3header, 0, 3);
int majorVersion = id3header[0];
int revision = id3header[1];
in.read(id3header, 0, 4);
size = (id3header[0] << 21) + (id3header[1] << 14) + (id3header[2] << 7) + (id3header[3]);
}
return (size + 10);
}
/**
* Return raw ID3v2 frames + header.
*
* @return ID3v2 InputStream or null if ID3v2 frames are not available.
*/
public InputStream getRawID3v2() {
if (rawid3v2 == null) return null;
else {
return new ByteArrayInputStream(rawid3v2);
}
}
/**
* Close the Bitstream.
*
* @throws BitstreamException
*/
public void close() throws BitstreamException {
try {
source.close();
} catch (IOException ex) {
throw newBitstreamException(STREAM_ERROR, ex);
}
}
/**
* Reads and parses the next frame from the input source.
*
* @return the Header describing details of the frame read,
* or null if the end of the stream has been reached.
*/
public Header readFrame() throws BitstreamException {
Header result = null;
try {
result = readNextFrame();
// E.B, Parse VBR (if any) first frame.
if (firstframe) {
result.parseVBR(frame_bytes);
firstframe = false;
}
} catch (BitstreamException ex) {
if ((ex.getErrorCode() == INVALIDFRAME)) {
// Try to skip this frame.
//System.out.println("INVALIDFRAME");
try {
closeFrame();
result = readNextFrame();
} catch (BitstreamException e) {
if ((e.getErrorCode() != STREAM_EOF)) {
// wrap original exception so stack trace is maintained.
throw newBitstreamException(e.getErrorCode(), e);
}
}
} else if ((ex.getErrorCode() != STREAM_EOF)) {
// wrap original exception so stack trace is maintained.
throw newBitstreamException(ex.getErrorCode(), ex);
}
}
return result;
}
/**
* Read next MP3 frame.
*
* @return MP3 frame header.
* @throws BitstreamException
*/
private Header readNextFrame() throws BitstreamException {
if (framesize == -1) {
nextFrame();
}
return header;
}
/**
* Read next MP3 frame.
*
* @throws BitstreamException
*/
private void nextFrame() throws BitstreamException {
// entire frame is read by the header class.
header.read_header(this, crc);
}
/**
* Unreads the bytes read from the frame.
*
* @throws BitstreamException
*/
// REVIEW: add new error codes for this.
public void unreadFrame() throws BitstreamException {
if (wordpointer == -1 && bitindex == -1 && (framesize > 0)) {
try {
source.unread(frame_bytes, 0, framesize);
} catch (IOException ex) {
throw newBitstreamException(STREAM_ERROR);
}
}
}
/**
* Close MP3 frame.
*/
public void closeFrame() {
framesize = -1;
wordpointer = -1;
bitindex = -1;
}
/**
* Determines if the next 4 bytes of the stream represent a
* frame header.
*/
public boolean isSyncCurrentPosition(int syncmode) throws BitstreamException {
int read = readBytes(syncbuf, 0, 4);
int headerstring = ((syncbuf[0] << 24) & 0xFF000000) | ((syncbuf[1] << 16) & 0x00FF0000) | ((syncbuf[2] << 8) & 0x0000FF00) | ((syncbuf[3] << 0) & 0x000000FF);
try {
source.unread(syncbuf, 0, read);
} catch (IOException ex) {
}
boolean sync = false;
switch (read) {
case 0:
sync = true;
break;
case 4:
sync = isSyncMark(headerstring, syncmode, syncword);
break;
}
return sync;
}
BitstreamException newBitstreamException(int errorcode) {
return new BitstreamException(errorcode, null);
}
private BitstreamException newBitstreamException(int errorcode, Throwable throwable) {
return new BitstreamException(errorcode, throwable);
}
/**
* Get next 32 bits from bitstream.
* They are stored in the headerstring.
* syncmod allows Synchro flag ID
* The returned value is False at the end of stream.
*/
int syncHeader(byte syncmode) throws BitstreamException {
boolean sync;
int headerstring;
// read additional 2 bytes
int bytesRead = readBytes(syncbuf, 0, 3);
if (bytesRead != 3) throw newBitstreamException(STREAM_EOF, null);
headerstring = ((syncbuf[0] << 16) & 0x00FF0000) | ((syncbuf[1] << 8) & 0x0000FF00) | ((syncbuf[2]) & 0x000000FF);
do {
headerstring <<= 8;
if (readBytes(syncbuf, 3, 1) != 1)
throw newBitstreamException(STREAM_EOF, null);
headerstring |= (syncbuf[3] & 0x000000FF);
sync = isSyncMark(headerstring, syncmode, syncword);
}
while (!sync);
return headerstring;
}
public boolean isSyncMark(int headerstring, int syncmode, int word) {
boolean sync = false;
if (syncmode == INITIAL_SYNC) {
sync = ((headerstring & 0xFFE00000) == 0xFFE00000); // SZD: MPEG 2.5
} else {
sync = ((headerstring & 0xFFF80C00) == word) &&
(((headerstring & 0x000000C0) == 0x000000C0) == single_ch_mode);
}
// filter out invalid sample rate
if (sync)
sync = (((headerstring >>> 10) & 3) != 3);
// filter out invalid layer
if (sync)
sync = (((headerstring >>> 17) & 3) != 0);
// filter out invalid version
if (sync)
sync = (((headerstring >>> 19) & 3) != 1);
return sync;
}
/**
* Reads the data for the next frame. The frame is not parsed
* until parse frame is called.
*/
int read_frame_data(int bytesize) throws BitstreamException {
int numread = readFully(frame_bytes, 0, bytesize);
framesize = bytesize;
wordpointer = -1;
bitindex = -1;
return numread;
}
/**
* Parses the data previously read with read_frame_data().
*/
void parse_frame() throws BitstreamException {
// Convert Bytes read to int
int b = 0;
byte[] byteread = frame_bytes;
int bytesize = framesize;
for (int k = 0; k < bytesize; k = k + 4) {
int convert = 0;
byte b0 = 0;
byte b1 = 0;
byte b2 = 0;
byte b3 = 0;
b0 = byteread[k];
if (k + 1 < bytesize) b1 = byteread[k + 1];
if (k + 2 < bytesize) b2 = byteread[k + 2];
if (k + 3 < bytesize) b3 = byteread[k + 3];
framebuffer[b++] = ((b0 << 24) & 0xFF000000) | ((b1 << 16) & 0x00FF0000) | ((b2 << 8) & 0x0000FF00) | (b3 & 0x000000FF);
}
wordpointer = 0;
bitindex = 0;
}
/**
* Read bits from buffer into the lower bits of an unsigned int.
* The LSB contains the latest read bit of the stream.
* (1 <= number_of_bits <= 16)
*/
public int get_bits(int number_of_bits) {
int returnvalue = 0;
int sum = bitindex + number_of_bits;
// E.B
// There is a problem here, wordpointer could be -1 ?!
if (wordpointer < 0) wordpointer = 0;
// E.B : End.
if (sum <= 32) {
// all bits contained in *wordpointer
returnvalue = (framebuffer[wordpointer] >>> (32 - sum)) & bitmask[number_of_bits];
// returnvalue = (wordpointer[0] >> (32 - sum)) & bitmask[number_of_bits];
if ((bitindex += number_of_bits) == 32) {
bitindex = 0;
wordpointer++; // added by me!
}
return returnvalue;
}
int Right = (framebuffer[wordpointer] & 0x0000FFFF);
wordpointer++;
int Left = (framebuffer[wordpointer] & 0xFFFF0000);
returnvalue = ((Right << 16) & 0xFFFF0000) | ((Left >>> 16) & 0x0000FFFF);
returnvalue >>>= 48 - sum; // returnvalue >>= 16 - (number_of_bits - (32 - bitindex))
returnvalue &= bitmask[number_of_bits];
bitindex = sum - 32;
return returnvalue;
}
/**
* Set the word we want to sync the header to.
* In Big-Endian byte order
*/
void set_syncword(int syncword0) {
syncword = syncword0 & 0xFFFFFF3F;
single_ch_mode = ((syncword0 & 0x000000C0) == 0x000000C0);
}
/**
* Reads the exact number of bytes from the source
* input stream into a byte array.
*
* @param b The byte array to read the specified number
* of bytes into.
* @param offs The index in the array where the first byte
* read should be stored.
* @param len the number of bytes to read.
* @throws BitstreamException is thrown if the specified
* number of bytes could not be read from the stream.
*/
private int readFully(byte[] b, int offs, int len)
throws BitstreamException {
int nRead = 0;
try {
while (len > 0) {
int bytesread = source.read(b, offs, len);
if (bytesread == -1) {
while (len-- > 0) {
b[offs++] = 0;
}
break;
//throw newBitstreamException(UNEXPECTED_EOF, new EOFException());
}
nRead = nRead + bytesread;
offs += bytesread;
len -= bytesread;
}
} catch (IOException ex) {
throw newBitstreamException(STREAM_ERROR, ex);
}
return nRead;
}
/**
* Simlar to readFully, but doesn't throw exception when
* EOF is reached.
*/
private int readBytes(byte[] b, int offs, int len)
throws BitstreamException {
int totalBytesRead = 0;
try {
while (len > 0) {
int bytesread = source.read(b, offs, len);
if (bytesread == -1) {
break;
}
totalBytesRead += bytesread;
offs += bytesread;
len -= bytesread;
}
} catch (IOException ex) {
throw newBitstreamException(STREAM_ERROR, ex);
}
return totalBytesRead;
}
}

View File

@ -0,0 +1,55 @@
/*
* 11/19/04 1.0 moved to LGPL.
* 11/17/04 INVALIDFRAME code added. javalayer@javazoom.net
* 12/12/99 Initial version. mdm@techie.com
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
/**
* This interface describes all error codes that can be thrown
* in <code>BistreamException</code>s.
*
* @author MDM 12/12/99
* @see BitstreamException
* @since 0.0.6
*/
public interface BitstreamErrors extends JavaLayerErrors {
/**
* An undeterminable error occurred.
*/
int UNKNOWN_ERROR = BITSTREAM_ERROR;
/**
* A problem occurred reading from the stream.
*/
int STREAM_ERROR = BITSTREAM_ERROR + 2;
/**
* The end of the stream was reached.
*/
int STREAM_EOF = BITSTREAM_ERROR + 4;
/**
* Frame data are missing.
*/
int INVALIDFRAME = BITSTREAM_ERROR + 5;
}

View File

@ -0,0 +1,65 @@
/*
* 11/19/04 1.0 moved to LGPL.
* 12/12/99 Initial version. mdm@techie.com
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
/**
* Instances of <code>BitstreamException</code> are thrown
* when operations on a <code>Bitstream</code> fail.
* <p>
* The exception provides details of the exception condition
* in two ways:
* <ol><li>
* as an error-code describing the nature of the error
* </li><br></br><li>
* as the <code>Throwable</code> instance, if any, that was thrown
* indicating that an exceptional condition has occurred.
* </li></ol></p>
*
* @author MDM 12/12/99
* @since 0.0.6
*/
public class BitstreamException extends JavaLayerException
implements BitstreamErrors {
private int errorcode = UNKNOWN_ERROR;
public BitstreamException(String msg, Throwable t) {
super(msg, t);
}
public BitstreamException(int errorcode, Throwable t) {
this(getErrorString(errorcode), t);
this.errorcode = errorcode;
}
static public String getErrorString(int errorcode) {
// REVIEW: use resource bundle to map error codes
// to locale-sensitive strings.
return "Bitstream errorcode " + Integer.toHexString(errorcode);
}
public int getErrorCode() {
return errorcode;
}
}

View File

@ -0,0 +1,64 @@
/*
* 11/19/04 : 1.0 moved to LGPL.
*
* 02/12/99 : Java Conversion by E.B , javalayer@javazoom.net
*
* @(#) crc.h 1.5, last edit: 6/15/94 16:55:32
* @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
* @(#) Berlin University of Technology
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
/**
* 16-Bit CRC checksum
*/
public final class Crc16 {
private short crc;
/**
* Dummy Constructor
*/
public Crc16() {
crc = (short) 0xFFFF;
}
/**
* Feed a bitstring to the crc calculation (0 < length <= 32).
*/
public void add_bits(int bitstring, int length) {
int bitmask = 1 << (length - 1);
do
if (((crc & 0x8000) == 0) ^ ((bitstring & bitmask) == 0)) {
crc <<= 1;
short polynomial = (short) 0x8005;
crc ^= polynomial;
} else
crc <<= 1;
while ((bitmask >>>= 1) != 0);
}
/**
* Return the calculated checksum.
* Erase it for next calls to add_bits().
*/
public short checksum() {
short sum = crc;
crc = (short) 0xFFFF;
return sum;
}
}

View File

@ -0,0 +1,618 @@
/*
* 11/19/04 : 1.0 moved to LGPL.
* VBRI header support added, E.B javalayer@javazoom.net
*
* 12/04/03 : VBR (XING) header support added, E.B javalayer@javazoom.net
*
* 02/13/99 : Java Conversion by JavaZOOM , E.B javalayer@javazoom.net
*
* Declarations for MPEG header class
* A few layer III, MPEG-2 LSF, and seeking modifications made by Jeff Tsay.
* Last modified : 04/19/97
*
* @(#) header.h 1.7, last edit: 6/15/94 16:55:33
* @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
* @(#) Berlin University of Technology
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
/**
* Class for extracting information from a frame header.
*/
public final class Header {
public static final int[][] frequencies =
{{22050, 24000, 16000, 1},
{44100, 48000, 32000, 1},
{11025, 12000, 8000, 1}}; // SZD: MPEG25
/**
* Constant for MPEG-2 LSF version
*/
public static final int MPEG2_LSF = 0;
public static final int MPEG25_LSF = 2; // SZD
/**
* Constant for MPEG-1 version
*/
public static final int MPEG1 = 1;
public static final int STEREO = 0;
public static final int JOINT_STEREO = 1;
public static final int DUAL_CHANNEL = 2;
public static final int SINGLE_CHANNEL = 3;
public static final int FOURTYFOUR_POINT_ONE = 0;
public static final int FOURTYEIGHT = 1;
public static final int THIRTYTWO = 2;
// E.B -> private to public
public static final int[][][] bitrates = {
{{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,
112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000, 0},
{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,
56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0},
{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,
56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}},
{{0 /*free format*/, 32000, 64000, 96000, 128000, 160000, 192000,
224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000, 0},
{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,
112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000, 0},
{0 /*free format*/, 32000, 40000, 48000, 56000, 64000, 80000,
96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 0}},
// SZD: MPEG2.5
{{0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,
112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000, 0},
{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,
56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0},
{0 /*free format*/, 8000, 16000, 24000, 32000, 40000, 48000,
56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 0}},
};
// E.B -> private to public
public static final String[][][] bitrate_str = {
{{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s",
"80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s",
"160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s",
"forbidden"},
{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",
"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",
"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",
"forbidden"},
{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",
"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",
"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",
"forbidden"}},
{{"free format", "32 kbit/s", "64 kbit/s", "96 kbit/s", "128 kbit/s",
"160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "288 kbit/s",
"320 kbit/s", "352 kbit/s", "384 kbit/s", "416 kbit/s", "448 kbit/s",
"forbidden"},
{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s",
"80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s",
"192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s", "384 kbit/s",
"forbidden"},
{"free format", "32 kbit/s", "40 kbit/s", "48 kbit/s", "56 kbit/s",
"64 kbit/s", "80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s",
"160 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s", "320 kbit/s",
"forbidden"}},
// SZD: MPEG2.5
{{"free format", "32 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s",
"80 kbit/s", "96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s",
"160 kbit/s", "176 kbit/s", "192 kbit/s", "224 kbit/s", "256 kbit/s",
"forbidden"},
{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",
"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",
"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",
"forbidden"},
{"free format", "8 kbit/s", "16 kbit/s", "24 kbit/s", "32 kbit/s",
"40 kbit/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s",
"96 kbit/s", "112 kbit/s", "128 kbit/s", "144 kbit/s", "160 kbit/s",
"forbidden"}},
};
// VBR support added by E.B
private final double[] h_vbr_time_per_frame = {-1, 384, 1152, 1152};
public short checksum;
public int framesize;
public int nSlots;
private int h_layer, h_protection_bit, h_bitrate_index,
h_padding_bit, h_mode_extension;
private int h_version;
private int h_mode;
private int h_sample_frequency;
private int h_number_of_subbands, h_intensity_stereo_bound;
private boolean h_vbr;
private int h_vbr_frames;
private int h_vbr_bytes;
private byte syncmode = Bitstream.INITIAL_SYNC;
private Crc16 crc;
Header() {
}
/**
* Returns total ms.
*
* @param streamsize
* @return total milliseconds
*/
public float total_ms(int streamsize) {
return (max_number_of_frames(streamsize) * ms_per_frame());
}
public String toString() {
StringBuilder buffer = new StringBuilder(200);
buffer.append("Layer ");
buffer.append(layer_string());
buffer.append(" frame ");
buffer.append(mode_string());
buffer.append(' ');
buffer.append(version_string());
if (!checksums())
buffer.append(" no");
buffer.append(" checksums");
buffer.append(' ');
buffer.append(sample_frequency_string());
buffer.append(',');
buffer.append(' ');
buffer.append(bitrate_string());
return buffer.toString();
}
// Functions to query header contents:
/**
* Read a 32-bit header from the bitstream.
*/
void read_header(Bitstream stream, Crc16[] crcp) throws BitstreamException {
int headerstring;
int channel_bitrate;
boolean sync = false;
do {
headerstring = stream.syncHeader(syncmode);
if (syncmode == Bitstream.INITIAL_SYNC) {
h_version = ((headerstring >>> 19) & 1);
if (((headerstring >>> 20) & 1) == 0) // SZD: MPEG2.5 detection
if (h_version == MPEG2_LSF)
h_version = MPEG25_LSF;
else
throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR);
if ((h_sample_frequency = ((headerstring >>> 10) & 3)) == 3) {
throw stream.newBitstreamException(Bitstream.UNKNOWN_ERROR);
}
}
h_layer = 4 - (headerstring >>> 17) & 3;
h_protection_bit = (headerstring >>> 16) & 1;
h_bitrate_index = (headerstring >>> 12) & 0xF;
h_padding_bit = (headerstring >>> 9) & 1;
h_mode = ((headerstring >>> 6) & 3);
h_mode_extension = (headerstring >>> 4) & 3;
if (h_mode == JOINT_STEREO)
h_intensity_stereo_bound = (h_mode_extension << 2) + 4;
else
h_intensity_stereo_bound = 0; // should never be used
// calculate number of subbands:
if (h_layer == 1)
h_number_of_subbands = 32;
else {
channel_bitrate = h_bitrate_index;
// calculate bitrate per channel:
if (h_mode != SINGLE_CHANNEL)
if (channel_bitrate == 4)
channel_bitrate = 1;
else
channel_bitrate -= 4;
if ((channel_bitrate == 1) || (channel_bitrate == 2))
if (h_sample_frequency == THIRTYTWO)
h_number_of_subbands = 12;
else
h_number_of_subbands = 8;
else if ((h_sample_frequency == FOURTYEIGHT) || ((channel_bitrate >= 3) && (channel_bitrate <= 5)))
h_number_of_subbands = 27;
else
h_number_of_subbands = 30;
}
if (h_intensity_stereo_bound > h_number_of_subbands)
h_intensity_stereo_bound = h_number_of_subbands;
// calculate framesize and nSlots
calculate_framesize();
// read framedata:
int framesizeloaded = stream.read_frame_data(framesize);
if ((framesize >= 0) && (framesizeloaded != framesize)) {
// Data loaded does not match to expected framesize,
// it might be an ID3v1 TAG. (Fix 11/17/04).
throw stream.newBitstreamException(Bitstream.INVALIDFRAME);
}
if (stream.isSyncCurrentPosition(syncmode)) {
if (syncmode == Bitstream.INITIAL_SYNC) {
syncmode = Bitstream.STRICT_SYNC;
stream.set_syncword(headerstring & 0xFFF80CC0);
}
sync = true;
} else {
stream.unreadFrame();
}
}
while (!sync);
stream.parse_frame();
if (h_protection_bit == 0) {
// frame contains a crc checksum
checksum = (short) stream.get_bits(16);
if (crc == null)
crc = new Crc16();
crc.add_bits(headerstring, 16);
crcp[0] = crc;
} else
crcp[0] = null;
}
/**
* Parse frame to extract optionnal VBR frame.
*
* @param firstframe
* @author E.B (javalayer@javazoom.net)
*/
void parseVBR(byte[] firstframe) throws BitstreamException {
// Trying Xing header.
String xing = "Xing";
byte[] tmp = new byte[4];
int offset = 0;
// Compute "Xing" offset depending on MPEG version and channels.
if (h_version == MPEG1) {
if (h_mode == SINGLE_CHANNEL) offset = 21 - 4;
else offset = 36 - 4;
} else {
if (h_mode == SINGLE_CHANNEL) offset = 13 - 4;
else offset = 21 - 4;
}
byte[] h_vbr_toc;
try {
System.arraycopy(firstframe, offset, tmp, 0, 4);
// Is "Xing" ?
if (xing.equals(new String(tmp))) {
//Yes.
h_vbr = true;
h_vbr_frames = -1;
h_vbr_bytes = -1;
h_vbr_toc = new byte[100];
int length = 4;
// Read flags.
byte[] flags = new byte[4];
System.arraycopy(firstframe, offset + length, flags, 0, flags.length);
length += flags.length;
// Read number of frames (if available).
if ((flags[3] & (byte) (1)) != 0) {
System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);
h_vbr_frames = (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) & 0x0000FF00 | tmp[3] & 0x000000FF;
length += 4;
}
// Read size (if available).
if ((flags[3] & (byte) (1 << 1)) != 0) {
System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);
h_vbr_bytes = (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) & 0x0000FF00 | tmp[3] & 0x000000FF;
length += 4;
}
// Read TOC (if available).
if ((flags[3] & (byte) (1 << 2)) != 0) {
System.arraycopy(firstframe, offset + length, h_vbr_toc, 0, h_vbr_toc.length);
length += h_vbr_toc.length;
}
// Read scale (if available).
if ((flags[3] & (byte) (1 << 3)) != 0) {
System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);
}
}
} catch (ArrayIndexOutOfBoundsException e) {
throw new BitstreamException("XingVBRHeader Corrupted", e);
}
// Trying VBRI header.
String vbri = "VBRI";
offset = 36 - 4;
try {
System.arraycopy(firstframe, offset, tmp, 0, 4);
// Is "VBRI" ?
if (vbri.equals(new String(tmp))) {
//Yes.
h_vbr = true;
h_vbr_frames = -1;
h_vbr_bytes = -1;
// Bytes.
int length = 4 + 6;
System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);
h_vbr_bytes = (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) & 0x0000FF00 | tmp[3] & 0x000000FF;
length += 4;
// Frames.
System.arraycopy(firstframe, offset + length, tmp, 0, tmp.length);
h_vbr_frames = (tmp[0] << 24) & 0xFF000000 | (tmp[1] << 16) & 0x00FF0000 | (tmp[2] << 8) & 0x0000FF00 | tmp[3] & 0x000000FF;
}
} catch (ArrayIndexOutOfBoundsException e) {
throw new BitstreamException("VBRIVBRHeader Corrupted", e);
}
}
/**
* Returns version.
*/
public int version() {
return h_version;
}
/**
* Returns Layer ID.
*/
public int layer() {
return h_layer;
}
/**
* Returns bitrate index.
*/
public int bitrate_index() {
return h_bitrate_index;
}
/**
* Returns Sample Frequency.
*/
public int sample_frequency() {
return h_sample_frequency;
}
/**
* Returns Frequency.
*/
public int frequency() {
return frequencies[h_version][h_sample_frequency];
}
/**
* Returns Mode.
*/
public int mode() {
return h_mode;
}
/**
* Returns Protection bit.
*/
public boolean checksums() {
return h_protection_bit == 0;
}
// Seeking and layer III stuff
/**
* Returns Checksum flag.
* Compares computed checksum with stream checksum.
*/
public boolean checksum_ok() {
return (checksum == crc.checksum());
}
/**
* Returns Slots.
*/
public int slots() {
return nSlots;
}
// E.B -> private to public
/**
* Returns Mode Extension.
*/
public int mode_extension() {
return h_mode_extension;
}
/**
* Calculate Frame size.
* Calculates framesize in bytes excluding header size.
*/
public void calculate_framesize() {
if (h_layer == 1) {
framesize = (12 * bitrates[h_version][0][h_bitrate_index]) /
frequencies[h_version][h_sample_frequency];
if (h_padding_bit != 0) framesize++;
framesize <<= 2; // one slot is 4 bytes long
nSlots = 0;
} else {
framesize = (144 * bitrates[h_version][h_layer - 1][h_bitrate_index]) /
frequencies[h_version][h_sample_frequency];
if (h_version == MPEG2_LSF || h_version == MPEG25_LSF) framesize >>= 1; // SZD
if (h_padding_bit != 0) framesize++;
// Layer III slots
if (h_layer == 3) {
if (h_version == MPEG1) {
nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 17 : 32) // side info size
- ((h_protection_bit != 0) ? 0 : 2) // CRC size
- 4; // header size
} else { // MPEG-2 LSF, SZD: MPEG-2.5 LSF
nSlots = framesize - ((h_mode == SINGLE_CHANNEL) ? 9 : 17) // side info size
- ((h_protection_bit != 0) ? 0 : 2) // CRC size
- 4; // header size
}
} else {
nSlots = 0;
}
}
framesize -= 4; // subtract header size
}
/**
* Returns the maximum number of frames in the stream.
*
* @param streamsize
* @return number of frames
*/
public int max_number_of_frames(int streamsize) // E.B
{
if (h_vbr) return h_vbr_frames;
else {
if ((framesize + 4 - h_padding_bit) == 0) return 0;
else return (streamsize / (framesize + 4 - h_padding_bit));
}
}
/**
* Returns ms/frame.
*
* @return milliseconds per frame
*/
public float ms_per_frame() // E.B
{
if (h_vbr) {
double tpf = h_vbr_time_per_frame[layer()] / frequency();
if ((h_version == MPEG2_LSF) || (h_version == MPEG25_LSF)) tpf /= 2;
return ((float) (tpf * 1000));
} else {
float[][] ms_per_frame_array = {{8.707483f, 8.0f, 12.0f},
{26.12245f, 24.0f, 36.0f},
{26.12245f, 24.0f, 36.0f}};
return (ms_per_frame_array[h_layer - 1][h_sample_frequency]);
}
}
// functions which return header informations as strings:
/**
* Return Layer version.
*/
public String layer_string() {
switch (h_layer) {
case 1:
return "I";
case 2:
return "II";
case 3:
return "III";
}
return null;
}
/**
* Return Bitrate.
*
* @return bitrate in bps
*/
public String bitrate_string() {
if (h_vbr) {
return bitrate() / 1000 + " kb/s";
} else return bitrate_str[h_version][h_layer - 1][h_bitrate_index];
}
/**
* Return Bitrate.
*
* @return bitrate in bps and average bitrate for VBR header
*/
public int bitrate() {
if (h_vbr) {
return ((int) ((h_vbr_bytes * 8) / (ms_per_frame() * h_vbr_frames))) * 1000;
} else return bitrates[h_version][h_layer - 1][h_bitrate_index];
}
/**
* Returns Frequency
*
* @return frequency string in kHz
*/
public String sample_frequency_string() {
switch (h_sample_frequency) {
case THIRTYTWO:
if (h_version == MPEG1)
return "32 kHz";
else if (h_version == MPEG2_LSF)
return "16 kHz";
else // SZD
return "8 kHz";
case FOURTYFOUR_POINT_ONE:
if (h_version == MPEG1)
return "44.1 kHz";
else if (h_version == MPEG2_LSF)
return "22.05 kHz";
else // SZD
return "11.025 kHz";
case FOURTYEIGHT:
if (h_version == MPEG1)
return "48 kHz";
else if (h_version == MPEG2_LSF)
return "24 kHz";
else // SZD
return "12 kHz";
}
return (null);
}
/**
* Returns Mode.
*/
public String mode_string() {
switch (h_mode) {
case STEREO:
return "Stereo";
case JOINT_STEREO:
return "Joint stereo";
case DUAL_CHANNEL:
return "Dual channel";
case SINGLE_CHANNEL:
return "Single channel";
}
return null;
}
/**
* Returns Version.
*
* @return MPEG-1 or MPEG-2 LSF or MPEG-2.5 LSF
*/
public String version_string() {
switch (h_version) {
case MPEG1:
return "MPEG-1";
case MPEG2_LSF:
return "MPEG-2 LSF";
case MPEG25_LSF: // SZD
return "MPEG-2.5 LSF";
}
return (null);
}
/**
* Returns the number of subbands in the current frame.
*
* @return number of subbands
*/
public int number_of_subbands() {
return h_number_of_subbands;
}
/**
* Returns Intensity Stereo.
* (Layer II joint stereo only).
* Returns the number of subbands which are in stereo mode,
* subbands above that limit are in intensity stereo mode.
*
* @return intensity
*/
public int intensity_stereo_bound() {
return h_intensity_stereo_bound;
}
}

View File

@ -0,0 +1,39 @@
/*
* 11/19/04 1.0 moved to LGPL.
* 12/12/99 Initial version. mdm@techie.com
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
/**
* Exception erorr codes for components of the JavaLayer API.
*/
public interface JavaLayerErrors {
/**
* The first bitstream error code. See the {@link DecoderErrors DecoderErrors}
* interface for other bitstream error codes.
*/
int BITSTREAM_ERROR = 0x100;
/**
* The first decoder error code. See the {@link DecoderErrors DecoderErrors}
* interface for other decoder error codes.
*/
int DECODER_ERROR = 0x200;
}

View File

@ -0,0 +1,61 @@
/*
* 11/19/04 1.0 moved to LGPL.
* 12/12/99 Initial version. mdm@techie.com
*-----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*----------------------------------------------------------------------
*/
package io.github.thehrz.allmusicreload.core.decoder;
import java.io.PrintStream;
/**
* The JavaLayerException is the base class for all API-level
* exceptions thrown by JavaLayer. To facilitate conversion and
* common handling of exceptions from other domains, the class
* can delegate some functionality to a contained Throwable instance.
* <p>
*
* @author MDM
*/
public class JavaLayerException extends Exception {
private Throwable exception;
public JavaLayerException(String msg) {
super(msg);
}
public JavaLayerException(String msg, Throwable t) {
super(msg);
exception = t;
}
public void printStackTrace() {
printStackTrace(System.err);
}
public void printStackTrace(PrintStream ps) {
if (this.exception == null) {
super.printStackTrace(ps);
} else {
exception.printStackTrace();
}
}
}

View File

@ -0,0 +1,251 @@
package io.github.thehrz.allmusicreload.core.music.api;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.music.play.LyricDo;
import io.github.thehrz.allmusicreload.core.music.play.LyricSave;
import io.github.thehrz.allmusicreload.core.music.play.PlayMusic;
import io.github.thehrz.allmusicreload.core.objs.HttpResObj;
import io.github.thehrz.allmusicreload.core.objs.SearchMusicObj;
import io.github.thehrz.allmusicreload.core.objs.api.music.info.InfoObj;
import io.github.thehrz.allmusicreload.core.objs.api.music.list.DataObj;
import io.github.thehrz.allmusicreload.core.objs.api.music.lyric.WLyricObj;
import io.github.thehrz.allmusicreload.core.objs.api.music.search.SearchDataObj;
import io.github.thehrz.allmusicreload.core.objs.api.music.search.songs;
import io.github.thehrz.allmusicreload.core.objs.api.music.trialinfo.TrialInfoObj;
import io.github.thehrz.allmusicreload.core.objs.api.program.info.PrInfoObj;
import io.github.thehrz.allmusicreload.core.objs.enums.EncryptType;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.SearchPageObj;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import io.github.thehrz.allmusicreload.core.sql.DataSql;
import io.github.thehrz.allmusicreload.core.utils.Logs;
import com.google.gson.JsonObject;
import okhttp3.Cookie;
import java.util.ArrayList;
import java.util.List;
public class APIMain {
private boolean isUpdate;
public APIMain() {
AllMusic.log.info("§d[AllMusic3]§e正在初始化网络爬虫");
HttpClientUtil.init();
HttpResObj res = HttpClientUtil.get("https://music.163.com", "");
if (res == null || !res.ok) {
AllMusic.log.info("§d[AllMusic3]§c初始化网络爬虫连接失败");
}
}
public boolean isUpdate() {
return isUpdate;
}
/**
* 获取音乐详情
*
* @param id 音乐ID
* @param player 用户名
* @param isList 是否是空闲列表
* @return 结果
*/
private SongInfoObj getMusicDetail(String id, String player, boolean isList) {
JsonObject params = new JsonObject();
params.addProperty("c", "[{\"id\":" + id + "}]");
HttpResObj res = HttpClientUtil.post("https://music.163.com/api/v3/song/detail", params, EncryptType.WEAPI, null);
if (res != null && res.ok) {
InfoObj temp = AllMusic.gson.fromJson(res.data, InfoObj.class);
if (temp.isOk()) {
params = new JsonObject();
params.addProperty("ids", "[" + id + "]");
params.addProperty("br", "320000");
res = HttpClientUtil.post("https://music.163.com/weapi/song/enhance/player/url", params, EncryptType.WEAPI, null);
if (res == null || !res.ok) {
AllMusic.log.warning("§d[AllMusic3]§c版权检索失败");
return null;
}
TrialInfoObj obj = AllMusic.gson.fromJson(res.data, TrialInfoObj.class);
return new SongInfoObj(temp.getAuthor(), temp.getName(),
id, temp.getAlia(), player, temp.getAl(), isList, temp.getLength(),
temp.getPicUrl(), obj.isTrial(), obj.getFreeTrialInfo());
}
}
return null;
}
/**
* 获取音乐数据
*
* @param id 音乐ID
* @param player 用户名
* @param isList 是否是空闲列表
* @return 结果
*/
public SongInfoObj getMusic(String id, String player, boolean isList) {
SongInfoObj info = getMusicDetail(id, player, isList);
if (info != null)
return info;
JsonObject params = new JsonObject();
params.addProperty("id", id);
HttpResObj res = HttpClientUtil.post("https://music.163.com/api/dj/program/detail", params, EncryptType.WEAPI, null);
if (res != null && res.ok) {
PrInfoObj temp = AllMusic.gson.fromJson(res.data, PrInfoObj.class);
if (temp.isOk()) {
return new SongInfoObj(temp.getAuthor(), temp.getName(),
temp.getId(), temp.getAlia(), player, "电台", isList, temp.getLength(),
null, false, null);
} else {
AllMusic.log.warning("§d[AllMusic3]§c歌曲信息获取为空");
}
}
return info;
}
/**
* 获取播放链接
*
* @param id 音乐ID
* @return 结果
*/
public String getPlayUrl(String id) {
JsonObject params = new JsonObject();
params.addProperty("ids", "[" + id + "]");
params.addProperty("br", AllMusic.getConfig().musicBR);
HttpResObj res = HttpClientUtil.post("https://music.163.com/weapi/song/enhance/player/url", params, EncryptType.WEAPI, null);
if (res != null && res.ok) {
try {
TrialInfoObj obj = AllMusic.gson.fromJson(res.data, TrialInfoObj.class);
return obj.getUrl();
} catch (Exception e) {
Logs.logWrite(res.data);
AllMusic.log.warning("§d[AllMusic3]§c播放连接解析错误");
e.printStackTrace();
}
}
return null;
}
/**
* 添加空闲歌单
*
* @param id 歌单id
* @param sender 发送者
*/
public void setList(String id, Object sender) {
final Thread thread = new Thread(() -> {
JsonObject params = new JsonObject();
params.addProperty("id", id);
params.addProperty("n", 100000);
params.addProperty("s", 8);
HttpResObj res = HttpClientUtil.post("https://music.163.com/api/v6/playlist/detail", params, EncryptType.API, null);
if (res != null && res.ok)
try {
isUpdate = true;
DataObj obj = AllMusic.gson.fromJson(res.data, DataObj.class);
DataSql.addIdleList(obj.getPlaylist());
PlayMusic.addIdleList(obj.getPlaylist());
AllMusic.side.sendMessageTask(sender, AllMusic.getMessage().musicPlay.listMusic.get.replace(PAL.name, obj.getName()));
} catch (Exception e) {
AllMusic.log.warning("§d[AllMusic3]§c歌曲列表获取错误");
e.printStackTrace();
}
isUpdate = false;
}, "AllMusic_setList");
thread.start();
}
/**
* 获取歌词
*
* @param id 歌曲id
* @return 结果
*/
public LyricSave getLyric(String id) {
LyricSave lyric = new LyricSave();
JsonObject params = new JsonObject();
params.addProperty("id", id);
params.addProperty("cp", false);
params.addProperty("tv", 0);
params.addProperty("lv", 0);
params.addProperty("rv", 0);
params.addProperty("kv", 0);
params.addProperty("yv", 0);
params.addProperty("ytv", 0);
params.addProperty("rtv", 0);
HttpResObj res = HttpClientUtil.post("https://interface3.music.163.com/eapi/song/lyric/v1",
params, EncryptType.EAPI, "/api/song/lyric/v1");
if (res != null && res.ok) {
try {
WLyricObj obj = AllMusic.gson.fromJson(res.data, WLyricObj.class);
LyricDo temp = new LyricDo();
for (int times = 0; times < 3; times++) {
if (temp.check(obj)) {
AllMusic.log.warning("§d[AllMusic3]§c歌词解析错误正在进行第" + times + "重试");
} else {
if (temp.isHave) {
lyric.setHaveLyric(AllMusic.getConfig().sendLyric);
lyric.setLyric(temp.getTemp());
if (temp.isHaveK) {
lyric.setKlyric(temp.getKLyric());
}
}
return lyric;
}
Thread.sleep(1000);
}
AllMusic.log.warning("§d[AllMusic3]§c歌词解析失败");
} catch (Exception e) {
AllMusic.log.warning("§d[AllMusic3]§c歌词解析错误");
e.printStackTrace();
}
}
return lyric;
}
/**
* 搜歌
*
* @param name 关键字
* @param isDefault 是否是默认方式
* @return 结果
*/
public SearchPageObj search(String[] name, boolean isDefault) {
List<SearchMusicObj> resData = new ArrayList<>();
int maxpage;
StringBuilder name1 = new StringBuilder();
for (int a = isDefault ? 0 : 1; a < name.length; a++) {
name1.append(name[a]).append(" ");
}
String MusicName = name1.toString();
MusicName = MusicName.substring(0, MusicName.length() - 1);
JsonObject params = new JsonObject();
params.addProperty("s", MusicName);
params.addProperty("type", 1);
params.addProperty("limit", 30);
params.addProperty("offset", 0);
HttpResObj res = HttpClientUtil.post("https://music.163.com/weapi/search/get", params, EncryptType.WEAPI, null);
if (res != null && res.ok) {
SearchDataObj obj = AllMusic.gson.fromJson(res.data, SearchDataObj.class);
if (obj != null && obj.isOk()) {
List<songs> res1 = obj.getResult();
SearchMusicObj item;
for (songs temp : res1) {
item = new SearchMusicObj(String.valueOf(temp.getId()), temp.getName(),
temp.getArtists(), temp.getAlbum());
resData.add(item);
}
maxpage = res1.size() / 10;
return new SearchPageObj(resData, maxpage);
} else {
AllMusic.log.warning("§d[AllMusic3]§c歌曲搜索出现错误");
}
}
return null;
}
}

View File

@ -0,0 +1,137 @@
package io.github.thehrz.allmusicreload.core.music.api;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.api.EncResObj;
import com.google.gson.JsonObject;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class CryptoUtil {
private static final String presetKey = "0CoJUm6Qyw8W8jud";
private static final String iv = "0102030405060708";
private static final String base62 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
private static final String eapiKey = "e82ckenh8dichen8";
private static String createSecretKey(int size) {
StringBuilder key = new StringBuilder();
for (int i = 0; i < size; i++) {
double index = Math.floor(Math.random() * base62.length());
key.append(base62.charAt((int) index));
}
return key.toString();
}
public static String byteArrToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
private static String aesEncrypt(String content, String key, String iv) {
String result = null;
if (content == null || key == null)
return result;
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
byte[] keys = key.getBytes(StandardCharsets.UTF_8);
byte[] ivs = iv.getBytes(StandardCharsets.UTF_8);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keys, "AES"),
new IvParameterSpec(ivs));
bytes = cipher.doFinal(bytes);
result = Base64.getEncoder().encodeToString(bytes);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private static String aesEncrypt(String content, String key) {
String result = null;
if (content == null || key == null)
return result;
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);
byte[] keys = key.getBytes(StandardCharsets.UTF_8);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keys, "AES"));
bytes = cipher.doFinal(bytes);
result = byteArrToHex(bytes).toUpperCase();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private static String zFill(String str) {
StringBuilder strBuilder = new StringBuilder(str);
while (strBuilder.length() < 256) {
strBuilder.insert(0, "0");
}
str = strBuilder.toString();
return str;
}
private static String rsaEncrypt(String text) {
text = new StringBuffer(text).reverse().toString();
BigInteger biText = new BigInteger(strToHex(text), 16);
BigInteger biEx = new BigInteger("010001", 16);
BigInteger biMod = new BigInteger("00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7", 16);
BigInteger biRet = biText.modPow(biEx, biMod);
return zFill(biRet.toString(16));
}
private static String strToHex(String s) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
int ch = s.charAt(i);
String s4 = Integer.toHexString(ch);
str.append(s4);
}
return str.toString();
}
public static EncResObj weapiEncrypt(String content) {
String key = createSecretKey(16);
String encText = aesEncrypt(aesEncrypt(content, presetKey, iv), key, iv);
String encSecKey = rsaEncrypt(key);
return new EncResObj(encText, encSecKey);
}
public static EncResObj eapi(String url, JsonObject object) {
String text = AllMusic.gson.toJson(object);
String message = "nobody" + url + "use" + text + "md5forencrypt";
String digest = getMd5(message);
String data = url + "-36cd479b6b5-" + text + "-36cd479b6b5-" + digest;
return new EncResObj(aesEncrypt(data, eapiKey), "");
}
public static String getMd5(String plainText) {
byte[] secretBytes;
try {
MessageDigest digest = MessageDigest.getInstance("md5");
digest.update(plainText.getBytes(StandardCharsets.UTF_8));
secretBytes = digest.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有这个md5算法");
}
return byteArrToHex(secretBytes);
}
}

View File

@ -0,0 +1,179 @@
package io.github.thehrz.allmusicreload.core.music.api;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.HttpResObj;
import io.github.thehrz.allmusicreload.core.objs.api.EncResObj;
import io.github.thehrz.allmusicreload.core.objs.enums.EncryptType;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import okhttp3.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class HttpClientUtil {
private static final int CONNECT_TIMEOUT = 5;
private static final int READ_TIMEOUT = 7;
private static OkHttpClient client;
private static final String UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0";
public static void init() {
try {
synchronized (OkHttpClient.class) {
client = new OkHttpClient.Builder().cookieJar(new MyCookieJar())
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
.build();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static HttpResObj get(String path, String data) {
try {
data = URLEncoder.encode(data, StandardCharsets.UTF_8.toString());
Request request = new Request.Builder().url(path + data)
.addHeader("referer", "https://music.163.com")
.addHeader("content-type", "application/json;charset=UTF-8")
.addHeader("user-agent", UserAgent)
.get()
.build();
Response response = client.newCall(request).execute();
int httpCode = response.code();
ResponseBody body = response.body();
if (body == null) {
AllMusic.log.warning("§d[AllMusic3]§c获取网页错误");
return null;
}
InputStream inputStream = body.byteStream();
boolean ok = httpCode == 200;
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String data1 = result.toString(StandardCharsets.UTF_8.toString());
if (!ok) {
AllMusic.log.warning("§d[AllMusic3]§c服务器返回错误" + data1);
}
return new HttpResObj(data1, ok);
} catch (Exception e) {
AllMusic.log.warning("§d[AllMusic3]§c获取网页错误");
e.printStackTrace();
}
return null;
}
public static HttpResObj post(String url, JsonObject data, EncryptType type, String ourl) {
try {
RequestBody formBody;
Request.Builder request = new Request.Builder();
request = request.addHeader("Content-Type", "application/x-www-form-urlencoded");
request = request.addHeader("Referer", "https://music.163.com");
EncResObj res;
List<Cookie> cookies = AllMusic.cookie.cookieStore.get("music.163.com");
if (cookies == null) {
cookies = new ArrayList<>();
}
// StringBuilder cookie = new StringBuilder();
// for (Cookie item : cookies) {
// cookie.append(item.name()).append("=").append(item.value()).append(";");
// }
// cookie.append("cookie=");
// request.header("Cookie", cookie.toString());
if (type == EncryptType.WEAPI) {
request = request.addHeader("User-Agent", UserAgent);
String csrfToken = "";
for (Cookie item : cookies) {
if (item.name().equalsIgnoreCase("__csrf")) {
csrfToken = item.value();
}
}
data.addProperty("csrf_token", csrfToken);
res = CryptoUtil.weapiEncrypt(AllMusic.gson.toJson(data));
url = url.replaceFirst("\\w*api", "weapi");
request = request.url(url);
formBody = new FormBody.Builder()
.add("params", res.params)
.add("encSecKey", res.encSecKey)
.build();
} else if (type == EncryptType.EAPI) {
request = request.addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 9; PCT-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.64 HuaweiBrowser/10.0.3.311 Mobile Safari/537.36");
JsonObject header = new JsonObject();
header.addProperty("appver", "8.10.90");
header.addProperty("versioncode", "140");
header.addProperty("buildver", new Date().toString().substring(0, 10));
header.addProperty("resolution", "1920x1080");
header.addProperty("os", "android");
String requestId = "0000" + (new Date() + "_" + Math.floor(Math.random() * 1000));
header.addProperty("requestId", requestId);
for (Cookie item : cookies) {
if (item.name().equalsIgnoreCase("MUSIC_U")) {
header.addProperty("MUSIC_U", item.value());
} else if (item.name().equalsIgnoreCase("MUSIC_A")) {
header.addProperty("MUSIC_A", item.value());
} else if (item.name().equalsIgnoreCase("channel")) {
header.addProperty("channel", item.value());
} else if (item.name().equalsIgnoreCase("mobilename")) {
header.addProperty("mobilename", item.value());
} else if (item.name().equalsIgnoreCase("osver")) {
header.addProperty("osver", item.value());
} else if (item.name().equalsIgnoreCase("__csrf")) {
header.addProperty("__csrf", item.value());
}
}
data.add("header", header);
res = CryptoUtil.eapi(ourl, data);
url = url.replaceFirst("\\w*api", "eapi");
request = request.url(url);
formBody = new FormBody.Builder()
.add("params", res.params)
.build();
} else {
request = request.url(url);
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, JsonElement> item : data.entrySet()) {
builder = builder.add(item.getKey(), item.getValue().getAsString());
}
formBody = builder.build();
}
request = request.post(formBody);
Response response = client.newCall(request.build()).execute();
int httpCode = response.code();
ResponseBody body = response.body();
if (body == null) {
AllMusic.log.warning("§d[AllMusic3]§c获取网页错误");
return null;
}
InputStream inputStream = body.byteStream();
boolean ok = httpCode == 200;
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String data1 = result.toString(StandardCharsets.UTF_8.toString());
if (!ok) {
AllMusic.log.warning("§d[AllMusic3]§c服务器返回错误" + data1);
}
return new HttpResObj(data1, ok);
} catch (Exception e) {
AllMusic.log.warning("§d[AllMusic3]§c获取网页错误");
e.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,37 @@
package io.github.thehrz.allmusicreload.core.music.api;
import io.github.thehrz.allmusicreload.core.AllMusic;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class MyCookieJar implements CookieJar {
@Override
public void saveFromResponse(HttpUrl httpUrl, @NotNull List<Cookie> list) {
ArrayList<Cookie> cookies = AllMusic.cookie.cookieStore.get("music.163.com");
if (cookies == null) {
cookies = new ArrayList<>();
}
for (Cookie item : list) {
for (Cookie item1 : cookies) {
if (item.name().equalsIgnoreCase(item1.name())) {
cookies.remove(item1);
break;
}
}
cookies.add(item);
}
AllMusic.cookie.cookieStore.put("music.163.com", cookies);
AllMusic.saveCookie();
}
@Override
public @NotNull List<Cookie> loadForRequest(HttpUrl httpUrl) {
List<Cookie> cookies = AllMusic.cookie.cookieStore.get("music.163.com");
return cookies != null ? cookies : new ArrayList<>();
}
}

View File

@ -0,0 +1,171 @@
package io.github.thehrz.allmusicreload.core.music.play;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.api.music.lyric.WLyricObj;
import io.github.thehrz.allmusicreload.core.objs.music.LyricItemObj;
import io.github.thehrz.allmusicreload.core.utils.Function;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LyricDo {
private static final Pattern p = Pattern.compile("\\(([0-9]+),[0-9]+.[0-9]\\)");
private final Map<Long, LyricItemObj> temp = new LinkedHashMap<>();
public boolean isHave = false;
public boolean isHaveK = false;
public Map<Long, String> kly = new LinkedHashMap<>();
public Map<Long, LyricItemObj> getTemp() {
return temp;
}
public Map<Long, String> getKLyric() {
return kly;
}
/**
* 检查歌词
*
* @param obj 歌词
* @return 结果
*/
public boolean check(WLyricObj obj) {
String[] lyric;
boolean haveT = false;
if (!obj.isOk())
return true;
else if (obj.isNone())
return false;
lyric = obj.getLyric().split("\n");
Map<Long, String> temp = getTime(Arrays.asList(lyric));
Map<Long, String> temp1 = new HashMap<>();
if (obj.getTlyric() != null) {
List<String> tlyric = Arrays.asList(obj.getTlyric().split("\n"));
haveT = true;
temp1 = getTime(tlyric);
}
String temp2 = obj.getYrc() == null ? obj.getKlyric() : obj.getYrc();
if (temp2 != null && !temp2.isEmpty()) {
String[] klyric = temp2.split("\n");
for (String item : klyric) {
Map<Long, String> temp4 = getKTime(item, obj.getVersion());
if (temp4 != null) {
kly.putAll(temp4);
}
}
isHaveK = true;
}
for (Map.Entry<Long, String> item : temp.entrySet()) {
this.temp.put(item.getKey(), new LyricItemObj(item.getValue(),
haveT ? temp1.get(item.getKey()) : null));
}
isHave = true;
return false;
}
/**
* 将歌词转换成时间
*
* @param lyric 歌词
* @return 结果
*/
private Map<Long, String> getTime(List<String> lyric) {
Map<Long, String> res = new LinkedHashMap<>();
String min;
String sec;
String mil;
long time;
long milt;
for (String s : lyric) {
if (!s.startsWith("["))
continue;
String temp = Function.getString(s, "[", "]");
if (!temp.contains(".") || !temp.contains(":"))
continue;
if (Function.countChar(temp, ':') > 1) {
String[] a = s.split(":");
min = a[0].substring(1);
sec = a[1];
mil = a[2];
} else {
min = Function.getString(s, "[", ":");
sec = Function.getString(s, ":", ".");
mil = Function.getString(s, ".", "]");
}
if (!Function.isInteger(min))
continue;
if (!Function.isInteger(sec))
continue;
if (!Function.isInteger(mil))
continue;
if (min.isEmpty() || sec.isEmpty() || mil.isEmpty())
continue;
milt = Long.parseLong(mil);
if (mil.length() == 3) {
milt /= 10;
}
time = Long.parseLong(min) * 60 * 1000 + Long.parseLong(sec) * 1000 + milt * 10;
if (time > 0 && time + AllMusic.getConfig().lyricDelay > 0)
time += AllMusic.getConfig().lyricDelay / 10 * 10;
res.put(time, Function.getString(s, "]", null));
}
return res;
}
private Map<Long, String> getKTime(String lyric, boolean yrc) {
Map<Long, String> res = new LinkedHashMap<>();
if (!lyric.startsWith("[") || !lyric.contains("]("))
return null;
String[] datas = lyric.split("\\(([0-9]+),[0-9]+.[0-9]\\)");
Matcher m = p.matcher(lyric);
List<String> temp1111 = new ArrayList<>();
while (m.find()) {
temp1111.add(m.group()
.replace("(", "")
.replace(")", ""));
}
if (datas.length == 1)
return null;
String temp = Function.getString(lyric, "[", "]");
String[] temp11 = temp.split(",");
long now = Integer.parseInt(temp11[0]) / 10 * 10;
for (int a = 1; a < datas.length; a++) {
String data = datas[a];
String temp3 = temp1111.get(a - 1);
String[] temp8 = temp3.split(",");
long temp5;
if (yrc) {
temp5 = (Integer.parseInt(temp8[0]) / 10 * 10);
if (temp5 > 0 && temp5 + AllMusic.getConfig().ktvLyricDelay > 0)
temp5 += (AllMusic.getConfig().ktvLyricDelay / 10 * 10);
res.put(temp5, data);
} else {
try {
temp5 = (Integer.parseInt(temp8[1]) / 10 * 10);
} catch (Exception e) {
AllMusic.log.warning("不支持的Ktv歌词");
AllMusic.log.warning("请带上音乐ID联系开发者");
return null;
}
if (temp5 > 0 && temp5 + AllMusic.getConfig().ktvLyricDelay > 0)
temp5 += (AllMusic.getConfig().ktvLyricDelay / 10 * 10);
res.put(now, data);
now += temp5;
}
}
return res;
}
}

View File

@ -0,0 +1,112 @@
package io.github.thehrz.allmusicreload.core.music.play;
import io.github.thehrz.allmusicreload.core.objs.music.LyricItemObj;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
public class LyricSave {
public int lastIndex = 0;
protected boolean haveLyric;
protected String lly = "";
protected String kly = "";
protected String tly = "";
private Map<Long, LyricItemObj> lyric;
private Map<Long, String> klyric;
private LyricItemObj now;
private long last;
private String kNow;
public LyricSave() {
haveLyric = false;
lyric = new HashMap<>();
}
public void setKlyric(Map<Long, String> klyric) {
this.klyric = klyric;
}
public boolean isHaveLyric() {
return haveLyric;
}
public void setHaveLyric(boolean haveLyric) {
this.haveLyric = haveLyric;
}
public String getLyric() {
return lly;
}
public void setLyric(Map<Long, LyricItemObj> lyric) {
this.lyric = lyric;
}
public String getTlyric() {
return tly;
}
public String getKly() {
return kly;
}
public boolean kUpdate() {
if (lastIndex >= now.lyric.length()) {
kly = now.lyric;
lly = "";
} else if (kNow != null) {
int index = now.lyric.toLowerCase(Locale.ROOT).indexOf(kNow, lastIndex);
if (index != -1) {
lastIndex = index + kNow.length();
kly = now.lyric.substring(0, lastIndex);
lly = now.lyric.substring(lastIndex);
return true;
}
} else {
kly = "";
}
return false;
}
public boolean ktv(long time) {
if (last == time || klyric == null)
return false;
String temp = klyric.get(time);
if (temp != null) {
kNow = temp.toLowerCase(Locale.ROOT);
last = time;
return kUpdate();
}
return false;
}
public boolean checkTime(long playNow, boolean ktv) {
if (lyric == null)
return false;
boolean res = false;
LyricItemObj temp = lyric.get(playNow);
if (temp != null) {
now = temp;
lly = now.lyric;
tly = now.tlyric;
if (tly == null)
tly = "";
kly = null;
lastIndex = 0;
kUpdate();
return true;
}
if (ktv && now != null) {
res = ktv(playNow);
}
return res;
}
}

View File

@ -0,0 +1,84 @@
package io.github.thehrz.allmusicreload.core.music.play;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.SearchMusicObj;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.MusicObj;
import io.github.thehrz.allmusicreload.core.objs.music.SearchPageObj;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class MusicSearch {
private static final Queue<MusicObj> tasks = new ConcurrentLinkedQueue<>();
private static boolean isRun;
private static void task() {
while (isRun) {
try {
MusicObj obj = tasks.poll();
if (obj != null) {
SearchPageObj search = AllMusic.getMusicApi().search(obj.args, obj.isDefault);
if (search == null)
AllMusic.side.sendMessageTask(obj.sender, AllMusic.getMessage().search
.cantSearch.replace(PAL.name, obj.isDefault ? obj.args[0] : obj.args[1]));
else {
AllMusic.side.sendMessageTask(obj.sender, AllMusic.getMessage().search.res);
AllMusic.addSearch(obj.name, search);
AllMusic.side.runTask(() -> showSearch(obj.sender, search));
}
}
Thread.sleep(100);
} catch (Exception e) {
AllMusic.log.warning("搜歌出现问题");
e.printStackTrace();
}
}
}
public static void start() {
Thread taskT = new Thread(MusicSearch::task, "AllMusic_search");
isRun = true;
taskT.start();
}
public static void stop() {
isRun = false;
}
public static void addSearch(MusicObj obj) {
tasks.add(obj);
}
/**
* 展示搜歌结果
*
* @param sender 发送者
* @param search 搜歌结果
*/
public static void showSearch(Object sender, SearchPageObj search) {
int index = search.getIndex();
SearchMusicObj item;
String info;
AllMusic.side.sendMessage(sender, "");
if (search.haveLastPage()) {
AllMusic.side.sendMessageRun(sender, "§d[AllMusic3]§2输入/music lastpage上一页",
AllMusic.getMessage().page.last, "/music lastpage");
}
for (int a = 0; a < index; a++) {
item = search.getRes(a + search.getPage() * 10);
info = AllMusic.getMessage().page.choice;
info = info.replace(PAL.index, "" + (a + 1))
.replace(PAL.musicName, item.name)
.replace(PAL.musicAuthor, item.author)
.replace(PAL.musicAl, item.al);
AllMusic.side.sendMessageRun(sender, info,
AllMusic.getMessage().click.clickRun, "/music select " + (a + 1));
}
if (search.haveNextPage()) {
AllMusic.side.sendMessageRun(sender, "§d[AllMusic3]§2输入/music nextpage下一页",
AllMusic.getMessage().page.next, "/music nextpage");
}
AllMusic.side.sendMessage(sender, "");
}
}

View File

@ -0,0 +1,548 @@
package io.github.thehrz.allmusicreload.core.music.play;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.decoder.Bitstream;
import io.github.thehrz.allmusicreload.core.decoder.Header;
import io.github.thehrz.allmusicreload.core.objs.config.LimitObj;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.MusicObj;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import io.github.thehrz.allmusicreload.core.sql.DataSql;
import io.github.thehrz.allmusicreload.core.utils.HudUtils;
import io.github.thehrz.allmusicreload.core.utils.Logs;
import java.io.BufferedInputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue;
public class PlayMusic {
/**
* 播放列表
*/
private static final List<SongInfoObj> playList = new ArrayList<>();
private static final Queue<MusicObj> tasks = new ConcurrentLinkedQueue<>();
private static final List<String> playIdleList = new ArrayList<>();
private static final Queue<String> deep = new PriorityQueue<>();
/**
* 切歌投票时间
*/
private static int voteTime = 0;
/**
* 切歌发起人
*/
private static String voteSender;
/**
* 切歌投票的玩家
*/
private static final Set<String> votePlayer = new HashSet<>();
/**
* 插歌投票时间
*/
private static int pushTime = 0;
/**
* 插歌发起人
*/
private static String pushSender;
/**
* 插歌投票的玩家
*/
private static final Set<String> pushPlayer = new HashSet<>();
/**
* 插歌目标
*/
private static SongInfoObj push;
/**
* 总歌曲长度
*/
public static long musicAllTime = 0;
/**
* 剩余歌曲长度
*/
public static long musicLessTime = 0;
/**
* 歌曲现在位置
*/
public static long musicNowTime = 0;
/**
* 当前歌曲信息
*/
public static SongInfoObj nowPlayMusic;
/**
* 当前歌词信息
*/
public static LyricSave lyric;
/**
* 播放链接
*/
public static String url;
/**
* 错误次数
*/
public static int error;
private static boolean isRun;
private static int idleNow;
/**
* 停止歌曲逻辑
*/
public static void stop() {
PlayMusic.clear();
isRun = false;
}
/**
* 开始歌曲逻辑
*/
public static void start() {
Thread addT = new Thread(PlayMusic::task, "AllMusicList");
isRun = true;
addT.start();
}
/**
* 添加投票的玩家
*
* @param player 用户名
*/
public static void addVote(String player) {
player = player.toLowerCase();
votePlayer.add(player);
}
public static void startVote(String player) {
player = player.toLowerCase();
voteSender = player;
votePlayer.add(player);
voteTime = AllMusic.getConfig().voteTime;
}
/**
* 添加投票的玩家
*
* @param player 用户名
*/
public static void addPush(String player) {
player = player.toLowerCase();
pushPlayer.add(player);
}
public static void startPush(String player, SongInfoObj music) {
player = player.toLowerCase();
push = music;
pushSender = player;
pushPlayer.add(player);
pushTime = AllMusic.getConfig().voteTime;
}
public static void pushTick() {
pushTime--;
}
public static void voteTick() {
voteTime--;
}
public static SongInfoObj getPush() {
return push;
}
public static int getPushTime() {
return pushTime;
}
public static String getPushSender() {
return pushSender;
}
public static int getVoteTime() {
return voteTime;
}
public static String getVoteSender() {
return voteSender;
}
/**
* 获取投票数量
*
* @return 数量
*/
public static int getVoteCount() {
return votePlayer.size();
}
public static int getPushCount() {
return pushPlayer.size();
}
/**
* 清空投票
*/
public static void clearVote() {
voteTime = -1;
voteSender = null;
votePlayer.clear();
}
/**
* 清空插歌
*/
public static void clearPush() {
pushTime = -1;
push = null;
pushSender = null;
pushPlayer.clear();
}
/**
* 是否已经投票了
*
* @param player 用户名
* @return 结果
*/
public static boolean containVote(String player) {
player = player.toLowerCase();
return votePlayer.contains(player);
}
public static boolean containPush(String player) {
player = player.toLowerCase();
return pushPlayer.contains(player);
};
/**
* 添加点歌任务
*
* @param obj 歌曲
*/
public static void addTask(MusicObj obj) {
tasks.add(obj);
}
private static void task() {
while (isRun) {
try {
MusicObj obj = tasks.poll();
if (obj != null) {
if (obj.isUrl) {
addUrl(obj.url);
} else {
addMusic(obj.sender, obj.id, obj.name, obj.isDefault);
}
}
Thread.sleep(10);
} catch (Exception e) {
AllMusic.log.warning("歌曲处理出现问题");
e.printStackTrace();
}
}
}
/**
* 添加歌曲
*
* @param sender 发送者
* @param id 歌曲ID
* @param player 用户名
* @param isList 是否是空闲歌单
*/
public static void addMusic(Object sender, String id, String player, boolean isList) {
if (haveMusic(id))
return;
if (sender != null) {
String text = AllMusic.getMessage().musicPlay.checkMusic
.replace(PAL.musicId, id);
AllMusic.side.sendMessageTask(sender, text);
}
Logs.logWrite("player:" + player + " add:" + id);
try {
SongInfoObj info = AllMusic.getMusicApi().getMusic(id, player, isList);
if (info == null) {
if (sender != null) {
String data = AllMusic.getMessage().musicPlay.emptyCanPlay;
AllMusic.side.sendMessageTask(sender, data.replace(PAL.musicId, id));
}
return;
}
LimitObj limit = AllMusic.getConfig().limit;
if (limit.musicTimeLimit && info.getLength() / 1000 > limit.maxMusicTime) {
if (sender != null) {
AllMusic.side.sendMessageTask(sender, AllMusic.getMessage().addMusic.timeOut);
}
return;
}
playList.add(info);
if (!AllMusic.getConfig().muteAddMessage) {
if (AllMusic.getConfig().showInBar) {
String data = AllMusic.getMessage().musicPlay.addMusic
.replace(PAL.musicName, HudUtils.messageLimit(info.getName()))
.replace(PAL.musicAuthor, HudUtils.messageLimit(info.getAuthor()))
.replace(PAL.musicAl, HudUtils.messageLimit(info.getAl()))
.replace(PAL.musicAlia, HudUtils.messageLimit(info.getAlia()))
.replace(PAL.player, info.getCall());
AllMusic.side.sendBar(data);
} else {
String data = AllMusic.getMessage().musicPlay.addMusic
.replace(PAL.musicName, info.getName())
.replace(PAL.musicAuthor, info.getAuthor())
.replace(PAL.musicAl, info.getAl())
.replace(PAL.musicAlia, info.getAlia())
.replace(PAL.player, info.getCall());
AllMusic.side.broadcastInTask(data);
}
}
if (AllMusic.getConfig().playListSwitch
&& (PlayMusic.nowPlayMusic != null && PlayMusic.nowPlayMusic.isList())) {
PlayMusic.musicLessTime = 1;
if (!isList) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().musicPlay.switchMusic);
}
}
error = 0;
} catch (Exception e) {
if (isList) {
error++;
}
AllMusic.log.warning("§d[AllMusic3]§c歌曲信息解析错误");
e.printStackTrace();
}
}
/**
* 将歌曲移动到队列头
*/
public static void pushMusic() {
SongInfoObj obj = push;
synchronized (playList) {
playList.remove(obj);
playList.add(0, obj);
}
}
/**
* 获取播放列表长度
*
* @return 长度
*/
public static int getListSize() {
synchronized (playList) {
return playList.size();
}
}
/**
* 获取当前播放列表
*
* @return 播放列表
*/
public static List<SongInfoObj> getList() {
synchronized (playList) {
return new ArrayList<>(playList);
}
}
/**
* 清理播放列表
*/
public static void clear() {
synchronized (playList) {
playList.clear();
}
}
/**
* 从播放列表删除
*
* @param index 标号
* @return 结果
*/
public static SongInfoObj remove(int index) {
synchronized (playList) {
return playList.remove(index);
}
}
/**
* 从播放列表删除
*
* @param index
*/
public static void remove(SongInfoObj index) {
synchronized (playList) {
playList.remove(index);
}
}
/**
* 获取播放列表所有信息
*
* @return 信息
*/
public static String getAllList() {
StringBuilder list = new StringBuilder();
String a;
SongInfoObj info;
for (int i = 0; i < playList.size(); i++) {
info = playList.get(i);
a = AllMusic.getMessage().musicPlay.listMusic.item;
a = a.replace(PAL.index, String.valueOf(i + 1))
.replace(PAL.musicName, info.getName())
.replace(PAL.musicAuthor, info.getAuthor())
.replace(PAL.musicAl, info.getAl())
.replace(PAL.musicAlia, info.getAlia());
list.append(a).append("\n");
}
String temp = list.toString();
if (temp.isEmpty())
return "";
return temp.substring(0, temp.length() - 1);
}
/**
* 是否在播放列表中
*
* @param id 音乐ID
* @return 结果
*/
public static boolean haveMusic(String id) {
if (nowPlayMusic != null && nowPlayMusic.getID().equalsIgnoreCase(id))
return true;
for (SongInfoObj item : playList) {
if (item.getID().equalsIgnoreCase(id))
return true;
}
return false;
}
/**
* 添加Url歌曲
*
* @param url 链接
*/
private static void addUrl(String url) {
try {
URL urlfile = new URL(url);
URLConnection con = urlfile.openConnection();
int b = con.getContentLength();// 得到音乐文件的总长度
BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
Bitstream bt = new Bitstream(bis);
Header h = bt.readFrame();
int le = 6000000;
if (h == null) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().musicPlay.error1);
} else {
le = (int) h.total_ms(b);
}
SongInfoObj info = new SongInfoObj(AllMusic.getMessage().custom.info, url, le);
playList.add(info);
} catch (Exception e) {
AllMusic.log.warning("§d[AllMusic3]§c歌曲信息解析错误");
e.printStackTrace();
}
}
/**
* 判断玩家点歌数量是否超上限
*
* @param name 玩家名
* @return
*/
public static boolean isPlayerMax(String name) {
int list = AllMusic.getConfig().maxPlayerList;
if (list == 0) {
return false;
}
int count = 0;
for (MusicObj obj : tasks) {
if (obj.name.equalsIgnoreCase(name)) {
count++;
}
}
return list <= count;
}
public static void addIdleList(List<String> list) {
playIdleList.addAll(list);
}
public static void clearIdleList() {
playIdleList.clear();
DataSql.clearIdleList();
}
public static int getIdleListSize() {
return playIdleList.size();
}
/**
* 获取空闲歌单的一首歌
*
* @return 结果
*/
public static String getIdleMusic() {
if (AllMusic.getMusicApi().isUpdate()) {
return null;
}
String id;
if (playIdleList.isEmpty())
return null;
if (AllMusic.getConfig().playListRandom) {
if (playIdleList.size() == 1)
return playIdleList.get(0);
if (playIdleList.size() > 10) {
int size = AllMusic.getConfig().playListEscapeDeep;
if (size > playIdleList.size() / 2) {
size = playIdleList.size() / 2;
}
if (deep.size() >= size) {
deep.poll();
}
do {
id = playIdleList.get(new Random().nextInt(playIdleList.size()));
}
while (deep.contains(id));
deep.add(id);
} else {
id = playIdleList.get(new Random().nextInt(playIdleList.size()));
}
} else {
id = playIdleList.get(idleNow);
idleNow++;
if (idleNow >= playIdleList.size()) {
idleNow = 0;
}
}
return id;
}
public static SongInfoObj findPlayerMusic(String name) {
List<SongInfoObj> list1 = getList();
for (int a = 0; a < playList.size(); a++) {
SongInfoObj item = list1.get(a);
if (name.equalsIgnoreCase(item.getCall())) {
return item;
}
}
return null;
}
public static SongInfoObj findMusicIndex(int index) {
List<SongInfoObj> list1 = getList();
index--;
if (index <= 0) {
return null;
}
if (list1.size() <= index) {
return null;
}
return list1.get(index);
}
}

View File

@ -0,0 +1,310 @@
package io.github.thehrz.allmusicreload.core.music.play;
import io.github.thehrz.allmusicreload.core.AllMusic;
import io.github.thehrz.allmusicreload.core.objs.message.PAL;
import io.github.thehrz.allmusicreload.core.objs.music.SongInfoObj;
import io.github.thehrz.allmusicreload.core.utils.HudUtils;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class PlayRuntime {
/**
* 倒数计数器
*/
private static int count = 0;
private static int ping = 0;
private static boolean isRun;
/**
* 歌曲更新计数器
*/
private static int times = 0;
/**
* 歌曲定时器
*/
private static ScheduledExecutorService service;
/**
* 歌词定时器
*/
private static ScheduledExecutorService service1;
/**
* 事务定时器
*/
private static ScheduledExecutorService service2;
/**
* 启动歌曲工作
*/
public static void start() {
Thread taskT = new Thread(PlayRuntime::task, "AllMusicPlay");
isRun = true;
taskT.start();
service2 = Executors.newSingleThreadScheduledExecutor();
service2.scheduleAtFixedRate(PlayRuntime::time3, 0, 1, TimeUnit.SECONDS);
}
/**
* 停止歌曲工作
*/
public static void stop() {
closeTimer();
if (service2 != null) {
service2.shutdown();
service2 = null;
}
isRun = false;
PlayMusic.musicLessTime = 0;
}
private static void closeTimer() {
if (service != null) {
service.shutdown();
service = null;
}
if (service1 != null) {
service1.shutdown();
service1 = null;
}
}
private static void startTimer() {
service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(PlayRuntime::time1, 0, 10, TimeUnit.MILLISECONDS);
if (PlayMusic.lyric != null && PlayMusic.lyric.isHaveLyric()) {
service1 = Executors.newSingleThreadScheduledExecutor();
service1.scheduleAtFixedRate(PlayRuntime::time2, 0, 2, TimeUnit.MILLISECONDS);
}
}
/**
* 清空歌曲数据
*/
private static void clear() {
closeTimer();
PlayMusic.musicNowTime = 0;
PlayMusic.musicAllTime = 0;
PlayMusic.musicLessTime = 0;
PlayMusic.lyric = null;
PlayMusic.nowPlayMusic = null;
AllMusic.side.updateInfo();
HudUtils.clearHud();
HudUtils.sendHudNowData();
HudUtils.sendHudLyricData();
HudUtils.sendHudListData();
}
/**
* 歌曲时间定时器
*/
private static void time1() {
PlayMusic.musicNowTime += 10;
count++;
if (count == 100) {
PlayMusic.musicLessTime--;
count = 0;
}
}
/**
* 歌词更新
*/
private static void time2() {
try {
if (PlayMusic.lyric == null)
return;
boolean res = PlayMusic.lyric
.checkTime(PlayMusic.musicNowTime, AllMusic.getConfig().ktvMode);
if (res) {
times = 0;
HudUtils.sendHudLyricData();
AllMusic.side.updateLyric();
} else {
times++;
if (times == AllMusic.getConfig().sendDelay / 2 && PlayMusic.lyric != null) {
times = 0;
HudUtils.sendHudLyricData();
AllMusic.side.updateLyric();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean checkPush() {
SongInfoObj music = PlayMusic.getPush();
if (music != null) {
if (PlayMusic.nowPlayMusic.getID().equalsIgnoreCase(music.getID())) {
return false;
}
List<SongInfoObj> list = PlayMusic.getList();
if (list.isEmpty()) {
return false;
}
SongInfoObj id1 = list.get(0);
if (id1 != null && id1.getID().equalsIgnoreCase(music.getID())) {
return false;
}
for (int a = 1; a < list.size(); a++) {
id1 = list.get(a);
if (id1.getID().equalsIgnoreCase(music.getID()))
return true;
}
}
return false;
}
/**
* 事务定时器
*/
private static void time3() {
try {
ping++;
if (ping >= 10) {
AllMusic.side.ping();
}
if (PlayMusic.getPushTime() > 0) {
if (!checkPush()) {
PlayMusic.clearPush();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.cancel);
} else {
PlayMusic.pushTick();
if (PlayMusic.getPushTime() == 0) {
PlayMusic.clearPush();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.timeOut);
} else {
int players = AllMusic.side.getPlayerSize();
if (PlayMusic.getPushCount() >= AllMusic.getConfig().minVote
|| (players <= AllMusic.getConfig().minVote
&& players <= PlayMusic.getPushCount())) {
PlayMusic.pushMusic();
PlayMusic.clearPush();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.doPush);
}
}
}
}
if (PlayMusic.getVoteTime() > 0) {
PlayMusic.voteTick();
if (PlayMusic.getVoteTime() == 0) {
PlayMusic.clearVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.timeOut);
} else {
int players = AllMusic.side.getPlayerSize();
if (PlayMusic.getVoteCount() >= AllMusic.getConfig().minVote
|| (players <= AllMusic.getConfig().minVote
&& players <= PlayMusic.getVoteCount())) {
PlayMusic.musicLessTime = 0;
PlayMusic.clearVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.voteDone);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void task() {
while (isRun) {
try {
if (PlayMusic.getListSize() == 0) {
if (PlayMusic.error >= 10) {
Thread.sleep(1000);
} else if (PlayMusic.getIdleListSize() > 0) {
if (AllMusic.side.needPlay()) {
String id = PlayMusic.getIdleMusic();
if (id != null) {
PlayMusic.addMusic(null, id, AllMusic.getMessage().custom.idle, true);
}
}
}
Thread.sleep(1000);
} else {
HudUtils.sendHudNowData();
HudUtils.sendHudLyricData();
HudUtils.sendHudListData();
AllMusic.side.sendHudUtilsAll();
PlayMusic.nowPlayMusic = PlayMusic.remove(0);
if (AllMusic.side.onMusicPlay(PlayMusic.nowPlayMusic)) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().musicPlay.cancel);
continue;
}
PlayMusic.url = PlayMusic.nowPlayMusic.getPlayerUrl() == null ?
AllMusic.getMusicApi().getPlayUrl(PlayMusic.nowPlayMusic.getID()) :
PlayMusic.nowPlayMusic.getPlayerUrl();
if (PlayMusic.url == null) {
String data = AllMusic.getMessage().musicPlay.emptyCanPlay;
AllMusic.side.broadcastInTask(data.replace(PAL.musicId, PlayMusic.nowPlayMusic.getID()));
PlayMusic.nowPlayMusic = null;
continue;
}
if (PlayMusic.nowPlayMusic.getPlayerUrl() == null)
PlayMusic.lyric = AllMusic.getMusicApi().getLyric(PlayMusic.nowPlayMusic.getID());
else
PlayMusic.lyric = new LyricSave();
if (PlayMusic.nowPlayMusic.getLength() != 0) {
PlayMusic.musicAllTime = PlayMusic.musicLessTime = (PlayMusic.nowPlayMusic.getLength() / 1000) + 3;
startTimer();
AllMusic.side.sendMusic(PlayMusic.url);
if (!AllMusic.getConfig().mutePlayMessage) {
SongInfoObj music = PlayMusic.nowPlayMusic;
if (AllMusic.getConfig().showInBar) {
String info = AllMusic.getMessage().musicPlay.nowPlay
.replace(PAL.musicName, HudUtils.messageLimit(music.getName()))
.replace(PAL.musicAuthor, HudUtils.messageLimit(music.getAuthor()))
.replace(PAL.musicAl, HudUtils.messageLimit(music.getAl()))
.replace(PAL.musicAlia, HudUtils.messageLimit(music.getAlia()))
.replace(PAL.player, music.getCall());
AllMusic.side.sendBar(info);
} else {
String info = AllMusic.getMessage().musicPlay.nowPlay
.replace(PAL.musicName, music.getName())
.replace(PAL.musicAuthor, music.getAuthor())
.replace(PAL.musicAl, music.getAl())
.replace(PAL.musicAlia, music.getAlia())
.replace(PAL.player, music.getCall());
AllMusic.side.broadcastInTask(info);
}
}
if (!PlayMusic.nowPlayMusic.isUrl() && PlayMusic.nowPlayMusic.getPicUrl() != null) {
AllMusic.side.sendPic(PlayMusic.nowPlayMusic.getPicUrl());
}
if (PlayMusic.nowPlayMusic.isTrial()) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().musicPlay.trail);
PlayMusic.musicLessTime = PlayMusic.nowPlayMusic.getTrialInfo().getEnd();
PlayMusic.musicNowTime = PlayMusic.nowPlayMusic.getTrialInfo().getStart();
}
AllMusic.side.updateInfo();
while (PlayMusic.musicLessTime > 0) {
HudUtils.sendHudNowData();
HudUtils.sendHudListData();
if (!AllMusic.side.needPlay()) {
PlayMusic.musicLessTime = 1;
}
Thread.sleep(AllMusic.getConfig().sendDelay);
}
AllMusic.side.sendStop();
} else {
String data = AllMusic.getMessage().musicPlay.emptyCanPlay;
AllMusic.side.broadcastInTask(data.replace(PAL.musicId, PlayMusic.nowPlayMusic.getID()));
}
clear();
}
} catch (Exception e) {
AllMusic.log.warning("§c歌曲播放出现错误");
e.printStackTrace();
}
}
}
}

View File

@ -0,0 +1,28 @@
package io.github.thehrz.allmusicreload.core.music.play;
public class TopLyricSave extends LyricSave {
public void setTlyric(String data) {
tly = data;
}
public void setLyric(String data) {
lly = data;
}
public void setKly(String data) {
kly = data;
}
public void setHaveK(boolean data) {
if (!data) {
kly = null;
}
}
public void setHaveT(boolean data) {
if (!data) {
tly = null;
}
}
}

View File

@ -0,0 +1,11 @@
package io.github.thehrz.allmusicreload.core.objs;
import okhttp3.Cookie;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class CookieObj {
public HashMap<String, ArrayList<Cookie>> cookieStore = new HashMap<>();
}

View File

@ -0,0 +1,11 @@
package io.github.thehrz.allmusicreload.core.objs;
public class HttpResObj {
public final String data;
public final boolean ok;
public HttpResObj(String data, boolean ok) {
this.data = data;
this.ok = ok;
}
}

View File

@ -0,0 +1,15 @@
package io.github.thehrz.allmusicreload.core.objs;
public class SearchMusicObj {
public final String id;
public final String name;
public final String author;
public final String al;
public SearchMusicObj(String ID, String Name, String Author, String Al) {
this.id = ID;
this.name = Name;
this.author = Author;
this.al = Al;
}
}

View File

@ -0,0 +1,12 @@
package io.github.thehrz.allmusicreload.core.objs;
public class UserCookie {
public String domain;
public double expires;
public String name;
public boolean partitioned;
public String path;
public String sameSite;
public boolean secure;
public String value;
}

View File

@ -0,0 +1,11 @@
package io.github.thehrz.allmusicreload.core.objs.api;
public class EncResObj {
public String params;
public String encSecKey;
public EncResObj(String params, String encSecKey) {
this.encSecKey = encSecKey;
this.params = params;
}
}

View File

@ -0,0 +1,127 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.info;
import java.util.List;
public class InfoObj {
private List<Songs> songs;
public boolean isOk() {
return (songs != null && !songs.isEmpty());
}
public String getName() {
if (songs == null || songs.isEmpty())
return "";
return songs.get(0).getName();
}
public String getAuthor() {
StringBuilder Author = new StringBuilder();
if (songs.isEmpty())
return "";
for (ar ar : songs.get(0).getAr()) {
Author.append(ar.getName()).append(",");
}
if (Author.length() != 0) {
Author = new StringBuilder(Author.substring(0, Author.length() - 1));
}
return Author.toString();
}
public String getAlia() {
StringBuilder Alia = new StringBuilder();
for (String alia : songs.get(0).getAlia()) {
Alia.append(alia).append(",");
}
if (Alia.length() != 0) {
Alia = new StringBuilder(Alia.substring(0, Alia.length() - 1));
}
return Alia.toString();
}
public String getAl() {
return songs.get(0).getAl();
}
public long getLength() {
if (songs == null)
return 0;
return songs.get(0).getLength();
}
public String getPicUrl() {
if (songs == null)
return null;
return songs.get(0).getPicUrl();
}
}
class Songs {
private String name;
private List<ar> ar;
private List<String> alia;
private al al;
private h l;
private h m;
private h h;
public long getLength() {
if (l != null)
return l.getLength();
if (m != null)
return m.getLength();
if (h != null)
return h.getLength();
return 0;
}
public String getName() {
return name == null ? "" : name;
}
public List<ar> getAr() {
return ar;
}
public List<String> getAlia() {
return alia;
}
public String getAl() {
return al.getName() == null ? "" : al.getName();
}
public String getPicUrl() {
return al.getPicUrl();
}
}
class ar {
private String name;
public String getName() {
return name == null ? "" : name;
}
}
class al {
private String name;
private String picUrl;
public String getName() {
return name == null ? "" : name;
}
public String getPicUrl() {
return picUrl == null ? "" : picUrl;
}
}
class h {
private long br;
private long size;
public long getLength() {
return size / br * 8000;
}
}

View File

@ -0,0 +1,30 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.info;
import java.util.List;
public class PlayObj {
private List<obj> data;
private int code;
public String getData() {
if (data == null)
return null;
if (data.size() == 0)
return null;
obj obj = data.get(0);
return obj.getUrl();
}
public int getCode() {
return code;
}
}
class obj {
private String url;
public String getUrl() {
return url;
}
}

View File

@ -0,0 +1,41 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.list;
import java.util.ArrayList;
import java.util.List;
public class DataObj {
private playlist playlist;
public List<String> getPlaylist() {
List<String> list = new ArrayList<>();
for (track item : playlist.getTracks()) {
list.add(item.getId());
}
return list;
}
public String getName() {
return playlist.getName();
}
}
class track {
private long id;
public String getId() {
return String.valueOf(id);
}
}
class playlist {
private List<track> trackIds;
private String name;
public List<track> getTracks() {
return trackIds;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,86 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.lyric;
public class WLyricObj {
private lrc lrc;
private tlyric tlyric;
private klyric klyric;
private yrc yrc;
private boolean nolyric;
private boolean uncollected;
public boolean isOk() {
return lrc != null || isNone();
}
public String getLyric() {
return lrc.getLyric();
}
public String getTlyric() {
if (tlyric == null)
return null;
return tlyric.getLyric();
}
public String getKlyric() {
if (klyric == null)
return null;
return klyric.getLyric();
}
public String getYrc() {
if (yrc == null)
return null;
return yrc.getLyric();
}
public boolean getVersion() {
return yrc != null;
}
public boolean isNone() {
return nolyric || uncollected;
}
}
class lrc {
private String lyric;
public String getLyric() {
return lyric == null ? "" : lyric;
}
}
class tlyric {
private String lyric;
public String getLyric() {
return lyric;
}
}
class klyric {
private String lyric;
private int version;
public int getVersion() {
return version;
}
public String getLyric() {
return lyric == null ? "" : lyric;
}
}
class yrc {
private long version;
private String lyric;
public long getVersion() {
return version;
}
public String getLyric() {
return lyric == null ? "" : lyric;
}
}

View File

@ -0,0 +1,40 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.search;
import java.util.List;
public class SearchDataObj {
private result result;
public boolean isOk() {
return result != null && result.getSongs() != null;
}
public List<songs> getResult() {
return result.getSongs();
}
}
class result {
private List<songs> songs;
public List<songs> getSongs() {
return songs;
}
}
class artists {
private String name;
public String getName() {
return name;
}
}
class album {
private String name;
public String getName() {
return name;
}
}

View File

@ -0,0 +1,30 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.search;
import java.util.List;
public class songs {
private long id;
private String name;
private List<artists> artists;
private album album;
public long getId() {
return id;
}
public String getName() {
return name;
}
public String getAlbum() {
return album.getName();
}
public String getArtists() {
StringBuilder a = new StringBuilder();
for (artists temp : artists) {
a.append(temp.getName()).append(",");
}
return a.substring(0, a.length() - 1);
}
}

View File

@ -0,0 +1,46 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.trialinfo;
import java.util.List;
public class TrialInfoObj {
private List<song> data;
public boolean isTrial() {
if (data.size() == 0)
return false;
song song = data.get(0);
return song.getCode() != 200;
}
public freeTrialInfo getFreeTrialInfo() {
song song = data.get(0);
return song.getFreeTrialInfo() == null ? new freeTrialInfo() {{
this.setEnd(30);
}} : song.getFreeTrialInfo();
}
public String getUrl() {
if (data.size() == 0)
return null;
song song = data.get(0);
return song.getUrl();
}
}
class song {
private freeTrialInfo freeTrialInfo;
private int code;
private String url;
public String getUrl() {
return url;
}
public int getCode() {
return code;
}
public freeTrialInfo getFreeTrialInfo() {
return freeTrialInfo;
}
}

View File

@ -0,0 +1,18 @@
package io.github.thehrz.allmusicreload.core.objs.api.music.trialinfo;
public class freeTrialInfo {
private long start;
private long end;
public long getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public long getStart() {
return start;
}
}

View File

@ -0,0 +1,99 @@
package io.github.thehrz.allmusicreload.core.objs.api.program.info;
public class PrInfoObj {
private program program;
public boolean isOk() {
return (program != null && program.getMainSong().getName() != null);
}
public String getId() {
return String.valueOf(program.getMainSong().getId());
}
public String getName() {
return program.getMainSong().getName();
}
public String getAlia() {
if (program.getDj() == null)
return null;
return program.getDj().getBrand();
}
public long getLength() {
return program.getMainSong().getLength();
}
public String getAuthor() {
return program.getDj().getNickname();
}
}
class mainSong {
private String name;
private long id;
private hMusic hMusic;
private hMusic mMusic;
private hMusic lMusic;
private hMusic bMusic;
public long getLength() {
if (hMusic != null)
return hMusic.getLength();
else if (mMusic != null)
return mMusic.getLength();
else if (lMusic != null)
return lMusic.getLength();
else if (bMusic != null)
return bMusic.getLength();
return 0;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
}
class program {
private dj dj;
private mainSong mainSong;
public dj getDj() {
return dj;
}
public mainSong getMainSong() {
return mainSong;
}
}
class dj {
private String brand;
private String nickname;
public String getNickname() {
return nickname;
}
public String getBrand() {
return brand;
}
}
class hMusic {
private long size;
private long bitrate;
public long getLength() {
return size / bitrate * 8000;
}
}

View File

@ -0,0 +1,243 @@
package io.github.thehrz.allmusicreload.core.objs.config;
import io.github.thehrz.allmusicreload.core.AllMusic;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
/**
* 配置文件对象
*/
public class ConfigObj {
/**
* 最大歌曲数
*/
public int maxPlayList;
/**
* 一个玩家最大可点数量
*/
public int maxPlayerList;
/**
* 最小通过投票数
*/
public int minVote;
/**
* 投票时间
*/
public int voteTime;
/**
* 歌曲延迟
*/
public int lyricDelay;
/**
* 默认添加歌曲方式
*/
public int defaultAddMusic;
/**
* KTV模式歌词加时
*/
public int ktvLyricDelay;
/**
* 管理员ID列表
*/
public Set<String> adminList;
/**
* 不参与点歌的服务器列表
*/
public Set<String> muteServer;
/**
* 不参与点歌的玩家列表
*/
public Set<String> mutePlayer;
/**
* 禁止点歌ID列表
*/
public Set<String> banMusic;
/**
* 禁止玩家点歌列表
*/
public Set<String> banPlayer;
/**
* 玩家点歌后是否直接从空闲歌单切换至玩家歌曲
*/
public boolean playListSwitch;
/**
* 空闲歌单随机播放
*/
public boolean playListRandom;
/**
* 多少首歌不重复
*/
public int playListEscapeDeep;
/**
* 显示歌词
*/
public boolean sendLyric;
/**
* 指令需要权限
*/
public boolean needPermission;
/**
* 顶层模式用于和BC交换数据
*/
public boolean topPAPI;
/**
* 不发送播放信息
*/
public boolean mutePlayMessage;
/**
* 不发送点歌信息
*/
public boolean muteAddMessage;
/**
* 将信息显示在bar处
*/
public boolean showInBar;
/**
* K歌歌词
*/
public boolean ktvMode;
/**
* 歌曲音质
*/
public String musicBR;
/**
* 配置文件版本号
*/
public String version;
/**
* 默认的Hud配置
*/
public SaveObj defaultHud;
/**
* 经济插件挂钩
*/
public EconomyObj economy;
/**
* 娱乐选项
*/
public FunConfigObj funConfig;
/**
* 限制设置
*/
public LimitObj limit;
/**
* 花费点歌
*/
public CostObj cost;
/**
* 信息更新延迟
*/
public int sendDelay;
public static ConfigObj make() {
ConfigObj config = new ConfigObj();
config.init();
return config;
}
public void addBanMusic(String id) {
banMusic.add(id);
AllMusic.saveConfig();
}
public void addBanPlayer(String name) {
name = name.toLowerCase(Locale.ROOT);
banPlayer.add(name);
AllMusic.saveConfig();
}
public void addNoMusicPlayer(String name) {
name = name.toLowerCase(Locale.ROOT);
mutePlayer.add(name);
AllMusic.saveConfig();
}
public void removeNoMusicPlayer(String name) {
name = name.toLowerCase(Locale.ROOT);
mutePlayer.remove(name);
AllMusic.saveConfig();
}
public boolean check() {
boolean saveConfig = false;
if (adminList == null) {
saveConfig = true;
adminList = new HashSet<>();
}
if (banMusic == null) {
saveConfig = true;
banMusic = new HashSet<>();
}
if (banPlayer == null) {
saveConfig = true;
banPlayer = new HashSet<>();
}
if (defaultHud == null) {
saveConfig = true;
defaultHud = SaveObj.make();
}
if (mutePlayer == null) {
saveConfig = true;
mutePlayer = new HashSet<>();
}
if (muteServer == null) {
saveConfig = true;
muteServer = new HashSet<>();
}
if (economy == null || economy.check()) {
saveConfig = true;
economy = EconomyObj.make();
}
if (funConfig == null) {
saveConfig = true;
funConfig = FunConfigObj.make();
}
if (limit == null) {
saveConfig = true;
limit = LimitObj.make();
}
if (cost == null) {
saveConfig = true;
cost = CostObj.make();
}
return saveConfig;
}
public void init() {
maxPlayerList = 0;
maxPlayList = 10;
minVote = 3;
voteTime = 30;
adminList = new HashSet<>();
adminList.add("color_yr");
muteServer = new HashSet<>();
mutePlayer = new HashSet<>();
banMusic = new HashSet<>();
banPlayer = new HashSet<>();
playListSwitch = true;
playListRandom = true;
playListEscapeDeep = 40;
sendLyric = true;
needPermission = false;
defaultHud = SaveObj.make();
mutePlayMessage = false;
muteAddMessage = false;
showInBar = false;
defaultAddMusic = 0;
musicBR = "320000";
topPAPI = false;
limit = LimitObj.make();
economy = EconomyObj.make();
funConfig = FunConfigObj.make();
cost = CostObj.make();
ktvMode = true;
ktvLyricDelay = 0;
lyricDelay = 0;
sendDelay = 1000;
version = AllMusic.configVersion;
}
}

View File

@ -0,0 +1,24 @@
package io.github.thehrz.allmusicreload.core.objs.config;
public class CostObj {
/**
* 搜歌花费
*/
public int searchCost;
/**
* 点歌花费
*/
public int addMusicCost;
/**
* 开启花钱点歌
*/
public boolean useCost;
public static CostObj make() {
CostObj obj = new CostObj();
obj.useCost = false;
obj.searchCost = 20;
obj.addMusicCost = 10;
return obj;
}
}

View File

@ -0,0 +1,26 @@
package io.github.thehrz.allmusicreload.core.objs.config;
public class EconomyObj {
public String mysqlUrl;
public String backend;
public boolean vault;
public static EconomyObj make() {
EconomyObj obj = new EconomyObj();
obj.init();
return obj;
}
public boolean check() {
boolean res = mysqlUrl == null;
return res;
}
public void init() {
backend = "Server1";
mysqlUrl = "jdbc:mysql://localhost:3306/minecraft?autoReconnect=true&autoReconnectForPools=true";
vault = true;
}
}

View File

@ -0,0 +1,18 @@
package io.github.thehrz.allmusicreload.core.objs.config;
public class FunConfigObj {
public boolean rain;
public int rainRate;
public static FunConfigObj make() {
FunConfigObj obj = new FunConfigObj();
obj.init();
return obj;
}
public void init() {
rain = true;
rainRate = 10;
}
}

View File

@ -0,0 +1,54 @@
package io.github.thehrz.allmusicreload.core.objs.config;
public class LimitObj {
/**
* 开启信息长度限制
*/
public boolean messageLimit;
/**
* 消息限制长度
*/
public int messageLimitSize;
/**
* 开启信息长度限制
*/
public boolean listLimit;
/**
* 消息限制长度
*/
public int listLimitSize;
/**
* 开启信息长度限制
*/
public boolean infoLimit;
/**
* 消息限制长度
*/
public int infoLimitSize;
/**
* 开启歌曲长度限制
*/
public boolean musicTimeLimit;
/**
* 最长音乐长度
*/
public int maxMusicTime;
/**
* 长度替换符号
*/
public String limitText;
public static LimitObj make() {
LimitObj obj = new LimitObj();
obj.musicTimeLimit = true;
obj.maxMusicTime = 600;
obj.infoLimit = true;
obj.infoLimitSize = 10;
obj.listLimit = false;
obj.listLimitSize = 10;
obj.messageLimit = false;
obj.messageLimitSize = 20;
obj.limitText = "...";
return obj;
}
}

View File

@ -0,0 +1,58 @@
package io.github.thehrz.allmusicreload.core.objs.config;
import io.github.thehrz.allmusicreload.core.objs.enums.HudDirType;
import io.github.thehrz.allmusicreload.core.objs.hud.PosObj;
public class SaveObj {
public PosObj list;
public PosObj lyric;
public PosObj info;
public PosObj pic;
public int picRotateSpeed;
public static SaveObj make() {
SaveObj obj = new SaveObj();
obj.init();
return obj;
}
public SaveObj copy() {
SaveObj obj1 = new SaveObj();
obj1.info = this.info.copy();
obj1.list = this.list.copy();
obj1.lyric = this.lyric.copy();
obj1.pic = this.pic.copy();
obj1.picRotateSpeed = this.picRotateSpeed;
return obj1;
}
public boolean check() {
boolean save = false;
if (list == null) {
save = true;
list = new PosObj(2, 74, HudDirType.TOP_LEFT, 0xffffff, true, true);
}
if (lyric == null) {
save = true;
lyric = new PosObj(74, 53, HudDirType.TOP_LEFT, 0xffffff, true, true);
}
if (info == null) {
save = true;
info = new PosObj(74, 2, HudDirType.TOP_LEFT, 0xffffff, true, true);
}
if (pic == null) {
save = true;
pic = new PosObj(2, 2, HudDirType.TOP_LEFT, 70, true, true);
}
return save;
}
public void init() {
picRotateSpeed = 30;
list = new PosObj(2, 74, HudDirType.TOP_LEFT, 0xffffff, true, true);
lyric = new PosObj(74, 53, HudDirType.TOP_LEFT, 0xffffff, true, true);
info = new PosObj(74, 2, HudDirType.TOP_LEFT, 0xffffff, true, true);
pic = new PosObj(2, 2, HudDirType.TOP_LEFT, 70, true, true);
}
}

View File

@ -0,0 +1,6 @@
package io.github.thehrz.allmusicreload.core.objs.enums;
public enum ComType {
LYRIC, INFO, LIST, PLAY, IMG,
STOP, CLEAR, POS, HUD
}

View File

@ -0,0 +1,5 @@
package io.github.thehrz.allmusicreload.core.objs.enums;
public enum EncryptType {
WEAPI, EAPI, API
}

View File

@ -0,0 +1,7 @@
package io.github.thehrz.allmusicreload.core.objs.enums;
public enum HudDirType {
TOP_LEFT, TOP_CENTER, TOP_RIGHT,
LEFT, CENTER, RIGHT,
BOTTOM_LEFT, BOTTOM_CENTER, BOTTOM_RIGHT
}

View File

@ -0,0 +1,5 @@
package io.github.thehrz.allmusicreload.core.objs.enums;
public enum HudType {
INFO, LIST, LYRIC, PIC
}

View File

@ -0,0 +1,29 @@
package io.github.thehrz.allmusicreload.core.objs.hud;
import io.github.thehrz.allmusicreload.core.objs.enums.HudDirType;
public class PosObj {
public int x;
public int y;
public HudDirType dir;
public int color;
public boolean shadow;
public boolean enable;
public PosObj() {
}
public PosObj(int x, int y, HudDirType type, int color, boolean shadow, boolean enable) {
this.x = x;
this.y = y;
this.dir = type;
this.color = color;
this.shadow = shadow;
this.enable = enable;
}
public PosObj copy() {
return new PosObj(this.x, this.y, this.dir, this.color, this.shadow, this.enable);
}
}

View File

@ -0,0 +1,56 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class AddMusicObj {
public String listFull;
public String playerToMany;
public String banMusic;
public String playerBan;
public String existMusic;
public String success;
public String noPlayer;
public String noID;
public String cancel;
public String timeOut;
public static AddMusicObj make() {
AddMusicObj obj = new AddMusicObj();
obj.init();
return obj;
}
public boolean check() {
if (listFull == null)
return true;
if (banMusic == null)
return true;
if (existMusic == null)
return true;
if (success == null)
return true;
if (noPlayer == null)
return true;
if (noID == null)
return true;
if (cancel == null)
return true;
if (playerToMany == null)
return true;
if (playerBan == null)
return true;
return timeOut == null;
}
public void init() {
listFull = "§d[AllMusic3]§c错误队列已满";
playerToMany = "§d[AllMusic3]§c错误你点了太多的歌";
playerBan = "§d[AllMusic3]§c错误你已被禁止点歌";
banMusic = "§d[AllMusic3]§c错误这首歌被禁点了";
existMusic = "§d[AllMusic3]§c错误这首歌已经存在了";
success = "§d[AllMusic3]§2点歌成功";
noPlayer = "§d[AllMusic3]§c没有播放的玩家";
noID = "§d[AllMusic3]§c错误请输入歌曲数字ID";
cancel = "§d[AllMusic3]§e点歌被取消";
timeOut = "§d[AllMusic3]§e点歌被取消音乐长度过长";
}
}

View File

@ -0,0 +1,36 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class CancelObj {
public String done;
public String err1;
public String err2;
public String err3;
public String err4;
public static CancelObj make() {
CancelObj obj = new CancelObj();
obj.init();
return obj;
}
public boolean check() {
if (err1 == null)
return true;
if (err2 == null)
return true;
if (err3 == null)
return true;
if (err4 == null)
return true;
return done == null;
}
public void init() {
err1 = "§d[AllMusic3]§c你没有点歌";
err2 = "§d[AllMusic3]§c歌曲" + PAL.musicName + "-" + PAL.musicAuthor + "不是你的点歌";
err3 = "§d[AllMusic3]§c没有找到序号为" + PAL.index + "的点歌";
err4 = "§d[AllMusic3]§c输入的序号错误";
done = "§d[AllMusic3]§e已取消你的点歌";
}
}

View File

@ -0,0 +1,24 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class ClickObj {
public String clickRun;
public String clickCheck;
public static ClickObj make() {
ClickObj obj = new ClickObj();
obj.init();
return obj;
}
public boolean check() {
if (clickRun == null)
return true;
return clickCheck == null;
}
public void init() {
clickRun = "§b[§n点我选择§r§b]";
clickCheck = "§b[§n点我查看§r§b]";
}
}

View File

@ -0,0 +1,24 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class CommandObj {
public String error;
public String noPer;
public static CommandObj make() {
CommandObj obj = new CommandObj();
obj.init();
return obj;
}
public boolean check() {
if (error == null)
return true;
return noPer == null;
}
public void init() {
error = "§d[AllMusic3]§c参数错误请输入/music help获取帮助";
noPer = "§d[AllMusic3]§c你没有权限执行这个操作";
}
}

View File

@ -0,0 +1,32 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class CostObj {
public String search;
public String addMusic;
public String noMoney;
public String costFail;
public static CostObj make() {
CostObj obj = new CostObj();
obj.init();
return obj;
}
public boolean check() {
if (search == null)
return true;
if (addMusic == null)
return true;
if (noMoney == null)
return true;
return costFail == null;
}
public void init() {
search = "§d[AllMusic3]§e你搜歌花费了" + PAL.cost;
addMusic = "§d[AllMusic3]§e你点歌花费了" + PAL.cost;
noMoney = "§d[AllMusic3]§c你没有足够的钱";
costFail = "§d[AllMusic3]§c扣钱过程中错误";
}
}

View File

@ -0,0 +1,26 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class CustomObj {
public String info;
public String idle;
public static CustomObj make() {
CustomObj obj = new CustomObj();
obj.init();
return obj;
}
public boolean check() {
boolean res = idle == null;
if (info == null) {
res = true;
}
return res;
}
public void init() {
info = "自定义音乐";
idle = "空闲列表";
}
}

View File

@ -0,0 +1,22 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class FunObj {
public String rain;
public static FunObj make() {
FunObj obj = new FunObj();
obj.init();
return obj;
}
public boolean check() {
boolean res = rain == null;
return res;
}
public void init() {
rain = "§d[AllMusic3]§e天空开始变得湿润";
}
}

View File

@ -0,0 +1,56 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class HelpAdminObj {
public String reload;
public String next;
public String ban;
public String banPlayer;
public String url;
public String delete;
public String addList;
public String clearList;
public String cookie;
public String test;
public static HelpAdminObj make() {
HelpAdminObj obj = new HelpAdminObj();
obj.init();
return obj;
}
public boolean check() {
if (reload == null)
return true;
if (next == null)
return true;
if (ban == null)
return true;
if (url == null)
return true;
if (delete == null)
return true;
if (addList == null)
return true;
if (clearList == null)
return true;
if (banPlayer == null)
return true;
if (test == null)
return true;
return cookie == null;
}
public void init() {
reload = "§d[AllMusic3]§e使用/music reload 重读配置文件";
next = "§d[AllMusic3]§e使用/music next 强制切歌";
ban = "§d[AllMusic3]§e使用/music ban [ID] 禁止点这首歌";
banPlayer = "§d[AllMusic3]§e使用/music banplayer [ID] 禁止某位玩家点歌";
url = "§d[AllMusic3]§e使用/music url [url] 播放一首自定义歌曲";
delete = "§d[AllMusic3]§e使用/music delete [序号] 删除队列中的歌曲";
addList = "§d[AllMusic3]§e使用/music addlist [歌单ID] 添加歌单到空闲列表";
clearList = "§d[AllMusic3]§e使用/music clearlist 清空空闲歌单";
cookie = "§d[AllMusic3]§e使用/music cookie [cookie] 填写cookie";
test = "§d[AllMusic3]§e使用/music test [音乐ID] 测试解析音乐";
}
}

View File

@ -0,0 +1,112 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class HelpNormalObj {
public String head;
public String base;
public String stop;
public String list;
public String cancel;
public String vote;
public String vote1;
public String push;
public String push1;
public String mute;
public String search;
public String select;
public String nextpage;
public String lastpage;
public String hud1;
public String hud2;
public String hud3;
public String hud4;
public String hud5;
public String hud6;
public String hud7;
public String hud8;
public String hud9;
public String hud10;
public static HelpNormalObj make() {
HelpNormalObj obj = new HelpNormalObj();
obj.init();
return obj;
}
public boolean check() {
if (head == null)
return true;
if (base == null)
return true;
if (stop == null)
return true;
if (list == null)
return true;
if (cancel == null)
return true;
if (vote == null)
return true;
if (vote1 == null)
return true;
if (push == null)
return true;
if (push1 == null)
return true;
if (mute == null)
return true;
if (search == null)
return true;
if (select == null)
return true;
if (hud1 == null)
return true;
if (hud2 == null)
return true;
if (hud3 == null)
return true;
if (hud4 == null)
return true;
if (hud6 == null)
return true;
if (hud7 == null)
return true;
if (hud8 == null)
return true;
if (hud9 == null)
return true;
if (hud10 == null)
return true;
if (nextpage == null)
return true;
if (lastpage == null)
return true;
return hud5 == null;
}
public void init() {
head = "§d[AllMusic3]§e帮助手册";
base = "§d[AllMusic3]§e/music [音乐ID] 来点歌";
stop = "§d[AllMusic3]§e/music stop 停止播放歌曲";
list = "§d[AllMusic3]§e/music list 查看歌曲队列";
cancel = "§d[AllMusic3]§e/music cancel (序号) 取消你的点歌";
vote = "§d[AllMusic3]§e/music vote 投票切歌";
vote1 = "§d[AllMusic3]§e/music vote cancel 取消发起的切歌";
push = "§d[AllMusic3]§e/music push (序号) 投票将歌曲插入到队列头";
push1 = "§d[AllMusic3]§e/music push cancel 取消发起的插歌";
mute = "§d[AllMusic3]§e/music mute 不再参与点歌";
search = "§d[AllMusic3]§e/music search [歌名] 搜索歌曲";
select = "§d[AllMusic3]§e/music select [序列] 选择歌曲";
nextpage = "§d[AllMusic3]§e/music nextpage 切换下一页歌曲搜索结果";
lastpage = "§d[AllMusic3]§e/music lastpage 切换上一页歌曲搜索结果";
hud9 = "§d[AllMusic3]§e/music hud enable 启用/关闭全部界面";
hud10 = "§d[AllMusic3]§e/music hud reset 重置全部界面";
hud1 = "§d[AllMusic3]§e/music hud [位置] enable 启用关闭单一界面";
hud2 = "§d[AllMusic3]§e/music hud [位置] pos [x] [y] 设置某个界面的位置";
hud6 = "§d[AllMusic3]§e/music hud [位置] dir [对齐方式] 设置某个界面的对齐方式";
hud7 = "§d[AllMusic3]§e/music hud [位置] color [颜色HEX] 设置某个界面的颜色";
hud8 = "§d[AllMusic3]§e/music hud [位置] reset 重置单一界面";
hud3 = "§d[AllMusic3]§e/music hud pic size [尺寸] 设置图片尺寸";
hud4 = "§d[AllMusic3]§e/music hud pic rotate [开关] 设置图片旋转模式";
hud5 = "§d[AllMusic3]§e/music hud pic speed [数值] 设置图片旋转速度";
}
}

View File

@ -0,0 +1,31 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class HelpObj {
public HelpNormalObj normal;
public HelpAdminObj admin;
public static HelpObj make() {
HelpObj obj = new HelpObj();
obj.init();
return obj;
}
public boolean check() {
boolean save = false;
if (normal == null || normal.check()) {
save = true;
normal = new HelpNormalObj();
}
if (admin == null || admin.check()) {
save = true;
admin = new HelpAdminObj();
}
return save;
}
public void init() {
normal = HelpNormalObj.make();
admin = HelpAdminObj.make();
}
}

View File

@ -0,0 +1,133 @@
package io.github.thehrz.allmusicreload.core.objs.message;
import io.github.thehrz.allmusicreload.core.objs.enums.HudDirType;
import io.github.thehrz.allmusicreload.core.objs.enums.HudType;
public class HudNameObj {
public String list;
public String lyric;
public String info;
public String all;
public String pic;
public String picRoute;
public String picSpeed;
public String enable;
public String disable;
public String pos1;
public String pos2;
public String pos3;
public String pos4;
public String pos5;
public String pos6;
public String pos7;
public String pos8;
public String pos9;
public static HudNameObj make() {
HudNameObj obj = new HudNameObj();
obj.init();
return obj;
}
public boolean check() {
if (list == null)
return true;
if (lyric == null)
return true;
if (info == null)
return true;
if (all == null)
return true;
if (picRoute == null)
return true;
if (picSpeed == null)
return true;
if (enable == null)
return true;
if (pos1 == null)
return true;
if (pos2 == null)
return true;
if (pos3 == null)
return true;
if (pos4 == null)
return true;
if (pos5 == null)
return true;
if (pos6 == null)
return true;
if (pos7 == null)
return true;
if (pos8 == null)
return true;
if (pos9 == null)
return true;
return pic == null;
}
public String getHud(HudType data) {
if (data == null) {
return all;
}
switch (data) {
case PIC:
return pic;
case INFO:
return info;
case LYRIC:
return lyric;
case LIST:
return list;
}
return null;
}
public String getDir(HudDirType data) {
if (data == null) {
return all;
}
switch (data) {
case TOP_LEFT:
return pos1;
case TOP_CENTER:
return pos2;
case TOP_RIGHT:
return pos3;
case LEFT:
return pos4;
case CENTER:
return pos5;
case RIGHT:
return pos6;
case BOTTOM_LEFT:
return pos7;
case BOTTOM_CENTER:
return pos8;
case BOTTOM_RIGHT:
return pos9;
}
return null;
}
public void init() {
list = "待播放列表";
lyric = "歌词";
info = "歌曲信息";
pic = "图片";
all = "所有位置";
picRoute = "图片旋转";
picSpeed = "图片旋转速度";
enable = "启用";
disable = "关闭";
pos1 = "左上";
pos2 = "";
pos3 = "右上";
pos4 = "";
pos5 = "居中";
pos6 = "";
pos7 = "左下";
pos8 = "";
pos9 = "右下";
}
}

View File

@ -0,0 +1,82 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class HudObj {
public String state;
public String set;
public String set1;
public String set2;
public String set3;
public String reset;
public String emptyMusic;
public String emptyList;
public String emptyLyric;
public String picSize;
public String picRotate;
public String picSpeed;
public String music;
public String lyric;
public String list;
public String ktv;
public static HudObj make() {
HudObj obj = new HudObj();
obj.init();
return obj;
}
public boolean check() {
if (state == null)
return true;
if (set == null)
return true;
if (set1 == null)
return true;
if (set2 == null)
return true;
if (set3 == null)
return true;
if (reset == null)
return true;
if (emptyMusic == null)
return true;
if (emptyList == null)
return true;
if (emptyLyric == null)
return true;
if (picSize == null)
return true;
if (music == null)
return true;
if (lyric == null)
return true;
if (list == null)
return true;
if (picRotate == null)
return true;
if (picSpeed == null)
return true;
return ktv == null;
}
public void init() {
state = "§d[AllMusic3]§e设置信息位置" + PAL.hud + ",状态:" + PAL.state;
set = "§d[AllMusic3]§e已设置[" + PAL.hud + "]的坐标为[" + PAL.x + ", " + PAL.y + "]";
set1 = "§d[AllMusic3]§e已设置[" + PAL.hud + "]的对齐方式为[" + PAL.dir + "]";
set2 = "§d[AllMusic3]§e已设置[" + PAL.hud + "]的颜色为[" + PAL.color + "]";
set3 = "§d[AllMusic3]§e已设置[" + PAL.hud + "]的阴影为[" + PAL.state + "]";
reset = "§d[AllMusic3]§e界面[" + PAL.hud + "]恢复至默认位置";
emptyMusic = "没有播放的音乐";
emptyList = "队列中无歌曲";
emptyLyric = "无歌词";
picSize = "§d[AllMusic3]§e设置图片尺寸为[" + PAL.size + "]";
picRotate = "§d[AllMusic3]§e设置图片旋转为[" + PAL.state + "]";
picSpeed = "§d[AllMusic3]§e设置图片旋转速度为[" + PAL.size + "]";
music = PAL.name + " " + PAL.allTime + "/" + PAL.nowTime
+ "\n" + PAL.musicAuthor + "\n" + PAL.musicAlia + "\n" + PAL.musicAl
+ "\nby: " + PAL.player;
lyric = PAL.lyric + "\n" + PAL.tlyric;
ktv = "§e" + PAL.klyric + "§f" + PAL.lyric + "§r\n" + PAL.tlyric;
list = "播放列表里面有" + PAL.size + "首歌\n" + PAL.list;
}
}

View File

@ -0,0 +1,31 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class ListMusicObj {
public String head;
public String item;
public String get;
public static ListMusicObj make() {
ListMusicObj obj = new ListMusicObj();
obj.init();
return obj;
}
public boolean check() {
boolean res = head == null;
if (item == null)
res = true;
if (get == null)
res = true;
return res;
}
public void init() {
head = "§d[AllMusic3]§e队列中有歌曲数" + PAL.count;
item = "§e" + PAL.index + "->" + PAL.musicName + " | " + PAL.musicAuthor
+ " | " + PAL.musicAl + " | " + PAL.musicAlia + " | by: " + PAL.player;
get = "§d[AllMusic3]§e歌曲列表" + PAL.name + "获取成功";
}
}

View File

@ -0,0 +1,36 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class LyricObj {
public String data;
public String tdata;
public String empty1;
public String empty2;
public String empty3;
public static LyricObj make() {
LyricObj obj = new LyricObj();
obj.init();
return obj;
}
public boolean check() {
if (data == null)
return true;
if (tdata == null)
return true;
if (empty1 == null)
return true;
if (empty2 == null)
return true;
return empty3 == null;
}
public void init() {
data = PAL.lyric;
tdata = PAL.lyric + "(" + PAL.tlyric + ")";
empty1 = "没有歌词";
empty2 = "没有翻译歌词";
empty3 = "没有KTV歌词";
}
}

View File

@ -0,0 +1,125 @@
package io.github.thehrz.allmusicreload.core.objs.message;
import io.github.thehrz.allmusicreload.core.AllMusic;
public class MessageObj {
public MusicPlayObj musicPlay;
public AddMusicObj addMusic;
public PageObj page;
public LyricObj lyric;
public VoteObj vote;
public PushObj push;
public SearchObj search;
public HudObj hud;
public HudNameObj hudList;
public CommandObj command;
public CustomObj custom;
public PAPIObj papi;
public CostObj cost;
public ClickObj click;
public HelpObj help;
public FunObj fun;
public CancelObj cancel;
public String version;
public static MessageObj make() {
MessageObj obj = new MessageObj();
obj.init();
return obj;
}
public boolean check() {
boolean saveConfig = false;
if (musicPlay == null || musicPlay.check()) {
saveConfig = true;
musicPlay = MusicPlayObj.make();
}
if (addMusic == null || addMusic.check()) {
saveConfig = true;
addMusic = AddMusicObj.make();
}
if (page == null || page.check()) {
saveConfig = true;
page = PageObj.make();
}
if (lyric == null || lyric.check()) {
saveConfig = true;
lyric = LyricObj.make();
}
if (vote == null || vote.check()) {
saveConfig = true;
vote = VoteObj.make();
}
if (search == null || search.check()) {
saveConfig = true;
search = SearchObj.make();
}
if (hud == null || hud.check()) {
saveConfig = true;
hud = HudObj.make();
}
if (hudList == null || hudList.check()) {
saveConfig = true;
hudList = HudNameObj.make();
}
if (command == null || command.check()) {
saveConfig = true;
command = CommandObj.make();
}
if (custom == null || custom.check()) {
saveConfig = true;
custom = CustomObj.make();
}
if (papi == null || papi.check()) {
saveConfig = true;
papi = PAPIObj.make();
}
if (cost == null || cost.check()) {
saveConfig = true;
cost = CostObj.make();
}
if (click == null || click.check()) {
saveConfig = true;
click = ClickObj.make();
}
if (help == null || help.check()) {
saveConfig = true;
help = HelpObj.make();
}
if (fun == null || fun.check()) {
saveConfig = true;
fun = FunObj.make();
}
if (push == null || push.check()) {
saveConfig = true;
push = PushObj.make();
}
if (cancel == null || cancel.check()) {
saveConfig = true;
cancel = CancelObj.make();
}
return saveConfig;
}
public void init() {
musicPlay = MusicPlayObj.make();
addMusic = AddMusicObj.make();
page = PageObj.make();
lyric = LyricObj.make();
vote = VoteObj.make();
search = SearchObj.make();
hud = HudObj.make();
command = CommandObj.make();
hudList = HudNameObj.make();
custom = CustomObj.make();
papi = PAPIObj.make();
cost = CostObj.make();
click = ClickObj.make();
help = HelpObj.make();
fun = FunObj.make();
push = PushObj.make();
cancel = CancelObj.make();
version = AllMusic.messageVersion;
}
}

View File

@ -0,0 +1,77 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class MusicPlayObj {
public String stopPlaying;
public String emptyPlayingMusic;
public String nowPlay;
public String emptyPlay;
public ListMusicObj listMusic;
public String emptyCanPlay;
public String mute;
public String switchMusic;
public String addMusic;
public String checkMusic;
public String musicInfo;
public String trail;
public String cancel;
public String error1;
public static MusicPlayObj make() {
MusicPlayObj obj = new MusicPlayObj();
obj.init();
return obj;
}
public boolean check() {
boolean res = stopPlaying == null;
if (emptyPlayingMusic == null)
res = true;
if (nowPlay == null)
res = true;
if (emptyPlay == null)
res = true;
if (listMusic == null || listMusic.check())
res = true;
if (emptyCanPlay == null)
res = true;
if (mute == null)
res = true;
if (switchMusic == null)
res = true;
if (addMusic == null)
res = true;
if (checkMusic == null)
res = true;
if (musicInfo == null)
res = true;
if (trail == null)
res = true;
if (cancel == null)
res = true;
if (error1 == null)
res = true;
return res;
}
public void init() {
stopPlaying = "§d[AllMusic3]§e已停止你的音乐播放";
emptyPlayingMusic = "§d[AllMusic3]§e无正在播放的歌曲";
nowPlay = "§d[AllMusic3]§e正在播放" + PAL.musicName + " | " + PAL.musicAuthor
+ " by: " + PAL.player;
emptyPlay = "§d[AllMusic3]§e队列中无歌曲";
listMusic = ListMusicObj.make();
emptyCanPlay = "§d[AllMusic3]§c无法播放歌曲" + PAL.musicId + "可能该歌曲为VIP歌曲";
mute = "§d[AllMusic3]§e你不会再收到点歌了想要再次参与点歌就点一首歌吧";
switchMusic = "§d[AllMusic3]§e切换到玩家歌曲";
addMusic = "§d[AllMusic3]§e音乐列表添加" + PAL.musicName + " | " + PAL.musicAuthor
+ " | " + PAL.musicAl + " | " + PAL.musicAlia + " | by: " + PAL.player;
checkMusic = "§d[AllMusic3]§e正在解析歌曲" + PAL.musicId;
musicInfo = PAL.musicName + " | " + PAL.musicAuthor + " | " + PAL.musicAl
+ " | " + PAL.musicAlia + " | by: " + PAL.player;
trail = "§d[AllMusic3]§e该音乐为试听音乐";
cancel = "§d[AllMusic3]§e播放被取消";
error1 = "§d[AllMusic3]§c未知音乐类型";
}
}

View File

@ -0,0 +1,28 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class PAL {
public static String musicName = "%MusicName%";
public static String musicAuthor = "%MusicAuthor%";
public static String musicAlia = "%MusicAlia%";
public static String musicAl = "%MusicAl%";
public static String musicId = "%MusicID%";
public static String hud = "%Hud%";
public static String cost = "%Cost%";
public static String index = "%Index%";
public static String state = "%State%";
public static String x = "%X%";
public static String y = "%Y%";
public static String dir = "%Dir%";
public static String color = "%Color%";
public static String size = "%Size%";
public static String name = "%Name%";
public static String allTime = "%AllTime%";
public static String nowTime = "%NowTime%";
public static String player = "%Player%";
public static String lyric = "%Lyric%";
public static String tlyric = "%Tlyric%";
public static String klyric = "%KLyric%";
public static String list = "%List%";
public static String count = "%Count%";
public static String time = "%Time%";
}

View File

@ -0,0 +1,20 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class PAPIObj {
public String emptyMusic;
public static PAPIObj make() {
PAPIObj obj = new PAPIObj();
obj.init();
return obj;
}
public boolean check() {
return emptyMusic == null;
}
public void init() {
emptyMusic = "没有播放的音乐";
}
}

View File

@ -0,0 +1,30 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class PageObj {
public String choice;
public String next;
public String last;
public static PageObj make() {
PageObj obj = new PageObj();
obj.init();
return obj;
}
public boolean check() {
boolean res = choice == null;
if (next == null)
res = true;
if (last == null)
res = true;
return res;
}
public void init() {
choice = "§e" + PAL.index + "->" + PAL.musicName + " | " + PAL.musicAuthor + " | " + PAL.musicAl;
next = "§e[§n点我下一页§r§e]";
last = "§e[§n点我上一页§r§e]";
}
}

View File

@ -0,0 +1,88 @@
package io.github.thehrz.allmusicreload.core.objs.message;
public class PushObj {
public String noPermission;
public String doVote;
public String bq;
public String bq1;
public String bq2;
public String agree;
public String bqAgree;
public String arAgree;
public String timeOut;
public String doPush;
public String noId;
public String noId1;
public String idErr;
public String pushErr;
public String cancel;
public String err1;
public String err2;
public String err3;
public static PushObj make() {
PushObj obj = new PushObj();
obj.init();
return obj;
}
public boolean check() {
if (noPermission == null)
return true;
if (doVote == null)
return true;
if (bq == null)
return true;
if (bq1 == null)
return true;
if (bq2 == null)
return true;
if (agree == null)
return true;
if (bqAgree == null)
return true;
if (arAgree == null)
return true;
if (timeOut == null)
return true;
if (noId == null)
return true;
if (noId1 == null)
return true;
if (idErr == null)
return true;
if (pushErr == null)
return true;
if (cancel == null)
return true;
if (err1 == null)
return true;
if (err2 == null)
return true;
if (err3 == null)
return true;
return doPush == null;
}
public void init() {
noPermission = "§d[AllMusic3]§c你没有权限插歌";
doVote = "§d[AllMusic3]§e已发起插歌投票";
bq = "§d[AllMusic3]§e" + PAL.player + "发起了插歌投票,将曲目" + PAL.musicName + "-" + PAL.musicAuthor + "调整到下一首播放," + PAL.time + "秒后结束,输入/music push 同意插歌。";
bq1 = "§d[AllMusic3]§e或者点击 ";
bq2 = "§a同意插歌";
agree = "§d[AllMusic3]§e你同意插歌";
bqAgree = "§d[AllMusic3]§e" + PAL.player + "同意插歌,共有" + PAL.count + "名玩家同意插歌。";
arAgree = "§d[AllMusic3]§e你已申请插歌";
timeOut = "§d[AllMusic3]§e插歌时间结束";
doPush = "§d[AllMusic3]§e播放顺序已调整";
noId = "§d[AllMusic3]§c没有找到你的点歌";
noId1 = "§d[AllMusic3]§c没有找到序号为" + PAL.index + "的点歌";
idErr = "§d[AllMusic3]§c错误的歌曲序号";
pushErr = "§d[AllMusic3]§c这首歌已经是下一首播放了";
err1 = "§d[AllMusic3]§c你没有发起插歌";
err2 = "§d[AllMusic3]§c你发起的插歌已超时";
err3 = "§d[AllMusic3]§c发起失败已经有人发起了插歌投票";
cancel = "§d[AllMusic3]§e插歌投票已被发起者取消";
}
}

Some files were not shown because too many files have changed in this diff Show More