Plex-Bot-Music/PlexBot/bot.py
Joshua Arulsamy ac25330f70 🔊 Add basic logging
2020-07-26 22:08:00 -06:00

130 lines
3.8 KiB
Python

from queue import Queue
import discord
from discord import FFmpegPCMAudio
from discord.ext import commands
from discord.ext.commands import command
from fuzzywuzzy import fuzz
from plexapi.server import PlexServer
import logging
logger = logging.getLogger("PlexBot")
class General(commands.Cog):
def __init__(self, bot):
self.bot = bot
@command()
async def kill(self, ctx):
await ctx.send(f"Stopping upon the request of {ctx.author.mention}")
await self.bot.close()
logger.info(f"Stopping upon the request of {ctx.author.mention}")
class Plex(commands.Cog):
def __init__(self, bot, base_url, plex_token, lib_name) -> None:
self.bot = bot
self.base_url = base_url
self.plex_token = plex_token
self.library_name = lib_name
self.pms = PlexServer(self.base_url, self.plex_token)
self.music = self.pms.library.section(self.library_name)
self.vc = None
self.current_track = None
self.play_queue = Queue()
logger.info("Started bot successfully")
# self.callback_ctx = None
def _search_tracks(self, title):
tracks = self.music.searchTracks()
score = [None, -1]
for i in tracks:
s = fuzz.ratio(title.lower(), i.title.lower())
if s > score[1]:
score[0] = i
score[1] = s
elif s == score[1]:
score[0] = i
return score[0]
@command()
async def hello(self, ctx, *, member: discord.member = None):
member = member or ctx.author
await ctx.send(f"Hello {member}")
async def _after_callback(self, error=None):
if self.play_queue.empty():
self.current_track = None
else:
track = self.play_queue.get()
audio_stream = FFmpegPCMAudio(track.getStreamURL())
self.vc.play(audio_stream)
self.current_track = track
await self.callback_ctx.send(f"Playing {track.title}")
@command()
async def play(self, ctx, *args):
title = " ".join(args)
track = self._search_tracks(title)
if track:
track_url = track.getStreamURL()
if not ctx.author.voice:
await ctx.send("Join a voice channel first!")
return
if not self.vc:
self.vc = await ctx.author.voice.channel.connect()
logger.debug("Connected to vc")
if self.vc.is_playing():
self.play_queue.put(track)
self.callback_ctx = ctx
await ctx.send(f"Added {track.title} to queue.")
logger.debug(f"Added {track.title} to queue.")
else:
audio_stream = FFmpegPCMAudio(track_url)
self.vc.play(audio_stream, after=self._after_callback)
self.current_track = track
logger.debug(f"Playing {track.title}")
await ctx.send(f"Playing {track.title}")
else:
logger.debug(f"{title} was not found.")
await ctx.send("Song not found!")
@command()
async def stop(self, ctx):
if self.vc:
self.vc.stop()
await self.vc.disconnect()
self.vc = None
await ctx.send("Stopped")
@command()
async def pause(self, ctx):
if self.vc:
await self.vc.pause()
await ctx.send("Paused")
@command()
async def resume(self, ctx):
if self.vc:
await self.vc.resume()
await ctx.send("Resumed")
@command()
async def skip(self, ctx):
if self.vc:
await self.vc.stop()
if not self.play_queue.empty():
await self._after_callback()
@command()
async def np(self, ctx):
await ctx.send(f"Currently playing: {self.current_track.title}")