psn-mcp 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/psn/store.d.ts +5 -0
- package/dist/psn/store.d.ts.map +1 -1
- package/dist/psn/store.js +125 -26
- package/dist/psn/store.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -194,6 +194,12 @@ the Apollo state and star-rating payloads that the store server-renders into
|
|
|
194
194
|
every page's `__NEXT_DATA__` blob. This needs no authentication but is
|
|
195
195
|
inherently coupled to the store's page structure.
|
|
196
196
|
|
|
197
|
+
> **Need help outside this package?** I offer a €250 fixed-scope repair for one
|
|
198
|
+
> reproducible bug in a public TypeScript or React repository: an agreed
|
|
199
|
+
> acceptance test, a patch with relevant automated tests, a draft pull request,
|
|
200
|
+
> and one revision. [Submit a public request](https://github.com/tmrp/tmrp/issues/new?template=fixed-scope.yml&title=%5BRepair%20request%20via%20psn-mcp%5D%3A%20).
|
|
201
|
+
> Requests are reviewed before acceptance; no payment is due on submission.
|
|
202
|
+
|
|
197
203
|
Authentication is lazy: the server starts and lists tools without credentials;
|
|
198
204
|
the token exchange happens on the first tool call. Access tokens are refreshed
|
|
199
205
|
ahead of expiry, falling back to a full NPSSO re-exchange if the refresh token
|
package/dist/psn/store.d.ts
CHANGED
|
@@ -54,7 +54,12 @@ export declare class PsnStore {
|
|
|
54
54
|
private readonly locale;
|
|
55
55
|
constructor(locale?: string);
|
|
56
56
|
private fetchNextData;
|
|
57
|
+
private toStorePrice;
|
|
57
58
|
private toStoreItem;
|
|
59
|
+
private extractBatarangCaches;
|
|
60
|
+
private mergeProductEntities;
|
|
61
|
+
private findProductPrice;
|
|
62
|
+
private toStarRating;
|
|
58
63
|
/** One page (24 items) of a store category grid, e.g. the "All deals" category. */
|
|
59
64
|
getCategoryGrid(categoryId: string, page?: number): Promise<CategoryGridPage>;
|
|
60
65
|
/** Product details including price and the community star rating. */
|
package/dist/psn/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAI5E,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,CAAC,EAAE,MAAM;IAFjC,YACE,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA,EAIhC;CACF;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAI5E,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,CAAC,EAAE,MAAM;IAFjC,YACE,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA,EAIhC;CACF;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAiBD,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAnC,YAA6B,MAAM,GAAE,MAAgB,EAAI;YAE3C,aAAa;IA4C3B,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,qBAAqB;IAsB7B,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,YAAY;IAiBpB,mFAAmF;IAC7E,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,IAAI,SAAI,GACP,OAAO,CAAC,gBAAgB,CAAC,CAoC3B;IAED,qEAAqE;IAC/D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAkCzD;IAED;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA0BzB,kEAAkE;IAC5D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAY/C;IAED;;;OAGG;IACG,QAAQ,CACZ,IAAI,SAAI,EACR,cAAc,UAAQ,EACtB,UAAU,SAAwB,GACjC,OAAO,CACR,gBAAgB,GAAG;QAAE,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG;YAAE,UAAU,CAAC,EAAE,UAAU,CAAA;SAAE,CAAC,CAAA;KAAE,CAC7E,CAaA;CACF"}
|
package/dist/psn/store.js
CHANGED
|
@@ -52,8 +52,32 @@ export class PsnStore {
|
|
|
52
52
|
title,
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
toStorePrice(value) {
|
|
56
|
+
if (!value || typeof value !== "object")
|
|
57
|
+
return undefined;
|
|
58
|
+
const price = value;
|
|
59
|
+
const discountText = [
|
|
60
|
+
price.discountText,
|
|
61
|
+
price.displayDiscountText,
|
|
62
|
+
price.savingTag,
|
|
63
|
+
].find((field) => typeof field === "string" && field.length > 0);
|
|
64
|
+
const normalized = {
|
|
65
|
+
basePrice: typeof price.basePrice === "string" ? price.basePrice : undefined,
|
|
66
|
+
discountedPrice: typeof price.discountedPrice === "string"
|
|
67
|
+
? price.discountedPrice
|
|
68
|
+
: undefined,
|
|
69
|
+
discountText,
|
|
70
|
+
isFree: typeof price.isFree === "boolean" ? price.isFree : undefined,
|
|
71
|
+
isTiedToSubscription: typeof price.isTiedToSubscription === "boolean"
|
|
72
|
+
? price.isTiedToSubscription
|
|
73
|
+
: undefined,
|
|
74
|
+
};
|
|
75
|
+
return Object.values(normalized).some((field) => field !== undefined)
|
|
76
|
+
? normalized
|
|
77
|
+
: undefined;
|
|
78
|
+
}
|
|
79
|
+
toStoreItem(entity, priceOverride) {
|
|
80
|
+
const price = priceOverride ?? this.toStorePrice(entity.price);
|
|
57
81
|
const media = entity.media;
|
|
58
82
|
const image = media?.find((m) => m.type === "IMAGE" && m.role === "MASTER") ??
|
|
59
83
|
media?.find((m) => m.type === "IMAGE");
|
|
@@ -63,16 +87,92 @@ export class PsnStore {
|
|
|
63
87
|
type: (entity.localizedStoreDisplayClassification ??
|
|
64
88
|
entity.storeDisplayClassification),
|
|
65
89
|
platforms: entity.platforms,
|
|
66
|
-
price
|
|
67
|
-
basePrice: price.basePrice,
|
|
68
|
-
discountedPrice: price.discountedPrice,
|
|
69
|
-
discountText: price.discountText,
|
|
70
|
-
isFree: price.isFree,
|
|
71
|
-
isTiedToSubscription: price.isTiedToSubscription,
|
|
72
|
-
},
|
|
90
|
+
price,
|
|
73
91
|
imageUrl: image?.url,
|
|
74
92
|
};
|
|
75
93
|
}
|
|
94
|
+
extractBatarangCaches(pageProps) {
|
|
95
|
+
const batarangs = pageProps.batarangs;
|
|
96
|
+
const caches = [];
|
|
97
|
+
for (const batarang of Object.values(batarangs ?? {})) {
|
|
98
|
+
const text = batarang.text;
|
|
99
|
+
if (!text)
|
|
100
|
+
continue;
|
|
101
|
+
const inner = text.match(/<script[^>]*>(.*)<\/script>/s)?.[1];
|
|
102
|
+
if (!inner)
|
|
103
|
+
continue;
|
|
104
|
+
try {
|
|
105
|
+
const payload = JSON.parse(inner);
|
|
106
|
+
if (payload.cache)
|
|
107
|
+
caches.push(payload.cache);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// A malformed optional micro-frontend must not hide the base product.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return caches;
|
|
114
|
+
}
|
|
115
|
+
mergeProductEntities(states, productId) {
|
|
116
|
+
const matches = [];
|
|
117
|
+
for (const state of states) {
|
|
118
|
+
for (const [key, value] of Object.entries(state)) {
|
|
119
|
+
const productKey = `Product:${productId}`;
|
|
120
|
+
if ((key === productKey ||
|
|
121
|
+
key.startsWith(`${productKey}:`) ||
|
|
122
|
+
(value.__typename === "Product" && value.id === productId)) &&
|
|
123
|
+
!matches.includes(value)) {
|
|
124
|
+
matches.push(value);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return matches.length > 0 ? Object.assign({}, ...matches) : undefined;
|
|
129
|
+
}
|
|
130
|
+
findProductPrice(product, states, productId) {
|
|
131
|
+
const direct = this.toStorePrice(product.price);
|
|
132
|
+
if (direct)
|
|
133
|
+
return direct;
|
|
134
|
+
const ctaRefs = product.webctas ?? [];
|
|
135
|
+
for (const ref of ctaRefs) {
|
|
136
|
+
if (!ref.__ref)
|
|
137
|
+
continue;
|
|
138
|
+
for (const state of states) {
|
|
139
|
+
const price = this.toStorePrice(state[ref.__ref]?.price);
|
|
140
|
+
if (price)
|
|
141
|
+
return price;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Current product pages keep the price on a GameCTA entity in a
|
|
145
|
+
// micro-frontend cache. The primary product id is part of that entity key.
|
|
146
|
+
for (const state of states) {
|
|
147
|
+
for (const [key, value] of Object.entries(state)) {
|
|
148
|
+
const matchesProduct = key.split(":").some((segment) => {
|
|
149
|
+
if (segment === productId)
|
|
150
|
+
return true;
|
|
151
|
+
const skuSuffix = segment.slice(productId.length);
|
|
152
|
+
return (segment.startsWith(`${productId}-U`) && /^-U\d+$/.test(skuSuffix));
|
|
153
|
+
});
|
|
154
|
+
if (value.__typename !== "GameCTA" || !matchesProduct) {
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const price = this.toStorePrice(value.price);
|
|
158
|
+
if (price)
|
|
159
|
+
return price;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
toStarRating(value) {
|
|
165
|
+
if (!value || typeof value !== "object")
|
|
166
|
+
return undefined;
|
|
167
|
+
const rating = value;
|
|
168
|
+
if (rating.averageRating === undefined)
|
|
169
|
+
return undefined;
|
|
170
|
+
return {
|
|
171
|
+
averageRating: rating.averageRating,
|
|
172
|
+
totalRatingsCount: rating.totalRatingsCount ?? 0,
|
|
173
|
+
ratingsDistribution: rating.ratingsDistribution?.map(({ rating: score, percentage }) => ({ rating: score, percentage })),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
76
176
|
/** One page (24 items) of a store category grid, e.g. the "All deals" category. */
|
|
77
177
|
async getCategoryGrid(categoryId, page = 1) {
|
|
78
178
|
const { apollo, title } = await this.fetchNextData(`/category/${encodeURIComponent(categoryId)}/${page}`);
|
|
@@ -102,15 +202,24 @@ export class PsnStore {
|
|
|
102
202
|
/** Product details including price and the community star rating. */
|
|
103
203
|
async getProduct(productId) {
|
|
104
204
|
const { apollo, pageProps } = await this.fetchNextData(`/product/${encodeURIComponent(productId)}`);
|
|
105
|
-
|
|
106
|
-
|
|
205
|
+
// Sony now normalizes product pages across several independently rendered
|
|
206
|
+
// micro-frontends. Merge every fragment for this exact product so the
|
|
207
|
+
// result contains the image/platform/type fields as well as the base name.
|
|
208
|
+
const states = [apollo, ...this.extractBatarangCaches(pageProps)];
|
|
209
|
+
const entity = this.mergeProductEntities(states, productId);
|
|
107
210
|
if (!entity) {
|
|
108
211
|
throw new PsnStoreError(`Product ${productId} not found on the PlayStation Store.`);
|
|
109
212
|
}
|
|
213
|
+
const concept = entity.concept;
|
|
214
|
+
const conceptId = entity.conceptId == null
|
|
215
|
+
? (concept?.id?.toString() ?? concept?.__ref?.replace(/^Concept:/, ""))
|
|
216
|
+
: String(entity.conceptId);
|
|
110
217
|
return {
|
|
111
|
-
...this.toStoreItem(entity),
|
|
112
|
-
starRating: this.
|
|
113
|
-
|
|
218
|
+
...this.toStoreItem(entity, this.findProductPrice(entity, states, productId)),
|
|
219
|
+
starRating: this.toStarRating(entity.starRating) ??
|
|
220
|
+
this.extractStarRating(pageProps, productId),
|
|
221
|
+
conceptId,
|
|
222
|
+
url: `${STORE_BASE}/${this.locale}/product/${encodeURIComponent(productId)}`,
|
|
114
223
|
};
|
|
115
224
|
}
|
|
116
225
|
/**
|
|
@@ -128,18 +237,8 @@ export class PsnStore {
|
|
|
128
237
|
try {
|
|
129
238
|
const payload = JSON.parse(inner);
|
|
130
239
|
const cached = payload.cache?.[`Product:${productId}`] ??
|
|
131
|
-
Object.values(payload.cache ?? {}).find((v) => v.__typename === "Product" && v.starRating);
|
|
132
|
-
|
|
133
|
-
if (rating?.averageRating === undefined)
|
|
134
|
-
return undefined;
|
|
135
|
-
return {
|
|
136
|
-
averageRating: rating.averageRating,
|
|
137
|
-
totalRatingsCount: rating.totalRatingsCount ?? 0,
|
|
138
|
-
ratingsDistribution: rating.ratingsDistribution?.map(({ rating: r, percentage }) => ({
|
|
139
|
-
rating: r,
|
|
140
|
-
percentage,
|
|
141
|
-
})),
|
|
142
|
-
};
|
|
240
|
+
Object.values(payload.cache ?? {}).find((v) => v.__typename === "Product" && v.id === productId && v.starRating);
|
|
241
|
+
return this.toStarRating(cached?.starRating);
|
|
143
242
|
}
|
|
144
243
|
catch {
|
|
145
244
|
return undefined;
|
package/dist/psn/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,GAAG,+BAA+B,CAAC;AAEnD,kDAAkD;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,sCAAsC,CAAC;AAE5E,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,qCAAqC;AAE3D,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB,MAAM;IAFxB,YACE,OAAe,EACC,MAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;sBAFC,MAAM;QAGtB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/psn/store.ts"],"names":[],"mappings":"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"}
|