Scraper-for-theTVDB.com/search.py
2018-07-17 09:13:16 -04:00

102 lines
3.9 KiB
Python

import os.path
import json
import datetime
import dateutil
import requests
import urllib.parse
from actions import clearFolders
from actions import clearScreen
from actions import downloadImages
from actions import refreshToken
from actions import searchImages
from checks import checkTimestamp
from checks import checkStatus
def search():
try:
with open("login.json") as json_data: # TODO add a check for a login that is damaged/modified
login = json.load(json_data)
json_data.close()
if login["TIMESTAMP"] == "":
print("There was an error checking your login. Try logging in again with 'Login/Change login'.")
return None
else:
saveTime = dateutil.parser.parse(login["TIMESTAMP"])
curTime = datetime.datetime.now().replace(tzinfo=None) # TODO use UTC time?
if checkTimestamp(saveTime, curTime) == False:
refreshToken()
except Exception as ex:
print(ex)
print("There was an error checking your login. Try logging in again with 'Login/Change login'.")
return None
# All login checks pass and search starts
FAN_KEY_TYPE = "?keyType=fanart" # These are used in the search strings
POS_KEY_TYPE = "?keyType=poster"
BAN_KEY_TYPE = "?keyType=series"
authHeaders = {
"Content-Type": "application/json",
"Accept": "application/json",
"Authorization": "Bearer " + login["TOKEN"]
}
keyword = input("Enter series to search: ") # Getting the search name and fixing
sKeyword = urllib.parse.quote(keyword) # the url parse mistakes
sKeyword = sKeyword.replace("%21", "!") # TODO find a better way of doing this
sKeyword = sKeyword.replace("%2A", "*")
sKeyword = sKeyword.replace("%28", "(")
sKeyword = sKeyword.replace("%29", ")")
sKeyword = sKeyword.replace("%27", "'")
sKeyword = sKeyword.replace("/", "%2F")
sKeyword = sKeyword.replace("%7E", "~")
searchUrl = "https://api.thetvdb.com/search/series?name={}".format(sKeyword)
response = requests.get(searchUrl, headers=authHeaders)
if (checkStatus(response, True) == False):
return None
searchResults = json.loads(response.content)
title = -1
print()
clearScreen()
while title < 0 or title > len(searchResults["data"]) - 1: # Looping until the user chooses
print("Results:") # a series from the printed list
count = 1 # or they input '0' to cancel
for result in searchResults["data"]:
print("\n{})\nSeries Name: {}".format(str(count), str(result["seriesName"])))
print()
desc = result["overview"]
desc = str(desc).replace("\r\n\r\n", " ") # Removing format characters
print("Description: \n{}".format(desc))
print()
count = count + 1
print()
title = int(input("Choose one by number or '0' to exit: ")) - 1 # Subtracting 1 so that the
print() # index can start from 0
if title < -1 or title > len(searchResults["data"]) - 1:
print("Error: Choose the number of an item listed. Or '0' to exit.")
if (title == -1): # If the user inputs 0
return None
print()
idNum = searchResults["data"][title]["id"] # Setting up the request urls
fanart = searchImages(idNum, FAN_KEY_TYPE, authHeaders) # for banners, fanart, and posters
poster = searchImages(idNum, POS_KEY_TYPE, authHeaders)
banner = searchImages(idNum, BAN_KEY_TYPE, authHeaders)
clearFolders()
downloadImages("fanart", fanart, idNum) # TODO find a better way to pass these variables. Constructor?
downloadImages("poster", poster, idNum)
downloadImages("banner", banner, idNum)
print("\nAll downloads finished!\n")
return None