From e1a364da5154b94b034c0c25af91de4dc61c38c6 Mon Sep 17 00:00:00 2001 From: Matthew Adams Date: Sat, 6 Mar 2021 14:10:54 +1000 Subject: [PATCH] Add fun messages, improve video quality, error handling --- compressionMessages.py | 17 +++++++++++++++ downloader.py | 25 ++++++++++++---------- main.py | 47 ++++++++++++++++++++++++++++-------------- 3 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 compressionMessages.py diff --git a/compressionMessages.py b/compressionMessages.py new file mode 100644 index 0000000..a64d3ae --- /dev/null +++ b/compressionMessages.py @@ -0,0 +1,17 @@ +from random import randrange + +messages = [ + "What a chungus of a TikTok, compressing it for you. Smaller boi incoming soon.", + "TikBot will compress your TikTok for you as it is too chonky, please give me a sec.", + "Taking your big TikTok and making it smaller. Just a moment.", + "Compressing TikTok to fit in Discord's size limitation, please wait a moment.", + "Your TikTok needs to lay off the Maccas, performing digital liposuction.", + "That's a PATT (Phat Ass Tik Tok), squeezing it through the door for ya.", + "That's a big TikTok, are you compensating for something? Compressing it now.", + "Flat Is Justice. Making your video conform.", + "Thick thighs save lives, but this thick-tok won't fit into these Discord jeans. Shrinking it down.", + ] + +def getCompressionMessage(): + number = randrange(len(messages)) + return messages[number] diff --git a/downloader.py b/downloader.py index a1396da..e0e2c55 100644 --- a/downloader.py +++ b/downloader.py @@ -1,26 +1,29 @@ import youtube_dl def download(videoUrl): + response = {'fileName': '', 'duration': 0, 'messages': ''} ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s.mp4'}) - ydl_opts = {} with ydl: - result = ydl.extract_info( - videoUrl, - download=True - ) + try: + result = ydl.extract_info( + videoUrl, + download=True + ) + except: + response['messages'] = 'Error: Download Failed' + return response if 'entries' in result: # Can be a playlist or a list of videos - video = result['entries'][0] - return "Error: More than 1 result found" + response['messages'] = 'Error: More than 1 result found. Please supply a single video only.' + return response else: # Just a video video = result - print(video) - video_url = video['title'] - videoId = video['id'] + response['duration'] = video['duration'] + response['fileName'] = video['id'] + ".mp4" - return videoId + ".mp4" + return response diff --git a/main.py b/main.py index 9e1c54d..a621167 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ import os import ffmpeg from dotenv import load_dotenv from downloader import download +from compressionMessages import getCompressionMessage load_dotenv() @@ -14,44 +15,60 @@ async def on_ready(): @client.event async def on_message(message): + # Only do anything in TikTok channels if(not message.channel.name.startswith("tik-tok")): return + # Ignore our own messages if message.author == client.user: return + # Be polite! if message.content.startswith('$hello'): await message.channel.send('Hello!') - downloadResult = "" + fileName = "" + duration = 0 + messages = "" + if message.content.startswith('https'): await message.channel.send('TikBot downloading video now!') - downloadResult = download(message.content) - print(downloadResult) + downloadResponse = download(message.content) + fileName = downloadResponse['fileName'] + duration = downloadResponse['duration'] + messages = downloadResponse['messages'] - if(downloadResult.startswith("Error")): - await message.channel.send('TikBot has failed you. Consider berating my human if this was not expected.') + print("Downloaded: " + fileName + " For User: " + str(message.author)) + + if(messages.startswith("Error")): + await message.channel.send('TikBot has failed you. Consider berating my human if this was not expected.\Message: ' + messages) return else: return # Check file size, if it's small enough just send it! - fileSize = os.stat(downloadResult).st_size + fileSize = os.stat(fileName).st_size if(fileSize < 8000000): - with open(downloadResult, 'rb') as fp: - await message.channel.send(file=discord.File(fp, str(downloadResult))) - os.remove(downloadResult) + with open(fileName, 'rb') as fp: + await message.channel.send(file=discord.File(fp, str(fileName))) + os.remove(fileName) else: # We need to compress the file below 8MB or discord will make a sad - await message.channel.send('TikBot will compress your video for you as it is too chonky, please give me a sec.') - ffmpeg.input(downloadResult).output("small_" + downloadResult, **{'b:v': '1000k'}).run() - with open("small_" + downloadResult, 'rb') as fp: - await message.channel.send(file=discord.File(fp, str("small_" + downloadResult))) + compressionMessage = getCompressionMessage() + await message.channel.send(compressionMessage) + print("Duration = " + str(duration)) + # Give us 7MB files with VBR encoding to allow for some overhead + bitrateKilobits = (7000 * 8)/duration + bitrateKilobits = round(bitrateKilobits) + print("Calced bitrate = " + str(bitrateKilobits)) + ffmpeg.input(fileName).output("small_" + fileName, **{'b:v': str(bitrateKilobits) + 'k'}).run() + with open("small_" + fileName, 'rb') as fp: + await message.channel.send(file=discord.File(fp, str("small_" + fileName))) # Delete the compressed and original file - os.remove(downloadResult) - os.remove("small_" + downloadResult) + os.remove(fileName) + os.remove("small_" + fileName) client.run(os.getenv('TOKEN'))