Initial Database Migration

This commit is contained in:
Isaac Parenteau
2019-10-06 20:07:47 -05:00
parent 38dbc5bbf5
commit af8e8fa52a
20 changed files with 1567 additions and 113 deletions

View File

@@ -0,0 +1,150 @@
/**
*
* Project: Eight Track, File: DiscordEventHandler.java
*
* Copyright 2019 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Date;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import net.dv8tion.jda.api.events.guild.GuildJoinEvent;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.repos.GuildRepository;
import net.locusworks.discord.eighttrack.services.ConfigurationService;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Service
public class DiscordEventHandler extends ListenerAdapter {
private Path musicDir;
private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(DiscordEventHandler.class);
@Autowired
private ConfigurationService confService;
@Autowired
private GuildRepository guildRepo;
@Autowired
private GuildMusicService musicService;
@Autowired
private Mp3UploadHandler uploadHandler;
@PostConstruct
private void init() throws IOException {
this.musicDir = confService.getMusicDirectory();
if (!Files.exists(this.musicDir.toAbsolutePath())) {
Files.createDirectories(this.musicDir.toAbsolutePath());
}
}
@Override
public void onGuildJoin(GuildJoinEvent event) {
try {
long guildId = event.getGuild().getIdLong();
DiscordGuild discordGuild = guildRepo.findByGuildId(guildId);
if (discordGuild != null) return;
logger.debug("Joining Server: " + event.getGuild().getName());
discordGuild = new DiscordGuild();
discordGuild.setGuildId(guildId);
discordGuild.setGuildName(event.getGuild().getName());
discordGuild.setDateJoined(new Date());
guildRepo.save(discordGuild);
} catch (Exception ex) {
logger.error("Unable to persist server information to database: " + ex.getMessage(), ex);
}
}
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
try {
onGuildMessageReceivedHelper(event);
} catch (Throwable t) {
logger.error(t);
}
}
private void onGuildMessageReceivedHelper(GuildMessageReceivedEvent event) throws IOException {
if (!musicService.containsKey(event.getGuild().getIdLong())) {
musicService.put(event.getGuild().getIdLong(), new GuildMusicHandler(musicDir, uploadHandler));
}
GuildMusicHandler gmh = musicService.get(event.getGuild().getIdLong());
gmh.accept((id) -> musicService.remove(id));
String command = event.getMessage().getContentRaw().trim().toLowerCase();
switch(command) {
case "-upload":
gmh.upload(event);
return;
}
/*
switch (command) {
case "-play":
gmh.isPlaying(true);
gmh.play(event);
return;
case "-stop":
gmh.isPlaying(false);
gmh.stop(event);
return;
case "-next":
gmh.next(event);
return;
case "-repeat":
gmh.isPlaying(true);
gmh.repeat(event);
return;
case "-whatsnext":
gmh.whatsNext(event);
break;
case "-index":
gmh.index(event);
break;
default:
return;
}
*/
}
}

View File

@@ -27,6 +27,7 @@
*/
package net.locusworks.discord.eighttrack.handlers;
import java.awt.Color;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -45,6 +46,7 @@ import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.GuildChannel;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.VoiceChannel;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
@@ -66,13 +68,14 @@ public class GuildMusicHandler {
private OffsetDateTime lastPlayed;
private Consumer<Long> callback;
private Mp3UploadHandler uploadHandler;
public GuildMusicHandler(Path musicDir) throws IOException {
public GuildMusicHandler(Path musicDir, Mp3UploadHandler uploadHandler) throws IOException {
this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class);
this.playing = new AtomicBoolean(false);
this.musicDir = musicDir;
this.lastPlayed = OffsetDateTime.now();
this.uploadHandler = uploadHandler;
this.apm = new DefaultAudioPlayerManager();
AudioSourceManagers.registerLocalSource(apm);
@@ -80,7 +83,6 @@ public class GuildMusicHandler {
this.ts = new TrackScheduler();
player.addListener(ts);
indexFiles();
}
public OffsetDateTime getLastPlayed() {
@@ -200,4 +202,38 @@ public class GuildMusicHandler {
ts.trackLoaded(track);
}
}
public void upload(GuildMessageReceivedEvent event) {
if (!event.getMessage().getMember().hasPermission(Permission.ADMINISTRATOR, Permission.MANAGE_SERVER)) {
event.getChannel().sendMessage(String.format("Sorry <@%s> i can't do that. *psst: you have to have manage server, or administrator role*", event.getMember().getIdLong())).queue();
return;
}
for(Attachment attachment : event.getMessage().getAttachments()) {
attachment.retrieveInputStream().thenAccept((in) -> {
try {
Mp3UploadResults res = uploadHandler.parse(in);
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.GREEN)
.setTitle("Upload Results")
.setDescription(res.toString())
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue();
} catch (Exception ex) {
logger.error("Unable to get file information: %s", ex.getMessage());
logger.error(ex);
} finally {
event.getMessage().delete().queue();
}
}).exceptionally((err) ->{
return null;
});
}
}
}

