1
0
Fork 0
mirror of synced 2024-07-01 04:30:20 +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 logging
import webbrowser 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.QtGui import QPixmap
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtWidgets import QWidget 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.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): class ShopGameInfo(QWidget, Ui_shop_info):
game: models.ShopGame game: ShopGame
data: dict data: dict
# TODO GANZ VIEL # TODO Design; More information(requirements, more images); bundles (eg EA triple)
def __init__(self): def __init__(self):
super(ShopGameInfo, self).__init__() super(ShopGameInfo, self).__init__()
self.setupUi(self) self.setupUi(self)
@ -28,7 +30,7 @@ class ShopGameInfo(QWidget, Ui_shop_info):
slug = slug.replace("/home", "") slug = slug.replace("/home", "")
self.slug = slug self.slug = slug
self.title.setText(data["title"]) self.title.setText(data["title"])
self.price.setText(data['price']['totalPrice']['fmtPrice']['originalPrice'])
self.dev.setText(self.tr("Loading")) self.dev.setText(self.tr("Loading"))
self.image.setPixmap(QPixmap()) self.image.setPixmap(QPixmap())
self.data = data self.data = data
@ -39,7 +41,6 @@ class ShopGameInfo(QWidget, Ui_shop_info):
# game = api_utils.get_product(slug, locale) # game = api_utils.get_product(slug, locale)
self.request = self.manager.get(QNetworkRequest(QUrl(url))) self.request = self.manager.get(QNetworkRequest(QUrl(url)))
self.request.finished.connect(self.data_received) self.request.finished.connect(self.data_received)
# self.request.finished.connect(self.request.deleteLater if self.request else None)
def data_received(self): def data_received(self):
logging.info(f"Data of game {self.data['title']} received") logging.info(f"Data of game {self.data['title']} received")
@ -57,16 +58,16 @@ class ShopGameInfo(QWidget, Ui_shop_info):
return return
else: else:
return return
self.game = models.ShopGame.from_json(game, self.data) self.game = ShopGame.from_json(game, self.data)
# print(game) # print(game)
self.title.setText(self.game.title) self.title.setText(self.game.title)
"""
if not os.path.exists(path := os.path.expanduser(f"~/.cache/rare/cache/{self.game.title}.png")): self.price.setText(self.game.price)
url = game["pages"][0]["_images_"][0] self.discount_price.setText(self.game.discount_price)
open(os.path.expanduser(path), "wb").write(requests.get(url).content)
width = 360 self.image_request = self.manager.get(QNetworkRequest(QUrl(self.game.image_urls.offer_image_tall)))
self.image.setPixmap(QPixmap(path).scaled(width, int(width * 9 / 16), transformMode=Qt.SmoothTransformation)) self.image_request.finished.connect(self.image_loaded)
"""
try: try:
self.dev.setText(",".join(self.game.developer)) self.dev.setText(",".join(self.game.developer))
except KeyError: except KeyError:
@ -76,5 +77,14 @@ class ShopGameInfo(QWidget, Ui_shop_info):
self.request.deleteLater() 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): def button_clicked(self):
webbrowser.open("https://www.epicgames.com/store/de/p/" + self.slug) 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.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
self.price.setObjectName("price") self.price.setObjectName("price")
self.verticalLayout_2.addWidget(self.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) self.horizontalLayout.addLayout(self.verticalLayout_2)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem) self.horizontalLayout.addItem(spacerItem)
@ -60,6 +63,7 @@ class Ui_shop_info(object):
self.title.setText(_translate("shop_info", "Error")) self.title.setText(_translate("shop_info", "Error"))
self.dev.setText(_translate("shop_info", "TextLabel")) self.dev.setText(_translate("shop_info", "TextLabel"))
self.price.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")) self.open_store_button.setText(_translate("shop_info", "Buy Game in Epic Games Store"))

View file

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

View file

@ -34,62 +34,3 @@ class InstallQueueItemModel:
def __bool__(self): def __bool__(self):
return (self.status_q is not None) and (self.download is not None) and (self.options is not None) 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