Reworked how mp3s are being read and loaded int player

This commit is contained in:
Isaac Parenteau
2019-10-15 00:19:48 -05:00
parent 68a472d804
commit 232fd1746d
11 changed files with 221 additions and 188 deletions

52
pom.xml
View File

@ -19,12 +19,12 @@
<properties> <properties>
<flyway.version>6.0.3</flyway.version> <flyway.version>6.0.6</flyway.version>
<mariadb.version>2.4.4</mariadb.version> <mariadb.version>2.5.0</mariadb.version>
<hibernate.version>5.4.4.Final</hibernate.version> <hibernate.version>5.4.6.Final</hibernate.version>
<spring.version>5.1.9.RELEASE</spring.version> <spring.version>5.2.0.RELEASE</spring.version>
<spring.boot.version>2.1.8.RELEASE</spring.boot.version> <spring.boot.version>2.1.9.RELEASE</spring.boot.version>
<spring.data.version>2.1.10.RELEASE</spring.data.version> <spring.data.version>2.2.0.RELEASE</spring.data.version>
<log4j.version>2.12.1</log4j.version> <log4j.version>2.12.1</log4j.version>
<slf4j.version>1.7.28</slf4j.version> <slf4j.version>1.7.28</slf4j.version>
<maven.enforcer.version>3.0.0-M2</maven.enforcer.version> <maven.enforcer.version>3.0.0-M2</maven.enforcer.version>
@ -38,7 +38,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId> <artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M2</version> <version>${maven.enforcer.version}</version>
<configuration> <configuration>
<rules> <rules>
<dependencyConvergence /> <dependencyConvergence />
@ -150,23 +150,11 @@
<version>1.0.5-RELEASE</version> <version>1.0.5-RELEASE</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.22</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.dv8tion/JDA2 --> <!-- https://mvnrepository.com/artifact/net.dv8tion/JDA2 -->
<dependency> <dependency>
<groupId>net.dv8tion</groupId> <groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId> <artifactId>JDA</artifactId>
<version>4.0.0_50</version> <version>4.0.0_52</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
@ -294,43 +282,55 @@
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId> <artifactId>jackson-core</artifactId>
<version>2.10.0.pr3</version> <version>2.10.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId> <artifactId>jackson-databind</artifactId>
<version>2.10.0.pr3</version> <version>2.10.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId> <artifactId>jackson-annotations</artifactId>
<version>2.10.0.pr3</version> <version>2.10.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.xml.bind</groupId> <groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId> <artifactId>jaxb-api</artifactId>
<version>2.2.11</version> <version>2.3.1</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core -->
<dependency> <dependency>
<groupId>com.sun.xml.bind</groupId> <groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId> <artifactId>jaxb-core</artifactId>
<version>2.2.11</version> <version>2.3.0.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sun.xml.bind</groupId> <groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId> <artifactId>jaxb-impl</artifactId>
<version>2.2.11</version> <version>2.3.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.activation</groupId> <groupId>javax.activation</groupId>
<artifactId>activation</artifactId> <artifactId>activation</artifactId>
<version>1.1.1</version> <version>1.1.1</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/com.mpatric/mp3agic -->
<dependency>
<groupId>com.mpatric</groupId>
<artifactId>mp3agic</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies> </dependencies>
<distributionManagement> <distributionManagement>

View File

