4 Commits

Author SHA1 Message Date
093035864b gitignore pycache 2022-03-29 22:44:49 -04:00
64d356beac it works!!! 2022-03-29 19:47:40 -04:00
b20e037096 all example functions 2022-03-29 18:35:21 -04:00
57491f20a6 initial working base-bot 2022-03-29 18:23:46 -04:00
3 changed files with 245 additions and 1 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
.vscode .vscode
__pycache__

144
movie-bot/movie_check.py Normal file
View File

@@ -0,0 +1,144 @@
#!/usr/bin/python3
import requests
from datetime import datetime
import os
import argparse
tmdb_api_token = os.environ.get("TMDB_API_TOKEN")
sa_api_token = os.environ.get("SA_API_TOKEN")
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
}
# def get_args():
# parser = argparse.ArgumentParser(
# description='Search movie streaming availability.')
# parser.add_argument('--year', type=int, help='Specify movie release year')
# return parser.parse_args()
def tmdb_lookup(tmdb_url, tmdb_headers, movie):
tmdb_params = {
"language": "en-US",
"query": movie,
"page": 1,
"include_adult": False
}
# if args.year:
# tmdb_params["primary_release_year"] = args.year
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
def main():
#args = get_args()
#movie = input("Enter a movie: ")
movie_id, movie_title, movie_release, movie_rating = tmdb_lookup(
tmdb_url, tmdb_headers, movie, args)
print(f"\n{movie_title} ({movie_release})")
print(f"https://themoviedb.org/movie/{movie_id}")
print(f"Rating: {movie_rating}\n")
sa_response, services = sa_lookup(sa_url, sa_headers, movie_id)
if not services:
print("Streaming not available :(")
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"]
print(f"Available on {services_speller(s)}")
if leaving_epoch != 0:
print(f"Will be leaving on {leaving_date}")
print(f"Watch here: {link}\n")

99
movie-bot/moviebot.py Normal file
View File

@@ -0,0 +1,99 @@
#!/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")
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
}
bot_token = os.environ.get("TG_BOT_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):
# context.bot.send_message(chat_id=update.effective_chat.id, text="I'm a bot, please talk to me!")
# def echo(update: Update, context: CallbackContext):
# context.bot.send_message(chat_id=update.effective_chat.id, text=update.message.text)
def movie_lookup(movie):
logger.info('movie check started')
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}"
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 = ' '.join(context.args)
# # logger.info(movie)
# # movie_info = movie_lookup(movie)
# context.bot.send_message(chat_id=update.effective_chat.id, text=movie)
def echo(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.")
# start_handler = CommandHandler('start', start)
# dispatcher.add_handler(start_handler)
echo_handler = MessageHandler(Filters.text & (~Filters.command), echo)
dispatcher.add_handler(echo_handler)
# movie_handler = CommandHandler('input_movie', input_movie)
# dispatcher.add_handler(movie_handler)
unknown_handler = MessageHandler(Filters.command, unknown)
dispatcher.add_handler(unknown_handler)
updater.start_polling()