diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..a45eb6b
--- /dev/null
+++ b/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or 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.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.6";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if (mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if (mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if (!outputFile.getParentFile().exists()) {
+ if (!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..2cc7d4a
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..ffdc10e
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/libmsc32.so b/libmsc32.so
new file mode 100644
index 0000000..81caa53
Binary files /dev/null and b/libmsc32.so differ
diff --git a/libmsc64.so b/libmsc64.so
new file mode 100644
index 0000000..be16c26
Binary files /dev/null and b/libmsc64.so differ
diff --git a/libs/Msc.jar b/libs/Msc.jar
new file mode 100644
index 0000000..5dc23e9
Binary files /dev/null and b/libs/Msc.jar differ
diff --git a/libs/json-jena-1.0.jar b/libs/json-jena-1.0.jar
new file mode 100644
index 0000000..92b6be2
Binary files /dev/null and b/libs/json-jena-1.0.jar differ
diff --git a/msc32.dll b/msc32.dll
new file mode 100644
index 0000000..6e01fc4
Binary files /dev/null and b/msc32.dll differ
diff --git a/msc64.dll b/msc64.dll
new file mode 100644
index 0000000..1005350
Binary files /dev/null and b/msc64.dll differ
diff --git a/mvnw b/mvnw
new file mode 100644
index 0000000..a16b543
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ 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
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ if [ -n "$MVNW_REPOURL" ]; then
+ jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ fi
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+ if $cygwin; then
+ wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+ fi
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget "$jarUrl" -O "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl -o "$wrapperJarPath" "$jarUrl" -f
+ else
+ curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+ fi
+
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaClass=`cygpath --path --windows "$javaClass"`
+ fi
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..c8d4337
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. 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,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e6d2122
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,183 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.4.4
+
+
+ com.yutou
+ nas
+ 0.0.1
+ nas
+ NAS Service
+
+ 1.8
+ 1.4.10
+
+
+
+ jaudiotagger-repository
+ https://dl.bintray.com/ijabz/maven
+
+
+ jcenter
+ https://jcenter.bintray.com/
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+ redis.clients
+ jedis
+ 3.6.0-RC1
+
+
+
+
+ org.springframework.data
+ spring-data-redis
+ 2.4.7
+
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.67
+
+
+
+ com.jcraft
+ jsch
+ 0.1.55
+
+
+ net.jthink
+ jaudiotagger
+ 2.2.3
+
+
+ com.ealva
+ ealvatag
+ 0.4.3
+
+
+ net.mamoe
+ mirai-core-jvm
+ 2.5.0
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${kotlin.version}
+
+
+ net.bramp.ffmpeg
+ ffmpeg
+ 0.6.2
+
+
+ com.iflytek
+ msc
+ 4.1
+ system
+ ${project.basedir}/libs/Msc.jar
+
+
+ com.iflytek
+ json
+ 4.1
+ system
+ ${project.basedir}/libs/json-jena-1.0.jar
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.1.1
+
+
+
+
+
+ ${project.basedir}/src/main/java
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+
+ compile
+
+ compile
+
+
+
+
+ test-compile
+
+ test-compile
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+ libs
+ /BOOT-INF/lib/
+
+ **/*.jar
+
+
+
+ src/main/resources
+
+ **/*.properties
+ **/*.xml
+
+ false
+
+
+
+
+
diff --git a/src/main/java/com/yutou/nas/Controllers/MusicController.java b/src/main/java/com/yutou/nas/Controllers/MusicController.java
new file mode 100644
index 0000000..2913f5e
--- /dev/null
+++ b/src/main/java/com/yutou/nas/Controllers/MusicController.java
@@ -0,0 +1,215 @@
+package com.yutou.nas.Controllers;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.mybatis.model.MusicData;
+import com.yutou.nas.utils.ConfigTools;
+import com.yutou.nas.utils.MusicToolsServiceImpl;
+import com.yutou.nas.utils.Tools;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Base64;
+import java.util.List;
+
+import static com.yutou.nas.Datas.AppData.defaultMusicPath;
+
+@Controller
+@RequestMapping("/nas/music/")
+public class MusicController {
+
+ @Resource
+ MusicToolsServiceImpl musicTools;
+
+ @RequestMapping("all.do")
+ @ResponseBody
+ public String getAllMusicList() {
+ JSONObject json = new JSONObject();
+ JSONObject data = new JSONObject();
+ json.put("code", 0);
+ json.put("scan", musicTools.isScan());
+ json.put("size", musicTools.getLength());
+ json.put("data", JSONArray.toJSON(musicTools.getMusicList()));
+ return json.toJSONString();
+ }
+
+ @RequestMapping("list.do")
+ @ResponseBody
+ public String getMusicListOfPath(@RequestBody JSONObject body) {
+ String path = body.getString("path");
+ boolean type = body.containsKey("type") ? body.getBoolean("type") : false;
+ System.out.println("接收到地址:" + path);
+ if (StringUtils.isEmpty(path)
+ || path.equals("root")
+ || !path.contains(defaultMusicPath)
+ ) {
+ path = defaultMusicPath;
+ }
+
+ //path=path.replace(defaultMusicPath+File.separator,"");
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ json.put("scan", musicTools.isScan());
+ json.put("size", musicTools.getLength());
+ json.put("data", JSONArray.toJSON(musicTools.getPath(path, type)));
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping("getAlbum.do")
+ public String getAlbum(@RequestBody JSONObject body) {
+ String album = body.getString("album");
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ if (StringUtils.isEmpty(album)) {
+ json.put("data", JSONArray.toJSON(musicTools.getAllAlbum()));
+ } else {
+ json.put("data", JSONArray.toJSON(musicTools.selectAlbum(album)));
+ }
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping("getArtist.do")
+ public String getArtist(@RequestBody JSONObject body) {
+ String artist = body.getString("artist");
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ if (StringUtils.isEmpty(artist)) {
+ json.put("data", JSONArray.toJSON(musicTools.getAllArtist()));
+ } else {
+ json.put("data", JSONArray.toJSON(musicTools.selectArtist(artist)));
+ }
+ return json.toJSONString();
+ }
+
+ @RequestMapping("reload.do")
+ @ResponseBody
+ public String reload() {
+ JSONObject json = new JSONObject();
+ musicTools.scanMusic();
+ json.put("msg", "ok");
+ json.put("code", 0);
+ return json.toJSONString();
+ }
+
+ @RequestMapping("find/file.do")
+ @ResponseBody
+ public String findFile(@RequestBody JSONObject body) {
+ String path = body.getString("path");
+ if (!path.startsWith(defaultMusicPath)) {
+ path = Tools.base64ToString(path);
+ }
+ JSONObject json = new JSONObject();
+ if (StringUtils.isEmpty(path)) {
+ json.put("code", -1);
+ json.put("msg", "地址为空");
+ return json.toJSONString();
+ }
+ json.put("code", 0);
+ json.put("data", musicTools.getMusicData(path));
+ return json.toJSONString();
+ }
+
+ @RequestMapping("getlocalhost.do")
+ @ResponseBody
+ public String getLocalHost() {
+ JSONObject json = new JSONObject();
+ if (ConfigTools.load(ConfigTools.CONFIG, "model").equals("dev")) {
+ json.put("data", "");
+ } else {
+ json.put("data", "http://" + UpdateIp.nas_ip);
+ }
+ json.put("code", 0);
+ return json.toJSONString();
+ }
+
+ @RequestMapping(value = "web/image.do", produces = MediaType.IMAGE_JPEG_VALUE)
+ @ResponseBody
+ public byte[] getImage(String fileName, String type) {
+ JSONObject json = new JSONObject();
+ json.put("fileName", fileName);
+ if (StringUtils.isEmpty(type)) {
+ json.put("type", "file");
+ } else {
+ json.put("type", type);
+ }
+ return getImage(json);
+ }
+
+ @RequestMapping(value = "image.do", produces = MediaType.IMAGE_JPEG_VALUE)
+ @ResponseBody
+ public byte[] getImage(@RequestBody JSONObject body) {
+ String fileName = body.getString("fileName");
+ if (!fileName.startsWith(defaultMusicPath)) {
+ fileName = Tools.base64ToString(fileName);
+ }
+ List list = null;
+ if (body.getString("type").equals("album")) {
+ list = musicTools.selectAlbum(fileName);
+ }
+ File file;
+ if (list != null && !list.isEmpty()) {
+ fileName = list.get(0).getFile();
+ }
+ file = new File(fileName);
+ if (file.exists()) {
+ try {
+ return musicTools.readImage(file.getAbsolutePath());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ @RequestMapping("random.do")
+ @ResponseBody
+ public String random() {
+ List list = musicTools.getMusicList();
+ MusicData data = list.get(Tools.randomCommon(0, list.size() - 1, 1)[0]);
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ try {
+ json.put("data", URLEncoder.encode(getBase64(data.getFile()), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return json.toJSONString();
+ }
+
+ private String getBase64(String str) {
+ return new String(Base64.getEncoder().encode(str.getBytes()));
+ }
+
+
+ @RequestMapping("play.do")
+ public ResponseEntity play(String filePath, String random) {
+ String _filePath;
+ boolean _random;
+ _random = !StringUtils.isEmpty(random) && random.equals("true");
+ _filePath = Tools.base64ToString(filePath);
+ if (_random) {
+ List list = musicTools.getMusicList();
+ MusicData data = list.get(Tools.randomCommon(0, list.size() - 1, 1)[0]);
+ _filePath = data.getFile();
+ }
+ File file = new File(_filePath);
+ if (file.exists()) {
+ return Tools.getFile(file);
+ } else {
+ return null;
+ }
+ }
+
+}
diff --git a/src/main/java/com/yutou/nas/Controllers/MusicFavoritesController.java b/src/main/java/com/yutou/nas/Controllers/MusicFavoritesController.java
new file mode 100644
index 0000000..9a1242f
--- /dev/null
+++ b/src/main/java/com/yutou/nas/Controllers/MusicFavoritesController.java
@@ -0,0 +1,165 @@
+package com.yutou.nas.Controllers;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.mybatis.dao.MusicDataDao;
+import com.yutou.nas.mybatis.dao.MusicFavoritesDao;
+import com.yutou.nas.mybatis.dao.MusicFavoritesDirDao;
+import com.yutou.nas.mybatis.model.*;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ * 收藏夹相关
+ */
+@Controller
+@RequestMapping("/nas/music/favorite/")
+public class MusicFavoritesController {
+ @Resource
+ MusicFavoritesDao favoritesDao;
+ @Resource
+ MusicFavoritesDirDao favoritesDirDao;
+ @Resource
+ MusicDataDao musicDataDao;
+
+ @RequestMapping("dir/add.do")
+ @ResponseBody
+ public String addFavoriteDir(@RequestBody JSONObject body) {
+ String favorite = body.getString("favorite");
+ JSONObject json = new JSONObject();
+ MusicFavoritesDirExample example = new MusicFavoritesDirExample();
+ example.createCriteria().andTitleEqualTo(favorite);
+ if (!favoritesDirDao.selectByExample(example).isEmpty()) {
+ json.put("code", -1);
+ json.put("msg", "已有该收藏夹");
+ } else {
+ MusicFavoritesDir favoritesDir = new MusicFavoritesDir();
+ favoritesDir.setTitle(favorite);
+ int ret = favoritesDirDao.insert(favoritesDir);
+ json.put("code", ret == 0 ? -1 : 0);
+ json.put("msg", ret == 0 ? "添加失败" : "添加成功");
+ }
+ return json.toJSONString();
+ }
+
+ @RequestMapping("dir/list.do")
+ @ResponseBody
+ public String getAllFavoriteDir() {
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ List list = favoritesDirDao.selectByExample(new MusicFavoritesDirExample());
+ JSONArray array = new JSONArray();
+ for (MusicFavoritesDir favoritesDir : list) {
+ JSONObject data = new JSONObject();
+ data.put("id", favoritesDir.getId());
+ data.put("title", favoritesDir.getTitle());
+ MusicFavoritesExample example = new MusicFavoritesExample();
+ example.createCriteria().andFavoriteidEqualTo(favoritesDir.getId());
+ data.put("count", favoritesDao.countByExample(example));
+ array.add(data);
+ }
+ json.put("data", array);
+ return json.toJSONString();
+ }
+
+ @RequestMapping("dir/rename.do")
+ @ResponseBody
+ public String renameFavoriteDir(@RequestBody JSONObject body) {
+ int id = body.getInteger("id");
+ String title = body.getString("title");
+ JSONObject json = new JSONObject();
+ MusicFavoritesDir favoritesDir = favoritesDirDao.selectByPrimaryKey(id);
+ if (favoritesDir == null) {
+ json.put("code", -1);
+ json.put("msg", "没有该收藏夹");
+ } else {
+ favoritesDir.setTitle(title);
+ favoritesDirDao.updateByPrimaryKey(favoritesDir);
+ json.put("code", 0);
+ json.put("msg", "更新成功");
+ }
+ return json.toJSONString();
+ }
+
+ @RequestMapping("add.do")
+ @ResponseBody
+ public String addFavorite(@RequestBody JSONObject body) {
+ JSONObject json = new JSONObject();
+ JSONArray array = body.getJSONArray("md5s");
+ int fid = body.getInteger("fid");
+ if (array == null || fid == -1) {
+ json.put("code", -1);
+ json.put("msg", "参数异常: " + body);
+ return json.toJSONString();
+ }
+ for (Object md5 : array) {
+ MusicFavoritesExample example = new MusicFavoritesExample();
+ example.createCriteria().andMusisMd5EqualTo((String) md5);
+ if (favoritesDao.countByExample(example) == 0) {
+ MusicFavorites favorites = new MusicFavorites();
+ favorites.setMusisMd5((String) md5);
+ favorites.setFavoriteid(fid);
+ favorites.setSubTime(new Date());
+ favoritesDao.insert(favorites);
+ }
+ }
+ json.put("code", 0);
+ json.put("msg", "添加成功");
+ return json.toJSONString();
+ }
+
+ @RequestMapping("remove.do")
+ @ResponseBody
+ public String removeFavorite(@RequestBody JSONObject body) {
+ JSONArray md5s = body.getJSONArray("data");
+ JSONObject json = new JSONObject();
+ for (Object md5 : md5s) {
+ LinkedHashMap js= (LinkedHashMap) md5;
+ MusicFavoritesExample example = new MusicFavoritesExample();
+ example.createCriteria().andMusisMd5EqualTo((String) js.get("md5"))
+ .andFavoriteidEqualTo((Integer) js.get("fid"));
+ favoritesDao.deleteByExample(example);
+ }
+ json.put("code", 0);
+ json.put("msg", "已从收藏夹中移除");
+ return json.toJSONString();
+ }
+
+ @RequestMapping("get.do")
+ @ResponseBody
+ public String getFavorite(@RequestBody JSONObject body) {
+ int fid = body.getInteger("fid");
+ JSONObject json = new JSONObject();
+ try {
+ MusicFavoritesExample example = new MusicFavoritesExample();
+ example.createCriteria().andFavoriteidEqualTo(fid);
+ List list = favoritesDao.selectByExample(example);
+ List dataList = new ArrayList<>();
+ for (MusicFavorites favorites : list) {
+ MusicDataExample dataExample = new MusicDataExample();
+ dataExample.createCriteria().andMd5EqualTo(favorites.getMusisMd5());
+ try {
+ dataList.add(musicDataDao.selectByExample(dataExample).get(0));
+ } catch (Exception ignored) {
+ }
+ }
+ list.clear();
+ json.put("code", 0);
+ json.put("data", JSONArray.toJSON(dataList));
+ } catch (Exception e) {
+ e.printStackTrace();
+ json.put("code", -1);
+ json.put("msg", e.getLocalizedMessage());
+ json.put("data", new ArrayList<>());
+ }
+ return json.toJSONString();
+ }
+}
diff --git a/src/main/java/com/yutou/nas/Controllers/QQBot.java b/src/main/java/com/yutou/nas/Controllers/QQBot.java
new file mode 100644
index 0000000..74ea796
--- /dev/null
+++ b/src/main/java/com/yutou/nas/Controllers/QQBot.java
@@ -0,0 +1,79 @@
+package com.yutou.nas.Controllers;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.interfaces.DownloadInterface;
+import com.yutou.nas.utils.QQBotManager;
+import com.yutou.nas.utils.Tools;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+
+@Controller
+@RequestMapping("/qq/bot")
+public class QQBot {
+ @RequestMapping("test.do")
+ @ResponseBody
+ public String test(){
+ return "123";
+ }
+
+ @RequestMapping("send.do")
+ @ResponseBody
+ public String send(String msg,String imgUrl){
+ JSONObject json=new JSONObject();
+ try {
+ String ret;
+ if(StringUtils.isEmpty(imgUrl)){
+ ret= QQBotManager.getInstance().sendMessage(msg);
+ }else{
+ Tools.download(imgUrl, new DownloadInterface() {
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ QQBotManager.getInstance().sendMessage(new File(file),msg);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ super.onError(e);
+ QQBotManager.getInstance().sendMessage(imgUrl+"\n"+msg);
+ }
+ });
+ ret="图片下载中";
+ }
+ json.put("code",0);
+ json.put("msg",ret);
+ }catch (Exception e){
+ e.printStackTrace();
+ json.put("code",-1);
+ json.put("msg",e.getMessage());
+ }
+ return json.toJSONString();
+ }
+ @RequestMapping("sendAndImg.do")
+ @ResponseBody
+ public String botMsg(String msg,@RequestParam("file") MultipartFile file){
+ JSONObject json=new JSONObject();
+ if(file==null){
+ json.put("code",-1);
+ json.put("msg","图片为空");
+ return json.toJSONString();
+ }
+ String ret;
+ try {
+ String path = Tools.createFile("qq_image",file, file.getName());
+ ret=QQBotManager.getInstance().sendMessage(new File(path),msg);
+ } catch (Exception e) {
+ e.printStackTrace();
+ ret=e.getLocalizedMessage();
+ }
+ json.put("code",0);
+ json.put("msg",ret);
+ return json.toJSONString();
+ }
+}
diff --git a/src/main/java/com/yutou/nas/Controllers/ToolsController.java b/src/main/java/com/yutou/nas/Controllers/ToolsController.java
new file mode 100644
index 0000000..526b8d9
--- /dev/null
+++ b/src/main/java/com/yutou/nas/Controllers/ToolsController.java
@@ -0,0 +1,44 @@
+package com.yutou.nas.Controllers;
+
+import com.yutou.nas.utils.HttpTools;
+import com.yutou.nas.utils.RedisTools;
+import com.yutou.nas.utils.Tools;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+@Controller
+public class ToolsController {
+ @ResponseBody
+ @RequestMapping("/tools/openpc.do")
+ public String open_pc(HttpServletRequest request, String type) {
+ if (StringUtils.isEmpty(type)) {
+ if (Tools.checkWebLogin(request) == 1) {
+ HttpTools.get("http://" + UpdateIp.nas_ip + ":8000/tools/openpc.do?token=zIrsh9TUZP2lfRW753PannG49E7VJvor&type=nas");
+ }
+ } else {
+ if (type.equals("nas")) {
+ try {
+ Process process = Runtime.getRuntime().exec("wakeonlan 00:D8:61:6F:02:2F");
+ RedisTools.processOut(process.getInputStream());
+ RedisTools.processOut(process.getErrorStream());
+ process.destroy();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return "ok";
+ }
+
+ @ResponseBody
+ @RequestMapping("/tools/server.do")
+ public String sendServerManager(String title, String msg) {
+ Tools.sendServer(title, msg);
+ return "ok";
+ }
+}
diff --git a/src/main/java/com/yutou/nas/Controllers/UpdateIp.java b/src/main/java/com/yutou/nas/Controllers/UpdateIp.java
new file mode 100644
index 0000000..2b21e28
--- /dev/null
+++ b/src/main/java/com/yutou/nas/Controllers/UpdateIp.java
@@ -0,0 +1,139 @@
+package com.yutou.nas.Controllers;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.utils.RedisTools;
+import com.yutou.nas.utils.Tools;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Controller
+public class UpdateIp {
+ private static List keys = new ArrayList<>();
+ public static String nas_ip=null;
+ /* static {
+ keys.add("nas.yutou233.cn;");
+ keys.add("bt.yutou233.cn;");
+ keys.add("samba445-server");
+ keys.add("samba139-server");
+ keys.add("nas-ssh-server");
+ keys.add("nas-ftp-server");
+ }*/
+
+
+ @RequestMapping("/nas/updateip.do")
+ public void updateIp(String ip) {
+
+ updateList();
+ File file = new File("/etc/nginx/nginx.conf");
+ if (file.exists()) {
+ System.out.println("文件存在,修改 ip>" + ip);
+ try {
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ StringBuilder stringBuffer = new StringBuilder();
+ String line = null;
+ boolean isIp = false;
+ boolean isNas=false;
+ nas_ip=ip;
+ while ((line = reader.readLine()) != null) {
+ //System.out.println(line.trim().replace("server_name","").replace("upstream","").trim());
+ if (keys.contains(line.trim().replace("server_name", "").replace("upstream", "").replace("{", "").trim())) {
+ isIp = true;
+ }
+ if(line.trim().replace("server_name", "").trim().equals("nas.yutou233.cn;")){
+ isNas=true;
+ }
+ if (isIp) {
+ String testIp = testIp(line);
+ if (testIp != null) {
+ System.out.println("检测到目标:" + line + " 修改IP " + testIp + " > " + ip);
+ if(isNas){
+ String adminAddress= RedisTools.get("adminAddress");
+ if(adminAddress!=null) {
+ JSONObject json=JSONObject.parseObject(adminAddress);
+ line = "proxy_pass http://" +ip+":"+json.getInteger("port")+"/;";
+ }else{
+ line = line.replace(testIp, ip);
+ }
+ isNas=false;
+ }else {
+ line = line.replace(testIp, ip);
+ }
+
+ isIp = false;
+ }
+ }
+ stringBuffer.append(line).append("\n");
+ }
+ reader.close();
+ FileWriter writer = new FileWriter(file);
+ writer.write(stringBuffer.toString());
+ writer.flush();
+ writer.close();
+ System.out.println("修改完成");
+ Runtime.getRuntime().exec("nginx -s reload");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @RequestMapping("/nas/getIp.do")
+ @ResponseBody
+ public String getIP(HttpServletRequest request) {
+ JSONObject json = new JSONObject();
+ json.put("code", -1);
+ json.put("msg", "未登录");
+ if (Tools.checkWebLogin(request) != 1) {
+ // return json.toJSONString();
+ }
+ json.put("code", 0);
+ json.put("msg", "ok");
+ json.put("data", nas_ip);
+ return json.toJSONString();
+ }
+
+ public String testIp(String ip) {
+ String pattern = "((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}";
+ Pattern p = Pattern.compile(pattern);
+ Matcher matcher = p.matcher(ip);
+ // System.out.println("送检测IP:"+ip);
+ if (matcher.find())
+ return ip.substring(matcher.start(), matcher.end());
+ return null;
+ }
+
+ private void updateList() {
+ File file = new File("ipconfig.txt");
+ try {
+ if (!file.exists()) {
+ boolean create = file.createNewFile();
+ if (create)
+ System.out.println("创建文件完成:" + file.getAbsolutePath());
+ }
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ String tmp;
+ while ((tmp = reader.readLine()) != null) {
+ if (!keys.contains(tmp.trim()))
+ keys.add(tmp.trim());
+ }
+ reader.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static void main(String[] args) {
+ }
+}
diff --git a/src/main/java/com/yutou/nas/Datas/AppData.java b/src/main/java/com/yutou/nas/Datas/AppData.java
new file mode 100644
index 0000000..d3ddf6c
--- /dev/null
+++ b/src/main/java/com/yutou/nas/Datas/AppData.java
@@ -0,0 +1,5 @@
+package com.yutou.nas.Datas;
+
+public class AppData {
+ public static String defaultMusicPath = "/media/yutou/4t/public/音乐";
+}
diff --git a/src/main/java/com/yutou/nas/NasApplication.java b/src/main/java/com/yutou/nas/NasApplication.java
new file mode 100644
index 0000000..0b818f0
--- /dev/null
+++ b/src/main/java/com/yutou/nas/NasApplication.java
@@ -0,0 +1,20 @@
+package com.yutou.nas;
+
+import com.yutou.nas.Datas.AppData;
+import com.yutou.nas.utils.ConfigTools;
+import com.yutou.nas.utils.QQBotManager;
+import com.yutou.nas.utils.RedisTools;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class NasApplication {
+ public static final String version="1.0.0";
+ public static void main(String[] args) {
+ SpringApplication.run(NasApplication.class, args);
+ AppData.defaultMusicPath = (String) ConfigTools.load(ConfigTools.CONFIG, "musicDir");
+ RedisTools.initRedisPoolSub();
+ QQBotManager.getInstance();
+ }
+
+}
diff --git a/src/main/java/com/yutou/nas/bangumi/AnimationController.java b/src/main/java/com/yutou/nas/bangumi/AnimationController.java
new file mode 100644
index 0000000..5894cfc
--- /dev/null
+++ b/src/main/java/com/yutou/nas/bangumi/AnimationController.java
@@ -0,0 +1,135 @@
+package com.yutou.nas.bangumi;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.mybatis.dao.BangumiItemDao;
+import com.yutou.nas.mybatis.dao.BangumiListDao;
+import com.yutou.nas.mybatis.model.BangumiItem;
+import com.yutou.nas.mybatis.model.BangumiItemExample;
+import com.yutou.nas.mybatis.model.BangumiList;
+import com.yutou.nas.mybatis.model.BangumiListExample;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Controller
+@RequestMapping("anim/")
+public class AnimationController {
+ @Resource
+ BangumiListDao listDao;
+ @Resource
+ BangumiItemDao itemDao;
+
+ @ResponseBody
+ @RequestMapping(value = "rss/data.do", method = RequestMethod.GET)
+ public String getAnimList(String key,String type,String team, int page) {
+ boolean isNull = key.length() == 0;
+ if(!StringUtils.isEmpty(type)&&type.length()>2)
+ type=type.substring(2);
+ if(!StringUtils.isEmpty(team)&&team.length()>2)
+ team=team.substring(2);
+ String[] keys = key.split(" ");
+ JSONArray items = null;
+ if (!isNull)
+ items = new AnimationData().bangumiList(page,type,team, keys);
+ JSONObject json = new JSONObject();
+ if (items != null) {
+ json.put("data", items);
+ } else {
+ json.put("data", new JSONArray());
+ }
+ json.put("count", 999);
+ json.put("code", 0);
+ json.put("msg", "ok");
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping(value = "type/add.do", method = RequestMethod.POST)
+ public String addRssType(String title) {
+ BangumiList bangumiList = new BangumiList();
+ bangumiList.setTitle(title);
+ bangumiList.setStatus(1);
+ int i = listDao.insert(bangumiList);
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", i == 0 ? "添加失败" : "添加成功");
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping(value = "type/list.do", method = RequestMethod.GET)
+ public String getRssTypeList() {
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", "ok");
+ json.put("data", JSONArray.toJSON(listDao.selectByExample(new BangumiListExample())));
+ return json.toJSONString();
+ }
+ @ResponseBody
+ @RequestMapping(value = "type/del.do", method = RequestMethod.POST)
+ public String delType(int id){
+ BangumiItemExample example=new BangumiItemExample();
+ example.createCriteria().andBidEqualTo(id+"");
+ itemDao.deleteByExample(example);
+ int i=listDao.deleteByPrimaryKey(id);
+ JSONObject json=new JSONObject();
+ json.put("code", 0);
+ json.put("msg", i == 0 ? "删除失败" : "删除成功");
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping(value = "rss/add.do", method = RequestMethod.POST)
+ public String addAnimationRss(String title, String author, String categories, String titleKey, String bid) {
+ BangumiItem item = new BangumiItem();
+ item.setTitle(title);
+ item.setAuthor(author);
+ item.setCategories(categories);
+ item.setTitlekey(titleKey);
+ item.setBid(bid);
+ int i = itemDao.insert(item);
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ json.put("msg", i == 0 ? "添加失败" : "添加成功");
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping(value = "rss/list.do", method = RequestMethod.GET)
+ public String getAnimationRssList(String type) {
+ JSONObject json = new JSONObject();
+ BangumiItemExample example=new BangumiItemExample();
+ example.createCriteria().andBidEqualTo(type);
+ json.put("code", 0);
+ json.put("msg", "ok");
+ json.put("data", JSONArray.toJSON(itemDao.selectByExample(example)));
+ return json.toJSONString();
+ }
+ @ResponseBody
+ @RequestMapping(value = "rss/del.do", method = RequestMethod.POST)
+ public String delAnimation(int id){
+ int i=itemDao.deleteByPrimaryKey(id);
+ JSONObject json=new JSONObject();
+ json.put("code", 0);
+ json.put("msg", i == 0 ? "删除失败" : "删除成功");
+ return json.toJSONString();
+ }
+ @ResponseBody
+ @RequestMapping(value = "client/get.do", method = RequestMethod.GET)
+ public String clientApi(){
+ AnimationData animationData=new AnimationData();
+ List list=itemDao.selectByExample(new BangumiItemExample());
+ for (BangumiItem item : list) {
+ item.setCategories(animationData.nameToValue(item.getCategories(),false)+"");
+ item.setAuthor(animationData.nameToValue(item.getAuthor(),true)+"");
+ }
+ JSONArray array= (JSONArray) JSONArray.toJSON(list);
+ return array.toJSONString();
+ }
+}
diff --git a/src/main/java/com/yutou/nas/bangumi/AnimationData.java b/src/main/java/com/yutou/nas/bangumi/AnimationData.java
new file mode 100644
index 0000000..b58d078
--- /dev/null
+++ b/src/main/java/com/yutou/nas/bangumi/AnimationData.java
@@ -0,0 +1,62 @@
+package com.yutou.nas.bangumi;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.utils.HttpTools;
+
+import java.net.URLEncoder;
+
+public class AnimationData {
+ private String rss2jsonApi_1="wtfm5pebya13pnl8rtu51wfgfpte0mb9sap1foll";
+ private String rss2jsonApi_2="z2s7zyzxvrsjz9vh5alvq3lxdypzykly2nnvqpdx";
+ private String rss2jsonUrl = "https://api.rss2json.com/v1/api.json?rss_url=";
+ private String animUrl = "http://share.dmhy.org/topics/rss/page/%s/rss.xml?keyword=%s&sort_id=%s&team_id=%s&order=date-desc";
+ private String team="[{\"0\":\"全部\"},{\"117\":\"動漫花園\"},{\"669\":\"喵萌奶茶屋\"},{\"648\":\"魔星字幕团\"},{\"185\":\"极影字幕社\"},{\"619\":\"桜都字幕组\"},{\"604\":\"lleeopen\"},{\"241\":\"幻樱字幕组\"},{\"151\":\"悠哈C9字幕社\"},{\"657\":\"LoliHouse\"},{\"283\":\"千夏字幕组\"},{\"755\":\"GMTeam\"},{\"390\":\"天使动漫\"},{\"731\":\"星空字幕组\"},{\"303\":\"动漫国字幕组\"},{\"563\":\"花園壓制組\"},{\"37\":\"雪飄工作室(FLsnow)\"},{\"47\":\"爱恋字幕社\"},{\"710\":\"咪梦动漫组\"},{\"88\":\"动音漫影\"},{\"574\":\"梦蓝字幕组\"},{\"504\":\"LoveEcho!\"},{\"765\":\"爱咕字幕组\"},{\"520\":\"豌豆字幕组\"},{\"650\":\"SweetSub\"},{\"430\":\"幻之字幕组\"},{\"407\":\"DHR動研字幕組\"},{\"321\":\"轻之国度\"},{\"581\":\"VCB-Studio\"},{\"703\":\"届恋字幕组\"},{\"576\":\"银色子弹字幕组\"},{\"454\":\"风车字幕组\"},{\"485\":\"天空树双语字幕组\"},{\"134\":\"漫游字幕组\"},{\"434\":\"风之圣殿\"},{\"630\":\"枫叶字幕组\"},{\"228\":\"KRL字幕组\"},{\"526\":\"东京不够热\"},{\"592\":\"未央阁联盟\"},{\"288\":\"诸神kamigami字幕组\"},{\"767\":\"天月動漫&發佈組\"},{\"768\":\"千歲字幕組\"},{\"423\":\"漫貓字幕組\"},{\"562\":\"129.3字幕組\"},{\"447\":\"夢幻戀櫻\"},{\"680\":\"Little字幕组\"},{\"641\":\"冷番补完字幕组\"},{\"31\":\"卡通空間\"},{\"649\":\"云光字幕组\"},{\"701\":\"狐狸小宮\"},{\"459\":\"紫音動漫&發佈組\"},{\"699\":\"小花花同盟戰線\"},{\"626\":\"驯兽师联盟\"},{\"58\":\"澄空学园\"},{\"769\":\"动漫萌\"},{\"734\":\"TD-RAWS\"},{\"225\":\"鈴風字幕組\"},{\"673\":\"VRAINSTORM\"},{\"741\":\"銀月字幕組\"},{\"675\":\"AikatsuFans\"},{\"759\":\"红鸟窝字幕组\"},{\"764\":\"MCE汉化组\"},{\"391\":\"ZERO字幕组\"},{\"561\":\"钉铛字幕组\"},{\"727\":\"2B4B\"},{\"104\":\"动漫先锋\"},{\"567\":\"雪梦字幕组\"},{\"573\":\"Centaurea-Raws\"},{\"652\":\"SFEO-Raws\"},{\"666\":\"中肯字幕組\"},{\"754\":\"BYYM发布组\"},{\"613\":\"AI-Raws\"},{\"706\":\"K&W-RAWS\"},{\"732\":\"肥猫压制\"},{\"424\":\"TSDM字幕組\"},{\"739\":\"Clarita 压制组\"},{\"432\":\"自由字幕组\"},{\"217\":\"AQUA工作室\"},{\"753\":\"柠檬水字幕组\"},{\"763\":\"光之家族字幕组\"},{\"332\":\"CureSub\"},{\"537\":\"NEO·QSW\"},{\"632\":\"歐克勒亞\"},{\"548\":\"Cornflower Studio\"},{\"638\":\"LittleBakas!\"}]";
+ private String type="[{\"0\":\"全部\"},{\"2\":\"動畫\"},{\"31\":\"季度全集\"},{\"3\":\"漫畫\"},{\"41\":\"港台原版\"},{\"42\":\"日文原版\"},{\"4\":\"音樂\"},{\"43\":\"動漫音樂\"},{\"44\":\"同人音樂\"},{\"15\":\"流行音樂\"},{\"6\":\"日劇\"},{\"7\":\"RAW\"},{\"9\":\"遊戲\"},{\"17\":\"電腦遊戲\"},{\"18\":\"電視遊戲\"},{\"19\":\"掌機遊戲\"},{\"20\":\"網絡遊戲\"},{\"21\":\"遊戲周邊\"},{\"12\":\"特攝\"},{\"1\":\"其他\"}]";
+
+ public JSONArray bangumiList(int index,String type, String team,String... keys) {
+ try {
+ String title = "";
+ for (String key : keys) {
+ System.out.println(key);
+ title += key + "+";
+ }
+ title = title.substring(1, title.length() - 1);
+ System.out.println(String.format(animUrl, "" + index, title,type,team));
+ System.out.println(rss2jsonUrl + URLEncoder.encode(String.format(animUrl, "" + index, title,type,team), "UTF-8") +String.format( "&api_key=%s&count=500",rss2jsonApi_2));
+ String js= HttpTools.get(rss2jsonUrl+ URLEncoder.encode(String.format(animUrl,""+index,title,type,team),"UTF-8")+String.format( "&api_key=%s&count=500",rss2jsonApi_2));
+ JSONObject json=JSONObject.parseObject(js);
+ if(json.getString("status").equals("ok")){
+ return json.getJSONArray("items");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ public int nameToValue(String name,boolean isTeam){
+ JSONArray array;
+ if(isTeam){
+ array=JSONArray.parseArray(team);
+ }else{
+ array=JSONArray.parseArray(type);
+ }
+ for (Object o : array) {
+ JSONObject json= (JSONObject) o;
+ for (String s : json.keySet()) {
+ if(json.get(s).equals(name)){
+ return Integer.parseInt(s);
+ }
+ }
+ }
+ return -1;
+ }
+ public static void initData(){
+ String url="https://share.dmhy.org/topics/advanced-search?team_id=0&sort_id=0&orderby=";
+ String data=HttpTools.get(url);
+ System.out.println(data);
+ }
+ public static void main(String[] args) {
+ initData();
+ }
+}
diff --git a/src/main/java/com/yutou/nas/bangumi/BangumiTools.java b/src/main/java/com/yutou/nas/bangumi/BangumiTools.java
new file mode 100644
index 0000000..d2e19ed
--- /dev/null
+++ b/src/main/java/com/yutou/nas/bangumi/BangumiTools.java
@@ -0,0 +1,330 @@
+package com.yutou.nas.bangumi;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.utils.HttpTools;
+import com.yutou.nas.utils.RedisTools;
+import com.yutou.nas.utils.Tools;
+import org.springframework.util.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class BangumiTools {
+ private static final String url = "http://api.bgm.tv/";
+ private static final String toDayBangumi = url + "calendar";
+ private static final String BangumiInfo = url + "/subject/%s?responseGroup=large";
+ private static final String SearchBangumi = url + "/search/subject/%s?responseGroup=large";
+
+ /**
+ * 获取番剧列表
+ *
+ * @param day 周几,-1为全部,非1~7范围则为当天
+ * @return 当日数据
+ */
+ public static JSONObject getBangumi(int day) {
+ String str = HttpTools.get(toDayBangumi);
+ JSONArray main = JSONArray.parseArray(str);
+ if (day == -1) {
+ JSONObject json = new JSONObject();
+ json.put("bangumi", main);
+ return json;
+ }
+ if (day < 1 || day > 7) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
+ calendar.setFirstDayOfWeek(Calendar.MONDAY);
+ calendar.setTime(new Date());
+ day = calendar.get(Calendar.DAY_OF_WEEK) - 1;
+ if (day == 0) {
+ day = 7;
+ }
+ }
+ if (main != null)
+ for (Object o : main) {
+ JSONObject json = (JSONObject) o;
+ if (json.getJSONObject("weekday").getInteger("id") == day) {
+ return json;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取番剧详细信息
+ *
+ * @param id 剧集id
+ * @return 详细信息
+ */
+ public static JSONObject getBangumiInfo(int id) {
+ String str = HttpTools.get(String.format(BangumiInfo, id + ""));
+ return JSONObject.parseObject(str);
+ }
+
+ /**
+ * 搜索番剧
+ *
+ * @param key 关键词
+ * @return 详细信息
+ */
+ public static JSONObject search(String key) {
+ String str = HttpTools.get(String.format(SearchBangumi, key));
+ return JSONObject.parseObject(str);
+ }
+
+ /**
+ * 获取下一集播放日期
+ *
+ * @param id 番剧id
+ * @return 日期
+ */
+ public static String getPlayNextTime(int id) {
+ JSONObject info = getBangumiInfo(id);
+ JSONArray eps = info.getJSONArray("eps");
+ String toDayTime = Tools.getToDayTime();
+ for (Object o : eps) {
+ JSONObject ep = (JSONObject) o;
+ String time = ep.getString("airdate");
+ try {
+ if (new SimpleDateFormat("yyyy-MM-dd").parse(time).getTime() >=
+ new SimpleDateFormat("yyyy-MM-dd").parse(toDayTime).getTime()) {
+ return time;
+ }
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 格式化字符串输出番剧详细信息
+ *
+ * @param id 番剧id
+ * @return 详细内容
+ */
+ public static String reportBangumiInfo(int id) {
+ JSONObject json = getBangumiInfo(id);
+ if(json.containsKey("code")){
+ return json.getString("error");
+ }
+ JSONArray eps = json.getJSONArray("eps");
+ JSONArray crts = json.getJSONArray("crt");
+ JSONArray staffs = json.getJSONArray("staff");
+ StringBuilder builder = new StringBuilder();
+ builder.append("").append("\n");
+ builder.append("标题:").append(json.getString("name_cn")).append("\n");
+ builder.append("日文标题:").append(json.getString("name")).append("\n");
+ builder.append("首播时间:").append(json.getString("air_date")).append("\n");
+ builder.append("每周").append(json.getInteger("air_weekday")).append("放送").append("\n");
+ builder.append("Bangumi地址:").append(json.getString("url")).append("\n");
+ builder.append("Bangumi评分:").append(json.getJSONObject("rating").getFloat("score")).append("\n");
+ builder.append("预计放送集数:").append(json.getInteger("eps_count")).append("\n");
+ if (eps != null) {
+ builder.append("已放送集:").append("\n");
+ for (Object o : eps) {
+ JSONObject ep = (JSONObject) o;
+ if (ep.getString("status").equals("Air")) {
+ builder.append("· 第").append(ep.getInteger("sort")).append("话:");
+ builder.append(ep.getString("name"));
+ builder.append("[").append(ep.getString("name_cn")).append("]").append("\n");
+ builder.append("播放日期:").append(ep.getString("airdate")).append(";\n");
+ builder.append("播放时长:").append(ep.getString("duration")).append(";\n");
+ builder.append("单集介绍:").append(ep.getString("desc"));
+ builder.append("\n\n");
+ } else {
+ builder.append("下一话:");
+ builder.append(" 第").append(ep.getInteger("sort")).append("话:");
+ builder.append("播放日期:").append(ep.getString("airdate")).append("\n\n");
+ break;
+ }
+ }
+ }
+ if (crts != null) {
+ builder.append("角色介绍:").append("\n");
+ for (Object o : crts) {
+ JSONObject crt = (JSONObject) o;
+ JSONObject info = crt.getJSONObject("info");
+ builder.append(crt.getString("role_name")).append(":");
+ builder.append(crt.getString("name"));
+ builder.append("(").append(crt.getString("name_cn")).append(")").append(" ");
+ builder.append("CV:").append(crt.getJSONArray("actors").getJSONObject(0).getString("name"));
+ builder.append("(").append(info.getString("gender")).append(")");
+ builder.append("\n");
+ }
+ }
+ Map> map = new HashMap<>();
+ for (Object o : staffs) {
+ JSONObject staff = (JSONObject) o;
+ for (Object jobs : staff.getJSONArray("jobs")) {
+ String job = (String) jobs;
+ List list;
+ if (!map.containsKey(job)) {
+ list = new ArrayList<>();
+ } else {
+ list = map.get(job);
+ }
+ list.add(staff);
+ map.put(job, list);
+ }
+ }
+ if (!map.isEmpty()) {
+ builder.append("staff:").append("\n");
+ for (String key : map.keySet()) {
+ builder.append(key).append(":");
+ for (JSONObject staff : map.get(key)) {
+ builder.append(staff.getString("name_cn"));
+ builder.append("(").append(staff.getString("name")).append(")");
+ builder.append("、");
+ }
+ builder.append("\n");
+ }
+ }
+ return builder.toString();
+ }
+
+ /**
+ * 格式化输出新番列表
+ * @return 新番信息
+ */
+ public static String reportBangumiList(){
+ try {
+ JSONObject json=getBangumi(-1);
+ StringBuilder builder=new StringBuilder();
+ assert json != null;
+ JSONArray array=json.getJSONArray("bangumi");
+ for (Object o : array) {
+ JSONObject data= (JSONObject) o;
+ JSONObject weekday=data.getJSONObject("weekday");
+ JSONArray items=data.getJSONArray("items");
+ builder.append(weekday.getString("cn")).append("(").append(weekday.getString("ja")).append(")");
+ builder.append(":").append("\n");
+ reportBangumi(builder, items,false);
+ builder.append("\n");
+ }
+ return builder.toString();
+ }catch (Exception e){
+ e.printStackTrace();
+ return e.getMessage();
+ }
+ }
+
+ private static void reportBangumi(StringBuilder builder, JSONArray items,boolean reportEp) {
+ int epIndex = 0;
+ String epName = "N/A";
+ for (Object oj : items) {
+ JSONObject item = (JSONObject) oj;
+ builder.append("[").append(item.getInteger("id")).append("]");
+ builder.append(StringUtils.isEmpty(item.getString("name_cn"))
+ ?item.getString("name"):item.getString("name_cn"));
+ if(!reportEp){
+ builder.append("\n");
+ continue;
+ }
+ JSONObject info=getBangumiInfo(item.getInteger("id"));
+ if(info.get("eps")==null){
+ continue;
+ }
+ JSONArray eps = info.getJSONArray("eps");
+ for (Object oe : eps) {
+ JSONObject ep = (JSONObject) oe;
+ if (ep.getString("status").equals("Air")) {
+ epIndex = ep.getInteger("sort");
+ epName = ep.getString("name");
+ } else {
+ break;
+ }
+ }
+ builder.append(" 第").append(epIndex).append("话:");
+ builder.append(epName);
+ builder.append("\n");
+ }
+ }
+
+ /**
+ * 格式化字符串输出今日播放番剧列表
+ *
+ * @return 番剧列表
+ */
+ public static String reportToDayBangumi() {
+ String toDayTime = Tools.getToDayTime();
+ if (!toDayTime.equals(RedisTools.get("reportToDayBangumi"))) {
+ RedisTools.set("reportToDayBangumi", toDayTime);
+ StringBuilder builder = new StringBuilder();
+ JSONObject toDay = getBangumi(0);
+ if (toDay == null) {
+ builder.append("今天没有任何番剧放送~");
+ } else {
+ JSONObject weekday = toDay.getJSONObject("weekday");
+ JSONArray items = toDay.getJSONArray("items");
+ builder.append("今日 ").append(weekday.get("cn")).append("(").append(weekday.get("ja")).append(")");
+ builder.append(" 放送列表:").append("\n");
+ reportBangumi(builder, items,true);
+ }
+ RedisTools.set("toDayBangumi", builder.toString());
+ return builder.toString();
+ } else {
+ return RedisTools.get("toDayBangumi");
+ }
+ }
+
+ /**
+ * 格式化字符串输出搜索动画
+ *
+ * @param key 关键词
+ * @return 详细内容
+ */
+ public static String reportSearchBangumi(String key) {
+ JSONObject main = search(key);
+ if (main.getInteger("results") > 0) {
+ StringBuilder builder = new StringBuilder();
+ List list = main.getJSONArray("list").toJavaList(JSONObject.class);
+ Collections.reverse(list);
+ for (Object items : list) {
+ JSONObject item = (JSONObject) items;
+ builder.append("标题:").append(item.getString("name_cn")).append("\n");
+ builder.append("日文标题:").append(item.getString("name")).append("\n");
+ String type;
+ switch (item.getInteger("type")) {
+ case 1:
+ type = "书籍";
+ break;
+ case 2:
+ type = "动画";
+ break;
+ case 3:
+ type = "音乐";
+ break;
+ case 4:
+ type = "游戏";
+ break;
+ case 6:
+ type = "真人剧(Real)";
+ break;
+ default:
+ type = item.getInteger("type") + "";
+ }
+ builder.append("类型:").append(type).append("\n");
+ builder.append("id:").append(item.getInteger("id")).append("\n");
+ if (item.containsKey("rating"))
+ builder.append("Bangumi评分:").append(item.getJSONObject("rating").getFloat("score")).append("\n");
+ builder.append("首播时间:").append(item.getString("air_date")).append("\n");
+ builder.append("每周 ").append(item.getInteger("air_weekday")).append(" 放送").append("\n");
+ builder.append("放送集数:").append(item.getInteger("eps")).append("\n");
+ builder.append("Bangumi地址:").append(item.getString("url")).append("\n");
+ builder.append("介绍:").append(item.getString("summary")).append("\n");
+ builder.append("\n").append("\n");
+ }
+ return builder.toString();
+ } else {
+ return "搜索不到任何内容:" + key;
+ }
+ }
+
+ public static void main(String[] args) {
+ String str = reportBangumiList();
+ System.out.println(str);
+
+ }
+}
diff --git a/src/main/java/com/yutou/nas/interfaces/DownloadInterface.java b/src/main/java/com/yutou/nas/interfaces/DownloadInterface.java
new file mode 100644
index 0000000..c09ec5b
--- /dev/null
+++ b/src/main/java/com/yutou/nas/interfaces/DownloadInterface.java
@@ -0,0 +1,6 @@
+package com.yutou.nas.interfaces;
+
+public abstract class DownloadInterface {
+ public void onDownload(String file){};
+ public void onError(Exception e){};
+}
diff --git a/src/main/java/com/yutou/nas/mybatis/dao/BangumiItemDao.java b/src/main/java/com/yutou/nas/mybatis/dao/BangumiItemDao.java
new file mode 100644
index 0000000..f7ba8a9
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/dao/BangumiItemDao.java
@@ -0,0 +1,32 @@
+package com.yutou.nas.mybatis.dao;
+
+import com.yutou.nas.mybatis.model.BangumiItem;
+import com.yutou.nas.mybatis.model.BangumiItemExample;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+@Mapper
+public interface BangumiItemDao {
+ long countByExample(BangumiItemExample example);
+
+ int deleteByExample(BangumiItemExample example);
+
+ int deleteByPrimaryKey(Integer id);
+
+ int insert(BangumiItem record);
+
+ int insertSelective(BangumiItem record);
+
+ List selectByExample(BangumiItemExample example);
+
+ BangumiItem selectByPrimaryKey(Integer id);
+
+ int updateByExampleSelective(@Param("record") BangumiItem record, @Param("example") BangumiItemExample example);
+
+ int updateByExample(@Param("record") BangumiItem record, @Param("example") BangumiItemExample example);
+
+ int updateByPrimaryKeySelective(BangumiItem record);
+
+ int updateByPrimaryKey(BangumiItem record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/dao/BangumiListDao.java b/src/main/java/com/yutou/nas/mybatis/dao/BangumiListDao.java
new file mode 100644
index 0000000..d34bd32
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/dao/BangumiListDao.java
@@ -0,0 +1,32 @@
+package com.yutou.nas.mybatis.dao;
+
+import com.yutou.nas.mybatis.model.BangumiList;
+import com.yutou.nas.mybatis.model.BangumiListExample;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+@Mapper
+public interface BangumiListDao {
+ long countByExample(BangumiListExample example);
+
+ int deleteByExample(BangumiListExample example);
+
+ int deleteByPrimaryKey(Integer id);
+
+ int insert(BangumiList record);
+
+ int insertSelective(BangumiList record);
+
+ List selectByExample(BangumiListExample example);
+
+ BangumiList selectByPrimaryKey(Integer id);
+
+ int updateByExampleSelective(@Param("record") BangumiList record, @Param("example") BangumiListExample example);
+
+ int updateByExample(@Param("record") BangumiList record, @Param("example") BangumiListExample example);
+
+ int updateByPrimaryKeySelective(BangumiList record);
+
+ int updateByPrimaryKey(BangumiList record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/dao/MusicDataDao.java b/src/main/java/com/yutou/nas/mybatis/dao/MusicDataDao.java
new file mode 100644
index 0000000..631c0b6
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/dao/MusicDataDao.java
@@ -0,0 +1,41 @@
+package com.yutou.nas.mybatis.dao;
+
+import com.yutou.nas.mybatis.model.MusicData;
+import com.yutou.nas.mybatis.model.MusicDataExample;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface MusicDataDao {
+ long countByExample(MusicDataExample example);
+
+ int deleteByExample(MusicDataExample example);
+
+ int deleteByPrimaryKey(Integer id);
+
+ int insert(MusicData record);
+
+ int insertSelective(MusicData record);
+
+ List selectByExample(MusicDataExample example);
+
+ MusicData selectByPrimaryKey(Integer id);
+
+ int updateByExampleSelective(@Param("record") MusicData record, @Param("example") MusicDataExample example);
+
+ int updateByExample(@Param("record") MusicData record, @Param("example") MusicDataExample example);
+
+ int updateByPrimaryKeySelective(MusicData record);
+
+ int updateByPrimaryKey(MusicData record);
+
+ void truncate();
+ List selectByRegexp(String regexp);
+
+ List selectAllAlbum();
+ List selectAllArtist();
+ List selectAlbum(String album);
+ List selectArtist(String artist);
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/dao/MusicFavoritesDao.java b/src/main/java/com/yutou/nas/mybatis/dao/MusicFavoritesDao.java
new file mode 100644
index 0000000..1cbb67e
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/dao/MusicFavoritesDao.java
@@ -0,0 +1,32 @@
+package com.yutou.nas.mybatis.dao;
+
+import com.yutou.nas.mybatis.model.MusicFavorites;
+import com.yutou.nas.mybatis.model.MusicFavoritesExample;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+@Mapper
+public interface MusicFavoritesDao {
+ long countByExample(MusicFavoritesExample example);
+
+ int deleteByExample(MusicFavoritesExample example);
+
+ int deleteByPrimaryKey(Integer id);
+
+ int insert(MusicFavorites record);
+
+ int insertSelective(MusicFavorites record);
+
+ List selectByExample(MusicFavoritesExample example);
+
+ MusicFavorites selectByPrimaryKey(Integer id);
+
+ int updateByExampleSelective(@Param("record") MusicFavorites record, @Param("example") MusicFavoritesExample example);
+
+ int updateByExample(@Param("record") MusicFavorites record, @Param("example") MusicFavoritesExample example);
+
+ int updateByPrimaryKeySelective(MusicFavorites record);
+
+ int updateByPrimaryKey(MusicFavorites record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/dao/MusicFavoritesDirDao.java b/src/main/java/com/yutou/nas/mybatis/dao/MusicFavoritesDirDao.java
new file mode 100644
index 0000000..2718928
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/dao/MusicFavoritesDirDao.java
@@ -0,0 +1,32 @@
+package com.yutou.nas.mybatis.dao;
+
+import com.yutou.nas.mybatis.model.MusicFavoritesDir;
+import com.yutou.nas.mybatis.model.MusicFavoritesDirExample;
+import java.util.List;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+@Mapper
+public interface MusicFavoritesDirDao {
+ long countByExample(MusicFavoritesDirExample example);
+
+ int deleteByExample(MusicFavoritesDirExample example);
+
+ int deleteByPrimaryKey(Integer id);
+
+ int insert(MusicFavoritesDir record);
+
+ int insertSelective(MusicFavoritesDir record);
+
+ List selectByExample(MusicFavoritesDirExample example);
+
+ MusicFavoritesDir selectByPrimaryKey(Integer id);
+
+ int updateByExampleSelective(@Param("record") MusicFavoritesDir record, @Param("example") MusicFavoritesDirExample example);
+
+ int updateByExample(@Param("record") MusicFavoritesDir record, @Param("example") MusicFavoritesDirExample example);
+
+ int updateByPrimaryKeySelective(MusicFavoritesDir record);
+
+ int updateByPrimaryKey(MusicFavoritesDir record);
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/BangumiItem.java b/src/main/java/com/yutou/nas/mybatis/model/BangumiItem.java
new file mode 100644
index 0000000..a176858
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/BangumiItem.java
@@ -0,0 +1,28 @@
+package com.yutou.nas.mybatis.model;
+
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * bangumi_item
+ * @author
+ */
+@Data
+public class BangumiItem implements Serializable {
+ private Integer id;
+
+ private String bid;
+
+ private String categories;
+
+ private String author;
+
+ private String title;
+
+ /**
+ * 标题过滤词
+ */
+ private String titlekey;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/BangumiItemExample.java b/src/main/java/com/yutou/nas/mybatis/model/BangumiItemExample.java
new file mode 100644
index 0000000..77bf9a0
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/BangumiItemExample.java
@@ -0,0 +1,611 @@
+package com.yutou.nas.mybatis.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BangumiItemExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public BangumiItemExample() {
+ oredCriteria = new ArrayList<>();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList<>();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(Integer value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(Integer value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(Integer value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(Integer value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(Integer value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(Integer value1, Integer value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(Integer value1, Integer value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidIsNull() {
+ addCriterion("bid is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidIsNotNull() {
+ addCriterion("bid is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidEqualTo(String value) {
+ addCriterion("bid =", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidNotEqualTo(String value) {
+ addCriterion("bid <>", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidGreaterThan(String value) {
+ addCriterion("bid >", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidGreaterThanOrEqualTo(String value) {
+ addCriterion("bid >=", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidLessThan(String value) {
+ addCriterion("bid <", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidLessThanOrEqualTo(String value) {
+ addCriterion("bid <=", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidLike(String value) {
+ addCriterion("bid like", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidNotLike(String value) {
+ addCriterion("bid not like", value, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidIn(List values) {
+ addCriterion("bid in", values, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidNotIn(List values) {
+ addCriterion("bid not in", values, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidBetween(String value1, String value2) {
+ addCriterion("bid between", value1, value2, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andBidNotBetween(String value1, String value2) {
+ addCriterion("bid not between", value1, value2, "bid");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesIsNull() {
+ addCriterion("categories is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesIsNotNull() {
+ addCriterion("categories is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesEqualTo(String value) {
+ addCriterion("categories =", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesNotEqualTo(String value) {
+ addCriterion("categories <>", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesGreaterThan(String value) {
+ addCriterion("categories >", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesGreaterThanOrEqualTo(String value) {
+ addCriterion("categories >=", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesLessThan(String value) {
+ addCriterion("categories <", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesLessThanOrEqualTo(String value) {
+ addCriterion("categories <=", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesLike(String value) {
+ addCriterion("categories like", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesNotLike(String value) {
+ addCriterion("categories not like", value, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesIn(List values) {
+ addCriterion("categories in", values, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesNotIn(List values) {
+ addCriterion("categories not in", values, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesBetween(String value1, String value2) {
+ addCriterion("categories between", value1, value2, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andCategoriesNotBetween(String value1, String value2) {
+ addCriterion("categories not between", value1, value2, "categories");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorIsNull() {
+ addCriterion("author is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorIsNotNull() {
+ addCriterion("author is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorEqualTo(String value) {
+ addCriterion("author =", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorNotEqualTo(String value) {
+ addCriterion("author <>", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorGreaterThan(String value) {
+ addCriterion("author >", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorGreaterThanOrEqualTo(String value) {
+ addCriterion("author >=", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorLessThan(String value) {
+ addCriterion("author <", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorLessThanOrEqualTo(String value) {
+ addCriterion("author <=", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorLike(String value) {
+ addCriterion("author like", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorNotLike(String value) {
+ addCriterion("author not like", value, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorIn(List values) {
+ addCriterion("author in", values, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorNotIn(List values) {
+ addCriterion("author not in", values, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorBetween(String value1, String value2) {
+ addCriterion("author between", value1, value2, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andAuthorNotBetween(String value1, String value2) {
+ addCriterion("author not between", value1, value2, "author");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNull() {
+ addCriterion("title is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNotNull() {
+ addCriterion("title is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleEqualTo(String value) {
+ addCriterion("title =", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotEqualTo(String value) {
+ addCriterion("title <>", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThan(String value) {
+ addCriterion("title >", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThanOrEqualTo(String value) {
+ addCriterion("title >=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThan(String value) {
+ addCriterion("title <", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThanOrEqualTo(String value) {
+ addCriterion("title <=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLike(String value) {
+ addCriterion("title like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotLike(String value) {
+ addCriterion("title not like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIn(List values) {
+ addCriterion("title in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotIn(List values) {
+ addCriterion("title not in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleBetween(String value1, String value2) {
+ addCriterion("title between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotBetween(String value1, String value2) {
+ addCriterion("title not between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyIsNull() {
+ addCriterion("titleKey is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyIsNotNull() {
+ addCriterion("titleKey is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyEqualTo(String value) {
+ addCriterion("titleKey =", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyNotEqualTo(String value) {
+ addCriterion("titleKey <>", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyGreaterThan(String value) {
+ addCriterion("titleKey >", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyGreaterThanOrEqualTo(String value) {
+ addCriterion("titleKey >=", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyLessThan(String value) {
+ addCriterion("titleKey <", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyLessThanOrEqualTo(String value) {
+ addCriterion("titleKey <=", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyLike(String value) {
+ addCriterion("titleKey like", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyNotLike(String value) {
+ addCriterion("titleKey not like", value, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyIn(List values) {
+ addCriterion("titleKey in", values, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyNotIn(List values) {
+ addCriterion("titleKey not in", values, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyBetween(String value1, String value2) {
+ addCriterion("titleKey between", value1, value2, "titlekey");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitlekeyNotBetween(String value1, String value2) {
+ addCriterion("titleKey not between", value1, value2, "titlekey");
+ return (Criteria) this;
+ }
+ }
+
+ /**
+ */
+ public static class Criteria extends GeneratedCriteria {
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/BangumiList.java b/src/main/java/com/yutou/nas/mybatis/model/BangumiList.java
new file mode 100644
index 0000000..453c9ce
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/BangumiList.java
@@ -0,0 +1,19 @@
+package com.yutou.nas.mybatis.model;
+
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * bangumi_list
+ * @author
+ */
+@Data
+public class BangumiList implements Serializable {
+ private Integer id;
+
+ private String title;
+
+ private Integer status;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/BangumiListExample.java b/src/main/java/com/yutou/nas/mybatis/model/BangumiListExample.java
new file mode 100644
index 0000000..356ecb9
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/BangumiListExample.java
@@ -0,0 +1,391 @@
+package com.yutou.nas.mybatis.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BangumiListExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public BangumiListExample() {
+ oredCriteria = new ArrayList<>();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList<>();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(Integer value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(Integer value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(Integer value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(Integer value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(Integer value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(Integer value1, Integer value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(Integer value1, Integer value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNull() {
+ addCriterion("title is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNotNull() {
+ addCriterion("title is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleEqualTo(String value) {
+ addCriterion("title =", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotEqualTo(String value) {
+ addCriterion("title <>", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThan(String value) {
+ addCriterion("title >", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThanOrEqualTo(String value) {
+ addCriterion("title >=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThan(String value) {
+ addCriterion("title <", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThanOrEqualTo(String value) {
+ addCriterion("title <=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLike(String value) {
+ addCriterion("title like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotLike(String value) {
+ addCriterion("title not like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIn(List values) {
+ addCriterion("title in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotIn(List values) {
+ addCriterion("title not in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleBetween(String value1, String value2) {
+ addCriterion("title between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotBetween(String value1, String value2) {
+ addCriterion("title not between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusIsNull() {
+ addCriterion("`status` is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusIsNotNull() {
+ addCriterion("`status` is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusEqualTo(Integer value) {
+ addCriterion("`status` =", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusNotEqualTo(Integer value) {
+ addCriterion("`status` <>", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusGreaterThan(Integer value) {
+ addCriterion("`status` >", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusGreaterThanOrEqualTo(Integer value) {
+ addCriterion("`status` >=", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusLessThan(Integer value) {
+ addCriterion("`status` <", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusLessThanOrEqualTo(Integer value) {
+ addCriterion("`status` <=", value, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusIn(List values) {
+ addCriterion("`status` in", values, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusNotIn(List values) {
+ addCriterion("`status` not in", values, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusBetween(Integer value1, Integer value2) {
+ addCriterion("`status` between", value1, value2, "status");
+ return (Criteria) this;
+ }
+
+ public Criteria andStatusNotBetween(Integer value1, Integer value2) {
+ addCriterion("`status` not between", value1, value2, "status");
+ return (Criteria) this;
+ }
+ }
+
+ /**
+ */
+ public static class Criteria extends GeneratedCriteria {
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/MusicData.java b/src/main/java/com/yutou/nas/mybatis/model/MusicData.java
new file mode 100644
index 0000000..d20e01a
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/MusicData.java
@@ -0,0 +1,117 @@
+package com.yutou.nas.mybatis.model;
+
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * music_data
+ * @author
+ */
+@Data
+public class MusicData implements Serializable {
+ private Integer id;
+
+ /**
+ * 艺术家
+ */
+ private String artist;
+
+ /**
+ * 专辑
+ */
+ private String album;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 评论
+ */
+ private String comment;
+
+ /**
+ * 年份
+ */
+ private String year;
+
+ /**
+ * 音轨号
+ */
+ private String track;
+
+ /**
+ * 碟片编号
+ */
+ private String discNo;
+
+ /**
+ * 作曲
+ */
+ private String composer;
+
+ /**
+ * 分类
+ */
+ private String artistSort;
+
+ /**
+ * 音乐文件路径
+ */
+ private String file;
+
+ /**
+ * 上一个文件夹
+ */
+ private String lastdir;
+
+ private Integer isdir;
+
+ /**
+ * 比特率
+ */
+ private Integer bitrate;
+
+ /**
+ * 采样率
+ */
+ private Integer samplerate;
+
+ /**
+ * 采样数
+ */
+ private Long noofsamples;
+
+ /**
+ * 声道
+ */
+ private Integer channelcount;
+
+ /**
+ * 解码类型
+ */
+ private String encodingtype;
+
+ /**
+ * 持续时长
+ */
+ private Double durationasdouble;
+
+ /**
+ * 无损
+ */
+ private Integer lossless;
+
+ /**
+ * 固定码率
+ */
+ private Integer variablebitrate;
+
+ /**
+ * md5
+ */
+ private String md5;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/MusicDataExample.java b/src/main/java/com/yutou/nas/mybatis/model/MusicDataExample.java
new file mode 100644
index 0000000..6b51339
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/MusicDataExample.java
@@ -0,0 +1,1651 @@
+package com.yutou.nas.mybatis.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MusicDataExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public MusicDataExample() {
+ oredCriteria = new ArrayList<>();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList<>();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(Integer value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(Integer value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(Integer value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(Integer value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(Integer value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(Integer value1, Integer value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(Integer value1, Integer value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistIsNull() {
+ addCriterion("artist is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistIsNotNull() {
+ addCriterion("artist is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistEqualTo(String value) {
+ addCriterion("artist =", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistNotEqualTo(String value) {
+ addCriterion("artist <>", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistGreaterThan(String value) {
+ addCriterion("artist >", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistGreaterThanOrEqualTo(String value) {
+ addCriterion("artist >=", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistLessThan(String value) {
+ addCriterion("artist <", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistLessThanOrEqualTo(String value) {
+ addCriterion("artist <=", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistLike(String value) {
+ addCriterion("artist like", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistNotLike(String value) {
+ addCriterion("artist not like", value, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistIn(List values) {
+ addCriterion("artist in", values, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistNotIn(List values) {
+ addCriterion("artist not in", values, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistBetween(String value1, String value2) {
+ addCriterion("artist between", value1, value2, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistNotBetween(String value1, String value2) {
+ addCriterion("artist not between", value1, value2, "artist");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumIsNull() {
+ addCriterion("album is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumIsNotNull() {
+ addCriterion("album is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumEqualTo(String value) {
+ addCriterion("album =", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumNotEqualTo(String value) {
+ addCriterion("album <>", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumGreaterThan(String value) {
+ addCriterion("album >", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumGreaterThanOrEqualTo(String value) {
+ addCriterion("album >=", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumLessThan(String value) {
+ addCriterion("album <", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumLessThanOrEqualTo(String value) {
+ addCriterion("album <=", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumLike(String value) {
+ addCriterion("album like", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumNotLike(String value) {
+ addCriterion("album not like", value, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumIn(List values) {
+ addCriterion("album in", values, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumNotIn(List values) {
+ addCriterion("album not in", values, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumBetween(String value1, String value2) {
+ addCriterion("album between", value1, value2, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andAlbumNotBetween(String value1, String value2) {
+ addCriterion("album not between", value1, value2, "album");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNull() {
+ addCriterion("title is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNotNull() {
+ addCriterion("title is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleEqualTo(String value) {
+ addCriterion("title =", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotEqualTo(String value) {
+ addCriterion("title <>", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThan(String value) {
+ addCriterion("title >", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThanOrEqualTo(String value) {
+ addCriterion("title >=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThan(String value) {
+ addCriterion("title <", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThanOrEqualTo(String value) {
+ addCriterion("title <=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLike(String value) {
+ addCriterion("title like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotLike(String value) {
+ addCriterion("title not like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIn(List values) {
+ addCriterion("title in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotIn(List values) {
+ addCriterion("title not in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleBetween(String value1, String value2) {
+ addCriterion("title between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotBetween(String value1, String value2) {
+ addCriterion("title not between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentIsNull() {
+ addCriterion("`comment` is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentIsNotNull() {
+ addCriterion("`comment` is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentEqualTo(String value) {
+ addCriterion("`comment` =", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentNotEqualTo(String value) {
+ addCriterion("`comment` <>", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentGreaterThan(String value) {
+ addCriterion("`comment` >", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentGreaterThanOrEqualTo(String value) {
+ addCriterion("`comment` >=", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentLessThan(String value) {
+ addCriterion("`comment` <", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentLessThanOrEqualTo(String value) {
+ addCriterion("`comment` <=", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentLike(String value) {
+ addCriterion("`comment` like", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentNotLike(String value) {
+ addCriterion("`comment` not like", value, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentIn(List values) {
+ addCriterion("`comment` in", values, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentNotIn(List values) {
+ addCriterion("`comment` not in", values, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentBetween(String value1, String value2) {
+ addCriterion("`comment` between", value1, value2, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andCommentNotBetween(String value1, String value2) {
+ addCriterion("`comment` not between", value1, value2, "comment");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearIsNull() {
+ addCriterion("`year` is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearIsNotNull() {
+ addCriterion("`year` is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearEqualTo(String value) {
+ addCriterion("`year` =", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearNotEqualTo(String value) {
+ addCriterion("`year` <>", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearGreaterThan(String value) {
+ addCriterion("`year` >", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearGreaterThanOrEqualTo(String value) {
+ addCriterion("`year` >=", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearLessThan(String value) {
+ addCriterion("`year` <", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearLessThanOrEqualTo(String value) {
+ addCriterion("`year` <=", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearLike(String value) {
+ addCriterion("`year` like", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearNotLike(String value) {
+ addCriterion("`year` not like", value, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearIn(List values) {
+ addCriterion("`year` in", values, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearNotIn(List values) {
+ addCriterion("`year` not in", values, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearBetween(String value1, String value2) {
+ addCriterion("`year` between", value1, value2, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andYearNotBetween(String value1, String value2) {
+ addCriterion("`year` not between", value1, value2, "year");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackIsNull() {
+ addCriterion("track is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackIsNotNull() {
+ addCriterion("track is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackEqualTo(String value) {
+ addCriterion("track =", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackNotEqualTo(String value) {
+ addCriterion("track <>", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackGreaterThan(String value) {
+ addCriterion("track >", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackGreaterThanOrEqualTo(String value) {
+ addCriterion("track >=", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackLessThan(String value) {
+ addCriterion("track <", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackLessThanOrEqualTo(String value) {
+ addCriterion("track <=", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackLike(String value) {
+ addCriterion("track like", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackNotLike(String value) {
+ addCriterion("track not like", value, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackIn(List values) {
+ addCriterion("track in", values, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackNotIn(List values) {
+ addCriterion("track not in", values, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackBetween(String value1, String value2) {
+ addCriterion("track between", value1, value2, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andTrackNotBetween(String value1, String value2) {
+ addCriterion("track not between", value1, value2, "track");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoIsNull() {
+ addCriterion("disc_no is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoIsNotNull() {
+ addCriterion("disc_no is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoEqualTo(String value) {
+ addCriterion("disc_no =", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoNotEqualTo(String value) {
+ addCriterion("disc_no <>", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoGreaterThan(String value) {
+ addCriterion("disc_no >", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoGreaterThanOrEqualTo(String value) {
+ addCriterion("disc_no >=", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoLessThan(String value) {
+ addCriterion("disc_no <", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoLessThanOrEqualTo(String value) {
+ addCriterion("disc_no <=", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoLike(String value) {
+ addCriterion("disc_no like", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoNotLike(String value) {
+ addCriterion("disc_no not like", value, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoIn(List values) {
+ addCriterion("disc_no in", values, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoNotIn(List values) {
+ addCriterion("disc_no not in", values, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoBetween(String value1, String value2) {
+ addCriterion("disc_no between", value1, value2, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andDiscNoNotBetween(String value1, String value2) {
+ addCriterion("disc_no not between", value1, value2, "discNo");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerIsNull() {
+ addCriterion("composer is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerIsNotNull() {
+ addCriterion("composer is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerEqualTo(String value) {
+ addCriterion("composer =", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerNotEqualTo(String value) {
+ addCriterion("composer <>", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerGreaterThan(String value) {
+ addCriterion("composer >", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerGreaterThanOrEqualTo(String value) {
+ addCriterion("composer >=", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerLessThan(String value) {
+ addCriterion("composer <", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerLessThanOrEqualTo(String value) {
+ addCriterion("composer <=", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerLike(String value) {
+ addCriterion("composer like", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerNotLike(String value) {
+ addCriterion("composer not like", value, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerIn(List values) {
+ addCriterion("composer in", values, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerNotIn(List values) {
+ addCriterion("composer not in", values, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerBetween(String value1, String value2) {
+ addCriterion("composer between", value1, value2, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andComposerNotBetween(String value1, String value2) {
+ addCriterion("composer not between", value1, value2, "composer");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortIsNull() {
+ addCriterion("artist_sort is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortIsNotNull() {
+ addCriterion("artist_sort is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortEqualTo(String value) {
+ addCriterion("artist_sort =", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortNotEqualTo(String value) {
+ addCriterion("artist_sort <>", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortGreaterThan(String value) {
+ addCriterion("artist_sort >", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortGreaterThanOrEqualTo(String value) {
+ addCriterion("artist_sort >=", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortLessThan(String value) {
+ addCriterion("artist_sort <", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortLessThanOrEqualTo(String value) {
+ addCriterion("artist_sort <=", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortLike(String value) {
+ addCriterion("artist_sort like", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortNotLike(String value) {
+ addCriterion("artist_sort not like", value, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortIn(List values) {
+ addCriterion("artist_sort in", values, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortNotIn(List values) {
+ addCriterion("artist_sort not in", values, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortBetween(String value1, String value2) {
+ addCriterion("artist_sort between", value1, value2, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andArtistSortNotBetween(String value1, String value2) {
+ addCriterion("artist_sort not between", value1, value2, "artistSort");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileIsNull() {
+ addCriterion("`file` is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileIsNotNull() {
+ addCriterion("`file` is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileEqualTo(String value) {
+ addCriterion("`file` =", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileNotEqualTo(String value) {
+ addCriterion("`file` <>", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileGreaterThan(String value) {
+ addCriterion("`file` >", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileGreaterThanOrEqualTo(String value) {
+ addCriterion("`file` >=", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileLessThan(String value) {
+ addCriterion("`file` <", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileLessThanOrEqualTo(String value) {
+ addCriterion("`file` <=", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileLike(String value) {
+ addCriterion("`file` like", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileNotLike(String value) {
+ addCriterion("`file` not like", value, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileIn(List values) {
+ addCriterion("`file` in", values, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileNotIn(List values) {
+ addCriterion("`file` not in", values, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileBetween(String value1, String value2) {
+ addCriterion("`file` between", value1, value2, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andFileNotBetween(String value1, String value2) {
+ addCriterion("`file` not between", value1, value2, "file");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirIsNull() {
+ addCriterion("lastDir is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirIsNotNull() {
+ addCriterion("lastDir is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirEqualTo(String value) {
+ addCriterion("lastDir =", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirNotEqualTo(String value) {
+ addCriterion("lastDir <>", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirGreaterThan(String value) {
+ addCriterion("lastDir >", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirGreaterThanOrEqualTo(String value) {
+ addCriterion("lastDir >=", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirLessThan(String value) {
+ addCriterion("lastDir <", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirLessThanOrEqualTo(String value) {
+ addCriterion("lastDir <=", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirLike(String value) {
+ addCriterion("lastDir like", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirNotLike(String value) {
+ addCriterion("lastDir not like", value, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirIn(List values) {
+ addCriterion("lastDir in", values, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirNotIn(List values) {
+ addCriterion("lastDir not in", values, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirBetween(String value1, String value2) {
+ addCriterion("lastDir between", value1, value2, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andLastdirNotBetween(String value1, String value2) {
+ addCriterion("lastDir not between", value1, value2, "lastdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirIsNull() {
+ addCriterion("isDir is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirIsNotNull() {
+ addCriterion("isDir is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirEqualTo(Integer value) {
+ addCriterion("isDir =", value, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirNotEqualTo(Integer value) {
+ addCriterion("isDir <>", value, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirGreaterThan(Integer value) {
+ addCriterion("isDir >", value, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirGreaterThanOrEqualTo(Integer value) {
+ addCriterion("isDir >=", value, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirLessThan(Integer value) {
+ addCriterion("isDir <", value, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirLessThanOrEqualTo(Integer value) {
+ addCriterion("isDir <=", value, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirIn(List values) {
+ addCriterion("isDir in", values, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirNotIn(List values) {
+ addCriterion("isDir not in", values, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirBetween(Integer value1, Integer value2) {
+ addCriterion("isDir between", value1, value2, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andIsdirNotBetween(Integer value1, Integer value2) {
+ addCriterion("isDir not between", value1, value2, "isdir");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateIsNull() {
+ addCriterion("bitRate is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateIsNotNull() {
+ addCriterion("bitRate is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateEqualTo(Integer value) {
+ addCriterion("bitRate =", value, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateNotEqualTo(Integer value) {
+ addCriterion("bitRate <>", value, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateGreaterThan(Integer value) {
+ addCriterion("bitRate >", value, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateGreaterThanOrEqualTo(Integer value) {
+ addCriterion("bitRate >=", value, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateLessThan(Integer value) {
+ addCriterion("bitRate <", value, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateLessThanOrEqualTo(Integer value) {
+ addCriterion("bitRate <=", value, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateIn(List values) {
+ addCriterion("bitRate in", values, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateNotIn(List values) {
+ addCriterion("bitRate not in", values, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateBetween(Integer value1, Integer value2) {
+ addCriterion("bitRate between", value1, value2, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andBitrateNotBetween(Integer value1, Integer value2) {
+ addCriterion("bitRate not between", value1, value2, "bitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateIsNull() {
+ addCriterion("sampleRate is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateIsNotNull() {
+ addCriterion("sampleRate is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateEqualTo(Integer value) {
+ addCriterion("sampleRate =", value, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateNotEqualTo(Integer value) {
+ addCriterion("sampleRate <>", value, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateGreaterThan(Integer value) {
+ addCriterion("sampleRate >", value, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateGreaterThanOrEqualTo(Integer value) {
+ addCriterion("sampleRate >=", value, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateLessThan(Integer value) {
+ addCriterion("sampleRate <", value, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateLessThanOrEqualTo(Integer value) {
+ addCriterion("sampleRate <=", value, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateIn(List values) {
+ addCriterion("sampleRate in", values, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateNotIn(List values) {
+ addCriterion("sampleRate not in", values, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateBetween(Integer value1, Integer value2) {
+ addCriterion("sampleRate between", value1, value2, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andSamplerateNotBetween(Integer value1, Integer value2) {
+ addCriterion("sampleRate not between", value1, value2, "samplerate");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesIsNull() {
+ addCriterion("noOfSamples is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesIsNotNull() {
+ addCriterion("noOfSamples is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesEqualTo(Long value) {
+ addCriterion("noOfSamples =", value, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesNotEqualTo(Long value) {
+ addCriterion("noOfSamples <>", value, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesGreaterThan(Long value) {
+ addCriterion("noOfSamples >", value, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesGreaterThanOrEqualTo(Long value) {
+ addCriterion("noOfSamples >=", value, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesLessThan(Long value) {
+ addCriterion("noOfSamples <", value, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesLessThanOrEqualTo(Long value) {
+ addCriterion("noOfSamples <=", value, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesIn(List values) {
+ addCriterion("noOfSamples in", values, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesNotIn(List values) {
+ addCriterion("noOfSamples not in", values, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesBetween(Long value1, Long value2) {
+ addCriterion("noOfSamples between", value1, value2, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andNoofsamplesNotBetween(Long value1, Long value2) {
+ addCriterion("noOfSamples not between", value1, value2, "noofsamples");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountIsNull() {
+ addCriterion("channelCount is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountIsNotNull() {
+ addCriterion("channelCount is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountEqualTo(Integer value) {
+ addCriterion("channelCount =", value, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountNotEqualTo(Integer value) {
+ addCriterion("channelCount <>", value, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountGreaterThan(Integer value) {
+ addCriterion("channelCount >", value, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountGreaterThanOrEqualTo(Integer value) {
+ addCriterion("channelCount >=", value, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountLessThan(Integer value) {
+ addCriterion("channelCount <", value, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountLessThanOrEqualTo(Integer value) {
+ addCriterion("channelCount <=", value, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountIn(List values) {
+ addCriterion("channelCount in", values, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountNotIn(List values) {
+ addCriterion("channelCount not in", values, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountBetween(Integer value1, Integer value2) {
+ addCriterion("channelCount between", value1, value2, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andChannelcountNotBetween(Integer value1, Integer value2) {
+ addCriterion("channelCount not between", value1, value2, "channelcount");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeIsNull() {
+ addCriterion("encodingType is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeIsNotNull() {
+ addCriterion("encodingType is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeEqualTo(String value) {
+ addCriterion("encodingType =", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeNotEqualTo(String value) {
+ addCriterion("encodingType <>", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeGreaterThan(String value) {
+ addCriterion("encodingType >", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeGreaterThanOrEqualTo(String value) {
+ addCriterion("encodingType >=", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeLessThan(String value) {
+ addCriterion("encodingType <", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeLessThanOrEqualTo(String value) {
+ addCriterion("encodingType <=", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeLike(String value) {
+ addCriterion("encodingType like", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeNotLike(String value) {
+ addCriterion("encodingType not like", value, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeIn(List values) {
+ addCriterion("encodingType in", values, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeNotIn(List values) {
+ addCriterion("encodingType not in", values, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeBetween(String value1, String value2) {
+ addCriterion("encodingType between", value1, value2, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andEncodingtypeNotBetween(String value1, String value2) {
+ addCriterion("encodingType not between", value1, value2, "encodingtype");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleIsNull() {
+ addCriterion("durationAsDouble is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleIsNotNull() {
+ addCriterion("durationAsDouble is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleEqualTo(Double value) {
+ addCriterion("durationAsDouble =", value, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleNotEqualTo(Double value) {
+ addCriterion("durationAsDouble <>", value, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleGreaterThan(Double value) {
+ addCriterion("durationAsDouble >", value, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleGreaterThanOrEqualTo(Double value) {
+ addCriterion("durationAsDouble >=", value, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleLessThan(Double value) {
+ addCriterion("durationAsDouble <", value, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleLessThanOrEqualTo(Double value) {
+ addCriterion("durationAsDouble <=", value, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleIn(List values) {
+ addCriterion("durationAsDouble in", values, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleNotIn(List values) {
+ addCriterion("durationAsDouble not in", values, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleBetween(Double value1, Double value2) {
+ addCriterion("durationAsDouble between", value1, value2, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andDurationasdoubleNotBetween(Double value1, Double value2) {
+ addCriterion("durationAsDouble not between", value1, value2, "durationasdouble");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessIsNull() {
+ addCriterion("lossless is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessIsNotNull() {
+ addCriterion("lossless is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessEqualTo(Integer value) {
+ addCriterion("lossless =", value, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessNotEqualTo(Integer value) {
+ addCriterion("lossless <>", value, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessGreaterThan(Integer value) {
+ addCriterion("lossless >", value, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessGreaterThanOrEqualTo(Integer value) {
+ addCriterion("lossless >=", value, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessLessThan(Integer value) {
+ addCriterion("lossless <", value, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessLessThanOrEqualTo(Integer value) {
+ addCriterion("lossless <=", value, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessIn(List values) {
+ addCriterion("lossless in", values, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessNotIn(List values) {
+ addCriterion("lossless not in", values, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessBetween(Integer value1, Integer value2) {
+ addCriterion("lossless between", value1, value2, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andLosslessNotBetween(Integer value1, Integer value2) {
+ addCriterion("lossless not between", value1, value2, "lossless");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateIsNull() {
+ addCriterion("variableBitRate is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateIsNotNull() {
+ addCriterion("variableBitRate is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateEqualTo(Integer value) {
+ addCriterion("variableBitRate =", value, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateNotEqualTo(Integer value) {
+ addCriterion("variableBitRate <>", value, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateGreaterThan(Integer value) {
+ addCriterion("variableBitRate >", value, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateGreaterThanOrEqualTo(Integer value) {
+ addCriterion("variableBitRate >=", value, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateLessThan(Integer value) {
+ addCriterion("variableBitRate <", value, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateLessThanOrEqualTo(Integer value) {
+ addCriterion("variableBitRate <=", value, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateIn(List values) {
+ addCriterion("variableBitRate in", values, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateNotIn(List values) {
+ addCriterion("variableBitRate not in", values, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateBetween(Integer value1, Integer value2) {
+ addCriterion("variableBitRate between", value1, value2, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andVariablebitrateNotBetween(Integer value1, Integer value2) {
+ addCriterion("variableBitRate not between", value1, value2, "variablebitrate");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5IsNull() {
+ addCriterion("md5 is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5IsNotNull() {
+ addCriterion("md5 is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5EqualTo(String value) {
+ addCriterion("md5 =", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5NotEqualTo(String value) {
+ addCriterion("md5 <>", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5GreaterThan(String value) {
+ addCriterion("md5 >", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5GreaterThanOrEqualTo(String value) {
+ addCriterion("md5 >=", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5LessThan(String value) {
+ addCriterion("md5 <", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5LessThanOrEqualTo(String value) {
+ addCriterion("md5 <=", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5Like(String value) {
+ addCriterion("md5 like", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5NotLike(String value) {
+ addCriterion("md5 not like", value, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5In(List values) {
+ addCriterion("md5 in", values, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5NotIn(List values) {
+ addCriterion("md5 not in", values, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5Between(String value1, String value2) {
+ addCriterion("md5 between", value1, value2, "md5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMd5NotBetween(String value1, String value2) {
+ addCriterion("md5 not between", value1, value2, "md5");
+ return (Criteria) this;
+ }
+ }
+
+ /**
+ */
+ public static class Criteria extends GeneratedCriteria {
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/MusicFavorites.java b/src/main/java/com/yutou/nas/mybatis/model/MusicFavorites.java
new file mode 100644
index 0000000..1471add
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/MusicFavorites.java
@@ -0,0 +1,22 @@
+package com.yutou.nas.mybatis.model;
+
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * music_favorites
+ * @author
+ */
+@Data
+public class MusicFavorites implements Serializable {
+ private Integer id;
+
+ private Integer favoriteid;
+
+ private String musisMd5;
+
+ private Date subTime;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesDir.java b/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesDir.java
new file mode 100644
index 0000000..f469988
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesDir.java
@@ -0,0 +1,20 @@
+package com.yutou.nas.mybatis.model;
+
+import java.io.Serializable;
+import lombok.Data;
+
+/**
+ * music_favorites_dir
+ * @author
+ */
+@Data
+public class MusicFavoritesDir implements Serializable {
+ private Integer id;
+
+ /**
+ * 收藏夹标题
+ */
+ private String title;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesDirExample.java b/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesDirExample.java
new file mode 100644
index 0000000..ac92d6d
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesDirExample.java
@@ -0,0 +1,331 @@
+package com.yutou.nas.mybatis.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MusicFavoritesDirExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public MusicFavoritesDirExample() {
+ oredCriteria = new ArrayList<>();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList<>();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(Integer value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(Integer value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(Integer value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(Integer value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(Integer value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(Integer value1, Integer value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(Integer value1, Integer value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNull() {
+ addCriterion("title is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIsNotNull() {
+ addCriterion("title is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleEqualTo(String value) {
+ addCriterion("title =", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotEqualTo(String value) {
+ addCriterion("title <>", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThan(String value) {
+ addCriterion("title >", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleGreaterThanOrEqualTo(String value) {
+ addCriterion("title >=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThan(String value) {
+ addCriterion("title <", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLessThanOrEqualTo(String value) {
+ addCriterion("title <=", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleLike(String value) {
+ addCriterion("title like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotLike(String value) {
+ addCriterion("title not like", value, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleIn(List values) {
+ addCriterion("title in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotIn(List values) {
+ addCriterion("title not in", values, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleBetween(String value1, String value2) {
+ addCriterion("title between", value1, value2, "title");
+ return (Criteria) this;
+ }
+
+ public Criteria andTitleNotBetween(String value1, String value2) {
+ addCriterion("title not between", value1, value2, "title");
+ return (Criteria) this;
+ }
+ }
+
+ /**
+ */
+ public static class Criteria extends GeneratedCriteria {
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesExample.java b/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesExample.java
new file mode 100644
index 0000000..9f63ad5
--- /dev/null
+++ b/src/main/java/com/yutou/nas/mybatis/model/MusicFavoritesExample.java
@@ -0,0 +1,452 @@
+package com.yutou.nas.mybatis.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class MusicFavoritesExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public MusicFavoritesExample() {
+ oredCriteria = new ArrayList<>();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList<>();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(Integer value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(Integer value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(Integer value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(Integer value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(Integer value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(Integer value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(Integer value1, Integer value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(Integer value1, Integer value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidIsNull() {
+ addCriterion("favoriteId is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidIsNotNull() {
+ addCriterion("favoriteId is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidEqualTo(Integer value) {
+ addCriterion("favoriteId =", value, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidNotEqualTo(Integer value) {
+ addCriterion("favoriteId <>", value, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidGreaterThan(Integer value) {
+ addCriterion("favoriteId >", value, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidGreaterThanOrEqualTo(Integer value) {
+ addCriterion("favoriteId >=", value, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidLessThan(Integer value) {
+ addCriterion("favoriteId <", value, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidLessThanOrEqualTo(Integer value) {
+ addCriterion("favoriteId <=", value, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidIn(List values) {
+ addCriterion("favoriteId in", values, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidNotIn(List values) {
+ addCriterion("favoriteId not in", values, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidBetween(Integer value1, Integer value2) {
+ addCriterion("favoriteId between", value1, value2, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andFavoriteidNotBetween(Integer value1, Integer value2) {
+ addCriterion("favoriteId not between", value1, value2, "favoriteid");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5IsNull() {
+ addCriterion("musis_md5 is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5IsNotNull() {
+ addCriterion("musis_md5 is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5EqualTo(String value) {
+ addCriterion("musis_md5 =", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5NotEqualTo(String value) {
+ addCriterion("musis_md5 <>", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5GreaterThan(String value) {
+ addCriterion("musis_md5 >", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5GreaterThanOrEqualTo(String value) {
+ addCriterion("musis_md5 >=", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5LessThan(String value) {
+ addCriterion("musis_md5 <", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5LessThanOrEqualTo(String value) {
+ addCriterion("musis_md5 <=", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5Like(String value) {
+ addCriterion("musis_md5 like", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5NotLike(String value) {
+ addCriterion("musis_md5 not like", value, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5In(List values) {
+ addCriterion("musis_md5 in", values, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5NotIn(List values) {
+ addCriterion("musis_md5 not in", values, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5Between(String value1, String value2) {
+ addCriterion("musis_md5 between", value1, value2, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andMusisMd5NotBetween(String value1, String value2) {
+ addCriterion("musis_md5 not between", value1, value2, "musisMd5");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeIsNull() {
+ addCriterion("sub_time is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeIsNotNull() {
+ addCriterion("sub_time is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeEqualTo(Date value) {
+ addCriterion("sub_time =", value, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeNotEqualTo(Date value) {
+ addCriterion("sub_time <>", value, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeGreaterThan(Date value) {
+ addCriterion("sub_time >", value, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeGreaterThanOrEqualTo(Date value) {
+ addCriterion("sub_time >=", value, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeLessThan(Date value) {
+ addCriterion("sub_time <", value, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeLessThanOrEqualTo(Date value) {
+ addCriterion("sub_time <=", value, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeIn(List values) {
+ addCriterion("sub_time in", values, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeNotIn(List values) {
+ addCriterion("sub_time not in", values, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeBetween(Date value1, Date value2) {
+ addCriterion("sub_time between", value1, value2, "subTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubTimeNotBetween(Date value1, Date value2) {
+ addCriterion("sub_time not between", value1, value2, "subTime");
+ return (Criteria) this;
+ }
+ }
+
+ /**
+ */
+ public static class Criteria extends GeneratedCriteria {
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/other/QQAudio.java b/src/main/java/com/yutou/nas/other/QQAudio.java
new file mode 100644
index 0000000..2dd301b
--- /dev/null
+++ b/src/main/java/com/yutou/nas/other/QQAudio.java
@@ -0,0 +1,9 @@
+package com.yutou.nas.other;
+
+import com.yutou.nas.utils.AudioTools;
+
+public class QQAudio {
+ public static void playText(String text){
+ AudioTools.playText(text);
+ }
+}
diff --git a/src/main/java/com/yutou/nas/other/QQSetu.java b/src/main/java/com/yutou/nas/other/QQSetu.java
new file mode 100644
index 0000000..1dff6b8
--- /dev/null
+++ b/src/main/java/com/yutou/nas/other/QQSetu.java
@@ -0,0 +1,202 @@
+package com.yutou.nas.other;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.utils.QQBotManager;
+import com.yutou.nas.utils.RedisTools;
+import com.yutou.nas.utils.Tools;
+import net.mamoe.mirai.event.events.GroupMessageEvent;
+import net.mamoe.mirai.message.data.At;
+import net.mamoe.mirai.message.data.Image;
+import net.mamoe.mirai.message.data.MessageChainBuilder;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class QQSetu {
+ public static void printTodaySetu() {
+ String redisKey=Tools.getToDayTime() + "_setu";
+ System.out.println("redisKey = " + redisKey);
+ String js = RedisTools.get(redisKey, 1);
+ if (js != null) {
+ JSONObject json = JSONObject.parseObject(js);
+ if(json.containsKey("isPrint")&&json.getBoolean("isPrint")){
+ return;
+ }
+ Map groupAverage=new HashMap<>();
+ Map groupImage=new HashMap<>();
+ JSONObject setu=null;
+ for (String id : json.keySet()) {
+ String group=json.getJSONObject(id).getJSONObject("info").getLong("group")+"";
+ if(groupAverage.containsKey(group)){
+ if(groupAverage.get(group)<=json.getJSONObject(id).getFloat("average")){
+ groupAverage.put(group,json.getJSONObject(id).getFloat("average"));
+ groupImage.put(group,id);
+ }
+ }else{
+ groupAverage.put(group,json.getJSONObject(id).getFloat("average"));
+ groupImage.put(group,id);
+ }
+ }
+ for (String id : groupImage.keySet()) {
+ setu=json.getJSONObject(groupImage.get(id));
+ if(setu!=null){
+ json.put("isPrint",true);
+ RedisTools.set(1,redisKey,json.toJSONString());
+ JSONObject info=setu.getJSONObject("info");
+ JSONObject score=setu.getJSONObject("score");
+ MessageChainBuilder builder = new MessageChainBuilder();
+ builder.append(Image.fromId(info.getString("id")));
+ builder.append("本日最佳涩图由").append(new At(info.getLong("sourQQ"))).append("提供\n");
+ builder.append("获得分数 ").append(String.valueOf(setu.getFloat("average"))).append("\n");
+ builder.append("共有 ").append(String.valueOf(score.getIntValue("userNumber"))).append(" 人参与投票");
+ QQBotManager.getInstance().sendMessage(info.getLong("group"),builder);
+ }
+ }
+ }
+ }
+
+ private boolean isSetu(Image image) {
+ String url = Image.queryUrl(image);
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ int length = connection.getContentLength();
+ connection.disconnect();
+ if (length > 50000) {
+ return true;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+
+ return false;
+ }
+
+ private void setuBuilder(Image image, GroupMessageEvent event) {
+ if (!isSetu(image)) {
+ return;
+ }
+ if (RedisTools.get(event.getGroup().getId()+"setu") != null) {
+ printSetu(event.getGroup().getId());
+ }
+ setuScore.clear();
+ JSONObject json = new JSONObject();
+ json.put("id", image.getImageId());
+ json.put("sourName", event.getSenderName());
+ json.put("sourQQ", event.getSender().getId());
+ json.put("group", event.getGroup().getId());
+ RedisTools.set(event.getGroup().getId()+"setu", json.toJSONString(),6*60);
+ if (timer != null) {
+ timer.cancel();
+ timer = null;
+ }
+ startTimer(event.getGroup().getId());
+ }
+
+ private void startTimer(long group) {
+ timer = new Timer();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ if(!setuScore.isEmpty()){
+ printSetu(group);
+ }
+ timer = null;
+ }
+ }, 5 * 60 * 1000);
+ }
+
+ private void printSetu(long group) {
+ JSONObject jt = JSONObject.parseObject(RedisTools.get(group+"setu"));
+ String id = jt.getString("id");
+ float average = 0;
+ float max = 0;
+ float min = 10;
+ float length = 0;
+ String maxName = "";
+ String minName = "";
+ if(setuScore.size()<=1){
+ return;
+ }
+ for (String name : setuScore.keySet()) {
+ length += setuScore.get(name);
+ average += setuScore.get(name);
+ if (setuScore.get(name) > max) {
+ max = setuScore.get(name);
+ maxName = name.split("\\|")[0];
+ }
+ if (setuScore.get(name) < min) {
+ min = setuScore.get(name);
+ minName = name.split("\\|")[0];
+ }
+ }
+ JSONObject score = new JSONObject();
+ score.put("max", max);
+ score.put("min", min);
+ score.put("sum", length);
+ score.put("maxName", maxName);
+ score.put("minName", minName);
+ score.put("userNumber", setuScore.size());
+
+ average = average / setuScore.size();
+ String builder = "涩图评分:" + average +"\n "+
+ "其中最高分由:" + maxName + " 给与:" + max +"\n "+
+ "其中最低分由:" + minName + " 给与:" + min;
+ QQBotManager.getInstance().sendMessage(group, builder);
+ String st = RedisTools.get(Tools.getToDayTime() + "_setu", 1);
+ JSONObject json;
+ if (st == null) {
+ json = new JSONObject();
+ } else {
+ json = JSONObject.parseObject(st);
+ }
+ if (!json.containsKey(id)) {
+ JSONObject item;
+ if (json.containsKey("item")) {
+ item = json.getJSONObject("item");
+ } else {
+ item = new JSONObject();
+ }
+
+ item.put("score", score);
+ item.put("info", jt);
+ item.put("average", average);
+ json.put(id, item);
+ RedisTools.set(1, Tools.getToDayTime() + "_setu", json.toJSONString());
+ }
+ RedisTools.remove(group+"setu",0);
+ setuScore.clear();
+ }
+ public void setu(String msg, GroupMessageEvent event) {
+ if (msg.trim().equals("[图片]")) {
+ Image image = (Image) event.getMessage().stream().filter(Image.class::isInstance).findFirst().orElse(null);
+ if (image != null) {
+ setuBuilder(image, event);
+ return;
+ }
+ }
+ try {
+ if(msg.trim().length()>3){
+ return;
+ }
+ float i = Float.parseFloat(msg.trim());
+ if (i > 0 && i <= 10) {
+ String name = event.getSenderName();
+ String qq=event.getSender().getId()+"";
+ if (!setuScore.containsKey(name)) {
+ setuScore.put(name+"|"+qq, i);
+ }
+ }
+ } catch (Exception ignored) {
+ }
+ }
+
+ private Timer timer;
+ private static Map setuScore = new HashMap<>();
+}
diff --git a/src/main/java/com/yutou/nas/other/tools.java b/src/main/java/com/yutou/nas/other/tools.java
new file mode 100644
index 0000000..bd830ce
--- /dev/null
+++ b/src/main/java/com/yutou/nas/other/tools.java
@@ -0,0 +1,122 @@
+package com.yutou.nas.other;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.NasApplication;
+import com.yutou.nas.utils.RedisTools;
+import com.yutou.nas.utils.Tools;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.Enumeration;
+import java.util.List;
+
+@Controller
+public class tools {
+
+
+ @ResponseBody
+ @RequestMapping(value = "tools/get.do")
+ public String getJs(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ Enumeration name = request.getHeaderNames();
+ while (name.hasMoreElements()) {
+ String na = name.nextElement();
+ System.out.println(na + " " + request.getHeader(na));
+ }
+ File file = new File("D:\\IDEA\\web_toolset\\web\\js\\my.js");
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ String tmp, str = "";
+ while ((tmp = reader.readLine()) != null) {
+ if (tmp.contains("\"")) {
+ // tmp=tmp.replace("\"","\\\"");
+ }
+ str += tmp;
+ }
+ reader.close();
+ /* response.setHeader("Content-Type","application/javascript; charset=utf-8");
+ PrintWriter writer=response.getWriter();
+ writer.write(str);
+ writer.flush();
+ writer.close();*/
+ return str;
+ //return "function test(){ return \"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1588139022200&di=8cc8405f7514dd54bd82fcd070349603&imgtype=0&src=http%3A%2F%2Fa2.att.hudong.com%2F36%2F48%2F19300001357258133412489354717.jpg\" }";
+ }
+
+ @RequestMapping("/public/version.do")
+ @ResponseBody
+ public String getVersion() {
+ return NasApplication.version;
+ }
+
+ @ResponseBody
+ @RequestMapping("/public/request.do")
+ public String testRequest(HttpServletRequest request) {
+ JSONObject params = new JSONObject();
+ JSONArray cookies = new JSONArray();
+ JSONObject header = new JSONObject();
+ for (String key : request.getParameterMap().keySet()) {
+ params.put(key, request.getParameter(key));
+ }
+ if (request.getCookies() != null) {
+ for (Cookie cookie : request.getCookies()) {
+ JSONObject ck = JSONObject.parseObject(JSONObject.toJSONString(cookie));
+ cookies.add(ck);
+ }
+ }
+ Enumeration enumeration = request.getHeaderNames();
+ while (enumeration != null && enumeration.hasMoreElements()) {
+ String tmp = enumeration.nextElement();
+ header.put(tmp, request.getHeader(tmp));
+ }
+ JSONObject json = new JSONObject();
+ json.put("code", 0);
+ json.put("method", request.getMethod());
+ json.put("address", Tools.getRemoteAddress(request));
+ json.put("UA", request.getHeader("User-Agent"));
+ json.put("addressUrl", request.getPathInfo());
+ json.put("params", params);
+ json.put("cookie", cookies);
+ json.put("header", header);
+ Tools.sendServer("打印请求", json.toJSONString());
+ try {
+ switch (RedisTools.get("request")) {
+ case "success":
+ return "success";
+ case "-999":
+ case "param":
+ return json.toJSONString();
+ default:
+ return RedisTools.get("request");
+ }
+ } catch (Exception e) {
+ // e.printStackTrace();
+ }
+
+ return json.toJSONString();
+ }
+
+ @ResponseBody
+ @RequestMapping("/private/request.do")
+ public String setRequest(String ret, String data) {
+ switch (ret) {
+ case "success":
+ RedisTools.set("request", "success");
+ break;
+ case "user":
+ RedisTools.set("request", data);
+ break;
+ default:
+ RedisTools.set("request", "param");
+ break;
+ }
+ return RedisTools.get("request");
+ }
+
+}
diff --git a/src/main/java/com/yutou/nas/utils/ApplicationInit.java b/src/main/java/com/yutou/nas/utils/ApplicationInit.java
new file mode 100644
index 0000000..61a9df2
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/ApplicationInit.java
@@ -0,0 +1,44 @@
+package com.yutou.nas.utils;
+
+import com.yutou.nas.other.QQSetu;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * 服务启动后执行
+ */
+@Component
+public class ApplicationInit implements ApplicationRunner {
+ @Resource
+ MusicToolsServiceImpl musicTools;
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ AudioTools.init();
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
+ String time = new SimpleDateFormat("HH:mm").format(new Date());
+ switch (time){
+ case "00:00":
+ musicTools.scanMusic();
+ break;
+ case "08:00":
+ case "20:00":
+ QQBotManager.getInstance().reportToDayBangumi();
+ break;
+ case "23:59":
+ QQSetu.printTodaySetu();
+ break;
+
+ }
+ }
+ },0,35 * 1000);
+ }
+}
diff --git a/src/main/java/com/yutou/nas/utils/AudioTools.java b/src/main/java/com/yutou/nas/utils/AudioTools.java
new file mode 100644
index 0000000..d05b0f8
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/AudioTools.java
@@ -0,0 +1,66 @@
+package com.yutou.nas.utils;
+
+import com.iflytek.cloud.speech.*;
+
+public class AudioTools {
+ private static boolean init = false;
+
+ synchronized static void init() {
+ if (init) {
+ return;
+ }
+ SpeechUtility.createUtility(SpeechConstant.APPID + "=601f7f7d");
+ SpeechUtility.getUtility().setParameter(SpeechConstant.VOLUME,"100");
+ SpeechUtility.getUtility().setParameter(SpeechConstant.LIB_NAME_64,"/media/yutou/4t/public/servier/tools/");
+ SpeechUtility.getUtility().setParameter(SpeechConstant.LIB_NAME_32,"/media/yutou/4t/public/servier/tools/");
+ init = true;
+ System.out.println("讯飞语音已初始化");
+ }
+
+ public static void playText(String text) {
+ SpeechSynthesizer mss = SpeechSynthesizer.createSynthesizer();
+ mss.startSpeaking(text, new SynthesizerListener() {
+ @Override
+ public void onBufferProgress(int progress, int beginPos, int endPos,
+ String info) {
+ if (progress == 100) {
+ mss.destroy();
+ }
+ }
+
+ @Override
+ public void onSpeakBegin() {
+
+ }
+
+ @Override
+ public void onSpeakProgress(int i, int i1, int i2) {
+
+ }
+
+ @Override
+ public void onSpeakPaused() {
+
+ }
+
+ @Override
+ public void onSpeakResumed() {
+
+ }
+
+ @Override
+ public void onCompleted(SpeechError speechError) {
+ System.out.println(speechError.getErrorDesc() + " code " + speechError.getErrorCode());
+ }
+
+ @Override
+ public void onEvent(int i, int i1, int i2, int i3, Object o, Object o1) {
+ }
+ });
+ }
+
+ public static void main(String[] args) {
+ init();
+ playText("小爱同学,开灯");
+ }
+}
diff --git a/src/main/java/com/yutou/nas/utils/ConfigTools.java b/src/main/java/com/yutou/nas/utils/ConfigTools.java
new file mode 100644
index 0000000..1d3ef04
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/ConfigTools.java
@@ -0,0 +1,86 @@
+package com.yutou.nas.utils;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.*;
+
+/**
+ * 配置和参数
+ */
+public class ConfigTools {
+ public static final String CONFIG="config.json";
+ public static final String DATA="data.json";
+ public static final String SQLITE="sqlite.json";
+ static {
+ try {
+ File file=new File(CONFIG);
+ if(!file.exists()){
+ file.createNewFile();
+ }
+ file=new File(DATA);
+ if(!file.exists()){
+ file.createNewFile();
+ }
+ file=null;
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+ }
+ public static Object load(String type,String key){
+ File file=new File(type);
+ //System.out.println(type+"配置文件地址:"+file.getAbsolutePath());
+ String src=readFile(file);
+ if(src!=null){
+ try {
+ JSONObject json=JSONObject.parseObject(src);
+ if(json==null){
+ json=new JSONObject();
+ saveFile(file,json.toJSONString());
+ }
+ return json.getOrDefault(key, "");
+ }catch (Exception e){
+ return "";
+ }
+ }
+ return "";
+ }
+ public static boolean save(String type,String key,Object data){
+ File file=new File(type);
+ String src=readFile(file);
+ if(src==null){
+ src="{}";
+ }
+ JSONObject json=JSONObject.parseObject(src);
+ json.put(key,data);
+ saveFile(file,json.toJSONString());
+ return false;
+ }
+ public static boolean saveFile(File file,String data){
+ try {
+ FileWriter writer=new FileWriter(file);
+ writer.write(data);
+ writer.flush();
+ writer.close();
+ return true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+ public static String readFile(File file){
+ try {
+ BufferedReader reader=new BufferedReader(new FileReader(file));
+ String tmp;
+ StringBuilder str= new StringBuilder();
+ while ((tmp=reader.readLine())!=null){
+ str.append(tmp);
+ }
+ reader.close();
+ return str.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/yutou/nas/utils/CorsConfig.java b/src/main/java/com/yutou/nas/utils/CorsConfig.java
new file mode 100644
index 0000000..21327e4
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/CorsConfig.java
@@ -0,0 +1,27 @@
+package com.yutou.nas.utils;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class CorsConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ // 设置允许跨域请求的域名
+ .allowedOriginPatterns("*")
+ // 是否允许证书(cookies)
+ .allowCredentials(true)
+ // 设置允许的方法
+ .allowedMethods("*")
+ // 跨域允许时间
+ .maxAge(3600);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/yutou/nas/utils/HttpTools.java b/src/main/java/com/yutou/nas/utils/HttpTools.java
new file mode 100644
index 0000000..df7fb2a
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/HttpTools.java
@@ -0,0 +1,132 @@
+package com.yutou.nas.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yutou.nas.utils.Interfaces.NetworkInterface;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.Set;
+
+public class HttpTools {
+ public static String get(String url) {
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.setRequestProperty("User-Agent", getKuKuUA());
+ BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ StringBuilder str = new StringBuilder();
+ String tmp;
+ while ((tmp = reader.readLine()) != null) {
+ str.append(tmp);
+ }
+ reader.close();
+ connection.disconnect();
+ return str.toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static void post(final String url, final byte[] body, final NetworkInterface networkInterface) {
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ String tmp;
+ StringBuilder str = new StringBuilder();
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.setRequestMethod("POST");
+ connection.setDoOutput(true);
+ connection.setDoInput(true);
+ connection.setConnectTimeout(5 * 1000);
+ connection.setReadTimeout(10 * 1000);
+ //connection.addRequestProperty("Connection", "keep-alive");
+ //connection.addRequestProperty("User-Agent", getExtUa());
+ //connection.addRequestProperty("content-type", "application/json");
+ connection.addRequestProperty("charset", "UTF-8");
+ OutputStream outputStream = connection.getOutputStream();
+
+ outputStream.write(body);
+ outputStream.flush();
+ outputStream.close();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+ while ((tmp = reader.readLine()) != null) {
+ str.append(tmp);
+ }
+ final String finalStr = str.toString();
+
+ // Log.i(TAG + "[" + url + "?" + toGetSplice(body) + "]", "body:" + str + " (" + connection.getResponseCode() + ")");
+ if (networkInterface != null) {
+ try {
+ networkInterface.httpGetData(str.toString(), connection.getResponseCode());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ connection.disconnect();
+ reader.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }).start();
+ }
+
+ private static String getExtUa() {
+ return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36";
+ }
+
+ private static String getKuKuUA() {
+ return "/KUKU_APP(Android/#/cn.kuku.sdk/ttsdk17228/29401/A-2.9.4.01.KUSDK/868139039134314/fcddf839c8c135fa/F4:60:E2:AB:25:1A/460019406520644/+8618569400341/#/9/Redmi 6 Pro/xiaomi/1736/76fda4d6-cd6b-485f-987b-8d347b007f24/#/KUKU/Native/92972ea9651fbd2e)";
+ }
+
+ public String toUrlParams(JSONObject json) {
+ StringBuilder string = new StringBuilder();
+ Set keys = json.keySet();
+ for (String key : keys) {
+ try {
+ string.append("&").append(key).append("=").append(URLEncoder.encode(json.getString(key), "UTF-8"));
+ } catch (Exception e) {
+ e.printStackTrace();
+ try {
+ string.append("&").append(URLEncoder.encode(key, "UTF-8")).append("=");
+ // string += "&" + key + "=";
+ } catch (Exception e1) {
+ string.append("&").append(key).append("=");
+ }
+ }
+ }
+
+ string = new StringBuilder(string.substring(1, string.length()).replaceAll(" ", ""));
+ return string.toString();
+ }
+
+ public static void main(String[] args) {
+ JSONObject json = new JSONObject();
+ json.put("pid", "102");
+ json.put("gid", "100584");
+ json.put("gameKey", "0gha58u1c9FjZkeAsEmYIzTvp");
+ json.put("access_token", "659c-S1gV0DwMXdYjPDlSrSLNYOvA8qUoCSvmdFEHvZugKgNX4Z2BCwF18A7W2gRdG7WiWfKsbZgF6YssZHhaozksI9RBn2QQFTXzmAHtbMd4ginEEtwdKmPCM4JbJGg1ollqoNE0PcGENpa4F3e7EdSOa_JFyE6XyUQN1iurJU3F8MZfLlTIcTR9USYoHX15vsAkCht_0mrapZblkeY1_8HFrmK8rlenbZLxccy7PrMz5eZ9uPPDJL5OYiEahyrtLENB8SVmlGofJfQw8wUjN8_XVZSfLMujdwz24");
+ String url = "http://192.168.1.156:9020/Faxing/reg?" +
+ "&tpyeCode=dimai" +
+ "®ParamJson=" + json.toJSONString();
+ /* ExecutorService service= Executors.newCachedThreadPool();
+ for (int i = 0; i < 3000; i++) {
+ service.submit(new Runnable() {
+ @Override
+ public void run() {
+ get(url);
+ }
+ });
+ }*/
+ System.out.println(url);
+ //String str=get(url);
+ }
+}
diff --git a/src/main/java/com/yutou/nas/utils/Interfaces/IMusicToolsService.java b/src/main/java/com/yutou/nas/utils/Interfaces/IMusicToolsService.java
new file mode 100644
index 0000000..dad4e48
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/Interfaces/IMusicToolsService.java
@@ -0,0 +1,30 @@
+package com.yutou.nas.utils.Interfaces;
+
+
+import com.yutou.nas.mybatis.model.MusicData;
+
+import java.util.List;
+
+public interface IMusicToolsService {
+ void init();
+
+ void scanMusic();
+
+ List getPath(String path, boolean isDir);
+
+ MusicData getMusicData(String md5);
+
+ List findOfTitle(String title);
+
+ List findOfArtist(String by);
+
+ List getMusicList();
+
+ int getLength();
+
+ boolean isScan();
+
+ String getMusicPath();
+
+ byte[] readImage(String path) throws Exception;
+}
diff --git a/src/main/java/com/yutou/nas/utils/Interfaces/NetworkInterface.java b/src/main/java/com/yutou/nas/utils/Interfaces/NetworkInterface.java
new file mode 100644
index 0000000..d30abaf
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/Interfaces/NetworkInterface.java
@@ -0,0 +1,16 @@
+package com.yutou.nas.utils.Interfaces;
+
+public interface NetworkInterface {
+ /**
+ * 请求成功
+ * @param data 请求参数
+ * @param state http状态
+ */
+ void httpGetData(Object data, int state);
+
+ /**
+ * 请求异常
+ * @param e 异常
+ */
+ void httpError(Exception e);
+}
diff --git a/src/main/java/com/yutou/nas/utils/MusicToolsServiceImpl.java b/src/main/java/com/yutou/nas/utils/MusicToolsServiceImpl.java
new file mode 100644
index 0000000..d0fe18a
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/MusicToolsServiceImpl.java
@@ -0,0 +1,545 @@
+package com.yutou.nas.utils;
+
+import com.yutou.nas.Datas.AppData;
+import com.yutou.nas.mybatis.dao.MusicDataDao;
+import com.yutou.nas.mybatis.model.MusicData;
+import com.yutou.nas.mybatis.model.MusicDataExample;
+import com.yutou.nas.utils.Interfaces.IMusicToolsService;
+
+import ealvatag.audio.AudioFile;
+import ealvatag.audio.AudioFileIO;
+import ealvatag.audio.AudioHeader;
+import ealvatag.tag.FieldKey;
+import ealvatag.tag.NullTag;
+import ealvatag.tag.Tag;
+import ealvatag.tag.images.NullArtwork;
+import net.bramp.ffmpeg.FFprobe;
+import net.bramp.ffmpeg.probe.FFmpegFormat;
+import net.bramp.ffmpeg.probe.FFmpegProbeResult;
+import net.bramp.ffmpeg.probe.FFmpegStream;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Service("MusicToolsService")
+public class MusicToolsServiceImpl implements IMusicToolsService {
+ public static final int FIND_TITLE = 1;
+ public static final int FIND_ARTIST = 2;
+
+ private String musicPath = "/media/yutou/4t/public/音乐";
+ private boolean isScan = false;
+
+ @Resource
+ MusicDataDao musicDataDao;
+
+ @Override
+ public void init() {
+ musicPath = (String) ConfigTools.load(ConfigTools.CONFIG, "musicDir");
+ scanMusic();
+ }
+
+ @Override
+ public void scanMusic() {
+ if (isScan) {
+ return;
+ }
+ if (ConfigTools.load(ConfigTools.CONFIG, "musicScan").equals("false")) {
+ return;
+ }
+ musicPath = (String) ConfigTools.load(ConfigTools.CONFIG, "musicDir");
+ musicDataDao.truncate();
+ System.out.println("执行扫描:" + musicPath);
+ new Thread(() -> {
+ long startTime = System.currentTimeMillis();
+ QQBotManager.getInstance().sendMessage("开始扫描音乐夹");
+ isScan = true;
+ scan(new File(musicPath));
+ isScan = false;
+ System.out.println("扫描完成");
+ QQBotManager.getInstance().sendMessage("音乐扫描完成,共" + getLength() + "首歌,耗时:"
+ + (System.currentTimeMillis() - startTime));
+ }).start();
+ }
+
+
+ private void scan(File path) {
+ if (path.isFile()) {
+ add(path);
+ } else if (path.isDirectory()) {
+ for (File file : Objects.requireNonNull(path.listFiles())) {
+ if (file.isDirectory()) {
+ scan(file);
+ } else {
+ add(file);
+ }
+ }
+ }
+ }
+
+ public void getPathOrDir(String path, List list) {
+ File files = new File(path);
+ for (File file : files.listFiles()) {
+ if (file.isFile()) {
+ list.add(getMetadata(file));
+ } else {
+ getPathOrDir(file.getAbsolutePath(), list);
+ }
+ }
+ }
+
+
+ /**
+ * 获取指定目录下的音乐
+ *
+ * @param path 指定目录
+ * @param isDir 是否扫描目录下的所有文件,false则仅为当前目录
+ * @return 音乐列表
+ */
+ @Override
+ public List getPath(String path, boolean isDir) {
+ List list = new ArrayList<>();
+ List main = new ArrayList<>();
+ MusicDataExample example = new MusicDataExample();
+ String replacement = ConfigTools.load(ConfigTools.CONFIG, "os").equals("windows") ? "\\\\" : "/";
+ String tmpPath = path;
+ if (isDir) {
+ example.createCriteria().andFileLike(tmpPath.replace(File.separator, replacement) + "%");
+ main = musicDataDao.selectByExample(example);
+ }
+ tmpPath = tmpPath.replace(File.separator, replacement)
+ .replace("[", "\\[")
+ .replace("(", "\\(")
+ .replace(")", "\\)")
+ .replace("]", "\\]");
+ main.addAll(musicDataDao.selectByRegexp(tmpPath + replacement + "([^" + replacement + "]+)$"));
+
+ if (!path.equals(AppData.defaultMusicPath) && !path.equals("root")) {
+ MusicData t2 = new MusicData();
+ t2.setTitle("返回");
+ if (main.isEmpty()) {
+ t2.setFile("root");
+ } else {
+ MusicData tmp = main.get(0);
+ t2.setFile(new File(tmp.getLastdir()).getAbsolutePath());
+ }
+ System.out.println("查询地址:" + path + " 设置返回地址:" + t2.getFile());
+ t2.setIsdir(1);
+ list.add(t2);
+ }
+ getDirList(path, list);
+ list.addAll(main);
+ return list;
+ }
+
+ public List getAllAlbum() {
+ return musicDataDao.selectAllAlbum();
+ }
+
+ public List getAllArtist() {
+ return musicDataDao.selectAllArtist();
+ }
+
+ public List selectAlbum(String album) {
+ return musicDataDao.selectAlbum(album);
+ }
+
+ public List selectArtist(String artist) {
+ return musicDataDao.selectArtist(artist);
+ }
+
+ private void getDirList(String path, List list) {
+ File file = new File(path);
+ System.out.println("扫描文件:"+path);
+ if(file.isDirectory()) {
+ for (File listFile : file.listFiles()) {
+ if (listFile.isDirectory()) {
+ MusicData data = new MusicData();
+ data.setTitle(listFile.getName());
+ data.setIsdir(1);
+ data.setFile(listFile.getAbsolutePath());
+ list.add(data);
+ }
+ }
+ }else{
+ MusicData data = new MusicData();
+ data.setTitle(file.getName());
+ data.setIsdir(0);
+ data.setFile(file.getAbsolutePath());
+ list.add(data);
+ }
+ }
+
+ private void add(File file) {
+ MusicData data = getMetadata(file);
+ if (data != null) {
+ try {
+ musicDataDao.insert(data);
+ } catch (Exception e) {
+ e.printStackTrace();
+ QQBotManager.getInstance().sendMessage("音乐文件添加失败:" + data.toString());
+ }
+
+ }
+ }
+
+ @Override
+ public MusicData getMusicData(String path) {
+ MusicDataExample example = new MusicDataExample();
+ example.createCriteria().andFileEqualTo(path);
+ List list = musicDataDao.selectByExample(example);
+ if (list != null && list.size() > 0) {
+ return list.get(0);
+ }
+ return null;
+ }
+
+
+ public MusicData getMetadata(File file) {
+ try {
+ if (file.getName().endsWith(".lrc")
+ || file.getName().endsWith(".jpg")
+ || file.getName().endsWith(".ini")
+ || file.getName().endsWith(".png")
+ || file.getName().endsWith(".torrent")
+ || file.getName().endsWith(".log")
+ || file.getName().endsWith(".mkv")
+ || file.getName().endsWith(".dff")
+ || file.getName().endsWith(".cue")
+ || file.getName().endsWith(".m3u")
+ ) {
+ return null;
+ }
+
+ AudioFile audioFile = AudioFileIO.read(file);
+ Tag tag = audioFile.getTag().or(NullTag.INSTANCE);
+ MusicData data = new MusicData();
+ try {
+ data.setAlbum(tag.getFirst(FieldKey.ALBUM));
+ } catch (Exception e) {
+ }
+ try {
+ data.setArtist(tag.getFirst(FieldKey.ARTIST));
+ } catch (Exception e) {
+ }
+ try {
+ data.setArtistSort(tag.getFirst(FieldKey.ARTIST_SORT));
+ } catch (Exception e) {
+ }
+ try {
+ data.setComment(tag.getFirst(FieldKey.COMMENT));
+ } catch (Exception e) {
+ }
+ try {
+ data.setComposer(tag.getFirst(FieldKey.COMPOSER));
+ } catch (Exception e) {
+ }
+ try {
+ data.setDiscNo(tag.getFirst(FieldKey.DISC_NO));
+ } catch (Exception e) {
+ }
+ try {
+ if (StringUtils.isEmpty(tag.getFirst(FieldKey.TITLE))) {
+ data.setTitle(file.getName());
+ } else {
+ data.setTitle(tag.getFirst(FieldKey.TITLE));
+ }
+ } catch (Exception e) {
+ data.setTitle(file.getName());
+ }
+ try {
+ data.setTrack(tag.getFirst(FieldKey.TRACK));
+ } catch (Exception e) {
+ }
+ try {
+ data.setYear(tag.getFirst(FieldKey.YEAR));
+ } catch (Exception e) {
+ }
+ data.setFile(file.getAbsolutePath());
+ data.setIsdir(file.isDirectory() ? 1 : 0);
+ data.setLastdir(file.getParentFile().getParent());
+
+ AudioHeader header = audioFile.getAudioHeader();
+ data.setBitrate(header.getBitRate());
+ data.setSamplerate(header.getSampleRate());
+ data.setNoofsamples(header.getNoOfSamples());
+ data.setChannelcount(header.getChannelCount());
+ data.setEncodingtype(header.getEncodingType());
+ data.setDurationasdouble(header.getDurationAsDouble());
+ data.setLossless(header.isLossless() ? 1 : 0);
+ data.setVariablebitrate(header.isVariableBitRate() ? 1 : 0);
+ try {
+ data.setMd5(header.getClass().getMethod("getMd5").invoke(header).toString());
+ } catch (Exception ignored) {
+ data.setMd5(Tools.getFileMD5(file));
+ }
+ return data;
+ } catch (IOException e) {
+ return getMetadata_jthink(file);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public MusicData getMetadata_jthink(File file) {
+ try {
+ org.jaudiotagger.audio.AudioFile audioFile = org.jaudiotagger.audio.AudioFileIO.read(file);
+ org.jaudiotagger.tag.Tag tag = audioFile.getTag();
+ MusicData data = new MusicData();
+ try {
+ data.setAlbum(tag.getFirst(org.jaudiotagger.tag.FieldKey.ALBUM));
+ } catch (Exception ignored) {
+ }
+ try {
+ data.setArtist(tag.getFirst(org.jaudiotagger.tag.FieldKey.ARTIST));
+ } catch (Exception ignored) {
+ }
+ try {
+ data.setArtistSort(tag.getFirst(org.jaudiotagger.tag.FieldKey.ARTIST_SORT));
+ } catch (Exception ignored) {
+ }
+ try {
+ data.setComment(tag.getFirst(org.jaudiotagger.tag.FieldKey.COMMENT));
+ } catch (Exception ignored) {
+ }
+ try {
+ data.setComposer(tag.getFirst(org.jaudiotagger.tag.FieldKey.COMPOSER));
+ } catch (Exception ignored) {
+ }
+ try {
+ data.setDiscNo(tag.getFirst(org.jaudiotagger.tag.FieldKey.DISC_NO));
+ } catch (Exception ignored) {
+ }
+ try {
+ if (StringUtils.isEmpty(tag.getFirst(org.jaudiotagger.tag.FieldKey.TITLE))) {
+ data.setTitle(file.getName());
+ } else {
+ data.setTitle(tag.getFirst(org.jaudiotagger.tag.FieldKey.TITLE));
+ }
+ } catch (Exception e) {
+ data.setTitle(file.getName());
+ }
+ try {
+ data.setTrack(tag.getFirst(org.jaudiotagger.tag.FieldKey.TRACK));
+ } catch (Exception ignored) {
+ }
+ try {
+ data.setYear(tag.getFirst(org.jaudiotagger.tag.FieldKey.YEAR));
+ } catch (Exception ignored) {
+ }
+ data.setFile(file.getAbsolutePath());
+ data.setIsdir(file.isDirectory() ? 1 : 0);
+ data.setLastdir(file.getParentFile().getParent());
+
+ org.jaudiotagger.audio.AudioHeader header = audioFile.getAudioHeader();
+ data.setBitrate(Integer.parseInt(header.getBitRate()));
+ data.setSamplerate(Integer.parseInt(header.getSampleRate()));
+ data.setNoofsamples(Long.parseLong(header.getSampleRateAsNumber() + ""));
+ data.setChannelcount(Integer.parseInt(header.getChannels()));
+ data.setEncodingtype(header.getEncodingType() + "");
+ data.setDurationasdouble(Double.parseDouble(header.getTrackLength() + ""));
+ data.setLossless(header.isLossless() ? 1 : 0);
+ data.setVariablebitrate(header.isVariableBitRate() ? 1 : 0);
+ try {
+ data.setMd5(header.getClass().getMethod("getMd5").invoke(header).toString());
+ } catch (Exception ignored) {
+ data.setMd5(Tools.getFileMD5(file));
+ }
+ return data;
+ } catch (Exception e) {
+ return getMetadataOfFFmpeg(file);
+ }
+ }
+
+ private MusicData getMetadataOfFFmpeg(File file) {
+ MusicData data;
+ try {
+ data = new MusicData();
+ FFprobe fFprobe = new FFprobe((String) ConfigTools.load(ConfigTools.CONFIG, "ffprobe"));
+ FFmpegProbeResult result = fFprobe.probe(file.getAbsolutePath());
+ FFmpegFormat format = result.getFormat();
+ FFmpegStream stream = null;
+ for (FFmpegStream tmp : result.getStreams()) {
+ if (tmp.index == 0) {
+ stream = tmp;
+ }
+ }
+ Map tag = format.tags;
+ data.setTitle(getTitle(tag));
+ data.setAlbum(getAlbum(tag));
+ data.setArtist(getArtist(tag));
+ data.setDiscNo(tag.get("disc") == null ? tag.get("disc".toUpperCase()) : tag.get("disc"));
+ data.setTrack(tag.get("track") == null ? tag.get("track".toUpperCase()) : tag.get("track"));
+ data.setYear(getYear(tag));
+ data.setArtistSort(tag.get("album_artist") == null ? tag.get("album_artist".toUpperCase()) : tag.get("album_artist"));
+ data.setDurationasdouble(format.duration);
+ data.setBitrate((int) (format.bit_rate / 1000));
+ if (stream != null) {
+ if (data.getBitrate() == 0)
+ data.setBitrate((int) (stream.bit_rate / 1000));
+ data.setChannelcount(stream.channels);
+ data.setLossless(0);
+ data.setSamplerate(stream.sample_rate);
+ data.setNoofsamples(stream.duration_ts);
+ }
+ data.setEncodingtype(format.format_long_name);
+ data.setComment("");
+ data.setComposer("");
+ data.setVariablebitrate(0);
+ data.setFile(file.getAbsolutePath());
+ data.setLastdir(file.getParentFile().getParent());
+ data.setIsdir(file.isDirectory() ? 1 : 0);
+ if (data.getYear() == null) {
+ data.setYear("0000");
+ }
+ data.setMd5(Tools.getFileMD5(file));
+ } catch (Exception e) {
+ e.printStackTrace();
+ data = new MusicData();
+ data.setTitle(file.getName());
+ data.setFile(file.getAbsolutePath());
+ data.setIsdir(file.isDirectory() ? 1 : 0);
+ data.setLastdir(file.getParentFile().getParent());
+ data.setMd5(Tools.getFileMD5(file));
+ QQBotManager.getInstance().sendMessage("添加音乐文件失败:\n" + data.toString() + "\n" + Tools.getExceptionString(e));
+ }
+ return data;
+ }
+
+ private String getTitle(Map tag) {
+ String title = tag.get("title");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("TITLE");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("Title");
+ }
+ }
+ return title;
+ }
+
+ private String getArtist(Map tag) {
+ String title = tag.get("artist");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("ARTIST");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("Artist");
+ }
+ }
+ return title;
+ }
+
+ private String getAlbum(Map tag) {
+ String title = tag.get("album");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("ALBUM");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("Album");
+ }
+ }
+ return title;
+ }
+
+ private String getYear(Map tag) {
+ String title = tag.get("year");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("YEAR");
+ if (StringUtils.isEmpty(title)) {
+ title = tag.get("Year");
+ }
+ }
+ return title;
+ }
+
+ @Override
+ public List findOfTitle(String title) {
+ return find(title, FIND_TITLE);
+ }
+
+ @Override
+ public List findOfArtist(String by) {
+ return find(by, FIND_ARTIST);
+ }
+
+ public List getMusicList() {
+ return musicDataDao.selectByExample(new MusicDataExample());
+ }
+
+ @Override
+ public int getLength() {
+ return musicDataDao.selectByExample(new MusicDataExample()).size();
+ }
+
+ @Override
+ public boolean isScan() {
+ return isScan;
+ }
+
+ private List find(String title, int type) {
+ List list;
+ MusicDataExample example = new MusicDataExample();
+ if (type == FIND_TITLE) {
+ example.createCriteria().andTitleEqualTo(title);
+ } else if (type == FIND_ARTIST) {
+ example.createCriteria().andArtistEqualTo(title);
+ }
+ list = musicDataDao.selectByExample(example);
+
+ return list;
+ }
+
+ @Override
+ public String getMusicPath() {
+ return musicPath;
+ }
+
+ public void setMusicPath(String musicPath) {
+ this.musicPath = musicPath;
+ }
+
+ @Override
+ public byte[] readImage(String path) throws Exception {
+ File file = new File(path);
+ AudioFile audioFile = null;
+ audioFile = AudioFileIO.read(file);
+ Tag tag = audioFile.getTag().or(NullTag.INSTANCE);
+ byte[] bytes = tag.getFirstArtwork().or(NullArtwork.INSTANCE).getBinaryData();
+ if (bytes.length == 0) {
+ return readImageFile(file);
+ }
+ return bytes;
+ }
+
+ private byte[] readImageFile(File file) throws Exception {
+ String path = file.getAbsolutePath().replace(file.getName(), "");
+ File img = new File(path, "cover.jpg");
+ if (!img.exists()) {
+ img = new File(path, "Cover.jpg");
+ if (!img.exists()) {
+ img = new File(path, "COVER.jpg");
+ if (!img.exists()) {
+ throw new NullPointerException("没有cover文件");
+ }
+ }
+ }
+
+ return Files.readAllBytes(Paths.get(img.getAbsolutePath()));
+ }
+
+ public static void main(String[] args) throws Exception {
+ File file = new File("Z:\\音乐\\总之就是非常酸\\ED\\カノエラナ - 月と星空\\カノエラナ.wav");
+ file = new File("Z:\\音乐\\终将成为你\\[OP]君にふれて\\rise.flac");
+ // file = new File("Z:\\音乐\\周董\\2012 十二新作\\03 公公偏头痛.ape");
+ System.out.println(new MusicToolsServiceImpl().getMetadataOfFFmpeg(file));
+ }
+
+
+}
diff --git a/src/main/java/com/yutou/nas/utils/QQBotManager.java b/src/main/java/com/yutou/nas/utils/QQBotManager.java
new file mode 100644
index 0000000..ecb001b
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/QQBotManager.java
@@ -0,0 +1,339 @@
+package com.yutou.nas.utils;
+
+import com.yutou.nas.NasApplication;
+import com.yutou.nas.bangumi.BangumiTools;
+import com.yutou.nas.interfaces.DownloadInterface;
+import com.yutou.nas.other.QQAudio;
+import com.yutou.nas.other.QQSetu;
+import net.mamoe.mirai.Bot;
+import net.mamoe.mirai.BotFactory;
+import net.mamoe.mirai.event.GlobalEventChannel;
+import net.mamoe.mirai.event.events.GroupMessageEvent;
+import net.mamoe.mirai.message.data.Image;
+import net.mamoe.mirai.message.data.MessageChainBuilder;
+import net.mamoe.mirai.utils.BotConfiguration;
+import net.mamoe.mirai.utils.ExternalResource;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Consumer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class QQBotManager {
+
+
+ private static class QQCommands {
+ private final static String QQ_HELP = "!help";
+ private final static String QQ_UPDATE_IP = "!更新ip";
+ private final static String QQ_GET_IP = "!ip";
+ private final static String QQ_OPEN_PC = "!开机";
+ private final static String QQ_GET_VERSION = "!version";
+ private final static String QQ_CMD = "!cmd";
+ private final static String QQ_BANGUMI_TODAY = "!今日动画";
+ private final static String QQ_BANGUMI_LIST = "!新番";
+ private final static String QQ_BANGUMI_SUB = "!查动画";
+ private final static String QQ_AUDIO = "!语音";
+ private final static String QQ_AUDIO_OPEN_LAMP = "!开灯";
+ private final static String QQ_AUDIO_OPEN_AIR = "!开空调";
+ }
+
+ private static QQBotManager botManager = null;
+ private Bot bot;
+ private static final long qqGroup = 891655174L;
+ private boolean isLogin = false;
+ private static boolean isInit = false;
+
+
+ private QQBotManager() {
+ Object isRun = ConfigTools.load(ConfigTools.CONFIG, "qq_bot");
+ if (isRun != null && (boolean) isRun) {
+ isLogin = true;
+ isInit = true;
+ init();
+ }
+ }
+
+ private void init() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ long qq = 2476945931L;
+ String password = "zhang34864394";
+ if (ConfigTools.load(ConfigTools.CONFIG, "model").equals("dev")) {
+ qq = 3620756944L;
+ password = "UAs6YBYMyxJU";
+ }
+
+ bot = BotFactory.INSTANCE.newBot(qq, password, new BotConfiguration() {
+ {
+ setProtocol(MiraiProtocol.ANDROID_PAD);
+ fileBasedDeviceInfo("qq_bot_devices_info.json");
+ if (ConfigTools.load(ConfigTools.CONFIG, "model").equals("nas")) {
+ noBotLog();
+ noNetworkLog();
+ }
+ }
+ });
+ //Events.registerEvents(bot, new MessageListener());
+ GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, new MessageListener());
+ bot.login();
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ String str = sendMessage("姬妻酱上线拉~");
+ System.out.println(str);
+
+ }
+ }).start();
+ bot.join();
+
+ }
+ }).start();
+
+ }
+
+ public static QQBotManager getInstance() {
+ if (botManager == null && !isInit) {
+ botManager = new QQBotManager();
+ }
+ return botManager;
+ }
+
+ public boolean isLogin() {
+ return isLogin;
+ }
+
+ private Image getImage(File file) {
+ if (bot != null) {
+ return Objects.requireNonNull(bot.getGroup(qqGroup)).uploadImage(ExternalResource.create(file));
+ }
+ return null;
+ }
+
+ private String getNotLoginQQ() {
+ return "没有登录QQ";
+ }
+
+ public void reportToDayBangumi() {
+ getInstance().sendMessage(BangumiTools.reportToDayBangumi());
+ }
+
+ public String sendMessage(String text) {
+ if (bot != null) {
+ try {
+ return Objects.requireNonNull(bot.getGroup(qqGroup)).sendMessage(text).toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return getNotLoginQQ();
+ }
+
+ public String sendMessage(Long group, String text) {
+ if (bot != null) {
+ try {
+ return Objects.requireNonNull(bot.getGroup(group)).sendMessage(text).toString();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return getNotLoginQQ();
+ }
+
+ public void sendMessage(Long group, MessageChainBuilder builder) {
+ if (bot != null) {
+ Objects.requireNonNull(bot.getGroup(group)).sendMessage(builder.asMessageChain());
+ }
+ }
+
+
+ public String sendMessage(File imageFile, String text) {
+ try {
+ if (bot != null) {
+ Image image = getImage(imageFile);
+ MessageChainBuilder builder = new MessageChainBuilder();
+ if (image != null) {
+ builder.append(image);
+ }
+ builder.append(text);
+ return Objects.requireNonNull(bot.getGroup(qqGroup)).sendMessage(builder.asMessageChain()).toString();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return getNotLoginQQ();
+ }
+
+ public String sendMessage(List imgs, String text) {
+ if (bot != null) {
+ MessageChainBuilder builder = new MessageChainBuilder();
+ for (File img : imgs) {
+ builder.append(Objects.requireNonNull(getImage(img)));
+ }
+ builder.append(text);
+ return Objects.requireNonNull(bot.getGroup(qqGroup)).sendMessage(builder.asMessageChain()).toString();
+ }
+ return getNotLoginQQ();
+ }
+
+ public static List getImages(String str) {
+ List list = new ArrayList<>();
+ String regex = "";
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(str);
+ while (matcher.find()) {
+ list.add(matcher.group().replace("", "")
+ .trim());
+ }
+ return list;
+ }
+
+ public static void main(String[] args) {
+ getInstance();
+ }
+
+ private static class MessageListener implements Consumer {
+
+
+ @Override
+ public void accept(GroupMessageEvent event) {
+ String msg = event.getMessage().contentToString();
+ switch (event.getGroup().getId() + "") {
+ case qqGroup + "":
+ myGroup(msg);
+ case "570197155":
+ new QQSetu().setu(msg, event);
+
+ }
+ }
+
+ private void myGroup(String msg) {
+ msg = msg.replace("!", "!").toLowerCase();
+ switch (msg) {
+ case QQCommands.QQ_OPEN_PC:
+ RedisTools.Consumer.system("openPC", null);
+ String time = new SimpleDateFormat("HH").format(new Date());
+ if (Integer.parseInt(time) < 18) {
+ break;
+ }
+ case QQCommands.QQ_AUDIO_OPEN_LAMP:
+ QQAudio.playText("小爱同学,开灯");
+ break;
+ case QQCommands.QQ_AUDIO_OPEN_AIR:
+ QQAudio.playText("小爱同学,开空调");
+ break;
+ case QQCommands.QQ_UPDATE_IP:
+ RedisTools.Consumer.system("updateIP", null);
+ break;
+ case QQCommands.QQ_GET_IP:
+ RedisTools.Consumer.bot("getip");
+ break;
+ case QQCommands.QQ_GET_VERSION:
+ sendVersion();
+ break;
+ case QQCommands.QQ_BANGUMI_TODAY:
+ QQBotManager.getInstance().sendMessage(BangumiTools.reportToDayBangumi());
+ break;
+ case QQCommands.QQ_BANGUMI_LIST:
+ getInstance().sendMessage("获取中...");
+ getInstance().sendMessage(BangumiTools.reportBangumiList());
+ break;
+
+ case QQCommands.QQ_HELP:
+ StringBuilder builder = new StringBuilder();
+ for (Field field : QQCommands.class.getDeclaredFields()) {
+ try {
+ field.setAccessible(true);
+ builder.append(field.get(null)).append("\n");
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ getInstance().sendMessage(builder.toString());
+ break;
+ default:
+ if (msg.startsWith(QQCommands.QQ_CMD)) {
+ RedisTools.Consumer.system("cmd", msg.replace(QQCommands.QQ_CMD, ""));
+ } else if (msg.startsWith(QQCommands.QQ_BANGUMI_SUB)) {
+ String info = null;
+ try {
+ int id = Integer.parseInt(msg.replace(QQCommands.QQ_BANGUMI_SUB, "").trim());
+ info = BangumiTools.reportBangumiInfo(id);
+ } catch (Exception e) {
+ String key = msg.replace(QQCommands.QQ_BANGUMI_SUB, "").trim();
+ info = BangumiTools.reportSearchBangumi(key);
+ }
+ List imgs = new ArrayList<>();
+ if (info.contains("")) {
+ imgs = getImages(info);
+ for (String img : imgs) {
+ info = info.replace("", "");
+ }
+ }
+ sendImagesMsg(imgs, info);
+ } else if (msg.startsWith(QQCommands.QQ_AUDIO)) {
+ QQAudio.playText(msg.replace(QQCommands.QQ_AUDIO, ""));
+ }
+ }
+ }
+
+
+ private List files;
+ private int index = 0;
+
+ private void sendImagesMsg(List imgs, String text) {
+ files = new ArrayList<>();
+ index = 0;
+ if (imgs.size() == 0) {
+ getInstance().sendMessage(text);
+ return;
+ }
+ for (String img : imgs) {
+ Tools.download(img, new DownloadInterface() {
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ files.add(new File(file));
+ send(imgs.size(), text);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ super.onError(e);
+ index++;
+ send(imgs.size(), text);
+ }
+ });
+ }
+ }
+
+ private void send(int size, String text) {
+ if ((files.size() + index) == size) {
+ String str = getInstance().sendMessage(files, text);
+ System.out.println("str = " + str);
+ }
+ }
+
+ private void sendVersion() {
+ String localVersion = NasApplication.version;
+ String serverVersion = HttpTools.get("http://tools.yutou233.cn:8000/public/version.do?token=zIrsh9TUZP2lfRW753PannG49E7VJvor");
+ String msg = "本地版本:" + localVersion + "\n" + "服务器版本:" + serverVersion;
+ QQBotManager.getInstance().sendMessage(msg);
+ Tools.sendServer("服务版本查询", msg);
+ }
+
+ }
+}
diff --git a/src/main/java/com/yutou/nas/utils/RedisTools.java b/src/main/java/com/yutou/nas/utils/RedisTools.java
new file mode 100644
index 0000000..5f24623
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/RedisTools.java
@@ -0,0 +1,298 @@
+package com.yutou.nas.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.JedisPoolConfig;
+import redis.clients.jedis.JedisPubSub;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Properties;
+import java.util.Set;
+
+
+public class RedisTools {
+ private static boolean isNotInstallRedis = false;
+ private static String host;
+ private static int port;
+ public static int TOKEN_TIMEOUT_DEFAULT = 360;
+
+ private RedisTools() {
+
+ }
+
+ // 写成静态代码块形式,只加载一次,节省资源
+ static {
+ //Properties properties = PropertyUtil.loadProperties("jedis.properties");
+ //host = properties.getProperty("redis.host");
+ //port = Integer.valueOf(properties.getProperty("redis.port"));
+ host = "127.0.0.1";
+ port = 6379;
+ }
+
+ public static boolean set(int dbIndex, String key, String value) {
+ try {
+ if (isNotInstallRedis) {
+ return false;
+ }
+ Jedis jedis = getRedis();
+ jedis.select(dbIndex);
+ String ret = jedis.set(key, value);
+ System.out.println("Redis set =" + ret);
+ jedis.close();
+ } catch (Exception e) {
+ // TODO: handle exception
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ public static boolean set(String key, String value) {
+ return set(0, key, value);
+ }
+
+ public static boolean set(String key, String value, int timeout) {
+ try {
+ if (isNotInstallRedis) {
+ return false;
+ }
+ Jedis jedis = getRedis();
+ if (timeout == -1) {
+ jedis.set(key, value);
+ } else {
+ jedis.setex(key, timeout, value);
+ }
+ jedis.close();
+ } catch (Exception e) {
+ // TODO: handle exception
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
+
+ public static String get(String key, int dbIndex) {
+ String value = "-999";
+ if (isNotInstallRedis) {
+ return value;
+ }
+ try (Jedis jedis = getRedis()) {
+ jedis.select(dbIndex);
+ value = jedis.get(key);
+ jedis.close();
+ } catch (Exception e) {
+ // TODO: handle exception
+ // e.printStackTrace();
+ }
+ return value;
+ }
+
+ public static String get(String key) {
+ return get(key, 0);
+ }
+
+ public static boolean remove(String key) {
+ return remove(key,0);
+ }
+
+ public static void removeLoginState(String uid) {
+ Jedis jedis = getRedis();
+ Set keys = jedis.keys("*");
+ for (String string : keys) {
+ if (string.equals(uid)) {
+ jedis.del(string);
+ }
+ }
+
+ }
+
+ public static String ping() {
+ Jedis jedis = getRedis();
+ String tmp = jedis.ping();
+ jedis.close();
+ return tmp;
+ }
+
+ public static boolean exists(String key, String value) {
+ if (isNotInstallRedis) {
+ return false;
+ }
+ Jedis jedis = getRedis();
+ boolean flag = value.equals(jedis.get(key));
+ jedis.close();
+ return flag;
+ }
+
+ public static Jedis getRedis() {
+ return new Jedis(host, port);
+ }
+
+ public static boolean remove(String key, int index) {
+ if (isNotInstallRedis) {
+ return false;
+ }
+ Jedis jedis = getRedis();
+ jedis.select(index);
+ Long i = jedis.del(key);
+ jedis.close();
+ if (i > 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private static class PropertyUtil {
+
+ // 加载property文件到io流里面
+ public static Properties loadProperties(String propertyFile) {
+ Properties properties = new Properties();
+ try {
+ InputStream is = PropertyUtil.class.getClassLoader().getResourceAsStream(propertyFile);
+ if (is == null) {
+ is = PropertyUtil.class.getClassLoader().getResourceAsStream(propertyFile);
+ }
+ properties.load(is);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return properties;
+ }
+ }
+
+ private static Jedis getPoolRedis() {
+ if (isNotInstallRedis) {
+ return null;
+ }
+ JedisPoolConfig poolConfig = new JedisPoolConfig();
+ poolConfig.setMaxIdle(0);
+ poolConfig.setMaxWaitMillis(1000);
+ JedisPool pool = new JedisPool(poolConfig, host);
+ return pool.getResource();
+ }
+
+ public static void pullMsg(String channel, String msg) {
+ System.out.println("1");
+ Jedis jedis = getPoolRedis();
+ System.out.println("2");
+ jedis.publish(channel, msg);
+ System.out.println("3");
+ jedis.close();
+ System.out.println("4");
+ }
+
+ private static boolean init = false;
+
+ public static void initRedisPoolSub() {
+ if (init)
+ return;
+ init = true;
+ System.out.println("初始化订阅");
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Jedis jedis = getPoolRedis();
+ if (jedis != null)
+ jedis.psubscribe(new Consumer(), "*");
+ }
+ }).start();
+
+ }
+
+ protected static class Consumer extends JedisPubSub {
+ @Override
+ public void onPMessage(String pattern, String channel, String message) {
+ super.onPMessage(pattern, channel, message);
+ System.out.println("onPMessage: channel=" + channel + " msg=" + message + " pattern=" + pattern);
+ switch (channel) {
+ case "system":
+ switch (message) {
+ case "openPC":
+ system("openPC", null);
+ break;
+ case "updateIP":
+ system("updateIP", null);
+ break;
+ }
+ break;
+ case "bot":
+ bot(message);
+ break;
+ case "cmd":
+ system("cmd", message);
+ break;
+ case "msg":
+ Tools.sendServer("来自服务姬的通知~",message);
+ break;
+ }
+ }
+
+ @Override
+ public void onMessage(String channel, String message) {
+ super.onMessage(channel, message);
+ System.out.println("onMessage: channel=" + channel + " msg=" + message);
+ }
+
+ public static void system(String type, String value) {
+ try {
+ String exec = null;
+ switch (type) {
+ case "openPC":
+ exec = "wakeonlan 00:D8:61:6F:02:2F";
+ break;
+ case "cmd":
+ exec = value;
+ break;
+ case "updateIP":
+ exec = "python3 /media/yutou/4t/public/Python/tools/ip.py";
+ break;
+ }
+ if (exec != null) {
+ Process process = Runtime.getRuntime().exec(exec);
+ processOut(process.getInputStream());
+ processOut(process.getErrorStream());
+ process.destroy();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+
+ public static void bot(String value) {
+ switch (value) {
+ case "getip":
+ JSONObject json = JSONObject.parseObject(HttpTools.get("https://api.asilu.com/ip/"));
+ String ip = json.getString("ip");
+ QQBotManager.getInstance().sendMessage("服务器IP:\n" + ip);
+ break;
+ }
+ }
+ }
+ public static void processOut(InputStream inputStream) {
+
+ String tmp;
+ StringBuilder str = new StringBuilder("null");
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ while ((tmp = reader.readLine()) != null) {
+ str.append(tmp).append("\n");
+ }
+ reader.close();
+ inputStream.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ System.out.println("cmd > " + str);
+ QQBotManager.getInstance().sendMessage(str.toString());
+ System.out.println("线程结束");
+ }
+ public static void main(String[] args) {
+ RedisTools.pullMsg("msg", "abc");
+ }
+}
diff --git a/src/main/java/com/yutou/nas/utils/Tools.java b/src/main/java/com/yutou/nas/utils/Tools.java
new file mode 100644
index 0000000..4b57020
--- /dev/null
+++ b/src/main/java/com/yutou/nas/utils/Tools.java
@@ -0,0 +1,385 @@
+package com.yutou.nas.utils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.yutou.nas.Controllers.UpdateIp;
+import com.yutou.nas.interfaces.DownloadInterface;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
+import java.util.Base64;
+import java.util.Date;
+import java.util.Random;
+
+public class Tools {
+ /**
+ * 设置Cookie
+ *
+ * @param response
+ * @param key
+ * @param value
+ * @param time
+ */
+ public static void setCookie(HttpServletResponse response, String key, String value, int time) {
+ Cookie cookie = new Cookie(key, value);
+ if (time != -1) {
+ cookie.setMaxAge(time);
+ }
+ cookie.setPath("/");
+ response.addCookie(cookie);
+
+ }
+
+ /**
+ * 获取Cookie
+ *
+ * @param request
+ * @param key
+ * @return
+ */
+ public static Cookie getCookie(HttpServletRequest request, String key) {
+ Cookie[] cookies = request.getCookies();
+ try {
+ for (Cookie cookie : cookies) {
+ if (key != null && cookie.getName().equals(key)) {
+ return cookie;
+ }
+ }
+ } catch (Exception ignored) {
+
+ }
+
+ return null;
+ }
+
+ /**
+ * 删除Cookie
+ *
+ * @param request
+ * @param response
+ * @param key
+ * @return
+ */
+ public static String deleteCookie(HttpServletRequest request, HttpServletResponse response, String key) {
+ for (Cookie cookie : request.getCookies()) {
+ if (cookie.getName().equals(key)) {
+ System.out.println("删除key=" + key);
+ cookie.setMaxAge(0);
+ cookie.setPath("/");
+ cookie.setValue(null);
+ response.addCookie(cookie);
+ }
+ }
+ return "ok";
+ }
+
+ public static void sendServer(String title, String msg) {
+ try {
+ System.out.println("title=" + title + " msg=" + msg);
+ HttpTools.post("https://sctapi.ftqq.com/SCT2619Tpqu93OYtQCrK4LOZYEfr2irm.send",
+ ("title="+URLEncoder.encode(title, "UTF-8") + "&desp=" + URLEncoder.encode(msg, "UTF-8")).getBytes(StandardCharsets.UTF_8),
+ null);
+ if (ConfigTools.load(ConfigTools.CONFIG, "model").equals("nas")) {
+ String img = null;
+ msg = msg.replace("
", "\n");
+ if (msg.contains("![logo]")) {
+ try {
+ img = msg.split("!\\[logo\\]\\(")[1].split("\\)")[0];
+ msg = msg.replace("![logo](" + img + ")", "");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if (img == null) {
+ QQBotManager.getInstance().sendMessage(title + "\n" + msg);
+ } else {
+ String finalMsg = msg;
+ String finalImg = img;
+ if (QQBotManager.getInstance().isLogin()) {
+ download(img, new DownloadInterface() {
+ @Override
+ public void onDownload(String file) {
+ super.onDownload(file);
+ QQBotManager.getInstance().sendMessage(new File(file), title + "\n" + finalMsg);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ super.onError(e);
+ QQBotManager.getInstance().sendMessage(title + "\n" + finalMsg + "\n" + finalImg);
+ }
+ });
+ }
+ }
+ } else if (!StringUtils.isEmpty(UpdateIp.nas_ip)) {
+ String img = null;
+ msg = msg.replace("
", "\n");
+ if (msg.contains("![logo]")) {
+ try {
+ img = msg.split("!\\[logo\\]\\(")[1].split("\\)")[0];
+ msg = msg.replace("![logo](" + img + ")", "");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ String url;
+ if (img == null) {
+ url = "http://" + UpdateIp.nas_ip + ":8000/qq/bot/send.do?msg=" + URLEncoder.encode((title + "\n" + msg), "UTF-8") + "&token=zIrsh9TUZP2lfRW753PannG49E7VJvor";
+ } else {
+ url = "http://" + UpdateIp.nas_ip + ":8000/qq/bot/send.do?msg=" + URLEncoder.encode((title + "\n" + msg), "UTF-8")
+ + "&imgUrl=" + img
+ + "&token=zIrsh9TUZP2lfRW753PannG49E7VJvor";
+ }
+ System.out.println(url);
+ HttpTools.get(url);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 获取项目路径
+ *
+ * @param request
+ * @return
+ */
+ public static String getPath(HttpServletRequest request) {
+ return request.getServletContext().getRealPath("/") + "/";
+ }
+
+ /**
+ * 获取客户端IP
+ *
+ * @param request
+ * @return
+ */
+ public static String getRemoteAddress(HttpServletRequest request) {
+ String ip = request.getHeader("x-forwarded-for");
+ if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
+ ip = request.getHeader("Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
+ ip = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {
+ ip = request.getRemoteAddr();
+ }
+ return ip;
+ }
+
+ /**
+ * N以内的不重复随机数
+ *
+ * @param min 最小值
+ * @param max 最大值
+ * @param n
+ * @return
+ */
+ public static int[] randomCommon(int min, int max, int n) {
+ int len = max - min + 1;
+ if (max < min || n > len) {
+ return new int[0];
+ }
+ // 初始化给定范围的待选数组
+ int[] source = new int[len];
+ for (int i = min; i < min + len; i++) {
+ source[i - min] = i;
+ }
+ int[] result = new int[n];
+ Random rd = new Random();
+ int index = 0;
+ for (int i = 0; i < result.length; i++) {
+ // 待选数组0到(len-2)随机一个下标
+ index = Math.abs(rd.nextInt() % len--);
+ // 将随机到的数放入结果集
+ result[i] = source[index];
+ // 将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换
+ source[index] = source[len];
+ }
+ return result;
+ }
+
+ public static int checkWebLogin(HttpServletRequest request) {
+ JSONArray array = new JSONArray();
+ if (RedisTools.get("bean") != null) {
+ array = JSONArray.parseArray(RedisTools.get("bean"));
+ }
+ if (array.contains(Tools.getRemoteAddress(request))) {
+ System.out.println("IP已被封禁");
+ return -100;
+ }
+ Cookie cookie = Tools.getCookie(request, "user");
+ if (cookie == null) {
+ return -1;
+ }
+ if (RedisTools.get(cookie.getValue()).equals("ok")) {
+ return 1;
+ }
+ return 0;
+ }
+
+ /**
+ * 保存上传的文件
+ *
+ * @param path 路径
+ * @param file 文件
+ * @return
+ * @throws Exception
+ */
+ public static String createFile(String path, MultipartFile file, String newFileName) throws Exception {
+ String savePath = new File("").getAbsolutePath() + File.separator + "html" + File.separator + path;
+ File servicePath = new File(savePath);
+ if (!servicePath.exists()) {
+ servicePath.mkdirs();
+ }
+ String fileName = file.getOriginalFilename();
+ if (newFileName != null) {
+ fileName = newFileName;
+ }
+ File saveFile = new File(savePath + "/" + fileName);
+ if (saveFile.exists()) {
+ if (!saveFile.delete()) {
+ saveFile = new File(savePath + "/" + fileName.replace(".", "_" + new Date().getTime() + "."));
+ }
+ }
+ file.transferTo(saveFile);
+ fileName = URLEncoder.encode(fileName, "UTF-8");
+ System.out.println("上传文件保存路径:" + saveFile.getAbsolutePath());
+ return path + fileName;
+ }
+
+ public static void download(String url, DownloadInterface downloadInterface) {
+ try {
+ HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
+ connection.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
+ connection.disconnect();
+ new File("tmp").mkdirs();
+ File file = new File("tmp" + File.separator + url.trim().split("/")[url.trim().split("/").length - 1]);
+ if (file.exists()) {
+ file.delete();
+ }
+ FileOutputStream outputStream = new FileOutputStream(file);
+ InputStream inputStream = connection.getInputStream();
+ byte[] bytes = new byte[4096];
+ int len;
+ while ((len = inputStream.read(bytes)) != -1) {
+ outputStream.write(bytes, 0, len);
+ outputStream.flush();
+ }
+ outputStream.close();
+ inputStream.close();
+ downloadInterface.onDownload(file.getAbsolutePath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ downloadInterface.onError(e);
+ }
+ }
+
+ /**
+ * 构造给前端的文件
+ *
+ * @param file 文件路径
+ * @return 前端获取的文件
+ */
+ public static ResponseEntity getFile(File file) {
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
+ try {
+ headers.add("Content-Disposition", "attachment; filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ headers.add("Content-Disposition", "attachment; filename=" + file.getName());
+ }
+ headers.add("Pragma", "no-cache");
+ headers.add("Expires", "0");
+ headers.add("Last-Modified", new Date().toString());
+ headers.add("ETag", String.valueOf(System.currentTimeMillis()));
+ return ResponseEntity.ok().headers(headers).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file));
+ }
+
+ public static String getFileMD5(File file) {
+ if (!file.isFile()) {
+ return null;
+ }
+ MessageDigest digest = null;
+ FileInputStream in = null;
+ byte buffer[] = new byte[1024];
+ int len;
+ try {
+ digest = MessageDigest.getInstance("MD5");
+ in = new FileInputStream(file);
+ while ((len = in.read(buffer, 0, 1024)) != -1) {
+ digest.update(buffer, 0, len);
+ }
+ in.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ return bytesToHexString(digest.digest());
+ }
+
+ private static String bytesToHexString(byte[] src) {
+ StringBuilder stringBuilder = new StringBuilder("");
+ if (src == null || src.length <= 0) {
+ return null;
+ }
+ for (byte aSrc : src) {
+ int v = aSrc & 0xFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() < 2) {
+ stringBuilder.append(0);
+ }
+ stringBuilder.append(hv);
+ }
+ return stringBuilder.toString();
+ }
+
+ public static String base64ToString(String base) {
+ base = base.replace(" ", "+");
+ try {
+ base = new String(Base64.getDecoder().decode(base.replace("\r\n", "").getBytes()));
+ } catch (Exception e) {
+ try {
+ base = URLDecoder.decode(base, "UTF-8");
+ base = base.replace(" ", "+");
+ base = new String(Base64.getDecoder().decode(base.replace("\r\n", "").getBytes()));
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+ return base;
+ }
+
+ /**
+ * 异常输出
+ *
+ * @param e 异常
+ * @return
+ */
+ public static String getExceptionString(Exception e) {
+ StringWriter writer = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(writer);
+ e.printStackTrace(printWriter);
+ printWriter.close();
+ return writer.toString();
+ }
+
+ public static String getToDayTime() {
+ return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+ }
+}
diff --git a/src/main/resources/mappers/BangumiItemDao.xml b/src/main/resources/mappers/BangumiItemDao.xml
new file mode 100644
index 0000000..ea62a20
--- /dev/null
+++ b/src/main/resources/mappers/BangumiItemDao.xml
@@ -0,0 +1,220 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+ id, bid, categories, author, title, titleKey
+
+
+
+
+ delete from bangumi_item
+ where id = #{id,jdbcType=INTEGER}
+
+
+ delete from bangumi_item
+
+
+
+
+
+ insert into bangumi_item (bid, categories, author,
+ title, titleKey)
+ values (#{bid,jdbcType=VARCHAR}, #{categories,jdbcType=VARCHAR}, #{author,jdbcType=VARCHAR},
+ #{title,jdbcType=VARCHAR}, #{titlekey,jdbcType=VARCHAR})
+
+
+ insert into bangumi_item
+
+
+ bid,
+
+
+ categories,
+
+
+ author,
+
+
+ title,
+
+
+ titleKey,
+
+
+
+
+ #{bid,jdbcType=VARCHAR},
+
+
+ #{categories,jdbcType=VARCHAR},
+
+
+ #{author,jdbcType=VARCHAR},
+
+
+ #{title,jdbcType=VARCHAR},
+
+
+ #{titlekey,jdbcType=VARCHAR},
+
+
+
+
+
+ update bangumi_item
+
+
+ id = #{record.id,jdbcType=INTEGER},
+
+
+ bid = #{record.bid,jdbcType=VARCHAR},
+
+
+ categories = #{record.categories,jdbcType=VARCHAR},
+
+
+ author = #{record.author,jdbcType=VARCHAR},
+
+
+ title = #{record.title,jdbcType=VARCHAR},
+
+
+ titleKey = #{record.titlekey,jdbcType=VARCHAR},
+
+
+
+
+
+
+
+ update bangumi_item
+ set id = #{record.id,jdbcType=INTEGER},
+ bid = #{record.bid,jdbcType=VARCHAR},
+ categories = #{record.categories,jdbcType=VARCHAR},
+ author = #{record.author,jdbcType=VARCHAR},
+ title = #{record.title,jdbcType=VARCHAR},
+ titleKey = #{record.titlekey,jdbcType=VARCHAR}
+
+
+
+
+
+ update bangumi_item
+
+
+ bid = #{bid,jdbcType=VARCHAR},
+
+
+ categories = #{categories,jdbcType=VARCHAR},
+
+
+ author = #{author,jdbcType=VARCHAR},
+
+
+ title = #{title,jdbcType=VARCHAR},
+
+
+ titleKey = #{titlekey,jdbcType=VARCHAR},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
+ update bangumi_item
+ set bid = #{bid,jdbcType=VARCHAR},
+ categories = #{categories,jdbcType=VARCHAR},
+ author = #{author,jdbcType=VARCHAR},
+ title = #{title,jdbcType=VARCHAR},
+ titleKey = #{titlekey,jdbcType=VARCHAR}
+ where id = #{id,jdbcType=INTEGER}
+
+
\ No newline at end of file
diff --git a/src/main/resources/mappers/BangumiListDao.xml b/src/main/resources/mappers/BangumiListDao.xml
new file mode 100644
index 0000000..2296870
--- /dev/null
+++ b/src/main/resources/mappers/BangumiListDao.xml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+ id, title, `status`
+
+
+
+
+ delete from bangumi_list
+ where id = #{id,jdbcType=INTEGER}
+
+
+ delete from bangumi_list
+
+
+
+
+
+ insert into bangumi_list (title, `status`)
+ values (#{title,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER})
+
+
+ insert into bangumi_list
+
+
+ title,
+
+
+ `status`,
+
+
+
+
+ #{title,jdbcType=VARCHAR},
+
+
+ #{status,jdbcType=INTEGER},
+
+
+
+
+
+ update bangumi_list
+
+
+ id = #{record.id,jdbcType=INTEGER},
+
+
+ title = #{record.title,jdbcType=VARCHAR},
+
+
+ `status` = #{record.status,jdbcType=INTEGER},
+
+
+
+
+
+
+
+ update bangumi_list
+ set id = #{record.id,jdbcType=INTEGER},
+ title = #{record.title,jdbcType=VARCHAR},
+ `status` = #{record.status,jdbcType=INTEGER}
+
+
+
+
+
+ update bangumi_list
+
+
+ title = #{title,jdbcType=VARCHAR},
+
+
+ `status` = #{status,jdbcType=INTEGER},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
+ update bangumi_list
+ set title = #{title,jdbcType=VARCHAR},
+ `status` = #{status,jdbcType=INTEGER}
+ where id = #{id,jdbcType=INTEGER}
+
+
\ No newline at end of file
diff --git a/src/main/resources/mappers/MusicDataDao.xml b/src/main/resources/mappers/MusicDataDao.xml
new file mode 100644
index 0000000..3ad5918
--- /dev/null
+++ b/src/main/resources/mappers/MusicDataDao.xml
@@ -0,0 +1,496 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+ id, artist, album, title, `comment`, `year`, track, disc_no, composer, artist_sort,
+ `file`, lastDir, isDir, bitRate, sampleRate, noOfSamples, channelCount, encodingType,
+ durationAsDouble, lossless, variableBitRate, md5
+
+
+
+
+ delete from music_data
+ where id = #{id,jdbcType=INTEGER}
+
+
+ delete from music_data
+
+
+
+
+
+ insert into music_data (artist, album, title,
+ `comment`, `year`, track,
+ disc_no, composer, artist_sort,
+ `file`, lastDir, isDir,
+ bitRate, sampleRate, noOfSamples,
+ channelCount, encodingType, durationAsDouble,
+ lossless, variableBitRate, md5
+ )
+ values (#{artist,jdbcType=VARCHAR}, #{album,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR},
+ #{comment,jdbcType=VARCHAR}, #{year,jdbcType=VARCHAR}, #{track,jdbcType=VARCHAR},
+ #{discNo,jdbcType=VARCHAR}, #{composer,jdbcType=VARCHAR}, #{artistSort,jdbcType=VARCHAR},
+ #{file,jdbcType=VARCHAR}, #{lastdir,jdbcType=VARCHAR}, #{isdir,jdbcType=INTEGER},
+ #{bitrate,jdbcType=INTEGER}, #{samplerate,jdbcType=INTEGER}, #{noofsamples,jdbcType=BIGINT},
+ #{channelcount,jdbcType=INTEGER}, #{encodingtype,jdbcType=VARCHAR}, #{durationasdouble,jdbcType=DOUBLE},
+ #{lossless,jdbcType=INTEGER}, #{variablebitrate,jdbcType=INTEGER}, #{md5,jdbcType=VARCHAR}
+ )
+
+
+ insert into music_data
+
+
+ artist,
+
+
+ album,
+
+
+ title,
+
+
+ `comment`,
+
+
+ `year`,
+
+
+ track,
+
+
+ disc_no,
+
+
+ composer,
+
+
+ artist_sort,
+
+
+ `file`,
+
+
+ lastDir,
+
+
+ isDir,
+
+
+ bitRate,
+
+
+ sampleRate,
+
+
+ noOfSamples,
+
+
+ channelCount,
+
+
+ encodingType,
+
+
+ durationAsDouble,
+
+
+ lossless,
+
+
+ variableBitRate,
+
+
+ md5,
+
+
+
+
+ #{artist,jdbcType=VARCHAR},
+
+
+ #{album,jdbcType=VARCHAR},
+
+
+ #{title,jdbcType=VARCHAR},
+
+
+ #{comment,jdbcType=VARCHAR},
+
+
+ #{year,jdbcType=VARCHAR},
+
+
+ #{track,jdbcType=VARCHAR},
+
+
+ #{discNo,jdbcType=VARCHAR},
+
+
+ #{composer,jdbcType=VARCHAR},
+
+
+ #{artistSort,jdbcType=VARCHAR},
+
+
+ #{file,jdbcType=VARCHAR},
+
+
+ #{lastdir,jdbcType=VARCHAR},
+
+
+ #{isdir,jdbcType=INTEGER},
+
+
+ #{bitrate,jdbcType=INTEGER},
+
+
+ #{samplerate,jdbcType=INTEGER},
+
+
+ #{noofsamples,jdbcType=BIGINT},
+
+
+ #{channelcount,jdbcType=INTEGER},
+
+
+ #{encodingtype,jdbcType=VARCHAR},
+
+
+ #{durationasdouble,jdbcType=DOUBLE},
+
+
+ #{lossless,jdbcType=INTEGER},
+
+
+ #{variablebitrate,jdbcType=INTEGER},
+
+
+ #{md5,jdbcType=VARCHAR},
+
+
+
+
+
+
+
+
+
+
+ update music_data
+
+
+ id = #{record.id,jdbcType=INTEGER},
+
+
+ artist = #{record.artist,jdbcType=VARCHAR},
+
+
+ album = #{record.album,jdbcType=VARCHAR},
+
+
+ title = #{record.title,jdbcType=VARCHAR},
+
+
+ `comment` = #{record.comment,jdbcType=VARCHAR},
+
+
+ `year` = #{record.year,jdbcType=VARCHAR},
+
+
+ track = #{record.track,jdbcType=VARCHAR},
+
+
+ disc_no = #{record.discNo,jdbcType=VARCHAR},
+
+
+ composer = #{record.composer,jdbcType=VARCHAR},
+
+
+ artist_sort = #{record.artistSort,jdbcType=VARCHAR},
+
+
+ `file` = #{record.file,jdbcType=VARCHAR},
+
+
+ lastDir = #{record.lastdir,jdbcType=VARCHAR},
+
+
+ isDir = #{record.isdir,jdbcType=INTEGER},
+
+
+ bitRate = #{record.bitrate,jdbcType=INTEGER},
+
+
+ sampleRate = #{record.samplerate,jdbcType=INTEGER},
+
+
+ noOfSamples = #{record.noofsamples,jdbcType=BIGINT},
+
+
+ channelCount = #{record.channelcount,jdbcType=INTEGER},
+
+
+ encodingType = #{record.encodingtype,jdbcType=VARCHAR},
+
+
+ durationAsDouble = #{record.durationasdouble,jdbcType=DOUBLE},
+
+
+ lossless = #{record.lossless,jdbcType=INTEGER},
+
+
+ variableBitRate = #{record.variablebitrate,jdbcType=INTEGER},
+
+
+ md5 = #{record.md5,jdbcType=VARCHAR},
+
+
+
+
+
+
+
+ update music_data
+ set id = #{record.id,jdbcType=INTEGER},
+ artist = #{record.artist,jdbcType=VARCHAR},
+ album = #{record.album,jdbcType=VARCHAR},
+ title = #{record.title,jdbcType=VARCHAR},
+ `comment` = #{record.comment,jdbcType=VARCHAR},
+ `year` = #{record.year,jdbcType=VARCHAR},
+ track = #{record.track,jdbcType=VARCHAR},
+ disc_no = #{record.discNo,jdbcType=VARCHAR},
+ composer = #{record.composer,jdbcType=VARCHAR},
+ artist_sort = #{record.artistSort,jdbcType=VARCHAR},
+ `file` = #{record.file,jdbcType=VARCHAR},
+ lastDir = #{record.lastdir,jdbcType=VARCHAR},
+ isDir = #{record.isdir,jdbcType=INTEGER},
+ bitRate = #{record.bitrate,jdbcType=INTEGER},
+ sampleRate = #{record.samplerate,jdbcType=INTEGER},
+ noOfSamples = #{record.noofsamples,jdbcType=BIGINT},
+ channelCount = #{record.channelcount,jdbcType=INTEGER},
+ encodingType = #{record.encodingtype,jdbcType=VARCHAR},
+ durationAsDouble = #{record.durationasdouble,jdbcType=DOUBLE},
+ lossless = #{record.lossless,jdbcType=INTEGER},
+ variableBitRate = #{record.variablebitrate,jdbcType=INTEGER},
+ md5 = #{record.md5,jdbcType=VARCHAR}
+
+
+
+
+
+ update music_data
+
+
+ artist = #{artist,jdbcType=VARCHAR},
+
+
+ album = #{album,jdbcType=VARCHAR},
+
+
+ title = #{title,jdbcType=VARCHAR},
+
+
+ `comment` = #{comment,jdbcType=VARCHAR},
+
+
+ `year` = #{year,jdbcType=VARCHAR},
+
+
+ track = #{track,jdbcType=VARCHAR},
+
+
+ disc_no = #{discNo,jdbcType=VARCHAR},
+
+
+ composer = #{composer,jdbcType=VARCHAR},
+
+
+ artist_sort = #{artistSort,jdbcType=VARCHAR},
+
+
+ `file` = #{file,jdbcType=VARCHAR},
+
+
+ lastDir = #{lastdir,jdbcType=VARCHAR},
+
+
+ isDir = #{isdir,jdbcType=INTEGER},
+
+
+ bitRate = #{bitrate,jdbcType=INTEGER},
+
+
+ sampleRate = #{samplerate,jdbcType=INTEGER},
+
+
+ noOfSamples = #{noofsamples,jdbcType=BIGINT},
+
+
+ channelCount = #{channelcount,jdbcType=INTEGER},
+
+
+ encodingType = #{encodingtype,jdbcType=VARCHAR},
+
+
+ durationAsDouble = #{durationasdouble,jdbcType=DOUBLE},
+
+
+ lossless = #{lossless,jdbcType=INTEGER},
+
+
+ variableBitRate = #{variablebitrate,jdbcType=INTEGER},
+
+
+ md5 = #{md5,jdbcType=VARCHAR},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
+ update music_data
+ set artist = #{artist,jdbcType=VARCHAR},
+ album = #{album,jdbcType=VARCHAR},
+ title = #{title,jdbcType=VARCHAR},
+ `comment` = #{comment,jdbcType=VARCHAR},
+ `year` = #{year,jdbcType=VARCHAR},
+ track = #{track,jdbcType=VARCHAR},
+ disc_no = #{discNo,jdbcType=VARCHAR},
+ composer = #{composer,jdbcType=VARCHAR},
+ artist_sort = #{artistSort,jdbcType=VARCHAR},
+ `file` = #{file,jdbcType=VARCHAR},
+ lastDir = #{lastdir,jdbcType=VARCHAR},
+ isDir = #{isdir,jdbcType=INTEGER},
+ bitRate = #{bitrate,jdbcType=INTEGER},
+ sampleRate = #{samplerate,jdbcType=INTEGER},
+ noOfSamples = #{noofsamples,jdbcType=BIGINT},
+ channelCount = #{channelcount,jdbcType=INTEGER},
+ encodingType = #{encodingtype,jdbcType=VARCHAR},
+ durationAsDouble = #{durationasdouble,jdbcType=DOUBLE},
+ lossless = #{lossless,jdbcType=INTEGER},
+ variableBitRate = #{variablebitrate,jdbcType=INTEGER},
+ md5 = #{md5,jdbcType=VARCHAR}
+ where id = #{id,jdbcType=INTEGER}
+
+
+ TRUNCATE music_data;
+
+
\ No newline at end of file
diff --git a/src/main/resources/mappers/MusicFavoritesDao.xml b/src/main/resources/mappers/MusicFavoritesDao.xml
new file mode 100644
index 0000000..8fb98d8
--- /dev/null
+++ b/src/main/resources/mappers/MusicFavoritesDao.xml
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+ id, favoriteId, musis_md5, sub_time
+
+
+
+
+ delete from music_favorites
+ where id = #{id,jdbcType=INTEGER}
+
+
+ delete from music_favorites
+
+
+
+
+
+ insert into music_favorites (favoriteId, musis_md5, sub_time
+ )
+ values (#{favoriteid,jdbcType=INTEGER}, #{musisMd5,jdbcType=VARCHAR}, #{subTime,jdbcType=TIMESTAMP}
+ )
+
+
+ insert into music_favorites
+
+
+ favoriteId,
+
+
+ musis_md5,
+
+
+ sub_time,
+
+
+
+
+ #{favoriteid,jdbcType=INTEGER},
+
+
+ #{musisMd5,jdbcType=VARCHAR},
+
+
+ #{subTime,jdbcType=TIMESTAMP},
+
+
+
+
+
+ update music_favorites
+
+
+ id = #{record.id,jdbcType=INTEGER},
+
+
+ favoriteId = #{record.favoriteid,jdbcType=INTEGER},
+
+
+ musis_md5 = #{record.musisMd5,jdbcType=VARCHAR},
+
+
+ sub_time = #{record.subTime,jdbcType=TIMESTAMP},
+
+
+
+
+
+
+
+ update music_favorites
+ set id = #{record.id,jdbcType=INTEGER},
+ favoriteId = #{record.favoriteid,jdbcType=INTEGER},
+ musis_md5 = #{record.musisMd5,jdbcType=VARCHAR},
+ sub_time = #{record.subTime,jdbcType=TIMESTAMP}
+
+
+
+
+
+ update music_favorites
+
+
+ favoriteId = #{favoriteid,jdbcType=INTEGER},
+
+
+ musis_md5 = #{musisMd5,jdbcType=VARCHAR},
+
+
+ sub_time = #{subTime,jdbcType=TIMESTAMP},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
+ update music_favorites
+ set favoriteId = #{favoriteid,jdbcType=INTEGER},
+ musis_md5 = #{musisMd5,jdbcType=VARCHAR},
+ sub_time = #{subTime,jdbcType=TIMESTAMP}
+ where id = #{id,jdbcType=INTEGER}
+
+
\ No newline at end of file
diff --git a/src/main/resources/mappers/MusicFavoritesDirDao.xml b/src/main/resources/mappers/MusicFavoritesDirDao.xml
new file mode 100644
index 0000000..73afb7d
--- /dev/null
+++ b/src/main/resources/mappers/MusicFavoritesDirDao.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ and ${criterion.condition}
+
+
+ and ${criterion.condition} #{criterion.value}
+
+
+ and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+
+
+ and ${criterion.condition}
+
+ #{listItem}
+
+
+
+
+
+
+
+
+
+
+ id, title
+
+
+
+
+ delete from music_favorites_dir
+ where id = #{id,jdbcType=INTEGER}
+
+
+ delete from music_favorites_dir
+
+
+
+
+
+ insert into music_favorites_dir (title)
+ values (#{title,jdbcType=VARCHAR})
+
+
+ insert into music_favorites_dir
+
+
+ title,
+
+
+
+
+ #{title,jdbcType=VARCHAR},
+
+
+
+
+
+ update music_favorites_dir
+
+
+ id = #{record.id,jdbcType=INTEGER},
+
+
+ title = #{record.title,jdbcType=VARCHAR},
+
+
+
+
+
+
+
+ update music_favorites_dir
+ set id = #{record.id,jdbcType=INTEGER},
+ title = #{record.title,jdbcType=VARCHAR}
+
+
+
+
+
+ update music_favorites_dir
+
+
+ title = #{title,jdbcType=VARCHAR},
+
+
+ where id = #{id,jdbcType=INTEGER}
+
+
+ update music_favorites_dir
+ set title = #{title,jdbcType=VARCHAR}
+ where id = #{id,jdbcType=INTEGER}
+
+
\ No newline at end of file
diff --git a/src/test/java/com/yutou/nas/NasApplicationTests.java b/src/test/java/com/yutou/nas/NasApplicationTests.java
new file mode 100644
index 0000000..8465593
--- /dev/null
+++ b/src/test/java/com/yutou/nas/NasApplicationTests.java
@@ -0,0 +1,13 @@
+package com.yutou.nas;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class NasApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}