@ -25,7 +25,7 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS. * ENHANCEMENTS, OR MODIFICATIONS.
*/ */
package net.locusworks.discord.eighttrack.handlers; package net.locusworks.discord.eighttrack.audio;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@ -25,23 +25,22 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS. * ENHANCEMENTS, OR MODIFICATIONS.
*/ */
package net.locusworks.discord.eighttrack.handlers; package net.locusworks.discord.eighttrack.audio;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Arrays;
import org.apache.tika.exception.TikaException; import java.util.UUID;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.mp3.Mp3Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import com.mpatric.mp3agic.ID3v2;
import com.mpatric.mp3agic.InvalidDataException;
import com.mpatric.mp3agic.Mp3File;
import com.mpatric.mp3agic.UnsupportedTagException;
@Component @Component
public class Mp3UploadHandler { public class Mp3UploadHandler {
@ -53,6 +52,7 @@ public class Mp3UploadHandler {
public Mp3UploadResults parse(InputStream is) throws IOException { public Mp3UploadResults parse(InputStream is) throws IOException {
byte[] data; byte[] data;
String id = null;
try(InputStream in = is; ByteArrayOutputStream baos = new ByteArrayOutputStream()) { try(InputStream in = is; ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
int read = 0; int read = 0;
byte[] buffer = new byte[1024 * 1024]; byte[] buffer = new byte[1024 * 1024];
@ -60,29 +60,28 @@ public class Mp3UploadHandler {
baos.write(buffer, 0, read); baos.write(buffer, 0, read);
} }
data = baos.toByteArray(); data = baos.toByteArray();
}
try (InputStream in = new ByteArrayInputStream(data)) { id = UUID.nameUUIDFromBytes(data).toString();
BodyContentHandler handler = new BodyContentHandler(); Files.write(Paths.get(id), data);
Metadata metadata = new Metadata(); Mp3File mp3 = new Mp3File(Paths.get(id));
ParseContext context = new ParseContext(); ID3v2 tag = mp3.getId3v2Tag();
Mp3Parser parser = new Mp3Parser(); return new Mp3UploadResults(tag, data);
parser.parse(in, handler, metadata, context);
return new Mp3UploadResults(metadata, data);
} catch (Exception ex) { } catch (Exception ex) {
throw new IOException(ex); return new Mp3UploadResults(ex);
} finally {
if (id != null) {
Files.deleteIfExists(Paths.get(id));
}
} }
} }
public static void main(String args[]) throws IOException, SAXException, TikaException { public static void main(String args[]) throws IOException, SAXException, UnsupportedTagException, InvalidDataException {
String file = "E:\\Music2\\Alan Walker\\Itinerary_ Dallas.pdf"; String file = "E:\\Music2\\AronChupa\\01 I'm an Albatraoz.mp3";
Path path = Paths.get(file); Path path = Paths.get(file);
Mp3UploadHandler fuh = new Mp3UploadHandler(); Mp3UploadHandler fuh = new Mp3UploadHandler();
fuh.parse(path); System.out.println(fuh.parse(path));
} }
} }

View File

