commit 819e8205c0a69e2bd1ac29a8a8cea47d71825495 Author: Tomáš Mládek Date: Tue Jan 30 13:47:33 2018 +0100 Initial commit. diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000..b03f76c --- /dev/null +++ b/requirements.in @@ -0,0 +1,3 @@ +python-telegram-bot +youtube-dl +requests \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a851d07 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +# +# This file is autogenerated by pip-compile +# To update, run: +# +# pip-compile --output-file requirements.txt requirements.in +# +certifi==2018.1.18 # via python-telegram-bot, requests +chardet==3.0.4 # via requests +future==0.16.0 # via python-telegram-bot +idna==2.6 # via requests +python-telegram-bot==9.0.0 +requests==2.18.4 +urllib3==1.22 # via requests +youtube-dl==2018.1.27 diff --git a/robot.py b/robot.py new file mode 100644 index 0000000..fc02a64 --- /dev/null +++ b/robot.py @@ -0,0 +1,120 @@ +import logging +import os +from datetime import datetime + +import requests +import youtube_dl +from telegram import MessageEntity +from telegram.ext import Updater, CommandHandler, MessageHandler, Filters + +logging.basicConfig(level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') +logger = logging.getLogger("kunsax") + +DIR = os.path.dirname(os.path.realpath(__file__)) +OUT_DIR = DIR + '/out' + + +def ytdl_has(url): + ies = youtube_dl.extractor.gen_extractors() + for ie in ies: + if ie.suitable(url) and ie.IE_NAME != 'generic' \ + and '/channel/' not in url: + # Site has dedicated extractor + return True + return False + + +def date(): + return datetime.now().strftime("%Y-%m-%d@%H:%M") + + +def download_ydl(url): + ydl_opts = { + 'noplaylist': True, + 'download_archive': DIR + '/downloaded.lst', + 'outtmpl': OUT_DIR + '/' + date() + '__%(title)s__%(id)s.%(ext)s' + } + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + ydl.download([url]) + + +def download_raw(url): + local_filename = OUT_DIR + '/' + date() + '__' + url.split('/')[-1] + r = requests.get(url, stream=True) + with open(local_filename, 'wb') as f: + for chunk in r.iter_content(chunk_size=1024): + if chunk: + f.write(chunk) + + +def handle_url(bot, update): + for entity in update.message.entities: + if entity.type == 'url': + url = update.message.text[entity.offset:entity.offset + entity.length] + if ytdl_has(url): + update.message.reply_text('Downloading now...') + download_ydl(url) + + +def handle_photo(bot, update): + photo = max(update.message.photo, key=lambda p: p.width) + url = bot.getFile(photo.file_id).file_path + update.message.reply_text('Downloading now...') + logger.info("Downloading '%s'" % url) + download_raw(url) + + +def handle_audio(bot, update): + url = bot.getFile(update.message.audio.file_id).file_path + update.message.reply_text('Downloading now...') + logger.info("Downloading '%s'" % url) + download_raw(url) + + +def handle_video(bot, update): + url = bot.getFile(update.message.video.file_id).file_path + update.message.reply_text('Downloading now...') + logger.info("Downloading '%s'" % url) + download_raw(url) + + +def handle_document(bot, update): + url = bot.getFile(update.message.document.file_id).file_path + update.message.reply_text('Downloading now...') + logger.info("Downloading '%s'" % url) + download_raw(url) + + +def start(bot, update): + update.message.reply_text('WOOP WOOP') + + +def error(bot, update, error): + logger.error(error) + + +def main(): + updater = Updater("***REMOVED***") + + dp = updater.dispatcher + + dp.add_handler(CommandHandler("start", start)) + + dp.add_error_handler(error) + + dp.add_handler(MessageHandler(Filters.entity(MessageEntity.URL), handle_url)) + dp.add_handler(MessageHandler(Filters.photo, handle_photo)) + dp.add_handler(MessageHandler(Filters.audio, handle_audio)) + dp.add_handler(MessageHandler(Filters.video, handle_video)) + dp.add_handler(MessageHandler(Filters.document, handle_document)) + + updater.start_polling() + + logger.info("Started Telegram bot...") + + updater.idle() + + +if __name__ == '__main__': + main()