File size: 11,817 Bytes
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e49d61
 
e566133
 
 
 
d006bf8
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7c5fb88
a9bff04
8d4d962
 
81e8a1f
 
06de700
8d4d962
 
06de700
 
 
0a52c56
 
278d044
400d8b3
 
fe81aca
400d8b3
 
ae409d1
400d8b3
ae409d1
400d8b3
 
 
 
 
 
 
 
fe81aca
e566133
 
458bb26
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca92c29
0e49d61
400d8b3
e566133
 
 
 
c91f3ea
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c91f3ea
0714d01
e566133
0714d01
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e49d61
 
e566133
 
 
 
 
 
0e49d61
e566133
 
 
 
 
 
 
 
c96bd11
e566133
c96bd11
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400d8b3
e566133
fe81aca
e566133
 
fe81aca
e566133
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
import os
import sys
import random
import urllib3
import logging
import asyncio
import traceback
import mimetypes
import time, math
from datetime import datetime
from typing import Dict, Union
from typing import Union, BinaryIO, List, Optional, Callable

from pyrogram import raw
from pyrogram import types
from pyrogram import filters, Client
from pyrogram import utils as pgutils
from pyrogram import StopTransmission, enums
from pyrogram import Client, utils, raw

from pyrogram.file_id import FileType
from pyrogram.session import Session, Auth
from pyrogram.enums import ParseMode, ChatType
from pyrogram.enums.parse_mode import ParseMode
from pyrogram.file_id import FileId, FileType, ThumbnailSource
from pyrogram.errors import FilePartMissing, AuthBytesInvalid, FloodWait
from pyrogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton

#--------------------------Local Imports-------------#

from FileStream.Database import Database
from FileStream.config import Telegram, Server
from FileStream.Tools.tool import TimeFormatter
from FileStream.Tools.progress import progress
from FileStream.bot import FileStream, req_client
from FileStream.bot import MULTI_CLIENTS, WORK_LOADS
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
from FileStream.utils.FileProcessors.custom_dl import ByteStreamer
from FileStream.utils.FileProcessors.custom_ul import  TeleUploader
from FileStream.utils.FileProcessors.custom_mix import TGFileController
from FileStream.utils.FileProcessors.translation import LANG, BUTTON
from FileStream.utils.FileProcessors.human_readable import humanbytes
from FileStream.utils.FileProcessors.file_properties import get_file_ids, get_file_info, get_private_file_ids

db = Database(Telegram.DATABASE_URL, Telegram.SESSION_NAME)


@FileStream.on_message(filters.private & (filters.document  | filters.video   | filters.video_note   | filters.audio   | filters.voice   | filters.animation   | filters.photo),    group=4,)
async def private_receive_handler(bot: Client, message: Message):
    try:
        """
        //All Values Generated Here is Decided in get_file_info () so No Need of this Block
        message_id = message.id
        if message.chat.type == ChatType.PRIVATE:
        user_idx = message.from_user.id
        else:
        user_idx = message.chat.id
        """
        #For First Set All Files PUBLIC
        instruction = {
            "privacy_type":"PUBLIC",
            "user_id":message.from_user.id if (message.chat.type == ChatType.PRIVATE) else message.chat.id,
            "user_type": "TELEGRAM",
            "IMDB_id": "Unknown",
            "poster": "Unknown",   
            "title": "Unknown",
            "release_date":"Unknown",
            "keywords":"Unknown",
            "type": "Unknown",
            "description":"Unknown",
            "genre":"Unknown",
            "quality":"Unknown",
        }

        reply = await message.reply_text(LANG.PROCESSING_TEXT)
        file_info=get_file_info(message, instruction)
        #This Will give a option to Public Private and temporary Upload
        reply_markup,stream_text = await upload_type_func(get_file_info(message, instruction),reply)
        """
        if poster == "None":
            await reply.reply_photo(photo=poster,
                                caption=stream_text,
                                parse_mode=ParseMode.HTML,
                                reply_markup=reply_markup
                                )
            
        else:"""
        await reply.edit_text(text=stream_text,
                                    parse_mode=ParseMode.HTML,
                                    disable_web_page_preview=True,
                                    reply_markup= reply_markup,
                                    )
        
            
    except FloodWait as e:
        print(f"Sleeping for {str(e.value)}s")
        
        await asyncio.sleep(e.value)
        await bot.send_message(
            chat_id=Telegram.ULOG_CHANNEL,
            text=
            f"Gᴏᴛ FʟᴏᴏᴅWᴀɪᴛ ᴏғ {str(e.value)}s ғʀᴏᴍ [{message.from_user.first_name}](tg://user?id={message.from_user.id})\n\n**ᴜsᴇʀ ɪᴅ :** `{str(message.from_user.id)}`",
            disable_web_page_preview=True,
            parse_mode=ParseMode.MARKDOWN)


