From 68d809f54e0f2c89c8f2747663cd7e279000465d Mon Sep 17 00:00:00 2001 From: Hodza Alban Date: Wed, 9 Aug 2017 14:49:25 +0200 Subject: [PATCH] update version 1.0 --- main.py | 82 ++++++++++----------------------------------------------- 1 file changed, 14 insertions(+), 68 deletions(-) diff --git a/main.py b/main.py index c57bd2a..4e8e49a 100644 --- a/main.py +++ b/main.py @@ -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 + logger.info(update.message.text) # "history" + global video + video = Video(update.message.text, update.message.chat_id) - 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 - - 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))