Better Code to browse games, use PIL images to save smaller
This commit is contained in:
parent
c0f4577870
commit
e7038be33a
|
@ -5,8 +5,9 @@ import random
|
||||||
|
|
||||||
from PyQt5.QtCore import QUrl, pyqtSignal, QJsonParseError, QJsonDocument
|
from PyQt5.QtCore import QUrl, pyqtSignal, QJsonParseError, QJsonDocument
|
||||||
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManager
|
from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManager
|
||||||
from PyQt5.QtWidgets import QWidget
|
from PyQt5.QtWidgets import QWidget, QCheckBox, QVBoxLayout, QLabel
|
||||||
|
|
||||||
|
from rare.components.tabs.shop.constants import game_query, Constants
|
||||||
from rare.components.tabs.shop.game_widgets import GameWidget
|
from rare.components.tabs.shop.game_widgets import GameWidget
|
||||||
from rare.ui.components.tabs.store.browse_games import Ui_browse_games
|
from rare.ui.components.tabs.store.browse_games import Ui_browse_games
|
||||||
from rare.utils.extra_widgets import FlowLayout, WaitingSpinner
|
from rare.utils.extra_widgets import FlowLayout, WaitingSpinner
|
||||||
|
@ -18,9 +19,10 @@ logger = logging.getLogger("BrowseGames")
|
||||||
class BrowseGames(QWidget, Ui_browse_games):
|
class BrowseGames(QWidget, Ui_browse_games):
|
||||||
show_game = pyqtSignal(dict)
|
show_game = pyqtSignal(dict)
|
||||||
price = ""
|
price = ""
|
||||||
platform = (False, False)
|
tags = []
|
||||||
|
types = []
|
||||||
request_active = False
|
request_active = False
|
||||||
next_request = ()
|
next_request = False
|
||||||
|
|
||||||
def __init__(self, path):
|
def __init__(self, path):
|
||||||
super(BrowseGames, self).__init__()
|
super(BrowseGames, self).__init__()
|
||||||
|
@ -44,20 +46,41 @@ class BrowseGames(QWidget, Ui_browse_games):
|
||||||
self.above.toggled.connect(lambda: self.prepare_request("<price>[1499,]") if self.above.isChecked() else None)
|
self.above.toggled.connect(lambda: self.prepare_request("<price>[1499,]") if self.above.isChecked() else None)
|
||||||
self.on_discount.toggled.connect(lambda: self.prepare_request("sale") if self.on_discount.isChecked() else None)
|
self.on_discount.toggled.connect(lambda: self.prepare_request("sale") if self.on_discount.isChecked() else None)
|
||||||
|
|
||||||
self.win_cb.toggled.connect(
|
constants = Constants()
|
||||||
lambda: self.prepare_request(platform=(self.win_cb.isChecked(), self.mac_cb.isChecked())))
|
|
||||||
self.mac_cb.toggled.connect(
|
|
||||||
lambda: self.prepare_request(platform=(self.win_cb.isChecked(), self.mac_cb.isChecked())))
|
|
||||||
|
|
||||||
def prepare_request(self, price: str = None, platform: tuple = None):
|
for groupbox, variables in [(self.genre_gb, constants.categories),
|
||||||
|
(self.platform_gb, constants.platforms),
|
||||||
|
(self.others_gb, constants.others)]:
|
||||||
|
|
||||||
|
for text, tag in variables:
|
||||||
|
checkbox = CheckBox(text, tag)
|
||||||
|
checkbox.activated.connect(lambda x: self.prepare_request(added_tag=x))
|
||||||
|
checkbox.deactivated.connect(lambda x: self.prepare_request(removed_tag=x))
|
||||||
|
groupbox.layout().addWidget(checkbox)
|
||||||
|
|
||||||
|
for text, tag in constants.types:
|
||||||
|
checkbox = CheckBox(text, tag)
|
||||||
|
checkbox.activated.connect(lambda x: self.prepare_request(added_type=x))
|
||||||
|
checkbox.deactivated.connect(lambda x: self.prepare_request(removed_type=x))
|
||||||
|
self.type_gb.layout().addWidget(checkbox)
|
||||||
|
|
||||||
|
def prepare_request(self, price: str = None, added_tag: int = 0, removed_tag: int = 0,
|
||||||
|
added_type: str = "", removed_type: str = ""):
|
||||||
|
|
||||||
if price is not None:
|
if price is not None:
|
||||||
self.price = price
|
self.price = price
|
||||||
if platform is not None:
|
if added_tag != 0:
|
||||||
self.platform = platform
|
self.tags.append(added_tag)
|
||||||
|
if removed_tag != 0 and removed_tag in self.tags:
|
||||||
|
self.tags.remove(removed_tag)
|
||||||
|
|
||||||
|
if added_type:
|
||||||
|
self.types.append(added_type)
|
||||||
|
if removed_type and removed_type in self.types:
|
||||||
|
self.types.remove(removed_type)
|
||||||
|
|
||||||
if self.request_active:
|
if self.request_active:
|
||||||
self.next_request = (self.price, self.platform)
|
self.next_request = True
|
||||||
return
|
return
|
||||||
|
|
||||||
locale = get_lang()
|
locale = get_lang()
|
||||||
|
@ -78,12 +101,10 @@ class BrowseGames(QWidget, Ui_browse_games):
|
||||||
elif self.price == "sale":
|
elif self.price == "sale":
|
||||||
payload["variables"]["onSale"] = True
|
payload["variables"]["onSale"] = True
|
||||||
|
|
||||||
if self.platform[0]:
|
payload["variables"]["tag"] = "|".join(self.tags)
|
||||||
payload["variables"]["tag"] = "9547"
|
|
||||||
if self.platform[1]:
|
if self.types:
|
||||||
payload["variables"]["tag"] += "|10719"
|
payload["variables"]["category"] = "|".join(self.types)
|
||||||
elif self.platform[1]:
|
|
||||||
payload["variables"]["tag"] = "10719"
|
|
||||||
|
|
||||||
request = QNetworkRequest(QUrl("https://www.epicgames.com/graphql"))
|
request = QNetworkRequest(QUrl("https://www.epicgames.com/graphql"))
|
||||||
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
|
request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
|
||||||
|
@ -92,7 +113,6 @@ class BrowseGames(QWidget, Ui_browse_games):
|
||||||
self.game_request.finished.connect(self.show_games)
|
self.game_request.finished.connect(self.show_games)
|
||||||
|
|
||||||
def show_games(self):
|
def show_games(self):
|
||||||
|
|
||||||
if self.game_request:
|
if self.game_request:
|
||||||
if self.game_request.error() == QNetworkReply.NoError:
|
if self.game_request.error() == QNetworkReply.NoError:
|
||||||
error = QJsonParseError()
|
error = QJsonParseError()
|
||||||
|
@ -107,17 +127,23 @@ class BrowseGames(QWidget, Ui_browse_games):
|
||||||
self.stack.setCurrentIndex(1)
|
self.stack.setCurrentIndex(1)
|
||||||
else:
|
else:
|
||||||
QWidget().setLayout(self.games_widget.layout())
|
QWidget().setLayout(self.games_widget.layout())
|
||||||
self.games_widget.setLayout(FlowLayout())
|
if games:
|
||||||
|
self.games_widget.setLayout(FlowLayout())
|
||||||
|
|
||||||
for game in games:
|
for game in games:
|
||||||
w = GameWidget(self.path, game, 275)
|
w = GameWidget(self.path, game, 275)
|
||||||
self.games_widget.layout().addWidget(w)
|
self.games_widget.layout().addWidget(w)
|
||||||
w.show_info.connect(self.show_game.emit)
|
w.show_info.connect(self.show_game.emit)
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.games_widget.setLayout(QVBoxLayout())
|
||||||
|
self.games_widget.layout().addWidget(
|
||||||
|
QLabel(self.tr("Could not get games matching the filter")))
|
||||||
|
self.games_widget.layout().addStretch(1)
|
||||||
self.stack.setCurrentIndex(0)
|
self.stack.setCurrentIndex(0)
|
||||||
|
|
||||||
self.request_active = False
|
self.request_active = False
|
||||||
if self.next_request:
|
if self.next_request:
|
||||||
self.prepare_request(*self.next_request)
|
self.prepare_request()
|
||||||
self.next_request = ()
|
self.next_request = ()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -127,40 +153,24 @@ class BrowseGames(QWidget, Ui_browse_games):
|
||||||
else:
|
else:
|
||||||
logger.error(self.game_request.errorString())
|
logger.error(self.game_request.errorString())
|
||||||
if self.next_request:
|
if self.next_request:
|
||||||
self.prepare_request(*self.next_request)
|
self.prepare_request()
|
||||||
self.next_request = ()
|
self.next_request = False
|
||||||
else:
|
else:
|
||||||
self.stack.setCurrentIndex(1)
|
self.stack.setCurrentIndex(1)
|
||||||
|
|
||||||
|
|
||||||
game_query = "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, " \
|
class CheckBox(QCheckBox):
|
||||||
"$keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, " \
|
activated = pyqtSignal(str)
|
||||||
"$sortBy: String, $sortDir: String, $start: Int, $tag: String, $releaseDate: String, $withPrice: Boolean " \
|
deactivated = pyqtSignal(str)
|
||||||
"= false, $withPromotions: Boolean = false, $priceRange: String, $freeGame: Boolean, $onSale: Boolean, " \
|
|
||||||
"$effectiveDate: String) {\n Catalog {\n searchStore(\n allowCountries: $allowCountries\n " \
|
def __init__(self, text, tag):
|
||||||
"category: $category\n count: $count\n country: $country\n keywords: $keywords\n " \
|
super(CheckBox, self).__init__(text)
|
||||||
"locale: $locale\n namespace: $namespace\n itemNs: $itemNs\n sortBy: $sortBy\n " \
|
self.tag = tag
|
||||||
"sortDir: $sortDir\n releaseDate: $releaseDate\n start: $start\n tag: $tag\n " \
|
|
||||||
"priceRange: $priceRange\n freeGame: $freeGame\n onSale: $onSale\n effectiveDate: " \
|
self.toggled.connect(self.handle_toggle)
|
||||||
"$effectiveDate\n ) {\n elements {\n title\n id\n namespace\n " \
|
|
||||||
"description\n effectiveDate\n keyImages {\n type\n url\n }\n " \
|
def handle_toggle(self):
|
||||||
" currentPrice\n seller {\n id\n name\n }\n productSlug\n " \
|
if self.isChecked():
|
||||||
" urlSlug\n url\n tags {\n id\n }\n items {\n id\n " \
|
self.activated.emit(self.tag)
|
||||||
" namespace\n }\n customAttributes {\n key\n value\n }\n " \
|
else:
|
||||||
"categories {\n path\n }\n catalogNs @include(if: $withMapping) {\n " \
|
self.deactivated.emit(self.tag)
|
||||||
"mappings(pageType: \"productHome\") {\n pageSlug\n pageType\n }\n " \
|
|
||||||
"}\n offerMappings @include(if: $withMapping) {\n pageSlug\n pageType\n " \
|
|
||||||
"}\n price(country: $country) @include(if: $withPrice) {\n totalPrice {\n " \
|
|
||||||
"discountPrice\n originalPrice\n voucherDiscount\n discount\n " \
|
|
||||||
" currencyCode\n currencyInfo {\n decimals\n }\n fmtPrice(" \
|
|
||||||
"locale: $locale) {\n originalPrice\n discountPrice\n " \
|
|
||||||
"intermediatePrice\n }\n }\n lineOffers {\n appliedRules {\n " \
|
|
||||||
" id\n endDate\n discountSetting {\n discountType\n " \
|
|
||||||
" }\n }\n }\n }\n promotions(category: $category) @include(if: " \
|
|
||||||
"$withPromotions) {\n promotionalOffers {\n promotionalOffers {\n " \
|
|
||||||
"startDate\n endDate\n discountSetting {\n discountType\n " \
|
|
||||||
" discountPercentage\n }\n }\n }\n " \
|
|
||||||
"upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n " \
|
|
||||||
"endDate\n discountSetting {\n discountType\n " \
|
|
||||||
"discountPercentage\n }\n }\n }\n }\n }\n paging {\n " \
|
|
||||||
" count\n total\n }\n }\n }\n}\n "
|
|
||||||
|
|
74
rare/components/tabs/shop/constants.py
Normal file
74
rare/components/tabs/shop/constants.py
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
from PyQt5.QtCore import QObject
|
||||||
|
|
||||||
|
|
||||||
|
# Class to use QObject.tr()
|
||||||
|
class Constants(QObject):
|
||||||
|
def __init__(self):
|
||||||
|
super(Constants, self).__init__()
|
||||||
|
self.categories = sorted([
|
||||||
|
(self.tr("Action"), "1216"),
|
||||||
|
(self.tr("Adventure"), "1117"),
|
||||||
|
(self.tr("Puzzle"), "1298"),
|
||||||
|
(self.tr("Open world"), "1307"),
|
||||||
|
(self.tr("Racing"), "1212"),
|
||||||
|
(self.tr("RPG"), "1367"),
|
||||||
|
(self.tr("Shooter"), "1210"),
|
||||||
|
(self.tr("Strategy"), "1115"),
|
||||||
|
(self.tr("Survival"), "1080"),
|
||||||
|
(self.tr("First Person"), "1294"),
|
||||||
|
(self.tr("Indie"), "1263"),
|
||||||
|
(self.tr("Simulation"), "1393"),
|
||||||
|
(self.tr("Sport"), "1283")
|
||||||
|
], key=lambda x: x[0])
|
||||||
|
|
||||||
|
self.platforms = [
|
||||||
|
("MacOS", "9548"),
|
||||||
|
("Windows", "9547"),
|
||||||
|
]
|
||||||
|
self.others = [
|
||||||
|
(self.tr("Single player"), "1370"),
|
||||||
|
(self.tr("Multiplayer"), "1203"),
|
||||||
|
(self.tr("Controller"), "9549"),
|
||||||
|
(self.tr("Co-op"), "1264"),
|
||||||
|
]
|
||||||
|
|
||||||
|
self.types = [
|
||||||
|
(self.tr("Editor"), "editors"),
|
||||||
|
(self.tr("Game"), "games/edition/base"),
|
||||||
|
(self.tr("Bundle"), "bundles/games"),
|
||||||
|
(self.tr("Add-on"), "addons"),
|
||||||
|
(self.tr("Apps"), "software/edition/base")
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
game_query = "query searchStoreQuery($allowCountries: String, $category: String, $count: Int, $country: String!, " \
|
||||||
|
"$keywords: String, $locale: String, $namespace: String, $withMapping: Boolean = false, $itemNs: String, " \
|
||||||
|
"$sortBy: String, $sortDir: String, $start: Int, $tag: String, $releaseDate: String, $withPrice: Boolean " \
|
||||||
|
"= false, $withPromotions: Boolean = false, $priceRange: String, $freeGame: Boolean, $onSale: Boolean, " \
|
||||||
|
"$effectiveDate: String) {\n Catalog {\n searchStore(\n allowCountries: $allowCountries\n " \
|
||||||
|
"category: $category\n count: $count\n country: $country\n keywords: $keywords\n " \
|
||||||
|
"locale: $locale\n namespace: $namespace\n itemNs: $itemNs\n sortBy: $sortBy\n " \
|
||||||
|
"sortDir: $sortDir\n releaseDate: $releaseDate\n start: $start\n tag: $tag\n " \
|
||||||
|
"priceRange: $priceRange\n freeGame: $freeGame\n onSale: $onSale\n effectiveDate: " \
|
||||||
|
"$effectiveDate\n ) {\n elements {\n title\n id\n namespace\n " \
|
||||||
|
"description\n effectiveDate\n keyImages {\n type\n url\n }\n " \
|
||||||
|
" currentPrice\n seller {\n id\n name\n }\n productSlug\n " \
|
||||||
|
" urlSlug\n url\n tags {\n id\n }\n items {\n id\n " \
|
||||||
|
" namespace\n }\n customAttributes {\n key\n value\n }\n " \
|
||||||
|
"categories {\n path\n }\n catalogNs @include(if: $withMapping) {\n " \
|
||||||
|
"mappings(pageType: \"productHome\") {\n pageSlug\n pageType\n }\n " \
|
||||||
|
"}\n offerMappings @include(if: $withMapping) {\n pageSlug\n pageType\n " \
|
||||||
|
"}\n price(country: $country) @include(if: $withPrice) {\n totalPrice {\n " \
|
||||||
|
"discountPrice\n originalPrice\n voucherDiscount\n discount\n " \
|
||||||
|
" currencyCode\n currencyInfo {\n decimals\n }\n fmtPrice(" \
|
||||||
|
"locale: $locale) {\n originalPrice\n discountPrice\n " \
|
||||||
|
"intermediatePrice\n }\n }\n lineOffers {\n appliedRules {\n " \
|
||||||
|
" id\n endDate\n discountSetting {\n discountType\n " \
|
||||||
|
" }\n }\n }\n }\n promotions(category: $category) @include(if: " \
|
||||||
|
"$withPromotions) {\n promotionalOffers {\n promotionalOffers {\n " \
|
||||||
|
"startDate\n endDate\n discountSetting {\n discountType\n " \
|
||||||
|
" discountPercentage\n }\n }\n }\n " \
|
||||||
|
"upcomingPromotionalOffers {\n promotionalOffers {\n startDate\n " \
|
||||||
|
"endDate\n discountSetting {\n discountType\n " \
|
||||||
|
"discountPercentage\n }\n }\n }\n }\n }\n paging {\n " \
|
||||||
|
" count\n total\n }\n }\n }\n}\n "
|
|
@ -1,7 +1,10 @@
|
||||||
|
import io
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
from PIL.ImageQt import ImageQt
|
||||||
from PyQt5 import QtGui
|
from PyQt5 import QtGui
|
||||||
from PyQt5.QtCore import pyqtSignal, QSettings, Qt, QUrl, QJsonParseError, QJsonDocument
|
from PyQt5.QtCore import pyqtSignal, QSettings, Qt, QUrl, QJsonParseError, QJsonDocument
|
||||||
from PyQt5.QtGui import QPixmap
|
from PyQt5.QtGui import QPixmap
|
||||||
|
@ -29,6 +32,15 @@ class GameWidget(QWidget):
|
||||||
self.path = path
|
self.path = path
|
||||||
self.layout = QVBoxLayout()
|
self.layout = QVBoxLayout()
|
||||||
self.image = ImageLabel()
|
self.image = ImageLabel()
|
||||||
|
self.layout.addWidget(self.image)
|
||||||
|
|
||||||
|
self.title_label = QLabel(json_info["title"])
|
||||||
|
self.title_label.setWordWrap(True)
|
||||||
|
self.layout.addWidget(self.title_label)
|
||||||
|
|
||||||
|
for c in r'<>?":|\/*':
|
||||||
|
json_info["title"] = json_info["title"].replace(c, "")
|
||||||
|
|
||||||
self.json_info = json_info
|
self.json_info = json_info
|
||||||
self.slug = json_info["productSlug"]
|
self.slug = json_info["productSlug"]
|
||||||
|
|
||||||
|
@ -59,25 +71,20 @@ class GameWidget(QWidget):
|
||||||
# No image found
|
# No image found
|
||||||
logger.error(f"No image found for {self.title}")
|
logger.error(f"No image found for {self.title}")
|
||||||
|
|
||||||
self.layout.addWidget(self.image)
|
|
||||||
|
|
||||||
self.title_label = QLabel(json_info["title"])
|
|
||||||
self.title_label.setWordWrap(True)
|
|
||||||
self.layout.addWidget(self.title_label)
|
|
||||||
self.setLayout(self.layout)
|
self.setLayout(self.layout)
|
||||||
|
|
||||||
def image_ready(self, save: bool):
|
def image_ready(self, save: bool):
|
||||||
if self.image_request:
|
if self.image_request:
|
||||||
if self.image_request.error() == QNetworkReply.NoError:
|
if self.image_request.error() == QNetworkReply.NoError:
|
||||||
data = self.image_request.readAll().data()
|
data = self.image_request.readAll().data()
|
||||||
|
image: Image.Image = Image.open(io.BytesIO(data))
|
||||||
|
image = image.resize((self.width, int(self.width * 9 / 16)))
|
||||||
|
|
||||||
if save:
|
if save:
|
||||||
with open(os.path.join(self.path, f"{self.title}_wide.png"), "wb") as file:
|
image.save(os.path.join(self.path, self.json_info["title"] + "_wide.png"), format="png")
|
||||||
file.write(data)
|
|
||||||
file.close()
|
|
||||||
pixmap = QPixmap()
|
pixmap = QPixmap()
|
||||||
pixmap.loadFromData(data)
|
pixmap.fromImage(ImageQt(image))
|
||||||
self.image.setPixmap(pixmap.scaled(self.width, int(self.width * 9 / 16),
|
self.image.setPixmap(pixmap)
|
||||||
transformMode=Qt.SmoothTransformation))
|
|
||||||
|
|
||||||
def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
|
def mousePressEvent(self, a0: QtGui.QMouseEvent) -> None:
|
||||||
self.show_info.emit(self.json_info)
|
self.show_info.emit(self.json_info)
|
||||||
|
|
|
@ -96,17 +96,20 @@ class ShopGameInfo(QWidget, Ui_shop_info):
|
||||||
min_label.setFont(bold_font)
|
min_label.setFont(bold_font)
|
||||||
rec_label = QLabel(self.tr("Recommend"))
|
rec_label = QLabel(self.tr("Recommend"))
|
||||||
rec_label.setFont(bold_font)
|
rec_label.setFont(bold_font)
|
||||||
self.req_group_box.layout().addWidget(min_label, 0, 1)
|
|
||||||
self.req_group_box.layout().addWidget(rec_label, 0, 2)
|
|
||||||
|
|
||||||
for i, (key, value) in enumerate(self.game.reqs.get("Windows", {}).items()):
|
if self.game.reqs:
|
||||||
self.req_group_box.layout().addWidget(QLabel(key), i + 1, 0)
|
self.req_group_box.layout().addWidget(min_label, 0, 1)
|
||||||
min_label = QLabel(value[0])
|
self.req_group_box.layout().addWidget(rec_label, 0, 2)
|
||||||
min_label.setWordWrap(True)
|
for i, (key, value) in enumerate(self.game.reqs.get("Windows", {}).items()):
|
||||||
self.req_group_box.layout().addWidget(min_label, i + 1, 1)
|
self.req_group_box.layout().addWidget(QLabel(key), i + 1, 0)
|
||||||
rec_label = QLabel(value[1])
|
min_label = QLabel(value[0])
|
||||||
rec_label.setWordWrap(True)
|
min_label.setWordWrap(True)
|
||||||
self.req_group_box.layout().addWidget(rec_label, i + 1, 2)
|
self.req_group_box.layout().addWidget(min_label, i + 1, 1)
|
||||||
|
rec_label = QLabel(value[1])
|
||||||
|
rec_label.setWordWrap(True)
|
||||||
|
self.req_group_box.layout().addWidget(rec_label, i + 1, 2)
|
||||||
|
else:
|
||||||
|
self.req_group_box.layout().addWidget(QLabel(self.tr("Could not get requirements")))
|
||||||
|
|
||||||
self.image.update_image(self.game.image_urls.front_tall, self.game.title, (240, 320))
|
self.image.update_image(self.game.image_urls.front_tall, self.game.title, (240, 320))
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,8 @@ class ShopGame:
|
||||||
tmp.links.append(tuple((item.replace("link", ""), links[item])))
|
tmp.links.append(tuple((item.replace("link", ""), links[item])))
|
||||||
tmp.available_voice_langs = api_data["data"]["requirements"].get("languages", "Failed")
|
tmp.available_voice_langs = api_data["data"]["requirements"].get("languages", "Failed")
|
||||||
tmp.reqs = {}
|
tmp.reqs = {}
|
||||||
for i, system in enumerate(api_data["data"]["requirements"]["systems"]):
|
print(api_data["data"]["requirements"])
|
||||||
|
for i, system in enumerate(api_data["data"]["requirements"].get("systems", [])):
|
||||||
try:
|
try:
|
||||||
tmp.reqs[system["systemType"]] = {}
|
tmp.reqs[system["systemType"]] = {}
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|
57
rare/components/tabs/shop/thread.py
Normal file
57
rare/components/tabs/shop/thread.py
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
import requests
|
||||||
|
from PyQt5.QtCore import QThread, pyqtSignal
|
||||||
|
|
||||||
|
from custom_legendary.core import LegendaryCore
|
||||||
|
from rare.components.tabs.shop.browse_games import game_query
|
||||||
|
from rare.components.tabs.shop.shop_models import ShopGame
|
||||||
|
from rare.utils.utils import get_lang
|
||||||
|
|
||||||
|
|
||||||
|
class AnalyzeThread(QThread):
|
||||||
|
get_tags = pyqtSignal(dict)
|
||||||
|
|
||||||
|
def __init__(self, core: LegendaryCore):
|
||||||
|
super(AnalyzeThread, self).__init__()
|
||||||
|
self.tags = {}
|
||||||
|
self.core = core
|
||||||
|
|
||||||
|
def run(self) -> None:
|
||||||
|
locale = get_lang()
|
||||||
|
for igame in self.core.get_installed_list():
|
||||||
|
data = {
|
||||||
|
"query": game_query,
|
||||||
|
"variables": {"category": "games/edition/base|bundles/games|editors|software/edition/base",
|
||||||
|
"count": 20,
|
||||||
|
"country": locale.upper(), "keywords": igame.title, "locale": locale, "sortDir": "DESC",
|
||||||
|
"allowCountries": locale.upper(),
|
||||||
|
"start": 0, "tag": "", "withMapping": False, "withPrice": True}
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
search_game = \
|
||||||
|
requests.post("https://www.epicgames.com/graphql", json=data).json()["data"]["Catalog"]["searchStore"][
|
||||||
|
"elements"][0]
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
slug = search_game["productSlug"]
|
||||||
|
is_bundle = False
|
||||||
|
for i in search_game["categories"]:
|
||||||
|
if "bundles" in i.get("path", ""):
|
||||||
|
is_bundle = True
|
||||||
|
|
||||||
|
api_game = requests.get(
|
||||||
|
f"https://store-content.ak.epicgames.com/api/{locale}/content/{'products' if not is_bundle else 'bundles'}/{slug}").json()
|
||||||
|
|
||||||
|
if api_game.get("error"):
|
||||||
|
print(igame.title)
|
||||||
|
continue
|
||||||
|
|
||||||
|
game = ShopGame.from_json(api_game, search_game)
|
||||||
|
|
||||||
|
for i in game.tags:
|
||||||
|
if i not in self.tags.keys():
|
||||||
|
self.tags[i] = 1
|
||||||
|
else:
|
||||||
|
self.tags[i] += 1
|
||||||
|
|
||||||
|
print(self.tags)
|
|
@ -79,17 +79,26 @@ class Ui_browse_games(object):
|
||||||
self.on_discount.setObjectName("on_discount")
|
self.on_discount.setObjectName("on_discount")
|
||||||
self.verticalLayout_2.addWidget(self.on_discount)
|
self.verticalLayout_2.addWidget(self.on_discount)
|
||||||
self.verticalLayout_3.addWidget(self.price_gb)
|
self.verticalLayout_3.addWidget(self.price_gb)
|
||||||
|
self.genre_gb = QtWidgets.QGroupBox(self.scroll_widget)
|
||||||
|
self.genre_gb.setObjectName("genre_gb")
|
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.genre_gb)
|
||||||
|
self.verticalLayout.setObjectName("verticalLayout")
|
||||||
|
self.verticalLayout_3.addWidget(self.genre_gb)
|
||||||
|
self.type_gb = QtWidgets.QGroupBox(self.scroll_widget)
|
||||||
|
self.type_gb.setObjectName("type_gb")
|
||||||
|
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.type_gb)
|
||||||
|
self.verticalLayout_8.setObjectName("verticalLayout_8")
|
||||||
|
self.verticalLayout_3.addWidget(self.type_gb)
|
||||||
self.platform_gb = QtWidgets.QGroupBox(self.scroll_widget)
|
self.platform_gb = QtWidgets.QGroupBox(self.scroll_widget)
|
||||||
self.platform_gb.setObjectName("platform_gb")
|
self.platform_gb.setObjectName("platform_gb")
|
||||||
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.platform_gb)
|
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.platform_gb)
|
||||||
self.verticalLayout_7.setObjectName("verticalLayout_7")
|
self.verticalLayout_7.setObjectName("verticalLayout_7")
|
||||||
self.win_cb = QtWidgets.QCheckBox(self.platform_gb)
|
|
||||||
self.win_cb.setObjectName("win_cb")
|
|
||||||
self.verticalLayout_7.addWidget(self.win_cb)
|
|
||||||
self.mac_cb = QtWidgets.QCheckBox(self.platform_gb)
|
|
||||||
self.mac_cb.setObjectName("mac_cb")
|
|
||||||
self.verticalLayout_7.addWidget(self.mac_cb)
|
|
||||||
self.verticalLayout_3.addWidget(self.platform_gb)
|
self.verticalLayout_3.addWidget(self.platform_gb)
|
||||||
|
self.others_gb = QtWidgets.QGroupBox(self.scroll_widget)
|
||||||
|
self.others_gb.setObjectName("others_gb")
|
||||||
|
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.others_gb)
|
||||||
|
self.verticalLayout_4.setObjectName("verticalLayout_4")
|
||||||
|
self.verticalLayout_3.addWidget(self.others_gb)
|
||||||
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
|
||||||
self.verticalLayout_3.addItem(spacerItem1)
|
self.verticalLayout_3.addItem(spacerItem1)
|
||||||
self.filter_scroll.setWidget(self.scroll_widget)
|
self.filter_scroll.setWidget(self.scroll_widget)
|
||||||
|
@ -111,9 +120,10 @@ class Ui_browse_games(object):
|
||||||
self.under30.setText(_translate("browse_games", "Under 30"))
|
self.under30.setText(_translate("browse_games", "Under 30"))
|
||||||
self.above.setText(_translate("browse_games", "14.99 and above"))
|
self.above.setText(_translate("browse_games", "14.99 and above"))
|
||||||
self.on_discount.setText(_translate("browse_games", "Discount"))
|
self.on_discount.setText(_translate("browse_games", "Discount"))
|
||||||
|
self.genre_gb.setTitle(_translate("browse_games", "Genre"))
|
||||||
|
self.type_gb.setTitle(_translate("browse_games", "Type"))
|
||||||
self.platform_gb.setTitle(_translate("browse_games", "Platform"))
|
self.platform_gb.setTitle(_translate("browse_games", "Platform"))
|
||||||
self.win_cb.setText(_translate("browse_games", "Windows"))
|
self.others_gb.setTitle(_translate("browse_games", "Other Tags"))
|
||||||
self.mac_cb.setText(_translate("browse_games", "Mac"))
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -148,37 +148,46 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="platform_gb">
|
|
||||||
<property name="title">
|
|
||||||
<string>Platform</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="win_cb">
|
<widget class="QGroupBox" name="genre_gb">
|
||||||
<property name="text">
|
<property name="title">
|
||||||
<string>Windows</string>
|
<string>Genre</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<layout class="QVBoxLayout" name="verticalLayout"/>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="mac_cb">
|
<widget class="QGroupBox" name="type_gb">
|
||||||
<property name="text">
|
<property name="title">
|
||||||
<string>Mac</string>
|
<string>Type</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
<layout class="QVBoxLayout" name="verticalLayout_8"/>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
<item>
|
||||||
</widget>
|
<widget class="QGroupBox" name="platform_gb">
|
||||||
</item>
|
<property name="title">
|
||||||
<item>
|
<string>Platform</string>
|
||||||
<spacer name="verticalSpacer">
|
</property>
|
||||||
<property name="orientation">
|
<layout class="QVBoxLayout" name="verticalLayout_7"/>
|
||||||
<enum>Qt::Vertical</enum>
|
</widget>
|
||||||
</property>
|
</item>
|
||||||
<property name="sizeHint" stdset="0">
|
<item>
|
||||||
<size>
|
<widget class="QGroupBox" name="others_gb">
|
||||||
<width>20</width>
|
<property name="title">
|
||||||
|
<string>Other Tags</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4"/>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt, QRect, QSize, QPoint, pyqtSignal, QUrl
|
from PIL import Image
|
||||||
|
from PIL.ImageQt import ImageQt
|
||||||
|
from PyQt5.QtCore import Qt, QRect, QSize, QPoint, pyqtSignal, QUrl, QSettings
|
||||||
from PyQt5.QtGui import QMovie, QPixmap
|
from PyQt5.QtGui import QMovie, QPixmap
|
||||||
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
|
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
|
||||||
from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, QHBoxLayout, QWidget, QPushButton, \
|
from PyQt5.QtWidgets import QLayout, QStyle, QSizePolicy, QLabel, QFileDialog, QHBoxLayout, QWidget, QPushButton, \
|
||||||
|
@ -284,10 +287,15 @@ class ImageLabel(QLabel):
|
||||||
if self.request:
|
if self.request:
|
||||||
if self.request.error() == QNetworkReply.NoError:
|
if self.request.error() == QNetworkReply.NoError:
|
||||||
|
|
||||||
with open(os.path.join(self.path, self.name), "wb") as file:
|
data = self.request.readAll().data()
|
||||||
file.write(self.request.readAll().data())
|
image: Image.Image = Image.open(io.BytesIO(data))
|
||||||
file.close()
|
image = image.resize((self.img_size[0], self.img_size[1]))
|
||||||
self.show_image()
|
|
||||||
|
if QSettings().value("cache_images", True, bool):
|
||||||
|
image.save(os.path.join(self.path, self.name), format="png")
|
||||||
|
pixmap = QPixmap()
|
||||||
|
pixmap.fromImage(ImageQt(image))
|
||||||
|
self.setPixmap(pixmap)
|
||||||
else:
|
else:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue