-
Notifications
You must be signed in to change notification settings - Fork 0
/
upload.py
142 lines (116 loc) · 3.91 KB
/
upload.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import os
import time
import string
import random
import logging
import asyncio
import datetime
from pyrogram import StopTransmission
from pyrogram import filters as Filters
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from ..translations import Messages as tr
from ..helpers.downloader import Downloader
from ..helpers.uploader import Uploader
from ..config import Config
from ..utubebot import UtubeBot
log = logging.getLogger(__name__)
@UtubeBot.on_message(
Filters.private
& Filters.incoming
& Filters.command('upload')
& Filters.user(Config.AUTH_USERS)
)
async def _upload(c, m):
if not os.path.exists(Config.CRED_FILE):
await m.reply_text(tr.NOT_AUTHENTICATED_MSG, True)
return
if not m.reply_to_message:
await m.reply_text(tr.NOT_A_REPLY_MSG, True)
return
message = m.reply_to_message
if not message.media:
await m.reply_text(tr.NOT_A_MEDIA_MSG, True)
return
if not valid_media(message):
await m.reply_text(tr.NOT_A_VALID_MEDIA_MSG, True)
return
if c.counter >= 6:
await m.reply_text(tr.DAILY_QOUTA_REACHED, True)
snt = await m.reply_text(tr.PROCESSING, True)
c.counter += 1
download_id = get_download_id(c.download_controller)
c.download_controller[download_id] = True
download = Downloader(m)
status, file = await download.start(progress, snt, c, download_id)
log.debug(status, file)
c.download_controller.pop(download_id)
if not status:
c.counter -= 1
c.counter = max(0, c.counter)
await snt.edit_text(text = file, parse_mode='markdown')
return
try:
await snt.edit_text("Downloaded to local, Now starting to upload to youtube...")
except:
pass
title = ' '.join(m.command[1:])
upload = Uploader(file, title)
status, link = await upload.start(progress, snt)
log.debug(status, link)
if not status:
c.counter -= 1
c.counter = max(0, c.counter)
await snt.edit_text(text = link, parse_mode='markdown')
def get_download_id(storage):
while True:
download_id = ''.join([random.choice(string.ascii_letters) for i in range(3)])
if download_id not in storage:
break
return download_id
def valid_media(media):
if media.video:
return True
elif media.video_note:
return True
elif media.animation:
return True
elif media.document and 'video' in media.document.mime_type:
return True
else:
return False
def human_bytes(num, split=False):
base = 1024.0
sufix_list = ['B','KB','MB','GB','TB','PB','EB','ZB', 'YB']
for unit in sufix_list:
if abs(num) < base:
if split:
return round(num, 2), unit
return f"{round(num, 2)} {unit}"
num /= base
async def progress(cur, tot, start_time, status, snt, c, download_id):
if not c.download_controller.get(download_id):
raise StopTransmission
try:
diff = int(time.time()-start_time)
if (int(time.time()) % 5 == 0) or (cur==tot):
await asyncio.sleep(1)
speed, unit = human_bytes(cur/diff, True)
curr = human_bytes(cur)
tott = human_bytes(tot)
eta = datetime.timedelta(seconds=int(((tot-cur)/(1024*1024))/speed))
elapsed = datetime.timedelta(seconds=diff)
progress = round((cur * 100) / tot, 2)
text = f"{status}\n\n{progress}% done.\n{curr} of {tott}\nSpeed: {speed} {unit}PS\nETA: {eta}\nElapsed: {elapsed}"
await snt.edit_text(
text = text,
reply_markup=InlineKeyboardMarkup(
[
[
InlineKeyboardButton('Cancel!', f'cncl+{download_id}')
]
]
)
)
except Exception as e:
log.info(e)
pass