Skip to content

Commit

Permalink
Fix Sponsorblock NPE
Browse files Browse the repository at this point in the history
  • Loading branch information
ErdbeerbaerLP committed Jun 10, 2024
1 parent 5a13807 commit 2e2076c
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 28 deletions.
11 changes: 1 addition & 10 deletions src/main/java/com/jagrosh/jmusicbot/audio/AudioHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,10 @@ public int addTrackToFront(QueuedTrack qtrack)
}
}

private static final Pattern YOUTUBE_REGEX = Pattern.compile("^((?:https?:)?\\/\\/)?((?:www|m)\\.)?((?:youtube(?:-nocookie)?\\.com|youtu.be))(\\/(?:[\\w\\-]+\\?v=|embed\\/|live\\/|v\\/)?)([\\w\\-]+)(\\S+)?$");

public int addTrack(QueuedTrack qtrack)
{
final Matcher m = YOUTUBE_REGEX.matcher(qtrack.getTrack().getInfo().uri);
if (m.matches()) {
final String vidID = m.group(5);
try {
SponsorblockHandler.addSegment(qtrack.getTrack(), JSponsorBlock.getSkipableSegments(vidID));
} catch (Throwable e) {
e.printStackTrace();
}
}


if(audioPlayer.getPlayingTrack()==null)
{
Expand Down
29 changes: 17 additions & 12 deletions src/main/java/com/jagrosh/jmusicbot/audio/SponsorblockHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
public class SponsorblockHandler {
private final Bot bot;
private final ArrayList<Long> guilds;
private static final HashMap<AudioTrack, Segment[]> segmentCache = new HashMap<>();
private static final HashMap<String, Segment[]> segmentCache = new HashMap<>();

public SponsorblockHandler(Bot bot) {
this.bot = bot;
Expand All @@ -25,37 +25,42 @@ public void addGuild(long g) {
guilds.add(g);
}

public void removeGuild(Long guild) {
if(guilds.contains(guild)) guilds.remove(guild);
public void removeGuild(long guild) {
guilds.remove(guild);
}

public static void addSegment(AudioTrack track, Segment[] segments) {
segmentCache.put(track, segments);
segmentCache.put(track.getInfo().uri, segments);
}

public static void removeSegment(AudioTrack track) {
segmentCache.remove(track);
segmentCache.remove(track.getInfo().uri);
}

public static boolean containsSegment(AudioTrack track) {
return segmentCache.containsKey(track);
return segmentCache.containsKey(track.getInfo().uri);
}

public void init() {
bot.getThreadpool().scheduleWithFixedDelay(this::checkAll, 0, 500, TimeUnit.MILLISECONDS);
}

private void checkAll() {
for (long guildId : guilds) {
for (final long guildId : guilds) {
final Settings s = bot.getSettingsManager().getSettings(guildId);
if (s.getCategories().length > 0) {
final Guild guild = bot.getJDA().getGuildById(guildId);
if(guild == null) continue;
final AudioHandler handler = (AudioHandler) guild.getAudioManager().getSendingHandler();
if(handler != null && handler.isMusicPlaying(bot.getJDA())){
if (handler != null && handler.isMusicPlaying(bot.getJDA())) {
if(handler.getPlayer() == null) continue;
if(handler.getPlayer().getPlayingTrack() == null) continue;
final long curPos = handler.getPlayer().getPlayingTrack().getPosition();
final Segment[] segs = SponsorblockUtil.filterSegments(segmentCache.get(handler.getPlayer().getPlayingTrack()), s.getCategories());
for (Segment seg : segs) {
if(seg.getSegmentStart()*1000 <= curPos && seg.getSegmentEnd()*1000 >= curPos){
handler.getPlayer().getPlayingTrack().setPosition((long) (seg.getSegmentEnd()*1000));
if(!segmentCache.containsKey(handler.getPlayer().getPlayingTrack().getInfo().uri)) continue;
final Segment[] segs = SponsorblockUtil.filterSegments(segmentCache.get(handler.getPlayer().getPlayingTrack().getInfo().uri), s.getCategories());
for (final Segment seg : segs) {
if (seg.getSegmentStart() * 1000 <= curPos && seg.getSegmentEnd() * 1000 >= curPos) {
handler.getPlayer().getPlayingTrack().setPosition((long) (seg.getSegmentEnd() * 1000));
}
}
}
Expand Down
36 changes: 31 additions & 5 deletions src/main/java/com/jagrosh/jmusicbot/commands/music/PlayCmd.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,13 @@
import com.jagrosh.jmusicbot.commands.MusicCommand;
import com.jagrosh.jmusicbot.playlist.PlaylistLoader.Playlist;
import com.jagrosh.jmusicbot.utils.FormatUtil;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import de.erdbeerbaerlp.jsponsorblock.JSponsorBlock;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.exceptions.PermissionException;
Expand Down Expand Up @@ -106,7 +112,8 @@ private ResultHandler(Message m, CommandEvent event, boolean ytsearch)
this.event = event;
this.ytsearch = ytsearch;
}

private static final Pattern YOUTUBE_REGEX = Pattern.compile("^((?:https?:)?\\/\\/)?((?:www|m)\\.)?((?:youtube(?:-nocookie)?\\.com|youtu.be))(\\/(?:[\\w\\-]+\\?v=|embed\\/|live\\/|v\\/)?)([\\w\\-]+)(\\S+)?$");

private void loadSingle(AudioTrack track, AudioPlaylist playlist)
{
if(bot.getConfig().isTooLong(track))
Expand All @@ -121,12 +128,19 @@ private void loadSingle(AudioTrack track, AudioPlaylist playlist)
+"** (`"+ TimeUtil.formatTime(track.getDuration())+"`) "+(pos==0?"to begin playing":" to the queue at position "+pos));

final Settings settings = event.getClient().getSettingsFor(event.getGuild());
if(settings.getCategories().length > 0){
if(SponsorblockHandler.containsSegment(track)){
addMsg+="\nSponsorblock data has been found and will be applied!";

if (settings.getCategories().length > 0) {
final Matcher m = YOUTUBE_REGEX.matcher(track.getInfo().uri);
if (m.matches()) {
final String vidID = m.group(5);
try {
SponsorblockHandler.addSegment(track, JSponsorBlock.getSkipableSegments(vidID));
addMsg += "\nSponsorblock data has been found and will be applied!";
} catch (IOException ignored) {
}
}
}
if(playlist==null || !event.getSelfMember().hasPermission(event.getTextChannel(), Permission.MESSAGE_ADD_REACTION))
if (playlist == null || !event.getSelfMember().hasPermission(event.getTextChannel(), Permission.MESSAGE_ADD_REACTION))
m.editMessage(addMsg).queue();
else
{
Expand All @@ -152,11 +166,23 @@ private void loadSingle(AudioTrack track, AudioPlaylist playlist)
private int loadPlaylist(AudioPlaylist playlist, AudioTrack exclude)
{
int[] count = {0};

final Settings settings = event.getClient().getSettingsFor(event.getGuild());
playlist.getTracks().stream().forEach((track) -> {
if(!bot.getConfig().isTooLong(track) && !track.equals(exclude))
{
AudioHandler handler = (AudioHandler)event.getGuild().getAudioManager().getSendingHandler();
handler.addTrack(new QueuedTrack(track, RequestMetadata.fromResultHandler(track, event)));
if (settings.getCategories().length > 0) {
final Matcher m = YOUTUBE_REGEX.matcher(track.getInfo().uri);
if (m.matches()) {
final String vidID = m.group(5);
try {
SponsorblockHandler.addSegment(track, JSponsorBlock.getSkipableSegments(vidID));
} catch (IOException ignored) {
}
}
}
count[0]++;
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public class SponsorblockUtil {
public static Segment[] filterSegments(Segment[] segs, Category... categories){
final ArrayList<Segment> s = new ArrayList<>();
for (Segment seg : segs) {
for (final Segment seg : segs) {
for (Category category : categories) {
if(category.equals(seg.getCategory())){
s.add(seg);
Expand Down

0 comments on commit 2e2076c

Please sign in to comment.