Browse Source

update version 1.0

Hodza Alban 6 years ago
parent
commit
5a6ebb8eaf
1 changed files with 70 additions and 8 deletions
  1. 70 8
      vid_utils.py

+ 70 - 8
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 :(
 '''