Files

296 lines
10 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Ultroid - UserBot
# Copyright (C) 2021-2024 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# <https://www.github.com/TeamUltroid/Ultroid/blob/main/LICENSE/>.
import hashlib
import json
import re
import requests
from bs4 import BeautifulSoup
from telethon import Button
try:
from PIL import Image
except ImportError:
Image = None
from telethon.tl.types import InputWebDocument as wb
from . import LOGS, callback, in_pattern, udB, async_searcher, asst
__doc__ = f"""
✘ Commands Available -
• `@{asst.username} imdb <movie_name>`
Searches for the movie on IMDb and returns the results.
• `@{asst.username} imdb <movie_name> y=<year>`
Searches for the movie on IMDb by year and returns the results.
"""
# Define your OMDB API key
OMDB_API_KEY = udB.get_key("OMDb_API") #OpenMovies Database get free key from http://www.omdbapi.com/ with 1000 dailiy uses
imdbp = "https://graph.org/file/3b45a9ed4868167954300.jpg"
LIST = {}
hash_to_url = {}
def generate_unique_id(url):
hashed_id = hashlib.sha256(url.encode()).hexdigest()[:8]
hash_to_url[hashed_id] = url
return hashed_id
def get_original_url(hashed_id):
return hash_to_url.get(hashed_id)
async def get_movie_data(search_term, full_plot=False):
if "y=" in search_term:
parts = search_term.split("y=")
if parts:
LOGS.info(f"YEAR_prts: {parts}")
movie_name = parts[0].strip()
if movie_name:
year = parts[1].strip() if len(parts) > 1 else None
if year:
SBY = True
else:
SBY = False
else:
SBY = False
movie_name = search_term
else:
SBY = False
movie_name = search_term
else:
SBY = False
movie_name = search_term
url = f"http://www.omdbapi.com/?apikey={OMDB_API_KEY}&t={movie_name}"
if SBY is True:
url += f"&y={year}"
if full_plot is True:
url += "&plot=full"
data = await async_searcher(url, re_json=True)
if data.get("Response") == "True":
return data
else:
LOGS.info("Error: Unable to fetch movie data")
return None
def get_trailer(imdbID):
url = f"https://www.imdb.com/title/{imdbID}/"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.content, "html.parser")
script = soup.find("script", type="application/ld+json")
data = json.loads(script.string)
trailer_url = data.get("trailer", {}).get("embedUrl")
if trailer_url:
LOGS.info(f"Trailer URL: {trailer_url}")
return f"{trailer_url}"
else:
LOGS.info("Could not find trailer link")
return None
else:
LOGS.info("Error: Unable to fetch IMDb page")
return None
@in_pattern("imdb", owner=False)
async def inline_imdb_command(event):
try:
movie_name = event.text.split(" ", maxsplit=1)[1]
LOGS.info(f"QUERY\n{movie_name}")
except IndexError:
indexarticle = event.builder.article(
title="Sᴇᴀʀʜ Sᴍᴇᴛʜɪɴɢ",
thumb=wb(imdbp, 0, "image/jpeg", []),
text="**Iᴍᴅʙ Sᴇᴀʀʜ**\n\nʏ ᴅɪᴅɴ'ᴛ sᴇᴀʀʜ ᴀɴʏᴛʜɪɴɢ",
buttons=[
Button.switch_inline(
"Sᴇᴀʀʜ Aɢᴀɪɴ",
query="imdb ",
same_peer=True,
),
Button.switch_inline(
"Sᴇᴀʀʜ Bʏ Yᴇᴀʀ",
query="imdb IF y= 2024 ",
same_peer=True,
),
],
)
await event.answer([indexarticle])
return
try:
movie_data = await get_movie_data(movie_name)
if movie_data:
title = movie_data.get("Title", "")
year = movie_data.get("Year", "")
rated = movie_data.get("Rated", "")
released = movie_data.get("Released", "")
runtime = movie_data.get("Runtime", "")
ratings = movie_data.get("Ratings", "")
ratings_str = ", ".join(
[f"{rating['Source']}: `{rating['Value']}`" for rating in ratings]
)
genre = movie_data.get("Genre", "")
director = movie_data.get("Director", "")
actors = movie_data.get("Actors", "")
plot = movie_data.get("Plot", "")
language = movie_data.get("Language", "")
country = movie_data.get("Country", "")
awards = movie_data.get("Awards", "")
poster_url = movie_data.get("Poster", "")
imdbRating = movie_data.get("imdbRating", "")
imdbVotes = movie_data.get("imdbVotes", "")
BoxOffice = movie_data.get("BoxOffice", "")
imdbID = movie_data.get("imdbID", "")
movie_details = (
f"**Tɪᴛʟᴇ:** {title}\n"
f"**Yᴇᴀʀ:** `{year}`\n"
f"**Rᴀᴛᴇᴅ:** `{rated}`\n"
f"**Rᴇʟᴇᴀsᴇᴅ:** {released}\n"
f"**Rɴᴛɪᴍᴇ:** `{runtime}`\n"
f"**Gᴇɴʀᴇ:** {genre}\n"
f"**Dɪʀᴇʀ:** {director}\n"
f"**Aʀs:** {actors}\n"
f"**Pʟᴛ:** {plot}\n"
f"**Lᴀɴɢᴀɢᴇ:** `{language}`\n"
f"**Cɴᴛʀʏ:** {country}\n"
f"**Aᴀʀᴅs:** {awards}\n"
f"**Rᴀᴛɪɴɢs:** {ratings_str}\n"
f"**IMDʙ Rᴀᴛɪɴɢ:** `{imdbRating}`\n"
f"**IMDʙ Lɪɴᴋ:** https://www.imdb.com/title/{imdbID}\n"
f"**ɪᴍᴅʙVᴛᴇs:** `{imdbVotes}`\n"
f"**BxOғғɪᴇ:** `{BoxOffice}`"
)
except Exception as er:
LOGS.info(f"Exception: {er}")
try:
plot_id = generate_unique_id(movie_details)
except UnboundLocalError:
if " y= " in movie_name:
noresult = movie_name.replace(" y= ", " ")
elif "y= " in movie_name:
noresult = movie_name.replace("y= ", "")
elif "y=" in movie_name:
noresult = movie_name.replace("y=", "")
else:
noresult = movie_name
return await event.answer(
[
await event.builder.article(
title="N ʀᴇsʟᴛs ғᴏᴜɴᴅ",
text=f"**IMDʙ**\nʏ ᴀɴᴏᴛʜᴇʀ sᴇᴀʀʜ",
thumb=wb(imdbp, 0, "image/jpeg", []),
buttons=[
Button.switch_inline(
"Sᴇᴀʀʜ Aɢᴀɪɴ",
query="imdb ",
same_peer=True,
),
Button.switch_inline(
"Sᴇᴀʀʜ Bʏ Yᴇᴀʀ",
query=f"imdb {movie_name} y= ",
same_peer=True,
),
],
)
],
switch_pm=f"{noresult}",
switch_pm_param="start",
)
except Exception as er:
LOGS.info(f"Exception: {er}")
return
txt = f"**Tɪᴛʟᴇ:** {title}\n**Rᴇʟᴇᴀsᴇᴅ:** {released}\n**Cɴᴛʀʏ:** {country}"
button = [
[Button.inline("Fʟʟ Dᴇᴛᴀɪʟs", data=f"plot_button:{plot_id}")],
[Button.switch_inline("Sᴇᴀʀʜ Aɢᴀɪɴ", query="imdb ", same_peer=True)],
]
article = await event.builder.article(
type="photo",
text=txt,
title=f"{title}",
include_media=True,
description=f"{released}\nɪᴍᴅʙ: {imdbRating}\nLᴀɴɢᴀɢᴇ: {language}",
link_preview=False,
thumb=wb(poster_url, 0, "image/jpeg", []),
content=wb(poster_url, 0, "image/jpeg", []),
buttons=button,
)
LIST.update(
{
plot_id: {
"text": txt,
"buttons": button,
"imdbID": imdbID,
"movie_name": movie_name,
"plot": plot,
}
}
)
await event.answer([article])
@callback(re.compile("plot_button:(.*)"), owner=False)
async def plot_button_clicked(event):
plot_id = event.data.decode().split(":", 1)[1]
details = get_original_url(plot_id)
plot = LIST[plot_id]["plot"]
imdbID = LIST[plot_id]["imdbID"]
trailer_url = get_trailer(imdbID)
btns = [
[Button.inline("Back", data=f"imdb_back_button:{plot_id}")],
]
if trailer_url:
btns.insert(0, [Button.url("Trailer", url=trailer_url)])
if plot.endswith("..."):
btns.insert(
0, [Button.inline("Extended Plot", data=f"extended_plot:{plot_id}")]
)
await event.edit(details, buttons=btns)
@callback(re.compile("imdb_back_button:(.*)"), owner=False)
async def back_button_clicked(event):
plot_id = event.data.decode().split(":", 1)[1]
if not LIST.get(plot_id):
return await event.answer("Query Expired! Search again 🔍")
text = LIST[plot_id]["text"]
buttons = LIST[plot_id]["buttons"]
await event.edit(text, buttons=buttons)
@callback(re.compile("extended_plot:(.*)"), owner=False)
async def extended_plot_button_clicked(event):
plot_id = event.data.decode().split(":", 1)[1]
if not LIST.get(plot_id):
return await event.answer("Query Expired! Search again 🔍")
movie_name = LIST[plot_id]["movie_name"]
ext_plot = await get_movie_data(movie_name, full_plot=True)
fullplot = ext_plot.get("Plot", "")
if fullplot:
extended_plot = f"**Exᴛᴇɴᴅᴇᴅ Pʟᴛ:** {fullplot}"
btns = [
[Button.inline("Back", data=f"imdb_back_button:{plot_id}")],
]
await event.edit(extended_plot, buttons=btns)