Added local mp3/flac support

This commit is contained in:
Twentysix 2016-01-04 18:02:45 +01:00
parent a6193e1f37
commit fbea3e91dd
2 changed files with 85 additions and 20 deletions

2
localtracks/README.txt Normal file
View File

@ -0,0 +1,2 @@
Insert your local playlists folders here. Every folder counts as a different playlist and can contain
.mp3 and .flac files. No spaces allowed in their filenames, use underscores instead.

87
red.py
View File

@ -17,6 +17,7 @@ import re
import youtube_dl import youtube_dl
import os import os
import asyncio import asyncio
import glob
from os import path from os import path
from random import choice, randint, shuffle from random import choice, randint, shuffle
@ -71,12 +72,16 @@ audio_help = """
**Playlist commands:** **Playlist commands:**
!play [playlist_name] - Play chosen playlist !play [playlist_name] - Play chosen playlist
!playlists - Playlist's list !playlists - Playlists' list
!shuffle - Mix music list !shuffle - Mix music list
!addplaylist [name] [link] - Add a youtube playlist. Link format example: https://www.youtube.com/playlist?list=PLe8jmEHFkvsaDOOWcREvkgFoj6MD0pXXX !addplaylist [name] [link] - Add a youtube playlist. Link format example: https://www.youtube.com/playlist?list=PLe8jmEHFkvsaDOOWcREvkgFoj6MD0pXXX
!delplaylist [name] - Delete a youtube playlist. Limited to author and admins. !delplaylist [name] - Delete a youtube playlist. Limited to author and admins.
!getplaylist - Receive the current playlist through DM. This also works with favorites. !getplaylist - Receive the current playlist through DM. This also works with favorites.
**Local commands:**
!local [playlist_name] - Play chosen local playlist
!locallist or !local or !locals - Local playlists' list
**Favorites:** **Favorites:**
!addfavorite - Add song to your favorites !addfavorite - Add song to your favorites
!delfavorite - Remove song from your favorites !delfavorite - Remove song from your favorites
@ -157,6 +162,11 @@ async def on_message(message):
################## music ####################### ################## music #######################
elif message.content.startswith('!play '): elif message.content.startswith('!play '):
await playPlaylist(message) await playPlaylist(message)
elif message.content.startswith('!local '):
await playLocal(message)
elif message.content == "!local" or message.content == "!locallist" or message.content == "!locals":
await listLocal(message)
await client.send_message(message.channel, "{} `Check your DMs for the local playlists list.`".format(message.author.mention))
elif message.content == "!stop": elif message.content == "!stop":
await leaveVoice() await leaveVoice()
elif message.content == "!playlist" or message.content == "!playlists": elif message.content == "!playlist" or message.content == "!playlists":
@ -374,6 +384,8 @@ class Playlist():
self.playlist = dataIO.fileIO("playlists/" + filename["filename"] + ".txt", "load")["playlist"] self.playlist = dataIO.fileIO("playlists/" + filename["filename"] + ".txt", "load")["playlist"]
elif filename["type"] == "favorites": elif filename["type"] == "favorites":
self.playlist = dataIO.fileIO("favorites/" + filename["filename"] + ".txt", "load") self.playlist = dataIO.fileIO("favorites/" + filename["filename"] + ".txt", "load")
elif filename["type"] == "local":
self.playlist = filename["filename"]
else: else:
raise("Invalid playlist call.") raise("Invalid playlist call.")
self.nextSong(0) self.nextSong(0)
@ -384,10 +396,14 @@ class Playlist():
if musicPlayer: musicPlayer.stop() if musicPlayer: musicPlayer.stop()
self.lastAction = int(time.perf_counter()) self.lastAction = int(time.perf_counter())
try: try:
if isPlaylistValid([self.playlist[nextTrack]]): #Checks if it's a valid youtube link
musicPlayer = client.voice.create_ytdl_player(self.playlist[nextTrack], options=youtube_dl_options) musicPlayer = client.voice.create_ytdl_player(self.playlist[nextTrack], options=youtube_dl_options)
musicPlayer.start() musicPlayer.start()
except: else: # must be a local playlist then
print("Something went wrong with track " + self.playlist[self.current]) musicPlayer = client.voice.create_ffmpeg_player(self.playlist[nextTrack])
musicPlayer.start()
except Exception as e:
logger.warning("Something went wrong with track " + self.playlist[self.current])
if not lastError: #prevents error loop if not lastError: #prevents error loop
self.lastAction = 999 self.lastAction = 999
self.nextSong(self.getNextSong(), lastError=True) self.nextSong(self.getNextSong(), lastError=True)
@ -774,6 +790,44 @@ async def playPlaylist(message, sing=False):
musicPlayer.start() musicPlayer.start()
await client.send_message(message.channel, choice(msg)) await client.send_message(message.channel, choice(msg))
async def playLocal(message):
global currentPlaylist
msg = message.content.split(" ")
if await checkVoice(message):
if len(msg) == 2:
localplaylists = getLocalPlaylists()
if localplaylists and ("/" not in msg[1] and "\\" not in msg[1]):
if msg[1] in localplaylists:
files = []
if glob.glob("localtracks\\" + msg[1] + "\\*.mp3"):
files.extend(glob.glob("localtracks\\" + msg[1] + "\\*.mp3"))
if glob.glob("localtracks\\" + msg[1] + "\\*.flac"):
files.extend(glob.glob("localtracks\\" + msg[1] + "\\*.flac"))
stopMusic()
data = {"filename" : files, "type" : "local"}
currentPlaylist = Playlist(data)
await asyncio.sleep(2)
await currentPlaylist.songSwitcher()
else:
await client.send_message(message.channel, "`There is no local playlist called {}. !local or !locallist to receive the list.`".format(msg[1]))
else:
await client.send_message(message.channel, "`There are no valid playlists in the localtracks folder.`")
else:
await client.send_message(message.channel, "`!local [playlist]`")
def getLocalPlaylists():
dirs = []
files = os.listdir("localtracks/")
for f in files:
if os.path.isdir("localtracks/" + f) and " " not in f:
if glob.glob("localtracks/" + f + "/*.mp3") != []:
dirs.append(f)
elif glob.glob("localtracks/" + f + "/*.flac") != []:
dirs.append(f)
if dirs != []:
return dirs
else:
return False
async def leaveVoice(): async def leaveVoice():
if client.is_voice_connected(): if client.is_voice_connected():
@ -783,6 +837,7 @@ async def leaveVoice():
async def listPlaylists(message): async def listPlaylists(message):
msg = "Available playlists: \n\n```" msg = "Available playlists: \n\n```"
files = os.listdir("playlists/") files = os.listdir("playlists/")
if files:
for i, f in enumerate(files): for i, f in enumerate(files):
if f.endswith(".txt"): if f.endswith(".txt"):
if i % 4 == 0 and i != 0: if i % 4 == 0 and i != 0:
@ -790,20 +845,28 @@ async def listPlaylists(message):
else: else:
msg = msg + f.replace(".txt", "") + "\t" msg = msg + f.replace(".txt", "") + "\t"
msg += "```" msg += "```"
"""
files = os.listdir("playlists/")
for f in files:
if f.endswith(".txt"):
msg = msg + f.replace(".txt", "") + "\t"
msg += "`"
"""
await client.send_message(message.author, msg) await client.send_message(message.author, msg)
else:
await client.send_message(message.author, "There are no playlists.")
async def listLocal(message):
msg = "Available local playlists: \n\n```"
dirs = getLocalPlaylists()
if dirs:
for i, d in enumerate(dirs):
if i % 4 == 0 and i != 0:
msg = msg + d + "\n"
else:
msg = msg + d + "\t"
msg += "```"
await client.send_message(message.author, msg)
else:
await client.send_message(message.author, "There are no local playlists.")
def stopMusic(): def stopMusic():
global musicPlayer, currentPlaylist global musicPlayer, currentPlaylist
if currentPlaylist != None: if currentPlaylist != None:
print("Stopping playlist")
currentPlaylist.stop = True currentPlaylist.stop = True
if musicPlayer != None: if musicPlayer != None:
musicPlayer.stop() musicPlayer.stop()
@ -969,7 +1032,7 @@ async def join(message):
if len(msg) > 1: if len(msg) > 1:
await client.accept_invite(msg[1]) await client.accept_invite(msg[1])
else: else:
print("Join: missing parameters") logger.warning("Join: missing parameters")
else: else:
await client.send_message(message.channel, "`I don't take orders from you.`") await client.send_message(message.channel, "`I don't take orders from you.`")