diff --git a/src/cogs/ollama.py b/src/cogs/ollama.py index e088025..7828bf9 100644 --- a/src/cogs/ollama.py +++ b/src/cogs/ollama.py @@ -501,9 +501,10 @@ class Ollama(commands.Cog): params = {"seed": self.history.get_thread(context)["seed"]} if give_acid is True: - params["temperature"] = 500 - params["top_k"] = 500 - params["top_p"] = 500 + params["temperature"] = 2 + params["top_k"] = 0 + params["top_p"] = 2 + params["repeat_penalty"] = 2 payload = { "model": model, @@ -533,8 +534,14 @@ class Ollama(commands.Cog): buffer.write(line["message"]["content"]) embed.description += line["message"]["content"] embed.timestamp = discord.utils.utcnow() - if len(embed.description) >= 4096: - embed.description = embed.description = "..." + line["message"]["content"] + if len(embed.description) >= 4000: + embed.description = "[...]" + line["message"]["content"] + if len(embed.description) >= 3250: + embed.colour = discord.Color.gold() + embed.set_footer(text="Warning: {:,}/4096 characters.".format(len(embed.description))) + else: + embed.colour = discord.Color.blurple() + embed.set_footer(text="Using server %r" % server, icon_url=server_config.get("icon_url")) if view.cancel.is_set(): break diff --git a/src/cogs/ytdl.py b/src/cogs/ytdl.py index e7e31e4..6701d81 100644 --- a/src/cogs/ytdl.py +++ b/src/cogs/ytdl.py @@ -4,6 +4,7 @@ import hashlib import logging import tempfile import textwrap +import subprocess import typing from pathlib import Path from urllib.parse import urlparse @@ -55,7 +56,7 @@ class YTDLCog(commands.Cog): "merge_output_format": "webm/mp4/mov/m4a/oga/ogg/mp3/mka/mkv", "source_address": "0.0.0.0", "concurrent_fragment_downloads": 4, - "max_filesize": (25 * 1024 * 1024) - 256 + # "max_filesize": (25 * 1024 * 1024) - 256 } self.colours = { "youtube.com": 0xff0000, @@ -106,6 +107,10 @@ class YTDLCog(commands.Cog): """ INSERT INTO downloads (key, message_id, channel_id, webpage_url, format_id, attachment_index) VALUES (?, ?, ?, ?, ?, ?) + ON CONFLICT (key) DO UPDATE SET + message_id=excluded.message_id, + channel_id=excluded.channel_id, + attachment_index=excluded.attachment_index """, (_hash, message.id, message.channel.id, webpage_url, format_id, attachment_index) ) @@ -155,6 +160,37 @@ class YTDLCog(commands.Cog): except IndexError: self.log.debug("Attachment index %d is out of range (%r)", attachment_index, message.attachments) return + + def convert_to_m4a(self, file: Path) -> Path: + """ + Converts a file to m4a format. + :param file: The file to convert + :return: The converted file + """ + new_file = file.with_suffix(".m4a") + args = [ + "-vn", + "-sn", + "-i", + str(file), + "-c:a", + "aac", + "-b:a", + "96k", + "-movflags", + "faststart", + "-y", + str(new_file) + ] + self.log.debug("Running command: ffmpeg %s", " ".join(args)) + process = subprocess.run( + ["ffmpeg", *args], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE + ) + if process.returncode != 0: + raise RuntimeError(process.stderr.decode()) + return new_file @commands.slash_command(name="yt-dl") @commands.max_concurrency(1, wait=False) @@ -341,8 +377,23 @@ class YTDLCog(commands.Cog): delete_after=120, ) try: - file = next(temp_dir.glob("*." + extracted_info["ext"])) + if audio_only is False: + file = next(temp_dir.glob("*." + extracted_info["ext"])) + else: + # can be .opus, .m4a, .mp3, .ogg, .oga + for _file in temp_dir.iterdir(): + if _file.suffix in (".opus", ".m4a", ".mp3", ".ogg", ".oga", ".aac", ".wav"): + file = _file + break + else: + raise StopIteration except StopIteration: + self.log.warning( + "Failed to locate downloaded file. Was supposed to be looking for a file extension of " + "%r amongst files %r, however none were found.", + extracted_info["ext"], + list(map(str, temp_dir.iterdir())) + ) return await ctx.edit( embed=discord.Embed( title="Error", @@ -381,7 +432,7 @@ class YTDLCog(commands.Cog): "-movflags", "faststart", "-b:a", - "48k", + "96k", "-y", "-strict", "2", @@ -396,6 +447,7 @@ class YTDLCog(commands.Cog): timestamp=discord.utils.utcnow() ) ) + self.log.debug("Running command: ffmpeg %s", " ".join(args)) process = await asyncio.create_subprocess_exec( "ffmpeg", *args, @@ -413,6 +465,10 @@ class YTDLCog(commands.Cog): ) ) file = new_file + + if audio_only and file.suffix != ".m4a": + self.log.info("Converting %r to m4a.", file) + file = await asyncio.to_thread(self.convert_to_m4a, file) stat = file.stat() size_bytes = stat.st_size