1
0
Fork 0
mirror of synced 2024-06-24 01:00:43 +12:00

Show images on shop game widget; move shop models to shop_models.py

This commit is contained in:
Dummerle 2021-06-09 13:08:25 +02:00
parent 89afebd9fd
commit 44b7a0a37f
5 changed files with 110 additions and 73 deletions

View file

@ -2,20 +2,22 @@ import json
import logging
import webbrowser
from PyQt5.QtCore import QLocale, QUrl, QJsonDocument, QJsonParseError
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
from rare.utils import models
logger = logging.getLogger("ShopInfo")
class ShopGameInfo(QWidget, Ui_shop_info):
game: models.ShopGame
game: ShopGame
data: dict
# TODO GANZ VIEL
# TODO Design; More information(requirements, more images); bundles (eg EA triple)
def __init__(self):
super(ShopGameInfo, self).__init__()
self.setupUi(self)
@ -28,7 +30,7 @@ class ShopGameInfo(QWidget, Ui_shop_info):
slug = slug.replace("/home", "")
self.slug = slug
self.title.setText(data["title"])
self.price.setText(data['price']['totalPrice']['fmtPrice']['originalPrice'])
self.dev.setText(self.tr("Loading"))
self.image.setPixmap(QPixmap())
self.data = data
@ -39,7 +41,6 @@ class ShopGameInfo(QWidget, Ui_shop_info):
# game = api_utils.get_product(slug, locale)
self.request = self.manager.get(QNetworkRequest(QUrl(url)))
self.request.finished.connect(self.data_received)
# self.request.finished.connect(self.request.deleteLater if self.request else None)
def data_received(self):
logging.info(f"Data of game {self.data['title']} received")
@ -57,16 +58,16 @@ class ShopGameInfo(QWidget, Ui_shop_info):
return
else:
return
self.game = models.ShopGame.from_json(game, self.data)
self.game = ShopGame.from_json(game, self.data)
# print(game)
self.title.setText(self.game.title)
"""
if not os.path.exists(path := os.path.expanduser(f"~/.cache/rare/cache/{self.game.title}.png")):
url = game["pages"][0]["_images_"][0]
open(os.path.expanduser(path), "wb").write(requests.get(url).content)
width = 360
self.image.setPixmap(QPixmap(path).scaled(width, int(width * 9 / 16), transformMode=Qt.SmoothTransformation))
"""
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:
@ -76,5 +77,14 @@ class ShopGameInfo(QWidget, Ui_shop_info):
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)

View file

@ -0,0 +1,75 @@
class _ImageUrlModel:
def __init__(self, front_tall: str = "", offer_image_tall: str = "",
thumbnail: str = "", front_wide: str = ""):
self.front_tall = front_tall
self.offer_image_tall = offer_image_tall
self.thumbnail = thumbnail
self.front_wide = front_wide
@classmethod
def from_json(cls, json_data: list):
tmp = cls()
for item in json_data:
if item["type"] == "Thumbnail":
tmp.thumbnail = item["url"]
elif item["type"] == "DieselStoreFrontTall":
tmp.front_tall = item["url"]
elif item["type"] == "DieselStoreFrontWide":
tmp.front_wide = item["url"]
elif item["type"] == "OfferImageTall":
tmp.offer_image_tall = item["url"]
return tmp
class ShopGame:
# TODO: Copyrights etc
def __init__(self, title: str = "", image_urls: _ImageUrlModel = None, social_links: dict = None,
langs: list = None, reqs: list = None, publisher: str = "", developer: str = "",
original_price: str = "", discount_price: str=""):
self.title = title
self.image_urls = image_urls
self.links = []
if social_links:
for item in social_links:
if item.startswith("link"):
self.links.append(tuple((item.replace("link", ""), social_links[item])))
else:
self.links = []
self.languages = langs
self.reqs = reqs # {"Betriebssystem":win7, processor:i9 9900k, ram...}; Note: name from language
self.publisher = publisher
self.developer = developer
self.price = original_price
self.discount_price = discount_price
@classmethod
def from_json(cls, api_data: dict, search_data: dict):
if isinstance(api_data, list):
for product in api_data:
if product["_title"] == "home":
api_data = product
break
tmp = cls()
tmp.title = api_data.get("productName", "undefined")
tmp.image_urls = _ImageUrlModel.from_json(search_data["keyImages"])
links = api_data["pages"][0]["data"]["socialLinks"]
tmp.links = []
for item in links:
if item.startswith("link"):
tmp.links.append(tuple((item.replace("link", ""), links[item])))
tmp.available_voice_langs = api_data["pages"][0]["data"]["requirements"]["languages"]
tmp.reqs = []
for i, system in enumerate(api_data["pages"][0]["data"]["requirements"]["systems"]):
tmp.reqs.append({"name": system["systemType"], "value": []})
for req in system["details"]:
tmp.reqs[i]["value"].append(tuple((req["minimum"], req["recommended"])))
tmp.publisher = api_data["pages"][0]["data"]["meta"].get("publisher", "undefined")
tmp.developer = api_data["pages"][0]["data"]["meta"].get("developer", "undefined")
tmp.price = search_data['price']['totalPrice']['fmtPrice']['originalPrice']
tmp.discount_price = search_data['price']['totalPrice']['fmtPrice']['discountPrice']
return tmp

