use of se.michaelthelin.spotify.SpotifyApi in project aiode by robinfriedli.
the class Playlist method getTracks.
/**
* Returns the items in this playlist as objects supported by the {@link PlayableFactory} class. Note that getting the
* Spotify track for a Song requires this method to be invoked with client credentials
*/
public List<Object> getTracks(SpotifyApi spotifyApi) {
List<PlaylistItem> playlistItems = getItemsSorted();
SpotifyTrackBulkLoadingService service = new SpotifyTrackBulkLoadingService(spotifyApi);
Map<Object, Integer> itemsWithIndex = new HashMap<>();
for (int i = 0; i < playlistItems.size(); i++) {
PlaylistItem item = playlistItems.get(i);
if (item instanceof Song) {
String id = ((Song) item).getId();
int finalI = i;
service.add(createItem(id, TRACK), track -> itemsWithIndex.put(track, finalI));
} else if (item instanceof Episode) {
String id = ((Episode) item).getId();
int finalI = i;
service.add(createItem(id, EPISODE), track -> itemsWithIndex.put(track, finalI));
} else if (item instanceof Video) {
Video video = (Video) item;
YouTubeVideo youtubeVideo = video.asYouTubeVideo();
itemsWithIndex.put(youtubeVideo, i);
String spotifyId = video.getRedirectedSpotifyId();
if (!Strings.isNullOrEmpty(spotifyId)) {
SpotifyItemKind kindEntity = video.getRedirectedSpotifyKind();
SpotifyTrackKind kind = kindEntity != null ? kindEntity.asEnum() : TRACK;
service.add(createItem(spotifyId, kind), youtubeVideo::setRedirectedSpotifyTrack);
}
} else if (item instanceof UrlTrack) {
itemsWithIndex.put(item, i);
}
}
service.perform();
return itemsWithIndex.keySet().stream().sorted(Comparator.comparing(itemsWithIndex::get)).collect(Collectors.toList());
}
use of se.michaelthelin.spotify.SpotifyApi in project aiode by robinfriedli.
the class UploadCommand method doRun.
@Override
public void doRun() throws Exception {
SpotifyApi spotifyApi = getContext().getSpotifyApi();
Playlist playlist = SearchEngine.searchLocalList(getContext().getSession(), getCommandInput());
if (playlist == null) {
throw new InvalidCommandException(String.format("No local list found for '%s'", getCommandInput()));
}
runWithLogin(() -> {
List<SpotifyTrack> tracks = playlist.asTrackList(spotifyApi);
String name = playlist.getName();
if (tracks.isEmpty()) {
throw new InvalidCommandException("Playlist " + name + " has no Spotify tracks.");
}
String userId = spotifyApi.getCurrentUsersProfile().build().execute().getId();
se.michaelthelin.spotify.model_objects.specification.Playlist spotifyPlaylist = spotifyApi.createPlaylist(userId, name).build().execute();
uploadedPlaylistName = spotifyPlaylist.getName();
String playlistId = spotifyPlaylist.getId();
List<String> trackUris = tracks.stream().map(SpotifyTrack::getUri).collect(Collectors.toList());
List<List<String>> sequences = Lists.partition(trackUris, 90);
for (List<String> sequence : sequences) {
spotifyApi.addItemsToPlaylist(playlistId, sequence.toArray(new String[0])).build().execute();
}
return null;
});
}
use of se.michaelthelin.spotify.SpotifyApi in project aiode by robinfriedli.
the class AudioTrafficSimulationCommand method runAdmin.
@Override
public void runAdmin() throws Exception {
Aiode aiode = Aiode.get();
AudioManager audioManager = aiode.getAudioManager();
AudioPlayerManager playerManager = audioManager.getPlayerManager();
PlayableFactory playableFactory = audioManager.createPlayableFactory(getSpotifyService(), new BlockingTrackLoadingExecutor());
CommandContext context = getContext();
Guild guild = context.getGuild();
ThreadExecutionQueue threadExecutionQueue = aiode.getExecutionQueueManager().getForGuild(guild);
SpotifyApi spotifyApi = context.getSpotifyApi();
AudioTrackLoader audioTrackLoader = new AudioTrackLoader(playerManager);
int streams = getArgumentValueOrElse("streams", DEFAULT_STREAM_COUNT);
int durationSecs = getArgumentValueOrElse("duration", DEFAULT_DURATION);
String playbackUrl = getArgumentValueOrElse("url", DEFAULT_PLAYBACK_URL);
Integer nativeBuffer = getArgumentValueWithTypeOrElse("nativeBuffer", Integer.class, null);
List<Playable> playables = playableFactory.createPlayables(playbackUrl, spotifyApi, true);
if (playables.isEmpty()) {
throw new InvalidCommandException("No playables found for url " + playbackUrl);
}
Playable playable = playables.get(0);
AudioItem audioItem = audioTrackLoader.loadByIdentifier(playable.getPlaybackUrl());
AudioTrack track;
if (audioItem instanceof AudioTrack) {
track = (AudioTrack) audioItem;
} else {
throw new IllegalStateException("Could not get AudioTrack for Playable " + playable);
}
LoopTrackListener loopTrackListener = new LoopTrackListener(track);
List<Thread> playbackThreads = nativeBuffer != null ? null : Lists.newArrayListWithCapacity(streams);
List<Tuple2<IAudioSendSystem, AudioPlayer>> audioSendSystems = nativeBuffer != null ? Lists.newArrayListWithCapacity(streams) : null;
NativeAudioSendFactory nativeAudioSendFactory = nativeBuffer != null ? new NativeAudioSendFactory(nativeBuffer) : null;
LoggingUncaughtExceptionHandler eh = new LoggingUncaughtExceptionHandler();
for (int i = 0; i < streams; i++) {
AudioPlayer player = playerManager.createPlayer();
player.addListener(loopTrackListener);
player.playTrack(track.makeClone());
if (nativeAudioSendFactory != null) {
IAudioSendSystem sendSystem = nativeAudioSendFactory.createSendSystem(new FakePacketProvider(player));
audioSendSystems.add(new Tuple2<>(sendSystem, player));
} else {
Thread playbackThread = new Thread(new PlayerPollingRunnable(player));
playbackThread.setDaemon(true);
playbackThread.setUncaughtExceptionHandler(eh);
playbackThread.setName("simulated-playback-thread-" + i);
playbackThreads.add(playbackThread);
}
}
QueuedTask playbackThreadsManagementTask = new QueuedTask(threadExecutionQueue, new FakePlayerManagementTask(playbackThreads, audioSendSystems, durationSecs)) {
@Override
protected boolean isPrivileged() {
return true;
}
};
playbackThreadsManagementTask.setName("simulated-playback-management-task");
threadExecutionQueue.add(playbackThreadsManagementTask, false);
}
use of se.michaelthelin.spotify.SpotifyApi in project Robertify-Bot by bombies.
the class Robertify method main.
public static void main(String[] args) {
WebUtils.setUserAgent("Mozilla/Robertify / bombies#4445");
try {
lavalink = new JdaLavalink(getIdFromToken(Config.getBotToken()), Config.getShardCount(), shardId -> Robertify.getShardManager().getShardById(shardId));
for (var node : Config.getLavaNodes()) lavalink.addNode(node.getURI(), node.getPassword());
lavalink.getLoadBalancer().addPenalty(LavalinkLoadBalancer.Penalties::getPlayerPenalty);
lavalink.getLoadBalancer().addPenalty(LavalinkLoadBalancer.Penalties::getCpuPenalty);
var thread = new ThreadFactoryBuilder().setNameFormat("RobertifyShutdownHook").build();
Runtime.getRuntime().addShutdownHook(thread.newThread(() -> {
logger.info("Destroying all players (If any left)");
shardManager.getGuildCache().stream().filter(guild -> guild.getSelfMember().getVoiceState().inVoiceChannel()).forEach(guild -> {
GuildMusicManager musicManager = RobertifyAudioManager.getInstance().getMusicManager(guild);
ResumeUtils.getInstance().saveInfo(guild, guild.getSelfMember().getVoiceState().getChannel());
musicManager.getScheduler().scheduleDisconnect(false, 0, TimeUnit.SECONDS);
});
shardManager.shutdown();
}));
DefaultShardManagerBuilder jdaBuilder = DefaultShardManagerBuilder.createDefault(Config.getBotToken(), GatewayIntent.GUILD_VOICE_STATES, GatewayIntent.GUILD_MESSAGES, GatewayIntent.DIRECT_MESSAGES).setShardsTotal(Config.getShardCount()).setBulkDeleteSplittingEnabled(false).setChunkingFilter(ChunkingFilter.NONE).setMemberCachePolicy(MemberCachePolicy.VOICE).addEventListeners(lavalink, VoiceChannelEvents.waiter, commandWaiter, new Listener(), new VoiceChannelEvents(), new DedicatedChannelEvents(), new PollEvents(), new SuggestionCategoryDeletionEvents(), new ReportsEvents(), new AnnouncementChannelEvents(), new LogChannelEvents(), new SkipCommand()).setVoiceDispatchInterceptor(lavalink.getVoiceInterceptor()).addEventListeners(new MenuPaginationTestCommand()).addEventListeners(new PaginationEvents()).enableCache(CacheFlag.VOICE_STATE).disableCache(CacheFlag.ACTIVITY, CacheFlag.EMOTE, CacheFlag.CLIENT_STATUS, CacheFlag.ROLE_TAGS, CacheFlag.ONLINE_STATUS).disableIntents(GatewayIntent.DIRECT_MESSAGE_TYPING, GatewayIntent.GUILD_BANS, GatewayIntent.GUILD_INVITES, GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_MESSAGE_TYPING, GatewayIntent.GUILD_PRESENCES, GatewayIntent.DIRECT_MESSAGE_REACTIONS).setGatewayEncoding(GatewayEncoding.ETF).setActivity(Activity.listening("Starting up..."));
// Register all slash commands
SlashCommandManager slashCommandManager = new SlashCommandManager();
for (var cmd : slashCommandManager.getCommands()) jdaBuilder.addEventListeners(cmd);
for (var cmd : slashCommandManager.getDevCommands()) jdaBuilder.addEventListeners(cmd);
// Initialize the JSON directory
// This is a deprecated feature and is marked for removal
// Until everything is fully removed, this method needs to be enabled
// For a proper first-boot.
AbstractJSONFile.initDirectory();
AbstractMongoDatabase.initAllCaches();
logger.info("Initialized all caches");
new ChangeLogConfig().initConfig();
GuildDBCache.getInstance().loadAllGuilds();
logger.info("All guilds have been loaded into cache");
shardManager = jdaBuilder.build();
spotifyApi = new SpotifyApi.Builder().setClientId(Config.get(ENV.SPOTIFY_CLIENT_ID)).setClientSecret(Config.get(ENV.SPOTIFY_CLIENT_SECRET)).setRedirectUri(SpotifyHttpManager.makeUri("http://localhost/callback/")).build();
deezerApi = new DeezerApi();
initVoteSiteAPIs();
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(SpotifyAuthorizationUtils.doTokenRefresh(), 0, 1, TimeUnit.HOURS);
try {
baringo = new BaringoClient.Builder().clientAuth(Config.get(ENV.IMGUR_CLIENT), Config.get(ENV.IMGUR_SECRET)).build();
} catch (BaringoApiException e) {
logger.error("[ERROR] There was an issue building the Baringo client!", e);
}
} catch (Exception e) {
logger.error("[FATAL ERROR] An unexpected error occurred!", e);
}
}
use of se.michaelthelin.spotify.SpotifyApi in project aiode by robinfriedli.
the class PlayableFactory method createPlayablesFromSpotifyUrl.
private List<Playable> createPlayablesFromSpotifyUrl(URI uri, SpotifyApi spotifyApi, boolean redirectSpotify) {
StringList pathFragments = StringList.createWithRegex(uri.getPath(), "/");
SpotifyService spotifyService = new SpotifyService(spotifyApi);
if (pathFragments.contains("playlist")) {
return createPlayableForSpotifyUrlType(pathFragments, "playlist", playlistId -> {
List<SpotifyTrack> playlistTracks = spotifyService.getPlaylistTracks(playlistId);
return createPlayables(redirectSpotify, playlistTracks);
}, spotifyApi);
} else if (pathFragments.contains("track")) {
return createPlayableForSpotifyUrlType(pathFragments, "track", trackId -> {
Track track = spotifyApi.getTrack(trackId).build().execute();
return Lists.newArrayList(createPlayable(redirectSpotify, track));
}, spotifyApi);
} else if (pathFragments.contains("episode")) {
return createPlayableForSpotifyUrlType(pathFragments, "episode", episodeId -> {
Episode episode = spotifyApi.getEpisode(episodeId).build().execute();
return Lists.newArrayList(createPlayable(redirectSpotify, episode));
}, spotifyApi);
} else if (pathFragments.contains("album")) {
return createPlayableForSpotifyUrlType(pathFragments, "album", albumId -> {
List<Track> albumTracks = spotifyService.getAlbumTracks(albumId);
return createPlayables(redirectSpotify, albumTracks);
}, spotifyApi);
} else if (pathFragments.contains("show")) {
return createPlayableForSpotifyUrlType(pathFragments, "show", showId -> {
List<Episode> showEpisodes = spotifyService.getShowEpisodes(showId);
return createPlayables(redirectSpotify, showEpisodes);
}, spotifyApi);
} else {
throw new InvalidCommandException("Detected Spotify URL but no track, playlist or album id provided.");
}
}
Aggregations