async def upload(u_event): """ For .upload command, allows you to upload a file from the userbot's server """ b = await u_event.reply("Processing ...") input_str = u_event.pattern_match.group(1) if input_str in ("userbot.session", "config.env"): await b.edit("`That's a dangerous operation! Not Permitted!`") return if os.path.exists(input_str): c_time = time.time() await u_event.client.send_file( u_event.chat_id, input_str, force_document=True, allow_cache=False, reply_to=u_event.message.id, progress_callback=lambda d, t: asyncio.get_event_loop(). create_task(progress(d, t, b, c_time, "Uploading...", input_str))) await b.edit("Uploaded successfully !!") else: await b.edit("404: File Not Found")
async def uploadir(udir_event): """ For .uploadir command, allows you to upload everything from a folder in the server""" input_str = udir_event.pattern_match.group(1) if os.path.exists(input_str): a = await udir_event.reply("Downloading Using Userbot Server....") lst_of_files = [] for r, d, f in os.walk(input_str): for file in f: lst_of_files.append(os.path.join(r, file)) for file in d: lst_of_files.append(os.path.join(r, file)) pikalog.info(lst_of_files) uploaded = 0 await a.edit( "Found {} files. Uploading will start soon. Please wait!".format( len(lst_of_files))) for single_file in lst_of_files: if os.path.exists(single_file): # https://stackoverflow.com/a/678242/4723940 caption_rts = os.path.basename(single_file) c_time = time.time() if not caption_rts.lower().endswith(".mp4"): await udir_event.client.send_file( udir_event.chat_id, single_file, caption=caption_rts, force_document=False, allow_cache=False, reply_to=udir_event.message.id, progress_callback=lambda d, t: asyncio.get_event_loop( ).create_task( progress( d, t, a, c_time, "Uploading in Progress.......", single_file, )), ) else: thumb_image = os.path.join(input_str, "thumb.jpg") c_time = time.time() metadata = extractMetadata(createParser(single_file)) duration = 0 width = 0 height = 0 if metadata.has("duration"): duration = metadata.get("duration").seconds if metadata.has("width"): width = metadata.get("width") if metadata.has("height"): height = metadata.get("height") await udir_event.client.send_file( udir_event.chat_id, single_file, caption=caption_rts, thumb=thumb_image, force_document=False, allow_cache=False, reply_to=udir_event.message.id, attributes=[ DocumentAttributeVideo( duration=duration, w=width, h=height, round_message=False, supports_streaming=True, ) ], progress_callback=lambda d, t: asyncio.get_event_loop( ).create_task( progress(d, t, a, c_time, "Uploading...", single_file)), ) os.remove(single_file) uploaded = uploaded + 1 await a.edit("Uploaded {} files successfully !!".format(uploaded)) else: await a.edit("404: Directory Not Found")
async def uploadas(uas_event): """ For .uploadas command, allows you to specify some arguments for upload. """ r = await uas_event.reply("Processing ...") type_of_upload = uas_event.pattern_match.group(1) supports_streaming = False round_message = False spam_big_messages = False if type_of_upload == "stream": supports_streaming = True if type_of_upload == "vn": round_message = True if type_of_upload == "all": spam_big_messages = True input_str = uas_event.pattern_match.group(2) thumb = None file_name = None if "|" in input_str: file_name, thumb = input_str.split("|") file_name = file_name.strip() thumb = thumb.strip() else: file_name = input_str thumb_path = "a_random_f_file_name" + ".jpg" thumb = get_video_thumb(file_name, output=thumb_path) if os.path.exists(file_name): metadata = extractMetadata(createParser(file_name)) duration = 0 width = 0 height = 0 if metadata.has("duration"): duration = metadata.get("duration").seconds if metadata.has("width"): width = metadata.get("width") if metadata.has("height"): height = metadata.get("height") try: if supports_streaming: c_time = time.time() await uas_event.client.send_file( uas_event.chat_id, file_name, thumb=thumb, caption=input_str, force_document=False, allow_cache=False, reply_to=uas_event.message.id, attributes=[ DocumentAttributeVideo( duration=duration, w=width, h=height, round_message=False, supports_streaming=True, ) ], progress_callback=lambda d, t: asyncio.get_event_loop(). create_task( progress(d, t, r, c_time, "Uploading...", file_name)), ) elif round_message: c_time = time.time() await uas_event.client.send_file( uas_event.chat_id, file_name, thumb=thumb, allow_cache=False, reply_to=uas_event.message.id, video_note=True, attributes=[ DocumentAttributeVideo( duration=0, w=1, h=1, round_message=True, supports_streaming=True, ) ], progress_callback=lambda d, t: asyncio.get_event_loop(). create_task( progress(d, t, r, c_time, "Uploading...", file_name)), ) elif spam_big_messages: await r.edit("TBD: Not (yet) Implemented") return os.remove(thumb) await r.edit("Uploaded successfully !!") except FileNotFoundError as err: await r.edit(str(err)) else: await r.edit("404: File Not Found")
async def download(target_file): """ For .dl command, download files to the userbot's server. """ pik = await target_file.reply("Processing using userbot server ( ◜‿◝ )♡") input_str = target_file.pattern_match.group(1) if not os.path.isdir(TEMP_DOWNLOAD_DIRECTORY): os.makedirs(TEMP_DOWNLOAD_DIRECTORY) if "|" in input_str: url, file_name = input_str.split("|") url = url.strip() # https://stackoverflow.com/a/761825/4723940 head, tail = os.path.split(file_name) if head: if not os.path.isdir(os.path.join(TEMP_DOWNLOAD_DIRECTORY, head)): os.makedirs(os.path.join(TEMP_DOWNLOAD_DIRECTORY, head)) file_name = os.path.join(head, tail) downloaded_file_name = TEMP_DOWNLOAD_DIRECTORY + "" + file_name downloader = SmartDL(url, downloaded_file_name, progress_bar=False) downloader.start(blocking=False) c_time = time.time() display_message = None while not downloader.isFinished(): status = downloader.get_status().capitalize() total_length = downloader.filesize if downloader.filesize else None downloaded = downloader.get_dl_size() now = time.time() diff = now - c_time percentage = downloader.get_progress() * 100 downloader.get_speed() round(diff) * 1000 progress_str = "[{0}{1}] {2}%".format( "".join(["■" for i in range(math.floor(percentage / 10))]), "".join(["□" for i in range(10 - math.floor(percentage / 10))]), round(percentage, 2), ) estimated_total_time = downloader.get_eta(human=True) try: current_message = f"{status}..\ \nURL: {url}\ \nFile Name: {file_name}\ \n{progress_str}\ \n{humanbytes(downloaded)} of {humanbytes(total_length)}\ \nETA: {estimated_total_time}" if round(diff % 10.00) == 0 and current_message != display_message: await pik.edit(current_message) display_message = current_message except Exception as e: pikalog.info(str(e)) if downloader.isSuccessful(): await pik.edit("Downloaded to `{}` successfully !!".format( downloaded_file_name)) else: await pik.edit("Incorrect URL\n{}".format(url)) elif target_file.reply_to_msg_id: try: c_time = time.time() downloaded_file_name = await target_file.client.download_media( await target_file.get_reply_message(), TEMP_DOWNLOAD_DIRECTORY, progress_callback=lambda d, t: asyncio.get_event_loop(). create_task(progress(d, t, a, c_time, "Downloading...")), ) except Exception as e: # pylint:disable=C0103,W0703 await pik.edit(str(e)) else: await pik.edit("Downloaded to `{}` successfully !!".format( downloaded_file_name)) else: await pik.edit("Reply to a message to download to my local server.")
async def ff_mpeg_trim_cmd(event): if event.fwd_from: return if not os.path.exists(FF_MPEG_DOWN_LOAD_MEDIA_PATH): await event.edit(f"a media file needs to be downloaded, and saved to the following path: `{FF_MPEG_DOWN_LOAD_MEDIA_PATH}`") return current_message_text = event.raw_text cmt = current_message_text.split(" ") logger.info(cmt) start = datetime.now() if len(cmt) == 3: # output should be video cmd, start_time, end_time = cmt o = await cult_small_video( FF_MPEG_DOWN_LOAD_MEDIA_PATH, Config.TMP_DOWNLOAD_DIRECTORY, start_time, end_time ) logger.info(o) try: c_time = time.time() await event.client.send_file( event.chat_id, o, caption=" ".join(cmt[1:]), force_document=False, supports_streaming=True, allow_cache=False, # reply_to=event.message.id, ) os.remove(o) except Exception as e: logger.info(str(e)) elif len(cmt) == 2: # output should be image cmd, start_time = cmt o = await take_screen_shot( FF_MPEG_DOWN_LOAD_MEDIA_PATH, Config.TMP_DOWNLOAD_DIRECTORY, start_time ) logger.info(o) try: c_time = time.time() await event.client.send_file( event.chat_id, o, caption=" ".join(cmt[1:]), force_document=True, # supports_streaming=True, allow_cache=False, # reply_to=event.message.id, progress_callback=lambda d, t: asyncio.get_event_loop().create_task( progress(d, t, event, c_time, "trying to upload") ) ) os.remove(o) except Exception as e: logger.info(str(e)) else: await event.edit("RTFM") return end = datetime.now() ms = (end - start).seconds await event.edit(f"Completed Process in {ms} seconds")
async def _(event): if event.fwd_from: return input_str = event.pattern_match.group(1) reply_message = await event.get_reply_message() if reply_message is None: await event.edit( "reply to a media to use the `nfc` operation.\nInspired by @FileConverterBot" ) return await event.edit("trying to download media file, to my local") try: start = datetime.now() c_time = time.time() downloaded_file_name = await event.client.download_media( reply_message, Config.TMP_DOWNLOAD_DIRECTORY, progress_callback=lambda d, t: asyncio.get_event_loop( ).create_task(progress(d, t, event, c_time, "trying to download"))) except Exception as e: # pylint:disable=C0103,W0703 await event.edit(str(e)) else: end = datetime.now() ms = (end - start).seconds await event.edit("Downloaded to `{}` in {} seconds.".format( downloaded_file_name, ms)) new_required_file_name = "" new_required_file_caption = "" command_to_run = [] force_document = False voice_note = False supports_streaming = False if input_str == "voice": new_required_file_caption = "AUDIO" + str(round( time.time())) + ".opus" new_required_file_name = Config.TMP_DOWNLOAD_DIRECTORY + "/" + new_required_file_caption command_to_run = [ "ffmpeg", "-i", downloaded_file_name, "-map", "0:a", "-codec:a", "libopus", "-b:a", "100k", "-vbr", "on", new_required_file_name ] voice_note = True supports_streaming = True elif input_str == "mp3": new_required_file_caption = "AUDIO" + str(round( time.time())) + ".mp3" new_required_file_name = Config.TMP_DOWNLOAD_DIRECTORY + "/" + new_required_file_caption command_to_run = [ "ffmpeg", "-i", downloaded_file_name, "-vn", new_required_file_name ] voice_note = False supports_streaming = True else: await event.edit("not supported") os.remove(downloaded_file_name) return logger.info(command_to_run) # TODO: re-write create_subprocess_exec 😉 process = await asyncio.create_subprocess_exec( *command_to_run, # stdout must a pipe to be accessible as process.stdout stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) # Wait for the subprocess to finish stdout, stderr = await process.communicate() e_response = stderr.decode().strip() t_response = stdout.decode().strip() os.remove(downloaded_file_name) if os.path.exists(new_required_file_name): end_two = datetime.now() await event.client.send_file( entity=event.chat_id, file=new_required_file_name, caption=new_required_file_caption, allow_cache=False, silent=True, force_document=force_document, voice_note=voice_note, supports_streaming=supports_streaming, progress_callback=lambda d, t: asyncio.get_event_loop(). create_task(progress(d, t, event, c_time, "trying to upload"))) ms_two = (end_two - end).seconds os.remove(new_required_file_name) await event.edit(f"converted in {ms_two} seconds")