⠀⠀

⠀⠀


"""Upload local Files to Mirrors

Syntax:

.verystream"""



import aiohttp

import aiofiles

import asyncio

import hashlib

import json

import magic

import os

import requests

import time

from datetime import datetime

from uniborg.util import admin_cmd, progress





@borg.on(admin_cmd(pattern="verystream ?(.*)", allow_sudo=True))

async def _(event):

if event.fwd_from:

return

mone = await event.reply("Processing ...")

if Config.VERY_STREAM_LOGIN is None or Config.VERY_STREAM_KEY is None:

await mone.edit("This module requires API key from https://verystream.com. Aborting!")

return False

input_str = event.pattern_match.group(1)

if not os.path.isdir(Config.TMP_DOWNLOAD_DIRECTORY):

os.makedirs(Config.TMP_DOWNLOAD_DIRECTORY)

required_file_name = None

start = datetime.now()

if event.reply_to_msg_id and not input_str:

reply_message = await event.get_reply_message()

try:

c_time = time.time()

downloaded_file_name = await borg.download_media(

reply_message,

Config.TMP_DOWNLOAD_DIRECTORY,

progress_callback=lambda d, t: asyncio.get_event_loop().create_task(

progress(d, t, mone, c_time, "trying to download")

)

)

except Exception as e: # pylint:disable=C0103,W0703

await mone.edit(str(e))

return False

else:

end = datetime.now()

ms = (end - start).seconds

required_file_name = downloaded_file_name

await mone.edit("Downloaded to `{}` in {} seconds.".format(downloaded_file_name, ms))

elif input_str:

input_str = input_str.strip()

if os.path.exists(input_str):

end = datetime.now()

ms = (end - start).seconds

required_file_name = input_str

await mone.edit("Found `{}` in {} seconds.".format(input_str, ms))

else:

await mone.edit("File Not found in local server. Give me a file path :((")

return False

# logger.info(required_file_name)

if required_file_name:

# required_file_name will have the full path

file_name = os.path.basename(required_file_name)

if "." in file_name:

file_name = file_name.rsplit(".", maxsplit=1)[0]

file_name = file_name + str(time.time())

file_size = os.stat(required_file_name).st_size

# https://stackoverflow.com/a/22058673/4723940

sha_one_file_hash = get_sha_one_hash(required_file_name, 65536)

# /* STEP 1: get upload_key */

login = Config.VERY_STREAM_LOGIN

key = Config.VERY_STREAM_KEY

sha1 = sha_one_file_hash

mime = magic.Magic(mime=True)

step_zero_url = f"https://api.verystream.com/file/createfolder?login={login}&key={key}&name={file_name}"

async with aiohttp.ClientSession() as session:

resp_zero = await session.get(step_zero_url)

step_zero_response_text = json.loads(await resp_zero.text())

logger.info(step_zero_response_text)

if step_zero_response_text["status"] == 200:

folder_id_e = step_zero_response_text["result"]["folderid"]

step_one_url = f"https://api.verystream.com/file/ul?login={login}&key={key}&sha1={sha1}&folder={folder_id_e}"

resp = await session.get(step_one_url)

# logger.info(resp.status)

step_one_response_text = json.loads(await resp.text())

logger.info(step_one_response_text)

if step_one_response_text["status"] == 200:

url = step_one_response_text["result"]["url"]

files = {"file1": (file_name, open(required_file_name, "rb"))}

resp = requests.post(url, files=files)

step_two_response_text = resp.json()

logger.info(step_two_response_text)

if step_two_response_text["status"] == 200:

logger.info(step_two_response_text)

else:

await mone.edit(f"VeryStream returned {step_two_response_text['status']} => {step_two_response_text['msg']}, after STEP ONE")

else:

await mone.edit(f"VeryStream returned {step_one_response_text['status']} => {step_one_response_text['msg']}, after STEP ONE")

else:

await mone.edit(f"VeryStream returned {step_zero_response_text['status']} => {step_zero_response_text['msg']}, after STEP INIT")

else:

await mone.edit("File Not found in local server. Give me a file path :((")





def get_sha_one_hash(input_file, chunk_size):

sha1 = hashlib.sha1()

with open(input_file, "rb") as f:

while True:

data = f.read(chunk_size)

if not data:

break

sha1.update(data)

return sha1.hexdigest()

Report Page