vrano714 / py_discord_local_music Goto Github PK
View Code? Open in Web Editor NEWPython script to listen local music files in the discord voice channel.
Python script to listen local music files in the discord voice channel.
I fixed a lot of errors in the code, and was able to launch the bot, but when i sending any command, bot does not know any command...
[2023-01-03 19:32:52] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "play" is not found
[2023-01-03 19:34:12] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "plat" is not found
[2023-01-03 19:34:21] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "play" is not found
[2023-01-03 19:34:32] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "play" is not found
[2023-01-03 19:35:49] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "play_song" is not found
[2023-01-03 19:36:00] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "q" is not found
[2023-01-03 19:36:04] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "quit" is not found
[2023-01-03 19:36:19] [ERROR ] discord.ext.commands.bot: Ignoring exception in command None
discord.ext.commands.errors.CommandNotFound: Command "join" is not found
This is final code what i edited
#-*-coding:utf-8-*-
import argparse
import asyncio
import json
import os
import discord
from discord.ext import commands
ffmpeg_options = {
'options': '-vn'
}
class MusicBot(commands.Cog):
def __init__(self, bot, db):
self.bot = bot
self.song_parent = db["files_dir"]
print("Music files will be loaded from {}.".format(self.song_parent))
self.song_database = db["songs"]
print("songs: ", end="")
for x in self.song_database:
print(x["song_keys"][0], ", ", end="")
print("")
self.playlist = []
self.current = "#NA"
self. ctx = None
self.volume = 0.2
self.parser = argparse.ArgumentParser()
self.parser.add_argument("--artist", action="store", nargs="+")
self.parser.add_argument("--song", action="store", nargs="+")
self.parser.add_argument("--album", action="store", nargs="+")
self.parser.add_argument("--random", action="store_true")
self.parser.add_argument("--all", action="store_true")
@commands.command()
async def join(self, ctx, *, channel: discord.VoiceChannel):
if ctx.voice_client is not None:
return await ctx.voice_client.move_to(channel)
self.ctx = ctx
await channel.connect()
def parse(self, query):
play_args = self.parser.parse_args(query.split(" "))
target_songs = []
# process args!
if "artist" in play_args and play_args.artist is not None:
print("Query artists: ", end="")
print(play_args.artist)
for artist in play_args.artist:
artist_clean = artist.lower().replace(" ", "") # sanitize
tmp = [x for x in self.song_database if artist_clean in x["artist_keys"]]
target_songs = [*target_songs, *tmp]
if "album" in play_args and play_args.album is not None:
print("Query album: ", end="")
print(play_args.album)
for album in play_args.album:
album_clean = album.lower().replace(" ", "")
tmp = [x for x in self.song_database if album_clean in x["album_keys"]]
target_songs = [*target_songs, *tmp]
if "song" in play_args and play_args.song is not None:
query_songs = [x.replace("\"", "").replace("\'", "") for x in play_args.song]
print("Query songs: ", end="")
print(query_songs)
if len(target_songs) != 0: # filter!
target_songs_new = []
for song in query_songs:
song_clean = song.lower().replace(" ", "")
tmp = [x for x in target_songs if song_clean in x["song_keys"]]
target_songs_new = [*target_songs_new, *tmp]
target_songs = target_songs_new
else:
for song in query_songs:
song_clean = song.lower().replace(" ", "")
tmp = [x for x in self.song_database if song_clean in x["song_keys"]]
target_songs = [*target_songs, *tmp]
return target_songs
@commands.command()
async def add(self, ctx, *, query):
self.ctx = ctx
target_songs = self.parse(query)
self.playlist = [*self.playlist, *target_songs]
@commands.command()
async def play(self, ctx, *, query):
self.ctx = ctx
print("Incoming query: ", query)
target_songs = self.parse(query)
self.playlist = [*self.playlist, *target_songs]
print("Current playlist: ", end="")
for x in self.playlist:
print(" {} by {}".format(x["song_keys"][0], x["artist_keys"][0]))
if ctx.voice_client.is_playing():
ctx.voice_client.stop()
else:
await self.play_song(None)
async def play_song(self, error):
if error is not None:
print("Error: {}".format(e))
return
print("Checking playlist...")
if len(self.playlist) == 0:
await self.ctx.send("Playlist empty")
self.is_playing = False
return
print("looking for the file")
target_file_path = os.path.join(self.song_parent, self.playlist[0]["filename"])
target_song = self.playlist[0]["song_keys"][0]
target_artist = self.playlist[0]["artist_keys"][0]
del self.playlist[0]
await self.ensure_voice(self.ctx)
source = discord.PCMVolumeTransformer(
discord.FFmpegPCMAudio(target_file_path, options="-b:a 128k")
)
source.volume = self.volume
await self.ctx.send("Now playing: {} by {}".format(target_song, target_artist))
self.current = "{} by {}".format(target_song, target_artist)
self.ctx.voice_client.play(
source,
after=self.dispatch_play_song
)
print("Now playing: {} by {}".format(target_song, target_artist))
def dispatch_play_song(self, e):
print("dispatch!")
if e is not None:
print("Error: ", end="")
print(e)
return
# asyncio.run(self.play_song(None), self.bot.loop)
coro = self.play_song(None)
fut = asyncio.run_coroutine_threadsafe(coro, self.bot.loop)
try:
print("fut.result")
fut.result()
except:
pass
return
@commands.command()
async def pause(self, ctx):
if ctx.voice_client.is_playing():
ctx.voice_client.pause()
@commands.command()
async def resume(self, ctx):
if ctx.voice_client.is_paused():
ctx.voice_client.resume()
@commands.command()
async def skip(self, ctx, *, how_many=0):
m_del = int(how_many)
m_del = m_del if m_del <= len(self.playlist) else len(self.playlist)
for _ in range(m_del):
del self.playlist[0]
# await self.play_song(None)
ctx.voice_client.stop()
@commands.command()
async def show(self, ctx):
to_show = [
"Now playing: " + self.current,
"Songs in playlist: "
]
if len(self.playlist) == 0:
to_show[-1] = "Playlist empty"
for i, song in enumerate(self.playlist):
to_add = "{0:02d}. ".format(i) + song["song_keys"][0] + " by " + song["artist_keys"][0]
to_show.append(to_add)
await ctx.send("\n".join(to_show))
@commands.command()
async def quit(self, ctx):
self.playlist = []
ctx.voice_client.stop()
await ctx.voice_client.disconnect()
@commands.command()
async def q(self, ctx):
await self.quit(ctx)
@commands.command()
async def volume(self, ctx, volume: int):
if ctx.voice_client is None:
return await ctx.send("Not connected to a voice channel.")
self.volume = volume / 100
if ctx.voice_client.source is not None:
ctx.voice_client.source.volume = self.volume
await ctx.send("Changed volume to {}%".format(volume))
# これわるさしてるかも
@play.before_invoke
async def ensure_voice(self, ctx):
if ctx.voice_client is None:
if ctx.author.voice:
await ctx.author.voice.channel.connect()
else:
await ctx.send("You are not connected to a voice channel.")
raise commands.CommandError("Author not connected to a voice channel.")
elif ctx.voice_client.is_playing(): #こいつだああああああああああああああああああああああああ
pass
def main(args):
print("Initializing...")
if "token_file" in args:
with open(args.token_file, "r") as f:
tmp = json.load(f)
token = tmp["token"]
elif "token" in args:
token = args.token
print("Token loaded.")
# load database
with open(args.database, "r") as f:
db = json.load(f)
bot = commands.Bot(
intents=discord.Intents.all(),
command_prefix=commands.when_mentioned_or(">", "!"),
description='Plays local music file in voice channel'
)
@bot.event
async def on_ready():
print("Logged in as {0} ({0.id})".format(bot.user))
print('------')
bot.add_cog(MusicBot(bot, db))
bot.run(token)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
token_group = parser.add_mutually_exclusive_group(required=True)
token_group.add_argument("--token_file", action="store", help="json file which has discord bot token")
token_group.add_argument("--token", action="store", help="bot token")
parser.add_argument("--database", "-d", action="store", help="json file which has song file path and info", required=True)
args = parser.parse_args()
main(args)
Seems like no matter how I edit the JSON file I cannot get it to parse (keyerrors and such). Do you have a copy of the file you're using on your end?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.