Show images on shop game widget; move shop models to shop_models.py
This commit is contained in:
parent
89afebd9fd
commit
44b7a0a37f
|
@ -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)
|
||||
|
|
75
rare/components/tabs/shop/shop_models.py
Normal file
75
rare/components/tabs/shop/shop_models.py
Normal 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
|
|
@ -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"))
|
||||
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue