72 Commits
A-0.1 ... main

Author SHA1 Message Date
17cf18160c Some changes 2024-01-29 14:46:23 +01:00
Lukas Blacha
ab03ebb4da Still fixing the reactions 2023-02-11 01:49:03 +01:00
Lukas Blacha
d38d93e8cb Added re import 2023-02-11 01:32:33 +01:00
Lukas Blacha
c940d735d2 Added re import 2023-02-11 01:00:33 +01:00
Lukas Blacha
53109d68f9 Deleted unused import 2023-02-11 00:59:50 +01:00
Lukas Blacha
f55d45232c Fixed Reactions 2023-02-10 19:28:10 +01:00
Lukas Blacha
be7002bba5 Preps for youtube search selection 2023-02-10 15:18:24 +01:00
Lukas Blacha
c3eb9a9d73 Fixed Typing... 2023-02-08 19:01:07 +01:00
Lukas Blacha
67cb769111 Added auto-disconnect feature 2023-02-08 18:57:57 +01:00
Lukas Blacha
cde8430d53 Added auto-disconnect feature 2023-02-08 18:55:59 +01:00
Lukas Blacha
07ca78e1bc Added auto-disconnect feature 2023-02-08 18:54:39 +01:00
Lukas Blacha
fb0a12c213 Added auto-disconnect feature 2023-02-08 18:53:20 +01:00
Lukas Blacha
daaa120594 Added auto-disconnect feature 2023-02-08 18:52:58 +01:00
Lukas Blacha
f09d8e3e9c Added auto-disconnect feature 2023-02-08 18:50:58 +01:00
Lukas Blacha
0f16af383b Added auto-disconnect feature 2023-02-08 18:47:13 +01:00
Lukas Blacha
607752fd4f Added auto-disconnect feature 2023-02-08 18:44:45 +01:00
Lukas Blacha
b2d843324d Added auto-disconnect feature 2023-02-08 18:43:11 +01:00
Lukas Blacha
7ce9e51155 Added auto-disconnect feature 2023-02-08 18:40:54 +01:00
Lukas Blacha
8ff36532cc Added auto-disconnect feature 2023-02-08 18:38:21 +01:00
Lukas Blacha
26a2d07714 Added auto-disconnect feature 2023-02-08 18:31:04 +01:00
Lukas Blacha
4a0c0161bd Added auto-disconnect feature 2023-02-08 18:30:03 +01:00
Lukas Blacha
a16a1e3ad2 Added auto-disconnect feature 2023-02-08 18:19:55 +01:00
Lukas Blacha
a194d4a4ef Added auto-disconnect feature 2023-02-08 18:17:31 +01:00
Lukas Blacha
f9e5ade444 Added prefix flag for Startup (Standard "<") 2023-02-08 18:15:48 +01:00
Lukas Blacha
40671616f3 Added prefix flag for Startup (Standard "<") 2023-02-08 17:59:01 +01:00
Lukas Blacha
116e7e6d15 Added prefix flag for Startup (Standard "<") 2023-02-08 17:57:28 +01:00
Lukas Blacha
443eec8320 Added cores flag for Startup 2023-02-08 17:42:53 +01:00
Lukas Blacha
71e76d754d Changed Version and Branch (0.2, main) 2023-02-08 13:19:49 +01:00
Lukas Blacha
be24384610 Added Youtube Search-Command 2023-02-08 13:14:23 +01:00
Lukas Blacha
e1f1fedfdf Added youtube_search method 2023-02-08 12:54:36 +01:00
Lukas Blacha
4aabde261b Added youtube_search method 2023-02-08 12:48:01 +01:00
Lukas Blacha
53f175379f Added youtube_search method 2023-02-08 12:47:08 +01:00
Lukas Blacha
6993fde7d8 Changed Google-Search to Youtube (fix) 2023-02-08 12:42:49 +01:00
Lukas Blacha
bc8b212504 Changed Google-Search to Youtube (fix) 2023-02-08 12:42:14 +01:00
Lukas Blacha
e51f75c57c Changed Google-Search to Youtube (fix) 2023-02-08 12:39:56 +01:00
Lukas Blacha
08934559b8 Changed Google-Search to Youtube (fix) 2023-02-08 12:16:41 +01:00
Lukas Blacha
93fdfb1f77 Changed Google-Search to Youtube (fix) 2023-02-08 12:15:27 +01:00
Lukas Blacha
9b1e473ec1 Changed Google-Search to Youtube (fix) 2023-02-08 12:15:03 +01:00
Lukas Blacha
7ffc356b1c Changed Google-Search to Youtube (fix) 2023-02-08 12:14:00 +01:00
Lukas Blacha
71bd1f6ae5 Changed Google-Search to Youtube (fix) 2023-02-08 12:11:04 +01:00
Lukas Blacha
5d58d05668 Changed Google-Search to Youtube 2023-02-08 12:10:18 +01:00
Lukas Blacha
c1e731aa4d Added branch variable 2023-02-08 11:45:52 +01:00
Lukas Blacha
c08bad409f Added Google-Command 2023-02-08 11:42:24 +01:00
Lukas Blacha
fadb42bbf6 Removed help-Command 2023-02-07 23:18:57 +01:00
Lukas Blacha
5fddad561d Removed help-Command 2023-02-07 23:16:02 +01:00
Lukas Blacha
651cf70885 Removed help-Command 2023-02-07 23:14:07 +01:00
Lukas Blacha
02609a65e5 Added Shutdown-Command with cleanup 2023-02-07 23:12:03 +01:00
Lukas Blacha
837686c71d Added Shutdown-Command with cleanup 2023-02-07 23:10:05 +01:00
Lukas Blacha
6b8a8a0dfc Added Shutdown-Command with cleanup 2023-02-07 23:05:31 +01:00
Lukas Blacha
9540f37d06 Added Shutdown-Command 2023-02-07 23:02:51 +01:00
Lukas Blacha
f87f878ca4 Added threads flag 2023-02-07 22:58:10 +01:00
Gitea
52cf259c20 Made the bot working again... 2023-02-07 21:55:41 +00:00
Gitea
3893e6ddc0 Removed maxrate flag 2023-02-07 21:48:25 +00:00
Gitea
de2779b61f Removed OPUS decoder 2023-02-07 21:47:20 +00:00
Lukas Blacha
6070780b0a Added threads flag 2023-02-07 22:45:19 +01:00
Lukas Blacha
c2e3081995 Added threads flag 2023-02-07 22:42:04 +01:00
Lukas Blacha
7e0a927c2b Added threads flag 2023-02-07 22:35:48 +01:00
Lukas Blacha
ba14c23ed9 Switched back to ffmepgPCM 2023-02-07 22:32:28 +01:00
Lukas Blacha
e770272bc4 Switched back to ffmepgPCM 2023-02-07 22:31:08 +01:00
Lukas Blacha
f6439245c6 Switched back to ffmepgPCM 2023-02-07 22:27:45 +01:00
Lukas Blacha
3496e0e5a7 Switched to OpusVoice 2023-02-07 22:24:06 +01:00
Lukas Blacha
22e74ff829 Switched to OpusVoice 2023-02-07 22:23:01 +01:00
Lukas Blacha
467f2dd00b Switched to OpusVoice 2023-02-07 22:21:01 +01:00
Lukas Blacha
dec4be3d1b Switched to OpusVoice 2023-02-07 22:14:00 +01:00
Lukas Blacha
7a09c752e9 Switched to OpusVoice 2023-02-07 22:09:38 +01:00
Lukas Blacha
93ec9ca2ec Switched to OpusVoice 2023-02-07 22:08:20 +01:00
Lukas Blacha
9f61462777 Switched to OpusVoice 2023-02-07 22:07:41 +01:00
Lukas Blacha
1d5e32eec0 Switched to OpusVoice 2023-02-07 22:04:51 +01:00
Lukas Blacha
b286d8338e Switched to OpusVoice 2023-02-07 22:01:19 +01:00
Lukas Blacha
9735a408c9 Added bot=True, reconnect=True 2023-02-07 21:37:27 +01:00
Lukas
e9bcaa210c Deleted compiled version 2023-02-07 15:42:23 +00:00
Lukas Blacha
ede2a02bb7 Fixes 2023-02-07 16:38:48 +01:00
3 changed files with 158 additions and 24 deletions

