From 60f781841673ed80a24035d87b54d965395e9804 Mon Sep 17 00:00:00 2001 From: Ray Lyon Date: Sat, 2 Apr 2022 12:18:27 -0400 Subject: [PATCH] initial working script --- .gitignore | 2 + telegram-moviebot/movie_check.py | 84 +++++++++++++++++++++++ telegram-moviebot/telegram-moviebot.py | 92 ++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 .gitignore create mode 100644 telegram-moviebot/movie_check.py create mode 100644 telegram-moviebot/telegram-moviebot.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4edd750 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +__pycache__ \ No newline at end of file diff --git a/telegram-moviebot/movie_check.py b/telegram-moviebot/movie_check.py new file mode 100644 index 0000000..c77b8b4 --- /dev/null +++ b/telegram-moviebot/movie_check.py @@ -0,0 +1,84 @@ +#!/usr/bin/python3 + +import requests +from datetime import datetime + + + +def tmdb_lookup(tmdb_url, tmdb_headers, movie): + tmdb_params = { + "language": "en-US", + "query": movie, + "page": 1, + "include_adult": False + } + + tmdb_search = requests.get(f"{tmdb_url}/search/movie", params=tmdb_params, + headers=tmdb_headers).json() + + if not tmdb_search["results"]: + print("I'm having trouble finding that movie. " + + "Check your spelling and try again.") + exit() + + movie_id = tmdb_search['results'][0]['id'] + movie_title = tmdb_search['results'][0]['title'] + movie_release_check = tmdb_search['results'][0]['release_date'] + + if movie_release_check: + movie_release = datetime.strptime( + tmdb_search['results'][0]['release_date'], "%Y-%m-%d") + movie_year = movie_release.year + else: + movie_year = "???" + + movie_rating = tmdb_search['results'][0]['vote_average'] + + return movie_id, movie_title, movie_year, movie_rating + + +def sa_lookup(sa_url, sa_headers, movie_id): + sa_params = { + "country": "us", + "tmdb_id": f"movie/{movie_id}", + "output_language": "en" + } + + sa_request = requests.request("GET", sa_url, headers=sa_headers, + params=sa_params) + + if sa_request.status_code == 404: + print("I'm having trouble finding that movie on streaming. " + + "Check your spelling and try again.") + exit() + + sa_response = sa_request.json() + services = sa_response["streamingInfo"] + + return sa_response, services + + +def services_speller(service): + if service == "hbo": + service_proper = "HBO Max" + elif service == "hulu": + service_proper = "Hulu" + elif service == "prime": + service_proper = "Amazon Prime" + elif service == "netflix": + service_proper = "Netflix" + elif service == "disney": + service_proper = "Disney+" + elif service == "apple": + service_proper = "Apple TV+" + elif service == "paramount": + service_proper = "Paramount+" + elif service == "starz": + service_proper = "STARZ" + elif service == "showtime": + service_proper = "Showtime" + else: + return service + return service_proper + + diff --git a/telegram-moviebot/telegram-moviebot.py b/telegram-moviebot/telegram-moviebot.py new file mode 100644 index 0000000..44ef36b --- /dev/null +++ b/telegram-moviebot/telegram-moviebot.py @@ -0,0 +1,92 @@ +#!/usr/bin/python3 + +from telegram.ext import Updater, CommandHandler, CallbackContext, MessageHandler, Filters +import logging +from telegram import Update +import os +from datetime import datetime +import movie_check + +tmdb_api_token = os.environ.get("TMDB_API_TOKEN") +sa_api_token = os.environ.get("SA_API_TOKEN") +bot_token = os.environ.get("TG_BOT_TOKEN") + +filter_user = "" + +tmdb_url = "https://api.themoviedb.org/3" +tmdb_headers = { + 'Authorization': f'Bearer {tmdb_api_token}', + 'Content-Type': 'application/json;charset=utf-8', + 'Accept': 'application/json;charset=utf-8' +} + +sa_url = "https://streaming-availability.p.rapidapi.com/get/basic" +sa_headers = { + 'x-rapidapi-host': "streaming-availability.p.rapidapi.com", + 'x-rapidapi-key': sa_api_token + } + +updater = Updater(token=bot_token, use_context=True) +dispatcher = updater.dispatcher + +logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + level=logging.INFO) + +logger = logging.getLogger(__name__) + + +def start(update: Update, context: CallbackContext): + movie_handler = MessageHandler(Filters.text & (~Filters.command), input_movie) + dispatcher.add_handler(movie_handler) + context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a movie streaming bot! Type in a movie and tell you where to stream it.") + + +def movie_lookup(movie): + logger.info(f'Looking up movie: "{movie}"') + movie_id, movie_title, movie_year, movie_rating = movie_check.tmdb_lookup(tmdb_url, tmdb_headers, movie) + sa_response, services = movie_check.sa_lookup(sa_url, sa_headers, movie_id) + tg_reply = f"{movie_title} ({movie_year})\nhttps://themoviedb.org/movie/{movie_id}\nRating: {movie_rating}" + logger.info(f'Returning movie: "{movie_title}: ({movie_year})"') + + if not services: + tg_reply = tg_reply + "\n\nStreaming not available :(" + else: + for s in services: + leaving_epoch = sa_response["streamingInfo"][s]["us"]["leaving"] + leaving_date = datetime.fromtimestamp( + int(leaving_epoch)).strftime('%Y-%m-%d') + link = sa_response["streamingInfo"][s]["us"]["link"] + + s_pretty = movie_check.services_speller(s) + tg_reply = tg_reply + f"\n\nAvailable on {s_pretty}" + + if leaving_epoch != 0: + tg_reply = tg_reply + f"Will be leaving on {leaving_date}" + + tg_reply = tg_reply + f"\nWatch here: {link}" + return tg_reply + + +def input_movie(update: Update, context: CallbackContext): + movie = update.message.text + movie_info = movie_lookup(movie) + context.bot.send_message(chat_id=update.effective_chat.id, text=movie_info) + + +def unknown(update: Update, context: CallbackContext): + context.bot.send_message(chat_id=update.effective_chat.id, text="Sorry, I didn't understand that command.") + + +def main(): + + start_handler = CommandHandler('start', start, Filters.user(username=filter_user)) + dispatcher.add_handler(start_handler) + + unknown_handler = MessageHandler(Filters.command, unknown) + dispatcher.add_handler(unknown_handler) + + updater.start_polling() + + +if __name__ == '__main__': + main()