@FileStream.on_message(filters.channel & ~filters.forwarded & ~filters.media_group & (filters.document  | filters.video  | filters.video_note  | filters.audio  | filters.voice  | filters.photo))
async def channel_receive_handler(bot: Client, message: Message):
    if await is_channel_banned(bot, message):
        return
    await is_channel_exist(bot, message)

    try:
        inserted_id = await db.add_file(file_info=get_file_info(message),  db_type="TEMPORARY")
        await get_file_ids(False, inserted_id, MULTI_CLIENTS, message)
        reply_markup,streaam_text = await gen_link(_id=inserted_id)
        await bot.edit_message_reply_markup(
            chat_id=message.chat.id,
            message_id=message.id,
            reply_markup=InlineKeyboardMarkup([[
                InlineKeyboardButton("Dᴏᴡɴʟᴏᴀᴅ ʟɪɴᴋ 📥",url=f"https://t.me/{FileStream.username}?start=stream_{str(inserted_id)}")
            ]]))

    except FloodWait as w:
        print(f"Sleeping for {str(w.x)}s")
        await asyncio.sleep(w.x)
        await bot.send_message(
            chat_id=Telegram.ULOG_GROUP,
            text=
            f"ɢᴏᴛ ғʟᴏᴏᴅᴡᴀɪᴛ ᴏғ {str(w.x)}s ғʀᴏᴍ {message.chat.title}\n\n**ᴄʜᴀɴɴᴇʟ ɪᴅ :** `{str(message.chat.id)}`",
            disable_web_page_preview=True)
    except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        await bot.send_message(chat_id=Telegram.ULOG_GROUP,
                               text=f"**#EʀʀᴏʀTʀᴀᴄᴋᴇʙᴀᴄᴋ:** `{e} {exc_type, fname, exc_tb.tb_lineno}`",
                               disable_web_page_preview=True)
        print(
            f"Cᴀɴ'ᴛ Eᴅɪᴛ Bʀᴏᴀᴅᴄᴀsᴛ Mᴇssᴀɢᴇ!\nEʀʀᴏʀ:  **Gɪᴠᴇ ᴍᴇ ᴇᴅɪᴛ ᴘᴇʀᴍɪssɪᴏɴ ɪɴ ᴜᴘᴅᴀᴛᴇs ᴀɴᴅ ʙɪɴ Cʜᴀɴɴᴇʟ!{e}**"
        )


