Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: http proxy config for httpAudioSourceManager #595

Merged
merged 5 commits into from
Jan 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions LavalinkServer/application.yml.example
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ lavalink:
#youtubeConfig: # Required for avoiding age restrictions by YouTube. Guide https://github.com/Walkyst/lavaplayer-fork/issues/18
#PAPISID: ""
#PSID: ""
#httpConfig: # Useful for blocking bad-actors from ip-grabbing your music node and attacking it, this way only the http proxy will be attacked
#proxyHost: "localhost" # Hostname of the proxy, (ip or domain)
#proxyPort: 3128 # Proxy port, 3128 is the default for squidProxy
#proxyUser: "" # Optional user for basic authentication fields, leave blank if you don't use basic auth
#proxyPassword: "" # Password for basic authentication

metrics:
prometheus:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,21 @@ import com.sedmelluq.discord.lavaplayer.source.bandcamp.BandcampAudioSourceManag
import com.sedmelluq.discord.lavaplayer.source.beam.BeamAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.http.HttpAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.soundcloud.DefaultSoundCloudDataLoader
import com.sedmelluq.discord.lavaplayer.source.soundcloud.DefaultSoundCloudDataReader
import com.sedmelluq.discord.lavaplayer.source.soundcloud.DefaultSoundCloudFormatHandler
import com.sedmelluq.discord.lavaplayer.source.soundcloud.DefaultSoundCloudPlaylistLoader
import com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.soundcloud.*
import com.sedmelluq.discord.lavaplayer.source.twitch.TwitchStreamAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.vimeo.VimeoAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeHttpContextFilter
import com.sedmelluq.lava.extensions.youtuberotator.YoutubeIpRotatorSetup
import com.sedmelluq.lava.extensions.youtuberotator.planner.AbstractRoutePlanner
import com.sedmelluq.lava.extensions.youtuberotator.planner.BalancingIpRoutePlanner
import com.sedmelluq.lava.extensions.youtuberotator.planner.NanoIpRoutePlanner
import com.sedmelluq.lava.extensions.youtuberotator.planner.RotatingIpRoutePlanner
import com.sedmelluq.lava.extensions.youtuberotator.planner.RotatingNanoIpRoutePlanner
import com.sedmelluq.lava.extensions.youtuberotator.planner.*
import com.sedmelluq.lava.extensions.youtuberotator.tools.ip.Ipv4Block
import com.sedmelluq.lava.extensions.youtuberotator.tools.ip.Ipv6Block
import dev.arbjerg.lavalink.api.AudioPlayerManagerConfiguration
import org.apache.http.HttpHost
import org.apache.http.auth.AuthScope
import org.apache.http.auth.UsernamePasswordCredentials
import org.apache.http.client.CredentialsProvider
import org.apache.http.impl.client.BasicCredentialsProvider
import org.slf4j.LoggerFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
Expand Down Expand Up @@ -70,7 +67,8 @@ class AudioPlayerConfiguration {
val retryLimit = serverConfig.ratelimit?.retryLimit ?: -1
when {
retryLimit < 0 -> YoutubeIpRotatorSetup(routePlanner).forSource(youtube).setup()
retryLimit == 0 -> YoutubeIpRotatorSetup(routePlanner).forSource(youtube).withRetryLimit(Int.MAX_VALUE).setup()
retryLimit == 0 -> YoutubeIpRotatorSetup(routePlanner).forSource(youtube)
.withRetryLimit(Int.MAX_VALUE).setup()
else -> YoutubeIpRotatorSetup(routePlanner).forSource(youtube).withRetryLimit(retryLimit).setup()

}
Expand All @@ -97,13 +95,15 @@ class AudioPlayerConfiguration {
val dataLoader = DefaultSoundCloudDataLoader()
val formatHandler = DefaultSoundCloudFormatHandler()

audioPlayerManager.registerSourceManager(SoundCloudAudioSourceManager(
audioPlayerManager.registerSourceManager(
SoundCloudAudioSourceManager(
serverConfig.isSoundcloudSearchEnabled,
dataReader,
dataLoader,
formatHandler,
DefaultSoundCloudPlaylistLoader(dataLoader, dataReader, formatHandler)
))
)
)
}
if (sources.isBandcamp) audioPlayerManager.registerSourceManager(BandcampAudioSourceManager())
if (sources.isTwitch) audioPlayerManager.registerSourceManager(TwitchStreamAudioSourceManager())
Expand All @@ -125,7 +125,28 @@ class AudioPlayerConfiguration {
}

// This must be loaded last
if (sources.isHttp) audioPlayerManager.registerSourceManager(HttpAudioSourceManager())
if (sources.isHttp) {
val httpAudioSourceManager = HttpAudioSourceManager()

serverConfig.httpConfig?.let { httpConfig ->
httpAudioSourceManager.configureBuilder {
if (httpConfig.proxyHost.isNotBlank()) {
val credsProvider: CredentialsProvider = BasicCredentialsProvider()
credsProvider.setCredentials(
AuthScope(httpConfig.proxyHost, httpConfig.proxyPort),
UsernamePasswordCredentials(httpConfig.proxyUser, httpConfig.proxyPassword)
)

it.setProxy(HttpHost(httpConfig.proxyHost, httpConfig.proxyPort))
if (httpConfig.proxyUser.isNotBlank()) {
it.setDefaultCredentialsProvider(credsProvider)
}
}
}
}

audioPlayerManager.registerSourceManager(httpAudioSourceManager)
}

return am
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package lavalink.server.config

data class HttpConfig(
var proxyHost: String = "",
var proxyPort: Int = 3128,
var proxyUser: String = "",
var proxyPassword: String = ""
)
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,5 @@ class ServerConfig {
var isSoundcloudSearchEnabled = true
var ratelimit: RateLimitConfig? = null
var youtubeConfig: YoutubeConfig? = null
var httpConfig: HttpConfig? = null
}