|
@@ -1,93 +1,39 @@
|
|
|
-import os
|
|
|
import logging
|
|
|
-from glob import glob
|
|
|
-from subprocess import Popen, PIPE
|
|
|
|
|
|
-from telegram import InlineKeyboardButton, InlineKeyboardMarkup
|
|
|
-from telegram.ext import (Updater, CommandHandler, CallbackQueryHandler,
|
|
|
- MessageHandler, Filters)
|
|
|
+from telegram import InlineKeyboardMarkup
|
|
|
+from telegram.ext import Updater, CallbackQueryHandler, MessageHandler, Filters
|
|
|
|
|
|
-from vid_utils import check_dimension
|
|
|
+from vid_utils import Video
|
|
|
|
|
|
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
|
level=logging.INFO)
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
-#TODO I don't like these global vars...
|
|
|
-formats = [] # aviable format of the video
|
|
|
-link = '' #link of the video
|
|
|
-
|
|
|
-def generate_keyboard(l):
|
|
|
- """ return a keyboard fom list l """
|
|
|
- kb = []
|
|
|
-
|
|
|
- for code, extension, resolution in l:
|
|
|
- kb.append([InlineKeyboardButton("{0}, {1}".format(extension, resolution),
|
|
|
- callback_data=code)])
|
|
|
- return kb
|
|
|
+video = None
|
|
|
|
|
|
def get_format(bot, update):
|
|
|
- global link
|
|
|
- link = update.message.text # saving link in global var
|
|
|
- formats[:] = [] # remove old formats
|
|
|
-
|
|
|
- for f in glob('*.mp4*') + glob('*.webm*'): # with glob it is not possible check multiple extension in one regex
|
|
|
- os.remove(f) # remove old video(s)
|
|
|
-
|
|
|
- try:
|
|
|
- """
|
|
|
- p = subprocess.Popen("youtube-dl -F {}".format(update.message.text), shell=True, stdout=subprocess.PIPE) # this line can be very dangerous, there is a serious command-injection problem
|
|
|
- p = p.communicate()
|
|
|
- """
|
|
|
- cmd = "youtube-dl -F {}".format(update.message.text) # this line can be very dangerous, there is a serious command-injection problem
|
|
|
- p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
|
|
|
- p = p.communicate()
|
|
|
- it = iter(str(p[0], 'utf-8').split('\n'))
|
|
|
-
|
|
|
- while not "code extension" in next(it): # Remove garbage lines, i need only the formats
|
|
|
- pass
|
|
|
+ logger.info(update.message.text) # "history"
|
|
|
+ global video
|
|
|
+ video = Video(update.message.text, update.message.chat_id)
|
|
|
|
|
|
- while True: # save the formats in the formats list
|
|
|
- try:
|
|
|
- line = next(it)
|
|
|
- if not line: # the last line usually is empty...
|
|
|
- raise StopIteration
|
|
|
- if "video only" in line: # video without audio... why?
|
|
|
- continue
|
|
|
- except StopIteration:
|
|
|
- break
|
|
|
- else:
|
|
|
- format_code, extension, resolution, *_ = line.strip().split()
|
|
|
- formats.append([format_code, extension, resolution])
|
|
|
-
|
|
|
- except Exception as e:
|
|
|
- bot.sendMessage(chat_id=update.message.chat_id, text='Error: {}'.format(e))
|
|
|
- logger.info(e)
|
|
|
- raise e
|
|
|
-
|
|
|
- else:
|
|
|
- reply_markup = InlineKeyboardMarkup(generate_keyboard(formats))
|
|
|
- update.message.reply_text('Choose format:', reply_markup=reply_markup)
|
|
|
+ reply_markup = InlineKeyboardMarkup(video.keyboard)
|
|
|
+ update.message.reply_text('Choose format:', reply_markup=reply_markup)
|
|
|
|
|
|
|
|
|
def download_choosen_format(bot, update):
|
|
|
query = update.callback_query
|
|
|
|
|
|
+ video.download(query.data)
|
|
|
bot.edit_message_text(text="Downloading...",
|
|
|
chat_id=query.message.chat_id,
|
|
|
message_id=query.message.message_id)
|
|
|
|
|
|
- os.system("youtube-dl -f {0} {1}".format(query.data, link))
|
|
|
-
|
|
|
- for f in glob('*.mp4*') + glob('*.webm*'):
|
|
|
- check_dimension(f)
|
|
|
- break # check first file
|
|
|
-
|
|
|
- for f in glob('*.mp4*') + glob('*.webm*'): # send document(s)
|
|
|
- bot.send_document(chat_id=query.message.chat_id, document=open(f, 'rb'))
|
|
|
+ with video.send() as files:
|
|
|
+ for f in files:
|
|
|
+ bot.send_document(chat_id=query.message.chat_id, document=open(f, 'rb'))
|
|
|
|
|
|
|
|
|
-updater = Updater(token=INSERT_YOUR_TOKEN_HERE)
|
|
|
+updater = Updater(token=YOUR_TOKEN)
|
|
|
|
|
|
updater.dispatcher.add_handler(MessageHandler(Filters.text, get_format))
|
|
|
updater.dispatcher.add_handler(CallbackQueryHandler(download_choosen_format))
|