mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
[V3 Audio] Add settable path for external Lavalink (#2480)
This commit is contained in:
parent
d786103d8d
commit
c1bee3fee5
@ -57,6 +57,7 @@ class Audio(commands.Cog):
|
|||||||
"current_version": redbot.core.VersionInfo.from_str("3.0.0a0").to_json(),
|
"current_version": redbot.core.VersionInfo.from_str("3.0.0a0").to_json(),
|
||||||
"use_external_lavalink": False,
|
"use_external_lavalink": False,
|
||||||
"restrict": True,
|
"restrict": True,
|
||||||
|
"localpath": str(cog_data_path(raw_name="Audio")),
|
||||||
}
|
}
|
||||||
|
|
||||||
default_guild = {
|
default_guild = {
|
||||||
@ -355,6 +356,87 @@ class Audio(commands.Cog):
|
|||||||
await self.config.guild(ctx.guild).jukebox_price.set(price)
|
await self.config.guild(ctx.guild).jukebox_price.set(price)
|
||||||
await self.config.guild(ctx.guild).jukebox.set(jukebox)
|
await self.config.guild(ctx.guild).jukebox.set(jukebox)
|
||||||
|
|
||||||
|
@audioset.command()
|
||||||
|
@checks.is_owner()
|
||||||
|
async def localpath(self, ctx, local_path=None):
|
||||||
|
"""Set the localtracks path if the Lavalink.jar is not run from the Audio data folder.
|
||||||
|
|
||||||
|
Leave the path blank to reset the path to the default, the Audio data directory.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not local_path:
|
||||||
|
await self.config.localpath.set(str(cog_data_path(raw_name="Audio")))
|
||||||
|
return await self._embed_msg(
|
||||||
|
ctx, _("The localtracks path location has been reset to the default location.")
|
||||||
|
)
|
||||||
|
|
||||||
|
info_msg = _(
|
||||||
|
"This setting is only for bot owners to set a localtracks folder location "
|
||||||
|
"if the Lavalink.jar is being ran from outside of the Audio data directory.\n"
|
||||||
|
"In the example below, the full path for 'ParentDirectory' must be passed to this command.\n"
|
||||||
|
"The path must not contain spaces.\n"
|
||||||
|
"```\n"
|
||||||
|
"ParentDirectory\n"
|
||||||
|
" |__ localtracks (folder)\n"
|
||||||
|
" | |__ Awesome Album Name (folder)\n"
|
||||||
|
" | |__01 Cool Song.mp3\n"
|
||||||
|
" | |__02 Groovy Song.mp3\n"
|
||||||
|
" |\n"
|
||||||
|
" |__ Lavalink.jar\n"
|
||||||
|
" |__ application.yml\n"
|
||||||
|
"```\n"
|
||||||
|
"The folder path given to this command must contain the Lavalink.jar, the application.yml, and the localtracks folder.\n"
|
||||||
|
"Use this command with no path given to reset it to the default, the Audio data directory for this bot.\n"
|
||||||
|
"Do you want to continue to set the provided path for local tracks?"
|
||||||
|
)
|
||||||
|
info = await ctx.maybe_send_embed(info_msg)
|
||||||
|
|
||||||
|
start_adding_reactions(info, ReactionPredicate.YES_OR_NO_EMOJIS)
|
||||||
|
pred = ReactionPredicate.yes_or_no(info, ctx.author)
|
||||||
|
await ctx.bot.wait_for("reaction_add", check=pred)
|
||||||
|
|
||||||
|
if not pred.result:
|
||||||
|
try:
|
||||||
|
await info.delete()
|
||||||
|
except discord.errors.Forbidden:
|
||||||
|
pass
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
if os.getcwd() != local_path:
|
||||||
|
os.chdir(local_path)
|
||||||
|
os.listdir(local_path)
|
||||||
|
except OSError:
|
||||||
|
return await self._embed_msg(
|
||||||
|
ctx,
|
||||||
|
_("{local_path} does not seem like a valid path.").format(local_path=local_path),
|
||||||
|
)
|
||||||
|
|
||||||
|
jar_check = os.path.isfile(local_path + "/Lavalink.jar")
|
||||||
|
yml_check = os.path.isfile(local_path + "/application.yml")
|
||||||
|
|
||||||
|
if not jar_check and not yml_check:
|
||||||
|
filelist = "a Lavalink.jar and an application.yml"
|
||||||
|
elif jar_check and not yml_check:
|
||||||
|
filelist = "an application.yml"
|
||||||
|
elif not jar_check and yml_check:
|
||||||
|
filelist = "a Lavalink.jar"
|
||||||
|
else:
|
||||||
|
filelist = None
|
||||||
|
if filelist is not None:
|
||||||
|
warn_msg = _(
|
||||||
|
"The path that was entered does not have {filelist} file in "
|
||||||
|
"that location. The path will still be saved, but please check the path and "
|
||||||
|
"the file location before attempting to play local tracks or start your "
|
||||||
|
"Lavalink.jar."
|
||||||
|
).format(filelist=filelist)
|
||||||
|
await self._embed_msg(ctx, warn_msg)
|
||||||
|
|
||||||
|
await self.config.localpath.set(local_path)
|
||||||
|
await self._embed_msg(
|
||||||
|
ctx, _("Localtracks path set to: {local_path}.").format(local_path=local_path)
|
||||||
|
)
|
||||||
|
|
||||||
@audioset.command()
|
@audioset.command()
|
||||||
@checks.mod_or_permissions(administrator=True)
|
@checks.mod_or_permissions(administrator=True)
|
||||||
async def maxlength(self, ctx, seconds):
|
async def maxlength(self, ctx, seconds):
|
||||||
@ -412,6 +494,7 @@ class Audio(commands.Cog):
|
|||||||
@audioset.command()
|
@audioset.command()
|
||||||
async def settings(self, ctx):
|
async def settings(self, ctx):
|
||||||
"""Show the current settings."""
|
"""Show the current settings."""
|
||||||
|
is_owner = ctx.author.id == self.bot.owner_id
|
||||||
data = await self.config.guild(ctx.guild).all()
|
data = await self.config.guild(ctx.guild).all()
|
||||||
global_data = await self.config.all()
|
global_data = await self.config.all()
|
||||||
dj_role_obj = ctx.guild.get_role(data["dj_role"])
|
dj_role_obj = ctx.guild.get_role(data["dj_role"])
|
||||||
@ -458,8 +541,10 @@ class Audio(commands.Cog):
|
|||||||
"---Lavalink Settings--- \n"
|
"---Lavalink Settings--- \n"
|
||||||
"Cog version: [{version}]\n"
|
"Cog version: [{version}]\n"
|
||||||
"Jar build: [{jarbuild}]\n"
|
"Jar build: [{jarbuild}]\n"
|
||||||
"External server: [{use_external_lavalink}]"
|
"External server: [{use_external_lavalink}]\n"
|
||||||
).format(version=__version__, jarbuild=jarbuild, **global_data)
|
).format(version=__version__, jarbuild=jarbuild, **global_data)
|
||||||
|
if is_owner:
|
||||||
|
msg += _("Localtracks path: [{localpath}]\n").format(**global_data)
|
||||||
|
|
||||||
embed = discord.Embed(colour=await ctx.embed_colour(), description=box(msg, lang="ini"))
|
embed = discord.Embed(colour=await ctx.embed_colour(), description=box(msg, lang="ini"))
|
||||||
return await ctx.send(embed=embed)
|
return await ctx.send(embed=embed)
|
||||||
@ -778,11 +863,10 @@ class Audio(commands.Cog):
|
|||||||
)
|
)
|
||||||
track_listing = []
|
track_listing = []
|
||||||
if ctx.invoked_with == "search":
|
if ctx.invoked_with == "search":
|
||||||
|
local_path = await self.config.localpath()
|
||||||
for localtrack_location in folder_list:
|
for localtrack_location in folder_list:
|
||||||
track_listing.append(
|
track_listing.append(
|
||||||
localtrack_location.replace(
|
localtrack_location.replace("{}/localtracks/".format(local_path), "")
|
||||||
"{}/localtracks/".format(cog_data_path(raw_name="Audio")), ""
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
for localtrack_location in folder_list:
|
for localtrack_location in folder_list:
|
||||||
@ -808,7 +892,7 @@ class Audio(commands.Cog):
|
|||||||
await ctx.invoke(self.search, query=("folder:" + folder))
|
await ctx.invoke(self.search, query=("folder:" + folder))
|
||||||
|
|
||||||
async def _localtracks_check(self, ctx):
|
async def _localtracks_check(self, ctx):
|
||||||
audio_data = cog_data_path(raw_name="Audio")
|
audio_data = await self.config.localpath()
|
||||||
if os.getcwd() != audio_data:
|
if os.getcwd() != audio_data:
|
||||||
os.chdir(audio_data)
|
os.chdir(audio_data)
|
||||||
localtracks_folder = any(
|
localtracks_folder = any(
|
||||||
@ -1075,10 +1159,9 @@ class Audio(commands.Cog):
|
|||||||
return await self._get_spotify_tracks(ctx, query)
|
return await self._get_spotify_tracks(ctx, query)
|
||||||
|
|
||||||
if query.startswith("localtrack:"):
|
if query.startswith("localtrack:"):
|
||||||
|
local_path = await self.config.localpath()
|
||||||
await self._localtracks_check(ctx)
|
await self._localtracks_check(ctx)
|
||||||
query = query.replace("localtrack:", "").replace(
|
query = query.replace("localtrack:", "").replace(((local_path) + "/"), "")
|
||||||
(str(cog_data_path(raw_name="Audio")) + "/"), ""
|
|
||||||
)
|
|
||||||
allowed_files = (".mp3", ".flac", ".ogg")
|
allowed_files = (".mp3", ".flac", ".ogg")
|
||||||
if not self._match_url(query) and not (query.lower().endswith(allowed_files)):
|
if not self._match_url(query) and not (query.lower().endswith(allowed_files)):
|
||||||
query = "ytsearch:{}".format(query)
|
query = "ytsearch:{}".format(query)
|
||||||
@ -2256,9 +2339,8 @@ class Audio(commands.Cog):
|
|||||||
):
|
):
|
||||||
track_idx = i + 1
|
track_idx = i + 1
|
||||||
if command == "search":
|
if command == "search":
|
||||||
track_location = track.replace(
|
local_path = await self.config.localpath()
|
||||||
"localtrack:{}/localtracks/".format(cog_data_path(raw_name="Audio")), ""
|
track_location = track.replace("localtrack:{}/localtracks/".format(local_path), "")
|
||||||
)
|
|
||||||
track_match += "`{}.` **{}**\n".format(track_idx, track_location)
|
track_match += "`{}.` **{}**\n".format(track_idx, track_location)
|
||||||
else:
|
else:
|
||||||
track_match += "`{}.` **{}**\n".format(track[0], track[1])
|
track_match += "`{}.` **{}**\n".format(track[0], track[1])
|
||||||
@ -2577,7 +2659,8 @@ class Audio(commands.Cog):
|
|||||||
if command == "search":
|
if command == "search":
|
||||||
return await ctx.invoke(self.play, query=("localtracks/{}".format(search_choice)))
|
return await ctx.invoke(self.play, query=("localtracks/{}".format(search_choice)))
|
||||||
search_choice = search_choice.replace("localtrack:", "")
|
search_choice = search_choice.replace("localtrack:", "")
|
||||||
if not search_choice.startswith(str(cog_data_path(raw_name="Audio"))):
|
local_path = await self.config.localpath()
|
||||||
|
if not search_choice.startswith(local_path):
|
||||||
return await ctx.invoke(
|
return await ctx.invoke(
|
||||||
self.search, query=("localfolder:{}".format(search_choice))
|
self.search, query=("localfolder:{}".format(search_choice))
|
||||||
)
|
)
|
||||||
@ -2638,14 +2721,10 @@ class Audio(commands.Cog):
|
|||||||
search_list += "`{}.` **{}**\n".format(search_track_num, track)
|
search_list += "`{}.` **{}**\n".format(search_track_num, track)
|
||||||
folder = False
|
folder = False
|
||||||
else:
|
else:
|
||||||
|
local_path = await self.config.localpath()
|
||||||
search_list += "`{}.` **{}**\n".format(
|
search_list += "`{}.` **{}**\n".format(
|
||||||
search_track_num,
|
search_track_num,
|
||||||
track.replace(
|
track.replace("localtrack:{}/localtracks/".format(local_path), ""),
|
||||||
"localtrack:{}/localtracks/".format(
|
|
||||||
str(cog_data_path(raw_name="Audio"))
|
|
||||||
),
|
|
||||||
"",
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
folder = False
|
folder = False
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user