View File

@@ -1,9 +1,13 @@
import asyncio import asyncio
from datetime import timedelta import datetime
import re
from pytube import YouTube
import aiohttp
import yt_dlp import yt_dlp
import discord import discord
import logging import logging
import argparse import argparse
import os
from discord.ext import commands from discord.ext import commands
from discord import Embed from discord import Embed
@@ -13,16 +17,34 @@ banner = """
| | | | \__ \ | ( _____| | | ( | | | | | | \__ \ | ( _____| | | ( | |
_| _| \__,_| ____/ _| \___| ____/ \___/ \__| _| _| \__,_| ____/ _| \___| ____/ \___/ \__|
""" """
version = "0.1" version = "0.1"
branch = "dev"
success = "**Success ✅**\n" success = "**Success ✅**\n"
warning = "**Warning **\n" warning = "**Warning **\n"
error = "**Error ❗️**\n" error = "**Error ❗️**\n"
cache_dir = "cache"
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-t", "--token", help="Bot TOKEN") parser.add_argument("-t", "--token", help="Bot TOKEN")
parser.add_argument("-c", "--cores", help="Number of Cores for ffmpeg (Standard 2)")
parser.add_argument("-p", "--prefix", help="Provides the Prefix for the bot (Standard <)")
args = parser.parse_args() args = parser.parse_args()
if args.token == None:
if args.cores is None:
threads = 2
else:
threads = int(args.cores)
if args.prefix is None:
b_prefix = "<"
else:
b_prefix = str(args.prefix)
if args.token is None:
print(f"{banner}\n\nPLEASE PROVIDE BOT A TOKEN BY RUNNING LIKE THE FOLLOWING:") print(f"{banner}\n\nPLEASE PROVIDE BOT A TOKEN BY RUNNING LIKE THE FOLLOWING:")
print("\n") print("\n")
print(">>> python3 Music-Bot.py -t TOKEN <<<") print(">>> python3 Music-Bot.py -t TOKEN <<<")
@@ -33,7 +55,7 @@ else:
ytdl_format_options = { ytdl_format_options = {
"format": "bestaudio/mp3", "format": "bestaudio/mp3",
"outtmpl": "cache/%(extractor)s-%(id)s-%(title)s.mp3", "outtmpl": f"{cache_dir}/%(extractor)s-%(id)s-%(title)s.mp3",
"restrictfilenames": True, "restrictfilenames": True,
"noplaylist": True, "noplaylist": True,
"nocheckcertificate": True, "nocheckcertificate": True,
@@ -76,35 +98,59 @@ else:
data = data["entries"][0] data = data["entries"][0]
filename = data["url"] if stream else ytdl.prepare_filename(data) filename = data["url"] if stream else ytdl.prepare_filename(data)
return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data) return cls(discord.FFmpegPCMAudio(source=filename, executable="ffmpeg", pipe=False, stderr=False,
before_options=f"-threads {threads}", options=ffmpeg_options), data=data)
async def youtube_search(search: str):
p = {"search_query": search}
# Spoof a user agent header or the request will immediately fail
h = {"User-Agent": "Mozilla/5.0"}
async with aiohttp.ClientSession() as client:
async with client.get("https://www.youtube.com/results", params=p, headers=h) as resp:
dom = await resp.text()
result = list(set(re.findall(r"watch\?v=(\S{11})", dom)))[0:5]
return result
intents = discord.Intents.default() intents = discord.Intents.default()
intents.message_content = True intents.message_content = True
bot = commands.Bot( bot = commands.Bot(
command_prefix=commands.when_mentioned_or("!"), command_prefix=commands.when_mentioned_or(b_prefix),
description="Relatively simple music bot example", description="BCA Music-Bot",
intents=intents, intents=intents, help_command=None
) )
@bot.event @bot.event
async def on_ready(): async def on_ready():
print(banner) print(banner)
print(f"Bot Version: {version}") print(f"Bot Version: {version} ({branch})")
print(f"Bot: {bot.user} (ID: {bot.user.id})") print(f"Bot: {bot.user} (ID: {bot.user.id})")
print(f"Threads for ffmpeg: {threads}")
print(f"Prefix: {b_prefix}")
print( print(
f"Invitation LINK: https://discord.com/api/oauth2/authorize?client_id={bot.user.id}&permissions=968552344896&scope=bot%20applications.commands") f"Invitation LINK: https://discord.com/api/oauth2/authorize?client_id={bot.user.id}"
f"&permissions=968552344896&scope=bot%20applications.commands")
print("------") print("------")
@bot.command(name="shutdown")
@commands.is_owner()
async def _shutdown(ctx):
files = os.listdir(cache_dir)
async with ctx.channel.typing():
for file in files:
os.remove(f"{cache_dir}/{file}")
await ctx.send(f"{warning}Cleaned up {len(files)} Files...\n\n{success}Shutting down...")
await bot.close()
@bot.slash_command(name="join", description="Summon the bot into your channel") @bot.slash_command(name="join", description="Summon the bot into your channel")
async def join(ctx: commands.Context): async def join(ctx: commands.Context):
try: try:
channel = ctx.author.voice.channel channel = ctx.author.voice.channel
except Exception as err:
print(err)
if channel is None: if channel is None:
await ctx.send(f"{error}You are not in a voice-channel! Could not join...") await ctx.send(f"{error}You are not in a voice-channel! Could not join...")
if ctx.voice_client is not None: if ctx.voice_client is not None:
@@ -112,6 +158,8 @@ else:
await ctx.respond(f"{success}Connected to `{channel.name}`") await ctx.respond(f"{success}Connected to `{channel.name}`")
await channel.connect() await channel.connect()
except Exception as err:
print(err)
@bot.slash_command(name="nowplaying", descriprion="Show details what the bot is currently playing") @bot.slash_command(name="nowplaying", descriprion="Show details what the bot is currently playing")
@@ -145,6 +193,10 @@ else:
raise commands.CommandError(err) raise commands.CommandError(err)
finally: finally:
await ctx.send(f"{success}Now playing: `{player.title}`\nRequested by {ctx.author.mention}") await ctx.send(f"{success}Now playing: `{player.title}`\nRequested by {ctx.author.mention}")
while ctx.voice_client.is_playing():
await asyncio.sleep(3)
else:
await ctx.voice_client.disconnect(force=True)
@bot.slash_command(name="stream", description="Streams a song from YouTube [Without preloading]") @bot.slash_command(name="stream", description="Streams a song from YouTube [Without preloading]")
@@ -154,8 +206,11 @@ else:
ctx.voice_client.play( ctx.voice_client.play(
player, after=lambda e: print(f"Player error: {e}") if e else None player, after=lambda e: print(f"Player error: {e}") if e else None
) )
await ctx.respond(f"{success}Now playing: `{player.title}`\nRequested by {ctx.author.mention}") await ctx.respond(f"{success}Now playing: `{player.title}`\nRequested by {ctx.author.mention}")
while ctx.voice_client.is_playing():
await asyncio.sleep(3)
else:
await ctx.voice_client.disconnect()
@bot.slash_command(name="pause", description="Pauses the playback") @bot.slash_command(name="pause", description="Pauses the playback")
@@ -184,8 +239,84 @@ else:
await ctx.voice_client.disconnect(force=True) await ctx.voice_client.disconnect(force=True)
@bot.slash_command(name="youtube", description="Searches YouTube for a given string and plays the first result")
async def youtube(ctx, *, search: str):
results = await youtube_search(search=search)
embed = Embed(title=f"", color=discord.Color.green())
embed.add_field(name="", value="", inline=False)
counter = 1
for result in results:
url = f"https://youtube.com/watch?v={result}"
video = YouTube(url)
embed.add_field(name="", value=f"{counter} | `[{str(datetime.timedelta(seconds=video.length))}]` "
f"[{video.title}]({url}{result[counter-1]}) {video.author}", inline=False)
counter += 1
await ctx.respond(f"{success}**🎶 Search results for `{search}`**")
msg = await ctx.send(embed=embed)
await msg.add_reaction("1")
await msg.add_reaction("2")
await msg.add_reaction("3")
await msg.add_reaction("4")
await msg.add_reaction("5")
await msg.add_reaction("")
try:
reaction = await bot.wait_for(event='reaction_add', timeout=60.0)
except asyncio.TimeoutError:
await ctx.send('👎')
else:
vid_id = "https://youtube.com/watch?v="
if str(reaction[0]) == "1":
vid_id += results[0]
if str(reaction[0]) == "2":
vid_id += results[1]
if str(reaction[0]) == "3":
vid_id += results[2]
if str(reaction[0]) == "5":
vid_id += results[3]
if str(reaction[0]) == "5":
vid_id += results[4]
else:
vid_id = None
print(vid_id)
if vid_id is None:
pass
else:
try:
player = await YTDLSource.from_url(vid_id, loop=bot.loop)
ctx.voice_client.play(
player, after=lambda e: print(f"Player error: {e}") if e else None
)
except discord.HTTPException as err:
raise commands.CommandError(err)
finally:
await ctx.send(f"{success}Now playing: `{player.title}`\nRequested by {ctx.author.mention}")
while ctx.voice_client.is_playing():
await asyncio.sleep(3)
else:
await ctx.voice_client.disconnect(force=True)
"""
async with ctx.typing():
await ctx.respond("🤖 Your song is queued for download... please wait ", ephemeral=True)
try:
player = await YTDLSource.from_url(url, loop=bot.loop)
ctx.voice_client.play(
player, after=lambda e: print(f"Player error: {e}") if e else None
)
except discord.HTTPException as err:
raise commands.CommandError(err)
finally:
await ctx.send(f"{success}Now playing: `{player.title}`\nRequested by {ctx.author.mention}")
while ctx.voice_client.is_playing():
await asyncio.sleep(3)
else:
await ctx.voice_client.disconnect()
"""
@play.before_invoke @play.before_invoke
@stream.before_invoke @stream.before_invoke
#@youtube.before_invoke
async def ensure_voice(ctx: commands.Context): async def ensure_voice(ctx: commands.Context):
if ctx.voice_client is None: if ctx.voice_client is None:
if ctx.author.voice: if ctx.author.voice:
@@ -196,19 +327,22 @@ else:
ctx.voice_client.stop() ctx.voice_client.stop()
"""
@bot.event @bot.event
async def on_application_command_error(ctx, error): async def on_application_command_error(ctx, error):
print(f"[on_application_command_error]\n{ctx.author}\n{error}") print(f"[on_application_command_error]\n{ctx.author}\n{error}")
if isinstance(error, discord.ext.commands.CommandError): if isinstance(error, discord.ext.commands.CommandError):
cool_down_time = int(error.cooldown.get_retry_after()) embed = Embed(title=f"{warning}{error}",
td = timedelta(seconds=cool_down_time)
embed = Embed(title=f"{warning}Dieser Command befindet sich im Cool Down!\n Versuche es in `{td}` nochmal!",
color=15158332) color=15158332)
elif isinstance(error, discord.ext.commands.CommandOnCooldown): elif isinstance(error, discord.ext.commands.CommandOnCooldown):
cool_down_time = int(error.cooldown.get_retry_after()) cool_down_time = int(error.cooldown.get_retry_after())
td = timedelta(seconds=cool_down_time) td = timedelta(seconds=cool_down_time)
embed = Embed(title=f"{warning}Dieser Command befindet sich im Cool Down!\n Versuche es in `{td}` nochmal!", embed = Embed(title=f"{warning}Dieser Command befindet sich im Cool Down!\n Versuche es in `{td}` nochmal!",
color=15158332) color=15158332)
elif isinstance(error, discord.ext.commands.is_owner()):
embed = Embed(title=f"{warning}{error}",
color=15158332)
else: else:
embed = Embed(title=f"{error}", color=15158332) embed = Embed(title=f"{error}", color=15158332)
await ctx.respond(embed=embed) await ctx.respond(embed=embed)
@@ -219,6 +353,6 @@ else:
print(f"[on_command_error]\n{ctx.author}\n{error}") print(f"[on_command_error]\n{ctx.author}\n{error}")
embed = Embed(title=f"{error}", color=15158332) embed = Embed(title=f"{error}", color=15158332)
await ctx.send(embed=embed) await ctx.send(embed=embed)
"""
bot.run(token=args.token, reconnect=True)
bot.run(args.token)

Binary file not shown.

View File

@@ -10,7 +10,7 @@ Simple Music-Bot for Discord written in Python with <3
## How to start ## How to start
1. Clone the repository 1. Clone the repository
2. cd into it 2. cd into it
3. Run the **compiled** version: python3 Music-Bot.pyc -t TOKEN 3. Run : python3 Music-Bot.pyc -t TOKEN
4. Click on the invitation-Link in the terminal 4. Click on the invitation-Link in the terminal
5. DONE <3 5. DONE <3