@FileStream.on_message(filters.reply)
async def reply_handler(
    bot: Client,
    message: Message,
    thumb: Union[str, BinaryIO] = None,
):
    replied_message = message.reply_to_message
    resp = ["n", "no", "not","N","NOT","NO"]
    if not replied_message:
        return
    if not replied_message.media:
        return
    text = message.text
    try:
        main_message = replied_message.reply_to_message
        instruction = {
            "privacy_type":"PRIVATE",
            "user_id":message.from_user.id if (message.chat.type == ChatType.PRIVATE) else message.chat.id,
            "user_type":"TELEGRAM"
        }
        #file_infos = get_file_info(main_message, instruction)
        #All the Time Get_file_ids should be called before update privacy or else tagged_users will be {}
        file_info = await db.update_privacy(get_file_info(main_message, instruction))

        #file_info = await db.get_file_by_fileuniqueid_only(
        #    file_infos['file']['file_unique_id'])
        mime_type = file_info['file']['mime_type']
        file_id = file_info['file']['file_id']
        file_size = file_info['file']['file_size']
        message_id = replied_message.id
        user_idx = message.from_user.id if (message.chat.type == ChatType.PRIVATE) else message.chat.id

        if text.lower() not in resp:
            ext = mimetypes.guess_extension(mime_type)
            file_info['file']['file_name'] = f"{message.text}{ext}"

        #index = min(WORK_LWORK_LOADS, key=WORK_LWORK_LOADS.get)
        #faster_client = MULTI_CLIENTS[index]
        client=await req_client()
        print(f"Using {client['index']} for {file_info['file']['file_name']}")
        logging.info(f"Client {client['index']} is now serving {request.headers.get('X-FORWARDED-FOR',request.remote)}")


        tg_connect = TGFileController(client['client'])
        req_file_id = await tg_connect.get_file_properties(file_info['_id'], MULTI_CLIENTS)

        start_time = time.time()
        file = await tg_connect.upload_file(
            index=client['index'],
            file_id=req_file_id,
            file_name=file_info['file']['file_name'],
            file_size=file_info['file']['file_size'],
            progress=progress,
            progress_args=(replied_message, file_info['file']['file_name'],file_info['file']['file_size'], start_time))

        success_text = LANG.SUCCESS_PRIV_FILE.format(file_info['file']['file_name'], humanbytes(file_size))
        await replied_message.edit_text(
            text=success_text,
            parse_mode=ParseMode.HTML,
            disable_web_page_preview=True,
        )

        media = raw.types.InputMediaUploadedDocument(
            mime_type=mime_type,
            file=file,
            force_file=False,
            thumb=thumb,
            attributes=[
                raw.types.DocumentAttributeFilename(
                    file_name=file_info['file']['file_name'])
            ])
        message_txt = f"* File Name: { file_info['file']['file_name']} \n* File Size :{humanbytes(file_info['file']['file_size'])} \n\n🔔 ᴛʜɪꜱ ꜰɪʟᴇ ɪꜱ ᴜᴘʟᴏᴀᴅᴇᴅ ᴛᴏ ᴘʀɪᴠᴀᴛᴇ ꜱᴘᴀᴄᴇ ʙʏ @ꜱᴘᴀʀᴋᴅʀɪᴠᴇ_ʙᴏᴛ"

        send_file = await tg_connect.send(media=media,
                                          caption=message_txt,
                                          reply_to_msg_id=None,
                                          chat_id=Telegram.PFLOG_CHANNEL)

        reply_markup,stream_text = await gen_link(_id=file_info['_id'])
        await replied_message.edit_text(
            text=f"{message_txt}\n{stream_text}",
            parse_mode=ParseMode.HTML,
            disable_web_page_preview=True,
            reply_markup=reply_markup,
        )
        instruction = {
            "privacy_type":"PRIVATE",
            "user_id":message.from_user.id if(message.chat.type == ChatType.PRIVATE) else message.chat.id,
            "user_type":"TELEGRAM",
            "REUPLOADED":"True"
        }
        file_info = get_file_info(send_file, instruction)
        file_info['reupload']="True"
        # Here we are Adding the File Into the database First
        await db.add_private_file(file_info)
        #await get_private_file_ids(False, inserted_id, message)
        #All the Time Get_file_ids should be called before update privacy or else tagged_users will be {}
        #await db.update_privacy(file_info)

    except FloodWait as w:
        print(f"Sleeping for {str(w.wait_time)}s")
        await asyncio.sleep(w.wait_time)
        await bot.send_message(
            chat_id=Telegram.ULOG_GROUP,
            text=
            f"ɢᴏᴛ ғʟᴏᴏᴅᴡᴀɪᴛ ᴏғ {str(w.x)}s ғʀᴏᴍ {message.chat.title}\n\n**ᴄʜᴀɴɴᴇʟ ɪᴅ :** `{str(message.chat.id)}`",
            disable_web_page_preview=True)

    except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        await bot.send_message(chat_id=Telegram.ULOG_GROUP,
                               text=f"**#EʀʀᴏʀTʀᴀᴄᴋᴇʙᴀᴄᴋ:** `{e} {exc_type, fname, exc_tb.tb_lineno}`",
                               disable_web_page_preview=True)
        print(f"Cᴀɴ'ᴛ Eᴅɪᴛ Bʀᴏᴀᴅᴄᴀsᴛ Mᴇssᴀɢᴇ!\nEʀʀᴏʀ:  **Gɪᴠᴇ ᴍᴇ ᴇᴅɪᴛ ᴘᴇʀᴍɪssɪᴏɴ ɪɴ ᴜᴘᴅᴀᴛᴇs ᴀɴᴅ ʙɪɴ Cʜᴀɴɴᴇʟ!{traceback.print_exc()}  (upload_file)**")
        #await db.delete_one_privfile(inserted_id)