Add Song class for storing details about queue items.

crossfading
Nekojimi 3 years ago
parent ed610ebdae
commit 367f2b93de
  1. 27
      src/main/java/moe/nekojimi/chords/Main.java
  2. 14
      src/main/java/moe/nekojimi/chords/MusicHandler.java
  3. 67
      src/main/java/moe/nekojimi/chords/Song.java

@ -9,6 +9,8 @@ import java.io.Closeable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.*; import java.util.*;
@ -150,11 +152,18 @@ public class Main extends ListenerAdapter
{ {
try try
{ {
Song song = new Song(new URL(arg));
event.getChannel().sendMessage("Downloading ...").queue(); event.getChannel().sendMessage("Downloading ...").queue();
String destination = downloadSong(arg); boolean ok = downloadSong(song);
musicHandler.addSong(new File(destination)); if (ok)
event.getChannel().sendMessage("Downloaded and added to queue!").queue(); {
musicHandler.addSong(song);
event.getChannel().sendMessage("Downloaded and added to queue!").queue();
}
} catch (MalformedURLException ex)
{
event.getChannel().sendMessage("That's not a valid URL you idiot! " + ex.getMessage()).queue();
} catch (IOException | InterruptedException | RuntimeException ex) } catch (IOException | InterruptedException | RuntimeException ex)
{ {
event.getChannel().sendMessage("Failed to download! Reason: " + ex.getMessage()).queue(); event.getChannel().sendMessage("Failed to download! Reason: " + ex.getMessage()).queue();
@ -162,9 +171,9 @@ public class Main extends ListenerAdapter
} }
} }
private String downloadSong(String arg) throws IOException, RuntimeException, InterruptedException private boolean downloadSong(Song song) throws IOException, RuntimeException, InterruptedException
{ {
String cmd = "/usr/bin/youtube-dl -x --audio-format=wav " + arg; String cmd = "/usr/bin/youtube-dl -x --audio-format=wav " + song.getUrl().toString();
System.out.println("Running command: " + cmd); System.out.println("Running command: " + cmd);
// Process exec = Runtime.getRuntime().exec().split(" ")); // Process exec = Runtime.getRuntime().exec().split(" "));
Process exec = new ProcessBuilder(cmd.split(" ")).redirectOutput(ProcessBuilder.Redirect.PIPE).start(); Process exec = new ProcessBuilder(cmd.split(" ")).redirectOutput(ProcessBuilder.Redirect.PIPE).start();
@ -176,8 +185,10 @@ public class Main extends ListenerAdapter
throw new RuntimeException("youtube-dl failed with error " + exec.exitValue()); throw new RuntimeException("youtube-dl failed with error " + exec.exitValue());
Matcher matcher = Pattern.compile("Destination: (.*\\.wav)").matcher(output); Matcher matcher = Pattern.compile("Destination: (.*\\.wav)").matcher(output);
matcher.find(); matcher.find();
String destination = matcher.group(1); song.setLocation(new File(matcher.group(0)));
return destination; return true;
// String destination = matcher.group(1);
// return destination;
} }
/** /**

@ -26,8 +26,8 @@ import net.dv8tion.jda.api.audio.AudioSendHandler;
public class MusicHandler implements AudioSendHandler, Closeable public class MusicHandler implements AudioSendHandler, Closeable
{ {
private final Queue<File> songQueue = new ConcurrentLinkedQueue<>(); private final Queue<Song> songQueue = new ConcurrentLinkedQueue<>();
private File currentSong; private Song currentSong;
private AudioInputStream din = null; private AudioInputStream din = null;
private final Queue<byte[]> queue = new ConcurrentLinkedQueue<>(); private final Queue<byte[]> queue = new ConcurrentLinkedQueue<>();
private int byteCount; private int byteCount;
@ -36,10 +36,10 @@ public class MusicHandler implements AudioSendHandler, Closeable
{ {
} }
public void addSong(File file) public void addSong(Song song)
{ {
System.out.println("Song added to queue: " + file.getAbsolutePath()); System.out.println("Song added to queue: " + song.getLocation().getAbsolutePath());
songQueue.add(file); songQueue.add(song);
if (!canProvide()) if (!canProvide())
nextSong(); nextSong();
} }
@ -62,8 +62,8 @@ public class MusicHandler implements AudioSendHandler, Closeable
currentSong = songQueue.poll(); currentSong = songQueue.poll();
if (currentSong == null) if (currentSong == null)
return false; return false;
System.out.println("Playing song " + currentSong.getAbsolutePath()); System.out.println("Playing song " + currentSong.getLocation().getAbsolutePath());
in = AudioSystem.getAudioInputStream(currentSong); in = AudioSystem.getAudioInputStream(currentSong.getLocation());
AudioFormat decodedFormat = AudioSendHandler.INPUT_FORMAT; AudioFormat decodedFormat = AudioSendHandler.INPUT_FORMAT;
din = AudioSystem.getAudioInputStream(decodedFormat, in); din = AudioSystem.getAudioInputStream(decodedFormat, in);
byteCount = 3840; byteCount = 3840;

@ -0,0 +1,67 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package moe.nekojimi.chords;
import java.io.File;
import java.net.URL;
/**
*
* @author jimj316
*/
public class Song
{
private String title;
private String artist;
private final URL url;
private File location = null;
public Song(URL url)
{
this.url = url;
}
public String getTitle()
{
return title;
}
public void setTitle(String title)
{
this.title = title;
}
public String getArtist()
{
return artist;
}
public void setArtist(String artist)
{
this.artist = artist;
}
public URL getUrl()
{
return url;
}
public File getLocation()
{
return location;
}
public void setLocation(File location)
{
this.location = location;
}
void delete()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
Loading…
Cancel
Save