Initial commit
This commit is contained in:
commit
eecc3178b1
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal 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
42
build.gradle.kts
Normal 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
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal 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
234
gradlew
vendored
Executable 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
89
gradlew.bat
vendored
Normal 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
2
settings.gradle.kts
Normal file
@ -0,0 +1,2 @@
|
||||
rootProject.name = "AllMusicReload"
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
448
src/main/java/io/github/thehrz/allmusicreload/core/AllMusic.java
Normal file
448
src/main/java/io/github/thehrz/allmusicreload/core/AllMusic.java
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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添加空闲音乐列表已清空");
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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 ");
|
||||
}
|
||||
}
|
||||
}
|
@ -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)));
|
||||
}
|
||||
}
|
||||
}
|
@ -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]));
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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已重读配置文件");
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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<>();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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, "");
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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<>();
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package io.github.thehrz.allmusicreload.core.objs.enums;
|
||||
|
||||
public enum ComType {
|
||||
LYRIC, INFO, LIST, PLAY, IMG,
|
||||
STOP, CLEAR, POS, HUD
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package io.github.thehrz.allmusicreload.core.objs.enums;
|
||||
|
||||
public enum EncryptType {
|
||||
WEAPI, EAPI, API
|
||||
}
|
@ -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
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package io.github.thehrz.allmusicreload.core.objs.enums;
|
||||
|
||||
public enum HudType {
|
||||
INFO, LIST, LYRIC, PIC
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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点歌被取消,音乐长度过长";
|
||||
}
|
||||
}
|
@ -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已取消你的点歌";
|
||||
}
|
||||
}
|
@ -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]";
|
||||
}
|
||||
}
|
@ -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你没有权限执行这个操作";
|
||||
}
|
||||
}
|
@ -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扣钱过程中错误";
|
||||
}
|
||||
}
|
@ -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 = "空闲列表";
|
||||
}
|
||||
}
|
@ -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天空开始变得湿润";
|
||||
}
|
||||
}
|
@ -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] 测试解析音乐";
|
||||
}
|
||||
}
|
@ -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 [数值] 设置图片旋转速度";
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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 = "右下";
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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 + "获取成功";
|
||||
}
|
||||
}
|
@ -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歌词";
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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未知音乐类型";
|
||||
}
|
||||
}
|
@ -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%";
|
||||
}
|
@ -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 = "没有播放的音乐";
|
||||
}
|
||||
}
|
@ -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]";
|
||||
}
|
||||
}
|
@ -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
Loading…
x
Reference in New Issue
Block a user