@ -25,34 +25,12 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS. * ENHANCEMENTS, OR MODIFICATIONS.
*/ */
package net.locusworks.discord.eighttrack.handlers; package net.locusworks.discord.eighttrack.audio;
import org.apache.tika.metadata.Metadata; import com.mpatric.mp3agic.ID3v2;
public class Mp3UploadResults { public class Mp3UploadResults {
private enum MetaDataField {
GENRE("xmpDM:genre"),
COMPOSER("xmpDM:composer"),
ALBUM("xmpDM:album"),
TRACK_NUMBER("xmpDM:trackNumber"),
DISC_NUMBER("xmpDM:discNumber"),
ARTIST("xmpDM:artist"),
TITLE("title"),
RELEASE_DATE("xmpDM:releaseDate"),
DURATION("xmpDM:duration");
private String value;
private MetaDataField(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
private String genre; private String genre;
private String composure; private String composure;
private String album; private String album;
@ -61,29 +39,28 @@ public class Mp3UploadResults {
private String artist; private String artist;
private String title; private String title;
private String releaseDate; private String releaseDate;
private Long duration;
private byte[] rawData; private byte[] rawData;
private Throwable err;
public Mp3UploadResults( Metadata metadata, byte[] data) { public Mp3UploadResults(ID3v2 tag, byte[] data) {
parseResults(metadata); parseResults(tag);
this.rawData = data; this.rawData = data;
} }
private void parseResults(Metadata metadata) { public Mp3UploadResults(Throwable err) {
genre = metadata.get(MetaDataField.GENRE.getValue()); this.err = err;
composure = metadata.get(MetaDataField.COMPOSER.getValue()); }
album = metadata.get(MetaDataField.ALBUM.getValue());
trackNumber = metadata.get(MetaDataField.TRACK_NUMBER.getValue());
discNumber = metadata.get(MetaDataField.DISC_NUMBER.getValue());
artist = metadata.get(MetaDataField.ARTIST.getValue());
title = metadata.get(MetaDataField.TITLE.getValue());
releaseDate = metadata.get(MetaDataField.RELEASE_DATE.getValue());
String durationStr = metadata.get(MetaDataField.DURATION.getValue()).trim(); private void parseResults(ID3v2 metadata) {
if (durationStr != null) { genre = metadata.getGenreDescription();
duration = Double.valueOf(metadata.get(MetaDataField.DURATION.getValue())).longValue(); composure = metadata.getComposer();
} album = metadata.getAlbum();
trackNumber = metadata.getTrack();
discNumber = metadata.getPartOfSet();
artist = metadata.getArtist();
title = metadata.getTitle();
releaseDate = metadata.getDate();
} }
public final byte[] getData() { public final byte[] getData() {
@ -146,23 +123,24 @@ public class Mp3UploadResults {
return releaseDate; return releaseDate;
} }
/**
* @return the duration
*/
public final Long getDuration() {
return duration;
}
public final String getDurationFormat() {
return dateFormat(duration);
}
public boolean validFile() { public boolean validFile() {
return getTitle() != null && !getTitle().isEmpty(); return (getTitle() != null && !getTitle().isEmpty() && getArtist() != null && !getArtist().trim().isEmpty()) || this.err != null;
}
public boolean hasError() {
return this.err != null;
}
public Throwable getError() {
return this.err;
} }
@Override @Override
public String toString() { public String toString() {
if (this.hasError()) {
return "Unable to parse file due to exception: " + this.err.getMessage();
}
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (getTitle() != null) if (getTitle() != null)
sb.append(String.format("%-10s: %s%n", "Title", getTitle())); sb.append(String.format("%-10s: %s%n", "Title", getTitle()));
@ -185,32 +163,10 @@ public class Mp3UploadResults {
if (getGenre() != null) if (getGenre() != null)
sb.append(String.format("%-10s: %s%n", "Genre", getGenre())); sb.append(String.format("%-10s: %s%n", "Genre", getGenre()));
if (duration != null)
sb.append(String.format("%-10s: %s%n", "Duration", dateFormat(getDuration())));
return sb.toString(); return sb.toString();
} }
public void clear() { public void clear() {
rawData = new byte[0]; rawData = new byte[0];
} }
private String dateFormat(long timeInMilliSeconds) {
long seconds = timeInMilliSeconds / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
long sec = seconds % 60;
long min = minutes % 60;
long hr = hours % 24;
String time = "" + sec;
if (min > 0) time = min + ":" + time;
if (hr > 0) time = hr + ":" + time;
if (days > 0) time = days + ":" + time;
return time;
}
} }

View File

@ -0,0 +1,74 @@
package net.locusworks.discord.eighttrack.audio;
import java.lang.reflect.Field;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.function.Consumer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
public class TrackManager extends DefaultAudioPlayer {
private LinkedBlockingDeque<String> queue;
private AudioPlayerManager playerManager;
private TrackScheduler trackScheduler;
private String currentItem;
public TrackManager() {
super(new DefaultAudioPlayerManager());
this.queue = new LinkedBlockingDeque<String>();
this.trackScheduler = new TrackScheduler();
addListener(trackScheduler);
try {
Field f = this.getClass().getSuperclass().getDeclaredField("manager");
f.setAccessible(true);
this.playerManager = (AudioPlayerManager) f.get(this);
} catch (SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
AudioSourceManagers.registerLocalSource(this.playerManager);
}
public void queueLast(String track) {
queue.addLast(track);
}
public void queueNext(String track) {
queue.addFirst(track);
}
public boolean hasTracks() {
return queue.peek() != null && !queue.isEmpty();
}
public String getCurrentItem() {
return currentItem;
}
public AudioTrack play() {
if (!queue.isEmpty()) {
try {
currentItem = queue.poll();
playerManager.loadItem(currentItem, trackScheduler).get();
return trackScheduler.getNextTrack();
} catch (InterruptedException | ExecutionException e) {}
}
return null;
}
public void setFinishedCallback(Consumer<AudioTrackEndReason> callback) {
trackScheduler.setFinishedCallback(callback);
}
public void clearTracks() {
queue.clear();
trackScheduler.clearTracks();
}
}

View File

@ -25,7 +25,7 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS. * ENHANCEMENTS, OR MODIFICATIONS.
*/ */
package net.locusworks.discord.eighttrack.scheduler; package net.locusworks.discord.eighttrack.audio;
import java.util.Deque; import java.util.Deque;
import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.LinkedBlockingDeque;

View File

@ -1,5 +0,0 @@
package net.locusworks.discord.eighttrack.enums;
public enum UserCommands {
}

View File

@ -47,6 +47,7 @@ import net.dv8tion.jda.api.events.guild.GuildJoinEvent;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.locusworks.discord.eighttrack.audio.Mp3UploadHandler;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild; import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.services.ConfigurationService; import net.locusworks.discord.eighttrack.services.ConfigurationService;
import net.locusworks.discord.eighttrack.services.GuildMusicService; import net.locusworks.discord.eighttrack.services.GuildMusicService;
@ -147,7 +148,7 @@ public class DiscordEventHandler extends ListenerAdapter {
String command = commands.remove(0); String command = commands.remove(0);
switch(command) { switch(command) {
case "-upload": case "+upload":
gmh.upload(event); gmh.upload(event);
return; return;
case "-play": case "-play":

View File

@ -29,7 +29,6 @@ package net.locusworks.discord.eighttrack.handlers;
import java.awt.Color; import java.awt.Color;
import java.io.IOException; import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
@ -46,14 +45,12 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.GuildChannel; import net.dv8tion.jda.api.entities.GuildChannel;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Message.Attachment; import net.dv8tion.jda.api.entities.Message.Attachment;
@ -64,13 +61,16 @@ import net.dv8tion.jda.api.exceptions.ErrorResponseException;
import net.dv8tion.jda.api.managers.AudioManager; import net.dv8tion.jda.api.managers.AudioManager;
import net.dv8tion.jda.api.requests.ErrorResponse; import net.dv8tion.jda.api.requests.ErrorResponse;
import net.locusworks.crypto.utils.HashUtils; import net.locusworks.crypto.utils.HashUtils;
import net.locusworks.discord.eighttrack.audio.EightTrackAudioSendHandler;
import net.locusworks.discord.eighttrack.audio.Mp3UploadHandler;
import net.locusworks.discord.eighttrack.audio.Mp3UploadResults;
import net.locusworks.discord.eighttrack.audio.TrackManager;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild; import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist; import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong; import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong;
import net.locusworks.discord.eighttrack.database.entities.GuildSong; import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.database.entities.Song; import net.locusworks.discord.eighttrack.database.entities.Song;
import net.locusworks.discord.eighttrack.listeners.ReactionListener; import net.locusworks.discord.eighttrack.listeners.ReactionListener;
import net.locusworks.discord.eighttrack.scheduler.TrackScheduler;
import net.locusworks.discord.eighttrack.services.GuildSongRepoService; import net.locusworks.discord.eighttrack.services.GuildSongRepoService;
import net.locusworks.discord.eighttrack.utils.Reactions; import net.locusworks.discord.eighttrack.utils.Reactions;
import net.locusworks.logger.ApplicationLogger; import net.locusworks.logger.ApplicationLogger;
@ -79,10 +79,7 @@ import net.locusworks.logger.ApplicationLoggerFactory;
public class GuildMusicHandler { public class GuildMusicHandler {
private Path musicDir; private Path musicDir;
private TrackScheduler ts;
private DefaultAudioPlayerManager apm;
private ApplicationLogger logger; private ApplicationLogger logger;
private AudioPlayer player;
private AtomicBoolean playing; private AtomicBoolean playing;
private Long voiceChannelId; private Long voiceChannelId;
@ -96,6 +93,8 @@ public class GuildMusicHandler {
private GuildPlaylist currentPlaylist; private GuildPlaylist currentPlaylist;
private TrackManager trackManager;
public GuildMusicHandler(Path musicDir, long guildId, Mp3UploadHandler uploadHandler, ReactionHandler reactionHandler, GuildSongRepoService guildSongRepoService) throws IOException { public GuildMusicHandler(Path musicDir, long guildId, Mp3UploadHandler uploadHandler, ReactionHandler reactionHandler, GuildSongRepoService guildSongRepoService) throws IOException {
this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class); this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class);
this.playing = new AtomicBoolean(false); this.playing = new AtomicBoolean(false);
@ -105,13 +104,7 @@ public class GuildMusicHandler {
this.guildSongRepoService = guildSongRepoService; this.guildSongRepoService = guildSongRepoService;
this.guildId = guildId; this.guildId = guildId;
this.reactionHandler = reactionHandler; this.reactionHandler = reactionHandler;
this.apm = new DefaultAudioPlayerManager(); this.trackManager = new TrackManager();
AudioSourceManagers.registerLocalSource(apm);
this.player = apm.createPlayer();
this.ts = new TrackScheduler();
player.addListener(ts);
} }
public void playlist(GuildMessageReceivedEvent event, List<String> commands) throws Exception { public void playlist(GuildMessageReceivedEvent event, List<String> commands) throws Exception {
@ -168,10 +161,10 @@ public class GuildMusicHandler {
return; return;
} }
} }
if (ts.peek() == null) { if (!trackManager.hasTracks()) {
loadRandomSong(); loadRandomSong();
} }
AudioTrack track = ts.peek(); AudioTrack track = trackManager.play();
MessageEmbed embed = new EmbedBuilder() MessageEmbed embed = new EmbedBuilder()
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl()) .setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
.setTitle("Next Up:") .setTitle("Next Up:")
@ -183,7 +176,7 @@ public class GuildMusicHandler {
public void repeat(GuildMessageReceivedEvent event) throws Exception { public void repeat(GuildMessageReceivedEvent event) throws Exception {
next(event); next(event);
ts.setFinishedCallback((ater) -> { trackManager.setFinishedCallback((ater) -> {
if (!playing.get()) return; if (!playing.get()) return;
try { try {
next(event); next(event);
@ -222,7 +215,7 @@ public class GuildMusicHandler {
} }
public void stop(GuildMessageReceivedEvent event, boolean stoppedFromRepeat) { public void stop(GuildMessageReceivedEvent event, boolean stoppedFromRepeat) {
player.stopTrack(); trackManager.stopTrack();
voiceChannelId = null; voiceChannelId = null;
if (!stoppedFromRepeat) { if (!stoppedFromRepeat) {
currentPlaylist = null; currentPlaylist = null;
@ -261,7 +254,7 @@ public class GuildMusicHandler {
AudioManager manager = event.getGuild().getAudioManager(); AudioManager manager = event.getGuild().getAudioManager();
manager.openAudioConnection(vc); manager.openAudioConnection(vc);
manager.setSendingHandler(new EightTrackAudioSendHandler(player)); manager.setSendingHandler(new EightTrackAudioSendHandler(trackManager));
if (commands != null && !commands.isEmpty()) { if (commands != null && !commands.isEmpty()) {
String uuid = commands.remove(0); String uuid = commands.remove(0);
@ -273,14 +266,18 @@ public class GuildMusicHandler {
stop(event, true); stop(event, true);
} }
if (!ts.hasTracks()) { if (!trackManager.hasTracks()) {
loadRandomSong(); loadRandomSong();
} }
if (ts.hasTracks()) { if (trackManager.hasTracks()) {
lastPlayed = OffsetDateTime.now(); lastPlayed = OffsetDateTime.now();
AudioTrack track = ts.getNextTrack(); AudioTrack track = trackManager.play();
if (track == null) {
logger.warn("Unable to find track: " + trackManager.getCurrentItem()) ;
return;
}
MessageEmbed embed = new EmbedBuilder() MessageEmbed embed = new EmbedBuilder()
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl()) .setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
@ -290,7 +287,7 @@ public class GuildMusicHandler {
.build(); .build();
event.getChannel().sendMessage(embed).queue(); event.getChannel().sendMessage(embed).queue();
player.playTrack(track); trackManager.playTrack(track);
} }
} }
@ -361,6 +358,15 @@ public class GuildMusicHandler {
public void adminPlaylist(GuildMessageReceivedEvent event, List<String> commands) { public void adminPlaylist(GuildMessageReceivedEvent event, List<String> commands) {
if(!isAdmin(event)) return; if(!isAdmin(event)) return;
if (!checkCommands(event, commands, event.getMember().getAsMention() + ", valid commands are +playst list, play, delete")) return;
String command = commands.remove(0);
switch (command) {
case "list":
listAllPlaylists(event);
return;
}
} }
@ -393,11 +399,11 @@ public class GuildMusicHandler {
return; return;
} }
ts.clearTracks(); trackManager.clearTracks();
for(GuildPlaylistSong gpls : guildSongRepoService.getGuildPlaylistSongRepo().findByGuildPlaylist(currentPlaylist)) { for(GuildPlaylistSong gpls : guildSongRepoService.getGuildPlaylistSongRepo().findByGuildPlaylist(currentPlaylist)) {
Song s = gpls.getGuildSong().getSong(); Song s = gpls.getGuildSong().getSong();
apm.loadItem(s.getFilePath(), ts).get(); trackManager.queueLast(s.getFilePath());
} }
playing.set(false); playing.set(false);
@ -471,8 +477,6 @@ public class GuildMusicHandler {
song.setArtist(result.getArtist()); song.setArtist(result.getArtist());
song.setDateAdded(new Date()); song.setDateAdded(new Date());
song.setDiscNumber(result.getDiscNumber()); song.setDiscNumber(result.getDiscNumber());
if (result.getDuration() != null)
song.setDuration(BigInteger.valueOf(result.getDuration()));
song.setFileHash(hash); song.setFileHash(hash);
song.setFilePath(output.toAbsolutePath().toString()); song.setFilePath(output.toAbsolutePath().toString());
song.setGenre(result.getGenre()); song.setGenre(result.getGenre());
@ -494,21 +498,23 @@ public class GuildMusicHandler {
guildSongRepoService.getGuildSongRepo().save(gs); guildSongRepoService.getGuildSongRepo().save(gs);
MessageEmbed embed = new EmbedBuilder() EmbedBuilder builder = new EmbedBuilder()
.setColor(Color.GREEN) .setColor(Color.GREEN)
.setThumbnail(event.getGuild().getIconUrl()) .setThumbnail(event.getGuild().getIconUrl())
.setTitle("Upload Results for " + fileName) .setTitle("Upload Results for " + fileName)
.addField("Title", result.getTitle(), true)
.addField("Artist", result.getArtist(), true)
.addField("Album", result.getAlbum(), true)
.addField("Track", result.getTrackNumber(), true)
.addField("Disc", result.getDiscNumber(), true)
.addField("Year", result.getReleaseDate(), true)
.addField("Duration", result.getDurationFormat(), true)
.addField("ID", gs.getUuid(), true)
.setTimestamp(OffsetDateTime.now()) .setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl()) .setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build(); .addField("Title", result.getTitle(), true);
if (!StringUtils.isBlank(result.getArtist())) builder.addField("Artist", result.getArtist(), true);
if (!StringUtils.isBlank(result.getAlbum())) builder.addField("Album", result.getAlbum(), true);
if (!StringUtils.isBlank(result.getTrackNumber())) builder.addField("Track", result.getTrackNumber(), true);
if (!StringUtils.isBlank(result.getDiscNumber())) builder.addField("Disc", result.getDiscNumber(), true);
if (!StringUtils.isBlank(result.getReleaseDate())) builder.addField("Year", result.getReleaseDate(), true);
builder.addField("ID", gs.getUuid(), true);
MessageEmbed embed = builder.build();
return embed; return embed;
} }
@ -616,9 +622,15 @@ public class GuildMusicHandler {
} }
private void deleteUserPlayList(GuildMessageReceivedEvent event, List<String> commands) { private void listAllPlaylists(GuildMessageReceivedEvent event) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
System.out.println(commands.stream().collect(Collectors.joining(", ")));
}
private void deleteUserPlayList(GuildMessageReceivedEvent event, List<String> commands) {
Guild guild = event.getGuild();
} }
private void deleteGuildSongsConfirm(List<GuildSong> songs, String user, Message msg) { private void deleteGuildSongsConfirm(List<GuildSong> songs, String user, Message msg) {
@ -823,16 +835,14 @@ public class GuildMusicHandler {
int item = random.nextInt(gsList.size()); int item = random.nextInt(gsList.size());
GuildSong song = gsList.get(item); GuildSong song = gsList.get(item);
trackManager.queueNext(song.getSong().getFilePath());
apm.loadItem(song.getSong().getFilePath(), ts).get();
} }
private boolean findSong(String uuid) throws Exception { private boolean findSong(String uuid) throws Exception {
GuildSong gs = guildSongRepoService.getGuildSongRepo().findByUuid(uuid); GuildSong gs = guildSongRepoService.getGuildSongRepo().findByUuid(uuid);
if (gs == null) return false; if (gs == null) return false;
apm.loadItem(gs.getSong().getFilePath(), ts).get(); trackManager.queueNext(gs.getSong().getFilePath());
return true; return true;
} }

View File

@ -74,7 +74,5 @@ public class EightTrackLauncher implements ApplicationRunner {
logger.info("Starting Eight-Track"); logger.info("Starting Eight-Track");
service.begin(); service.begin();
} }
} }

View File

@ -117,7 +117,7 @@ public class ConfigurationService {
} }
if (changed) { if (changed) {
PropertiesManager.saveConfiguration(configuration, eightTrackConf, "Patch Repository properties file"); PropertiesManager.saveConfiguration(configuration, eightTrackConf, "Eight Track properties file");
} }
lastModified = Files.getLastModifiedTime(eightTrackConf).toMillis(); lastModified = Files.getLastModifiedTime(eightTrackConf).toMillis();
@ -133,7 +133,7 @@ public class ConfigurationService {
* @throws Exception general exception * @throws Exception general exception
*/ */
public void saveToConf(Properties confs) throws Exception { public void saveToConf(Properties confs) throws Exception {
PropertiesManager.saveConfiguration(confs, eightTrackConf, "Patch Repository properties file"); PropertiesManager.saveConfiguration(confs, eightTrackConf, "Eight Track properties file");
logger.info("Saved config file: " + eightTrackConf + ", " + confs.size() + " entries"); logger.info("Saved config file: " + eightTrackConf + ", " + confs.size() + " entries");
loadConf(); loadConf();
} }