2021-06-04 10:01:54 +12:00
|
|
|
import json
|
|
|
|
import logging
|
2021-06-04 09:23:55 +12:00
|
|
|
import webbrowser
|
|
|
|
|
2021-06-09 23:08:25 +12:00
|
|
|
from PyQt5.QtCore import QLocale, QUrl, QJsonDocument, QJsonParseError, Qt
|
2021-06-04 09:23:55 +12:00
|
|
|
from PyQt5.QtGui import QPixmap
|
2021-06-04 10:01:54 +12:00
|
|
|
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
|
2021-06-04 09:23:55 +12:00
|
|
|
from PyQt5.QtWidgets import QWidget
|
|
|
|
|
2021-06-09 23:08:25 +12:00
|
|
|
from rare.components.tabs.shop.shop_models import ShopGame
|
2021-06-04 09:23:55 +12:00
|
|
|
from rare.ui.components.tabs.store.shop_game_info import Ui_shop_info
|
2021-06-09 23:08:25 +12:00
|
|
|
|
|
|
|
logger = logging.getLogger("ShopInfo")
|
2021-06-04 09:23:55 +12:00
|
|
|
|
|
|
|
|
|
|
|
class ShopGameInfo(QWidget, Ui_shop_info):
|
2021-06-09 23:08:25 +12:00
|
|
|
game: ShopGame
|
2021-06-09 10:00:00 +12:00
|
|
|
data: dict
|
2021-06-04 09:23:55 +12:00
|
|
|
|
2021-06-09 23:08:25 +12:00
|
|
|
# TODO Design; More information(requirements, more images); bundles (eg EA triple)
|
2021-06-04 09:23:55 +12:00
|
|
|
def __init__(self):
|
|
|
|
super(ShopGameInfo, self).__init__()
|
|
|
|
self.setupUi(self)
|
2021-06-05 04:16:27 +12:00
|
|
|
self.open_store_button.clicked.connect(self.button_clicked)
|
2021-06-04 09:23:55 +12:00
|
|
|
self.manager = QNetworkAccessManager()
|
|
|
|
|
2021-06-09 10:00:00 +12:00
|
|
|
def update_game(self, data: dict):
|
|
|
|
slug = data["productSlug"]
|
|
|
|
if "/home" in slug:
|
|
|
|
slug = slug.replace("/home", "")
|
|
|
|
self.slug = slug
|
|
|
|
self.title.setText(data["title"])
|
2021-06-09 23:08:25 +12:00
|
|
|
|
2021-06-05 04:16:27 +12:00
|
|
|
self.dev.setText(self.tr("Loading"))
|
|
|
|
self.image.setPixmap(QPixmap())
|
2021-06-09 10:00:00 +12:00
|
|
|
self.data = data
|
2021-06-09 23:25:57 +12:00
|
|
|
is_bundle = False
|
|
|
|
for i in data["categories"]:
|
|
|
|
if "bundles" in i.get("path", ""):
|
|
|
|
is_bundle = True
|
2021-06-09 10:00:00 +12:00
|
|
|
|
|
|
|
# init API request
|
2021-06-04 10:01:54 +12:00
|
|
|
locale = QLocale.system().name().split("_")[0]
|
2021-06-09 23:25:57 +12:00
|
|
|
url = f"https://store-content.ak.epicgames.com/api/{locale}/content/{'products' if not is_bundle else 'bundles'}/{slug}"
|
2021-06-04 10:01:54 +12:00
|
|
|
# game = api_utils.get_product(slug, locale)
|
|
|
|
self.request = self.manager.get(QNetworkRequest(QUrl(url)))
|
2021-06-05 04:16:27 +12:00
|
|
|
self.request.finished.connect(self.data_received)
|
2021-06-04 10:01:54 +12:00
|
|
|
|
|
|
|
def data_received(self):
|
2021-06-09 10:00:00 +12:00
|
|
|
logging.info(f"Data of game {self.data['title']} received")
|
2021-06-04 10:01:54 +12:00
|
|
|
if self.request:
|
|
|
|
if self.request.error() == QNetworkReply.NoError:
|
2021-06-05 04:16:27 +12:00
|
|
|
error = QJsonParseError()
|
|
|
|
json_data = QJsonDocument.fromJson(self.request.readAll().data(), error)
|
|
|
|
|
|
|
|
if error.error == error.NoError:
|
|
|
|
game = json.loads(json_data.toJson().data().decode())
|
|
|
|
else:
|
|
|
|
logging.info(self.slug, error.errorString())
|
2021-06-04 10:01:54 +12:00
|
|
|
return
|
|
|
|
else:
|
2021-06-09 23:25:57 +12:00
|
|
|
logger.error("Data failed")
|
2021-06-04 10:01:54 +12:00
|
|
|
return
|
|
|
|
else:
|
|
|
|
return
|
2021-06-09 23:08:25 +12:00
|
|
|
self.game = ShopGame.from_json(game, self.data)
|
2021-06-05 04:16:27 +12:00
|
|
|
# print(game)
|
|
|
|
self.title.setText(self.game.title)
|
2021-06-09 23:08:25 +12:00
|
|
|
|
|
|
|
self.price.setText(self.game.price)
|
|
|
|
self.discount_price.setText(self.game.discount_price)
|
|
|
|
|
|
|
|
self.image_request = self.manager.get(QNetworkRequest(QUrl(self.game.image_urls.offer_image_tall)))
|
|
|
|
self.image_request.finished.connect(self.image_loaded)
|
|
|
|
|
2021-06-05 04:16:27 +12:00
|
|
|
try:
|
|
|
|
self.dev.setText(",".join(self.game.developer))
|
|
|
|
except KeyError:
|
|
|
|
pass
|
2021-06-09 10:00:00 +12:00
|
|
|
|
|
|
|
# self.price.setText(self.game.price)
|
|
|
|
|
2021-06-05 04:16:27 +12:00
|
|
|
self.request.deleteLater()
|
2021-06-04 09:23:55 +12:00
|
|
|
|
2021-06-09 23:08:25 +12:00
|
|
|
def image_loaded(self):
|
|
|
|
if self.image_request and self.image_request.error() == QNetworkReply.NoError:
|
|
|
|
data = self.image_request.readAll().data()
|
|
|
|
pixmap = QPixmap()
|
|
|
|
pixmap.loadFromData(data)
|
|
|
|
self.image.setPixmap(pixmap.scaled(240, 320, transformMode=Qt.SmoothTransformation))
|
|
|
|
else:
|
|
|
|
logger.error("Load image failed")
|
|
|
|
|
2021-06-04 09:23:55 +12:00
|
|
|
def button_clicked(self):
|
|
|
|
webbrowser.open("https://www.epicgames.com/store/de/p/" + self.slug)
|
2021-06-09 23:25:57 +12:00
|
|
|
|