Skip to content

Commit 1970573

Browse files
committed
Improved uploading speed
1 parent 560401a commit 1970573

8 files changed

Lines changed: 174 additions & 68 deletions

File tree

app.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
},
2424
"API_HASH" : {
2525
"description" : "Get From https://my.telegram.org"
26+
},
27+
"MONGO_STR" : {
28+
"description" : "Leave it empty.",
29+
"required" : false
2630
}
2731
},
2832
"stack" : "heroku-20",

bot/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33

44
"""
55
URL_Uploader_Bot Source Code
6-
"""
6+
"""
7+

bot/__main__.py

Lines changed: 65 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
#!/usr/bin/env python3
22

33

4-
'''Impoting Libraries, Modules & Credentials'''
4+
"""Importing"""
5+
# Importing External Packages
56
from telethon import events
67
from telethon.sync import TelegramClient
8+
9+
# Importing Inbuilt Packages
710
from os import remove
11+
12+
# Importing Developer defined modules & data
813
from bot.plugins.downloader import *
914
from bot.messages import *
1015

@@ -17,42 +22,74 @@
1722
#Start Handler
1823
@bot.on(events.NewMessage(pattern = r'/start$'))
1924
async def start_handler(event):
20-
await event.respond(start_msg, parse_mode = 'html')
25+
if event.chat_id > 0:
26+
if await search_user_in_community(event, bot):
27+
await event.respond(start_msg, parse_mode = 'html')
28+
return checking_user_in_db(event.sender_id)
2129

2230
#Help Handler
2331
@bot.on(events.NewMessage(pattern = r'/help$'))
2432
async def help_handler(event):
25-
await event.respond(help_msg, parse_mode = 'html')
33+
if event.chat_id > 0:
34+
if await search_user_in_community(event, bot):
35+
await event.respond(help_msg, parse_mode = 'html')
36+
return
37+
38+
#For Owner Only, Sent message to all Bot Users
39+
@bot.on(events.NewMessage(pattern = r'/broadcast'))
40+
async def broadcast_handler(event):
41+
if event.chat_id > 0:
42+
if event.sender_id == dev:
43+
try:
44+
#Extracting Broadcasting Message
45+
message = str(event.message.text).split('/broadcast ')[1]
46+
except IndexError:
47+
await event.respond(broadcast_failed, parse_mode = 'html')
48+
except Exception as e:
49+
print(line_number(), e)
50+
else:
51+
#Getting User`s Id from Database
52+
for userid in [document['userid'] for document in collection_user.find()]:
53+
try:
54+
#Sending Message One By One
55+
await bot.send_message(userid, message)
56+
except rpcerrorlist.UserIsBlockedError:
57+
#User Blocked the bot
58+
collection_user.delete_one({'userid' : userid})
59+
except Exception as e:
60+
print(line_number(), e)
61+
return
2662

2763
@bot.on(events.NewMessage)
2864
async def upload_handler(event):
65+
if event.chat_id > 0:
2966

30-
message_info = event.message
31-
32-
if str(type(message_info.entities[0])) == "<class 'telethon.tl.types.MessageEntityUrl'>":
33-
if task() == "Running":
34-
await event.respond(task_ongoing, parse_mode = 'html')
35-
else:
36-
url = message_info.text
37-
downloader = await Downloader.start(event, url, bot)
38-
filename = downloader.filename
39-
40-
if filename: #Sending file to user
41-
msg = downloader.n_msg
42-
message = event.message
43-
userid = event.sender_id
44-
try:
45-
await bot.send_file(userid , file = filename, reply_to = message)
46-
except Exception as e:
47-
await bot.delete_messages(None, msg)
48-
await bot.send_message(userid, unsuccessful_upload, reply_to = message)
49-
print(line_number(), e)
67+
message_info = event.message
68+
if str(type(message_info.entities[0])) == "<class 'telethon.tl.types.MessageEntityUrl'>":
69+
if await search_user_in_community(event, bot):
70+
if task() == "Running":
71+
await event.respond(task_ongoing, parse_mode = 'html')
5072
else:
51-
await bot.delete_messages(None, msg)
52-
finally:
53-
remove(filename)
54-
task("No Task")
55-
return None
73+
url = message_info.text
74+
downloader = await Downloader.start(event, url, bot)
75+
filename = downloader.filename
76+
77+
if filename: #Sending file to user
78+
msg = downloader.n_msg
79+
message = event.message
80+
userid = event.sender_id
81+
try:
82+
await bot.send_file(userid , file = filename, reply_to = message)
83+
except Exception as e:
84+
await bot.delete_messages(None, msg)
85+
await bot.send_message(userid, unsuccessful_upload, reply_to = message)
86+
print(line_number(), e)
87+
else:
88+
await bot.delete_messages(None, msg)
89+
finally:
90+
remove(filename)
91+
task("No Task")
92+
return
5693

5794

5895
'''Bot is Started to run all time'''

bot/credentials.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
#!/usr/bin/env python3
22

33

4-
'''Credentials'''
4+
# Importing Inbuilt Packages
5+
import os
56

67

7-
import os
8+
'''Credentials'''
9+
dev = 1972357814
810

11+
downloadFolder = '/app/download/'
12+
# downloadFolder = 'D:\Projects\Public\MegaUploaderbot\download\\'
913

1014
bot_token = os.environ["BOT_TOKEN"]
1115

1216
api_id = os.environ["API_ID"]
1317

1418
api_hash = os.environ["API_HASH"]
19+
20+
try:
21+
connection_string = os.environ["MONGO_STR"]
22+
except KeyError:
23+
connection_string = None
24+

bot/messages.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010

1111
start_msg = f"<b>Hi, I am URL_UploaderBot Created by @AJPyroVerse and My Developer is @AJTimePyro.</b>\n{help_msg}"
1212

13+
not_joined_community = f"<b>To use this bot, you need to Join our Channel and Group.</b>{common_text}"
14+
15+
broadcast_failed = "<b>Broadcasting Message can`t be empty</b>"
16+
1317
task_ongoing = "<u>One Task is already going on, So Please Try Again Later.</u>"
1418

1519
processing_url = "<i>Please wait while I am Processing File</i>"
@@ -22,4 +26,5 @@
2226

2327
file_limit = f"Send only those whose size is less than 400mb.{common_text}"
2428

25-
youtube_url = "<b>Currently I do not support youtube videos.</b>"
29+
youtube_url = "<b>Currently I do not support youtube videos.</b>"
30+

bot/plugins/downloader.py

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
#!/usr/bin/env python3
22

33

4-
'''Impoting Libraries, Modules & Credentials'''
5-
from os import listdir, linesep
6-
from subprocess import Popen, PIPE
4+
5+
"""Importing"""
6+
# Importing External Packages
7+
from pySmartDL import SmartDL
8+
9+
# Importing Inbuilt Packages
10+
from time import sleep
11+
from os import remove
712
from re import match
13+
14+
# Importing Developer defined modules & data
815
from bot.messages import *
916
from bot.plugins.funcs import *
1017

18+
1119
class Downloader:
1220

1321
def __init__(self, event, url, bot):
@@ -32,38 +40,35 @@ async def url_downloader(self, event, process_msg, bot, url):
3240
if len_file == 'Valid':
3341
msg = await bot.edit_message(process_msg, starting_to_download, parse_mode = 'html')
3442
userid = event.sender_id
35-
files_before = listdir()
3643

37-
#Downloading File From Url
38-
process = Popen(['wget', url], stderr=PIPE)
39-
started = False
40-
for line in process.stderr:
41-
line = line.decode("utf-8", "replace")
42-
print(line)
43-
if started:
44-
splited = line.split()
45-
if len(splited) == 9:
46-
completed = splited[0]
47-
if completed.endswith('K'):
48-
completed = str(round(int(completed[:len(completed)-1])/1024, 2))+'M'
49-
percentage = splited[6]
50-
speed = splited[7]
51-
remaining = splited[8]
52-
msg = await bot.edit_message(msg, f"<b>Downloading... !! Keep patience...\n📊Percentage: {percentage}\n✅Completed: {completed+'B'}\n🚀Speed: {speed}B/s\n⌚️Remaining Time: {remaining}</b>", parse_mode = 'html')
53-
elif line == linesep:
54-
started = True
44+
downObj = SmartDL(self.url, dest = downloadFolder)
45+
downObj.start(blocking = False)
46+
while not downObj.isFinished():
47+
progress_bar = downObj.get_progress_bar().replace('#', '■').replace('-', '□')
48+
completed = downObj.get_dl_size(human=True)
49+
speed = downObj.get_speed(human=True)
50+
remaining = downObj.get_eta(human=True)
51+
percentage = int(downObj.get_progress()*100)
52+
msg = await self.bot.edit_message(msg, f"<b>Downloading... !! Keep patience...\n {progress_bar}\n📊Percentage: {percentage}\n✅Completed: {completed}\n🚀Speed: {speed}\n⌚️Remaining Time: {remaining}</b>", parse_mode = 'html')
53+
sleep(1)
54+
try:
55+
filename = downObj.get_dest()
56+
except Exception as e:
57+
await self.bot.send_message(dev, f'In urlDL.py {line_number()} {e}')
58+
if downObj.isSuccessful():
59+
n_msg = await self.bot.edit_message(msg, uploading_msg, parse_mode = 'html')
60+
self.n_msg, self.filename = n_msg, filename
61+
return True
5562
else:
56-
files_after = listdir()
63+
task("No Task")
5764
try:
58-
filename = str([i for i in files_after if i not in files_before][0])
59-
except IndexError: #When File Not Downloaded
60-
task("No Task")
61-
await bot.delete_messages(None, msg)
62-
await bot.send_message(userid, unsuccessful_upload, parse_mode = 'html')
63-
else:
64-
n_msg = await bot.edit_message(msg, uploading_msg, parse_mode = 'html')
65-
self.n_msg, self.filename = n_msg, filename
66-
return True
65+
remove(f'{downloadFolder}{filename}')
66+
except Exception as e:
67+
await self.bot.send_message(dev, f'In urlDL.py {line_number()} {e}')
68+
await self.bot.delete_messages(None, msg)
69+
await self.bot.send_message(userid, unsuccessful_upload, parse_mode = 'html')
70+
for e in downObj.get_errors():
71+
await self.bot.send_message(dev, f'In urlDL.py {line_number()} {str(e)}')
6772
elif len_file == 'Not Valid':
6873
await bot.edit_message(process_msg, unsuccessful_upload, parse_mode = 'html')
6974
else:

bot/plugins/funcs.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,60 @@
1-
'''Impoting Libraries and Modules'''
2-
from bot.credentials import *
1+
#!/usr/bin/env python3
2+
3+
4+
"""Importing"""
5+
# Importing External Packages
6+
from telethon import Button
7+
from telethon.tl.functions.channels import GetParticipantRequest
8+
from telethon.errors import rpcerrorlist
9+
from pymongo import MongoClient
10+
from requests import head
11+
12+
# Importing Inbuilt Packages
313
from inspect import currentframe
414
from os import path
5-
from requests import head
615
import __main__
716

17+
# Importing Developer defined modules & data
18+
from bot.credentials import *
19+
from bot.messages import not_joined_community
20+
21+
22+
'''Connecting To Database'''
23+
mongo_client = MongoClient(connection_string)
24+
db_member_detail = mongo_client['AJPyroVerseMember']
25+
collection_member = db_member_detail['memberlist']
26+
db_user = mongo_client['URL_Uploader']
27+
collection_user = db_user['members']
28+
829

930
'''Defining Some Functions'''
31+
#Checking User whether he joined channel and group or not joined.
32+
async def search_user_in_community(event, bot):
33+
try:
34+
await bot(GetParticipantRequest("@AJPyroVerse", event.sender_id))
35+
await bot(GetParticipantRequest("@AJPyroVerseGroup", event.sender_id))
36+
except rpcerrorlist.UserNotParticipantError:
37+
await event.respond(not_joined_community, parse_mode = 'html', buttons = [Button.url('Join our Channel.','https://t.me/AJPyroVerse'), Button.url('Join our Group.','https://t.me/AJPyroVerseGroup')])
38+
return
39+
except Exception as e:
40+
print(line_number(), e)
41+
else:
42+
return True
43+
1044
#Function to find error in which file and in which line
1145
def line_number():
1246
cf = currentframe()
1347
return f'In File {path.basename(__main__.__file__)} at line {cf.f_back.f_lineno}'
1448

49+
#Finding user in database, if not found then adding him
50+
def checking_user_in_db(userid):
51+
if connection_string:
52+
document = {'userid' : userid}
53+
if collection_user.find_one(document):
54+
return True
55+
collection_user.insert_one(document)
56+
return
57+
1558
#it will check the length of file
1659
async def length_of_file(url):
1760
try:

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ telethon
22
cryptg
33
dnspython
44
pymongo
5-
requests
5+
requests
6+
pySmartDL

0 commit comments

Comments
 (0)