From 234c41c384700743014c1efe3acec9033cd46014 Mon Sep 17 00:00:00 2001 From: yasir Date: Fri, 3 Mar 2023 22:33:14 +0700 Subject: [PATCH] Add subdl beta --- misskaty/plugins/dev.py | 2 +- misskaty/plugins/subscene_dl.py | 164 ++++++++++++++++++++++---------- 2 files changed, 115 insertions(+), 51 deletions(-) diff --git a/misskaty/plugins/dev.py b/misskaty/plugins/dev.py index 0cab8583..9e564790 100644 --- a/misskaty/plugins/dev.py +++ b/misskaty/plugins/dev.py @@ -78,7 +78,7 @@ async def balas(c, m): await m.reply(pesan[1], reply_to_message_id=m.reply_to_message.id) -@app.on_message(filters.command(["stats"], COMMAND_HANDLER) & filters.user(SUDO)) +@app.on_message(filters.command(["stats"], COMMAND_HANDLER)) async def server_stats(c, m): """ Give system stats of the server. diff --git a/misskaty/plugins/subscene_dl.py b/misskaty/plugins/subscene_dl.py index b85c1b66..892530f5 100644 --- a/misskaty/plugins/subscene_dl.py +++ b/misskaty/plugins/subscene_dl.py @@ -1,61 +1,125 @@ -from misskaty.core.message_utils import * -from misskaty.vars import COMMAND_HANDLER -from pyrogram import filters -import cloudscraper, logging -from misskaty import app +import logging + +import cloudscraper from bs4 import BeautifulSoup from pykeyboard import InlineButton, InlineKeyboard -from misskaty.helper import http +from pyrogram import filters + +from misskaty import app from misskaty.core.decorator.ratelimiter import ratelimiter +from misskaty.core.message_utils import * +from misskaty.helper import http +from misskaty.vars import COMMAND_HANDLER + +from .web_scraper import split_arr LOGGER = logging.getLogger(__name__) +SUB_TITLE_DICT = {} +SUB_DL_DICT = {} -@app.on_message(filters.command(["subscene"], COMMAND_HANDLER)) -@ratelimiter -async def imdb_search_id(client, message): - BTN = [] - if len(message.command) == 1: - return await kirimPesan(message, f"â„šī¸ Please add query after CMD!\nEx: /{message.command[0]} Jurassic World") - if message.sender_chat: - return await kirimPesan(message, "This feature not supported for channel..") - kueri = message.text.split(None, 1)[1] - k = await kirimPesan( - message, - f"🔎 Searching {kueri} Subscene database...", - quote=True, - ) - msg = "" - buttons = InlineKeyboard(row_width=4) - scraper = cloudscraper.create_scraper() - try: +# Get list title based on query +async def getTitleSub(msg, kueri, CurrentPage, user): + if not SUB_TITLE_DICT.get(msg.id): + sdata = [] + scraper = cloudscraper.create_scraper() param = {"query": kueri} r = scraper.post("https://subscene.com/subtitles/searchbytitle", data=param).text soup = BeautifulSoup(r,"lxml") lists = soup.find("div", {"class": "search-result"}) - a = lists.find_all("div", {"class":"title"}) - LOGGER.info(a) - # if not res: - # return await k.edit_caption(f"â›”ī¸ No Result Found For: {kueri}") - msg += f"đŸŽŦ Found ({len(a)}) result for : {kueri}\n\n" - for num, sub in enumerate(a, start=1): + entry = lists.find_all("div", {"class":"title"}) + # if "Tidak Ditemukan" in entry[0].text: + # await editPesan(msg, f"Sorry, could not find any result for: {kueri}") + # return None, 0, None + for sub in entry: title = sub.find('a').text - url = f"https://subscene.com{sub.find('a').get('href')}" - msg += f"{num}. {title}\n" - BTN.append( - InlineButton( - text=num, - callback_data=f"subscene#{message.from_user.id}#hehehe", - ) - ) - BTN.extend( - ( - InlineButton( - text="❌ Close", - callback_data=f"close#{message.from_user.id}", - ), - ) - ) - buttons.add(*BTN) - await editPesan(k, msg, reply_markup=buttons) - except Exception as err: - await editPesan(k, f"Ooppss, failed get subtitle list from subscene.\n\nERROR: {err}") + link = f"https://subscene.com{sub.find('a').get('href')}" + sdata.append({"title": title, "link": link}) + SUB_TITLE_DICT[msg.id] = [split_arr(sdata, 10), kueri] + try: + index = int(CurrentPage - 1) + PageLen = len(SUB_TITLE_DICT[msg.id][0]) + extractbtn = [] + subResult = f"#Subscene Results For: {kueri}\n\n" + for c, i in enumerate(SUB_TITLE_DICT[msg.id][0][index], start=1): + sfResult += f"{c}. {i['judul']}\n\n" + extractbtn.append(InlineButton(c, f"sublist#{CurrentPage}#{c}#{user}#{msg.id}")) + subResult = "".join(i for i in subResult if i not in "[]") + return subResult, PageLen, extractbtn + except (IndexError, KeyError): + await editPesan(msg, "Sorry could not find any matching results!") + return None, 0, None + +# Get list all subtitles from title +async def getListSub(msg, kueri, CurrentPage, user): + if not SUB_DL_DICT.get(msg.id): + sdata = [] + scraper = cloudscraper.create_scraper() + param = {"query": kueri} + r = scraper.post("https://subscene.com/subtitles/searchbytitle", data=param).text + soup = BeautifulSoup(r,"lxml") + lists = soup.find("div", {"class": "search-result"}) + entry = lists.find_all("div", {"class":"title"}) + for sub in entry: + title = sub.find('a').text + link = f"https://subscene.com{sub.find('a').get('href')}" + sdata.append({"title": title, "link": link}) + SUB_DL_DICT[msg.id] = [split_arr(sdata, 10), kueri] + try: + index = int(CurrentPage - 1) + PageLen = len(SUB_DL_DICT[msg.id][0]) + extractbtn = [] + subResult = f"#Subscene Results For: {kueri}\n\n" + for c, i in enumerate(SUB_DL_DICT[msg.id][0][index], start=1): + subResult += f"{c}. {i['judul']}\n\n" + extractbtn.append(InlineButton(c, f"sublist#{CurrentPage}#{c}#{user}#{msg.id}")) + subResult = "".join(i for i in subResult if i not in "[]") + return subResult, PageLen, extractbtn + except (IndexError, KeyError): + await editPesan(msg, "Sorry could not find any matching results!") + return None, 0, None + +# Subscene CMD +@app.on_message(filters.command(["subscene"], COMMAND_HANDLER)) +@ratelimiter +async def subsceneCMD(client, message): + kueri = " ".join(message.command[1:]) + if not kueri: + return await kirimPesan(message, f"â„šī¸ Please add query after CMD!\nEx: /{message.command[0]} Jurassic World") + pesan = await kirimPesan(message, "âŗ Please wait, getting data from subscene..", quote=True) + CurrentPage = 1 + subres, PageLen, btn = await getTitleSub(pesan, kueri, CurrentPage, message.from_user.id) + if not subres: + return + keyboard = InlineKeyboard() + keyboard.paginate(PageLen, CurrentPage, "subscenepage#{number}" + f"#{pesan.id}#{message.from_user.id}") + keyboard.row(InlineButton("👇 Extract Data ", "Hmmm")) + keyboard.row(*btn) + keyboard.row(InlineButton("❌ Close", f"close#{message.from_user.id}")) + await editPesan(pesan, subres, disable_web_page_preview=True, reply_markup=keyboard) + +# Callback list title +@app.on_callback_query(filters.create(lambda _, __, query: "subscenepage#" in query.data)) +@ratelimiter +async def savefilmpage_callback(client, callback_query): + if callback_query.from_user.id != int(callback_query.data.split("#")[3]): + return await callback_query.answer("Not yours..", True) + message_id = int(callback_query.data.split("#")[2]) + CurrentPage = int(callback_query.data.split("#")[1]) + try: + kueri = SUB_TITLE_DICT[message_id][1] + except KeyError: + await callback_query.answer("Invalid callback data, please send CMD again..") + await asyncio.sleep(3) + return await callback_query.delete() + + try: + subres, PageLen, btn = await getTitleSub(callback_query.message, kueri, CurrentPage, callback_query.from_user.id) + except TypeError: + return + + keyboard = InlineKeyboard() + keyboard.paginate(PageLen, CurrentPage, "subscenepage#{number}" + f"#{message_id}#{callback_query.from_user.id}") + keyboard.row(InlineButton("👇 Get Subtitle List", "Hmmm")) + keyboard.row(*btn) + keyboard.row(InlineButton("❌ Close", f"close#{callback_query.from_user.id}")) + await editPesan(callback_query.message, subres, disable_web_page_preview=True, reply_markup=keyboard)