init repo
This commit is contained in:
commit
b7c9e76a02
50
.gitignore
vendored
Normal file
50
.gitignore
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Python specific
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Virtual environments
|
||||||
|
venv/
|
||||||
|
env/
|
||||||
|
*.egg-info/
|
||||||
|
|
||||||
|
# Docker specific
|
||||||
|
*.log
|
||||||
|
docker-compose.override.yml
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
*.egg
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# IDEs and editors
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.swn
|
||||||
63
Functionnalities/Audio_Player.py
Normal file
63
Functionnalities/Audio_Player.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import discord
|
||||||
|
from discord.ext import commands
|
||||||
|
import yt_dlp
|
||||||
|
|
||||||
|
ytdl = yt_dlp.YoutubeDL({
|
||||||
|
'format': 'm4a/bestaudio/best',
|
||||||
|
# ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments
|
||||||
|
'postprocessors': [{ # Extract audio using ffmpeg
|
||||||
|
'key': 'FFmpegExtractAudio',
|
||||||
|
'preferredcodec': 'm4a',
|
||||||
|
}]
|
||||||
|
})
|
||||||
|
ytdl.params.update({
|
||||||
|
'noplaylist': True, # Avoid downloading playlists
|
||||||
|
'quiet': True, # Suppress output
|
||||||
|
'skip_download': True, # Avoid downloading files
|
||||||
|
})
|
||||||
|
|
||||||
|
class YoutubePlayer(commands.Cog):
|
||||||
|
def __init__(self, url):
|
||||||
|
infos = ytdl.extract_info(url, download=False)
|
||||||
|
self.title = infos["title"]
|
||||||
|
self.url = infos["webpage_url"]
|
||||||
|
self.duration = infos["duration"]
|
||||||
|
formats = [elem for elem in infos["formats"] if elem["audio_ext"] != "none"]
|
||||||
|
if( len(formats) == 0):
|
||||||
|
raise Exception("No audio format found")
|
||||||
|
self.audio_url = formats[0]["url"]
|
||||||
|
|
||||||
|
class Audio_Player():
|
||||||
|
def __init__(self):
|
||||||
|
self.playlist = [] # List of songs to play
|
||||||
|
self.current_song = None # Currently playing song
|
||||||
|
pass
|
||||||
|
|
||||||
|
async def play(self, ctx, url: str):
|
||||||
|
"""Play a song from a URL."""
|
||||||
|
voice_channel = ctx.author.voice.channel
|
||||||
|
|
||||||
|
await ctx.message.delete()
|
||||||
|
|
||||||
|
if ctx.voice_client is None:
|
||||||
|
await voice_channel.connect()
|
||||||
|
else:
|
||||||
|
await ctx.voice_client.move_to(voice_channel)
|
||||||
|
|
||||||
|
if ctx.voice_client.is_playing():
|
||||||
|
ctx.voice_client.stop()
|
||||||
|
|
||||||
|
audio_source = discord.FFmpegPCMAudio(YoutubePlayer(url).audio_url)
|
||||||
|
audio_transformer = discord.PCMVolumeTransformer(audio_source, 0.40)
|
||||||
|
ctx.voice_client.play(audio_transformer, after=lambda _: print(f"Finished playing: {url}"))
|
||||||
|
|
||||||
|
await ctx.send(f"Now playing: {url}")
|
||||||
|
|
||||||
|
async def stop(self, ctx):
|
||||||
|
"""Stop the current song."""
|
||||||
|
if ctx.voice_client.is_playing():
|
||||||
|
ctx.voice_client.stop()
|
||||||
|
await ctx.send("Stopped playing.")
|
||||||
|
else:
|
||||||
|
await ctx.send("Not currently playing any song.")
|
||||||
|
await ctx.voice_client.disconnect()
|
||||||
13
compose.yml
Normal file
13
compose.yml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
services:
|
||||||
|
discord-bot:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: garuda-discord-bot
|
||||||
|
restart: unless-stopped
|
||||||
|
network_mode: bridge
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
volumes:
|
||||||
|
- ./data:/app/data
|
||||||
|
|
||||||
6
dockerfile
Normal file
6
dockerfile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
FROM alpine:latest
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
RUN apk add --no-cache python3 py3-pip ffmpeg
|
||||||
|
RUN pip3 install --no-cache-dir --break-system-packages -r requirements.txt
|
||||||
|
CMD ["python3", "main.py"]
|
||||||
33
main.py
Normal file
33
main.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import os
|
||||||
|
import discord
|
||||||
|
import logging
|
||||||
|
from discord.ext import commands
|
||||||
|
from Functionnalities import Audio_Player
|
||||||
|
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
intents = discord.Intents.default()
|
||||||
|
intents.message_content = True
|
||||||
|
|
||||||
|
bot = commands.Bot(command_prefix="!", intents=intents)
|
||||||
|
player = Audio_Player.Audio_Player()
|
||||||
|
|
||||||
|
@bot.command()
|
||||||
|
async def play(ctx, url: str):
|
||||||
|
try:
|
||||||
|
await player.play(ctx, url)
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.send(f"An error occurred: {e}")
|
||||||
|
print(f"Error: {e}")
|
||||||
|
|
||||||
|
@bot.command()
|
||||||
|
async def stop(ctx):
|
||||||
|
try:
|
||||||
|
await player.stop(ctx)
|
||||||
|
except Exception as e:
|
||||||
|
await ctx.send(f"An error occurred: {e}")
|
||||||
|
print(f"Error: {e}")
|
||||||
|
|
||||||
|
token = os.getenv("DISCORD_TOKEN")
|
||||||
|
bot.run(token)
|
||||||
5
requirements.txt
Normal file
5
requirements.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
aiohttp
|
||||||
|
PyNaCl
|
||||||
|
ffmpeg
|
||||||
|
yt-dlp
|
||||||
|
discord.py
|
||||||
Loading…
x
Reference in New Issue
Block a user