Commit ·
0e49d61
1
Parent(s): d523f3f
Code Updates
Browse files- FileStream/__main__.py +51 -57
- FileStream/bot/__init__.py +5 -3
- FileStream/bot/clients.py +9 -7
- FileStream/bot/plugins/FileHandlers/callback.py +2 -1
- FileStream/bot/plugins/FileHandlers/stream.py +6 -5
- FileStream/server/Functions/downloader.py +29 -29
- FileStream/server/render_template.py +0 -5
- FileStream/server/routes_main.py +4 -3
- FileStream/utils/FileProcessors/custom_dl.py +3 -3
- FileStream/utils/FileProcessors/custom_mix.py +8 -8
- FileStream/utils/FileProcessors/custom_ul.py +19 -25
- FileStream/utils/FileProcessors/file_properties.py +6 -5
- Unused Codes/__main__old.py +94 -0
FileStream/__main__.py
CHANGED
|
@@ -12,18 +12,14 @@ from FileStream.Tools import Time_ISTKolNow
|
|
| 12 |
from FileStream.server import web_server
|
| 13 |
from FileStream.bot.clients import initialize_clients
|
| 14 |
|
|
|
|
| 15 |
logging.basicConfig(
|
| 16 |
level=logging.INFO,
|
| 17 |
datefmt="%d/%m/%Y %H:%M:%S",
|
| 18 |
-
format=
|
| 19 |
-
'[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
|
| 20 |
handlers=[
|
| 21 |
logging.StreamHandler(stream=sys.stdout),
|
| 22 |
-
handlers.RotatingFileHandler("streambot.log",
|
| 23 |
-
mode="a",
|
| 24 |
-
maxBytes=104857600,
|
| 25 |
-
backupCount=2,
|
| 26 |
-
encoding="utf-8")
|
| 27 |
],
|
| 28 |
)
|
| 29 |
|
|
@@ -33,62 +29,60 @@ logging.getLogger("aiohttp.web").setLevel(logging.ERROR)
|
|
| 33 |
|
| 34 |
server = web.AppRunner(web_server())
|
| 35 |
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
|
|
|
|
|
|
|
|
|
| 38 |
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
print("
|
| 43 |
-
else:
|
| 44 |
-
print("------------------- Starting as Primary Server -------------------")
|
| 45 |
-
print()
|
| 46 |
-
print("-------------------- Initializing Telegram Bot --------------------")
|
| 47 |
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
print("---------------------- Initializing Clients ----------------------")
|
| 56 |
-
await initialize_clients()
|
| 57 |
-
print("------------------------------ DONE ------------------------------")
|
| 58 |
-
print()
|
| 59 |
-
print("--------------------- Initializing Web Server ---------------------")
|
| 60 |
-
await server.setup()
|
| 61 |
-
await web.TCPSite(server, Server.BIND_ADDRESS, Server.PORT).start()
|
| 62 |
-
print("------------------------------ DONE ------------------------------")
|
| 63 |
-
print()
|
| 64 |
-
print("------------------------- Service Started -------------------------")
|
| 65 |
-
print("Bot =>> {}".format(bot_info.first_name))
|
| 66 |
-
if bot_info.dc_id:
|
| 67 |
-
print("DC ID =>> {}".format(str(bot_info.dc_id)))
|
| 68 |
-
print(" URL =>> {}".format(Server.URL))
|
| 69 |
-
print("------------------------------------------------------------------")
|
| 70 |
-
"""
|
| 71 |
-
all_sources = [
|
| 72 |
-
Telegram.ULOG_GROUP, Telegram.FLOG_CHANNEL, Telegram.PFLOG_CHANNEL
|
| 73 |
-
]
|
| 74 |
-
for source in all_sources:
|
| 75 |
-
await FileStream.send_message(chat_id=source,
|
| 76 |
-
text=f"Hi, I am Online @{ISTKolNow()}",
|
| 77 |
-
disable_web_page_preview=True)
|
| 78 |
-
"""
|
| 79 |
-
await idle()
|
| 80 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
async def cleanup():
|
| 83 |
-
|
| 84 |
-
await FileStream.stop()
|
| 85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
|
| 87 |
if __name__ == "__main__":
|
| 88 |
-
|
| 89 |
-
loop.run_until_complete(start_services())
|
| 90 |
-
except KeyboardInterrupt:
|
| 91 |
-
loop.stop()
|
| 92 |
-
print("------------------------ Stopped Services ------------------------")
|
| 93 |
-
except Exception as err:
|
| 94 |
-
logging.error(traceback.format_exc())
|
|
|
|
| 12 |
from FileStream.server import web_server
|
| 13 |
from FileStream.bot.clients import initialize_clients
|
| 14 |
|
| 15 |
+
# Configure logging
|
| 16 |
logging.basicConfig(
|
| 17 |
level=logging.INFO,
|
| 18 |
datefmt="%d/%m/%Y %H:%M:%S",
|
| 19 |
+
format='[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
|
|
|
|
| 20 |
handlers=[
|
| 21 |
logging.StreamHandler(stream=sys.stdout),
|
| 22 |
+
handlers.RotatingFileHandler("streambot.log", mode="a", maxBytes=104857600, backupCount=2, encoding="utf-8")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
],
|
| 24 |
)
|
| 25 |
|
|
|
|
| 29 |
|
| 30 |
server = web.AppRunner(web_server())
|
| 31 |
|
| 32 |
+
async def start_services():
|
| 33 |
+
print(
|
| 34 |
+
"****\n"
|
| 35 |
+
+ (
|
| 36 |
+
"------------------ Starting as Secondary Server ------------------"
|
| 37 |
+
if Telegram.SECONDARY
|
| 38 |
+
else "------------------- Starting as Primary Server -------------------"
|
| 39 |
+
)
|
| 40 |
+
+ "\n****\n-------------------- Initializing Telegram Bot --------------------"
|
| 41 |
+
)
|
| 42 |
+
await FileStream.start()
|
| 43 |
+
bot_info = await FileStream.get_me()
|
| 44 |
+
FileStream.id = bot_info.id
|
| 45 |
+
FileStream.username = bot_info.username
|
| 46 |
+
FileStream.fname = bot_info.first_name
|
| 47 |
+
print("------------------------------ DONE ------------------------------\n\n")
|
| 48 |
|
| 49 |
+
print("---------------------- Initializing Clients ----------------------")
|
| 50 |
+
await initialize_clients()
|
| 51 |
+
print("------------------------------ DONE ------------------------------\n\n")
|
| 52 |
|
| 53 |
+
print("--------------------- Initializing Web Server ---------------------")
|
| 54 |
+
await server.setup()
|
| 55 |
+
await web.TCPSite(server, Server.BIND_ADDRESS, Server.PORT).start()
|
| 56 |
+
print("------------------------------ DONE ------------------------------\n\n")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
|
| 58 |
+
print(
|
| 59 |
+
f"------------------------- Service Started -------------------------\n"
|
| 60 |
+
f"Bot =>> {bot_info.first_name}\n"
|
| 61 |
+
+ (f"DC ID =>> {bot_info.dc_id}\n" if bot_info.dc_id else "")
|
| 62 |
+
+ f"URL =>> {Server.URL}\n"
|
| 63 |
+
"------------------------------------------------------------------"
|
| 64 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
+
# Uncomment the following section to send messages to specific sources
|
| 67 |
+
"""
|
| 68 |
+
all_sources = [Telegram.ULOG_GROUP, Telegram.FLOG_CHANNEL, Telegram.PFLOG_CHANNEL]
|
| 69 |
+
for source in all_sources:
|
| 70 |
+
await FileStream.send_message(chat_id=source, text=f"Hi, I am Online @{Time_ISTKolNow()}", disable_web_page_preview=True)
|
| 71 |
+
"""
|
| 72 |
+
await idle()
|
| 73 |
|
| 74 |
async def cleanup():
|
| 75 |
+
await server.cleanup()
|
|
|
|
| 76 |
|
| 77 |
+
async def main():
|
| 78 |
+
try:
|
| 79 |
+
await start_services()
|
| 80 |
+
except KeyboardInterrupt:
|
| 81 |
+
print("\n------------------------ Stopped Services ------------------------")
|
| 82 |
+
except Exception as err:
|
| 83 |
+
logging.error("An error occurred:\n%s", traceback.format_exc())
|
| 84 |
+
finally:
|
| 85 |
+
await cleanup()
|
| 86 |
|
| 87 |
if __name__ == "__main__":
|
| 88 |
+
asyncio.run(main())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FileStream/bot/__init__.py
CHANGED
|
@@ -18,11 +18,13 @@ FileStream = Client(name="FileStream",
|
|
| 18 |
workers=Telegram.WORKERS,
|
| 19 |
no_updates=no_updates)
|
| 20 |
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
| 23 |
|
| 24 |
async def req_client():
|
| 25 |
index = min(work_loads, key=work_loads.get)
|
| 26 |
-
faster_client =
|
| 27 |
response = dict(index=index, client=faster_client)
|
| 28 |
return response
|
|
|
|
| 18 |
workers=Telegram.WORKERS,
|
| 19 |
no_updates=no_updates)
|
| 20 |
|
| 21 |
+
|
| 22 |
+
WORK_LOADS = {}
|
| 23 |
+
MULTI_CLIENTS = {}
|
| 24 |
+
ACTIVE_CLIENTS = {}
|
| 25 |
|
| 26 |
async def req_client():
|
| 27 |
index = min(work_loads, key=work_loads.get)
|
| 28 |
+
faster_client = MULTI_CLIENTS[index]
|
| 29 |
response = dict(index=index, client=faster_client)
|
| 30 |
return response
|
FileStream/bot/clients.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
| 1 |
import asyncio
|
| 2 |
import logging
|
| 3 |
from os import environ
|
| 4 |
-
from ..config import Telegram
|
| 5 |
from pyrogram import Client
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
| 7 |
|
| 8 |
|
| 9 |
async def initialize_clients():
|
|
@@ -16,8 +18,8 @@ async def initialize_clients():
|
|
| 16 |
)
|
| 17 |
)
|
| 18 |
if not all_tokens:
|
| 19 |
-
|
| 20 |
-
|
| 21 |
print("No additional clients found, using default client")
|
| 22 |
return
|
| 23 |
|
|
@@ -45,14 +47,14 @@ async def initialize_clients():
|
|
| 45 |
in_memory=True,
|
| 46 |
).start()
|
| 47 |
client.id = (await client.get_me()).id
|
| 48 |
-
|
| 49 |
return client_id, client
|
| 50 |
except Exception:
|
| 51 |
logging.error(f"Failed starting Client - {client_id} Error:", exc_info=True)
|
| 52 |
|
| 53 |
clients = await asyncio.gather(*[start_client(i, token) for i, token in all_tokens.items()])
|
| 54 |
-
|
| 55 |
-
if len(
|
| 56 |
Telegram.MULTI_CLIENT = True
|
| 57 |
print("Multi-Client Mode Enabled")
|
| 58 |
else:
|
|
|
|
| 1 |
import asyncio
|
| 2 |
import logging
|
| 3 |
from os import environ
|
|
|
|
| 4 |
from pyrogram import Client
|
| 5 |
+
|
| 6 |
+
from . import FileStream
|
| 7 |
+
from ..config import Telegram
|
| 8 |
+
from . import MULTI_CLIENTS, WORK_LOADS
|
| 9 |
|
| 10 |
|
| 11 |
async def initialize_clients():
|
|
|
|
| 18 |
)
|
| 19 |
)
|
| 20 |
if not all_tokens:
|
| 21 |
+
MULTI_CLIENTS[0] = FileStream
|
| 22 |
+
WORK_LOADS[0] = 0
|
| 23 |
print("No additional clients found, using default client")
|
| 24 |
return
|
| 25 |
|
|
|
|
| 47 |
in_memory=True,
|
| 48 |
).start()
|
| 49 |
client.id = (await client.get_me()).id
|
| 50 |
+
WORK_LOADS[client_id] = 0
|
| 51 |
return client_id, client
|
| 52 |
except Exception:
|
| 53 |
logging.error(f"Failed starting Client - {client_id} Error:", exc_info=True)
|
| 54 |
|
| 55 |
clients = await asyncio.gather(*[start_client(i, token) for i, token in all_tokens.items()])
|
| 56 |
+
MULTI_CLIENTS.update(dict(clients))
|
| 57 |
+
if len(MULTI_CLIENTS) != 1:
|
| 58 |
Telegram.MULTI_CLIENT = True
|
| 59 |
print("Multi-Client Mode Enabled")
|
| 60 |
else:
|
FileStream/bot/plugins/FileHandlers/callback.py
CHANGED
|
@@ -12,7 +12,8 @@ from pyrogram.raw.types import KeyboardButtonSimpleWebView
|
|
| 12 |
from FileStream import __version__
|
| 13 |
from FileStream.Database import Database
|
| 14 |
from FileStream.config import Telegram, Server
|
| 15 |
-
from FileStream.bot import FileStream
|
|
|
|
| 16 |
from FileStream.server.exceptions import FIleNotFound
|
| 17 |
from FileStream.utils.FileProcessors.translation import LANG, BUTTON
|
| 18 |
from FileStream.utils.FileProcessors.human_readable import humanbytes
|
|
|
|
| 12 |
from FileStream import __version__
|
| 13 |
from FileStream.Database import Database
|
| 14 |
from FileStream.config import Telegram, Server
|
| 15 |
+
from FileStream.bot import FileStream
|
| 16 |
+
from FileStream.bot import MULTI_CLIENTS
|
| 17 |
from FileStream.server.exceptions import FIleNotFound
|
| 18 |
from FileStream.utils.FileProcessors.translation import LANG, BUTTON
|
| 19 |
from FileStream.utils.FileProcessors.human_readable import humanbytes
|
FileStream/bot/plugins/FileHandlers/stream.py
CHANGED
|
@@ -32,7 +32,8 @@ from FileStream.Database import Database
|
|
| 32 |
from FileStream.config import Telegram, Server
|
| 33 |
from FileStream.Tools.tool import TimeFormatter
|
| 34 |
from FileStream.Tools.progress import progress
|
| 35 |
-
from FileStream.bot import FileStream,
|
|
|
|
| 36 |
from FileStream.utils.FileProcessors.bot_utils import is_user_banned, is_user_exist, is_user_joined, gen_link, is_channel_banned, is_channel_exist, is_user_authorized, upload_type_func
|
| 37 |
from FileStream.utils.FileProcessors.custom_dl import ByteStreamer
|
| 38 |
from FileStream.utils.FileProcessors.custom_ul import TeleUploader
|
|
@@ -87,7 +88,7 @@ async def channel_receive_handler(bot: Client, message: Message):
|
|
| 87 |
|
| 88 |
try:
|
| 89 |
inserted_id = await db.add_file(get_file_info(message))
|
| 90 |
-
await get_file_ids(False, inserted_id,
|
| 91 |
reply_markup, stream_link = await gen_link(_id=inserted_id)
|
| 92 |
await bot.edit_message_reply_markup(
|
| 93 |
chat_id=message.chat.id,
|
|
@@ -155,15 +156,15 @@ async def reply_handler(
|
|
| 155 |
ext = mimetypes.guess_extension(mime_type)
|
| 156 |
file_info['file']['file_name'] = f"{message.text}{ext}"
|
| 157 |
|
| 158 |
-
#index = min(
|
| 159 |
-
#faster_client =
|
| 160 |
client=await req_client()
|
| 161 |
print(f"Using {client['index']} for {file_info['file']['file_name']}")
|
| 162 |
logging.info(f"Client {client['index']} is now serving {request.headers.get('X-FORWARDED-FOR',request.remote)}")
|
| 163 |
|
| 164 |
|
| 165 |
tg_connect = TGFileController(client['client'])
|
| 166 |
-
req_file_id = await tg_connect.get_file_properties(file_info['_id'],
|
| 167 |
|
| 168 |
start_time = time.time()
|
| 169 |
file = await tg_connect.upload_file(
|
|
|
|
| 32 |
from FileStream.config import Telegram, Server
|
| 33 |
from FileStream.Tools.tool import TimeFormatter
|
| 34 |
from FileStream.Tools.progress import progress
|
| 35 |
+
from FileStream.bot import FileStream, req_client
|
| 36 |
+
from FileStream.bot import MULTI_CLIENTS, WORK_LOADS
|
| 37 |
from FileStream.utils.FileProcessors.bot_utils import is_user_banned, is_user_exist, is_user_joined, gen_link, is_channel_banned, is_channel_exist, is_user_authorized, upload_type_func
|
| 38 |
from FileStream.utils.FileProcessors.custom_dl import ByteStreamer
|
| 39 |
from FileStream.utils.FileProcessors.custom_ul import TeleUploader
|
|
|
|
| 88 |
|
| 89 |
try:
|
| 90 |
inserted_id = await db.add_file(get_file_info(message))
|
| 91 |
+
await get_file_ids(False, inserted_id, MULTI_CLIENTS, message)
|
| 92 |
reply_markup, stream_link = await gen_link(_id=inserted_id)
|
| 93 |
await bot.edit_message_reply_markup(
|
| 94 |
chat_id=message.chat.id,
|
|
|
|
| 156 |
ext = mimetypes.guess_extension(mime_type)
|
| 157 |
file_info['file']['file_name'] = f"{message.text}{ext}"
|
| 158 |
|
| 159 |
+
#index = min(WORK_LWORK_LOADS, key=WORK_LWORK_LOADS.get)
|
| 160 |
+
#faster_client = MULTI_CLIENTS[index]
|
| 161 |
client=await req_client()
|
| 162 |
print(f"Using {client['index']} for {file_info['file']['file_name']}")
|
| 163 |
logging.info(f"Client {client['index']} is now serving {request.headers.get('X-FORWARDED-FOR',request.remote)}")
|
| 164 |
|
| 165 |
|
| 166 |
tg_connect = TGFileController(client['client'])
|
| 167 |
+
req_file_id = await tg_connect.get_file_properties(file_info['_id'], MULTI_CLIENTS)
|
| 168 |
|
| 169 |
start_time = time.time()
|
| 170 |
file = await tg_connect.upload_file(
|
FileStream/server/Functions/downloader.py
CHANGED
|
@@ -14,33 +14,35 @@ from aiohttp.http_exceptions import BadStatusLine
|
|
| 14 |
from FileStream.config import Telegram
|
| 15 |
from FileStream import utils, StartTime, __version__
|
| 16 |
from FileStream.Tools import mime_identifier, Time_ISTKolNow
|
| 17 |
-
from FileStream.bot import
|
|
|
|
| 18 |
from FileStream.server.exceptions import FIleNotFound, InvalidHash
|
| 19 |
from FileStream.server.render_template import render_page, render_upload
|
| 20 |
from FileStream.utils.FileProcessors.custom_ul import TeleUploader
|
| 21 |
|
| 22 |
-
class_cache={}
|
| 23 |
-
|
| 24 |
|
| 25 |
async def media_streamer(request: web.Request, db_id: str):
|
|
|
|
| 26 |
range_header = request.headers.get("Range", 0)
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
#index = min(work_loads, key=work_loads.get)
|
| 29 |
-
#faster_client = multi_clients[index]
|
| 30 |
client = await req_client()
|
| 31 |
|
| 32 |
if Telegram.MULTI_CLIENT:
|
| 33 |
logging.info(f"Client {client['index']} is now serving {request.headers.get('X-FORWARDED-FOR',request.remote)}")
|
| 34 |
|
| 35 |
-
if client['client'] in
|
| 36 |
-
tg_connect =
|
| 37 |
logging.debug(f"Using cached ByteStreamer object for client {client['index']}")
|
|
|
|
| 38 |
else:
|
| 39 |
logging.debug(f"Creating new ByteStreamer object for client {client['index']}")
|
| 40 |
tg_connect = utils.ByteStreamer(client['client'])
|
| 41 |
-
|
|
|
|
| 42 |
logging.debug("before calling get_file_properties")
|
| 43 |
-
file_id = await tg_connect.get_file_properties(db_id,
|
| 44 |
logging.debug("after calling get_file_properties")
|
| 45 |
|
| 46 |
file_size = file_id.file_size
|
|
@@ -53,12 +55,12 @@ async def media_streamer(request: web.Request, db_id: str):
|
|
| 53 |
from_bytes = request.http_range.start or 0
|
| 54 |
until_bytes = (request.http_range.stop or file_size) - 1
|
| 55 |
|
| 56 |
-
if (until_bytes > file_size) or (from_bytes < 0) or (until_bytes
|
| 57 |
-
|
| 58 |
return web.Response(
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
)
|
| 63 |
|
| 64 |
chunk_size = 512 * 1024
|
|
@@ -69,30 +71,28 @@ async def media_streamer(request: web.Request, db_id: str):
|
|
| 69 |
last_part_cut = until_bytes % chunk_size + 1
|
| 70 |
|
| 71 |
req_length = until_bytes - from_bytes + 1
|
| 72 |
-
part_count = math.ceil(until_bytes / chunk_size) - math.floor(
|
| 73 |
-
|
| 74 |
-
body = tg_connect.yield_file(file_id, client['index'], offset, first_part_cut,
|
| 75 |
-
last_part_cut, part_count, chunk_size)
|
| 76 |
|
| 77 |
mime_type = file_id.mime_type
|
| 78 |
file_name = utils.get_name(file_id)
|
| 79 |
disposition = "attachment"
|
| 80 |
|
| 81 |
if not mime_type:
|
| 82 |
-
mime_type = mimetypes.guess_type(
|
| 83 |
-
file_name)[0] or "application/octet-stream"
|
| 84 |
|
| 85 |
# if "video/" in mime_type or "audio/" in mime_type:
|
| 86 |
# disposition = "inline"
|
| 87 |
|
| 88 |
return web.Response(
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
)
|
|
|
|
| 14 |
from FileStream.config import Telegram
|
| 15 |
from FileStream import utils, StartTime, __version__
|
| 16 |
from FileStream.Tools import mime_identifier, Time_ISTKolNow
|
| 17 |
+
from FileStream.bot import req_client, FileStream
|
| 18 |
+
from FileStream.bot import MULTI_CLIENTS, WORK_LOADS, ACTIVE_CLIENTS
|
| 19 |
from FileStream.server.exceptions import FIleNotFound, InvalidHash
|
| 20 |
from FileStream.server.render_template import render_page, render_upload
|
| 21 |
from FileStream.utils.FileProcessors.custom_ul import TeleUploader
|
| 22 |
|
|
|
|
|
|
|
| 23 |
|
| 24 |
async def media_streamer(request: web.Request, db_id: str):
|
| 25 |
+
|
| 26 |
range_header = request.headers.get("Range", 0)
|
| 27 |
+
#index = minWORK_LOADS, keyWORK_LOADS.get)
|
| 28 |
+
#faster_client = MULTI_CLIENTS[index]
|
| 29 |
|
|
|
|
|
|
|
| 30 |
client = await req_client()
|
| 31 |
|
| 32 |
if Telegram.MULTI_CLIENT:
|
| 33 |
logging.info(f"Client {client['index']} is now serving {request.headers.get('X-FORWARDED-FOR',request.remote)}")
|
| 34 |
|
| 35 |
+
if client['client'] in ACTIVE_CLIENTS:
|
| 36 |
+
tg_connect = ACTIVE_CLIENTS[client['client']]
|
| 37 |
logging.debug(f"Using cached ByteStreamer object for client {client['index']}")
|
| 38 |
+
|
| 39 |
else:
|
| 40 |
logging.debug(f"Creating new ByteStreamer object for client {client['index']}")
|
| 41 |
tg_connect = utils.ByteStreamer(client['client'])
|
| 42 |
+
ACTIVE_CLIENTS[client['client']] = tg_connect
|
| 43 |
+
|
| 44 |
logging.debug("before calling get_file_properties")
|
| 45 |
+
file_id = await tg_connect.get_file_properties(db_id, MULTI_CLIENTS)
|
| 46 |
logging.debug("after calling get_file_properties")
|
| 47 |
|
| 48 |
file_size = file_id.file_size
|
|
|
|
| 55 |
from_bytes = request.http_range.start or 0
|
| 56 |
until_bytes = (request.http_range.stop or file_size) - 1
|
| 57 |
|
| 58 |
+
if (until_bytes > file_size) or (from_bytes < 0) or (until_bytes < from_bytes):
|
| 59 |
+
|
| 60 |
return web.Response(
|
| 61 |
+
status=416,
|
| 62 |
+
body="416: Range not satisfiable",
|
| 63 |
+
headers={"Content-Range": f"bytes */{file_size}"},
|
| 64 |
)
|
| 65 |
|
| 66 |
chunk_size = 512 * 1024
|
|
|
|
| 71 |
last_part_cut = until_bytes % chunk_size + 1
|
| 72 |
|
| 73 |
req_length = until_bytes - from_bytes + 1
|
| 74 |
+
part_count = math.ceil(until_bytes / chunk_size) - math.floor(offset / chunk_size)
|
| 75 |
+
|
| 76 |
+
body = tg_connect.yield_file(file_id, client['index'], offset, first_part_cut,last_part_cut, part_count, chunk_size)
|
|
|
|
| 77 |
|
| 78 |
mime_type = file_id.mime_type
|
| 79 |
file_name = utils.get_name(file_id)
|
| 80 |
disposition = "attachment"
|
| 81 |
|
| 82 |
if not mime_type:
|
| 83 |
+
mime_type = mimetypes.guess_type(file_name)[0] or "application/octet-stream"
|
|
|
|
| 84 |
|
| 85 |
# if "video/" in mime_type or "audio/" in mime_type:
|
| 86 |
# disposition = "inline"
|
| 87 |
|
| 88 |
return web.Response(
|
| 89 |
+
status=206 if range_header else 200,
|
| 90 |
+
body=body,
|
| 91 |
+
headers={
|
| 92 |
+
"Content-Type": f"{mime_type}",
|
| 93 |
+
"Content-Range": f"bytes {from_bytes}-{until_bytes}/{file_size}",
|
| 94 |
+
"Content-Length": str(req_length),
|
| 95 |
+
"Content-Disposition": f'{disposition}; filename="{file_name}"',
|
| 96 |
+
"Accept-Ranges": "bytes",
|
| 97 |
+
},
|
| 98 |
)
|
FileStream/server/render_template.py
CHANGED
|
@@ -21,20 +21,15 @@ async def render_page(db_id):
|
|
| 21 |
async with aiohttp.ClientSession() as s:
|
| 22 |
async with s.get(src) as u:
|
| 23 |
file_size = humanbytes(int(u.headers.get('Content-Length')))
|
| 24 |
-
|
| 25 |
with open(template_file) as f:
|
| 26 |
template = jinja2.Template(f.read())
|
| 27 |
-
|
| 28 |
return template.render(file_name=file_name,
|
| 29 |
file_url=src,
|
| 30 |
file_size=file_size)
|
| 31 |
|
| 32 |
|
| 33 |
async def render_upload():
|
| 34 |
-
|
| 35 |
template_file = "FileStream/server/template/upload.html"
|
| 36 |
-
|
| 37 |
with open(template_file) as f:
|
| 38 |
template = jinja2.Template(f.read())
|
| 39 |
-
|
| 40 |
return template.render()
|
|
|
|
| 21 |
async with aiohttp.ClientSession() as s:
|
| 22 |
async with s.get(src) as u:
|
| 23 |
file_size = humanbytes(int(u.headers.get('Content-Length')))
|
|
|
|
| 24 |
with open(template_file) as f:
|
| 25 |
template = jinja2.Template(f.read())
|
|
|
|
| 26 |
return template.render(file_name=file_name,
|
| 27 |
file_url=src,
|
| 28 |
file_size=file_size)
|
| 29 |
|
| 30 |
|
| 31 |
async def render_upload():
|
|
|
|
| 32 |
template_file = "FileStream/server/template/upload.html"
|
|
|
|
| 33 |
with open(template_file) as f:
|
| 34 |
template = jinja2.Template(f.read())
|
|
|
|
| 35 |
return template.render()
|
FileStream/server/routes_main.py
CHANGED
|
@@ -10,7 +10,8 @@ from aiohttp.http_exceptions import BadStatusLine
|
|
| 10 |
|
| 11 |
#---------------------Local Upload---------------------#
|
| 12 |
from FileStream.config import Telegram
|
| 13 |
-
from FileStream.bot import
|
|
|
|
| 14 |
from FileStream.server.exceptions import FIleNotFound, InvalidHash
|
| 15 |
from FileStream import utils, StartTime, __version__
|
| 16 |
from FileStream.utils.FileProcessors.custom_ul import TeleUploader
|
|
@@ -26,8 +27,8 @@ async def root_status_handler(_):
|
|
| 26 |
"server_status":"running",
|
| 27 |
"uptime": utils.get_readable_time(time.time() - StartTime),
|
| 28 |
"telegram_bot": "@" + FileStream.username,
|
| 29 |
-
"connected_bots": len(
|
| 30 |
-
"loads":dict(("bot" + str(c + 1), l) for c, (_, l) in enumerate(sorted(
|
| 31 |
"version": __version__,
|
| 32 |
})
|
| 33 |
|
|
|
|
| 10 |
|
| 11 |
#---------------------Local Upload---------------------#
|
| 12 |
from FileStream.config import Telegram
|
| 13 |
+
from FileStream.bot import FileStream
|
| 14 |
+
from FileStream.bot import MULTI_CLIENTS, WORK_LOADS
|
| 15 |
from FileStream.server.exceptions import FIleNotFound, InvalidHash
|
| 16 |
from FileStream import utils, StartTime, __version__
|
| 17 |
from FileStream.utils.FileProcessors.custom_ul import TeleUploader
|
|
|
|
| 27 |
"server_status":"running",
|
| 28 |
"uptime": utils.get_readable_time(time.time() - StartTime),
|
| 29 |
"telegram_bot": "@" + FileStream.username,
|
| 30 |
+
"connected_bots": len(MULTI_CLIENTS),
|
| 31 |
+
"loads":dict(("bot" + str(c + 1), l) for c, (_, l) in enumerate(sorted(WORK_LOADS.items(), key=lambda x: x[1], reverse=True))),
|
| 32 |
"version": __version__,
|
| 33 |
})
|
| 34 |
|
FileStream/utils/FileProcessors/custom_dl.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
import asyncio
|
| 2 |
import logging
|
| 3 |
from typing import Dict, Union
|
| 4 |
-
from FileStream.bot import
|
| 5 |
from pyrogram import Client, utils, raw
|
| 6 |
from .file_properties import get_file_ids
|
| 7 |
from pyrogram.session import Session, Auth
|
|
@@ -155,7 +155,7 @@ class ByteStreamer:
|
|
| 155 |
) -> Union[str, None]:
|
| 156 |
|
| 157 |
client = self.client
|
| 158 |
-
|
| 159 |
logging.debug(f"Starting to yielding file with client {index}.")
|
| 160 |
media_session = await self.generate_media_session(client, file_id)
|
| 161 |
|
|
@@ -196,7 +196,7 @@ class ByteStreamer:
|
|
| 196 |
pass
|
| 197 |
finally:
|
| 198 |
logging.debug(f"Finished yielding file with {current_part} parts.")
|
| 199 |
-
|
| 200 |
|
| 201 |
async def clean_cache(self) -> None:
|
| 202 |
"""
|
|
|
|
| 1 |
import asyncio
|
| 2 |
import logging
|
| 3 |
from typing import Dict, Union
|
| 4 |
+
from FileStream.bot import WORK_LOADS
|
| 5 |
from pyrogram import Client, utils, raw
|
| 6 |
from .file_properties import get_file_ids
|
| 7 |
from pyrogram.session import Session, Auth
|
|
|
|
| 155 |
) -> Union[str, None]:
|
| 156 |
|
| 157 |
client = self.client
|
| 158 |
+
WORK_LOADS[index] += 1
|
| 159 |
logging.debug(f"Starting to yielding file with client {index}.")
|
| 160 |
media_session = await self.generate_media_session(client, file_id)
|
| 161 |
|
|
|
|
| 196 |
pass
|
| 197 |
finally:
|
| 198 |
logging.debug(f"Finished yielding file with {current_part} parts.")
|
| 199 |
+
WORK_LOADS[index] -= 1
|
| 200 |
|
| 201 |
async def clean_cache(self) -> None:
|
| 202 |
"""
|
FileStream/utils/FileProcessors/custom_mix.py
CHANGED
|
@@ -14,9 +14,9 @@ from pyrogram.file_id import FileId, FileType, ThumbnailSource
|
|
| 14 |
from pyrogram.types import Message
|
| 15 |
from pyrogram import StopTransmission
|
| 16 |
|
| 17 |
-
|
| 18 |
from typing import Dict, Union
|
| 19 |
-
from FileStream.bot import
|
| 20 |
from pyrogram import Client, utils, raw
|
| 21 |
from .file_properties import get_file_ids
|
| 22 |
from pyrogram.session import Session, Auth
|
|
@@ -49,7 +49,7 @@ from pyrogram.enums.parse_mode import ParseMode
|
|
| 49 |
|
| 50 |
#-----------------------Local Imports----------------------------------#
|
| 51 |
from FileStream import utils, StartTime, __version__
|
| 52 |
-
from FileStream.bot import FileStream,
|
| 53 |
from FileStream.utils.FileProcessors.bot_utils import is_user_banned, is_user_exist, is_user_joined, gen_link, is_channel_banned, is_channel_exist, is_user_authorized
|
| 54 |
from FileStream.Database import Database
|
| 55 |
from FileStream.utils.FileProcessors.file_properties import get_file_ids, get_file_info
|
|
@@ -78,7 +78,7 @@ class TGFileController:
|
|
| 78 |
async def get_me(self):
|
| 79 |
return await self.client.get_me().username
|
| 80 |
|
| 81 |
-
async def get_file_properties(self, db_id: str,
|
| 82 |
"""
|
| 83 |
Returns the properties of a media of a specific message in a FIleId class.
|
| 84 |
if the properties are cached, then it'll return the cached results.
|
|
@@ -86,12 +86,12 @@ class TGFileController:
|
|
| 86 |
"""
|
| 87 |
if not db_id in self.cached_file_ids:
|
| 88 |
logging.debug("Before Calling generate_file_properties")
|
| 89 |
-
await self.generate_file_properties(db_id,
|
| 90 |
logging.debug(f"Cached file properties for file with ID {db_id}")
|
| 91 |
return self.cached_file_ids[db_id]
|
| 92 |
|
| 93 |
async def generate_file_properties(self, db_id: str,
|
| 94 |
-
|
| 95 |
"""
|
| 96 |
Generates the properties of a media file on a specific message.
|
| 97 |
returns ths properties in a FIleId class.
|
|
@@ -306,7 +306,7 @@ class TGFileController:
|
|
| 306 |
client.loop.create_task(worker(session)) for _ in range(workers_count)
|
| 307 |
]
|
| 308 |
|
| 309 |
-
|
| 310 |
logging.debug(f"Starting to yielding file with client {index}.")
|
| 311 |
media_session = await self.generate_media_session(client, file_id)
|
| 312 |
|
|
@@ -370,7 +370,7 @@ class TGFileController:
|
|
| 370 |
|
| 371 |
await session.stop()
|
| 372 |
logging.debug(f"Finished yielding file with {file_part} parts.")
|
| 373 |
-
|
| 374 |
|
| 375 |
if is_big:
|
| 376 |
return raw.types.InputFileBig(
|
|
|
|
| 14 |
from pyrogram.types import Message
|
| 15 |
from pyrogram import StopTransmission
|
| 16 |
|
| 17 |
+
|
| 18 |
from typing import Dict, Union
|
| 19 |
+
from FileStream.bot import WORK_LOADS
|
| 20 |
from pyrogram import Client, utils, raw
|
| 21 |
from .file_properties import get_file_ids
|
| 22 |
from pyrogram.session import Session, Auth
|
|
|
|
| 49 |
|
| 50 |
#-----------------------Local Imports----------------------------------#
|
| 51 |
from FileStream import utils, StartTime, __version__
|
| 52 |
+
from FileStream.bot import FileStream, MULTI_CLIENTS, WORK_LOADS
|
| 53 |
from FileStream.utils.FileProcessors.bot_utils import is_user_banned, is_user_exist, is_user_joined, gen_link, is_channel_banned, is_channel_exist, is_user_authorized
|
| 54 |
from FileStream.Database import Database
|
| 55 |
from FileStream.utils.FileProcessors.file_properties import get_file_ids, get_file_info
|
|
|
|
| 78 |
async def get_me(self):
|
| 79 |
return await self.client.get_me().username
|
| 80 |
|
| 81 |
+
async def get_file_properties(self, db_id: str, MULTI_CLIENTS) -> FileId:
|
| 82 |
"""
|
| 83 |
Returns the properties of a media of a specific message in a FIleId class.
|
| 84 |
if the properties are cached, then it'll return the cached results.
|
|
|
|
| 86 |
"""
|
| 87 |
if not db_id in self.cached_file_ids:
|
| 88 |
logging.debug("Before Calling generate_file_properties")
|
| 89 |
+
await self.generate_file_properties(db_id, MULTI_CLIENTS)
|
| 90 |
logging.debug(f"Cached file properties for file with ID {db_id}")
|
| 91 |
return self.cached_file_ids[db_id]
|
| 92 |
|
| 93 |
async def generate_file_properties(self, db_id: str,
|
| 94 |
+
MULTI_CLIENTS) -> FileId:
|
| 95 |
"""
|
| 96 |
Generates the properties of a media file on a specific message.
|
| 97 |
returns ths properties in a FIleId class.
|
|
|
|
| 306 |
client.loop.create_task(worker(session)) for _ in range(workers_count)
|
| 307 |
]
|
| 308 |
|
| 309 |
+
WORK_LOADS[index] += 1
|
| 310 |
logging.debug(f"Starting to yielding file with client {index}.")
|
| 311 |
media_session = await self.generate_media_session(client, file_id)
|
| 312 |
|
|
|
|
| 370 |
|
| 371 |
await session.stop()
|
| 372 |
logging.debug(f"Finished yielding file with {file_part} parts.")
|
| 373 |
+
WORK_LOADS[index] -= 1
|
| 374 |
|
| 375 |
if is_big:
|
| 376 |
return raw.types.InputFileBig(
|
FileStream/utils/FileProcessors/custom_ul.py
CHANGED
|
@@ -11,7 +11,7 @@ from pyrogram import filters, types, Client, raw
|
|
| 11 |
from pyrogram.file_id import FileId, FileType, PHOTO_TYPES, ThumbnailSource
|
| 12 |
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
|
| 13 |
#----------------------------------------------
|
| 14 |
-
from FileStream.bot import FileStream,
|
| 15 |
from FileStream.config import Telegram, Server
|
| 16 |
from FileStream.Database import Database
|
| 17 |
import asyncio
|
|
@@ -48,7 +48,7 @@ class TeleUploader:
|
|
| 48 |
async def get_me(self):
|
| 49 |
return await self.client.get_me().username
|
| 50 |
|
| 51 |
-
async def get_file_properties(self, db_id: str,
|
| 52 |
"""
|
| 53 |
Returns the properties of a media of a specific message in a FIleId class.
|
| 54 |
if the properties are cached, then it'll return the cached results.
|
|
@@ -56,7 +56,7 @@ class TeleUploader:
|
|
| 56 |
"""
|
| 57 |
if not db_id in self.cached_file_ids:
|
| 58 |
logging.debug("Before Calling generate_file_properties")
|
| 59 |
-
await self.generate_file_properties(db_id,
|
| 60 |
logging.debug(f"Cached file properties for file with ID {db_id}")
|
| 61 |
return self.cached_file_ids[db_id]
|
| 62 |
|
|
@@ -72,12 +72,11 @@ class TeleUploader:
|
|
| 72 |
if media_session is None:
|
| 73 |
if file_id.dc_id != await client.storage.dc_id():
|
| 74 |
media_session = Session(
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
is_media=True,
|
| 81 |
)
|
| 82 |
await media_session.start()
|
| 83 |
|
|
@@ -87,23 +86,21 @@ class TeleUploader:
|
|
| 87 |
|
| 88 |
try:
|
| 89 |
await media_session.invoke(
|
| 90 |
-
raw.functions.auth.ImportAuthorization(
|
| 91 |
-
id=exported_auth.id, bytes=exported_auth.bytes))
|
| 92 |
break
|
| 93 |
except AuthBytesInvalid:
|
| 94 |
-
logging.debug(
|
| 95 |
-
f"Invalid authorization bytes for DC {file_id.dc_id}")
|
| 96 |
continue
|
| 97 |
else:
|
| 98 |
await media_session.stop()
|
| 99 |
raise AuthBytesInvalid
|
| 100 |
else:
|
| 101 |
media_session = Session(
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
)
|
| 108 |
await media_session.start()
|
| 109 |
logging.debug(f"Created media session for DC {file_id.dc_id}")
|
|
@@ -149,8 +146,7 @@ class TeleUploader:
|
|
| 149 |
file_size_limit_mib = 4000 if client.me.is_premium else 2000
|
| 150 |
#file_size_limit_mib = 4000
|
| 151 |
if file_details["file"]["file_size"] > file_size_limit_mib * 1024 * 1024:
|
| 152 |
-
raise ValueError(
|
| 153 |
-
f"Can't upload files bigger than {file_size_limit_mib} MiB")
|
| 154 |
|
| 155 |
#file_total_parts = file_details["total_parts"]
|
| 156 |
#is_big = file_size > 10 * 1024 * 1024
|
|
@@ -175,8 +171,7 @@ class TeleUploader:
|
|
| 175 |
file_total_parts=file_details["file"]["total_parts"],
|
| 176 |
bytes=chunk)
|
| 177 |
response['status'] = "success"
|
| 178 |
-
response[
|
| 179 |
-
'message'] = f"Uploading as Bigfile {file_details['file']['file_part']}/{file_details['file']['total_parts']}"
|
| 180 |
print("Response", response)
|
| 181 |
|
| 182 |
await session.invoke(rpc)
|
|
@@ -197,8 +192,7 @@ class TeleUploader:
|
|
| 197 |
file=final,
|
| 198 |
mime_type=file_details['file']["mime_type"],
|
| 199 |
attributes=[
|
| 200 |
-
raw.types.DocumentAttributeFilename(
|
| 201 |
-
file_name=file_details['file']["file_name"])
|
| 202 |
])
|
| 203 |
|
| 204 |
try:
|
|
@@ -243,7 +237,7 @@ class TeleUploader:
|
|
| 243 |
)
|
| 244 |
|
| 245 |
#log_msg = await send_file(FileStream, db_id, file_info['file_id'], message)
|
| 246 |
-
#await update_file_id(log_msg.id,
|
| 247 |
except Exception as e:
|
| 248 |
await client.send_message(chat_id=Telegram.ULOG_GROUP,
|
| 249 |
text=f"**#EʀʀᴏʀTʀᴀᴄᴋᴇʙᴀᴄᴋ:** `{e}`",
|
|
|
|
| 11 |
from pyrogram.file_id import FileId, FileType, PHOTO_TYPES, ThumbnailSource
|
| 12 |
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
|
| 13 |
#----------------------------------------------
|
| 14 |
+
from FileStream.bot import FileStream, MULTI_CLIENTS, WORK_LOADS
|
| 15 |
from FileStream.config import Telegram, Server
|
| 16 |
from FileStream.Database import Database
|
| 17 |
import asyncio
|
|
|
|
| 48 |
async def get_me(self):
|
| 49 |
return await self.client.get_me().username
|
| 50 |
|
| 51 |
+
async def get_file_properties(self, db_id: str, MULTI_CLIENTS) -> FileId:
|
| 52 |
"""
|
| 53 |
Returns the properties of a media of a specific message in a FIleId class.
|
| 54 |
if the properties are cached, then it'll return the cached results.
|
|
|
|
| 56 |
"""
|
| 57 |
if not db_id in self.cached_file_ids:
|
| 58 |
logging.debug("Before Calling generate_file_properties")
|
| 59 |
+
await self.generate_file_properties(db_id, MULTI_CLIENTS)
|
| 60 |
logging.debug(f"Cached file properties for file with ID {db_id}")
|
| 61 |
return self.cached_file_ids[db_id]
|
| 62 |
|
|
|
|
| 72 |
if media_session is None:
|
| 73 |
if file_id.dc_id != await client.storage.dc_id():
|
| 74 |
media_session = Session(
|
| 75 |
+
client,
|
| 76 |
+
file_id.dc_id,
|
| 77 |
+
await Auth(client, file_id.dc_id, await client.storage.test_mode()).create(),
|
| 78 |
+
await client.storage.test_mode(),
|
| 79 |
+
is_media=True,
|
|
|
|
| 80 |
)
|
| 81 |
await media_session.start()
|
| 82 |
|
|
|
|
| 86 |
|
| 87 |
try:
|
| 88 |
await media_session.invoke(
|
| 89 |
+
raw.functions.auth.ImportAuthorization(id=exported_auth.id, bytes=exported_auth.bytes))
|
|
|
|
| 90 |
break
|
| 91 |
except AuthBytesInvalid:
|
| 92 |
+
logging.debug(f"Invalid authorization bytes for DC {file_id.dc_id}")
|
|
|
|
| 93 |
continue
|
| 94 |
else:
|
| 95 |
await media_session.stop()
|
| 96 |
raise AuthBytesInvalid
|
| 97 |
else:
|
| 98 |
media_session = Session(
|
| 99 |
+
client,
|
| 100 |
+
file_id.dc_id,
|
| 101 |
+
await client.storage.auth_key(),
|
| 102 |
+
await client.storage.test_mode(),
|
| 103 |
+
is_media=True,
|
| 104 |
)
|
| 105 |
await media_session.start()
|
| 106 |
logging.debug(f"Created media session for DC {file_id.dc_id}")
|
|
|
|
| 146 |
file_size_limit_mib = 4000 if client.me.is_premium else 2000
|
| 147 |
#file_size_limit_mib = 4000
|
| 148 |
if file_details["file"]["file_size"] > file_size_limit_mib * 1024 * 1024:
|
| 149 |
+
raise ValueError(f"Can't upload files bigger than {file_size_limit_mib} MiB")
|
|
|
|
| 150 |
|
| 151 |
#file_total_parts = file_details["total_parts"]
|
| 152 |
#is_big = file_size > 10 * 1024 * 1024
|
|
|
|
| 171 |
file_total_parts=file_details["file"]["total_parts"],
|
| 172 |
bytes=chunk)
|
| 173 |
response['status'] = "success"
|
| 174 |
+
response['message'] = f"Uploading as Bigfile {file_details['file']['file_part']}/{file_details['file']['total_parts']}"
|
|
|
|
| 175 |
print("Response", response)
|
| 176 |
|
| 177 |
await session.invoke(rpc)
|
|
|
|
| 192 |
file=final,
|
| 193 |
mime_type=file_details['file']["mime_type"],
|
| 194 |
attributes=[
|
| 195 |
+
raw.types.DocumentAttributeFilename(file_name=file_details['file']["file_name"])
|
|
|
|
| 196 |
])
|
| 197 |
|
| 198 |
try:
|
|
|
|
| 237 |
)
|
| 238 |
|
| 239 |
#log_msg = await send_file(FileStream, db_id, file_info['file_id'], message)
|
| 240 |
+
#await update_file_id(log_msg.id, MULTI_CLIENTS))
|
| 241 |
except Exception as e:
|
| 242 |
await client.send_message(chat_id=Telegram.ULOG_GROUP,
|
| 243 |
text=f"**#EʀʀᴏʀTʀᴀᴄᴋᴇʙᴀᴄᴋ:** `{e}`",
|
FileStream/utils/FileProcessors/file_properties.py
CHANGED
|
@@ -8,7 +8,8 @@ from pyrogram.enums import ParseMode, ChatType
|
|
| 8 |
from pyrogram.types import Message
|
| 9 |
from pyrogram.file_id import FileId
|
| 10 |
#-----------------------------------------------------
|
| 11 |
-
from FileStream.bot import FileStream
|
|
|
|
| 12 |
from FileStream.Database import Database
|
| 13 |
from FileStream.config import Telegram, Server
|
| 14 |
from FileStream.Tools import Time_ISTKolNow
|
|
@@ -39,9 +40,9 @@ async def send_file(client: Client, db_id, file_id: str, message, send_to):
|
|
| 39 |
return {"message": log_msg, "sent_to": send_to}
|
| 40 |
|
| 41 |
|
| 42 |
-
async def update_file_id(message,
|
| 43 |
file_ids = {}
|
| 44 |
-
for client_id, client in
|
| 45 |
#log_msg = await client.get_messages(message['location'],message['message_id'])
|
| 46 |
media = get_media_from_message(await client.get_messages(message['location'],message['message_id']))
|
| 47 |
file_ids[str(client.id)] = getattr(media, "file_id", "")
|
|
@@ -81,7 +82,7 @@ async def get_file_ids(client: Client | bool, db_id: str, message) -> Optional[F
|
|
| 81 |
log_msg = await send_file(FileStream, db_id,file_info['file']['file_id'], message,Telegram.FLOG_CHANNEL)
|
| 82 |
#updated_info = update_file_info(log_msg)
|
| 83 |
await db.update_file_info(db_id, update_file_info(log_msg))
|
| 84 |
-
await db.update_file_ids(db_id, await update_file_id(await db.get_file(db_id),
|
| 85 |
|
| 86 |
logging.debug("Stored file_id of all clients in DB")
|
| 87 |
if not client:
|
|
@@ -89,7 +90,7 @@ async def get_file_ids(client: Client | bool, db_id: str, message) -> Optional[F
|
|
| 89 |
file_info = await db.get_file(db_id)
|
| 90 |
|
| 91 |
if file_info['user_type'] == "WEB":
|
| 92 |
-
await db.update_file_ids(db_id, await update_file_id(await db.get_file(db_id),
|
| 93 |
logging.debug("Stored file_id of all clients in DB")
|
| 94 |
if not client:
|
| 95 |
return
|
|
|
|
| 8 |
from pyrogram.types import Message
|
| 9 |
from pyrogram.file_id import FileId
|
| 10 |
#-----------------------------------------------------
|
| 11 |
+
from FileStream.bot import FileStream
|
| 12 |
+
from FileStream.bot import MULTI_CLIENTS
|
| 13 |
from FileStream.Database import Database
|
| 14 |
from FileStream.config import Telegram, Server
|
| 15 |
from FileStream.Tools import Time_ISTKolNow
|
|
|
|
| 40 |
return {"message": log_msg, "sent_to": send_to}
|
| 41 |
|
| 42 |
|
| 43 |
+
async def update_file_id(message, MULTI_CLIENTS):
|
| 44 |
file_ids = {}
|
| 45 |
+
for client_id, client in MULTI_CLIENTS.items():
|
| 46 |
#log_msg = await client.get_messages(message['location'],message['message_id'])
|
| 47 |
media = get_media_from_message(await client.get_messages(message['location'],message['message_id']))
|
| 48 |
file_ids[str(client.id)] = getattr(media, "file_id", "")
|
|
|
|
| 82 |
log_msg = await send_file(FileStream, db_id,file_info['file']['file_id'], message,Telegram.FLOG_CHANNEL)
|
| 83 |
#updated_info = update_file_info(log_msg)
|
| 84 |
await db.update_file_info(db_id, update_file_info(log_msg))
|
| 85 |
+
await db.update_file_ids(db_id, await update_file_id(await db.get_file(db_id),MULTI_CLIENTS))
|
| 86 |
|
| 87 |
logging.debug("Stored file_id of all clients in DB")
|
| 88 |
if not client:
|
|
|
|
| 90 |
file_info = await db.get_file(db_id)
|
| 91 |
|
| 92 |
if file_info['user_type'] == "WEB":
|
| 93 |
+
await db.update_file_ids(db_id, await update_file_id(await db.get_file(db_id), MULTI_CLIENTS))
|
| 94 |
logging.debug("Stored file_id of all clients in DB")
|
| 95 |
if not client:
|
| 96 |
return
|
Unused Codes/__main__old.py
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import sys
|
| 2 |
+
import asyncio
|
| 3 |
+
import logging
|
| 4 |
+
import traceback
|
| 5 |
+
import logging.handlers as handlers
|
| 6 |
+
from FileStream.config import Telegram, Server
|
| 7 |
+
from aiohttp import web
|
| 8 |
+
from pyrogram import idle
|
| 9 |
+
|
| 10 |
+
from FileStream.bot import FileStream
|
| 11 |
+
from FileStream.Tools import Time_ISTKolNow
|
| 12 |
+
from FileStream.server import web_server
|
| 13 |
+
from FileStream.bot.clients import initialize_clients
|
| 14 |
+
|
| 15 |
+
logging.basicConfig(
|
| 16 |
+
level=logging.INFO,
|
| 17 |
+
datefmt="%d/%m/%Y %H:%M:%S",
|
| 18 |
+
format=
|
| 19 |
+
'[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
|
| 20 |
+
handlers=[
|
| 21 |
+
logging.StreamHandler(stream=sys.stdout),
|
| 22 |
+
handlers.RotatingFileHandler("streambot.log",
|
| 23 |
+
mode="a",
|
| 24 |
+
maxBytes=104857600,
|
| 25 |
+
backupCount=2,
|
| 26 |
+
encoding="utf-8")
|
| 27 |
+
],
|
| 28 |
+
)
|
| 29 |
+
|
| 30 |
+
logging.getLogger("aiohttp").setLevel(logging.ERROR)
|
| 31 |
+
logging.getLogger("pyrogram").setLevel(logging.ERROR)
|
| 32 |
+
logging.getLogger("aiohttp.web").setLevel(logging.ERROR)
|
| 33 |
+
|
| 34 |
+
server = web.AppRunner(web_server())
|
| 35 |
+
|
| 36 |
+
loop = asyncio.get_event_loop()
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
async def start_services():
|
| 40 |
+
print("****")
|
| 41 |
+
if Telegram.SECONDARY:
|
| 42 |
+
print("------------------ Starting as Secondary Server ------------------")
|
| 43 |
+
else:
|
| 44 |
+
print("------------------- Starting as Primary Server -------------------")
|
| 45 |
+
print( "****")
|
| 46 |
+
print("-------------------- Initializing Telegram Bot --------------------")
|
| 47 |
+
|
| 48 |
+
await FileStream.start()
|
| 49 |
+
bot_info = await FileStream.get_me()
|
| 50 |
+
FileStream.id = bot_info.id
|
| 51 |
+
FileStream.username = bot_info.username
|
| 52 |
+
FileStream.fname = bot_info.first_name
|
| 53 |
+
print("------------------------------ DONE ------------------------------")
|
| 54 |
+
print("\n")
|
| 55 |
+
print("---------------------- Initializing Clients ----------------------")
|
| 56 |
+
await initialize_clients()
|
| 57 |
+
print("------------------------------ DONE ------------------------------")
|
| 58 |
+
print("\n")
|
| 59 |
+
print("--------------------- Initializing Web Server ---------------------")
|
| 60 |
+
await server.setup()
|
| 61 |
+
await web.TCPSite(server, Server.BIND_ADDRESS, Server.PORT).start()
|
| 62 |
+
print("------------------------------ DONE ------------------------------")
|
| 63 |
+
print("\n")
|
| 64 |
+
print("------------------------- Service Started -------------------------")
|
| 65 |
+
print("Bot =>> {}".format(bot_info.first_name))
|
| 66 |
+
if bot_info.dc_id:
|
| 67 |
+
print("DC ID =>> {}".format(str(bot_info.dc_id)))
|
| 68 |
+
print(" URL =>> {}".format(Server.URL))
|
| 69 |
+
print("------------------------------------------------------------------")
|
| 70 |
+
"""
|
| 71 |
+
all_sources = [
|
| 72 |
+
Telegram.ULOG_GROUP, Telegram.FLOG_CHANNEL, Telegram.PFLOG_CHANNEL
|
| 73 |
+
]
|
| 74 |
+
for source in all_sources:
|
| 75 |
+
await FileStream.send_message(chat_id=source,
|
| 76 |
+
text=f"Hi, I am Online @{ISTKolNow()}",
|
| 77 |
+
disable_web_page_preview=True)
|
| 78 |
+
"""
|
| 79 |
+
await idle()
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
async def cleanup():
|
| 83 |
+
await server.cleanup()
|
| 84 |
+
#await FileStream.stop()
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
if __name__ == "__main__":
|
| 88 |
+
try:
|
| 89 |
+
loop.run_until_complete(start_services())
|
| 90 |
+
except KeyboardInterrupt:
|
| 91 |
+
loop.stop()
|
| 92 |
+
print("------------------------ Stopped Services ------------------------")
|
| 93 |
+
except Exception as err:
|
| 94 |
+
logging.error(traceback.format_exc())
|