View file

@ -39,6 +39,9 @@ class Ui_shop_info(object):
self.price.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
self.price.setObjectName("price")
self.verticalLayout_2.addWidget(self.price)
self.discount_price = QtWidgets.QLabel(shop_info)
self.discount_price.setObjectName("discount_price")
self.verticalLayout_2.addWidget(self.discount_price)
self.horizontalLayout.addLayout(self.verticalLayout_2)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
@ -60,6 +63,7 @@ class Ui_shop_info(object):
self.title.setText(_translate("shop_info", "Error"))
self.dev.setText(_translate("shop_info", "TextLabel"))
self.price.setText(_translate("shop_info", "TextLabel"))
self.discount_price.setText(_translate("shop_info", "TextLabel"))
self.open_store_button.setText(_translate("shop_info", "Buy Game in Epic Games Store"))

View file

@ -62,6 +62,13 @@
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="discount_price">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</item>
<item>

View file

@ -34,62 +34,3 @@ class InstallQueueItemModel:
def __bool__(self):
return (self.status_q is not None) and (self.download is not None) and (self.options is not None)
class ShopGame:
# TODO: Copyrights etc
def __init__(self, title: str = "", image_urls: dict = None, social_links: dict = None,
langs: list = None, reqs: list = None, publisher: str = "", developer: str = "",
price: str = ""):
self.title = title
self.image_urls = image_urls
self.links = []
if social_links:
for item in social_links:
if item.startswith("link"):
self.links.append(tuple((item.replace("link", ""), social_links[item])))
else:
self.links = []
self.languages = langs
self.reqs = reqs # {"Betriebssystem":win7, processor:i9 9900k, ram...}; Note: name from language
self.publisher = publisher
self.developer = developer
self.price = price
@classmethod
def from_json(cls, api_data: dict, search_data: dict):
print(api_data)
if isinstance(api_data, list):
for product in api_data:
if product["_title"] == "home":
api_data = product
print("home")
break
tmp = cls()
tmp.title = api_data.get("productName", "undefined")
"""tmp.img_urls = {
"DieselImage": data["pages"][0]["data"]["about"]["image"]["src"],
"banner": data["pages"][0]["data"]["hero"]["backgroundImageUrl"]
}"""
links = api_data["pages"][0]["data"]["socialLinks"]
tmp.links = []
for item in links:
if item.startswith("link"):
tmp.links.append(tuple((item.replace("link", ""), links[item])))
tmp.available_voice_langs = api_data["pages"][0]["data"]["requirements"]["languages"]
tmp.reqs = []
for i, system in enumerate(api_data["pages"][0]["data"]["requirements"]["systems"]):
tmp.reqs.append({"name": system["systemType"], "value": []})
for req in system["details"]:
tmp.reqs[i]["value"].append(tuple((req["minimum"], req["recommended"])))
tmp.publisher = api_data["pages"][0]["data"]["meta"].get("publisher", "undefined")
tmp.developer = api_data["pages"][0]["data"]["meta"].get("developer", "undefined")
tmp.price = {
"normal": search_data["price"]["totalPrice"]["originalPrice"]
}
if price := search_data["price"]["totalPrice"].get("discountPrice"):
tmp.price["discount"] = price
return tmp