import requests from constants import CONST_NintendoEShopURL, CONST_DefaultFilter, CONST_DefaultSort, CONST_DefaultHeaders, CONST_DlcFilter from Game import Game from DatabaseHelper import updateGameDatas from LoggerHelper import getLogger from Scraper import get_game_details logger = getLogger() def searchForGames(gamesQuery, mediaType="GAME"): stringMessage = "Searching for the query " + gamesQuery logger.info(stringMessage) storeResponse = getAllResultsFromStore(gamesQuery, mediaType) gamesList = getGamesListFromStoreResponse(storeResponse, mediaType) return gamesList def searchForGamesByScraper(gamesQuery, mediaType="GAME"): stringMessage = "Will try to scrape : " + gamesQuery logger.info(stringMessage) gameInformations = get_game_details(gamesQuery) price_regular = float(gameInformations['original_price'].replace(',','.')) price_discounted = float(gameInformations['price'].replace(',','.')) newGame = Game(gameInformations['fsId'],gamesQuery,gameInformations['discount_end_date'], gameInformations['image_url'], price_discounted, gameInformations['is_discounted'], gameInformations['discount_percentage'], gameInformations['image_url'], "publisher", gameInformations['gameTitle'], gameInformations['offdeviceNsuID'], gameInformations['description'], price_regular, mediaType) return newGame def getAllResultsFromStore(gameQuery, mediaType="GAME"): startIndex = 0 target = 100 gamesProcessed = 0 allGamesList = [] while gamesProcessed < target: storeResponse = queryNintendoStore(gameQuery, startIndex, mediaType) results = storeResponse["response"] recordsFound = results["numFound"] gamesList = results["docs"] target = recordsFound currentNumberOfGames = len(gamesList) gamesProcessed += currentNumberOfGames startIndex += currentNumberOfGames allGamesList += gamesList logMessage = "Processing " + str(gamesProcessed) + " games out of " + str(recordsFound) + "..." logger.info(logMessage) return allGamesList def queryNintendoStore(query, start, mediaType="GAME"): url = CONST_NintendoEShopURL() filter = CONST_DefaultFilter() if(mediaType == "GAME"): filter = CONST_DefaultFilter() elif(mediaType == "DLC"): filter = CONST_DlcFilter() sort = CONST_DefaultSort() querystring = {"fq":filter,"q":query,"sort":sort,"start":start} headers = CONST_DefaultHeaders() logMessage = "Fetching Store API, filter : " + filter + " - Page : " + str(start) logger.debug(logMessage) response = requests.post(url, headers=headers, params=querystring, verify=False) jsonReponse = response.json() return jsonReponse def getGamesListFromStoreResponse(storeResponse, mediaType="GAME"): gamesList = storeResponse gameObjectsList = [] for element in gamesList: #print(element) if(mediaType == "GAME"): if(element["price_has_discount_b"] is False): discounted_price = element["price_regular_f"] else: discounted_price = element["price_discounted_f"] if("image_url" in element): image_url = element["image_url"] else: image_url = element["image_url_h2x1_s"] if("product_catalog_description_s" in element): catalog_description = element["product_catalog_description_s"] else: catalog_description = "" newGame = Game(element["fs_id"], element["url"], element["pretty_date_s"], image_url, discounted_price, element["price_has_discount_b"], element["price_discount_percentage_f"], image_url, element["publisher"], element["title"], element["nsuid_txt"], catalog_description, element["price_regular_f"], mediaType) #print(newGame) logger.debug(newGame) gameObjectsList.append(newGame) return gameObjectsList def registerGame(game): updateGameDatas(game)