View File

@@ -1,3 +1,30 @@
/**
*
* Project: Eight Track, File: Mp3UploadHandler.java
*
* Copyright 2019 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
import java.io.IOException;
@@ -9,52 +36,41 @@ import java.nio.file.Paths;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.mp3.LyricsHandler;
import org.apache.tika.parser.mp3.Mp3Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.springframework.stereotype.Component;
import org.xml.sax.SAXException;
@Component
public class Mp3UploadHandler {
private Path file;
public Mp3UploadHandler(Path file) {
this.file = file;
}
public void parse() throws IOException, SAXException, TikaException {
InputStream is = Files.newInputStream(file);
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
Mp3Parser parser = new Mp3Parser();
parser.parse(is, handler, metadata, context);
LyricsHandler lyrics = new LyricsHandler(is, handler);
while(lyrics.hasLyrics()) {
System.out.println(lyrics.toString());
}
System.out.println("Contents of the document:" + handler.toString());
System.out.println("Metadata of the document:");
String[] metadataNames = metadata.names();
for(String name : metadataNames) {
System.out.println(name + ": " + metadata.get(name));
public Mp3UploadResults parse(Path file) throws IOException {
InputStream is = Files.newInputStream(file);
return parse(is);
}
public Mp3UploadResults parse(InputStream is) throws IOException {
try {
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
Mp3Parser parser = new Mp3Parser();
parser.parse(is, handler, metadata, context);
return new Mp3UploadResults(metadata);
} catch (Exception ex) {
throw new IOException(ex);
}
}
public static void main(String args[]) throws IOException, SAXException, TikaException {
String file = "S:\\Music\\Alan Walker\\01 Diamond Heart.mp3";
String file = "E:\\Music2\\Alan Walker\\Itinerary_ Dallas.pdf";
Path path = Paths.get(file);
Mp3UploadHandler fuh = new Mp3UploadHandler(path);
fuh.parse();
Mp3UploadHandler fuh = new Mp3UploadHandler();
fuh.parse(path);
}
}

View File

@@ -1,15 +1,203 @@
/**
*
* Project: Eight Track, File: Mp3UploadResults.java
*
* Copyright 2019 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
import org.apache.tika.metadata.Metadata;
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 composure;
private String album;
private String trackNumber;
private String discNumber;
private String artist;
private String title;
private String releaseDate;
private Long duration;
public Mp3UploadResults( Metadata metadata) {
parseResults(metadata);
}
private void parseResults(Metadata metadata) {
genre = metadata.get(MetaDataField.GENRE.getValue());
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();
if (durationStr != null) {
duration = Double.valueOf(metadata.get(MetaDataField.DURATION.getValue())).longValue();
}
}
/**
* @return the genre
*/
public final String getGenre() {
return genre;
}
/**
* @return the composure
*/
public final String getComposure() {
return composure;
}
/**
* @return the album
*/
public final String getAlbum() {
return album;
}
/**
* @return the trackNumber
*/
public final String getTrackNumber() {
return trackNumber;
}
/**
* @return the discNumber
*/
public final String getDiscNumber() {
return discNumber;
}
/**
* @return the artist
*/
public final String getArtist() {
return artist;
}
/**
* @return the title
*/
public final String getTitle() {
return title;
}
/**
* @return the releaseDate
*/
public final String getReleaseDate() {
return releaseDate;
}
/**
* @return the duration
*/
public final Long getDuration() {
return duration;
}
public boolean validFile() {
return getTitle() != null && !getTitle().isEmpty();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("```");
if (getTitle() != null)
sb.append(String.format("%-10s: %s%n", "Title", getTitle()));
if (getArtist() != null)
sb.append(String.format("%-10s: %s%n", "Artist", getArtist()));
if (getAlbum() != null)
sb.append(String.format("%-10s: %s%n", "Album", getAlbum()));
if (getTrackNumber() != null)
sb.append(String.format("%-10s: %s%n", "Track", getTrackNumber()));
if (getDiscNumber() != null)
sb.append(String.format("%-10s: %s%n", "Disc", getDiscNumber()));
if (getReleaseDate() != null)
sb.append(String.format("%-10s: %s%n", "Year", getReleaseDate()));
if (getGenre() != null)
sb.append(String.format("%-10s: %s%n", "Genre", getGenre()));
if (duration != null)
sb.append(String.format("%-10s: %s%n", "Duration", dateFormat(getDuration())));
sb.append("```");
return sb.toString();
}
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;
}
}