1
0
Fork 0
mirror of synced 2024-06-28 11:11:15 +12:00
Rare/rare/components/tabs/shop/shop_info.py

91 lines
3.2 KiB
Python

import json
import logging
import webbrowser
from PyQt5.QtCore import QLocale, QUrl, QJsonDocument, QJsonParseError, Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtWidgets import QWidget
from rare.components.tabs.shop.shop_models import ShopGame
from rare.ui.components.tabs.store.shop_game_info import Ui_shop_info
logger = logging.getLogger("ShopInfo")
class ShopGameInfo(QWidget, Ui_shop_info):
game: ShopGame
data: dict
# TODO Design; More information(requirements, more images); bundles (eg EA triple)
def __init__(self):
super(ShopGameInfo, self).__init__()
self.setupUi(self)
self.open_store_button.clicked.connect(self.button_clicked)
self.manager = QNetworkAccessManager()
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"])
self.dev.setText(self.tr("Loading"))
self.image.setPixmap(QPixmap())
self.data = data
# init API request
locale = QLocale.system().name().split("_")[0]
url = f"https://store-content.ak.epicgames.com/api/{locale}/content/products/{slug}"
# game = api_utils.get_product(slug, locale)
self.request = self.manager.get(QNetworkRequest(QUrl(url)))
self.request.finished.connect(self.data_received)
def data_received(self):
logging.info(f"Data of game {self.data['title']} received")
if self.request:
if self.request.error() == QNetworkReply.NoError:
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())
return
else:
return
else:
return
self.game = ShopGame.from_json(game, self.data)
# print(game)
self.title.setText(self.game.title)
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)
try:
self.dev.setText(",".join(self.game.developer))
except KeyError:
pass
# self.price.setText(self.game.price)
self.request.deleteLater()
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")
def button_clicked(self):
webbrowser.open("https://www.epicgames.com/store/de/p/" + self.slug)