diff --git a/misskaty/helper/tools.py b/misskaty/helper/tools.py
index 385b664d..abb957a3 100644
--- a/misskaty/helper/tools.py
+++ b/misskaty/helper/tools.py
@@ -54,10 +54,9 @@ TOTAL PLUGINS: {len(ALL_MODULES)}
"""
-def get_random_string(length):
- # choose from all lowercase letter
- letters = string.ascii_lowercase
- return "".join(random.choice(letters) for _ in range(length))
+def get_random_string(length: int = 5):
+ text_str = "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(length))
+ return text_str.upper()
async def rentry(teks):
diff --git a/misskaty/plugins/imdb_search.py b/misskaty/plugins/imdb_search.py
new file mode 100644
index 00000000..5501ef55
--- /dev/null
+++ b/misskaty/plugins/imdb_search.py
@@ -0,0 +1,481 @@
+from logging import getLogger
+from pykeyboard import InlineKeyboard
+from pyrogram.types import (
+ InlineKeyboardMarkup,
+ InlineKeyboardButton,
+ CallbackQuery,
+ InputMediaPhoto,
+)
+from misskaty import app, BOT_USERNAME
+from misskaty.vars import COMMAND_HANDLER
+from misskaty.core.decorator.errors import capture_err
+from misskaty.helper.tools import rentry, get_random_string, GENRES_EMOJI
+
+LOGGER = getLogger(__name__)
+
+# IMDB Choose Language
+@app.on_message(filters.command(["imdb"], COMMAND_HANDLER))
+@capture_err
+async def imdb_choose(_, m):
+ if len(m.command) == 1:
+ return await m.reply(
+ f"âšī¸ Please add query after CMD!\nEx: /{m.command[0]} Jurassic World",
+ quote=True,
+ )
+ if m.sender_chat:
+ return await m.reply("This feature not supported for channel..")
+ buttons = InlineKeyboard(row_width=2)
+ ranval = ranword(4)
+ LIST_CARI[ranval] = m.text.split(None, 1)[1]
+ buttons.add(
+ InlineButton("đēđ¸ English", f"imdbcari_en#{ranval}#{m.from_user.id}"),
+ InlineButton("đŽđŠ Indonesia", f"imdcari_id#{ranval}#{m.from_user.id}"),
+ InlineButton("â Close", f"close#{m.from_user.id}"),
+ )
+ await m.reply_photo(
+ "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg",
+ caption=f"Hi {m.from_user.mention}, Please select the language you want to use on IMDB Search.\n\nSilakan pilih bahasa yang ingin Anda gunakan di Pencarian IMDB.",
+ reply_markup=buttons,
+ quote=True,
+ )
+
+
+@app.on_callback_query(filters.regex("^imdcari_id"))
+async def imdbcari_id(client, query: CallbackQuery):
+ BTN = []
+ i, msg, uid = query.data.split("#")
+ if query.from_user.id != int(uid):
+ return await query.answer(f"â ī¸ Akses Ditolak!", True)
+ kueri = LIST_CARI.get(msg)
+ del LIST_CARI[msg]
+ await query.m.edit_caption("đ Sedang mencari di Database IMDB..")
+ msg = ""
+ buttons = InlineKeyboardMod(row_width=4)
+ try:
+ r = await ambil_source(f"https://yasirapi.eu.org/imdb-search?q={kueri}")
+ res = json.loads(r).get("result")
+ if not res:
+ return await query.message.edit_caption(
+ f"âī¸ Tidak ditemukan hasil untuk kueri: {kueri}"
+ )
+ msg += f"đŦ Ditemukan ({len(res)}) hasil dari: {kueri} ~ {query.from_user.mention}\n\n"
+ for num, movie in enumerate(res, start=1):
+ title = movie.get("l")
+ year = f"({movie.get('y')})" if movie.get("y") else ""
+ type = movie.get("q").replace("feature", "movie").capitalize()
+ movieID = re.findall(r"tt(\d+)", movie.get("id"))[0]
+ msg += f"{num}. {title} {year} - {type}\n"
+ BTN.append(
+ InlineKeyboardButton(
+ text=num, callback_data=f"imdbres_id#{uid}#{movieID}"
+ )
+ )
+ BTN.append(InlineKeyboardButton(text="â Close", callback_data=f"close#{uid}"))
+ buttons.add(*BTN)
+ await query.message.edit_caption(msg, reply_markup=buttons)
+ except Exception as err:
+ await query.message.edit_caption(
+ f"Ooppss, gagal mendapatkan daftar judul di IMDb.\n\nERROR: {err}"
+ )
+
+
+@app.on_callback_query(filters.regex("^imdbcari_en"))
+async def imdbcari_en(client, query: CallbackQuery):
+ BTN = []
+ i, msg, uid = query.data.split("#")
+ if query.from_user.id != int(uid):
+ return await query.answer(f"â ī¸ Access Denied!", True)
+ kueri = LIST_CARI.get(msg)
+ del LIST_CARI[msg]
+ await query.message.edit_caption("đ Looking in the IMDB Database..")
+ msg = ""
+ buttons = InlineKeyboardMod(row_width=4)
+ try:
+ r = await ambil_source(f"https://yasirapi.eu.org/imdb-search?q={kueri}")
+ res = json.loads(r).get("result")
+ if not res:
+ return await query.message.edit_caption(
+ f"âī¸ Result not found for keywords: {kueri}"
+ )
+ msg += f"đŦ Found ({len(res)}) result for keywords: {kueri} ~ {query.from_user.mention}\n\n"
+ for num, movie in enumerate(res, start=1):
+ title = movie.get("l")
+ year = f"({movie.get('y')})" if movie.get("y") else ""
+ type = movie.get("q").replace("feature", "movie").capitalize()
+ movieID = re.findall(r"tt(\d+)", movie.get("id"))[0]
+ msg += f"{num}. {title} {year} - {type}\n"
+ BTN.append(
+ InlineKeyboardButton(
+ text=num, callback_data=f"imdbres_en#{query.from_user.id}#{movieID}"
+ )
+ )
+ BTN.append(
+ InlineKeyboardButton(
+ text="â Close", callback_data=f"close#{query.from_user.id}"
+ )
+ )
+ buttons.add(*BTN)
+ await query.message.edit_caption(msg, reply_markup=buttons)
+ except Exception as err:
+ await query.message.edit_caption(
+ f"Failed when requesting movies title @ IMDb\n\nERROR: {err}"
+ )
+
+
+@app.on_callback_query(filters.regex("^imdbres_id"))
+async def imdb_id_callback(bot: Client, query: CallbackQuery):
+ i, userid, movie = query.data.split("#")
+ if query.from_user.id != int(userid):
+ return await query.answer("â ī¸ Akses Ditolak!", True)
+ try:
+ await query.message.edit_caption("âŗ Permintaan kamu sedang diproses.. ")
+ url = f"https://www.imdb.com/title/tt{movie}/"
+ resp = await get_content(url)
+ sop = BeautifulSoup(resp, "lxml")
+ r_json = json.loads(
+ sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
+ )
+ res_str = ""
+ type = f"{r_json['@type']}" if r_json.get("@type") else ""
+ if r_json.get("name"):
+ try:
+ tahun = (
+ sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
+ .find(class_="sc-8c396aa2-2 itZqyK")
+ .text
+ )
+ except:
+ tahun = "-"
+ res_str += f"đš Judul: {r_json['name']} [{tahun}] ({type})\n"
+ if r_json.get("alternateName"):
+ res_str += f"đĸ AKA: {r_json.get('alternateName')}\n\n"
+ else:
+ res_str += "\n"
+ if sop.select('li[data-testid="title-techspec_runtime"]'):
+ durasi = (
+ sop.select('li[data-testid="title-techspec_runtime"]')[0]
+ .find(class_="ipc-metadata-list-item__content-container")
+ .text
+ )
+ res_str += f"Durasi: {GoogleTranslator('auto', 'id').translate(durasi)}\n"
+ if r_json.get("contentRating"):
+ res_str += f"Kategori: {r_json['contentRating']} \n"
+ if r_json.get("aggregateRating"):
+ res_str += f"Peringkat: {r_json['aggregateRating']['ratingValue']}âī¸ dari {r_json['aggregateRating']['ratingCount']} pengguna \n"
+ if sop.select('li[data-testid="title-details-releasedate"]'):
+ rilis = (
+ sop.select('li[data-testid="title-details-releasedate"]')[0]
+ .find(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )
+ .text
+ )
+ rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
+ 0
+ ].find(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )[
+ "href"
+ ]
+ res_str += (
+ f"Rilis: {rilis}\n"
+ )
+ if r_json.get("genre"):
+ genre = ""
+ for i in r_json["genre"]:
+ if i in GENRES_EMOJI:
+ genre += (
+ f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
+ )
+ else:
+ genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
+ genre = genre[:-2]
+ res_str += f"Genre: {genre}\n"
+ if sop.select('li[data-testid="title-details-origin"]'):
+ country = "".join(
+ f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
+ for country in sop.select('li[data-testid="title-details-origin"]')[
+ 0
+ ].findAll(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )
+ )
+ country = country[:-2]
+ res_str += f"Negara: {country}\n"
+ if sop.select('li[data-testid="title-details-languages"]'):
+ language = "".join(
+ f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
+ for lang in sop.select('li[data-testid="title-details-languages"]')[
+ 0
+ ].findAll(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )
+ )
+ language = language[:-2]
+ res_str += f"Bahasa: {language}\n"
+ res_str += "\nđ Info Cast:\n"
+ if r_json.get("director"):
+ director = ""
+ for i in r_json["director"]:
+ name = i["name"]
+ url = i["url"]
+ director += f"{name}, "
+ director = director[:-2]
+ res_str += f"Sutradara: {director}\n"
+ if r_json.get("creator"):
+ creator = ""
+ for i in r_json["creator"]:
+ if i["@type"] == "Person":
+ name = i["name"]
+ url = i["url"]
+ creator += f"{name}, "
+ creator = creator[:-2]
+ res_str += f"Penulis: {creator}\n"
+ if r_json.get("actor"):
+ actors = ""
+ for i in r_json["actor"]:
+ name = i["name"]
+ url = i["url"]
+ actors += f"{name}, "
+ actors = actors[:-2]
+ res_str += f"Pemeran: {actors}\n\n"
+ if r_json.get("description"):
+ summary = GoogleTranslator("auto", "id").translate(
+ r_json.get("description")
+ )
+ res_str += f"đ Plot: {summary}\n\n"
+ if r_json.get("keywords"):
+ keywords = r_json["keywords"].split(",")
+ key_ = ""
+ for i in keywords:
+ i = i.replace(" ", "_").replace("-", "_")
+ key_ += f"#{i}, "
+ key_ = key_[:-2]
+ res_str += f"đĨ Kata Kunci: {key_} \n"
+ if sop.select('li[data-testid="award_information"]'):
+ awards = (
+ sop.select('li[data-testid="award_information"]')[0]
+ .find(class_="ipc-metadata-list-item__list-content-item")
+ .text
+ )
+ res_str += f"đ Penghargaan: {GoogleTranslator('auto', 'id').translate(awards)}\n\n"
+ else:
+ res_str += "\n"
+ res_str += f"ÂŠī¸ IMDb by @{BOT_USERNAME}"
+ if r_json.get("trailer"):
+ trailer_url = r_json["trailer"]["url"]
+ markup = InlineKeyboardMarkup(
+ [
+ [
+ InlineKeyboardButton(
+ "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
+ ),
+ InlineKeyboardButton("âļī¸ Trailer", url=trailer_url),
+ ]
+ ]
+ )
+ else:
+ markup = InlineKeyboardMarkup(
+ [
+ [
+ InlineKeyboardButton(
+ "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
+ )
+ ]
+ ]
+ )
+ if thumb := r_json.get("image"):
+ try:
+ await query.message.edit_media(
+ InputMediaPhoto(thumb, caption=res_str), reply_markup=markup
+ )
+ except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty):
+ poster = thumb.replace(".jpg", "._V1_UX360.jpg")
+ await query.message.edit_media(
+ InputMediaPhoto(poster, caption=res_str), reply_markup=markup
+ )
+ except Exception:
+ await query.message.edit_caption(res_str, reply_markup=markup)
+ else:
+ await query.message.edit_caption(res_str, reply_markup=markup)
+ except MessageNotModified:
+ pass
+ except Exception:
+ exc = traceback.format_exc()
+ await query.message.edit_caption(f"ERROR:\n{exc}")
+
+
+@app.on_callback_query(filters.regex("^imdbres_en"))
+async def imdb_en_callback(bot: Client, query: CallbackQuery):
+ i, userid, movie = query.data.split("#")
+ if query.from_user.id != int(userid):
+ return await query.answer("â ī¸ Access Denied!", True)
+ await query.message.edit_caption("âŗ Getting IMDb source..")
+ try:
+ url = f"https://www.imdb.com/title/tt{movie}/"
+ resp = await get_content(url)
+ sop = BeautifulSoup(resp, "lxml")
+ r_json = json.loads(
+ sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
+ )
+ res_str = ""
+ type = f"{r_json['@type']}" if r_json.get("@type") else ""
+ if r_json.get("name"):
+ try:
+ tahun = (
+ sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
+ .find(class_="sc-8c396aa2-2 itZqyK")
+ .text
+ )
+ except:
+ tahun = "-"
+ res_str += f"đš Title: {r_json['name']} [{tahun}] ({type})\n"
+ if r_json.get("alternateName"):
+ res_str += f"đĸ AKA: {r_json.get('alternateName')}\n\n"
+ else:
+ res_str += "\n"
+ if sop.select('li[data-testid="title-techspec_runtime"]'):
+ durasi = (
+ sop.select('li[data-testid="title-techspec_runtime"]')[0]
+ .find(class_="ipc-metadata-list-item__content-container")
+ .text
+ )
+ res_str += f"Duration: {durasi}\n"
+ if r_json.get("contentRating"):
+ res_str += f"Category: {r_json['contentRating']} \n"
+ if r_json.get("aggregateRating"):
+ res_str += f"Rating: {r_json['aggregateRating']['ratingValue']}âī¸ from {r_json['aggregateRating']['ratingCount']} user \n"
+ if sop.select('li[data-testid="title-details-releasedate"]'):
+ rilis = (
+ sop.select('li[data-testid="title-details-releasedate"]')[0]
+ .find(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )
+ .text
+ )
+ rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
+ 0
+ ].find(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )[
+ "href"
+ ]
+ res_str += f"Release Data: {rilis}\n"
+ if r_json.get("genre"):
+ genre = ""
+ for i in r_json["genre"]:
+ if i in GENRES_EMOJI:
+ genre += (
+ f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
+ )
+ else:
+ genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
+ genre = genre[:-2]
+ res_str += f"Genre: {genre}\n"
+ if sop.select('li[data-testid="title-details-origin"]'):
+ country = "".join(
+ f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
+ for country in sop.select('li[data-testid="title-details-origin"]')[
+ 0
+ ].findAll(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )
+ )
+ country = country[:-2]
+ res_str += f"Country: {country}\n"
+ if sop.select('li[data-testid="title-details-languages"]'):
+ language = "".join(
+ f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
+ for lang in sop.select('li[data-testid="title-details-languages"]')[
+ 0
+ ].findAll(
+ class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
+ )
+ )
+ language = language[:-2]
+ res_str += f"Language: {language}\n"
+ res_str += "\nđ Cast Info:\n"
+ if r_json.get("director"):
+ director = ""
+ for i in r_json["director"]:
+ name = i["name"]
+ url = i["url"]
+ director += f"{name}, "
+ director = director[:-2]
+ res_str += f"Director: {director}\n"
+ if r_json.get("creator"):
+ creator = ""
+ for i in r_json["creator"]:
+ if i["@type"] == "Person":
+ name = i["name"]
+ url = i["url"]
+ creator += f"{name}, "
+ creator = creator[:-2]
+ res_str += f"Penulis: {creator}\n"
+ if r_json.get("actor"):
+ actors = ""
+ for i in r_json["actor"]:
+ name = i["name"]
+ url = i["url"]
+ actors += f"{name}, "
+ actors = actors[:-2]
+ res_str += f"Stars: {actors}\n\n"
+ if r_json.get("description"):
+ res_str += f"đ Summary: {r_json['description'].replace(' ', ' ')}\n\n"
+ if r_json.get("keywords"):
+ keywords = r_json["keywords"].split(",")
+ key_ = ""
+ for i in keywords:
+ i = i.replace(" ", "_").replace("-", "_")
+ key_ += f"#{i}, "
+ key_ = key_[:-2]
+ res_str += f"đĨ Keywords: {key_} \n"
+ if sop.select('li[data-testid="award_information"]'):
+ awards = (
+ sop.select('li[data-testid="award_information"]')[0]
+ .find(class_="ipc-metadata-list-item__list-content-item")
+ .text
+ )
+ res_str += f"đ Awards: {awards}\n\n"
+ else:
+ res_str += "\n"
+ res_str += f"ÂŠī¸ IMDb by @{BOT_USERNAME}"
+ if r_json.get("trailer"):
+ trailer_url = r_json["trailer"]["url"]
+ markup = InlineKeyboardMarkup(
+ [
+ [
+ InlineKeyboardButton(
+ "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
+ ),
+ InlineKeyboardButton("âļī¸ Trailer", url=trailer_url),
+ ]
+ ]
+ )
+ else:
+ markup = InlineKeyboardMarkup(
+ [
+ [
+ InlineKeyboardButton(
+ "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
+ )
+ ]
+ ]
+ )
+ if thumb := r_json.get("image"):
+ try:
+ await query.message.edit_media(
+ InputMediaPhoto(thumb, caption=res_str), reply_markup=markup
+ )
+ except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty):
+ poster = thumb.replace(".jpg", "._V1_UX360.jpg")
+ await query.message.edit_media(
+ InputMediaPhoto(poster, caption=res_str), reply_markup=markup
+ )
+ except Exception:
+ await query.message.edit_caption(res_str, reply_markup=markup)
+ else:
+ await query.message.edit_caption(res_str, reply_markup=markup)
+ except Exception:
+ exc = traceback.format_exc()
+ await query.message.edit_caption(f"ERROR:\n{exc}")
diff --git a/misskaty/plugins/misc_tools.py b/misskaty/plugins/misc_tools.py
index 06d7161e..ec5caf6a 100644
--- a/misskaty/plugins/misc_tools.py
+++ b/misskaty/plugins/misc_tools.py
@@ -33,9 +33,8 @@ from pyrogram.types import (
CallbackQuery,
InputMediaPhoto,
)
-from misskaty import app
from misskaty.core.decorator.errors import capture_err
-from misskaty.helper.tools import rentry, GENRES_EMOJI
+from misskaty.helper.tools import rentry, get_random_string, GENRES_EMOJI
from misskaty.vars import COMMAND_HANDLER
from misskaty.helper.http import http
from misskaty import app, BOT_USERNAME
@@ -48,10 +47,10 @@ __HELP__ = """
/google [query] - Search using Google Search.
(/tr, /trans, /translate) [lang code] - Translate text using Google Translate.
/tts - Convert Text to Voice.
-/imdb [query] - Find Movie Details From IMDB.com in Indonesian Language.
-/imdb_en [query] - Find Movie Details From IMDB.com in English Language.
+/imdb [query] - Find Movie Details From IMDB.com (Available in English and Indonesia version).
"""
+LIST_CARI = {}
def remove_html_tags(text):
"""Remove html tags from a string"""
@@ -461,485 +460,4 @@ async def mdl_callback(bot: Client, query: CallbackQuery):
except Exception as e:
await query.message.edit_text(f"ERROR:\n{e}")
else:
- await query.answer("Tombol ini bukan untukmu", show_alert=True)
-
-
-# IMDB Versi Indonesia v1
-@app.on_message(filters.command(["imdb"], COMMAND_HANDLER))
-@capture_err
-async def imdb1_search(client, message):
- BTN = []
- if message.sender_chat:
- return await message.reply(
- "Mohon maaf fitur tidak tersedia untuk akun channel, harap ganti ke akun biasa.."
- )
- if len(message.command) == 1:
- return await message.reply(
- "Berikan aku nama series atau movie yang ingin dicari. đ¤ˇđģââī¸", quote=True
- )
- r, judul = message.text.split(None, 1)
- k = await message.reply_photo(
- "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg",
- caption="đ Sedang mencari di Database IMDB..",
- quote=True,
- )
- msg = ""
- buttons = InlineKeyboard(row_width=4)
- try:
- r = await get_content(f"https://yasirapi.eu.org/imdb-search?q={judul}")
- res = json.loads(r).get("result")
- if not res:
- return await k.edit_caption("Tidak ada hasil ditemukan.. đ")
- msg += f"Ditemukan {len(res)} query dari {judul} ~ {message.from_user.mention}\n\n"
- for count, movie in enumerate(res, start=1):
- title = movie.get("l")
- year = f"({movie.get('y')})" if movie.get("y") else ""
- type = movie.get("q").replace("feature", "movie").capitalize()
- movieID = re.findall(r"tt(\d+)", movie.get("id"))[0]
- msg += f"{count}. {title} {year} ~ {type}\n"
- BTN.append(
- InlineKeyboardButton(
- text=count, callback_data=f"imdbid#{message.from_user.id}#{movieID}"
- )
- )
- BTN.append(
- InlineKeyboardButton(
- text="â Close", callback_data=f"close#{message.from_user.id}"
- )
- )
- buttons.add(*BTN)
- await k.edit_caption(msg, reply_markup=buttons)
- except Exception as err:
- await k.edit_caption(
- f"Ooppss, gagal mendapatkan daftar judul di IMDb.\n\nERROR: {err}"
- )
-
-
-@app.on_callback_query(filters.regex("^imdbid"))
-async def imdbcb_backup(bot: Client, query: CallbackQuery):
- # ValueError: not enough values to unpack (expected 3, got 2)
- # Idk how to reproduce it, so wait people report to me
- try:
- i, userid, movie = query.data.split("#")
- except:
- LOGGER.error(
- f"ERROR IMDB Callback: {query.data} - {query.from_user.first_name} [{query.from_user.id}]"
- )
- return await query.answer(
- "â ī¸ Invalid callback query, silahkan laporkan ke pemilik bot atau buka issue baru di repository MissKaty dengan alasan yang jelas.",
- True,
- )
- if query.from_user.id != int(userid):
- return await query.answer("â ī¸ Akses Ditolak!", True)
- try:
- await query.message.edit_caption("âŗ Permintaan kamu sedang diproses.. ")
- url = f"https://www.imdb.com/title/tt{movie}/"
- resp = await get_content(url)
- sop = BeautifulSoup(resp, "lxml")
- r_json = json.loads(
- sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
- )
- res_str = ""
- type = f"{r_json['@type']}" if r_json.get("@type") else ""
- if r_json.get("name"):
- try:
- tahun = (
- sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
- .find(class_="sc-8c396aa2-2 itZqyK")
- .text
- )
- except:
- tahun = "-"
- res_str += f"đš Judul: {r_json['name']} [{tahun}] ({type})\n"
- if r_json.get("alternateName"):
- res_str += f"đĸ AKA: {r_json.get('alternateName')}\n\n"
- else:
- res_str += "\n"
- if sop.select('li[data-testid="title-techspec_runtime"]'):
- durasi = (
- sop.select('li[data-testid="title-techspec_runtime"]')[0]
- .find(class_="ipc-metadata-list-item__content-container")
- .text
- )
- res_str += f"Durasi: {GoogleTranslator('auto', 'id').translate(durasi)}\n"
- if r_json.get("contentRating"):
- res_str += f"Kategori: {r_json['contentRating']} \n"
- if r_json.get("aggregateRating"):
- res_str += f"Peringkat: {r_json['aggregateRating']['ratingValue']}âī¸ dari {r_json['aggregateRating']['ratingCount']} pengguna \n"
- if sop.select('li[data-testid="title-details-releasedate"]'):
- rilis = (
- sop.select('li[data-testid="title-details-releasedate"]')[0]
- .find(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )
- .text
- )
- rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
- 0
- ].find(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )[
- "href"
- ]
- res_str += (
- f"Rilis: {rilis}\n"
- )
- if r_json.get("genre"):
- genre = ""
- for i in r_json["genre"]:
- if i in GENRES_EMOJI:
- genre += (
- f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
- )
- else:
- genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
- genre = genre[:-2]
- res_str += f"Genre: {genre}\n"
- if sop.select('li[data-testid="title-details-origin"]'):
- country = "".join(
- f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
- for country in sop.select('li[data-testid="title-details-origin"]')[
- 0
- ].findAll(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )
- )
- country = country[:-2]
- res_str += f"Negara: {country}\n"
- if sop.select('li[data-testid="title-details-languages"]'):
- language = "".join(
- f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
- for lang in sop.select('li[data-testid="title-details-languages"]')[
- 0
- ].findAll(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )
- )
- language = language[:-2]
- res_str += f"Bahasa: {language}\n"
- res_str += "\nđ Info Cast:\n"
- if r_json.get("director"):
- director = ""
- for i in r_json["director"]:
- name = i["name"]
- url = i["url"]
- director += f"{name}, "
- director = director[:-2]
- res_str += f"Sutradara: {director}\n"
- if r_json.get("creator"):
- creator = ""
- for i in r_json["creator"]:
- if i["@type"] == "Person":
- name = i["name"]
- url = i["url"]
- creator += f"{name}, "
- creator = creator[:-2]
- res_str += f"Penulis: {creator}\n"
- if r_json.get("actor"):
- actors = ""
- for i in r_json["actor"]:
- name = i["name"]
- url = i["url"]
- actors += f"{name}, "
- actors = actors[:-2]
- res_str += f"Pemeran: {actors}\n\n"
- if r_json.get("description"):
- summary = GoogleTranslator("auto", "id").translate(
- r_json.get("description")
- )
- res_str += f"đ Plot: {summary}\n\n"
- if r_json.get("keywords"):
- keywords = r_json["keywords"].split(",")
- key_ = ""
- for i in keywords:
- i = i.replace(" ", "_").replace("-", "_")
- key_ += f"#{i}, "
- key_ = key_[:-2]
- res_str += f"đĨ Kata Kunci: {key_} \n"
- if sop.select('li[data-testid="award_information"]'):
- awards = (
- sop.select('li[data-testid="award_information"]')[0]
- .find(class_="ipc-metadata-list-item__list-content-item")
- .text
- )
- res_str += f"đ Penghargaan: {GoogleTranslator('auto', 'id').translate(awards)}\n\n"
- else:
- res_str += "\n"
- res_str += f"ÂŠī¸ IMDb by @{BOT_USERNAME}"
- if r_json.get("trailer"):
- trailer_url = r_json["trailer"]["url"]
- markup = InlineKeyboardMarkup(
- [
- [
- InlineKeyboardButton(
- "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
- ),
- InlineKeyboardButton("âļī¸ Trailer", url=trailer_url),
- ]
- ]
- )
- else:
- markup = InlineKeyboardMarkup(
- [
- [
- InlineKeyboardButton(
- "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
- )
- ]
- ]
- )
- if thumb := r_json.get("image"):
- try:
- await query.message.edit_media(
- InputMediaPhoto(thumb, caption=res_str), reply_markup=markup
- )
- except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty):
- poster = thumb.replace(".jpg", "._V1_UX360.jpg")
- await query.message.edit_media(
- InputMediaPhoto(poster, caption=res_str), reply_markup=markup
- )
- except Exception:
- await query.message.edit_caption(res_str, reply_markup=markup)
- else:
- await query.message.edit_caption(res_str, reply_markup=markup)
- except MessageNotModified:
- pass
- except Exception:
- exc = traceback.format_exc()
- await query.message.edit_caption(f"ERROR:\n{exc}")
-
-
-# IMDB Versi English
-@app.on_message(filters.command(["imdb_en"], COMMAND_HANDLER))
-@capture_err
-async def imdb_en_search(client, message):
- BTN = []
- if message.sender_chat:
- return await message.reply("This feature not available for channel.")
- if len(message.command) == 1:
- return await message.reply(
- "Give movie name or series. Ex: /imdb_en soul. đ¤ˇđģââī¸",
- quote=True,
- )
- r, title = message.text.split(None, 1)
- k = await message.reply_photo(
- "https://telegra.ph/file/270955ef0d1a8a16831a9.jpg",
- caption="Searching Movie/Series in IMDB Database.. đ´",
- quote=True,
- )
- msg = ""
- buttons = InlineKeyboard(row_width=4)
- try:
- r = await get_content(f"https://yasirapi.eu.org/imdb-search?q={title}")
- res = json.loads(r).get("result")
- if not res:
- return await k.edit_caption("Sad, No Result.. đ")
- msg = f"Found {len(res)} result from {title} ~ {message.from_user.mention}\n\n"
- for count, movie in enumerate(res, start=1):
- titles = movie.get("l")
- year = f"({movie.get('y')})" if movie.get("y") else ""
- type = movie.get("qid").replace("feature", "movie").capitalize()
- movieID = re.findall(r"tt(\d+)", movie.get("id"))[0]
- msg += f"{count}. {titles} {year} ~ {type}\n"
- BTN.append(
- InlineKeyboardButton(
- text=count, callback_data=f"imdben#{message.from_user.id}#{movieID}"
- )
- )
- BTN.append(
- InlineKeyboardButton(
- text="â Close", callback_data=f"close#{message.from_user.id}"
- )
- )
- buttons.add(*BTN)
- await k.edit_caption(msg, reply_markup=buttons)
- except Exception as err:
- await k.edit_caption(
- f"Ooppss, failed get movie list from IMDb.\n\nERROR: {err}"
- )
-
-
-@app.on_callback_query(filters.regex("^imdben"))
-@capture_err
-async def imdb_en_callback(bot: Client, query: CallbackQuery):
- try:
- i, userid, movie = query.data.split("#")
- except:
- LOGGER.error(
- f"ERROR IMDB Callback: {query.data} - {query.from_user.first_name} [{query.from_user.id}]"
- )
- return await query.answer(
- "â ī¸ Invalid callback query, please report to bot owner or open issue in MissKaty repository with relevant details.",
- True,
- )
- if query.from_user.id != int(userid):
- return await query.answer("â ī¸ Access Denied!", True)
- await query.message.edit_caption("âŗ Processing your request..")
- try:
- url = f"https://www.imdb.com/title/tt{movie}/"
- resp = await get_content(url)
- sop = BeautifulSoup(resp, "lxml")
- r_json = json.loads(
- sop.find("script", attrs={"type": "application/ld+json"}).contents[0]
- )
- res_str = ""
- type = f"{r_json['@type']}" if r_json.get("@type") else ""
- if r_json.get("name"):
- try:
- tahun = (
- sop.select('ul[data-testid="hero-title-block__metadata"]')[0]
- .find(class_="sc-8c396aa2-2 itZqyK")
- .text
- )
- except:
- tahun = "-"
- res_str += f"đš Title: {r_json['name']} [{tahun}] ({type})\n"
- if r_json.get("alternateName"):
- res_str += f"đĸ AKA: {r_json.get('alternateName')}\n\n"
- else:
- res_str += "\n"
- if sop.select('li[data-testid="title-techspec_runtime"]'):
- durasi = (
- sop.select('li[data-testid="title-techspec_runtime"]')[0]
- .find(class_="ipc-metadata-list-item__content-container")
- .text
- )
- res_str += f"Duration: {durasi}\n"
- if r_json.get("contentRating"):
- res_str += f"Category: {r_json['contentRating']} \n"
- if r_json.get("aggregateRating"):
- res_str += f"Rating: {r_json['aggregateRating']['ratingValue']}âī¸ from {r_json['aggregateRating']['ratingCount']} user \n"
- if sop.select('li[data-testid="title-details-releasedate"]'):
- rilis = (
- sop.select('li[data-testid="title-details-releasedate"]')[0]
- .find(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )
- .text
- )
- rilis_url = sop.select('li[data-testid="title-details-releasedate"]')[
- 0
- ].find(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )[
- "href"
- ]
- res_str += f"Release Data: {rilis}\n"
- if r_json.get("genre"):
- genre = ""
- for i in r_json["genre"]:
- if i in GENRES_EMOJI:
- genre += (
- f"{GENRES_EMOJI[i]} #{i.replace('-', '_').replace(' ', '_')}, "
- )
- else:
- genre += f"#{i.replace('-', '_').replace(' ', '_')}, "
- genre = genre[:-2]
- res_str += f"Genre: {genre}\n"
- if sop.select('li[data-testid="title-details-origin"]'):
- country = "".join(
- f"{demoji(country.text)} #{country.text.replace(' ', '_').replace('-', '_')}, "
- for country in sop.select('li[data-testid="title-details-origin"]')[
- 0
- ].findAll(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )
- )
- country = country[:-2]
- res_str += f"Country: {country}\n"
- if sop.select('li[data-testid="title-details-languages"]'):
- language = "".join(
- f"#{lang.text.replace(' ', '_').replace('-', '_')}, "
- for lang in sop.select('li[data-testid="title-details-languages"]')[
- 0
- ].findAll(
- class_="ipc-metadata-list-item__list-content-item ipc-metadata-list-item__list-content-item--link"
- )
- )
- language = language[:-2]
- res_str += f"Language: {language}\n"
- res_str += "\nđ Cast Info:\n"
- if r_json.get("director"):
- director = ""
- for i in r_json["director"]:
- name = i["name"]
- url = i["url"]
- director += f"{name}, "
- director = director[:-2]
- res_str += f"Director: {director}\n"
- if r_json.get("creator"):
- creator = ""
- for i in r_json["creator"]:
- if i["@type"] == "Person":
- name = i["name"]
- url = i["url"]
- creator += f"{name}, "
- creator = creator[:-2]
- res_str += f"Penulis: {creator}\n"
- if r_json.get("actor"):
- actors = ""
- for i in r_json["actor"]:
- name = i["name"]
- url = i["url"]
- actors += f"{name}, "
- actors = actors[:-2]
- res_str += f"Stars: {actors}\n\n"
- if r_json.get("description"):
- res_str += f"đ Summary: {r_json['description'].replace(' ', ' ')}\n\n"
- if r_json.get("keywords"):
- keywords = r_json["keywords"].split(",")
- key_ = ""
- for i in keywords:
- i = i.replace(" ", "_").replace("-", "_")
- key_ += f"#{i}, "
- key_ = key_[:-2]
- res_str += f"đĨ Keywords: {key_} \n"
- if sop.select('li[data-testid="award_information"]'):
- awards = (
- sop.select('li[data-testid="award_information"]')[0]
- .find(class_="ipc-metadata-list-item__list-content-item")
- .text
- )
- res_str += f"đ Awards: {awards}\n\n"
- else:
- res_str += "\n"
- res_str += f"ÂŠī¸ IMDb by @{BOT_USERNAME}"
- if r_json.get("trailer"):
- trailer_url = r_json["trailer"]["url"]
- markup = InlineKeyboardMarkup(
- [
- [
- InlineKeyboardButton(
- "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
- ),
- InlineKeyboardButton("âļī¸ Trailer", url=trailer_url),
- ]
- ]
- )
- else:
- markup = InlineKeyboardMarkup(
- [
- [
- InlineKeyboardButton(
- "đŦ Open IMDB", url=f"https://www.imdb.com{r_json['url']}"
- )
- ]
- ]
- )
- if thumb := r_json.get("image"):
- try:
- await query.message.edit_media(
- InputMediaPhoto(thumb, caption=res_str), reply_markup=markup
- )
- except (MediaEmpty, PhotoInvalidDimensions, WebpageMediaEmpty):
- poster = thumb.replace(".jpg", "._V1_UX360.jpg")
- await query.message.edit_media(
- InputMediaPhoto(poster, caption=res_str), reply_markup=markup
- )
- except Exception:
- await query.message.edit_caption(res_str, reply_markup=markup)
- else:
- await query.message.edit_caption(res_str, reply_markup=markup)
- except Exception:
- exc = traceback.format_exc()
- await query.message.edit_caption(f"ERROR:\n{exc}")
+ await query.answer("Tombol ini bukan untukmu", show_alert=True)
\ No newline at end of file