Show images on shop game widget; move shop models to shop_models.py
This commit is contained in:
parent
89afebd9fd
commit
44b7a0a37f
5 changed files with 110 additions and 73 deletions
|
@ -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)
|
||||||
|
|
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.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"))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in a new issue