Skip to content

Commit 34de93b

Browse files
committed
Add utils
1 parent 1d1d249 commit 34de93b

File tree

3 files changed

+176
-0
lines changed

3 files changed

+176
-0
lines changed

src/disk_utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import json
2+
3+
4+
def save_to_disk(data, fname, verbose=False):
5+
with open(fname, "w", encoding="utf8") as f:
6+
json.dump(data, f)
7+
8+
if verbose:
9+
print(f"#entries = {len(data)}")
10+
11+
return

src/fetch_utils.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import requests
2+
3+
from src.query_utils import get_query
4+
5+
6+
def get_geforce_url():
7+
return "https://games.geforce.com/graphql"
8+
9+
10+
def fetch_page(cursor="", is_slim_query=True):
11+
print(f"Cursor: {cursor}")
12+
13+
r = requests.post(
14+
url=get_geforce_url(),
15+
json={"query": get_query(cursor, is_slim_query=is_slim_query)},
16+
)
17+
if r.ok:
18+
data = r.json()
19+
item_info = data["data"]["apps"]["items"]
20+
page_info = data["data"]["apps"]["pageInfo"]
21+
else:
22+
item_info = None
23+
page_info = None
24+
25+
return item_info, page_info
26+
27+
28+
def fetch_all_pages(is_slim_query=True):
29+
data = []
30+
31+
has_next_page = True
32+
cursor = ""
33+
34+
while has_next_page:
35+
item_info, page_info = fetch_page(cursor, is_slim_query=is_slim_query)
36+
37+
data += item_info
38+
39+
has_next_page = page_info["hasNextPage"]
40+
cursor = page_info["endCursor"]
41+
42+
return data

src/query_utils.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
def get_query(cursor, is_slim_query=True):
2+
query_prefixe = "{"
3+
4+
query_header = f'apps(first: 1200, after: "{cursor}")'
5+
6+
qery_metadata = """{
7+
numberReturned
8+
pageInfo {
9+
hasNextPage
10+
endCursor
11+
totalCount
12+
}"""
13+
14+
query_content = get_query_content(is_slim_query=is_slim_query)
15+
16+
query_suffixe = "} }"
17+
18+
return query_prefixe + query_header + qery_metadata + query_content + query_suffixe
19+
20+
21+
def get_query_content(is_slim_query=True):
22+
if is_slim_query:
23+
query_content = get_slim_query_content()
24+
else:
25+
query_content = get_full_query_content()
26+
27+
return query_content
28+
29+
30+
def get_slim_query_content():
31+
query_content = """
32+
items {
33+
id
34+
title
35+
developerName
36+
publisherName
37+
type
38+
osType
39+
storeIds {
40+
store
41+
id
42+
}
43+
computedValues {
44+
earliestReleaseDate
45+
earliestStreetDate
46+
}
47+
}
48+
"""
49+
50+
return query_content
51+
52+
53+
def get_full_query_content():
54+
query_content = """
55+
items {
56+
osType
57+
id
58+
cmsId
59+
sortName
60+
title
61+
longDescription
62+
contentRatings {
63+
type
64+
categoryKey
65+
}
66+
developerName
67+
geForceUrl
68+
images {
69+
FEATURE_IMAGE
70+
GAME_BOX_ART
71+
HERO_IMAGE
72+
KEY_ART
73+
KEY_ICON
74+
KEY_IMAGE
75+
TV_BANNER
76+
SCREENSHOTS
77+
}
78+
keywords
79+
maxLocalPlayers
80+
maxOnlinePlayers
81+
apks {
82+
type
83+
version
84+
url
85+
}
86+
publisherName
87+
storeIds {
88+
id
89+
store
90+
}
91+
streamingModes {
92+
framesPerSecond
93+
heightInPixels
94+
widthInPixels
95+
}
96+
supportedControls
97+
supportedGamePlayModes
98+
type
99+
computedValues {
100+
earliestReleaseDate
101+
earliestStreetDate
102+
allKeywords
103+
}
104+
genres
105+
appStore
106+
variants {
107+
id
108+
title
109+
appStore
110+
developerName
111+
gfn {
112+
status
113+
visibility
114+
releaseDate
115+
isInLibrary
116+
}
117+
osType
118+
storeId
119+
}
120+
}
121+
"""
122+
123+
return query_content

0 commit comments

Comments
 (0)