diff --git a/vid_utils.py b/vid_utils.py index 28e8282..22aa848 100644 --- a/vid_utils.py +++ b/vid_utils.py @@ -1,17 +1,79 @@ import re import os -from glob import glob +from glob import glob, escape from subprocess import Popen, PIPE -from time import strftime, strptime +from time import strftime, strptime, sleep +from contextlib import contextmanager + +from telegram import InlineKeyboardButton # many of these imports serve the commented code... -# this is the hard-split version (files need to be concatenated...) -def check_dimension(f): - """ If f is larger than 50MB it divides it into files up to 45MB """ - if os.path.getsize(f) > 50 * 1024 * 1023: - os.system('split -b 49MB "{0}" "{1}"'.format(f, f)) - os.remove(f) +class Video: + def __init__(self, link, chat_id): + self.link = link + self.chat_id = chat_id + self.formats = self.get_formats() + self.keyboard = self.generate_keyboard() + self.file_name = None + def get_formats(self, link=None): + formats = [] + + cmd = "youtube-dl -F {}".format(self.link) + p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate() + it = iter(str(p[0], 'utf-8').split('\n')) # iterator of output lines + + while "code extension" not in next(it): pass # Remove garbage lines + + while True: + try: + line = next(it) + if not line: + raise StopIteration # Usually the last line is empty + if "video only" in line: + continue # I don't need video without audio + except StopIteration: + break + else: + format_code, extension, resolution, *_ = line.strip().split() + formats.append([format_code, extension, resolution]) + return formats + + def generate_keyboard(self): + """ Generate a list of InlineKeyboardButton of resolutions """ + kb = [] + + for code, extension, resolution in self.formats: + kb.append([InlineKeyboardButton("{0}, {1}".format(extension, resolution), + callback_data=code)]) + return kb + + def download(self, resolution_code): + cmd = "youtube-dl -f {0} {1}".format(resolution_code, self.link) + p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE).communicate() + + for line in str(p[0], 'utf-8').split('\n'): + if "[download] Destination:" in line: + self.file_name = line[24:] # name of the file + + def check_dimension(self): + if os.path.getsize(self.file_name) > 50 * 1024 * 1023: + os.system('split -b 49M "{0}" "{1}"'.format(self.file_name, self.file_name)) + os.remove(self.file_name) + return glob(escape(self.file_name) + '*') + + @contextmanager + def send(self): + files = self.check_dimension() # split if size >= 50MB + yield files + for f in files: #removing old files + os.remove(f) + + + + + +#__________________________OLD STUFFS, TOUCH CAREFULLY__________________________ # this is the soft-split version, require avconv, but the audio isn't synchronized, avconv's problems :( '''