youtube-dl完成下载后,运行异步功能(python)
问题描述:
我一直在使用discord.py重写为python编写音乐bot。它通过youtube-
dl下载视频并通过语音聊天播放。我一直在努力扩展音乐,最近发现我完全忽略了某些东西。progress hooks
youtube-
dl的选项是同步的,而discord.py是异步的。youtube-
dl在下载视频时会生成一个子进程,而不是在当前线程上运行它,因此它不会挂起程序。下载完成后需要运行的功能是协程,因为它是discord.py的一部分
TL; DR,当youtube-dl下载完成时,我需要运行协程
我知道这是可能的,我之前已经看过它,但是不太了解。
这是我到目前为止的内容:
def log(text): print(Style.BRIGHT + Fore.WHITE + '[' + Fore.RED + 'Music' + Fore.WHITE + '] ' + Style.RESET_ALL + text) def sync_config(): raw_config.seek(0) raw_config.write(json.dumps(config)) raw_config.truncate() lookup_opts = { "simulate": True, "quiet" : True, #TODO: make this part of config.json } if not os.path.exists("plugins/music"): log("Config does not exist! Creating it for you..") os.makedirs("plugins/music") if not os.path.exists("plugins/music/cache"): os.makedirs("plugins/music/cache") if not os.path.exists("plugins/music/config.json"): with open('plugins/music/config.json', 'w+') as f: f.write('{}') log('Created config.json') raw_config = open('plugins/music/config.json', 'r+') config = json.load(raw_config) class Music: def __init__(self, bot): self.bot = bot @commands.command(hidden=True) async def clearcache(self, ctx): if ctx.author.id in ctx.bot.config["admins"]: log("Cache cleared!") await ctx.message.add_reaction("✅") shutil.rmtree("plugins/music/cache") os.makedirs("plugins/music/cache") else: await ctx.send(ctx.bot.denied()) @commands.command() async def play(self, ctx, url): """Download and play a link from youtube""" message = await ctx.send(f"Downloading <{url}>..") with youtube_dl.YoutubeDL(lookup_opts) as ydl: try: info = ydl.extract_info(url) await message.edit(content=f"Downloading {info['title']}..") except: await ctx.send("An error occured downloading that video! Are you sure that URL is correct?") def callback(d): if d['status'] == 'finished': loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(ctx.send("Done!")) print("Done!") download_opts = { "format": 'm4a/bestaudio/best', "quiet" : True, #TODO: make this part of config.json 'progress_hooks': [callback], } with youtube_dl.YoutubeDL(download_opts) as ydl: ydl.download([url])
我知道这在python 2.6中很容易实现。但是在Python 2.5中最简单的方法是什么?x = "This is my string"b = to_bytes(x) # I could do ...